جافا للبلاي ستيشن 2 - هل من الممكن؟

الصورة

مقدمة


مع هذا المشروع ، أردت الإجابة على سؤال واحد: هل من الممكن كتابة واجهة برمجة تطبيقات Java لـ Playstation 2 وإنشاء عرض توضيحي رسومي عليه. لا اريد الكشف عن المفسدين لكن الجواب نعم.

منذ بضع سنوات ، بدأت مشروع Java Grinder الذي يستقبل ملفات Java .class المجمعة ويعمل في الواقع كمفكك. ولكن بدلاً من تفكيكها إلى رمز Java المجمع ، فإنها تقوم بالتفكيك في التعليمات البرمجية المصدر الخاصة بالمجمع للمعالجات الحقيقية. إذا كان ملف الصف يحتاج إلى ملفات فئة أخرى ، فسيتم قراءتها ومعالجتها أيضًا. تتم كتابة جميع استدعاءات طريقة واجهة برمجة التطبيقات (API) إلى الإخراج ، إما كرمز مجمع مُدمج ، أو كمكالمات للوظائف المكتوبة مسبقًا التي تؤدي مهمتها المقصودة.

نظرًا لأن Java Grinder تمت كتابته في C ++ في لغة موجهة للكائنات ، مجردة ، متعددة الأشكال والعديد من كلمات HR المفضلة رفيعة المستوى ، لتوسيعها ، كان مطلوبًا بشكل أساسي لإنشاء فئة Playstation2 ، وتوسيع فئة R5900 الجديدة ، وتوسيع فئة Generator الرئيسية.

ونتيجة لذلك ، تبين أن المشروع أكبر مما كنت أتوقع. النظام نفسه بسيط للغاية ، ولكن لا يزال لدي الكثير لأتعلمه ، والعثور على معلومات عالية الجودة ليس بهذه البساطة. في الواقع ، لأول مرة في هذا المشروع ، بدأت في برمجة ثلاثية الأبعاد حقيقية. في منشور آخر ، تحدثت بالفعل عن ما تعلمته في صفحة برمجة Playstation 2 الخاصة بي.

يوجد أدناه فيديو وشرح مفصل لعملية التطوير.

فيديو



لقد سجلت عرضًا توضيحيًا على جهاز PS2 رفيع من خلال توصيل كبلات الصوت والفيديو بناسخ أقراص DVD. كنت قلقة قليلاً من أن PS2 لديه نوع من حماية Macrovision التي من شأنها أن تدمر إشارة الفيديو ، ولكن تم إيقاف تشغيلها أو تجاهلها مسجل DVD. يبدأ الفيديو بعرض من Playstation 2 الحقيقي ، الذي يدير عرضًا توضيحيًا. وحدة التحكم متصلة بإشارة مركبة إلى محول VGA ، متصل بشاشة LCD ، مما يثبت أن العرض التجريبي يعمل على جهاز حقيقي. ثم أضفت اللصق مع الفيديو الحقيقي المسجل مباشرة من PS2 في مسجل DVD.

يوتيوب: https://youtu.be/AjM069oKUGs

مشاريع مماثلة في mikekohn.net


مطحنة جافا:بلاي ستيشن 2 جافا ،
Sega Genesis Java ،
Apple IIgs Java ،
TI99 / 4A Java ،
C64 Java ،
dsPIC Mandelbrots ،
Atari 2600 Java ،
chipKIT Java ،
مطحنة جافا ،
naken_asm

تجريبي


