অধ্যায় 5: অ্যাসেম্বলি ভাষায় কমডোর-64 অপারেটিং সিস্টেম

Adhyaya 5 A Yasembali Bhasaya Kamadora 64 Aparetim Sistema



5.1 ভূমিকা

কমোডোর-64 কম্পিউটারের জন্য অপারেটিং সিস্টেমটি কেবলমাত্র পাঠ্য মেমরিতে (রম) কম্পিউটারের সাথে আসে। কমডোর-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 মেমরি ম্যাপ

তখনকার দিনে বেসিক নামে একটি জনপ্রিয় কম্পিউটার ভাষা ছিল। অনেক কম্পিউটার ব্যবহারকারীর কিছু ন্যূনতম বেসিক ভাষার কমান্ড জানা দরকার ছিল যেমন ডিস্কেট (ডিস্ক) থেকে মেমরিতে একটি প্রোগ্রাম লোড করা, মেমরিতে একটি প্রোগ্রাম চালানো (চালনা করা) এবং একটি প্রোগ্রাম থেকে প্রস্থান (বন্ধ) করা। যখন বেসিক প্রোগ্রাম চলছে, ব্যবহারকারীকে লাইন-বাই-লাইন ডেটা ফিড করতে হবে। এটি আজকের মতো নয় যখন একটি অ্যাপ্লিকেশন (অনেকগুলি প্রোগ্রাম একটি অ্যাপ্লিকেশন তৈরি করে) উইন্ডোগুলির সাথে একটি উচ্চ-স্তরের ভাষায় লেখা হয় এবং ব্যবহারকারীকে শুধুমাত্র একটি উইন্ডোতে বিশেষ স্থানে বিভিন্ন ডেটাতে ফিট করতে হয়। কিছু ক্ষেত্রে, আমরা পূর্ব-অর্ডার করা ডেটা নির্বাচন করতে একটি মাউস ব্যবহার করি। বেসিক সেই সময়ে একটি উচ্চ-স্তরের ভাষা ছিল, তবে এটি সমাবেশ ভাষার বেশ কাছাকাছি।

লক্ষ্য করুন যে বেশিরভাগ মেমরি ডিফল্ট মেমরি মানচিত্রে বেসিক দ্বারা নেওয়া হয়। বেসিকের কমান্ড (নির্দেশ) আছে যা বেসিক ইন্টারপ্রেটার নামে পরিচিত দ্বারা কার্যকর করা হয়। প্রকৃতপক্ষে, বেসিক দোভাষী $A000 অবস্থান থেকে $BFFF (অন্তর্ভুক্ত) রমে রয়েছে যা অনুমিতভাবে একটি RAM এরিয়া। এই সময়ে 8 Kbytes বেশ বড়! এটা আসলে পুরো মেমরির সেই জায়গায় রমে আছে। এটির আকার $E000 থেকে $FFFF (অন্তর্ভুক্ত) অপারেটিং সিস্টেমের সমান। BASIC-এ লেখা প্রোগ্রামগুলিকে $0200 থেকে $BFFF-এর মধ্যেও রাখা হয়েছে।

ইউজার অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামের RAM $C000 থেকে $CFFF, 64 Kbytes-এর মধ্যে মাত্র 4 Kbytes। তাহলে, আমরা অ্যাসেম্বলি ভাষা কেন ব্যবহার করব বা শিখব? নতুন এবং পুরানো অপারেটিং সিস্টেমগুলি অ্যাসেম্বলি ভাষার। কমোডোর-64-এর অপারেটিং সিস্টেমটি রমে রয়েছে, $E000 থেকে $FFFF পর্যন্ত। এটি 65C02 µP (6510 µP) সমাবেশ ভাষায় লেখা হয়। এটি সাবরুটিন নিয়ে গঠিত। পেরিফেরাল (ইনপুট এবং আউটপুট ডিভাইস) এর সাথে ইন্টারঅ্যাক্ট করার জন্য অ্যাসেম্বলি ভাষায় ব্যবহারকারী প্রোগ্রামটিকে এই সাবরুটিনগুলিকে কল করতে হবে। অ্যাসেম্বলি ভাষায় কমডোর-64 অপারেটিং সিস্টেম বোঝা শিক্ষার্থীকে খুব কম ক্লান্তিকর পদ্ধতিতে দ্রুত অপারেটিং সিস্টেম বুঝতে সক্ষম করে। আবার, সেই দিনগুলিতে, কমোডোর-64-এর জন্য অনেক ব্যবহারকারীর প্রোগ্রামগুলি বেসিক ভাষায় লেখা হয়েছিল, অ্যাসেম্বলি ভাষায় নয়। তখনকার দিনে অ্যাসেম্বলি ল্যাঙ্গুয়েজগুলি প্রযুক্তিগত উদ্দেশ্যে প্রোগ্রামাররা নিজেরাই বেশি ব্যবহার করত।

K-e-r-n-a-l নামে বানান করা Kernal হল কমডোর-64-এর অপারেটিং সিস্টেম। এটি কমোডোর-64 কম্পিউটারের সাথে রমে আসে এবং ডিস্কে (বা ডিস্কেট) নয়। কার্নাল সাবরুটিন নিয়ে গঠিত। পেরিফেরালগুলি অ্যাক্সেস করার জন্য, সমাবেশ ভাষা (মেশিন ভাষা) ব্যবহারকারী প্রোগ্রামকে এই সাবরুটিনগুলি ব্যবহার করতে হবে। কার্নালকে কার্নেলের সাথে বিভ্রান্ত করা উচিত নয় যা আধুনিক অপারেটিং সিস্টেমের K-e-r-n-e-l হিসাবে বানান করা হয়, যদিও তারা প্রায় একই জিনিস।

মেমরির 4 Kbytes10 এর $C000 (49,15210) থেকে $CFFF (6324810) পর্যন্ত মেমরি ক্ষেত্র হল RAM বা ROM৷ যখন এটি RAM হয়, তখন এটি পেরিফেরাল অ্যাক্সেস করতে ব্যবহৃত হয়। যখন এটি রম হয়, তখন এটি স্ক্রিনে (মনিটর) অক্ষরগুলি প্রিন্ট করতে ব্যবহৃত হয়। এর মানে হল যে হয় অক্ষরগুলি স্ক্রিনে মুদ্রিত হচ্ছে বা মেমরির এই অংশটি ব্যবহার করে পেরিফেরালগুলি অ্যাক্সেস করা হচ্ছে। সিস্টেম ইউনিটে (মাদারবোর্ড) একটি ব্যাঙ্ক অফ রম (অক্ষর রম) রয়েছে যা এটি অর্জনের জন্য পুরো মেমরি স্পেসের মধ্যে এবং বাইরে সুইচ করা হয়। ব্যবহারকারী স্যুইচিং লক্ষ্য করতে পারে না।

$0100 থেকে মেমরির ক্ষেত্রফল (256 10 ) থেকে $01FF (511 10 ) হল স্ট্যাক। এটি অপারেটিং সিস্টেম এবং ব্যবহারকারী প্রোগ্রাম উভয় দ্বারা ব্যবহৃত হয়। এই অনলাইন ক্যারিয়ার কোর্সের আগের অধ্যায়ে স্ট্যাকের ভূমিকা ব্যাখ্যা করা হয়েছিল। $0000 থেকে মেমরির ক্ষেত্রফল (0 10 ) থেকে $00FF (255 10 ) অপারেটিং সিস্টেম দ্বারা ব্যবহৃত হয়। অনেক পয়েন্টার সেখানে বরাদ্দ করা হয়.

কার্নাল জাম্প টেবিল
Kernal এর রুটিন আছে যা ব্যবহারকারী প্রোগ্রাম দ্বারা বলা হয়। OS এর নতুন সংস্করণ বের হওয়ার সাথে সাথে এই রুটিনের ঠিকানাগুলি পরিবর্তিত হয়েছে। এর মানে হল যে ব্যবহারকারীর প্রোগ্রামগুলি আর নতুন OS সংস্করণগুলির সাথে কাজ করতে পারে না। এটি ঘটেনি কারণ কমোডোর -64 একটি লাফ টেবিল সরবরাহ করেছিল। জাম্প টেবিলটি 39টি এন্ট্রির একটি তালিকা। টেবিলের প্রতিটি এন্ট্রিতে তিনটি ঠিকানা রয়েছে (শেষ 6 বাইট ব্যতীত) যা অপারেটিং সিস্টেমের সংস্করণ পরিবর্তনের সাথেও পরিবর্তিত হয় না।

একটি এন্ট্রির প্রথম ঠিকানায় একটি JSR নির্দেশ রয়েছে। পরবর্তী দুটি ঠিকানা একটি দুই-বাইট পয়েন্টার নিয়ে গঠিত। এই দুই-বাইট পয়েন্টার হল একটি আসল রুটিনের ঠিকানা (বা নতুন ঠিকানা) যা এখনও ওএস রমে রয়েছে। পয়েন্টার বিষয়বস্তু নতুন OS সংস্করণের সাথে পরিবর্তিত হতে পারে, কিন্তু প্রতিটি জাম্প টেবিল এন্ট্রির জন্য তিনটি ঠিকানা কখনই পরিবর্তন হয় না। উদাহরণস্বরূপ, $FF81, $FF82, এবং $FF83 ঠিকানাগুলি বিবেচনা করুন৷ এই তিনটি ঠিকানা মাদারবোর্ডের স্ক্রীন এবং কীবোর্ড সার্কিট (রেজিস্টার) শুরু করার রুটিনের জন্য। $FF81 ঠিকানায় সবসময় JSR এর অপ কোড (এক বাইট) থাকে। শুরু করার জন্য $FF82 এবং $FF83 ঠিকানাগুলিতে সাবরুটিনের পুরানো বা নতুন ঠিকানা থাকে (এখনও OS ROM-এ)। এক সময়ে, $FF82 এবং $FF83 ঠিকানাগুলিতে $FF5B এর বিষয়বস্তু (ঠিকানা) ছিল যা পরবর্তী OS সংস্করণের সাথে পরিবর্তিত হতে পারে। যাইহোক, জাম্প টেবিলের $FF81, $FF82, এবং $FF83 ঠিকানাগুলি কখনই পরিবর্তন হয় না।

তিনটি ঠিকানার প্রতিটি এন্ট্রির জন্য, JSR-এর সাথে প্রথম ঠিকানায় একটি লেবেল (নাম) রয়েছে। $FF81-এর লেবেল হল PCINT। PCINT কখনো পরিবর্তন হয় না। সুতরাং, স্ক্রিন এবং কীবোর্ড রেজিস্টার শুরু করার জন্য, প্রোগ্রামার কেবল 'JSR PCINT' টাইপ করতে পারে যা কমডোর-64 OS এর সমস্ত সংস্করণের জন্য কাজ করে। প্রকৃত সাবরুটিনের অবস্থান (শুরু করার ঠিকানা), যেমন, $FF5B, বিভিন্ন অপারেটিং সিস্টেমের সাথে সময়ের সাথে পরিবর্তিত হতে পারে। হ্যাঁ, রম ওএস ব্যবহার করে এমন ব্যবহারকারীর প্রোগ্রামে অন্তত দুটি JSR নির্দেশাবলী জড়িত। ব্যবহারকারী প্রোগ্রামে, একটি JSR নির্দেশ রয়েছে যা জাম্প টেবিলের একটি এন্ট্রিতে লাফ দেয়। জাম্প টেবিলের শেষ ছয়টি ঠিকানা বাদ দিয়ে, জাম্প টেবিলের একটি এন্ট্রির প্রথম ঠিকানায় একটি JSR নির্দেশ রয়েছে। কার্নালে, কিছু সাবরুটিন অন্য সাবরুটিনকে কল করতে পারে।

Kernal জাম্প টেবিল $FF81 (অন্তর্ভুক্ত) থেকে শুরু হয় তিনজনের দলে উপরের দিকে যাওয়া, শেষ ছয়টি বাইট ছাড়া যা নিম্ন বাইট ঠিকানা সহ তিনটি পয়েন্টার: $FFFA, $FFFC এবং $FFFE। সমস্ত ROM OS রুটিন হল পুনরায় ব্যবহারযোগ্য কোড। সুতরাং, ব্যবহারকারীকে তাদের পুনরায় লিখতে হবে না।

কমোডোর-64 সিস্টেম ইউনিটের ব্লক ডায়াগ্রাম
নিম্নলিখিত চিত্রটি আগের অধ্যায়ের চেয়ে আরও বিস্তারিত:


চিত্র 5.12 কমডোর_64 সিস্টেম ইউনিটের ব্লক ডায়াগ্রাম

