एमुलेटर कैसे काम करते हैं और उन्हें कैसे लिखा जाता है? [बन्द है]


968

एमुलेटर कैसे काम करते हैं? जब मैं NES / SNES या C64 एमुलेटर देखता हूं, तो यह मुझे चकित करता है।

http://www.tommowalker.co.uk/snemzelda.png

क्या आपको अपने विशेष विधानसभा निर्देशों की व्याख्या करके उन मशीनों के प्रोसेसर का अनुकरण करना है? इसमें और क्या जाता है? वे आम तौर पर कैसे डिजाइन किए जाते हैं?

क्या आप एमुलेटर (विशेष रूप से एक गेम सिस्टम) लिखने के इच्छुक किसी व्यक्ति के लिए कोई सलाह दे सकते हैं?


15
सबसे महत्वपूर्ण बात जो आपको खोजने की जरूरत है, वह है सिस्टम के लिए "प्रोग्रामर मैनुअल", क्योंकि यह एचडब्ल्यू विक्रेता और प्रोग्रामर के बीच "अनुबंध" का विवरण देता है, और उन विवरणों को छिपाता है जो प्रासंगिक नहीं हैं और बदल सकते हैं। आपके मौके सिस्टम की लोकप्रियता पर निर्भर करते हैं।
उड़ी १५'०

155
अच्छा खेल विकल्प।
क्रिश्चियन रोमियो

2
हां, मेरा ऐसा मानना ​​है: en.wikipedia.org/wiki/The_Legend_of_Zelda:_A_Link_to_the_Past
mmcdole


8
जब से मैंने पहली बार उस गेम को खेला है, मुझे हमेशा आश्चर्य होता है कि Hyrule "8-बॉल" बोल्डर के साथ लिटरेड क्यों है :-)
विवियन रिवर

जवाबों:


1124

अनुकरण एक बहुआयामी क्षेत्र है। यहां मूल विचार और कार्यात्मक घटक हैं। मैं इसे टुकड़ों में तोड़ने जा रहा हूं और फिर संपादन के माध्यम से विवरण भरूंगा। जिन चीजों का मैं वर्णन करने जा रहा हूं उनमें से कई को प्रोसेसर के आंतरिक कामकाज के ज्ञान की आवश्यकता होगी - विधानसभा ज्ञान आवश्यक है। अगर मैं कुछ चीजों पर बहुत ज्यादा अस्पष्ट हूं, तो कृपया प्रश्न पूछें ताकि मैं इस उत्तर को बेहतर बना सकूं।

मूल विचार:

उत्सर्जन प्रोसेसर और व्यक्तिगत घटकों के व्यवहार को संभालकर काम करता है। आप सिस्टम के प्रत्येक अलग-अलग टुकड़े का निर्माण करते हैं और फिर टुकड़ों को जोड़ते हैं जैसे कि तार हार्डवेयर में करते हैं।

प्रोसेसर का अनुकरण:

प्रोसेसर एमुलेशन से निपटने के तीन तरीके हैं:

  • व्याख्या
  • गतिशील पुनर्मिलन
  • स्थैतिक पुनर्मूल्यांकन

इन सभी रास्तों के साथ, आपके पास एक ही समग्र लक्ष्य है: प्रोसेसर राज्य को संशोधित करने और 'हार्डवेयर' के साथ बातचीत करने के लिए कोड का एक टुकड़ा निष्पादित करें। प्रोसेसर राज्य किसी दिए गए प्रोसेसर लक्ष्य के लिए प्रोसेसर रजिस्टर, इंटरप्ट हैंडलर आदि का एक समूह है। 6502 के लिए, आप रजिस्टरों का प्रतिनिधित्व 8 बिट पूर्णांक के एक नंबर होगा: A, X, Y, P, और S; आपके पास 16-बिट PCरजिस्टर भी होगा।

व्याख्या के साथ, आप IP(निर्देश सूचक - जिसे PCप्रोग्राम काउंटर भी कहा जाता है ) पर शुरू करते हैं और निर्देश को स्मृति से पढ़ते हैं। आपका कोड इस निर्देश को पार्स करता है और इस जानकारी का उपयोग आपके प्रोसेसर द्वारा निर्दिष्ट प्रोसेसर स्थिति को बदलने के लिए करता है। व्याख्या के साथ मुख्य समस्या यह है कि यह बहुत धीमी है; हर बार जब आप किसी दिए गए निर्देश को संभालते हैं, तो आपको इसे डिकोड करना होगा और अपेक्षित ऑपरेशन करना होगा।

