باب 5: اسمبلی کی زبان میں کموڈور-64 آپریٹنگ سسٹم

Bab 5 Asmbly Ky Zban My Kmw Wr 64 Apry Ng Ss M



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 اپنے دنوں کے دیگر مائیکرو پروسیسرز کے مقابلے میں سمجھنے اور چلانے میں بھی آسان ہے۔ ان کے نتیجے میں، یہ اسمبلی کی زبان سکھانے کے لیے استعمال کیے جانے والے بہترین (اگر بہترین نہیں) مائکرو پروسیسر میں سے ایک ہے۔



65C02 µP، جو اب بھی 6502 مائکرو پروسیسر کلاس میں ہے، میں 66 اسمبلی زبان کی ہدایات ہیں، جن میں سے سبھی کو دل سے سیکھا جا سکتا ہے۔ جدید مائیکرو پروسیسرز میں اسمبلی زبان کی بہت سی ہدایات ہیں اور انہیں دل سے نہیں سیکھا جا سکتا۔ ہر µP کی اپنی اسمبلی کی زبان ہوتی ہے۔ کوئی بھی آپریٹنگ سسٹم چاہے وہ نیا ہو یا پرانا، اسمبلی زبان کا ہوتا ہے۔ اس کے ساتھ، 6502 اسمبلی لینگویج کو ابتدائی افراد کے لیے آپریٹنگ سسٹم سکھانے کے لیے استعمال کیا جانا اچھا ہے۔ آپریٹنگ سسٹم سیکھنے کے بعد، جیسا کہ کموڈور-64 کے لیے، اسے بنیاد کے طور پر استعمال کرتے ہوئے ایک جدید آپریٹنگ سسٹم آسانی سے سیکھا جا سکتا ہے۔



یہ صرف مصنف (میری) کی رائے نہیں ہے۔ یہ دنیا میں بڑھتا ہوا رجحان ہے۔ کموڈور-64 آپریٹنگ سسٹم کو جدید آپریٹنگ سسٹم جیسا بنانے کے لیے انٹرنیٹ پر زیادہ سے زیادہ مضامین لکھے جا رہے ہیں۔ جدید آپریٹنگ سسٹمز کی وضاحت اگلے باب کے بعد کی گئی ہے۔





نوٹ : Commodore-64 OS (Kernal) اب بھی جدید ان پٹ اور آؤٹ پٹ آلات کے ساتھ اچھی طرح کام کرتا ہے (سب نہیں)۔

آٹھ بٹ کمپیوٹر
کموڈور 64 جیسے آٹھ بٹ کے مائیکرو کمپیوٹر میں، معلومات کو آٹھ بٹ بائنری کوڈز کی شکل میں محفوظ، منتقل اور ہیرا پھیری میں رکھا جاتا ہے۔



میموری کا نقشہ
میموری کا نقشہ ایک پیمانہ ہے جو میموری کی مکمل رینج کو مختلف سائز کی چھوٹی رینجز میں تقسیم کرتا ہے اور دکھاتا ہے کہ کیا (سب روٹین اور/یا متغیر) کس رینج سے تعلق رکھتا ہے۔ متغیر ایک لیبل ہے جو کسی خاص میموری ایڈریس سے مطابقت رکھتا ہے جس کی قدر ہوتی ہے۔ لیبل بھی سب روٹین کے آغاز کی شناخت کے لیے استعمال کیے جاتے ہیں۔ لیکن اس معاملے میں، وہ سبروٹینز کے نام سے جانے جاتے ہیں۔ ایک ذیلی روٹین کو صرف معمول کے طور پر بھیجا جاسکتا ہے۔

پچھلے باب میں میموری کا نقشہ (لے آؤٹ) کافی تفصیلی نہیں ہے۔ یہ کافی آسان ہے۔ کموڈور-64 کمپیوٹر کا میموری نقشہ تین درجوں کی تفصیلات کے ساتھ دکھایا جا سکتا ہے۔ جب انٹرمیڈیٹ لیول پر دکھایا جائے تو کموڈور-64 کمپیوٹر میں میموری کے مختلف نقشے ہوتے ہیں۔ انٹرمیڈیٹ لیول پر کموڈور-64 کمپیوٹر کا ڈیفالٹ میموری میپ یہ ہے:


تصویر 5.11 کموڈور-64 میموری کا نقشہ

ان دنوں کمپیوٹر کی ایک مقبول زبان تھی جسے BASIC کہا جاتا تھا۔ بہت سے کمپیوٹر صارفین کو کچھ کم از کم بنیادی زبان کے حکموں کو جاننے کی ضرورت ہوتی ہے جیسے کہ ڈسکیٹ (ڈسک) سے میموری پر پروگرام لوڈ کرنا، میموری میں کسی پروگرام کو چلانا (عمل درآمد کرنا) اور پروگرام سے باہر نکلنا (بند کرنا)۔ جب BASIC پروگرام چل رہا ہوتا ہے، صارف کو ڈیٹا میں، لائن بہ لائن فیڈ کرنا ہوتا ہے۔ یہ آج کی طرح نہیں ہے جب ایک ایپلی کیشن (متعدد پروگرام ایک ایپلی کیشن بناتے ہیں) کو ونڈوز کے ساتھ اعلیٰ سطح کی زبان میں لکھا جاتا ہے اور صارف کو صرف کھڑکی میں مخصوص جگہوں پر مختلف ڈیٹا میں فٹ کرنا ہوتا ہے۔ کچھ معاملات میں، پہلے سے آرڈر شدہ ڈیٹا کو منتخب کرنے کے لیے ہم ماؤس کا استعمال کرتے ہیں۔ BASIC اس وقت ایک اعلیٰ سطحی زبان تھی، لیکن اسمبلی کی زبان کے بالکل قریب ہے۔

یاد رکھیں کہ زیادہ تر میموری کو BASIC نے ڈیفالٹ میموری میپ میں لیا ہے۔ BASIC کے پاس کمانڈز (ہدایات) ہیں جن پر عمل درآمد کیا جاتا ہے جسے BASIC انٹرپریٹر کے نام سے جانا جاتا ہے۔ درحقیقت، BASIC مترجم $A000 مقام سے $BFFF (بشمول) تک ROM میں ہے جو سمجھا جاتا ہے کہ RAM کا علاقہ ہے۔ یہ 8 Kbytes ہے اس وقت کافی بڑا ہے! یہ اصل میں پوری میموری کی اس جگہ پر ROM میں ہے۔ اس کا سائز $E000 سے $FFFF تک آپریٹنگ سسٹم کے برابر ہے۔ پروگرام جو BASIC میں لکھے گئے ہیں وہ بھی $0200 سے $BFFF کی حد میں رکھے گئے ہیں۔

یوزر اسمبلی لینگویج پروگرام کے لیے RAM $C000 سے $CFFF تک ہے، 64 Kbytes میں سے صرف 4 Kbytes۔ تو، ہم اسمبلی کی زبان کیوں استعمال کرتے یا سیکھتے ہیں؟ نئے اور پرانے آپریٹنگ سسٹم اسمبلی زبانوں کے ہیں۔ کموڈور-64 کا آپریٹنگ سسٹم ROM میں ہے، $E000 سے $FFFF تک۔ یہ 65C02 µP (6510 µP) اسمبلی زبان میں لکھا گیا ہے۔ یہ سب روٹینز پر مشتمل ہے۔ اسمبلی لینگویج میں صارف پروگرام کو پیری فیرلز (ان پٹ اور آؤٹ پٹ ڈیوائسز) کے ساتھ تعامل کرنے کے لیے ان سب روٹینز کو کال کرنے کی ضرورت ہے۔ کموڈور-64 آپریٹنگ سسٹم کو اسمبلی لینگویج میں سمجھنا طالب علم کو آپریٹنگ سسٹم کو تیزی سے سمجھنے کے قابل بناتا ہے، بہت کم تکلیف دہ انداز میں۔ ایک بار پھر، ان دنوں کموڈور-64 کے لیے بہت سے صارف پروگرام بنیادی زبان میں لکھے جاتے تھے نہ کہ اسمبلی کی زبان میں۔ ان دنوں اسمبلی زبانوں کو پروگرامرز خود تکنیکی مقاصد کے لیے زیادہ استعمال کرتے تھے۔

کرنل، جس کا ہجے K-e-r-n-a-l ہے، کموڈور-64 کا آپریٹنگ سسٹم ہے۔ یہ روم میں کموڈور-64 کمپیوٹر کے ساتھ آتا ہے نہ کہ ڈسک (یا ڈسکیٹ) میں۔ کرنل سب روٹینز پر مشتمل ہے۔ پیری فیرلز تک رسائی کے لیے، اسمبلی لینگویج (مشین لینگویج) میں یوزر پروگرام کو ان سب روٹینز کو استعمال کرنا ہوتا ہے۔ Kernal کو kernel کے ساتھ الجھن میں نہیں ڈالنا چاہئے جسے جدید آپریٹنگ سسٹمز کے K-e-r-n-e-l کے طور پر لکھا جاتا ہے، حالانکہ وہ تقریبا ایک ہی چیز ہیں۔

میموری کے 4 Kbytes10 کے $C000 (49,15210) سے $CFFF (6324810) تک میموری کا علاقہ یا تو RAM یا ROM ہے۔ جب یہ RAM ہے، تو اسے پیریفیرلز تک رسائی کے لیے استعمال کیا جاتا ہے۔ جب یہ ROM ہوتا ہے تو اس کا استعمال سکرین پر حروف کو پرنٹ کرنے کے لیے ہوتا ہے (مانیٹر)۔ اس کا مطلب یہ ہے کہ یا تو کریکٹر اسکرین پر پرنٹ کیے جا رہے ہیں یا میموری کے اس حصے کے استعمال سے پیری فیرلز تک رسائی حاصل کی جا رہی ہے۔ سسٹم یونٹ (مدر بورڈ) میں ROM (کریکٹر ROM) کا ایک بینک ہے جو اسے حاصل کرنے کے لیے میموری کی پوری جگہ کو اندر اور باہر تبدیل کر دیتا ہے۔ صارف سوئچنگ کو محسوس نہیں کرسکتا ہے۔

$0100 سے میموری کا رقبہ (256 10 ) سے $01FF (511 10 ) اسٹیک ہے۔ یہ آپریٹنگ سسٹم اور صارف پروگرام دونوں کے ذریعہ استعمال ہوتا ہے۔ اسٹیک کے کردار کی وضاحت اس آن لائن کیریئر کورس کے پچھلے باب میں کی گئی تھی۔ $0000 سے میموری کا رقبہ (0 10 ) سے $00FF (255 10 ) آپریٹنگ سسٹم کے ذریعہ استعمال کیا جاتا ہے۔ بہت سے اشارے وہاں تفویض کیے گئے ہیں۔

کرنل جمپ ٹیبل
Kernal کے معمولات ہیں جو صارف پروگرام کے ذریعہ بلائے جاتے ہیں۔ جیسے ہی OS کے نئے ورژن سامنے آئے، ان معمولات کے پتے بدل گئے۔ اس کا مطلب ہے کہ صارف کے پروگرام اب نئے OS ورژن کے ساتھ کام نہیں کر سکتے۔ ایسا نہیں ہوا کیونکہ کموڈور-64 نے جمپ ٹیبل فراہم کیا۔ جمپ ٹیبل 39 اندراجات کی فہرست ہے۔ ٹیبل میں ہر اندراج میں تین پتے ہیں (سوائے آخری 6 بائٹس کے) جو آپریٹنگ سسٹم کے ورژن میں تبدیلی کے باوجود کبھی نہیں بدلے۔

اندراج کے پہلے پتے پر JSR کی ہدایت ہوتی ہے۔ اگلے دو پتے ایک دو بائٹ پوائنٹر پر مشتمل ہیں۔ یہ دو بائٹ پوائنٹر ایک حقیقی روٹین کا پتہ (یا نیا پتہ) ہے جو اب بھی OS ROM میں ہے۔ پوائنٹر کا مواد نئے OS ورژن کے ساتھ تبدیل ہو سکتا ہے، لیکن ہر جمپ ٹیبل کے اندراج کے تین پتے کبھی تبدیل نہیں ہوتے ہیں۔ مثال کے طور پر، $FF81، $FF82، اور $FF83 پتوں پر غور کریں۔ یہ تینوں پتے مدر بورڈ کی سکرین اور کی بورڈ سرکٹس (رجسٹرز) کو شروع کرنے کے معمول کے لیے ہیں۔ $FF81 ایڈریس میں ہمیشہ JSR کا op کوڈ (ایک بائٹ) ہوتا ہے۔ ابتدائی کرنے کے لیے $FF82 اور $FF83 پتوں میں سب روٹین کا پرانا یا نیا پتہ ہوتا ہے (ابھی تک OS ROM میں ہے)۔ ایک وقت میں، $FF82 اور $FF83 پتوں میں $FF5B کا مواد (پتہ) تھا جو اگلے OS ورژن کے ساتھ تبدیل ہو سکتا ہے۔ تاہم، جمپ ٹیبل کے $FF81، $FF82، اور $FF83 پتے کبھی تبدیل نہیں ہوتے ہیں۔

تین پتوں کے ہر اندراج کے لیے، JSR والے پہلے پتے پر ایک لیبل (نام) ہوتا ہے۔ $FF81 کا لیبل PCINT ہے۔ PCINT کبھی نہیں بدلتا۔ لہذا، اسکرین اور کی بورڈ رجسٹر کو شروع کرنے کے لیے، پروگرامر صرف 'JSR PCINT' ٹائپ کر سکتا ہے جو کموڈور-64 OS کے تمام ورژنز کے لیے کام کرتا ہے۔ اصل سب روٹین کا مقام (شروع کا پتہ)، مثلاً، $FF5B، مختلف آپریٹنگ سسٹمز کے ساتھ وقت کے ساتھ تبدیل ہو سکتا ہے۔ ہاں، یوزر پروگرام میں کم از کم دو JSR ہدایات شامل ہیں جو ROM OS استعمال کرتی ہیں۔ صارف کے پروگرام میں، ایک JSR ہدایات ہے جو جمپ ٹیبل میں ایک اندراج پر چھلانگ لگاتی ہے۔ جمپ ٹیبل میں آخری چھ پتوں کو چھوڑ کر، جمپ ٹیبل میں کسی اندراج کے پہلے پتے پر JSR ہدایات ہوتی ہیں۔ کرنل میں، کچھ سب روٹینز دوسرے سب روٹینز کو کال کر سکتے ہیں۔

کرنل جمپ ٹیبل $FF81 (مشتمل) سے شروع ہوتا ہے جو تینوں کے گروپوں میں اوپر کی طرف جاتا ہے، سوائے آخری چھ بائٹس کے جو کم بائٹ ایڈریس والے تین پوائنٹر ہیں: $FFFA، $FFFC، اور $FFFE۔ تمام ROM OS روٹینز دوبارہ قابل استعمال کوڈز ہیں۔ لہذا، صارف کو انہیں دوبارہ لکھنے کی ضرورت نہیں ہے۔

کموڈور-64 سسٹم یونٹ کا بلاک ڈایاگرام
درج ذیل خاکہ پچھلے باب کے خاکہ سے زیادہ تفصیلی ہے:


تصویر 5.12 کموڈور_64 سسٹم یونٹ کا بلاک ڈایاگرام

