अध्याय 4: 6502 माइक्रोप्रोसेसर असेंबली भाषा ट्यूटोरियल

Adhyaya 4 6502 Ma Ikroprosesara Asembali Bhasa Tyutoriyala



अध्याय 4: 6502 माइक्रोप्रोसेसर असेंबली भाषा ट्यूटोरियल

4.1 परिचय

6502 माइक्रोप्रोसेसर 1975 में जारी किया गया था। इसका उपयोग उस समय कुछ पर्सनल कंप्यूटरों जैसे कि Apple II, कमोडोर 64 और BBC माइक्रो के लिए माइक्रोप्रोसेसर के रूप में किया गया था।







6502 माइक्रोप्रोसेसर का उत्पादन आज भी बड़ी संख्या में किया जा रहा है। यह अब एक केंद्रीय प्रसंस्करण इकाई नहीं है जिसका उपयोग आज पर्सनल कंप्यूटर (लैपटॉप) में किया जाता है, लेकिन यह अभी भी बड़ी संख्या में उत्पादित होता है और आज इलेक्ट्रॉनिक और इलेक्ट्रिकल उपकरणों में उपयोग किया जाता है। अधिक आधुनिक कंप्यूटर आर्किटेक्चर को समझने के लिए, 6502 जैसे पुराने लेकिन काफी सफल माइक्रोप्रोसेसर की जांच करना बहुत उपयोगी है।



चूँकि इसे समझना और प्रोग्राम करना आसान है, यह असेंबली भाषा सिखाने के लिए उपयोग करने के लिए सबसे अच्छे (यदि सबसे अच्छा नहीं है) माइक्रोप्रोसेसर में से एक है। असेंबली भाषा एक निम्न-स्तरीय भाषा है जिसका उपयोग कंप्यूटर को प्रोग्राम करने के लिए किया जा सकता है। ध्यान दें कि एक माइक्रोप्रोसेसर की असेंबली भाषा दूसरे माइक्रोप्रोसेसर की असेंबली भाषा से भिन्न होती है। इस अध्याय में 6502 माइक्रोप्रोसेसर असेंबली भाषा सिखाई जाती है। अधिक सटीक रूप से, यह 65सी02 है जिसे सिखाया जाता है, लेकिन इसे केवल 6502 के रूप में संदर्भित किया जाता है।



अतीत में एक प्रसिद्ध कंप्यूटर को कमोडोर_64 कहा जाता है। 6502 6500 परिवार का एक माइक्रोप्रोसेसर है। कमोडोर_64 कंप्यूटर 6510 माइक्रोप्रोसेसर का उपयोग करता है। 6510 माइक्रोप्रोसेसर 6500 µP का है। 6502 µP का निर्देश सेट 6510 µP के लगभग सभी निर्देशों के समान है। इस अध्याय और अगले अध्याय का ज्ञान कमोडोर_64 कंप्यूटर पर आधारित है। इस ज्ञान का उपयोग ऑनलाइन कैरियर पाठ्यक्रम के इस भाग में आधुनिक कंप्यूटर आर्किटेक्चर और आधुनिक ऑपरेटिंग सिस्टम को समझाने के लिए आधार के रूप में किया जाता है।





कंप्यूटर आर्किटेक्चर कंप्यूटर के मदरबोर्ड के घटकों को संदर्भित करता है और यह बताता है कि प्रत्येक घटक, विशेष रूप से माइक्रोप्रोसेसर के भीतर डेटा कैसे प्रवाहित होता है, घटकों के बीच डेटा कैसे प्रवाहित होता है, और डेटा कैसे इंटरैक्ट करता है। डेटा के लिए एकवचन डेटम है। कंप्यूटर के कंप्यूटर आर्किटेक्चर का अध्ययन करने का एक प्रभावी तरीका मदरबोर्ड की असेंबली भाषा का अध्ययन करना है।

कमोडोर_64 कंप्यूटर को 8-बिट कंप्यूटर वर्ड का कंप्यूटर कहा जाता है। इसका मतलब यह है कि जानकारी को आठ-बिट बाइनरी कोड के रूप में संग्रहीत, स्थानांतरित और हेरफेर किया जाता है।



कमोडोर 64 मदरबोर्ड का ब्लॉक आरेख
कमोडोर 64 मदरबोर्ड का ब्लॉक आरेख है:


चित्र 4.1 कमोडोर_64 सिस्टम यूनिट का ब्लॉक आरेख

6510 माइक्रोप्रोसेसर की 6502 माइक्रोप्रोसेसर के रूप में कल्पना करें। कुल मेमोरी बाइट्स की एक श्रृंखला (8-बिट प्रति बाइट) है। इसमें रैंडम-एक्सेस (रीड/राइट) मेमोरी होती है जिसमें बाइट्स को लिखा या मिटाया जा सकता है। जब कंप्यूटर की बिजली बंद हो जाती है, तो रैंडम-एक्सेस मेमोरी (RAM) की सभी जानकारी मिट जाती है। इसमें रीड-ओनली मेमोरी (ROM) भी ​​है। जब कंप्यूटर की बिजली बंद कर दी जाती है, तो ROM में जानकारी बनी रहती है (मिटती नहीं है)।

इसमें इनपुट/आउटपुट पोर्ट (सर्किट) है जिसे आरेख में इनपुट/आउटपुट डिवाइस के रूप में संदर्भित किया गया है। इस पोर्ट को उन पोर्ट के साथ भ्रमित नहीं किया जाना चाहिए जो कंप्यूटर सिस्टम यूनिट के बाएं और दाएं या आगे और पीछे की ऊर्ध्वाधर सतहों पर दिखाई देते हैं। वे दो अलग चीजें हैं. इस आंतरिक पोर्ट से हार्ड-डिस्क (या फ़्लॉपी-डिस्क), कीबोर्ड और मॉनिटर जैसे बाह्य उपकरणों से कनेक्शन आरेख में नहीं दिखाए गए हैं।

आरेख में तीन बसें (विद्युत बहुत छोटे तार कंडक्टरों के समूह) हैं। प्रत्येक तार बिट 1 या बिट 0 को स्थानांतरित कर सकता है। रैम और इनपुट/आउटपुट पोर्ट (इनपुट/आउटपुट डिवाइस) में एक समय में आठ-बिट बाइट (एक घड़ी पल्स) के हस्तांतरण के लिए डेटा बस द्विदिश है। डेटा बस आठ बिट चौड़ी है।

सभी घटक एड्रेस बस से जुड़े हुए हैं। एड्रेस बस माइक्रोप्रोसेसर से यूनिडायरेक्शनल है। एड्रेस बस के लिए सोलह कंडक्टर हैं, और प्रत्येक में एक बिट (1 या 0) होता है। एक क्लॉक पल्स में सोलह बिट भेजे जाते हैं।

वहाँ नियंत्रण बस है. नियंत्रण बस के कुछ कंडक्टर माइक्रोप्रोसेसर से प्रत्येक बिट को अन्य घटकों में स्थानांतरित करेंगे। कुछ नियंत्रण रेखाएं बिट्स को इनपुट/आउटपुट (आईओ) पोर्ट से माइक्रोप्रोसेसर तक ले जाती हैं।

स्मृति
RAM और ROM को एक मेमोरी असेंबली माना जाता है। इस असेंबली को आरेखीय रूप से इस प्रकार दर्शाया गया है जहां हेक्साडेसिमल संख्याओं में '$' उपसर्ग होता है:


चित्र 4.11 कमोडोर 64 कंप्यूटर के लिए मेमोरी लेआउट

रैम 0000 से है 16 डीएफएफएफ को 16 जिसे $0000 से $DFFF तक लिखा जाता है। 6502 μP असेंबली भाषा के साथ, एक हेक्साडेसिमल संख्या को '$' के साथ उपसर्ग किया जाता है और 16 या H या हेक्स के साथ प्रत्यय (सबस्क्रिप्टेड) ​​नहीं लगाया जाता है। कंप्यूटर बंद होने पर रैम में मौजूद कोई भी जानकारी बंद हो जाती है। ROM $E000 से $FFFF तक शुरू होती है। इसमें सबरूटीन्स हैं जो कंप्यूटर बंद होने पर बंद नहीं होते हैं। ये सबरूटीन आमतौर पर उपयोग किए जाने वाले रूटीन हैं जो प्रोग्रामिंग में सहायता करते हैं। उपयोगकर्ता प्रोग्राम उन्हें कॉल करता है (अगले अध्याय को देखें)।

$0200 से $D000 तक का स्थान (बाइट्स) उपयोगकर्ता प्रोग्राम के लिए है। $D000 से $DFFF तक का स्थान उस जानकारी के लिए है जो सीधे बाह्य उपकरणों (इनपुट/आउटपुट डिवाइस) से संबंधित है। यह ऑपरेटिंग सिस्टम का हिस्सा है. तो, कमोडोर-64 कंप्यूटर का ऑपरेटिंग सिस्टम दो मुख्य भागों में है: ROM में वह भाग जो कभी बंद नहीं होता है और $D000 से $DFFF तक का भाग जो बिजली बंद होने पर बंद हो जाता है। हर बार कंप्यूटर चालू होने पर इस IO (इनपुट/आउटपुट) डेटा को डिस्क से लोड करना पड़ता है। आज, ऐसे डेटा को परिधीय ड्राइवर कहा जाता है। परिधीय इनपुट/आउटपुट डिवाइस पोर्ट से शुरू होकर मदरबोर्ड पर कनेक्शन के माध्यम से कंप्यूटर की ऊर्ध्वाधर सतहों पर पहचाने जाने योग्य पोर्ट से होते हैं, जिनसे मॉनिटर, कीबोर्ड आदि जुड़े होते हैं और स्वयं परिधीय (मॉनिटर, कीबोर्ड, आदि) से जुड़े होते हैं। .).

मेमोरी 2 से बनी होती है 16 = 65,536 बाइट स्थान. हेक्साडेसिमल रूप में ये 10000 हैं 16 = 10000 एच = 10000 हेक्स = $10000 स्थान. कंप्यूटिंग में, आधार दो, आधार दस, आधार सोलह आदि में गिनती 0 से शुरू होती है न कि 1 से। इसलिए, पहला स्थान वास्तव में 000000000000000 का स्थान संख्या है 2 = 0 10 = 0000 16 = $0000. 6502 µP असेंबली भाषा में, किसी पते के स्थान की पहचान के पहले $ लगाया जाता है और इसमें कोई प्रत्यय या सबस्क्रिप्ट नहीं होता है। अंतिम स्थान का स्थान क्रमांक 111111111111111 है 2 = 65,535 10 = एफएफएफएफ 16 = $FFFF और 1000000000000000 नहीं 2 , या 65,536 10 , या 10000 16 , या $10000. 1000000000000000 2 , 65,536 10 , 10000 16 , या $10000 बाइट स्थानों की कुल संख्या देता है।

यहाँ, 2 16 = 65,536 = 64 x 1024 = 64 x 2 10 = 64 किलोबाइट (किलोबाइट)। कमोडोर-64 नाम में 64 के प्रत्यय का अर्थ कुल मेमोरी (रैम और रोम) का 64KB है। एक बाइट 8 बिट है, और 8 बिट मेमोरी में एक बाइट स्थान पर जाएंगे।

64 Kbytes मेमोरी को पेजों में विभाजित किया गया है। प्रत्येक पृष्ठ में 0100 हैं 16 = 256 10 बाइट स्थान. प्रथम 256 10 = प्रथम 0100 16 स्थान पृष्ठ 0 है। दूसरा पृष्ठ 1 है, तीसरा पृष्ठ 2 है, इत्यादि।

65,536 स्थानों को संबोधित करने के लिए प्रत्येक स्थान (पते) के लिए 16 बिट्स आवश्यक हैं। तो, माइक्रोप्रोसेसर से मेमोरी तक एड्रेस बस में 16 लाइनें होती हैं; एक बिट के लिए एक पंक्ति. एक बिट या तो 1 या 0 है.

6502 µP रजिस्टर
एक रजिस्टर बाइट मेमोरी स्थान के लिए बाइट कोशिकाओं की तरह है। 6502 µP में छह रजिस्टर हैं: पांच 8-बिट रजिस्टर और एक 16-बिट रजिस्टर। 16-बिट रजिस्टर को प्रोग्राम काउंटर कहा जाता है जिसे संक्षिप्त रूप में पीसी कहा जाता है। यह अगले निर्देश के लिए मेमोरी एड्रेस रखता है। एक असेंबली लैंग्वेज प्रोग्राम में निर्देश होते हैं जिन्हें मेमोरी में रखा जाता है। मेमोरी में किसी विशेष बाइट स्थान को संबोधित करने के लिए सोलह (16) विभिन्न बिट्स की आवश्यकता होती है। एक विशेष क्लॉक पल्स पर, इन बिट्स को निर्देश पढ़ने के लिए एड्रेस बस की 16-बिट एड्रेस लाइन पर भेजा जाता है। 6502 µP के लिए सभी रजिस्टर इस प्रकार दर्शाए गए हैं:


चित्र 4.12 6502 μP रजिस्टर

प्रोग्राम काउंटर या पीसी को आरेख में 16-बिट रजिस्टर के रूप में देखा जा सकता है। प्रोग्राम काउंटर लो के लिए निचले महत्वपूर्ण आठ बिट्स को पीसीएल के रूप में लेबल किया गया है। प्रोग्राम काउंटर हाई के लिए उच्चतर महत्वपूर्ण आठ बिट्स को PCH के रूप में लेबल किया गया है। कमोडोर-64 की मेमोरी में एक निर्देश में एक, दो या तीन बाइट्स शामिल हो सकते हैं। पीसी में 16 बिट्स मेमोरी में निष्पादित होने वाले अगले निर्देश की ओर इशारा करते हैं। माइक्रोप्रोसेसर में सर्किट के बीच, उनमें से दो को अंकगणितीय तर्क इकाई और निर्देश डिकोडर कहा जाता है। यदि वर्तमान निर्देश जो µP (माइक्रोप्रोसेसर) में संसाधित किया जा रहा है, एक बाइट लंबा है, तो ये दो सर्किट अगले निर्देश के लिए पीसी को 1 यूनिट तक बढ़ा देते हैं। यदि वर्तमान निर्देश जो µP में संसाधित किया जा रहा है, दो बाइट्स लंबा है, जिसका अर्थ है कि यह मेमोरी में लगातार दो बाइट्स रखता है, तो ये दो सर्किट अगले निर्देश के लिए पीसी को 2 इकाइयों तक बढ़ा देते हैं। यदि वर्तमान निर्देश जो µP में संसाधित किया जा रहा है, तीन बाइट्स लंबा है, जिसका अर्थ है कि यह मेमोरी में लगातार तीन बाइट्स रखता है, तो ये दो सर्किट अगले निर्देश के लिए पीसी को 3 इकाइयों तक बढ़ा देते हैं।

संचायक 'ए' एक आठ-बिट सामान्य प्रयोजन रजिस्टर है जो अधिकांश अंकगणित और तर्क संचालन के परिणाम को संग्रहीत करता है।

प्रोग्राम के चरणों को गिनने के लिए 'X' और 'Y' रजिस्टरों का उपयोग किया जाता है। प्रोग्रामिंग में गिनती 0 से शुरू होती है। इसलिए, उन्हें इंडेक्स रजिस्टर कहा जाता है। उनके कुछ अन्य उद्देश्य भी हैं.

हालांकि स्टैक पॉइंटर रजिस्टर, 'एस' में 9 बिट्स हैं जिन्हें आठ-बिट रजिस्टर माना जाता है। इसकी सामग्री रैंडम एक्सेस मेमोरी (रैम) के पेज 1 में एक बाइट स्थान की ओर इशारा करती है। पेज 1 बाइट $0100 (256) से शुरू होता है 10 ) बाइट करने के लिए $01FF (511 10 ). जब कोई प्रोग्राम चल रहा होता है, तो वह मेमोरी में एक निर्देश से अगले लगातार निर्देश की ओर बढ़ता है। हालांकि, यह मामला हमेशा नहीं होता है। ऐसे समय होते हैं जब यह निर्देशों को लगातार चलाने के लिए एक मेमोरी क्षेत्र से दूसरे मेमोरी क्षेत्र में चला जाता है। RAM में पेज 1 को स्टैक के रूप में उपयोग किया जाता है। स्टैक एक बड़ा रैम मेमोरी क्षेत्र है जिसमें कोड को जारी रखने के लिए अगले पते होते हैं जहां से जंप होता है। जंपिंग निर्देशों वाले कोड स्टैक में नहीं हैं; वे स्मृति में कहीं और हैं। हालाँकि, जंप-टू निर्देश निष्पादित होने के बाद, निरंतरता पते (कोड सेगमेंट नहीं) स्टैक में होते हैं। छलांग या शाखा निर्देशों के परिणामस्वरूप उन्हें वहां धकेल दिया गया था।

पी का आठ-बिट प्रोसेसर स्टेटस रजिस्टर एक विशेष प्रकार का रजिस्टर है। व्यक्तिगत बिट्स एक दूसरे से संबंधित या जुड़े हुए नहीं हैं। वहां प्रत्येक बिट को ध्वज कहा जाता है और दूसरों से स्वतंत्र रूप से इसकी सराहना की जाती है। आवश्यकता पड़ने पर झंडों के अर्थ निम्नलिखित दिये गये हैं।