गतिशील पुनर्संयोजन के साथ, आप व्याख्या की तरह कोड पर पुनरावृति करते हैं, लेकिन सिर्फ opcodes को निष्पादित करने के बजाय, आप संचालन की एक सूची बनाते हैं। एक बार जब आप एक शाखा निर्देश पर पहुंच जाते हैं, तो आप अपने होस्ट प्लेटफॉर्म के लिए मशीन कोड के संचालन की इस सूची को संकलित करते हैं, फिर आप इस संकलित कोड को कैश करते हैं और इसे निष्पादित करते हैं। फिर जब आप किसी दिए गए निर्देश समूह को फिर से हिट करते हैं, तो आपको केवल कैश से कोड निष्पादित करना होगा। (BTW, ज्यादातर लोग वास्तव में निर्देशों की एक सूची नहीं बनाते हैं, लेकिन उन्हें मक्खी पर मशीन कोड के लिए संकलित करते हैं - इससे अनुकूलन करना अधिक कठिन हो जाता है, लेकिन यह इस जवाब के दायरे से बाहर है, जब तक कि पर्याप्त लोग रुचि न लें)

स्टेटिक रीकॉम्पिलेशन के साथ, आप वैसा ही करते हैं जैसा कि डायनैमिक रीकैपिलेशन में होता है, लेकिन आप ब्रांच को फॉलो करते हैं। आप अंत में कोड का एक हिस्सा बना रहे हैं जो कार्यक्रम में सभी कोड का प्रतिनिधित्व करता है, जिसे बाद में बिना किसी हस्तक्षेप के निष्पादित किया जा सकता है। यदि यह निम्न समस्याओं के लिए नहीं थे, तो यह एक महान तंत्र होगा:

  • कोड है कि कार्यक्रम के साथ शुरू करने के लिए नहीं है (जैसे संपीड़ित, एन्क्रिप्टेड, उत्पन्न / रनटाइम पर संशोधित, आदि) को फिर से जोड़ा नहीं जाएगा, इसलिए यह नहीं चलेगा
  • यह साबित हो गया है कि किसी दिए गए बाइनरी में सभी कोड ढूंढना हॉल्टिंग समस्या के बराबर है

ये 99% मामलों में स्थिर पुनर्संयोजन को पूरी तरह से संभव बनाने के लिए गठबंधन करते हैं। अधिक जानकारी के लिए, माइकल स्टिल ने स्थैतिक पुनर्मूल्यांकन में कुछ महान शोध किए हैं - मैंने जो सबसे अच्छा देखा है।

प्रोसेसर इम्यूलेशन का दूसरा पक्ष वह तरीका है जिसमें आप हार्डवेयर के साथ इंटरैक्ट करते हैं। यह वास्तव में दो पक्ष हैं:

  • प्रोसेसर का समय
  • बाधा से निपटने

प्रोसेसर समय:

कुछ प्लेटफार्मों - विशेष रूप से पुराने कंसोल जैसे एनईएस, एसएनईएस, आदि - आपके एमुलेटर को पूरी तरह से अनुकूल होने के लिए सख्त समय की आवश्यकता होती है। एनईएस के साथ, आपके पास पीपीयू (पिक्सेल प्रोसेसिंग यूनिट) है जिसके लिए सीपीयू को सटीक क्षणों में अपनी मेमोरी में पिक्सल डालना होगा। यदि आप व्याख्या का उपयोग करते हैं, तो आप आसानी से चक्रों की गणना कर सकते हैं और उचित समय का अनुकरण कर सकते हैं; गतिशील / स्थिर पुनर्संयोजन के साथ, चीजें एक / बहुत / अधिक जटिल हैं।

इंटरप्ट हैंडलिंग:

रुकावट प्राथमिक तंत्र है जो सीपीयू हार्डवेयर के साथ संचार करता है। आम तौर पर, आपके हार्डवेयर घटक सीपीयू को बताएंगे कि वह किस बारे में परवाह करता है। यह बहुत सीधा है - जब आपका कोड किसी दिए गए व्यवधान को फेंकता है, तो आप अंतःक्रियात्मक हैंडलर तालिका को देखते हैं और उचित कॉलबैक कहते हैं।

हार्डवेयर अनुकरण:

किसी दिए गए हार्डवेयर उपकरण का अनुकरण करने के दो पक्ष हैं:

  • डिवाइस की कार्यक्षमता का अनुकरण
  • वास्तविक डिवाइस इंटरफेस का अनुकरण

हार्ड-ड्राइव का मामला लें। कार्यक्षमता का समर्थन बैकिंग स्टोरेज, रीड / राइट / फॉर्मेट रूटीन आदि बनाकर किया जाता है। यह भाग आम तौर पर बहुत सीधा होता है।

