অধ্যায় 4: 6502 মাইক্রোপ্রসেসর অ্যাসেম্বলি ল্যাঙ্গুয়েজ টিউটোরিয়াল

Adhyaya 4 6502 Ma Ikroprasesara A Yasembali Lyanguyeja Ti Utoriyala



অধ্যায় 4: 6502 মাইক্রোপ্রসেসর অ্যাসেম্বলি ল্যাঙ্গুয়েজ টিউটোরিয়াল

4.1 ভূমিকা

6502 মাইক্রোপ্রসেসর 1975 সালে প্রকাশিত হয়েছিল। এটি কিছু ব্যক্তিগত কম্পিউটার যেমন অ্যাপল II, কমোডোর 64 এবং বিবিসি মাইক্রোতে মাইক্রোপ্রসেসর হিসাবে ব্যবহৃত হয়েছিল।







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



যেহেতু এটি বুঝতে এবং প্রোগ্রাম করা সহজ, এটি সমাবেশের ভাষা শেখানোর জন্য ব্যবহার করার জন্য সেরা (যদি সেরা না হয়) মাইক্রোপ্রসেসরগুলির মধ্যে একটি। অ্যাসেম্বলি ভাষা একটি নিম্ন-স্তরের ভাষা যা একটি কম্পিউটার প্রোগ্রাম করতে ব্যবহার করা যেতে পারে। মনে রাখবেন যে একটি মাইক্রোপ্রসেসরের সমাবেশ ভাষা অন্য মাইক্রোপ্রসেসরের সমাবেশ ভাষা থেকে আলাদা। এই অধ্যায়ে 6502 মাইক্রোপ্রসেসর সমাবেশ ভাষা শেখানো হয়. আরও স্পষ্টভাবে, এটি 65C02 যা শেখানো হয়, কিন্তু সহজভাবে 6502 হিসাবে উল্লেখ করা হয়।



অতীতের একটি বিখ্যাত কম্পিউটারকে কমডোর_64 বলা হয়। 6502 হল 6500 পরিবারের একটি মাইক্রোপ্রসেসর। কমডোর_64 কম্পিউটারটি 6510 মাইক্রোপ্রসেসর ব্যবহার করে। 6510 মাইক্রোপ্রসেসর 6500 µP এর। 6502 µP-এর নির্দেশ সেটটি 6510 µP-এর প্রায় সমস্ত নির্দেশাবলী। এই অধ্যায় এবং পরবর্তী জ্ঞান কমডোর_64 কম্পিউটারের উপর ভিত্তি করে। এই জ্ঞান অনলাইন ক্যারিয়ার কোর্সের এই অংশে আধুনিক কম্পিউটার আর্কিটেকচার এবং আধুনিক অপারেটিং সিস্টেম ব্যাখ্যা করার জন্য ভিত্তি হিসাবে ব্যবহৃত হয়।





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

কমডোর_64 কম্পিউটারকে বলা হয় 8-বিট কম্পিউটার শব্দের একটি কম্পিউটার। এর মানে হল যে তথ্য সংরক্ষণ করা হয়, স্থানান্তর করা হয় এবং আট-বিট বাইনারি কোড আকারে ম্যানিপুলেট করা হয়।



কমোডোর 64 মাদারবোর্ডের ব্লক ডায়াগ্রাম
কমোডোর 64 মাদারবোর্ডের ব্লক ডায়াগ্রাম হল:


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

6510 মাইক্রোপ্রসেসরকে 6502 মাইক্রোপ্রসেসর হিসাবে কল্পনা করুন। মোট মেমরি হল বাইটের একটি সিরিজ (প্রতি বাইটে 8-বিট)। র্যান্ডম-অ্যাক্সেস (পড়া/লেখা) মেমরি আছে যেখানে বাইট লেখা বা মুছে ফেলা যায়। কম্পিউটারের পাওয়ার বন্ধ হয়ে গেলে, র্যান্ডম-অ্যাক্সেস মেমরির (RAM) সমস্ত তথ্য মুছে ফেলা হয়। এছাড়াও রয়েছে শুধুমাত্র পঠনযোগ্য মেমরি (ROM)। কম্পিউটারের পাওয়ার বন্ধ হয়ে গেলে, রমের তথ্য থেকে যায় (মোছা হয় না)।

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

ডায়াগ্রামে তিনটি বাস রয়েছে (বৈদ্যুতিক খুব ছোট তারের কন্ডাক্টরের গ্রুপ)। প্রতিটি তার একটি বিট 1 বা বিট 0 স্থানান্তর করতে পারে। ডাটা বাস, র‌্যামে এবং ইনপুট/আউটপুট পোর্টে (ইনপুট/আউটপুট ডিভাইস) এক সময়ে আট-বিট বাইট স্থানান্তরের জন্য দ্বিমুখী। ডেটা বাসটি আট বিট প্রশস্ত।

সমস্ত উপাদান ঠিকানা বাস সংযুক্ত করা হয়. ঠিকানা বাস মাইক্রোপ্রসেসর থেকে একমুখী হয়. ঠিকানা বাসের জন্য ষোলটি কন্ডাক্টর রয়েছে এবং প্রতিটি একটি বিট (1 বা 0) বহন করে। এক ঘড়ির নাড়িতে ষোলটি বিট পাঠানো হয়।

কন্ট্রোল বাস আছে। কন্ট্রোল বাসের কিছু কন্ডাক্টর মাইক্রোপ্রসেসর থেকে অন্য উপাদানে প্রতিটি বিট স্থানান্তর করবে। কয়েকটি কন্ট্রোল লাইন ইনপুট/আউটপুট (IO) পোর্ট থেকে মাইক্রোপ্রসেসরে বিট বহন করে।

কম্পিউটার মেমরি
RAM এবং ROM কে এক মেমরি সমাবেশ হিসাবে বিবেচনা করা হয়। এই অ্যাসেম্বলিটি ডায়াগ্রামেটিকভাবে উপস্থাপন করা হয়েছে যেখানে হেক্সাডেসিমেল সংখ্যার '$' উপসর্গ রয়েছে:


চিত্র 4.11 কমোডোর 64 কম্পিউটারের জন্য মেমরি লেআউট

RAM 0000 থেকে 16 DFFF এর কাছে 16 যা $0000 থেকে $DFFF পর্যন্ত লেখা হয়। 6502 µP সমাবেশ ভাষার সাথে, একটি হেক্সাডেসিমেল সংখ্যা '$' এর সাথে উপসর্গযুক্ত এবং 16 বা H বা হেক্সের সাথে প্রত্যয়িত (সাবস্ক্রিপ্টেড) নয়। কম্পিউটার বন্ধ থাকলে র‌্যামের যেকোনো তথ্য বন্ধ হয়ে যায়। ROM শুরু হয় $E000 থেকে $FFFF পর্যন্ত। এটিতে সাবরুটিন রয়েছে যা কম্পিউটার বন্ধ হয়ে গেলে বন্ধ হয় না। এই সাবরুটিনগুলি সাধারণত ব্যবহৃত রুটিন যা প্রোগ্রামিংয়ে সহায়তা করে। ব্যবহারকারী প্রোগ্রাম তাদের কল করে (পরবর্তী অধ্যায় পড়ুন)।

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

মেমরি 2 নিয়ে গঠিত 16 = 65,536 বাইট অবস্থান। হেক্সাডেসিমেল আকারে, এইগুলি 10000 16 = 10000 এইচ = 10000 হেক্স = $10000 অবস্থান। কম্পিউটিং-এ, বেস টু, বেস টেন, বেস ষোল ইত্যাদিতে গণনা 0 থেকে শুরু হয় এবং 1 থেকে নয়। সুতরাং, প্রথম অবস্থানটি আসলে 0000000000000000 এর অবস্থান নম্বর। 2 = 0 10 = 0000 16 = $0000। 6502 µP সমাবেশ ভাষাতে, ঠিকানার অবস্থানের শনাক্তকরণ $ এর সাথে প্রিফিক্স করা হয় এবং কোন প্রত্যয় বা সাবস্ক্রিপ্ট নেই। সর্বশেষ অবস্থানটি হল অবস্থান নম্বর 1111111111111111 2 = 65,535 10 = FFFF 16 = $FFFF এবং 10000000000000000 নয় 2 , বা 65,536 10 , বা 10000 16 , বা $10000। 1000000000000000 2 65,536টি 10 , 10000 16 , বা $10000 বাইট অবস্থানের মোট সংখ্যা দেয়।

এখানে, 2 16 = 65,536 = 64 x 1024 = 64 x 2 10 = 64 Kbytes (কিলোবাইট)। কমডোর-64 নামের 64-এর প্রত্যয় মানে মোট মেমরির (RAM এবং ROM) 64KB। একটি বাইট হল 8 বিট, এবং 8 বিট মেমরিতে একটি বাইট অবস্থানে যাবে।

64 Kbytes মেমরি পৃষ্ঠাগুলিতে বিভক্ত। প্রতিটি পৃষ্ঠায় 0100 আছে 16 = 256টি 10 বাইট অবস্থান। প্রথম 256 10 = প্রথম 0100 16 অবস্থানগুলি হল পৃষ্ঠা 0৷ দ্বিতীয়টি হল পৃষ্ঠা 1, তৃতীয়টি হল পৃষ্ঠা 2 এবং আরও অনেক কিছু৷

65,536টি অবস্থানের ঠিকানার জন্য, প্রতিটি অবস্থানের (ঠিকানা) জন্য 16 বিট প্রয়োজন। সুতরাং, মাইক্রোপ্রসেসর থেকে মেমরি পর্যন্ত ঠিকানা বাস 16 লাইন গঠিত; এক বিটের জন্য এক লাইন। একটি বিট হয় 1 বা 0।

6502 µP রেজিস্টার
একটি রেজিস্টার একটি বাইট মেমরি অবস্থানের জন্য বাইট কোষের মত। 6502 µP এর ছয়টি রেজিস্টার রয়েছে: পাঁচটি 8-বিট রেজিস্টার এবং একটি 16-বিট রেজিস্টার। 16-বিট রেজিস্টারকে প্রোগ্রাম কাউন্টার বলা হয় যা সংক্ষেপে PC নামে পরিচিত। এটি পরবর্তী নির্দেশের জন্য মেমরি ঠিকানা ধারণ করে। একটি সমাবেশ ভাষা প্রোগ্রাম মেমরিতে স্থাপন করা নির্দেশাবলী নিয়ে গঠিত। মেমরিতে একটি নির্দিষ্ট বাইট অবস্থানের জন্য ষোলটি (16) বিভিন্ন বিট প্রয়োজন। একটি নির্দিষ্ট ঘড়ির স্পন্দনে, এই বিটগুলি একটি নির্দেশ পড়ার জন্য ঠিকানা বাসের 16-বিট ঠিকানা লাইনে পাঠানো হয়। 6502 µP এর জন্য সমস্ত রেজিস্টার নিম্নরূপ চিত্রিত করা হয়েছে:


চিত্র 4.12 6502 µP রেজিস্টার

প্রোগ্রাম কাউন্টার বা পিসিকে ডায়াগ্রামে একটি 16-বিট রেজিস্টার হিসাবে দেখা যেতে পারে। নিচের উল্লেখযোগ্য আটটি বিটকে প্রোগ্রাম কাউন্টার লো-এর জন্য PCL হিসেবে লেবেল করা হয়েছে। উচ্চতর উল্লেখযোগ্য আটটি বিটকে প্রোগ্রাম কাউন্টার হাই-এর জন্য PCH হিসাবে লেবেল করা হয়েছে। কমোডোর -64-এর জন্য মেমরির একটি নির্দেশ এক, দুই বা তিনটি বাইট নিয়ে গঠিত হতে পারে। পিসিতে 16 বিট মেমরিতে কার্যকর করা পরবর্তী নির্দেশের দিকে নির্দেশ করে। মাইক্রোপ্রসেসরের সার্কিটগুলির মধ্যে, তাদের দুটিকে বলা হয় অ্যারিথমেটিক লজিক ইউনিট এবং নির্দেশনা ডিকোডার। µP (মাইক্রোপ্রসেসর) এ প্রক্রিয়া করা বর্তমান নির্দেশটি যদি এক বাইট দীর্ঘ হয়, তাহলে এই দুটি সার্কিট পরবর্তী নির্দেশের জন্য পিসিকে 1 ইউনিট বাড়িয়ে দেয়। যদি বর্তমান নির্দেশনা যা µP-এ প্রক্রিয়া করা হচ্ছে তা দুই বাইট দীর্ঘ, অর্থাৎ এটি মেমরিতে পরপর দুটি বাইট দখল করে, এই দুটি সার্কিট পরবর্তী নির্দেশের জন্য পিসিকে 2 ইউনিট বাড়িয়ে দেয়। µP-তে প্রসেস করা বর্তমান নির্দেশটি যদি তিন বাইট দীর্ঘ হয়, অর্থাৎ এটি মেমরিতে পরপর তিনটি বাইট দখল করে, তাহলে এই দুটি সার্কিট পরবর্তী নির্দেশের জন্য পিসিকে 3 ইউনিট বাড়িয়ে দেয়।

সঞ্চয়কারী 'A' হল একটি আট-বিট সাধারণ উদ্দেশ্য রেজিস্টার যা বেশিরভাগ গাণিতিক এবং যুক্তিবিদ্যার ক্রিয়াকলাপের ফলাফল সংরক্ষণ করে।

'X' এবং 'Y' রেজিস্টার প্রতিটি প্রোগ্রামের ধাপ গণনা করতে ব্যবহৃত হয়। প্রোগ্রামিং-এ গণনা শুরু হয় ০ থেকে। তাই এগুলোকে বলা হয় ইনডেক্স রেজিস্টার। তাদের আরও কয়েকটি উদ্দেশ্য রয়েছে।

যদিও স্ট্যাক পয়েন্টার রেজিস্টার, “S”-এ 9 বিট রয়েছে যা একটি আট-বিট রেজিস্টার হিসাবে বিবেচিত হয়। এর বিষয়বস্তু র‍্যান্ডম অ্যাক্সেস মেমোরি (RAM)-এর পৃষ্ঠা 1-এ একটি বাইট অবস্থান নির্দেশ করে। পৃষ্ঠা 1 বাইট $0100 (256 10 ) থেকে বাইট $01FF (511 10 ) যখন একটি প্রোগ্রাম চলছে, তখন এটি মেমরিতে একটি নির্দেশ থেকে পরবর্তী ধারাবাহিক নির্দেশে চলে যায়। যাইহোক, এই সবসময় তা হয় না। কিছু সময় আছে যখন এটি একটি মেমরি এলাকা থেকে অন্য মেমরি এলাকায় লাফিয়ে সেখানে নির্দেশাবলী চালিয়ে যেতে, ধারাবাহিকভাবে। RAM-তে পৃষ্ঠা 1 স্ট্যাক হিসাবে ব্যবহৃত হয়। স্ট্যাক হল একটি বৃহৎ RAM মেমরি এরিয়া যেখানে কোডটি চালিয়ে যাওয়ার জন্য পরবর্তী ঠিকানা রয়েছে যেখান থেকে লাফ দেওয়া হয়। জাম্পিং নির্দেশাবলী সহ কোডগুলি স্ট্যাকের মধ্যে নেই; তারা স্মৃতির অন্য কোথাও আছে। যাইহোক, জাম্প-টু নির্দেশাবলী কার্যকর হওয়ার পরে, ধারাবাহিক ঠিকানাগুলি (কোড বিভাগ নয়) স্ট্যাকের মধ্যে থাকে। লাফ বা শাখা নির্দেশের ফলে তাদের সেখানে ধাক্কা দেওয়া হয়েছিল।

P-এর আট-বিট প্রসেসর স্ট্যাটাস রেজিস্টার একটি বিশেষ ধরনের রেজিস্টার। পৃথক বিটগুলি একে অপরের সাথে সম্পর্কিত বা সংযুক্ত নয়। সেখানে প্রতিটি বিটকে একটি পতাকা বলা হয় এবং অন্যদের থেকে স্বাধীনভাবে প্রশংসা করা হয়। প্রয়োজনে পতাকার অর্থ নিচে দেওয়া হল।

প্রতিটি রেজিস্টারের জন্য প্রথম এবং শেষ বিট সূচক পূর্ববর্তী ডায়াগ্রামে প্রতিটি রেজিস্টারের উপরে নির্দেশিত হয়েছে। একটি রেজিস্টারে বিট সূচক (অবস্থান) গণনা ডানদিকে 0 থেকে শুরু হয়।

বাইনারি, হেক্সাডেসিমেল এবং দশমিকে মেমরি পেজ
নিম্নলিখিত টেবিলটি বাইনারি, হেক্সাডেসিমেল এবং দশমিকে মেমরি পৃষ্ঠাগুলির শুরু দেখায়:

প্রতিটি পৃষ্ঠায় 1,0000,0000 রয়েছে 2 বাইটের সংখ্যা যা 100 এর সমান এইচ বাইটের সংখ্যা যা 256 এর সমান 10 বাইটের সংখ্যা। পূর্ববর্তী মেমরি ডায়াগ্রামে, পৃষ্ঠাগুলি পৃষ্ঠা 0 থেকে উপরে যাচ্ছে এবং টেবিলে নির্দেশিত হিসাবে নীচে না যাচ্ছে।

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

এই অধ্যায়ের বাকি অংশটি পূর্ববর্তী সমস্ত তথ্য ব্যবহার করে 6502 µP সমাবেশ ভাষা ব্যাখ্যা করে। ভাষাটি দ্রুত বোঝার জন্য পাঠককে বেস টেনের পরিবর্তে বেস সিক্সটিনে যোগ-বিয়োগ করতে হবে। এটা আসলে বেস টু হওয়ার কথা, কিন্তু বেস টুতে হিসাব করা কষ্টকর। মনে রাখবেন যে বেস টু-তে দুটি সংখ্যা যোগ করার সময়, বেস টেনের মতো একটি বহন এখনও 1 থাকে। কিন্তু ভিত্তি দুটিতে দুটি সংখ্যা বিয়োগ করার সময়, একটি ধার দুটি হয় এবং দশটি দশের মতো নয়। বেস ষোলোতে দুটি সংখ্যা যোগ করার সময়, একটি ক্যারি বেস টেনের মতো এখনও 1 থাকে। কিন্তু বেস ষোলোতে দুটি সংখ্যা বিয়োগ করার সময়, একটি ধার ষোল হয় এবং বেস দশের মতো দশ নয়।