تذكر عرض Sega Genesis Java التجريبي ، يؤسفني قليلاً أنني لم أجعله أكثر إثارة للاهتمام. ثم كان الأمر أكثر إثارة للاهتمام بالنسبة لي أن أثبت قدرات Java API. عندما بدأت هذا المشروع ، قررت أن أفعل شيئًا أكثر جدية. لسوء الحظ ، شعرت بالحيرة مرة أخرى أثناء دراسة النظام وإنشاء واجهة برمجة التطبيقات التي لم أكن أملك القوة الكافية لعرض توضيحي كبير.

  • شعار 3 Billion Devices: هذا هو 3 مليار جهاز منخفض الدقة يشغّل شعار Java الذي أنشأه Joe Davisson من أجل Commodore 64 Java Demo.
  • الشعارات: رسمتها بعلامة ومسحها ضوئيًا (باستثناء شعار جافا).
  • النجوم: لقد قمت بالفعل بنسخ الكود من عرض Sega Genesis Java وتعديله للعمل مع Playstation 2 API. النص هنا مكتوب أيضًا بعلامة ومسح ضوئيًا.
  • فركتلات ماندلبروت: يتم شرحها باستخدام وحدة المتجه 0 ، التي تقوم بحساب الفركتلات ، وتقوم الوحدة المتجهة 1 بإجراء حسابات ثلاثية الأبعاد. يتحكم MIPS في ما يفعله كلا الجهازين المتجهين.
  • المكعبات: قمت برسم هذه المكعبات في Wings3d وكتبت كود C لتحويل ملفات STL إلى صفائف يمكن أن تستخدمها Java Grinder . أضفت الألوان يدويًا.
  • حلقة المربعات: مجرد محاولة لرسم الكثير من الأجسام المتحركة على الشاشة. ربما كان من المفيد إضافة المزيد من الأشياء قبل أن يبدأ النظام في التباطؤ.

موسيقى


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

لقد سجلت التكوين الثاني قبل يوم واحد فقط من نشر المقال. يبدو الغيتار المنفرد قليلاً ... في حالة سكر لأنه يتم تشغيله على الغيتار الذي تحولت إليه بلا قلق . أنا لست جيدًا جدًا في تشغيلها ، وتتلاشى النوتات العالية بسرعة كبيرة ، لكن الشرائح تبدو رائعة جدًا. تم لعب الجزء الإيقاعي على مجموعة Yngwie wanna-be (رخيصة صدفي Squier Strat ، DOD YJM308 overdrive وميني مارشال مدعوم ببطاريات 9 فولت).

قمت ببرمجة الطبول لكلا التركيبات باستخدام برنامج Drums ++ المكتوب منذ فترة طويلة. يتلقى ملفات نصية مسجلة بلغتي الخاصة ، ويحولها إلى ملفات .mid ، التي قمت باستيرادها إلى Apple Garage Band ، وبعد ذلك يمكنك تسجيل مسارات القاعدة والغيتار. ملفات المصدر fretless.dpp و shoebox.dpp موجودة في مجلد الأصول في المستودع التجريبي الخاص بي.

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

فيما يلي مساران بتنسيق MP3:


التنمية


تم تطوير المشروع لفترة طويلة. لقد بدأت في إضافة تعليمات R5900 Emotion Engine إلى مجمع MIPS في naken_asm ، ثم ذهبت للحصول على تعليمات النقطة العائمة وتعليمات وحدة ناقل الماكرو / الصغير. من خلال فترة راحة كبيرة للعمل في مشاريع أخرى ، درست جميع الجوانب الأخرى اللازمة لهذا العرض التوضيحي ، وشرعت في إضافة دعمهم إلى Java Grinder . إذا كان أحد الأشخاص مهتمًا بالتفاصيل منخفضة المستوى ، فقد قمت بإنشاء صفحة حاولت فيها توثيق جميع المعلومات التي تم جمعها: برمجة Playstation 2 .

أنا مبرمج بشكل رئيسي باستخدام محاكي PCXS2 . إنه مريح للغاية ، لأنه يمكنني فحص السجلات وما شابه على الشاشة. لكنها بالتأكيد ليست مرنة وبسيطة مثل MAME عند تطوير Sega Genesis . على سبيل المثال ، في MAME ، من الأسهل فحص الذاكرة ، وذاكرة الوصول العشوائي ، وتسجيلات الفيديو / الصوت للتأكد من أن Java Grinder يعمل بشكل صحيح.

عند العمل مع الرمز الخاص بـ Sega ، ارتكبت خطأً واحدًا - لم أختبره على الجهاز حتى تمت كتابة العرض التوضيحي. كانت هناك ثلاث غرائب ​​على الأقل في رمز Sega تجاهلها المحاكي ، لكنهم لم يعجبهم الجهاز الحقيقي. هذه المرة ، بعد كتابة الأجزاء الفردية من الشفرة ، اختبرتها على جهاز حقيقي ، بحيث أنه بعد اكتمال العرض التجريبي ، يعمل على كل من المعدات الحقيقية والمحاكي. لقد صادفت مرة أخرى أشياء عملت في المحاكي ، ولكن لم تبدأ على PS2 حقيقي. لقد وجدت أيضًا أنها تعمل على جهاز Playstation 2 حقيقي ، لكنها كانت تؤدي بشكل غير صحيح في المحاكي.

