Código da máquina x86-16 para DOS, 43 bytes
; 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
O código acima foi projetado para ser montado como um arquivo COM e executado no DOS. Ele chama os serviços de vídeo ROM BIOS para plotar os pixels individuais da bandeira, formando uma representação 32 × 32 da bandeira Suíça no canto superior esquerdo da tela.
O código pressupõe que o modo de vídeo já esteja definido no modo 0x13, o que também significa que requer uma exibição VGA. Outros modos de vídeo podem ser usados, mas a exigência de VGA fornece duas coisas: (1) pixels quadrados e (2) uma paleta padrão que inclui um verdadeiro 100% vermelho ( 0xFF0000
) (o que significa que você não precisa perder bytes alterando a paleta cores). Antes de executar este programa, você precisará, portanto, alternar sua exibição para o modo 0x13; o seguinte código é tudo o que você precisa para fazer isso:
mov ax, 0x13
int 0x10
O código não faz outras suposições e deve ser executado em qualquer hardware compatível com x86 em um sistema operacional compatível com DOS.
No entanto, o programa termina imediatamente após o desenho da bandeira, de modo que o prompt do DOS será reimpresso normalmente no canto superior esquerdo da tela, cobrindo as poucas linhas superiores da bandeira. Portanto, se você quiser se maravilhar com a saída verdadeira, precisará interromper / pausar o sistema antes que ele seja RET
processado. Aqui está uma captura de tela da aparência, executando em uma máquina virtual FreeDOS:
Pode ser possível resolver isso ainda mais, escrevendo dados de pixel diretamente no buffer de vídeo, especialmente porque já estou assumindo o modo 0x13. Ainda não tentei isso. INT 0x10
já é uma instrução bastante curta, mas se eu puder usar as instruções da string de um byte para gravar dados de pixel diretamente na memória, isso poderá resultar em uma economia significativa de código.