سؤال

كيف محاكاة العمل ؟ عندما أرى NES/SNES أو C64 محاكاة ، تدهشني.

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

هل لديك لمحاكاة المعالج من تلك الآلات عن طريق تفسير معين الجمعية التعليمات ؟ ما يذهب إلى ذلك ؟ كيف هم عادة مصممة ؟

يمكنك إعطاء أي نصيحة لأي شخص مهتم في الكتابة مقلدا (خاصة نظام اللعبة)?

هل كانت مفيدة؟

المحلول

مضاهاة هو متعدد الأوجه المنطقة.هنا هي الأفكار الأساسية والمكونات الفنية.انا ذاهب الى كسر في القطع ثم في ملء التفاصيل عبر التعديلات.العديد من الأشياء أنا ذاهب إلى وصف يتطلب المعرفة من الأعمال الداخلية من المعالجات -- الجمعية المعرفة اللازمة.إذا أنا قليلا غامضة جدا على أشياء معينة ، يرجى طرح الأسئلة حتى أستطيع مواصلة تحسين هذا الجواب.

الفكرة الأساسية:

مضاهاة يعمل عن طريق التعامل مع سلوك المعالج والمكونات الفردية.يمكنك بناء كل فرد قطعة من النظام ثم قم بتوصيل القطع مثل الكثير من الأسلاك هل في الأجهزة.

المعالج مضاهاة:

هناك ثلاث طرق التعامل مع المعالج مضاهاة:

  • تفسير
  • ديناميكية recompilation
  • ثابت recompilation

مع كل من هذه المسارات ، لديك نفس الهدف العام:تنفيذ قطعة من التعليمات البرمجية إلى تعديل المعالج الدولة والتفاعل مع "الأجهزة".المعالج الدولة هي مجموعة من المعالج سجلات معالجات المقاطعة ، الخ معين المعالج المستهدف.بالنسبة 6502 سيكون لديك عدد من 8 بت أعداد صحيحة تمثل السجلات: A, X, Y, P, ، S;كما يجب عليك 16-بت PC السجل.

مع التفسير ، عليك أن تبدأ في IP (مؤشر التعليمة -- دعا أيضا PC, برنامج العداد) وقراءة التعليمات من الذاكرة.التعليمات البرمجية الخاصة بك يوزع هذه التعليمات ويستخدم هذه المعلومات إلى تغيير المعالج الدولة كما هو محدد من قبل المعالج.المشكلة الأساسية مع التفسير هو أنه جدا بطيئا ؛ في كل مرة يمكنك التعامل مع التعليمات التي يجب لفك و تنفيذ العملية المطلوبة.

مع ديناميكية recompilation ، تكرار على الكود مثل الكثير من التفسير ، ولكن بدلا من مجرد تنفيذ opcodes, يمكنك بناء قائمة من العمليات.مرة واحدة يمكنك الوصول إلى فرع تعليم, ترجمة هذه القائمة من العمليات رمز الجهاز الخاص بك منصة المضيف, ثم ذاكرة التخزين المؤقت هذه التعليمات البرمجية المترجمة وتنفيذه.ثم عندما ضرب التعليمات مرة أخرى لديك فقط إلى تنفيذ التعليمات البرمجية من ذاكرة التخزين المؤقت.(راجع للشغل, معظم الناس لا تجعل في الواقع قائمة من التعليمات ولكن جمعها إلى رمز الجهاز على الطاير-هذا يجعل الأمر أكثر صعوبة على النحو الأمثل ، ولكن هذا خارج نطاق هذا الجواب إلا إذا ما يكفي من الناس مهتمون)

مع ثابت recompilation, يمكنك أن تفعل الشيء نفسه في ديناميكية recompilation ، ولكن كنت تتبع الفروع.كنت في نهاية المطاف بناء قطعة من التعليمات البرمجية التي تمثل كافة التعليمات البرمجية في البرنامج ، والتي يمكن تنفيذها دون مزيد من التدخل.هذا من شأنه أن يكون كبيرا آلية لولا المشاكل التالية:

  • التعليمات البرمجية التي ليست في البرنامج لتبدأ (مثلا ، مضغوط, المشفرة, إنشاء/تعديل في وقت التشغيل ، الخ) لن يكون recompiled ، لذلك لن تعمل
  • وقد ثبت أن إيجاد كافة التعليمات البرمجية في الثنائية هو ما يعادل وقف المشكلة

هذه الجمع بين لجعل ثابت recompilation تماما أمرا غير مجد في 99% من الحالات.للحصول على مزيد من المعلومات ، مايكل Steil قد فعلت بعض البحوث إلى ثابت recompilation -- أفضل ما رأيت.