রম এবং RAM এখানে একটি ব্লক হিসাবে দেখানো হয়েছে। স্ক্রীনে তথ্য পরিচালনার জন্য ভিডিও ইন্টারফেস চিপ (IC), যা আগের অধ্যায়ে দেখানো হয়নি, এখানে দেখানো হয়েছে। ইনপুট/আউটপুট ডিভাইসের জন্য একক ব্লক, যা পূর্ববর্তী অধ্যায়ে দেখানো হয়েছে, এখানে দুটি ব্লক হিসেবে দেখানো হয়েছে: CIA #1 এবং CIA #2। CIA এর পূর্ণরূপ হল Complex Interface Adapter. প্রতিটিতে দুটি সমান্তরাল আট-বিট পোর্ট রয়েছে (সিস্টেম ইউনিটের উল্লম্ব পৃষ্ঠে বহিরাগত পোর্টগুলির সাথে বিভ্রান্ত হবেন না) যাকে পোর্ট A এবং পোর্ট B বলা হয়। এই পরিস্থিতিতে সিআইএ-এর পাঁচটি বহিরাগত ডিভাইসের সাথে সংযুক্ত রয়েছে। ডিভাইসগুলি হল কীবোর্ড, জয়স্টিক, ডিস্ক ড্রাইভ/প্রিন্টার এবং একটি মডেম। প্রিন্টারটি ডিস্ক ড্রাইভের পিছনে সংযুক্ত। এছাড়াও একটি সাউন্ড ইন্টারফেস ডিভাইস সার্কিট এবং একটি প্রোগ্রামেবল লজিক অ্যারে সার্কিট রয়েছে যা দেখানো হয় না।

তারপরও, একটি ক্যারেক্টার রম আছে যা উভয় সিআইএ-এর সাথে অদলবদল করা যায় যখন একটি অক্ষর স্ক্রিনে পাঠানো হয় এবং এটি ব্লক ডায়াগ্রামে দেখানো হয় না।

অক্ষর ROM এর অনুপস্থিতিতে ইনপুট/আউটপুট সার্কিটের জন্য $D000 থেকে $DFFF থেকে $DFFF র‌্যামের ঠিকানায় নিম্নলিখিত বিশদ মেমরি মানচিত্র রয়েছে:

সারণি 5.11
$D000 থেকে $DFFF পর্যন্ত বিস্তারিত মেমরি ম্যাপ
উপ-ঠিকানার পরিসর সার্কিট আকার (বাইট)
D000 – D3FF ভিআইসি (ভিডিও ইন্টারফেস কন্ট্রোলার (চিপ)) 1 কে
D400 – D7FF SID (সাউন্ড সার্কিট) 1 কে
D800 - DBFF কালার RAM 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) রয়েছে এবং তাদের প্রতিটিকে কমপ্লেক্স ইন্টারফেস অ্যাডাপ্টার বলা হয়। এই দুটি চিপ মাইক্রোপ্রসেসরের সাথে কীবোর্ড এবং অন্যান্য পেরিফেরিয়াল ইন্টারফেস করতে ব্যবহৃত হয়। ভিআইসি এবং স্ক্রীন বাদে, মাইক্রোপ্রসেসর এবং পেরিফেরালগুলির মধ্যে সমস্ত ইনপুট/আউটপুট সংকেত এই দুটি আইসিগুলির মধ্য দিয়ে যায়। কমোডোর -64 এর সাথে, মেমরি এবং কোনও পেরিফেরালের মধ্যে সরাসরি যোগাযোগ নেই। মেমরি এবং যেকোনো পেরিফেরালের মধ্যে যোগাযোগ মাইক্রোপ্রসেসর অ্যাকিউমুলেটরের মধ্য দিয়ে যায় এবং এর মধ্যে একটি হল CIA অ্যাডাপ্টার (ICs)। আইসিগুলিকে সিআইএ #1 এবং সিআইএ #2 হিসাবে উল্লেখ করা হয়। CIA এর পূর্ণরূপ হল Complex Interface Adapter.

প্রতিটি সিআইএর 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।

পোর্ট এ বা পোর্ট বি উভয় সিআইএ একটি সমান্তরাল পোর্ট। এর মানে এটি একবারে আট বিটে পেরিফেরালে ডেটা পাঠাতে পারে বা একবারে আট বিটে মাইক্রোপ্রসেসর থেকে ডেটা গ্রহণ করতে পারে।

পোর্ট 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-এর জন্য প্রতিটি বিট সংশ্লিষ্ট ডেটা দিকনির্দেশ রেজিস্টার দ্বারা ইনপুট বা আউটপুট হিসাবে সেট করা যেতে পারে। ইনপুট মানে তথ্য একটি CIA মাধ্যমে পেরিফেরাল থেকে মাইক্রোপ্রসেসরে যাচ্ছে। আউটপুট মানে মাইক্রোপ্রসেসর থেকে সিআইএ-এর মাধ্যমে পেরিফেরালে তথ্য যাচ্ছে।

যদি একটি পোর্টের (রেজিস্টার) একটি সেল ইনপুট করতে হয়, ডেটা দিকনির্দেশ রেজিস্টারে সংশ্লিষ্ট বিটটি 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 এর মেমরি বাইট অবস্থানের জন্য লেবেল (ভেরিয়েবল নাম)। প্রথম নির্দেশ 11111111 µP এর সঞ্চয়কারীতে লোড করে। দ্বিতীয় নির্দেশ সিআইএ নম্বর পোর্ট A-এর ডাটা ডিরেকশন রেজিস্টারে কপি করে। 1. তৃতীয় নির্দেশ 00000000 µP-এর সঞ্চয়কারীতে লোড করে। চতুর্থ নির্দেশটি সিআইএ নং পোর্ট বি-এর ডাটা ডিরেকশন রেজিস্টারে কপি করে। 1. এই কোডটি অপারেটিং সিস্টেমের একটি সাবরুটিনে রয়েছে যা কম্পিউটার পাওয়ার-আপে এই আরম্ভ করে।

প্রতিটি সিআইএ মাইক্রোপ্রসেসরে একটি বিঘ্নিত পরিষেবা অনুরোধ লাইন আছে। সিআইএ #1 থেকে এক যায় আইআরকিউ µP এর পিন। সিআইএ #2 থেকে এক যায় এনএমআই µP এর পিন। মনে রাখবেন, যে এনএমআই তুলনায় একটি উচ্চ অগ্রাধিকার হয় আইআরকিউ .

5.3 কীবোর্ড অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামিং

কমোডোর -64 এর জন্য শুধুমাত্র তিনটি সম্ভাব্য বাধা রয়েছে: আইআরকিউ , বিআরকে, এবং এনএমআই . জন্য লাফ টেবিল পয়েন্টার আইআরকিউ রম (অপারেটিং সিস্টেম) এর $FFFE এবং $FFFF ঠিকানায় রয়েছে যা OS (ROM) এ থাকা একটি সাবরুটিনের সাথে মিলে যায়। BRK-এর জন্য জাম্প টেবিল পয়েন্টারটি OS-এর $FFFC এবং $FFFD ঠিকানায় রয়েছে যা OS (ROM) এ থাকা একটি সাবরুটিনের সাথে মিলে যায়। জন্য লাফ টেবিল পয়েন্টার এনএমআই OS-এর $FFFA এবং $FFFB ঠিকানায় রয়েছে যা OS (ROM) এ থাকা একটি সাবরুটিনের সাথে মিলে যায়৷ জন্য আইআরকিউ , আসলে দুটি সাবরুটিন আছে। সুতরাং, BRK সফ্টওয়্যার বাধা (নির্দেশ) এর নিজস্ব জাম্প টেবিল পয়েন্টার রয়েছে। জন্য লাফ টেবিল পয়েন্টার আইআরকিউ কোডের দিকে নিয়ে যায় যা সিদ্ধান্ত নেয় যে এটি হার্ডওয়্যার বাধা বা সফ্টওয়্যার বাধা যা নিযুক্ত রয়েছে। এটা যদি হার্ডওয়্যার বাধা, জন্য রুটিন আইআরকিউ বলা হয়. যদি এটি সফ্টওয়্যার বাধা (BRK) হয়, তাহলে BRK-এর রুটিন বলা হয়। OS সংস্করণগুলির একটিতে, এর জন্য সাবরুটিন আইআরকিউ $EA31 এ এবং BRK-এর সাবরুটিন $FE66 এ। এই ঠিকানাগুলি $FF81 এর নীচে, তাই এগুলি জাম্প টেবিল এন্ট্রি নয় এবং সেগুলি OS সংস্করণের সাথে পরিবর্তন হতে পারে৷ এই বিষয়ে আগ্রহের তিনটি রুটিন রয়েছে: একটি যা চেক করে এটি একটি কী চাপা বা একটি BRK, একটি যা $FE43 এ আছে এবং একটি যা OS সংস্করণের সাথে পরিবর্তিত হতে পারে৷

কমোডোর-64 কম্পিউটারটি প্রিন্টিং বিভাগ (মাথা এবং কাগজ) ছাড়াই একটি বিশাল টাইপ-রাইটার (উর্ধ্বগামী) মত। কীবোর্ডটি CIA #1 এর সাথে সংযুক্ত। সিআইএ #1 ডিফল্টভাবে কোনো প্রোগ্রামিং হস্তক্ষেপ ছাড়াই প্রতি সেকেন্ডের 1/60 কীবোর্ড স্ক্যান করে। সুতরাং, প্রতি সেকেন্ডের 1/60, CIA #1 একটি পাঠায় আইআরকিউ µP এর কাছে। এখনও বিক্রয়ের জন্য আইআরকিউ µP এ পিন করুন যা শুধুমাত্র CIA #1 থেকে আসে। এর একটি ইনপুট পিন এনএমআই µP এর, যা থেকে আলাদা আইআরকিউ , শুধুমাত্র CIA #2 থেকে এসেছে (নিম্নলিখিত চিত্রটি পড়ুন)। BRK আসলে একটি অ্যাসেম্বলি ল্যাঙ্গুয়েজ ইন্সট্রাকশন যা একটি ইউজার প্রোগ্রামে কোড করা হয়।

সুতরাং, প্রতি 1/60 সেকেন্ডে, আইআরকিউ $FFFE এবং $FFFF দ্বারা নির্দেশিত রুটিন বলা হয়। রুটিন চেক করে যে একটি কী চাপা হয়েছে নাকি BRK নির্দেশের সম্মুখীন হয়েছে। যদি একটি কী চাপানো হয়, কী-প্রেস পরিচালনার রুটিন বলা হয়। এটি একটি BRK নির্দেশ হলে, BRK পরিচালনার রুটিন বলা হয়। যদি তা না হয় তবে কিছুই হবে না। উভয়ই ঘটতে পারে, তবে সিআইএ #1 পাঠায় আইআরকিউ প্রতি 1/60 সেকেন্ডে µP পর্যন্ত।

কীবোর্ড সারি, যা কীবোর্ড বাফার নামেও পরিচিত, হল $0277 থেকে $0280 পর্যন্ত RAM বাইট অবস্থানগুলির একটি পরিসর, সমন্বিতভাবে; সব মিলিয়ে 1010 বাইট। এটি একটি ফার্স্ট-ইন-ফার্স্ট-আউট বাফার। তার মানে যে প্রথম চরিত্রটি আসবে সে প্রথম চলে যাবে। একটি পশ্চিম ইউরোপীয় চরিত্র এক বাইট নেয়।

সুতরাং, যখন একটি কী চাপলে প্রোগ্রামটি কোনও অক্ষর গ্রহণ করে না, কী কোডটি এই বাফারে (সারিতে) যায়। দশটি অক্ষর না হওয়া পর্যন্ত বাফারটি পূর্ণ হতে থাকে। দশম অক্ষরের পরে চাপ দেওয়া যে কোনও অক্ষর রেকর্ড করা হয় না। এটি উপেক্ষা করা হয় যতক্ষণ না অন্তত একটি অক্ষর সারি থেকে অর্জিত হয় (গ্রাহ্য)। জাম্প টেবিলে একটি সাবরুটিনের জন্য একটি এন্ট্রি রয়েছে যা সারি থেকে মাইক্রোপ্রসেসরে প্রথম অক্ষর পায়। এর মানে হল যে এটি সেই প্রথম অক্ষরটি নেয় যা সারিতে যায় এবং এটিকে µP এর সঞ্চয়কারীতে রাখে। এটি করার জন্য জাম্প টেবিল সাবরুটিনকে বলা হয় GETIN (গেট-ইন এর জন্য)। জাম্প টেবিলে থ্রি-বাইট এন্ট্রির জন্য প্রথম বাইটটিকে GETIN (ঠিকানা $FFE4) হিসাবে লেবেল করা হয়েছে। পরের দুটি বাইট হল পয়েন্টার (ঠিকানা) যা রম (ওএস) এর প্রকৃত রুটিন নির্দেশ করে। এই রুটিনটি কল করার দায়িত্ব প্রোগ্রামারের। অন্যথায়, কীবোর্ড বাফারটি পূর্ণ থাকবে এবং সম্প্রতি চাপা সমস্ত কী উপেক্ষা করা হবে। যে মানটি সঞ্চয়কারীর মধ্যে যায় তা হল সংশ্লিষ্ট কী ASCII মান।