प्रत्येक रजिस्टर के लिए पहला और अंतिम बिट इंडेक्स पिछले आरेख में प्रत्येक रजिस्टर के ऊपर दर्शाया गया है। रजिस्टर में बिट इंडेक्स (स्थिति) की गिनती दाईं ओर 0 से शुरू होती है।

बाइनरी, हेक्साडेसिमल और दशमलव में मेमोरी पेज
निम्न तालिका बाइनरी, हेक्साडेसिमल और दशमलव में मेमोरी पेजों की शुरुआत दिखाती है:

प्रत्येक पृष्ठ में 1,0000,0000 हैं 2 बाइट्स की संख्या जो 100 के समान है एच बाइट्स की संख्या जो 256 के समान है 10 बाइट्स की संख्या. पिछले मेमोरी आरेख में, पृष्ठों को पृष्ठ 0 से ऊपर की ओर जाते हुए दर्शाया गया है, नीचे की ओर नहीं, जैसा कि तालिका में दर्शाया गया है।

इस तालिका के बाइनरी, हेक्साडेसिमल और दशमलव कॉलम अपने अलग-अलग आधारों में मेमोरी बाइट स्थान पते देते हैं। ध्यान दें कि पृष्ठ शून्य के लिए, कोडिंग करते समय केवल निचले बाइट के लिए बिट्स टाइप करना आवश्यक है। उच्च बाइट के लिए बिट्स को छोड़ा जा सकता है क्योंकि वे हमेशा शून्य होते हैं (पृष्ठ शून्य के लिए)। शेष पृष्ठों के लिए, उच्च बाइट के लिए बिट्स का उपयोग किया जाना चाहिए।

इस अध्याय का शेष भाग पिछली सभी जानकारी का उपयोग करके 6502 µP असेंबली भाषा की व्याख्या करता है। भाषा को शीघ्रता से समझने के लिए पाठक को आधार दस के स्थान पर आधार सोलह में जोड़ना और घटाना पड़ता है। वास्तव में इसे आधार दो माना जाता है, लेकिन आधार दो में गणना करना बोझिल है। याद रखें कि आधार दो में दो संख्याएँ जोड़ने पर भी आधार दस की तरह एक कैरी 1 ही होता है। लेकिन आधार दो में दो संख्याओं को घटाने पर, उधार दो होता है, आधार दस की तरह दस नहीं। आधार सोलह में दो संख्याएँ जोड़ने पर, आधार दस की तरह एक कैरी अभी भी 1 है। लेकिन जब आधार सोलह में दो संख्याएँ घटाई जाती हैं, तो उधार सोलह होता है, आधार दस की तरह दस नहीं।

4.2 डेटा स्थानांतरण निर्देश

6502 µP के लिए असेंबली भाषा डेटा स्थानांतरण निर्देशों की निम्नलिखित तालिका पर विचार करें:

जब एक बाइट (8-बिट) को मेमोरी बाइट स्थान से एक्युमुलेटर रजिस्टर, एक्स रजिस्टर, या वाई रजिस्टर में कॉपी किया जाता है, तो वह लोड हो रहा है। जब किसी बाइट को इनमें से किसी भी रजिस्टर से मेमोरी बाइट स्थान पर कॉपी किया जाता है, तो वह स्थानांतरित हो रहा है। जब एक बाइट को एक रजिस्टर से दूसरे रजिस्टर में कॉपी किया जाता है, तब भी वह स्थानांतरित हो रहा होता है। तालिका के दूसरे कॉलम में, तीर एक बाइट के लिए कॉपी की दिशा दिखाता है। शेष चार कॉलम अलग-अलग एड्रेसिंग मोड दिखाते हैं।

एड्रेसिंग मोड कॉलम में एक प्रविष्टि हेक्साडेसिमल में निर्देश के संबंधित स्मरक भाग के लिए वास्तविक बाइट कोड है। उदाहरण के लिए, एई, एलडीएक्स के लिए वास्तविक बाइट कोड है, जो एई जैसे पूर्ण एड्रेसिंग मोड में मेमोरी से एक्स रजिस्टर में एक बाइट लोड करता है। 16 =10101110 2 . तो, मेमोरी बाइट स्थान में एलडीएक्स के लिए बिट्स 10101110 है।

ध्यान दें कि निर्देश के एलडीएक्स स्मरक भाग के लिए, तीन संभावित बाइट्स हैं जो ए2, एई और ए6 हैं, और प्रत्येक एक विशेष एड्रेसिंग मोड के लिए है। जब एक्स रजिस्टर में लोड होने वाली बाइट को मेमोरी बाइट स्थान से कॉपी नहीं किया जाना है, तो मान को हेक्साडेसिमल या दशमलव में निर्देश में एलडीएक्स निमोनिक के साथ (ठीक बाद) टाइप करना होगा। इस अध्याय में, ऐसे मान हेक्साडेसिमल में टाइप किए गए हैं। यह तत्काल संबोधन है, इसलिए एलडीएक्स का प्रतिनिधित्व करने के लिए मेमोरी में वास्तविक बाइट A2 है 16 =10100010 2 और एई नहीं 16 जो 10101110 के बराबर है 2 .

तालिका में, एड्रेसिंग मोड शीर्षकों के अंतर्गत सभी बाइट्स को ऑपरेशन कोड कहा जाता है, जिसे संक्षेप में ऑपकोड कहा जाता है। एड्रेसिंग मोड के आधार पर, एक निमोनिक के लिए एक से अधिक ऑपकोड हो सकते हैं।

टिप्पणी: कंप्यूटर सिस्टम यूनिट में 'लोड' शब्द के दो अर्थ हो सकते हैं: यह डिस्क से कंप्यूटर की मेमोरी में फ़ाइल को लोड करने को संदर्भित कर सकता है या यह मेमोरी बाइट स्थान से माइक्रोप्रोसेसर रजिस्टर में बाइट को स्थानांतरित करने को संदर्भित कर सकता है। .

6502 µP के लिए तालिका में चार की तुलना में अधिक एड्रेसिंग मोड हैं।

जब तक अन्यथा न कहा जाए, इस अध्याय में सभी उपयोगकर्ता प्रोग्रामिंग कोड पता 0200 से शुरू होते हैं 16 जो मेमोरी में उपयोगकर्ता क्षेत्र की शुरुआत है।

मेमोरी एम और एक्युमुलेटर ए

संचायक को स्मृति

तत्काल संबोधन
निम्नलिखित निर्देश संख्या FF को संग्रहीत करता है 16 = 255 10 संचायक में:

एलडीए #$एफएफ

'$' का उपयोग केवल मेमोरी एड्रेस की पहचान करने के लिए नहीं किया जाता है। सामान्य तौर पर, इसका उपयोग यह इंगित करने के लिए किया जाता है कि इसके बाद आने वाली अगली संख्या हेक्साडेसिमल है। इस मामले में, $FF किसी मेमोरी बाइट स्थान का पता नहीं है। यह संख्या 255 है 10 हेक्साडेसिमल में. आधार 16 या इसके किसी अन्य समकक्ष सबस्क्रिप्ट को असेंबली भाषा निर्देश में नहीं लिखा जाना चाहिए। '#' इंगित करता है कि आगे जो भी होगा वह संचायक रजिस्टर में डाला जाने वाला मान है। मान को आधार दस में भी लिखा जा सकता है, लेकिन इस अध्याय में ऐसा नहीं किया गया है। '#' का अर्थ है तत्काल संबोधन।

एक स्मरक का उसके संबंधित अंग्रेजी वाक्यांश से कुछ समानता होती है। 'एलडीए #$एफएफ' का अर्थ है संख्या 255 लोड करें 10 संचायक ए में। चूँकि यह पिछली तालिका से तत्काल पता है, एलडीए ए9 है न कि एडी या ए5। बाइनरी में A9 101010001 है। इसलिए, यदि LDA के लिए A9 मेमोरी में $0200 पते में है, तो $FF $0301 = 0300 + 1 पते में है। #$FF बिल्कुल एलडीए स्मरक के लिए ऑपरेंड है।

पूर्ण संबोधन
यदि $FF का मान मेमोरी में $0333 स्थान पर है, तो पिछला निर्देश है:

एलडीए $0333

# की अनुपस्थिति पर ध्यान दें. इस मामले में, # की अनुपस्थिति का मतलब है कि जो आगे है वह एक मेमोरी एड्रेस है न कि ब्याज का मूल्य (संचायक में डालने का मूल्य नहीं)। तो, इस बार एलडीए के लिए ऑपकोड AD है, A9 या A5 नहीं। यहां एलडीए के लिए ऑपरेंड $0333 पता है न कि $FF मान। $FF $0333 स्थान पर है जो काफी दूर है। 'एलडीए $0333' निर्देश मेमोरी में लगातार तीन स्थानों पर रहता है, दो नहीं, जैसा कि पिछले चित्रण में था। एलडीए के लिए 'एडी' $0200 स्थान पर है। 0333 का निचला बाइट जो 33 है वह $0301 स्थान पर है। $0333 का उच्चतर बाइट जो कि 03 है, $0302 स्थान पर है। यह छोटी एंडियननेस है जिसका उपयोग 6502 असेंबली भाषा द्वारा किया जाता है। विभिन्न माइक्रोप्रोसेसरों की असेंबली भाषाएँ अलग-अलग होती हैं।

यह निरपेक्ष संबोधन का एक उदाहरण है. $0333 उस स्थान का पता है जिस पर $FF है। निर्देश में लगातार तीन बाइट्स होते हैं और इसमें $FF या इसका वास्तविक बाइट स्थान शामिल नहीं होता है।

शून्य-पृष्ठ सम्बोधन

मान लें कि $FF मान पृष्ठ शून्य में $0050 मेमोरी स्थान पर है। शून्य-पृष्ठ के लिए बाइट स्थान $0000 से शुरू होते हैं और $00FF पर समाप्त होते हैं। ये 256 हैं 10 कुल स्थान. कमोडोर-64 मेमोरी का प्रत्येक पृष्ठ 256 है 10 लंबा। ध्यान दें कि स्मृति में शून्य-पृष्ठ स्थान में सभी संभावित स्थानों के लिए उच्च बाइट शून्य है। शून्य-पृष्ठ एड्रेसिंग मोड पूर्ण एड्रेसिंग मोड के समान है, लेकिन 00 की उच्च बाइट निर्देश में टाइप नहीं की जाती है। तो, $FF को $0050 स्थान से संचायक में लोड करने के लिए, शून्य-पृष्ठ एड्रेसिंग मोड निर्देश है:

एलडीए $50

एलडीए ए5 है न कि ए9 या एडी, ए5 16 = 10100101 2 . याद रखें कि मेमोरी में प्रत्येक बाइट 8 कोशिकाओं का होता है, और प्रत्येक कोशिका में एक बिट होता है। यहां निर्देश में लगातार दो बाइट्स हैं। एलडीए के लिए ए5 $0200 मेमोरी स्थान पर है और $50 का पता, 00 की उच्च बाइट के बिना, $0301 स्थान पर है। 00 की अनुपस्थिति, जो कुल 64K मेमोरी में एक बाइट की खपत करती, मेमोरी स्थान को कम कर देती है।

मेमोरी के लिए संचायक

पूर्ण संबोधन
निम्नलिखित निर्देश एक बाइट मान को, चाहे वह कुछ भी हो, संचायक से $1444 के मेमोरी स्थान पर कॉपी करता है:

वे $1444 हैं

ऐसा कहा जाता है कि यह संचायक से मेमोरी में स्थानांतरित हो रहा है। यह लोड नहीं हो रहा है. लोडिंग इसके विपरीत है. STA के लिए ऑपकोड बाइट 8D है 16 =10001101 2 . इस निर्देश में मेमोरी में लगातार तीन बाइट्स होती हैं। 8डी 16 $0200 स्थान पर है। 44 16 $1444 का पता $0201 स्थान पर है। और 14 16 $0202 स्थान पर है - थोड़ा अंतहीनपन। कॉपी की गई वास्तविक बाइट निर्देश का हिस्सा नहीं है। यहां एसटीए के लिए शून्य-पृष्ठ संबोधन (तालिका में) के लिए 8डी का उपयोग किया जाता है, न कि 85 का।

शून्य पृष्ठ संबोधन
निम्नलिखित निर्देश एक बाइट मान की प्रतिलिपि बनाता है, चाहे वह कुछ भी हो, संचायक से पृष्ठ शून्य में $0050 के मेमोरी स्थान पर:

एसटीए $0050

यहां एसटीए के लिए ऑपकोड बाइट 85 है 16 = 10000101 2 . इस निर्देश में मेमोरी में लगातार दो बाइट्स शामिल हैं। 85 16 $0200 स्थान पर है। 50 16 $0050 का पता $0201 स्थान पर है। यहां अंतहीनता का मुद्दा नहीं उठता क्योंकि पते में केवल एक बाइट है जो निचला बाइट है। कॉपी की गई वास्तविक बाइट निर्देश का हिस्सा नहीं है। यहां एसटीए के लिए शून्य-पृष्ठ एड्रेसिंग के लिए 85 का उपयोग किया जाता है, न कि 8डी का।

संचायक से मेमोरी में किसी स्थान पर बाइट स्थानांतरित करने के लिए तत्काल पते का उपयोग करने का कोई मतलब नहीं है। ऐसा इसलिए है क्योंकि $FF जैसे वास्तविक मूल्य को तत्काल संबोधन में निर्देश में उद्धृत किया जाना चाहिए। इसलिए, µP में किसी रजिस्टर से किसी बाइट मान को किसी मेमोरी स्थान पर स्थानांतरित करने के लिए तत्काल पता लगाना संभव नहीं है।

एलडीएक्स, एसटीएक्स, एलडीवाई, और एसटीवाई निमोनिक्स
एलडीएक्स और एसटीएक्स क्रमशः एलडीए और एसटीए के समान हैं। लेकिन यहां, एक्स रजिस्टर का उपयोग किया जाता है न कि ए (संचायक) रजिस्टर का। एलडीवाई और एसटीवाई क्रमशः एलडीए और एसटीए के समान हैं। लेकिन यहां, Y रजिस्टर का उपयोग किया जाता है न कि A रजिस्टर का। हेक्साडेसिमल में प्रत्येक ऑपकोड के लिए तालिका 4.21 देखें जो एक विशेष निमोनिक और एक विशेष एड्रेसिंग मोड से मेल खाता है।

रजिस्टर-टू-रजिस्टर स्थानांतरण
तालिका 4.21 में निर्देशों के पिछले दो सेट मेमोरी/माइक्रोप्रोसेसर-रजिस्टर कॉपीिंग (ट्रांसफर) और रजिस्टर/रजिस्टर कॉपीिंग (ट्रांसफर) से संबंधित हैं। TAX, TXA, TAY, TYA, TSX और TXS निर्देश माइक्रोप्रोसेसर में रजिस्टर से उसी माइक्रोप्रोसेसर के दूसरे रजिस्टर में कॉपी (स्थानांतरण) करते हैं।

बाइट को A से X तक कॉपी करने के लिए निर्देश है:

कर

बाइट को X से A तक कॉपी करने के लिए, निर्देश है:

टेक्सास

बाइट को A से Y तक कॉपी करने के लिए निर्देश है:

हाथ

बाइट को Y से A तक कॉपी करने के लिए निर्देश है:

TYA

कमोडोर 64 कंप्यूटर के लिए, मेमोरी में पेज 0 के ठीक बाद स्टैक पेज 1 है। हर दूसरे पेज की तरह, इसमें 25610 हैं 10 बाइट स्थान, $0100 से $01FF तक। आम तौर पर, एक प्रोग्राम मेमोरी में एक निर्देश से अगले लगातार निर्देश तक निष्पादित होता है। समय-समय पर, दूसरे मेमोरी कोड (निर्देशों का सेट) सेगमेंट में बदलाव होता रहता है। मेमोरी (रैम) में स्टैक क्षेत्र में अगले निर्देश पते होते हैं जहां से प्रोग्राम जारी रखने के लिए जंप (या शाखाएं) छोड़ी जाती हैं।

स्टैक पॉइंटर 'एस' 6502 µP में एक 9-बिट रजिस्टर है। पहला बिट (सबसे बाईं ओर) हमेशा 1 होता है। पेज एक में सभी बाइट स्थान पते 1 से शुरू होते हैं और उसके बाद 256 के लिए 8 अलग-अलग बिट होते हैं। 10 स्थान. स्टैक पॉइंटर में पेज 1 में स्थान का पता होता है जिसमें अगले निर्देश का पता होता है जिसे प्रोग्राम को वर्तमान (जंप-टू) कोड सेगमेंट को निष्पादित करने के बाद वापस लौटना और जारी रखना होता है। चूंकि स्टैक के सभी पतों का पहला बिट (पेज एक) 1 से शुरू होता है, स्टैक पॉइंटर रजिस्टर को केवल शेष आठ बिट्स को रखने की आवश्यकता होती है। आख़िरकार, इसका पहला बिट, जो कि सबसे बायाँ-बिट है (इसके दाएँ से गिनती करने पर नौवां बिट), हमेशा 1 होता है।

बाइट को S से X तक कॉपी करने के लिए निर्देश है:

टीएसएक्स

बाइट को X से S तक कॉपी करने के लिए निर्देश है:

TXT

