x86-16 Код машини для DOS, 43 байти
; Draw 32x32 red square
B8 0C 28 mov ax, 0x0C28 ; AL == color red, AH == set pixel function
B9 00 1F mov cx, 31
DrawBox:
BA 00 1F mov dx, 31
DrawRow:
CD 10 int 0x10
4A dec dx
75 FB jnz DrawRow
E2 F6 loop DrawBox
; Draw the interior white cross
B0 0F mov al, 0x0F ; high byte already set
B1 06 mov cl, 6 ; high byte already 0
DrawCross:
B2 0D mov dl, 13 ; high byte already 0
DrawCrossInner:
CD 10 int 0x10 ; plot CX, DX
87 D1 xchg dx, cx
CD 10 int 0x10 ; plot DX, CX
87 D1 xchg dx, cx
42 inc dx
80 FA 12 cmp dl, 13+6
75 F2 jne DrawCrossInner
41 inc cx
80 F9 19 cmp cl, 6+(32-6-6)
75 EA jne DrawCross
C3 ret
Вищевказаний код призначений для збирання у вигляді файлу COM та запуску під DOS. Він викликає відеопослуги ROM BIOS для побудови графіків окремих пікселів, утворюючи 32 × 32 зображення швейцарського прапора у лівому верхньому куті екрана.
Код передбачає, що для режиму відео вже встановлено режим 0x13, що також означає, що для нього потрібен дисплей VGA. Інші відео-режими можуть бути використані, але вимагаючи VGA, ви отримуєте дві речі: (1) квадратні пікселі та (2) палітра за замовчуванням, що включає в себе справжній 100% червоний ( 0xFF0000
) (це означає, що вам не потрібно марнувати байти, змінюючи палітру кольори). Перш ніж запустити цю програму, вам потрібно буде переключити ваш дисплей у режим 0x13; наступний код - все, що потрібно для цього:
mov ax, 0x13
int 0x10
Код не має інших припущень, і він повинен працювати на будь-якому сумісному з x86 обладнанням у сумісній з DOS операційній системі.
Однак програма припиняється відразу після нанесення прапора, тому запит DOS зазвичай буде повторно надруковано у верхньому лівому куті екрана, прикриваючи кілька верхніх рядків прапора. Тому, якщо ви хочете дивуватися справжньому виводу, вам потрібно повісити / призупинити систему перед тим, як він RET
поскаже. Ось скріншот того, як це виглядає, працює у віртуальній машині FreeDOS:
Можливо, можна додатково переграти це, записуючи дані пікселів безпосередньо у буфер відео, тим більше, що я вже припускаю режим 0x13. Я ще цього не пробував. INT 0x10
це вже досить коротка інструкція, але якщо я можу використовувати однобайтові рядкові інструкції для запису даних пікселів безпосередньо в пам'ять, то це може призвести до значної економії коду.