Código de 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
El código anterior está diseñado para ensamblarse como un archivo COM y luego ejecutarse bajo DOS. Invoca los servicios de video ROM BIOS para trazar los píxeles individuales de la bandera, formando una representación de 32 × 32 de la bandera suiza en la esquina superior izquierda de la pantalla.
El código supone que el modo de video ya está configurado en modo 0x13, lo que también significa que requiere una pantalla VGA. Se podrían usar otros modos de video, pero requerir VGA le da dos cosas: (1) píxeles cuadrados y (2) una paleta predeterminada que incluye un verdadero rojo 100% ( 0xFF0000
) (lo que significa que no tiene que perder bytes cambiando la paleta colores). Antes de ejecutar este programa, deberá cambiar su pantalla al modo 0x13; el siguiente código es todo lo que necesitas para hacer eso:
mov ax, 0x13
int 0x10
El código no hace otras suposiciones y debe ejecutarse en cualquier hardware compatible con x86 en un sistema operativo compatible con DOS.
Sin embargo, el programa finaliza inmediatamente después de dibujar la bandera, por lo que la solicitud de DOS normalmente se volverá a imprimir en la esquina superior izquierda de la pantalla, cubriendo las pocas líneas superiores de la bandera. Por lo tanto, si desea maravillarse con la salida real, debe colgar / pausar el sistema antes de que se RET
active. Aquí hay una captura de pantalla de cómo se ve, ejecutándose en una máquina virtual FreeDOS:
Es posible que esto se reduzca aún más al escribir datos de píxeles directamente en el búfer de video, especialmente porque ya estoy asumiendo el modo 0x13. Aún no lo he intentado. INT 0x10
ya es una instrucción bastante corta, pero si puedo usar las instrucciones de cadena de un byte para escribir datos de píxeles directamente en la memoria, eso podría generar un importante ahorro de código.