قصة المنفذ المستحيل: كيف تم نقل Quake إلى Game Boy Advance

كان من الممكن أن يبدو أن نقل Quake إلى Game Boy Advance مستحيل، لكن راندي ليندن تمكن من تحقيق ذلك. إليك الطريقة.

Game Boy Advance عبارة عن وحدة تحكم ألعاب محمولة تم إنشاؤها بواسطة Nintendo. تم إصداره في اليابان في عام 2001 وكان بمثابة خليفة لـ Game Boy Color. كان يحتوي على ARM7TDMI بسرعة 16.78 ميجاهرتز، و32 كيلو بايت من ذاكرة الوصول العشوائي الداخلية للعمل، و256 كيلو بايت من ذاكرة الوصول العشوائي الخارجية، و96 كيلو بايت من VRAM. إنها ليست الآلة الأقوى، ولكن هناك الكثير من الألعاب المخصصة للأجهزة المحمولة والتي يحتفظ بها الكثيرون في الذاكرة الجميلة. إحدى الألعاب التي لم تر النور أبدًا بالنسبة للجهاز كانت نموذجًا أوليًا للعبة Quake، وهي لعبة تم تطويرها بواسطة id Software وساعدت في تحديد نوع ألعاب إطلاق النار من منظور الشخص الأول التي نعرفها اليوم.

Quake هي لعبة مفصلة بشكل لا يصدق مع موسيقى تصويرية رائعة وطريقة لعب مسببة للإدمان، وتمامًا مثل DOOM، تم نقلها عمليًا إلى كل جهاز يمكن أن يخطر ببالك. يعد منفذها إلى Game Boy Advance أمرًا لا يصدق بشكل خاص لأنه لا يدعم الرسومات ثلاثية الأبعاد أصلاً، وقد قامت Nintendo بتسويق الجهاز المحمول على وجه التحديد باعتباره تجربة لعب ثنائية الأبعاد. لكن هذا لم يمنع راندي ليندن من تطوير منفذه الخاص.

صورة لمنفذ Quake التي تم تشغيلها على Analogue Pocket مستخدمة بإذن من Modern Vintage Gamer

إذا لم تكن على دراية بـ Linden، فهو معروف بكونه مطور كلا اللعبتين! (محاكي PlayStation) ومنفذ SNES الخاص بـ DOOM، وهو إنجاز قاله ذات مرة جون روميرو، المؤسس المشارك لشركة id Software، في مقابلة مع شاكنيوز لم يعتقد أن ذلك ممكن. أثبتت كفاءة Linden في التطوير أنه إذا كان هناك أي شخص سيكون قادرًا على جعل Quake على Game Boy Advance حقيقة واقعة، فمن المحتمل أن يكون هو.

لقد ظهر هذا المنفذ بفضل إصدار Linden له من خلال مشروع Forest of Illusion. غابة الوهم هو مشروع يهدف إلى الحفاظ على تاريخ ألعاب نينتندو، وليندن تواصل معه لتوزيع نسخة Quake port التي وجدها على بطاقة فلاش بسعة 256 ميجا بايت في جهازه تملُّك.

نود أن نشكر راندي ليندن على تخصيص الوقت للإجابة على أسئلتنا وضمان الدقة الفنية لهذه المقالة. ونود أيضا أن نشكر اللاعب الكلاسيكي الحديث للسماح لنا باستخدام أي لقطات مطلوبة من مقطع الفيديو الخاص به. ليس لهذا المنفذ علاقة رسمية بـ id Software أو ZeniMax وقد تم تطويره كمشروع منفرد بواسطة Linden.

منفذ Quake's Game Boy Advance

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

للتوضيح، هذا المنفذ ليس اللعبة الكاملة، وهو نموذج أولي كان Linden ينوي نقله إلى id Software بمجرد اكتماله ليتم إصداره. ومع ذلك، بدأت شعبية Game Boy Advance تتضاءل، وبدلاً من ذلك، أصبح المحرك المخصص الذي كتبه Linden فيما بعد محركًا للعبة أخرى طورتها Linden بالكامل - Cyboid. يخبرنا Linden أن "جزءًا كبيرًا من الكود" لا يزال هو كود ARM الأصلي من إصدار Game Boy Advance. إذا كنت ترغب في تجربة Cyboid، يتوفر إصدار أقدم على متجر Google Play، ولكن يتم الآن توزيع ملف APK الرسمي على متجر تطبيقات أمازون نظرًا لأن اللعبة تحتوي على الكثير من التعليمات البرمجية ذات المستوى المنخفض 32 بت.

