Mã máy x86-16 cho 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
Đoạn mã trên được thiết kế để được lắp ráp dưới dạng tệp COM và sau đó chạy trong DOS. Nó gọi các dịch vụ video ROM ROM để vẽ các pixel riêng lẻ của cờ, tạo thành hình đại diện 32 × 32 của cờ Thụy Sĩ ở góc trên bên trái màn hình.
Mã này giả định rằng chế độ video đã được đặt thành chế độ 0x13, điều đó cũng có nghĩa là nó yêu cầu màn hình VGA. Các chế độ video khác có thể được sử dụng, nhưng yêu cầu VGA cung cấp cho bạn hai điều: (1) pixel vuông và (2) bảng màu mặc định bao gồm màu đỏ thật 100% ( 0xFF0000
) (có nghĩa là bạn không phải lãng phí byte khi thay đổi bảng màu màu sắc). Do đó, trước khi chạy chương trình này, bạn sẽ cần chuyển màn hình sang chế độ 0x13; đoạn mã sau đây là tất cả những gì bạn cần để làm điều đó:
mov ax, 0x13
int 0x10
Mã này không đưa ra các giả định nào khác và nên chạy trên mọi phần cứng tương thích x86 trong hệ điều hành tương thích với DOS.
Tuy nhiên, chương trình chấm dứt ngay lập tức sau khi vẽ cờ, do đó, dấu nhắc DOS thường sẽ được in lại ở góc trên cùng bên trái của màn hình, che đi vài dòng trên cùng của cờ. Do đó, nếu bạn muốn ngạc nhiên với đầu ra thực sự, bạn cần treo / tạm dừng hệ thống trước khi nó khởi động RET
. Dưới đây là ảnh chụp màn hình của giao diện, chạy trong máy ảo FreeDOS:
Có thể đánh golf điều này xuống hơn nữa bằng cách ghi dữ liệu pixel trực tiếp vào bộ đệm video, đặc biệt vì tôi đã giả sử chế độ 0x13. Tôi chưa thử điều đó. INT 0x10
đã là một hướng dẫn khá ngắn, nhưng nếu tôi có thể sử dụng các lệnh chuỗi một byte để ghi dữ liệu pixel trực tiếp vào bộ nhớ, thì điều đó có thể giúp tiết kiệm mã đáng kể.