ROM اور RAM کو یہاں ایک بلاک کے طور پر دکھایا گیا ہے۔ اسکرین پر معلومات کو سنبھالنے کے لیے ویڈیو انٹرفیس چپ (IC)، جو پچھلے باب میں نہیں دکھائی گئی تھی، یہاں دکھائی گئی ہے۔ ان پٹ/آؤٹ پٹ ڈیوائسز کے لیے واحد بلاک، جو پچھلے باب میں دکھایا گیا ہے، یہاں دو بلاکس کے طور پر دکھایا گیا ہے: CIA #1 اور CIA #2۔ سی آئی اے کا مطلب ہے کمپلیکس انٹرفیس اڈاپٹر۔ ہر ایک کے پاس دو متوازی آٹھ بٹ بندرگاہیں ہیں (سسٹم یونٹ کی عمودی سطح پر بیرونی بندرگاہوں کے ساتھ الجھن میں نہ پڑیں) جنہیں پورٹ A اور پورٹ B کہا جاتا ہے۔ اس صورتحال میں CIA's پانچ بیرونی آلات سے منسلک ہیں۔ آلات کی بورڈ، جوائس اسٹک، ڈسک ڈرائیو/پرنٹر، اور ایک موڈیم ہیں۔ پرنٹر ڈسک ڈرائیو کے پیچھے جڑا ہوا ہے۔ ایک ساؤنڈ انٹرفیس ڈیوائس سرکٹ اور ایک پروگرام قابل منطق سرکٹ بھی ہے جو نہیں دکھایا گیا ہے۔

پھر بھی، ایک کریکٹر ROM ہے جسے دونوں CIAs کے ساتھ تبدیل کیا جا سکتا ہے جب ایک کریکٹر اسکرین پر بھیجا جاتا ہے اور اسے بلاک ڈایاگرام میں نہیں دکھایا جاتا ہے۔

کریکٹر ROM کی غیر موجودگی میں ان پٹ/آؤٹ پٹ سرکٹس کے لیے $D000 سے $DFFF تک RAM ایڈریس میں درج ذیل تفصیلی میموری کا نقشہ ہے:

جدول 5.11
تفصیلی میموری کا نقشہ $D000 سے $DFFF تک
ذیلی پتہ کی حد سرکٹ سائز (بائٹس)
D000 - D3FF VIC (ویڈیو انٹرفیس کنٹرولر (چپ)) 1K
D400 - D7FF SID (ساؤنڈ سرکٹ) 1K
D800 - DBFF رنگین رام 1K نببلز
DC00 - DCFF CIA #1 (کی بورڈ، جوائس اسٹک) 256
DD00 - DDFF CIA #2 (سیریل بس، یوزر پورٹ/RS-232) 256
DE00 - DEF I/O سلاٹ #1 کھولیں۔ 256
DF00 - DFFF I/O سلاٹ #2 کھولیں۔ 256

5.2 دو پیچیدہ انٹرفیس اڈاپٹر

کموڈور-64 سسٹم یونٹ میں دو خاص انٹیگریٹڈ سرکٹس (ICs) ہیں، اور ان میں سے ہر ایک کو کمپلیکس انٹرفیس اڈاپٹر کہا جاتا ہے۔ یہ دو چپس کی بورڈ اور دیگر پیری فیرلز کو مائیکرو پروسیسر میں انٹرفیس کرنے کے لیے استعمال کی جاتی ہیں۔ VIC اور اسکرین کے استثناء کے ساتھ، مائکرو پروسیسر اور پیری فیرلز کے درمیان تمام ان پٹ/آؤٹ پٹ سگنلز ان دو ICs سے گزرتے ہیں۔ کموڈور-64 کے ساتھ، میموری اور کسی پردیی کے درمیان کوئی براہ راست رابطہ نہیں ہے۔ میموری اور کسی بھی پردیی کے درمیان مواصلات مائکرو پروسیسر جمع کرنے والے سے گزرتا ہے، اور ان میں سے ایک CIA اڈاپٹر (ICs) ہے۔ ICs کو CIA #1 اور CIA #2 کہا جاتا ہے۔ سی آئی اے کا مطلب ہے کمپلیکس انٹرفیس اڈاپٹر۔

ہر سی آئی اے کے پاس 16 رجسٹر ہوتے ہیں۔ CIA میں ٹائمر/کاؤنٹر رجسٹر کے استثناء کے ساتھ، ہر رجسٹر 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 ایڈریس شامل ہیں۔ زیادہ تر RAM I/O میموری ایریا $D000 سے $DFFF تک اسکرین کریکٹرز کے لیے کریکٹر ROM کے میموری بینک کے ساتھ تبدیل کیا جا سکتا ہے۔ یہی وجہ ہے کہ جب کرداروں کو اسکرین پر بھیجا جاتا ہے، تو پیری فیرلز کام نہیں کرسکتے ہیں۔ اگرچہ صارف اس کو محسوس نہیں کرسکتا ہے کیونکہ آگے پیچھے تبادلہ تیز ہے۔

CIA #1 میں دو رجسٹر ہیں جنہیں پورٹ A اور پورٹ B کہا جاتا ہے۔ ان کے پتے بالترتیب $DC00 اور $DC01 ہیں۔ CIA #2 میں پورٹ A اور پورٹ B کے نام سے دو رجسٹر بھی ہیں۔ یقیناً، ان کے پتے مختلف ہیں۔ وہ بالترتیب $DD00 اور $DD01 ہیں۔

سی آئی اے میں پورٹ اے یا پورٹ بی ایک متوازی بندرگاہ ہے۔ اس کا مطلب ہے کہ یہ ڈیٹا کو ایک ساتھ آٹھ بٹس میں پیریفرل کو بھیج سکتا ہے یا ایک ساتھ آٹھ بٹس میں مائیکرو پروسیسر سے ڈیٹا وصول کر سکتا ہے۔

پورٹ A یا پورٹ B کے ساتھ منسلک ڈیٹا ڈائریکشن رجسٹر (DDR) ہے۔ CIA #1 (DDRA1) کے پورٹ A کے لیے ڈیٹا ڈائریکشن رجسٹر $DC02 کے میموری بائٹ مقام پر ہے۔ CIA #1 (DDRB1) کے پورٹ B کے لیے ڈیٹا ڈائریکشن رجسٹر $DC03 کے میموری بائٹ مقام پر ہے۔ CIA #2 (DDRA2) کے پورٹ A کے لیے ڈیٹا ڈائریکشن رجسٹر $DD02 کے میموری بائٹ مقام پر ہے۔ CIA #2 (DDRB2) کے پورٹ B کے لیے ڈیٹا ڈائریکشن رجسٹر $DD03 کے میموری بائٹ مقام پر ہے۔

اب، پورٹ A یا پورٹ B کے لیے ہر ایک بٹ کو متعلقہ ڈیٹا ڈائریکشن رجسٹر کے ذریعے ان پٹ یا آؤٹ پٹ کے لیے سیٹ کیا جا سکتا ہے۔ ان پٹ کا مطلب ہے کہ معلومات سی آئی اے کے ذریعے پیریفرل سے مائکرو پروسیسر تک جا رہی ہے۔ آؤٹ پٹ کا مطلب ہے کہ معلومات مائکرو پروسیسر سے سی آئی اے کے ذریعے پیریفرل تک جا رہی ہیں۔

اگر کسی پورٹ (رجسٹر) کے سیل کو ان پٹ کرنا ہے، تو ڈیٹا ڈائریکشن رجسٹر میں متعلقہ بٹ 0 ہے۔ اگر کسی پورٹ (رجسٹر) کے سیل کو آؤٹ پٹ کرنا ہے، تو ڈیٹا ڈائریکشن رجسٹر میں متعلقہ بٹ 1 ہے۔ زیادہ تر معاملات میں، پورٹ کے تمام 8 بٹس کو ان پٹ یا آؤٹ پٹ کے لیے پروگرام کیا جاتا ہے۔ جب کمپیوٹر آن ہوتا ہے، پورٹ A کو آؤٹ پٹ کے لیے پروگرام کیا جاتا ہے اور پورٹ B کو ان پٹ کے لیے پروگرام کیا جاتا ہے۔ درج ذیل کوڈ CIA #1 پورٹ A کو آؤٹ پٹ اور CIA #1 پورٹ B کو بطور ان پٹ بناتا ہے:

LDA #$FF
STA DDRA1 ; $DC00 کو $DC02 نے ڈائریکٹ کیا ہے۔
LDA #$00
STA DDRB1 ; $DC01 کو $DC03 نے ڈائریکٹ کیا ہے۔

DDRA1 $DC02 کی میموری بائٹ لوکیشن کے لیے لیبل (متغیر نام) ہے، اور DDRB1 $DC03 کے میموری بائٹ لوکیشن کے لیے لیبل (متغیر نام) ہے۔ پہلی ہدایت µP کے جمع کرنے والے پر 11111111 لوڈ کرتی ہے۔ دوسری ہدایت اس کو سی آئی اے نمبر کے پورٹ اے کے ڈیٹا ڈائریکشن رجسٹر میں کاپی کرتی ہے۔ 1. تیسری ہدایت µP کے جمع کرنے والے پر 00000000 لوڈ کرتی ہے۔ چوتھی ہدایت اس کو سی آئی اے نمبر کے پورٹ B کے ڈیٹا ڈائریکشن رجسٹر میں کاپی کرتی ہے۔ 1. یہ کوڈ آپریٹنگ سسٹم کے سب روٹینز میں سے ایک میں ہے جو کمپیوٹر پاور اپ پر یہ ابتدا کرتا ہے۔

ہر سی آئی اے کے پاس مائیکرو پروسیسر کے لیے انٹرپٹ سروس ریکوسٹ لائن ہوتی ہے۔ سی آئی اے #1 سے ایک کو جاتا ہے۔ IRQ µP کا پن سی آئی اے نمبر 2 سے ایک کو جاتا ہے۔ این ایم آئی µP کا پن یاد رکھو این ایم آئی کے مقابلے میں ایک اعلی ترجیح ہے IRQ .

5.3 کی بورڈ اسمبلی لینگویج پروگرامنگ

کموڈور-64 کے لیے صرف تین ممکنہ رکاوٹیں ہیں: IRQ ، BRK، اور این ایم آئی . کے لیے جمپ ٹیبل پوائنٹر IRQ ROM (آپریٹنگ سسٹم) میں $FFFE اور $FFFF پتوں پر ہے جو OS (ROM) میں موجود سب روٹین کے مساوی ہے۔ BRK کے لیے جمپ ٹیبل پوائنٹر OS میں $FFFC اور $FFFD ایڈریس پر ہے جو OS (ROM) میں موجود سب روٹین سے مطابقت رکھتا ہے۔ کے لیے جمپ ٹیبل پوائنٹر این ایم آئی OS میں $FFFA اور $FFFB پتوں پر ہے جو OS (ROM) میں موجود سب روٹین کے مساوی ہے۔ کے لئے IRQ ، اصل میں دو سب روٹینز ہیں۔ لہذا، BRK سافٹ ویئر انٹرپٹ (ہدایت) کا اپنا جمپ ٹیبل پوائنٹر ہے۔ کے لیے جمپ ٹیبل پوائنٹر IRQ کوڈ کی طرف لے جاتا ہے جو یہ فیصلہ کرتا ہے کہ آیا یہ ہارڈ ویئر میں رکاوٹ ہے یا سافٹ ویئر کی مداخلت جو مصروف ہے۔ اگر یہ ہارڈ ویئر میں رکاوٹ ہے، تو اس کے لیے معمول IRQ کہا جاتا ہے. اگر یہ سافٹ ویئر انٹرپٹ (BRK) ہے، تو BRK کے لیے روٹین کو کہا جاتا ہے۔ OS ورژن میں سے ایک میں، کے لیے سبروٹین IRQ $EA31 پر ہے اور BRK کے لیے سب روٹین $FE66 پر ہے۔ یہ پتے $FF81 سے نیچے ہیں، اس لیے یہ جمپ ٹیبل اندراجات نہیں ہیں اور وہ OS ورژن کے ساتھ تبدیل ہو سکتے ہیں۔ اس موضوع میں دلچسپی کے تین معمولات ہیں: ایک جو یہ چیک کرتا ہے کہ آیا یہ کلید دبائی گئی ہے یا BRK، وہ جو $FE43 پر ہے، اور وہ جو OS ورژن کے ساتھ تبدیل بھی ہو سکتی ہے۔

کموڈور-64 کمپیوٹر پرنٹنگ سیکشن (سر اور کاغذ) کے بغیر ظاہری شکل میں ایک بہت بڑا ٹائپ رائٹر (اوپر کی طرف) کی طرح ہے۔ کی بورڈ CIA #1 سے منسلک ہے۔ سی آئی اے # 1 پہلے سے طے شدہ طور پر کسی پروگرامنگ مداخلت کے بغیر اپنے طور پر ہر 1/60 سیکنڈ میں کی بورڈ کو اسکین کرتا ہے۔ لہذا، ایک سیکنڈ کے ہر 1/60 پر، CIA #1 ایک بھیجتا ہے۔ IRQ µP تک وہاں صرف ایک ہے IRQ µP پر پن کریں جو صرف CIA #1 سے آتا ہے۔ کا ایک ان پٹ پن این ایم آئی µP کا، جو اس سے مختلف ہے۔ IRQ ، صرف CIA #2 سے آتا ہے (مندرجہ ذیل مثال کو دیکھیں)۔ BRK دراصل ایک اسمبلی لینگوئج انسٹرکشن ہے جسے صارف پروگرام میں کوڈ کیا جاتا ہے۔

لہذا، ہر 1/60 سیکنڈ، IRQ روٹین جس کی طرف $FFFE اور $FFFF کی طرف اشارہ کیا جاتا ہے اسے کہا جاتا ہے۔ روٹین چیک کرتا ہے کہ آیا کوئی کلید دبائی گئی ہے یا BRK ہدایات کا سامنا ہوا ہے۔ اگر کوئی کلید دبائی جاتی ہے، تو کلید کو ہینڈل کرنے کا معمول کہا جاتا ہے۔ اگر یہ BRK کی ہدایت ہے، تو BRK کو ہینڈل کرنے کا معمول کہا جاتا ہے۔ اگر یہ نہ ہو تو کچھ نہیں ہوتا۔ نہ ہی ہو سکتا ہے، لیکن CIA #1 بھیجتا ہے۔ IRQ ہر 1/60 سیکنڈ میں µP تک۔

کی بورڈ کی قطار، جسے کی بورڈ بفر کے نام سے بھی جانا جاتا ہے، RAM بائٹ کے مقامات کی ایک رینج ہے جو $0277 سے $0280 تک شامل ہے؛ مجموعی طور پر 1010 بائٹس۔ یہ ایک فرسٹ-ان-فرسٹ-آؤٹ بفر ہے۔ اس کا مطلب ہے کہ آنے والا پہلا کردار سب سے پہلے چھوڑنے والا ہے۔ ایک مغربی یورپی کردار ایک بائٹ لیتا ہے۔

لہذا، جب ایک کلید کو دبانے پر پروگرام کوئی کردار استعمال نہیں کر رہا ہے، کلیدی کوڈ اس بفر (قطار) میں چلا جاتا ہے۔ بفر اس وقت تک بھرتا رہتا ہے جب تک کہ دس حروف نہ ہوں۔ دسویں حرف کے بعد دبایا جانے والا کوئی بھی حرف ریکارڈ نہیں ہوتا۔ اس کو اس وقت تک نظر انداز کیا جاتا ہے جب تک کہ قطار سے کم از کم ایک حرف حاصل نہ ہو جائے (کھانا)۔ جمپ ٹیبل میں سب روٹین کے لیے ایک اندراج ہے جو قطار سے مائکرو پروسیسر تک پہلا کریکٹر حاصل کرتا ہے۔ اس کا مطلب ہے کہ یہ وہ پہلا کردار لیتا ہے جو قطار میں جاتا ہے اور اسے µP کے جمع کرنے والے میں ڈال دیتا ہے۔ ایسا کرنے کے لیے جمپ ٹیبل سب روٹین کو GETIN (گیٹ ان کے لیے) کہا جاتا ہے۔ جمپ ٹیبل میں تھری بائٹ انٹری کے لیے پہلے بائٹ پر GETIN (ایڈریس $FFE4) کا لیبل لگا ہوا ہے۔ اگلے دو بائٹس پوائنٹر (ایڈریس) ہیں جو ROM (OS) میں اصل معمول کی طرف اشارہ کرتے ہیں۔ اس روٹین کو کال کرنا پروگرامر کی ذمہ داری ہے۔ بصورت دیگر، کی بورڈ بفر بھرا رہے گا اور حال ہی میں دبائی گئی تمام کلیدوں کو نظر انداز کر دیا جائے گا۔ جو قدر جمع کرنے والے میں جاتی ہے وہ متعلقہ کلید ASCII قدر ہے۔

