لوحة ألعاب من Sega Mega Drive و Raspberry Pi Part 1 (تحضيري وثلاثة أزرار)

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



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

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

كما كان من قبل ، قمت بتنظيم الاتصال بـ Raspberry pi باستخدام كابل USB من العلبة التي تم إيقاف تشغيلها وموصل أبي DB-9. ورسم GPIO الاستنتاجات في البرنامج. تعمل لوحة الألعاب بشكل رائع من 3.3 فولت.



كما هو الحال دائمًا ، نشأ السؤال حول اختيار محاكي ، وكان الخيار الأفضل هو المحاكي - Picodrive ، تم تحسينه لـ ARM ، منظم بشكل جيد ، وكما أفهمه ، فهو جزء من تجميع RetroPi. ولكن مع التجميع كان علي أن العبث قليلاً. كود المصدر موجود على خدمة جيثب على هذا العنوان .

للبناء ، نحتاج إلى 3 مكونات للنجاح من مستودع مؤلف المحاكي:

  1. محاكي Picodrive نفسه ؛
  2. محاكي وحدة المعالجة المركزية - cyclone68000 ؛
  3. و FrontEnd - Libpicofe.

الآن يجب تجميع كل هذا بشكل صحيح. قم بفك حزمة Picodrive أو عدم فكها ، اعتمادًا على كيفية تنزيلها. الآن افتح الدليل باستخدام cyclone68000 ، يجب نسخ محتوياته إلى الدليل:

/ /picodrive-master/cpu/cyclone 

تحتاج أيضًا إلى التعامل مع محتويات دليل Libpicofe ، يتم نسخ محتوياته إلى الدليل:

 / /picodrive-master/platform/libpicofe 

تحتاج الآن إلى التحضير للتجميع:
جعل التكوين

 sudo ./configure 

بعد اكتمال التكوين ، سيتم إنشاء ملف - config.mak ، ستحتاج فيه إلى البحث عن بعض الأسطر وتغييرها. أدناه هي النتيجة النهائية:

 AS = arm-linux-as LDLIBS += -L/usr/lib/arm-linux-gnueabihf -lSDL -lasound -lpng -lm -lz -lwiringPi ARCH = arm PLATFORM = rpi1 

بعد ذلك ، تحتاج إلى تحرير الملف - config.h . وهي موجودة في الدليل:

 / /picodrive-master/cpu/cyclone 

في ذلك ، تحتاج إلى وضع تلك في المتغيرات:

 #define HAVE_ARMv6 1 #define CYCLONE_FOR_GENESIS 1 

والآن جزء البرنامج

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

دون الالتقاط المعلق ، سأقول على الفور أن الملفات التي تبحث عنها موجودة في الدليل:

 / /picodrive-master/pico/ 

نحن مهتمون في 3 ملفات - pico.c ، memory.c ، memory.h . ربما يمكنك القيام بذلك بعدد أقل ، وحشر كل شيء في واحد ، ولكن يبدو لي أسهل.
وهكذا ، في ملف pico.c ، أقوم بتهيئة المكتبة وتكوين دبابيس GPIO مبدئيًا.

على الفور سأعطي جزء من رأس الملف:

 #include "pico_int.h" #include "sound/ym2612.h" #include <wiringPi.h> #define Data0 3 #define Data1 4 #define Data2 5 #define Data3 12 #define Data4 13 #define Data5 10 #define Select 6 struct Pico Pico; struct PicoMem PicoMem; PicoInterface PicoIn; 

كما ترى ، تم تعيين عنوان مكتبة WiringPi ، وتم الإعلان عن التعريفات ، والتي ستظهر أقل قليلاً. حسنًا ، على سبيل المثال ، الآن في دالة PicoInit (void) باطلة :

 void PicoInit(void) { ... ... PicoDraw2Init(); wiringPiSetup (); pinMode (Select, OUTPUT); pinMode (Data0, INPUT); pinMode (Data1, INPUT); pinMode (Data2, INPUT); pinMode (Data3, INPUT); pinMode (Data4, INPUT); pinMode (Data5, INPUT); digitalWrite (Select, HIGH); } 