4.2 ডেটা স্থানান্তর নির্দেশাবলী

6502 µP-এর জন্য সমাবেশ ভাষা ডেটা স্থানান্তর নির্দেশাবলীর নিম্নলিখিত সারণীটি বিবেচনা করুন:

যখন একটি বাইট (8-বিট) একটি মেমরি বাইট অবস্থান থেকে অ্যাকুমুলেটর রেজিস্টার, এক্স রেজিস্টার বা ওয়াই রেজিস্টারে অনুলিপি করা হয়, তখন সেটি লোড হচ্ছে। যখন একটি বাইট এই রেজিস্টার থেকে একটি মেমরি বাইট অবস্থানে অনুলিপি করা হয়, এটি স্থানান্তর করা হয়। যখন একটি বাইট এক রেজিস্টার থেকে অন্য রেজিস্টারে অনুলিপি করা হয়, তখনও তা স্থানান্তরিত হয়। টেবিলের দ্বিতীয় কলামে, তীরটি একটি বাইটের জন্য অনুলিপির দিকটি দেখায়। বাকি চারটি কলাম বিভিন্ন অ্যাড্রেসিং মোড দেখায়।

অ্যাড্রেসিং মোড কলামে একটি এন্ট্রি হল হেক্সাডেসিমেলে নির্দেশের সংশ্লিষ্ট স্মৃতির অংশের জন্য প্রকৃত বাইট কোড। উদাহরণ স্বরূপ, AE হল LDX-এর প্রকৃত বাইট কোড যা মেমরি থেকে এক্স রেজিস্টারে একটি বাইট লোড করতে হয় AE-এর মতো পরম ঠিকানা মোডে। 16 = 10101110 2 . সুতরাং, একটি মেমরি বাইট অবস্থানে LDX-এর বিটগুলি হল 10101110৷

লক্ষ্য করুন যে নির্দেশের LDX স্মৃতির অংশের জন্য, তিনটি সম্ভাব্য বাইট রয়েছে যা A2, AE এবং A6, এবং প্রতিটি একটি নির্দিষ্ট ঠিকানা মোডের জন্য। যখন X রেজিস্টারে লোড হওয়া বাইটটি মেমরি বাইট অবস্থান থেকে কপি করা হয় না, তখন মানটি হেক্সাডেসিমেল বা দশমিকে নির্দেশে LDX নেমোনিক দিয়ে (শুধু পরে) টাইপ করতে হবে। এই অধ্যায়ে, এই ধরনের মান হেক্সাডেসিমেলে টাইপ করা হয়েছে। এটি তাৎক্ষণিক ঠিকানা, তাই LDX প্রতিনিধিত্ব করার জন্য মেমরির প্রকৃত বাইট হল A2 16 = 10100010 2 এবং AE না 16 যা 10101110 এর সমান 2 .

টেবিলে, অ্যাড্রেসিং মোড শিরোনামের অধীনে সমস্ত বাইটকে অপারেশন কোড বলা হয় যা সংক্ষেপে অপকোড নামে পরিচিত। অ্যাড্রেসিং মোডের উপর নির্ভর করে একটি মেমোনিকের জন্য একাধিক অপকোড থাকতে পারে।

বিঃদ্রঃ: কম্পিউটার সিস্টেম ইউনিটে 'লোড' শব্দের দুটি অর্থ হতে পারে: এটি একটি ডিস্ক থেকে কম্পিউটারের মেমরিতে একটি ফাইলের লোডিং বোঝাতে পারে বা এটি একটি মেমরি বাইট অবস্থান থেকে একটি মাইক্রোপ্রসেসর রেজিস্টারে একটি বাইট স্থানান্তরকে নির্দেশ করতে পারে। .

6502 µP-এর জন্য টেবিলে চারটির চেয়ে বেশি অ্যাড্রেসিং মোড রয়েছে।

অন্যথায় বলা না থাকলে, এই অধ্যায়ের সমস্ত ব্যবহারকারী প্রোগ্রামিং কোড ঠিকানা 0200 থেকে শুরু হয় 16 যা মেমরিতে ব্যবহারকারী এলাকার শুরু।

মেমরি এম এবং অ্যাকিউমুলেটর এ

মেমরি টু অ্যাকুমুলেটর

তাৎক্ষণিক ঠিকানা
নিম্নলিখিত নির্দেশাবলী FF নম্বর সংরক্ষণ করে 16 = 255 10 সঞ্চয়কারীর মধ্যে:

LDA #$FF

'$' শুধুমাত্র একটি মেমরি ঠিকানা সনাক্ত করতে ব্যবহৃত হয় না। সাধারণভাবে, এটি নির্দেশ করতে ব্যবহৃত হয় যে পরবর্তী সংখ্যাটি হেক্সাডেসিমাল। এই ক্ষেত্রে, $FF কোনো মেমরি বাইট অবস্থানের ঠিকানা নয়। এটি 255 নম্বর 10 হেক্সাডেসিমেলে। বেস 16 বা এর অন্য কোনো সমতুল্য সাবস্ক্রিপ্ট অবশ্যই অ্যাসেম্বলি ভাষার নির্দেশে লেখা যাবে না। “#” ইঙ্গিত করে যে পরবর্তীতে যা যা হবে তা হল অ্যাকিউমুলেটর রেজিস্টারে রাখা মান। মানটি বেস টেনেও লেখা যেতে পারে, তবে এই অধ্যায়ে তা করা হয়নি। '#' মানে অবিলম্বে ঠিকানা।

একটি মেমোনিক এর সংশ্লিষ্ট ইংরেজি শব্দগুচ্ছের সাথে কিছু সাদৃশ্য রয়েছে। 'LDA #$FF' মানে 255 নম্বরটি লোড করুন 10 সঞ্চয়কারী A-তে। যেহেতু এটি পূর্ববর্তী টেবিল থেকে তাৎক্ষণিক ঠিকানা, LDA হল A9 এবং AD বা A5 নয়। বাইনারিতে A9 হল 101010001৷ সুতরাং, যদি LDA-এর জন্য A9 মেমরিতে $0200 ঠিকানায় থাকে, $FF হয় $0301 = 0300 + 1 ঠিকানায়৷ #$FF সঠিকভাবে এলডিএ নেমোনিকের অপারেন্ড।

পরম ঠিকানা
যদি $FF-এর মান মেমরিতে $0333 অবস্থানে থাকে, তাহলে পূর্ববর্তী নির্দেশটি হল:

এলডিএ $0333

# এর অনুপস্থিতি লক্ষ্য করুন। এই ক্ষেত্রে, # এর অনুপস্থিতির মানে হল যেটি অনুসরণ করে একটি মেমরি ঠিকানা এবং আগ্রহের মান নয় (সঞ্চয়কারীতে রাখার মান নয়)। সুতরাং, LDA-এর জন্য opcode, এবার, AD এবং A9 বা A5 নয়। এখানে LDA-এর অপারেন্ড হল $0333 ঠিকানা এবং $FF মান নয়৷ $FF $0333 অবস্থানে রয়েছে যা বরং অনেক দূরে। 'LDA $0333' নির্দেশটি মেমরিতে পরপর তিনটি অবস্থান দখল করে, এবং দুটি নয়, যেমনটি পূর্ববর্তী চিত্রে করা হয়েছিল৷ LDA-এর জন্য 'AD' $0200 অবস্থানে রয়েছে। 0333 এর নিম্ন বাইট যা 33 হল $0301 অবস্থানে। $0333 এর উচ্চতর বাইট যা 03 হল $0302 অবস্থানে। এটি সামান্য অন্তিমতা যা 6502 সমাবেশ ভাষা দ্বারা ব্যবহৃত হয়। বিভিন্ন মাইক্রোপ্রসেসরের সমাবেশ ভাষা ভিন্ন।

এটি পরম ঠিকানার একটি উদাহরণ। $0333 হল সেই অবস্থানের ঠিকানা যেখানে $FF আছে। নির্দেশনাটি পরপর তিনটি বাইট নিয়ে গঠিত এবং $FF বা এর প্রকৃত বাইট অবস্থান অন্তর্ভুক্ত করে না।

জিরো-পৃষ্ঠা ঠিকানা

অনুমান করুন যে $FF মান পৃষ্ঠা শূন্যে $0050 মেমরি অবস্থানে রয়েছে। শূন্য-পৃষ্ঠার জন্য বাইট অবস্থানগুলি $0000 থেকে শুরু হয় এবং $00FF এ শেষ হয়। এই 256 10 মোট অবস্থান। কমোডোর -64 মেমরির প্রতিটি পৃষ্ঠা 256 10 দীর্ঘ লক্ষ্য করুন যে মেমরিতে শূন্য-পৃষ্ঠা স্থানের সমস্ত সম্ভাব্য অবস্থানের জন্য উচ্চতর বাইটটি শূন্য। শূন্য-পৃষ্ঠা অ্যাড্রেসিং মোডটি পরম ঠিকানা মোডের মতোই, কিন্তু 00-এর উচ্চতর বাইট নির্দেশে টাইপ করা হয় না। সুতরাং, $0050 অবস্থান থেকে $FF লোড করার জন্য, শূন্য-পৃষ্ঠার ঠিকানা মোড নির্দেশনা হল:

LDA $50

LDA এর সাথে A5 এবং A9 বা AD, A5 নয় 16 = 10100101 2 . মনে রাখবেন যে মেমরির প্রতিটি বাইট 8 টি কোষের, এবং প্রতিটি ঘরে একটি বিট থাকে। এখানে নির্দেশনাটি পরপর দুটি বাইট নিয়ে গঠিত। LDA-এর জন্য A5 $0200 মেমরি অবস্থানে এবং $50 ঠিকানা, 00 এর উচ্চতর বাইট ছাড়া, $0301 অবস্থানে রয়েছে। 00 এর অনুপস্থিতি, যা মোট 64K মেমরিতে একটি বাইট ব্যবহার করবে, মেমরির স্থানকে সাশ্রয়ী করে।

মেমরি থেকে সঞ্চয়কারী

পরম ঠিকানা
নিম্নলিখিত নির্দেশ একটি বাইট মান কপি করে, তা যাই হোক না কেন, সঞ্চয়কারী থেকে $1444 এর মেমরি অবস্থান পর্যন্ত:

তারা হল $1444

এটি সঞ্চয়কারী থেকে মেমরিতে স্থানান্তরিত বলে বলা হয়। এটা লোড হচ্ছে না। লোড হচ্ছে বিপরীত। STA-এর জন্য opcode বাইট হল 8D 16 = 10001101 2 . এই নির্দেশটি মেমরিতে পরপর তিনটি বাইট নিয়ে গঠিত। 8D 16 $0200 অবস্থানে আছে। 44 16 $1444 ঠিকানা $0201 অবস্থানে আছে. এবং 14 16 $0202 অবস্থানে - সামান্য endianness. কপি করা প্রকৃত বাইট নির্দেশের অংশ নয়। 8D এবং 85 নয় শূন্য-পৃষ্ঠার ঠিকানার জন্য (সারণীতে) STA-এর জন্য এখানে ব্যবহার করা হয়েছে।

জিরো পেজ অ্যাড্রেসিং
নিম্নলিখিত নির্দেশ একটি বাইট মান কপি করে, তা যাই হোক না কেন, সঞ্চয়কারী থেকে $0050 এর মেমরি অবস্থান পর্যন্ত পৃষ্ঠা শূন্যে:

STA $0050

এখানে STA-এর জন্য opcode বাইট হল 85 16 = 10000101 2 . এই নির্দেশনাটি মেমরিতে পরপর দুটি বাইট নিয়ে গঠিত। ৮৫ 16 অবস্থান $0200. 50 16 $0050 ঠিকানার অবস্থান $0201 এ। এন্ডিয়ানেসের সমস্যাটি এখানে আসে না কারণ ঠিকানাটিতে একটি মাত্র বাইট রয়েছে যা নিম্ন বাইট। কপি করা প্রকৃত বাইট নির্দেশের অংশ নয়। শূন্য-পৃষ্ঠার ঠিকানার জন্য 85 এবং 8D নয় STA-এর জন্য এখানে ব্যবহার করা হয়েছে।

সঞ্চয়কারী থেকে মেমরির একটি অবস্থানে একটি বাইট স্থানান্তর করার জন্য তাৎক্ষণিক ঠিকানা ব্যবহার করার কোন মানে হয় না। এর কারণ হল $FF-এর মতো প্রকৃত মান তাৎক্ষণিক ঠিকানায় নির্দেশনায় উদ্ধৃত করতে হবে। সুতরাং, µP-এর রেজিস্টার থেকে কোনো মেমরি অবস্থানে বাইট মান স্থানান্তরের জন্য তাৎক্ষণিক ঠিকানা সম্ভব নয়।

LDX, STX, LDY, এবং STY স্মৃতিবিদ্যা
LDX এবং STX যথাক্রমে LDA এবং STA অনুরূপ। কিন্তু এখানে, এক্স রেজিস্টার ব্যবহার করা হয় এবং A (সঞ্চয়কারী) রেজিস্টার নয়। LDY এবং STY যথাক্রমে LDA এবং STA অনুরূপ। কিন্তু এখানে, Y রেজিস্টার ব্যবহার করা হয়েছে এবং A রেজিস্টার নয়। হেক্সাডেসিমেলের প্রতিটি অপকোডের জন্য সারণি 4.21 পড়ুন যা একটি নির্দিষ্ট মেমোনিক এবং একটি নির্দিষ্ট ঠিকানা মোডের সাথে সম্পর্কিত।

রেজিস্টার-টু-রেজিস্টার ট্রান্সফার
সারণি 4.21-এর পূর্ববর্তী দুটি নির্দেশাবলী মেমরি/মাইক্রোপ্রসেসর-রেজিস্টার কপি করা (ট্রান্সফার) এবং রেজিস্টার/রেজিস্টার কপি (ট্রান্সফার) নিয়ে কাজ করে। TAX, TXA, TAY, TYA, TSX এবং TXS নির্দেশাবলী মাইক্রোপ্রসেসরের রেজিস্টার থেকে একই মাইক্রোপ্রসেসরের অন্য রেজিস্টারে অনুলিপি (স্থানান্তর) করে।

A থেকে X তে বাইট অনুলিপি করতে, নির্দেশটি হল:

ট্যাক্স

X থেকে A তে বাইট অনুলিপি করতে, নির্দেশটি হল:

TX

A থেকে Y তে বাইট অনুলিপি করতে, নির্দেশটি হল:

হাত

Y থেকে A তে বাইট অনুলিপি করতে, নির্দেশটি হল:

টিওয়াইএ

কমোডোর 64 কম্পিউটারের জন্য, স্ট্যাকটি মেমরিতে পৃষ্ঠা 0 এর ঠিক পরে পৃষ্ঠা 1। প্রতিটি অন্যান্য পৃষ্ঠার মত, এটি 25610 নিয়ে গঠিত 10 বাইট অবস্থান, $0100 থেকে $01FF পর্যন্ত। সাধারনত, একটি প্রোগ্রাম মেমরিতে একটি নির্দেশ থেকে পরবর্তী ধারাবাহিক নির্দেশে কার্যকর করে। সময়ে সময়ে, অন্য মেমরি কোড (নির্দেশের সেট) বিভাগে একটি লাফ আছে। স্ট্যাক এরিয়া মেমরিতে (RAM) এর পরবর্তী নির্দেশের ঠিকানা রয়েছে যেখান থেকে জাম্প (বা শাখা) প্রোগ্রামের ধারাবাহিকতার জন্য ছেড়ে গেছে।

স্ট্যাক পয়েন্টার 'S' হল 6502 µP-এ একটি 9-বিট রেজিস্টার। প্রথম বিট (বামদিকে) সর্বদা 1। প্রথম পৃষ্ঠার সমস্ত বাইট অবস্থান ঠিকানা 1 দিয়ে শুরু হয় এবং 256-এর জন্য 8টি ভিন্ন বিট দ্বারা অনুসরণ করা হয়। 10 অবস্থান স্ট্যাক পয়েন্টারে পৃষ্ঠা 1-এ অবস্থানের ঠিকানা রয়েছে যেখানে পরবর্তী নির্দেশের ঠিকানা রয়েছে যা বর্তমান (জাম্পড-টু) কোড সেগমেন্টটি কার্যকর করার পরে প্রোগ্রামটিকে ফিরে আসতে হবে এবং চালিয়ে যেতে হবে। যেহেতু স্ট্যাকের সমস্ত ঠিকানার প্রথম বিট (পৃষ্ঠা এক) 1 দিয়ে শুরু হয়, স্ট্যাক পয়েন্টার রেজিস্টারে শুধুমাত্র বাকি আটটি বিট ধরে রাখতে হবে। সর্বোপরি, এর প্রথম বিট, যা সবচেয়ে বাম-বিট (নবম বিটটি ডান দিক থেকে গণনা করা হয়), সর্বদা 1 হয়।

S থেকে X তে বাইট অনুলিপি করতে, নির্দেশটি হল:

টিএসএক্স

X থেকে S তে বাইট কপি করতে, নির্দেশনা হল:

TXT

রেজিস্টার-টু-রেজিস্টার নির্দেশাবলী কোন অপারেন্ড গ্রহণ করে না। তারা শুধু স্মৃতিশক্তি নিয়ে গঠিত। প্রতিটি মেমোনিকের অপকোড হেক্সাডেসিমেলে থাকে। এটি অন্তর্নিহিত ঠিকানা মোডে কারণ কোন অপারেন্ড নেই (কোনও মেমরি ঠিকানা নেই, কোন মান নেই)।

বিঃদ্রঃ: কোন X থেকে Y বা Y থেকে X স্থানান্তর (কপি করা) নেই।

4.3 পাটিগণিত অপারেশন

সার্কিট, 6502 µP এর পাটিগণিত লজিক ইউনিট, একবারে শুধুমাত্র দুটি আট-বিট সংখ্যা যোগ করতে পারে। এটি বিয়োগ করে না, এটি গুণ করে না এবং এটি ভাগ করে না। নিম্নলিখিত টেবিলটি গাণিতিক ক্রিয়াকলাপের জন্য অপকোড এবং ঠিকানা মোডগুলি দেখায়:

বিঃদ্রঃ: গাণিতিক ক্রিয়াকলাপ এবং অন্যান্য ধরণের ক্রিয়াকলাপের জন্য সমস্ত স্মৃতিবিদ্যা (অর্থাৎ সমস্ত 6502 স্মৃতিবিদ্যা) অপারেশন (অপ) কোডের এক বাইট নেয়। যদি মেমোনিকের জন্য একাধিক অ্যাড্রেসিং মোড থাকে, তবে একই স্মৃতির জন্য আলাদা অপকোড থাকবে: প্রতি অ্যাড্রেসিং মোডের জন্য একটি। টেবিলের C, D, এবং V হল স্ট্যাটাস রেজিস্টারের পতাকা। প্রয়োজনে তাদের অর্থ পরে দেওয়া হবে।

স্বাক্ষরবিহীন সংখ্যার সংযোজন
6502 µP সহ, স্বাক্ষরিত সংখ্যা দুটির পরিপূরক সংখ্যা। স্বাক্ষরবিহীন সংখ্যাগুলি হল সাধারণ ধনাত্মক সংখ্যা যা শূন্য থেকে শুরু হয়। সুতরাং, আট-বিটের একটি বাইটের জন্য, ক্ষুদ্রতম স্বাক্ষরবিহীন সংখ্যা হল 00000000 2 = 0 10 = 00 16 এবং সবচেয়ে বড় স্বাক্ষরবিহীন সংখ্যা হল 11111111 2 = 255 10 = FF 16 . দুটি স্বাক্ষরবিহীন সংখ্যার জন্য, সংযোজন হল:

A+M+C→A

এর মানে হল যে অ্যাকিউমুলেটরের 8-বিট বিষয়বস্তু পাটিগণিত যুক্তি ইউনিট দ্বারা মেমরি থেকে একটি বাইট (8-বিট) যোগ করা হয়। A এবং M যোগ করার পর, নবম বিটে ক্যারি স্ট্যাটাস রেজিস্টারে ক্যারি ফ্ল্যাগ সেলে চলে যায়। আগের সংযোজন থেকে যে কোনো পূর্ববর্তী ক্যারি বিট যা এখনও স্ট্যাটাস রেজিস্টারে ক্যারি ফ্ল্যাগ সেলে রয়েছে তাও A এবং M যোগফলের সাথে যোগ করা হয়, যা A+M+C→A তৈরি করে। ফলাফল সঞ্চয়ক মধ্যে ফিরে রাখা হয়.

যদি সুদের যোগ হয়:

A+M

এবং কোন পূর্ববর্তী বহন যোগ করার প্রয়োজন নেই, বহন পতাকা সাফ করতে হবে যা 0 করা হয়েছে, যাতে সংযোজন হয়:

A+M+0→A A+M→A এর মতই

বিঃদ্রঃ: যদি A-তে M যোগ করা হয়, এবং 1-এর একটি বহন ঘটে কারণ ফলাফল 255-এর থেকে বেশি হয় 10 = 11111111 2 = FF 16 , এটি একটি নতুন বহন. 1-এর এই নতুন ক্যারিটি স্বয়ংক্রিয়ভাবে ক্যারি ফ্ল্যাগ সেলে পাঠানো হয় যদি পরবর্তী জোড়া আট-বিটের যোগফলের প্রয়োজন হয় (অন্য A + M)।

দুটি স্বাক্ষরবিহীন আট-বিট যোগ করার জন্য কোড
00111111 2 +00010101 2 3F এর মতই 16 + 15 16 যা 63 এর সমান 10 +২১ 10 . ফলাফল হল 010101002 2 যা 54 এর সমান 16 এবং 84 10 . ফলাফল আট বিটের জন্য সর্বোচ্চ সংখ্যার বাইরে নয় যা 255 10 = 11111111 2 = FF 16 . সুতরাং, 1 এর কোন ফলিত বহন নেই। এটিকে অন্যভাবে বলতে গেলে, এর ফলে প্রাপ্ত বহন হল 0। সংযোজনের আগে, 1 এর পূর্ববর্তী বহন নেই। অন্য কথায়, পূর্ববর্তী বহনটি 0। এই সংযোজন করার কোড হতে পারে:

সিএলসি
LDA#$3F
ADC #$15

বিঃদ্রঃ: সমাবেশ ভাষা টাইপ করার সময়, প্রতিটি নির্দেশের শেষে কীবোর্ডের 'এন্টার' কী টিপতে হয়। এই কোডে তিনটি নির্দেশনা রয়েছে। পূর্ববর্তী সংযোজন 1 থাকলে প্রথম নির্দেশ (CLC) বহন পতাকাটি পরিষ্কার করে। CLC শুধুমাত্র অন্তর্নিহিত ঠিকানা মোডে করা যেতে পারে। ইমপ্লিড অ্যাড্রেসিং মোডের জন্য মেমোনিক কোন অপারেন্ড নেয় না। এটি পি-এর স্ট্যাটাস রেজিস্টারের ক্যারি সেল সাফ করে। ক্লিয়ারিং মানে ক্যারি ফ্ল্যাগ সেলকে 0-এর বিট দেওয়া। কোডের পরবর্তী দুটি নির্দেশাবলী তাৎক্ষণিক ঠিকানা মোড ব্যবহার করে। অবিলম্বে ঠিকানার সাথে, স্মৃতির জন্য শুধুমাত্র একটি অপারেন্ড আছে যা একটি সংখ্যা (এবং মেমরি বা নিবন্ধন ঠিকানা নয়)। এবং তাই, সংখ্যার আগে অবশ্যই '#' লিখতে হবে। '$' এর অর্থ হল যে সংখ্যাটি অনুসরণ করা হয়েছে তা হেক্সাডেসিমেল।

দ্বিতীয় নির্দেশটি 3F নম্বর লোড করে 16 সঞ্চয়ক মধ্যে তৃতীয় নির্দেশের জন্য, µP এর গাণিতিক লজিক ইউনিট সার্কিট স্ট্যাটাস রেজিস্টারের ক্যারি পতাকা কক্ষের 0 (0 থেকে জোরপূর্বক) বহন করে এবং 15-এ যোগ করে। 16 সেইসাথে মান যা ইতিমধ্যেই 3F-তে আছে 16 accumulator এবং সম্পূর্ণ ফলাফলকে আবার সঞ্চয়কারীতে রাখে। এই ক্ষেত্রে, 0 এর ফলস্বরূপ বহন করা হয়। ALU (পাটিগণিত লজিক ইউনিট) স্ট্যাটাস রেজিস্টারের ক্যারি ফ্ল্যাগ সেলে 0 পাঠায় (পুট করে)। প্রসেসর স্ট্যাটাস রেজিস্টার এবং স্ট্যাটাস রেজিস্টার একই জিনিস মানে। যদি একটি ক্যারি 1 এর ফলাফল হয়, ALU স্ট্যাটাস রেজিস্টারের ক্যারি পতাকায় 1 পাঠায়।

পূর্ববর্তী কোডের তিনটি লাইন কার্যকর করার আগে মেমরিতে থাকতে হবে। CLC (উহ্য ঠিকানা) এর opcode 1816 $0200 বাইট অবস্থানে রয়েছে। অপকোড A9 16 LDA এর জন্য (তাৎক্ষণিক ঠিকানা) $0201 বাইট অবস্থানে রয়েছে। সংখ্যা 3F 10 $0202 বাইট অবস্থানে আছে। অপকোড 69 16 LDA এর জন্য (তাৎক্ষণিক ঠিকানা) $0203 বাইট অবস্থানে রয়েছে। সংখ্যা 15 10 $0204 বাইট অবস্থানে আছে।

বিঃদ্রঃ: এলডিএ একটি স্থানান্তর (লোড) নির্দেশনা এবং একটি গাণিতিক নির্দেশনা (স্মরণীয়) নয়।

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

সংখ্যা 0010101010111111 হতে দিন 2 = 2ABF16 16 = 10,943 10 এবং 0010101010010101 2 = 2A95 16 = 10,901 10 . যোগফল হল 0101010101010100 2 = 5554 16 = 21,844 10 .

বেস দুই-এ এই দুটি স্বাক্ষরবিহীন সংখ্যা যোগ করলে নিম্নরূপ:

নিম্নলিখিত সারণীটি ডান থেকে শুরু করে অষ্টম বিট থেকে নবম বিট অবস্থানে 1-এর বহনের সাথে একই সংযোজন দেখায়:

এটি কোডিং করার সময়, দুটি নিম্ন বাইট প্রথমে যোগ করা হয়। তারপর, ALU (Arithmetic Logic Unit) 1-এর ক্যারিকে অষ্টম বিট পজিশন থেকে নবম বিট পজিশনে, স্ট্যাটাস রেজিস্টারের ক্যারি ফ্ল্যাগ সেলে পাঠায়। ক্যারি ছাড়া 0 1 0 1 0 1 0 0 এর ফলাফল সঞ্চয়কারীতে যায়। তারপর, বাইট দ্বিতীয় জোড়া বহন সঙ্গে যোগ করা হয়. এডিসি নেমোনিক মানে পূর্ববর্তী বহনের সাথে স্বয়ংক্রিয়ভাবে যোগ করা। এই ক্ষেত্রে, পূর্ববর্তী বহন, যা 1, দ্বিতীয় সংযোজনের আগে পরিবর্তন করা উচিত নয়। প্রথম সংযোজনের জন্য, যেহেতু কোনো পূর্ববর্তী বহন এই সম্পূর্ণ সংযোজনের অংশ নয়, এটি অবশ্যই সাফ করতে হবে (0 তৈরি করা হয়েছে)।

দুই জোড়া বাইট সম্পূর্ণ যোগ করার জন্য, প্রথম সংযোজন হল:

A + M + 0 -> A

দ্বিতীয় সংযোজন হল:

A + M + 1 -> A

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

সিএলসি
এলডিএ $0213
ADC $0215
; কোন ক্লিয়ারিং কারণ বহন পতাকা মান প্রয়োজন
STA $0217
এলডিএ $0214
ADC $0216
STA $0218

নোট করুন যে 6502 সমাবেশ ভাষার সাথে, একটি সেমিকোলন একটি মন্তব্য শুরু করে। এর মানে হল যে প্রোগ্রামটি কার্যকর করার সময়, সেমিকোলন এবং তার ডানদিকে থাকা সবকিছু উপেক্ষা করা হয়। পূর্বে যে প্রোগ্রামটি লেখা হয়েছে সেটি একটি টেক্সট ফাইলে প্রোগ্রামারের পছন্দের নাম এবং “.asm” এক্সটেনশনের সাথে সংরক্ষণ করা হয়। পূর্ববর্তী প্রোগ্রামটি সঠিক প্রোগ্রাম নয় যা সম্পাদনের জন্য মেমরিতে যায়। মেমরিতে সংশ্লিষ্ট প্রোগ্রামটিকে অনুবাদ করা প্রোগ্রাম বলা হয় যেখানে মেমোনিক্স অপকোড (বাইট) দিয়ে প্রতিস্থাপিত হয়। যেকোন মন্তব্য অ্যাসেম্বলি ল্যাঙ্গুয়েজ টেক্সট ফাইলে থেকে যায় এবং অনূদিত প্রোগ্রামটি মেমরিতে পৌঁছানোর আগেই তা ছিনিয়ে নেওয়া হয়। আসলে, আজ ডিস্কে দুটি ফাইল সংরক্ষিত আছে: “.asm” ফাইল এবং “.exe” ফাইল। '.asm' ফাইলটি আগের চিত্রের একটি। '.exe' ফাইলটি হল '.asm' ফাইল যেখানে সমস্ত মন্তব্য বন্ধ করা হয়েছে এবং সমস্ত স্মৃতিবিদ্যা তাদের অপকোড দ্বারা প্রতিস্থাপিত হয়েছে৷ টেক্সট এডিটরে খোলা হলে, '.exe' ফাইলটি চেনা যায় না। অন্যথায় বলা না থাকলে, এই অধ্যায়ের উদ্দেশ্যে, '.exe' ফাইলটি $0200 অবস্থান থেকে শুরু হওয়া মেমরিতে কপি করা হয়েছে। এটি লোডিংয়ের অন্য অর্থ।

দুটি 16-বিট নম্বর যোগ করা হবে পরম ঠিকানার জন্য মেমরিতে চার বাইট দখল করে: প্রতি নম্বরে দুটি বাইট (মেমরি হল বাইটের একটি ক্রম)। পরম ঠিকানা সহ, অপকোডের অপারেন্ড মেমরিতে থাকে। সংক্ষিপ্ত ফলাফল দুই বাইট প্রশস্ত এবং মেমরিতে স্থাপন করতে হবে। এটি মোট 6 দেয় 10 = 6 16 ইনপুট এবং আউটপুট জন্য বাইট. ইনপুটগুলি কীবোর্ড থেকে নয় এবং আউটপুট মনিটর বা প্রিন্টার থেকে নয়। ইনপুটগুলি মেমরিতে (RAM) এবং আউটপুট (সারসংক্ষেপ ফলাফল) এই অবস্থায় মেমরিতে (RAM) ফিরে যায়।

একটি প্রোগ্রাম কার্যকর করার আগে, অনুবাদিত সংস্করণটি প্রথমে মেমরিতে থাকতে হবে। পূর্ববর্তী প্রোগ্রাম কোডের দিকে তাকালে, এটি দেখা যায় যে মন্তব্য ছাড়া নির্দেশাবলী 19 তৈরি করে 10 = 13টি 16 বাইট সুতরাং, প্রোগ্রামটি মেমরিতে $0200 বাইট অবস্থান থেকে $0200 + $13 - $1 = $0212 বাইট অবস্থানে নিয়ে যায় ($0200 থেকে শুরু করে এবং $0201 নয় যা বোঝায় - $1)। ইনপুট এবং আউটপুট নম্বরের জন্য 6 বাইট যোগ করলে সমস্ত প্রোগ্রাম $0212 + $6 = $0218 এ শেষ হয়। প্রোগ্রামটির মোট দৈর্ঘ্য হল 19টি 16 = 25টি 10 .

augend-এর নিম্ন বাইটটি $0213 ঠিকানায় হওয়া উচিত এবং একই augend-এর উচ্চতর বাইটটি $0214 ঠিকানায় হওয়া উচিত - সামান্য endianness। একইভাবে, সংযোজনের নিম্ন বাইটটি $0215 ঠিকানায় হওয়া উচিত, এবং একই সংযোজনের উচ্চতর বাইটটি $0216 ঠিকানায় হওয়া উচিত - সামান্য এন্ডিয়াননেস। ফলাফলের নিম্ন বাইট (সমষ্টি) $0217 ঠিকানায় হওয়া উচিত, এবং একই ফলাফলের উচ্চতর বাইটটি $0218 ঠিকানায় হওয়া উচিত - সামান্য শেষ।

অপকোড 18 16 CLC এর জন্য (উহ্য ঠিকানা) $0200 এর বাইট অবস্থানে রয়েছে। 'LDA $0213' এর opcode, অর্থাৎ AD 16 LDA (পরম ঠিকানা) এর জন্য $0201 এর বাইট অবস্থানে রয়েছে। augend এর নিম্ন বাইট যা 10111111 হল $0213 এর মেমরি বাইট অবস্থানে। মনে রাখবেন যে প্রতিটি অপকোড একটি বাইট দখল করে। 'LDA $0213' এর '$0213' ঠিকানাটি $0202 এবং $0203 এর বাইট অবস্থানে রয়েছে৷ 'LDA $0213' নির্দেশটি augend-এর নিম্ন বাইটকে সঞ্চয়কারীতে লোড করে।

'ADC $0215' এর opcode, অর্থাৎ 6D 16 ADC (পরম ঠিকানা) এর জন্য $0204 এর বাইট অবস্থানে রয়েছে। 10010101 হল অ্যাডেন্ডের নিম্ন বাইটটি $0215 এর বাইট অবস্থানে রয়েছে। 'ADC $0215' এর '$0215' ঠিকানাটি $0205 এবং $0206 এর বাইট অবস্থানে রয়েছে। 'ADC $0215' নির্দেশটি augend-এর নিম্ন বাইটে যোগের নিম্ন বাইট যোগ করে যা ইতিমধ্যেই সঞ্চয়কারীতে রয়েছে। ফলাফল সঞ্চয়ক ফিরে স্থাপন করা হয়. অষ্টম বিটের পর যেকোনো ক্যারি স্ট্যাটাস রেজিস্টারের ক্যারি পতাকায় পাঠানো হয়। উচ্চতর বাইটের দ্বিতীয় সংযোজনের আগে বহন পতাকা ঘরটি অবশ্যই সাফ করা উচিত নয়। এই বহন স্বয়ংক্রিয়ভাবে উচ্চ বাইটের যোগফল যোগ করা হয়. আসলে, CLC-এর কারণে শুরুতে স্বয়ংক্রিয়ভাবে নিম্ন বাইটের যোগফলের সাথে 0-এর একটি ক্যারি যোগ করা হয় (কোনও ক্যারি যোগ না হওয়ার সমতুল্য)।

মন্তব্য পরবর্তী 48 লাগে 10 = 30টি 16 বাইট যাইহোক, এটি শুধুমাত্র '.asm' টেক্সট ফাইলে থাকে। স্মৃতিতে তা পৌঁছায় না। এটি অনুবাদ দ্বারা মুছে ফেলা হয় যা অ্যাসেম্বলার (একটি প্রোগ্রাম) দ্বারা করা হয়।

পরবর্তী নির্দেশের জন্য যা হল 'STA $0217', STA-এর অপকোড যা 8D 16 (পরম ঠিকানা) $0207 এর বাইট অবস্থানে রয়েছে। 'STA $0217' এর '$0217' ঠিকানাটি $0208 এবং $0209 এর মেমরি অবস্থানে রয়েছে৷ 'STA $0217' নির্দেশটি $0217 এর মেমরি অবস্থানে সঞ্চয়কারীর আট-বিট বিষয়বস্তু কপি করে।

augend-এর উচ্চতর বাইট যা 00101010 হল $0214-এর মেমরি অবস্থানে এবং 00101010-এর উচ্চতর বাইট হল $02-এর বাইট অবস্থানে 16 . 'LDA $0214' এর opcode যা LDA (পরম ঠিকানা) এর জন্য AD16 হল $020A এর বাইট অবস্থানে। 'LDA $0214' এর '$0214' ঠিকানা $020B এবং $020C এর অবস্থানে রয়েছে৷ 'LDA $0214' নির্দেশটি augend এর উচ্চতর বাইটকে সঞ্চয়কারীতে লোড করে, যা সঞ্চয়কারীর মধ্যে আছে তা মুছে দেয়।