কীভাবে কী কোডগুলি প্রথম স্থানে সারিতে উঠবে? SCNKEY (স্ক্যান কী এর জন্য) নামে একটি জাম্প টেবিল রুটিন আছে। এই রুটিনটি সফ্টওয়্যার এবং হার্ডওয়্যার উভয় দ্বারাই বলা যেতে পারে। এই ক্ষেত্রে, এটি মাইক্রোপ্রসেসরে একটি ইলেকট্রনিক্স (পদার্থবিজ্ঞান) সার্কিট দ্বারা বলা হয় যখন বৈদ্যুতিক সংকেত আইআরকিউ কম. এটি কীভাবে করা হয় তা এই অনলাইন ক্যারিয়ার কোর্সে সম্বোধন করা হয়নি।

কীবোর্ড বাফার থেকে সঞ্চয়কারী A-তে প্রথম কী কোড পাওয়ার কোডটি হল একটি লাইন:

ভিতরে আস

কীবোর্ড বাফার খালি থাকলে, $00 সঞ্চয়কারীতে স্থাপন করা হয়। মনে রাখবেন যে শূন্যের জন্য ASCII কোড $00 নয়; এটা $30. $00 মানে শূন্য। একটি প্রোগ্রামে, এমন একটি পয়েন্ট থাকতে পারে যেখানে প্রোগ্রামটিকে একটি কী প্রেসের জন্য অপেক্ষা করতে হবে। এর জন্য কোড হল:

জেএসআর পেতে অপেক্ষা করুন
CMP #$00
ব্যাঙ অপেক্ষা করুন

প্রথম লাইনে, 'WAIT' হল একটি লেবেল যা RAM ঠিকানাকে চিহ্নিত করে যেখানে JSR নির্দেশনা দেওয়া হয়েছে (টাইপ করা হয়েছে)। GETINও একটি ঠিকানা। এটি জাম্প টেবিলের সংশ্লিষ্ট তিনটি বাইটের প্রথমটির ঠিকানা। GETIN এন্ট্রি, সেইসাথে জাম্প টেবিলের সমস্ত এন্ট্রি (শেষ তিনটি বাদে), তিনটি বাইট নিয়ে গঠিত। এন্ট্রির প্রথম বাইট হল JSR নির্দেশ। পরের দুটি বাইট হল প্রকৃত GETIN সাবরুটিনের বডির ঠিকানা যা এখনও রম (OS) এ আছে কিন্তু জাম্প টেবিলের নিচে। সুতরাং, এন্ট্রিটি GETIN সাবরুটিনে লাফ দিতে বলে। কীবোর্ড সারি খালি না থাকলে, GETIN ফার্স্ট-ইন-ফার্স্ট-আউট সারির ASCII কী কোডকে সঞ্চয়কারীতে রাখে। সারি খালি থাকলে, Null ($00) সঞ্চয়কারীতে রাখা হয়।

দ্বিতীয় নির্দেশ $00 এর সাথে সঞ্চয়কারীর মান তুলনা করে। যদি এটি $00 হয়, তাহলে এর অর্থ হল কীবোর্ডের সারিটি খালি, এবং CMP নির্দেশাবলী প্রসেসর স্ট্যাটাস রেজিস্টারের Z পতাকায় 1 পাঠায় (যাকে শুধু স্ট্যাটাস রেজিস্টার বলা হয়)। A-তে মান $00 না হলে, সিএমপি নির্দেশনা স্ট্যাটাস রেজিস্টারের Z পতাকায় 0 পাঠায়।

তৃতীয় নির্দেশ যা 'BEQ WAIT' হল প্রোগ্রামটিকে প্রথম নির্দেশে ফেরত পাঠায় যদি স্ট্যাটাস রেজিস্টারের Z পতাকা 1 হয়। প্রথম, দ্বিতীয় এবং তৃতীয় নির্দেশাবলী কীবোর্ডের একটি কী চাপা না হওয়া পর্যন্ত বারবার কার্যকর করা হয়। . যদি একটি কী চাপা না হয়, চক্রটি অনির্দিষ্টকালের জন্য পুনরাবৃত্তি হয়। এই ধরনের একটি কোড সেগমেন্ট সাধারণত একটি টাইমিং কোড সেগমেন্ট দিয়ে লেখা হয় যা কিছু সময়ের পর লুপ ছেড়ে দেয় যদি কোনো কী চাপা না হয় (নিম্নলিখিত আলোচনা পড়ুন)।

বিঃদ্রঃ : কীবোর্ড হল ডিফল্ট ইনপুট ডিভাইস এবং স্ক্রিন হল ডিফল্ট আউটপুট ডিভাইস।

5.4 চ্যানেল, ডিভাইস নম্বর, এবং লজিক্যাল ফাইল নম্বর

কমডোর-64 অপারেটিং সিস্টেম ব্যাখ্যা করার জন্য এই অধ্যায়ে যে পেরিফেরিয়ালগুলি ব্যবহার করা হয়েছে তা হল কীবোর্ড, স্ক্রিন (মনিটর), ডিস্কেট সহ ডিস্ক ড্রাইভ, প্রিন্টার এবং মডেম যা RS-232C ইন্টারফেসের মাধ্যমে সংযোগ করে। এই ডিভাইসগুলি এবং সিস্টেম ইউনিটের (মাইক্রোপ্রসেসর এবং মেমরি) মধ্যে যোগাযোগের জন্য একটি চ্যানেল স্থাপন করতে হবে।

একটি চ্যানেলে একটি বাফার, ডিভাইস নম্বর, একটি লজিক্যাল ফাইল নম্বর এবং ঐচ্ছিকভাবে একটি গৌণ ঠিকানা থাকে। এই শর্তাবলীর ব্যাখ্যা নিম্নরূপ:

একটি বাফার
পূর্ববর্তী বিভাগ থেকে লক্ষ্য করুন যে যখন একটি কী চাপানো হয়, তখন এর কোডটি র‍্যামের একটি বাইট অবস্থানে যেতে হবে একটি ধারাবাহিক দশটি অবস্থানের একটি সিরিজের। দশটি অবস্থানের এই সিরিজটি কীবোর্ড বাফার। প্রতিটি ইনপুট বা আউটপুট ডিভাইসের (পেরিফেরাল) 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) মেমরি ঠিকানাগুলি শুধুমাত্র রম (কার্নাল) অপারেটিং সিস্টেম দ্বারা ব্যবহৃত হয় এবং অপারেটিং সিস্টেম প্লাস বেসিক ভাষা দ্বারা নয়। যদিও বেসিক এখনও রম ওএসের মাধ্যমে অবস্থানগুলি ব্যবহার করতে পারে।

মডেম এবং প্রিন্টার দুটি ভিন্ন পেরিফেরাল লক্ষ্য। যদি দুটি ফাইল ডিস্ক থেকে খোলা হয়, সেগুলি দুটি ভিন্ন লক্ষ্য। ডিফল্ট মেমরি মানচিত্রের সাথে, তিনটি পরপর টেবিল (তালিকা) রয়েছে যা একটি বড় টেবিল হিসাবে দেখা যেতে পারে। এই তিনটি টেবিল লজিক্যাল ফাইল নম্বর, ডিভাইস নম্বর এবং সেকেন্ডারি অ্যাড্রেসের মধ্যে সম্পর্ক রাখে। এর সাথে, একটি নির্দিষ্ট চ্যানেল বা ইনপুট/আউটপুট লক্ষ্য শনাক্তযোগ্য হয়ে ওঠে। তিনটি টেবিলকে ফাইল টেবিল বলা হয়। RAM ঠিকানা এবং তাদের কি আছে:

$0259 — $0262: লেবেল সহ টেবিল, LAT, দশটি পর্যন্ত সক্রিয় লজিক্যাল ফাইল নম্বর।
$0263 — $026C: দশটি পর্যন্ত সংশ্লিষ্ট ডিভাইস নম্বরের লেবেল, FAT সহ টেবিল।
$026D — $0276: দশটি সংশ্লিষ্ট মাধ্যমিক ঠিকানার লেবেল, SAT সহ টেবিল।

এখানে, “—“ মানে “to”, এবং একটি সংখ্যা এক বাইট নেয়।

পাঠক জিজ্ঞাসা করতে পারেন, 'কেন প্রতিটি ডিভাইসের জন্য একটি চ্যানেল সনাক্ত করার জন্য বাফার অন্তর্ভুক্ত করা হয় না?' ঠিক আছে, উত্তর হল যে কমোডোর-64 এর সাথে, প্রতিটি বাহ্যিক ডিভাইস (পেরিফেরাল) র‌্যামে (মেমরি ম্যাপ) বাইটের একটি নির্দিষ্ট সিরিজ রয়েছে। কোনো খোলা চ্যানেল ছাড়াই, তাদের অবস্থান এখনও স্মৃতিতে রয়েছে। কীবোর্ডের বাফার, উদাহরণস্বরূপ, ডিফল্ট মেমরি মানচিত্রের জন্য $0277 থেকে $0280 (অন্তর্ভুক্ত) পর্যন্ত স্থির করা হয়েছে।

কার্নাল SETLFS এবং SETNAM সাবরুটিন
SETLFS এবং SETNAM হল কার্নাল রুটিন। একটি চ্যানেল একটি লজিক্যাল ফাইল হিসাবে দেখা যেতে পারে। একটি চ্যানেল খোলার জন্য, লজিক্যাল ফাইল নম্বর, ডিভাইস নম্বর এবং একটি ঐচ্ছিক সেকেন্ডারি ঠিকানা তৈরি করতে হবে। একটি ঐচ্ছিক ফাইলের নাম (টেক্সট) এছাড়াও প্রয়োজন হতে পারে। SETLFS রুটিন লজিক্যাল ফাইল নম্বর, ডিভাইস নম্বর এবং একটি ঐচ্ছিক গৌণ ঠিকানা সেট আপ করে। এই সংখ্যাগুলি তাদের নিজ নিজ টেবিলে রাখা হয়। SETNAM রুটিন ফাইলের জন্য একটি স্ট্রিং নাম সেট আপ করে যা একটি চ্যানেলের জন্য বাধ্যতামূলক এবং অন্য চ্যানেলের জন্য ঐচ্ছিক হতে পারে। এটি মেমরিতে একটি পয়েন্টার (টু-বাইট ঠিকানা) নিয়ে গঠিত। পয়েন্টারটি স্ট্রিং (নাম) এর শুরুতে নির্দেশ করে যা মেমরির অন্য জায়গায় থাকতে পারে। স্ট্রিং নামটি একটি বাইট দিয়ে শুরু হয় যাতে স্ট্রিংয়ের দৈর্ঘ্য থাকে, তারপরে পাঠ্য (নাম)। নামটি সর্বোচ্চ ষোল বাইট (দীর্ঘ)।

SETLFS রুটিন কল করার জন্য, ব্যবহারকারী প্রোগ্রামটিকে ডিফল্ট মেমরি মানচিত্রের জন্য ROM-এ OS-এর জাম্প টেবিলের $FFBA ঠিকানায় (JSR) যেতে হবে। মনে রাখবেন যে জাম্প টেবিলের শেষ ছয় বাইট বাদে, প্রতিটি এন্ট্রি তিনটি বাইট নিয়ে গঠিত। প্রথম বাইট হল 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 রুটিনটি $FFBD-এ OS ROM জাম্প টেবিলে জাম্পিং (JSR) দ্বারা অ্যাক্সেস করা হয়। সব গন্তব্যের ফাইলের নাম নেই। যাদের গন্তব্য আছে (ডিস্কের ফাইলের মতো), ফাইলের নাম সেট আপ করা উচিত। অনুমান করুন যে ফাইলের নাম 'মাইডোকাম' যা উদ্ধৃতি ছাড়াই 7 বাইট নিয়ে গঠিত। অনুমান করুন যে এই নামটি $C101 থেকে $C107 অবস্থানে (অন্তর্ভুক্ত) এবং $07 এর দৈর্ঘ্য $C100 অবস্থানে। স্ট্রিং অক্ষরের শুরুর ঠিকানা হল $C101। শুরুর ঠিকানার নিম্ন বাইট হল $01 এবং উচ্চতর বাইট হল $C1৷

