अध्याय 5: असेंबली भाषा में कमोडोर-64 ऑपरेटिंग सिस्टम

Adhyaya 5 Asembali Bhasa Mem Kamodora 64 Oparetinga Sistama



5.1 परिचय

कमोडोर-64 कंप्यूटर का ऑपरेटिंग सिस्टम कंप्यूटर के साथ रीड ओनली मेमोरी (ROM) में आता है। कमोडोर-64 के लिए मेमोरी बाइट स्थानों की संख्या $0000 से $FFFF (यानी 000016 से FFFF16 जो 010 से 65,53510 है) तक होती है। ऑपरेटिंग सिस्टम $E000 से $FFFF (यानी 57,34410 से 65,53610) तक है।

कमोडोर-64 ऑपरेटिंग सिस्टम का अध्ययन क्यों करें?
आज कमोडोर-64 ऑपरेटिंग सिस्टम का अध्ययन क्यों करें जबकि यह एक कंप्यूटर का ऑपरेटिंग सिस्टम था जिसे 1982 में जारी किया गया था? खैर, कमोडोर-64 कंप्यूटर सेंट्रल प्रोसेसिंग यूनिट 6510 का उपयोग करता है जो 6502 µP का अपग्रेड (हालांकि बड़ा अपग्रेड नहीं) है।







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



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



यह केवल लेखक (स्वयं) की राय नहीं है। यह दुनिया में एक बढ़ती हुई प्रवृत्ति है। कमोडोर-64 ऑपरेटिंग सिस्टम को आधुनिक ऑपरेटिंग सिस्टम जैसा बनाने के लिए इसे बेहतर बनाने के लिए इंटरनेट पर अधिक से अधिक लेख लिखे जा रहे हैं। आधुनिक ऑपरेटिंग सिस्टम को अगले अध्याय के बाद के अध्याय में समझाया गया है।





टिप्पणी : कमोडोर-64 ओएस (कर्नल) अभी भी आधुनिक इनपुट और आउटपुट डिवाइस (सभी नहीं) के साथ अच्छा काम करता है।

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



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

पिछले अध्याय में मेमोरी मैप (लेआउट) पर्याप्त विस्तृत नहीं है। यह काफी सरल है. कमोडोर-64 कंप्यूटर का मेमोरी मैप तीन स्तरों के विवरण के साथ दिखाया जा सकता है। जब मध्यवर्ती स्तर पर दिखाया जाता है, तो कमोडोर-64 कंप्यूटर में अलग-अलग मेमोरी मैप होते हैं। मध्यवर्ती स्तर पर कमोडोर-64 कंप्यूटर का डिफ़ॉल्ट मेमोरी मैप है:


चित्र 5.11 कमोडोर-64 मेमोरी मैप

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

ध्यान दें कि अधिकांश मेमोरी डिफ़ॉल्ट मेमोरी मैप में BASIC द्वारा ली जाती है। बेसिक में कमांड (निर्देश) होते हैं जिन्हें बेसिक इंटरप्रेटर के नाम से जाना जाता है। वास्तव में, बेसिक दुभाषिया ROM में $A000 स्थान से $BFFF (समावेशी) तक होता है जो कि संभवतः एक RAM क्षेत्र है। यह 8 Kbytes उस समय काफी बड़ा है! यह वास्तव में ROM में संपूर्ण मेमोरी के उस स्थान पर होता है। इसका आकार $E000 से $FFFF (समावेशी) तक ऑपरेटिंग सिस्टम के समान है। जो प्रोग्राम BASIC में लिखे जाते हैं उन्हें भी $0200 से $BFFF की रेंज में रखा जाता है।

उपयोगकर्ता असेंबली भाषा प्रोग्राम के लिए RAM $C000 से $CFFF तक है, 64 Kbytes में से केवल 4 Kbytes। तो, हम असेंबली भाषा का उपयोग क्यों करते हैं या सीखते हैं? नए और पुराने ऑपरेटिंग सिस्टम असेंबली लैंग्वेज के हैं। कमोडोर-64 का ऑपरेटिंग सिस्टम $E000 से $FFFF तक ROM में है। यह 65C02 µP (6510 µP) असेंबली भाषा में लिखा गया है। इसमें सबरूटीन्स शामिल हैं। असेंबली भाषा में उपयोगकर्ता प्रोग्राम को बाह्य उपकरणों (इनपुट और आउटपुट डिवाइस) के साथ इंटरैक्ट करने के लिए इन सबरूटीन्स को कॉल करने की आवश्यकता होती है। कमोडोर-64 ऑपरेटिंग सिस्टम को असेंबली भाषा में समझने से छात्र ऑपरेटिंग सिस्टम को बहुत कम कठिन तरीके से जल्दी समझने में सक्षम हो जाता है। फिर, उन दिनों, कमोडोर-64 के लिए कई उपयोगकर्ता प्रोग्राम असेंबली भाषा में नहीं बल्कि बेसिक में लिखे गए थे। उन दिनों असेंबली भाषाओं का उपयोग प्रोग्रामर स्वयं तकनीकी उद्देश्यों के लिए अधिक करते थे।

कर्नेल, जिसे K-e-r-n-a-l कहा जाता है, कमोडोर-64 का ऑपरेटिंग सिस्टम है। यह कमोडोर-64 कंप्यूटर के साथ ROM में आता है, डिस्क (या डिस्केट) में नहीं। कर्नेल में सबरूटीन्स होते हैं। बाह्य उपकरणों तक पहुँचने के लिए, असेंबली भाषा (मशीन भाषा) में उपयोगकर्ता प्रोग्राम को इन सबरूटीन्स का उपयोग करना पड़ता है। कर्नेल को कर्नेल के साथ भ्रमित नहीं किया जाना चाहिए जिसे आधुनिक ऑपरेटिंग सिस्टम के K-e-r-n-e-l के रूप में लिखा जाता है, हालांकि वे लगभग एक ही चीज़ हैं।

$C000 (49,15210) से $CFFF (6324810) तक की 4 Kbytes10 मेमोरी का मेमोरी क्षेत्र या तो RAM या ROM है। जब यह RAM होती है, तो इसका उपयोग बाह्य उपकरणों तक पहुँचने के लिए किया जाता है। जब यह ROM होता है, तो इसका उपयोग स्क्रीन (मॉनिटर) पर वर्णों को प्रिंट करने के लिए किया जाता है। इसका मतलब यह है कि या तो पात्रों को स्क्रीन पर मुद्रित किया जा रहा है या मेमोरी के इस हिस्से के उपयोग से बाह्य उपकरणों तक पहुंच बनाई जा रही है। सिस्टम यूनिट (मदरबोर्ड) में ROM (कैरेक्टर ROM) का एक बैंक होता है जिसे प्राप्त करने के लिए पूरे मेमोरी स्पेस में स्विच किया जाता है और बाहर किया जाता है। हो सकता है कि उपयोगकर्ता को स्विचिंग नज़र न आए.

मेमोरी का क्षेत्रफल $0100 से (256 10 ) से $01एफएफ (511 10 ) ढेर है. इसका उपयोग ऑपरेटिंग सिस्टम और यूजर प्रोग्राम दोनों द्वारा किया जाता है। इस ऑनलाइन करियर पाठ्यक्रम के पिछले अध्याय में स्टैक की भूमिका के बारे में बताया गया था। $0000 से मेमोरी का क्षेत्रफल (0 10 ) से $00FF (255 10 ) का उपयोग ऑपरेटिंग सिस्टम द्वारा किया जाता है। वहां कई सूचक दिए गए हैं.

कर्नेल जंप टेबल
कर्नेल में रूटीन होते हैं जिन्हें उपयोगकर्ता प्रोग्राम द्वारा कॉल किया जाता है। जैसे ही OS के नए संस्करण सामने आए, इन रूटीन के पते बदल गए। इसका मतलब यह है कि उपयोगकर्ता प्रोग्राम अब नए OS संस्करणों के साथ काम नहीं कर सकते हैं। ऐसा नहीं हुआ क्योंकि कमोडोर-64 ने एक जंप टेबल प्रदान की थी। जंप टेबल 39 प्रविष्टियों की एक सूची है। तालिका में प्रत्येक प्रविष्टि में तीन पते हैं (अंतिम 6 बाइट्स को छोड़कर) जो ऑपरेटिंग सिस्टम के संस्करण परिवर्तन के साथ भी कभी नहीं बदले।

किसी प्रविष्टि के पहले पते में एक JSR निर्देश होता है। अगले दो पतों में दो-बाइट सूचक शामिल है। यह दो-बाइट सूचक एक वास्तविक रूटीन का पता (या नया पता) है जो अभी भी OS ROM में है। नए ओएस संस्करणों के साथ सूचक सामग्री बदल सकती है, लेकिन प्रत्येक जंप टेबल प्रविष्टि के लिए तीन पते कभी नहीं बदलेंगे। उदाहरण के लिए, $FF81, $FF82, और $FF83 पतों पर विचार करें। ये तीन पते मदरबोर्ड की स्क्रीन और कीबोर्ड सर्किट (रजिस्टर) को आरंभ करने के लिए हैं। $FF81 पते में हमेशा JSR का ऑप कोड (एक बाइट) होता है। $FF82 और $FF83 पतों में आरंभीकरण के लिए सबरूटीन का पुराना या नया पता (अभी भी OS ROM में) है। एक समय में, $FF82 और $FF83 पतों में $FF5B की सामग्री (पता) होती थी जो अगले OS संस्करण के साथ बदल सकती थी। हालाँकि, जंप टेबल के $FF81, $FF82, और $FF83 पते कभी नहीं बदलते।

तीन पतों की प्रत्येक प्रविष्टि के लिए, JSR वाले पहले पते पर एक लेबल (नाम) होता है। $FF81 का लेबल PCINT है। PCINT कभी नहीं बदलता. इसलिए, स्क्रीन और कीबोर्ड रजिस्टरों को आरंभ करने के लिए, प्रोग्रामर बस 'JSR PCINT' टाइप कर सकता है जो कमोडोर -64 ओएस के सभी संस्करणों के लिए काम करता है। वास्तविक सबरूटीन का स्थान (प्रारंभ पता), उदाहरण के लिए, $FF5B, विभिन्न ऑपरेटिंग सिस्टम के साथ समय के साथ बदल सकता है। हाँ, ROM OS का उपयोग करने वाले उपयोगकर्ता प्रोग्राम में कम से कम दो JSR निर्देश शामिल होते हैं। उपयोगकर्ता प्रोग्राम में, एक JSR निर्देश होता है जो जंप टेबल में एक प्रविष्टि पर जाता है। जंप टेबल में अंतिम छह पतों के अपवाद के साथ, जंप टेबल में किसी प्रविष्टि के पहले पते में एक JSR निर्देश होता है। कर्नेल में, कुछ सबरूटीन्स अन्य सबरूटीन्स को कॉल कर सकते हैं।

कर्नेल जंप टेबल $FF81 (समावेशी) से शुरू होती है जो तीन के समूहों में ऊपर की ओर जाती है, अंतिम छह बाइट्स को छोड़कर जो कम बाइट पते वाले तीन पॉइंटर्स हैं: $FFFA, $FFFC, और $FFFE। सभी ROM OS रूटीन पुन: प्रयोज्य कोड हैं। इसलिए, उपयोगकर्ता को उन्हें दोबारा लिखने की ज़रूरत नहीं है।

कमोडोर-64 सिस्टम यूनिट का ब्लॉक आरेख
निम्नलिखित आरेख पिछले अध्याय की तुलना में अधिक विस्तृत है:


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

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

फिर भी, एक कैरेक्टर रॉम है जिसे दोनों सीआईए के साथ तब बदला जा सकता है जब कोई कैरेक्टर स्क्रीन पर भेजा जाता है और यह ब्लॉक आरेख में नहीं दिखाया जाता है।

कैरेक्टर ROM की अनुपस्थिति में इनपुट/आउटपुट सर्किट के लिए $D000 से $DFFF तक RAM पते में निम्नलिखित विवरण मेमोरी मैप होता है:

तालिका 5.11
$D000 से $DFFF तक विस्तृत मेमोरी मैप
उप-पता श्रेणी सर्किट आकार (बाइट्स)
D000 - D3FF वीआईसी (वीडियो इंटरफ़ेस नियंत्रक (चिप)) 1K
D400 - D7FF एसआईडी (ध्वनि सर्किट) 1K
डी800 - डीबीएफएफ रंगीन रैम 1K निबल्स
DC00 - DCFF CIA #1 (कीबोर्ड, जॉयस्टिक) 256
DD00 - DDFF सीआईए #2 (सीरियल बस, यूजर पोर्ट/आरएस-232) 256
DE00 - DEF I/O स्लॉट #1 खोलें 256
डीएफ00 - डीएफएफएफ I/O स्लॉट #2 खोलें 256

5.2 दो जटिल इंटरफ़ेस एडेप्टर