الجانب الآخر أن المعالج مضاهاة الطريقة التي يمكنك التفاعل مع الأجهزة.هذا حقا له وجهان:

  • المعالج توقيت
  • يقطع التعامل مع

المعالج توقيت:

بعض الأنظمة الأساسية-وخاصة كبار السن من لوحات المفاتيح مثل NES, SNES, الخ -- تتطلب المحاكي الخاص بك أن يكون صارمة توقيت لتكون متوافقة تماما.مع NES, لديك بوليتكنك فلسطين (بكسل وحدة المعالجة) الذي يتطلب وحدة المعالجة المركزية وضع بكسل في الذاكرة في لحظات دقيقة.إذا كنت تستخدم تفسير, يمكنك بسهولة العد دورات تحاكي المناسبة وتوقيتها ؛ مع ديناميكية/ثابت recompilation الأمور /الكثير/ أكثر تعقيدا.

يقطع التعامل:

المقاطعات هي الآلية الرئيسية أن وحدة المعالجة المركزية تتواصل مع الأجهزة.عموما, مكونات الأجهزة سوف اقول وحدة المعالجة المركزية ما يقطع أنه يهتم.هذا هو بسيط جدا-عندما الخاص بك رمز يلقي معين المقاطعة تبدو في معالج المقاطعة الجدول الاتصال المناسبة الاستدعاء.

مضاهاة الأجهزة:

هناك جانبان محاكاة معين الجهاز:

  • محاكاة وظائف الجهاز
  • محاكاة الجهاز الفعلي واجهات

تأخذ حالة القرص الصلب.وظائف يحتذى به من خلال خلق تخزين النسخ ، قراءة/كتابة/تنسيق إجراءات ، وما إلى ذلك.هذا الجزء هو عموما واضحة جدا.

الفعلية واجهة الجهاز هو قليلا أكثر تعقيدا.هذا هو عموما بعض مزيج من الذاكرة تعيين السجلات (على سبيل المثالأجزاء من ذاكرة الجهاز الساعات التغييرات للقيام الإشارات) و المقاطعات.على القرص الصلب ، قد يكون تعيين الذاكرة منطقة حيث يمكنك وضع قراءة الأوامر, يكتب, الخ, ثم قرأ هذه البيانات مرة أخرى.

أود الخوض في مزيد من التفاصيل, ولكن هناك ملايين الطرق التي يمكن أن تذهب معها.إذا كان لديك أي أسئلة محددة هنا, لا تتردد في السؤال و سأضيف معلومات عن الفندق.

الموارد:

أعتقد أنني قد أعطيت جيد جدا مقدمة هنا ، طن مناطق إضافية.أنا أكثر من سعيدة لمساعدتك مع أي أسئلة ؛ لقد تم غامضة جدا في معظم هذا ببساطة بسبب التعقيد الهائل.

واجب ويكيبيديا الروابط:

العامة مضاهاة الموارد:

  • Zophar - هذا حيث بدأت مع مضاهاة أولا تحميل برامج محاكاة و في نهاية المطاف نهب الهائلة أرشيف من الوثائق.هذا هو أفضل المطلقة الموارد يمكن أن يكون ربما.
  • NGEmu ليس العديد من توجيه الموارد ، ولكن تلك المنتديات لا تقبل المنافسة.
  • RomHacking.net -- قسم وثائق تحتوي على الموارد فيما يتعلق آلة العمارة الشعبية لوحات المفاتيح

المحاكي المشاريع المرجعية:

  • IronBabel -- هذا هو مضاهاة منصة .صافي مكتوبة في Nemerle و recompiles البرمجية C# على الطاير.تنويه:هذا هو بلدي المشروع العفو وقح المكونات.
  • BSnes -- رهيبة SNES المحاكي مع الهدف من الدورة-دقة مثالية.
  • مامي -- على الممرات المحاكي.مرجعية كبيرة.
  • 6502asm.com -- هذا هو جافا سكريبت 6502 المحاكي مع بارد قليلا في المنتدى.
  • dynarec ان 6502asm -- هذا هو قليلا الإختراق فعلت أكثر من يوم أو يومين.أخذت القائمة المحاكي من 6502asm.com و غيروا حيوي إعادة ترجمة التعليمات البرمجية جافا سكريبت ضخمة يزيد من سرعة.

المعالج إعادة تجميع المراجع:

  • البحث في ثابت recompilation به مايكل Steil (المشار إليه أعلاه) بلغت ذروتها في هذه الورقة و يمكنك العثور على مصدر هذه هنا.

إضافة:

لقد مر أكثر من عام منذ هذا الجواب قدم و مع كل الاهتمام تم الحصول على, أعتقد أنه حان الوقت لتحديث بعض الأشياء.

ربما كان الشيء الأكثر إثارة في مضاهاة الآن libcpu, بدأت المذكورة مايكل Steil.انها مكتبة تهدف إلى دعم عدد كبير من النوى وحدة المعالجة المركزية ، والتي تستخدم LLVM من أجل إعادة تجميع (والدينامية!).انها حصلت على إمكانات هائلة ، وأنا أعتقد أنها سوف تفعل أشياء عظيمة عن مضاهاة.

emu-مستندات كما تم جلب انتباهي ، الذي يضم مستودعا هائلا من نظام وثائق ، وهو أمر مفيد جدا من أجل مضاهاة الأغراض.لم تنفق الكثير من الوقت هناك ، ولكن يبدو أن لديهم الكثير من الموارد.

أنا سعيد هذا المنصب كانت مفيدة و أتمنى أن الخروج من مؤخرتي و أنهي كتابي حول هذا الموضوع بحلول نهاية هذا العام أو أوائل العام المقبل.

نصائح أخرى

رجل يدعى فيكتور مويه del Barrio كتب اطروحته حول هذا الموضوع.الكثير من المعلومات الجيدة على 152 صفحة.يمكنك تحميل PDF هنا.

إذا كنت لا تريد التسجيل مع scribd, يمكنك البحث على جوجل PDF العنوان ، "دراسة تقنيات مضاهاة البرمجة".وهناك زوجين من مصادر مختلفة من أجل PDF.

ومضاهاة قد تبدو شاقة ولكن هو في الواقع أسهل جدا من محاكاة.

وأي معالج عادة ما لديها مواصفات مكتوبة جيدا أن يصف الدول، والتفاعلات، الخ.

إذا كنت لا تبالي أداء على الإطلاق، ثم هل يمكن بسهولة محاكاة معظم المعالجات القديمة باستخدام برامج وجوه المنحى أنيقة جدا. على سبيل المثال، فإن معالج X86 بحاجة الى شيء للحفاظ على حالة من سجلات (سهلة)، شيء للحفاظ على حالة الذاكرة (سهل)، وشيء من شأنها أن تأخذ كل أمر وارد وتطبيقه على الحالة الراهنة للآلة. إذا كنت تريد حقا دقة، وكنت أيضا محاكاة ترجمة الذاكرة، التخزين المؤقت، وما إلى ذلك، ولكن هذا هو قابل للتحقيق.

في الواقع، العديد من رقاقة وحدة المعالجة المركزية المصنعين اختبار برامج ضد منافس للرقاقة ثم ضد الشريحة نفسها، مما يساعدهم على معرفة ما إذا كان هناك قضايا في مواصفات الشريحة، أو في التنفيذ الفعلي للرقاقة في الأجهزة. على سبيل المثال، فمن الممكن لكتابة مواصفات رقاقة من شأنه أن يؤدي إلى طريق مسدود، وعندما يحدث مهلة في الأجهزة من المهم أن نرى ما اذا كان يمكن أن تتكرر في مواصفات منذ ذلك يشير إلى وجود مشكلة أكبر من شيء في تنفيذ رقاقة.

وبطبيعة الحال، محاكاة لألعاب الفيديو عادة يهتمون الأداء بحيث أنها لا تستخدم تطبيقات ساذجة، وأنها تشمل أيضا التعليمات البرمجية التي واجهات مع OS النظام المضيف، على سبيل المثال استخدام الرسم والصوت.

وبالنظر إلى أداء بطيء جدا من ألعاب الفيديو القديمة (NES / SNES، الخ)، ومضاهاة من السهل جدا على الأنظمة الحديثة. في الواقع، انها أكثر من المدهش أن كنت فقط يمكن تحميل مجموعة من كل لعبة SNES من أي وقت مضى أو أي لعبة أتاري 2600 من أي وقت مضى، معتبرا أنه عندما كانت هذه الأنظمة شعبية وجود حرية الوصول إلى كل خرطوشة قد تم حلم تحقق.