डिवाइस का वास्तविक इंटरफ़ेस थोड़ा अधिक जटिल है। यह आम तौर पर मेमोरी मैप किए गए रजिस्टरों का कुछ संयोजन होता है (जैसे कि मेमोरी के कुछ हिस्से जो डिवाइस सिग्नलिंग करने के लिए बदलाव के लिए देखता है) और बीच में आता है। हार्ड-ड्राइव के लिए, आपके पास एक मेमोरी मैप्ड क्षेत्र हो सकता है, जहाँ आप रीड कमांड, राइट्स वगैरह रखते हैं, फिर इस डेटा को वापस पढ़ें।

मैं और अधिक विस्तार में जाऊँगा, लेकिन एक लाख तरीके हैं जिससे आप इसके साथ जा सकते हैं। यदि आपके यहाँ कोई विशिष्ट प्रश्न हैं, तो बेझिझक पूछें और मैं जानकारी जोड़ दूँगा।

संसाधन:

मुझे लगता है कि मैंने यहां बहुत अच्छा परिचय दिया है, लेकिन अतिरिक्त क्षेत्रों के एक टन हैं। मैं किसी भी प्रश्न के साथ मदद करने के लिए खुश हूं; मैं इस में बहुत अस्पष्ट हो गया हूँ बस विशाल जटिलता के कारण।

अनिवार्य विकिपीडिया लिंक:

सामान्य उत्सर्जन संसाधन:

  • ज़ोफ़र - यह वह जगह है जहाँ मुझे मेरी शुरुआत एमुलेशन से हुई, पहले एमुलेटर डाउनलोड करने और अंत में डॉक्यूमेंटेशन के उनके अपार संग्रह को लूटा गया। यह संभवतः सबसे अच्छा संसाधन है जो संभवतः आपके पास हो सकता है।
  • NGEmu - कई प्रत्यक्ष संसाधन नहीं हैं, लेकिन उनके फ़ोरम अपराजेय हैं।
  • RomHacking.net - दस्तावेज़ अनुभाग में लोकप्रिय कंसोल के लिए मशीन वास्तुकला से संबंधित संसाधन हैं

संदर्भ के लिए एमुलेटर परियोजनाएं:

  • आयरनबेल - यह .NET के लिए एक एमुलेशन प्लेटफॉर्म है, जो नेमेर्ले में लिखा गया है और उड़ने पर C # पर recompiles कोड है। अस्वीकरण: यह मेरी परियोजना है, इसलिए बेशर्म प्लग को क्षमा करें।
  • BSnes - चक्र-सही सटीकता के लक्ष्य के साथ एक भयानक SNES एमुलेटर।
  • MAME - आर्केड एमुलेटर। महान संदर्भ।
  • 6502asm.com - यह एक जावास्क्रिप्ट 6502 एमुलेटर है जिसमें एक छोटा सा मंच है।
  • dynarec'd 6502asm - यह एक छोटी हैक है जिसे मैंने एक या दो दिन में किया था। मैंने मौजूदा एमुलेटर को 6502asm.com से लिया और इसे बड़े पैमाने पर गति बढ़ाने के लिए कोड को जावास्क्रिप्ट में बदलकर गतिशील रूप से फिर से जोड़ दिया।

प्रोसेसर का संदर्भ

  • माइकल Steil (ऊपर संदर्भित) के द्वारा किया स्थिर रखता में अनुसंधान में समापन हुआ इस पत्र और आप स्रोत है और इस तरह पा सकते हैं यहाँ

परिशिष्ट:

यह उत्तर प्रस्तुत किए जाने के बाद से एक साल से अधिक समय हो गया है और सभी ध्यान से यह हो रहा है, मुझे लगा कि यह कुछ चीजों को अपडेट करने का समय है।

शायद अनुकरण में सबसे रोमांचक बात अभी है एम्युलेशन libcpu , जिसे उपरोक्त माइकल स्टिल ने शुरू किया था। यह एक बड़ी संख्या में सीपीयू कोर का समर्थन करने के लिए एक पुस्तकालय है, जो पुनर्संयोजन (स्थिर और गतिशील) के लिए एलएलवीएम का उपयोग करता है। यह बहुत बड़ी संभावना है, और मुझे लगता है कि यह अनुकरण के लिए बहुत अच्छे काम करेगा।

एमु-डॉक्स को भी मेरे ध्यान में लाया गया है, जो सिस्टम प्रलेखन का एक बड़ा भंडार है, जो अनुकरण के उद्देश्यों के लिए बहुत उपयोगी है। मैंने वहां ज्यादा समय नहीं बिताया है, लेकिन ऐसा लगता है कि उनके पास बहुत सारे संसाधन हैं।