SETNAM রুটিন কল করার আগে, প্রোগ্রামারকে $07 (স্ট্রিংয়ের দৈর্ঘ্য) নম্বরটি µP সঞ্চয়কারীতে রাখতে হবে। $01 এর স্ট্রিং প্রারম্ভিক ঠিকানার নিম্ন বাইটটি µP X রেজিস্টারে রাখা হয়। $C1 এর স্ট্রিং প্রারম্ভিক ঠিকানার উচ্চতর বাইটটি µP Y রেজিস্টারে রাখা হয়। সাবরুটিনকে সহজভাবে নিম্নলিখিতগুলি দিয়ে বলা হয়:

জেএসআর সেটনাম

SETNAM রুটিন চ্যানেলের সাথে তিনটি রেজিস্টারের মানগুলিকে সংযুক্ত করে। এর পরে মানগুলি রেজিস্টারে থাকার দরকার নেই। চ্যানেলের ফাইলের নাম না থাকলে, প্রোগ্রামারকে $00 µP সঞ্চয়কারীতে রাখতে হবে। এই ক্ষেত্রে, X এবং Y রেজিস্টারে থাকা মানগুলি উপেক্ষা করা হয়।

ওএস ওপেন রুটিন
OS ওপেন রুটিনটি $FFC0 এ OS ROM জাম্প টেবিলে জাম্প করে (JSR) অ্যাক্সেস করা হয়। এই রুটিনটি লজিক্যাল ফাইল নম্বর, ডিভাইস নম্বর (এবং বাফার), একটি সম্ভাব্য গৌণ ঠিকানা, এবং একটি সম্ভাব্য ফাইলের নাম ব্যবহার করে, কমোডোর কম্পিউটার এবং বাহ্যিক ডিভাইস বা বাহ্যিক ডিভাইসের ফাইলের মধ্যে একটি সংযোগ প্রদান করতে।

এই রুটিন, অন্যান্য কমোডোর ওএস রম রুটিনের মত, কোন যুক্তি গ্রহণ করে না। যদিও এটি µP রেজিস্টার ব্যবহার করে, তবে রেজিস্টারগুলির কোনোটিই এর জন্য আর্গুমেন্ট (মান) সহ প্রিলোড করা হয়নি। এটি কোড করার জন্য, SETLFS এবং SETNAM কল করার পরে নিম্নলিখিতটি টাইপ করুন:

JSR ওপেন

OPEN রুটিনে ত্রুটি ঘটতে পারে। উদাহরণস্বরূপ, ফাইলটি পড়ার জন্য খুঁজে পাওয়া যাবে না। একটি ত্রুটি ঘটলে, রুটিন ব্যর্থ হয় এবং সংশ্লিষ্ট ত্রুটি নম্বরটিকে µP সঞ্চয়কারীতে রাখে এবং µP স্ট্যাটাস রেজিস্টারের বহন পতাকা (1তে) সেট করে। নিম্নলিখিত সারণী ত্রুটি সংখ্যা এবং তাদের অর্থ প্রদান করে:

টেবিল 5.51
OS ROM ওপেন রুটিনের জন্য Kernal Error Numbers এবং তাদের অর্থ
ত্রুটি নম্বর বর্ণনা উদাহরণ
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 রেজিস্টারে লজিক্যাল ফাইল নম্বর রাখতে হবে। এটি সহজভাবে বলা হয়:

JSR CHKIN

OS CHKOUT রুটিন
OS CHKOUT রুটিনটি $FFC9 এ OS ROM জাম্প টেবিলে জাম্পিং (JSR) দ্বারা অ্যাক্সেস করা হয়। একটি ফাইল (লজিক্যাল ফাইল) ওপেন করার পর সিদ্ধান্ত নিতে হবে ওপেনিংটি ইনপুট না আউটপুটের জন্য। CHKOUT রুটিন খোলাকে একটি আউটপুট চ্যানেল করে তোলে। এই রুটিনের জন্য µP X রেজিস্টার থেকে লজিক্যাল ফাইল নম্বর পড়তে হবে। সুতরাং, প্রোগ্রামারকে এই রুটিনটি কল করার আগে X রেজিস্টারে লজিক্যাল ফাইল নম্বর রাখতে হবে। এটি সহজভাবে বলা হয়:

JSR CHKOUT

ওএস বন্ধ রুটিন
OS ক্লোজ রুটিনটি $FFC3 এ OS ROM জাম্প টেবিলে জাম্প করে (JSR) অ্যাক্সেস করা হয়। একটি লজিক্যাল ফাইল খোলার পরে এবং বাইটগুলি প্রেরণ করার পরে, লজিক্যাল ফাইলটি বন্ধ করতে হবে। লজিক্যাল ফাইলটি বন্ধ করার ফলে সিস্টেম ইউনিটের বাফারটি অন্য কোনো লজিক্যাল ফাইলের দ্বারা ব্যবহার করার জন্য মুক্ত হয় যা এখনও খোলা হবে। তিনটি ফাইল টেবিলের সংশ্লিষ্ট পরামিতিগুলিও মুছে ফেলা হয়েছে। ফাইল-ওপেন-এর সংখ্যার জন্য RAM অবস্থান 1 দ্বারা হ্রাস করা হয়েছে।

কম্পিউটারের জন্য পাওয়ার চালু হলে, মাদার বোর্ডে মাইক্রোপ্রসেসর এবং অন্যান্য প্রধান চিপগুলির (ইন্টিগ্রেটেড সার্কিট) জন্য হার্ডওয়্যার রিসেট থাকে। এটি মাদারবোর্ডের কিছু চিপগুলিতে কিছু RAM মেমরি অবস্থান এবং কিছু রেজিস্টারের সূচনা দ্বারা অনুসরণ করা হয়। প্রারম্ভিক প্রক্রিয়ায়, অপারেটিং সিস্টেমের সংস্করণের উপর নির্ভর করে, পৃষ্ঠা শূন্যে $0098 ঠিকানার বাইট মেমরি অবস্থান NFILES বা LDTND লেবেলের সাথে দেওয়া হয়। কম্পিউটারটি অপারেটিং করার সময়, 8 বিটের এই এক-বাইটের অবস্থানটি খোলা হয় এমন লজিক্যাল ফাইলের সংখ্যা এবং পরপর তিনটি ফাইল টেবিলের শুরুর ঠিকানা সূচী ধারণ করে। অন্য কথায়, এই বাইটটিতে ফাইল-ওপেনের সংখ্যা রয়েছে যা লজিক্যাল ফাইল বন্ধ করার সময় 1 দ্বারা হ্রাস পায়। লজিক্যাল ফাইল বন্ধ হয়ে গেলে, টার্মিনাল (গন্তব্য) ডিভাইস বা ডিস্কের প্রকৃত ফাইলে অ্যাক্সেস আর সম্ভব হয় না।

একটি লজিক্যাল ফাইল বন্ধ করার জন্য, প্রোগ্রামারকে লজিক্যাল ফাইল নম্বরটি µP অ্যাকুমুলেটরে রাখতে হবে। এটি একই লজিক্যাল ফাইল নম্বর যা ফাইল খোলার জন্য ব্যবহৃত হয়। সেই নির্দিষ্ট ফাইলটি বন্ধ করার জন্য ক্লোজ রুটিনের প্রয়োজন। অন্যান্য ওএস রম রুটিনের মতো, ক্লোজ রুটিন একটি আর্গুমেন্ট নেয় না, যদিও অ্যাকুমুলেটর থেকে যে মানটি ব্যবহার করা হয় তা কিছুটা একটি আর্গুমেন্ট। সমাবেশ ভাষা নির্দেশ লাইন সহজভাবে:

JSR বন্ধ

কাস্টম বা পূর্বনির্ধারিত 6502 সমাবেশ ভাষার সাবরুটিন (রুটিন) আর্গুমেন্ট গ্রহণ করে না। যাইহোক, সাবরুটিন মাইক্রোপ্রসেসর রেজিস্টারে যে মানগুলি ব্যবহার করবে তা রেখে যুক্তিগুলি অনানুষ্ঠানিকভাবে আসে।

CLRCHN রুটিন
OS CLRCHN রুটিনটি $FFCC-এ OS ROM জাম্প টেবিলে জাম্পিং (JSR) দ্বারা অ্যাক্সেস করা হয়। CLRCHN মানে CLeR CHanneL। যখন একটি লজিক্যাল ফাইল বন্ধ করা হয়, তখন এর লজিক্যাল ফাইল নম্বর, ডিভাইস নম্বর এবং সম্ভাব্য গৌণ ঠিকানার প্যারামিটারগুলি মুছে ফেলা হয়। সুতরাং, লজিক্যাল ফাইলের জন্য চ্যানেল সাফ করা হয়েছে।

ম্যানুয়ালটি বলে যে OS CLRCHN রুটিন সমস্ত খোলা চ্যানেলগুলি সাফ করে এবং ডিফল্ট ডিভাইস নম্বর এবং অন্যান্য ডিফল্টগুলি পুনরুদ্ধার করে৷ এর মানে কি পেরিফেরালের জন্য ডিভাইস নম্বর পরিবর্তন করা যেতে পারে? ওয়েল, বেশ না. অপারেটিং সিস্টেম ইনিশিয়ালাইজেশনের সময়, কম্পিউটার অপারেটিং করার সময় বর্তমান ইনপুট ডিভাইস নম্বর ধরে রাখতে DFLTI লেবেলের সাথে $0099 ঠিকানার বাইট অবস্থান দেওয়া হয়। কমোডোর-64 একবারে শুধুমাত্র একটি পেরিফেরাল অ্যাক্সেস করতে পারে। অপারেটিং সিস্টেম ইনিশিয়ালাইজেশনের সময়, কম্পিউটার অপারেটিং করার সময় বর্তমান আউটপুট ডিভাইস নম্বর ধরে রাখতে DFLTO লেবেলের সাথে $009A ঠিকানার বাইট অবস্থান দেওয়া হয়।

যখন CLRCHN সাবরুটিন কল করা হয়, তখন এটি DFLTI ভেরিয়েবলকে 0 ($00) এ সেট করে যা ডিফল্ট ইনপুট ডিভাইস নম্বর (কীবোর্ড)। এটি DFLTO ভেরিয়েবলকে 3 ($03) এ সেট করে যা ডিফল্ট আউটপুট ডিভাইস নম্বর (স্ক্রিন)। অন্যান্য ডিভাইস নম্বর ভেরিয়েবল একইভাবে রিসেট করা হয়। এটি ইনপুট/আউটপুট ডিভাইসগুলিকে স্বাভাবিক (ডিফল্ট মান) রিসেট (বা পুনরুদ্ধার) করার অর্থ।

কমোডোর-64 ম্যানুয়াল বলে যে CLRCHN রুটিন কল করার পরে, খোলা লজিক্যাল ফাইলগুলি খোলা থাকে এবং এখনও বাইট (ডেটা) প্রেরণ করতে পারে। এর মানে হল যে CLRCHN রুটিন ফাইল টেবিলের সংশ্লিষ্ট এন্ট্রিগুলি মুছে দেয় না। CLRCHN নামটি এর অর্থের জন্য বরং অস্পষ্ট।

5.6 স্ক্রীনে অক্ষর পাঠানো

পর্দায় অক্ষর এবং গ্রাফিক্স প্রদর্শন পরিচালনা করার জন্য প্রধান সমন্বিত সার্কিট (IC) কে ভিডিও ইন্টারফেস কন্ট্রোলার (চিপ) বলা হয় যা কমডোর-64 (আসলে VIC সংস্করণ 2-এর জন্য VIC II) এ সংক্ষেপে VIC নামে পরিচিত। একটি তথ্য (মান) স্ক্রিনে যাওয়ার জন্য, স্ক্রিনে পৌঁছানোর আগে এটিকে VIC II এর মধ্য দিয়ে যেতে হবে।

পর্দায় 25টি সারি এবং 40টি কলাম অক্ষর কোষ রয়েছে। এটি 40 x 25 = 1000 অক্ষর তৈরি করে যা স্ক্রিনে প্রদর্শিত হতে পারে। VIC II অক্ষরগুলির জন্য অনুরূপভাবে 1000 মেমরি RAM পরপর বাইট অবস্থানগুলি পড়ে। এই 1000টি অবস্থান একসাথে স্ক্রিন মেমরি হিসাবে পরিচিত। এই 1000টি অবস্থানে যা যায় তা হল অক্ষর কোড। কমডোর-64-এর জন্য, অক্ষর কোডগুলি ASCII কোড থেকে আলাদা।

