Загрузка данных


;!SaveMemory = True

; Итоговое задание 2
; Вариант 1
; Многоцветное изображение 8x8 без сжатия
; Массив занимает 16 байт вместо 32
;
; Кодировка пикселей по 2 бита:
; 00 = черный
; 01 = желтый
; 10 = красный
; 11 = синий
;
; В одном байте хранится 4 пикселя:
; биты 7-6 = 1 пиксель
; биты 5-4 = 2 пиксель
; биты 3-2 = 3 пиксель
; биты 1-0 = 4 пиксель

MOV BX, 0200h

; -------------------------------
; Массив изображения 8x8
; Каждая строка занимает 2 байта
; Всего 8 строк * 2 байта = 16 байт
; -------------------------------

; 1 строка: Y Y B Y   Y B Y Y
MOV BYTE PTR DS:[BX]+0, 051h
MOV BYTE PTR DS:[BX]+1, 045h

; 2 строка: Y B B B   B B B Y
MOV BYTE PTR DS:[BX]+2, 040h
MOV BYTE PTR DS:[BX]+3, 001h

; 3 строка: B B B B   B B B B
MOV BYTE PTR DS:[BX]+4, 000h
MOV BYTE PTR DS:[BX]+5, 000h

; 4 строка: B B R B   B R B B
MOV BYTE PTR DS:[BX]+6, 008h
MOV BYTE PTR DS:[BX]+7, 020h

; 5 строка: Y B B B   B B B Y
MOV BYTE PTR DS:[BX]+8, 040h
MOV BYTE PTR DS:[BX]+9, 001h

; 6 строка: Y B Blue Blue   Blue Blue B Y
MOV BYTE PTR DS:[BX]+10, 04Fh
MOV BYTE PTR DS:[BX]+11, 0F1h

; 7 строка: B Y B B   B B Y B
MOV BYTE PTR DS:[BX]+12, 010h
MOV BYTE PTR DS:[BX]+13, 004h

; 8 строка: B Y Y Y   Y Y Y B
MOV BYTE PTR DS:[BX]+14, 015h
MOV BYTE PTR DS:[BX]+15, 054h

; -------------------------------
; Подготовка адресов
; -------------------------------

MOV SI, 0200h

MOV DI, 0F600h
ADD DI, 100h
ADD DI, 8

MOV DH, 8          ; количество строк изображения

row_loop:
    CMP DH, 0
    JE done

    MOV CL, 2      ; в каждой строке 2 байта

byte_loop:
    MOV BH, DS:[SI]

    ; -------------------------------
    ; 1 пиксель: биты 7-6
    ; -------------------------------

    MOV DL, BH
    AND DL, 0C0h
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    CALL draw_by_code

    ; -------------------------------
    ; 2 пиксель: биты 5-4
    ; -------------------------------

    MOV DL, BH
    AND DL, 030h
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    SHR DL, 1
    CALL draw_by_code

    ; -------------------------------
    ; 3 пиксель: биты 3-2
    ; -------------------------------

    MOV DL, BH
    AND DL, 00Ch
    SHR DL, 1
    SHR DL, 1
    CALL draw_by_code

    ; -------------------------------
    ; 4 пиксель: биты 1-0
    ; -------------------------------

    MOV DL, BH
    AND DL, 003h
    CALL draw_by_code

    INC SI

    DEC CL
    JNZ byte_loop

    ; Переход на следующую строку экрана
    ; Строка дисплея = 64 символа = 128 байт
    ; Вывели 16 символов = 32 байта
    ; 128 - 32 = 96 байт

    ADD DI, 96

    DEC DH
    JMP row_loop

; -------------------------------
; Подпрограмма выбора цвета
; DL = код цвета:
; 0 = черный
; 1 = желтый
; 2 = красный
; 3 = синий
; -------------------------------

draw_by_code:
    CMP DL, 0
    JE color_black

    CMP DL, 1
    JE color_yellow

    CMP DL, 2
    JE color_red

color_blue:
    MOV AH, 09h
    JMP draw_pixel

color_black:
    MOV AH, 00h
    JMP draw_pixel

color_yellow:
    MOV AH, 0Eh
    JMP draw_pixel

color_red:
    MOV AH, 0Ch
    JMP draw_pixel

; -------------------------------
; Подпрограмма вывода пикселя
; -------------------------------

draw_pixel:
    MOV AL, 0DBh

    MOV ES:[DI], AX
    ADD DI, 2

    ; Дублирование пикселя по горизонтали

    MOV ES:[DI], AX
    ADD DI, 2

    RET

done:
    HLT