कमोडोर-64 सिस्टम यूनिट में दो विशेष एकीकृत सर्किट (आईसी) हैं, और उनमें से प्रत्येक को कॉम्प्लेक्स इंटरफ़ेस एडाप्टर कहा जाता है। इन दो चिप्स का उपयोग कीबोर्ड और अन्य बाह्य उपकरणों को माइक्रोप्रोसेसर से इंटरफ़ेस करने के लिए किया जाता है। वीआईसी और स्क्रीन के अपवाद के साथ, माइक्रोप्रोसेसर और बाह्य उपकरणों के बीच सभी इनपुट/आउटपुट सिग्नल इन दो आईसी से होकर गुजरते हैं। कमोडोर-64 के साथ, मेमोरी और किसी परिधीय के बीच कोई सीधा संचार नहीं होता है। मेमोरी और किसी परिधीय के बीच संचार माइक्रोप्रोसेसर संचायक से होकर गुजरता है, और इनमें से एक CIA एडाप्टर (ICs) है। IC को CIA #1 और CIA #2 कहा जाता है। CIA का मतलब कॉम्प्लेक्स इंटरफ़ेस एडॉप्टर है।

प्रत्येक CIA के पास 16 रजिस्टर होते हैं। सीआईए में टाइमर/काउंटर रजिस्टरों के अपवाद के साथ, प्रत्येक रजिस्टर 8-बिट चौड़ा है और इसमें एक मेमोरी एड्रेस है। CIA #1 के लिए मेमोरी रजिस्टर पते $DC00 (56320) से हैं 10 ) से $DC0F (56335 10 ). CIA #2 के लिए मेमोरी रजिस्टर पते $DD00 (56576) से हैं 10 ) से $DD0F (56591 10 ). हालाँकि ये रजिस्टर ICs मेमोरी में नहीं हैं, फिर भी ये मेमोरी का हिस्सा हैं। इंटरमीडिएट मेमोरी मैप में, $D000 से $DFFF तक के I/O क्षेत्र में $DC00 से $DC0F तक और $DD00 से $DD0F तक CIA पते शामिल होते हैं। $D000 से $DFFF तक के अधिकांश RAM I/O मेमोरी क्षेत्र को स्क्रीन कैरेक्टर के लिए कैरेक्टर ROM के मेमोरी बैंक के साथ स्वैप किया जा सकता है। इसीलिए जब पात्रों को स्क्रीन पर भेजा जाता है, तो बाह्य उपकरण काम नहीं कर सकते; हालाँकि उपयोगकर्ता इस पर ध्यान नहीं दे सकता क्योंकि आगे-पीछे की अदला-बदली तेज़ है।

CIA #1 में दो रजिस्टर हैं जिन्हें पोर्ट A और पोर्ट B कहा जाता है। उनके पते क्रमशः $DC00 और $DC01 हैं। सीआईए #2 में पोर्ट ए और पोर्ट बी नामक दो रजिस्टर भी हैं। बेशक, उनके पते अलग-अलग हैं; वे क्रमशः $DD00 और $DD01 हैं।

सीआईए में पोर्ट ए या पोर्ट बी एक समानांतर बंदरगाह है। इसका मतलब यह है कि यह डेटा को एक बार में आठ बिट्स में परिधीय पर भेज सकता है या माइक्रोप्रोसेसर से एक बार में आठ बिट्स में डेटा प्राप्त कर सकता है।

पोर्ट ए या पोर्ट बी से संबद्ध एक डेटा डायरेक्शन रजिस्टर (डीडीआर) है। CIA #1 (DDRA1) के पोर्ट A के लिए डेटा दिशा रजिस्टर $DC02 के मेमोरी बाइट स्थान पर है। CIA #1 (DDRB1) के पोर्ट B के लिए डेटा दिशा रजिस्टर $DC03 के मेमोरी बाइट स्थान पर है। CIA #2 (DDRA2) के पोर्ट A के लिए डेटा डायरेक्शन रजिस्टर $DD02 के मेमोरी बाइट स्थान पर है। CIA #2 (DDRB2) के पोर्ट B के लिए डेटा दिशा रजिस्टर $DD03 के मेमोरी बाइट स्थान पर है।

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

यदि किसी पोर्ट (रजिस्टर) के एक सेल को इनपुट करना है, तो डेटा दिशा रजिस्टर में संबंधित बिट 0 है। यदि किसी पोर्ट (रजिस्टर) के एक सेल को आउटपुट करना है, तो डेटा दिशा रजिस्टर में संबंधित बिट 1 है। ज्यादातर मामलों में, पोर्ट के सभी 8-बिट्स को इनपुट या आउटपुट के रूप में प्रोग्राम किया जाता है। जब कंप्यूटर चालू होता है, तो पोर्ट ए को आउटपुट के लिए प्रोग्राम किया जाता है और पोर्ट बी को इनपुट के लिए प्रोग्राम किया जाता है। निम्नलिखित कोड CIA #1 पोर्ट A को आउटपुट और CIA #1 पोर्ट B को इनपुट बनाता है:

एलडीए #$एफएफ
एसटीए डीडीआरए1; $DC00 का निर्देशन $DC02 द्वारा किया गया है
एलडीए #$00
एसटीए डीडीआरबी1; $DC01 $DC03 द्वारा निर्देशित है

DDRA1 $DC02 के मेमोरी बाइट स्थान के लिए लेबल (परिवर्तनीय नाम) है, और DDRB1 $DC03 के मेमोरी बाइट स्थान के लिए लेबल (परिवर्तनीय नाम) है। पहला निर्देश µP के संचायक पर 111111111 लोड करता है। दूसरा निर्देश इसे सीआईए नंबर के पोर्ट ए के डेटा डायरेक्शन रजिस्टर में कॉपी करता है। 1. तीसरा निर्देश µP के संचायक में 00000000 लोड करता है। चौथा निर्देश इसे सीआईए नंबर के पोर्ट बी के डेटा डायरेक्शन रजिस्टर में कॉपी करता है। 1. यह कोड ऑपरेटिंग सिस्टम के सबरूटीन्स में से एक में है जो कंप्यूटर पावर-अप पर यह आरंभीकरण करता है।

प्रत्येक CIA के पास माइक्रोप्रोसेसर के लिए एक इंटरप्ट सर्विस अनुरोध लाइन होती है। CIA #1 से एक व्यक्ति जाता है आईआरक्यू µP का पिन. CIA #2 से एक व्यक्ति जाता है एनएमआई µP का पिन. उसे याद रखो एनएमआई की तुलना में उच्च प्राथमिकता है आईआरक्यू .

5.3 कीबोर्ड असेंबली भाषा प्रोग्रामिंग

कमोडोर-64 के लिए केवल तीन संभावित व्यवधान हैं: आईआरक्यू , बीआरके, और एनएमआई . जंप टेबल सूचक के लिए आईआरक्यू ROM (ऑपरेटिंग सिस्टम) में $FFFE और $FFFF पते पर है जो OS (ROM) में अभी भी एक सबरूटीन से मेल खाता है। बीआरके के लिए जंप टेबल पॉइंटर ओएस में $FFFC और $FFFD पते पर है जो अभी भी ओएस (ROM) में एक सबरूटीन से मेल खाता है। जंप टेबल सूचक के लिए एनएमआई OS में $FFFA और $FFFB पते पर है जो OS (ROM) में अभी भी एक सबरूटीन से मेल खाता है। के लिए आईआरक्यू , वास्तव में दो सबरूटीन हैं। तो, बीआरके सॉफ्टवेयर इंटरप्ट (निर्देश) का अपना जंप टेबल पॉइंटर है। जंप टेबल सूचक के लिए आईआरक्यू कोड की ओर ले जाता है जो यह तय करता है कि यह हार्डवेयर इंटरप्ट है या सॉफ़्टवेयर इंटरप्ट जो लगा हुआ है। यदि यह हार्डवेयर व्यवधान है, तो इसके लिए रूटीन आईआरक्यू कहा जाता है। यदि यह सॉफ़्टवेयर इंटरप्ट (बीआरके) है, तो बीआरके के लिए रूटीन कहा जाता है। OS संस्करणों में से एक में, सबरूटीन के लिए आईआरक्यू $EA31 पर है और BRK के लिए सबरूटीन $FE66 पर है। ये पते $FF81 से नीचे हैं, इसलिए ये जंप टेबल प्रविष्टियाँ नहीं हैं और ये OS संस्करण के साथ बदल सकते हैं। इस विषय में रुचि के तीन रूटीन हैं: एक जो जांचता है कि यह एक कुंजी दबाई गई है या बीआरके है, एक जो $FE43 पर है, और एक जो ओएस संस्करण के साथ बदल भी सकता है।

कमोडोर-64 कंप्यूटर दिखने में प्रिंटिंग सेक्शन (हेड और पेपर) के बिना एक विशाल टाइप-राइटर (ऊपर की ओर) जैसा है। कीबोर्ड CIA #1 से जुड़ा है। डिफ़ॉल्ट रूप से, CIA #1 बिना किसी प्रोग्रामिंग हस्तक्षेप के प्रत्येक सेकंड के 1/60 मिनट में कीबोर्ड को स्कैन करता है। तो, प्रत्येक 1/60 सेकंड में, CIA #1 एक भेजता है आईआरक्यू μP के लिए. वहां सिर्फ एक ही है आईआरक्यू µP पर पिन करें जो केवल CIA #1 से आता है। का एक इनपुट पिन एनएमआई μP का, जो से भिन्न है आईआरक्यू , केवल सीआईए #2 से आता है (निम्नलिखित चित्रण देखें)। BRK वास्तव में एक असेंबली लैंग्वेज इंस्ट्रक्शन है जिसे यूजर प्रोग्राम में कोड किया जाता है।

तो, हर 1/60 सेकंड में, आईआरक्यू $FFFE और $FFFF द्वारा इंगित रूटीन को कहा जाता है। रूटीन जांच करता है कि कोई कुंजी दबाई गई है या बीआरके निर्देश सामने आया है। यदि किसी कुंजी को दबाया जाता है, तो कुंजी-प्रेस को संभालने की दिनचर्या को कहा जाता है। यदि यह एक बीआरके निर्देश है, तो बीआरके को संभालने की दिनचर्या को कहा जाता है। यदि यह दोनों नहीं है, तो कुछ नहीं होता। दोनों में से कोई भी घटित नहीं हो सकता है, लेकिन CIA #1 भेजता है आईआरक्यू प्रत्येक 1/60 सेकंड में µP तक।

कीबोर्ड कतार, जिसे कीबोर्ड बफ़र के रूप में भी जाना जाता है, $0277 से $0280 तक रैम बाइट स्थानों की एक श्रृंखला है; कुल 1010 बाइट्स. यह फर्स्ट-इन-फर्स्ट-आउट बफर है। इसका मतलब है कि जो किरदार सबसे पहले आता है वही सबसे पहले जाता है। एक पश्चिमी यूरोपीय पात्र एक बाइट लेता है।

इसलिए, जब कुंजी दबाने पर प्रोग्राम किसी भी कैरेक्टर का उपभोग नहीं कर रहा होता है, तो कुंजी कोड इस बफ़र (कतार) में चला जाता है। दस अक्षर होने तक बफ़र भरता रहता है। दसवें अक्षर के बाद दबाया गया कोई भी अक्षर रिकार्ड नहीं होता। इसे तब तक नज़रअंदाज़ किया जाता है जब तक कि कतार से कम से कम एक अक्षर प्राप्त (खपत) न हो जाए। जंप टेबल में एक सबरूटीन के लिए एक प्रविष्टि होती है जो कतार से माइक्रोप्रोसेसर तक पहला अक्षर प्राप्त करती है। इसका मतलब है कि यह उस पहले अक्षर को लेता है जो कतार में जाता है और इसे µP के संचायक में डालता है। ऐसा करने के लिए जंप टेबल सबरूटीन को GETIN (गेट-इन के लिए) कहा जाता है। जंप टेबल में तीन-बाइट प्रविष्टि के लिए पहले बाइट को GETIN (पता $FFE4) के रूप में लेबल किया गया है। अगले दो बाइट्स पॉइंटर (पता) हैं जो ROM (OS) में वास्तविक रूटीन की ओर इशारा करते हैं। इस रूटीन को कॉल करना प्रोग्रामर की ज़िम्मेदारी है। अन्यथा, कीबोर्ड बफ़र भरा रहेगा और हाल ही में दबाई गई सभी कुंजियों को अनदेखा कर दिया जाएगा। संचायक में जाने वाला मान संबंधित कुंजी ASCII मान है।

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

कुंजीपटल बफ़र से संचायक ए में पहला कुंजी कोड प्राप्त करने का कोड केवल एक पंक्ति है:

अंदर आना

यदि कीबोर्ड बफ़र खाली है, तो $00 को संचायक में रखा जाता है। याद रखें कि शून्य के लिए ASCII कोड $00 नहीं है; यह $30 है. $00 का मतलब शून्य है. किसी प्रोग्राम में, एक ऐसा बिंदु हो सकता है जहां प्रोग्राम को कुंजी दबाने के लिए इंतजार करना पड़ता है। इसके लिए कोड है:

जेएसआर गेटिन की प्रतीक्षा करें
सीएमपी #$00
मेंढक रुको

पहली पंक्ति में, 'WAIT' एक लेबल है जो RAM पते की पहचान करता है जहां JSR निर्देश डाला (टाइप किया गया) है। GETIN भी एक पता है। यह जंप टेबल में संबंधित तीन बाइट्स में से पहले का पता है। GETIN प्रविष्टि, साथ ही जंप टेबल की सभी प्रविष्टियाँ (अंतिम तीन को छोड़कर), तीन बाइट्स से बनी होती हैं। प्रविष्टि का पहला बाइट JSR निर्देश है। अगले दो बाइट्स वास्तविक GETIN सबरूटीन के मुख्य भाग का पता हैं जो अभी भी ROM (OS) में है लेकिन जंप टेबल के नीचे है। तो, प्रविष्टि GETIN सबरूटीन पर जाने के लिए कहती है। यदि कीबोर्ड कतार खाली नहीं है, तो GETIN फर्स्ट-इन-फर्स्ट-आउट कतार के ASCII कुंजी कोड को संचायक में डालता है। यदि कतार खाली है, तो शून्य ($00) को संचायक में डाल दिया जाता है।

दूसरा निर्देश संचायक मूल्य की तुलना $00 से करता है। यदि यह $00 है, तो इसका मतलब है कि कीबोर्ड कतार खाली है, और सीएमपी निर्देश प्रोसेसर स्थिति रजिस्टर (केवल स्टेटस रजिस्टर कहा जाता है) के Z ध्वज को 1 भेजता है। यदि A में मान $00 नहीं है, तो CMP निर्देश स्थिति रजिस्टर के Z ध्वज पर 0 भेजता है।

तीसरा निर्देश जो 'BEQ WAIT' है, प्रोग्राम को पहले निर्देश पर वापस भेजता है यदि स्थिति रजिस्टर का Z ध्वज 1 है। पहला, दूसरा और तीसरा निर्देश तब तक बार-बार निष्पादित किया जाता है जब तक कि कीबोर्ड पर एक कुंजी नहीं दबाई जाती है। . यदि कोई कुंजी कभी नहीं दबाई जाती है, तो चक्र अनिश्चित काल तक दोहराता रहता है। इस तरह का एक कोड सेगमेंट आम तौर पर एक टाइमिंग कोड सेगमेंट के साथ लिखा जाता है जो कुछ समय के बाद लूप को छोड़ देता है यदि कोई कुंजी कभी नहीं दबाई जाती है (निम्नलिखित चर्चा देखें)।

टिप्पणी : कीबोर्ड डिफ़ॉल्ट इनपुट डिवाइस है और स्क्रीन डिफ़ॉल्ट आउटपुट डिवाइस है।

5.4 चैनल, डिवाइस नंबर और लॉजिकल फ़ाइल नंबर

यह अध्याय कमोडोर-64 ऑपरेटिंग सिस्टम को समझाने के लिए जिन परिधीय उपकरणों का उपयोग करता है वे हैं कीबोर्ड, स्क्रीन (मॉनिटर), डिस्केट के साथ डिस्क ड्राइव, प्रिंटर और मॉडेम जो आरएस-232सी इंटरफेस के माध्यम से जुड़ता है। इन उपकरणों और सिस्टम यूनिट (माइक्रोप्रोसेसर और मेमोरी) के बीच संचार के लिए एक चैनल स्थापित करना होगा।

एक चैनल में एक बफर, डिवाइस नंबर, एक तार्किक फ़ाइल नंबर और वैकल्पिक रूप से एक द्वितीयक पता होता है। इन शर्तों की व्याख्या इस प्रकार है:

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

उपकरण संख्या
कमोडोर-64 के साथ, किसी भी परिधीय को एक उपकरण संख्या के साथ दिया जाता है। निम्न तालिका विभिन्न उपकरणों और उनकी संख्या को दर्शाती है:

तालिका 5.41
कमोडोर 64 डिवाइस नंबर और उनके डिवाइस
संख्या उपकरण
0 कीबोर्ड
1 टेप ड्राइव
2 उदाहरण के लिए RS 232C इंटरफ़ेस एक मॉडेम
3 स्क्रीन
4 प्रिंटर #1
5 प्रिंटर #2
6 प्लॉटर #1
7 प्लॉटर #2
8 डिस्क ड्राइव
9
¦
¦
¦
30
8 (समावेशी) से लेकर 22 अधिक स्टोरेज डिवाइस तक

कंप्यूटर के लिए दो प्रकार के पोर्ट होते हैं। एक प्रकार बाहरी है, सिस्टम यूनिट की ऊर्ध्वाधर सतह पर। दूसरा प्रकार आंतरिक है. यह आंतरिक पोर्ट एक रजिस्टर है. कमोडोर-64 में चार आंतरिक बंदरगाह हैं: सीआईए 1 के लिए पोर्ट ए और पोर्ट बी और सीआईए 2 के लिए पोर्ट ए और पोर्ट बी। कमोडोर-64 के लिए एक बाहरी बंदरगाह है जिसे सीरियल पोर्ट कहा जाता है। ऊपर की ओर 3 नंबर वाले डिवाइस सीरियल पोर्ट से जुड़े होते हैं। वे एक डेज़ी श्रृंखला फैशन में जुड़े हुए हैं (एक जो दूसरे के पीछे जुड़ा हुआ है), जिनमें से प्रत्येक को उसके डिवाइस नंबर से पहचाना जा सकता है। ऊपर की ओर 8 अंक वाले उपकरण आम तौर पर स्टोरेज डिवाइस होते हैं।

टिप्पणी : डिफ़ॉल्ट इनपुट डिवाइस 0 की डिवाइस संख्या वाला कीबोर्ड है। डिफ़ॉल्ट आउटपुट डिवाइस 3 की डिवाइस संख्या वाली स्क्रीन है।

तार्किक फ़ाइल संख्या
एक तार्किक फ़ाइल संख्या एक डिवाइस (परिधीय) के लिए उस क्रम में दी गई संख्या है जिसमें उन्हें एक्सेस के लिए खोला जाता है। इनकी रेंज 010 से 255 तक है 10 .

द्वितीयक पता
कल्पना कीजिए कि डिस्क में दो फ़ाइलें (या एक से अधिक फ़ाइलें) खोली गई हैं। इन दोनों फ़ाइलों के बीच अंतर करने के लिए द्वितीयक पतों का उपयोग किया जाता है। द्वितीयक पते वे संख्याएँ हैं जो अलग-अलग डिवाइस में भिन्न-भिन्न होती हैं। प्रिंटर के लिए द्वितीयक पते के रूप में 3 का अर्थ डिस्क ड्राइव के लिए द्वितीयक पते के रूप में 3 के अर्थ से भिन्न है। अर्थ इस बात पर निर्भर करता है कि कब कोई फ़ाइल पढ़ने के लिए खोली जाती है या कब कोई फ़ाइल लिखने के लिए खोली जाती है। संभावित द्वितीयक संख्याएँ 0 से हैं 10 से 15 10 प्रत्येक डिवाइस के लिए. कई उपकरणों के लिए, संख्या 15 का उपयोग कमांड भेजने के लिए किया जाता है।

टिप्पणी : डिवाइस नंबर को डिवाइस एड्रेस और सेकेंडरी नंबर को सेकेंडरी एड्रेस भी कहा जाता है।

एक परिधीय लक्ष्य की पहचान करना
डिफ़ॉल्ट कमोडोर मेमोरी मैप के लिए, $0200 से $02FF (पेज 2) तक के मेमोरी एड्रेस का उपयोग केवल ROM (कर्नल) में ऑपरेटिंग सिस्टम द्वारा किया जाता है, न कि ऑपरेटिंग सिस्टम और बेसिक भाषा द्वारा। हालाँकि BASIC अभी भी ROM OS के माध्यम से स्थानों का उपयोग कर सकता है।

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

$0259 - $0262: अधिकतम दस सक्रिय तार्किक फ़ाइल संख्याओं के लेबल, LAT के साथ तालिका।
$0263 - $026सी: अधिकतम दस संबंधित डिवाइस नंबरों के लेबल, एफएटी के साथ तालिका।
$026डी - $0276: दस संगत द्वितीयक पतों के लेबल, एसएटी के साथ तालिका।

यहां, '-' का अर्थ 'से' है, और एक संख्या एक बाइट लेती है।

पाठक पूछ सकते हैं, 'चैनल की पहचान में प्रत्येक डिवाइस के लिए बफर को शामिल क्यों नहीं किया जाता है?' खैर, इसका उत्तर यह है कि कमोडोर-64 के साथ, प्रत्येक बाहरी उपकरण (परिधीय) में रैम (मेमोरी मैप) में बाइट्स की एक निश्चित श्रृंखला होती है। बिना किसी खुले चैनल के, उनकी स्थिति अभी भी स्मृति में मौजूद है। उदाहरण के लिए, कीबोर्ड के लिए बफर डिफ़ॉल्ट मेमोरी मैप के लिए $0277 से $0280 (समावेशी) तक तय किया गया है।

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

SETLFS रूटीन को कॉल करने के लिए, उपयोगकर्ता प्रोग्राम को डिफ़ॉल्ट मेमोरी मैप के लिए ROM में OS के जंप टेबल के $FFBA पते पर जंप (JSR) करना होगा। याद रखें कि जंप टेबल के अंतिम छह बाइट्स को छोड़कर, प्रत्येक प्रविष्टि में तीन बाइट्स होते हैं। पहला बाइट जेएसआर निर्देश है, जो फिर सबरूटीन पर चला जाता है, अगले दो बाइट्स में पते पर शुरू होता है। SETNAM रूटीन को कॉल करने के लिए, उपयोगकर्ता प्रोग्राम को ROM में OS के जंप टेबल के $FFBD पते पर जंप (JSR) करना होगा। इन दो दिनचर्याओं का उपयोग निम्नलिखित चर्चा में दिखाया गया है।

5.5 एक चैनल खोलना, एक लॉजिकल फ़ाइल खोलना, एक लॉजिकल फ़ाइल को बंद करना, और सभी I/O चैनल बंद करना

एक चैनल में एक मेमोरी बफ़र, एक तार्किक फ़ाइल नंबर, डिवाइस नंबर (डिवाइस पता), और एक वैकल्पिक माध्यमिक पता (एक नंबर) होता है। एक तार्किक फ़ाइल (एक अमूर्त) जिसे एक तार्किक फ़ाइल संख्या द्वारा पहचाना जाता है, एक परिधीय जैसे प्रिंटर, एक मॉडेम, एक डिस्क ड्राइव इत्यादि को संदर्भित कर सकती है। इन विभिन्न उपकरणों में से प्रत्येक में अलग-अलग तार्किक फ़ाइल संख्याएं होनी चाहिए। डिस्क में कई फ़ाइलें हैं. एक तार्किक फ़ाइल डिस्क में किसी विशेष फ़ाइल को भी संदर्भित कर सकती है। उस विशेष फ़ाइल में एक तार्किक फ़ाइल संख्या भी होती है जो प्रिंटर या मॉडेम जैसे बाह्य उपकरणों से भिन्न होती है। तार्किक फ़ाइल संख्या प्रोग्रामर द्वारा दी जाती है। यह 010 ($00) से 25510 ($FF) तक कोई भी संख्या हो सकती है।

ओएस SETLFS रूटीन
OS SETLFS रूटीन जिसे $FFBA पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है, चैनल सेट करता है। इसे फ़ाइल तालिका में तार्किक फ़ाइल संख्या डालने की आवश्यकता है जो LAT ($0259 - $0262) है। इसे संबंधित डिवाइस नंबर को फ़ाइल तालिका में डालना होगा जो कि FAT ($0263 - $026C) है। यदि फ़ाइल (डिवाइस) एक्सेस के लिए एक द्वितीयक संख्या की आवश्यकता होती है, तो उसे फ़ाइल तालिका में संबंधित द्वितीयक पता (संख्या) डालने की आवश्यकता होती है जो SAT ($026D - $0276) है।

संचालित करने के लिए, SETLFS सबरूटीन को µP संचायक से तार्किक फ़ाइल संख्या प्राप्त करने की आवश्यकता होती है; इसे µP X रजिस्टर से डिवाइस नंबर प्राप्त करने की आवश्यकता है। यदि चैनल को आवश्यकता हो, तो उसे µP Y रजिस्टर से द्वितीयक पता प्राप्त करना होगा।