'ADC $0216' এর অপকোড যা 6D 16 ADC এর জন্য (পরম ঠিকানা) $020D এর বাইট অবস্থানে রয়েছে। 'ADC 0216' এর '$0216' ঠিকানাটি $020E এবং $020F এর বাইট অবস্থানে রয়েছে৷ 'ADC $0216' নির্দেশনাটি ইতিমধ্যেই সঞ্চয়কারীতে থাকা augend-এর উচ্চতর বাইটে যোগের উচ্চতর বাইট যোগ করে। ফলাফল আবার সঞ্চয়ক মধ্যে স্থাপন করা হয়. যদি 1-এর একটি ক্যারি থাকে, এই দ্বিতীয় সংযোজনের জন্য, এটি স্বয়ংক্রিয়ভাবে স্ট্যাটাস রেজিস্টারের ক্যারি সেলে স্থাপন করা হয়। যদিও এই সমস্যার জন্য ষোলতম বিটের (বাম দিকে) বহনের প্রয়োজন নেই, তবে ক্যারি পতাকাটি 1 হয়ে গেছে কিনা তা পরীক্ষা করে 1-এর একটি ক্যারি ঘটেছে কিনা তা পরীক্ষা করা ভাল।

পরবর্তী এবং শেষ নির্দেশের জন্য যা হল 'STA $0218', STA-এর অপকোড যা 8D16 (পরম ঠিকানা) $0210-এর বাইট অবস্থানে রয়েছে৷ 'STA $0218' এর '$0218' ঠিকানাটি $0211 এবং $0212 এর মেমরি অবস্থানে রয়েছে৷ 'STA $0218' নির্দেশটি $0218 এর মেমরি অবস্থানে সঞ্চয়কারীর আট-বিট বিষয়বস্তু কপি করে। দুটি ষোল-বিট নম্বর যোগ করার ফলাফল হল 0101010101010100, যার মেমরির অবস্থানে 01010100 এর নিম্ন বাইটটি $0217 এবং 01010101-এর উচ্চতর বাইটটি $0218-এর মেমরি অবস্থানে - সামান্য endianness।

বিয়োগ
6502 µP সহ, স্বাক্ষরিত সংখ্যা দুটির পরিপূরক সংখ্যা। একটি দুটির পরিপূরক সংখ্যা আট-বিট, ষোল বিট বা আট বিটের যেকোনো একাধিক হতে পারে। দুইয়ের পরিপূরক সহ, বাম দিক থেকে প্রথম বিটটি সাইন বিট। একটি ধনাত্মক সংখ্যার জন্য, চিহ্নটি নির্দেশ করতে এই প্রথম বিটটি 0। বাকি বিটগুলো স্বাভাবিক পদ্ধতিতে সংখ্যা গঠন করে। একটি ঋণাত্মক সংখ্যার দুটির পরিপূরক পেতে, সংশ্লিষ্ট ধনাত্মক সংখ্যার জন্য সমস্ত বিট উল্টে দিন এবং তারপর ডান প্রান্ত থেকে ফলাফলে 1 যোগ করুন।

একটি ধনাত্মক সংখ্যা থেকে অন্য একটি ধনাত্মক সংখ্যা বিয়োগ করতে, সাবট্রাহেন্ডটি দুটির পরিপূরক ঋণাত্মক সংখ্যায় রূপান্তরিত হয়। তারপর, মিনুএন্ড এবং নতুন ঋণাত্মক সংখ্যা স্বাভাবিক পদ্ধতিতে যোগ করা হয়। সুতরাং, আট-বিট বিয়োগ হয়:

যেখানে বহনকে 1 হিসাবে ধরে নেওয়া হয়। সঞ্চয়কারীর ফলাফল হল দুটির পরিপূরকের পার্থক্য। সুতরাং, দুটি সংখ্যা বিয়োগ করতে, বহন পতাকা সেট করা আবশ্যক (1 করা)।

দুটি ষোল-বিট সংখ্যা বিয়োগ করার সময়, দুটি ষোল-বিট সংখ্যা যোগ করার মতো বিয়োগটি দ্বিগুণ করা হয়। যেহেতু বিয়োগ হল 6502 µP এর সাথে যোগের একটি ফর্ম, দুটি ষোল-বিট সংখ্যা বিয়োগ করার সময়, প্রথম বিয়োগের জন্য বহন পতাকাটি শুধুমাত্র একবার সেট করা হয়। দ্বিতীয় বিয়োগের জন্য, বহন পতাকার যেকোনো সেটিং স্বয়ংক্রিয়ভাবে সম্পন্ন হয়।

আট-বিট সংখ্যা বা ষোল বিট সংখ্যার জন্য বিয়োগ প্রোগ্রামিং একইভাবে যোগ প্রোগ্রামিং করা হয়। তবে ক্যারি পতাকা একেবারে শুরুতেই সেট করতে হবে। এটি করার স্মৃতিশক্তি হল:

ষোল-বিট ধনাত্মক সংখ্যার সাথে বিয়োগ
নিম্নলিখিত সংখ্যার সাথে বিয়োগ বিবেচনা করুন:

এই বিয়োগ দুটির পরিপূরক জড়িত নয়। যেহেতু 6502 µP-এ বিয়োগ দুটির পরিপূরক হিসাবে করা হয়, তাই ভিত্তি দুটিতে বিয়োগটি নিম্নরূপ করা হয়:

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

Minuend এর 16-বিট ইতিমধ্যেই দুটির পরিপূরক, বাম দিক থেকে 0 দিয়ে শুরু। সুতরাং, এটি বিট মধ্যে কোন সমন্বয় প্রয়োজন হয় না. 6502 µP এর সাথে, কোন পরিবর্তন ছাড়াই মিউএন্ডের নিম্ন বাইটটি সাবট্রাহেন্ডের দুটি পরিপূরকের নিম্ন বাইটে যোগ করা হয়। মিনুএন্ডের নীচের বাইটটি টু’স কমপ্লিমেন্টে রূপান্তরিত হয় না কারণ পুরো মিনুএন্ডের ষোলটি বিটকে ইতিমধ্যেই দুটির কমপ্লিমেন্টে থাকতে হবে (বাম দিকে প্রথম বিট হিসেবে 0 সহ)। এই প্রথম সংযোজনে, 1=0 SEC নির্দেশের কারণে 1 এর একটি বাধ্যতামূলক বহন যোগ করা হয়েছে।

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

পরবর্তী জিনিসটি কেবলমাত্র সেই সমস্ত স্কিমটিকে নিম্নরূপ কোড করা:

এসইসি
এলডিএ $0213
এসবিসি $0215
; কোন ক্লিয়ারিং কারণ উল্টানো বহন পতাকা মান প্রয়োজন হয়
STA $0217
এলডিএ $0214
এসবিসি $0216
STA $0218

মনে রাখবেন যে 6502 অ্যাসেম্বলি ভাষার সাথে, একটি সেমিকোলন একটি মন্তব্য শুরু করে যা মেমরিতে অনুবাদকৃত প্রোগ্রাম সংস্করণে অন্তর্ভুক্ত করা হয় না। বিয়োগের জন্য দুটি 16-বিট সংখ্যা পরম ঠিকানা সহ মেমরির চার বাইট দখল করে; দুই প্রতি সংখ্যা (মেমরি বাইটের একটি সিরিজ)। এই ইনপুটগুলি কীবোর্ড থেকে নয়৷ সংক্ষিপ্ত ফলাফল দুটি বাইট এবং এছাড়াও একটি ভিন্ন জায়গায় মেমরিতে স্থাপন করতে হবে। এই আউটপুট মনিটর বা প্রিন্টারে যায় না; এটা স্মৃতিতে যায়। এটি মোট 6 দেয় 10 = 6 16 ইনপুট এবং আউটপুটের জন্য বাইট মেমরিতে (RAM) স্থাপন করা হবে।

একটি প্রোগ্রাম কার্যকর করার আগে, এটি প্রথমে মেমরিতে থাকতে হবে। প্রোগ্রাম কোডের দিকে তাকিয়ে, এটি দেখা যায় যে মন্তব্য ছাড়া নির্দেশাবলী 19 তৈরি করে 10 = 13টি 16 বাইট যেহেতু এই অধ্যায়ের সমস্ত প্রোগ্রাম $0200 এর মেমরি অবস্থান থেকে শুরু হয়, তাই প্রোগ্রামটি মেমরিতে $0200 বাইট অবস্থান থেকে $0200 + $13 – $1 = $0212 বাইট অবস্থানে ($0200 থেকে শুরু করে $0201 নয়)। এই পরিসরে ইনপুট এবং আউটপুট বাইটের জন্য অঞ্চল অন্তর্ভুক্ত করা হয় না। দুটি ইনপুট নম্বর 4 বাইট নেয় এবং একটি আউটপুট নম্বর 2 বাইট নেয়। ইনপুট এবং আউটপুট সংখ্যার জন্য 6 বাইট যোগ করলে প্রোগ্রামটির পরিসর তৈরি হয় যা $0212 + $6 = $0218 এ শেষ হয়। প্রোগ্রামটির মোট দৈর্ঘ্য হল 19টি 16 = 25টি 10 .

মিনুএন্ডের নীচের বাইটটি $0213 ঠিকানায় হওয়া উচিত এবং একই মিনিটের উচ্চতর বাইটটি $0214 ঠিকানায় হওয়া উচিত - সামান্য শেষ। একইভাবে, সাবট্রাহেন্ডের নীচের বাইটটি $0215 ঠিকানায় হওয়া উচিত এবং একই সাবট্রাহেন্ডের উচ্চতর বাইটটি $0216 ঠিকানায় থাকা উচিত - সামান্য শেষ। ফলাফলের নিম্ন বাইট (পার্থক্য) $0217 ঠিকানায় হওয়া উচিত, এবং একই ফলাফলের উচ্চতর বাইটটি $0218 ঠিকানায় হওয়া উচিত - সামান্য শেষ।

38 এর অপকোড 16 এসইসির জন্য (উহ্য ঠিকানা) $0200 ঠিকানায় রয়েছে। এই অধ্যায়ের সমস্ত প্রোগ্রাম $0200 এর মেমরি অবস্থান থেকে শুরু হবে বলে ধরে নেওয়া হয়, সেখানে থাকা যে কোনও প্রোগ্রাম বাতিল করে; অন্যথায় বলা ছাড়া। 'LDA $0213' এর opcode, অর্থাৎ AD 16 , LDA এর জন্য (পরম ঠিকানা) $0201 বাইট অবস্থানে রয়েছে। Minuend এর নিম্ন বাইট যা 10111111 হল $0213 এর মেমরি বাইট অবস্থানে। মনে রাখবেন যে প্রতিটি অপকোড একটি বাইট দখল করে। 'LDA $0213' এর '$0213' ঠিকানাটি $0202 এবং $0203 এর বাইট অবস্থানে রয়েছে৷ 'এলডিএ $0213' নির্দেশটি সঞ্চয়কারীতে মিনিটের নিচের বাইট লোড করে।

'SBC $0215' এর opcode, অর্থাৎ ED 16 , SBC এর জন্য (পরম ঠিকানা) $0204 বাইট অবস্থানে রয়েছে। সাবট্রাহেন্ডের নিম্ন বাইট যা 01101010 হল $0215 বাইট অবস্থানে। 'ADC $0215' এর '$0215' ঠিকানাটি $0205 এবং $0206 এর বাইট অবস্থানে রয়েছে। 'SBC $0215' নির্দেশনাটি সাবট্রাহেন্ডের নিচের বাইটটিকে মিনুএন্ডের নিম্ন বাইট থেকে বিয়োগ করে যা ইতিমধ্যেই অ্যাকিউমুলেটরে রয়েছে। এটি দুটির পরিপূরক বিয়োগ। ফলাফল সঞ্চয়ক ফিরে স্থাপন করা হয়. অষ্টম বিটের পর যেকোনো ক্যারির পরিপূরক (বিপর্যয়) স্ট্যাটাস রেজিস্টারের ক্যারি ফ্ল্যাগে পাঠানো হয়। উচ্চতর বাইট সহ দ্বিতীয় বিয়োগের আগে এই বহন পতাকাটি অবশ্যই সাফ করা উচিত নয়। এই বহন স্বয়ংক্রিয়ভাবে উচ্চ বাইট বিয়োগ যোগ করা হয়.

মন্তব্য পরবর্তী 57 লাগে 10 = 3916 16 বাইট যাইহোক, এটি শুধুমাত্র '.asm' টেক্সট ফাইলে থাকে। স্মৃতিতে তা পৌঁছায় না। এটি অনুবাদ দ্বারা মুছে ফেলা হয় যা অ্যাসেম্বলার (একটি প্রোগ্রাম) দ্বারা করা হয়।

পরবর্তী নির্দেশের জন্য যা হল 'STA $0217', STA-এর অপকোড, অর্থাৎ 8D 16 (পরম ঠিকানা), $0207 বাইট অবস্থানে রয়েছে। 'STA $0217' এর '$0217' ঠিকানাটি $0208 এবং $0209 এর মেমরি অবস্থানে রয়েছে৷ 'STA $0217' নির্দেশটি $0217 এর মেমরি অবস্থানে সঞ্চয়কারীর আট-বিট বিষয়বস্তু কপি করে।

00101010 মিনুএন্ডের উচ্চতর বাইটটি $0214 এর মেমরি অবস্থানে এবং 00010101 এর সাবট্রাহেন্ডের উচ্চতর বাইটটি $0216 এর বাইট অবস্থানে রয়েছে। 'LDA $0214' এর opcode, অর্থাৎ AD 16 LDA (পরম ঠিকানা) এর জন্য, $020A বাইট অবস্থানে রয়েছে। 'LDA $0214' এর '$0214' ঠিকানা $020B এবং $020C এর অবস্থানে রয়েছে৷ 'LDA $0214' নির্দেশটি সঞ্চয়কারীর কাছে মিনিয়েন্ডের উচ্চতর বাইট লোড করে, যা সঞ্চয়কারীতে রয়েছে তা মুছে দেয়।

'SBC $0216' এর opcode, অর্থাৎ ED 16 SBC (পরম ঠিকানা) এর জন্য, $020D বাইট অবস্থানে রয়েছে। 'SBC $0216' এর '$0216' ঠিকানাটি $020E এবং $020F এর বাইট অবস্থানে রয়েছে৷ 'SBC $0216' নির্দেশনাটি সাবট্রাহেন্ডের উচ্চতর বাইটকে মিনুএন্ডের উচ্চতর বাইট (দুই এর পরিপূরক) থেকে বিয়োগ করে যা ইতিমধ্যেই সঞ্চয়কারীতে রয়েছে। ফলাফল আবার সঞ্চয়ক মধ্যে স্থাপন করা হয়. যদি এই দ্বিতীয় বিয়োগের জন্য 1-এর একটি ক্যারি থাকে, তবে এর পরিপূরকটি স্বয়ংক্রিয়ভাবে স্ট্যাটাস রেজিস্টারের বহন কক্ষে স্থাপন করা হয়। যদিও এই সমস্যার জন্য ষোড়শ বিট (বাম) এর বাইরে বহনের প্রয়োজন নেই, তবে ক্যারি পতাকা চেক করে পরিপূরক বহন হয় কিনা তা পরীক্ষা করা ভাল।

পরবর্তী এবং শেষ নির্দেশের জন্য যা হল 'STA $0218', STA-এর অপকোড, অর্থাৎ 8D 16 (পরম ঠিকানা), $0210 বাইট অবস্থানে আছে। 'STA $0218' এর '$0218' ঠিকানাটি $0211 এবং $0212 এর মেমরি অবস্থানে রয়েছে৷ 'STA $0218' নির্দেশটি $0218 এর মেমরি অবস্থানে সঞ্চয়কারীর আট-বিট বিষয়বস্তু কপি করে। দুটি ষোল-বিট সংখ্যার সাথে বিয়োগের ফলাফল হল 000101010101010101 এর মেমরি অবস্থানে 01010101 এর নিম্ন বাইটটি $0217 এর মেমরি অবস্থানে এবং 00010101 এর উচ্চতর বাইটটি $0218 - সামান্য শেষ।

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

4.4 লজিক্যাল অপারেশন

6502 µP-এ, OR-এর মেমোনিক হল ORA এবং এক্সক্লুসিভ OR-এর জন্য মেমোনিক হল EOR৷ লক্ষ্য করুন যে যৌক্তিক ক্রিয়াকলাপগুলির অন্তর্নিহিত ঠিকানা নেই। উহ্য ঠিকানা কোন অপারেন্ড লাগে না. লজিক্যাল অপারেটরদের প্রত্যেককে দুটি অপারেন্ড নিতে হবে। প্রথমটি সঞ্চয়কারীতে এবং দ্বিতীয়টি স্মৃতিতে বা নির্দেশে। ফলাফল (8-বিট) সঞ্চয়কারীতে ফিরে এসেছে। সঞ্চয়কারীর মধ্যে প্রথমটি হয় একটি তাৎক্ষণিক নির্দেশ দ্বারা সেখানে রাখা হয় বা পরম ঠিকানা সহ মেমরি থেকে অনুলিপি করা হয়। এই বিভাগে, চিত্রের জন্য শুধুমাত্র শূন্য-পৃষ্ঠার ঠিকানা ব্যবহার করা হয়। এই লজিক্যাল অপারেটর সব Bitwise অপারেটর হয়.

এবং
নিম্নলিখিত সারণীটি বিটওয়াইজ এবং বাইনারি, হেক্সাডেসিমেল এবং দশমিকে চিত্রিত করে:

এই অধ্যায়ের সমস্ত প্রোগ্রাম $0200 এর মেমরি বাইট অবস্থানে শুরু হওয়া উচিত। যাইহোক, 00000000 এর উচ্চতর বাইট ছাড়া পৃষ্ঠা শূন্যের ব্যবহার চিত্রিত করার লক্ষ্যে এই বিভাগের প্রোগ্রামগুলি পৃষ্ঠা শূন্যের মধ্যে রয়েছে 2 . পূর্ববর্তী ANDing নিম্নলিখিত হিসাবে কোড করা যেতে পারে:

LDA #$9A ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
এবং #$CD ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
STA $30; শূন্য-ভিত্তিক $0030 এ $88 সঞ্চয় করে

