سؤال

أقوم حاليا بتطوير محاكي ل Good GameBoy القديم ويواجه بعض المشكلات الفائقة كيف يجب تنفيذ بعض رموز التشغيل الأساسية.

الآن أقوم بالتنفيذ والعمليات؛ أول القليلة (0xa0 -> 0xa3؛ 0xa6 & 0xa7) مستقيم جدا إلى الأمام ولكن العمليات للسجلات H، L مختلفة بعض الشيء.

يمكنك تنزيل مستند z80 تحت هذا الرابط: um0080.pdf (صفحة 172)

فيما يلي بعض الأمثلة لإظهار ما أقصده (مع الكود الزائفي) وأساس ما أقوم به:

و a، h (لاحظ التحول بت)

giveacodicetagpre.

و a، l (لاحظ القناع بت)

giveacodicetagpre.

أعرف كل عمليات بت وأعرف ما يفعلونه، لكن يبدو أنني لا أستطيع معرفة سبب حاجتها من هذا القبيل. لدي بعض النظريات (تصحيح لي إذا كنت مخطئا: -)):

ما فهمته بالفعل، أن السجلات H و L هي أساسا سجل HL، وهو سجل 16 بت. نظرا لأن وحدة المعالجة المركزية / الحافلة لا يمكن إلا أن تعالج عمليات 8 بت فقط، فهي بحاجة إلى تقسيمها؛ أو مزيد من اقتراح المنطق: نظرا لسجلها الوحيد، فإن قيم H و L ملثمين في السجل وبصورة ما يجب فصلها عن بعضها البعض (أعلى / قليل من القذمة؟).

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

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

المحلول

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

z80 الأصلي لديه ALU 4 بت (انظر تعليقات شيما بدءا من أسفل الصفحة 9 في هذا النص من لوحة متحف محفوظات الكمبيوتر ) لذلك سيكون في الواقع (I) والأجزاء الأربعة المنخفضة من L والكرات؛ ثم (II) والأجزاء الأربعة العالية من L والتراكب. ومع ذلك، فهو يعرض سجلاتها ككيانات منفصلة 8 بت حتى يتم إخفاء التنفيذ الداخلي بالكامل.

تسمى

HL زوج تسجيل لأنه يسجل سجلا معا لجعل كمية 16 بت. تجاهل سجلات الظل والفهرس، فإن Z80 الأصلي لديها بالفعل ثلاثة من هؤلاء - HL، BC و de. قبل الميلاد والنبغ في وحدة المعالجة المركزية في Gameboy كزواج بديل للتحميل غير المباشر (مثل Opcode 0x1a - LD A، (BC)) وحساب 16 بت (على سبيل المثال، 0x09 أضف HL، BC) ولدي عدد قليل من الاستخدامات الأخرى على Z80.

يعتبر

sp و pc عموما سجلات غير قابلة للتجزئة 16 بت (رغم ذلك، بالطبع، يمكنك تقسيمها عن طريق تخزينها إلى الذاكرة وقراءة البايتات بشكل فردي) و AF موجودة من أجل الدفع والبهجة ولكن F الحالة التي لا تكون فيها AF مفيدة بشكل خاص كعدد صحيح 16 بت.

ملخص قصير ثم: أنت لا تواجه مشاكل في فهم كيفية تنفيذ Opcodes ، فقط كيف تم تنفيذها من قبل مؤلف معين.

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