तार्किक फ़ाइल संख्या प्रोग्रामर द्वारा तय की जाती है। विभिन्न डिवाइसों को संदर्भित करने वाली तार्किक फ़ाइल संख्याएँ भिन्न होती हैं। अब, SETLFS रूटीन को कॉल करने से पहले, प्रोग्रामर को लॉजिकल फ़ाइल के लिए नंबर को µP संचायक में डालना चाहिए। डिवाइस नंबर को तालिका (दस्तावेज़) से पढ़ा जाता है जैसे तालिका 5.41 में। प्रोग्रामर को डिवाइस नंबर को µP X रजिस्टर में भी डालना होगा। किसी डिवाइस जैसे प्रिंटर, डिस्क ड्राइव आदि के लिए आपूर्तिकर्ता डिवाइस के लिए संभावित द्वितीयक पते और उनके अर्थ प्रदान करता है। यदि चैनल को द्वितीयक पते की आवश्यकता है, तो प्रोग्रामर को इसे डिवाइस (परिधीय) के साथ आपूर्ति किए गए दस्तावेज़ से प्राप्त करना होगा। यदि द्वितीयक पता (नंबर) आवश्यक है, तो प्रोग्रामर को SETLFS सबरूटीन को कॉल करने से पहले इसे µP Y रजिस्टर में डालना होगा। यदि द्वितीयक पते की कोई आवश्यकता नहीं है, तो प्रोग्रामर को SETLFS सबरूटीन को कॉल करने से पहले $FF नंबर को µP Y रजिस्टर में डालना होगा।

SETLFS सबरूटीन को बिना किसी तर्क के कॉल किया जाता है। इसके तर्क पहले से ही 6502 µP के तीन रजिस्टरों में हैं। उचित संख्याओं को रजिस्टरों में डालने के बाद, प्रोग्राम में रूटीन को एक अलग पंक्ति में निम्नलिखित के साथ बुलाया जाता है:

जेएसआर सेट्ल्स

रूटीन विभिन्न संख्याओं को उनकी फ़ाइल तालिकाओं में उचित रूप से रखता है।

ओएस सेटनाम रूटीन
OS SETNAM रूटीन को $FFBD पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। सभी गंतव्यों में फ़ाइल नाम नहीं होते हैं. जिनके पास गंतव्य हैं (जैसे डिस्क में फ़ाइलें), फ़ाइल नाम सेट किया जाना चाहिए। मान लें कि फ़ाइल का नाम 'mydocum' है जिसमें बिना उद्धरण के 7 बाइट्स हैं। मान लें कि यह नाम $C101 से $C107 स्थानों पर है (सम्मिलित) और $07 की लंबाई $C100 स्थान पर है। स्ट्रिंग वर्णों का प्रारंभ पता $C101 है। प्रारंभ पते का निचला बाइट $01 है और उच्च बाइट $C1 है।

SETNAM रूटीन को कॉल करने से पहले, प्रोग्रामर को $07 (स्ट्रिंग की लंबाई) संख्या को µP संचायक में डालना होगा। $01 के स्ट्रिंग शुरुआती पते का निचला बाइट µP X रजिस्टर में डाला गया है। $C1 के स्ट्रिंग शुरुआती पते का उच्च बाइट µP Y रजिस्टर में डाला गया है। सबरूटीन को बस निम्नलिखित के साथ कहा जाता है:

जेएसआर सेटनम

SETNAM रूटीन तीन रजिस्टरों के मानों को चैनल के साथ जोड़ता है। उसके बाद मूल्यों को रजिस्टरों में रहने की आवश्यकता नहीं है। यदि चैनल को फ़ाइल नाम की आवश्यकता नहीं है, तो प्रोग्रामर को µP संचायक में $00 डालना होगा। इस स्थिति में, X और Y रजिस्टर में मौजूद मानों को अनदेखा कर दिया जाता है।

ओएस ओपन रूटीन
OS OPEN रूटीन को $FFC0 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। यह रूटीन कमोडोर कंप्यूटर और बाहरी डिवाइस या बाहरी डिवाइस में फ़ाइल के बीच कनेक्शन प्रदान करने के लिए तार्किक फ़ाइल नंबर, डिवाइस नंबर (और बफर), एक संभावित माध्यमिक पता और एक संभावित फ़ाइल नाम का उपयोग करता है।

यह रूटीन, अन्य सभी कमोडोर OS ROM रूटीन की तरह, कोई तर्क नहीं लेता है। हालाँकि यह µP रजिस्टरों का उपयोग करता है, लेकिन इसके लिए किसी भी रजिस्टर को तर्कों (मानों) के साथ पहले से लोड नहीं करना पड़ा। इसे कोड करने के लिए, SETLFS और SETNAM को कॉल करने के बाद बस निम्नलिखित टाइप करें:

जेएसआर खुला

ओपन रूटीन में त्रुटियाँ हो सकती हैं। उदाहरण के लिए, फ़ाइल पढ़ने के लिए नहीं मिल सकती है। जब कोई त्रुटि होती है, तो रूटीन विफल हो जाता है और संबंधित त्रुटि संख्या को µP संचायक में डाल देता है, और µP स्थिति रजिस्टर के कैरी फ़्लैग (1 पर) सेट कर देता है। निम्न तालिका त्रुटि संख्याएँ और उनके अर्थ प्रदान करती है:

तालिका 5.51
OS ROM ओपन रूटीन के लिए कर्नेल त्रुटि संख्याएँ और उनके अर्थ
त्रुटि क्रमांक विवरण उदाहरण
1 बहुत सारी फ़ाइलें तब खोलें जब दस फ़ाइलें पहले से ही खुली हों
2 फ़ाइल खुली खुला 1,3: खुला 1,4
3 फ़ाइल नहीं खुली #5 बिना खोले प्रिंट करें
4 फ़ाइल प्राप्त नहीं हुई लोड करें 'NONEXISTENF',8
5 डिवाइस मौजूद नहीं है खुला 11,11: प्रिंट#11
6 फ़ाइल इनपुट नहीं 'SEQ,S,W' खोलें: #8,X$ प्राप्त करें
7 फ़ाइल आउटपुट नहीं खुला 1,0: प्रिंट#1
8 गुम फ़ाइलनाम लोड '',8
9 अवैध डिवाइस नं. 'प्रोग्राम' लोड करें,3

यह तालिका इस प्रकार प्रस्तुत की गई है कि पाठक इसे कई अन्य स्थानों पर भी देख सकेंगे।

ओएस च्किन रूटीन
OS CHKIN रूटीन को $FFC6 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। किसी फाइल (लॉजिकल फाइल) को खोलने के बाद यह तय करना होता है कि ओपनिंग इनपुट के लिए है या आउटपुट के लिए। CHKIN रूटीन ओपनिंग को एक इनपुट चैनल बनाता है। इस रूटीन को µP X रजिस्टर से तार्किक फ़ाइल संख्या को पढ़ने की आवश्यकता है। इसलिए, प्रोग्रामर को इस रूटीन को कॉल करने से पहले लॉजिकल फ़ाइल नंबर को एक्स रजिस्टर में डालना होगा। इसे बस इस प्रकार कहा जाता है:

जेएसआर चकिन

ओएस चॉकआउट रूटीन
OS CHKOUT रूटीन को $FFC9 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। किसी फाइल (लॉजिकल फाइल) को खोलने के बाद यह तय करना होता है कि ओपनिंग इनपुट के लिए है या आउटपुट के लिए। CHKOUT रूटीन ओपनिंग को एक आउटपुट चैनल बनाता है। इस रूटीन को µP X रजिस्टर से तार्किक फ़ाइल संख्या को पढ़ने की आवश्यकता है। इसलिए, प्रोग्रामर को इस रूटीन को कॉल करने से पहले लॉजिकल फ़ाइल नंबर को एक्स रजिस्टर में डालना होगा। इसे बस इस प्रकार कहा जाता है:

जेएसआर चकोट

ओएस बंद दिनचर्या
OS CLOSE रूटीन को $FFC3 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। तार्किक फ़ाइल खुलने और बाइट्स प्रसारित होने के बाद, तार्किक फ़ाइल को बंद करना होगा। तार्किक फ़ाइल को बंद करने से सिस्टम यूनिट में बफ़र किसी अन्य तार्किक फ़ाइल द्वारा उपयोग के लिए मुक्त हो जाता है जिसे अभी भी खोला जाना है। तीन फ़ाइल तालिकाओं में संबंधित पैरामीटर भी हटा दिए गए हैं। खुली हुई फाइलों की संख्या के लिए रैम स्थान को 1 से घटा दिया गया है।

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

किसी तार्किक फ़ाइल को बंद करने के लिए, प्रोग्रामर को तार्किक फ़ाइल संख्या को µP संचायक में डालना होगा। यह वही तार्किक फ़ाइल संख्या है जिसका उपयोग फ़ाइल खोलने में किया जाता है। उस विशेष फ़ाइल को बंद करने के लिए CLOSE रूटीन को इसकी आवश्यकता होती है। अन्य OS ROM रूटीन की तरह, CLOSE रूटीन कोई तर्क नहीं लेता है, हालाँकि संचायक से उपयोग किया जाने वाला मान कुछ हद तक एक तर्क है। असेंबली भाषा अनुदेश पंक्ति सरलता से है:

जेएसआर बंद

कस्टम या पूर्वनिर्धारित 6502 असेंबली भाषा सबरूटीन्स (रूटीन) तर्क नहीं लेते हैं। हालाँकि, तर्क अनौपचारिक रूप से उन मानों को डालकर आते हैं जिनका उपयोग सबरूटीन माइक्रोप्रोसेसर रजिस्टरों में करेगा।

सीएलआरसीएचएन रूटीन
OS CLRCHN रूटीन को $FFCC पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। CLRCHN का मतलब क्लियर चैनल है। जब कोई तार्किक फ़ाइल बंद हो जाती है, तो उसके तार्किक फ़ाइल नंबर, डिवाइस नंबर और संभावित द्वितीयक पते के पैरामीटर हटा दिए जाते हैं। तो, तार्किक फ़ाइल के लिए चैनल साफ़ हो गया है।

मैनुअल कहता है कि ओएस सीएलआरसीएचएन रूटीन सभी खुले चैनलों को साफ़ करता है और डिफ़ॉल्ट डिवाइस नंबर और अन्य डिफ़ॉल्ट को पुनर्स्थापित करता है। क्या इसका मतलब यह है कि परिधीय के लिए डिवाइस नंबर बदला जा सकता है? ख़ैर, बिलकुल नहीं। ऑपरेटिंग सिस्टम आरंभीकरण के दौरान, $0099 पते का बाइट स्थान कंप्यूटर के संचालन के दौरान वर्तमान इनपुट डिवाइस नंबर को रखने के लिए DFLTI लेबल के साथ दिया जाता है। कमोडोर-64 एक समय में केवल एक परिधीय तक पहुंच सकता है। ऑपरेटिंग सिस्टम आरंभीकरण के दौरान, $009A पते का बाइट स्थान कंप्यूटर के संचालन के दौरान वर्तमान आउटपुट डिवाइस नंबर को रखने के लिए DFLTO लेबल के साथ दिया जाता है।

जब CLRCHN सबरूटीन को कॉल किया जाता है, तो यह DFLTI वेरिएबल को 0 ($00) पर सेट करता है जो कि डिफ़ॉल्ट इनपुट डिवाइस नंबर (कीबोर्ड) है। यह DFLTO वेरिएबल को 3 ($03) पर सेट करता है जो कि डिफ़ॉल्ट आउटपुट डिवाइस नंबर (स्क्रीन) है। अन्य डिवाइस नंबर वेरिएबल भी इसी तरह रीसेट किए जाते हैं। इनपुट/आउटपुट डिवाइस को सामान्य (डिफ़ॉल्ट मान) पर रीसेट करने (या पुनर्स्थापित करने) का यही अर्थ है।

कमोडोर-64 मैनुअल कहता है कि सीएलआरसीएचएन रूटीन को कॉल करने के बाद, खुली हुई तार्किक फाइलें खुली रहती हैं और अभी भी बाइट्स (डेटा) संचारित कर सकती हैं। इसका मतलब यह है कि CLRCHN रूटीन फ़ाइल तालिकाओं में संबंधित प्रविष्टियों को नहीं हटाता है। सीएलआरसीएचएन नाम अपने अर्थ के कारण काफी अस्पष्ट है।

5.6 चरित्र को स्क्रीन पर भेजना

स्क्रीन पर पात्रों और ग्राफिक्स के प्रदर्शन को संभालने के लिए मुख्य एकीकृत सर्किट (आईसी) को वीडियो इंटरफ़ेस नियंत्रक (चिप) कहा जाता है जिसे कमोडोर -64 में वीआईसी के रूप में संक्षिप्त किया गया है (वास्तव में वीआईसी संस्करण 2 के लिए वीआईसी II)। किसी सूचना (मान) को स्क्रीन पर जाने के लिए, उसे स्क्रीन तक पहुंचने से पहले VIC II से गुजरना पड़ता है।

स्क्रीन में कैरेक्टर सेल की 25 पंक्तियाँ और 40 कॉलम होते हैं। इससे 40 x 25 = 1000 अक्षर बन जाते हैं जिन्हें स्क्रीन पर प्रदर्शित किया जा सकता है। VIC II वर्णों के लिए संगत 1000 मेमोरी रैम लगातार बाइट स्थानों को पढ़ता है। इन 1000 स्थानों को एक साथ स्क्रीन मेमोरी के रूप में जाना जाता है। इन 1000 स्थानों में जो जाता है वह वर्ण कोड हैं। कमोडोर-64 के लिए, वर्ण कोड ASCII कोड से भिन्न हैं।