मुझे खुशी है कि यह पोस्ट मददगार रही है, और मुझे उम्मीद है कि मैं अपनी गांड को हटा सकता हूं और अगले साल के अंत तक इस विषय पर अपनी पुस्तक समाप्त कर सकता हूं।


37
यह पहले से ही एक महाकाव्य जवाब देने के लिए तैयार है। यदि आप मुझे किसी भी संसाधन की ओर इशारा कर सकते हैं और साथ ही इसके अंत की सराहना करेंगे। मैं संभवतः SNES या NES प्रणाली का अनुकरण करने और इसे अपना सेमेस्टर प्रोजेक्ट बनाने के लिए देख रहा हूं।
mmcdole

8
निश्चित रूप से। मैं संसाधनों की एक अच्छी सूची को इकट्ठा करने जा रहा हूं। यदि आप लोगों के पास कोई विशिष्ट अनुरोध है, तो मैं उन्हें भरने की पूरी कोशिश करूंगा।
कोडी ब्रोशर

3
@thenonhacker, मेरे संसाधन अनुभाग में संदर्भित आयरनबेल परियोजना मेरी है। (बेशर्म प्लग को चिह्नित किया गया है;))
कोडी ब्रोचेस

1
"यह साबित हो गया है कि किसी दिए गए बाइनरी में सभी कोड ढूंढना हॉल्टिंग समस्या के बराबर है" - संदर्भ कृपया? या यह होना चाहिए "यह साबित हो गया है कि किसी भी बाइनरी में सभी कोड ढूंढना हॉल्टिंग समस्या के बराबर है"? इसके अलावा
स्टिल

4
आप उल्लेख करते हैं कि आप एक पुस्तक लिख रहे हैं; क्या आप हमें उस पर एक अद्यतन दे सकते हैं? मैं, एक के लिए, इसे पढ़ने में दिलचस्पी होगी।
एलेक्स

126

विक्टर मोया डेल बारियो नामक एक व्यक्ति ने इस विषय पर अपनी थीसिस लिखी। 152 पृष्ठों पर बहुत सारी अच्छी जानकारी। आप यहां पीडीएफ डाउनलोड कर सकते हैं

यदि आप स्क्रिबर्ड के साथ पंजीकरण नहीं करना चाहते हैं , तो आप पीडीएफ शीर्षक के लिए Google, "इम्यूलेशन प्रोग्रामिंग के लिए तकनीकों का अध्ययन" कर सकते हैं । पीडीएफ के लिए विभिन्न स्रोतों के एक जोड़े हैं।


43

अनुकरण कठिन लग सकता है, लेकिन वास्तव में अनुकरण की तुलना में काफी आसान है।

किसी भी प्रोसेसर में आमतौर पर एक अच्छी तरह से लिखा विनिर्देश होता है जो राज्यों, इंटरैक्शन आदि का वर्णन करता है।

यदि आपने प्रदर्शन के बारे में बिल्कुल भी परवाह नहीं की, तो आप बहुत ही सुंदर ऑब्जेक्ट ओरिएंटेड प्रोग्राम का उपयोग करके आसानी से सबसे पुराने प्रोसेसर का अनुकरण कर सकते हैं। उदाहरण के लिए, एक X86 प्रोसेसर को रजिस्टरों की स्थिति (आसान), स्मृति की स्थिति (आसान) बनाए रखने के लिए कुछ की आवश्यकता होगी, और ऐसा कुछ जो प्रत्येक आने वाली कमांड को ले जाएगा और इसे मशीन की वर्तमान स्थिति में लागू करेगा। यदि आप वास्तव में सटीकता चाहते हैं, तो आप मेमोरी ट्रांसलेशन, कैशिंग, आदि का अनुकरण भी करेंगे, लेकिन यह उल्लेखनीय है।

वास्तव में, कई माइक्रोचिप और सीपीयू निर्माता चिप के एक एमुलेटर के खिलाफ और फिर खुद चिप के खिलाफ प्रोग्राम का परीक्षण करते हैं, जो उन्हें यह पता लगाने में मदद करता है कि क्या चिप के विनिर्देशों में या हार्डवेयर में चिप के वास्तविक कार्यान्वयन में कोई समस्या है। उदाहरण के लिए, एक चिप विनिर्देश लिखना संभव है जिसके परिणामस्वरूप गतिरोध होगा, और जब हार्डवेयर में एक समय सीमा होती है, तो यह देखना महत्वपूर्ण है कि क्या विनिर्देश में इसे पुन: प्रस्तुत किया जा सकता है क्योंकि यह चिप कार्यान्वयन में कुछ से अधिक समस्या का संकेत देता है।

