डॉस, 43 बाइट्स के लिए x86-16 मशीन कोड
; 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
उपरोक्त कोड को COM फ़ाइल के रूप में इकट्ठा करने और फिर DOS के तहत चलाने के लिए डिज़ाइन किया गया है। यह ROM BIOS वीडियो सेवाओं को ध्वज के अलग-अलग पिक्सेल को प्लॉट करने के लिए आमंत्रित करता है, जिससे स्क्रीन के ऊपरी-बाएँ कोने में स्विस ध्वज का 32 × 32 प्रतिनिधित्व होता है।
कोड मानता है कि वीडियो मोड पहले से ही 0x13 मोड पर सेट है, जिसका अर्थ यह भी है कि इसके लिए वीजीए डिस्प्ले की आवश्यकता होती है। अन्य वीडियो मोड का उपयोग किया जा सकता है, लेकिन वीजीए की आवश्यकता आपको दो चीजें देती है: (1) वर्ग पिक्सेल, और (2) एक डिफ़ॉल्ट पैलेट जिसमें एक सच्चा 100% लाल ( 0xFF0000
) शामिल है (जिसका अर्थ है कि आपको पैलेट को बदलने के लिए बाइट बर्बाद नहीं करना है। रंग की)। इसलिए इस प्रोग्राम को चलाने से पहले, आपको अपने डिस्प्ले को मोड 0x13 पर स्विच करना होगा; निम्नलिखित कोड आपको बस इतना करना है:
mov ax, 0x13
int 0x10
कोड कोई अन्य धारणा नहीं बनाता है, और डॉस-संगत ऑपरेटिंग सिस्टम के तहत किसी भी x86- संगत हार्डवेयर पर चलना चाहिए।
हालाँकि, झंडे को खींचने के तुरंत बाद कार्यक्रम समाप्त हो जाता है, इसलिए DOS प्रॉम्प्ट को सामान्य रूप से स्क्रीन के ऊपरी-बाएँ कोने पर फिर से प्रिंट किया जाएगा, जो ध्वज की शीर्ष कुछ पंक्तियों को कवर करेगा। इसलिए, यदि आप सही आउटपुट पर अचंभा करना चाहते हैं, तो आपको RET
कलश से पहले सिस्टम को हैंग / पॉज करना होगा । यहाँ एक स्क्रीनशॉट है जो दिखता है, FreeDOS वर्चुअल मशीन में चल रहा है:
यह संभव हो सकता है कि आगे पिक्सेल डेटा को सीधे वीडियो बफ़र पर लिखकर इसे आगे बढ़ाएं, खासकर जब से मैं पहले से ही 0x13 मोड मान रहा हूं। मैंने अभी तक कोशिश नहीं की है। INT 0x10
पहले से ही एक बहुत छोटा निर्देश है, लेकिन अगर मैं पिक्सेल डेटा को सीधे मेमोरी में लिखने के लिए एक-बाइट स्ट्रिंग निर्देशों का उपयोग कर सकता हूं, तो इसके परिणामस्वरूप एक महत्वपूर्ण कोड बचत हो सकती है।