एक वर्ण कोड कोई वर्ण पैटर्न नहीं है. इसे कैरेक्टर ROM के नाम से भी जाना जाता है। कैरेक्टर ROM में सभी प्रकार के कैरेक्टर पैटर्न होते हैं, जिनमें से कुछ कीबोर्ड पर कैरेक्टर पैटर्न से मेल खाते हैं। कैरेक्टर ROM स्क्रीन मेमोरी से भिन्न है। जब किसी कैरेक्टर को स्क्रीन पर प्रदर्शित करना होता है, तो कैरेक्टर कोड को स्क्रीन मेमोरी की 1000 स्थितियों में से एक स्थिति में भेजा जाता है। वहां से, कैरेक्टर ROM से संबंधित पैटर्न का चयन किया जाता है जिसे स्क्रीन पर प्रदर्शित किया जाना है। कैरेक्टर कोड से कैरेक्टर ROM में सही पैटर्न का चयन VIC II (हार्डवेयर) द्वारा किया जाता है।

$D000 और $DFFF के बीच कई मेमोरी स्थानों के दो उद्देश्य होते हैं: उनका उपयोग स्क्रीन के अलावा अन्य इनपुट/आउटपुट संचालन को संभालने के लिए किया जाता है या स्क्रीन के लिए कैरेक्टर ROM के रूप में उपयोग किया जाता है। स्मृति के दो खंडों का संबंध है। एक है RAM और दूसरा है ROM for कैरेक्टर ROM. इनपुट/आउटपुट या कैरेक्टर पैटर्न (कैरेक्टर ROM) को संभालने के लिए बैंकों की अदला-बदली सॉफ्टवेयर द्वारा की जाती है (ROM में OS की रूटीन $F000 से $FFFF तक)।

टिप्पणी : वीआईसी में रजिस्टर हैं जिन्हें $D000 और $DFFF की सीमा के भीतर मेमोरी स्पेस के पते से संबोधित किया जाता है।

क्रॉउट रूटीन
OS CHROUT रूटीन को $FFD2 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। यह रूटीन, जब कॉल किया जाता है, वह बाइट लेता है जिसे प्रोग्रामर ने µP संचायक में डाला है और स्क्रीन पर प्रिंट करता है जहां कर्सर है। उदाहरण के लिए, 'ई' अक्षर को प्रिंट करने के लिए कोड खंड है:

एलडीए #$05
चरौट

0516 'E' के लिए ASCII कोड नहीं है। कमोडोर-64 के स्क्रीन के लिए अपने स्वयं के वर्ण कोड हैं जहां $05 का अर्थ 'ई' है। VIC द्वारा स्क्रीन पर भेजने से पहले #$05 नंबर को स्क्रीन मेमोरी में रखा जाता है। ये दो कोडिंग लाइनें चैनल सेटअप के बाद आनी चाहिए, लॉजिकल फ़ाइल खोली जाती है, और आउटपुट के लिए CHKOUT रूटीन को कॉल किया जाता है। पूरा कोड है:

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$03 ; स्क्रीन के लिए डिवाइस नंबर $03 है
LDY #$FF ; कोई द्वितीयक पता नहीं
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
; कोई SETNAM नहीं क्योंकि स्क्रीन को किसी नाम की आवश्यकता नहीं है
;
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; आउटपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकोट
;
; स्क्रीन पर आउटपुट चार
एलडीए #$05
जेएसआर क्रॉउट
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद

किसी अन्य कार्यक्रम को चलाने से पहले उद्घाटन बंद कर देना चाहिए। मान लें कि कंप्यूटर उपयोगकर्ता अपेक्षित होने पर कीबोर्ड पर एक अक्षर टाइप करता है। निम्नलिखित प्रोग्राम कीबोर्ड से स्क्रीन पर एक अक्षर प्रिंट करता है:

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$03 ; स्क्रीन के लिए डिवाइस नंबर $03 है
LDY #$FF ; कोई द्वितीयक पता नहीं
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
; कोई SETNAM नहीं क्योंकि स्क्रीन को किसी नाम की आवश्यकता नहीं है
;
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; आउटपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकोट
;
; कीबोर्ड से इनपुट चार
प्रतीक्षा करें जेएसआर गेटिन; यदि कीबोर्ड कतार खाली है तो A में $00 डालता है
सीएमपी #$00 ; यदि $00 A के पास गया, तो तुलना के साथ Z 1 है
BEQ प्रतीक्षा करें; यदि 0 संचायक पर गया तो कतार से पुनः प्राप्त करें
बीएनई पीआरएनएससीआरएन; यदि Z 0 है तो PRNSCRN पर जाएं, क्योंकि A के पास अब $00 नहीं है
; स्क्रीन पर आउटपुट चार
पीआरएनएससीआरएन जेएसआर चाउट; ए में वर्ण को स्क्रीन पर भेजें
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद

टिप्पणी : WAIT और PRNSCRN वे लेबल हैं जो पते की पहचान करते हैं। कीबोर्ड से μP संचायक में आने वाली बाइट एक ASCII कोड है। कमोडोर-64 द्वारा स्क्रीन पर भेजा जाने वाला संबंधित कोड अलग होना चाहिए। सरलता के लिए पिछले कार्यक्रम में इस पर ध्यान नहीं दिया गया है।

5.7 डिस्क ड्राइव के लिए बाइट्स भेजना और प्राप्त करना

कमोडोर-64 के सिस्टम यूनिट (मदरबोर्ड) में दो कॉम्प्लेक्स इंटरफ़ेस एडेप्टर हैं जिन्हें VIA #1 और CIA #2 कहा जाता है। प्रत्येक CIA में दो समानांतर पोर्ट होते हैं जिन्हें पोर्ट A और पोर्ट B कहा जाता है। कमोड्रे-64 सिस्टम यूनिट के पीछे ऊर्ध्वाधर सतह पर एक बाहरी पोर्ट होता है जिसे सीरियल पोर्ट कहा जाता है। इस पोर्ट में 6 पिन हैं, जिनमें से एक डेटा के लिए है। डेटा एक समय में एक बिट, श्रृंखला में सिस्टम यूनिट में प्रवेश करता है या छोड़ता है।

उदाहरण के लिए, CIA #2 के आंतरिक पोर्ट A से आठ समानांतर बिट्स, CIA में शिफ्ट रजिस्टर द्वारा सीरियल डेटा में परिवर्तित होने के बाद बाहरी सीरियल पोर्ट के माध्यम से सिस्टम यूनिट से बाहर जा सकते हैं। बाहरी सीरियल पोर्ट से आठ-बिट सीरियल डेटा सीआईए में एक शिफ्ट रजिस्टर द्वारा समानांतर डेटा में परिवर्तित होने के बाद सीआईए # 2 के आंतरिक पोर्ट ए में जा सकता है।

कमोडोर-64 सिस्टम यूनिट (बेस यूनिट) एक डिस्केट के साथ एक बाहरी डिस्क ड्राइव का उपयोग करती है। एक प्रिंटर को डेज़ी चेन फैशन में इस डिस्क ड्राइव से जोड़ा जा सकता है (स्ट्रिंग के रूप में श्रृंखला में उपकरणों को जोड़ना)। डिस्क ड्राइव के लिए डेटा केबल कमोडोर-64 सिस्टम यूनिट के बाहरी सीरियल पोर्ट से जुड़ा है। इसका मतलब यह है कि डेज़ी-चेन प्रिंटर भी उसी सीरियल पोर्ट से जुड़ा हुआ है। इन दो डिवाइसों को दो अलग-अलग डिवाइस नंबरों (आमतौर पर क्रमशः 8 और 4) द्वारा पहचाना जाता है।

डिस्क ड्राइव के लिए डेटा भेजना या प्राप्त करना पहले वर्णित समान प्रक्रिया का पालन करता है। वह है:

  • तार्किक फ़ाइल (संख्या) का नाम सेट करना जो SETNAM रूटीन का उपयोग करके वास्तविक डिस्क फ़ाइल के समान है।
  • OPEN रूटीन का उपयोग करके तार्किक फ़ाइल खोलना।
  • CHKOUT या CHKIN रूटीन का उपयोग करके यह निर्णय लेना कि यह इनपुट है या आउटपुट।
  • एसटीए और/या एलडीए निर्देश का उपयोग करके डेटा भेजना या प्राप्त करना।
  • CLOSE रूटीन का उपयोग करके तार्किक फ़ाइल को बंद करना।

तार्किक फ़ाइल बंद होनी चाहिए. तार्किक फ़ाइल को बंद करने से वह विशेष चैनल प्रभावी रूप से बंद हो जाता है। डिस्क ड्राइव के लिए चैनल सेट करते समय, तार्किक फ़ाइल संख्या प्रोग्रामर द्वारा तय की जाती है। यह $00 और $FF (समावेशी) के बीच की एक संख्या है। यह वह संख्या नहीं होनी चाहिए जो पहले से ही किसी अन्य डिवाइस (या वास्तविक फ़ाइल) के लिए चुनी गई हो। यदि केवल एक डिस्क ड्राइव है तो डिवाइस संख्या 8 है। द्वितीयक पता (संख्या) डिस्क ड्राइव के मैनुअल से प्राप्त किया जाता है। निम्नलिखित प्रोग्राम 2 का उपयोग करता है। प्रोग्राम 'mydoc.doc' नामक डिस्क में एक फ़ाइल में 'E' (ASCII) अक्षर लिखता है। यह नाम $C101 के मेमोरी पते से शुरू माना जाता है। तो, SETNAM रूटीन को कॉल करने से पहले $01 की निचली बाइट को X रजिस्टर में और $C1 की ऊंची बाइट को Y रजिस्टर में होना चाहिए। SETNAM रूटीन को कॉल करने से पहले A रजिस्टर में $09 नंबर भी होना चाहिए।

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$08 ; प्रथम डिस्क ड्राइव के लिए डिवाइस नंबर
एलडीवाई #$02 ; द्वितीयक पता
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
;
; डिस्क ड्राइव में फ़ाइल को एक नाम की आवश्यकता है (पहले से ही मेमोरी में)
एलडीए #$09
एलडीएक्स #$01
एलडीवाई#$सी1
जेएसआर सेटनम
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; आउटपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकोट; लिखने के लिए
;
; डिस्क पर आउटपुट चार
एलडीए #$45
जेएसआर क्रॉउट
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद

डिस्क से μP Y रजिस्टर में एक बाइट पढ़ने के लिए, पिछले प्रोग्राम को निम्नलिखित परिवर्तनों के साथ दोहराएं: 'JSR CHKOUT' के बजाय; लिखने के लिए', 'JSR CHKIN' का उपयोग करें; पढ़ने के लिए'। कोड खंड को “;” के लिए बदलें। निम्नलिखित के साथ डिस्क पर आउटपुट चार:

; डिस्क से इनपुट चार
जेएसआर क्रिस

OS CHRIN रूटीन को $FFCF पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। यह रूटीन, जब कॉल किया जाता है, एक चैनल से एक बाइट प्राप्त करता है जो पहले से ही एक इनपुट चैनल के रूप में सेट है और इसे µP A रजिस्टर में डालता है। GETIN ROM OS रूटीन का उपयोग CHRIN के स्थान पर भी किया जा सकता है।

प्रिंटर को एक बाइट भेजना
प्रिंटर पर बाइट भेजना डिस्क में किसी फ़ाइल पर बाइट भेजने के समान ही किया जाता है।

5.8 ओएस सेव रूटीन

OS SAVE रूटीन को $FFD8 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। ROM में OS SAVE रूटीन मेमोरी के एक सेक्शन को एक फ़ाइल (एक नाम के साथ) के रूप में डिस्क पर सेव (डंप) करता है। मेमोरी में अनुभाग का प्रारंभ पता जानना होगा। अनुभाग का अंतिम पता भी जानना होगा. प्रारंभ पते का निचला बाइट $002B पते पर रैम में पृष्ठ शून्य पर रखा गया है। प्रारंभ पते का उच्च बाइट अगले बाइट मेमोरी स्थान पर $002C पते पर रखा जाता है। पृष्ठ शून्य में, TXTTAB लेबल इन दो पतों को संदर्भित करता है, हालाँकि TXTTAB का वास्तव में अर्थ $002B पता है। अंतिम पते का निचला बाइट µP X रजिस्टर में रखा गया है। अंतिम पते का उच्च बाइट प्लस 1 µP Y रजिस्टर में रखा गया है। µP A रजिस्टर TXTTAB ($002B) के लिए $2B का मान लेता है। इसके साथ, सेव रूटीन को निम्नलिखित के साथ बुलाया जा सकता है:

जेएसआर सेव

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

  • SETLFS रूटीन का उपयोग करके चैनल सेट करें।
  • तार्किक फ़ाइल (संख्या) का नाम सेट करें जो SETNAM रूटीन का उपयोग करके वास्तविक डिस्क फ़ाइल के समान है।
  • OPEN रूटीन का उपयोग करके तार्किक फ़ाइल खोलें।
  • इसे CHKOUT का उपयोग करके आउटपुट के लिए फ़ाइल बनाएं।
  • फ़ाइल को सहेजने के लिए कोड यहां दिया गया है जो 'JSR SAVE' के साथ समाप्त होता है।
  • CLOSE रूटीन का उपयोग करके तार्किक फ़ाइल को बंद करें।

निम्नलिखित प्रोग्राम एक फ़ाइल को सहेजता है जो $C101 से $C200 के मेमोरी स्थानों से शुरू होती है:

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$08 ; प्रथम डिस्क ड्राइव के लिए डिवाइस नंबर
एलडीवाई #$02 ; द्वितीयक पता
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
;
; डिस्क ड्राइव में फ़ाइल का नाम (पहले से ही $C301 पर मेमोरी में)
एलडीए #$09 ; फ़ाइल नाम की लंबाई
एलडीएक्स #$01
LDY#$C3
जेएसआर सेटनम
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; आउटपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकोट; लिखने के लिये
;
; डिस्क पर आउटपुट फ़ाइल
एलडीए #$01
एसटीए $2बी ; TXTTAB
एलडीए #$सी1
एसटीए $2सी
एलडीएक्स #$00
एलडीवाई #$सी2
एलडीए #$2बी
जेएसआर सेव
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद

ध्यान दें कि यह एक प्रोग्राम है जो मेमोरी के दूसरे सेक्शन (प्रोग्राम सेक्शन नहीं) को डिस्क (कमोडोर-64 के लिए डिस्केट) में सेव करता है।

5.9 ओएस लोड रूटीन

OS LOAD रूटीन को $FFD5 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। जब मेमोरी का एक सेक्शन (बड़ा क्षेत्र) डिस्क में सेव किया जाता है, तो इसे एक हेडर के साथ सेव किया जाता है जिसमें मेमोरी में सेक्शन का शुरुआती पता होता है। OS LOAD सबरूटीन किसी फ़ाइल के बाइट्स को मेमोरी में लोड करता है। इस LOAD ऑपरेशन के साथ, संचायक का मान 010 ($00) होना चाहिए। लोड ऑपरेशन के लिए डिस्क में फ़ाइल हेडर में आरंभिक पता पढ़ने और उस पते से शुरू होने वाली रैम में फ़ाइल बाइट्स डालने के लिए, चैनल के लिए द्वितीयक पता 1 या 2 होना चाहिए (निम्नलिखित प्रोग्राम 2 का उपयोग करता है)। यह रूटीन लोड किए गए उच्चतम रैम स्थान का पता प्लस 1 लौटाता है। इसका मतलब यह है कि RAM प्लस 1 में फ़ाइल के अंतिम पते की कम बाइट को µP X रजिस्टर में डाल दिया जाता है, और RAM प्लस 1 में फ़ाइल के अंतिम पते की उच्च बाइट को µP Y रजिस्टर में डाल दिया जाता है।

यदि लोडिंग असफल होती है, तो µP A रजिस्टर त्रुटि संख्या (संभवतः 4, 5, 8 या 9) रखता है। माइक्रोप्रोसेसर स्थिति रजिस्टर का C ध्वज भी सेट किया गया है (1 बनाया गया)। यदि लोडिंग सफल है, तो ए रजिस्टर का अंतिम मान महत्वपूर्ण नहीं है।

अब, इस ऑनलाइन करियर कोर्स के पिछले अध्याय में, असेंबली लैंग्वेज प्रोग्राम का पहला निर्देश रैम में उस पते पर है जहां से प्रोग्राम शुरू हुआ था। ऐसा होना ज़रूरी नहीं है. इसका मतलब यह है कि किसी प्रोग्राम का पहला निर्देश RAM में प्रोग्राम की शुरुआत में होना जरूरी नहीं है। किसी प्रोग्राम के लिए प्रारंभ निर्देश RAM में फ़ाइल के भीतर कहीं भी हो सकता है। प्रोग्रामर को सलाह दी जाती है कि वह असेंबली भाषा निर्देश को START के साथ लेबल करें। इसके साथ, प्रोग्राम लोड होने के बाद, यह निम्नलिखित असेंबली भाषा निर्देश के साथ पुनः चलता (निष्पादित) होता है:

जेएसआर स्टार्ट

'JSR START' असेंबली भाषा प्रोग्राम में है जो चलाने के लिए प्रोग्राम को लोड करता है। एक असेंबली भाषा जो किसी अन्य असेंबली भाषा फ़ाइल को लोड करती है और लोड की गई फ़ाइल को चलाती है, उसमें निम्नलिखित कोड प्रक्रिया होती है:

  • SETLFS रूटीन का उपयोग करके चैनल सेट करें।
  • तार्किक फ़ाइल (संख्या) का नाम सेट करें जो SETNAM रूटीन का उपयोग करके वास्तविक डिस्क फ़ाइल के समान है।
  • OPEN रूटीन का उपयोग करके तार्किक फ़ाइल खोलें।
  • इसे CHKIN का उपयोग करके इनपुट के लिए फ़ाइल बनाएं।
  • फ़ाइल लोड करने का कोड यहां जाता है और 'JSR LOAD' के साथ समाप्त होता है।
  • CLOSE रूटीन का उपयोग करके तार्किक फ़ाइल को बंद करें।

निम्नलिखित प्रोग्राम डिस्क से एक फ़ाइल लोड करता है और उसे चलाता है:

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$08 ; प्रथम डिस्क ड्राइव के लिए डिवाइस नंबर
एलडीवाई #$02 ; द्वितीयक पता
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
;
; डिस्क ड्राइव में फ़ाइल का नाम (पहले से ही $C301 पर मेमोरी में)
एलडीए #$09 ; फ़ाइल नाम की लंबाई
एलडीएक्स #$01
एलडीवाई #$सी3
जेएसआर सेटनम
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; इनपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकिन; पढ़ने के लिए
;
; डिस्क से इनपुट फ़ाइल
एलडीए #$00
जेएसआर लोड
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद
; लोड किया गया प्रोग्राम प्रारंभ करें
जेएसआर स्टार्ट

5.10 मॉडेम और आरएस-232 मानक

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

एक मॉडेम को किसी बाहरी पोर्ट (कंप्यूटर की ऊर्ध्वाधर सतह पर) पर कंप्यूटर से कनेक्ट करने की आवश्यकता होती है। RS-232 मानक एक विशेष प्रकार के कनेक्टर को संदर्भित करता है जो एक मॉडेम को कंप्यूटर से जोड़ता है (अतीत में)। दूसरे शब्दों में, अतीत में कई कंप्यूटरों में एक बाहरी पोर्ट होता था जो RS-232 कनेक्टर या RS-232 संगत कनेक्टर होता था।

कमोडोर-64 सिस्टम यूनिट (कंप्यूटर) की पिछली ऊर्ध्वाधर सतह पर एक बाहरी पोर्ट होता है जिसे यूजर पोर्ट कहा जाता है। यह यूजर पोर्ट RS-232 संगत है। वहां एक मॉडेम डिवाइस कनेक्ट किया जा सकता है. कमोडोर-64 इस उपयोगकर्ता पोर्ट के माध्यम से एक मॉडेम के साथ संचार करता है। कमोडोर-64 के लिए ROM ऑपरेटिंग सिस्टम में RS-232 रूटीन नामक मॉडेम के साथ संचार करने के लिए सबरूटीन्स हैं। इन रूटीनों में जंप टेबल में प्रविष्टियाँ हैं।

बॉड दर
कंप्यूटर से आठ-बिट बाइट को मॉडेम में भेजे जाने से पहले आठ बिट्स की श्रृंखला में परिवर्तित किया जाता है। मॉडेम से कंप्यूटर तक रिवर्स किया जाता है। बॉड दर श्रृंखला में प्रति सेकंड प्रसारित होने वाले बिट्स की संख्या है।

स्मृति के नीचे
शब्द 'बॉटम ऑफ़ मेमोरी' $0000 पते के मेमोरी बाइट स्थान को संदर्भित नहीं करता है। यह सबसे कम रैम स्थान को संदर्भित करता है जहां उपयोगकर्ता अपना डेटा और प्रोग्राम डालना शुरू कर सकता है। डिफ़ॉल्ट रूप से, यह $0800 है। पिछली चर्चा से याद करें कि $0800 और $BFFF के बीच के बहुत से स्थान बेसिक कंप्यूटर भाषा और उसके प्रोग्रामर (उपयोगकर्ताओं) द्वारा उपयोग किए जाते हैं। असेंबली भाषा प्रोग्राम और डेटा के उपयोग के लिए केवल $C000 से $CFFF पता स्थान बचे हैं; यह मेमोरी के 64 Kbytes में से 4Kbytes है।

स्मृति का शीर्ष
उन दिनों, जब ग्राहक कमोडोर-64 कंप्यूटर खरीदते थे, तो कुछ सभी मेमोरी स्थानों के साथ नहीं आते थे। ऐसे कंप्यूटरों में $E000 से $FFFF तक के ऑपरेटिंग सिस्टम के साथ ROM होती थी। उनके पास $0000 से एक सीमा तक RAM थी, जो $DFFF नहीं है, $E000 के आगे। सीमा $DFFF से कम थी और उस सीमा को 'मेमोरी का शीर्ष' कहा जाता है। इसलिए, टॉप-ऑफ़-मेमोरी $FFFF स्थान को संदर्भित नहीं करती है।

आरएस-232 संचार के लिए कमोडोर-64 बफ़र्स
ट्रांसमिटिंग बफ़र
आरएस-232 ट्रांसमिशन (आउटपुट) के लिए बफर मेमोरी के शीर्ष से नीचे की ओर 256 बाइट्स लेता है। इस ट्रांसमिटिंग बफ़र के सूचक को ROBUF के रूप में लेबल किया गया है। यह सूचक पृष्ठ शून्य पर $00F9 पतों के साथ $00FA है। ROBUF वास्तव में $00F9 की पहचान करता है। इसलिए, यदि बफ़र की शुरुआत का पता $BE00 है, तो $BE00 का निचला बाइट, जो $00 है, $00F9 स्थान पर है और $BE00 का उच्च बाइट, जो $BE है, $00FA में है जगह।

बफ़र प्राप्त करना
आरएस-232 बाइट्स (इनपुट) प्राप्त करने के लिए बफर ट्रांसमिटिंग बफर के नीचे से 256 बाइट्स लेता है। इस प्राप्तकर्ता बफ़र के सूचक को RIBUF के रूप में लेबल किया गया है। यह सूचक पृष्ठ शून्य पर $00F7 पतों के साथ $00F8 पर है। RIBUF वास्तव में $00F7 की पहचान करता है। इसलिए, यदि बफ़र की शुरुआत का पता $BF00 है, तो $BF00 का निचला बाइट, जो कि $00 है, $00F7 स्थान पर है और $BF00 का उच्च बाइट, जो कि $BF है, $00F8 में है जगह। तो, मेमोरी के शीर्ष से 512 बाइट्स का उपयोग कुल आरएस-232 रैम बफर के रूप में किया जाता है।

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

  • SETLFS रूटीन का उपयोग करके चैनल सेट करना।
  • तार्किक फ़ाइल का नाम सेट करना, $0610।
  • OPEN रूटीन का उपयोग करके तार्किक फ़ाइल खोलना।
  • इसे CHKOUT का उपयोग करके आउटपुट के लिए फ़ाइल बनाना या CHKIN का उपयोग करके इनपुट के लिए फ़ाइल बनाना।
  • CHROUT के साथ एकल बाइट्स भेजना या GETIN के साथ एकल बाइट्स प्राप्त करना।
  • CLOSE रूटीन का उपयोग करके तार्किक फ़ाइल को बंद करना।

OS GETIN रूटीन को $FFE4 पर OS ROM जंप टेबल पर जंपिंग (JSR) द्वारा एक्सेस किया जाता है। यह रूटीन, जब कॉल किया जाता है, तो रिसीवर बफर में भेजे गए बाइट को लेता है और इसे µP संचायक में डाल देता है (लौटा देता है)।

निम्नलिखित प्रोग्राम मॉडेम को बाइट 'ई' (एएससीआईआई) भेजता है जो उपयोगकर्ता आरएस-232 संगत पोर्ट से जुड़ा है:

; सेटअप चैनल
एलडीए #$40 ; तार्किक फ़ाइल संख्या
एलडीएक्स #$02 ; RS-232 के लिए डिवाइस नंबर
LDY #$FF ; कोई द्वितीयक पता नहीं
जेएसआर सेट्लफ़्स; सेटअप चैनल उचित
;
; RS-232 का नाम एक कोड है उदा. $0610
एलडीए #$02 ; कोड की लंबाई 2 बाइट्स है
एलडीएक्स #$10
एलडीवाई#$06
जेएसआर सेटनम
;
; तार्किक फ़ाइल खोलें
जेएसआर खुला
; आउटपुट के लिए चैनल सेट करें
एलडीएक्स #$40 ; तार्किक फ़ाइल संख्या
जेएसआर चकोट
;
; आरएस-232 पर आउटपुट चार उदा. मोडम
एलडीए #$45
जेएसआर क्रॉउट
; तार्किक फ़ाइल बंद करें
एलडीए #$40
जेएसआर बंद