سايبويدمطور: آر آند آر ديجيتال، ذ.م.م.

مجاني.

3.3.

تحميل

شارك Linden معنا أيضًا مقطع فيديو للكود الخاص به الذي يعمل على iPod Video، والذي كان بمثابة أحد أقدم إصدارات Cyboid. لقد تم بناؤه على نفس رمز المحرك الذي تم استخدامه لمنفذ Quake الخاص به إلى Game Boy Advance.

لا يحتوي منفذ Game Boy Advance للعبة Quake على أي من الأصول الرسمية للعبة، حيث لم يفعل Linden ذلك تم التواصل مع id Software أو ZeniMax بشأن توزيع إصدار E1M1 الذي يحتوي على Quake الرسمي أصول.

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

أما بالنسبة للموسيقى، فإن العرض التوضيحي يستخدم ملفات .S3M العامة ويتعامل خلاط الصوت مع موسيقى الاستريو والمؤثرات الصوتية.

الحدود الفنية

كان هناك عدد من الحدود عندما يتعلق الأمر بـ Game Boy Advance مما جعل هذا المنفذ صعبًا. كانت بعض أكبر العوائق هي انخفاض سرعة الساعة، والافتقار إلى إمكانات الرسومات ثلاثية الأبعاد للجهاز المحمول، وعدم وجود وحدة الفاصلة العائمة (FPU). كان هناك الكثير من النقاط الأخرى على طول الطريق، ولكن كانت هذه نقاط الألم المحددة التي أوضحها لي ليندن باعتبارها مشكلة. قبل أن ندخل في الأمر، من المهم أن نفهم تصميم لعبة Game Boy Advance.

تم استخدام لقطة الشاشة بإذن من Modern Vintage Gamer

يحتوي Game Boy Advance على ثلاث مجموعات من ذاكرة الوصول العشوائي - واحدة هي ذاكرة الوصول العشوائي للعمل الداخلي (IWRAM)، والأخرى هي ذاكرة الوصول العشوائي للعمل الخارجي (EWRAM)، والثالثة هي ذاكرة الوصول العشوائي للفيديو (VRAM). يتم استخدام 32 كيلو بايت من IWRAM لتخزين تعليمات ARM للتنفيذ السريع، في حين أن 256 كيلو بايت من EWRAM هي الأمثل لتخزين تعليمات الإبهام فقط وأجزاء أصغر من البيانات. مثل ملاحظات رودريجو كوبيتي، يمكن أن يكون الوصول إلى EWRAM أبطأ بما يصل إلى ست مرات من IWRAM. لا يمكن الوصول إلى غالبية الذاكرة في شكل EWRAM إلا عبر ناقل 16 بت، على الرغم من تسويق Game Boy Advance على أنه جهاز محمول 32 بت. يمكن الوصول إلى IWRAM عبر ناقل 32 بت. تأتي VRAM الموجودة في Game Boy Advance بسعة 96 كيلو بايت، وعلى الرغم من أنها مخصصة بشكل أساسي لتخزين بيانات الرسومات، إلا أنها موجودة في خريطة ذاكرة وحدة المعالجة المركزية ويمكن استخدامها كتخزين ذاكرة عادي أيضًا.

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

كما أخبرني ليندن، كان الجزء الأكثر تعقيدًا وصعوبة في المنفذ بأكمله هو جهاز عرض خط المسح الضوئي. وهو يتألف من أكثر من 10000 سطر من كود تجميع ARM المُحسّن للغاية والذي تم تصميمه لرسم مجموعة من وحدات البكسل إلى VRAM. استخدم عارض خط المسح معظم مساحة IWRAM البالغة 32 كيلو بايت. تكون الحواف الأقرب إلى الكاميرا نشطة ومعروضة، وهي في الأساس عبارة عن شجرة كبيرة لتقسيم الفضاء الثنائي (BSP). تم استخدام VRAM لتخزين نتائج مخرجات التحويل المضلع إلى جداول الحافة لأنه لم يكن هناك ما يكفي من IWRAM، لكن VRAM في Game Boy Advance لا يزال أسرع من EWRAM. تم أيضًا تخزين الرسومات وعرضها هنا.

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

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

