x86-16 Kode Mesin untuk 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
Kode di atas dirancang untuk dirakit sebagai file COM dan kemudian dijalankan di bawah DOS. Ini memanggil layanan video ROM BIOS untuk memplot piksel masing-masing bendera, membentuk representasi 32x32 dari bendera Swiss di sudut kiri atas layar.
Kode ini mengasumsikan bahwa mode video sudah diatur ke mode 0x13, yang juga berarti bahwa itu memerlukan tampilan VGA. Mode video lain dapat digunakan, tetapi membutuhkan VGA memberi Anda dua hal: (1) piksel persegi, dan (2) palet default yang mencakup 100% benar merah ( 0xFF0000
) (artinya Anda tidak perlu membuang byte mengubah palet warna). Sebelum menjalankan program ini, Anda perlu mengalihkan tampilan ke mode 0x13; hanya kode yang perlu Anda lakukan:
mov ax, 0x13
int 0x10
Kode tidak membuat asumsi lain, dan harus berjalan pada perangkat keras apa pun yang kompatibel dengan x86 di bawah sistem operasi yang kompatibel dengan DOS.
Namun, program berakhir segera setelah menggambar bendera, sehingga DOS prompt biasanya akan dicetak ulang di sudut kiri atas layar, menutupi beberapa baris atas bendera. Oleh karena itu, jika Anda ingin mengagumi output yang sebenarnya, Anda harus menggantung / menjeda sistem sebelum RET
menyala. Berikut screenshot dari tampilannya, berjalan di mesin virtual FreeDOS:
Dimungkinkan untuk menurunkan ini lebih jauh dengan menulis data piksel langsung ke buffer video, terutama karena saya sudah mengasumsikan mode 0x13. Saya belum mencobanya. INT 0x10
sudah merupakan instruksi yang cukup singkat, tetapi jika saya dapat menggunakan instruksi satu byte string untuk menulis data pixel langsung ke memori, maka itu dapat menghasilkan penghematan kode yang signifikan.