کلیدی کوڈز پہلی جگہ قطار میں کیسے آتے ہیں؟ ایک جمپ ٹیبل روٹین ہے جسے SCNKEY کہا جاتا ہے (اسکین کی کے لیے)۔ اس روٹین کو سافٹ ویئر اور ہارڈ ویئر دونوں کے ذریعہ بلایا جاسکتا ہے۔ اس صورت میں، اسے مائکرو پروسیسر میں الیکٹرانکس (فزکس) سرکٹ کے ذریعے کہا جاتا ہے جب برقی سگنل IRQ کم ہے. اس آن لائن کیریئر کورس میں یہ بالکل ٹھیک کیسے کیا جاتا ہے اس پر توجہ نہیں دی گئی ہے۔

کی بورڈ بفر سے ایکومولیٹر A میں پہلا کلیدی کوڈ حاصل کرنے کا کوڈ صرف ایک لائن ہے:

اندر او

اگر کی بورڈ بفر خالی ہے تو، $00 جمع کرنے والے میں رکھا جاتا ہے۔ یاد رکھیں کہ صفر کے لیے ASCII کوڈ $00 نہیں ہے۔ یہ $30 ہے۔ $00 کا مطلب ہے Null۔ ایک پروگرام میں، وہاں ایک نقطہ ہو سکتا ہے جہاں پروگرام کو ایک اہم پریس کا انتظار کرنا پڑتا ہے. اس کا کوڈ یہ ہے:

JSR حاصل کرنے کا انتظار کریں۔
CMP #$00
مینڈک انتظار کریں۔

پہلی لائن میں، 'WAIT' ایک لیبل ہے جو RAM ایڈریس کی نشاندہی کرتا ہے جہاں JSR ہدایات ڈالی جاتی ہیں (ٹائپ کی جاتی ہیں)۔ GETIN بھی ایک پتہ ہے۔ یہ جمپ ٹیبل میں متعلقہ تین بائٹس میں سے پہلے کا پتہ ہے۔ GETIN اندراج کے ساتھ ساتھ جمپ ٹیبل میں تمام اندراجات (آخری تین کے علاوہ) تین بائٹس پر مشتمل ہیں۔ اندراج کا پہلا بائٹ JSR ہدایات ہے۔ اگلے دو بائٹس اصل GETIN سبروٹین کے باڈی کا پتہ ہے جو اب بھی ROM (OS) میں ہے لیکن جمپ ٹیبل کے نیچے ہے۔ لہذا، اندراج GETIN سبروٹین پر کودنے کو کہتا ہے۔ اگر کی بورڈ کی قطار خالی نہیں ہے، تو GETIN فرسٹ-ان-فرسٹ-آؤٹ قطار کے ASCII کلیدی کوڈ کو جمع کرنے والے میں رکھتا ہے۔ اگر قطار خالی ہے تو، Null ($00) کو جمع کرنے والے میں ڈال دیا جاتا ہے۔

دوسری ہدایت $00 کے ساتھ جمع کرنے والے کی قدر کا موازنہ کرتی ہے۔ اگر یہ $00 ہے، تو اس کا مطلب ہے کہ کی بورڈ کی قطار خالی ہے، اور CMP ہدایات 1 کو پروسیسر اسٹیٹس رجسٹر (جسے صرف اسٹیٹس رجسٹر کہا جاتا ہے) کے Z پرچم پر بھیجتی ہے۔ اگر A میں قیمت $00 نہیں ہے، تو CMP ہدایات اسٹیٹس رجسٹر کے Z پرچم کو 0 بھیجتی ہے۔

تیسری ہدایات جو کہ 'BEQ WAIT' ہے پروگرام کو پہلی ہدایات پر واپس بھیج دیتی ہے اگر اسٹیٹس رجسٹر کا Z جھنڈا 1 ہے۔ پہلی، دوسری اور تیسری ہدایات کو بار بار ترتیب سے عمل میں لایا جاتا ہے جب تک کہ کی بورڈ پر ایک کلید دبائی نہ جائے۔ . اگر کسی کلید کو کبھی نہیں دبایا جاتا ہے، تو سائیکل غیر معینہ مدت تک دہرایا جاتا ہے۔ اس طرح کا کوڈ سیگمنٹ عام طور پر ٹائمنگ کوڈ سیگمنٹ کے ساتھ لکھا جاتا ہے جو کچھ دیر بعد لوپ چھوڑ دیتا ہے اگر کوئی کلید کبھی دبائی نہیں جاتی ہے (مندرجہ ذیل بحث کو دیکھیں)۔

نوٹ : کی بورڈ ڈیفالٹ ان پٹ ڈیوائس ہے اور اسکرین ڈیفالٹ آؤٹ پٹ ڈیوائس ہے۔

5.4 چینل، ڈیوائس نمبر، اور منطقی فائل نمبر

اس باب میں کموڈور-64 آپریٹنگ سسٹم کی وضاحت کے لیے استعمال کیے جانے والے پیری فیرلز ہیں کی بورڈ، اسکرین (مانیٹر)، ڈسک ڈرائیو کے ساتھ ڈسکیٹ، پرنٹر، اور موڈیم جو RS-232C انٹرفیس کے ذریعے جڑتا ہے۔ ان آلات اور سسٹم یونٹ (مائیکرو پروسیسر اور میموری) کے درمیان رابطے کے لیے ایک چینل قائم کرنا ہوگا۔

ایک چینل ایک بفر، ڈیوائس نمبر، ایک منطقی فائل نمبر، اور اختیاری طور پر ایک ثانوی پتہ پر مشتمل ہوتا ہے۔ ان شرائط کی وضاحت حسب ذیل ہے:

ایک بفر
پچھلے حصے سے نوٹس کریں کہ جب کوئی کلید دبائی جاتی ہے، تو اس کا کوڈ RAM میں ایک بائٹ مقام پر جانا چاہیے جو لگاتار دس مقامات کی ایک سیریز میں ہے۔ دس مقامات کی یہ سیریز کی بورڈ بفر ہے۔ ہر ان پٹ یا آؤٹ پٹ ڈیوائس (پیری فیرل) میں RAM میں لگاتار مقامات کی ایک سیریز ہوتی ہے جسے بفر کہتے ہیں۔

ڈیوائس نمبر
کموڈور-64 کے ساتھ، کوئی بھی پیریفیرل ڈیوائس نمبر کے ساتھ دیا جاتا ہے۔ درج ذیل جدول میں مختلف آلات اور ان کے نمبر دکھائے گئے ہیں۔

جدول 5.41
کموڈور 64 ڈیوائس نمبرز اور ان کے آلات
نمبر ڈیوائس
0 کی بورڈ
1 ٹیپ ڈرائیو
2 RS 232C انٹرفیس مثلاً ایک موڈیم
3 سکرین
4 پرنٹر نمبر 1
5 پرنٹر نمبر 2
6 پلاٹر نمبر 1
7 پلاٹر نمبر 2
8 ڈسک ڈرائیو
9
¦
¦
¦
30
8 (شامل) سے 22 مزید اسٹوریج ڈیوائسز تک

کمپیوٹر کے لیے دو قسم کی بندرگاہیں ہیں۔ ایک قسم بیرونی ہے، سسٹم یونٹ کی عمودی سطح پر۔ دوسری قسم اندرونی ہے۔ یہ اندرونی بندرگاہ ایک رجسٹر ہے۔ کموڈور-64 میں چار اندرونی بندرگاہیں ہیں: CIA 1 کے لیے پورٹ A اور پورٹ B اور CIA 2 کے لیے پورٹ A اور پورٹ B۔ کموڈور-64 کے لیے ایک بیرونی بندرگاہ ہے جسے سیریل پورٹ کہا جاتا ہے۔ اوپر کی طرف نمبر 3 والے آلات سیریل پورٹ سے جڑے ہوئے ہیں۔ وہ گل داؤدی زنجیر کے انداز میں جڑے ہوئے ہیں (ایک جو دوسرے کے پیچھے جڑا ہوا ہے)، جن میں سے ہر ایک اس کے آلہ نمبر سے قابل شناخت ہے۔ اوپر والے نمبر 8 والے آلات عام طور پر سٹوریج کے آلات ہوتے ہیں۔

نوٹ : ڈیفالٹ ان پٹ ڈیوائس کی بورڈ ہے جس کا ڈیوائس نمبر 0 ہے۔ ڈیفالٹ آؤٹ پٹ ڈیوائس وہ اسکرین ہے جس کا ڈیوائس نمبر 3 ہے۔

منطقی فائل نمبر
ایک منطقی فائل نمبر ایک آلہ (پیری فیرل) کے لیے دیا گیا ایک نمبر ہے جس ترتیب میں وہ رسائی کے لیے کھولے گئے ہیں۔ وہ 010 سے 255 تک ہیں۔ 10 .

ثانوی پتہ
تصور کریں کہ ڈسک میں دو فائلیں (یا ایک سے زیادہ فائلیں) کھلی ہیں۔ ان دو فائلوں کے درمیان فرق کرنے کے لیے، ثانوی پتے استعمال کیے جاتے ہیں۔ ثانوی پتے ایسے نمبر ہوتے ہیں جو آلہ سے دوسرے آلہ میں مختلف ہوتے ہیں۔ پرنٹر کے لیے سیکنڈری ایڈریس کے طور پر 3 کا مطلب ڈسک ڈرائیو کے لیے سیکنڈری ایڈریس کے طور پر 3 کے معنی سے مختلف ہے۔ معنی کا انحصار خصوصیات پر ہوتا ہے جیسے فائل پڑھنے کے لیے کب کھولی جاتی ہے یا جب فائل لکھنے کے لیے کھولی جاتی ہے۔ ممکنہ ثانوی نمبر 0 سے ہیں۔ 10 15 تک 10 ہر ڈیوائس کے لیے۔ بہت سے آلات کے لیے، نمبر 15 کمانڈ بھیجنے کے لیے استعمال ہوتا ہے۔

نوٹ : ڈیوائس نمبر کو ڈیوائس ایڈریس کے نام سے بھی جانا جاتا ہے اور سیکنڈری نمبر کو سیکنڈری ایڈریس بھی کہا جاتا ہے۔

ایک پردیی ہدف کی شناخت
پہلے سے طے شدہ کموڈور میموری میپ کے لیے، $0200 سے $02FF (صفحہ 2) تک کے میموری ایڈریس صرف ROM (Kernal) میں آپریٹنگ سسٹم کے ذریعے استعمال ہوتے ہیں نہ کہ آپریٹنگ سسٹم کے علاوہ BASIC زبان کے ذریعے۔ اگرچہ BASIC اب بھی ROM OS کے ذریعے مقامات کا استعمال کر سکتا ہے۔

موڈیم اور پرنٹر دو مختلف پردیی اہداف ہیں۔ اگر ڈسک سے دو فائلیں کھولی جاتی ہیں، تو وہ دو مختلف اہداف ہیں۔ پہلے سے طے شدہ میموری میپ کے ساتھ، لگاتار تین میزیں (فہرستیں) ہیں جنہیں ایک بڑی میز کے طور پر دیکھا جا سکتا ہے۔ یہ تین میزیں منطقی فائل نمبرز، ڈیوائس نمبرز اور سیکنڈری ایڈریسز کے درمیان تعلق رکھتی ہیں۔ اس کے ساتھ، ایک مخصوص چینل یا ان پٹ/آؤٹ پٹ ہدف قابل شناخت ہو جاتا ہے۔ تین میزیں فائل ٹیبل کہلاتی ہیں۔ رام ایڈریس اور ان کے پاس کیا ہیں:

$0259 - $0262: لیبل کے ساتھ ٹیبل، LAT، دس فعال منطقی فائل نمبرز تک۔
$0263 — $026C: لیبل کے ساتھ ٹیبل، FAT، دس متعلقہ ڈیوائس نمبرز تک۔
$026D - $0276: دس متعلقہ ثانوی پتوں کے لیبل، SAT کے ساتھ ٹیبل۔

یہاں، '—' کا مطلب ہے 'to'، اور ایک نمبر ایک بائٹ لیتا ہے۔

قاری پوچھ سکتا ہے، 'چینل کی شناخت میں ہر ڈیوائس کا بفر کیوں شامل نہیں ہے؟' ٹھیک ہے، جواب یہ ہے کہ کموڈور-64 کے ساتھ، ہر ایک بیرونی ڈیوائس (پیری فیرل) میں RAM (میموری میپ) میں بائٹس کی ایک مقررہ سیریز ہوتی ہے۔ بغیر کسی کھلے ہوئے چینل کے، ان کی پوزیشنیں اب بھی یادداشت میں موجود ہیں۔ کی بورڈ کے لیے بفر، مثال کے طور پر، ڈیفالٹ میموری میپ کے لیے $0277 سے $0280 (بشمول) طے کیے گئے ہیں۔

Kernal SETLFS اور SETNAM سبروٹینز
SETLFS اور SETNAM Kernal روٹین ہیں۔ ایک چینل کو منطقی فائل کے طور پر دیکھا جا سکتا ہے۔ کسی چینل کو کھولنے کے لیے، منطقی فائل نمبر، ڈیوائس نمبر، اور ایک اختیاری ثانوی پتہ تیار کرنا ہوگا۔ ایک اختیاری فائل نام (ٹیکسٹ) کی بھی ضرورت پڑسکتی ہے۔ SETLFS روٹین منطقی فائل نمبر، ڈیوائس نمبر، اور ایک اختیاری ثانوی پتہ ترتیب دیتا ہے۔ یہ نمبر ان کے متعلقہ جدولوں میں رکھے گئے ہیں۔ SETNAM روٹین فائل کے لیے ایک سٹرنگ کا نام ترتیب دیتا ہے جو ایک چینل کے لیے لازمی اور دوسرے چینل کے لیے اختیاری ہو سکتا ہے۔ یہ میموری میں ایک پوائنٹر (دو بائٹ ایڈریس) پر مشتمل ہوتا ہے۔ پوائنٹر اسٹرنگ (نام) کے آغاز کی طرف اشارہ کرتا ہے جو میموری میں کسی اور جگہ ہو سکتا ہے۔ سٹرنگ کا نام ایک بائٹ سے شروع ہوتا ہے جس میں سٹرنگ کی لمبائی ہوتی ہے، اس کے بعد ٹیکسٹ (نام) آتا ہے۔ نام زیادہ سے زیادہ سولہ بائٹس (لمبا) ہے۔

SETLFS روٹین کو کال کرنے کے لیے، صارف پروگرام کو ڈیفالٹ میموری میپ کے لیے ROM میں OS کے جمپ ٹیبل کے $FFBA ایڈریس پر (JSR) کودنا پڑتا ہے۔ یاد رکھیں کہ جمپ ٹیبل کے آخری چھ بائٹس کو چھوڑ کر، ہر اندراج تین بائٹس پر مشتمل ہوتا ہے۔ پہلا بائٹ جے ایس آر انسٹرکشن ہے، جو پھر سب روٹین پر جاتی ہے، اگلے دو بائٹس میں ایڈریس سے شروع ہوتی ہے۔ SETNAM روٹین کو کال کرنے کے لیے، صارف پروگرام کو ROM میں OS کے جمپ ٹیبل کے $FFBD ایڈریس پر (JSR) کودنا پڑتا ہے۔ ان دو معمولات کا استعمال مندرجہ ذیل بحث میں دکھایا گیا ہے۔

5.5 ایک چینل کھولنا، ایک منطقی فائل کھولنا، ایک منطقی فائل کو بند کرنا، اور تمام I/O چینلز کو بند کرنا

