Загрузка данных
;!SaveMemory = True
; Итоговое задание 3
; Вариант 1
; Многоцветное изображение со сжатием
; Рисунок: бабочка
;
; Формат сжатия:
; старшие 4 бита = цвет
; младшие 4 бита = количество повторений - 1
;
; Цвета:
; 0h = чёрный
; 8h = серый
; Bh = ярко-бирюзовый
; Eh = ярко-жёлтый
; Fh = ярко-белый
;
; Размер изображения:
; 23 пикселя в ширину
; 20 строк в высоту
;
; Каждый пиксель дублируется по горизонтали
MOV BX, 0200h
; --------------------------------
; Сжатый массив изображения
; --------------------------------
; 1 строка
MOV BYTE PTR DS:[BX]+0, 0FFh
MOV BYTE PTR DS:[BX]+1, 0F6h
; 2 строка
MOV BYTE PTR DS:[BX]+2, 0F3h
MOV BYTE PTR DS:[BX]+3, 000h
MOV BYTE PTR DS:[BX]+4, 0FFh
MOV BYTE PTR DS:[BX]+5, 0F1h
; 3 строка
MOV BYTE PTR DS:[BX]+6, 0F2h
MOV BYTE PTR DS:[BX]+7, 000h
MOV BYTE PTR DS:[BX]+8, 0B0h
MOV BYTE PTR DS:[BX]+9, 002h
MOV BYTE PTR DS:[BX]+10, 0F4h
MOV BYTE PTR DS:[BX]+11, 003h
MOV BYTE PTR DS:[BX]+12, 0F5h
; 4 строка
MOV BYTE PTR DS:[BX]+13, 0F2h
MOV BYTE PTR DS:[BX]+14, 000h
MOV BYTE PTR DS:[BX]+15, 0B3h
MOV BYTE PTR DS:[BX]+16, 000h
MOV BYTE PTR DS:[BX]+17, 0F2h
MOV BYTE PTR DS:[BX]+18, 000h
MOV BYTE PTR DS:[BX]+19, 0B3h
MOV BYTE PTR DS:[BX]+20, 000h
MOV BYTE PTR DS:[BX]+21, 0F4h
; 5 строка
MOV BYTE PTR DS:[BX]+22, 0F3h
MOV BYTE PTR DS:[BX]+23, 000h
MOV BYTE PTR DS:[BX]+24, 0B3h
MOV BYTE PTR DS:[BX]+25, 000h
MOV BYTE PTR DS:[BX]+26, 0F0h
MOV BYTE PTR DS:[BX]+27, 000h
MOV BYTE PTR DS:[BX]+28, 0B5h
MOV BYTE PTR DS:[BX]+29, 000h
MOV BYTE PTR DS:[BX]+30, 0F3h
; 6 строка
MOV BYTE PTR DS:[BX]+31, 0F2h
MOV BYTE PTR DS:[BX]+32, 000h
MOV BYTE PTR DS:[BX]+33, 0B5h
MOV BYTE PTR DS:[BX]+34, 000h
MOV BYTE PTR DS:[BX]+35, 0B7h
MOV BYTE PTR DS:[BX]+36, 000h
MOV BYTE PTR DS:[BX]+37, 0F2h
; 7 строка
MOV BYTE PTR DS:[BX]+38, 0F3h
MOV BYTE PTR DS:[BX]+39, 001h
MOV BYTE PTR DS:[BX]+40, 0B3h
MOV BYTE PTR DS:[BX]+41, 000h
MOV BYTE PTR DS:[BX]+42, 0B2h
MOV BYTE PTR DS:[BX]+43, 083h
MOV BYTE PTR DS:[BX]+44, 0B0h
MOV BYTE PTR DS:[BX]+45, 000h
MOV BYTE PTR DS:[BX]+46, 0F2h
; 8 строка
MOV BYTE PTR DS:[BX]+47, 0F3h
MOV BYTE PTR DS:[BX]+48, 000h
MOV BYTE PTR DS:[BX]+49, 0B7h
MOV BYTE PTR DS:[BX]+50, 082h
MOV BYTE PTR DS:[BX]+51, 000h
MOV BYTE PTR DS:[BX]+52, 081h
MOV BYTE PTR DS:[BX]+53, 000h
MOV BYTE PTR DS:[BX]+54, 0F2h
; 9 строка
MOV BYTE PTR DS:[BX]+55, 0F4h
MOV BYTE PTR DS:[BX]+56, 000h
MOV BYTE PTR DS:[BX]+57, 0B6h
MOV BYTE PTR DS:[BX]+58, 085h
MOV BYTE PTR DS:[BX]+59, 0E0h
MOV BYTE PTR DS:[BX]+60, 000h
MOV BYTE PTR DS:[BX]+61, 0F1h
; 10 строка
MOV BYTE PTR DS:[BX]+62, 0F5h
MOV BYTE PTR DS:[BX]+63, 001h
MOV BYTE PTR DS:[BX]+64, 0B0h
MOV BYTE PTR DS:[BX]+65, 082h
MOV BYTE PTR DS:[BX]+66, 0B1h
MOV BYTE PTR DS:[BX]+67, 083h
MOV BYTE PTR DS:[BX]+68, 001h
MOV BYTE PTR DS:[BX]+69, 0F2h
; 11 строка
MOV BYTE PTR DS:[BX]+70, 0F0h
MOV BYTE PTR DS:[BX]+71, 007h
MOV BYTE PTR DS:[BX]+72, 086h
MOV BYTE PTR DS:[BX]+73, 001h
MOV BYTE PTR DS:[BX]+74, 0F4h
; 12 строка
MOV BYTE PTR DS:[BX]+75, 0F0h
MOV BYTE PTR DS:[BX]+76, 000h
MOV BYTE PTR DS:[BX]+77, 0B5h
MOV BYTE PTR DS:[BX]+78, 087h
MOV BYTE PTR DS:[BX]+79, 0B0h
MOV BYTE PTR DS:[BX]+80, 000h
MOV BYTE PTR DS:[BX]+81, 0F4h
; 13 строка
MOV BYTE PTR DS:[BX]+82, 0F1h
MOV BYTE PTR DS:[BX]+83, 000h
MOV BYTE PTR DS:[BX]+84, 0B4h
MOV BYTE PTR DS:[BX]+85, 086h
MOV BYTE PTR DS:[BX]+86, 0B2h
MOV BYTE PTR DS:[BX]+87, 000h
MOV BYTE PTR DS:[BX]+88, 0F3h
; 14 строка
MOV BYTE PTR DS:[BX]+89, 0F2h
MOV BYTE PTR DS:[BX]+90, 000h
MOV BYTE PTR DS:[BX]+91, 0B4h
MOV BYTE PTR DS:[BX]+92, 083h
MOV BYTE PTR DS:[BX]+93, 0B4h
MOV BYTE PTR DS:[BX]+94, 000h
MOV BYTE PTR DS:[BX]+95, 0F3h
; 15 строка
MOV BYTE PTR DS:[BX]+96, 0F1h
MOV BYTE PTR DS:[BX]+97, 000h
MOV BYTE PTR DS:[BX]+98, 0B4h
MOV BYTE PTR DS:[BX]+99, 004h
MOV BYTE PTR DS:[BX]+100, 0B5h
MOV BYTE PTR DS:[BX]+101, 001h
MOV BYTE PTR DS:[BX]+102, 0F1h
; 16 строка
MOV BYTE PTR DS:[BX]+103, 0F2h
MOV BYTE PTR DS:[BX]+104, 001h
MOV BYTE PTR DS:[BX]+105, 0B1h
MOV BYTE PTR DS:[BX]+106, 000h
MOV BYTE PTR DS:[BX]+107, 0F3h
MOV BYTE PTR DS:[BX]+108, 000h
MOV BYTE PTR DS:[BX]+109, 0B7h
MOV BYTE PTR DS:[BX]+110, 000h
MOV BYTE PTR DS:[BX]+111, 0F0h
; 17 строка
MOV BYTE PTR DS:[BX]+112, 0F3h
MOV BYTE PTR DS:[BX]+113, 000h
MOV BYTE PTR DS:[BX]+114, 0B0h
MOV BYTE PTR DS:[BX]+115, 000h
MOV BYTE PTR DS:[BX]+116, 0F5h
MOV BYTE PTR DS:[BX]+117, 000h
MOV BYTE PTR DS:[BX]+118, 0B0h
MOV BYTE PTR DS:[BX]+119, 000h
MOV BYTE PTR DS:[BX]+120, 0B2h
MOV BYTE PTR DS:[BX]+121, 001h
MOV BYTE PTR DS:[BX]+122, 0F1h
; 18 строка
MOV BYTE PTR DS:[BX]+123, 0F4h
MOV BYTE PTR DS:[BX]+124, 000h
MOV BYTE PTR DS:[BX]+125, 0F7h
MOV BYTE PTR DS:[BX]+126, 001h
MOV BYTE PTR DS:[BX]+127, 0B0h
MOV BYTE PTR DS:[BX]+128, 000h
MOV BYTE PTR DS:[BX]+129, 0B1h
MOV BYTE PTR DS:[BX]+130, 000h
MOV BYTE PTR DS:[BX]+131, 0F1h
; 19 строка
MOV BYTE PTR DS:[BX]+132, 0FFh
MOV BYTE PTR DS:[BX]+133, 000h
MOV BYTE PTR DS:[BX]+134, 0F0h
MOV BYTE PTR DS:[BX]+135, 001h
MOV BYTE PTR DS:[BX]+136, 0F2h
; 20 строка
MOV BYTE PTR DS:[BX]+137, 0FFh
MOV BYTE PTR DS:[BX]+138, 0F6h
; --------------------------------
; Подготовка адресов
; --------------------------------
MOV SI, 0200h
; Для высоты 20 строк вертикальный отступ не задаётся,
; иначе изображение выйдет за нижнюю границу дисплея.
; ADD DI, 8 оставляет отступ 4 символа слева.
MOV DI, 0F600h
ADD DI, 8
; DH — количество строк изображения
MOV DH, 20
row_loop:
CMP DH, 0
JE done
; CH — сколько пикселей осталось вывести в строке
MOV CH, 23
run_loop:
; Берём очередной сжатый байт
MOV BH, DS:[SI]
INC SI
; Старшие 4 бита — цвет
MOV AH, BH
SHR AH, 1
SHR AH, 1
SHR AH, 1
SHR AH, 1
; Младшие 4 бита — количество повторений - 1
MOV CL, BH
AND CL, 0Fh
INC CL
draw_run:
CALL draw_pixel
DEC CH
DEC CL
JNZ draw_run
CMP CH, 0
JNZ run_loop
; Переход на следующую строку экрана
; Ширина дисплея = 64 символа = 128 байт
; Ширина рисунка = 23 пикселя
; Каждый пиксель дублируется: 23 * 2 = 46 символов
; 46 символов = 92 байта
; 128 - 92 = 36 байт
ADD DI, 36
DEC DH
JMP row_loop
; --------------------------------
; Подпрограмма вывода одного пикселя
; --------------------------------
draw_pixel:
MOV AL, 0DBh
MOV ES:[DI], AX
ADD DI, 2
; Дублирование пикселя по горизонтали
MOV ES:[DI], AX
ADD DI, 2
RET
done:
HLT