বা
নিম্নলিখিত সারণীটি বিটওয়াইজ বা বাইনারি, হেক্সাডেসিমেল এবং দশমিকে চিত্রিত করে:

LDA #$9A ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
ORA #$CD ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
STA $30; শূন্য-ভিত্তিক $0030 এ $CF সঞ্চয় করে

বিনামূল্যে
নিম্নলিখিত টেবিলটি বাইনারি, হেক্সাডেসিমেল এবং দশমিকে Bitwise XOR চিত্রিত করে:

LDA #$9A ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
EOR #$CD ; স্মৃতি থেকে নয় - অবিলম্বে ঠিকানা
STA $30; শূন্য-ভিত্তিক $0030 এ $57 সঞ্চয় করে

4.5 শিফট এবং ঘোরানো অপারেশন

শিফট এবং রোটেট অপারেটরগুলির জন্য স্মৃতিবিদ্যা এবং অপকোডগুলি হল:

ASL: খালি করা ডানদিকের কক্ষে 0 ঢোকানো, সঞ্চয়কারী বা মেমরি অবস্থানের এক বিট বামে স্থানান্তর করুন।

LSR: খালি করা বাম কক্ষে 0 ঢোকানো, সঞ্চয়কারী বা মেমরি অবস্থানের এক বিট ডানদিকে সরান।
ROL: অ্যাকিউমুলেটর বা মেমরি অবস্থানের এক বিট বাম দিকে ঘোরান, বাম দিকে বাদ দেওয়া বিটটি খালি করা ডানদিকের ঘরে ঢুকিয়ে দিন।
ROR: অ্যাকিউমুলেটর বা মেমরি অবস্থানের এক বিট ডানদিকে ঘোরান, ডানদিকে বাদ দেওয়া বিটটি খালি করা বামদিকের ঘরে ঢুকিয়ে দিন।

সঞ্চয়কারীর সাথে একটি স্থানান্তর বা ঘূর্ণন করতে, নির্দেশনাটি এরকম:

এলএসআর এ

এটি অ্যাকুমুলেটর অ্যাড্রেসিং মোড নামে আরেকটি অ্যাড্রেসিং মোড ব্যবহার করে।

একটি বাইট মেমরি অবস্থানের সাথে একটি শিফট বা ঘূর্ণন করতে, নির্দেশনাটি এরকম কিছু:

ROR $2BCD

যেখানে 2BCD মেমরি অবস্থান।

মনে রাখবেন যে স্থানান্তর বা ঘূর্ণনের জন্য কোনও তাত্ক্ষণিক বা অন্তর্নিহিত ঠিকানা মোড নেই৷ কোন অবিলম্বে ঠিকানা মোড নেই কারণ শুধুমাত্র নির্দেশে থাকা একটি সংখ্যা স্থানান্তর বা ঘোরানোর কোন মানে নেই। কোন অন্তর্নিহিত ঠিকানা মোড নেই কারণ 6502 µP-এর ডিজাইনাররা চান শুধুমাত্র সঞ্চয়কারীর বিষয়বস্তু (এ রেজিস্টার) বা একটি মেমরি বাইট অবস্থান স্থানান্তরিত বা ঘোরানো হোক।

4.6 আপেক্ষিক ঠিকানা মোড

মাইক্রোপ্রসেসর সর্বদা (1, 2, বা 3 ইউনিট দ্বারা) প্রোগ্রাম কাউন্টার (PC) বৃদ্ধি করে পরবর্তী নির্দেশের দিকে নির্দেশ করতে যা কার্যকর করা হবে। 6502 µP-এর একটি নির্দেশনা রয়েছে যার স্মৃতিচিহ্ন হল BVS যার অর্থ ওভারফ্লো সেটের শাখা। পিসি দুটি বাইট নিয়ে গঠিত। এই নির্দেশের ফলে পরবর্তী নির্দেশ কার্যকর করার জন্য পিসির একটি ভিন্ন মেমরির ঠিকানা থাকে যা স্বাভাবিক বৃদ্ধির ফলে নয়। এটি পিসির সামগ্রীতে অফসেট নামে একটি মান যোগ বা বিয়োগ করে তা করে। এবং তাই, পিসি তখন কম্পিউটারের জন্য একটি ভিন্ন (শাখাযুক্ত) মেমরি অবস্থান নির্দেশ করে যাতে সেখান থেকে এক্সিকিউট করা যায়। অফসেট হল -128 থেকে একটি পূর্ণসংখ্যা 10 +127 পর্যন্ত 10 (দুই এর পরিপূরক)। সুতরাং, অফসেট মেমরিতে এগিয়ে যেতে পারে। যদি ইতিবাচক হয় বা স্মৃতিতে পিছনে থাকে, বা নেতিবাচক হলে।

BVS নির্দেশে শুধুমাত্র একটি অপারেন্ড লাগে যা অফসেট। BVS আপেক্ষিক ঠিকানা ব্যবহার করে। নিম্নলিখিত নির্দেশাবলী বিবেচনা করুন:

BVS $7F

বেস দুই, 7F এইচ হল 01111111 2 = 127টি 10 . অনুমান করুন যে পরবর্তী নির্দেশের জন্য পিসিতে সামগ্রী $0300। BVS নির্দেশের কারণে $7F (একটি ইতিবাচক সংখ্যা ইতিমধ্যেই দুইজনের পরিপূরক) $0300-এ যোগ করতে $037F দিতে হবে। সুতরাং, পরবর্তী নির্দেশনাটি $0300 এর মেমরি অবস্থানে কার্যকর করার পরিবর্তে, এটি $037F (প্রায় অর্ধেক পৃষ্ঠার পার্থক্য) মেমরি অবস্থানে।

অন্যান্য শাখা নির্দেশাবলী আছে, কিন্তু BVS আপেক্ষিক ঠিকানা চিত্রিত করার জন্য ব্যবহার করা খুব ভাল একটি। আপেক্ষিক ঠিকানা শাখা নির্দেশাবলীর সাথে সম্পর্কিত।

4.7 ইনডেক্সড অ্যাড্রেসিং এবং পরোক্ষ অ্যাড্রেসিং আলাদাভাবে

এই অ্যাড্রেসিং মোডগুলি 6502 µP কম নির্দেশাবলীর সাথে অল্প সময়ের মধ্যে প্রচুর পরিমাণে ডেটা পরিচালনা করতে সক্ষম করে। সম্পূর্ণ কমডোর-64 মেমরির জন্য 64KB অবস্থান রয়েছে। সুতরাং, 16 বিটের যেকোনো বাইট অবস্থান অ্যাক্সেস করতে, দুটি বাইট তৈরি করতে হবে। দুটি বাইটের প্রয়োজনের একমাত্র ব্যতিক্রম হল পৃষ্ঠা শূন্যের জন্য যেখানে $00 এর উচ্চতর বাইটটি মেমরিতে নির্দেশের দ্বারা নেওয়া স্থানটিকে সাশ্রয়ী করার জন্য বাদ দেওয়া হয়। একটি নন-পেজ-জিরো অ্যাড্রেসিং মোডের সাথে, 16-বিট মেমরি অ্যাড্রেসের উচ্চ এবং নিম্ন বাইট উভয়ই বেশিরভাগ ক্ষেত্রেই নির্দেশিত হয়।

বেসিক ইনডেক্সড অ্যাড্রেসিং

পরম সূচক ঠিকানা
মনে রাখবেন X বা Y রেজিস্টারকে ইনডেক্স রেজিস্টার বলা হয়। নিম্নলিখিত নির্দেশাবলী বিবেচনা করুন:

LDA $C453, X

ধরে নিলাম 6 এর মান এইচ এক্স রেজিস্টারে আছে। উল্লেখ্য, নির্দেশের কোথাও 6 টাইপ করা হয়নি। এই নির্দেশটি 6H-এর মান C453-এ যোগ করে এইচ যা টেক্সট ফাইলে টাইপ করা নির্দেশের অংশ যা এখনও একত্রিত করা বাকি - C453 এইচ +6 এইচ = C459 এইচ . এলডিএ মানে অ্যাকিউমুলেটরে একটি বাইট লোড করা। সঞ্চয়কারীতে লোড করা বাইটটি $C459 ঠিকানা থেকে আসে। $C459 যা $C453 এর সমষ্টি যা নির্দেশের সাথে টাইপ করা হয়েছে এবং 6 এইচ যেটি এক্স রেজিস্টারে পাওয়া যায় সেটি কার্যকর ঠিকানা হয়ে ওঠে যেখান থেকে অ্যাকিউমুলেটরে লোড করা বাইটটি আসে। যদি 6 এইচ Y রেজিস্টারে ছিল, নির্দেশে X-এর জায়গায় Y টাইপ করা হয়েছে।

টাইপ করা নির্দেশনা বিবৃতিতে, $C453 বেস ঠিকানা এবং 6 হিসাবে পরিচিত এইচ X বা Y রেজিস্টারে কার্যকর ঠিকানার জন্য গণনা বা সূচক অংশ হিসাবে পরিচিত। বেস অ্যাড্রেস মেমরির যেকোনো বাইট অ্যাড্রেস এবং পরবর্তী 256-কে উল্লেখ করতে পারে 10 ঠিকানাগুলি অ্যাক্সেস করা যেতে পারে, ধরে নেওয়া যায় যে X বা Y রেজিস্টারে সূচনা সূচক (বা গণনা) 0। মনে রাখবেন যে একটি বাইট 256 পর্যন্ত একটানা রেঞ্জ দিতে পারে 10 সংখ্যা (যেমন 00000000 2 11111111 পর্যন্ত 2 )

সুতরাং, পরম ঠিকানা X বা Y রেজিস্টারে ইতিমধ্যেই যা কিছু রাখা হয়েছে (অন্য নির্দেশ দ্বারা দেওয়া হয়েছে) যোগ করে 16টি ঠিকানা যা কার্যকর ঠিকানা পাওয়ার জন্য নির্দেশের সাথে টাইপ করা হয়েছে। টাইপ করা নির্দেশনায়, দুটি সূচক রেজিস্টারকে X বা Y দ্বারা আলাদা করা হয় যা কমা দিয়ে টাইপ করা হয়। হয় X বা Y টাইপ করা হয়; উভয় নয়

সমস্ত প্রোগ্রামটি একটি টেক্সট এডিটরে টাইপ করার পরে এবং '.asm' এক্সটেনশন ফাইলের নাম দিয়ে সংরক্ষিত হওয়ার পরে, অ্যাসেম্বলারকে, যা অন্য একটি প্রোগ্রাম, মেমরিতে যা (লোড) আছে তাতে টাইপ করা প্রোগ্রামটিকে অনুবাদ করতে হবে। পূর্ববর্তী নির্দেশ, যা 'LDA $C453,X', মেমরিতে তিনটি বাইট অবস্থান দখল করে, পাঁচটি নয়।

মনে রাখবেন যে এলডিএর মতো একটি স্মৃতির একাধিক অপকোড (বিভিন্ন বাইট) থাকতে পারে। X রেজিস্টার ব্যবহার করে নির্দেশের অপকোডটি Y রেজিস্টার ব্যবহার করা অপকোড থেকে আলাদা। টাইপ করা নির্দেশের উপর ভিত্তি করে কোন অপকোড ব্যবহার করতে হবে তা অ্যাসেম্বলার জানে। 'LDA $C453,X' এর এক বাইট অপকোড 'LDA $C453,Y' এর জন্য এক বাইট অপকোড থেকে আলাদা। প্রকৃতপক্ষে, 'LDA $C453,X'-এ LDA-এর অপকোড হল BD, এবং 'LDA $C453,9'-এ LDA-এর অপকোড হল BD৷

যদি LDA-এর opcode $0200 বাইট অবস্থানে থাকে। তারপর, $C453-এর 16-বিট ঠিকানাটি মেমরির বাইট অবস্থানগুলির পরেরটি নেয় যেগুলি হল $0201 এবং $0202৷ নির্দিষ্ট অপকোড বাইট নির্দেশ করে যে এটি এক্স রেজিস্টার বা ওয়াই রেজিস্টার যেটি জড়িত। এবং তাই, একত্রিত ভাষা নির্দেশনা যা হল 'LDA $C453,X' বা 'LDA $C453,Y' মেমরিতে পরপর তিনটি বাইট দখল করে, চার বা পাঁচটি নয়।

জিরো-পেজ ইন্ডেক্সড অ্যাড্রেসিং
শূন্য-পৃষ্ঠার সূচী ঠিকানাটি সম্পূর্ণ সূচক ঠিকানার মতো যা পূর্বে বর্ণিত হয়েছে, তবে লক্ষ্য বাইটটি কেবলমাত্র শূন্য পৃষ্ঠায় ($0000 থেকে $00FF পর্যন্ত) হতে হবে। এখন, শূন্য পৃষ্ঠার সাথে কাজ করার সময়, উচ্চতর বাইট যা সর্বদা 00 হয় এইচ মেমরি অবস্থানের জন্য সাধারণত এড়ানো হয়. সুতরাং, এটি সাধারণত উল্লেখ করা হয় যে পৃষ্ঠা শূন্য $00 থেকে FF পর্যন্ত শুরু হয়। এবং তাই, 'LDA $C453,X' এর পূর্ববর্তী নির্দেশনা হল:

LDA $53.X

$C4, একটি উচ্চতর বাইট যা পৃষ্ঠা শূন্যের উপরে একটি পৃষ্ঠাকে নির্দেশ করে, এই নির্দেশে নিযুক্ত করা যাবে না কারণ এটি প্রত্যাশিত লক্ষ্য বাইটটিকে পৃষ্ঠা শূন্যের বাইরে এবং উপরে জমা করা বাইটের মধ্যে লোড করার জন্য রাখে।

নির্দেশে টাইপ করা মানটি যখন ইনডেক্স রেজিস্টারের মানের সাথে যোগ করা হয়, তখন যোগফলটি পৃষ্ঠা শূন্যের উপরে ফলাফল দেওয়া উচিত নয় (FF এইচ ) সুতরাং, 'LDA $FF, X' এর মতো একটি নির্দেশ এবং FF এর মতো একটি মান থাকা প্রশ্নের বাইরে। এইচ সূচক রেজিস্টারে কারণ FF এইচ + এফএফ এইচ = 200 এইচ যেটি মেমরিতে পৃষ্ঠা 2 (তৃতীয় পৃষ্ঠা) এর প্রথম বাইট ($0200) অবস্থান, এটি পৃষ্ঠা 0 থেকে একটি বড় দূরত্ব। তাই, শূন্য-পৃষ্ঠা সূচীযুক্ত ঠিকানার সাথে, কার্যকর ঠিকানাটি অবশ্যই পৃষ্ঠা শূন্যের মধ্যে থাকবে।

পরোক্ষ সম্বোধন

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

JMP $8765

মেমরিতে এক্সিকিউটিং প্রোগ্রামটি যে ঠিকানায় অ্যাক্সেস করেছে তা থেকে লাফিয়ে $8765 এ চলে যায়। JMP মেমোনিকের তিনটি অপকোড রয়েছে যা হল 4C, 6C এবং 7C। এই পরম ঠিকানার জন্য opcode হল 4C। JMP পরম পরোক্ষ ঠিকানার জন্য opcode হল 6C (নিম্নলিখিত চিত্রগুলি পড়ুন)।

পরোক্ষ অ্যাড্রেসিং
এটি শুধুমাত্র জাম্প (JMP) নির্দেশের সাথে ব্যবহার করা হয়। অনুমান করুন যে ঠিকানাটিতে আগ্রহের বাইট রয়েছে (টার্গেট বাইট) হল $8765৷ এটি 16-বিট যা দুটি বাইট নিয়ে গঠিত: উচ্চতর বাইট যা 87 এইচ এবং নিম্ন বাইট যা 65 এইচ . পরোক্ষ অ্যাড্রেসিং সহ, এই দুটি বাইট আসলে মেমরির অন্য কোথাও পরপর দুটি বাইট অবস্থানে অবস্থিত।

অনুমান করুন যে তারা $0210 এবং $0211 এর মেমরি অবস্থানে অবস্থিত। তারপর, আগ্রহের ঠিকানার নীচের বাইট যা 65 এইচ $0210 ঠিকানায় রয়েছে এবং উচ্চতর বাইট যা 87 এইচ $0211 ঠিকানায় আছে। এর মানে হল যে আগ্রহের নিম্ন মেমরি বাইট নিম্ন পরপর ঠিকানায় যায়, এবং আগ্রহের উচ্চ মেমরি বাইট উচ্চতর পরপর ঠিকানায় যায় - সামান্য শেষ।

16-বিট ঠিকানাটি মেমরিতে পরপর দুটি ঠিকানা উল্লেখ করতে পারে। সেই আলোকে, $0210 ঠিকানাটি $0210 এবং $0211 এর ঠিকানাগুলিকে বোঝায়। $0210 এবং $0211-এর ঠিকানা জোড়া লক্ষ্য বাইটের চূড়ান্ত ঠিকানা (দুটি বাইটের 16-বিট) ধরে রাখে, যার নিম্ন বাইটটি 65। এইচ 0210 ডলারে এবং 87 এর উচ্চতর বাইট এইচ $0211-এ। সুতরাং, টাইপ করা জাম্প নির্দেশ হল:

JMP ($0210)

JMP মেমোনিকের তিনটি অপকোড রয়েছে যা হল 4C, 6C এবং 7C। পরম পরোক্ষ ঠিকানার জন্য opcode হল 6C। টেক্সট ফাইলে যা টাইপ করা হয়েছে তা হল 'JMP ($0210)'। বন্ধনীর কারণে, অ্যাসেম্বলার (অনুবাদক) JMP-এর জন্য opcode 6C ব্যবহার করে, 4C বা 7C নয়।