ميزات API


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

API


يتم تعيين الجزء الرئيسي من API في فئة Playstation2 . في البداية ، كنت سأعطيه درجة كبيرة من الحرية - القدرة على ضبط أوضاع الفيديو وما شابه ، ولكن بعد ذلك اعتقدت أنه قد يكون من الأفضل إخفاء كل هذه الصعوبات. بشكل أساسي ، تقوم فقط بإعداد شاشة متداخلة 640x448. كما هو الحال مع مشاريع Java Grinder الأخرى ، أضفت الأساليب / الميزات بشكل أساسي حسب الحاجة.

هناك مجموعة أخرى من الفئات التي أعطيت اسم مملة Draw3D . في جوهرها ، يقومون بتحديد جميع أنواع البدائية التي يمكن أن يقدمها مُركِّب الرسومات مع دعم زخارف 16 و 24 و 32 بت. فكرت في إضافة زخارف 8 بت ، لكنني قررت عدم القيام بذلك حتى الآن. يوفر Draw3D عمليات التدوير ثلاثية الأبعاد والإسقاط ونقل أجهزة DMA والقوام وما إلى ذلك. ربما ستسأل لماذا لم أقم بإنشائه استنادًا إلى OpenGL ، لكنني لم أعمل أبدًا مع OpenGL من قبل. ذات مرة كنت منخرطًا في برمجة ps2dev البسيطة ، ولكن لم يكن هناك شيء خطير هناك وبالكاد أتذكر هذا المشروع ، لذلك أكرر - يمكننا أن نفترض أن هذه هي المرة الأولى التي أفعل فيها شيئًا جادًا في 3D.

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

وحدة المتجه 0 (VU0)


مستخدم Java Grinder مجاني لاستخدام VU0. لقد استخدمت الجزء التوضيحي المسمى "وحدتان متجهتان ، MIPS واحد" لتقديم فركتلات ماندلبروت. يمكن تحسين الشفرة بشكل أفضل ، على سبيل المثال ، معظم تعليمات النقطة العائمة لوحدة ناقلات لديها وقت تشغيل 1 وزمن وصول 4. كما أفهمها ، هذا يعني أنه إذا كان السجل هو هدف التعليمات ، فيمكن تنفيذه في دورة واحدة ، ولكن للحصول على النتيجة ، يلزم 4 دورات. إذا تم استخدام هذا السجل ، فستظل وحدة الناقل خاملة حتى تصبح جاهزة. لذلك ، الفكرة هي أنك تحتاج إلى ترتيب التعليمات حتى تتمكن من تنفيذ كل تعليمات في دورة واحدة دون توقف. عندما قمت بإنشاء فركتلات ماندلبروت على Playstation 3 العام الماضي ، قمت بتحسين هذا الرمز أثناء حساب 8 بكسل في نفس الوقت (2 تسجيلات SIMD) ، مع ملاحظة زيادة كبيرة في السرعة. في الحالة الحالية ، حاولت أن أجعل الشفرة أسهل في القراءة ، لذلك لم أزعجك بتحسينها.

تحتوي VU0 على 4 كيلوبايت فقط من ذاكرة البيانات ، ولن تكتب صورة الفراكتل بأكملها هناك ، لذلك يرسل MIPS إحداثيات 1/8 فقط من الصورة في المرة الواحدة.

الغرابة التي واجهتها عند العمل مع VU0: لقد قمت في البداية بتشغيل كود VU0 باستخدام الإرشادات واستخدمت VIF0_STAT للتحقق من اكتمال تنفيذها. يبدو أن VIF0_STAT لا يعمل إذا لم تبدأ VU0 مع حزمة VIF. تم إصلاح هذا في المحاكي ، ولكن الخطأ لا يزال في الجهاز الحقيقي. ونتيجة لذلك ، اكتشفت أن vcallms واستخدام cfc2 في التسجيل 29 يعمل في كلتا الحالتين.

