পার্ট 4: কিউএফটিএএসএম এবং কোগল
আর্কিটেকচার ওভারভিউ
সংক্ষেপে, আমাদের কম্পিউটারে একটি 16 বিট অ্যাসিনক্রোনাস আরআইএসসি হার্ভার্ড আর্কিটেকচার রয়েছে। হাত দিয়ে প্রসেসর তৈরি করার সময়, একটি আরআইএসসি ( হ্রাসযুক্ত নির্দেশ সেট কম্পিউটার ) আর্কিটেকচারটি কার্যত প্রয়োজন। আমাদের ক্ষেত্রে, এর অর্থ এই যে ওপকোডের সংখ্যা কম এবং আরও গুরুত্বপূর্ণ বিষয় হল যে সমস্ত নির্দেশাবলী খুব অনুরূপ পদ্ধতিতে প্রক্রিয়া করা হয়।
রেফারেন্সের জন্য, ওয়্যারওয়ার্ল্ড কম্পিউটারটি ট্রান্সপোর্ট- ট্রিগারযুক্ত আর্কিটেকচার ব্যবহার করেছিল , যেখানে একমাত্র নির্দেশ ছিল MOV
এবং বিশেষ রেজিস্টারগুলি লেখার / পড়ার দ্বারা গণনা করা হত। যদিও এই দৃষ্টান্তটি বাস্তবায়িত করার জন্য খুব সহজেই আর্কিটেকচারের দিকে পরিচালিত করে, ফলাফলটি সীমান্তরেখাও ব্যবহারযোগ্য নয়: সমস্ত পাটিগণিত / যুক্তি / শর্তাধীন ক্রিয়াকলাপের জন্য তিনটি নির্দেশের প্রয়োজন require আমাদের কাছে এটি স্পষ্ট ছিল যে আমরা অনেক কম ছদ্মবেশী আর্কিটেকচার তৈরি করতে চেয়েছিলাম।
ব্যবহারযোগ্যতা বাড়ানোর সময় আমাদের প্রসেসরটিকে সহজ রাখার জন্য, আমরা বেশ কয়েকটি গুরুত্বপূর্ণ ডিজাইনের সিদ্ধান্ত নিয়েছি:
- কোনও রেজিস্টার নেই। র্যামের প্রতিটি ঠিকানাকে সমানভাবে চিকিত্সা করা হয় এবং কোনও ক্রিয়াকলাপের জন্য কোনও যুক্তি হিসাবে ব্যবহার করা যেতে পারে। এক অর্থে, এর অর্থ এই যে সমস্ত র্যাম রেজিস্টারের মতো আচরণ করা যেতে পারে। এর অর্থ এই যে কোনও বিশেষ লোড / স্টোর নির্দেশাবলী নেই।
- অনুরূপ শিরাতে, মেমরি-ম্যাপিং। যা কিছু লেখা বা পঠন করা যায় সেগুলি একীভূত ঠিকানা স্কিম ভাগ করে। এর অর্থ হল প্রোগ্রামের কাউন্টার (পিসি) ঠিকানা 0 এবং নিয়মিত নির্দেশাবলী এবং নিয়ন্ত্রণ-প্রবাহ নির্দেশাবলীর মধ্যে একমাত্র পার্থক্য হ'ল নিয়ন্ত্রণ-প্রবাহ নির্দেশাবলী ঠিকানা 0 ব্যবহার করে।
- ডেটা ট্রান্সমিশনে সিরিয়াল, স্টোরেজের সমান্তরালে। আমাদের কম্পিউটারের "ইলেকট্রন"-ভিত্তিক প্রকৃতির কারণে ডেটা সিরিয়াল লিটল-এন্ডিয়ান (সর্বনিম্ন-উল্লেখযোগ্য বিট প্রথমে) আকারে সঞ্চারিত হলে সংযোজন এবং বিয়োগফলগুলি কার্যকরভাবে কার্যকর করা যায়। তদুপরি, সিরিয়াল তথ্যগুলি জটিল ডেটা বাসগুলির প্রয়োজনীয়তা সরিয়ে দেয়, যা উভয়ই যথাযথভাবে প্রশস্ত এবং জটিল সময়ে যথাযথভাবে হয় (ডেটা একসাথে থাকার জন্য, বাসের সমস্ত "লেন" একই ভ্রমণ দেরি করতে হবে)।
- হার্ভার্ড আর্কিটেকচার, যার অর্থ প্রোগ্রাম মেমোরি (আরওএম) এবং ডেটা মেমরি (র্যাম) এর মধ্যে একটি বিভাগ। যদিও এটি প্রসেসরের নমনীয়তা হ্রাস করে, এটি আকারের অপ্টিমাইজেশনে সহায়তা করে: প্রোগ্রামটির দৈর্ঘ্য আমাদের যে পরিমাণ র্যামের প্রয়োজন হবে তার চেয়ে অনেক বেশি, তাই আমরা প্রোগ্রামটি রমকে বিভক্ত করতে পারি এবং তারপরে রম সংক্ষেপণের উপর ফোকাস করতে পারি focus , যখন এটি কেবলমাত্র পঠনযোগ্য হয় তত বেশি সহজ।
- 16-বিট ডেটা প্রস্থ। এটি স্ট্যান্ডার্ড টেট্রিস বোর্ডের (10 টি ব্লক) চেয়ে বৃহত্তর দুটিটির ক্ষুদ্রতম শক্তি। এটি আমাদের -32768 থেকে +32767 এর একটি ডেটা পরিসীমা এবং 65536 নির্দেশাবলীর সর্বাধিক প্রোগ্রামের দৈর্ঘ্য দেয়। (2 ^ 8 = 256 নির্দেশাবলী সর্বাধিক সহজ জিনিসগুলির জন্য যথেষ্ট যা আমরা খেলনা প্রসেসরটি করতে চাই, তবে টেট্রিস নয় not)
- অ্যাসিঙ্ক্রোনাস ডিজাইন। কম্পিউটারের সময় নির্ধারণের সময় কেন্দ্রীয় ঘড়ি (বা সমতুল্য কয়েকটি ঘড়ি) রাখার পরিবর্তে সমস্ত ডেটা একটি "ক্লক সিগন্যাল" সহ থাকে যা কম্পিউটারের চারদিকে প্রবাহিত হওয়ার সাথে সাথে ডেটার সমান্তরালে ভ্রমণ করে। কিছু পাথ অন্যের চেয়ে সংক্ষিপ্ত হতে পারে এবং এটি কেন্দ্রীয়ভাবে ক্লকড ডিজাইনের ক্ষেত্রে অসুবিধা তৈরি করতে পারে, তবুও একটি অ্যাসিনক্রোনাস ডিজাইন সহজেই পরিবর্তনশীল-সময়ের ক্রিয়াকলাপ মোকাবেলা করতে পারে।
- সমস্ত নির্দেশাবলী সমান আকারের। আমরা অনুভব করেছি যে একটি আর্কিটেকচার যেখানে প্রতিটি নির্দেশে 3 টি অপেরেন্ড (মান মান গন্তব্য) সহ 1 টি অপকোড থাকে সর্বাধিক নমনীয় বিকল্প। এটি বাইনারি ডেটা অপারেশনগুলির পাশাপাশি শর্তাধীন চলনগুলিকে অন্তর্ভুক্ত করে।
- সাধারণ অ্যাড্রেসিং মোড সিস্টেম। অ্যারে বা পুনরাবৃত্তির মতো বিষয়গুলিকে সমর্থন করার জন্য বিভিন্ন ধরণের অ্যাড্রেসিং মোড থাকা খুব দরকারী। আমরা তুলনামূলক সহজ সিস্টেম সহ বেশ কয়েকটি গুরুত্বপূর্ণ সম্বোধন মোড বাস্তবায়ন করতে সক্ষম হয়েছি।
আমাদের স্থাপত্যের একটি চিত্র ওভারভিউ পোস্টে রয়েছে।
কার্যকারিতা এবং ALU অপারেশন
এখান থেকে, আমাদের প্রসেসরের কী কার্যকারিতা থাকা উচিত তা নির্ধারণের বিষয়টি ছিল। বাস্তবায়নের স্বাচ্ছন্দ্যের পাশাপাশি প্রতিটি কমান্ডের বহুমুখিতা সম্পর্কে বিশেষ মনোযোগ দেওয়া হয়েছিল।
শর্তাধীন পদক্ষেপ
শর্তসাপেক্ষিক পদক্ষেপগুলি অত্যন্ত গুরুত্বপূর্ণ এবং এটি উভয়ই ক্ষুদ্র-স্কেল এবং বৃহত আকারের নিয়ন্ত্রণ প্রবাহ হিসাবে পরিবেশন করে। "ক্ষুদ্র-স্কেল" বলতে কোনও নির্দিষ্ট ডেটা মুভের সম্পাদন নিয়ন্ত্রণের পক্ষে তার ক্ষমতা বোঝায়, অন্যদিকে "বৃহত্তর" কোডের কোনও স্বেচ্ছাসেবী নিয়ন্ত্রণে প্রবাহ স্থানান্তর করতে শর্তাধীন জাম্প অপারেশন হিসাবে এর ব্যবহারকে বোঝায়। কোনও ডেডিকেটেড জাম্প অপারেশন নেই কারণ মেমরি ম্যাপিংয়ের কারণে, একটি শর্তযুক্ত পদক্ষেপ উভয়ই নিয়মিত র্যামে ডেটা অনুলিপি করতে পারে এবং পিসিতে গন্তব্য ঠিকানা অনুলিপি করতে পারে। আমরা একই শর্তে শর্তহীন পদক্ষেপ এবং শর্তহীন জাম্প উভয়ই ত্যাগ করা বেছে নিয়েছিলাম: উভয়কেই শর্তযুক্ত একটি পদক্ষেপ হিসাবে কার্যকর করা যেতে পারে যা সত্যের সাথে শক্তভাবে আবদ্ধ থাকে।
আমরা দুটি ভিন্ন ধরণের শর্তসাপেক্ষ চলন বেছে নিয়েছি: "শূন্য না হলে সরানো" ( MNZ
) এবং "শূন্যের চেয়ে কম হলে সরানো" ( MLZ
)। কার্যকরীভাবে, MNZ
ডেটাতে কোনও বিট 1 MLZ
আছে কিনা তা পরীক্ষা করার পরিমাণ , যখন সাইন বিট 1 হয় কিনা তা যাচাইয়ের পরিমাণ respectively এগুলি যথাক্রমে সমতা এবং তুলনার জন্য কার্যকর। কারণ আমরা যেমন "শূন্য যদি সরাতে" হিসাবে অন্যদের উপর এই দুটি বেছে নেওয়া হয়েছে ( MEZ
) অথবা "যদি বেশি শূন্য সরাতে" ( MGZ
) ছিল MEZ
একটি খালি সংকেত থেকে একটি সত্য সংকেত তৈরি করতে হবে, যখন MGZ
একটি আরো জটিল চেক করা হয়, প্রয়োজন কমপক্ষে অন্য একটি বিট 1 হতে সাইন বিট 0 হবে।
পাটীগণিত
প্রসেসরের নকশাকে গাইড করার ক্ষেত্রে পরবর্তী-গুরুত্বপূর্ণ নির্দেশাবলী হ'ল মৌলিক গাণিতিক ক্রিয়াকলাপ। যেমনটি আমি আগেই উল্লেখ করেছি, আমরা সংক্ষিপ্ত-এডিয়ান সিরিয়াল ডেটা ব্যবহার করছি, যোগ / বিয়োগের ক্রিয়াকলাপের স্বাচ্ছন্দ্যের দ্বারা নির্ধারিত অন্তর্নিহয়ের পছন্দটি সহ। সর্বনিম্ন-তাত্পর্যপূর্ণ বিটটি প্রথমে পৌঁছানোর পরে, গাণিতিক ইউনিটগুলি সহজেই ক্যারি বিটের ট্র্যাক রাখতে পারে।
আমরা নেতিবাচক সংখ্যার জন্য 2 এর পরিপূরক প্রতিনিধিত্ব ব্যবহার করতে বেছে নিয়েছি, কারণ এটি সংযোজন এবং বিয়োগ আরও বেশি ধারাবাহিক করে তোলে। এটি লক্ষণীয় যে ওয়্যারওয়ার্ল্ড কম্পিউটার 1 এর পরিপূরক ব্যবহার করেছে।
সংযোজন এবং বিয়োগফলটি আমাদের কম্পিউটারের স্থানীয় গাণিতিক সহায়তার ব্যাপ্তি (পরে আলোচনা করা বিট শিফট ছাড়াও)। গুনের মতো অন্যান্য ক্রিয়াকলাপগুলি আমাদের আর্কিটেকচার দ্বারা পরিচালিত হওয়া অনেক জটিল, এবং সফ্টওয়্যারটিতে অবশ্যই প্রয়োগ করা উচিত।
বিটওয়াইজ অপারেশনস
আমাদের প্রসেসরের রয়েছে AND
, OR
এবং XOR
নির্দেশাবলী যা আপনার প্রত্যাশা অনুযায়ী করবে। বদলে আছে NOT
নির্দেশ, আমরা একটি "এবং নয়" (আছে বেছে নেওয়া হয়েছে ANT
) নির্দেশনা। NOT
নির্দেশের সাথে অসুবিধাটি আবার এটি হ'ল সিগন্যালের অভাব থেকে সিগন্যাল তৈরি করতে হবে, যা সেলুলার অটোম্যাটাতে কঠিন। ANT
প্রথম আর্গুমেন্ট বিট 1 এবং দ্বিতীয় আর্গুমেন্ট বিট 0 হলে নির্দেশটি কেবল 1 প্রদান করে Thus সুতরাং, (পাশাপাশি ) এর NOT x
সমতুল্য । তদ্ব্যতীত, বহুমুখী এবং এটি মাস্কিংয়ের মূল সুবিধা রয়েছে: টেট্রিস প্রোগ্রামের ক্ষেত্রে আমরা এটি টেট্রোমিনোসগুলি মুছতে ব্যবহার করি।ANT -1 x
XOR -1 x
ANT
বিট স্থানান্তর
বিট-শিফটিং অপারেশনগুলি হ'ল এএলইউ পরিচালিত সবচেয়ে জটিল অপারেশন। তারা দুটি ডেটা ইনপুট নেয়: শিফ্ট করার জন্য একটি মান এবং এটিকে স্থানান্তর করার জন্য একটি পরিমাণ। তাদের জটিলতা সত্ত্বেও (স্থানান্তরিত পরিবর্তনের পরিমাণের কারণে), এই কাজগুলি টেট্রিসের সাথে জড়িত অনেক "গ্রাফিকাল" অপারেশন সহ অনেক গুরুত্বপূর্ণ কাজের জন্য গুরুত্বপূর্ণ। বিট শিফটগুলি দক্ষ গুণ / বিভাগ আলগোরিদিমগুলির ভিত্তি হিসাবে কাজ করবে।
আমাদের প্রসেসরের তিন বিট শিফট অপারেশন রয়েছে, "শিফট বাম" ( SL
), "শিফট ডান লজিকাল" ( SRL
) এবং "শিফট ডান পাটিগণিত" ( SRA
)। প্রথম দুটি বিট শিফট ( SL
এবং SRL
) নতুন বিটগুলি সমস্ত শূন্যের সাথে পূরণ করে (যার অর্থ একটি নেগেটিভ সংখ্যা ডান স্থানান্তরিত হবে না negativeণাত্মক হবে না)। যদি শিফ্টের দ্বিতীয় তর্কটি 0 থেকে 15 এর সীমার বাইরে থাকে তবে ফলাফলটি সমস্ত শূন্য, যেমনটি আপনি আশা করতে পারেন। শেষ বিট শিফটের জন্য, SRA
বিট শিফটটি ইনপুটটির চিহ্নটি সংরক্ষণ করে এবং তাই দুটি দ্বারা সত্যিকারের বিভাগ হিসাবে কাজ করে।
নির্দেশ পাইপলাইনিং
আর্কিটেকচারের কিছু কৌতুকপূর্ণ বিবরণ সম্পর্কে কথা বলার এখনই সময়। প্রতিটি সিপিইউ চক্র নিম্নলিখিত পাঁচটি পদক্ষেপ নিয়ে গঠিত:
1. রম থেকে বর্তমান নির্দেশ আনুন
পিসির বর্তমান মানটি রম থেকে সম্পর্কিত নির্দেশ আনতে ব্যবহৃত হয়। প্রতিটি নির্দেশের একটি অপকোড এবং তিনটি অপারেশন রয়েছে। প্রতিটি অপারেন্ডে একটি করে ডেটা শব্দ এবং একটি সম্বোধন মোড থাকে। এই অংশগুলি রম থেকে পড়ার সাথে একে অপরের থেকে বিভক্ত হয়।
ওপকোডটি 16 টি অনন্য অপকডকে সমর্থন করার জন্য 4 বিট, যার মধ্যে 11 টি নিয়োগ করা হয়েছে:
0000 MNZ Move if Not Zero
0001 MLZ Move if Less than Zero
0010 ADD ADDition
0011 SUB SUBtraction
0100 AND bitwise AND
0101 OR bitwise OR
0110 XOR bitwise eXclusive OR
0111 ANT bitwise And-NoT
1000 SL Shift Left
1001 SRL Shift Right Logical
1010 SRA Shift Right Arithmetic
1011 unassigned
1100 unassigned
1101 unassigned
1110 unassigned
1111 unassigned
২. র্যামের পূর্ববর্তী নির্দেশনার ফলাফল (প্রয়োজনে) লিখুন
পূর্ববর্তী নির্দেশের শর্তের উপর নির্ভর করে (যেমন শর্তাধীন পদক্ষেপের জন্য প্রথম যুক্তির মান), একটি লেখা সম্পাদন করা হয়। লেখার ঠিকানা পূর্ববর্তী নির্দেশের তৃতীয় অপারেন্ড দ্বারা নির্ধারিত হয়।
এটি লক্ষ করা গুরুত্বপূর্ণ যে নির্দেশাবলী আনার পরে লেখাগুলি ঘটে। এটি একটি শাখার বিলম্ব স্লট তৈরির দিকে পরিচালিত করে যেখানে শাখার নির্দেশের সাথে সাথে নির্দেশটি (পিসিটিতে যে কোনও ক্রিয়াকলাপ লিখে থাকে) শাখার লক্ষ্যমাত্রায় প্রথম নির্দেশের পরিবর্তে কার্যকর করা হয়।
কিছু নির্দিষ্ট পরিস্থিতিতে (নিঃশর্ত জাম্পের মতো), শাখার বিলম্বের স্লটটি অপ্টিমাইজ করা যায়। অন্যান্য ক্ষেত্রে এটি পারে না, এবং একটি শাখার পরে নির্দেশ অবশ্যই খালি ছেড়ে দেওয়া উচিত। তদুপরি, এই জাতীয় বিলম্বের স্লটটির অর্থ হ'ল শাখাগুলি অবশ্যই একটি শাখার লক্ষ্য ব্যবহার করতে হবে যা প্রকৃত লক্ষ্য নির্দেশের চেয়ে 1 ঠিকানা কম, পিসি ইনক্রিমেন্টের জন্য অ্যাকাউন্টে আসে।
সংক্ষেপে, পরবর্তী নির্দেশের আউটপুট আনার পরে আগের নির্দেশিকার আউটপুটটি র্যামে লেখা হয়, শর্তসাপেক্ষে লাফ দেওয়ার পরে ফাঁকা নির্দেশনা থাকা দরকার, অন্যথায় পিসি লাফের জন্য সঠিকভাবে আপডেট করা হবে না।
৩. র্যাম থেকে বর্তমান নির্দেশের যুক্তিগুলির জন্য ডেটা পড়ুন
পূর্বে উল্লিখিত হিসাবে, তিনটি অপারেন্ডের প্রত্যেকটিতে একটি ডেটা শব্দ এবং একটি ঠিকানা মোড উভয়ই থাকে। ডেটা শব্দটি 16 বিট, র্যামের সমান প্রস্থ। ঠিকানা মোড 2 বিট।
অ্যাড্রেসিং মোডগুলি এই জাতীয় প্রসেসরের পক্ষে গুরুত্বপূর্ণ জটিলতার উত্স হতে পারে, কারণ অনেকগুলি আসল-ওয়ার্ল্ড অ্যাড্রেসিং মোডগুলি মাল্টি-স্টেপ কম্পিউটেশনগুলিতে জড়িত (অফসেট যুক্ত করার মতো)। একই সময়ে, বহুমুখী সম্বোধন মোডগুলি প্রসেসরের ব্যবহারযোগ্যতায় গুরুত্বপূর্ণ ভূমিকা পালন করে।
আমরা হার্ড-কোডেড নম্বরগুলি অপারেন্ড হিসাবে ব্যবহার করার এবং ডেটা ঠিকানাগুলি অপারেশন হিসাবে ব্যবহার করার ধারণাগুলি একত্রিত করার চেষ্টা করেছি। এটি পাল্টা-ভিত্তিক ঠিকানার মোড তৈরি করার দিকে পরিচালিত করেছিল: কোনও অপারেন্ডের অ্যাড্রেসিং মোড কেবল এমন একটি সংখ্যা যা প্রতিনিধিত্ব করে যা কোনও র্যাম রিড লুপের চারপাশে কতবার ডেটা প্রেরণ করা উচিত। এটি তাত্ক্ষণিক, প্রত্যক্ষ, অপ্রত্যক্ষ এবং ডাবল-অপ্রত্যক্ষ ঠিকানা সম্বোধন করে।
00 Immediate: A hard-coded value. (no RAM reads)
01 Direct: Read data from this RAM address. (one RAM read)
10 Indirect: Read data from the address given at this address. (two RAM reads)
11 Double-indirect: Read data from the address given at the address given by this address. (three RAM reads)
এই ডিফেরেন্সিং সম্পাদন করার পরে, নির্দেশের তিনটি অপারেটের বিভিন্ন ভূমিকা রয়েছে। প্রথম অপারেন্ডটি সাধারণত বাইনারি অপারেটরের প্রথম আর্গুমেন্ট হয়, তবে বর্তমান নির্দেশটি শর্তযুক্ত পদক্ষেপ থাকলে শর্ত হিসাবেও কাজ করে। দ্বিতীয় অপারেন্ডটি বাইনারি অপারেটরের জন্য দ্বিতীয় যুক্তি হিসাবে কাজ করে। তৃতীয় অপারেন্ড নির্দেশের ফলাফলের জন্য গন্তব্য ঠিকানা হিসাবে কাজ করে।
যেহেতু প্রথম দুটি নির্দেশিকা ডেটা হিসাবে কাজ করে তৃতীয়টি ঠিকানা হিসাবে কাজ করে, ঠিকানা মোডগুলিতে তারা কোন অবস্থানে ব্যবহৃত হয় তার উপর নির্ভর করে কিছুটা আলাদা ব্যাখ্যা থাকে For উদাহরণস্বরূপ, কোনও স্থির র্যাম ঠিকানা থেকে ডেটা পড়তে সরাসরি মোড ব্যবহার করা হয় (যেহেতু একটি র্যাম পঠন করা প্রয়োজন), তবে তাত্ক্ষণিক মোডটি একটি নির্দিষ্ট র্যাম ঠিকানায় ডেটা লেখার জন্য ব্যবহৃত হয় (যেহেতু কোনও র্যাম পড়া আবশ্যক নয়)।
৪. ফলাফল গণনা করুন
অপ্কোড এবং প্রথম দুটি অপারেশনগুলিকে বাইনারি অপারেশন করতে আএলইউতে প্রেরণ করা হয়। পাটিগণিত, বিটওয়াইজ এবং শিফট অপারেশনের জন্য, এর অর্থ প্রাসঙ্গিক অপারেশন করা performing শর্তাধীন পদক্ষেপের জন্য, এর অর্থ সহজভাবে দ্বিতীয় অপারেন্ডকে ফিরিয়ে দেওয়া।
ওপকোড এবং প্রথম অপারেন্ড অবস্থাটি গণনা করতে ব্যবহৃত হয়, যা মেমোরিতে ফলাফল লিখতে হবে কিনা তা নির্ধারণ করে। শর্তাধীন পদক্ষেপের ক্ষেত্রে, এর অর্থ হয় অপারেন্ডের কোনও বিট 1 (for MNZ
) কিনা তা নির্ধারণ করা, বা সাইন বিট 1 (for MLZ
) কিনা তা নির্ধারণ করা । যদি অপকোড শর্তসাপেক্ষ পদক্ষেপ না হয় তবে লেখার ক্ষেত্রে সর্বদা কার্য সম্পাদন করা হয় (শর্তটি সর্বদা সত্য)।
৫. প্রোগ্রামের কাউন্টার বাড়ানো
শেষ পর্যন্ত, প্রোগ্রামের কাউন্টারটি পড়া, বর্ধিত এবং লিখিত হয়।
নির্দেশিকা পাঠ এবং নির্দেশনা লেখার মধ্যে পিসি বর্ধনের অবস্থানের কারণে, এর অর্থ হ'ল যে নির্দেশ যা পিসিকে 1 দ্বারা বৃদ্ধি করে তা কোনও অপ-অপশন নয়। পিসি নিজেই অনুলিপি করে এমন একটি নির্দেশের ফলে পরবর্তী নির্দেশগুলি পরপর দু'বার সম্পাদিত হয়। তবে, সতর্কতা অবলম্বন করুন, একের পর এক বহু পিসি নির্দেশাবলী যদি আপনি নির্দেশের পাইপলাইনে মনোযোগ না দেন তবে অসীম লুপিং সহ জটিল প্রভাব ফেলতে পারে।
টেট্রিস অ্যাসেমব্লির জন্য অনুসন্ধান
আমরা আমাদের প্রসেসরের জন্য কিউএফটিএএসএম নামে একটি নতুন সমাবেশ ভাষা তৈরি করেছি। এই সমাবেশ ভাষাটি কম্পিউটারের রোমে মেশিন কোডের সাথে 1-থেকে-1 এর সাথে সম্পর্কিত।
যে কোনও কিউএফটিএএসএম প্রোগ্রামটি প্রতি লাইনে এক নির্দেশের সিরিজ হিসাবে লেখা হয় line প্রতিটি লাইন এভাবে বিন্যাস করা হয়:
[line numbering] [opcode] [arg1] [arg2] [arg3]; [optional comment]
অপকোড তালিকা
যেমনটি আগে আলোচনা করা হয়েছে, এখানে কম্পিউটার দ্বারা সমর্থিত এগারটি অপকড রয়েছে, যার প্রতিটিটিতে তিনটি অপারেট রয়েছে:
MNZ [test] [value] [dest] – Move if Not Zero; sets [dest] to [value] if [test] is not zero.
MLZ [test] [value] [dest] – Move if Less than Zero; sets [dest] to [value] if [test] is less than zero.
ADD [val1] [val2] [dest] – ADDition; store [val1] + [val2] in [dest].
SUB [val1] [val2] [dest] – SUBtraction; store [val1] - [val2] in [dest].
AND [val1] [val2] [dest] – bitwise AND; store [val1] & [val2] in [dest].
OR [val1] [val2] [dest] – bitwise OR; store [val1] | [val2] in [dest].
XOR [val1] [val2] [dest] – bitwise XOR; store [val1] ^ [val2] in [dest].
ANT [val1] [val2] [dest] – bitwise And-NoT; store [val1] & (![val2]) in [dest].
SL [val1] [val2] [dest] – Shift Left; store [val1] << [val2] in [dest].
SRL [val1] [val2] [dest] – Shift Right Logical; store [val1] >>> [val2] in [dest]. Doesn't preserve sign.
SRA [val1] [val2] [dest] – Shift Right Arithmetic; store [val1] >> [val2] in [dest], while preserving sign.
সম্বোধন মোড
অপারেটরগুলির প্রত্যেকটিতে একটি ডেটা মান এবং একটি ঠিকানা সরানো থাকে contains -32768 থেকে 32767 সীমাতে দশমিক সংখ্যা দ্বারা ডেটা মান বর্ণিত হয় The
mode name prefix
0 immediate (none)
1 direct A
2 indirect B
3 double-indirect C
উদাহরণ কোড
পাঁচ লাইনে ফিবোনাচি ক্রম:
0. MLZ -1 1 1; initial value
1. MLZ -1 A2 3; start loop, shift data
2. MLZ -1 A1 2; shift data
3. MLZ -1 0 0; end loop
4. ADD A2 A3 1; branch delay slot, compute next term
এই কোডটি ফিবোনাচি সিক্যুয়েন্সটি গণনা করে, বর্তমান পদটি র্যামের ঠিকানা 1 সহ। এটি 28657 এর পরে দ্রুত উপচে পড়েছে।
ধূসর কোড:
0. MLZ -1 5 1; initial value for RAM address to write to
1. SUB A1 5 2; start loop, determine what binary number to covert to Gray code
2. SRL A2 1 3; shift right by 1
3. XOR A2 A3 A1; XOR and store Gray code in destination address
4. SUB B1 42 4; take the Gray code and subtract 42 (101010)
5. MNZ A4 0 0; if the result is not zero (Gray code != 101010) repeat loop
6. ADD A1 1 1; branch delay slot, increment destination address
এই প্রোগ্রামটি গ্রে কোডটি গণনা করে এবং কোডটি 5 নম্বর থেকে শুরু করে স্যাকসেসিভ ঠিকানায় সংরক্ষণ করে This ফলাফল গ্রে গ্রে কোড হয়ে যাওয়ার পরে এটি বন্ধ হয়ে যায় 101010
, যা ৫ address ঠিকানায় ইনপুট ৫০ এর জন্য ঘটে।
অনলাইন দোভাষী
El'endia Starman খুব দরকারী অনলাইন অনুবাদক সৃষ্টি করেছেন এখানে । আপনি কোডটি পদক্ষেপ নিতে পারবেন, ব্রেকপয়েন্টগুলি সেট করতে পারবেন, র্যামকে ম্যানুয়াল রাইটিং সম্পাদন করতে পারবেন এবং র্যামকে প্রদর্শন হিসাবে দৃশ্যমান করতে পারবেন।
Cogol
একবার আর্কিটেকচার এবং সমাবেশ ভাষা সংজ্ঞায়িত হয়ে গেলে, প্রকল্পের "সফ্টওয়্যার" পাশের পরবর্তী পদক্ষেপটি ছিল উচ্চ স্তরের ভাষা তৈরি করা, যা টেট্রিসের জন্য উপযুক্ত। এভাবে আমি কোগল তৈরি করেছি । নামটি "সিওবিএল" এবং "সি অফ গেম অফ লাইফ" এর একটি সংক্ষিপ্ত বিবরণ উভয়ই, যদিও এটি লক্ষণীয় যে আমাদের কম্পিউটারটি প্রকৃত কম্পিউটারের কাছে সি-র কী C
কোগোল সমাবেশ ভাষার ঠিক উপরে একটি স্তরে বিদ্যমান। সাধারণত, একটি কোগল প্রোগ্রামের বেশিরভাগ লাইন প্রতিটি সমাবেশের একক লাইনের সাথে মিলে যায় তবে ভাষার কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে:
- বুনিয়াদি বৈশিষ্ট্যগুলির মধ্যে অ্যাসাইনমেন্ট এবং অপারেটরগুলির সাথে নামযুক্ত ভেরিয়েবলগুলি রয়েছে যাতে আরও পাঠযোগ্য সিনট্যাক্স থাকে synt উদাহরণস্বরূপ, ঠিকানার সাথে সংকলক ম্যাপিং ভেরিয়েবলগুলি সহ
ADD A1 A2 3
হয়ে যায় z = x + y;
।
- লুপিং নির্মাণগুলি যেমন
if(){}
, while(){}
এবং do{}while();
তাই সংকলক শাখা পরিচালনা করে ing
- এক-মাত্রিক অ্যারে (পয়েন্টার পাটিগণিত সহ), যা টেট্রিস বোর্ডের জন্য ব্যবহৃত হয়।
- সাবরুটাইনস এবং একটি কল স্ট্যাক। কোডগুলির বৃহত অংশগুলির সদৃশতা রোধ এবং পুনরাবৃত্তি সমর্থন করার জন্য এগুলি কার্যকর।
সংকলক (যা আমি স্ক্র্যাচ থেকে লিখেছি) খুব বেসিক / নির্বোধ, তবে আমি সংক্ষিপ্ত সংকলিত প্রোগ্রামের দৈর্ঘ্য অর্জন করতে বেশ কয়েকটি ভাষা নির্মাতাকে হাত-অনুকূল করতে চেষ্টা করেছি।
বিভিন্ন ভাষার বৈশিষ্ট্যগুলি কীভাবে কাজ করে তার কয়েকটি সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল:
Tokenization
উত্স কোডটি টোকেনাইজড লিনিয়ারলি (একক-পাস), সাধারণ নিয়ম ব্যবহার করে কোন অক্ষরের সাথে টোকেনের সাথে সংলগ্ন হওয়ার অনুমতি দেওয়া হয়। যখন কোনও চরিত্রের মুখোমুখি হয় যা বর্তমান টোকেনের শেষ চরিত্রের সাথে সংলগ্ন হতে পারে না, বর্তমান টোকেনটি সম্পূর্ণ বলে মনে করা হয় এবং নতুন চরিত্রটি একটি নতুন টোকেন শুরু করে। কিছু অক্ষর (যেমন {
বা ,
) অন্য কোনও অক্ষরের সাথে সংলগ্ন হতে পারে না এবং তাই তাদের নিজস্ব টোকেন। অন্যরা (যেমন >
অথবা =
) শুধুমাত্র তাদের বর্গ মধ্যে অন্যান্য অক্ষরের সংলগ্ন হতে করার অনুমতি দেওয়া হয়, এবং এইভাবে মত টোকেন গঠন করতে পারেন >>>
, ==
অথবা >=
, কিন্তু পছন্দ না =2
। হোয়াইটস্পেসের অক্ষরগুলি টোকেনগুলির মধ্যে একটি সীমানা জোর করে তবে সেগুলি ফলাফলের মধ্যে অন্তর্ভুক্ত হয় না। টোকনাইজ করা সবচেয়ে কঠিন চরিত্রটি-
কারণ এটি উভয় বিয়োগ এবং অযৌক্তিক অবহেলা উপস্থাপন করতে পারে এবং তাই কিছু বিশেষ-আবরণ প্রয়োজন।
পদান্বয়
পার্সিংটি একক-পাস ফ্যাশনেও করা হয়। সংকলকটির বিভিন্ন ভাষার নির্মাণের প্রতিটি পরিচালনা করার জন্য পদ্ধতি রয়েছে এবং টোকেনগুলি বৈশ্বিক টোকেন তালিকার বাইরে চলে যায় কারণ তারা বিভিন্ন সংকলক পদ্ধতি ব্যবহার করে। সংকলক যদি কখনও এমন কোনও টোকেন দেখেন যা এটি প্রত্যাশা করে না তবে এটি একটি সিনট্যাক্স ত্রুটি উত্থাপন করে।
গ্লোবাল মেমরি বরাদ্দ
সংকলক প্রতিটি গ্লোবাল ভেরিয়েবল (শব্দ বা অ্যারে) এর নিজস্ব নির্ধারিত র্যাম ঠিকানা (এস) নির্ধারণ করে। কীওয়ার্ডটি ব্যবহার করে সমস্ত ভেরিয়েবলগুলি ডিক্লেয়ার করা প্রয়োজন my
যাতে সংকলক এটির জন্য স্থান বরাদ্দ করতে জানে। নামযুক্ত গ্লোবাল ভেরিয়েবলের চেয়ে অনেক বেশি শীতল হ'ল স্ক্র্যাচ অ্যাড্রেস মেমরি ম্যানেজমেন্ট। অনেক নির্দেশাবলীর (বিশেষত শর্তসাপেক্ষ এবং অনেকগুলি অ্যারে অ্যাক্সেস) মধ্যবর্তী গণনাগুলি সঞ্চয় করতে অস্থায়ী "স্ক্র্যাচ" ঠিকানা প্রয়োজন। সংকলন প্রক্রিয়া চলাকালীন সংকলক প্রয়োজনীয় হিসাবে স্ক্র্যাচ ঠিকানা বরাদ্দ এবং ডি-বরাদ্দ করে। যদি সংকলকটির আরও স্ক্র্যাচ ঠিকানা প্রয়োজন হয় তবে এটি স্ক্র্যাচ ঠিকানা হিসাবে আরও র্যাম উত্সর্গ করবে। আমি বিশ্বাস করি যে এটি কোনও প্রোগ্রামের জন্য কেবল কয়েকটি স্ক্র্যাচ ঠিকানা প্রয়োজন, তবে প্রতিটি স্ক্র্যাচ ঠিকানা বহুবার ব্যবহৃত হবে believe
IF-ELSE
বিবৃতি
if-else
বিবৃতিগুলির জন্য সিনট্যাক্সটি স্ট্যান্ডার্ড সি ফর্ম:
other code
if (cond) {
first body
} else {
second body
}
other code
যখন কিউএফটিএএসএম তে রূপান্তরিত হয়, কোডটি এইভাবে সাজানো হয়:
other code
condition test
conditional jump
first body
unconditional jump
second body (conditional jump target)
other code (unconditional jump target)
যদি প্রথম বডি কার্যকর করা হয় তবে দ্বিতীয় বডিটি এড়িয়ে যায়। প্রথম বডিটি যদি এড়িয়ে যায় তবে দ্বিতীয় শরীরটি কার্যকর করা হয়।
সমাবেশে, একটি শর্ত পরীক্ষা সাধারণত সাধারণত একটি বিয়োগ হয়, এবং ফলাফলের সাইনটি লাফিয়ে লাফিয়ে লাফিয়ে বা শারীরিক সম্পাদন করে কিনা তা নির্ধারণ করে। একটি MLZ
নির্দেশনা যেমন অসম্পূর্ণতা পরিচালনা করতে ব্যবহার করা হয় >
বা যেমন <=
। MNZ
হ্যান্ডল করার জন্য একটি নির্দেশনা ব্যবহৃত হয় ==
, যেহেতু পার্থক্যটি শূন্য না হয় (এবং তাই যখন যুক্তি সমান হয় না) তখন এটি শরীরের উপরে লাফ দেয়। একাধিক-এক্সপ্রেশন শর্তাদি বর্তমানে সমর্থিত নয়।
যদি else
বিবৃতিটি বাদ দেওয়া হয় তবে নিঃশর্ত জাম্পটিও বাদ দেওয়া হয় এবং কিউএফটিএএসএম কোডটি দেখতে এমন দেখাচ্ছে:
other code
condition test
conditional jump
body
other code (conditional jump target)
WHILE
বিবৃতি
while
বিবৃতিগুলির জন্য সিনট্যাক্সটিও স্ট্যান্ডার্ড সি ফর্ম:
other code
while (cond) {
body
}
other code
যখন কিউএফটিএএসএম তে রূপান্তরিত হয়, কোডটি এইভাবে সাজানো হয়:
other code
unconditional jump
body (conditional jump target)
condition test (unconditional jump target)
conditional jump
other code
কন্ডিশন টেস্টিং এবং শর্তসাপূর্ণ জাম্প ব্লকের শেষে থাকে, যার অর্থ তারা ব্লকের প্রতিটি মৃত্যুর পরে পুনরায় সম্পাদন করা হয়। যখন শর্তটি মিথ্যা ফিরে আসে তখন শরীরের পুনরাবৃত্তি হয় না এবং লুপ শেষ হয়। লুপ এক্সিকিউশন শুরুর সময় কন্ট্রোল ফ্লো লুপের শরীরের উপর দিয়ে শর্তের কোডে লাফ দেয়, সুতরাং শর্তটি প্রথমবার মিথ্যা হলে শরীর কখনই কার্যকর করা হয় না।
একটি MLZ
নির্দেশনা যেমন অসম্পূর্ণতা পরিচালনা করতে ব্যবহার করা হয় >
বা যেমন <=
। if
বিবৃতি দেওয়ার সময় ভিন্ন , একটি MNZ
নির্দেশনা হ্যান্ডেল করার জন্য ব্যবহৃত হয় !=
, যেহেতু এটি শরীরে লাফ দেয় যখন পার্থক্যটি শূন্য হয় না (এবং তাই যখন যুক্তি সমান হয় না)।
DO-WHILE
বিবৃতি
while
এবং এর মধ্যে একমাত্র পার্থক্য do-while
হ'ল do-while
লুপের বডিটি প্রাথমিকভাবে এড়িয়ে যায় না তাই এটি সর্বদা কমপক্ষে একবার কার্যকর করা হয়। do-while
যখন আমি জানি লুপ কখনই পুরোপুরি ছেড়ে যায় না তখন আমি সাধারণত সমাবেশ কোডের কয়েকটি লাইন সংরক্ষণ করতে বিবৃতি ব্যবহার করি ।
অ্যারেগুলির
এক-মাত্রিক অ্যারেগুলি মেমরির সংলগ্ন ব্লক হিসাবে প্রয়োগ করা হয়। সমস্ত অ্যারে তাদের ঘোষণার ভিত্তিতে স্থির দৈর্ঘ্য। অ্যারেগুলি এভাবে ঘোষিত হয়:
my alpha[3]; # empty array
my beta[11] = {3,2,7,8}; # first four elements are pre-loaded with those values
অ্যারের জন্য, এটি একটি সম্ভাব্য র্যাম ম্যাপিং, এটি দেখায় কিভাবে অ্যারেটির জন্য 15-18 ঠিকানাগুলি সংরক্ষিত থাকে:
15: alpha
16: alpha[0]
17: alpha[1]
18: alpha[2]
লেবেলযুক্ত ঠিকানাটির alpha
অবস্থানের জন্য একটি পয়েন্টার দিয়ে ভরাট করা হয়েছে alpha[0]
, সুতরাং থাই কেস এড্রেসে 15 মান রয়েছে The alpha
ভেরিয়েবলটি কোগল কোডের অভ্যন্তরে ব্যবহার করা যেতে পারে, সম্ভবত আপনি যদি এই অ্যারেটিকে স্ট্যাক হিসাবে ব্যবহার করতে চান তবে সম্ভবত স্ট্যাক পয়েন্টার হিসাবে ।
একটি অ্যারের উপাদান অ্যাক্সেস স্ট্যান্ডার্ড array[index]
স্বরলিপি দিয়ে সম্পন্ন করা হয়। যদি মানটি index
ধ্রুবক হয়, তবে এই রেফারেন্সটি স্বয়ংক্রিয়ভাবে সেই উপাদানটির পরম ঠিকানা দিয়ে পূর্ণ হয়ে যায়। অন্যথায় এটি কাঙ্ক্ষিত পরম ঠিকানা খুঁজতে কিছু পয়েন্টার গাণিতিক (কেবল সংযোজন) সম্পাদন করে। বাসা অনুসারে সূচি তৈরি করাও সম্ভব alpha[beta[1]]
।
সাবরুটাইনস এবং কলিং
সাবরুটাইনগুলি কোডের ব্লক যা একাধিক প্রসঙ্গ থেকে কল করা যেতে পারে, কোডের নকল রোধ করে এবং পুনরাবৃত্ত প্রোগ্রামগুলি তৈরি করার অনুমতি দেয়। ফিবোনাচি নম্বর (মূলত সবচেয়ে ধীরতম অ্যালগরিদম) তৈরি করতে এখানে একটি পুনরাবৃত্ত সাববারোটিন সহ একটি প্রোগ্রাম রয়েছে:
# recursively calculate the 10th Fibonacci number
call display = fib(10).sum;
sub fib(cur,sum) {
if (cur <= 2) {
sum = 1;
return;
}
cur--;
call sum = fib(cur).sum;
cur--;
call sum += fib(cur).sum;
}
একটি সাব্রুটাইন কীওয়ার্ড সহ ঘোষিত হয় sub
এবং একটি সাব্রোটিন প্রোগ্রামের ভিতরে যে কোনও জায়গায় রাখা যায়। প্রতিটি সাব্রোটিনে একাধিক স্থানীয় ভেরিয়েবল থাকতে পারে, যা তার যুক্তিগুলির তালিকার অংশ হিসাবে ঘোষিত হয়। এই যুক্তিগুলিকে ডিফল্ট মানও দেওয়া যেতে পারে।
পুনরাবৃত্তি কলগুলি পরিচালনা করতে, একটি সাব্রোটিনের স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের মধ্যে সংরক্ষণ করা হয়। র্যামের সর্বশেষ স্থিতিশীল পরিবর্তনশীল হ'ল কল স্ট্যাক পয়েন্টার এবং এর পরে সমস্ত স্মৃতি কল স্ট্যাক হিসাবে কাজ করে। যখন সাব্রোটিন বলা হয়, এটি কল স্ট্যাকের উপর একটি নতুন ফ্রেম তৈরি করেছিল, এতে সমস্ত স্থানীয় ভেরিয়েবলের পাশাপাশি ফেরত (রম) ঠিকানা অন্তর্ভুক্ত থাকে। প্রোগ্রামটির প্রতিটি সাব্রোটিনকে পয়েন্টার হিসাবে পরিবেশন করার জন্য একটি একক স্থিতিশীল র্যাম ঠিকানা দেওয়া হয়। এই পয়েন্টারটি কল স্ট্যাকের সাব্রোটিনের "বর্তমান" কলটির অবস্থান দেয়। স্থানীয় স্থায়ী ভেরিয়েবলের উল্লেখ দেওয়ার জন্য এই স্থির পয়েন্টারের সাথে একটি অফসেটের মান ব্যবহার করে একটি স্থানীয় ভেরিয়েবল উল্লেখ করা হয়। কল স্ট্যাকের মধ্যে থাকা স্থির পয়েন্টারের পূর্বের মান। এখানে'
RAM map:
0: pc
1: display
2: scratch0
3: fib
4: scratch1
5: scratch2
6: scratch3
7: call
fib map:
0: return
1: previous_call
2: cur
3: sum
সাবরুটাইনগুলি সম্পর্কে আকর্ষণীয় একটি বিষয় হ'ল তারা কোনও নির্দিষ্ট মান ফেরত দেয় না। বরং সাব্রুটিনের সমস্ত স্থানীয় ভেরিয়েবলগুলি সাব্রুটিন সম্পাদন করার পরে পড়তে পারে, তাই সাব্রুটিন কল থেকে বিভিন্ন ধরণের ডেটা বের করা যায়। সাব্রোটিনের সেই নির্দিষ্ট কলটির জন্য পয়েন্টারটি সংরক্ষণ করে এটি সম্পন্ন হয়, যা পরে (সম্প্রতি-বিচ্ছিন্ন) স্ট্যাক ফ্রেমের মধ্যে থেকে স্থানীয় যেকোন ভেরিয়েবল পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।
সাবড্রোটিন কল করার একাধিক উপায় রয়েছে, সমস্ত call
কীওয়ার্ডটি ব্যবহার করে :
call fib(10); # subroutine is executed, no return vaue is stored
call pointer = fib(10); # execute subroutine and return a pointer
display = pointer.sum; # access a local variable and assign it to a global variable
call display = fib(10).sum; # immediately store a return value
call display += fib(10).sum; # other types of assignment operators can also be used with a return value
সাবুরটাইন কলের জন্য যে কোনও সংখ্যক মান আর্গুমেন্ট হিসাবে দেওয়া যেতে পারে। প্রদত্ত কোনও যুক্তি তার ডিফল্ট মান, যদি থাকে তবে তা পূরণ করা হবে। একটি আর্গুমেন্ট যা সরবরাহ করা হয়নি এবং কোনও ডিফল্ট মান নেই তা সাফ করা হয়নি (নির্দেশাবলী / সময় বাঁচাতে) সাব্রোটিনের শুরুতে কোনও মান গ্রহণ করতে পারে।
পয়েন্টারগুলি সাব্রোটিনের একাধিক স্থানীয় ভেরিয়েবলগুলি অ্যাক্সেস করার একটি উপায়, যদিও এটি উল্লেখ করা গুরুত্বপূর্ণ যে পয়েন্টারটি কেবলমাত্র অস্থায়ী: পয়েন্টারটি যে ডেটাটিকে নির্দেশ করে সেটি অন্য ধ্বংস হয়ে যাবে যখন অন্য সাব্রোটিন কল করা হবে।
ডিবাগিং লেবেলগুলি
{...}
একটি কোগল প্রোগ্রামের যে কোনও কোড ব্লকের আগে বহু-শব্দের বর্ণনামূলক লেবেল থাকতে পারে। এই লেবেলটি সংকলিত সমাবেশ কোডে একটি মন্তব্য হিসাবে সংযুক্ত করা হয়েছে এবং এটি ডিবাগিংয়ের জন্য খুব কার্যকর হতে পারে যেহেতু কোডটির নির্দিষ্ট অংশগুলি সনাক্ত করা সহজ করে তোলে।
শাখা বিলম্ব স্লট অপ্টিমাইজেশন
সংকলিত কোডটির গতি উন্নত করার জন্য, কোগল সংকলক কিউএফটিএএসএম কোডের একটি চূড়ান্ত পাস হিসাবে কিছু সত্যিকারের বেসিক বিলম্ব স্লট অপ্টিমাইজেশন সম্পাদন করে। খালি শাখার বিলম্ব স্লট সহ যে কোনও শর্তহীন লাফের জন্য, বিলম্ব স্লটটি জাম্পের গন্তব্যে প্রথম নির্দেশের মাধ্যমে পূরণ করা যেতে পারে এবং পরবর্তী নির্দেশের দিকে নির্দেশ করতে জাম্পের গন্তব্য এক দ্বারা বাড়ানো হয়। নিঃশর্ত লাফানো প্রতিটি সময় এটি সাধারণত একটি চক্র সাশ্রয় করে।
কোগলে টেট্রিস কোড লেখা
চূড়ান্ত টেট্রিস প্রোগ্রামটি কোগলে লেখা হয়েছিল এবং উত্স কোডটি এখানে পাওয়া যায় । সংকলিত কিউএফটিএএসএম কোডটি এখানে উপলভ্য । সুবিধার জন্য, এখানে একটি পারমিলিংক সরবরাহ করা হয়: কিউএফটিএএসএম-এ টেট্রিস । যেহেতু লক্ষ্যটি ছিল অ্যাসেম্বলি কোডটি (কোগোল কোড নয়) গল্ফ করা, ফলস্বরূপ কোগল কোডটি অনর্থক। প্রোগ্রামের অনেকগুলি অংশ সাধারণত সাবরুটাইনগুলিতে অবস্থিত তবে সেই সাবরুটাইনগুলি আসলে যথেষ্ট সংক্ষিপ্ত ছিল যে কোডটি সংরক্ষণের নির্দেশিকাগুলির নকল করেcall
বিবৃতি। চূড়ান্ত কোডটিতে মূল কোড ছাড়াও একটি সাবরুটাইন থাকে। অতিরিক্ত হিসাবে, অনেক অ্যারে সরানো হয় এবং পৃথক ভেরিয়েবলের সমতুল্য দীর্ঘ তালিকা সহ বা প্রোগ্রামে প্রচুর হার্ড কোডিং নম্বর দ্বারা প্রতিস্থাপন করা হয়। চূড়ান্ত সংকলিত কিউএফটিএএসএম কোডটি 300 নির্দেশাবলীর অধীনে রয়েছে, যদিও এটি স্বয়ং কোগল উত্সের চেয়ে সামান্য দীর্ঘ।