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

إذا لعبت ألعاب SMD على المحاكي ، فربما لاحظت أن لوحة اللعبة الأكثر ملاءمة لهذه الألعاب هي لوحة الألعاب الأصلية من SMD. بالنسبة لمعظم وحدات التحكم الأخرى ، عند اللعب على المحاكي ، من الممكن جدًا الحصول على نفس لوحة ألعاب Xbox أو Logitech ، تم تشكيل المعيار في نهاية التسعينات. ولكن حتى نهاية التسعينات ، خرج الجميع عن مساره قدر استطاعته.
ليس من الصعب شراء لوحة ألعاب من SMD ، وكقاعدة عامة ، يمكنك شراؤها حيث يتم بيع استنساخ وحدات التحكم نفسها ، بسعر مناسب إلى حد ما ، حوالي 300 روبل.
كما كان من قبل ، قمت بتنظيم الاتصال بـ Raspberry pi باستخدام كابل USB من العلبة التي تم إيقاف تشغيلها وموصل أبي DB-9. ورسم GPIO الاستنتاجات في البرنامج. تعمل لوحة الألعاب بشكل رائع من 3.3 فولت.

كما هو الحال دائمًا ، نشأ السؤال حول اختيار محاكي ، وكان الخيار الأفضل هو المحاكي - Picodrive ، تم تحسينه لـ ARM ، منظم بشكل جيد ، وكما أفهمه ، فهو جزء من تجميع RetroPi. ولكن مع التجميع كان علي أن العبث قليلاً. كود المصدر موجود على خدمة جيثب
على هذا العنوان .
للبناء ، نحتاج إلى 3 مكونات للنجاح من مستودع مؤلف المحاكي:
- محاكي Picodrive نفسه ؛
- محاكي وحدة المعالجة المركزية - cyclone68000 ؛
- و 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];
هنا
i هو رقم
لوحة الألعاب ، والتعبير
إذا كان (out_bits & 0x40) // TH مسؤولاً فقط عن حالة إخراج Select. تجدر الإشارة إلى أنه في المحاكي يتم إعطاء حالة الأزرار بنفس الشكل كما في وحدة التحكم. ضغط الزر = 0.
هنا نتيجة العمل:
تابع في السلسلة التالية ،
Pip-Pip-Pip