रजिस्टर-टू-रजिस्टर निर्देश कोई ऑपरेंड नहीं लेते हैं। इनमें केवल स्मरणीय शब्द शामिल हैं। प्रत्येक स्मरक का ऑपकोड हेक्साडेसिमल में होता है। यह निहित एड्रेसिंग मोड में है क्योंकि इसमें कोई ऑपरेंड नहीं है (कोई मेमोरी एड्रेस नहीं, कोई मूल्य नहीं)।

टिप्पणी: कोई X से Y या Y से X स्थानांतरण (प्रतिलिपि बनाना) नहीं है।

4.3 अंकगणितीय संक्रियाएँ

सर्किट, 6502 µP में अंकगणितीय तर्क इकाई, एक समय में केवल दो आठ-बिट संख्याएँ जोड़ सकती है। यह घटाता नहीं, गुणा नहीं करता, विभाजित नहीं करता। निम्न तालिका अंकगणितीय परिचालनों के लिए ऑपकोड और एड्रेसिंग मोड दिखाती है:

टिप्पणी: अंकगणितीय संक्रियाओं और अन्य प्रकार के संक्रियाओं के लिए सभी निमोनिक्स (अर्थात सभी 6502 निमोनिक्स) ऑपरेशन (ऑप) कोड का एक बाइट लेते हैं। यदि निमोनिक के लिए एक से अधिक एड्रेसिंग मोड हैं, तो एक ही निमोनिक के लिए अलग-अलग ऑपकोड होंगे: प्रति एड्रेसिंग मोड में एक। तालिका में C, D और V स्थिति रजिस्टर के ध्वज हैं। इनके अर्थ बाद में आवश्यकता पड़ने पर दिये जायेंगे।

अहस्ताक्षरित संख्याओं का जोड़
6502 µP के साथ, हस्ताक्षरित संख्याएँ दो की पूरक संख्याएँ हैं। अहस्ताक्षरित संख्याएँ सामान्य सकारात्मक संख्याएँ हैं जो शून्य से शुरू होती हैं। तो, आठ-बिट्स के एक बाइट के लिए, सबसे छोटी अहस्ताक्षरित संख्या 00000000 है 2 = 0 10 = 00 16 और सबसे बड़ी अहस्ताक्षरित संख्या 11111111 है 2 = 255 10 = एफएफ 16 . दो अहस्ताक्षरित संख्याओं के लिए, जोड़ है:

ए+एम+सी→ए

इसका मतलब है कि संचायक की 8-बिट सामग्री को अंकगणितीय तर्क इकाई द्वारा मेमोरी से एक बाइट (8-बिट) में जोड़ा जाता है। ए और एम को जोड़ने के बाद, नौवें बिट तक कैरी स्टेटस रजिस्टर में कैरी फ्लैग सेल में जाता है। पिछले जोड़ से कोई भी पिछला कैरी बिट जो अभी भी स्टेटस रजिस्टर में कैरी फ्लैग सेल में है, उसे भी ए और एम के योग में जोड़ा जाता है, जिससे ए+एम+सी→ए बनता है। परिणाम को वापस संचायक में डाल दिया जाता है।

यदि ब्याज का योग है:

ए + एम

और किसी भी पिछले कैरी को जोड़ने की कोई आवश्यकता नहीं है, कैरी फ़्लैग को साफ़ करना होगा जिसे 0 बनाया गया है, ताकि जोड़ हो:

A+M+0→A, A+M→A के समान है

टिप्पणी: यदि एम को ए में जोड़ा जाता है, और 1 का कैरी होता है क्योंकि परिणाम 255 से अधिक है 10 = 111111111 2 = एफएफ 16 , यह एक नया कैरी है। 1 की यह नई कैरी स्वचालित रूप से कैरी फ़्लैग सेल में भेज दी जाती है, यदि इसे आठ-बिट्स की अगली जोड़ी (एक और ए + एम) को जोड़ने की आवश्यकता होती है।

दो अहस्ताक्षरित आठ-बिट्स जोड़ने के लिए कोड
00111111 2 +00010101 2 3F के समान है 16 +15 16 जो 63 के समान है 10 +21 10 . परिणाम 010101002 है 2 जो 54 के समान है 16 और 84 10 . परिणाम आठ बिट्स के लिए अधिकतम संख्या से अधिक नहीं है जो कि 255 है 10 = 111111111 2 = एफएफ 16 . तो, 1 का कोई परिणामी कैरी नहीं है। इसे दूसरे तरीके से कहें तो, परिणामी कैरी 0 है। जोड़ से पहले, 1 का कोई पिछला कैरी नहीं है। दूसरे शब्दों में, पिछला कैरी 0 है। इस जोड़ को करने के लिए कोड हो सकता है:

सीएलसी
एलडीए #$3F
एडीसी #$15

टिप्पणी: असेंबली भाषा टाइप करते समय, प्रत्येक निर्देश के अंत में कीबोर्ड की 'एंटर' कुंजी दबाई जाती है। इस कोड में तीन निर्देश हैं. यदि पिछले जोड़ में 1 है तो पहला निर्देश (सीएलसी) कैरी फ़्लैग को साफ़ कर देता है। सीएलसी केवल निहित एड्रेसिंग मोड में ही किया जा सकता है। निहित एड्रेसिंग मोड के लिए स्मरक कोई ऑपरेंड नहीं लेता है। यह पी के स्टेटस रजिस्टर के कैरी सेल को साफ़ करता है। क्लियरिंग का अर्थ है कैरी फ़्लैग सेल को 0 का बिट देना। कोड में अगले दो निर्देश तत्काल एड्रेसिंग मोड का उपयोग करते हैं। तत्काल संबोधन के साथ, निमोनिक के लिए केवल एक ऑपरेंड होता है जो एक संख्या है (और न ही कोई मेमोरी और न ही रजिस्टर पता)। और इसलिए, संख्या से पहले '#' होना चाहिए। '$' का अर्थ है कि इसके बाद आने वाली संख्या हेक्साडेसिमल है।

दूसरा निर्देश संख्या 3F लोड करता है 16 संचायक में. तीसरे निर्देश के लिए, μP का अंकगणितीय तर्क इकाई सर्किट स्थिति रजिस्टर के कैरी फ़्लैग सेल के 0 (0 पर मजबूर) के पिछले (क्लीयर) कैरी को लेता है और इसे 15 में जोड़ता है 16 साथ ही वह मान जो पहले से ही 3F में है 16 संचायक और पूरा परिणाम वापस संचायक में डाल देता है। इस मामले में, परिणामी कैरी 0 है। ALU (अरिथमेटिक लॉजिक यूनिट) स्टेटस रजिस्टर के कैरी फ्लैग सेल में 0 भेजता है (डालता है)। प्रोसेसर स्टेटस रजिस्टर और स्टेटस रजिस्टर का मतलब एक ही है। यदि कैरी का परिणाम 1 होता है, तो ALU स्थिति रजिस्टर के कैरी फ़्लैग पर 1 भेजता है।

पिछले कोड की तीन पंक्तियाँ निष्पादित होने से पहले मेमोरी में होनी चाहिए। सीएलसी (निहित संबोधन) के लिए ऑपकोड 1816 $0200 बाइट स्थान पर है। ऑपकोड A9 16 एलडीए के लिए (तत्काल संबोधन) $0201 बाइट स्थान पर है। संख्या 3F 10 $0202 बाइट स्थान पर है। ऑपकोड 69 16 एलडीए के लिए (तत्काल संबोधन) $0203 बाइट स्थान पर है। संख्या 15 10 $0204 बाइट स्थान पर है।

टिप्पणी: एलडीए एक स्थानांतरण (लोड) निर्देश है न कि अंकगणितीय निर्देश (स्मरक)।

दो अहस्ताक्षरित सोलह-बिट्स जोड़ने के लिए कोड
6502 µP में सभी रजिस्टर अनिवार्य रूप से आठ-बिट रजिस्टर हैं, पीसी (प्रोग्राम काउंटर) को छोड़कर जो 16-बिट है। यहां तक ​​कि स्टेटस रजिस्टर भी 8-बिट चौड़ा है, हालांकि इसके आठ बिट एक साथ काम नहीं करते हैं। इस खंड में, आठ बिट्स की पहली जोड़ी से आठ बिट्स की दूसरी जोड़ी तक ले जाने के साथ, दो 16 अहस्ताक्षरित बिट्स को जोड़ने पर विचार किया जाता है। यहां रुचि का विषय आठवीं बिट स्थिति से नौवीं बिट स्थिति तक का स्थानांतरण है।

माना संख्याएँ 0010101010111111 हैं 2 = 2एबीएफ16 16 = 10,943 10 और 0010101010010101 2 = 2ए95 16 = 10,901 10 . योग 0101010101010100 है 2 = 5554 16 = 21,844 10 .

इन दो अहस्ताक्षरित संख्याओं को आधार दो में जोड़ना इस प्रकार है:

निम्न तालिका दाईं ओर से शुरू करके आठवीं बिट से नौवीं बिट स्थिति तक 1 के कैरी के साथ समान जोड़ दिखाती है:

इसे कोडिंग करने में सबसे पहले नीचे की दो बाइट्स जोड़ी जाती हैं। फिर, ALU (अरिथमेटिक लॉजिक यूनिट) आठवीं बिट स्थिति से नौवीं बिट स्थिति तक 1 की कैरी को स्टेटस रजिस्टर में कैरी फ्लैग सेल में भेजता है। बिना कैरी के 0 1 0 1 0 1 0 0 का परिणाम संचायक में जाता है। फिर, बाइट्स की दूसरी जोड़ी को कैरी के साथ जोड़ा जाता है। एडीसी निमोनिक का अर्थ है पिछली कैरी के साथ स्वचालित रूप से जुड़ना। इस मामले में, पिछली कैरी, जो कि 1 है, को दूसरे जोड़ से पहले नहीं बदला जाना चाहिए। पहले जोड़ के लिए, चूंकि कोई भी पिछला कैरी इस पूर्ण जोड़ का हिस्सा नहीं है, इसलिए इसे साफ़ किया जाना चाहिए (0 बनाया गया)।

बाइट्स के दो जोड़े के पूर्ण जोड़ के लिए, पहला जोड़ है:

ए + एम + 0 -> ए

दूसरा जोड़ है:

ए + एम + 1 -> ए

इसलिए, पहले जोड़ से ठीक पहले कैरी फ़्लैग को साफ़ करना होगा (0 का मान दिया गया है)। निम्नलिखित कार्यक्रम, जिसके पाठक को स्पष्टीकरण अवश्य पढ़ना चाहिए, इस सारांश के लिए निरपेक्ष संबोधन मोड का उपयोग करता है:

सीएलसी
एलडीए $0213
एडीसी $0215
; कोई समाशोधन नहीं क्योंकि कैरी फ़्लैग मान की आवश्यकता है
एसटीए $0217
एलडीए $0214
एडीसी $0216
एसटीए $0218

ध्यान दें कि 6502 असेंबली भाषा के साथ, एक अर्धविराम एक टिप्पणी शुरू करता है। इसका मतलब यह है कि प्रोग्राम के निष्पादन में, अर्धविराम और उसके दाईं ओर की सभी चीज़ों को अनदेखा कर दिया जाता है। जो प्रोग्राम पहले लिखा गया है वह एक टेक्स्ट फ़ाइल में प्रोग्रामर की पसंद के नाम और '.asm' एक्सटेंशन के साथ सहेजा गया है। पिछला प्रोग्राम सटीक प्रोग्राम नहीं है जो निष्पादन के लिए मेमोरी में जाता है। मेमोरी में संबंधित प्रोग्राम को अनुवादित प्रोग्राम कहा जाता है जहां निमोनिक्स को ऑपकोड (बाइट्स) से बदल दिया जाता है। कोई भी टिप्पणी असेंबली भाषा टेक्स्ट फ़ाइल में रहती है, और अनुवादित प्रोग्राम के मेमोरी तक पहुंचने से पहले हटा दी जाती है। वास्तव में, आज डिस्क में दो फ़ाइलें सहेजी गई हैं: '.asm' फ़ाइल और '.exe' फ़ाइल। '.asm' फ़ाइल पिछले उदाहरण में से एक है। '.exe' फ़ाइल '.asm' फ़ाइल है जिसमें सभी टिप्पणियाँ हटा दी जाती हैं, और सभी निमोनिक्स को उनके ऑपकोड से बदल दिया जाता है। टेक्स्ट एडिटर में खोले जाने पर, '.exe' फ़ाइल पहचानी नहीं जा सकती। जब तक अन्यथा न कहा जाए, इस अध्याय के प्रयोजन के लिए, '.exe' फ़ाइल को $0200 स्थान से शुरू करके मेमोरी में कॉपी किया जाता है। ये लोडिंग का दूसरा मतलब है.

जोड़ी जाने वाली दो 16-बिट संख्याएँ पूर्ण पते के लिए मेमोरी में चार बाइट्स लेती हैं: प्रति संख्या दो बाइट्स (मेमोरी बाइट्स का एक क्रम है)। पूर्ण संबोधन के साथ, ऑपकोड का ऑपरेंड मेमोरी में होता है। सारांश परिणाम दो बाइट्स चौड़ा है और इसे मेमोरी में भी रखा जाना है। इससे कुल 6 प्राप्त होता है 10 = 6 16 इनपुट और आउटपुट के लिए बाइट्स। इनपुट कीबोर्ड से नहीं हैं और आउटपुट मॉनिटर या प्रिंटर से नहीं हैं। इस स्थिति में इनपुट मेमोरी (रैम) में होते हैं और आउटपुट (संक्षेप परिणाम) मेमोरी (रैम) में वापस चला जाता है।

किसी प्रोग्राम को निष्पादित करने से पहले, अनुवादित संस्करण को पहले मेमोरी में रखना होगा। पिछले प्रोग्राम कोड को देखते हुए, यह देखा जा सकता है कि टिप्पणी के बिना निर्देश 19 बनते हैं 10 = 13 16 बाइट्स तो, प्रोग्राम मेमोरी में $0200 बाइट स्थान से $0200 + $13 - $1 = $0212 बाइट स्थान लेता है ($0200 से शुरू होता है न कि $0201 जिसका अर्थ है - $1)। इनपुट और आउटपुट संख्याओं के लिए 6 बाइट्स जोड़ने पर पूरा प्रोग्राम $0212 + $6 = $0218 पर समाप्त होता है। कार्यक्रम की कुल अवधि 19 है 16 = 25 10 .

ऑगेंड का निचला बाइट $0213 पते में होना चाहिए, और उसी ऑगेंड का उच्च बाइट $0214 पते में होना चाहिए - थोड़ा एंडियननेस। इसी तरह, ऐडएंड का निचला बाइट $0215 पते में होना चाहिए, और उसी ऐडएंड का उच्च बाइट $0216 पते में होना चाहिए - थोड़ा एंडियननेस। परिणाम का निचला बाइट (योग) $0217 पते में होना चाहिए, और उसी परिणाम का उच्च बाइट $0218 पते में होना चाहिए - थोड़ा अंतहीनपन।

ऑपकोड 18 16 सीएलसी (अंतर्निहित एड्रेसिंग) के लिए $0200 के बाइट स्थान पर है। 'एलडीए $0213' के लिए ऑपकोड, यानी एडी 16 एलडीए (एब्सोल्यूट एड्रेसिंग) के लिए, $0201 के बाइट स्थान पर है। ऑगेंड का निचला बाइट जो 10111111 है वह $0213 के मेमोरी बाइट स्थान पर है। याद रखें कि प्रत्येक ऑपकोड एक बाइट लेता है। 'एलडीए $0213' का '$0213' पता $0202 और $0203 के बाइट स्थानों में है। 'एलडीए $0213' निर्देश संवर्धित के निचले बाइट को संचायक में लोड करता है।

'एडीसी $0215' के लिए ऑपकोड, यानी 6डी 16 एडीसी (एब्सोल्यूट एड्रेसिंग) के लिए, $0204 के बाइट स्थान पर है। ऐडएंड का निचला बाइट जो 10010101 है, $0215 के बाइट स्थान पर है। 'एडीसी $0215' का '$0215' पता $0205 और $0206 के बाइट स्थानों में है। 'एडीसी $0215' निर्देश ऐडएंड के निचले बाइट को ऑगेंड के निचले बाइट में जोड़ता है जो पहले से ही संचायक में है। परिणाम को वापस संचायक में रख दिया जाता है। आठवें बिट के बाद कोई भी कैरी स्टेटस रजिस्टर के कैरी फ्लैग पर भेजा जाता है। उच्च बाइट्स के दूसरे जोड़ से पहले कैरी फ़्लैग सेल को साफ़ नहीं किया जाना चाहिए। यह कैरी उच्चतर बाइट्स के योग में स्वचालित रूप से जुड़ जाता है। वास्तव में, सीएलसी के कारण शुरुआत में स्वचालित रूप से निचले बाइट्स के योग में 0 का कैरी जोड़ दिया जाता है (कोई कैरी नहीं जोड़े जाने के बराबर)।

टिप्पणी अगले 48 लेती है 10 = 30 16 बाइट्स हालाँकि, यह केवल '.asm' टेक्स्ट फ़ाइल में ही रहता है। यह स्मृति तक नहीं पहुंचता. इसे अनुवाद द्वारा हटा दिया जाता है जो असेंबलर (एक प्रोग्राम) द्वारा किया जाता है।