يبدو لي أن مجموعات تعليمات وحدة المتجه تفتقر إلى تعليمات المقارنة المتوازية الموجودة في Intel X86_64 و Playstation 3 وحتى مجموعة تعليمات MIPS R5900 Emotion Engine. يجب أن تقوم فركتلات ماندلبروت بحساب الصيغة بشكل متكرر حتى تكون النتيجة أفضل ، لذلك مع مجموعة مختلفة من التعليمات ، سأقوم فقط بإجراء مقارنة متوازية من شأنها إنشاء قناع لجميع ثنائي 1 أو 0. يمكن استخدام القناع لإيقاف زيادة عدادات الألوان. بالنسبة للبلاي ستيشن 2 ، كان علي أن أستنبط صيغة محرجة للغاية ، وهي قريبة جدًا من صيغة الفراكتل. لقد وثقت هذا في شفرة المصدر mandelbrot_vu0.asm في سطور مع Python علق عليها.

أجدها رائعة في أجهزة وحدة ناقلات وحدة تحكم Playstation 2 التي لم أرها أي مجموعات أخرى من تعليمات SIMD التي يمكن أن تحتوي فيها جميع تعليمات FPU على السمة .xyzw التي تخبر الإرشادات بأي من أرقام الفاصلة العائمة الأربعة التي تحتوي عليها يؤثر. أي ، إذا كنت بحاجة إلى نتيجة التعليمات للتأثير فقط على مكون x للمتجه ، فسوف أقوم ببساطة بإضافة .x في نهاية التعليمات. شيء آخر مثير للاهتمام هو أنه مجموعة من تعليمات VLIW ، أي في كل دورة ، يتم تنفيذ تعليماتين في وقت واحد. في الواقع ، تشبه الوحدة DSP أكثر من معالج للأغراض العامة.

وحدة المتجه 1 (VU1)


تم حجز VU1 بواسطة Java Grinder لإجراء عمليات التدوير والحركات والإسقاطات ثلاثية الأبعاد. يتم تمرير كائنات Draw3D إلى VU1 باستخدام طريقة draw () ، والتي تستخدم مجمع وحدة المتجه لتحويل النقاط ونقلها إلى مُركِّب الرسومات. يمكن تحسين كود التجميع في VU1 بشكل أفضل للسرعة ، ولكنه مناسب لأغراضي ، لذلك قررت ترك الشفرة سهلة القراءة (غير محسنة).

لدراسة صيغ الإسقاطات والمنعطفات ، استخدمت الإسقاطات والمنعطفات في ويكيبيديا.

رمز التحويل ثلاثي الأبعاد موجود أيضًا في مستودع naken_asm كملف .asm: rotation_vu1.asm بسيط.

MIPS R5900


لم يعجبني حقًا مجموعة تعليمات MIPS حتى بدأت العمل في هذا المشروع. في الواقع ، من السهل جدًا العمل مع وحدة المعالجة المركزية هذه. يحتوي إصدار Emotion Engine من وحدة المعالجة المركزية هذه على ميزات مريحة للغاية. الأهم من ذلك ، أن التسجيلات يبلغ طولها 128 بت ، ولكن في الواقع يتم استخدامها ببساطة للتحميل / التخزين و SIMD. هذا ، في الواقع ، هذه هي سجلات 128 بت و ALU 64 بت ومؤشرات 32 بت.

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

قراصنة جافا


Java Grinder نفسها لديها أيضًا ... شاذاتها الخاصة ، ولكن هناك شيء مفقود ببساطة ، ويرجع ذلك أساسًا إلى أنني استهدفت في البداية MSP430 ، وكانت في الغالب تجربة. كان أحد العناصر المفقودة عدم القدرة على تخصيص ذاكرة للكائنات. أضفت هذه الميزة على Playstation 2 لإنشاء كائنات متعددة ، بشكل رئيسي باستخدام Draw3D API. لم أكتب أي مخصصات للذاكرة أو جامعي القمامة ، لذلك يتم إجراء جميع المكالمات الجديدة على المكدس. كنت أفكر في تنفيذ شيء ما مثل مخصص الذاكرة الديناميكي ، ولكن في النهاية قررت عدم تعقيده. أضفت أيضًا دعم Playstation 2 الموسع لأرقام الفاصلة العائمة (تعويم) (جزئيًا كان هذا الدعم لا يزال في رمز Epiphany / Parallella). بعض الأشياء الأخرى ، مثل الأنواع الطويلة والمزدوجة ، لا تزال غير مدعومة.