একটি অক্ষর কোড একটি অক্ষর প্যাটার্ন নয়. অক্ষর রম নামে পরিচিত যা আছে. অক্ষর রম সব ধরণের অক্ষর প্যাটার্ন নিয়ে গঠিত, যার মধ্যে কিছু কীবোর্ডের অক্ষরের প্যাটার্নের সাথে মিলে যায়। রম চরিত্রটি স্ক্রিন মেমরি থেকে আলাদা। যখন একটি অক্ষর পর্দায় প্রদর্শন করা হয়, তখন অক্ষর কোডটি স্ক্রীন মেমরির 1000টি অবস্থানের মধ্যে একটি অবস্থানে পাঠানো হয়। সেখান থেকে, স্ক্রিনে প্রদর্শিত রম অক্ষর থেকে সংশ্লিষ্ট প্যাটার্নটি নির্বাচন করা হয়। একটি অক্ষর কোড থেকে অক্ষর ROM-এ সঠিক প্যাটার্ন নির্বাচন করা VIC II (হার্ডওয়্যার) দ্বারা সম্পন্ন হয়।

$D000 এবং $DFFF-এর মধ্যে অনেক মেমরি অবস্থানের দুটি উদ্দেশ্য রয়েছে: এগুলি স্ক্রীন ব্যতীত অন্য ইনপুট/আউটপুট ক্রিয়াকলাপ পরিচালনা করতে ব্যবহৃত হয় বা পর্দার জন্য অক্ষর রম হিসাবে ব্যবহৃত হয়। মেমরির দুটি ব্লক উদ্বিগ্ন। একটি হল RAM এবং অন্যটি হল ROM চরিত্রের জন্য ROM। ইনপুট/আউটপুট বা ক্যারেক্টার প্যাটার্ন (অক্ষর রম) পরিচালনা করার জন্য ব্যাঙ্কের অদলবদল সফ্টওয়্যার দ্বারা করা হয় ($F000 থেকে $FFFF থেকে ROM-এ OS-এর রুটিন)।

বিঃদ্রঃ : 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 নেই কারণ স্ক্রিনের কোনো নাম প্রয়োজন নেই
;
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; আউটপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKOUT
;
; স্ক্রীনে চার আউটপুট করুন
LDA #$05
JSR CHROUT
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ

অন্য প্রোগ্রাম চালানোর আগে খোলার বন্ধ করা উচিত. অনুমান করুন যে কম্পিউটার ব্যবহারকারী যখন প্রত্যাশিত তখন কীবোর্ডে একটি অক্ষর টাইপ করে। নিম্নলিখিত প্রোগ্রামটি কীবোর্ড থেকে পর্দায় একটি অক্ষর মুদ্রণ করে:

; চ্যানেল সেটআপ করুন
LDA #$40; লজিক্যাল ফাইল নম্বর
LDX #$03 ; স্ক্রিনের জন্য ডিভাইস নম্বর হল $03
LDY #$FF ; মাধ্যমিক ঠিকানা নেই
JSR SETLFS ; সঠিক চ্যানেল সেটআপ করুন
; SETNAM নেই কারণ স্ক্রিনের কোনো নাম প্রয়োজন নেই
;
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; আউটপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKOUT
;
; কীবোর্ড থেকে অক্ষর ইনপুট করুন
জেএসআর পেতে অপেক্ষা করুন; কীবোর্ড সারি খালি থাকলে A-তে $00 রাখে
CMP #$00 ; যদি $00 A-তে যায়, তাহলে Z হল 1 তুলনা করে
BEQ অপেক্ষা করুন; যদি 0 অ্যাকুমুলেটরে যায় তাহলে আবার কিউ থেকে GETIN করুন
BNE PRNSCRN; Z 0 হলে PRNSCRN এ যান, কারণ A এর আর $00 নেই
; স্ক্রীনে চার আউটপুট করুন
PRNSCRN JSR CHROUT; স্ক্রীনে A-তে অক্ষরটি পাঠান
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ

বিঃদ্রঃ : WAIT এবং PRNSCRN হল লেবেল যা ঠিকানা চিহ্নিত করে। কীবোর্ড থেকে বাইট যা µP সঞ্চয়কারীতে আসে সেটি একটি ASCII কোড। কমডোর-64 দ্বারা স্ক্রিনে পাঠানো সংশ্লিষ্ট কোডটি ভিন্ন হতে হবে। সরলতার স্বার্থে আগের প্রোগ্রামে তা বিবেচনায় নেওয়া হয়নি।

5.7 ডিস্ক ড্রাইভের জন্য বাইট পাঠানো এবং গ্রহণ করা

কমোডোর-64-এর সিস্টেম ইউনিটে (মাদারবোর্ড) দুটি কমপ্লেক্স ইন্টারফেস অ্যাডাপ্টার রয়েছে যাকে VIA #1 এবং CIA #2 বলা হয়। প্রতিটি সিআইএ-তে দুটি সমান্তরাল বন্দর রয়েছে যেগুলিকে পোর্ট এ এবং পোর্ট বি বলা হয়। কমোড্র-64 সিস্টেম ইউনিটের পিছনে উল্লম্ব পৃষ্ঠে একটি বহিরাগত পোর্ট রয়েছে যাকে সিরিয়াল পোর্ট বলা হয়। এই পোর্টে 6টি পিন রয়েছে, যার মধ্যে একটি ডেটার জন্য। ডেটা এক সময়ে এক বিট সিরিজে সিস্টেম ইউনিটে প্রবেশ করে বা ছেড়ে যায়।

সিআইএ #2 এর অভ্যন্তরীণ পোর্ট A থেকে আটটি সমান্তরাল বিট, উদাহরণস্বরূপ, সিআইএ-তে একটি শিফট রেজিস্টার দ্বারা সিরিয়াল ডেটাতে রূপান্তরিত হওয়ার পরে বহিরাগত সিরিয়াল পোর্টের মাধ্যমে সিস্টেম ইউনিটের বাইরে যেতে পারে। বাহ্যিক সিরিয়াল পোর্ট থেকে আট-বিট সিরিয়াল ডেটা সিআইএ #2 এর অভ্যন্তরীণ পোর্ট A-তে যেতে পারে সিআইএ-তে একটি শিফট রেজিস্টার দ্বারা সমান্তরাল ডেটাতে রূপান্তরিত হওয়ার পরে।

কমডোর-64 সিস্টেম ইউনিট (বেস ইউনিট) একটি ডিস্কেট সহ একটি বাহ্যিক ডিস্ক ড্রাইভ ব্যবহার করে। একটি প্রিন্টার ডেইজি চেইন ফ্যাশনে এই ডিস্ক ড্রাইভের সাথে সংযুক্ত করা যেতে পারে (স্ট্রিং হিসাবে সিরিজে ডিভাইসগুলি সংযুক্ত করা)। ডিস্ক ড্রাইভের জন্য ডেটা কেবলটি কমোডোর -64 সিস্টেম ইউনিটের বহিরাগত সিরিয়াল পোর্টের সাথে সংযুক্ত। এর মানে হল যে একটি ডেইজি-চেইনড প্রিন্টারও একই সিরিয়াল পোর্টের সাথে সংযুক্ত। এই দুটি ডিভাইস দুটি ভিন্ন ডিভাইস নম্বর দ্বারা চিহ্নিত করা হয় (সাধারণত 8 এবং 4, যথাক্রমে)।

ডিস্ক ড্রাইভের জন্য ডেটা প্রেরণ বা গ্রহণ পূর্বে বর্ণিত একই পদ্ধতি অনুসরণ করে। এটাই:

  • SETNAM রুটিন ব্যবহার করে প্রকৃত ডিস্ক ফাইলের মতোই লজিক্যাল ফাইলের (সংখ্যা) নাম সেট করা হচ্ছে।
  • OPEN রুটিন ব্যবহার করে লজিক্যাল ফাইল খোলা।
  • এটি CHKOUT বা CHKIN রুটিন ব্যবহার করে ইনপুট বা আউটপুট কিনা তা নির্ধারণ করা।
  • STA এবং/অথবা LDA নির্দেশনা ব্যবহার করে ডেটা পাঠানো বা গ্রহণ করা।
  • CLOSE রুটিন ব্যবহার করে লজিক্যাল ফাইল বন্ধ করা।

লজিক্যাল ফাইল বন্ধ করা আবশ্যক. লজিক্যাল ফাইলটি বন্ধ করা কার্যকরভাবে সেই নির্দিষ্ট চ্যানেলটি বন্ধ করে দেয়। ডিস্ক ড্রাইভের জন্য চ্যানেল সেট আপ করার সময়, লজিক্যাল ফাইল নম্বর প্রোগ্রামার দ্বারা নির্ধারিত হয়। এটি $00 এবং $FF (অন্তর্ভুক্ত) এর মধ্যে একটি সংখ্যা। এটি এমন একটি সংখ্যা হওয়া উচিত নয় যা ইতিমধ্যে অন্য কোনো ডিভাইসের (বা প্রকৃত ফাইল) জন্য বেছে নেওয়া হয়েছে। শুধুমাত্র একটি ডিস্ক ড্রাইভ থাকলে ডিভাইস নম্বর 8। মাধ্যমিক ঠিকানা (সংখ্যা) ডিস্ক ড্রাইভের ম্যানুয়াল থেকে প্রাপ্ত করা হয়। নিম্নলিখিত প্রোগ্রামটি 2 ব্যবহার করে। প্রোগ্রামটি 'mydoc.doc' নামক ডিস্কের একটি ফাইলে 'E' (ASCII) অক্ষরটি লেখে। এই নামটি $C101 এর মেমরি ঠিকানা থেকে শুরু হবে বলে ধরে নেওয়া হয়। সুতরাং, SETNAM রুটিন কল করার আগে $01-এর নিম্ন বাইটটি X রেজিস্টারে থাকতে হবে এবং $C1-এর উচ্চতর বাইটটি Y রেজিস্টারে থাকতে হবে। SETNAM রুটিন কল করার আগে A রেজিস্টারে $09 নম্বর থাকতে হবে।

; চ্যানেল সেটআপ করুন
LDA #$40; লজিক্যাল ফাইল নম্বর
LDX #$08; প্রথম ডিস্ক ড্রাইভের জন্য ডিভাইস নম্বর
LDY #$02 ; মাধ্যমিক ঠিকানা
JSR SETLFS ; সঠিক চ্যানেল সেটআপ করুন
;
; ডিস্ক ড্রাইভে ফাইলের একটি নাম প্রয়োজন (ইতিমধ্যে মেমরিতে আছে)
LDA #$09
LDX #$01
LDY#$C1
জেএসআর সেটনাম
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; আউটপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKOUT ;লেখার জন্য
;
; আউটপুট চার ডিস্কে
LDA #$45
JSR CHROUT
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ

ডিস্ক থেকে µP Y রেজিস্টারে একটি বাইট পড়ার জন্য, নিম্নলিখিত পরিবর্তনগুলি সহ পূর্ববর্তী প্রোগ্রামটি পুনরাবৃত্তি করুন: 'JSR CHKOUT ; লেখার জন্য', 'JSR CHKIN ; পড়ার জন্য'. “এর জন্য কোড সেগমেন্ট প্রতিস্থাপন করুন; আউটপুট চার ডিস্কে” নিম্নলিখিত সহ:

; ডিস্ক থেকে চর ইনপুট করুন
জেএসআর ক্রিস

OS CHRIN রুটিনটি $FFCF-এ OS ROM জাম্প টেবিলে জাম্পিং (JSR) দ্বারা অ্যাক্সেস করা হয়। এই রুটিনটি, যখন বলা হয়, একটি চ্যানেল থেকে একটি বাইট পায় যা ইতিমধ্যে একটি ইনপুট চ্যানেল হিসাবে সেট আপ করা হয়েছে এবং এটিকে µP A রেজিস্টারে রাখে৷ CHRIN এর জায়গায় GETIN ROM OS রুটিনও ব্যবহার করা যেতে পারে।

প্রিন্টারে একটি বাইট পাঠানো হচ্ছে
প্রিন্টারে একটি বাইট পাঠানো ডিস্কের একটি ফাইলে একটি বাইট পাঠানোর অনুরূপভাবে সম্পন্ন হয়।

5.8 OS সেভ রুটিন

OS SAVE রুটিনটি $FFD8 এ OS ROM জাম্প টেবিলে জাম্প করে (JSR) অ্যাক্সেস করা হয়। ROM-এ OS SAVE রুটিন মেমরির একটি অংশকে ফাইল হিসেবে (একটি নাম সহ) ডিস্কে সংরক্ষণ করে (ডাম্প করে)। মেমরিতে অংশের শুরুর ঠিকানা জানতে হবে। বিভাগের শেষ ঠিকানাও জানতে হবে। স্টার্ট অ্যাড্রেসের নিচের বাইটটি $002B অ্যাড্রেসে র‍্যামের পৃষ্ঠা জিরোতে স্থাপন করা হয়। শুরুর ঠিকানার উচ্চতর বাইট পরবর্তী বাইট মেমরি অবস্থানে $002C ঠিকানায় স্থাপন করা হয়। পৃষ্ঠা শূন্যে, TXTTAB লেবেল এই দুটি ঠিকানাকে বোঝায়, যদিও TXTTAB আসলে $002B ঠিকানাকে বোঝায়। শেষ ঠিকানার নীচের বাইটটি µP X রেজিস্টারে স্থাপন করা হয়েছে। শেষ ঠিকানা প্লাস 1 এর উচ্চতর বাইট µP Y রেজিস্টারে স্থাপন করা হয়। µP A রেজিস্টার TXTTAB ($002B) এর জন্য $2B এর মূল্য নেয়। এর সাথে, সেভ রুটিনটি নিম্নলিখিতগুলির সাথে কল করা যেতে পারে:

JSR সেভ

সংরক্ষিত মেমরির বিভাগটি একটি সমাবেশ ভাষা প্রোগ্রাম বা একটি নথি হতে পারে। একটি নথির উদাহরণ একটি চিঠি বা একটি প্রবন্ধ হতে পারে। সংরক্ষণ রুটিন ব্যবহার করতে, নিম্নলিখিত পদ্ধতি অনুসরণ করা উচিত:

  • SETLFS রুটিন ব্যবহার করে চ্যানেল সেট আপ করুন।
  • লজিক্যাল ফাইলের নাম (সংখ্যা) সেট করুন যা SETNAM রুটিন ব্যবহার করে প্রকৃত ডিস্ক ফাইলের মতো।
  • OPEN রুটিন ব্যবহার করে লজিক্যাল ফাইল খুলুন।
  • এটিকে CHKOUT ব্যবহার করে আউটপুটের জন্য ফাইল তৈরি করুন।
  • ফাইল সংরক্ষণের কোড এখানে যায় যা 'JSR SAVE' দিয়ে শেষ হয়।
  • CLOSE রুটিন ব্যবহার করে লজিক্যাল ফাইলটি বন্ধ করুন।

নিম্নলিখিত প্রোগ্রামটি একটি ফাইল সংরক্ষণ করে যা $C101 থেকে $C200 এর মেমরি অবস্থান থেকে শুরু হয়:

; চ্যানেল সেটআপ করুন
LDA #$40; লজিক্যাল ফাইল নম্বর
LDX #$08; প্রথম ডিস্ক ড্রাইভের জন্য ডিভাইস নম্বর
LDY #$02 ; মাধ্যমিক ঠিকানা
JSR SETLFS ; সঠিক চ্যানেল সেটআপ করুন
;
; ডিস্ক ড্রাইভে ফাইলের নাম (ইতিমধ্যেই মেমরিতে $C301)
LDA #$09; ফাইল নামের দৈর্ঘ্য
LDX #$01
LDY#$C3
জেএসআর সেটনাম
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; আউটপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKOUT ; লেখার জন্য
;
; ডিস্কে আউটপুট ফাইল
LDA #$01
STA $2B; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY#$C2
LDA #$2B
JSR সেভ
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ

মনে রাখবেন যে এটি এমন একটি প্রোগ্রাম যা মেমরির অন্য একটি বিভাগ (প্রোগ্রাম বিভাগ নয়) ডিস্কে (কমোডোর-64-এর ডিস্কেট) সংরক্ষণ করে।

5.9 OS লোড রুটিন

OS লোড রুটিনটি $FFD5 এ OS ROM জাম্প টেবিলে জাম্পিং (JSR) দ্বারা অ্যাক্সেস করা হয়। যখন মেমরির একটি বিভাগ (বড় এলাকা) ডিস্কে সংরক্ষিত হয়, তখন এটি একটি শিরোনাম দিয়ে সংরক্ষণ করা হয় যাতে মেমরিতে বিভাগের শুরুর ঠিকানা থাকে। 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) থাকে। মাইক্রোপ্রসেসর স্ট্যাটাস রেজিস্টারের সি পতাকাও সেট করা হয়েছে (তৈরি করা হয়েছে 1)। লোডিং সফল হলে, A রেজিস্টারের শেষ মান গুরুত্বপূর্ণ নয়।

এখন, এই অনলাইন ক্যারিয়ার কোর্সের আগের অধ্যায়ে, অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামের প্রথম নির্দেশ RAM-এর ঠিকানায় যেখানে প্রোগ্রামটি শুরু হয়েছিল। এটা এমন হতে হবে না। এর মানে হল যে একটি প্রোগ্রামের প্রথম নির্দেশটি RAM এ প্রোগ্রামের শুরুতে হতে হবে না। একটি প্রোগ্রামের জন্য শুরু নির্দেশনা RAM-তে ফাইলের মধ্যে যে কোনো জায়গায় হতে পারে। প্রোগ্রামারকে লেবেল করার পরামর্শ দেওয়া হয় যেটি START দিয়ে সমাবেশের ভাষা নির্দেশনা শুরু করে। এর সাথে, প্রোগ্রামটি লোড হওয়ার পরে, এটি নিম্নলিখিত অ্যাসেম্বলি ভাষা নির্দেশের সাথে পুনরায় চালু (সম্পাদিত) হয়:

JSR শুরু

'JSR START' হল অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রাম যা চালানোর জন্য প্রোগ্রাম লোড করে। একটি সমাবেশ ভাষা যা অন্য সমাবেশ ভাষা ফাইল লোড করে এবং লোড করা ফাইলটি চালায় তার নিম্নলিখিত কোড পদ্ধতি রয়েছে:

  • SETLFS রুটিন ব্যবহার করে চ্যানেল সেট করুন।
  • লজিক্যাল ফাইলের নাম (সংখ্যা) সেট করুন যা SETNAM রুটিন ব্যবহার করে প্রকৃত ডিস্ক ফাইলের মতো।
  • OPEN রুটিন ব্যবহার করে লজিক্যাল ফাইল খুলুন।
  • এটি CHKIN ব্যবহার করে ইনপুটের জন্য ফাইল তৈরি করুন।
  • ফাইল লোড করার কোডটি এখানে যায় এবং 'JSR LOAD' দিয়ে শেষ হয়।
  • CLOSE রুটিন ব্যবহার করে লজিক্যাল ফাইলটি বন্ধ করুন।

নিম্নলিখিত প্রোগ্রামটি ডিস্ক থেকে একটি ফাইল লোড করে এবং এটি চালায়:

; চ্যানেল সেটআপ করুন
LDA #$40; লজিক্যাল ফাইল নম্বর
LDX #$08; প্রথম ডিস্ক ড্রাইভের জন্য ডিভাইস নম্বর
LDY #$02 ; মাধ্যমিক ঠিকানা
JSR SETLFS ; সঠিক চ্যানেল সেটআপ করুন
;
; ডিস্ক ড্রাইভে ফাইলের নাম (ইতিমধ্যেই মেমরিতে $C301)
LDA #$09; ফাইল নামের দৈর্ঘ্য
LDX #$01
LDY#$C3
জেএসআর সেটনাম
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; ইনপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKIN ; পড়ার জন্য
;
; ডিস্ক থেকে ইনপুট ফাইল
LDA #$00
JSR লোড
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ
; লোড প্রোগ্রাম শুরু করুন
JSR শুরু

5.10 মডেম এবং RS-232 স্ট্যান্ডার্ড

মডেম হল একটি ডিভাইস (পেরিফেরাল) যা কম্পিউটার থেকে বিটগুলিকে টেলিফোন লাইনের মাধ্যমে প্রেরণ করা সংশ্লিষ্ট বৈদ্যুতিক অডিও সংকেতে রূপান্তর করে। প্রাপ্তির শেষে, একটি প্রাপ্তি কম্পিউটারের আগে একটি মডেম আছে। এই দ্বিতীয় মডেমটি গ্রহনকারী কম্পিউটারের জন্য বৈদ্যুতিক অডিও সংকেতকে বিটে রূপান্তর করে।

একটি মডেমকে একটি বাহ্যিক পোর্টে (কম্পিউটারের উল্লম্ব পৃষ্ঠে) একটি কম্পিউটারের সাথে সংযুক্ত করতে হবে। RS-232 স্ট্যান্ডার্ড একটি নির্দিষ্ট ধরণের সংযোগকারীকে বোঝায় যা একটি মডেমকে কম্পিউটারের সাথে সংযুক্ত করে (অতীতে)। অন্য কথায়, অতীতে অনেক কম্পিউটারের একটি বাহ্যিক পোর্ট ছিল যা একটি RS-232 সংযোগকারী বা একটি RS-232 সামঞ্জস্যপূর্ণ সংযোগকারী ছিল।

কমোডোর-64 সিস্টেম ইউনিট (কম্পিউটার) এর পিছনের উল্লম্ব পৃষ্ঠে একটি বহিরাগত পোর্ট রয়েছে যাকে ব্যবহারকারী পোর্ট বলা হয়। এই ব্যবহারকারী পোর্টটি RS-232 সামঞ্জস্যপূর্ণ। সেখানে একটি মডেম ডিভাইস সংযুক্ত করা যেতে পারে। কমোডোর-64 এই ব্যবহারকারী পোর্টের মাধ্যমে একটি মডেমের সাথে যোগাযোগ করে। কমোডোর-64-এর জন্য রম অপারেটিং সিস্টেমে RS-232 রুটিন নামে একটি মডেমের সাথে যোগাযোগ করার জন্য সাবরুটিন রয়েছে। এই রুটিনগুলি জাম্প টেবিলে এন্ট্রি আছে.

বড হার
কম্পিউটার থেকে আট-বিট বাইট মডেমে পাঠানোর আগে আট বিটের একটি সিরিজে রূপান্তরিত হয়। বিপরীত কাজটি মডেম থেকে কম্পিউটারে করা হয়। বড রেট হল সিরিজে প্রতি সেকেন্ডে প্রেরণ করা বিটের সংখ্যা।

মেমরির নীচে
'মেমরির নীচে' শব্দটি $0000 ঠিকানার মেমরি বাইট অবস্থানকে নির্দেশ করে না। এটি সর্বনিম্ন RAM অবস্থানকে নির্দেশ করে যেখানে ব্যবহারকারী তার ডেটা এবং প্রোগ্রামগুলি রাখা শুরু করতে পারে। ডিফল্টরূপে, এটি $0800। পূর্ববর্তী আলোচনা থেকে স্মরণ করুন যে $0800 এবং $BFFF এর মধ্যে অনেকগুলি অবস্থান বেসিক কম্পিউটার ভাষা এবং এর প্রোগ্রামাররা (ব্যবহারকারী) দ্বারা ব্যবহৃত হয়। কেবলমাত্র $C000 থেকে $CFFF ঠিকানা অবস্থানগুলি সমাবেশ ভাষা প্রোগ্রাম এবং ডেটা ব্যবহারের জন্য বাকি আছে; এটি মেমরির 64 কিবাইটের মধ্যে 4Kbytes।

মেমরি শীর্ষ
সেই দিনগুলিতে, যখন ক্লায়েন্টরা কমোডোর -64 কম্পিউটারগুলি কিনেছিল, কিছু মেমরির অবস্থানের সাথে আসেনি। এই ধরনের কম্পিউটারের অপারেটিং সিস্টেমের সাথে $E000 থেকে $FFFF পর্যন্ত রম ছিল। তাদের RAM $0000 থেকে একটি সীমা পর্যন্ত ছিল, যা $DFFF নয়, $E000 এর পাশে। সীমাটি $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 সঞ্চয়কারীতে রাখে (ফেরত)।

নিম্নলিখিত প্রোগ্রামটি ব্যবহারকারী RS-232 সামঞ্জস্যপূর্ণ পোর্টের সাথে সংযুক্ত মডেমে বাইট 'E' (ASCII) পাঠায়:

; চ্যানেল সেটআপ করুন
LDA #$40; লজিক্যাল ফাইল নম্বর
LDX #$02 ; RS-232 এর জন্য ডিভাইস নম্বর
LDY #$FF ; মাধ্যমিক ঠিকানা নেই
JSR SETLFS ; সঠিক চ্যানেল সেটআপ করুন
;
; RS-232-এর নাম হল একটি কোড যেমন $0610
LDA #$02 ; কোডের দৈর্ঘ্য 2 বাইট
LDX #$10
LDY#$06
জেএসআর সেটনাম
;
; লজিক্যাল ফাইল খুলুন
JSR ওপেন
; আউটপুট জন্য চ্যানেল সেট করুন
LDX #$40 ; লজিক্যাল ফাইল নম্বর
JSR CHKOUT
;
; আউটপুট অক্ষর থেকে RS-232 যেমন মডেম
LDA #$45
JSR CHROUT
; লজিক্যাল ফাইল বন্ধ করুন
LDA #$40
JSR বন্ধ

একটি বাইট পাওয়ার জন্য, কোডটি খুবই অনুরূপ, শুধুমাত্র 'JSR CHKOUT' এর পরিবর্তে 'JSR CHKIN' এবং:

LDA #$45
JSR CHROUT