बाइट प्राप्त करने के लिए, कोड बहुत समान है, सिवाय इसके कि 'JSR CHKOUT' को 'JSR CHKIN' से बदल दिया जाता है और:

एलडीए #$45
जेएसआर क्रॉउट

परिणाम को ए रजिस्टर में डालने के साथ 'जेएसआर गेटिन' द्वारा प्रतिस्थापित किया जाता है।

बाइट्स को लगातार भेजना या प्राप्त करना क्रमशः कोड सेगमेंट को भेजने या प्राप्त करने के लिए एक लूप द्वारा किया जाता है।

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

5.11 गिनती और समय

गिनती के क्रम पर विचार करें जो है:

2, 1, 0

यह 2 से 0 तक उल्टी गिनती है। अब, दोहराई जाने वाली गिनती के क्रम पर विचार करें:

2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0

यह उसी क्रम की बार-बार होने वाली उल्टी गिनती है। यह क्रम चार बार दोहराया जाता है। चार बार का मतलब है समय 4. एक क्रम के भीतर गिनती होती है. उसी क्रम को दोहराना टाइमिंग है।

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

टाइमर सर्किट को कैसे प्रोग्राम किया जाता है, इसके आधार पर, टाइमर एक-समय मोड या निरंतर मोड में चल सकता है। पिछले उदाहरण के साथ, एक-बार मोड का अर्थ है '2, 1, 0 करो' और घड़ी की धड़कन जारी रहने पर रुक जाओ। सतत मोड '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, आदि' जैसा है। जो घड़ी की धड़कनों के साथ जारी रहता है। इसका मतलब है कि जब यह शून्य से आगे चला जाता है, यदि कोई निर्देश नहीं दिया जाता है, तो उलटी गिनती का क्रम दोहराया जाता है। सबसे बड़ी संख्या आमतौर पर 2 से बहुत बड़ी होती है।

CIA #1 का टाइमर A (TA) उत्पन्न होता है आईआरक्यू कीबोर्ड की सेवा के लिए नियमित अंतराल (अवधि) पर। वास्तव में, यह वास्तव में डिफ़ॉल्ट रूप से एक सेकंड का प्रत्येक 1/60 है। आईआरक्यू प्रत्येक 1/60 सेकंड में माइक्रोप्रोसेसर को भेजा जाता है। यह तभी है जब आईआरक्यू भेजा जाता है कि एक प्रोग्राम कीबोर्ड क्यू (बफर) से एक कुंजी मान पढ़ सकता है। याद रखें कि माइक्रोप्रोसेसर के लिए केवल एक पिन होता है आईआरक्यू संकेत. माइक्रोप्रोसेसर के लिए भी केवल एक पिन होता है एनएमआई संकेत. माइक्रोप्रोसेसर को ¯NMI सिग्नल हमेशा CIA #2 से आता है।

16-बिट टाइमर रजिस्टर में दो मेमोरी पते हैं: एक निचली बाइट के लिए और एक उच्च बाइट के लिए। प्रत्येक CIA में दो टाइमर सर्किट होते हैं। दोनों सीआईए समान हैं। CIA #1 के लिए, दो टाइमर के पते हैं: TA के लिए DC04 और DC05 और TB के लिए DC06 और DC07। CIA #2 के लिए, दो टाइमर के पते हैं: TA के लिए DD04 और DD05 और TB के लिए DD06 और DD07।

मान लें कि 25510 नंबर को काउंटडाउन के लिए सीआईए #2 के टीए टाइमर पर भेजा जाना है। 25510 = 0000000001111111112 सोलह बिट्स में है। 00000000111111112 = $000FFF हेक्साडेसिमल में है। इस मामले में, $FF को $DD04 पते पर रजिस्टर में भेजा जाता है, और $00 को $DD05 पते पर रजिस्टर में भेजा जाता है - थोड़ा एंडियननेस। निम्नलिखित कोड खंड नंबर को रजिस्टर में भेजता है:

एलडीए #$एफएफ
राज्य $DD04
एलडीए #$00
राज्य $DD05

हालाँकि CIA के रजिस्टरों में RAM पते होते हैं, वे भौतिक रूप से CIA में होते हैं और CIA RAM या ROM से एक अलग IC है।

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

एक शॉट मोड में गिनती शुरू करने के लिए एक उपयुक्त संख्या हेक्साडेसिमल में 000010012 = $09 है। फ्री रनिंग मोड में गिनती शुरू करने के लिए एक उपयुक्त संख्या हेक्साडेसिमल में 000000012 = $01 है। प्रत्येक टाइमर रजिस्टर का अपना नियंत्रण रजिस्टर होता है। CIA #1 में, टाइमर A के नियंत्रण रजिस्टर का RAM पता DC0E16 है और टाइमर B के नियंत्रण रजिस्टर का RAM पता DC0F16 है। CIA #2 में, टाइमर A के लिए नियंत्रण रजिस्टर में DD0E16 का RAM पता है और टाइमर B के लिए नियंत्रण रजिस्टर में DD0F16 का RAM पता है। सीआईए #2 के टीए में सोलह-बिट संख्या को एक-शॉट मोड में गिनना शुरू करने के लिए, निम्नलिखित कोड का उपयोग करें:

एलडीए #$09
एसटीए $DD0E

सीआईए #2 के टीए में सोलह-बिट संख्या को फ्री रनिंग मोड में गिनना शुरू करने के लिए, निम्नलिखित कोड का उपयोग करें:

एलडीए #$01
एसटीए $DD0E

5.12 द आईआरक्यू और एनएमआई अनुरोध

6502 माइक्रोप्रोसेसर में है आईआरक्यू और एनएमआई लाइनें (पिन)। CIA #1 और CIA #2 दोनों में से प्रत्येक के पास है आईआरक्यू माइक्रोप्रोसेसर के लिए पिन. आईआरक्यू CIA #2 का पिन इससे जुड़ा है एनएमआई µP का पिन. आईआरक्यू CIA #1 का पिन इससे जुड़ा है आईआरक्यू µP का पिन. वे केवल दो इंटरप्ट लाइनें हैं जो माइक्रोप्रोसेसर को जोड़ती हैं। इतना आईआरक्यू CIA #2 का पिन है एनएमआई स्रोत और इसे ¯NMI लाइन के रूप में भी देखा जा सकता है।

CIA #1 के पास इसे उत्पन्न करने के पांच संभावित तात्कालिक स्रोत हैं आईआरक्यू µP के लिए संकेत. सीआईए #2 की संरचना सीआईए #1 के समान ही है। तो, सीआईए #2 के पास इस बार व्यवधान संकेत उत्पन्न करने के वही पांच संभावित तात्कालिक स्रोत हैं जो कि हैं एनएमआई संकेत. याद रखें कि जब µP प्राप्त होता है एनएमआई सिग्नल, यदि यह संभाल रहा है आईआरक्यू अनुरोध, यह उसे निलंबित करता है और संभालता है एनएमआई अनुरोध। जब यह संभालना समाप्त कर लेता है एनएमआई अनुरोध करें, फिर यह का संचालन फिर से शुरू कर देता है आईआरक्यू अनुरोध।

CIA #1 आम तौर पर कीबोर्ड और जॉयस्टिक जैसे गेम डिवाइस से बाहरी रूप से जुड़ा होता है। कीबोर्ड पोर्ट B की तुलना में CIA #1 के पोर्ट A का अधिक उपयोग करता है। गेम डिवाइस अपने पोर्ट A की तुलना में CIA #1 पोर्ट B का अधिक उपयोग करता है। CIA #2 सामान्यतः डिस्क ड्राइव से बाहरी रूप से जुड़ा होता है (डेज़ी प्रिंटर से जुड़ा होता है) और मॉडेम. डिस्क ड्राइव अपने पोर्ट बी की तुलना में सीआईए #2 के पोर्ट ए (हालांकि बाहरी सीरियल पोर्ट के माध्यम से) का अधिक उपयोग करता है। मॉडेम (आरएस-232) अपने पोर्ट ए की तुलना में सीआईए #2 पोर्ट बी का अधिक उपयोग करता है।

इन सब के साथ, सिस्टम यूनिट को कैसे पता चलता है कि इसका कारण क्या है आईआरक्यू या एनएमआई रुकावट डालना? सीआईए #1 और सीआईए #2 के पास रुकावट के पांच तात्कालिक स्रोत हैं। यदि µP के लिए व्यवधान संकेत है एनएमआई , स्रोत सीआईए #2 के तत्काल पांच स्रोतों में से एक है। यदि µP के लिए व्यवधान संकेत है आईआरक्यू , स्रोत सीआईए #1 के तत्काल पांच स्रोतों में से एक है।

अगला सवाल यह है, 'सिस्टम यूनिट प्रत्येक सीआईए के पांच तत्काल स्रोतों के बीच अंतर कैसे करती है?' प्रत्येक CIA के पास आठ-बिट रजिस्टर होता है जिसे इंटरप्ट कंट्रोल रजिस्टर (ICR) कहा जाता है। आईसीआर सीआईए के दोनों बंदरगाहों पर कार्य करता है। निम्न तालिका बिट 0 से शुरू होने वाले इंटरप्ट कंट्रोल रजिस्टर के आठ बिट्स के अर्थ दिखाती है:

तालिका 5.13
व्यवधान नियंत्रण रजिस्टर
बिट सूचकांक अर्थ
0 टाइमर ए के अंडरफ्लो द्वारा सेट (1 बनाया गया)
1 टाइमर बी के अंडरफ़्लो द्वारा सेट करें
2 सेट करें जब दिन के समय की घड़ी अलार्म के बराबर हो
3 सीरियल पोर्ट भर जाने पर सेट करें
4 बाहरी डिवाइस द्वारा सेट करें
5 उपयोग नहीं किया गया (0 बनाया गया)
6 उपयोग नहीं किया गया (0 बनाया गया)
7 पहले पांच बिट्स में से कोई भी सेट होने पर सेट करें

जैसा कि तालिका से देखा जा सकता है, प्रत्येक तात्कालिक स्रोत को पहले पांच बिट्स में से एक द्वारा दर्शाया गया है। इसलिए, जब इंटरप्ट सिग्नल µP पर प्राप्त होता है, तो इंटरप्ट के सटीक स्रोत को जानने के लिए इंटरप्ट कंट्रोल रजिस्टर की सामग्री को पढ़ने के लिए कोड को निष्पादित करना पड़ता है। CIA #1 के ICR का RAM पता DC0D16 है। CIA #2 के ICR का RAM पता DD0D16 है। CIA #1 के ICR की सामग्री को µP संचायक पर पढ़ने (वापस करने) के लिए, निम्नलिखित निर्देश टाइप करें:

एलडीए$डीसी0डी

सीआईए #2 के आईसीआर की सामग्री को µP संचायक पर पढ़ने (वापस) करने के लिए, निम्नलिखित निर्देश टाइप करें:

एलडीए $DD0D

5.13 इंटरप्ट ड्रिवेन बैकग्राउंड प्रोग्राम

कीबोर्ड आमतौर पर हर 1/60 सेकंड में माइक्रोप्रोसेसर को बाधित करता है। कल्पना करें कि एक प्रोग्राम चल रहा है और यह नीचे दिए गए कोड सेगमेंट के साथ जारी रखने से पहले कीबोर्ड से एक कुंजी की प्रतीक्षा करने की स्थिति में पहुंच जाता है। मान लें कि यदि कीबोर्ड से कोई कुंजी नहीं दबाई जाती है, तो प्रोग्राम केवल एक छोटा लूप करता है, एक कुंजी की प्रतीक्षा करता है। कल्पना करें कि प्रोग्राम चल रहा है और कीबोर्ड इंटरप्ट जारी होने के ठीक बाद कीबोर्ड से एक कुंजी की उम्मीद है। उस समय, पूरा कंप्यूटर अप्रत्यक्ष रूप से रुक जाता है और वेट-लूप लूपिंग के अलावा कुछ नहीं कर रहा होता है। कल्पना कीजिए कि अगले कीबोर्ड व्यवधान के अगले अंक से ठीक पहले एक कीबोर्ड कुंजी दबाई जाती है। इसका मतलब यह है कि कंप्यूटर ने एक सेकंड के लगभग साठवें हिस्से तक कुछ नहीं किया है! कमोडोर-64 के दिनों में भी, कंप्यूटर के लिए कुछ न करने का यह एक लंबा समय है। हो सकता है कि कंप्यूटर उस समय (अवधि) में कुछ और भी कर रहा हो। एक प्रोग्राम में ऐसी कई अवधियाँ होती हैं।