يعد تبديل أوضاع وحدة المعالجة المركزية للحصول على سجلات إضافية مناورة ذكية بشكل لا يصدق تسمح بالوصول السريع إلى القيم القريبة من وحدة المعالجة المركزية بحيث يمكن استرجاعها في دورة ساعة واحدة. كما أخبرني ليندن، كان من الممكن تبديل السجلات واسترداد القيمة في دورة ساعة واحدة، بدلاً من تخزين قيمة في ذاكرة الوصول العشوائي الخاصة بـ Game Boy Advance، الأمر الذي يستغرق وقتًا أطول. وحدة المعالجة المركزية نفسها عبارة عن معالج بسرعة 16.78 ميجاهرتز، مما يعني أنها يمكنها إكمال 16780000 دورة في الثانية. يبدو هذا كثيرًا، ولكن عندما تحتاج إلى حساب ورسم كل بكسل على الشاشة، فإن تلك النقاط تتراكم بسرعة ويصبح من المهم تقليل أكبر عدد ممكن من العمليات.

ما ورد أعلاه هو قائمة السجلات العامة لمجموعة شرائح ARM7TDMI الموجودة داخل Game Boy Advance. عادةً، لن يتمكن المطورون من الوصول إلى السجلات إلا في وضع "النظام والمستخدم" ويلجأون إلى استخدام المتغيرات العادية خارج ذلك الوضع. ومع ذلك، فقد استخدم السجلات في جميع الأوضاع السبعة لمجموعة الشرائح، وأفضل ما في الأمر هو ذلك لا تزال أوضاع التبديل تحتفظ بالقيم الموجودة في سجلات الأوضاع الأخرى، حتى يتمكن من التبديل بينها هم.

ومن المضحك أن ليندن ذكر أيضًا كيف كشفت طريقته في التحويل البنكي عن خطأ في محاكي Nanoboy Advance. كما اتضح فيما بعد، لم يكن هذا المحاكي يدعم استخدام الأوضاع الأخرى لوحدة المعالجة المركزية لحفظ السجلات والتبديل، وكان عرض Quake التجريبي أول لعبة معروفة تقوم بذلك بالفعل.

شارك ليندن معنا صورة لبعض الملاحظات التي أنشأها وشرح كيف قام بتحسين حسابات الفاصلة العائمة في غياب وحدة FPU مناسبة.

الصورة أعلاه هي الصورة التي شاركها ليندن معنا من خلال ملاحظاته، والأمر المثير للاهتمام بشكل خاص هو "تعداد تعليمات دورة ARM المتنوعة". لقد ابتكر طريقة لتحسين دورات العمليات الحسابية حتى يتمكن من تقليل عدد دورات الساعة لإجراء عملية حسابية. كما وصفه لي، يمكن ضرب رقم 8 بت في دورة ساعة واحدة، ورقم 16 بت في دورتين للساعة، ورقم 32 بت في ثلاث دورات ساعة، ورقم 64 بت في أربع دورات ساعة .

"كانت هناك مرحلتان أو ثلاث مراحل من التنفيذ [في معالج ARM]. لنفترض على سبيل المثال أنني ضربت التسجيل واحدًا في التسجيل الثاني وأضع النتيجة في السجل ثلاثة. إذا كنت أعرف أن السجل الثاني كان رقمًا مكونًا من 16 بت بدلاً من قول ضرب التسجيل واحد بالتسجيل الثاني، فأنا سأقلبها وأقول اضرب تسجيل اثنين في تسجيل واحد لأن ذلك سيوفر لي الساعة دورة."

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

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

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

بشكل عام، تم تطوير النموذج الأولي النهائي على مدى عامين تقريبًا.

مستقبل ميناء راندي ليندن الزلزال

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

إعداد Randy Linden لتوصيل Game Boy Advance بالكمبيوتر من أجل التطوير.

سألت Linden عن سبب اختياره لـ Quake، وأخبرني أنه أحب اللعبة وأحب التحدي المتمثل في كونها "المشروع المستحيل"، لأنه كان خارج الجزء الخلفي من لعبة DOOM لمنفذ SNES. وذكر أيضًا أنه على الرغم من أنه لا يعتقد أنه كان من الممكن نقل اللعبة بأكملها بسبب قيود المساحة، إلا أن الغالبية العظمى من اللعبة كان من الممكن أن تكون في نفس المحرك.

إذا كنت مهتمًا بمراجعة Quake لـ Game Boy Advance، فتأكد من الاطلاع على إصداره على Forest of Illusion، والذي يمكنك الاطلاع عليه أدناه.


تحميل من غابة الوهم