A রেজিস্টারে ফলাফলের সাথে 'JSR GETIN' দ্বারা প্রতিস্থাপিত হয়।

ক্রমাগত বাইট পাঠানো বা গ্রহণ করা হয় যথাক্রমে কোড সেগমেন্ট পাঠানো বা গ্রহণের জন্য একটি লুপ দ্বারা।

উল্লেখ্য যে কমোডোরের সাথে ইনপুট এবং আউটপুট বেশিরভাগ ক্ষেত্রেই একই রকম হয় কীবোর্ড ছাড়া যেখানে কিছু রুটিন প্রোগ্রামার দ্বারা কল করা হয় না, কিন্তু সেগুলি অপারেটিং সিস্টেম দ্বারা কল করা হয়।

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 #1-এর জন্য, দুটি টাইমারের ঠিকানা হল: TA-এর জন্য DC04 এবং DC05 এবং TB-এর জন্য DC06 এবং DC07৷ CIA #2-এর জন্য, দুটি টাইমারের ঠিকানা হল: TA-এর জন্য DD04 এবং DD05 এবং TB-এর জন্য DD06 এবং DD07৷

অনুমান করুন যে 25510 নম্বরটি গণনা করার জন্য CIA #2 এর TA টাইমারে পাঠানো হবে। 25510 = 00000000111111112 ষোল বিটে আছে। 0000000011111112 = $000FFF হেক্সাডেসিমেলে। এই ক্ষেত্রে, $FF $DD04 ঠিকানায় রেজিস্টারে পাঠানো হয়, এবং $00 $DD05 ঠিকানায় রেজিস্টারে পাঠানো হয় - সামান্য শেষ। নিম্নলিখিত কোড সেগমেন্টটি রেজিস্টারে নম্বর পাঠায়:

LDA #$FF
রাজ্য $DD04
LDA #$00
রাজ্য $DD05

যদিও সিআইএ-র রেজিস্টারগুলিতে র‌্যাম ঠিকানা থাকে, তবে সেগুলি শারীরিকভাবে সিআইএ-তে থাকে এবং সিআইএ হল র‌্যাম বা রম থেকে একটি পৃথক আইসি।

যে সব না! যখন টাইমারকে গণনা করার জন্য একটি নম্বর দেওয়া হয়, যেমন পূর্ববর্তী কোডের সাথে, গণনা শুরু হয় না। টাইমারের জন্য সংশ্লিষ্ট নিয়ন্ত্রণ রেজিস্টারে একটি আট-বিট বাইট পাঠানো হলে গণনা শুরু হয়। কন্ট্রোল রেজিস্টারের জন্য এই বাইটের প্রথম বিটটি নির্দেশ করে যে গণনা শুরু হবে কিনা। এই প্রথম বিটের জন্য 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 ঠিকানা রয়েছে। সিআইএ #2 এর TA-তে ষোল-বিট নম্বর গণনা শুরু করতে, এক-শট মোডে, নিম্নলিখিত কোডটি ব্যবহার করুন:

LDA #$09
STA $DD0E

CIA #2-এর TA-তে ষোল-বিট নম্বর গণনা শুরু করতে, ফ্রি রানিং মোডে, নিম্নলিখিত কোডটি ব্যবহার করুন:

LDA #$01
STA $DD0E

5.12 দ আইআরকিউ এবং এনএমআই অনুরোধ

6502 মাইক্রোপ্রসেসর আছে আইআরকিউ এবং এনএমআই লাইন (পিন)। সিআইএ #1 এবং সিআইএ #2 উভয়ই রয়েছে আইআরকিউ মাইক্রোপ্রসেসরের জন্য পিন। দ্য আইআরকিউ CIA #2 এর পিন এর সাথে সংযুক্ত এনএমআই µP এর পিন। দ্য আইআরকিউ CIA #1 এর পিন এর সাথে সংযুক্ত আইআরকিউ µP এর পিন। এগুলিই মাইক্রোপ্রসেসরকে সংযুক্ত করে এমন দুটি বিঘ্নিত লাইন। তাহলে আইআরকিউ সিআইএ এর পিন #2 হল এনএমআই উত্স এবং ¯NMI লাইন হিসাবেও দেখা যেতে পারে।

সিআইএ #1-এর পাঁচটি সম্ভাব্য তাৎক্ষণিক উৎস রয়েছে আইআরকিউ µP এর জন্য সংকেত। সিআইএ #2 গঠনে সিআইএ #1 এর মতোই। সুতরাং, CIA #2-এর কাছে এইবার ইন্টারাপ্ট সিগন্যাল তৈরি করার জন্য একই পাঁচটি সম্ভাব্য তাৎক্ষণিক উত্স রয়েছে যা হল এনএমআই সংকেত মনে রাখবেন যে যখন µP পায় এনএমআই সংকেত, যদি এটি পরিচালনা করা হয় আইআরকিউ অনুরোধ, এটি স্থগিত করে এবং পরিচালনা করে এনএমআই অনুরোধ এটি হ্যান্ডলিং শেষ হলে এনএমআই অনুরোধ, এটি তারপর হ্যান্ডলিং পুনরায় শুরু আইআরকিউ অনুরোধ

CIA #1 সাধারণত কীবোর্ড এবং একটি গেম ডিভাইস যেমন একটি জয়স্টিকের সাথে বাহ্যিকভাবে সংযুক্ত থাকে। কীবোর্ড পোর্ট B এর চেয়ে CIA #1 এর A পোর্ট বেশি ব্যবহার করে। গেম ডিভাইসটি তার পোর্ট A এর চেয়ে CIA #1 পোর্ট B এর বেশি ব্যবহার করে। CIA #2 সাধারণত ডিস্ক ড্রাইভের সাথে বাহ্যিকভাবে সংযুক্ত থাকে (প্রিন্টারের সাথে ডেইজি চেইন করা) এবং মডেম। ডিস্ক ড্রাইভ CIA #2 এর পোর্ট A এর বেশি ব্যবহার করে (যদিও বাহ্যিক সিরিয়াল পোর্টের মাধ্যমে) তার পোর্ট B এর চেয়ে মডেম (RS-232) CIA #2 পোর্ট B এর পোর্ট A এর চেয়ে বেশি ব্যবহার করে।

যে সব সঙ্গে, কিভাবে সিস্টেম ইউনিট জানেন কি কারণ আইআরকিউ বা এনএমআই বাধা? সিআইএ #1 এবং সিআইএ #2-এর পাঁচটি তাৎক্ষণিকভাবে বাধার উৎস রয়েছে। যদি µP-তে বাধা সংকেত হয় এনএমআই , উৎসটি সিআইএ #2 এর তাৎক্ষণিক পাঁচটি উৎসের মধ্যে একটি। যদি µP-তে বাধা সংকেত হয় আইআরকিউ , উৎসটি সিআইএ #1 এর তাৎক্ষণিক পাঁচটি উৎসের মধ্যে একটি।

পরবর্তী প্রশ্ন হল, 'প্রত্যেক সিআইএর পাঁচটি তাৎক্ষণিক উৎসের মধ্যে সিস্টেম ইউনিট কীভাবে পার্থক্য করে?' প্রতিটি সিআইএর একটি আট-বিট রেজিস্টার থাকে যাকে বলা হয় ইন্টারাপ্ট কন্ট্রোল রেজিস্টার (ICR)। আইসিআর সিআইএ-র উভয় বন্দরে কাজ করে। নিম্নলিখিত টেবিলটি বিট 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। µP সঞ্চয়কারীতে CIA #1 এর ICR-এর বিষয়বস্তু পড়তে (ফিরতে) নিম্নলিখিত নির্দেশনা টাইপ করুন:

LDA$DC0D

µP সঞ্চয়কারীতে CIA #2 এর ICR-এর বিষয়বস্তু পড়তে (ফিরতে) নিম্নলিখিত নির্দেশনা টাইপ করুন:

LDA $DD0D

5.13 ইন্টারাপ্ট চালিত পটভূমি প্রোগ্রাম

কীবোর্ড সাধারণত প্রতি সেকেন্ডে 1/60 মাইক্রোপ্রসেসরকে বাধা দেয়। কল্পনা করুন যে একটি প্রোগ্রাম চলছে এবং এটি নীচের কোড বিভাগগুলির সাথে চালিয়ে যাওয়ার আগে কীবোর্ড থেকে একটি কীর জন্য অপেক্ষা করার অবস্থানে পৌঁছেছে। অনুমান করুন যে কীবোর্ড থেকে কোন কী চাপা না হয়, প্রোগ্রামটি শুধুমাত্র একটি ছোট লুপ করে, একটি কীর জন্য অপেক্ষা করে। কল্পনা করুন যে প্রোগ্রামটি চলছে এবং কীবোর্ড বিঘ্নিত হওয়ার ঠিক পরেই কীবোর্ড থেকে একটি কী আশা করা হচ্ছে। সেই মুহুর্তে, পুরো কম্পিউটারটি পরোক্ষভাবে থামে এবং অপেক্ষা-লুপ লুপিং ছাড়া আর কিছুই করছে না। কল্পনা করুন যে পরবর্তী কীবোর্ড বাধার পরবর্তী সংখ্যার ঠিক আগে একটি কীবোর্ড কী চাপা হয়। এর মানে কম্পিউটার এক সেকেন্ডের প্রায় ষাট ভাগ কিছুই করেনি! কমোডোর-64-এর দিনেও কম্পিউটারের কিছু করার জন্য এটি দীর্ঘ সময়। কম্পিউটার সেই সময় (সময়কাল) অন্য কিছু করতে পারে। একটি প্রোগ্রামে এরকম অনেক সময়কাল থাকে।

একটি দ্বিতীয় প্রোগ্রাম এই ধরনের 'অলস' সময়কাল কাজ করার জন্য লেখা যেতে পারে। এই ধরনের একটি প্রোগ্রাম প্রধান (বা প্রথম) প্রোগ্রামের পটভূমিতে অপারেটিং বলা হয়। এটি করার একটি সহজ উপায় হ'ল কীবোর্ড থেকে একটি কী প্রত্যাশিত হলে শুধুমাত্র একটি পরিবর্তিত BRK বাধা হ্যান্ডলিংয়ে জোর করা।

BRK নির্দেশের জন্য নির্দেশক
RAM এ $0316 এবং $0317 ঠিকানাগুলির পরপর অবস্থানগুলি হল প্রকৃত BRK নির্দেশনা রুটিনের জন্য পয়েন্টার (ভেক্টর)৷ রমে অপারেটিং সিস্টেম দ্বারা কম্পিউটার চালু হলে ডিফল্ট পয়েন্টারটি সেখানে রাখা হয়। এই ডিফল্ট পয়েন্টারটি একটি ঠিকানা যা এখনও OS ROM-এ ডিফল্ট BRK নির্দেশনা হ্যান্ডলারকে নির্দেশ করে। পয়েন্টার একটি 16-বিট ঠিকানা। পয়েন্টারের নীচের বাইটটি $0306 ঠিকানার বাইট অবস্থানে স্থাপন করা হয় এবং পয়েন্টারের উচ্চতর বাইটটি $0317 বাইট অবস্থানে স্থাপন করা হয়।

একটি দ্বিতীয় প্রোগ্রাম এমনভাবে লেখা যেতে পারে যে যখন সিস্টেমটি 'নিষ্ক্রিয়' থাকে, তখন দ্বিতীয় প্রোগ্রামের কিছু কোড সিস্টেম দ্বারা কার্যকর করা হয়। এর মানে হল যে দ্বিতীয় প্রোগ্রামটিকে সাবরুটিন দিয়ে তৈরি করতে হবে। যখন সিস্টেমটি 'নিষ্ক্রিয়' হয় যা কীবোর্ড থেকে একটি কীর জন্য অপেক্ষা করছে, দ্বিতীয় প্রোগ্রামের জন্য একটি পরবর্তী সাবরুটিন কার্যকর করা হয়। সিস্টেম ইউনিটের অপারেশনের তুলনায় কম্পিউটারের সাথে মানুষের মিথস্ক্রিয়া ধীর।

এই সমস্যাটি সমাধান করা সহজ: প্রতিবার কম্পিউটারকে কীবোর্ড থেকে একটি কী পাওয়ার জন্য অপেক্ষা করতে হয়, কোডে একটি BRK নির্দেশ সন্নিবেশ করান এবং $0316 (এবং $0317) পয়েন্টারটি দ্বিতীয়টির পরবর্তী সাবরুটিনের পয়েন্টার দিয়ে প্রতিস্থাপন করুন ( কাস্টম) প্রোগ্রাম। এইভাবে, উভয় প্রোগ্রামই এমন একটি মেয়াদে চলবে যা একা চলমান প্রধান প্রোগ্রামের চেয়ে বেশি নয়।

5.14 সমাবেশ এবং সংকলন