ایک چینل میموری بفر، ایک منطقی فائل نمبر، ڈیوائس نمبر (آلہ کا پتہ) اور اختیاری ثانوی پتہ (ایک نمبر) پر مشتمل ہوتا ہے۔ ایک منطقی فائل (ایک تجریدی) جس کی شناخت ایک منطقی فائل نمبر سے ہوتی ہے وہ پیریفیرل جیسے پرنٹر، موڈیم، ڈسک ڈرائیو وغیرہ کا حوالہ دے سکتی ہے۔ ان مختلف آلات میں سے ہر ایک کے منطقی فائل نمبر مختلف ہونے چاہئیں۔ ڈسک میں بہت سی فائلیں ہیں۔ ایک منطقی فائل ڈسک میں کسی خاص فائل کا حوالہ بھی دے سکتی ہے۔ اس مخصوص فائل میں ایک منطقی فائل نمبر بھی ہوتا ہے جو پرنٹر یا موڈیم جیسے پیری فیرلز سے مختلف ہوتا ہے۔ منطقی فائل نمبر پروگرامر کے ذریعہ دیا جاتا ہے۔ یہ 010 ($00) سے 25510 ($FF) تک کوئی بھی نمبر ہو سکتا ہے۔

OS 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 کے تین رجسٹروں میں موجود ہیں۔ رجسٹر میں مناسب نمبر ڈالنے کے بعد، معمول کو پروگرام میں صرف ایک علیحدہ لائن میں درج ذیل کے ساتھ بلایا جاتا ہے:

JSR SETLFS

معمول مختلف نمبروں کو ان کی فائل ٹیبل میں مناسب طریقے سے رکھتا ہے۔

OS SETNAM روٹین
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 اوپن روٹین
OS اوپن روٹین تک OS ROM جمپ ٹیبل پر چھلانگ لگا کر (JSR) $FFC0 پر رسائی حاصل کی جاتی ہے۔ یہ معمول لاجیکل فائل نمبر، ڈیوائس نمبر (اور بفر)، ایک ممکنہ ثانوی پتہ، اور ایک ممکنہ فائل نام کا استعمال کرتا ہے، تاکہ کموڈور کمپیوٹر اور فائل کے درمیان بیرونی ڈیوائس یا خود بیرونی ڈیوائس میں کنکشن فراہم کیا جا سکے۔

یہ معمول، دیگر تمام کموڈور OS ROM کے معمولات کی طرح، کوئی دلیل نہیں لیتا ہے۔ اگرچہ یہ µP رجسٹروں کا استعمال کرتا ہے، لیکن کسی بھی رجسٹر کو اس کے لیے دلائل (اقدار) کے ساتھ پہلے سے لوڈ نہیں کیا جانا تھا۔ اسے کوڈ کرنے کے لیے، SETLFS اور SETNAM کو کال کرنے کے بعد صرف درج ذیل ٹائپ کریں:

جے ایس آر اوپن

OPEN روٹین میں غلطیاں ہو سکتی ہیں۔ مثال کے طور پر، فائل پڑھنے کے لیے نہیں مل سکتی ہے۔ جب کوئی خرابی واقع ہوتی ہے تو، روٹین ناکام ہو جاتی ہے اور متعلقہ ایرر نمبر کو µ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' کھولیں: GET#8,X$
7 آؤٹ پٹ فائل نہیں ہے۔ 1،0 کھولیں: پرنٹ نمبر 1
8 فائل کا نام غائب ہے۔ لوڈ ''، 8
9 غیر قانونی آلہ نمبر 'پروگرام' لوڈ کریں، 3

یہ جدول اس طرح پیش کیا گیا ہے کہ قاری کو اور بھی کئی مقامات پر نظر آنے کا امکان ہے۔

OS CHKIN روٹین
OS CHKIN روٹین کو $FFC6 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ فائل (لوجیکل فائل) کو کھولنے کے بعد یہ فیصلہ کرنا ہوتا ہے کہ اوپننگ ان پٹ کے لیے ہے یا آؤٹ پٹ کے لیے۔ CHKIN روٹین کھولنے کو ایک ان پٹ چینل بناتی ہے۔ اس روٹین کو µP X رجسٹر سے منطقی فائل نمبر پڑھنے کی ضرورت ہے۔ لہذا، پروگرامر کو اس روٹین کو کال کرنے سے پہلے X رجسٹر میں منطقی فائل نمبر ڈالنا ہوگا۔ اسے محض اس طرح کہا جاتا ہے:

جے ایس آر چکن

OS CHKOUT روٹین
OS CHKOUT روٹین کو $FFC9 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ فائل (لوجیکل فائل) کو کھولنے کے بعد یہ فیصلہ کرنا ہوتا ہے کہ اوپننگ ان پٹ کے لیے ہے یا آؤٹ پٹ کے لیے۔ CHKOUT روٹین کھولنے کو ایک آؤٹ پٹ چینل بناتی ہے۔ اس روٹین کو µP X رجسٹر سے منطقی فائل نمبر پڑھنے کی ضرورت ہے۔ لہذا، پروگرامر کو اس روٹین کو کال کرنے سے پہلے X رجسٹر میں منطقی فائل نمبر ڈالنا ہوگا۔ اسے محض اس طرح کہا جاتا ہے:

جے ایس آر چیک آؤٹ

OS بند کرنے کا معمول
OS CLOSE روٹین کو $FFC3 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ منطقی فائل کھولنے اور بائٹس منتقل ہونے کے بعد، منطقی فائل کو بند کرنا پڑتا ہے۔ منطقی فائل کو بند کرنے سے سسٹم یونٹ میں موجود بفر کو کسی دوسری منطقی فائل کے استعمال کے لیے آزاد کر دیا جاتا ہے جسے ابھی کھولنا باقی ہے۔ تین فائل ٹیبلز میں متعلقہ پیرامیٹرز کو بھی حذف کر دیا گیا ہے۔ نمبر-آف-فائل-اوپن کے لیے RAM کے مقام میں 1 کی کمی ہوئی ہے۔

جب کمپیوٹر کے لیے پاور آن ہوتی ہے تو مدر بورڈ پر مائکرو پروسیسر اور دیگر مین چپس (انٹیگریٹڈ سرکٹس) کے لیے ہارڈویئر ری سیٹ ہوتا ہے۔ اس کے بعد مدر بورڈ پر کچھ RAM میموری مقامات اور کچھ رجسٹروں کی شروعات ہوتی ہے۔ شروع کرنے کے عمل میں، آپریٹنگ سسٹم کے ورژن پر منحصر ہے، صفحہ صفر میں $0098 ایڈریس کی بائٹ میموری لوکیشن NFILES یا LDTND لیبل کے ساتھ دی جاتی ہے۔ جب کمپیوٹر کام کر رہا ہوتا ہے، تو 8 بٹس کا یہ ایک بائٹ مقام کھلی ہوئی منطقی فائلوں کی تعداد رکھتا ہے، اور لگاتار تین فائلوں کی میزوں کا آغاز ایڈریس انڈیکس رکھتا ہے۔ دوسرے لفظوں میں، اس بائٹ میں فائلوں کی کھلی تعداد ہے جو منطقی فائل کے بند ہونے پر 1 سے کم ہوتی ہے۔ جب منطقی فائل بند ہوجاتی ہے تو، ٹرمینل (منزل) ڈیوائس یا ڈسک میں اصل فائل تک رسائی ممکن نہیں رہتی۔

منطقی فائل کو بند کرنے کے لیے، پروگرامر کو منطقی فائل نمبر کو µP جمع کرنے والے میں ڈالنا پڑتا ہے۔ یہ وہی منطقی فائل نمبر ہے جو فائل کو کھولنے میں استعمال ہوتا ہے۔ CLOSE روٹین کو اس مخصوص فائل کو بند کرنے کے لیے اس کی ضرورت ہوتی ہے۔ دوسرے OS ROM روٹینز کی طرح، CLOSE روٹین کوئی دلیل نہیں لیتا، حالانکہ جمع کرنے والے سے استعمال ہونے والی قدر کسی حد تک دلیل ہے۔ اسمبلی کی زبان کی ہدایات کی لائن صرف یہ ہے:

جے ایس آر بند

حسب ضرورت یا پہلے سے طے شدہ 6502 اسمبلی لینگویج سب روٹینز (روٹینز) دلائل نہیں لیتے ہیں۔ تاہم، دلائل غیر رسمی طور پر ان اقدار کو ڈال کر آتے ہیں جو سب روٹین مائکرو پروسیسر کے رجسٹر میں استعمال کرے گی۔

CLRCHN روٹین
OS CLRCHN روٹین کو $FFCC پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ CLRCHN کا مطلب CLeR CHanneL ہے۔ جب ایک منطقی فائل بند ہو جاتی ہے، تو اس کے منطقی فائل نمبر، ڈیوائس نمبر، اور ممکنہ ثانوی پتہ کے پیرامیٹرز کو حذف کر دیا جاتا ہے۔ لہذا، منطقی فائل کا چینل صاف ہو گیا ہے۔

مینوئل کہتا ہے کہ OS CLRCHN روٹین تمام کھلے ہوئے چینلز کو صاف کرتا ہے اور ڈیفالٹ ڈیوائس نمبرز اور دیگر ڈیفالٹس کو بحال کرتا ہے۔ کیا اس کا مطلب یہ ہے کہ پیریفرل کے لیے ڈیوائس نمبر کو تبدیل کیا جا سکتا ہے؟ ٹھیک ہے، بالکل نہیں. آپریٹنگ سسٹم کے آغاز کے دوران، کمپیوٹر کے آپریٹ ہونے پر موجودہ ان پٹ ڈیوائس نمبر کو رکھنے کے لیے $0099 ایڈریس کا بائٹ لوکیشن DFLTI لیبل کے ساتھ دیا جاتا ہے۔ کموڈور-64 ایک وقت میں صرف ایک پیریفرل تک رسائی حاصل کر سکتا ہے۔ آپریٹنگ سسٹم کے آغاز کے دوران، کمپیوٹر کے آپریٹ ہونے پر موجودہ آؤٹ پٹ ڈیوائس نمبر رکھنے کے لیے $009A ایڈریس کا بائٹ لوکیشن DFLTO لیبل کے ساتھ دیا جاتا ہے۔

جب CLRCHN سب روٹین کو کال کیا جاتا ہے، تو یہ DFLTI متغیر کو 0 ($00) پر سیٹ کرتا ہے جو کہ ڈیفالٹ ان پٹ ڈیوائس نمبر (کی بورڈ) ہے۔ یہ DFLTO متغیر کو 3 ($03) پر سیٹ کرتا ہے جو ڈیفالٹ آؤٹ پٹ ڈیوائس نمبر (اسکرین) ہے۔ دوسرے ڈیوائس نمبر کے متغیرات کو بھی اسی طرح دوبارہ ترتیب دیا گیا ہے۔ یہ ان پٹ/آؤٹ پٹ ڈیوائسز کو نارمل (پہلے سے طے شدہ اقدار) پر دوبارہ ترتیب دینے (یا بحال کرنے) کا مطلب ہے۔

کموڈور-64 مینوئل کہتا ہے کہ CLRCHN روٹین کو کال کرنے کے بعد، کھلی ہوئی منطقی فائلیں کھلی رہتی ہیں اور پھر بھی بائٹس (ڈیٹا) کو منتقل کر سکتی ہیں۔ اس کا مطلب ہے کہ CLRCHN روٹین فائل ٹیبلز میں متعلقہ اندراجات کو حذف نہیں کرتا ہے۔ CLRCHN نام اپنے معنی کے لحاظ سے کافی مبہم ہے۔

5.6 کریکٹر کو سکرین پر بھیجنا

سکرین پر کرداروں اور گرافکس کے ڈسپلے کو ہینڈل کرنے کے لیے مرکزی مربوط سرکٹ (IC) کو ویڈیو انٹرفیس کنٹرولر (چِپ) کہا جاتا ہے جسے کموڈور-64 میں VIC کہا جاتا ہے (دراصل VIC ورژن 2 کے لیے VIC II)۔ اسکرین پر جانے کے لیے معلومات (اقدار) کے لیے، اسے اسکرین تک پہنچنے سے پہلے VIC II سے گزرنا پڑتا ہے۔

اسکرین 25 قطاروں اور کریکٹر سیلز کے 40 کالموں پر مشتمل ہے۔ اس سے 40 x 25 = 1000 حروف بنتے ہیں جو اسکرین پر دکھائے جا سکتے ہیں۔ VIC II حروف کے لیے اسی مناسبت سے 1000 میموری RAM لگاتار بائٹ مقامات کو پڑھتا ہے۔ ان 1000 مقامات کو ایک ساتھ اسکرین میموری کہا جاتا ہے۔ جو کچھ ان 1000 مقامات میں جاتا ہے وہ کریکٹر کوڈز ہیں۔ کموڈور-64 کے لیے، کریکٹر کوڈز ASCII کوڈز سے مختلف ہیں۔

کریکٹر کوڈ ایک کریکٹر پیٹرن نہیں ہے۔ وہاں بھی ہے جسے کریکٹر ROM کے نام سے جانا جاتا ہے۔ کریکٹر ROM ہر طرح کے کریکٹر پیٹرن پر مشتمل ہوتا ہے، جن میں سے کچھ کی بورڈ پر موجود کریکٹر پیٹرن سے مطابقت رکھتے ہیں۔ کریکٹر ROM اسکرین میموری سے مختلف ہے۔ جب کسی کردار کو اسکرین پر ظاہر کرنا ہوتا ہے، تو کریکٹر کوڈ کو اسکرین میموری کی 1000 پوزیشنوں میں سے ایک پوزیشن پر بھیجا جاتا ہے۔ وہاں سے، متعلقہ پیٹرن کو اس کریکٹر ROM سے منتخب کیا جاتا ہے جو اسکرین پر ظاہر ہونا ہے۔ کریکٹر کوڈ سے کریکٹر ROM میں صحیح پیٹرن کا انتخاب VIC II (ہارڈ ویئر) کے ذریعے کیا جاتا ہے۔

$D000 اور $DFFF کے درمیان میموری کے بہت سے مقامات کے دو مقاصد ہوتے ہیں: وہ اسکرین کے علاوہ ان پٹ/آؤٹ پٹ آپریشنز کو ہینڈل کرنے کے لیے استعمال ہوتے ہیں یا اسکرین کے لیے کریکٹر ROM کے طور پر استعمال ہوتے ہیں۔ میموری کے دو بلاکس کا تعلق ہے۔ ایک RAM ہے اور دوسرا ROM کردار ROM کے لیے ہے۔ ان پٹ/آؤٹ پٹ یا کریکٹر پیٹرن (کریکٹر ROM) کو ہینڈل کرنے کے لیے بینکوں کا تبادلہ سافٹ ویئر کے ذریعے کیا جاتا ہے (ROM میں OS کا معمول $F000 سے $FFFF تک)۔

نوٹ : VIC کے پاس ایسے رجسٹر ہیں جو $D000 اور $DFFF کی حد میں میموری کی جگہ کے پتے کے ساتھ ایڈریس کیے جاتے ہیں۔

CHROUT روٹین
OS CHROUT روٹین کو $FFD2 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ یہ معمول، جب بلایا جاتا ہے، وہ بائٹ لیتا ہے جو پروگرامر نے µP جمع کرنے والے میں ڈالا ہے اور اسکرین پر پرنٹ کرتا ہے جہاں کرسر ہے۔ مثال کے طور پر 'E' کریکٹر پرنٹ کرنے کے لیے کوڈ سیگمنٹ یہ ہے:

LDA #$05
CHROUT

