x86-16-Maschinencode für DOS, 43 Byte
; 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
Der obige Code soll als COM-Datei zusammengestellt und dann unter DOS ausgeführt werden. Es ruft die ROM BIOS-Videodienste auf, um die einzelnen Pixel der Flagge zu zeichnen und eine 32 × 32-Darstellung der Schweizer Flagge in der oberen linken Ecke des Bildschirms zu bilden.
Der Code setzt voraus, dass der Videomodus bereits auf den Modus 0x13 eingestellt ist. Dies bedeutet auch, dass ein VGA-Display erforderlich ist. Es können auch andere Videomodi verwendet werden. Wenn Sie jedoch VGA benötigen, erhalten Sie zwei Dinge: (1) quadratische Pixel und (2) eine Standardpalette mit einem echten Rotanteil von 100% ( 0xFF0000
) (Sie müssen also keine Bytes für das Ändern der Palette verschwenden) Farben). Bevor Sie dieses Programm ausführen, müssen Sie Ihre Anzeige daher in den Modus 0x13 schalten. Dazu brauchen Sie nur den folgenden Code:
mov ax, 0x13
int 0x10
Der Code macht keine anderen Annahmen und sollte auf jeder x86-kompatiblen Hardware unter einem DOS-kompatiblen Betriebssystem ausgeführt werden.
Das Programm wird jedoch sofort nach dem Zeichnen des Flags beendet, sodass die DOS-Eingabeaufforderung normalerweise in der oberen linken Ecke des Bildschirms erneut gedruckt wird und die obersten paar Zeilen des Flags verdeckt. Wenn Sie also die wahre Ausgabe bestaunen möchten, müssen Sie das System anhalten, bevor es funktioniert RET
. Hier ist ein Screenshot davon, wie das auf einer virtuellen FreeDOS-Maschine aussieht:
Es könnte möglich sein, dies weiter abzuspielen, indem Pixeldaten direkt in den Videopuffer geschrieben werden, zumal ich bereits den Modus 0x13 einnehme. Das habe ich noch nicht ausprobiert. INT 0x10
ist bereits eine ziemlich kurze Anweisung, aber wenn ich die Ein-Byte-Zeichenfolgenanweisungen verwenden kann, um Pixeldaten direkt in den Speicher zu schreiben, könnte dies zu einer erheblichen Codeeinsparung führen.