Code machine x86-16 pour DOS, 43 octets
; 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
Le code ci-dessus est conçu pour être assemblé en tant que fichier COM, puis exécuté sous DOS. Il appelle les services vidéo du BIOS ROM pour tracer les pixels individuels du drapeau, formant ainsi une représentation 32 × 32 du drapeau suisse dans le coin supérieur gauche de l'écran.
Le code suppose que le mode vidéo est déjà défini sur le mode 0x13, ce qui signifie également qu'il nécessite un affichage VGA. D'autres modes vidéo peuvent être utilisés, mais le format VGA nécessite deux choses: (1) des pixels carrés et (2) une palette par défaut comprenant un vrai 100% rouge ( 0xFF0000
) (ce qui signifie que vous n'avez pas à perdre des octets pour changer de palette. couleurs). Avant d'exécuter ce programme, vous devrez donc basculer votre affichage en mode 0x13; le code suivant est tout ce dont vous avez besoin pour faire cela:
mov ax, 0x13
int 0x10
Le code ne fait aucune autre hypothèse et doit être exécuté sur tout matériel compatible x86 sous un système d'exploitation compatible DOS.
Cependant, le programme se termine immédiatement après avoir dessiné l'indicateur. L'invite DOS est donc normalement réimprimée dans le coin supérieur gauche de l'écran, couvrant ainsi les quelques lignes supérieures de l'indicateur. Par conséquent, si vous voulez vous émerveiller de la véritable sortie, vous devez suspendre / mettre en pause le système avant qu'il ne soit RET
uriné. Voici une capture d'écran de ce à quoi cela ressemble, s'exécutant sur une machine virtuelle FreeDOS:
Il serait peut-être possible de jouer au golf plus loin en écrivant des données de pixels directement dans le tampon vidéo, d’autant plus que j’assume déjà le mode 0x13. Je n'ai pas encore essayé. INT 0x10
est déjà une instruction assez courte, mais si je peux utiliser les instructions de chaîne sur un octet pour écrire des données de pixels directement dans la mémoire, cela pourrait entraîner une économie de code significative.