बेशक, वीडियो गेम के लिए एमुलेटर आमतौर पर प्रदर्शन की परवाह करते हैं, इसलिए वे भोले कार्यान्वयन का उपयोग नहीं करते हैं, और वे कोड भी शामिल करते हैं जो मेजबान सिस्टम के ओएस के साथ इंटरफेस करते हैं, उदाहरण के लिए ड्राइंग और ध्वनि का उपयोग करें।

पुराने वीडियो गेम (एनईएस / एसएनईएस, आदि) के बहुत धीमे प्रदर्शन को ध्यान में रखते हुए, आधुनिक प्रणालियों पर अनुकरण काफी आसान है। वास्तव में, यह और भी आश्चर्यजनक है कि आप हर SNES गेम का एक सेट कभी भी या कोई अटारी 2600 गेम कभी भी डाउनलोड कर सकते हैं, यह देखते हुए कि जब ये सिस्टम लोकप्रिय थे, तो हर कारतूस की मुफ्त पहुंच एक सपना सच हो गया होगा।


1
अनुकरण और अनुकरण के बीच अंतर क्या हैं?
वी हू

2
@Wei: आम तौर पर, एक एमुलेटर को "बाह्य रूप से" व्यवहार करना माना जाता है, जैसे कि यह सिस्टम का अनुकरण करता है, लेकिन यह कहने के लिए कुछ भी नहीं है कि इसे समान तरीके से लागू किया जाना है। एक सिम्युलेटर को इस तरह से लागू किया जाता है जो नकली प्रणाली की नकल करता है, और परिणामस्वरूप यह व्यवहार करता है।
उड़ी

जब आप "सिमुलेटर" देखते हैं तो इसके समान सोचते हैं जबकि एक एमुलेटर "
इम्यूज़


29

मुझे पता है कि यह सवाल थोड़ा पुराना है, लेकिन मैं चर्चा में कुछ जोड़ना चाहूंगा। यहाँ अधिकांश उत्तर एमुलेटरों के आस-पास स्थित हैं, जो उन प्रणालियों के मशीन निर्देशों की व्याख्या करते हैं, जिनका वे अनुकरण करते हैं।

हालाँकि, इस "UltraHLE" ( WIKIpedia लेख ) नामक एक बहुत प्रसिद्ध अपवाद है । अल्ट्राहाल, अब तक बनाए गए सबसे प्रसिद्ध इम्यूलेटर में से एक, वाणिज्यिक निंटेंडो 64 गेम (घरेलू कंप्यूटर पर अच्छे प्रदर्शन के साथ) का एक समय था जब ऐसा करने के लिए व्यापक रूप से असंभव माना जाता था। तथ्य की बात के रूप में, Nintendo अभी भी Nintendo 64 के लिए नए खिताब का उत्पादन कर रहा था जब UltraHLE बनाया गया था!

पहली बार, मैंने प्रिंट पत्रिकाओं में एमुलेटर के बारे में लेख देखा, जहां पहले मैंने उन्हें केवल वेब पर चर्चा करते हुए देखा था।

अल्ट्राहेल की अवधारणा मशीन स्तर की कॉल के बजाय सी लाइब्रेरी कॉल का अनुकरण करके असंभव को संभव करना था।


22

जावास्क्रिप्ट में एक गेमबॉय एमुलेटर लिखने पर इमरान नज़र की कोशिश पर एक नज़र डालने लायक कुछ है ।


1
हम गेमबॉय गेम के लिए कच्चे ओपकोड निर्देश कैसे प्राप्त करेंगे?
पचेरियर

'ग्रे मार्केट' पर बिक्री के लिए कई उपकरण उपलब्ध हैं। आप उन्हें विकसित दुनिया के किसी भी बड़े स्टोर में नहीं पाएंगे। ये डिवाइस गेम कार्ट्रिज से उन निर्देशों को कॉपी करने में सक्षम हैं, जिन्हें आमतौर पर "रोम" कहा जाता है। Google "गेमबॉय रोम्स", लेकिन काम-असुरक्षित लिंक और हमले साइटों के लिए बाहर देखो!
विवियन नदी

18