अगले निर्देश के लिए जो 'STA $0217' है, STA का ऑपकोड जो 8D है 16 (पूर्ण संबोधन) $0207 के बाइट स्थान पर है। 'STA $0217' का '$0217' पता $0208 और $0209 के मेमोरी स्थानों में है। 'एसटीए $0217' निर्देश संचायक की आठ-बिट सामग्री को $0217 के मेमोरी स्थान पर कॉपी करता है।

ऑगेंड का उच्च बाइट जो 00101010 है वह $0214 के मेमोरी स्थान पर है, और ऐडएंड का उच्च बाइट जो 00101010 है वह $02 के बाइट स्थान पर है 16 . 'एलडीए $0214' के लिए ऑपकोड जो एलडीए के लिए एडी16 है (पूर्ण संबोधन) $020ए के बाइट स्थान पर है। 'LDA $0214' का '$0214' पता $020B और $020C के स्थानों पर है। 'एलडीए $0214' निर्देश संचायक के उच्च बाइट को संचायक में लोड करता है, संचायक में जो कुछ भी है उसे मिटा देता है।

'एडीसी $0216' का ऑपकोड 6डी है 16 ADC (एब्सोल्यूट एड्रेसिंग) के लिए $020D के बाइट स्थान पर है। 'ADC 0216' का '$0216' पता $020E और $020F के बाइट स्थानों में है। 'एडीसी $0216' निर्देश ऐडएंड के उच्च बाइट को ऑगेंड के उच्च बाइट में जोड़ता है जो पहले से ही संचायक में है। परिणाम को वापस संचायक में रख दिया जाता है। यदि 1 का कैरी है, तो इस दूसरे जोड़ के लिए, इसे स्वचालित रूप से स्टेटस रजिस्टर के कैरी सेल में रखा जाता है। हालाँकि इस समस्या के लिए सोलहवें बिट (बाएँ) से आगे ले जाना आवश्यक नहीं है, यह जाँचना अच्छा है कि क्या कैरी फ़्लैग 1 बन गया है या नहीं इसकी जाँच करके 1 का कैरी हुआ था।

अगले और अंतिम निर्देश के लिए जो 'STA $0218' है, STA का ऑपकोड जो 8D16 (पूर्ण पता) है वह $0210 के बाइट स्थान पर है। 'STA $0218' का '$0218' पता $0211 और $0212 के मेमोरी स्थानों में है। 'एसटीए $0218' निर्देश संचायक की आठ-बिट सामग्री को $0218 के मेमोरी स्थान पर कॉपी करता है। दो सोलह-बिट संख्याओं को जोड़ने का परिणाम 0101010101010100 है, $0217 के मेमोरी स्थान में 01010100 की निचली बाइट और $0218 के मेमोरी स्थान में 01010101 की उच्च बाइट - थोड़ी एंडियननेस।

घटाव
6502 µP के साथ, हस्ताक्षरित संख्याएँ दो की पूरक संख्याएँ हैं। एक दो की पूरक संख्या आठ-बिट, सोलह बिट या आठ बिट का कोई भी गुणज हो सकती है। दो के पूरक के साथ, बाईं ओर से पहला बिट साइन बिट है। एक सकारात्मक संख्या के लिए, संकेत को इंगित करने के लिए यह पहला बिट 0 है। बाकी बिट्स सामान्य तरीके से संख्या बनाते हैं। किसी ऋणात्मक संख्या के दोनों पूरक प्राप्त करने के लिए, संबंधित धनात्मक संख्या के लिए सभी बिट्स को उल्टा करें, और फिर दाएं छोर से परिणाम में 1 जोड़ें।

एक धनात्मक संख्या को दूसरी धनात्मक संख्या से घटाने के लिए, उपप्रकार को दो की पूरक ऋणात्मक संख्या में बदल दिया जाता है। फिर, मीनुएंड और नई नकारात्मक संख्या को सामान्य तरीके से जोड़ा जाता है। तो, आठ-बिट घटाव बन जाता है:

जहां कैरी को 1 के रूप में माना जाता है। संचायक में परिणाम दो के पूरक में अंतर है। इसलिए, दो संख्याओं को घटाने के लिए, कैरी फ़्लैग को सेट करना होगा (1 पर बनाया गया)।

दो सोलह-बिट संख्याओं को घटाते समय, घटाव दो बार किया जाता है जैसे कि दो सोलह-बिट संख्याओं को जोड़ने पर। चूँकि घटाव 6502 µP के साथ जोड़ का एक रूप है, दो सोलह-बिट संख्याओं को घटाते समय, कैरी फ़्लैग को पहले घटाव के लिए केवल एक बार सेट किया जाता है। दूसरे घटाव के लिए, कैरी फ़्लैग की कोई भी सेटिंग स्वचालित रूप से की जाती है।

आठ-बिट संख्याओं या सोलह बिट संख्याओं के लिए घटाव की प्रोग्रामिंग जोड़ की प्रोग्रामिंग के समान ही की जाती है। हालाँकि, कैरी फ़्लैग को शुरुआत में ही सेट किया जाना चाहिए। ऐसा करने का मंत्र यह है:

सोलह-बिट सकारात्मक संख्याओं के साथ घटाव
निम्नलिखित संख्याओं के साथ घटाव पर विचार करें:

इस घटाव में दो का पूरक शामिल नहीं है। चूँकि 6502 µP में घटाव दो के पूरक में किया जाता है, आधार दो में घटाव निम्नानुसार किया जाता है:

दोनों का पूरक परिणाम सामान्य घटाव से प्राप्त परिणाम के समान है। हालाँकि, ध्यान दें कि जो 1 दाईं ओर से सत्रहवीं बिट स्थिति में जाता है उसे अनदेखा कर दिया जाता है। मीनूएंड और सबट्रैहेंड को दो आठ-आठ बिट्स में विभाजित किया गया है। सबट्रेंड के निचले बाइट के 10010110 के दोनों पूरक को इसके उच्च बाइट और किसी भी कैरी से स्वतंत्र रूप से निर्धारित किया जाता है। सबट्रेंड के उच्च बाइट के 11101011 के दो पूरक इसके निचले बाइट और किसी भी कैरी से स्वतंत्र रूप से निर्धारित होते हैं।

मिनटेंड का 16-बिट्स पहले से ही दो के पूरक में है, जो बाईं ओर से 0 से शुरू होता है। इसलिए, इसे बिट्स में किसी समायोजन की आवश्यकता नहीं है। 6502 μP के साथ, बिना किसी संशोधन के मिनटेंड के निचले बाइट को सबट्रेंड के दो पूरक के निचले बाइट में जोड़ा जाता है। मीनूएंड के निचले बाइट को दो के पूरक में परिवर्तित नहीं किया जाता है क्योंकि पूरे मीनूएंड के सोलह बिट्स को पहले से ही दो के पूरक में होना चाहिए (बाईं ओर पहले बिट के रूप में 0 के साथ)। इस पहले जोड़ में, 1=0 एसईसी निर्देश के कारण 1 का अनिवार्य कैरी जोड़ा गया है।

वर्तमान प्रभावी घटाव में, आठवें बिट से नौवें बिट (दाएं से) तक 1 (जोड़ का) का वहन होता है। चूँकि यह प्रभावी रूप से घटाव है, स्थिति रजिस्टर में कैरी फ़्लैग में जो भी बिट माना जाता है उसे पूरक (उल्टा) किया जाता है। तो, C ध्वज में 1 का कैरी 0 हो जाता है। दूसरे ऑपरेशन में, मीनूएंड के उच्च बाइट को सबट्रेंड के उच्चतर दो पूरक बाइट में जोड़ा जाता है। स्थिति रजिस्टर का स्वचालित रूप से पूरक कैरी फ़्लैग बिट (इस मामले में 0 है) भी जोड़ा जाता है (उच्च बाइट्स में)। कोई भी 1 जो दाईं ओर से सोलहवें बिट से आगे जाता है उसे अनदेखा कर दिया जाता है।

अगली बात बस उस सभी योजना को निम्नानुसार कोड करना है:

सेकंड
एलडीए $0213
एसबीसी $0215
; कोई समाशोधन नहीं क्योंकि उल्टे कैरी फ़्लैग मान की आवश्यकता है
एसटीए $0217
एलडीए $0214
एसबीसी $0216
एसटीए $0218

याद रखें कि 6502 असेंबली भाषा के साथ, एक अर्धविराम एक टिप्पणी शुरू करता है जो मेमोरी में अनुवादित प्रोग्राम संस्करण में शामिल नहीं है। घटाव के लिए दो 16-बिट संख्याएँ पूर्ण संबोधन के साथ मेमोरी के चार बाइट्स घेरती हैं; प्रति संख्या दो (मेमोरी बाइट्स की एक श्रृंखला है)। ये इनपुट कीबोर्ड से नहीं हैं. सारांश परिणाम दो बाइट्स का होता है और इसे मेमोरी में एक अलग स्थान पर रखना होता है। यह आउटपुट मॉनिटर या प्रिंटर पर नहीं जाता है; यह स्मृति में चला जाता है. इससे कुल 6 प्राप्त होता है 10 = 6 16 इनपुट और आउटपुट के लिए बाइट्स को मेमोरी (RAM) में रखा जाता है।

किसी प्रोग्राम को निष्पादित करने से पहले, उसे पहले मेमोरी में रखना होगा। प्रोग्राम कोड को देखते हुए, यह देखा जा सकता है कि टिप्पणी के बिना निर्देश 19 बनाते हैं 10 = 13 16 बाइट्स चूँकि इस अध्याय के सभी प्रोग्राम $0200 के मेमोरी स्थान से शुरू होते हैं, प्रोग्राम मेमोरी में $0200 बाइट स्थान से $0200 + $13 - $1 = $0212 बाइट स्थान ($0200 से शुरू होता है और $0201 से नहीं) तक ले जाता है। इस श्रेणी में इनपुट और आउटपुट बाइट्स का क्षेत्र शामिल नहीं है। दो इनपुट नंबर 4 बाइट लेते हैं और एक आउटपुट नंबर 2 बाइट लेता है। इनपुट और आउटपुट संख्याओं के लिए 6 बाइट्स जोड़ने से प्रोग्राम की सीमा बनती है जो $0212 + $6 = $0218 पर समाप्त होती है। कार्यक्रम की कुल अवधि 19 है 16 = 25 10 .

मीनूएंड का निचला बाइट $0213 पते में होना चाहिए, और उसी मीनूएंड का उच्च बाइट $0214 पते में होना चाहिए - थोड़ा एंडियननेस। इसी तरह, सबट्रेंड का निचला बाइट $0215 पते में होना चाहिए, और उसी सबट्रेंड का उच्च बाइट $0216 पते में होना चाहिए - थोड़ा एंडियननेस। परिणाम का निचला बाइट (अंतर) $0217 पते में होना चाहिए, और उसी परिणाम का उच्च बाइट $0218 पते में होना चाहिए - थोड़ा एंडियननेस।

38 का ऑपकोड 16 एसईसी (निहित संबोधन) के लिए $0200 का पता है। माना जाता है कि इस अध्याय के सभी प्रोग्राम $0200 के मेमोरी स्थान पर शुरू होते हैं, जिससे वहां मौजूद कोई भी प्रोग्राम रद्द हो जाता है; अन्यथा बताए गए को छोड़कर। 'एलडीए $0213' के लिए ऑपकोड, यानी एडी 16 , एलडीए के लिए (पूर्ण संबोधन) $0201 बाइट स्थान पर है। मिनट का निचला बाइट जो 10111111 है, $0213 के मेमोरी बाइट स्थान में है। याद रखें कि प्रत्येक ऑपकोड एक बाइट लेता है। 'एलडीए $0213' का '$0213' पता $0202 और $0203 के बाइट स्थानों में है। 'एलडीए $0213' निर्देश मिनट के निचले बाइट को संचायक पर लोड करता है।

'एसबीसी $0215' के लिए ऑपकोड, यानी ईडी 16 , एसबीसी के लिए (पूर्ण संबोधन) $0204 बाइट स्थान पर है। सबट्रेंड का निचला बाइट जो 01101010 है, $0215 बाइट स्थान पर है। 'एडीसी $0215' का '$0215' पता $0205 और $0206 के बाइट स्थानों में है। 'एसबीसी $0215' निर्देश सबट्रेंड के निचले बाइट को मीनूएंड के निचले बाइट से घटा देता है जो पहले से ही संचायक में है। यह दो का पूरक घटाव है। परिणाम को वापस संचायक में रख दिया जाता है। आठवें बिट के बाद किसी भी कैरी का पूरक (उलटा) स्टेटस रजिस्टर के कैरी फ्लैग पर भेजा जाता है। उच्च बाइट्स के साथ दूसरे घटाव से पहले इस कैरी फ़्लैग को साफ़ नहीं किया जाना चाहिए। यह कैरी उच्च बाइट्स के घटाव में स्वचालित रूप से जोड़ा जाता है।

टिप्पणी अगले 57 में आती है 10 =3916 16 बाइट्स हालाँकि, यह केवल '.asm' टेक्स्ट फ़ाइल में ही रहता है। यह स्मृति तक नहीं पहुंचता. इसे अनुवाद द्वारा हटा दिया जाता है जो असेंबलर (एक प्रोग्राम) द्वारा किया जाता है।

अगले निर्देश के लिए जो 'STA $0217' है, STA का ऑपकोड, यानी 8D 16 (पूर्ण संबोधन), $0207 बाइट स्थान पर है। 'STA $0217' का '$0217' पता $0208 और $0209 के मेमोरी स्थानों में है। 'एसटीए $0217' निर्देश संचायक की आठ-बिट सामग्री को $0217 के मेमोरी स्थान पर कॉपी करता है।

मीनूएंड का उच्च बाइट जो 00101010 है वह $0214 के मेमोरी स्थान में है, और सबट्रेंड का उच्च बाइट जो 00010101 है वह $0216 के बाइट स्थान में है। 'एलडीए $0214' के लिए ऑपकोड, यानी एडी 16 एलडीए (पूर्ण संबोधन) के लिए, $020A बाइट स्थान पर है। 'LDA $0214' का '$0214' पता $020B और $020C के स्थानों पर है। 'एलडीए $0214' निर्देश मिनट के उच्च बाइट को संचायक में लोड करता है, संचायक में जो कुछ भी है उसे मिटा देता है।

'एसबीसी $0216' के लिए ऑपकोड, यानी ईडी 16 SBC (एब्सोल्यूट एड्रेसिंग) के लिए, $020D बाइट स्थान पर है। 'SBC $0216' का '$0216' पता $020E और $020F के बाइट स्थानों में है। 'एसबीसी $0216' निर्देश सबट्रेंड के उच्च बाइट को मीनूएंड (दो के पूरक) के उच्च बाइट से घटा देता है जो पहले से ही संचायक में है। परिणाम को वापस संचायक में रख दिया जाता है। यदि इस दूसरे घटाव के लिए 1 का कैरी है, तो इसका पूरक स्थिति रजिस्टर के कैरी सेल में स्वचालित रूप से रखा जाता है। हालाँकि इस समस्या के लिए सोलहवें बिट (बाएँ) से आगे ले जाना आवश्यक नहीं है, लेकिन कैरी फ़्लैग की जाँच करके यह जाँचना अच्छा है कि पूरक कैरी होता है या नहीं।

अगले और अंतिम निर्देश के लिए जो 'STA $0218' है, STA का ऑपकोड, यानी 8D 16 (पूर्ण संबोधन), $0210 बाइट स्थान पर है। 'STA $0218' का '$0218' पता $0211 और $0212 के मेमोरी स्थानों में है। 'एसटीए $0218' निर्देश संचायक की आठ-बिट सामग्री को $0218 के मेमोरी स्थान पर कॉपी करता है। दो सोलह-बिट संख्याओं के साथ घटाव का परिणाम 0001010101010101 है जिसमें $0217 के मेमोरी स्थान में 01010101 की निचली बाइट और $0218 के मेमोरी स्थान में 00010101 की उच्च बाइट है - थोड़ा एंडियननेस।

6502 µP में केवल जोड़ने के लिए और अप्रत्यक्ष रूप से दोनों के पूरक घटाने के लिए सर्किटरी है। इसमें गुणा और भाग के लिए सर्किटरी नहीं है। गुणा और भाग करने के लिए, आंशिक उत्पादों और आंशिक लाभांश के स्थानांतरण सहित विवरण के साथ एक असेंबली भाषा प्रोग्राम लिखा जाना चाहिए।

4.4 तार्किक संचालन

6502 µP में, OR के लिए स्मृति चिन्ह ORA है और विशिष्ट OR के लिए स्मृति चिन्ह EOR है। ध्यान दें कि तार्किक संक्रियाओं में निहित संबोधन नहीं होता है। निहित संबोधन में कोई ऑपरेंड नहीं होता है। प्रत्येक लॉजिकल ऑपरेटर को दो ऑपरेंड लेने होंगे। पहला संचायक में है, और दूसरा मेमोरी या निर्देश में है। परिणाम (8-बिट्स) संचायक में वापस आ गया है। संचायक में सबसे पहले या तो तत्काल निर्देश द्वारा वहां रखा जाता है या पूर्ण पते के साथ मेमोरी से कॉपी किया जाता है। इस अनुभाग में, चित्रण के लिए केवल शून्य-पृष्ठ संबोधन का उपयोग किया जाता है। ये लॉजिकल ऑपरेटर सभी बिटवाइज़ ऑपरेटर हैं।

और
निम्न तालिका बिटवाइज़ AND को बाइनरी, हेक्साडेसिमल और दशमलव में दर्शाती है:

इस अध्याय के सभी प्रोग्राम $0200 के मेमोरी बाइट स्थान पर शुरू होने चाहिए। हालाँकि, इस अनुभाग के प्रोग्राम पेज शून्य में हैं, जिसका उद्देश्य 0000000000 के उच्च बाइट के बिना पेज शून्य के उपयोग को दर्शाना है। 2 . पिछली ANDing को इस प्रकार कोडित किया जा सकता है:

एलडीए #$9ए ; स्मृति से नहीं - तत्काल संबोधन
और #$सीडी ; स्मृति से नहीं - तत्काल संबोधन
एसटीए $30 ; शून्य-आधारित $0030 पर $88 संग्रहीत करता है

या
निम्न तालिका बिटवाइज़ OR को बाइनरी, हेक्साडेसिमल और दशमलव में दर्शाती है:

एलडीए #$9ए ; स्मृति से नहीं - तत्काल संबोधन
ओआरए #$सीडी ; स्मृति से नहीं - तत्काल संबोधन
एसटीए $30 ; $CF को शून्य-आधारित $0030 पर संग्रहीत करता है

मुक्त
निम्न तालिका बाइनरी, हेक्साडेसिमल और दशमलव में बिटवाइज़ XOR को दर्शाती है:

एलडीए #$9ए ; स्मृति से नहीं - तत्काल संबोधन
ईओआर #$सीडी ; स्मृति से नहीं - तत्काल संबोधन
एसटीए $30 ; शून्य-आधारित $0030 पर $57 संग्रहीत करता है

4.5 शिफ्ट और रोटेट संचालन

शिफ्ट और रोटेट ऑपरेटरों के लिए निमोनिक्स और ऑपकोड हैं:

एएसएल: एक्युमुलेटर या मेमोरी स्थान के एक बिट को बाईं ओर शिफ्ट करें, सबसे दाईं ओर खाली सेल में 0 डालें।

एलएसआर: संचायक या मेमोरी स्थान के एक बिट को दाईं ओर शिफ्ट करें, सबसे बाईं ओर के खाली सेल में 0 डालें।
आरओएल: संचायक या मेमोरी स्थान के बाईं ओर एक बिट घुमाएं, बाईं ओर छोड़े गए बिट को खाली दाएं सबसे सेल में डालें।
आरओआर: संचायक या मेमोरी स्थान के एक बिट को दाईं ओर घुमाएं, दाईं ओर छोड़े गए बिट को सबसे बाईं ओर खाली सेल में डालें।

संचायक के साथ बदलाव या रोटेशन करने के लिए निर्देश कुछ इस प्रकार है:

एलएसआर ए

यह एक अन्य एड्रेसिंग मोड का उपयोग करता है जिसे एक्युमुलेटर एड्रेसिंग मोड कहा जाता है।

बाइट मेमोरी लोकेशन के साथ शिफ्ट या रोटेशन करने के लिए निर्देश कुछ इस तरह है:

आरओआर $2बीसीडी

जहां 2BCD मेमोरी लोकेशन है.

ध्यान दें कि स्थानांतरण या घूर्णन के लिए कोई तत्काल या निहित एड्रेसिंग मोड नहीं है। कोई तत्काल संबोधन मोड नहीं है क्योंकि उस संख्या को स्थानांतरित करने या घुमाने का कोई मतलब नहीं है जो केवल निर्देश में बनी हुई है। कोई निहित एड्रेसिंग मोड नहीं है क्योंकि 6502 µP के डिज़ाइनर केवल संचायक (ए रजिस्टर) की सामग्री या मेमोरी बाइट स्थान को स्थानांतरित या घुमाना चाहते हैं।

4.6 रिलेटिव एड्रेसिंग मोड

माइक्रोप्रोसेसर हमेशा निष्पादित होने वाले अगले निर्देश को इंगित करने के लिए प्रोग्राम काउंटर (पीसी) को (1, 2, या 3 इकाइयों तक) बढ़ाता है। 6502 µP में एक निर्देश है जिसका स्मरणीय बीवीएस है जिसका अर्थ है ओवरफ्लो सेट पर शाखा। पीसी में दो बाइट्स होते हैं। यह निर्देश पीसी को अगले निर्देश को निष्पादित करने के लिए एक अलग मेमोरी एड्रेस का कारण बनता है जो सामान्य वृद्धि के परिणामस्वरूप नहीं होता है। यह पीसी की सामग्री में एक मान, जिसे ऑफसेट कहा जाता है, को जोड़कर या घटाकर ऐसा करता है। और इसलिए, पीसी फिर कंप्यूटर को वहां से निष्पादित करने के लिए एक अलग (ब्रांच्ड) मेमोरी स्थान की ओर इंगित करता है। ऑफसेट -128 से एक पूर्णांक है 10 से +127 तक 10 (दो का अनुपूरण)। तो, ऑफसेट मेमोरी में छलांग को आगे बढ़ा सकता है। यदि यह सकारात्मक है या स्मृति में पीछे है, या यदि यह नकारात्मक है।

बीवीएस निर्देश केवल एक ऑपरेंड लेता है जो ऑफसेट है। बीवीएस सापेक्ष संबोधन का उपयोग करता है। निम्नलिखित निर्देश पर विचार करें:

बीवीएस $7एफ

आधार दो में, 7F एच 01111111 है 2 = 127 10 . मान लें कि अगले निर्देश के लिए पीसी में सामग्री $0300 है। बीवीएस निर्देश के कारण $037एफ देने के लिए $7एफ (दो के पूरक में पहले से ही एक सकारात्मक संख्या) को $0300 में जोड़ा जाता है। इसलिए, अगले निर्देश को $0300 के मेमोरी स्थान पर निष्पादित करने के बजाय, यह $037F (लगभग आधे पृष्ठ का अंतर) के मेमोरी स्थान पर है।

अन्य शाखा निर्देश भी हैं, लेकिन सापेक्ष संबोधन को स्पष्ट करने के लिए बीवीएस एक बहुत अच्छा निर्देश है। सापेक्ष संबोधन शाखा निर्देशों से संबंधित है।

4.7 अनुक्रमित संबोधन और अप्रत्यक्ष संबोधन अलग-अलग

ये एड्रेसिंग मोड 6502 µP को निर्देशों की कम संख्या के साथ कम समय में भारी मात्रा में डेटा को संभालने में सक्षम बनाते हैं। संपूर्ण कोमोडोर-64 मेमोरी के लिए 64KB स्थान हैं। इसलिए, 16 बिट्स में से किसी भी बाइट स्थान तक पहुंचने के लिए, दो बाइट्स बनाने की आवश्यकता होती है। दो बाइट्स की आवश्यकता का एकमात्र अपवाद पृष्ठ शून्य के लिए है जहां मेमोरी में निर्देश द्वारा ली गई जगह को कम करने के लिए $00 की उच्च बाइट को छोड़ दिया जाता है। गैर-पेज-शून्य एड्रेसिंग मोड के साथ, 16-बिट मेमोरी एड्रेस के उच्च और निचले दोनों बाइट्स को ज्यादातर किसी तरह इंगित किया जाता है।

मूल अनुक्रमित संबोधन

निरपेक्ष सूचकांक संबोधन
याद रखें कि X या Y रजिस्टर को इंडेक्स रजिस्टर कहा जाता है। निम्नलिखित निर्देश पर विचार करें:

एलडीए $C453,एक्स

मान लीजिए कि मान 6 है एच एक्स रजिस्टर में है. ध्यान दें कि निर्देश में कहीं भी 6 टाइप नहीं किया गया है। यह निर्देश 6H का मान C453 में जोड़ता है एच जो टेक्स्ट फ़ाइल में टाइप किए गए निर्देश का हिस्सा है जिसे अभी भी असेंबल किया जाना है - C453 एच +6 एच = सी459 एच . एलडीए का अर्थ है संचायक में एक बाइट लोड करना। संचायक में लोड की जाने वाली बाइट $C459 पते से आती है। $C459 जो $C453 का योग है जिसे निर्देश और 6 के साथ टाइप किया गया है एच जो कि एक्स रजिस्टर में पाया जाता है वह प्रभावी पता बन जाता है जिससे संचायक में लोड की जाने वाली बाइट आती है। यदि 6 एच Y रजिस्टर में था, निर्देश में X के स्थान पर Y टाइप किया गया है।

टाइप किए गए निर्देश विवरण में, $C453 को आधार पते और 6 के रूप में जाना जाता है एच एक्स या वाई रजिस्टर में प्रभावी पते के लिए गिनती या सूचकांक भाग के रूप में जाना जाता है। आधार पता मेमोरी में किसी भी बाइट पते और अगले 256 को संदर्भित कर सकता है 10 पते तक पहुंचा जा सकता है, यह मानते हुए कि एक्स या वाई रजिस्टर में प्रारंभ सूचकांक (या गिनती) 0 है। याद रखें कि एक बाइट 256 तक की निरंतर सीमा दे सकता है 10 संख्याएँ (अर्थात 00000000 2 11111111 पर 2 ).

तो, पूर्ण संबोधन एक्स या वाई रजिस्टर में जो कुछ भी पहले से ही डाला गया है (किसी अन्य निर्देश द्वारा रखा गया है) को उन 16 पतों में जोड़ता है जो प्रभावी पता प्राप्त करने के लिए निर्देश के साथ टाइप किए गए हैं। टाइप किए गए निर्देश में, दो इंडेक्स रजिस्टरों को X या Y द्वारा अलग किया जाता है, जिन्हें अल्पविराम के बाद टाइप किया जाता है। या तो X या Y टाइप किया गया है; दोनों नहीं.

सभी प्रोग्राम को टेक्स्ट एडिटर में टाइप करने और '.asm' एक्सटेंशन फ़ाइल नाम के साथ सहेजने के बाद, असेंबलर, जो एक अन्य प्रोग्राम है, को टाइप किए गए प्रोग्राम को मेमोरी में (लोड) में अनुवाद करना होता है। पिछला निर्देश, जो 'एलडीए $C453,X' है, मेमोरी में तीन बाइट स्थान रखता है, पाँच नहीं।

याद रखें कि एलडीए जैसे स्मरक में एक से अधिक ऑपकोड (अलग-अलग बाइट्स) हो सकते हैं। निर्देश के लिए ऑपकोड जो एक्स रजिस्टर का उपयोग करता है, उस ऑपकोड से भिन्न है जो वाई रजिस्टर का उपयोग करता है। असेंबलर को पता होता है कि टाइप किए गए निर्देश के आधार पर किस ऑपकोड का उपयोग करना है। 'LDA $C453,X' के लिए एक बाइट ऑपकोड 'LDA $C453,Y' के लिए एक बाइट ऑपकोड से भिन्न है। वास्तव में, 'LDA $C453,X' में LDA के लिए ऑपकोड BD है, और 'LDA $C453,9' में LDA के लिए ऑपकोड BD है।

यदि एलडीए के लिए ऑपकोड $0200 बाइट स्थान पर है। फिर, $C453 का 16-बिट पता मेमोरी में बाइट स्थानों के बगल में ले जाता है जो $0201 और $0202 हैं। विशेष ऑपकोड बाइट इंगित करता है कि क्या यह एक्स रजिस्टर है या वाई रजिस्टर जो शामिल है। और इसलिए, संकलित भाषा निर्देश जो कि 'एलडीए $सी453,एक्स' या 'एलडीए $सी453,वाई' है, मेमोरी में लगातार तीन बाइट्स रखता है, न कि चार या पांच।

शून्य-पृष्ठ अनुक्रमित संबोधन
शून्य-पृष्ठ इंडेक्स एड्रेसिंग पूर्ण इंडेक्स एड्रेसिंग की तरह है जिसे पहले वर्णित किया गया है, लेकिन लक्ष्य बाइट केवल पेज शून्य ($0000 से $00FF तक) पर होना चाहिए। अब, शून्य पृष्ठ के साथ काम करते समय, उच्चतर बाइट जो हमेशा 00 होती है एच स्मृति स्थानों के लिए आमतौर पर परहेज किया जाता है। इसलिए, आमतौर पर यह उल्लेख किया जाता है कि पृष्ठ शून्य $00 से FF तक शुरू होता है। और इसलिए, 'एलडीए $सी453,एक्स' का पिछला निर्देश है:

एलडीए $53.एक्स

$C4, एक उच्च बाइट जो पृष्ठ शून्य के ऊपर एक पृष्ठ को संदर्भित करता है, इस निर्देश में नियोजित नहीं किया जा सकता है क्योंकि यह अपेक्षित लक्ष्य बाइट को पृष्ठ शून्य के बाहर और ऊपर संचित बाइट में लोड करने के लिए रखता है।

जब निर्देश में टाइप किया गया मान इंडेक्स रजिस्टर में मान में जोड़ा जाता है, तो योग को पृष्ठ शून्य (एफएफ) से ऊपर परिणाम नहीं देना चाहिए एच ). इसलिए, 'एलडीए $एफएफ, एक्स' जैसा निर्देश और एफएफ जैसा मान होना सवाल से बाहर है एच इंडेक्स रजिस्टर में क्योंकि एफएफ एच + एफएफ एच = 200 एच जो मेमोरी में पृष्ठ 2 (तीसरा पृष्ठ) का पहला बाइट ($0200) स्थान है, पृष्ठ 0 से एक बड़ी दूरी पर है। इसलिए, शून्य-पृष्ठ अनुक्रमित पते के साथ, प्रभावी पता पृष्ठ शून्य में होना चाहिए।

अप्रत्यक्ष सम्बोधन

जंप एब्सोल्यूट एड्रेसिंग
निरपेक्ष अप्रत्यक्ष संबोधन पर चर्चा करने से पहले, जेएमपी निरपेक्ष संबोधन पर नजर डालना अच्छा रहेगा। मान लें कि जिस पते पर ब्याज का मूल्य (लक्ष्य बाइट) है वह $8765 है। यह 16-बिट है जिसमें दो बाइट्स शामिल हैं: उच्च बाइट जो 87 है एच और निचला बाइट जो 65 है एच . तो, $8765 के दो बाइट्स अगले निर्देश के लिए पीसी (प्रोग्राम काउंटर) में डाल दिए जाते हैं। असेंबली लैंग्वेज प्रोग्राम (फ़ाइल) में क्या टाइप किया जाता है:

जेएमपी $8765

मेमोरी में निष्पादित प्रोग्राम जिस भी पते तक पहुंच पाता है, वहां से $8765 पर पहुंच जाता है। जेएमपी निमोनिक में तीन ऑपकोड हैं जो 4सी, 6सी और 7सी हैं। इस पूर्ण संबोधन के लिए ऑपकोड 4C है। JMP पूर्ण अप्रत्यक्ष संबोधन के लिए ऑपकोड 6C है (निम्नलिखित चित्र देखें)।

पूर्णतया अप्रत्यक्ष सम्बोधन
इसका उपयोग केवल जंप (जेएमपी) निर्देश के साथ किया जाता है। मान लें कि जिस पते पर रुचि की बाइट (लक्ष्य बाइट) है वह $8765 है। यह 16-बिट है जिसमें दो बाइट्स शामिल हैं: उच्च बाइट जो 87 है एच और निचला बाइट जो 65 है एच . पूर्ण अप्रत्यक्ष संबोधन के साथ, ये दो बाइट्स वास्तव में मेमोरी में कहीं और दो लगातार बाइट स्थानों में स्थित होते हैं।

मान लें कि वे $0210 और $0211 के मेमोरी स्थानों में स्थित हैं। फिर, रुचि के पते की निचली बाइट जो 65 है एच $0210 पते में है, और उच्चतर बाइट जो 87 है एच $0211 पते पर है. इसका मतलब यह है कि ब्याज की निचली मेमोरी बाइट निचले लगातार पते पर जाती है, और ब्याज की उच्च मेमोरी बाइट उच्चतर लगातार पते पर जाती है - थोड़ा एंडियननेस।

16-बिट पता मेमोरी में लगातार दो पतों को संदर्भित कर सकता है। उस प्रकाश में, $0210 का पता $0210 और $0211 के पते को संदर्भित करता है। $0210 और $0211 की पता जोड़ी लक्ष्य बाइट के अंतिम पते (दो बाइट्स के 16-बिट) को रखती है, जिसमें 65 की निचली बाइट होती है। एच $0210 में और 87 की उच्चतर बाइट एच $0211 में. तो, जो जंप निर्देश टाइप किया गया है वह है:

जेएमपी ($0210)

जेएमपी निमोनिक में तीन ऑपकोड हैं जो 4सी, 6सी और 7सी हैं। पूर्ण अप्रत्यक्ष संबोधन के लिए ऑपकोड 6C है। टेक्स्ट फ़ाइल में जो टाइप किया गया है वह 'JMP ($0210)' है। कोष्ठक के कारण, असेंबलर (अनुवादक) JMP के लिए ऑपकोड 6C का उपयोग करता है, न कि 4C या 7C का।