অ্যাসেম্বলার সমস্ত লেবেলকে ঠিকানা দিয়ে প্রতিস্থাপন করে। একটি সমাবেশ ভাষা প্রোগ্রাম সাধারণত একটি নির্দিষ্ট ঠিকানায় শুরু করার জন্য লেখা হয়। অ্যাসেম্বলার থেকে প্রাপ্ত ফলাফলকে (একত্রিত করার পরে) বাইনারি সবকিছুর সাথে 'অবজেক্ট কোড' বলা হয়। সেই ফলাফলটি এক্সিকিউটেবল ফাইল যদি ফাইলটি একটি প্রোগ্রাম এবং একটি নথি নয়। একটি নথি কার্যকর করা যায় না।

একটি অ্যাপ্লিকেশন একাধিক (সমাবেশের ভাষা) প্রোগ্রাম নিয়ে গঠিত। সাধারণত একটি প্রধান প্রোগ্রাম আছে। ইন্টারাপ্ট ড্রাইভেন ব্যাকগ্রাউন্ড প্রোগ্রামের পরিস্থিতির সাথে এখানে পরিস্থিতি বিভ্রান্ত করা উচিত নয়। এখানে সমস্ত প্রোগ্রামই ফোরগ্রাউন্ড প্রোগ্রাম, তবে একটি প্রথম বা প্রধান প্রোগ্রাম রয়েছে।

একাধিক ফোরগ্রাউন্ড প্রোগ্রাম থাকলে অ্যাসেম্বলারের পরিবর্তে একটি কম্পাইলার প্রয়োজন। কম্পাইলার প্রতিটি প্রোগ্রামকে একটি অবজেক্ট কোডে একত্রিত করে। যাইহোক, একটি সমস্যা হবে: কিছু কোড সেগমেন্ট ওভারল্যাপ হবে কারণ প্রোগ্রামগুলি সম্ভবত বিভিন্ন লোকের দ্বারা লেখা। কম্পাইলার দ্বারা সমাধান হল মেমরি স্পেসের প্রথমটি ছাড়া সমস্ত ওভারল্যাপিং প্রোগ্রামগুলিকে স্থানান্তর করা, যাতে প্রোগ্রামগুলি ওভারল্যাপ না হয়। এখন, যখন ভেরিয়েবল সংরক্ষণের কথা আসে, কিছু পরিবর্তনশীল ঠিকানা এখনও ওভারল্যাপ হবে। এখানে সমাধান হল ওভারল্যাপ করা ঠিকানাগুলিকে নতুন ঠিকানা দিয়ে প্রতিস্থাপন করা (প্রথম প্রোগ্রাম ব্যতীত) যাতে সেগুলি আর ওভারল্যাপ না হয়। এইভাবে, বিভিন্ন প্রোগ্রাম মেমরির বিভিন্ন অংশে (ক্ষেত্রে) ফিট হবে।

এই সমস্ত কিছুর সাথে, একটি প্রোগ্রামের একটি রুটিনের পক্ষে অন্য প্রোগ্রামে একটি রুটিন কল করা সম্ভব। সুতরাং, কম্পাইলার লিঙ্কিং করে. লিঙ্কিং বলতে একটি প্রোগ্রামে একটি সাবরুটিনের স্টার্ট অ্যাড্রেস থাকা এবং তারপর অন্য প্রোগ্রামে কল করা বোঝায়; উভয়ই আবেদনের অংশ। উভয় প্রোগ্রাম এর জন্য একই ঠিকানা ব্যবহার করতে হবে. শেষ ফলাফল বাইনারি (বিট) সবকিছু সহ একটি বড় অবজেক্ট কোড।

5.15 একটি প্রোগ্রাম সংরক্ষণ, লোড করা এবং চালানো

একটি অ্যাসেম্বলি ভাষা সাধারণত কিছু সম্পাদক প্রোগ্রামে লেখা হয় (যা অ্যাসেম্বলার প্রোগ্রামের সাথে সরবরাহ করা যেতে পারে)। সম্পাদক প্রোগ্রামটি নির্দেশ করে যেখানে প্রোগ্রামটি মেমরিতে (RAM) শুরু হয় এবং শেষ হয়। Commodore-64-এর OS ROM-এর Kernal SAVE রুটিন মেমরিতে একটি প্রোগ্রামকে ডিস্কে সংরক্ষণ করতে পারে। এটি কেবল মেমরির বিভাগ (ব্লক) ডাম্প করে যা ডিস্কে এর নির্দেশ কল থাকতে পারে। সংরক্ষিত হওয়া প্রোগ্রাম থেকে আলাদা করে সংরক্ষণ করার জন্য কলিং নির্দেশনা থাকা বাঞ্ছনীয়, যাতে প্রোগ্রামটি যখন ডিস্ক থেকে মেমরিতে লোড হয়, এটি চালানোর সময় এটি আবার নিজেকে সংরক্ষণ করতে না পারে। ডিস্ক থেকে একটি সমাবেশ ভাষা প্রোগ্রাম লোড করা একটি ভিন্ন ধরনের চ্যালেঞ্জ কারণ একটি প্রোগ্রাম নিজেই লোড করতে পারে না।

একটি প্রোগ্রাম ডিস্ক থেকে র‍্যামে যেখানে শুরু এবং শেষ হয় সেখানে লোড করতে পারে না। তখনকার দিনে কমোডোর-64-কে সাধারণত বেসিক ভাষা প্রোগ্রাম চালানোর জন্য একটি বেসিক দোভাষী সরবরাহ করা হত। যখন মেশিন (কম্পিউটার) চালিত হয়, এটি কমান্ড প্রম্পটের সাথে স্থির হয়: প্রস্তুত। সেখান থেকে, বেসিক কমান্ড বা নির্দেশাবলী টাইপ করার পরে 'এন্টার' কী টিপে টাইপ করা যেতে পারে। একটি ফাইল লোড করার জন্য বেসিক কমান্ড (নির্দেশ) হল:

'ফাইলের নাম', 8,1 লোড করুন

কমান্ডটি বেসিক সংরক্ষিত শব্দ দিয়ে শুরু হয় যা LOAD। এটির পরে একটি স্পেস এবং তারপরে ফাইল-নামটি ডবল কোটে রয়েছে। 8 এর ডিভাইস নম্বর অনুসরণ করা হয়েছে যার আগে একটি কমা আছে। ডিস্কের সেকেন্ডারি অ্যাড্রেস যা 1 হয়, তার আগে কমা থাকে। এই ধরনের একটি ফাইলের সাথে, সমাবেশ ভাষা প্রোগ্রামের শুরুর ঠিকানাটি ডিস্কের ফাইলের শিরোনামে থাকে। যখন বেসিক প্রোগ্রামটি লোড করা শেষ করে, প্রোগ্রামটির শেষ RAM ঠিকানা প্লাস 1 ফেরত দেওয়া হয়। এখানে 'রিটার্নড' শব্দের অর্থ হল শেষ ঠিকানা প্লাস 1 এর নিম্ন বাইটটি µP X রেজিস্টারে রাখা হয়েছে এবং শেষ ঠিকানা প্লাস 1 এর উচ্চতর বাইটটি µP Y রেজিস্টারে রাখা হয়েছে।

প্রোগ্রামটি লোড করার পরে, এটি চালাতে হবে (নির্বাহিত)। প্রোগ্রামের ব্যবহারকারীকে মেমরিতে কার্যকর করার জন্য শুরুর ঠিকানা জানতে হবে। আবার, আরেকটি বেসিক প্রোগ্রাম এখানে প্রয়োজনীয়। এটি SYS কমান্ড। SYS কমান্ড কার্যকর করার পরে, সমাবেশ ভাষা প্রোগ্রাম চলবে (এবং থামবে)। চলমান অবস্থায়, কীবোর্ড থেকে কোনো ইনপুট প্রয়োজন হলে, সমাবেশ ভাষা প্রোগ্রাম ব্যবহারকারীকে তা নির্দেশ করবে। ব্যবহারকারী কীবোর্ডে ডেটা টাইপ করার পরে এবং 'এন্টার' কী টিপে, অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামটি বেসিক ইন্টারপ্রেটারের হস্তক্ষেপ ছাড়াই কীবোর্ড এন্ট্রি ব্যবহার করে চলতে থাকবে।

ধরে নিলাম যে অ্যাসেম্বলি ল্যাঙ্গুয়েজ প্রোগ্রামের জন্য এক্সিকিউশন (চলমান) RAM অ্যাড্রেস C12316, C123 SYS কমান্ড ব্যবহার করার আগে বেস টেনে রূপান্তরিত হয়। C12316 কে ভিত্তি দশে রূপান্তর করা হল নিম্নরূপ:

সুতরাং, বেসিক SYS কমান্ড হল:

এসওয়াইএস 49443

5.16 কমোডোর-64 এর জন্য বুটিং

কমোডোর-64-এর বুটিং দুটি পর্যায় নিয়ে গঠিত: হার্ডওয়্যার রিসেট ফেজ এবং অপারেটিং সিস্টেম ইনিশিয়ালাইজেশন ফেজ। অপারেটিং সিস্টেম হল রমের মধ্যে কার্নাল (এবং একটি ডিস্কে নয়)। একটি রিসেট লাইন আছে (আসলে RES ) যেটি 6502 µP-এ একটি পিনের সাথে এবং CIA 1, CIA 2, এবং VIC II-এর মতো সমস্ত বিশেষ জাহাজে একই পিনের নামের সাথে সংযোগ করে। রিসেট পর্বে, এই লাইনের কারণে, µP এবং বিশেষ চিপগুলিতে সমস্ত রেজিস্টার 0 এ রিসেট করা হয়েছে (প্রতিটি বিটের জন্য শূন্য তৈরি করা হয়েছে)। এর পরে, মাইক্রোপ্রসেসর হার্ডওয়্যার দ্বারা, স্ট্যাক পয়েন্টার এবং প্রসেসর স্ট্যাটাস রেজিস্টার মাইক্রোপ্রসেসরে তাদের প্রাথমিক মান সহ দেওয়া হয়। প্রোগ্রাম কাউন্টার তারপর $FFFC এবং $FFFD অবস্থানে মান (ঠিকানা) সহ দেওয়া হয়। মনে রাখবেন যে প্রোগ্রাম কাউন্টার পরবর্তী নির্দেশের ঠিকানা ধারণ করে। এখানে যে বিষয়বস্তু (ঠিকানা) রাখা হয়েছে সেটি হল সাবরুটিনের জন্য যা সফ্টওয়্যার আরম্ভ করে। এখন পর্যন্ত সবকিছুই মাইক্রোপ্রসেসর হার্ডওয়্যার দ্বারা করা হয়। পুরো স্মৃতি এই পর্যায়ে স্পর্শ করা হয় না. আরম্ভের পরবর্তী পর্যায় শুরু হয়।

রম ওএস-এর কিছু রুটিন দ্বারা প্রাথমিককরণ করা হয়। ইনিশিয়ালাইজেশন মানে বিশেষ চিপগুলিতে কিছু রেজিস্টারে প্রাথমিক বা ডিফল্ট মান দেওয়া। বিশেষ চিপগুলিতে কিছু রেজিস্টারে প্রাথমিক বা ডিফল্ট মান দেওয়ার মাধ্যমে সূচনা শুরু হয়। আইআরকিউ , উদাহরণস্বরূপ, প্রতি সেকেন্ডের 1/60 ইস্যু করা শুরু করতে হবে। সুতরাং, সিআইএ #1 এর সংশ্লিষ্ট টাইমারটিকে তার ডিফল্ট মান সেট করতে হবে।

এর পরে, কার্নাল একটি RAM পরীক্ষা করে। এটি অবস্থানে একটি বাইট পাঠিয়ে এবং এটিকে পড়ার মাধ্যমে প্রতিটি অবস্থান পরীক্ষা করে। পার্থক্য থাকলে অন্তত সেই অবস্থানটা খারাপ। 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 স্ট্যাক। পয়েন্টারগুলিকে ভেরিয়েবল হিসাবে উল্লেখ করা হয় কারণ তাদের নাম (লেবেল) রয়েছে। এই পর্যায়ে, স্ক্রিন মেমরি স্ক্রীনের (মনিটর) জন্য সাফ করা হয়। এর অর্থ হল 1000টি র‍্যাম স্ক্রীন অবস্থানে স্থানের জন্য $20 কোড পাঠানো (যা ASCII $20 এর মতই হয়)। অবশেষে, কার্নাল বেসিক কমান্ড প্রম্পট প্রদর্শন করতে বেসিক ইন্টারপ্রেটার শুরু করে যা মনিটরের (স্ক্রিন) শীর্ষে প্রস্তুত।

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 কম্পিউটারের বুটিং প্রক্রিয়াটি সংক্ষেপে ব্যাখ্যা করুন।