80 के दशक के बीबीसी माइक्रो कंप्यूटर (Google में VBeeb टाइप करें) के अपने स्वयं के एमुलेटर का निर्माण करने के बाद, बहुत सी बातें पता हैं।

  • आप असली चीज़ का इस तरह अनुकरण नहीं कर रहे हैं, जो एक प्रतिकृति होगी। इसके बजाय, आप राज्य का अनुकरण कर रहे हैं । एक अच्छा उदाहरण एक कैलकुलेटर है, असली चीज़ में बटन, स्क्रीन, केस आदि हैं, लेकिन कैलकुलेटर का अनुकरण करने के लिए आपको केवल यह अनुकरण करने की आवश्यकता है कि बटन ऊपर या नीचे हैं, एलसीडी के कौन से सेगमेंट हैं, आदि, मूल रूप से, संख्याओं का एक सेट। चीजों के सभी संभावित संयोजनों का प्रतिनिधित्व करना जो एक कैलकुलेटर में बदल सकते हैं।
  • वास्तविक चीज़ की तरह दिखने और व्यवहार करने के लिए आपको केवल एमुलेटर के इंटरफ़ेस की आवश्यकता होती है। जितना अधिक यह समझाने का अनुकरण उतना ही करीब है। पर्दे के पीछे क्या कुछ भी हो सकता है जो आपको पसंद हो। लेकिन, एमुलेटर लिखने में आसानी के लिए, एक मानसिक मानचित्रण होता है जो वास्तविक प्रणाली, अर्थात चिप्स, डिस्प्ले, कीबोर्ड, सर्किट बोर्ड और अमूर्त कंप्यूटर कोड के बीच होता है।
  • कंप्यूटर सिस्टम का अनुकरण करने के लिए, इसे छोटे विखंडू में तोड़ना और उन विखंडुओं को व्यक्तिगत रूप से अनुकरण करना सबसे आसान है। फिर तैयार उत्पाद के लिए पूरे एक साथ स्ट्रिंग करें। इनपुट्स और आउटपुट के साथ ब्लैक बॉक्स के एक सेट की तरह, जो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के लिए खूबसूरती से उधार देता है। जीवन को आसान बनाने के लिए आप इन विखंडूओं को आगे बढ़ा सकते हैं।

व्यावहारिक रूप से, आप आमतौर पर गति और अनुकरण की निष्ठा के लिए लिखना चाहते हैं। इसका कारण यह है कि लक्ष्य प्रणाली पर सॉफ़्टवेयर स्रोत सिस्टम पर मूल हार्डवेयर की तुलना में अधिक धीमी गति से चलेगा (हो सकता है)। इससे प्रोग्रामिंग लैंग्वेज, कंपाइलर्स, टारगेट सिस्टम आदि का चुनाव हो सकता है।
इसके अलावा आपको इस बात का भी सर्कुलेशन करना होगा कि आप किस चीज का अनुकरण करने के लिए तैयार हैं, उदाहरण के लिए माइक्रोप्रोसेसर में ट्रांजिस्टर की वोल्टेज स्थिति का अनुकरण करना आवश्यक नहीं है, लेकिन संभवतः आवश्यक है माइक्रोप्रोसेसर के रजिस्टर सेट की स्थिति का अनुकरण करने के लिए।
आम तौर पर अनुकरण के विस्तार के स्तर को छोटा करते हुए, आप मूल प्रणाली के लिए अधिक निष्ठा प्राप्त करेंगे।
अंत में, पुराने सिस्टम की जानकारी अधूरी या गैर-मौजूद हो सकती है। इसलिए मूल उपकरण को पकड़ना आवश्यक है, या कम से कम एक और अच्छे एमुलेटर के अलावा प्रज्वलन जो किसी और ने लिखा है!


17

हां, आपको पूरे बाइनरी मशीन कोड मेस की "हाथ से" व्याख्या करनी होगी। इतना ही नहीं, अधिकांश समय आपको कुछ विदेशी हार्डवेयर का अनुकरण करना पड़ता है, जो लक्ष्य मशीन पर एक समान नहीं होता है।

सरल दृष्टिकोण एक-एक करके निर्देशों की व्याख्या करना है। यह अच्छा काम करता है, लेकिन यह धीमा है। एक तेज़ दृष्टिकोण पुनर्संयोजन है - मशीन कोड को लक्षित करने के लिए स्रोत मशीन कोड का अनुवाद। यह अधिक जटिल है, क्योंकि अधिकांश निर्देश वन-टू-वन मैप नहीं करेंगे। इसके बजाय आपको अतिरिक्त कोड बनाने वाले विस्तृत कार्यक्षेत्र बनाने होंगे। लेकिन अंत में यह बहुत तेज है। अधिकांश आधुनिक एमुलेटर ऐसा करते हैं।


1
सबसे बुरी बात यह है कि प्रलेखन अब तक गायब है। यह तब होता है जब आपको पता चलता है कि GameBoy Color में संशोधित Z80 Core के पास अविभाजित फ्लैग ऑपरेशंस हैं जो आपके द्वारा परीक्षण किए जा रहे गेम का उपयोग करता है जो आप वास्तव में विश्वास खोना शुरू करते हैं।
कैलम रोजर्स