পরোক্ষ অ্যাড্রেসিংয়ের সাথে, আসলে তিনটি মেমরি অঞ্চল রয়েছে। প্রথম অঞ্চলে $0200, $0201, এবং $0202 এর বাইট অবস্থান থাকতে পারে। এটিতে 'JMP ($0210)' নির্দেশের জন্য তিনটি বাইট রয়েছে। দ্বিতীয় অঞ্চল, যা প্রথমটির পাশে অগত্যা নয়, পরপর দুটি বাইট অবস্থান নিয়ে গঠিত $0210 এবং $0211৷ এটি এখানে নিম্ন বাইট ($0210) যা সমাবেশ ভাষা প্রোগ্রাম নির্দেশে টাইপ করা হয়। সুদের ঠিকানা $8765 হলে, 65 এর নিচের বাইট এইচ $0210 বাইট অবস্থানে, এবং 87 এর উচ্চতর বাইট এইচ $0211 বাইট অবস্থানে আছে। তৃতীয় অঞ্চলটি মাত্র একটি বাইট অবস্থান নিয়ে গঠিত। এটি টার্গেটেড বাইটের (সুদের চূড়ান্ত বাইট) জন্য $8765 ঠিকানা। পরপর অ্যাড্রেসের জোড়া, $0210 এবং $0211, $8765 পয়েন্টার ধারণ করে যা আগ্রহের ঠিকানা। কম্পিউটিং ব্যাখ্যার পরে, এটি $8765 যা পিসি (প্রোগ্রাম কাউন্টার) এ লক্ষ্য বাইট অ্যাক্সেস করতে যায়।

শূন্য পাতা পরোক্ষ ঠিকানা
এই অ্যাড্রেসিংটি পরোক্ষ পরোক্ষ অ্যাড্রেসিংয়ের মতোই, তবে পয়েন্টারটি অবশ্যই পৃষ্ঠা শূন্যে থাকতে হবে। পয়েন্টার অঞ্চলের নিম্ন বাইট ঠিকানাটি নিম্নরূপ টাইপ করা নির্দেশে যা রয়েছে:

JMP ($50)

পয়েন্টারের উচ্চতর বাইটটি $51 বাইট অবস্থানে রয়েছে। কার্যকর ঠিকানা (পয়েন্টেড) পৃষ্ঠা শূন্যে থাকতে হবে না।

সুতরাং, ইনডেক্স অ্যাড্রেসিংয়ের সাথে, একটি সূচক রেজিস্টারের মানটি মূল ঠিকানায় যুক্ত করা হয় যা কার্যকর ঠিকানার নির্দেশে দেওয়া হয়। পরোক্ষ ঠিকানা একটি পয়েন্টার ব্যবহার করে।

4.8 ইনডেক্সড পরোক্ষ অ্যাড্রেসিং

পরম সূচীযুক্ত পরোক্ষ ঠিকানা
এই অ্যাড্রেসিং মোড শুধুমাত্র JMP নির্দেশের সাথে ব্যবহার করা হয়।
পরম পরোক্ষ অ্যাড্রেসিংয়ের সাথে, তার নিজস্ব দুটি পরপর বাইট ঠিকানা সহ পয়েন্টেড মান (বাইট) থাকে। এই দুটি পরপর অ্যাড্রেস মেমরিতে পরপর দুটি বাইটের পয়েন্টার অঞ্চলে পয়েন্টার গঠন করে। পয়েন্টার অঞ্চলের নিম্ন বাইট হল বন্ধনীর নির্দেশে যা টাইপ করা হয়েছে। পয়েন্টার হল পয়েন্টেড মানের ঠিকানা। পূর্ববর্তী পরিস্থিতিতে, $8765 হল পয়েন্টেড মানের ঠিকানা। $0210 ($0211 দ্বারা অনুসরণ করা) হল ঠিকানা যার বিষয়বস্তু হল $8765 যা পয়েন্টার। পরোক্ষ অ্যাড্রেসিং মোডের সাথে, এটি ($0210) যা প্রোগ্রামে (টেক্সট ফাইল) টাইপ করা হয়, বন্ধনী সহ।

অন্যদিকে, পরোক্ষ সূচকযুক্ত পরোক্ষ ঠিকানা মোডের সাথে, টাইপ করা ঠিকানায় X রেজিস্টারে মান যোগ করে পয়েন্টার অঞ্চলের জন্য নিম্ন ঠিকানা বাইট গঠিত হয়। উদাহরণস্বরূপ, যদি পয়েন্টারটি ঠিকানার অবস্থানে থাকে $0210, টাইপ করা নির্দেশনাটি এরকম কিছু হতে পারে:

JMP ($020A,X)

যেখানে X রেজিস্টারের মান 6 এইচ . 020A এইচ +6 এইচ = 0210 এইচ . এই অ্যাড্রেসিং মোডের সাথে Y রেজিস্টার ব্যবহার করা হয় না।

জিরো পেজ ইনডেক্সড ইনডাইরেক্ট অ্যাড্রেসিং
এই অ্যাড্রেসিং মোড X রেজিস্টার ব্যবহার করে এবং Y রেজিস্টার নয়। এই অ্যাড্রেসিং মোডের সাথে, এর দুই-বাইট ঠিকানা পয়েন্টার অঞ্চলে পয়েন্টেড মান এবং পয়েন্টার রয়েছে। পয়েন্টারের জন্য পৃষ্ঠা শূন্যে পরপর দুটি বাইট থাকতে হবে। নির্দেশে যে ঠিকানাটি টাইপ করা হয়েছে তা হল একটি এক বাইট ঠিকানা। এই মানটি X রেজিস্টারে থাকা মানের সাথে যোগ করা হয় এবং যেকোনো বহন বাতিল করা হয়। ফলাফলটি পৃষ্ঠা 0-এ পয়েন্টার অঞ্চলকে নির্দেশ করে। উদাহরণস্বরূপ, যদি আগ্রহের ঠিকানা (পয়েন্টেড) হয় $8765 এবং এটি পৃষ্ঠা 0-এর $50 এবং $51-এর বাইট অবস্থানে থাকে এবং X রেজিস্টারে মান $30 হয়, টাইপ করা নির্দেশ এইরকম কিছু:

LDA ($20.X)

কারণ $20 + $30 = $50।

পরোক্ষ ইনডেক্সড অ্যাড্রেসিং
এই অ্যাড্রেসিং মোডটি Y রেজিস্টার ব্যবহার করে এবং X রেজিস্টার নয়। এই অ্যাড্রেসিং মোডের সাথে, এখনও পয়েন্টার মান এবং পয়েন্টার অঞ্চল রয়েছে, তবে পয়েন্টার অঞ্চলের বিষয়বস্তু ভিন্নভাবে কাজ করে। পয়েন্টার অঞ্চলের জন্য পৃষ্ঠা জিরোতে অবশ্যই দুটি পরপর বাইট থাকতে হবে। নির্দেশে পয়েন্টার অঞ্চলের নীচের ঠিকানাটি টাইপ করা হয়েছে। পয়েন্টার অঞ্চলে থাকা এই সংখ্যাটি (বাইটের জোড়া) আসল পয়েন্টার পাওয়ার জন্য Y রেজিস্টারের মানের সাথে যোগ করা হয়। উদাহরণস্বরূপ, আগ্রহের ঠিকানা (পয়েন্টেড) হতে দিন $8765, Y রেজিস্টারে 6H এর মান এবং সংখ্যা (দুই বাইট) 50 এর ঠিকানায় এইচ এবং 51 এইচ . দুটি বাইট একসাথে $875F থেকে $875F + $6 = $8765। টাইপ করা নির্দেশনাটি এরকম কিছু:

LDA ($50), Y

4.9 বৃদ্ধি, হ্রাস, এবং পরীক্ষা-বিট নির্দেশাবলী

নিম্নলিখিত সারণী বৃদ্ধি এবং হ্রাস নির্দেশাবলীর অপারেশন দেখায়:

INA এবং DEA যথাক্রমে সঞ্চয়কারীকে বৃদ্ধি এবং হ্রাস করে। যে সঞ্চয়কারী ঠিকানা বলা হয়. INX, DEX, INY, এবং DEY যথাক্রমে X এবং Y রেজিস্টারের জন্য। তারা কোন অপারেন্ড নেয় না। সুতরাং, তারা অন্তর্নিহিত ঠিকানা মোড ব্যবহার করে। ইনক্রিমেন্ট মানে রেজিস্টার বা মেমরি বাইটে 1 যোগ করা। Decrement মানে রেজিস্টার বা মেমরি বাইট থেকে 1 বিয়োগ করা।

INC এবং DEC যথাক্রমে একটি মেমরি বাইট বৃদ্ধি এবং হ্রাস করে (এবং একটি রেজিস্টার নয়)। পরম ঠিকানার পরিবর্তে শূন্য পৃষ্ঠার ঠিকানা ব্যবহার করা হল নির্দেশের জন্য মেমরিকে সাশ্রয়ী করা। জিরো পেজ অ্যাড্রেসিং মেমরিতে নির্দেশের জন্য পরম অ্যাড্রেসিং থেকে এক বাইট কম। যাইহোক, জিরো পেজ অ্যাড্রেসিং মোড শুধুমাত্র পৃষ্ঠা শূন্যকে প্রভাবিত করে।

বিআইটি নির্দেশনা মেমরির একটি বাইটের বিটগুলিকে সঞ্চয়কারীর 8 বিটগুলির সাথে পরীক্ষা করে, কিন্তু কোনটিই পরিবর্তন করে না। শুধুমাত্র প্রসেসর স্ট্যাটাস রেজিস্টার 'P' এর কিছু পতাকা সেট করা আছে। নির্দিষ্ট মেমরি অবস্থানের বিটগুলি যৌক্তিকভাবে সঞ্চয়কারীর সাথে AND করা হয়। তারপর, নিম্নলিখিত স্থিতি বিট সেট করা হয়:

  • N যা বিট 7 এবং স্ট্যাটাস রেজিস্টারের শেষ বিট (বামে), ANDing এর আগে মেমরি অবস্থানের বিট 7 গ্রহণ করে।
  • V যা স্ট্যাটাস রেজিস্টারের বিট 6 এবং ANDing এর আগে মেমরি অবস্থানের বিট 6 পায়।
  • AND-এর ফলাফল শূন্য হলে (00000000) স্ট্যাটাস রেজিস্টারের Z পতাকা সেট করা হয় (1 তৈরি করা হয়) 2 ) অন্যথায়, এটি সাফ করা হয় (0 তৈরি)।

4.10 নির্দেশাবলী তুলনা করুন

6502 µP-এর জন্য তুলনামূলক নির্দেশনা স্মৃতিবিদ্যা হল CMP, CPX, এবং CPY। প্রতিটি তুলনার পরে, প্রসেসর স্ট্যাটাস রেজিস্টার 'P' এর N, Z, এবং C পতাকাগুলি প্রভাবিত হয়৷ ফলাফলটি একটি ঋণাত্মক সংখ্যা হলে N পতাকা সেট করা হয় (1 তৈরি করা হয়)। ফলাফলটি শূন্য (000000002) হলে Z পতাকা সেট করা হয় (1 তৈরি করা হয়)। সি পতাকা সেট করা হয় (তৈরি করা 1) যখন আট থেকে নবম বিট পর্যন্ত একটি বহন থাকে। নিম্নলিখিত সারণী একটি বিশদ চিত্র দেয়

মানে 'এর চেয়ে বড়'। এর সাথে, তুলনা টেবিলটি স্ব-ব্যাখ্যামূলক হওয়া উচিত।

4.11 জাম্প এবং শাখা নির্দেশাবলী

নিচের সারণীতে লাফানো এবং শাখা নির্দেশাবলীর সংক্ষিপ্ত বিবরণ রয়েছে:

JMP নির্দেশ পরম এবং পরোক্ষ ঠিকানা ব্যবহার করে। টেবিলের বাকি নির্দেশাবলী শাখা নির্দেশাবলী. তারা 6502 µP এর সাথে শুধুমাত্র আপেক্ষিক ঠিকানা ব্যবহার করে। এর সাথে, টেবিলটি স্ব-ব্যাখ্যামূলক হয়ে ওঠে যদি এটি বাম থেকে ডানে এবং উপরে থেকে নীচে পড়া হয়।

উল্লেখ্য যে শাখাগুলি শুধুমাত্র প্রদত্ত ঠিকানা থেকে -128 থেকে +127 বাইটের মধ্যে থাকা ঠিকানাগুলিতে প্রয়োগ করা যেতে পারে। এই আপেক্ষিক ঠিকানা. JMP এবং শাখা নির্দেশাবলী উভয়ের জন্য, প্রোগ্রাম কাউন্টার (PC) সরাসরি প্রভাবিত হয়। 6502 µP শাখাগুলিকে একটি পরম ঠিকানার অনুমতি দেয় না, যদিও লাফটি পরম ঠিকানা করতে পারে। JMP নির্দেশ একটি শাখা নির্দেশ নয়.

বিঃদ্রঃ: আপেক্ষিক ঠিকানা শুধুমাত্র শাখা নির্দেশাবলীর সাথে ব্যবহার করা হয়।

4.12 স্ট্যাক এলাকা

একটি সাবরুটিন হল দুটি সংখ্যা যোগ করার বা দুটি সংখ্যা বিয়োগ করার পূর্ববর্তী সংক্ষিপ্ত প্রোগ্রামগুলির একটির মতো। মেমরিতে স্ট্যাক এলাকা $0100 থেকে $01FF সমেত শুরু হয়। এই এলাকাটিকে সহজভাবে স্ট্যাক বলা হয়। যখন মাইক্রোপ্রসেসর সাবরুটিন নির্দেশে একটি লাফ দেয় (JSR - নিম্নলিখিত আলোচনা পড়ুন), এটি শেষ হলে কোথায় ফিরতে হবে তা জানতে হবে। 6502 µP এই তথ্য (ফেরত ঠিকানা) কম মেমরিতে রাখে $0100 থেকে $01FF (স্ট্যাক এলাকা) এবং স্ট্যাক পয়েন্টার রেজিস্টার বিষয়বস্তু ব্যবহার করে যা মাইক্রোপ্রসেসরে 'S' একটি পয়েন্টার হিসাবে (9 বিট) শেষ ফিরে আসা ঠিকানায় যেটি মেমরির পৃষ্ঠা 1 ($0100 থেকে $01FF) এ সংরক্ষণ করা হয়। স্ট্যাকটি $01FF থেকে নিচের দিকে বৃদ্ধি পায় এবং 128 স্তর গভীর পর্যন্ত সাবরুটিনগুলিকে নেস্ট করা সম্ভব করে৷

স্ট্যাক পয়েন্টারের আরেকটি ব্যবহার হ'ল বাধাগুলি পরিচালনা করা। 6502 µP-এ IRQ এবং NMI হিসাবে লেবেলযুক্ত পিন রয়েছে৷ এই পিনগুলিতে কিছু ছোট বৈদ্যুতিক সংকেত প্রয়োগ করা সম্ভব এবং 6502 µP একটি প্রোগ্রাম চালানো বন্ধ করে এবং এটি অন্যটি কার্যকর করা শুরু করে। এই ক্ষেত্রে, প্রথম প্রোগ্রাম বিঘ্নিত হয়। সাবরুটিনের মতো, ইন্টারাপ্ট কোড সেগমেন্টগুলি নেস্ট করা যেতে পারে। বিঘ্নিত প্রক্রিয়াকরণ পরবর্তী অধ্যায়ে আলোচনা করা হয়েছে.

বিঃদ্রঃ : স্ট্যাক পয়েন্টারে $0100 থেকে $01FF পর্যন্ত অবস্থানগুলিকে অ্যাড্রেস করার জন্য নিম্ন বাইট ঠিকানার জন্য 8 বিট রয়েছে। 00000001 এর উচ্চতর বাইট 2 অনুমান করা হচ্ছে.

নিম্নলিখিত সারণীটি নির্দেশনা দেয় যা স্ট্যাক পয়েন্টার 'S' কে A, X, Y, এবং P রেজিস্টারের সাথে মেমরির স্ট্যাক এলাকার সাথে সম্পর্কিত করে:

4.13 সাবরুটিন কল এবং রিটার্ন

একটি সাবরুটিন হল নির্দেশের একটি সেট যা একটি নির্দিষ্ট উদ্দেশ্য অর্জন করে। পূর্ববর্তী যোগ বা বিয়োগ প্রোগ্রাম একটি খুব সংক্ষিপ্ত সাবরুটিন. সাবরুটিনগুলিকে কখনও কখনও কেবল রুটিন বলা হয়। একটি সাবরুটিন কল করার নির্দেশনা হল:

JSR: সাবরুটিনে ঝাঁপ দাও

একটি সাবরুটিন থেকে ফিরে আসার নির্দেশনা হল:

RTS: সাবরুটিন থেকে ফিরে যান

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

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

JSR এবং RTS এর ব্যবহারের জন্য নিম্নলিখিত চিত্রটি দেখুন:

4.14 একটি কাউন্ট ডাউন লুপের উদাহরণ

নিম্নলিখিত সাবরুটিন $FF থেকে $00 পর্যন্ত গণনা করা হয়েছে (মোট 256টি 10 গণনা):

LDX #$FF শুরু করুন; $FF = 255 দিয়ে X লোড করুন
লুপ DEX; X = X – 1
BNE লুপ; যদি X শূন্য না হয় তাহলে লুপ যান
আরটিএস; প্রত্যাবর্তন

প্রতিটি লাইন একটি মন্তব্য আছে. মন্তব্য মৃত্যুদন্ডের জন্য স্মৃতিতে যান না. অ্যাসেম্বলার (অনুবাদক) যে একটি প্রোগ্রামকে মেমরিতে যা আছে তাতে রূপান্তরিত করে (চলতে) সবসময় মন্তব্য বন্ধ করে দেয়। একটি মন্তব্য ';' দিয়ে শুরু হয় . এই প্রোগ্রামের 'স্টার্ট' এবং 'লুপ' কে লেবেল বলা হয়। নির্দেশের ঠিকানার জন্য একটি লেবেল (নাম) সনাক্ত করে। নির্দেশটি যদি একটি একক বাইট নির্দেশনা হয় (উহ্য ঠিকানা), লেবেলটি সেই নির্দেশের ঠিকানা। যদি নির্দেশটি একটি মাল্টিবাইট নির্দেশনা হয়, তাহলে লেবেলটি মাল্টিবাইট নির্দেশের জন্য প্রথম বাইট সনাক্ত করে। এই প্রোগ্রামের জন্য প্রথম নির্দেশ দুটি বাইট নিয়ে গঠিত। ধরে নিই যে এটি $0300 ঠিকানা থেকে শুরু হয়, $0300 ঠিকানাটিকে প্রোগ্রামে 'স্টার্ট' ডাউন দিয়ে প্রতিস্থাপিত করা যেতে পারে। দ্বিতীয় নির্দেশ (DEX) হল একটি একক বাইট instruct6ion, এবং $0302 ঠিকানায় থাকা উচিত। এর মানে হল যে $0302 ঠিকানা প্রোগ্রামের নিচে 'লুপ' দিয়ে প্রতিস্থাপিত হতে পারে, যা আসলে 'BNE লুপে'।

