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


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