एक दूसरे प्रोग्राम को ऐसी 'निष्क्रिय' अवधि में संचालित होने के लिए लिखा जा सकता है। ऐसा कहा जाता है कि ऐसा प्रोग्राम मुख्य (या पहले) प्रोग्राम की पृष्ठभूमि पर चल रहा होता है। ऐसा करने का एक आसान तरीका बस एक संशोधित बीआरके इंटरप्ट हैंडलिंग को मजबूर करना है जब कीबोर्ड से एक कुंजी की उम्मीद की जाती है।

बीआरके निर्देश के लिए सूचक
$0316 और $0317 पतों के RAM क्रमागत स्थानों पर वास्तविक BRK अनुदेश रूटीन के लिए सूचक (वेक्टर) है। जब कंप्यूटर ROM में ऑपरेटिंग सिस्टम द्वारा संचालित होता है तो डिफ़ॉल्ट पॉइंटर वहां लगा दिया जाता है। यह डिफ़ॉल्ट पॉइंटर एक पता है जो अभी भी OS ROM में डिफ़ॉल्ट BRK निर्देश हैंडलर को इंगित करता है। सूचक एक 16-बिट पता है। पॉइंटर का निचला बाइट $0306 पते के बाइट स्थान पर रखा गया है, और पॉइंटर का उच्च बाइट $0317 बाइट स्थान पर रखा गया है।

दूसरा प्रोग्राम इस प्रकार लिखा जा सकता है कि जब सिस्टम 'निष्क्रिय' हो, तो दूसरे प्रोग्राम के कुछ कोड सिस्टम द्वारा निष्पादित किए जाएं। इसका मतलब यह है कि दूसरा प्रोग्राम सबरूटीन्स से बना होना चाहिए। जब सिस्टम 'निष्क्रिय' होता है और कीबोर्ड से एक कुंजी की प्रतीक्षा कर रहा होता है, तो दूसरे प्रोग्राम के लिए अगला सबरूटीन निष्पादित होता है। सिस्टम यूनिट के संचालन की तुलना में कंप्यूटर के साथ मानव संपर्क धीमा है।

इस समस्या को हल करना आसान है: हर बार जब कंप्यूटर को कीबोर्ड से एक कुंजी के लिए इंतजार करना पड़ता है, तो कोड में एक BRK निर्देश डालें और $0316 (और $0317) के पॉइंटर को दूसरे के अगले सबरूटीन के पॉइंटर से बदल दें ( कस्टम) प्रोग्राम। इस तरह, दोनों प्रोग्राम उस अवधि में चलेंगे जो अकेले चलने वाले मुख्य प्रोग्राम से अधिक लंबी नहीं होगी।

5.14 संयोजन और संकलन

असेंबलर सभी लेबलों को पतों से बदल देता है। एक असेंबली भाषा प्रोग्राम आम तौर पर एक विशेष पते पर शुरू करने के लिए लिखा जाता है। असेंबलर (असेम्बलिंग के बाद) के परिणाम को बाइनरी में सब कुछ के साथ 'ऑब्जेक्ट कोड' कहा जाता है। वह परिणाम निष्पादन योग्य फ़ाइल है यदि फ़ाइल एक प्रोग्राम है न कि दस्तावेज़। कोई दस्तावेज़ निष्पादन योग्य नहीं है.

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

जब एक से अधिक फोरग्राउंड प्रोग्राम हों तो असेंबलर के बजाय कंपाइलर की आवश्यकता होती है। कंपाइलर प्रत्येक प्रोग्राम को एक ऑब्जेक्ट कोड में असेंबल करता है। हालाँकि, एक समस्या होगी: कुछ कोड खंड ओवरलैप हो जाएंगे क्योंकि प्रोग्राम संभवतः अलग-अलग लोगों द्वारा लिखे गए हैं। कंपाइलर द्वारा समाधान यह है कि पहले वाले को छोड़कर सभी ओवरलैपिंग प्रोग्राम को मेमोरी स्पेस पर स्थानांतरित कर दिया जाए, ताकि प्रोग्राम ओवरलैप न हों। अब, जब वेरिएबल्स के भंडारण की बात आती है, तो कुछ वेरिएबल पते अभी भी ओवरलैप होंगे। यहां समाधान ओवरलैपिंग पतों को नए पतों (पहले प्रोग्राम को छोड़कर) से बदलना है ताकि वे ओवरलैप न हों। इस प्रकार, विभिन्न प्रोग्राम मेमोरी के विभिन्न भागों (क्षेत्रों) में फिट हो जायेंगे।

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

5.15 प्रोग्राम को सेव करना, लोड करना और चलाना

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

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

'फ़ाइलनाम' लोड करें,8,1

कमांड बेसिक आरक्षित शब्द से शुरू होता है जो LOAD है। इसके बाद एक स्थान और फिर डबल कोट्स में फ़ाइल-नाम होता है। इसके बाद डिवाइस संख्या 8 आती है जिसके पहले अल्पविराम लगता है। डिस्क के लिए द्वितीयक पता 1 है जिसके बाद अल्पविराम आता है। ऐसी फ़ाइल के साथ, असेंबली भाषा प्रोग्राम का प्रारंभिक पता डिस्क में फ़ाइल के हेडर में होता है। जब BASIC प्रोग्राम को लोड करना समाप्त कर देता है, तो प्रोग्राम का अंतिम RAM पता प्लस 1 वापस कर दिया जाता है। यहां 'लौटा' शब्द का अर्थ है कि अंतिम पते प्लस 1 का निचला बाइट µP X रजिस्टर में डाला गया है, और अंतिम पते प्लस 1 का उच्च बाइट µP Y रजिस्टर में डाला गया है।

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

यह मानते हुए कि असेंबली लैंग्वेज प्रोग्राम के लिए निष्पादन (रनिंग) रैम एड्रेस की शुरुआत C12316 है, C123 को SYS कमांड के साथ उपयोग करने से पहले बेस टेन में परिवर्तित किया जाता है। C12316 को आधार दस में परिवर्तित करना इस प्रकार है:

तो, बेसिक SYS कमांड है:

एसवाईएस 49443

5.16 कमोडोर-64 के लिए बूटिंग

कमोडोर-64 के लिए बूटिंग में दो चरण होते हैं: हार्डवेयर रीसेट चरण और ऑपरेटिंग सिस्टम आरंभीकरण चरण। ऑपरेटिंग सिस्टम ROM में कर्नेल है (और डिस्क में नहीं)। वहाँ एक रीसेट लाइन है (वास्तव में आर ई ) जो 6502 µP पर एक पिन से जुड़ता है, और CIA 1, CIA 2, और VIC II जैसे सभी विशेष जहाजों में एक ही पिन नाम से जुड़ता है। रीसेट चरण में, इस लाइन के कारण, µP और विशेष चिप्स में सभी रजिस्टर 0 पर रीसेट हो जाते हैं (प्रत्येक बिट के लिए शून्य बना दिया जाता है)। इसके बाद, माइक्रोप्रोसेसर हार्डवेयर द्वारा, स्टैक पॉइंटर और प्रोसेसर स्टेटस रजिस्टर को माइक्रोप्रोसेसर में उनके प्रारंभिक मूल्यों के साथ दिया जाता है। फिर प्रोग्राम काउंटर को $FFFC और $FFFD स्थानों में मूल्य (पता) के साथ दिया जाता है। याद रखें कि प्रोग्राम काउंटर अगले निर्देश का पता रखता है। यहां मौजूद सामग्री (पता) उस सबरूटीन के लिए है जो सॉफ़्टवेयर आरंभीकरण शुरू करता है। अब तक सब कुछ माइक्रोप्रोसेसर हार्डवेयर द्वारा किया जाता है। इस चरण में संपूर्ण स्मृति को स्पर्श नहीं किया जाता है। इसके बाद आरंभीकरण का अगला चरण शुरू होता है।

आरंभीकरण ROM OS में कुछ रूटीन द्वारा किया जाता है। इनिशियलाइज़ेशन का अर्थ है विशेष चिप्स में कुछ रजिस्टरों को प्रारंभिक या डिफ़ॉल्ट मान देना। आरंभीकरण विशेष चिप्स में कुछ रजिस्टरों को प्रारंभिक या डिफ़ॉल्ट मान देकर शुरू होता है। आईआरक्यू उदाहरण के लिए, हर 1/60 सेकंड में जारी करना शुरू करना होगा। इसलिए, CIA #1 में इसके संबंधित टाइमर को इसके डिफ़ॉल्ट मान पर सेट करना होगा।

इसके बाद, कर्नेल एक रैम परीक्षण करता है। यह स्थान पर एक बाइट भेजकर और उसे वापस पढ़कर प्रत्येक स्थान का परीक्षण करता है। यदि कोई अंतर है तो कम से कम वह स्थान ख़राब है। कर्नेल मेमोरी के शीर्ष और मेमोरी के निचले हिस्से की भी पहचान करता है और पेज 2 में संबंधित पॉइंटर्स सेट करता है। यदि मेमोरी का शीर्ष $DFFF है, तो $FF को $0283 स्थान पर रखा गया है और $DF को $0284 बाइट स्थान पर रखा गया है। $0283 और $0284 दोनों में HIRAM लेबल है। यदि मेमोरी का निचला भाग $0800 है, तो $00 को $0281 स्थान पर रखा गया है और $08 को $0282 स्थान पर रखा गया है। $0281 और $0282 दोनों में LORAM लेबल है। रैम परीक्षण वास्तव में $0300 से मेमोरी के शीर्ष (रैम) तक शुरू होता है।

अंत में, इनपुट/आउटपुट वेक्टर (पॉइंटर्स) को उनके डिफ़ॉल्ट मान पर सेट किया जाता है। रैम परीक्षण वास्तव में $0300 से मेमोरी के शीर्ष (रैम) तक शुरू होता है। इसका मतलब है कि पेज 0, पेज 1 और पेज 2 प्रारंभ हो गए हैं। पेज 0 में, विशेष रूप से, बहुत सारे OS ROM पॉइंटर्स हैं और पेज 2 में बहुत सारे बेसिक पॉइंटर्स हैं। इन सूचकों को चर कहा जाता है। याद रखें कि पेज 1 स्टैक है। सूचकों को चर कहा जाता है क्योंकि उनके नाम (लेबल) होते हैं। इस स्तर पर, स्क्रीन (मॉनिटर) के लिए स्क्रीन मेमोरी साफ़ हो जाती है। इसका अर्थ है 1000 रैम स्क्रीन स्थानों पर स्थान के लिए $20 का कोड भेजना (जो ASCII $20 के समान होता है)। अंत में, कर्नेल बेसिक कमांड प्रॉम्प्ट को प्रदर्शित करने के लिए बेसिक दुभाषिया शुरू करता है जो मॉनिटर (स्क्रीन) के शीर्ष पर तैयार है।

5.17 समस्याएँ

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

  1. एक असेंबली भाषा कोड लिखें जो CIA #2 पोर्ट A के सभी बिट्स को आउटपुट और CIA #2 पोर्ट B को इनपुट के रूप में बनाता है।
  2. एक 6502-असेंबली भाषा कोड लिखें जो कीबोर्ड कुंजी दबाए जाने तक प्रतीक्षा करता है।
  3. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो कमोडोर-64 स्क्रीन पर 'ई' अक्षर भेजता है।
  4. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो कीबोर्ड से एक अक्षर लेता है और कुंजी कोड और समय को अनदेखा करते हुए इसे कमोडोर-64 स्क्रीन पर भेजता है।
  5. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो कमोडोर-64 डिस्केट से एक बाइट प्राप्त करता है।
  6. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो एक फ़ाइल को कमोडोर-64 डिस्केट में सहेजता है।
  7. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो कमोडोर-64 डिस्केट से एक प्रोग्राम फ़ाइल लोड करता है और इसे शुरू करता है।
  8. एक 6502-असेंबली भाषा प्रोग्राम लिखें जो मॉडेम को बाइट 'ई' (एएससीआईआई) भेजता है जो कमोडोर-64 के उपयोगकर्ता आरएस-232 संगत पोर्ट से जुड़ा है।
  9. बताएं कि कमोडोर-64 कंप्यूटर में गिनती और समय निर्धारण कैसे किया जाता है।
  10. बताएं कि कैसे कमोडोर-64 सिस्टम यूनिट गैर-मास्केबल इंटरप्ट अनुरोधों सहित 10 अलग-अलग तत्काल इंटरप्ट अनुरोध स्रोतों की पहचान कर सकती है।
  11. बताएं कि कमोडोर-64 कंप्यूटर में बैकग्राउंड प्रोग्राम फोरग्राउंड प्रोग्राम के साथ कैसे चल सकता है।
  12. संक्षेप में बताएं कि कमोडोर-64 कंप्यूटर के लिए असेंबली भाषा प्रोग्राम को एक एप्लिकेशन में कैसे संकलित किया जा सकता है।
  13. कमोडोर-64 कंप्यूटर के लिए बूटिंग प्रक्रिया को संक्षेप में समझाएं।