ربما كان أكثر شيء مزعج فعلته يتعلق بالتقييد الرهيب لملفات فئة جافا. لا يمكن أن تكون طريقة Java أكبر من 64 كيلو بايت إذا تذكرت بشكل صحيح. ربما يكون هذا أمرًا طبيعيًا ، ولكن المشكلة تنشأ عندما يكون هناك صفيف ثابت في ملف الفئة ولا يتم تفريغه في ملف الفئة كبيانات ثنائية. يتم وضعه في ملف الفئة كإرشادات مجمع Java في مُهيئ ثابت لإنشاء صفيف. حاولت حفظ الصور في ملفات الفصل الدراسي كمصفوفات بايت [] ثابتة ، ولكن بعضها لم يكن مناسبًا ، لذلك أضفت طريقة إلى ملف فئة Memory Java Grinder :

byte[] Memory.preloadByteArray(String filename); 

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

مع وضع كل هذا في الاعتبار ، آمل حقًا ألا يتعثر جيمس جوسلينج أبدًا في مشروعي.

صور


يمكن لـ Draw3D API استخدام زخارف 16 و 24 و 32 بت. يمكن تعيين وحدات بكسل الملمس بالبكسل أو عن طريق التحميل باستخدام صفائف البايت []. أضفت أيضًا القدرة على ضغط الصور RLE بالتنسيق {length، lo16، hi16} ، حيث lo16 و hi16 هما لون 16 بت في تنسيق endian الصغير ، والذي يتم نسخه إلى مرات "طول" المادة.

الأدوات


عند العمل على Sega لإنشاء أدوات لإنشاء صور وموسيقى وما شابه ، استخدمت لغة Google Go ، فقط لتعلم لغة جديدة. هذه المرة حاولت الصدأ. تحول الأداة الأولى الثنائيات إلى شفرة مصدر Java ، وتحول الثانية BMP إلى تنسيق ثنائي ، والذي يمكن تحميله في مواد ، بما في ذلك تنسيق RLE. ونتيجة لذلك ، كتبتها في Python ، في حالة رغبة شخص ما في الانضمام إلي في إنشاء عرض توضيحي.

الصوت


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

أول شيء اكتشفته هو أن SPU2 (وحدة معالجة الصوت) متصلة بـ IOP (معالج I / O ، المعروف أيضًا بمعالج Playstation 1). يتم توصيل Playstation 2 CPU بـ IOP من خلال شيء يسمى SIF. يذكر ملف PDF الخاص بـ Sony فقط SIF DMA ، لكنه لا يقول شيئًا عن استخدامه.

نتيجة لذلك ، رفضت استخدام SIF ، لكنني قررت إضافة رابط إلى naken_asm حتى أتمكن من استخدام kernel.a من PS2DEV SDK. حصل Linker ، لكنه فشل.

في هذه المرحلة ، قررت بالفعل أنني لا أستطيع تشغيل الصوت ، وأردت فقط إنهاء العرض التوضيحي بدونه. لكن الأمر كان يعذبني ، لذلك قررت إلقاء نظرة على الكود المصدري لمختلف محاكيات Playstation 2 لفهم كيفية عمل SIF. أخيرًا ، اكتشفت كيفية الوصول مباشرةً إلى الذاكرة من رمز MIPS R3000 في IOP وتشغيلها (هناك مثال في مجلد العينات في مستودع naken_asm). تمكنت من الحصول على الصوت للعمل في المحاكي.

في النهاية ، اكتشفت أن ذاكرة IOP (بما في ذلك SPU2) كانت موجودة في مساحة Emotion Engine ، لذلك بذلت الكثير من الجهد (التوثيق صغير للغاية ولا يتم تنفيذه بشكل صحيح تمامًا في أي من المحاكيات ، ولكن لا يهم بالنسبة لهم للعمل ) ، تعلمت العمل مع الصوت.

مقارنة بين المحاكي والحديد