1
पेट पीव: यह मशीन कोड (एकवचन) है, मशीन कोड (बहुवचन) नहीं; बस के रूप में यह मोर्स कोड नहीं मोर्स कोड है
लॉरेंस Dol

1
@Vilx: वास्तव में नहीं - शब्द "मशीन कोड", एक सीपीयू के लिए निर्देश सेट का उल्लेख सॉफ्टवेयर की स्थापना के बाद से उपयोग में है और बहुवचन नहीं है। यह "निर्देश सेट ", एक विलक्षण रूप को संदर्भित करता है , न कि बहुवचन रूप "निर्देश"। प्रोग्राम कोड, मोर्स कोड इत्यादि के रूप में भी, बहुवचन रूप का उपयोग दुरुपयोग से होता है, आमतौर पर अंग्रेजी बोलने वालों द्वारा दूसरी भाषा के रूप में।
लॉरेंस डॉल

1
@ शेफ बंदर - लेकिन क्या मैं सेट से किसी एक आइटम को संदर्भित करने के लिए "कोड" शब्द का उपयोग नहीं कर सकता हूं? उदाहरण के लिए: " ... --- ...- ये तीन मोर्स कोड एस, ओ, एस तीन अक्षरों का प्रतिनिधित्व करते हैं।" क्योंकि "S" अक्षर का प्रतिनिधित्व करने ...वाला एक कोड है । नहीं?
विल्क्स-

1
नहीं, कोड बेशुमार संज्ञा है, इसका कोई बहुवचन रूप नहीं है जैसे पानी या रेत ..
इवान

15

जब आप एक एमुलेटर विकसित करते हैं तो आप प्रोसेसर असेंबली की व्याख्या कर रहे हैं कि सिस्टम काम कर रहा है (Z80, 8080, PS CPU, आदि)।

आपको उन सभी बाह्य उपकरणों का अनुकरण करने की भी आवश्यकता है जो सिस्टम में हैं (वीडियो आउटपुट, नियंत्रक)।

आपको अच्छे पुराने गेम बॉय की तरह सिमपे सिस्टम के लिए एमुलेटर लिखना शुरू करना चाहिए (जो कि Z80 प्रोसेसर का उपयोग करें, क्या मैं गलत नहीं हूं) या C64 के लिए।


9
C64 एक "सरल" प्रणाली है? जबकि 6510 अपेक्षाकृत सरल है (एक बार जब आप असूचीबद्ध ऑपकोड को कवर कर लेते हैं), ध्वनि (एसआईडी) और वीडियो (वीआईसी) चिप्स कुछ भी लेकिन सरल हैं। संगतता के किसी भी सभ्य स्तर को प्राप्त करने के लिए, आपको उनका अनुकरण करने की आवश्यकता होगी - हार्डवेयर बग और सभी।
मोहोबा

10

एमुलेटर बनाना बहुत कठिन है क्योंकि कई हैक्स (असामान्य प्रभावों के रूप में), समय के मुद्दे, आदि हैं जिन्हें आपको अनुकरण करने की आवश्यकता है।

इसके एक उदाहरण के लिए, http://queue.acm.org/detail.cfm?id=1755886 देखें ।

यह भी आपको दिखाएगा कि आपको 1MHz के अनुकरण के लिए मल्टी-गीगाहर्ट्ज सीपीयू की आवश्यकता क्यों है।


9

इसके अलावा Darek Mihocka के बाहर की जाँच Emulators.com JITs के लिए अनुदेश स्तर के अनुकूलन पर महान सलाह, और कुशल emulators के निर्माण पर कई अन्य उपहार के लिए।


7

मैंने गेम कंसोल के अनुकरण के लिए इतना फैंसी कुछ भी नहीं किया है, लेकिन मैंने एक बार एक कोर्स किया जहां असाइनमेंट एंड्रयू टैनेनबम्स स्ट्रक्चर्ड कंप्यूटर ऑर्गनाइजेशन में वर्णित मशीन के लिए एक एमुलेटर लिखना था । यह मजेदार था कि मुझे बहुत सारे अह क्षण मिले। आप एक वास्तविक एमुलेटर लिखने के लिए गोताखोरी करने से पहले उस किताब को उठा सकते हैं।


4

