;!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