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


;!SaveMemory = True
; --- СТРОГО 20 СТРОК ДАННЫХ: ОДИН БАЙТ НА ОДНУ СТРОКУ КАРТИНКИ ---
mov byte ptr ds:[bx]+0,  000h  ; Ряд 1:  Чисто белый фон
mov byte ptr ds:[bx]+1,  000h  ; Ряд 2:  Чисто белый фон
mov byte ptr ds:[bx]+2,  010h  ; Ряд 3:  Кончики ушек совы
mov byte ptr ds:[bx]+3,  018h  ; Ряд 4:  Уши совы полностью
mov byte ptr ds:[bx]+4,  03Ch  ; Ряд 5:  Голова над глазами
mov byte ptr ds:[bx]+5,  07Ch  ; Ряд 6:  Глаза (верхняя линия)
mov byte ptr ds:[bx]+6,  07Ch  ; Ряд 7:  Глаза (центр)
mov byte ptr ds:[bx]+7,  03Ch  ; Ряд 8:  Клюв
mov byte ptr ds:[bx]+8,  07Ch  ; Ряд 9:  Подбородок / шея
mov byte ptr ds:[bx]+9,  0F8h  ; Ряд 10: Грудь совы
mov byte ptr ds:[bx]+10, 0F8h  ; Ряд 11: Тело совы
mov byte ptr ds:[bx]+11, 0F8h  ; Ряд 12: Тело совы
mov byte ptr ds:[bx]+12, 0F8h  ; Ряд 13: Тело совы
mov byte ptr ds:[bx]+13, 0F8h  ; Ряд 14: Тело совы
mov byte ptr ds:[bx]+14, 0F8h  ; Ряд 15: Тело совы
mov byte ptr ds:[bx]+15, 0F8h  ; Ряд 16: Тело совы
mov byte ptr ds:[bx]+16, 07Ch  ; Ряд 17: Низ живота
mov byte ptr ds:[bx]+17, 024h  ; Ряд 18: Основание лапок
mov byte ptr ds:[bx]+18, 024h  ; Ряд 19: Когти лапок
mov byte ptr ds:[bx]+19, 000h  ; Ряд 20: Чисто белый фон под лапами

; --- Настройка регистров вывода (в стиле вашего примера) ---
mov bx, 0
mov ax, 0
mov bl, 1
mov cx, 8
mov dx, 0
mov si, 0       ; SI указывает на текущий байт ОЗУ (от 0 до 19)
mov bp, 0       ; Счётчик пикселей в текущей строке (всего 20)
mov di, 0f600h  ; Стартовый адрес виртуального экрана AsmEd

next_row_load:
    mov ax, 0
    mov al, ds:[si]  ; Загружаем байт-маску текущей строки
    mov bp, 0        ; Сбрасываем счётчик пикселей в строке

pixel_loop:
    ; Сравниваем байт с нулем. Если 0 - это гарантированно белый фон
    cmp al, 0
    jz  draw_white

    ; Если байт не 0, проверяем спец-цвета по номеру строки (регистру SI)
    cmp si, 5
    je  draw_yellow  ; Ряды 5 и 6 — это глаза (жёлтый)
    cmp si, 6
    je  draw_yellow

    cmp si, 17
    je  draw_red     ; Ряды 17 and 18 — это лапки (красный)
    cmp si, 18
    je  draw_red

draw_black:          ; Все остальные закрашенные элементы — тело совы (чёрный)
    mov al, 20h      ; Рисуем пробел
    mov ah, 00h      ; 00h = Чёрный цвет заливки фона
    jmp render_pixel

draw_white:          ; Белый фон
    mov al, 20h      ; Рисуем пробел
    mov ah, 0fh      ; 0fh = Белый цвет заливки фона
    jmp render_pixel

draw_yellow:         ; Глаза совы
    mov al, 20h      ; Рисуем пробел для сплошной заливки
    mov ah, 0e0h     ; e0h = Жёлтый цвет заливки фона

draw_red:            ; Лапы совы
    mov al, 20h      ; Рисуем пробел для сплошной заливки
    mov ah, 0c0h     ; c0h = Красный цвет заливки фона

render_pixel:
    stosw            ; Рисуем пиксель ПЕРВЫЙ раз (запись символа и цвета в ES:DI)
    stosw            ; Рисуем пиксель ВТОРОЙ раз (для растягивания по ширине)
    
    inc bp           ; Прибавляем пиксель к счётчику строки
    cmp bp, 20       ; Отрисовали всю строку в 20 пикселей?
    jne pixel_loop   ; Если нет — продолжаем рисовать текущий ряд

    ; Конец строки: Переносим курсор на новую строку виртуального экрана
    mov bp, 0
    add di, 80       ; Сдвиг видеопамяти на начало следующего ряда
    
    inc si           ; Сдвигаемся к следующему байту данных (следующей строке совы)
    cmp si, 20       ; Отрисовали все 20 строк?
    jl next_row_load ; Если нет — переходим к обработке следующего ряда

    hlt              ; Завершение работы программы в AsmEd