पूर्ण अप्रत्यक्ष संबोधन के साथ, वास्तव में तीन स्मृति क्षेत्र होते हैं। पहले क्षेत्र में $0200, $0201, और $0202 के बाइट स्थान शामिल हो सकते हैं। इसमें 'JMP ($0210)' निर्देश के लिए तीन बाइट्स हैं। दूसरा क्षेत्र, जो जरूरी नहीं कि पहले के बगल में हो, में $0210 और $0211 के दो लगातार बाइट स्थान शामिल हैं। यह यहां निचला बाइट ($0210) है जो असेंबली भाषा प्रोग्राम निर्देश में टाइप किया गया है। यदि ब्याज का पता $8765 है, तो निचला बाइट 65 है एच $0210 बाइट स्थान पर है, और 87 की उच्चतर बाइट है एच $0211 बाइट स्थान पर है। तीसरे क्षेत्र में केवल एक बाइट स्थान शामिल है। यह लक्षित बाइट (ब्याज की अंतिम बाइट) के लिए $8765 का पता है। लगातार पतों की जोड़ी, $0210 और $0211, $8765 सूचक रखती है जो रुचि का पता है। कंप्यूटिंग व्याख्या के बाद, यह $8765 है जो लक्ष्य बाइट तक पहुंचने के लिए पीसी (प्रोग्राम काउंटर) में जाता है।

शून्य पृष्ठ अप्रत्यक्ष सम्बोधन
यह संबोधन पूर्ण अप्रत्यक्ष संबोधन के समान है, लेकिन सूचक पृष्ठ शून्य में होना चाहिए। पॉइंटर क्षेत्र का निचला बाइट पता टाइप किए गए निर्देश में निम्नानुसार है:

जेएमपी ($50)

पॉइंटर का उच्च बाइट $51 बाइट स्थान पर है। प्रभावी पता (इंगित) पृष्ठ शून्य में होना आवश्यक नहीं है।

इसलिए, इंडेक्स एड्रेसिंग के साथ, इंडेक्स रजिस्टर में मान को आधार पते में जोड़ा जाता है जो प्रभावी पते के लिए निर्देश में दिया गया है। अप्रत्यक्ष संबोधन एक सूचक का उपयोग करता है।

4.8 अनुक्रमित अप्रत्यक्ष संबोधन

पूर्ण अनुक्रमित अप्रत्यक्ष संबोधन
इस एड्रेसिंग मोड का उपयोग केवल जेएमपी निर्देश के साथ किया जाता है।
पूर्ण अप्रत्यक्ष संबोधन के साथ, अपने स्वयं के दो लगातार बाइट पते के साथ इंगित मूल्य (बाइट) होता है। ये दो लगातार पते मेमोरी में दो लगातार बाइट्स के पॉइंटर क्षेत्र में पॉइंटर बनाते हैं। सूचक क्षेत्र का निचला बाइट कोष्ठक में निर्देश में टाइप किया गया है। सूचक इंगित मूल्य का पता है। पिछली स्थिति में, $8765 इंगित मूल्य का पता है। $0210 (इसके बाद $0211) वह पता है जिसकी सामग्री $8765 है जो सूचक है। पूर्ण अप्रत्यक्ष संबोधन मोड के साथ, यह ($0210) है जो कोष्ठक सहित प्रोग्राम (पाठ फ़ाइल) में टाइप किया जाता है।

दूसरी ओर, एब्सोल्यूट इंडेक्स्ड इनडायरेक्ट एड्रेसिंग मोड के साथ, टाइप किए गए पते पर एक्स रजिस्टर में मान जोड़कर पॉइंटर क्षेत्र के लिए निचला एड्रेस बाइट बनाया जाता है। उदाहरण के लिए, यदि सूचक $0210 के पता स्थान पर है, तो टाइप किया गया निर्देश कुछ इस तरह हो सकता है:

जेएमपी ($020ए,एक्स)

जहां एक्स रजिस्टर का मान 6 है एच . 020ए एच +6 एच = 0210 एच . इस एड्रेसिंग मोड के साथ Y रजिस्टर का उपयोग नहीं किया जाता है।

शून्य पृष्ठ अनुक्रमित अप्रत्यक्ष संबोधन
यह एड्रेसिंग मोड एक्स रजिस्टर का उपयोग करता है न कि वाई रजिस्टर का। इस एड्रेसिंग मोड के साथ, इसके दो-बाइट एड्रेस पॉइंटर क्षेत्र में अभी भी इंगित मूल्य और पॉइंटर है। पॉइंटर के लिए पृष्ठ शून्य में लगातार दो बाइट्स होने चाहिए। निर्देश में जो पता टाइप किया गया है वह एक बाइट का पता है। यह मान एक्स रजिस्टर में मान में जोड़ा जाता है और किसी भी कैरी को छोड़ दिया जाता है। परिणाम पृष्ठ 0 में सूचक क्षेत्र को इंगित करता है। उदाहरण के लिए, यदि रुचि का पता (इंगित) $8765 है और यह पृष्ठ 0 के $50 और $51 के बाइट स्थानों में है, और एक्स रजिस्टर में मूल्य $30 है, तो टाइप किया गया निर्देश कुछ इस प्रकार है:

एलडीए ($20.X)

क्योंकि $20 + $30 = $50।

अप्रत्यक्ष अनुक्रमित संबोधन
यह एड्रेसिंग मोड Y रजिस्टर का उपयोग करता है न कि X रजिस्टर का। इस एड्रेसिंग मोड के साथ, अभी भी इंगित मूल्य और सूचक क्षेत्र है, लेकिन सूचक क्षेत्र की सामग्री अलग तरह से संचालित होती है। सूचक क्षेत्र के लिए पृष्ठ शून्य में लगातार दो बाइट्स होने चाहिए। सूचक क्षेत्र का निचला पता निर्देश में टाइप किया गया है। पॉइंटर क्षेत्र में मौजूद यह संख्या (बाइट्स की जोड़ी) को वास्तविक पॉइंटर प्राप्त करने के लिए Y रजिस्टर में मान में जोड़ा जाता है। उदाहरण के लिए, मान लें कि ब्याज का पता (इंगित) $8765 है, 6एच का मूल्य वाई रजिस्टर में है, और संख्या (दो बाइट्स) 50 के पते पर है एच और 51 एच . दोनों बाइट्स मिलाकर $875F हैं क्योंकि $875F + $6 = $8765। टाइप किया गया निर्देश कुछ इस प्रकार है:

एलडीए ($50), वाई

4.9 वृद्धि, कमी, और टेस्ट-बीआईटी निर्देश

निम्न तालिका वेतन वृद्धि और वेतन वृद्धि निर्देशों के संचालन को दर्शाती है:

आईएनए और डीईए संचायक को क्रमशः बढ़ाते और घटाते हैं। इसे एक्युमुलेटर एड्रेसिंग कहा जाता है। INX, DEX, INY और DEY क्रमशः X और Y रजिस्टर के लिए हैं। वे कोई ऑपरेंड नहीं लेते. इसलिए, वे निहित एड्रेसिंग मोड का उपयोग करते हैं। वृद्धि का अर्थ है रजिस्टर या मेमोरी बाइट में 1 जोड़ना। डिक्रीमेंट का अर्थ है रजिस्टर या मेमोरी बाइट से 1 घटाना।

INC और DEC क्रमशः एक मेमोरी बाइट को बढ़ाते और घटाते हैं (और रजिस्टर नहीं)। पूर्ण एड्रेसिंग के बजाय शून्य पेज एड्रेसिंग का उपयोग निर्देश के लिए मेमोरी को कम करना है। शून्य पृष्ठ एड्रेसिंग मेमोरी में निर्देश के लिए पूर्ण एड्रेसिंग से एक बाइट कम है। हालाँकि, शून्य पृष्ठ एड्रेसिंग मोड केवल पृष्ठ शून्य को प्रभावित करता है।

बीआईटी निर्देश मेमोरी में एक बाइट के बिट्स को संचायक में 8 बिट्स के साथ परीक्षण करता है, लेकिन किसी में भी बदलाव नहीं करता है। प्रोसेसर स्थिति रजिस्टर 'पी' के केवल कुछ झंडे सेट हैं। निर्दिष्ट मेमोरी स्थान के बिट्स संचायक के बिट्स के साथ तार्किक रूप से एण्डेड होते हैं। फिर, निम्नलिखित स्थिति बिट्स सेट किए गए हैं:

  • एन जो कि बिट 7 है और स्टेटस रजिस्टर का अंतिम बिट (बाएं) है, एंडिंग से पहले मेमोरी लोकेशन का बिट 7 प्राप्त करता है।
  • V जो स्टेटस रजिस्टर का बिट 6 है, ANDing से पहले मेमोरी लोकेशन का बिट 6 प्राप्त करता है।
  • यदि AND का परिणाम शून्य (00000000) है तो स्थिति रजिस्टर का Z ध्वज सेट किया गया है (1 बनाया गया है) 2 ). अन्यथा वह साफ़ हो जाता है (बना0) ।

4.10 निर्देशों की तुलना करें

6502 µP के लिए तुलना अनुदेश निमोनिक्स CMP, CPX, और CPY हैं। प्रत्येक तुलना के बाद, प्रोसेसर स्थिति रजिस्टर 'पी' के एन, जेड और सी झंडे प्रभावित होते हैं। जब परिणाम एक ऋणात्मक संख्या हो तो एन ध्वज सेट किया जाता है (1 बनाया जाता है)। जब परिणाम शून्य (000000002) होता है तो Z ध्वज सेट किया जाता है (1 बनाया जाता है)। सी ध्वज तब सेट किया जाता है (1 बनाया जाता है) जब आठवें से नौवें बिट तक कैरी होता है। निम्नलिखित तालिका एक विस्तृत चित्रण देती है

का अर्थ है 'इससे भी बड़ा'। इसके साथ, तुलना तालिका स्व-व्याख्यात्मक होनी चाहिए।

4.11 छलांग और शाखा निर्देश

निम्न तालिका जंप और शाखा निर्देशों का सारांश प्रस्तुत करती है:

जेएमपी निर्देश पूर्ण और अप्रत्यक्ष संबोधन का उपयोग करता है। तालिका के शेष निर्देश शाखा निर्देश हैं। वे 6502 µP के साथ केवल सापेक्ष संबोधन का उपयोग करते हैं। इसके साथ ही, यदि तालिका को बाएँ से दाएँ और ऊपर से नीचे तक पढ़ा जाए तो वह स्वयं-व्याख्यात्मक हो जाती है।

ध्यान दें कि शाखाएँ केवल दिए गए पते से -128 से +127 बाइट्स के भीतर के पते पर ही लागू की जा सकती हैं। यह सापेक्ष सम्बोधन है। जेएमपी और शाखा निर्देशों दोनों के लिए, प्रोग्राम काउंटर (पीसी) सीधे प्रभावित होता है। 6502 µP शाखाओं को पूर्ण पते पर जाने की अनुमति नहीं देता है, हालाँकि जंप पूर्ण पते पर पहुँच सकता है। जेएमपी अनुदेश कोई शाखा अनुदेश नहीं है।

टिप्पणी: सापेक्ष संबोधन का उपयोग केवल शाखा निर्देशों के साथ किया जाता है।

4.12 स्टैक क्षेत्र

एक सबरूटीन दो संख्याओं को जोड़ने या दो संख्याओं को घटाने के लिए पिछले छोटे कार्यक्रमों में से एक की तरह है। मेमोरी में स्टैक क्षेत्र $0100 से $01FF तक सम्मिलित रूप से शुरू होता है। इस क्षेत्र को सामान्यतः स्टैक कहा जाता है। जब माइक्रोप्रोसेसर सबरूटीन इंस्ट्रक्शन (जेएसआर - निम्नलिखित चर्चा देखें) पर जंप निष्पादित करता है, तो उसे यह जानना होगा कि समाप्त होने पर कहां लौटना है। 6502 μP इस जानकारी (रिटर्न एड्रेस) को $0100 से $01FF (स्टैक क्षेत्र) तक कम मेमोरी में रखता है और स्टैक पॉइंटर रजिस्टर सामग्री का उपयोग करता है जो कि माइक्रोप्रोसेसर में 'S' है जो अंतिम रिटर्न पते पर पॉइंटर (9 बिट्स) के रूप में होता है वह मेमोरी के पेज 1 ($0100 से $01FF) में संग्रहीत है। स्टैक $01FF से नीचे बढ़ता है और सबरूटीन्स को 128 स्तर की गहराई तक घोंसला बनाना संभव बनाता है।

स्टैक पॉइंटर का एक अन्य उपयोग व्यवधानों को संभालना है। 6502 µP में पिन को IRQ और NMI के रूप में लेबल किया गया है। यह संभव है कि इन पिनों पर कुछ छोटे विद्युत सिग्नल लागू किए जाएं और 6502 μP एक प्रोग्राम को निष्पादित करना बंद कर दे और दूसरे को निष्पादित करना शुरू कर दे। इस स्थिति में, पहला प्रोग्राम बाधित होता है. सबरूटीन्स की तरह, इंटरप्ट कोड सेगमेंट को नेस्ट किया जा सकता है। अगले अध्याय में इंटरप्ट प्रोसेसिंग पर चर्चा की गई है।

टिप्पणी : स्टैक पॉइंटर में $0100 से $01FF तक के स्थानों को संबोधित करने के लिए निचले बाइट पते के लिए 8 बिट हैं। 00000001 की उच्चतर बाइट 2 ऐसा माना जाता है।

निम्न तालिका निर्देश देती है जो स्टैक पॉइंटर 'एस' को ए, एक्स, वाई और पी रजिस्टरों के साथ मेमोरी में स्टैक क्षेत्र से संबंधित करती है:

4.13 सबरूटीन कॉल और रिटर्न

सबरूटीन निर्देशों का एक समूह है जो किसी विशेष उद्देश्य को प्राप्त करता है। पिछला जोड़ या घटाव कार्यक्रम एक बहुत छोटा सबरूटीन है। सबरूटीन्स को कभी-कभी केवल रूटीन भी कहा जाता है। सबरूटीन को कॉल करने का निर्देश है:

जेएसआर: सबरूटीन पर जाएं

सबरूटीन से लौटने का निर्देश है:

आरटीएस: सबरूटीन से वापसी

माइक्रोप्रोसेसर की प्रवृत्ति मेमोरी में एक के बाद एक निर्देशों को लगातार निष्पादित करने की होती है। मान लें कि माइक्रोप्रोसेसर वर्तमान में एक कोड सेगमेंट निष्पादित कर रहा है और इसे एक कोड सेगमेंट पर जाने और निष्पादित करने के लिए एक जंप (जेएमपी) निर्देश का सामना करना पड़ता है, जिसके पीछे कोडित है कि यह पहले से ही निष्पादित हो सकता है। यह उस कोड सेगमेंट को पीछे से निष्पादित करता है और पीछे के कोड सेगमेंट के बाद सभी कोड सेगमेंट (निर्देशों) को निष्पादित करना जारी रखता है, जब तक कि यह वर्तमान कोड सेगमेंट को फिर से निष्पादित नहीं करता है और नीचे जारी रखता है। जेएमपी अगले निर्देश को स्टैक पर नहीं धकेलता है।

जेएमपी के विपरीत, जेएसआर पीसी (प्रोग्राम काउंटर) से अपने बाद अगले निर्देश के पते को स्टैक पर धकेलता है। इस पते की स्टैक स्थिति स्टैक पॉइंटर 'एस' में रखी गई है। जब सबरूटीन में एक आरटीएस निर्देश का सामना (निष्पादित) किया जाता है, तो स्टैक पर धकेला गया पता स्टैक से हट जाता है और प्रोग्राम उस खींचे गए पते पर फिर से शुरू होता है जो सबरूटीन कॉल से ठीक पहले अगला निर्देश पता होता है। स्टैक से निकाला गया अंतिम पता प्रोग्राम काउंटर पर भेजा जाता है। निम्नलिखित तालिका जेएसआर और आरटीएस निर्देशों का तकनीकी विवरण देती है:

जेएसआर और आरटीएस के उपयोग के लिए निम्नलिखित उदाहरण देखें:

4.14 एक काउंट डाउन लूप उदाहरण

निम्नलिखित सबरूटीन की गिनती $FF से $00 (कुल 256) तक होती है 10 मायने रखता है):

एलडीएक्स #$एफएफ प्रारंभ करें; $FF = 255 के साथ X लोड करें
लूप डेक्स; एक्स = एक्स - 1
बीएनई लूप; यदि X शून्य नहीं है तो गोटो लूप
आरटीएस ; वापस करना

प्रत्येक पंक्ति में एक टिप्पणी है. टिप्पणियाँ निष्पादन के लिए कभी भी मेमोरी में नहीं जातीं। असेंबलर (अनुवादक) जो किसी प्रोग्राम को निष्पादन (चलाने) के लिए मेमोरी में मौजूद रूप में परिवर्तित करता है, हमेशा टिप्पणियों को हटा देता है। एक टिप्पणी ';' से शुरू होती है . इस प्रोग्राम में 'स्टार्ट' और 'लूप' को लेबल कहा जाता है। एक लेबल निर्देश के पते की पहचान (नाम) करता है। यदि निर्देश एक एकल बाइट निर्देश (निहित पता) है, तो लेबल उस निर्देश का पता है। यदि निर्देश एक मल्टीबाइट निर्देश है, तो लेबल मल्टीबाइट निर्देश के लिए पहले बाइट की पहचान करता है। इस प्रोग्राम के पहले निर्देश में दो बाइट्स हैं। यह मानते हुए कि यह $0300 पते से शुरू होता है, कार्यक्रम में $0300 पते को 'स्टार्ट' डाउन से प्रतिस्थापित किया जा सकता है। दूसरा निर्देश (DEX) एक एकल बाइट इंस्ट्रक्शन6आयन है, और $0302 पते पर होना चाहिए। इसका मतलब यह है कि $0302 पते को प्रोग्राम के नीचे 'लूप' से प्रतिस्थापित किया जा सकता है, जो वास्तव में 'बीएनई लूप' में है।