0516 'E' کے لیے ASCII کوڈ نہیں ہے۔ کموڈور-64 کے اسکرین کے لیے اپنے کریکٹر کوڈز ہیں جہاں $05 کا مطلب ہے 'E'۔ #$05 نمبر کو اسکرین میموری میں رکھا جاتا ہے اس سے پہلے کہ VIC اسے اسکرین پر بھیجے۔ یہ دو کوڈنگ لائنیں چینل کے سیٹ اپ ہونے، منطقی فائل کے کھلنے اور آؤٹ پٹ کے لیے CHKOUT روٹین کو بلانے کے بعد آنی چاہئیں۔ مکمل کوڈ یہ ہے:

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$03 ; اسکرین کے لیے ڈیوائس نمبر $03 ہے۔
LDY #$FF ; کوئی ثانوی پتہ نہیں۔
JSR SETLFS ؛ سیٹ اپ چینل مناسب
; SETNAM نہیں کیونکہ اسکرین کو نام کی ضرورت نہیں ہے۔
;
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; آؤٹ پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
جے ایس آر چیک آؤٹ
;
; اسکرین پر چار آؤٹ پٹ
LDA #$05
JSR CHROUT
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند

دوسرے پروگرام کو چلانے سے پہلے افتتاح کو بند کر دینا چاہیے۔ فرض کریں کہ کمپیوٹر صارف توقع کے وقت کی بورڈ پر ایک حرف ٹائپ کرتا ہے۔ درج ذیل پروگرام کی بورڈ سے سکرین پر ایک کریکٹر پرنٹ کرتا ہے۔

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$03 ; اسکرین کے لیے ڈیوائس نمبر $03 ہے۔
LDY #$FF ; کوئی ثانوی پتہ نہیں۔
JSR SETLFS ؛ سیٹ اپ چینل مناسب
; SETNAM نہیں کیونکہ اسکرین کو نام کی ضرورت نہیں ہے۔
;
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; آؤٹ پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
جے ایس آر چیک آؤٹ
;
; کی بورڈ سے چار ان پٹ کریں۔
جے ایس آر حاصل کرنے کا انتظار کریں؛ کی بورڈ کی قطار خالی ہونے پر A میں $00 ڈالتا ہے۔
CMP #$00 ; اگر $00 A پر گیا، تو Z موازنہ کے ساتھ 1 ہے۔
انتظار کرو اگر 0 جمع کرنے والے پر چلا گیا تو دوبارہ قطار سے حاصل کریں۔
BNE PRNSCRN ; PRNSCRN پر جائیں اگر Z 0 ہے، کیونکہ A کے پاس اب $00 نہیں ہے۔
; اسکرین پر چار آؤٹ پٹ
PRNSCRN JSR CHROUT ; A میں چار کو اسکرین پر بھیجیں۔
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند

نوٹ : WAIT اور PRNSCRN وہ لیبل ہیں جو پتوں کی شناخت کرتے ہیں۔ کی بورڈ سے بائٹ جو µP جمع کرنے والے میں آتا ہے ایک ASCII کوڈ ہے۔ کموڈور-64 کے ذریعے اسکرین پر بھیجے جانے والے متعلقہ کوڈ کو مختلف ہونا چاہیے۔ پچھلے پروگرام میں سادگی کی خاطر اس کو مدنظر نہیں رکھا گیا ہے۔

5.7 ڈسک ڈرائیو کے لیے بائٹس بھیجنا اور وصول کرنا

کموڈور-64 کے سسٹم یونٹ (مدر بورڈ) میں دو پیچیدہ انٹرفیس اڈاپٹر ہیں جنہیں VIA #1 اور CIA #2 کہتے ہیں۔ ہر سی آئی اے کے پاس دو متوازی بندرگاہیں ہیں جنہیں پورٹ اے اور پورٹ بی کہا جاتا ہے۔ کموڈری-64 سسٹم یونٹ کے پیچھے عمودی سطح پر ایک بیرونی بندرگاہ ہے جسے سیریل پورٹ کہا جاتا ہے۔ اس پورٹ میں 6 پن ہیں جن میں سے ایک ڈیٹا کے لیے ہے۔ ڈیٹا سسٹم یونٹ میں داخل ہوتا ہے یا اسے چھوڑ دیتا ہے، ایک وقت میں تھوڑا سا۔

CIA #2 کے اندرونی پورٹ A سے آٹھ متوازی بٹس، مثال کے طور پر، CIA میں شفٹ رجسٹر کے ذریعے سیریل ڈیٹا میں تبدیل ہونے کے بعد بیرونی سیریل پورٹ کے ذریعے سسٹم یونٹ سے باہر جا سکتے ہیں۔ بیرونی سیریل پورٹ سے آٹھ بٹ سیریل ڈیٹا CIA میں شفٹ رجسٹر کے ذریعے متوازی ڈیٹا میں تبدیل ہونے کے بعد CIA #2 کے اندرونی پورٹ A میں جا سکتا ہے۔

کموڈور-64 سسٹم یونٹ (بیس یونٹ) ڈسکیٹ کے ساتھ ایک بیرونی ڈسک ڈرائیو استعمال کرتا ہے۔ ڈیزی چین فیشن میں اس ڈسک ڈرائیو سے ایک پرنٹر منسلک کیا جا سکتا ہے (آلات کو ایک تار کے طور پر سیریز میں جوڑنا)۔ ڈسک ڈرائیو کے لیے ڈیٹا کیبل کموڈور-64 سسٹم یونٹ کے بیرونی سیریل پورٹ سے منسلک ہے۔ اس کا مطلب ہے کہ ایک گل داؤدی زنجیروں والا پرنٹر بھی اسی سیریل پورٹ سے جڑا ہوا ہے۔ ان دو آلات کی شناخت دو مختلف ڈیوائس نمبرز (بالترتیب 8 اور 4) سے ہوتی ہے۔

ڈسک ڈرائیو کے لیے ڈیٹا بھیجنا یا وصول کرنا اسی طریقہ کار کی پیروی کرتا ہے جیسا کہ پہلے بیان کیا گیا ہے۔ یہ ہے کہ:

  • منطقی فائل (نمبر) کا نام ترتیب دینا جو کہ SETNAM روٹین کا استعمال کرتے ہوئے اصل ڈسک فائل کی طرح ہے۔
  • OPEN روٹین کا استعمال کرتے ہوئے منطقی فائل کو کھولنا۔
  • یہ فیصلہ کرنا کہ آیا یہ CHKOUT یا CHKIN روٹین کا استعمال کرتے ہوئے ان پٹ یا آؤٹ پٹ ہے۔
  • STA اور/یا LDA ہدایات کا استعمال کرتے ہوئے ڈیٹا بھیجنا یا وصول کرنا۔
  • CLOSE روٹین کا استعمال کرتے ہوئے منطقی فائل کو بند کرنا۔

منطقی فائل کو بند کرنا ضروری ہے۔ منطقی فائل کو بند کرنا مؤثر طریقے سے اس مخصوص چینل کو بند کر دیتا ہے۔ ڈسک ڈرائیو کے لیے چینل ترتیب دیتے وقت، پروگرامر کے ذریعے منطقی فائل نمبر کا فیصلہ کیا جاتا ہے۔ یہ $00 اور $FF (بشمول) کے درمیان ایک نمبر ہے۔ یہ ایسا نمبر نہیں ہونا چاہیے جو پہلے ہی کسی دوسرے ڈیوائس (یا اصل فائل) کے لیے منتخب کیا گیا ہو۔ ڈیوائس نمبر 8 ہے اگر صرف ایک ڈسک ڈرائیو ہے۔ ثانوی پتہ (نمبر) ڈسک ڈرائیو کے مینوئل سے حاصل کیا جاتا ہے۔ مندرجہ ذیل پروگرام 2 کا استعمال کرتا ہے۔ پروگرام 'mydoc.doc' نامی ڈسک میں موجود فائل پر خط 'E' (ASCII) لکھتا ہے۔ یہ نام $C101 کے میموری ایڈریس سے شروع ہونے کا فرض کیا جاتا ہے۔ لہذا، $01 کا نچلا بائٹ X رجسٹر میں ہونا چاہیے اور $C1 کا اعلیٰ بائٹ SETNAM روٹین کو کال کرنے سے پہلے Y رجسٹر میں ہونا چاہیے۔ SETNAM روٹین کو کال کرنے سے پہلے A رجسٹر میں $09 نمبر بھی ہونا چاہیے۔

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$08 ; پہلی ڈسک ڈرائیو کے لیے ڈیوائس نمبر
LDY #$02 ; ثانوی پتہ
JSR SETLFS ؛ سیٹ اپ چینل مناسب
;
; ڈسک ڈرائیو میں فائل کو ایک نام کی ضرورت ہے (پہلے ہی میموری میں)
LDA #$09
LDX #$01
LDY#$C1
جے ایس آر سیٹنام
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; آؤٹ پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
JSR CHKOUT؛ لکھنے کے لیے
;
; آؤٹ پٹ چار ڈسک پر
LDA #$45
JSR CHROUT
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند

ڈسک سے بائٹ کو µP Y رجسٹر میں پڑھنے کے لیے، پچھلے پروگرام کو درج ذیل تبدیلیوں کے ساتھ دہرائیں: 'JSR CHKOUT ؛ کے بجائے۔ لکھنے کے لیے'، استعمال کریں 'JSR CHKIN ؛ پڑھنے کے لیے' کوڈ کے حصے کو ' کے لیے تبدیل کریں؛ مندرجہ ذیل کے ساتھ چار کو ڈسک میں آؤٹ پٹ کریں:

; ڈسک سے چار ان پٹ کریں۔
جے ایس آر کرس

$FFCF پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے OS CHRIN روٹین تک رسائی حاصل کی جاتی ہے۔ اس روٹین کو، جب بلایا جاتا ہے، ایک ایسے چینل سے بائٹ حاصل کرتا ہے جو پہلے سے ان پٹ چینل کے طور پر سیٹ اپ ہے اور اسے µP A رجسٹر میں ڈال دیتا ہے۔ GETIN ROM OS روٹین کو CHRIN کی جگہ بھی استعمال کیا جا سکتا ہے۔

پرنٹر کو بائٹ بھیجنا
پرنٹر کو بائٹ بھیجنا اسی طرح کیا جاتا ہے جس طرح ڈسک میں موجود فائل کو بائٹ بھیجنا ہے۔

5.8 OS سیو روٹین

OS SAVE روٹین کو $FFD8 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ ROM میں OS SAVE کا معمول میموری کے ایک حصے کو بطور فائل (نام کے ساتھ) ڈسک میں محفوظ کرتا ہے۔ میموری میں سیکشن کا آغاز پتہ معلوم ہونا ضروری ہے۔ سیکشن کا آخری پتہ بھی معلوم ہونا چاہیے۔ ابتدائی پتہ کا نچلا بائٹ $002B ایڈریس پر RAM میں صفحہ صفر میں رکھا جاتا ہے۔ اسٹارٹ ایڈریس کا اعلی بائٹ اگلے بائٹ میموری والے مقام پر $002C ایڈریس پر رکھا جاتا ہے۔ صفحہ صفر میں، TXTTAB لیبل ان دو پتوں کی طرف اشارہ کرتا ہے، حالانکہ TXTTAB کا اصل مطلب $002B پتہ ہے۔ آخری پتے کا نچلا بائٹ µP X رجسٹر میں رکھا گیا ہے۔ آخری ایڈریس جمع 1 کا اعلی بائٹ µP Y رجسٹر میں رکھا گیا ہے۔ µP A رجسٹر TXTTAB ($002B) کے لیے $2B کی قیمت لیتا ہے۔ اس کے ساتھ، SAVE روٹین کو درج ذیل کے ساتھ کہا جا سکتا ہے:

جے ایس آر محفوظ کریں۔

میموری کا جو حصہ محفوظ کیا جانا ہے وہ اسمبلی لینگویج پروگرام یا دستاویز ہو سکتا ہے۔ دستاویز کی ایک مثال خط یا مضمون ہو سکتی ہے۔ سیو روٹین کو استعمال کرنے کے لیے درج ذیل طریقہ کار پر عمل کیا جانا چاہیے۔

  • SETLFS روٹین کا استعمال کرتے ہوئے چینل سیٹ اپ کریں۔
  • منطقی فائل (نمبر) کا نام سیٹ کریں جو SETNAM روٹین کا استعمال کرتے ہوئے اصل ڈسک فائل کی طرح ہے۔
  • OPEN روٹین کا استعمال کرتے ہوئے منطقی فائل کو کھولیں۔
  • اسے CHKOUT کا استعمال کرتے ہوئے آؤٹ پٹ کے لیے فائل بنائیں۔
  • فائل کو محفوظ کرنے کا کوڈ یہاں جاتا ہے جو 'JSR SAVE' پر ختم ہوتا ہے۔
  • CLOSE روٹین کا استعمال کرتے ہوئے منطقی فائل کو بند کریں۔

درج ذیل پروگرام ایک فائل کو محفوظ کرتا ہے جو $C101 سے $C200 کے میموری والے مقامات سے شروع ہوتی ہے۔

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$08 ; پہلی ڈسک ڈرائیو کے لیے ڈیوائس نمبر
LDY #$02 ; ثانوی پتہ
JSR SETLFS ؛ سیٹ اپ چینل مناسب
;
; ڈسک ڈرائیو میں فائل کا نام (پہلے سے ہی $C301 پر میموری میں)
LDA #$09 ; فائل کے نام کی لمبائی
LDX #$01
LDY#$C3
جے ایس آر سیٹنام
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; آؤٹ پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
JSR CHKOUT ; لکھنے کے لیے
;
; آؤٹ پٹ فائل کو ڈسک پر
LDA #$01
STA $2B ; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY#$C2
LDA #$2B
جے ایس آر محفوظ کریں۔
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند

نوٹ کریں کہ یہ ایک ایسا پروگرام ہے جو میموری کے دوسرے حصے (پروگرام سیکشن کو نہیں) کو ڈسک (کموڈور-64 کے لیے ڈسکیٹ) میں محفوظ کرتا ہے۔

5.9 OS لوڈ کا معمول

$FFD5 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے OS لوڈ روٹین تک رسائی حاصل کی جاتی ہے۔ جب میموری کا کوئی حصہ (بڑا علاقہ) ڈسک میں محفوظ ہوتا ہے، تو اسے ایک ہیڈر کے ساتھ محفوظ کیا جاتا ہے جس میں میموری میں سیکشن کا ابتدائی پتہ ہوتا ہے۔ OS LOAD سب روٹین کسی فائل کے بائٹس کو میموری میں لوڈ کرتا ہے۔ اس LOAD آپریشن کے ساتھ، جمع کرنے والے کی قدر 010 ($00) ہونی چاہیے۔ LOAD آپریشن کے لیے ڈسک میں فائل ہیڈر میں ابتدائی ایڈریس کو پڑھنے اور اس ایڈریس سے شروع ہونے والی RAM میں فائل بائٹس ڈالنے کے لیے، چینل کے لیے سیکنڈری ایڈریس 1 یا 2 ہونا چاہیے (مندرجہ ذیل پروگرام 2 کا استعمال کرتا ہے)۔ یہ روٹین لوڈ ہونے والے اعلی ترین RAM مقام کا ایڈریس پلس 1 لوٹاتا ہے۔ اس کا مطلب ہے کہ RAM پلس 1 میں فائل کے آخری ایڈریس کا کم بائٹ µP X رجسٹر میں ڈالا جاتا ہے، اور RAM پلس 1 میں فائل کے آخری ایڈریس کا ہائی بائٹ µP Y رجسٹر میں ڈال دیا جاتا ہے۔

اگر لوڈنگ ناکام ہو جاتی ہے تو، µP A رجسٹر میں غلطی کا نمبر ہوتا ہے (ممکنہ طور پر 4، 5، 8 یا 9)۔ مائیکرو پروسیسر اسٹیٹس رجسٹر کا C جھنڈا بھی سیٹ ہے (بنا دیا گیا 1)۔ اگر لوڈنگ کامیاب ہے، A رجسٹر کی آخری قیمت اہم نہیں ہے۔