'BNE লুপ' মানে প্রদত্ত ঠিকানার শাখা যখন স্ট্যাটাস রেজিস্টারের Z পতাকা 0 হয়। যখন A বা X বা Y রেজিস্টারে মান 00000000 হয় 2 , শেষ অপারেশনের কারণে, Z পতাকা হল 1 (সেট)। সুতরাং, যখন এটি 0 (1 নয়), প্রোগ্রামের দ্বিতীয় এবং তৃতীয় নির্দেশাবলী সেই ক্রমে পুনরাবৃত্তি হয়। প্রতিটি পুনরাবৃত্ত ক্রমানুসারে, X রেজিস্টারে মান (সম্পূর্ণ সংখ্যা) 1 দ্বারা হ্রাস পায়। DEX মানে X = X – 1। যখন X রেজিস্টারে মান $00 = 00000000 হয় 2 , Z 1 হয়ে যায়। সেই সময়ে, দুটি নির্দেশের আর পুনরাবৃত্তি নেই। প্রোগ্রামের শেষ RTS নির্দেশ, যা একটি একক বাইট নির্দেশ (উহ্য ঠিকানা), সাবরুটিন থেকে ফিরে আসে। এই নির্দেশের প্রভাব হল সাবরুটিন কলের আগে যে কোডটি এক্সিকিউট করতে হবে তার স্ট্যাকে প্রোগ্রাম কাউন্টার অ্যাড্রেস তৈরি করা এবং প্রোগ্রাম কাউন্টারে (পিসি) ফিরে যাওয়া। এই ঠিকানাটি নির্দেশের ঠিকানা যা সাবরুটিন কল করার আগে কার্যকর করতে হবে।

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

একটি সাবরুটিন কল করা হচ্ছে
পূর্ববর্তী লেবেল দ্বারা নেওয়া মেমরি স্পেস উপেক্ষা করে, প্রোগ্রামটি মেমরিতে (RAM) পরপর অবস্থানের 6 বাইট নেয় $0300 থেকে $0305 পর্যন্ত। এই ক্ষেত্রে, প্রোগ্রাম হল:

LDX #$FF ; $FF = 255 দিয়ে X লোড করুন
DEX; X = X – 1
BNE $0302; যদি X শূন্য না হয় তাহলে লুপ যান
আরটিএস; প্রত্যাবর্তন

মেমরিতে $0200 ঠিকানা থেকে শুরু করে সাবরুটিনের জন্য কল হতে পারে। কল নির্দেশনা হল:

জেএসআর শুরু; শুরুর ঠিকানা হল $0300, অর্থাৎ JSR $0300৷

পাঠ্য সম্পাদক ফাইলে সঠিকভাবে লেখা সাবরুটিন এবং এর কল হল:

LDX #$FF শুরু করুন; $FF = 255 দিয়ে X লোড করুন
লুপ DEX; X = X – 1

BNE লুপ; যদি X শূন্য না হয় তাহলে লুপ যান
আরটিএস; প্রত্যাবর্তন

JSR শুরু: $0300 থেকে রুটিনে ঝাঁপ দাও

এখন, একটি দীর্ঘ প্রোগ্রামে অনেকগুলি সাবরুটিন থাকতে পারে। তাদের সকলের নাম 'শুরু' থাকতে পারে না। তাদের আলাদা নাম থাকতে হবে। প্রকৃতপক্ষে, তাদের কোনোটির নাম 'শুরু' নাও থাকতে পারে। এখানে 'স্টার্ট' ব্যবহার করা হয়েছে শিক্ষার কারণে।

4.15 একটি প্রোগ্রাম অনুবাদ করা

একটি প্রোগ্রাম অনুবাদ করা বা এটি একত্রিত করা মানে একই জিনিস। নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:

LDX #$FF শুরু করুন : $FF = 255 দিয়ে X লোড করুন
লুপ DEX: X = X – 1
BNE লুপ: যদি X শূন্য না হয় তাহলে লুপ যান
RTS: ফেরত
JSR শুরু: $0300 থেকে রুটিনে ঝাঁপ দাও

এটি পূর্বে লেখা প্রোগ্রাম। এতে সাবরুটিন, স্টার্ট এবং সাবরুটিনে কল থাকে। প্রোগ্রামটি 255 থেকে কাউন্ট ডাউন 10 0 থেকে 10 . প্রোগ্রামটি ব্যবহারকারীর শুরুর ঠিকানা $0200 (RAM) থেকে শুরু হয়। প্রোগ্রামটি একটি পাঠ্য সম্পাদকে টাইপ করা হয় এবং ডিস্কে সংরক্ষিত হয়। এটির 'sample.asm' এর মতো একটি নাম রয়েছে যেখানে 'নমুনা' প্রোগ্রামারের পছন্দের নাম তবে সমাবেশ ভাষার জন্য '.asm' এক্সটেনশনটি ফাইলের নামের সাথে যুক্ত হতে হবে।

একত্রিত প্রোগ্রামটি অন্য একটি প্রোগ্রাম দ্বারা উত্পাদিত হয় যাকে অ্যাসেম্বলার বলা হয়। অ্যাসেম্বলারটি 6502 µP প্রস্তুতকারক বা তৃতীয় পক্ষ দ্বারা সরবরাহ করা হয়। অ্যাসেম্বলার প্রোগ্রামটিকে এমনভাবে পুনরুত্পাদন করে যে এটি মেমরিতে (র‍্যাম) যেমন এটি চালায় (রান)।

অনুমান করুন যে JSR নির্দেশ $0200 ঠিকানা থেকে শুরু হয় এবং সাবরুটিন $0300 ঠিকানা থেকে শুরু হয়। অ্যাসেম্বলার সমস্ত মন্তব্য এবং সাদা স্পেস বন্ধ করে দেয়। মন্তব্য এবং সাদা স্থানগুলি স্মৃতি নষ্ট করে যা সর্বদা দুর্লভ। পূর্ববর্তী সাবরুটিন কোড সেগমেন্ট এবং সাবরুটিন কলের মধ্যে একটি সম্ভাব্য ফাঁকা লাইন হোয়াইটস্পেসের একটি উদাহরণ। একত্রিত ফাইলটি এখনও ডিস্কে সংরক্ষিত রয়েছে এবং এটিকে 'sample.exe' এর মতো কিছু নাম দেওয়া হয়েছে। 'নমুনা' হল প্রোগ্রামারের পছন্দের নাম, কিন্তু '.exe' এক্সটেনশনটি সেখানে থাকা উচিত যে এটি একটি এক্সিকিউটেবল ফাইল।

একত্রিত প্রোগ্রামটি নিম্নরূপ নথিভুক্ত করা যেতে পারে:

এই মত একটি নথি উত্পাদন হাত দ্বারা একত্রিত বলা হয়. মনে রাখবেন যে এই নথিতে মন্তব্যগুলি মেমরিতে উপস্থিত হয় না (নির্বাহের জন্য)। টেবিলের ঠিকানা কলামটি মেমরিতে নির্দেশাবলীর শুরুর ঠিকানাগুলি নির্দেশ করে। মনে রাখবেন যে 'JSR শুরু' যা 'JSR $0300', যা '20 03 00' হিসাবে কোড করা হবে বলে আশা করা হচ্ছে, প্রকৃতপক্ষে '20 00 03' হিসাবে কোড করা হয়েছে নিম্ন মেমরির বাইট ঠিকানাটি মেমরিতে নিম্ন বাইট গ্রহণ করে এবং উচ্চ মেমরি বাইট ঠিকানা মেমরি উচ্চ বাইট গ্রহণ – সামান্য endianness. JSR-এর opcode হল 20 16 .

মনে রাখবেন যে BNE-এর মতো শাখা নির্দেশের অফসেট হল 128-এর পরিসরে একটি দুটি পরিপূরক সংখ্যা। 10 থেকে + 127 10 . সুতরাং, 'BNE লুপ' মানে 'BNE -1' 10 যা আসলে FF এর কোড আকারে 'D0 FF' 16 দুইয়ের পরিপূরকের মধ্যে -1 যা ভিত্তি দুই-এ = 11111111 হিসাবে লেখা। অ্যাসেম্বলার প্রোগ্রাম লেবেল এবং ক্ষেত্রগুলিকে প্রকৃত হেক্সাডেসিমেল সংখ্যায় প্রতিস্থাপন করে (হেক্সাডেসিমেল সংখ্যা হল বাইনারি সংখ্যা যা চারটি বিটে গোষ্ঠীবদ্ধ)। প্রকৃত ঠিকানা যেখানে প্রতিটি নির্দেশ শুরু হয় আসলে অন্তর্ভুক্ত করা হয়।

বিঃদ্রঃ: 'জেএসআর স্টার্ট' নির্দেশনাটি সংক্ষিপ্ত নির্দেশাবলী দ্বারা প্রতিস্থাপিত হয় যা প্রোগ্রাম কাউন্টারের বর্তমান বিষয়বস্তু (উচ্চ এবং নিম্ন বাইট) স্ট্যাক পয়েন্টার সহ স্ট্যাকে পাঠায় যা দুইবার (একবার উচ্চ বাইটের জন্য এবং একবার কম বাইটের জন্য) এবং তারপর $0300 ঠিকানা সহ পিসি পুনরায় লোড করে। স্ট্যাক পয়েন্টার এখন $00FD নির্দেশ করে, ধরে নিচ্ছে যে এটি $01FF-তে শুরু হয়েছে।

এছাড়াও, RTS নির্দেশনাটি বেশ কয়েকটি সংক্ষিপ্ত নির্দেশ দ্বারা প্রতিস্থাপিত হয় যা স্ট্যাক পয়েন্টার 'S' কে দুইবার বৃদ্ধি করে (একবার কম বাইটের জন্য এবং একবার উচ্চ বাইটের জন্য) এবং স্ট্যাক পয়েন্টার থেকে পিসিতে ঠিকানার সংশ্লিষ্ট দুটি বাইট টেনে নিয়ে যায়। পরবর্তী নির্দেশ।

বিঃদ্রঃ: একটি লেবেল পাঠ্যে 8টির বেশি অক্ষর থাকা উচিত নয়।

'BNE লুপ' আপেক্ষিক ঠিকানা ব্যবহার করে। এর অর্থ -3 যোগ করা 10 $0305 এর পরবর্তী প্রোগ্রাম কাউন্টার সামগ্রীতে। 'BNE লুপ' এর বাইটগুলি হল 'D0 FD' যেখানে FD হল -3 এর দুটি পরিপূরক 10 .

দ্রষ্টব্য: এই অধ্যায়টি 6502 µP-এর জন্য সমস্ত নির্দেশাবলী উপস্থাপন করে না। সমস্ত নির্দেশাবলী এবং তাদের বিশদ বিবরণ 'SY6500 8-বিট মাইক্রোপ্রসেসর পরিবার' শিরোনামের নথিতে পাওয়া যাবে। এই নথিটির জন্য '6502.pdf' নামের একটি পিডিএফ ফাইল রয়েছে যা ইন্টারনেটে অবাধে উপলব্ধ। এই নথিতে বর্ণিত 6502 µP হল 65C02।

4.16 বাধা

কমোডোর 64-এর বাহ্যিক (উল্লম্ব পৃষ্ঠ) পোর্টের সাথে সংযুক্ত যেকোনো ডিভাইসের সংকেতকে 6502 মাইক্রোপ্রসেসরে পৌঁছানোর আগে CIA 1 বা CIA 2 সার্কিট (ICs) এর মধ্য দিয়ে যেতে হবে। 6502 µP-এর ডেটা-বাস থেকে সংকেতগুলিকে কোনও বাহ্যিক ডিভাইসে পৌঁছানোর আগে CIA 1 বা CIA 2 চিপের মধ্য দিয়ে যেতে হবে। CIA এর পূর্ণরূপ হল Complex Interface Adapter. চিত্র 4.1 'কমোডোর_64 মাদারবোর্ডের ব্লক ডায়াগ্রাম'-এ, ব্লক ইনপুট/আউটপুট ডিভাইসগুলি সিআইএ 1 এবং সিআইএ 2-এর প্রতিনিধিত্ব করে। যখন একটি প্রোগ্রাম চলছে, তখন এটি চালিয়ে যাওয়ার আগে অন্য কিছু কোড চালানোর জন্য বাধা হতে পারে। হার্ডওয়্যার বাধা এবং সফ্টওয়্যার বাধা আছে। হার্ডওয়্যার বাধার জন্য, 6502 µP-এ দুটি ইনপুট সিগন্যাল পিন রয়েছে৷ এই পিনের নাম হল আইআরকিউ এবং এনএমআই . এগুলি µP ডেটা লাইন নয়। µP-এর ডেটা লাইন হল D7, D6, D5, D4, D3, D2, D1 এবং D0; সবচেয়ে গুরুত্বপূর্ণ বিটের জন্য D0 এবং সবচেয়ে গুরুত্বপূর্ণ বিটের জন্য D7 সহ।

আইআরকিউ ইন্টারাপ্ট রিকোয়েস্ট এর মানে হল 'সক্রিয়' কম। µP-তে এই ইনপুট লাইনটি সাধারণত উচ্চ, প্রায় 5 ভোল্টে। যখন এটি আনুমানিক 0 ভোল্টে নেমে যায়, তখন এটি একটি বাধা অনুরোধ যা µP সংকেত দেয়। অনুরোধটি মঞ্জুর হওয়ার সাথে সাথে লাইনটি আবার উঁচু হয়ে যায়। ইন্টারাপ্ট রিকোয়েস্ট মঞ্জুর করার অর্থ হল µP কোডে (সাবরুটিন) ব্রাঞ্চ করে যা ইন্টারাপ্ট পরিচালনা করে।

এনএমআই Non-Maskable Interrupt 'সক্রিয়' কম। কোড যখন জন্য আইআরকিউ মৃত্যুদন্ড কার্যকর করা হচ্ছে এনএমআই কম যেতে পারে। এক্ষেত্রে, এনএমআই পরিচালনা করা হয় (এর নিজস্ব কোড নির্বাহ করা হয়)। এর পরে, জন্য কোড আইআরকিউ চলতে থাকে জন্য কোড পরে আইআরকিউ শেষ হয়, প্রধান প্রোগ্রাম কোড চলতে থাকে। এটাই, এনএমআই বাধা দেয় আইআরকিউ হ্যান্ডলার জন্য সংকেত এনএমআই µP নিষ্ক্রিয় থাকা সত্ত্বেও এবং কোনো কিছু পরিচালনা না করা বা কোনো প্রধান প্রোগ্রাম না চললেও µP-কে দেওয়া যেতে পারে।

বিঃদ্রঃ: এটা আসলে উচ্চ থেকে নিম্ন রূপান্তর, এর এনএমআই , যে এনএমআই সংকেত - পরে যে আরো. আইআরকিউ সাধারণত সিআইএ 1 থেকে আসে এবং এনএমআই সাধারণত সিআইএ 2 থেকে আসে। এনএমআই , যা নন-মাস্কেবল ইন্টারাপ্টের জন্য দাঁড়িয়েছে, এটিকে থামানো যায় না বলে বিবেচিত হতে পারে।

হ্যান্ডলিং বাধা
অনুরোধ থেকে কিনা আইআরকিউ বা এনএমআই , বর্তমান নির্দেশ অবশ্যই সম্পূর্ণ করতে হবে। 6502-এ শুধুমাত্র A, X, এবং Y রেজিস্টার আছে। একটি সাবরুটিন কাজ করার সময়, এটি এই তিনটি রেজিস্টার একসাথে ব্যবহার করতে পারে। একটি ইন্টারাপ্ট হ্যান্ডলার এখনও একটি সাবরুটিন, যদিও সেরকম দেখা যায় না। বর্তমান নির্দেশ সম্পূর্ণ হওয়ার পর, 65C02 µP-এর জন্য A, X, এবং Y রেজিস্টারের বিষয়বস্তু স্ট্যাকে সংরক্ষিত হয়। প্রোগ্রাম কাউন্টারের পরবর্তী নির্দেশের ঠিকানাও স্ট্যাকে পাঠানো হয়। µP তারপর ইন্টারাপ্টের জন্য কোডে শাখা দেয়। এর পরে, A, X, এবং Y রেজিস্টারের বিষয়বস্তু স্ট্যাক থেকে রিভার্স অর্ডারে পুনরুদ্ধার করা হয় যেখানে সেগুলি পাঠানো হয়।

একটি বাধা জন্য উদাহরণ কোডিং
সরলতার জন্য, অনুমান করুন যে µP এর জন্য রুটিন আইআরকিউ interrupt হল শুধুমাত্র $01 এবং $02 সংখ্যা যোগ করা এবং $0400 এর মেমরি ঠিকানায় $03 এর ফলাফল সংরক্ষণ করা। কোড হল:

আইএসআর পিএইচএ
পিএইচএক্স
PHY
;
LDA #$01
ADC #$02
তাদের খরচ $0400
;
PLY
পিএলএক্স
পিএলএ
আরটিআই

আইএসআর হল একটি লেবেল এবং মেমরির ঠিকানা চিহ্নিত করে যেখানে পিএইচএ নির্দেশনা রয়েছে। আইএসআর মানে ইন্টারাপ্ট সার্ভিস রুটিন। PHA, PHX, এবং PHY A, X, এবং Y রেজিস্টারের বিষয়বস্তু স্ট্যাকে এই আশায় পাঠায় যে বাধার ঠিক আগে চলমান কোড (প্রোগ্রাম) দ্বারা তাদের প্রয়োজন হবে। পরবর্তী তিনটি নির্দেশনা ইন্টারাপ্ট হ্যান্ডলারের মূল গঠন করে। PLY, PLX, এবং PLA নির্দেশাবলী সেই ক্রমে থাকতে হবে এবং তারা Y, X, এবং A রেজিস্টারের বিষয়বস্তু ফিরিয়ে আনে। শেষ নির্দেশ, যা আরটিআই, (কোন অপারেন্ড ছাড়াই) যেকোন কোড (প্রোগ্রাম) যেটি বাধার আগে কার্যকর করা হয় তাতে সম্পাদনের ধারাবাহিকতা ফিরিয়ে দেয়। আরটিআই কোডের পরবর্তী নির্দেশের ঠিকানা টেনে নেয় যা স্ট্যাক থেকে প্রোগ্রাম কাউন্টারে ফিরে আসে। আরটিআই মানে ইন্টারাপ্ট থেকে রিটার্ন। এর সাথে, ইন্টারাপ্ট হ্যান্ডলিং (সাবরুটিন) শেষ।

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