'बीएनई लूप' का मतलब दिए गए पते पर शाखा है जब स्थिति रजिस्टर का जेड ध्वज 0 है। जब ए या एक्स या वाई रजिस्टर में मान 00000000 है 2 , अंतिम ऑपरेशन के कारण, Z ध्वज 1 (सेट) है। इसलिए, जबकि यह 0 है (1 नहीं), प्रोग्राम में दूसरे और तीसरे निर्देश उसी क्रम में दोहराए जाते हैं। प्रत्येक दोहराए गए अनुक्रम में, X रजिस्टर में मान (पूर्ण संख्या) 1 से कम हो जाता है। DEX का अर्थ है X = X - 1. जब X रजिस्टर में मान $00 = 00000000 है 2 , Z 1 हो जाता है। उस बिंदु पर, दो निर्देशों की कोई पुनरावृत्ति नहीं होती है। प्रोग्राम में अंतिम आरटीएस निर्देश, जो एक एकल बाइट निर्देश (निहित संबोधन) है, सबरूटीन से वापस आता है। इस निर्देश का प्रभाव उस कोड के लिए स्टैक में प्रोग्राम काउंटर एड्रेस बनाना है जिसे सबरूटीन कॉल से पहले निष्पादित किया जाना है और प्रोग्राम काउंटर (पीसी) पर वापस जाना है। यह पता उस निर्देश का पता है जिसे सबरूटीन को कॉल करने से पहले निष्पादित किया जाना है।

टिप्पणी: 6502 µP के लिए एक असेंबली भाषा प्रोग्राम लिखते समय, एक पंक्ति की शुरुआत में केवल एक लेबल शुरू होना चाहिए; किसी भी अन्य लाइन कोड को कम से कम एक स्थान दाईं ओर स्थानांतरित किया जाना चाहिए।

सबरूटीन को कॉल करना
पिछले लेबल द्वारा लिए गए मेमोरी स्पेस को नजरअंदाज करते हुए, प्रोग्राम $0300 से $0305 तक मेमोरी (रैम) में लगातार 6 बाइट्स लेता है। इस मामले में, कार्यक्रम है:

एलडीएक्स #$एफएफ; $FF = 255 के साथ X लोड करें
डेक्स; एक्स = एक्स - 1
बीएनई $0302 ; यदि X शून्य नहीं है तो गोटो लूप
आरटीएस ; वापस करना

मेमोरी में $0200 पते से शुरुआत करके सबरूटीन के लिए कॉल किया जा सकता है। कॉल निर्देश है:

जेएसआर प्रारंभ; प्रारंभ का पता $0300 है, अर्थात, JSR $0300

सबरूटीन और उसकी कॉल जो टेक्स्ट एडिटर फ़ाइल में ठीक से लिखी गई है वह है:

एलडीएक्स #$एफएफ प्रारंभ करें; $FF = 255 के साथ X लोड करें
लूप डेक्स; एक्स = एक्स - 1

बीएनई लूप; यदि X शून्य नहीं है तो गोटो लूप
आरटीएस ; वापस करना

जेएसआर प्रारंभ: $0300 से शुरू होकर रूटीन पर जाएं

अब, एक लंबे कार्यक्रम में कई सबरूटीन हो सकते हैं। उन सभी का नाम 'प्रारंभ' नहीं हो सकता। उनके अलग-अलग नाम होने चाहिए. वास्तव में, उनमें से किसी का भी नाम 'प्रारंभ' नहीं हो सकता है। शिक्षण कारणों से यहाँ 'प्रारंभ' का उपयोग किया जाता है।

4.15 किसी प्रोग्राम का अनुवाद करना

किसी प्रोग्राम का अनुवाद करना या उसे असेंबल करना एक ही मतलब है। निम्नलिखित कार्यक्रम पर विचार करें:

एलडीएक्स #$एफएफ प्रारंभ करें: एक्स को $एफएफ = 255 के साथ लोड करें
लूप डेक्स: एक्स = एक्स - 1
बीएनई लूप: यदि एक्स शून्य नहीं है तो गोटो लूप
आरटीएस: वापसी
जेएसआर प्रारंभ: $0300 से शुरू होकर रूटीन पर जाएं

यह वह प्रोग्राम है जो पहले लिखा गया है। इसमें सबरूटीन, प्रारंभ और सबरूटीन पर कॉल शामिल है। कार्यक्रम की उल्टी गिनती 255 से शुरू होती है 10 से 0 10 . प्रोग्राम $0200 (RAM) के उपयोगकर्ता आरंभिक पते पर शुरू होता है। प्रोग्राम को टेक्स्ट एडिटर में टाइप किया जाता है और डिस्क में सेव किया जाता है। इसका एक नाम है जैसे 'sample.asm' जहां 'sample' प्रोग्रामर की पसंद का नाम है लेकिन असेंबली भाषा के लिए '.asm' एक्सटेंशन फ़ाइल नाम के साथ जुड़ा होना चाहिए।

असेंबल किया गया प्रोग्राम किसी अन्य प्रोग्राम द्वारा तैयार किया जाता है जिसे असेंबलर कहा जाता है। असेंबलर की आपूर्ति 6502 µP के निर्माता या किसी तीसरे पक्ष द्वारा की जाती है। असेंबलर प्रोग्राम को इस तरह से पुन: प्रस्तुत करता है कि जब वह निष्पादित (रन) होता है तो यह मेमोरी (रैम) में होता है।

मान लें कि JSR निर्देश $0200 पते पर शुरू होता है और सबरूटीन $0300 पते पर शुरू होता है। असेंबलर सभी टिप्पणियाँ और रिक्त स्थान हटा देता है। टिप्पणियाँ और रिक्त स्थान स्मृति को बर्बाद कर देते हैं जो हमेशा दुर्लभ होती है। पिछले सबरूटीन कोड सेगमेंट और सबरूटीन कॉल के बीच एक संभावित रिक्त रेखा व्हाइटस्पेस का एक उदाहरण है। असेंबल की गई फ़ाइल अभी भी डिस्क में सहेजी गई है, और इसे 'sample.exe' नाम दिया गया है। 'नमूना' प्रोग्रामर की पसंद का नाम है, लेकिन '.exe' एक्सटेंशन यह इंगित करने के लिए होना चाहिए कि यह एक निष्पादन योग्य फ़ाइल है।

इकट्ठे कार्यक्रम को निम्नानुसार प्रलेखित किया जा सकता है:

इस तरह से दस्तावेज़ तैयार करना हाथ से असेंबल करना कहा जाता है। ध्यान दें कि इस दस्तावेज़ की टिप्पणियाँ मेमोरी में (निष्पादन के लिए) दिखाई नहीं देती हैं। तालिका में पता कॉलम मेमोरी में निर्देशों के शुरुआती पते को इंगित करता है। ध्यान दें कि 'जेएसआर स्टार्ट' यानी 'जेएसआर $0300', जिसे '20 03 00' के रूप में कोडित किए जाने की उम्मीद है, वास्तव में इसे '20 00 03' के रूप में कोडित किया गया है, जिसमें कम मेमोरी बाइट एड्रेस मेमोरी में कम बाइट लेता है और उच्च मेमोरी बाइट पता मेमोरी में उच्च बाइट लेना - थोड़ी सी अंतहीनता। जेएसआर के लिए ऑपकोड 20 है 16 .

ध्यान दें कि बीएनई जैसे शाखा निर्देश का ऑफसेट 128 की सीमा में दो की पूरक संख्या है 10 से +127 10 . तो, 'बीएनई लूप' का अर्थ 'बीएनई -1' है 10 ” जो वास्तव में FF के कोड रूप में “D0 FF” है 16 दो के पूरक में -1 है जिसे आधार दो में = 11111111 के रूप में लिखा गया है। असेंबलर प्रोग्राम लेबल और फ़ील्ड को वास्तविक हेक्साडेसिमल संख्याओं में बदल देता है (हेक्साडेसिमल संख्याएं बाइनरी संख्याएं होती हैं जिन्हें चार बिट्स में समूहीकृत किया जाता है)। वास्तविक पते जहां प्रत्येक निर्देश शुरू होता है वास्तव में शामिल होते हैं।

टिप्पणी: 'जेएसआर स्टार्ट' निर्देश को छोटे निर्देशों द्वारा प्रतिस्थापित किया जाता है जो प्रोग्राम काउंटर की वर्तमान सामग्री (उच्च और निम्न बाइट्स) को स्टैक पॉइंटर के साथ स्टैक पर भेजता है जिसे दो बार घटाया जाता है (एक बार उच्च बाइट के लिए और एक बार कम बाइट के लिए) और फिर $0300 पते के साथ पीसी को पुनः लोड करता है। स्टैक पॉइंटर अब $00FD की ओर इंगित करता है, यह मानते हुए कि इसे $01FF से प्रारंभ किया गया है।

साथ ही, आरटीएस निर्देश को कई छोटे निर्देशों द्वारा प्रतिस्थापित किया जाता है जो स्टैक पॉइंटर 'एस' को दो बार बढ़ाता है (एक बार कम बाइट के लिए और एक बार उच्च बाइट के लिए) और स्टैक पॉइंटर से पते के संबंधित दो बाइट्स को पीसी तक खींचता है। अगला निर्देश.

टिप्पणी: एक लेबल टेक्स्ट में 8 से अधिक अक्षर नहीं होने चाहिए।

'बीएनई लूप' सापेक्ष संबोधन का उपयोग करता है। इसका मतलब है -3 जोड़ना 10 $0305 के अगले प्रोग्राम काउंटर सामग्री के लिए। 'बीएनई लूप' के लिए बाइट्स 'डी0 एफडी' हैं जहां एफडी -3 का दो पूरक है 10 .

नोट: यह अध्याय 6502 µP के लिए सभी निर्देश प्रस्तुत नहीं करता है। सभी निर्देश और उनके विवरण 'SY6500 8-बिट माइक्रोप्रोसेसर परिवार' शीर्षक वाले दस्तावेज़ में पाए जा सकते हैं। इस दस्तावेज़ के लिए '6502.pdf' नाम से एक पीडीएफ फ़ाइल है जो इंटरनेट पर निःशुल्क उपलब्ध है। इस दस्तावेज़ में वर्णित 6502 µP 65C02 है।

4.16 व्यवधान

कमोडोर 64 के बाहरी (ऊर्ध्वाधर सतह) पोर्ट से जुड़े किसी भी उपकरण के सिग्नल को 6502 माइक्रोप्रोसेसर तक पहुंचने से पहले सीआईए 1 या सीआईए 2 सर्किट (आईसी) से गुजरना पड़ता है। 6502 µP के डेटा-बस से सिग्नल को किसी भी बाहरी डिवाइस तक पहुंचने से पहले या तो CIA 1 या CIA 2 चिप से गुजरना पड़ता है। CIA का मतलब कॉम्प्लेक्स इंटरफ़ेस एडॉप्टर है। चित्र 4.1 में 'कमोडोर_64 मदरबोर्ड का ब्लॉक आरेख', ब्लॉक इनपुट/आउटपुट डिवाइस सीआईए 1 और सीआईए 2 का प्रतिनिधित्व करते हैं। जब कोई प्रोग्राम चल रहा होता है, तो उसे जारी रखने से पहले कोड के किसी अन्य टुकड़े को चलाने के लिए बाधित किया जा सकता है। हार्डवेयर व्यवधान और सॉफ़्टवेयर व्यवधान है. हार्डवेयर रुकावट के लिए, 6502 µP पर दो इनपुट सिग्नल पिन हैं। इन पिनों के नाम हैं आईआरक्यू और एनएमआई . ये µP डेटा लाइनें नहीं हैं. μP के लिए डेटा लाइनें D7, D6, D5, D4, D3, D2, D1 और D0 हैं; सबसे कम महत्वपूर्ण बिट के लिए D0 और सबसे महत्वपूर्ण बिट के लिए D7 के साथ।

आईआरक्यू इंटरप्ट रिक्वेस्ट 'सक्रिय' कम का मतलब है। µP के लिए यह इनपुट लाइन सामान्यतः लगभग 5 वोल्ट पर उच्च होती है। जब यह लगभग 0 वोल्ट तक नीचे चला जाता है, तो यह एक व्यवधान अनुरोध है जो µP को संकेत देता है। जैसे ही अनुरोध स्वीकृत हो जाता है, लाइन वापस ऊंची हो जाती है। व्यवधान अनुरोध देने का अर्थ है कि µP उस कोड (सबरूटीन) की शाखाएँ बनाता है जो व्यवधान को संभालता है।

एनएमआई नॉन-मास्केबल इंटरप्ट 'एक्टिव' लो का मतलब है। जबकि कोड के लिए आईआरक्यू निष्पादित किया जा रहा है एनएमआई नीचे जा सकते हैं. इस मामले में, एनएमआई प्रबंधित किया जाता है (उसका अपना कोड निष्पादित किया जाता है)। उसके बाद, के लिए कोड आईआरक्यू जारी है। के लिए कोड के बाद आईआरक्यू समाप्त होता है, मुख्य प्रोग्राम कोड जारी रहता है। वह है, एनएमआई को बाधित करता है आईआरक्यू हैंडलर. के लिए संकेत एनएमआई µP को अभी भी दिया जा सकता है, भले ही µP निष्क्रिय हो और कुछ भी संभाल नहीं रहा हो या मुख्य प्रोग्राम नहीं चला रहा हो।

टिप्पणी: यह वास्तव में उच्च से निम्न की ओर संक्रमण है एनएमआई , वह यह है कि एनएमआई संकेत - उस पर बाद में और अधिक जानकारी। आईआरक्यू आम तौर पर सीआईए 1 और से आता है एनएमआई आम तौर पर सीआईए 2 से आता है। एनएमआई , जिसका अर्थ नॉन-मास्केबल इंटरप्ट है, को नॉन-स्टॉपेबल इंटरप्ट माना जा सकता है।

व्यवधानों को संभालना
चाहे अनुरोध किसी का हो आईआरक्यू या एनएमआई , वर्तमान निर्देश पूरा होना चाहिए। 6502 में केवल ए, एक्स और वाई रजिस्टर हैं। जब एक सबरूटीन काम कर रहा होता है, तो हो सकता है कि वह इन तीन रजिस्टरों का एक साथ उपयोग कर रहा हो। इंटरप्ट हैंडलर अभी भी एक सबरूटीन है, हालाँकि इसे इस रूप में नहीं देखा जाता है। वर्तमान निर्देश पूरा होने के बाद, 65C02 µP के लिए A, X और Y रजिस्टरों की सामग्री स्टैक में सहेजी जाती है। प्रोग्राम काउंटर के अगले निर्देश का पता भी स्टैक को भेजा जाता है। इसके बाद µP व्यवधान के लिए कोड की शाखाएं बनाता है। उसके बाद, ए, एक्स और वाई रजिस्टरों की सामग्री को स्टैक से उस विपरीत क्रम में पुनर्स्थापित किया जाता है जिस क्रम में उन्हें भेजा जाता है।

व्यवधान के लिए उदाहरण कोडिंग
सरलता के लिए, मान लें कि μP के लिए रूटीन आईआरक्यू इंटरप्ट का मतलब केवल $01 और $02 संख्याओं को जोड़ना और $03 के परिणाम को $0400 के मेमोरी पते पर सहेजना है। कोड है:

ISR PHA
पीएचएक्स
PHY
;
एलडीए #$01
एडीसी #$02
उनकी कीमत $0400 है
;
प्लाई
पीएलएक्स
प्ला
सूचना का अधिकार

ISR एक लेबल है और उस मेमोरी एड्रेस की पहचान करता है जहां PHA निर्देश है। ISR का मतलब इंटरप्ट सर्विस रूटीन है। पीएचए, पीएचएक्स और पीएचवाई ए, एक्स और वाई रजिस्टरों की सामग्री को इस उम्मीद के साथ स्टैक पर भेजते हैं कि रुकावट से ठीक पहले चल रहे किसी भी कोड (प्रोग्राम) के लिए उनकी आवश्यकता होगी। अगले तीन निर्देश इंटरप्ट हैंडलर का मूल बनाते हैं। पीएलवाई, पीएलएक्स और पीएलए निर्देश उसी क्रम में होने चाहिए, और वे वाई, एक्स और ए रजिस्टरों की सामग्री को वापस लाते हैं। अंतिम निर्देश, जो कि आरटीआई है, (ऑपरेंड के बिना) किसी भी कोड (प्रोग्राम) को निष्पादन की निरंतरता लौटाता है जो रुकावट से पहले निष्पादित हो रहा है। आरटीआई स्टैक से निष्पादित होने वाले कोड के अगले निर्देश का पता वापस प्रोग्राम काउंटर पर खींच लेता है। आरटीआई का मतलब है इंटरप्ट से रिटर्न। इसके साथ ही, इंटरप्ट हैंडलिंग (सबरूटीन) खत्म हो गई है।