بعد أن خلق بلدي محاكي بي بي سي ميكرو من 80s (نوع VBeeb في جوجل) ، هناك عدد من الأشياء التي يجب أن تعرف.

  • أنت لست محاكاة الشيء الحقيقي على هذا النحو ، من شأنه أن يكون نسخة طبق الأصل.بدلا من ذلك أنت محاكاة الدولة.مثال جيد هو آلة حاسبة, الشيء الحقيقي له أزرار, شاشة, حالة إلخ.ولكن لمحاكاة آلة حاسبة تحتاج فقط إلى محاكاة ما إذا كان أزرار لأعلى أو لأسفل ، والتي قطاعات LCD ، إلخ.في الأساس مجموعة من الأرقام التي تمثل جميع التوليفات الممكنة من الأشياء التي يمكن أن تتغير في آلة حاسبة.
  • تحتاج فقط واجهة المحاكي تظهر وتتصرف مثل الشيء الحقيقي.وأكثر إقناعا هذا هو أقرب مضاهاة هو.ما يدور وراء الكواليس يمكن أن تكون أي شيء تريد.ولكن لسهولة الكتابة مقلدا ، وهناك الخريطة الذهنية أن يحدث بين النظام الحقيقي ، أيرقائق, يعرض, لوحات, لوحات الدوائر, و مجردة رمز الكمبيوتر.
  • لمحاكاة نظام الكمبيوتر, انها أسهل تقسيمها إلى قطع أصغر و تحاكي تلك القطع بشكل فردي.ثم سلسلة كبيرة معا للحصول على المنتج النهائي.مثل الكثير من مجموعة من المربعات السوداء مع المدخلات والمخرجات ، الذي يفسح المجال جميل البرمجة الشيئية.يمكنك أيضا تقسيم هذه القطع لجعل الحياة أسهل.

عمليا أنت عموما يتطلعون إلى كتابة السرعة و الدقة من مضاهاة.وذلك لأن البرامج على الهدف نظام (مايو) تشغيل ببطء أكثر من الأجهزة الأصلية على النظام المصدر.التي قد تعيق اختيار لغة البرمجة ، المجمعين ، النظام الهدف.... الخ
زيادة على ذلك يجب أن تقيد ما كنت على استعداد الاقتداء ، على سبيل المثال ليس من الضروري أن تحاكي حالة الجهد من الترانزستورات في المعالج ، ولكن ربما اللازمة لمحاكاة حالة تسجيل مجموعة من المعالج.
عموما أصغر مستوى التفاصيل من مضاهاة, لمزيد من الدقة ستحصل على النظام الأصلي.
أخيرا, معلومات عن الأنظمة القديمة قد تكون غير مكتملة أو غير موجودة.حتى الحصول على عقد من المعدات الأصلية أمر ضروري ، أو على الأقل بعملية من جانب آخر جيد المحاكي أن شخصا آخر قد كتب!

نعم، لديك لتفسير كامل ثنائي الفوضى رمز الجهاز "باليد". ليس ذلك فحسب، أكثر من مرة لديك أيضا لمحاكاة بعض الأجهزة الغريبة التي ليس لديها ما يعادل على الجهاز المستهدف.

وهذا النهج بسيط هو تفسير تعليمات واحدة تلو الأخرى. التي تعمل بشكل جيد، لكنه بطيء. نهج أسرع هو إعادة تصنيف - ترجمة رمز الجهاز المصدر إلى الهدف رمز الجهاز. هذا هو أكثر تعقيدا، لأن معظم تعليمات بعدم تعيين واحد إلى واحد. وبدلا من ذلك سيكون لديك لجعل وضع العمل في أنحاء التي تنطوي على تعليمات برمجية إضافية. ولكن في النهاية أنها أسرع بكثير. معظم برامج محاكاة الحديثة القيام بذلك.

وعند تطوير مقلدا كنت تفسير التجمع المعالج الذي يعمل على نظام (Z80، 8080، PS وحدة المعالجة المركزية، الخ.).

وتحتاج أيضا لمحاكاة جميع الأجهزة الطرفية أن النظام لديه (إخراج الفيديو، والتحكم).

ويجب البدء في كتابة برامج محاكاة لأنظمة simpe مثل لعبة فتى (والتي تستخدم معالج Z80، أنا لا لا يخطئ) أو لC64.

<اقتباس فقرة>   

والمحاكي من الصعب جدا لخلق لأن هناك العديد من الخارقة (كما هو الحال في غير عادية   الآثار)، توقيت القضايا وغيرها التي تحتاج إلى محاكاة.

لمثال على ذلك، انظر http://queue.acm.org/detail .cfm؟ ID = 1755886 .

والتي سوف تظهر لك أيضا لماذا 'حاجة' وحدة المعالجة المركزية متعددة غيغاهرتز لمحاكاة 1MHZ واحدة.

وكما تحقق Darek Mihocka في Emulators.com للحصول على المشورة كبيرة على تحسين مستوى التعليم لJITs، والعديد من الأشياء الجيدة الأخرى على بناء محاكاة كفاءة.

