x86-16 Kod maszynowy dla DOS, 43 bajty
; 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
Powyższy kod został zaprojektowany jako plik COM, a następnie uruchomiony w systemie DOS. Wywołuje usługi wideo ROM BIOS, aby wykreślić poszczególne piksele flagi, tworząc reprezentację szwajcarskiej flagi 32 × 32 w lewym górnym rogu ekranu.
Kod zakłada, że tryb wideo jest już ustawiony na tryb 0x13, co oznacza również, że wymaga wyświetlacza VGA. Można użyć innych trybów wideo, ale wymaganie VGA daje dwie rzeczy: (1) kwadratowe piksele i (2) domyślną paletę, która zawiera prawdziwie 100% czerwony ( 0xFF0000
) (co oznacza, że nie musisz marnować bajtów na zmianę palety zabarwienie). Dlatego przed uruchomieniem tego programu należy przełączyć wyświetlacz w tryb 0x13; poniższy kod to wszystko, czego potrzebujesz:
mov ax, 0x13
int 0x10
Kod nie przyjmuje innych założeń i powinien działać na dowolnym sprzęcie kompatybilnym z x86 w systemie operacyjnym kompatybilnym z DOS.
Jednak program kończy się natychmiast po narysowaniu flagi, więc monit DOS będzie zwykle drukowany ponownie w lewym górnym rogu ekranu, zakrywając kilka górnych wierszy flagi. Dlatego jeśli chcesz dziwić się prawdziwemu wyjściu, musisz zawiesić / wstrzymać system przed jego RET
urnowaniem. Oto zrzut ekranu tego, jak to wygląda, na maszynie wirtualnej FreeDOS:
Możliwe, że będzie można pograć w golfa dalej, zapisując dane pikseli bezpośrednio w buforze wideo, zwłaszcza, że już zakładam tryb 0x13. Jeszcze tego nie próbowałem. INT 0x10
jest już dość krótką instrukcją, ale jeśli mogę użyć jednobajtowych instrukcji łańcuchowych do zapisania danych pikseli bezpośrednio do pamięci, to może to spowodować znaczne oszczędności kodu.