सॉफ़्टवेयर व्यवधान
6502 µP के लिए सॉफ़्टवेयर व्यवधान का मुख्य तरीका BRK निहित पता अनुदेश का उपयोग करना है। मान लें कि मुख्य प्रोग्राम चल रहा है और उसे BRK अनुदेश का सामना करना पड़ता है। उस बिंदु से, पीसी में अगले निर्देश का पता वर्तमान निर्देश पूरा होने पर स्टैक पर भेजा जाना चाहिए। सॉफ़्टवेयर अनुदेश को संभालने के लिए एक सबरूटीन को 'अगला' कहा जाना चाहिए। इस इंटरप्ट सबरूटीन को ए, एक्स और वाई रजिस्टर सामग्री को स्टैक पर धकेलना चाहिए। सबरूटीन के कोर को निष्पादित करने के बाद, ए, एक्स और वाई रजिस्टरों की सामग्री को पूर्ण सबरूटीन द्वारा स्टैक से उनके रजिस्टरों में वापस खींच लिया जाना चाहिए। दिनचर्या में अंतिम कथन है आरटीआई. आरटीआई के कारण पीसी सामग्री भी स्वचालित रूप से स्टैक से पीसी में वापस खींच ली जाती है।

सबरूटीन और इंटरप्ट सर्विस रूटीन की तुलना और विरोधाभास
निम्न तालिका सबरूटीन और इंटरप्ट सर्विस रूटीन की तुलना और विरोधाभास करती है:

4.17 6502 मुख्य एड्रेसिंग मोड का सारांश

6502 के लिए प्रत्येक निर्देश एक बाइट है, जिसके बाद शून्य या अधिक ऑपरेंड होते हैं।

तत्काल संबोधन मोड
तत्काल एड्रेसिंग मोड के साथ, ऑपरेंड के बाद, वैल्यू है न कि मेमोरी एड्रेस। मान के पहले # लगाना होगा. यदि मान हेक्साडेसिमल में है तो '#' के बाद '$' लगाना होगा। 65C02 के लिए तत्काल संबोधित निर्देश हैं: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC। पाठक को यह जानने के लिए 65C02 µP के लिए दस्तावेज़ देखना चाहिए कि यहां सूचीबद्ध निर्देशों का उपयोग कैसे किया जाए, जिनकी इस अध्याय में व्याख्या नहीं की गई है। एक उदाहरण निर्देश है:

एलडीए #$77

एब्सोल्यूट एड्रेसिंग मोड
एब्सोल्यूट एड्रेसिंग मोड में, एक ऑपरेंड होता है। यह ऑपरेंड मेमोरी में मान का पता है (आमतौर पर हेक्साडेसिमल या लेबल में)। 64K हैं 10 = 65,536 10 6502 µP के लिए मेमोरी पते। आमतौर पर, एक-बाइट मान इनमें से किसी एक पते पर होता है। 65C02 के लिए पूर्ण संबोधन निर्देश हैं: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , एसटीएक्स, एसटीवाई, एसटीजेड, टीआरबी, टीएसबी। पाठक को यह जानने के लिए 65C02 µP के लिए दस्तावेज़ देखना चाहिए कि यहां सूचीबद्ध निर्देशों का उपयोग कैसे किया जाए, साथ ही बाकी एड्रेसिंग मोड के बारे में भी, जिन्हें इस अध्याय में नहीं बताया गया है। एक उदाहरण निर्देश है:

वे $1234 हैं

निहित संबोधन मोड
निहित एड्रेसिंग मोड में, कोई ऑपरेंड नहीं है। इसमें शामिल कोई भी µP रजिस्टर अनुदेश द्वारा निहित है। 65C02 के लिए निहित संबोधन निर्देश हैं: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY,RTI, RTS, SEC , एसईडी, एसईआई, टैक्स, टीएवाई, टीएसएक्स, टीएक्सए, टीएक्सएस, टीवाईए। एक उदाहरण निर्देश है:

DEX: X रजिस्टर को एक इकाई से घटाएँ।

रिलेटिव एड्रेसिंग मोड
रिलेटिव एड्रेसिंग मोड केवल शाखा निर्देशों से संबंधित है। रिलेटिव एड्रेसिंग मोड में, केवल एक ऑपरेंड होता है। यह -128 से एक मान है 10 से +127 तक 10 . इस मान को ऑफसेट कहा जाता है. संकेत के आधार पर, इस मान को प्रोग्राम काउंटर के अगले निर्देश से जोड़ा या घटाया जाता है, जिसके परिणामस्वरूप इच्छित अगले निर्देश का पता मिलता है। सापेक्ष पता मोड निर्देश हैं: बीसीसी, बीसीएस, बीईक्यू, बीएमआई, बीएनई, बीपीएल, बीआरए, बीवीसी, बीवीएस। निर्देश उदाहरण हैं:

बीएनई $7एफ : (यदि स्थिति रजिस्टर में शाखा जेड = 0 है, पी)

जो वर्तमान प्रोग्राम काउंटर (निष्पादित करने के लिए पता) में 127 जोड़ता है और उस पते पर निर्देश निष्पादित करना शुरू करता है। इसी प्रकार:

BEQ $F9 : (शाखा यदि Z = : स्थिति रजिस्टर में, P)

जो वर्तमान प्रोग्राम काउंटर पर -7 जोड़ता है और नए प्रोग्राम काउंटर पते पर निष्पादन शुरू करता है। ऑपरेंड दो की पूरक संख्या है।

पूर्ण अनुक्रमित संबोधन
निरपेक्ष सूचकांक एड्रेसिंग में, एक्स या वाई रजिस्टर की सामग्री को दिए गए निरपेक्ष पते (कहीं भी $0000 से $FFFF, यानी 0 से) में जोड़ा जाता है 10 65536 पर 10 ) वास्तविक पता होना। इस दिए गए निरपेक्ष पते को आधार पता कहा जाता है। यदि एक्स रजिस्टर का उपयोग किया जाता है, तो असेंबली निर्देश कुछ इस प्रकार है:

एलडीए $C453,एक्स

यदि Y रजिस्टर का उपयोग किया जाता है, तो यह कुछ इस प्रकार है:

एलडीए $C453,Y

X या Y रजिस्टर के मान को गिनती या सूचकांक मान कहा जाता है, और यह $00 (0) से कहीं भी हो सकता है 10 ) से $FF (250 10 ). इसे ऑफसेट नहीं कहा जाता.

संपूर्ण सूचकांक को संबोधित करने वाले निर्देश हैं: ADC, AND, ASL (केवल X), BIT (संचयक और मेमोरी के साथ, केवल X के साथ), CMP, DEC (केवल मेमोरी और X के साथ), EOR, INC (केवल मेमोरी और X), LDA , एलडीएक्स, एलडीवाई, एलएसआर (केवल एक्स), ओआरए, आरओएल (केवल एक्स), आरओआर (केवल एक्स), एसबीसी, एसटीए, एसटीजेड (केवल एक्स)।

पूर्णतया अप्रत्यक्ष सम्बोधन
इसका उपयोग केवल जंप निर्देश के साथ किया जाता है। इसके साथ, दिए गए निरपेक्ष पते में एक सूचक पता होता है। सूचक पते में दो बाइट्स होते हैं। दो-बाइट्स सूचक मेमोरी में गंतव्य बाइट मान को इंगित करता है (पता है)। तो, असेंबली भाषा निर्देश है:

जेएमपी ($3456)

कोष्ठक के साथ, और $13 $3456 के पता स्थान में है जबकि $EB $3457 (= $3456 + 1) के पता स्थान में है। फिर, गंतव्य पता $13EB है और $13EB सूचक है। पूर्ण $3456 निर्देश में कोष्ठक में है जहां 34 निचला बाइट है और 56 उच्च बाइट है।

4.18 6502 µP असेंबली लैंग्वेज के साथ एक स्ट्रिंग बनाना

जैसा कि अगले अध्याय में दिखाया गया है, मेमोरी में फ़ाइल बनाने के बाद, फ़ाइल को डिस्क में सहेजा जा सकता है। फ़ाइल को एक नाम देना आवश्यक है. नाम एक स्ट्रिंग का उदाहरण है. प्रोग्रामिंग में स्ट्रिंग्स के कई अन्य उदाहरण हैं।

ASCII कोड की एक स्ट्रिंग बनाने के दो मुख्य तरीके हैं। दोनों तरीकों से, सभी ASCII कोड (अक्षर) मेमोरी में लगातार बाइट स्थान लेते हैं। एक तरह से, बाइट्स का यह क्रम एक पूर्णांक बाइट से पहले होता है जो अनुक्रम (स्ट्रिंग) में लंबाई (वर्णों की संख्या) है। दूसरे तरीके में, वर्णों का क्रम नल बाइट द्वारा सफल होता है (तुरंत अनुसरण किया जाता है) जो 00 है 16 , यानी $00. स्ट्रिंग की लंबाई (वर्णों की संख्या) को इस अन्य तरीके से इंगित नहीं किया गया है। पहले तरीके में नल वर्ण का उपयोग नहीं किया जाता है।

उदाहरण के लिए, 'मैं तुमसे प्यार करता हूँ!' पर विचार करें। उद्धरण चिह्नों के बिना स्ट्रिंग. यहाँ लंबाई 11 है; एक स्पेस को एक ASCII बाइट (कैरेक्टर) के रूप में गिना जाता है। मान लें कि स्ट्रिंग को मेमोरी में रखा जाना है और पहला अक्षर $0300 पते पर है।

निम्न तालिका पहली बाइट 11 होने पर स्ट्रिंग मेमोरी सेटिंग दिखाती है 10 = 0बी 16 :

निम्न तालिका स्ट्रिंग मेमोरी सेटिंग दिखाती है जब पहला बाइट 'I' होता है और अंतिम बाइट शून्य ($00) होता है:

स्ट्रिंग बनाना शुरू करने के लिए निम्नलिखित निर्देश का उपयोग किया जा सकता है:

उनकी कीमत $0300 है

मान लें कि पहला बाइट संचायक में है जिसे $0300 के पते वाले स्थान पर भेजा जाना है। यह निर्देश दोनों मामलों (दोनों प्रकार की स्ट्रिंग) के लिए सत्य है।

मेमोरी सेल्स में सभी कैरेक्टर्स को एक-एक करके फिट करने के बाद, स्ट्रिंग को लूप का उपयोग करके पढ़ा जा सकता है। पहले मामले में, लंबाई के बाद वर्णों की संख्या पढ़ी जाती है। दूसरे मामले के लिए, वर्णों को 'I' से तब तक पढ़ा जाता है जब तक कि अशक्त वर्ण जो कि 'शून्य' न हो जाए।

4.19 6502 µP असेंबली लैंग्वेज के साथ एक ऐरे बनाना

एकल बाइट पूर्णांकों की एक सरणी में पूर्णांकों के साथ लगातार मेमोरी बाइट स्थान होते हैं। फिर, एक सूचक है जो पहले पूर्णांक के स्थान को इंगित करता है। तो, पूर्णांकों की एक सरणी में दो भाग होते हैं: सूचक और स्थानों की श्रृंखला।

स्ट्रिंग्स की एक श्रृंखला के लिए, प्रत्येक स्ट्रिंग मेमोरी में एक अलग स्थान पर हो सकती है। फिर, पॉइंटर्स के साथ लगातार मेमोरी स्थान होते हैं जहां प्रत्येक पॉइंटर प्रत्येक स्ट्रिंग के पहले स्थान को इंगित करता है। इस मामले में एक सूचक में दो बाइट्स होते हैं। यदि कोई स्ट्रिंग अपनी लंबाई से शुरू होती है, तो संबंधित सूचक उस लंबाई के स्थान को इंगित करता है। यदि कोई स्ट्रिंग अपनी लंबाई से शुरू नहीं होती है, लेकिन एक शून्य वर्ण के साथ समाप्त होती है, तो संबंधित सूचक स्ट्रिंग के पहले वर्ण के स्थान को इंगित करता है। और एक पॉइंटर है जो लगातार पॉइंटर्स के पहले पॉइंटर के निचले बाइट पते की ओर इशारा करता है। तो, स्ट्रिंग्स की एक सरणी में तीन भाग होते हैं: मेमोरी में विभिन्न स्थानों पर स्ट्रिंग्स, संबंधित लगातार पॉइंटर्स, और लगातार पॉइंटर्स के पहले पॉइंटर का पॉइंटर।

4.20 समस्याएँ

पाठक को अगले अध्याय पर जाने से पहले एक अध्याय की सभी समस्याओं को हल करने की सलाह दी जाती है।

  1. एक असेंबली भाषा प्रोग्राम लिखें जो 6502 µP के लिए $0200 से शुरू होता है और 2A94 के अहस्ताक्षरित नंबर जोड़ता है एच (जोड़ें) 2एबीएफ में एच (अगेंड)। इनपुट और आउटपुट को मेमोरी में रहने दें। इसके अलावा, इकट्ठे किए गए प्रोग्राम दस्तावेज़ को हाथ से तैयार करें।
  2. एक असेंबली भाषा प्रोग्राम लिखें जो 6502 µP के लिए $0200 से शुरू होता है और 1569 की अहस्ताक्षरित संख्याओं को घटाता है एच (सबट्रेंड) 2एबीएफ से एच (मिनट). इनपुट और आउटपुट को मेमोरी में रहने दें। इसके अलावा, इकट्ठे किए गए प्रोग्राम दस्तावेज़ को हाथ से तैयार करें।
  3. 6502 µP के लिए एक असेंबली भाषा प्रोग्राम लिखें जो एक लूप का उपयोग करके $00 से $09 तक गिना जाता है। कार्यक्रम $0200 से शुरू होना चाहिए। इसके अलावा, इकट्ठे किए गए प्रोग्राम दस्तावेज़ को हाथ से तैयार करें।
  4. एक असेंबली भाषा प्रोग्राम लिखें जो 6502 µP के लिए $0200 से शुरू होता है। प्रोग्राम में दो सबरूटीन हैं. पहला सबरूटीन 0203 की अहस्ताक्षरित संख्याएँ जोड़ता है एच (संवर्धित) और 0102एच (जोड़ें)। दूसरा सबरूटीन पहले सबरूटीन का योग जोड़ता है जो 0305H से 0006 है एच (अगेंड)। अंतिम परिणाम मेमोरी में संग्रहीत होता है। पहले सबरूटीन को कॉल करें जो कि FSTSUB है और दूसरे सबरूटीन को जो SECSUB है। इनपुट और आउटपुट को मेमोरी में रहने दें। इसके अलावा, पूरे कार्यक्रम के लिए इकट्ठे प्रोग्राम दस्तावेज़ को हाथ से तैयार करें।
  5. यह देखते हुए कि ए आईआरक्यू हैंडलर कोर हैंडलिंग के रूप में संचायक पर $02 से $01 जोड़ता है एनएमआई जारी किया जाता है और इसके लिए कोर हैंडलिंग की जाती है एनएमआई संचायक पर $05 से $04 जोड़ता है, दोनों हैंडलर के लिए उनकी कॉल सहित एक असेंबली भाषा लिखता है। को कॉल आईआरक्यू हैंडलर $0200 के पते पर होना चाहिए। आईआरक्यू हैंडलर को $0300 के पते पर शुरू करना चाहिए। एनएमआई हैंडलर को $0400 के पते पर शुरू करना चाहिए। का परिणाम आईआरक्यू हैंडलर को $0500 के पते पर डाला जाना चाहिए, और इसका परिणाम एनएमआई हैंडलर को $0501 के पते पर डाला जाना चाहिए।
  6. संक्षेप में बताएं कि 65C02 कंप्यूटर में सॉफ़्टवेयर इंटरप्ट उत्पन्न करने के लिए BRK निर्देश का उपयोग कैसे किया जाता है।
  7. एक तालिका तैयार करें जो एक सामान्य सबरूटीन की एक इंटरप्ट सर्विस रूटीन के साथ तुलना और अंतर करती है।
  8. असेंबली भाषा अनुदेश उदाहरणों को देखते हुए 65C02 µP के मुख्य एड्रेसिंग मोड को संक्षेप में समझाएं।
  9. क) 'आई लव यू!' डालने के लिए 6502 मशीन भाषा प्रोग्राम लिखें। मेमोरी में ASCII कोड की स्ट्रिंग, स्ट्रिंग की लंबाई के साथ $0300 पते से शुरू होती है। कार्यक्रम $0200 के पते पर शुरू होना चाहिए। संचायक से प्रत्येक पात्र को एक-एक करके प्राप्त करें, यह मानते हुए कि वे किसी सबरूटीन द्वारा वहां भेजे गए हैं। साथ ही, प्रोग्राम को हाथ से असेंबल करें। (यदि आपको 'आई लव यू!' के लिए ASCII कोड जानने की आवश्यकता है। वे यहां हैं: 'I':49 16 , स्थान : 20 16 , 'एल': 6 सी 16 , 'ओ':6एफ 16 , 'में':76 16 , 'ई':65, 'वाई':79 16 , 'में':75 16 , और '!':21 16 (नोट: प्रत्येक कोड 1 बाइट लेता है)।
    ख) 'आई लव यू!' डालने के लिए 6502 मशीन भाषा प्रोग्राम लिखें। मेमोरी में ASCII कोड की स्ट्रिंग, स्ट्रिंग की लंबाई के बिना $0300 पते से शुरू होती है लेकिन 00 पर समाप्त होती है 16 . कार्यक्रम $0200 के पते पर शुरू होना चाहिए। संचायक से प्रत्येक अक्षर प्राप्त करें, यह मानते हुए कि वे किसी सबरूटीन द्वारा, एक-एक करके वहां भेजे गए हैं। साथ ही, प्रोग्राम को हाथ से असेंबल करें।