هذه وظيفة تهيئة ذاكرة المحاكي (من نوع). وهنا أدرجت جميع إعدادات دبابيس GPIO. هنا هو دبوس موصل DB-9 .

هنا يجب أن أقول أن لوحة الألعاب لديها 6 جهات اتصال للمعلومات (Data0 ... Data5) ، ووحدة تحكم واحدة (Selest) ، وقوة.

بعد ذلك ، لدينا نفس التعريفات - حدد ، نحتاج إلى تكرارها مرة أخرى. يمكن القيام بذلك في الذاكرة . h وفي الذاكرة . c . لقد اخترت الخيار الأول. لا معنى لإدراج هذا.

لذلك نصل إلى الملف الأكثر إثارة للاهتمام - ملف memory.c . لها وظيفتان بأسماء بليغة:

 static u32 read_pad_3btn(int i, u32 out_bits) static u32 read_pad_6btn(int i, u32 out_bits) 

يبدو أن الأسماء تلمح بشكل غير ملحوظ إلى قراءة حالة أجهزة الألعاب ذات 3 أزرار و 6 أزرار.

هنا يجب توضيح أن أي لوحة ألعاب مكونة من 6 أزرار يمكن أن تعمل كزر 3. ويعمل جزء الأسد من الألعاب تمامًا مع هذا الوضع من لوحة الألعاب. في هذا الوضع ، مرة كل 16 مللي ثانية ، تتغير حالة مخرجات التحديد. عند تحديد = 0 ، تتم قراءة قيم الأزرار - UP ، DOWN ، A ، Start. عند تحديد = 1 ، تتم قراءة حالة الأزرار - UP ، DOWN ، LEFT ، RIGHT ، B ، C. فيما يلي مثال لكيفية عمل هذا الوضع.



على الفور سأقدم قائمة بهذه الوظيفة مع التغييرات:

 static u32 read_pad_3btn(int i, u32 out_bits) { u32 pad = ~PicoIn.padInt[i]; // Get inverse of pad MXYZ SACB RLDU u32 value = 0; if (i == 0 && (out_bits & 0x40)) // TH { digitalWrite (Select, HIGH); delayMicroseconds (20); value ^= digitalRead(Data0) << 0; //read UP button value ^= digitalRead(Data1) << 1; //read DOWN button value ^= digitalRead(Data2) << 2; //read LEFT button value ^= digitalRead(Data3) << 3; //read RIGHT button value ^= digitalRead(Data4) << 4; //read B button value ^= digitalRead(Data5) << 5; //read C button } if (i == 0 && !(out_bits & 0x40)) { digitalWrite (Select, LOW); delayMicroseconds (20); value ^= digitalRead(Data0) << 0; //read UP button value ^= digitalRead(Data1) << 1; //read DOWN button value ^= digitalRead(Data4) << 4; //read A button value ^= digitalRead(Data5) << 5; //read Start button } if (i == 1 && (out_bits & 0x40))// TH { value = pad & 0x3f; // ?1CB RLDU } if (i == 1 && !(out_bits & 0x40)) { value = ((pad & 0xc0) >> 2) | (pad & 3); // ?0SA 00DU } return value; } 

هنا i هو رقم لوحة الألعاب ، والتعبير إذا كان (out_bits & 0x40) // TH مسؤولاً فقط عن حالة إخراج Select. تجدر الإشارة إلى أنه في المحاكي يتم إعطاء حالة الأزرار بنفس الشكل كما في وحدة التحكم. ضغط الزر = 0.

هنا نتيجة العمل:


تابع في السلسلة التالية ، Pip-Pip-Pip

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


All Articles