x86-16 Codice macchina per 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
Il codice sopra è progettato per essere assemblato come file COM e quindi eseguito in DOS. Invoca i servizi video del BIOS ROM per tracciare i singoli pixel della bandiera, formando una rappresentazione 32 × 32 della bandiera svizzera nell'angolo in alto a sinistra dello schermo.
Il codice presuppone che la modalità video sia già impostata sulla modalità 0x13, il che significa anche che richiede un display VGA. Potrebbero essere utilizzate altre modalità video, ma richiedere VGA offre due cose: (1) pixel quadrati e (2) una tavolozza predefinita che include un rosso reale al 100% ( 0xFF0000
) (il che significa che non devi sprecare byte cambiando la tavolozza colori). Prima di eseguire questo programma, sarà quindi necessario commutare il display in modalità 0x13; il seguente codice è tutto ciò che serve per farlo:
mov ax, 0x13
int 0x10
Il codice non fa altre ipotesi e dovrebbe essere eseguito su qualsiasi hardware compatibile x86 con un sistema operativo compatibile DOS.
Tuttavia, il programma termina immediatamente dopo aver disegnato il flag, quindi il prompt del DOS verrà normalmente ristampato nell'angolo in alto a sinistra dello schermo, coprendo le prime linee del flag. Pertanto, se si desidera meravigliarsi dell'output reale, è necessario bloccare / mettere in pausa il sistema prima che RET
urti. Ecco uno screenshot di come appare, in esecuzione in una macchina virtuale FreeDOS:
Potrebbe essere possibile approfondire ulteriormente questo problema scrivendo i dati pixel direttamente nel buffer video, soprattutto perché sto già assumendo la modalità 0x13. Non l'ho ancora provato. INT 0x10
è già un'istruzione piuttosto breve, ma se posso usare le istruzioni di stringa a un byte per scrivere i dati dei pixel direttamente nella memoria, ciò potrebbe comportare un notevole risparmio di codice.