x86-16 DOS için Makine Kodu, 43 bayt
; 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
Yukarıdaki kod, bir COM dosyası olarak birleştirilerek DOS altında çalıştırılmak üzere tasarlanmıştır. Bayrağın münferit piksellerini çizmek için ROM BIOS video servislerini çağırır ve ekranın sol üst köşesinde İsviçre bayrağının 32 × 32 gösterimini oluşturur.
Kod, video modunun zaten 0x13 moduna ayarlandığını varsayar; bu, VGA ekranı gerektirdiği anlamına gelir. Diğer video modları kullanılabilir, ancak VGA gerektiren size iki şey verir: (1) kare pikseller ve (2) gerçek% 100 kırmızı içeren bir varsayılan palet ( 0xFF0000
) (paleti değiştirmek için bayt harcamak zorunda değilsiniz) renkler). Bu programı çalıştırmadan önce, ekranınızı 0x13 moduna getirmeniz gerekecektir; aşağıdaki kodu yapmanız gereken tek şey:
mov ax, 0x13
int 0x10
Kod başka bir varsayımda bulunmaz ve DOS uyumlu bir işletim sistemi altında x86 uyumlu herhangi bir donanımda çalışmalıdır.
Bununla birlikte, program bayrağın çizilmesinden hemen sonra sona erer, bu nedenle DOS istemi normal olarak ekranın sol üst köşesine yeniden basılarak bayrağın ilk birkaç satırını kaplar. Bu nedenle, gerçek çıkışa şaşırtmak istiyorsanız, sistemi çalıştırmadan önce RET
kapatmanız / duraklatmanız gerekir . İşte bir FreeDOS sanal makinesinde çalışan, nasıl göründüğünü gösteren bir ekran görüntüsü:
Piksel verilerini doğrudan video arabelleğine yazarak bunu daha da golf oynamak mümkün olabilir, özellikle de zaten 0x13 modunu kabul ediyorum. Bunu henüz denemedim. INT 0x10
zaten çok kısa bir talimat, ancak bir baytlık dize komutlarını doğrudan veri belleğine piksel veri yazmak için kullanabilirsem, bu önemli bir kod tasarrufuna neden olabilir.