لقد وجدت بعض الاختلافات بين التنفيذ على جهاز حقيقي وفي محاكي.

  • إذا قامت حزمة GIF بتعيين PRIM لتسجيل كل من قيم IIP (طريقة التظليل) ، وكانت بتات FIX كلها 1 ، فإن المحاكي يأخذ في الاعتبار بت IIP وينفذ تظليل Gouro ، بينما تؤدي المعدات الحقيقية تظليلًا مسطحًا.
  • إذا تم إرسال حزمة GIF من خلال PATH3 (EE مباشرة إلى GS) ، ولم يتم تعيين علامة EOP (نهاية الحزمة) ، فعندها إذا حاولت VU1 إرسال حزمة GIF من خلال PATH 1 (VU1 إلى GS) ، فسيؤدي ذلك إلى تعليق في الأجهزة الحقيقية ، ولكن ستعمل في المحاكي.
  • تخطي مسح ذاكرة التخزين المؤقت لوحدة المعالجة المركزية قبل نقل DMA ليس ضروريًا ، ولكن على جهاز حقيقي يؤدي إلى سلوك غريب.
  • عند وضع SPU2 في مساحة EE ، يمكن للمحاكي ببساطة تسجيل البيانات الصوتية في FIFO SPU2. على Playstation 2 حقيقي ، بعد تسجيل 32 كلمة ، من الضروري الكتابة إلى السجل لإعطاء أمر لمسح FIFO. أيضًا ، على الأجهزة الحقيقية ، عند تعيين عنوان الإرسال / البدء لـ SPU2 ، يجب تعيين وضع الإرسال على 0. لا تهتم المحاكي إذا كانت القيمة 0 للوضع.
  • تعطل كتابة IOPs من EE إلى الذاكرة المخصصة على جهاز حقيقي ، على الرغم من أنه في وضع kernel. يسمح المحاكي لمثل هذه العمليات بالعمل بغض النظر عن وضع وحدة المعالجة المركزية الحالي.
  • يعمل استخدام قنوات SIF DMA في المحاكي ، ولكن ما زلت غير قادر على جعلها تعمل على معدات حقيقية. كنت أتلقى خطأ في الوصول إلى الذاكرة لسجلات SIF DMA حتى في وضع kernel.
  • المحاكي بطيء جدًا في تشغيل عرض توضيحي عند حساب الفركتلات باستخدام VU0 ، لذلك الصوت غير متزامن.

لتلخيص


كنت أرغب في كتابة بعض البرامج لـ Playstation 2 تقريبًا منذ لحظة شرائها. في الواقع ، كان لدي بالفعل مجموعة Linux لـ PS2 لفترة طويلة (أعتقد أن هذا هو السبب في أنني اشتريت Playstation 2) ، حتى أنني حاولت العمل مع مكتبة PS2DEV في C ، لكن هذه تجربة مختلفة تمامًا مقارنة بالبرمجة في لغة التجميع مباشرة للحديد.

يجب أن أشكر لوكاش لحفظه كود المصدر المجمع القديم ووثائق PS2. لست متأكدًا مما إذا كان بإمكاني حتى البدء بدون عرض Duke 3 Star ، مما ساعدني في تهيئة المعدات. أنا ممتن أيضًا لمطوري محاكي PCSX2 ، الذي سرع إلى حد كبير من عملية التصحيح. بالإضافة إلى ذلك ، لم أستطع معرفة الصوت إذا لم أكن قد نظرت إلى شفرة المصدر للمحاكي ولم أفهم ما هو الخطأ.

وبفضل سوني لهذا الكمبيوتر الصغير الجميل. إذا قرأ شخص من سوني هذه المقالة ، فإليك نصيحة: لماذا لا تتقلص إلى حجم Rapsberry Pi وتبيعه كمجلس لمشاريع هواية؟ :).

إنشاء عرض توضيحي


git clone https://github.com/mikeakohn/playstation2_demo.git
git clone https://github.com/mikeakohn/java_grinder.git
git clone https://github.com/mikeakohn/naken_asm.git
cd naken_asm
./configure
make
cd ..
cd java_grinder
make java
make
cd ..
cd playstation2_demo
make

Source: https://habr.com/ru/post/ar423751/


All Articles