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