ولقد فعلت أبدا أي شيء يتوهم ذلك لمحاكاة وحدة تحكم لعبة لكنني لم تأخذ دورة واحدة حيث كانت الاحالة لكتابة المحاكي للجهاز هو موضح في أندرو Tanenbaums <لأ href = "HTTP: // شبكة الاتصالات العالمية. pearsonhighered.com/educator/product/Structured-Computer-Organization/9780131485211.page "يختلط =" نوفولو noreferrer "> هيكلة منظمة الحاسوب . وكان ذلك متعة وأعطاني الكثير من آها لحظات. قد ترغب في اختيار هذا الكتاب حتى قبل الغوص في لكتابة منافس حقيقي.

والمشورة بشأن محاكاة نظام حقيقي أو شيء بنفسك؟ أستطيع أن أقول إن محاكاة تعمل عن طريق محاكاة الأجهزة بأكمله. ربما ليس وصولا الى الدائرة (كما تتحرك بت حول مثل الأب أن تفعل. نقل البايت هو النتيجة النهائية لذلك نسخ بايت على ما يرام). منافس من الصعب جدا لخلق لأن هناك العديد من الخارقة (كما في الآثار غير عادية)، توقيت القضايا وغيرها التي تحتاج إلى محاكاة. إذا كان أحد (المدخلات) قطعة خطأ النظام بأكمله يمكن القيام به لأسفل أو في أحسن الأحوال يكون خلل / خلل.

المصدر المشتركة محاكي جهاز يحتوي يمكن البناء عليها كود المصدر لمحاكي الجيب / الهاتف الذكي (يتطلب البصرية ستوديو، يعمل على ويندوز). عملت على V1 و V2 لإطلاق سراح ثنائي.

وتتناول العديد من القضايا مضاهاة: - ترجمة عنوان فعالة من الضيوف الظاهري إلى البدنية النزلاء لاستضافة الظاهري - JIT تجميع من التعليمات البرمجية ضيف - محاكاة الأجهزة الطرفية مثل محولات الشبكة، شاشة تعمل باللمس والصوت - التكامل UI، لوحة المفاتيح والفأرة المضيف - حفظ / استعادة الدولة، لمحاكاة استئناف من وضع الطاقة المنخفضة

لإضافة الإجابة التي يقدمهاCody Brocious
في سياق الافتراضية حيث كنت محاكاة نظام جديد (CPU، I / O الخ) إلى جهاز ظاهري يمكننا أن نرى الفئات التالية من برامج محاكاة.

والتفسير: bochs هو مثال مترجم، بل هو منافس إلى x86 PC، فإنه يأخذ كل التعليمات من نظام ضيف يترجم في مجموعة أخرى من التعليمات (المضيف ISA) لإنتاج effect.Yes الغرض منه هو بطيء جدا ، فإنه لا تخزين أي شيء حتى يذهب كل التعليمات من خلال نفس الحلقة المفرغة.

والحيوي emalator: كيمو هو المحاكي الحيوية. هو الحال في الترجمة ذبابة التعليم ضيف تخزين أيضا results.The أفضل جزء هو أن ينفذ العديد من الإرشادات ممكن مباشرة على النظام المضيف بحيث مضاهاة أسرع. أيضا كما ذكر كودي، فإنه يقسم رمز إلى كتل (1 تدفق واحد من التنفيذ).

ومحاكي ثابت: بقدر أعلم أن هناك أي منافس ثابت التي يمكن أن تكون مفيدة في الافتراضية.

وكيف لي أن تبدأ المحاكاة.

و1.Get الكتب التي تدور حول البرمجة مستوى منخفض، فأنت في حاجة إليها من أجل "التظاهر" نظام التشغيل نينتندو ... لعبة الولد ...

و2.Get الكتب على مضاهاة على وجه التحديد، وربما تطوير نظام التشغيل. (سوف لا يتم إجراء نظام التشغيل، ولكن الأقرب إليها.

و3.look في بعض محاكاة مفتوحة المصدر، خصوصا من النظام الذي تريد أن تجعل مقلدا ل.

وقصاصات 4.copy من قانون أكثر تعقيدا إلى حسابك IDE / compliler. هذا سيوفر لك الكتابة خارج رمز طويلة. هذا هو ما أقوم به من أجل تطوير نظام التشغيل، استخدم أحد أحياء لينكس

ولقد كتبت مقالا عن محاكاة رقاقة-8 النظام في جافا سكريبت .

وانها مكان عظيم للبدء كنظام ليست معقدة جدا، ولكن كنت لا تزال تتعلم كيف أكواد العمليات، المكدس، والسجلات، وما إلى ذلك العمل.

وسوف أكون كتابة دليل أطول قريبا لNES.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top