एक वास्तविक प्रणाली या अपनी खुद की चीज़ का अनुकरण करने की सलाह? मैं कह सकता हूँ कि एमुलेटर ENTIRE हार्डवेयर का अनुकरण करके काम करता है। शायद सर्किट के नीचे नहीं (जैसा कि एचडब्ल्यू जैसे चारों ओर बढ़ते बिट्स होगा। बाइट को स्थानांतरित करना अंतिम परिणाम है इसलिए बाइट की नकल करना ठीक है)। एमुलेटर बनाना बहुत कठिन है क्योंकि कई हैक्स (असामान्य प्रभावों के रूप में), समय के मुद्दे, आदि हैं जिन्हें आपको अनुकरण करने की आवश्यकता है। यदि एक (इनपुट) टुकड़ा गलत है तो पूरा सिस्टम डाउन हो सकता है या सबसे अच्छा बग / गड़बड़ हो सकता है।


4

साझा स्रोत डिवाइस एम्यूलेटर (विजुअल स्टूडियो, विंडोज पर रन की आवश्यकता है) एक PocketPC / स्मार्टफ़ोन एमुलेटर को बनाने योग्य स्रोत कोड शामिल हैं। मैंने बाइनरी रिलीज़ के वी 1 और वी 2 पर काम किया।

यह कई इम्यूलेशन मुद्दों से निपटता है: - वर्चुअल को होस्ट करने के लिए अतिथि वर्चुअल से अतिथि भौतिक तक कुशल एड्रेस ट्रांसलेशन - अतिथि कोड का जेआईटी संकलन - नेटवर्क एडेप्टर, टचस्क्रीन और ऑडियो जैसे यूआई एकीकरण - मेजबान कीबोर्ड और माउस के लिए यूआई एकीकरण - सेव / कम-बिजली मोड से फिर से शुरू करने के लिए राज्य की बहाली


1

@ कोडी ब्रोश द्वारा प्रदान किए गए उत्तर को जोड़ने के लिए
वर्चुअलाइजेशन के संदर्भ में जहां आप एक नई प्रणाली (सीपीयू, आई / ओ आदि) का वर्चुअल मशीन से अनुकरण कर रहे हैं, हम एमुलेटर की निम्न श्रेणियां देख सकते हैं।

व्याख्या: bochs दुभाषिया का एक उदाहरण है, यह एक x86 पीसी एमुलेटर है, यह अतिथि निर्देश से प्रत्येक निर्देश को निर्देश के दूसरे सेट में (मेजबान ISA के) अनुवाद करता है ताकि इच्छित प्रभाव उत्पन्न हो सके। हां, यह बहुत धीमा है, यह नहीं है 't कैश कुछ भी तो हर निर्देश एक ही चक्र से गुजरता है।

डायनेमिक इमैलेटर: क्यूमू एक डायनामिक एमुलेटर है। यह गेस्ट इंस्ट्रक्शन के फ्लाई ट्रांसलेशन पर भी काम करता है। नतीजे सबसे अच्छे होते हैं। सबसे अच्छी बात यह है कि यह सीधे होस्ट सिस्टम पर ज्यादा से ज्यादा इंस्ट्रक्शन्स को अंजाम देता है, ताकि इम्यूलेशन तेज हो। कोडी द्वारा वर्णित के रूप में, यह कोड को ब्लॉकों में विभाजित करता है (निष्पादन का 1 एकल प्रवाह)।

स्टैटिक एमुलेटर: जहां तक ​​मुझे पता है कि स्टैटिक एमुलेटर नहीं हैं जो वर्चुअलाइजेशन में मददगार हो सकते हैं।


1

मैं कैसे अनुकरण शुरू करूंगा।

1. निम्न स्तर की प्रोग्रामिंग के आधार पर किताबें प्राप्त करें, आपको इसे निनटेंडो ... गेम बॉय के "प्रिटेंड" ऑपरेटिंग सिस्टम की आवश्यकता होगी ...

2. विशेष रूप से अनुकरण पर किताबें, और शायद ओएस विकास। (आप एक ओएस नहीं बना पाएंगे, लेकिन इसके सबसे करीब है।

3. कुछ ओपन सोर्स एमुलेटरों पर ध्यान दें, विशेष रूप से उस सिस्टम के जिन्हें आप एमुलेटर बनाना चाहते हैं।

4. अपने आईडीई / कम्पाइलर में अधिक जटिल कोड के कोपी स्निपेट। यह आपको लंबे कोड लिखने से बचाएगा। यह मैं ओएस के विकास के लिए करता हूं, एक जिले का उपयोग करता हूं


1

मैंने जावास्क्रिप्ट में चिप -8 प्रणाली का अनुकरण करने के बारे में एक लेख लिखा था ।

यह एक शानदार जगह है क्योंकि सिस्टम बहुत जटिल नहीं है, लेकिन आप अभी भी सीखते हैं कि ऑपकोड, स्टैक, रजिस्टर आदि कैसे काम करते हैं।

मैं एनईएस के लिए जल्द ही एक लंबा गाइड लिखूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.