اب، اس آن لائن کیرئیر کورس کے پچھلے باب میں، اسمبلی لینگوئج پروگرام کی پہلی ہدایات RAM میں اس پتے پر ہے جہاں سے پروگرام شروع ہوا تھا۔ ایسا ہونا ضروری نہیں ہے۔ اس کا مطلب یہ ہے کہ پروگرام کی پہلی ہدایات RAM میں پروگرام کے شروع میں ہونا ضروری نہیں ہے۔ کسی پروگرام کے لیے شروع کی ہدایت RAM میں فائل کے اندر کہیں بھی ہو سکتی ہے۔ پروگرامر کو مشورہ دیا جاتا ہے کہ وہ لیبل لگائیں جو اسمبلی کی زبان کی ہدایات START کے ساتھ شروع کریں۔ اس کے ساتھ، پروگرام کے لوڈ ہونے کے بعد، یہ مندرجہ ذیل اسمبلی لینگویج ہدایات کے ساتھ دوبارہ چلتا ہے (عمل درآمد)۔

جے ایس آر شروع

'JSR START' اسمبلی لینگویج پروگرام میں ہے جو چلانے کے لیے پروگرام کو لوڈ کرتا ہے۔ ایک اسمبلی لینگویج جو دوسری اسمبلی لینگویج فائل کو لوڈ کرتی ہے اور بھری ہوئی فائل کو چلاتی ہے اس میں درج ذیل کوڈ کا طریقہ کار ہوتا ہے:

  • SETLFS روٹین کا استعمال کرتے ہوئے چینل کو سیٹ کریں۔
  • منطقی فائل (نمبر) کا نام سیٹ کریں جو SETNAM روٹین کا استعمال کرتے ہوئے اصل ڈسک فائل کی طرح ہے۔
  • OPEN روٹین کا استعمال کرتے ہوئے منطقی فائل کو کھولیں۔
  • اسے CHKIN کا استعمال کرتے ہوئے ان پٹ کے لیے فائل بنائیں۔
  • فائل کو لوڈ کرنے کا کوڈ یہاں جاتا ہے اور 'JSR LOAD' کے ساتھ ختم ہوتا ہے۔
  • CLOSE روٹین کا استعمال کرتے ہوئے منطقی فائل کو بند کریں۔

درج ذیل پروگرام ڈسک سے فائل لوڈ کرتا ہے اور اسے چلاتا ہے۔

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$08 ; پہلی ڈسک ڈرائیو کے لیے ڈیوائس نمبر
LDY #$02 ; ثانوی پتہ
JSR SETLFS ؛ سیٹ اپ چینل مناسب
;
; ڈسک ڈرائیو میں فائل کا نام (پہلے سے ہی $C301 پر میموری میں)
LDA #$09 ; فائل کے نام کی لمبائی
LDX #$01
LDY#$C3
جے ایس آر سیٹنام
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; ان پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
JSR CHKIN ; پڑھنے کے لیے
;
; ڈسک سے ان پٹ فائل
LDA #$00
جے ایس آر لوڈ
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند
; بھری ہوئی پروگرام شروع کریں۔
جے ایس آر شروع

5.10 موڈیم اور RS-232 سٹینڈرڈ

موڈیم ایک آلہ (پریفیرل) ہے جو کمپیوٹر سے بٹس کو متعلقہ الیکٹریکل آڈیو سگنلز میں تبدیل کرتا ہے جو ٹیلی فون لائن پر منتقل ہوتا ہے۔ وصول کرنے والے اختتام پر، وصول کرنے والے کمپیوٹر سے پہلے ایک موڈیم ہوتا ہے۔ یہ دوسرا موڈیم برقی آڈیو سگنلز کو وصول کرنے والے کمپیوٹر کے بٹس میں تبدیل کرتا ہے۔

ایک موڈیم کو کسی بیرونی بندرگاہ (کمپیوٹر کی عمودی سطح پر) کمپیوٹر سے منسلک کرنے کی ضرورت ہے۔ RS-232 معیار سے مراد ایک خاص قسم کا کنیکٹر ہے جو موڈیم کو کمپیوٹر سے جوڑتا ہے (ماضی میں)۔ دوسرے الفاظ میں، ماضی میں بہت سے کمپیوٹرز میں ایک بیرونی بندرگاہ تھی جو RS-232 کنیکٹر یا RS-232 مطابقت پذیر کنیکٹر تھا۔

کموڈور-64 سسٹم یونٹ (کمپیوٹر) کی پچھلی عمودی سطح پر ایک بیرونی بندرگاہ ہے جسے صارف پورٹ کہا جاتا ہے۔ یہ صارف پورٹ RS-232 مطابقت رکھتا ہے۔ ایک موڈیم ڈیوائس وہاں منسلک کیا جا سکتا ہے. کموڈور-64 اس صارف پورٹ کے ذریعے موڈیم کے ساتھ بات چیت کرتا ہے۔ کموڈور-64 کے لیے ROM آپریٹنگ سسٹم میں RS-232 روٹینز نامی موڈیم کے ساتھ بات چیت کرنے کے لیے سب روٹینز ہیں۔ ان معمولات میں جمپ ٹیبل میں اندراجات ہیں۔

حرکت نبض
موڈیم پر بھیجے جانے سے پہلے کمپیوٹر سے آٹھ بٹ بائٹ آٹھ بٹس کی سیریز میں تبدیل ہو جاتا ہے۔ ریورس موڈیم سے کمپیوٹر پر کیا جاتا ہے۔ باؤڈ ریٹ ان بٹس کی تعداد ہے جو سیریز میں فی سیکنڈ منتقل ہوتے ہیں۔

میموری کے نیچے
'میموری کے نیچے' کی اصطلاح $0000 ایڈریس کے میموری بائٹ مقام کا حوالہ نہیں دیتی ہے۔ یہ سب سے کم RAM والے مقام سے مراد ہے جہاں صارف اپنا ڈیٹا اور پروگرام ڈالنا شروع کر سکتا ہے۔ پہلے سے طے شدہ طور پر، یہ $0800 ہے۔ پچھلی بحث سے یاد کریں کہ $0800 اور $BFFF کے درمیان بہت ساری جگہیں BASIC کمپیوٹر لینگویج اور اس کے پروگرامرز (صارفین) استعمال کرتے ہیں۔ اسمبلی لینگویج پروگرامز اور ڈیٹا کے استعمال کے لیے صرف $C000 سے $CFFF ایڈریس کے مقامات رہ گئے ہیں۔ یہ میموری کے 64 Kbytes میں سے 4Kbytes ہے۔

میموری کا سب سے اوپر
ان دنوں، جب کلائنٹس نے کموڈور-64 کمپیوٹرز خریدے تھے، تو کچھ میموری کے تمام مقامات کے ساتھ نہیں آتے تھے۔ اس طرح کے کمپیوٹرز میں اس کے آپریٹنگ سسٹم کے ساتھ $E000 سے $FFFF تک ROM ہوتا تھا۔ ان کے پاس $0000 سے لے کر ایک حد تک RAM تھی، جو $E000 کے آگے $DFFF نہیں ہے۔ حد $DFFF سے نیچے تھی اور اس حد کو 'میموری کا سب سے اوپر' کہا جاتا ہے۔ لہذا، ٹاپ آف میموری $FFFF مقام کا حوالہ نہیں دیتی۔

RS-232 کمیونیکیشن کے لیے کموڈور-64 بفر
بفر منتقل کرنا
RS-232 ٹرانسمیشن (آؤٹ پٹ) کے لیے بفر ٹاپ آف میموری سے نیچے کی طرف 256 بائٹس لیتا ہے۔ اس ٹرانسمیٹنگ بفر کے پوائنٹر پر ROBUF کا لیبل لگا ہوا ہے۔ یہ پوائنٹر صفحہ صفر میں $00F9 پتوں کے ساتھ ہے جس کے بعد $00FA ہے۔ ROBUF دراصل $00F9 کی شناخت کرتا ہے۔ لہذا، اگر بفر کے آغاز کا پتہ $BE00 ہے، تو $BE00 کا نچلا بائٹ، جو $00 ہے، $00F9 مقام پر ہے اور $BE00 کا اعلی بائٹ، جو $BE ہے، $00FA میں ہے۔ مقام

بفر وصول کرنا
RS-232 بائٹس (ان پٹ) حاصل کرنے کے لیے بفر ٹرانسمٹنگ بفر کے نیچے سے 256 بائٹس لیتا ہے۔ اس وصول کرنے والے بفر کے پوائنٹر پر RIBUF کا لیبل لگا ہوا ہے۔ یہ پوائنٹر صفحہ صفر میں $00F7 پتوں کے ساتھ ہے جس کے بعد $00F8 ہے۔ RIBUF دراصل $00F7 کی شناخت کرتا ہے۔ لہذا، اگر بفر کے آغاز کا پتہ $BF00 ہے، تو $BF00 کا نچلا بائٹ، جو $00 ہے، $00F7 مقام پر ہے اور $BF00 کا اعلیٰ بائٹ، جو کہ $BF ہے، $00F8 میں ہے۔ مقام لہذا، ٹاپ آف میموری سے 512 بائٹس کل RS-232 RAM بفر کے طور پر استعمال ہوتے ہیں۔

RS-232 چینل
جب ایک موڈیم (بیرونی) صارف پورٹ سے منسلک ہوتا ہے، تو موڈیم سے رابطہ صرف RS-232 کمیونیکیشن ہوتا ہے۔ مکمل RS-232 چینل رکھنے کا طریقہ کار تقریباً وہی ہے جیسا کہ پچھلی بحث میں ہے، لیکن ایک اہم فرق کے ساتھ: فائل کا نام ایک کوڈ ہے نہ کہ میموری میں کوئی تار۔ کوڈ $0610 ایک اچھا انتخاب ہے۔ اس کا مطلب ہے 300 بٹس/سیکنڈ کی بوڈ ریٹ اور کچھ دیگر تکنیکی پیرامیٹرز۔ نیز، کوئی ثانوی پتہ نہیں ہے۔ نوٹ کریں کہ ڈیوائس کا نمبر 2 ہے۔ مکمل RS-232 چینل سیٹ اپ کرنے کا طریقہ کار یہ ہے:

  • SETLFS روٹین کا استعمال کرتے ہوئے چینل کو ترتیب دینا۔
  • منطقی فائل کا نام ترتیب دینا، $0610۔
  • OPEN روٹین کا استعمال کرتے ہوئے منطقی فائل کو کھولنا۔
  • اسے CHKOUT کا استعمال کرتے ہوئے آؤٹ پٹ کے لیے فائل بنانا یا CHKIN کا استعمال کرتے ہوئے ان پٹ کے لیے فائل بنانا۔
  • CHROUT کے ساتھ سنگل بائٹس بھیجنا یا GETIN کے ساتھ سنگل بائٹس وصول کرنا۔
  • CLOSE روٹین کا استعمال کرتے ہوئے منطقی فائل کو بند کرنا۔

OS GETIN روٹین کو $FFE4 پر OS ROM جمپ ٹیبل پر جمپنگ (JSR) کے ذریعے حاصل کیا جاتا ہے۔ یہ معمول، جب بلایا جاتا ہے، بائٹ لیتا ہے جو ریسیور بفر میں بھیجا جاتا ہے اور اسے µP جمع کرنے والے میں ڈالتا ہے (واپس)۔

مندرجہ ذیل پروگرام بائٹ 'E' (ASCII) کو موڈیم پر بھیجتا ہے جو صارف RS-232 مطابقت پذیر پورٹ سے منسلک ہے:

; چینل سیٹ کریں۔
LDA #$40 ; منطقی فائل نمبر
LDX #$02 ; RS-232 کے لیے ڈیوائس نمبر
LDY #$FF ; کوئی ثانوی پتہ نہیں۔
JSR SETLFS ؛ سیٹ اپ چینل مناسب
;
; RS-232 کا نام ایک کوڈ ہے جیسے $0610
LDA #$02 ; کوڈ کی لمبائی 2 بائٹس ہے۔
LDX #$10
LDY #$06
جے ایس آر سیٹنام
;
; منطقی فائل کھولیں۔
جے ایس آر اوپن
; آؤٹ پٹ کے لیے چینل سیٹ کریں۔
LDX #$40 ; منطقی فائل نمبر
جے ایس آر چیک آؤٹ
;
; آؤٹ پٹ چار سے RS-232 جیسے موڈیم
LDA #$45
JSR CHROUT
; منطقی فائل بند کریں۔
LDA #$40
جے ایس آر بند

بائٹ وصول کرنے کے لیے، کوڈ بہت ملتا جلتا ہے، سوائے اس کے کہ 'JSR CHKOUT' کی جگہ 'JSR CHKIN' اور:

LDA #$45
JSR CHROUT

اس کی جگہ 'JSR GETIN' ہے اور نتیجہ A رجسٹر میں ڈال دیا جاتا ہے۔

بائٹس کی مسلسل بھیجنا یا وصول کرنا بالترتیب کوڈ سیگمنٹ کو بھیجنے یا وصول کرنے کے لیے ایک لوپ کے ذریعے کیا جاتا ہے۔

نوٹ کریں کہ کموڈور کے ساتھ ان پٹ اور آؤٹ پٹ اس کے زیادہ تر معاملات کے لیے یکساں ہے سوائے کی بورڈ کے جہاں کچھ معمولات کو پروگرامر نہیں بلایا جاتا ہے، لیکن وہ آپریٹنگ سسٹم کے ذریعے کال کیے جاتے ہیں۔

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 بٹ رجسٹر میں مختلف قدریں سیٹ کی جا سکتی ہیں۔ قدر جتنی بڑی ہوگی، صفر تک گننے میں اتنا ہی زیادہ وقت لگتا ہے۔ ہر بار ٹائمر میں سے ایک صفر سے گزر جاتا ہے، IRQ مداخلت کا سگنل مائکرو پروسیسر کو بھیجا جاتا ہے۔ جب گنتی صفر سے نیچے چلی جاتی ہے تو اسے زیر بہاؤ کہا جاتا ہے۔

ٹائمر سرکٹ کو کس طرح پروگرام کیا جاتا ہے اس پر منحصر ہے، ٹائمر ایک بار یا مسلسل موڈ میں چل سکتا ہے۔ پچھلی مثال کے ساتھ، ون ٹائم موڈ کا مطلب ہے '2، 1، 0' کریں اور جب گھڑی کی دھڑکنیں چل رہی ہوں تو رک جائیں۔ مسلسل موڈ '2، 1، 0، 2، 1، 0، 2، 1، 0، 2، 1، 0، وغیرہ' کی طرح ہے۔ جو گھڑی کی نبضوں کے ساتھ جاری رہتا ہے۔ اس کا مطلب یہ ہے کہ جب یہ صفر سے گزر جاتا ہے، اگر کوئی ہدایت نہیں دی جاتی ہے، الٹی گنتی کی ترتیب دہرائی جاتی ہے۔ سب سے بڑی تعداد عام طور پر 2 سے بہت بڑی ہوتی ہے۔

CIA #1 کا ٹائمر A (TA) تیار کرتا ہے۔ IRQ کی بورڈ کو سروس کرنے کے لیے باقاعدہ وقفوں (مدت) پر۔ درحقیقت، یہ دراصل ہر ایک سیکنڈ کے 1/60 پر بطور ڈیفالٹ ہوتا ہے۔ IRQ مائکرو پروسیسر کو ہر سیکنڈ کے 1/60 پر بھیجا جاتا ہے۔ یہ صرف اس وقت ہے جب IRQ بھیجا جاتا ہے کہ ایک پروگرام کی بورڈ کی قطار (بفر) سے کلیدی قدر پڑھ سکتا ہے۔ یاد رکھیں کہ مائکرو پروسیسر کے پاس صرف ایک پن ہے۔ IRQ سگنل مائکرو پروسیسر کے پاس بھی صرف ایک پن ہے۔ این ایم آئی سگنل مائکرو پروسیسر کو NMI سگنل ہمیشہ CIA #2 سے آتا ہے۔

