Z80 मशीन कोड, 8 6 बाइट्स *
<8ww8>
* Amstrad BASIC से प्रवेश करके कुछ शर्तों को मानता है
< INC A // A=A+1
8w JR C, #77 ## C is unset unless A has overflowed, does nothing
w LD (HL), A // Saves A to memory location in HL (randomly initialised)
8> JR C, #3E ## C is still unset, does nothing
A
शुरू में जब BASIC से प्रवेश किया जाता है। यह वृद्धि कर देता है A
n बार, तो यह लिखते हैं n (जो बुनियादी द्वारा एक से थोड़ा यादृच्छिक स्थान के लिए सेट है) एक ही स्मृति स्थान के लिए समय! JR
के बाद से कूद सापेक्ष आपरेशन कभी नहीं कुछ भी करता है C
झंडा हमेशा सेट नहीं हो, तो "बाहर टिप्पणी" निम्नलिखित बाइट के लिए प्रयोग किया जाता है! यह संस्करण निश्चित प्रवेश शर्तों को मानकर थोड़ा धोखा दे रहा है, अर्थात् मूल गारंटियों से प्रवेश करना जो A
हमेशा 0. होता है। (HL)
सुरक्षित होने की गारंटी नहीं है, और वास्तव में, शायद एक खतरनाक स्थान है। नीचे दिया गया कोड बहुत अधिक मजबूत है यही कारण है कि यह इतना लंबा है।
Z80 मशीन कोड, 30 बाइट्स
ASCII के रूप में:
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
मूल रूप से, पहला आधा शून्य मान के निर्माण की गारंटी देता है और दूसरा आधा इसे बढ़ाता है और इसे मेमोरी में लिखता है। नीचे दिए गए विस्तारित संस्करण में ##
कोड को दर्शाता है जो दर्पण के अपने आधे हिस्से में कोई उद्देश्य नहीं देता है।
o LD L, A ##
!.w LD HL, #772E // Load specific address to not corrupt random memory!
w LD (HL), A ## Save random contents of A to memory
.! LD L, #21 ##
>A LD A, #41 // A=#41
= DEC A // A=#40
o LD L, A // L=#40
>{ LD A, #7B ##
) ADD HL, HL // HL=#EE80
) ADD HL, HL // HL=#DD00. L=#00 at this point
(( JR Z, #28 ##
} LD A, L // A=L
< INC A // A=L+1
o LD L, A // L=L+1
= DEC A // A=L
A LD B, C ##
< INC A // A=L+1
!.w LD HL, #772E // Load address back into HL
w LD (HL), A // Save contents of A to memory
.! LD L, #21 ##
o LD L, A // L=A
अनुमत निर्देशों का टूटना:
n op description
-- ---- -----------
28 LD LoaD 8-bit or 16-bit register
3 DEC DECrement 8-bit or 16-bit register
1 INC INCrement 8-bit or 16-bit register
1 ADD ADD 8-bit or 16-bit register
Available but useless instructions:
3 JR Jump Relative to signed 8-bit offset
1 DAA Decimal Adjust Accumulator (treats the A register as two decimal digits
instead of two hexadecimal digits and adjusts it if necessary)
1 CPL 1s ComPLement A
1 HALT HALT the CPU until an interrupt is received
अनुमति दिए गए 39 निर्देशों में से, 28 भार संचालन हैं (0x40 से 0x7F तक के ब्लॉक सभी एकल बाइट LD
निर्देश हैं), जिनमें से अधिकांश यहां कोई मदद नहीं करते हैं! स्मृति अनुदेश के लिए केवल लोड अभी भी अनुमति है LD (HL), A
जिसका मतलब है कि मुझे मूल्य को स्टोर करना होगा A
। चूँकि A
एक अनुमत INC
निर्देश के साथ एकमात्र रजिस्टर बचा है, यह वास्तव में काफी उपयोगी है!
मैं A
0x00 के साथ शुरू करने के लिए लोड नहीं कर सकता क्योंकि ASCII 0x00 एक अनुमत चरित्र नहीं है! सभी उपलब्ध मान 0 से दूर हैं और सभी गणितीय और तार्किक निर्देश अस्वीकृत हो गए हैं! सिवाय ... मैं अभी भी कर सकता हूँ ADD HL, HL
, 16-बिट HL
को अपने आप में जोड़ें ! सीधे लोडिंग मानों के अलावा (यहाँ कोई उपयोग नहीं!), इंक्रीमेंटिंग A
और डीक्रिमेंटिंग A
, L
या HL
यह एक ही तरीका है जिससे मुझे एक रजिस्टर का मूल्य बदलना पड़ता है! वास्तव में एक विशेष निर्देश है जो पहली छमाही में सहायक हो सकता है लेकिन दूसरी छमाही में काम करने के लिए एक दर्द, और एक-पूरक निर्देश जो यहां लगभग बेकार है और बस जगह लेगा।
तो, मुझे 0 का निकटतम मूल्य मिला: मैं 0x41। वह 0 के करीब कैसे है? बाइनरी में यह 0x01000001 है। इसलिए मैं इसे घटाता हूं, इसे लोड करता L
हूं और ADD HL, HL
दो बार करता हूं ! L
अब शून्य है, जिसे मैं वापस लोड करता हूं A
! दुर्भाग्य से, ASCII कोड ADD HL, HL
है )
इसलिए मुझे अब (
दो बार उपयोग करने की आवश्यकता है । सौभाग्य से, (
है JR Z, e
, जहां e
अगले बाइट है। तो यह दूसरी बाइट को ऊपर उठाता है और मुझे यह सुनिश्चित करने की ज़रूरत है कि यह Z
ध्वज के साथ सावधान होकर कुछ भी नहीं करता है ! Z
ध्वज को प्रभावित करने का अंतिम निर्देश DEC A
(प्रति-सहज रूप से, ADD HL, HL
इसे नहीं बदलता है) और जब से मुझे पता है कि A
उस बिंदु पर 0x40 था, इसकी गारंटी है कि Z
यह सेट नहीं है।
दूसरी छमाही में पहला निर्देश JR Z, #28
पहले 255 बार कुछ भी नहीं करेगा क्योंकि Z ध्वज को केवल तभी सेट किया जा सकता है जब A 255 से 0. पर ओवरफ्लो हो गया हो। उसके बाद आउटपुट गलत होगा, हालाँकि यह केवल 8-बिट मानों को वैसे भी सहेज रहा है कोई बात नहीं होनी चाहिए। कोड को 255 से अधिक बार विस्तारित नहीं किया जाना चाहिए।
कोड को एक स्निपेट के रूप में निष्पादित किया जाना है क्योंकि सफाई से लौटने के सभी उपलब्ध तरीके बंद कर दिए गए हैं। सभी RETurn निर्देश 0x80 से ऊपर हैं और कुछ जंप संचालन की अनुमति केवल एक सकारात्मक ऑफसेट पर जा सकती है, क्योंकि सभी 8-बिट नकारात्मक मान भी बंद कर दिए गए हैं!
#
अपने स्वयं के प्रकाशन के रूप में अच्छी तरह से है, लेकिन, आप सही हैं, कंसोल में नहीं।