সাবরুটিন এবং ইন্টারাপ্ট সার্ভিস রুটিনের তুলনা এবং বৈসাদৃশ্য
নিম্নোক্ত সারণী সাবরুটিন এবং ইন্টারাপ্ট সার্ভিস রুটিনের তুলনা ও বৈসাদৃশ্য করে:

4.17 6502 প্রধান অ্যাড্রেসিং মোডের সারাংশ

6502-এর জন্য প্রতিটি নির্দেশ একটি বাইট, তারপর শূন্য বা তার বেশি অপারেন্ড।

অবিলম্বে ঠিকানা মোড
অবিলম্বে অ্যাড্রেসিং মোড সহ, অপারেন্ডের পরে, মানটি মেমরি ঠিকানা নয়। মানটি # এর আগে থাকতে হবে। মানটি হেক্সাডেসিমেলে হলে '#' এর পরে '$' হতে হবে। 65C02-এর জন্য অবিলম্বে ঠিকানার নির্দেশাবলী হল: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC। পাঠকের 65C02 µP এর জন্য ডকুমেন্টেশনের সাথে পরামর্শ করা উচিত যাতে এই অধ্যায়ে ব্যাখ্যা করা হয়নি এখানে তালিকাভুক্ত নির্দেশাবলী কীভাবে ব্যবহার করবেন তা জানতে। একটি উদাহরণ নির্দেশনা হল:

এলডিএ #$77

পরম ঠিকানা মোড
পরম ঠিকানা মোডে, একটি অপারেন্ড আছে। এই অপারেন্ডটি মেমরির মানের ঠিকানা (সাধারণত হেক্সাডেসিমেল বা একটি লেবেলে)। 64K আছে 10 = 65,536 10 6502 µP এর জন্য মেমরি ঠিকানা। সাধারণত, এক-বাইটের মান এই ঠিকানাগুলির একটিতে থাকে। 65C02-এর জন্য পরম ঠিকানা নির্দেশাবলী হল: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB। পাঠকের 65C02 µP এর জন্য ডকুমেন্টেশনের সাথে পরামর্শ করা উচিত যাতে এখানে তালিকাভুক্ত নির্দেশাবলী ব্যবহার করতে হয়, সেইসাথে বাকি ঠিকানা মোডগুলির জন্য যা এই অধ্যায়ে ব্যাখ্যা করা হয়নি। একটি উদাহরণ নির্দেশনা হল:

তারা হল $1234

উহ্য অ্যাড্রেসিং মোড
অন্তর্নিহিত ঠিকানা মোডে, কোন অপারেন্ড নেই। যেকোন µP নিবন্ধন জড়িত নির্দেশ দ্বারা উহ্য হয়. 65C02-এর অন্তর্নিহিত ঠিকানা নির্দেশাবলী হল: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA। একটি উদাহরণ নির্দেশনা হল:

DEX: X রেজিস্টার একটি ইউনিট দ্বারা হ্রাস করুন।

আপেক্ষিক ঠিকানা মোড
রিলেটিভ অ্যাড্রেসিং মোড শুধুমাত্র শাখা নির্দেশের সাথে ডিল করে। আপেক্ষিক ঠিকানা মোডে, শুধুমাত্র একটি অপারেন্ড আছে। এটি -128 থেকে একটি মান 10 +127 পর্যন্ত 10 . এই মানটিকে অফসেট বলা হয়। চিহ্নের উপর ভিত্তি করে, এই মানটি প্রোগ্রাম কাউন্টারের পরবর্তী নির্দেশনা থেকে যোগ বা বিয়োগ করা হয় যাতে পরবর্তী নির্দেশের ঠিকানায় পরিণত হয়। আপেক্ষিক ঠিকানা মোড নির্দেশাবলী হল: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS। নির্দেশের উদাহরণ হল:

BNE $7F : (স্ট্যাটাস রেজিস্টারে Z = 0 হলে শাখা, P)

যা বর্তমান প্রোগ্রাম কাউন্টারে 127 যোগ করে (চালানোর ঠিকানা) এবং সেই ঠিকানায় নির্দেশনা কার্যকর করা শুরু করে। একইভাবে:

BEQ $F9 : (শাখা যদি Z = : স্ট্যাটাস রেজিস্টারে, P)

যা বর্তমান প্রোগ্রাম কাউন্টারে একটি -7 যোগ করে এবং নতুন প্রোগ্রাম কাউন্টার ঠিকানায় এক্সিকিউশন শুরু করে। অপারেন্ড একটি দুই এর পরিপূরক সংখ্যা।

পরম ইন্ডেক্সড অ্যাড্রেসিং
পরম সূচক ঠিকানায়, X বা Y রেজিস্টারের বিষয়বস্তু প্রদত্ত পরম ঠিকানায় যোগ করা হয় ($0000 থেকে $FFFF, অর্থাৎ 0 থেকে 10 65536 পর্যন্ত 10 ) আসল ঠিকানা আছে। এই প্রদত্ত পরম ঠিকানাকে বেস ঠিকানা বলা হয়। যদি এক্স রেজিস্টার ব্যবহার করা হয়, সমাবেশ নির্দেশনাটি এরকম কিছু:

LDA $C453, X

যদি Y রেজিস্টার ব্যবহার করা হয়, তবে এটি এরকম কিছু:

LDA $C453,Y

X বা Y রেজিস্টারের মানকে গণনা বা সূচকের মান বলা হয় এবং এটি $00 (0) থেকে যেকোনো জায়গায় হতে পারে 10 ) থেকে $FF (250 10 ) একে অফসেট বলা হয় না।

নিখুঁত সূচক ঠিকানা নির্দেশাবলী হল: ADC, AND, ASL (শুধুমাত্র X), BIT (শুধুমাত্র এক্সকিউমুলেটর এবং মেমরি সহ), CMP, DEC (শুধুমাত্র মেমরি এবং X), EOR, INC (কেবল মেমরি এবং X), LDA , LDX, LDY, LSR (শুধুমাত্র X), ORA, ROL (শুধুমাত্র X), ROR (শুধুমাত্র X), SBC, STA, STZ (শুধুমাত্র X)।

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

JMP ($3456)

বন্ধনী সহ, এবং $13 $3456 এর ঠিকানা অবস্থানে এবং $EB $3457 (= $3456 + 1) ঠিকানার অবস্থানে রয়েছে। তারপর, গন্তব্য ঠিকানা হল $13EB এবং $13EB হল পয়েন্টার। পরম $3456 নির্দেশের বন্ধনীতে রয়েছে যেখানে 34 হল নিম্ন বাইট এবং 56 হল উচ্চতর বাইট।

4.18 6502 µP সমাবেশ ভাষা দিয়ে একটি স্ট্রিং তৈরি করা

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

ASCII কোডের একটি স্ট্রিং তৈরি করার দুটি প্রধান উপায় রয়েছে। উভয় উপায়ে, সমস্ত ASCII কোড (অক্ষর) মেমরিতে পরপর বাইট অবস্থান নেয়। একটি উপায়ে, বাইটের এই ক্রমটি একটি পূর্ণসংখ্যা বাইট দ্বারা পূর্বে থাকে যা অনুক্রমের (স্ট্রিং) দৈর্ঘ্য (অক্ষরের সংখ্যা)। অন্যভাবে, নাল বাইট দ্বারা অক্ষরের ক্রম সফল হয় (অবিলম্বে অনুসরণ করা হয়) যা 00 16 , অর্থাৎ $00। স্ট্রিং এর দৈর্ঘ্য (অক্ষরের সংখ্যা) এই অন্যভাবে নির্দেশিত হয় না। Null অক্ষর প্রথম উপায়ে ব্যবহার করা হয় না.

উদাহরণস্বরূপ, 'আমি তোমাকে ভালোবাসি!' বিবেচনা করুন! উদ্ধৃতি ছাড়া স্ট্রিং এখানে দৈর্ঘ্য 11; একটি স্থান একটি ASCII বাইট (অক্ষর) হিসাবে গণনা করে। অনুমান করুন যে স্ট্রিংটিকে মেমরিতে স্থাপন করতে হবে যেখানে প্রথম অক্ষরটি ঠিকানা $0300 হবে।

প্রথম বাইট 11 হলে নিচের টেবিলটি স্ট্রিং মেমরি সেটিং দেখায় 10 = 0 বি 16 :

নিম্নলিখিত টেবিলটি স্ট্রিং মেমরি সেটিং দেখায় যখন প্রথম বাইট 'I' হয় এবং শেষ বাইটটি Null ($00):

স্ট্রিং তৈরি শুরু করতে নিম্নলিখিত নির্দেশনা ব্যবহার করা যেতে পারে:

তাদের খরচ $0300

অনুমান করুন যে প্রথম বাইটটি সঞ্চয়কারীতে রয়েছে যা $0300 ঠিকানার অবস্থানে পাঠানো হবে। এই নির্দেশটি উভয় ক্ষেত্রেই সত্য (উভয় ধরনের স্ট্রিং)।

মেমরি সেলগুলিতে সমস্ত অক্ষর ফিট করার পরে, একের পর এক, স্ট্রিংটি লুপ ব্যবহার করে পড়া যেতে পারে। প্রথম ক্ষেত্রে, দৈর্ঘ্যের পরে অক্ষরের সংখ্যা পড়া হয়। দ্বিতীয় ক্ষেত্রে, অক্ষরগুলি 'I' থেকে পড়া হয় যতক্ষণ না Null অক্ষরটি 'Null' পূরণ হয়।

4.19 6502 µP সমাবেশ ভাষা দিয়ে একটি অ্যারে তৈরি করা

একক বাইট পূর্ণসংখ্যার একটি অ্যারে পূর্ণসংখ্যার সাথে পরপর মেমরি বাইট অবস্থান নিয়ে গঠিত। তারপর, একটি পয়েন্টার আছে যা প্রথম পূর্ণসংখ্যার অবস্থান নির্দেশ করে। সুতরাং, পূর্ণসংখ্যার একটি অ্যারে দুটি অংশ নিয়ে গঠিত: পয়েন্টার এবং অবস্থানের সিরিজ।

স্ট্রিংগুলির একটি অ্যারের জন্য, প্রতিটি স্ট্রিং মেমরিতে আলাদা জায়গায় থাকতে পারে। তারপর, পয়েন্টার সহ পরপর মেমরি অবস্থান রয়েছে যেখানে প্রতিটি পয়েন্টার প্রতিটি স্ট্রিংয়ের প্রথম অবস্থানের দিকে নির্দেশ করে। এই ক্ষেত্রে একটি পয়েন্টার দুটি বাইট নিয়ে গঠিত। একটি স্ট্রিং তার দৈর্ঘ্য দিয়ে শুরু হলে, সংশ্লিষ্ট পয়েন্টার সেই দৈর্ঘ্যের অবস্থান নির্দেশ করে। যদি একটি স্ট্রিং তার দৈর্ঘ্য দিয়ে শুরু না হয় কিন্তু একটি নাল অক্ষর দিয়ে শেষ হয়, তাহলে সংশ্লিষ্ট পয়েন্টারটি স্ট্রিংয়ের প্রথম অক্ষরের অবস্থান নির্দেশ করে। এবং একটি পয়েন্টার আছে যা পরপর পয়েন্টারের প্রথম পয়েন্টারের নিম্ন বাইট ঠিকানা নির্দেশ করে। সুতরাং, স্ট্রিংগুলির একটি অ্যারে তিনটি অংশ নিয়ে গঠিত: মেমরির বিভিন্ন স্থানে থাকা স্ট্রিং, সংশ্লিষ্ট পরপর পয়েন্টার এবং পরপর পয়েন্টারগুলির প্রথম পয়েন্টারের পয়েন্টার।

4.20 সমস্যা

পাঠককে পরবর্তী অধ্যায়ে যাওয়ার আগে একটি অধ্যায়ে সমস্ত সমস্যা সমাধান করার পরামর্শ দেওয়া হচ্ছে।

  1. একটি সমাবেশ ভাষা প্রোগ্রাম লিখুন যা 6502 µP এর জন্য $0200 থেকে শুরু হয় এবং 2A94 এর স্বাক্ষরবিহীন সংখ্যা যোগ করে এইচ 2ABF-তে (যোগ করুন) এইচ (augend)। ইনপুট এবং আউটপুট মেমরিতে থাকতে দিন। এছাড়াও, হাতে একত্রিত প্রোগ্রাম নথি তৈরি করুন।
  2. একটি সমাবেশ ভাষা প্রোগ্রাম লিখুন যা 6502 µP এর জন্য $0200 থেকে শুরু হয় এবং 1569 এর স্বাক্ষরবিহীন সংখ্যাগুলি বিয়োগ করে এইচ (subtrahend) 2ABF থেকে এইচ (minuend)। ইনপুট এবং আউটপুট মেমরিতে থাকতে দিন। এছাড়াও, হাতে একত্রিত প্রোগ্রাম নথি তৈরি করুন।
  3. লুপ ব্যবহার করে 6502 µP এর জন্য একটি সমাবেশ ভাষা প্রোগ্রাম লিখুন যা $00 থেকে $09 পর্যন্ত গণনা করে। প্রোগ্রামটি $0200 এ শুরু হওয়া উচিত। এছাড়াও, হাতে একত্রিত প্রোগ্রাম নথি তৈরি করুন।
  4. একটি সমাবেশ ভাষা প্রোগ্রাম লিখুন যা 6502 µP এর জন্য $0200 থেকে শুরু হয়। প্রোগ্রাম দুটি সাবরুটিন আছে. প্রথম সাবরুটিনে 0203-এর স্বাক্ষরবিহীন সংখ্যা যোগ করা হয়েছে এইচ (augend) এবং 0102H (সংযোজন)। দ্বিতীয় সাবরুটিন প্রথম সাবরুটিন থেকে যোগফল যোগ করে যা 0305H থেকে 0006 এইচ (augend)। চূড়ান্ত ফলাফল মেমরিতে সংরক্ষণ করা হয়। প্রথম সাবরুটিনটিকে কল করুন যা হল FSTSUB এবং দ্বিতীয় সাবরুটিনটি হল SECSUB৷ ইনপুট এবং আউটপুট মেমরিতে থাকতে দিন। এছাড়াও, হাতে দ্বারা পুরো প্রোগ্রামের জন্য একত্রিত প্রোগ্রাম নথি তৈরি করুন।
  5. দেওয়া যে একটি আইআরকিউ হ্যান্ডলার মূল পরিচালনার সময় সঞ্চয়কারীতে $02 থেকে $01 যোগ করে এনএমআই জারি করা হয় এবং জন্য মূল হ্যান্ডলিং এনএমআই সঞ্চয়কারীতে $05 থেকে $04 যোগ করে, উভয় হ্যান্ডলারের কল সহ তাদের জন্য একটি সমাবেশ ভাষা লিখুন। কল আইআরকিউ হ্যান্ডলার $0200 ঠিকানায় থাকা উচিত। দ্য আইআরকিউ হ্যান্ডলার $0300 ঠিকানায় শুরু করা উচিত। দ্য এনএমআই হ্যান্ডলার $0400 ঠিকানায় শুরু করা উচিত। এর ফলাফল আইআরকিউ হ্যান্ডলারকে $0500 এর ঠিকানায় রাখা উচিত এবং এর ফলাফল এনএমআই হ্যান্ডলারকে $0501 ঠিকানায় রাখতে হবে।
  6. একটি 65C02 কম্পিউটারে সফ্টওয়্যার বিঘ্ন তৈরি করতে BRK নির্দেশ কীভাবে ব্যবহার করা হয় তা সংক্ষেপে ব্যাখ্যা করুন।
  7. একটি সারণি তৈরি করুন যা একটি ইন্টারাপ্ট সার্ভিস রুটিনের সাথে একটি সাধারণ সাবরুটিনের তুলনা করে এবং বৈসাদৃশ্য করে।
  8. সংক্ষিপ্তভাবে 65C02 µP এর প্রধান অ্যাড্রেসিং মোডগুলিকে সমাবেশের ভাষা নির্দেশের উদাহরণ দিয়ে ব্যাখ্যা করুন।
  9. ক) 'আমি তোমাকে ভালোবাসি!' লিখতে একটি 6502 মেশিন ভাষা প্রোগ্রাম লিখুন। মেমরিতে ASCII কোডের স্ট্রিং, $0300 ঠিকানা থেকে শুরু করে স্ট্রিংয়ের দৈর্ঘ্য। প্রোগ্রামটি $0200 ঠিকানায় শুরু হওয়া উচিত। প্রতিটি অক্ষর সংগ্রহকারী থেকে একের পর এক প্রাপ্ত করুন, অনুমান করে যে তারা সেখানে পাঠানো হয়েছে, কিছু সাবরুটিন দ্বারা। এছাড়াও, হাত দ্বারা প্রোগ্রাম একত্রিত করুন. (আপনি যদি 'আমি তোমাকে ভালোবাসি!' এর জন্য ASCII কোডগুলি জানতে চান। সেগুলি এখানে: 'I':49 16 , স্থান: 20 16 , 'l': 6C 16 , 'o':6F 16 , 'in':76 16 , 'e':65, 'y':79 16 , 'in':75 16 , এবং '!':21 16 (দ্রষ্টব্য: প্রতিটি কোড 1 বাইট দখল করে)।
    খ) 'আমি তোমাকে ভালোবাসি!' লিখতে একটি 6502 মেশিন ভাষা প্রোগ্রাম লিখুন। মেমরিতে ASCII কোডের স্ট্রিং, স্ট্রিংটির দৈর্ঘ্য ছাড়াই $0300 ঠিকানা থেকে শুরু হয় কিন্তু 00 এ শেষ হয় 16 . প্রোগ্রামটি $0200 ঠিকানায় শুরু হওয়া উচিত। সঞ্চয়কারী থেকে প্রতিটি অক্ষর প্রাপ্ত করুন, অনুমান করে যে তারা সেখানে পাঠানো হয়েছে, একের পর এক, কিছু সাবরুটিন দ্বারা। এছাড়াও, হাত দ্বারা প্রোগ্রাম একত্রিত করুন.