16 بٹ ٹائمر رجسٹر میں دو میموری ایڈریس ہوتے ہیں: ایک لوئر بائٹ کے لیے اور دوسرا ہائی بائٹ کے لیے۔ ہر سی آئی اے کے دو ٹائمر سرکٹس ہوتے ہیں۔ دونوں سی آئی اے ایک جیسے ہیں۔ CIA #1 کے لیے، دو ٹائمرز کے پتے ہیں: TA کے لیے DC04 اور DC05 اور TB کے لیے DC06 اور DC07۔ CIA #2 کے لیے، دو ٹائمرز کے پتے ہیں: TA کے لیے DD04 اور DD05 اور TB کے لیے DD06 اور DD07۔

فرض کریں کہ نمبر 25510 کو گنتی کے لیے CIA #2 کے TA ٹائمر کو بھیجا جانا ہے۔ 25510 = 00000000111111112 سولہ بٹس میں ہے۔ 00000000111111112 = $000FFF ہیکسا ڈیسیمل میں ہے۔ اس صورت میں، $FF کو $DD04 ایڈریس پر رجسٹر پر بھیجا جاتا ہے، اور $00 کو $DD05 ایڈریس پر رجسٹر میں بھیجا جاتا ہے - تھوڑا سا خاتمہ۔ درج ذیل کوڈ سیگمنٹ نمبر کو رجسٹر کو بھیجتا ہے:

LDA #$FF
ریاست $DD04
LDA #$00
ریاست $DD05

اگرچہ CIA میں رجسٹروں میں RAM ایڈریس ہوتے ہیں، لیکن وہ جسمانی طور پر CIA میں ہوتے ہیں اور CIA RAM یا ROM سے الگ IC ہے۔

یہ سب نہیں ہے! جب ٹائمر کو گنتی کے لیے نمبر دیا جاتا ہے، جیسا کہ پچھلے کوڈ کے ساتھ، گنتی شروع نہیں ہوتی ہے۔ گنتی اس وقت شروع ہوتی ہے جب ٹائمر کے لیے متعلقہ کنٹرول رجسٹر میں آٹھ بٹ بائٹ بھیج دیا جاتا ہے۔ کنٹرول رجسٹر کے لیے اس بائٹ کا پہلا بٹ اس بات کی نشاندہی کرتا ہے کہ گنتی شروع ہونی چاہیے یا نہیں۔ اس پہلے بٹ کے لیے 0 کی قدر کا مطلب گنتی کو روکنا ہے، جب کہ 1 کی قدر کا مطلب کاؤنٹ ڈاؤن شروع کرنا ہے۔ نیز، بائٹ کو یہ بتانا ہوتا ہے کہ آیا کاؤنٹ ڈاؤن ایک شاٹ (ون ٹائم) موڈ میں ہے یا فری رننگ موڈ (مسلسل موڈ) میں۔ ٹائمر رجسٹر کی قدر صفر ہونے پر ون شاٹ موڈ کاؤنٹ ڈاؤن اور رک جاتا ہے۔ فری رننگ موڈ کے ساتھ، کاؤنٹنگ ڈاؤن 0 تک پہنچنے کے بعد دہرایا جاتا ہے۔ کنٹرول رجسٹر کو بھیجے جانے والے بائٹ کا چوتھا (انڈیکس 3) بٹ موڈ کی نشاندہی کرتا ہے: 0 کا مطلب ہے فری رننگ موڈ اور 1 کا مطلب ہے ون شاٹ موڈ۔

ایک شاٹ موڈ میں گنتی شروع کرنے کے لیے موزوں نمبر 000010012 = $09 ہیکساڈیسیمل میں ہے۔ فری رننگ موڈ میں گنتی شروع کرنے کے لیے ایک مناسب نمبر 000000012 = $01 ہیکساڈیسیمل میں ہے۔ ہر ٹائمر رجسٹر کا اپنا کنٹرول رجسٹر ہوتا ہے۔ CIA #1 میں، ٹائمر A کے کنٹرول رجسٹر میں DC0E16 کا RAM پتہ ہوتا ہے اور ٹائمر B کے کنٹرول رجسٹر میں DC0F16 کا RAM پتہ ہوتا ہے۔ CIA #2 میں، ٹائمر A کے کنٹرول رجسٹر میں DD0E16 کا RAM پتہ ہوتا ہے اور ٹائمر B کے کنٹرول رجسٹر میں DD0F16 کا RAM پتہ ہوتا ہے۔ CIA #2 کے TA میں سولہ بٹ نمبر کی گنتی شروع کرنے کے لیے، ون شاٹ موڈ میں، درج ذیل کوڈ کا استعمال کریں:

LDA #$09
STA $DD0E

CIA #2 کے TA میں سولہ بٹ نمبر کی گنتی شروع کرنے کے لیے، فری رننگ موڈ میں، درج ذیل کوڈ کا استعمال کریں:

LDA #$01
STA $DD0E

5.12 IRQ اور این ایم آئی درخواستیں

6502 مائکرو پروسیسر ہے IRQ اور این ایم آئی لائنیں (پن) CIA #1 اور CIA #2 دونوں میں سے ہر ایک کے پاس ہے۔ IRQ مائکرو پروسیسر کے لئے پن۔ دی IRQ CIA #2 کا پن اس سے منسلک ہے۔ این ایم آئی µP کا پن دی IRQ CIA #1 کا پن اس سے منسلک ہے۔ IRQ µP کا پن یہ صرف دو انٹرپٹ لائنیں ہیں جو مائکرو پروسیسر کو جوڑتی ہیں۔ تو، IRQ سی آئی اے نمبر 2 کا پن ہے۔ این ایم آئی ماخذ اور ¯NMI لائن کے طور پر بھی دیکھا جا سکتا ہے۔

CIA #1 کے پاس فوری طور پر پیدا کرنے کے پانچ ممکنہ ذرائع ہیں۔ IRQ µP کے لیے سگنل۔ سی آئی اے # 2 ساخت میں سی آئی اے # 1 جیسا ہی ہے۔ لہذا، سی آئی اے #2 کے پاس اس بار رکاوٹ سگنل پیدا کرنے کے وہی پانچ ممکنہ فوری ذرائع ہیں جو این ایم آئی سگنل یاد رکھیں کہ جب µP وصول کرتا ہے۔ این ایم آئی سگنل، اگر یہ سنبھال رہا ہے IRQ درخواست کریں، یہ اسے معطل کرتا ہے اور ہینڈل کرتا ہے۔ این ایم آئی درخواست جب یہ ہینڈلنگ ختم کرتا ہے۔ این ایم آئی درخواست کریں، یہ پھر ہینڈلنگ دوبارہ شروع کرتا ہے۔ IRQ درخواست

CIA #1 عام طور پر کی بورڈ اور گیم ڈیوائس جیسے جوائس اسٹک سے بیرونی طور پر جڑا ہوتا ہے۔ کی بورڈ پورٹ B کے مقابلے CIA #1 کی پورٹ A کا زیادہ استعمال کرتا ہے۔ گیم ڈیوائس اپنی پورٹ A کے مقابلے CIA #1 پورٹ B کا زیادہ استعمال کرتا ہے۔ CIA #2 عام طور پر ڈسک ڈرائیو سے بیرونی طور پر جڑا ہوتا ہے (پرنٹر سے گل داؤدی زنجیروں میں جکڑا ہوا) اور موڈیم. ڈسک ڈرائیو CIA #2 کی بندرگاہ A کا زیادہ استعمال کرتی ہے (حالانکہ بیرونی سیریل پورٹ کے ذریعے) اپنی پورٹ B کے مقابلے میں۔ موڈیم (RS-232) اپنی پورٹ A کے مقابلے CIA #2 پورٹ B کا زیادہ استعمال کرتا ہے۔

اس سب کے ساتھ، سسٹم یونٹ کو کیسے معلوم ہوتا ہے کہ اس کی وجہ کیا ہے۔ IRQ یا این ایم آئی رکاوٹ CIA #1 اور CIA #2 کے پاس مداخلت کے پانچ فوری ذرائع ہیں۔ اگر µP کو رکاوٹ کا سگنل ہے۔ این ایم آئی ، ذریعہ CIA #2 کے فوری پانچ ذرائع میں سے ایک ہے۔ اگر µP کو رکاوٹ کا سگنل ہے۔ IRQ , ذریعہ CIA #1 کے فوری پانچ ذرائع میں سے ایک ہے۔

اگلا سوال یہ ہے کہ 'سسٹم یونٹ ہر سی آئی اے کے پانچ فوری ذرائع کے درمیان کیسے فرق کرتا ہے؟' ہر سی آئی اے کا ایک آٹھ بٹ رجسٹر ہوتا ہے جسے انٹرپٹ کنٹرول رجسٹر (ICR) کہا جاتا ہے۔ ICR CIA کی دونوں بندرگاہوں پر کام کرتا ہے۔ درج ذیل ٹیبل انٹرپٹ کنٹرول رجسٹر کے آٹھ بٹس کے معنی دکھاتا ہے، بٹ 0 سے شروع ہوتا ہے:

جدول 5.13
انٹرپٹ کنٹرول رجسٹر
بٹ انڈیکس مطلب
0 ٹائمر A کے زیر بہاؤ کے ذریعہ سیٹ کریں (1 بنایا گیا)
1 ٹائمر B کے زیر بہاؤ کے ذریعہ سیٹ کیا گیا ہے۔
2 سیٹ کریں جب ٹائم آف ڈے گھڑی الارم کے برابر ہو۔
3 جب سیریل پورٹ بھر جائے تو سیٹ کریں۔
4 بیرونی ڈیوائس کے ذریعے سیٹ کریں۔
5 استعمال نہیں کیا گیا (0 بنایا گیا)
6 استعمال نہیں کیا گیا (0 بنایا گیا)
7 پہلے پانچ بٹس میں سے کوئی بھی سیٹ ہونے پر سیٹ کریں۔

جیسا کہ جدول سے دیکھا جا سکتا ہے، فوری ذرائع میں سے ہر ایک کی نمائندگی پہلے پانچ بٹس میں سے ایک کے ذریعے کی جاتی ہے۔ لہذا، جب µP پر انٹرپٹ سگنل موصول ہوتا ہے، تو کوڈ کو انٹرپٹ کنٹرول رجسٹر کے مواد کو پڑھنے کے لیے عمل میں لانا ہوتا ہے تاکہ انٹرپٹ کا صحیح ذریعہ معلوم ہو سکے۔ CIA #1 کے ICR کے لیے RAM ایڈریس DC0D16 ہے۔ CIA #2 کے ICR کے لیے RAM ایڈریس DD0D16 ہے۔ CIA #1 کے ICR کے مواد کو µP جمع کرنے والے کو پڑھنے (واپسی) کے لیے، درج ذیل ہدایات ٹائپ کریں:

LDA$DC0D

CIA #2 کے ICR کے مواد کو µP جمع کرنے والے کو پڑھنے (واپسی) کے لیے، درج ذیل ہدایات ٹائپ کریں:

LDA $DD0D

5.13 انٹرپٹ ڈرائیون بیک گراؤنڈ پروگرام

کی بورڈ عام طور پر ہر سیکنڈ کے 1/60 میں مائکرو پروسیسر کو روکتا ہے۔ تصور کریں کہ ایک پروگرام چل رہا ہے اور وہ کی بورڈ سے کسی کلید کا انتظار کرنے کی پوزیشن پر پہنچ جاتا ہے اس سے پہلے کہ وہ نیچے کوڈ کے حصوں کے ساتھ جاری رکھ سکے۔ فرض کریں کہ اگر کی بورڈ سے کوئی کلید نہیں دبائی جاتی ہے، تو پروگرام صرف ایک چھوٹا سا لوپ کرتا ہے، چابی کا انتظار کرتا ہے۔ تصور کریں کہ پروگرام چل رہا ہے اور کی بورڈ انٹرپٹ جاری ہونے کے فوراً بعد کی بورڈ سے ایک کلید کی توقع ہے۔ اس وقت، پورا کمپیوٹر بالواسطہ طور پر رک جاتا ہے اور کچھ نہیں کر رہا سوائے ویٹ لوپ لوپنگ کے۔ تصور کریں کہ کی بورڈ کی ایک کلید اگلے کی بورڈ انٹرپٹ کے اگلے شمارے سے ٹھیک پہلے دبائی جاتی ہے۔ اس کا مطلب ہے کہ کمپیوٹر نے ایک سیکنڈ کے ساٹھویں حصے تک کچھ نہیں کیا! کموڈور-64 کے دنوں میں بھی کمپیوٹر کو کچھ نہ کرنے کا یہ ایک طویل وقت ہے۔ کمپیوٹر اس وقت (مدت) میں کچھ اور کر سکتا تھا۔ ایک پروگرام میں ایسے کئی دورانیے ہوتے ہیں۔

دوسرے پروگرام کو ایسے 'بے کار' دورانیے پر کام کرنے کے لیے لکھا جا سکتا ہے۔ کہا جاتا ہے کہ اس طرح کے پروگرام کو مرکزی (یا پہلے) پروگرام کے پس منظر میں کام کرنا ہے۔ ایسا کرنے کا ایک آسان طریقہ یہ ہے کہ جب کی بورڈ سے کلید کی توقع کی جائے تو صرف ترمیم شدہ BRK مداخلت کو ہینڈلنگ میں مجبور کرنا۔

BRK ہدایات کے لیے پوائنٹر
RAM پر لگاتار مقامات پر $0316 اور $0317 ایڈریس اصل BRK انسٹرکشن روٹین کے لیے پوائنٹر (ویکٹر) ہے۔ پہلے سے طے شدہ پوائنٹر وہاں رکھا جاتا ہے جب کمپیوٹر آپریٹنگ سسٹم کے ذریعے ROM میں چلتا ہے۔ یہ ڈیفالٹ پوائنٹر ایک پتہ ہے جو اب بھی OS ROM میں ڈیفالٹ BRK انسٹرکشن ہینڈلر کی طرف اشارہ کرتا ہے۔ پوائنٹر ایک 16 بٹ ایڈریس ہے۔ پوائنٹر کا نچلا بائٹ $0306 ایڈریس کے بائٹ مقام پر رکھا جاتا ہے، اور پوائنٹر کا اونچا بائٹ $0317 بائٹ والے مقام پر رکھا جاتا ہے۔

دوسرا پروگرام اس طرح لکھا جا سکتا ہے کہ جب سسٹم 'آئیڈیل' ہو تو دوسرے پروگرام کے کچھ کوڈز سسٹم کے ذریعے عمل میں آتے ہیں۔ اس کا مطلب ہے کہ دوسرا پروگرام سب روٹینز پر مشتمل ہونا چاہیے۔ جب سسٹم 'بیکار' ہوتا ہے جو کی بورڈ سے کسی کلید کا انتظار کر رہا ہوتا ہے، تو دوسرے پروگرام کے لیے اگلی سب روٹین پر عمل درآمد ہوتا ہے۔ سسٹم یونٹ کے آپریشن کے مقابلے کمپیوٹر کے ساتھ انسانی تعامل سست ہے۔

اس مسئلے کو حل کرنا آسان ہے: ہر بار جب کمپیوٹر کو کی بورڈ سے کلید کا انتظار کرنا پڑتا ہے، کوڈ میں BRK ہدایات داخل کریں اور پوائنٹر کو $0316 (اور $0317) کے پوائنٹر کے ساتھ بدل دیں دوسرے کے اگلے سب روٹین ( اپنی مرضی کے مطابق) پروگرام۔ اس طرح، دونوں پروگرام اس دورانیے میں چلیں گے جو اکیلے چلنے والے مرکزی پروگرام سے زیادہ طویل نہیں ہے۔

5.14 اسمبلی اور تالیف

