অনুকরণ একটি বহু-মুখী অঞ্চল। এখানে মূল ধারণা এবং কার্যকরী উপাদান রয়েছে are আমি এটিকে টুকরো টুকরো করে টুকরো টুকরো করব এবং তারপরে সম্পাদনাগুলির মাধ্যমে বিশদটি পূরণ করব। আমি যে বিষয়গুলি বর্ণনা করতে চলেছি তার অনেকগুলি প্রসেসরের অভ্যন্তরীণ কার্যকারিতা সম্পর্কে জ্ঞানের প্রয়োজন হবে - সমাবেশ জ্ঞান প্রয়োজনীয়। আমি যদি কিছু বিষয়ে কিছুটা অস্পষ্ট হয়ে থাকি তবে দয়া করে প্রশ্ন জিজ্ঞাসা করুন যাতে আমি এই উত্তরটির উন্নতি অবিরত রাখতে পারি।
মৌলিক ধারণা:
অনুকরণ প্রসেসরের আচরণ এবং স্বতন্ত্র উপাদানগুলির পরিচালনা করে কাজ করে। আপনি সিস্টেমের প্রতিটি পৃথক টুকরা তৈরি করেন এবং তারপরে হার্ডওয়ারের মতো তারের মতো টুকরোগুলি সংযুক্ত করেন।
প্রসেসর অনুকরণ:
প্রসেসরের এমুলেশন পরিচালনা করার তিনটি উপায় রয়েছে:
- ব্যাখ্যা
- গতিশীল পুনঃসংশোধন
- স্থির পুনঃসংশোধন
এই সমস্ত পাথের সাথে আপনার একই সামগ্রিক লক্ষ্য রয়েছে: প্রসেসরের স্টেটটি সংশোধন করতে এবং 'হার্ডওয়্যার' এর সাথে ইন্টারঅ্যাক্ট করার জন্য একটি কোডের টুকরা কার্যকর করুন। প্রসেসর রাষ্ট্রটি প্রদত্ত প্রসেসরের টার্গেটের জন্য প্রসেসর রেজিস্টার, বাধা হ্যান্ডলার ইত্যাদির একত্রিত করা is 6502 জন্য, আপনি রেজিস্টার প্রতিনিধিত্বমূলক 8 বিট ইন্টিজার সংখ্যার আছে চাই: A
, X
, Y
, P
, এবং S
; আপনার একটি 16-বিট PC
রেজিস্টার থাকতে হবে।
ব্যাখ্যার সাথে, আপনি IP
(নির্দেশ পয়েন্টার - এটিও বলা হয় PC
, প্রোগ্রাম কাউন্টার) থেকে শুরু করুন এবং মেমরি থেকে নির্দেশটি পড়েন। আপনার কোড এই নির্দেশকে পার্স করে এবং আপনার প্রসেসরের দ্বারা নির্দিষ্ট হিসাবে প্রসেসরের অবস্থার পরিবর্তন করতে এই তথ্য ব্যবহার করে। ব্যাখ্যার মূল সমস্যাটি হ'ল এটি খুব ধীর; প্রতিবার আপনি কোনও প্রদত্ত নির্দেশকে পরিচালনা করবেন, আপনাকে এটিকে ডিকোড করতে হবে এবং প্রয়োজনীয় অপারেশন করতে হবে।
গতিশীল পুনঃসংশোধন সহ, আপনি কোডটি অনেকটা ব্যাখ্যার মতো পুনরাবৃত্তি করেন, তবে কেবল অপকডগুলি কার্যকর করার পরিবর্তে, আপনি অপারেশনগুলির একটি তালিকা তৈরি করেন। একবার আপনি কোনও শাখার নির্দেশে পৌঁছানোর পরে, আপনি আপনার হোস্ট প্ল্যাটফর্মের জন্য মেশিন কোডে অপারেশনগুলির এই তালিকাটি সংকলন করুন, তারপরে আপনি এই সংকলিত কোডটি ক্যাশে করুন এবং এটি সম্পাদন করুন। তারপরে আপনি যখন কোনও প্রদত্ত নির্দেশ গোষ্ঠীকে আবার আঘাত করবেন তখন আপনাকে কেবল ক্যাশে থেকে কোডটি কার্যকর করতে হবে। (বিটিডাব্লু, বেশিরভাগ লোকেরা আসলে নির্দেশাবলীর একটি তালিকা তৈরি করে না তবে ফ্লাইতে মেশিন কোডে সেগুলি সংকলন করে - এটি অনুকূলকরণ আরও কঠিন করে তোলে, তবে পর্যাপ্ত লোকেরা আগ্রহী না হলে এটি এই উত্তরের ক্ষেত্রের বাইরে))
স্থির পুনঃসংশোধন সহ, আপনি গতিশীল পুনঃসংশোধনের মতোই করেন তবে আপনি শাখাগুলি অনুসরণ করেন। আপনি প্রোগ্রামের সমস্ত কোডকে উপস্থাপিত কোডের একটি অংশ তৈরির কাজ শেষ করেন, যা পরে আর কোনও হস্তক্ষেপ ছাড়াই কার্যকর করা যায়। নিম্নলিখিত সমস্যাগুলির জন্য না হলে এটি একটি দুর্দান্ত প্রক্রিয়া হবে:
- প্রোগ্রামে যে কোডটি শুরু হয় না (যেমন সংক্ষেপিত, এনক্রিপ্ট করা, জেনারেট / রানটাইম সময়ে সংশোধিত ইত্যাদি) পুনরায় সংযোগ করা হবে না, সুতরাং এটি চলবে না
- এটি প্রমাণিত হয়েছে যে প্রদত্ত বাইনারিতে সমস্ত কোড সন্ধান করা হ্যালটিং সমস্যার সমতুল্য
এগুলি 99% ক্ষেত্রে স্থিতিশীল পুনঃসংশোধন সম্পূর্ণভাবে অদৃশ্য করে তোলে। আরও তথ্যের জন্য, মাইকেল স্টিল স্থির পুনঃসংশ্লিষ্ট সম্পর্কে কিছু দুর্দান্ত গবেষণা করেছেন - আমি দেখেছি সেরা।
প্রসেসর এমুলেশনের অন্য দিকটি হল আপনি যেভাবে হার্ডওয়্যারটির সাথে ইন্টারঅ্যাক্ট করেন। এর সত্যই দুটি দিক রয়েছে:
- প্রসেসরের সময়
- বাধা হ্যান্ডলিং
প্রসেসরের সময়:
নির্দিষ্ট প্ল্যাটফর্মগুলি - বিশেষত NES, SNES ইত্যাদির মতো পুরানো কনসোলগুলি - সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ হওয়ার জন্য আপনার এমুলেটরটির কঠোর সময় প্রয়োজন। এনইএসের সাথে আপনার পিপিইউ (পিক্সেল প্রসেসিং ইউনিট) রয়েছে যার জন্য সিপিইউ নির্দিষ্ট মুহুর্তে পিক্সেলগুলি তার স্মৃতিতে রেখে দেয় memory আপনি যদি ব্যাখ্যার ব্যবহার করেন তবে আপনি সহজেই চক্রটি গণনা করতে পারেন এবং যথাযথ সময় নির্ধারণ করতে পারেন; গতিশীল / স্থির পুনঃসংশোধন সহ, জিনিসগুলি একটি / প্রচুর / আরও জটিল।
বাধা হ্যান্ডলিং:
বাধা হ'ল সিপিইউ হার্ডওয়্যারের সাথে যোগাযোগ করে এমন প্রাথমিক প্রক্রিয়া। সাধারণত, আপনার হার্ডওয়্যার উপাদানগুলি সিপিইউকে জানায় যে এটিতে কীভাবে বাধা দেয়। এটি বেশ সোজা - যখন আপনার কোডটি একটি প্রদত্ত বাধা দেয়, আপনি বাধা হ্যান্ডলার টেবিলটি দেখে সঠিক কলব্যাক কল করেন।
হার্ডওয়্যার অনুকরণ:
প্রদত্ত হার্ডওয়্যার ডিভাইস অনুকরণ করার দুটি দিক রয়েছে:
- ডিভাইসের কার্যকারিতা অনুকরণ করে
- আসল ডিভাইস ইন্টারফেস অনুকরণ
হার্ড-ড্রাইভের ক্ষেত্রে নিন। ব্যাকিং স্টোরেজ তৈরি, পড়া / লেখার / ফর্ম্যাট রুটিন ইত্যাদি তৈরি করে কার্যকারিতা অনুকরণ করা হয় This এই অংশটি সাধারণত খুব সোজা।
ডিভাইসের আসল ইন্টারফেসটি কিছুটা জটিল। এটি সাধারণত মেমরি ম্যাপ করা রেজিস্ট্রিগুলির (যেমন মেমরির অংশ যা সংকেত করতে ডিভাইস পরিবর্তনের জন্য লক্ষ্য রাখে) এবং বাধা দেয় of হার্ড-ড্রাইভের জন্য আপনার কাছে মেমরি ম্যাপ করা অঞ্চল থাকতে পারে যেখানে আপনি পড়া কমান্ড, রাইটিং ইত্যাদি স্থাপন করেন, তবে এই ডেটাটি আবার পড়ুন।
আমি আরও বিশদে যেতে চাই, তবে আপনি এটির সাথে যেতে পারেন এমন এক মিলিয়ন উপায় রয়েছে। আপনার যদি এখানে কোনও নির্দিষ্ট প্রশ্ন থাকে তবে নির্দ্বিধায় জিজ্ঞাসা করুন এবং আমি তথ্যটি যুক্ত করব।
সম্পদ:
আমি মনে করি আমি এখানে বেশ ভাল পরিচয় দিয়েছি, তবে এখানে আরও অনেকগুলি অতিরিক্ত অঞ্চল রয়েছে। আমি কোনও প্রশ্নে সাহায্য করতে পেরে অনেক বেশি খুশি; কেবলমাত্র প্রচুর জটিলতার কারণে আমি এর বেশিরভাগ ক্ষেত্রেই খুব অস্পষ্ট হয়েছি।
বাধ্যবাধক উইকিপিডিয়া লিঙ্ক:
সাধারণ অনুকরণের সংস্থানসমূহ:
- জোফর - এখান থেকেই আমি অনুকরণ দিয়ে আমার সূচনা করেছি, প্রথমে অনুকরণকারীগুলি ডাউনলোড করছি এবং শেষ পর্যন্ত তাদের ডকুমেন্টেশনের প্রচুর সংরক্ষণাগার লুণ্ঠন করব। এটি আপনার হতে পারে নিখুঁত সেরা সম্পদ।
- এনজিইমু - অনেকগুলি সরাসরি সংস্থান নেই, তবে তাদের ফোরামগুলি অপরাজেয়।
- রোমহ্যাকিং.নেট - নথি বিভাগে জনপ্রিয় কনসোলগুলির জন্য মেশিন আর্কিটেকচার সম্পর্কিত সংস্থান রয়েছে
এমুলেটর প্রকল্প রেফারেন্স:
- আয়রনবাবেল - এটি নেমারলে লিখিত .NET এর একটি এমুলেশন প্ল্যাটফর্ম এবং উড়ে যাওয়ার সময় সি # তে কোডটি পুনরায় কম্পাইল করে। দাবি অস্বীকার: এটি আমার প্রকল্প, তাই নির্লজ্জ প্লাগকে ক্ষমা করুন।
- BSnes - চক্র-নিখুঁত নির্ভুলতার লক্ষ্যের সাথে দুর্দান্ত একটি SNES এমুলেটর।
- MAME - তোরণ এমুলেটর। দুর্দান্ত রেফারেন্স।
- 6502asm.com - এটি একটি শীতল ছোট ফোরাম সহ একটি জাভাস্ক্রিপ্ট 6502 এমুলেটর।
- dinarec'd 6502asm - এটি আমি এক দু'দিন ধরে একটি সামান্য হ্যাক করেছি। আমি 6502asm.com থেকে বিদ্যমান এমুলেটরটি নিয়েছি এবং এটিকে পরিবর্তন করে গুরুতর গতি বৃদ্ধির জন্য কোডটিকে জাভাস্ক্রিপ্টে পুনরায় সংস্থায় পরিণত করেছি।
প্রসেসরের পুনঃসংশ্লিষ্ট রেফারেন্স:
- মাইকেল Steil (উপরে উল্লিখিত) দ্বারা সম্পন্ন স্ট্যাটিক কম্পায়লেশান গবেষণা চরম পরিণতি পায় এই কাগজ এবং আপনি উৎস এবং এই ধরনের জানতে পারেন এখানে ।
সংযোজন:
এই উত্তরটি জমা দেওয়ার পরে এক বছর হয়ে গেছে এবং এটি যে মনোযোগ পাচ্ছে তার সাথে আমি বুঝতে পেরেছি যে কিছু জিনিস আপডেট করার সময় এসেছে।
সম্ভবত এখনই অনুকরণের সবচেয়ে উত্তেজনাপূর্ণ জিনিসটি হল লিবিপ্পু , যা পূর্বোক্ত মাইকেল স্টিল দ্বারা শুরু করা হয়েছিল। এটি একটি লাইব্রেরি যা বিপুল সংখ্যক সিপিইউ কোরকে সমর্থন করার উদ্দেশ্যে তৈরি করা হয়েছে, যা পুনঃসংযোগের জন্য এলএলভিএম ব্যবহার করে (স্ট্যাটিক এবং ডায়নামিক!)। এটি বিশাল সম্ভাবনা পেয়েছে এবং আমি মনে করি এটি অনুকরণের জন্য দুর্দান্ত কাজ করবে।
ইমু-ডক্সও আমার নজরে এনেছে, যা সিস্টেম ডকুমেন্টেশনের একটি দুর্দান্ত সংগ্রহস্থল রাখে, যা অনুকরণের উদ্দেশ্যে খুব কার্যকর useful আমি সেখানে খুব বেশি সময় ব্যয় করি নি, তবে দেখে মনে হচ্ছে তাদের কাছে প্রচুর সংস্থান রয়েছে।
এই পোস্টটি সহায়ক হয়েছে বলে আমি আনন্দিত এবং আমি আশা করছি যে আমি আমার গাধা থেকে নামতে পারি এবং বছরের শেষের দিকে / পরের বছরের শুরুতে এই বিষয়ে আমার বইটি শেষ করতে পারি।