اسمبلر تمام لیبل کو پتوں سے بدل دیتا ہے۔ اسمبلی لینگوئج پروگرام عام طور پر کسی خاص ایڈریس پر شروع کرنے کے لیے لکھا جاتا ہے۔ اسمبلر (اسمبلنگ کے بعد) کے نتیجے کو بائنری میں ہر چیز کے ساتھ 'آبجیکٹ کوڈ' کہا جاتا ہے۔ یہ نتیجہ قابل عمل فائل ہے اگر فائل ایک پروگرام ہے نہ کہ دستاویز۔ ایک دستاویز قابل عمل نہیں ہے۔

ایک درخواست ایک سے زیادہ (اسمبلی زبان) پروگرام پر مشتمل ہوتی ہے۔ عام طور پر ایک اہم پروگرام ہوتا ہے۔ یہاں کی صورتحال کو مداخلت سے چلنے والے پس منظر کے پروگراموں کی صورتحال کے ساتھ الجھن میں نہیں ڈالنا چاہئے۔ یہاں کے تمام پروگرام پیش منظر کے پروگرام ہیں، لیکن ایک پہلا یا مرکزی پروگرام ہے۔

جب ایک سے زیادہ پیش منظر پروگرام ہوتے ہیں تو اسمبلر کے بجائے ایک کمپائلر کی ضرورت ہوتی ہے۔ کمپائلر ہر پروگرام کو ایک آبجیکٹ کوڈ میں جمع کرتا ہے۔ تاہم، ایک مسئلہ ہو گا: کوڈ کے کچھ حصے اوورلیپ ہو جائیں گے کیونکہ پروگرام شاید مختلف لوگوں نے لکھے ہیں۔ کمپائلر کے ذریعہ حل یہ ہے کہ میموری کی جگہ پر پہلے کے علاوہ تمام اوورلیپنگ پروگراموں کو شفٹ کیا جائے، تاکہ پروگرام اوورلیپ نہ ہوں۔ اب، جب متغیرات کو ذخیرہ کرنے کی بات آتی ہے، تو کچھ متغیر پتے اب بھی اوورلیپ ہوتے ہیں۔ یہاں حل یہ ہے کہ اوورلیپنگ ایڈریسز کو نئے ایڈریسز سے تبدیل کیا جائے (سوائے پہلے پروگرام کے) تاکہ وہ مزید اوورلیپ نہ ہوں۔ اس طرح مختلف پروگرام میموری کے مختلف حصوں (علاقوں) میں فٹ ہو جائیں گے۔

ان سب کے ساتھ، ایک پروگرام میں ایک روٹین کے لیے دوسرے پروگرام میں روٹین کو کال کرنا ممکن ہے۔ تو، کمپائلر لنکنگ کرتا ہے۔ لنک کرنے سے مراد ایک پروگرام میں سب روٹین کا ابتدائی پتہ ہونا اور پھر اسے دوسرے پروگرام میں کال کرنا ہے۔ یہ دونوں درخواست کا حصہ ہیں۔ دونوں پروگراموں کو اس کے لیے ایک ہی ایڈریس استعمال کرنے کی ضرورت ہے۔ حتمی نتیجہ بائنری (بٹس) میں ہر چیز کے ساتھ ایک بڑا آبجیکٹ کوڈ ہے۔

5.15 پروگرام کو محفوظ کرنا، لوڈ کرنا اور چلانا

اسمبلی کی زبان عام طور پر کسی ایڈیٹر پروگرام میں لکھی جاتی ہے (جو اسمبلر پروگرام کے ساتھ فراہم کی جا سکتی ہے)۔ ایڈیٹر پروگرام بتاتا ہے کہ پروگرام میموری (RAM) میں کہاں شروع اور ختم ہوتا ہے۔ کموڈور-64 کے OS ROM کا Kernal SAVE روٹین میموری میں موجود پروگرام کو ڈسک میں محفوظ کر سکتا ہے۔ یہ صرف میموری کے سیکشن (بلاک) کو پھینک دیتا ہے جس میں ڈسک پر اس کی ہدایات کال ہوسکتی ہے۔ یہ مشورہ دیا جاتا ہے کہ سیو کرنے کے لیے کالنگ انسٹرکشن کو اس پروگرام سے الگ کر دیا جائے جسے محفوظ کیا جا رہا ہے، تاکہ جب پروگرام کو ڈسک سے میموری میں لوڈ کیا جائے، تو اسے چلانے کے وقت یہ خود کو دوبارہ محفوظ نہ کرے۔ ڈسک سے اسمبلی لینگوئج پروگرام کو لوڈ کرنا ایک مختلف قسم کا چیلنج ہے کیونکہ پروگرام خود لوڈ نہیں ہو سکتا۔

ایک پروگرام خود کو ڈسک سے وہاں لوڈ نہیں کر سکتا جہاں سے یہ شروع ہوتا ہے اور RAM میں ختم ہوتا ہے۔ ان دنوں کموڈور-64 کو عام طور پر بنیادی زبان کے پروگراموں کو چلانے کے لیے ایک بنیادی ترجمان فراہم کیا جاتا تھا۔ جب مشین (کمپیوٹر) کو آن کیا جاتا ہے، تو یہ کمانڈ پرامپٹ کے ساتھ حل ہوجاتا ہے: READY۔ وہاں سے، BASIC کمانڈز یا ہدایات کو ٹائپ کرنے کے بعد 'Enter' کی کو دبا کر ٹائپ کیا جا سکتا ہے۔ فائل لوڈ کرنے کے لیے بنیادی کمانڈ (ہدایت) ہے:

'فائل کا نام'، 8،1 لوڈ کریں۔

کمانڈ BASIC محفوظ لفظ سے شروع ہوتی ہے جو کہ LOAD ہے۔ اس کے بعد اسپیس اور پھر فائل کا نام ڈبل کوٹس میں آتا ہے۔ 8 کا آلہ نمبر اس کے بعد آتا ہے جس سے پہلے کوما ہوتا ہے۔ ڈسک کے لیے ثانوی پتہ جو 1 ہے اس کے بعد ایک کوما ہوتا ہے۔ ایسی فائل کے ساتھ، اسمبلی لینگویج پروگرام کا ابتدائی پتہ ڈسک میں موجود فائل کے ہیڈر میں ہوتا ہے۔ جب BASIC پروگرام کو لوڈ کرنا مکمل کر لیتا ہے، تو پروگرام کا آخری RAM ایڈریس پلس 1 لوٹا دیا جاتا ہے۔ یہاں لفظ 'واپس آئے' کا مطلب ہے کہ آخری ایڈریس پلس 1 کا نچلا بائٹ µP X رجسٹر میں ڈالا جاتا ہے، اور آخری ایڈریس جمع 1 کا زیادہ بائٹ µP Y رجسٹر میں ڈالا جاتا ہے۔

پروگرام لوڈ کرنے کے بعد، اسے چلانا پڑتا ہے (عمل درآمد)۔ پروگرام کے صارف کو میموری میں عمل درآمد کے لیے شروع کا پتہ معلوم ہونا چاہیے۔ ایک بار پھر، ایک اور بنیادی پروگرام یہاں ضروری ہے۔ یہ SYS کمانڈ ہے۔ SYS کمانڈ پر عمل کرنے کے بعد، اسمبلی لینگویج پروگرام چلے گا (اور رک جائے گا)۔ چلتے وقت، اگر کی بورڈ سے کوئی ان پٹ درکار ہو، اسمبلی لینگویج پروگرام کو صارف کو اس کی نشاندہی کرنی چاہیے۔ جب صارف کی بورڈ پر ڈیٹا ٹائپ کرتا ہے اور 'Enter' کی کو دباتا ہے، تو اسمبلی لینگوئج پروگرام BASIC ترجمان کی مداخلت کے بغیر کی بورڈ کے اندراج کا استعمال کرتے ہوئے چلتا رہے گا۔

یہ فرض کرتے ہوئے کہ اسمبلی لینگویج پروگرام کے لیے RAM ایڈریس کا آغاز C12316 ہے، C123 کو SYS کمانڈ کے ساتھ استعمال کرنے سے پہلے بیس ٹین میں تبدیل کر دیا جاتا ہے۔ C12316 کو بیس دس میں تبدیل کرنا مندرجہ ذیل ہے:

تو، بنیادی SYS کمانڈ یہ ہے:

SYS 49443

5.16 کموڈور-64 کے لیے بوٹنگ

کموڈور-64 کے لیے بوٹنگ دو مراحل پر مشتمل ہے: ہارڈویئر ری سیٹ کا مرحلہ اور آپریٹنگ سسٹم کی شروعات کا مرحلہ۔ آپریٹنگ سسٹم ROM میں Kernal ہے (اور ڈسک میں نہیں)۔ ایک ری سیٹ لائن ہے (دراصل RES ) جو 6502 µP پر ایک پن سے جڑتا ہے، اور تمام خصوصی جہازوں جیسے CIA 1، CIA 2، اور VIC II میں اسی پن کے نام سے جڑتا ہے۔ ری سیٹ کے مرحلے میں، اس لائن کی وجہ سے، تمام رجسٹر µP اور خصوصی چپس میں 0 پر ری سیٹ ہو جاتے ہیں (ہر بٹ کے لیے صفر بنا دیا جاتا ہے)۔ اس کے بعد، مائیکرو پروسیسر ہارڈویئر کے ذریعے، اسٹیک پوائنٹر اور پروسیسر اسٹیٹس رجسٹر مائیکرو پروسیسر میں ان کی ابتدائی اقدار کے ساتھ دیا جاتا ہے۔ پروگرام کاؤنٹر پھر قیمت (پتہ) کے ساتھ $FFFC اور $FFFD مقامات پر دیا جاتا ہے۔ یاد رکھیں کہ پروگرام کاؤنٹر اگلی ہدایات کا پتہ رکھتا ہے۔ مواد (پتہ) جو یہاں رکھا گیا ہے وہ سب روٹین کے لیے ہے جو سافٹ ویئر کی ابتداء شروع کرتا ہے۔ اب تک سب کچھ مائیکرو پروسیسر ہارڈ ویئر کے ذریعے کیا جاتا ہے۔ اس مرحلے میں پوری یادداشت کو چھوا نہیں ہے۔ اس کے بعد آغاز کا اگلا مرحلہ شروع ہوتا ہے۔

ابتدا ROM OS میں کچھ معمولات کے ذریعہ کی جاتی ہے۔ ابتداء کا مطلب ہے خصوصی چپس میں کچھ رجسٹروں کو ابتدائی یا طے شدہ اقدار دینا۔ اسپیشل چپس میں کچھ رجسٹروں کو ابتدائی یا ڈیفالٹ ویلیوز دے کر ابتداء شروع ہوتی ہے۔ IRQ مثال کے طور پر، ہر سیکنڈ کے 1/60 کو جاری کرنا شروع کرنا ہوگا۔ لہذا، CIA #1 میں اس کے متعلقہ ٹائمر کو اس کی ڈیفالٹ ویلیو پر سیٹ کرنا ہوگا۔

اگلا، کرنل رام ٹیسٹ کرتا ہے۔ یہ مقام پر بائٹ بھیج کر اور اسے واپس پڑھ کر ہر مقام کی جانچ کرتا ہے۔ اگر کوئی فرق ہے تو کم از کم وہ مقام خراب ہے۔ Kernal میموری کے اوپری حصے اور میموری کے نچلے حصے کی بھی نشاندہی کرتا ہے اور صفحہ 2 میں متعلقہ پوائنٹرز سیٹ کرتا ہے۔ اگر میموری کا سب سے اوپر $DFFF ہے، $FF کو $0283 مقام پر رکھا جائے گا اور $DF کو $0284 بائٹ مقام پر رکھا جائے گا۔ $0283 اور $0284 دونوں پر HIRAM لیبل ہے۔ اگر میموری کا نچلا حصہ $0800 ہے تو $00 کو $0281 کے مقام پر اور $08 کو $0282 کے مقام پر رکھا جاتا ہے۔ $0281 اور $0282 دونوں میں LORAM لیبل ہے۔ RAM ٹیسٹ دراصل $0300 سے میموری کے اوپری حصے (RAM) تک شروع ہوتا ہے۔

آخر میں، ان پٹ/آؤٹ پٹ ویکٹر (پوائنٹرز) ان کی ڈیفالٹ اقدار پر سیٹ ہیں۔ RAM ٹیسٹ دراصل $0300 سے میموری کے اوپری حصے (RAM) تک شروع ہوتا ہے۔ اس کا مطلب ہے کہ صفحہ 0، صفحہ 1، اور صفحہ 2 شروع کیے گئے ہیں۔ صفحہ 0، خاص طور پر، بہت سارے OS ROM پوائنٹرز ہیں اور صفحہ 2 میں بہت سارے بنیادی پوائنٹرز ہیں۔ ان پوائنٹرز کو متغیر کہا جاتا ہے۔ یاد رکھیں کہ صفحہ 1 اسٹیک ہے۔ پوائنٹرز کو متغیر کہا جاتا ہے کیونکہ ان کے نام (لیبل) ہوتے ہیں۔ اس مرحلے پر، اسکرین (مانیٹر) کے لیے اسکرین میموری کو صاف کیا جاتا ہے۔ اس کا مطلب ہے کہ اسپیس کے لیے $20 کا کوڈ (جو کہ ASCII $20 کے برابر ہوتا ہے) 1000 RAM اسکرین مقامات پر بھیجنا ہے۔ آخر میں، Kernal BASIC کمانڈ پرامپٹ کو ظاہر کرنے کے لیے BASIC ترجمان کو شروع کرتا ہے جو مانیٹر (اسکرین) کے اوپری حصے میں تیار ہے۔

5.17 مسائل

قارئین کو مشورہ دیا جاتا ہے کہ اگلے باب میں جانے سے پہلے ایک باب میں تمام مسائل حل کر لیں۔

  1. ایک اسمبلی لینگویج کوڈ لکھیں جو CIA #2 پورٹ A کے تمام بٹس کو آؤٹ پٹ کے طور پر اور CIA #2 پورٹ B کو بطور ان پٹ بنائے۔
  2. ایک 6502-اسمبلی لینگویج کوڈ لکھیں جو کی بورڈ کی کو دبانے تک انتظار کرتا ہے۔
  3. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو کموڈور-64 اسکرین پر 'E' کیریکٹر بھیجے۔
  4. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو کی بورڈ سے ایک کریکٹر لیتا ہے اور کلیدی کوڈ اور ٹائمنگ کو نظر انداز کرتے ہوئے اسے کموڈور-64 اسکرین پر بھیجتا ہے۔
  5. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو کموڈور-64 ڈسکیٹ سے بائٹ وصول کرتا ہے۔
  6. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو ایک فائل کو کموڈور-64 ڈسکیٹ میں محفوظ کرتا ہے۔
  7. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو کموڈور-64 ڈسکیٹ سے پروگرام فائل لوڈ کرتا ہے اور اسے شروع کرتا ہے۔
  8. ایک 6502-اسمبلی لینگویج پروگرام لکھیں جو بائٹ 'E' (ASCII) کو موڈیم پر بھیجتا ہے جو کموڈور-64 کے صارف RS-232 مطابقت پذیر پورٹ سے منسلک ہے۔
  9. کموڈور-64 کمپیوٹر میں گنتی اور ٹائمنگ کیسے کی جاتی ہے اس کی وضاحت کریں۔
  10. وضاحت کریں کہ کس طرح کموڈور-64 سسٹم یونٹ 10 مختلف فوری مداخلت کی درخواست کے ذرائع کی شناخت کر سکتا ہے بشمول نان ماسک ایبل مداخلت کی درخواستیں۔
  11. وضاحت کریں کہ کموڈور-64 کمپیوٹر میں پیش منظر پروگرام کے ساتھ پس منظر کا پروگرام کیسے چل سکتا ہے۔
  12. مختصراً بیان کریں کہ اسمبلی لینگوئج پروگراموں کو کموڈور-64 کمپیوٹر کے لیے ایک ایپلی کیشن میں کیسے مرتب کیا جا سکتا ہے۔
  13. کموڈور-64 کمپیوٹر کے بوٹنگ کے عمل کی مختصر وضاحت کریں۔