Musim gugur telah tiba ,
kubis telah berkembang , Hampir pertengahan musim dingin, dan aku baru saja selesai mengacaukannya. Tapi tetap saja, saatnya telah tiba ketika Anda ingin memainkan sesuatu yang lama, dengan suara badai salju di luar jendela, misalnya, cacing Sonic atau Jim. Di bagian bawah artikel adalah video dengan hasil awal.

Jika Anda memainkan game SMD pada emulator, Anda mungkin memperhatikan bahwa game pad yang paling nyaman untuk game ini adalah gamepad asli dari SMD. Untuk sebagian besar konsol lain, ketika bermain di emulator, sangat mungkin untuk bertahan dengan gamepad Xbox atau Logitech yang sama, standar dibentuk sekitar akhir tahun 90-an. Tetapi sampai akhir tahun 90-an, semua orang berusaha semampunya.
Tidak sulit untuk membeli gamepad dari SMD, dan sebagai aturan, Anda dapat membelinya di mana klon konsol itu sendiri dijual, dengan harga yang cukup terjangkau, sekitar 300 rubel.
Seperti sebelumnya, saya mengatur koneksi ke Raspberry pi menggunakan kabel usb dari case yang dinonaktifkan dan konektor ayah DB-9. Dan GPIO melukiskan kesimpulan dalam program tersebut. Gamepad berfungsi dengan baik mulai dari 3,3 Volts.

Seperti biasa, muncul pertanyaan tentang memilih emulator, dan opsi terbaik adalah emulator - Picodrive, ini dioptimalkan untuk ARM, terstruktur dengan baik, dan seperti yang saya pahami, ini adalah bagian dari perakitan RetroPi. Tetapi dengan pertemuan itu saya harus sedikit mengotak-atik. Kode sumber terletak di layanan Github,
di alamat ini .
Untuk membangun, kita membutuhkan 3 komponen keberhasilan dari repositori penulis emulator:
- Emulator Picodrive sendiri;
- CPU emulator - cyclone68000;
- dan FrontEnd - Libpicofe.
Sekarang semua ini perlu disatukan dengan benar. Buka kemasan atau jangan
buka Picodrive , tergantung cara Anda mengunduhnya. Sekarang buka direktori dengan
cyclone68000 , isinya harus disalin ke direktori:
/ /picodrive-master/cpu/cyclone
Anda juga perlu
berurusan dengan isi direktori
Libpicofe , isinya disalin ke direktori:
/ /picodrive-master/platform/libpicofe
Sekarang Anda perlu mempersiapkan diri untuk pertemuan:
melakukan konfigurasi
sudo ./configure
Setelah konfigurasi selesai, file akan dibuat -
config.mak , di dalamnya Anda perlu menemukan dan mengubah beberapa baris. Di bawah ini adalah hasil akhir:
AS = arm-linux-as LDLIBS += -L/usr/lib/arm-linux-gnueabihf -lSDL -lasound -lpng -lm -lz -lwiringPi ARCH = arm PLATFORM = rpi1
Selanjutnya, Anda perlu mengedit file -
config.h . Itu terletak di direktori:
/ /picodrive-master/cpu/cyclone
Di dalamnya, Anda perlu memasukkan yang dalam variabel:
#define HAVE_ARMv6 1 #define CYCLONE_FOR_GENESIS 1
Dan sekarang bagian perangkat lunakSeperti biasa, penting untuk menemukan tempat di mana informasi tentang tombol yang ditekan diproses, memahami
dan memaafkan kode, dan menggantinya.
Tanpa menangkap ketegangan, saya akan segera mengatakan bahwa file yang Anda cari berada di direktori:
/ /picodrive-master/pico/
Di sini kita tertarik pada 3 file -
pico.c ,
memory.c ,
memory.h . Mungkin Anda dapat melakukannya dengan jumlah yang lebih kecil, dan menjejalkan semuanya menjadi satu, tetapi bagi saya sepertinya lebih mudah.
Jadi, dalam file
pico.c, saya menginisialisasi perpustakaan dan mengkonfigurasi pin GPIO.
Segera saya akan memberikan bagian dari header file:
#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;
Seperti yang Anda lihat, judul perpustakaan
WiringPi diatur , dan definisi diumumkan, yang akan muncul sedikit lebih rendah. Misalnya, sekarang dalam fungsi
void 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); }
Ini adalah fungsi inisialisasi memori emulator (semacam). Dan di sinilah saya memasukkan semua pengaturan pin GPIO.
Berikut adalah pinout dari konektor DB-9 .
Di sini saya harus mengatakan bahwa gamepad memiliki 6 kontak informasi (Data0 ... Data5), satu pengontrol (Selest), dan daya.
Selanjutnya, kita memiliki definisi yang sama - mendefinisikan, kita perlu mengulanginya lagi. Ini dapat dilakukan di
memory.h dan di
memory.c . Saya memilih opsi pertama. Masuk akal untuk membuat daftar ini.
Jadi kita sampai pada yang paling menarik - file
memory.c . Ini memiliki 2 fungsi dengan nama fasih:
static u32 read_pad_3btn(int i, u32 out_bits) static u32 read_pad_6btn(int i, u32 out_bits)
Nama-nama itu sepertinya mengisyaratkan secara tidak jelas membaca status gamepad 3-tombol dan 6-tombol.
Di sini harus diklarifikasi bahwa gamepad 6 tombol apa pun dapat berfungsi sebagai 3 tombol. Dan bagian terbesar dari permainan bekerja persis dengan mode gamepad ini. Dalam mode ini, sekali setiap 16 milidetik, status Pilih output berubah. Ketika Pilih = 0, nilai tombol dibaca - ATAS, BAWAH, A, Mulai. Ketika Pilih = 1 keadaan tombol dibaca - ATAS, BAWAH, KIRI, KANAN, B, C. Di bawah ini adalah contoh bagaimana mode ini bekerja.

Segera saya akan memberikan daftar fungsi ini dengan perubahan:
static u32 read_pad_3btn(int i, u32 out_bits) { u32 pad = ~PicoIn.padInt[i];
Di sini
saya adalah nomor gamepad, dan ekspresi
if (out_bits & 0x40) // TH hanya bertanggung jawab atas status output Select. Perlu dicatat bahwa dalam emulator, keadaan tombol diberikan dalam bentuk yang sama seperti di konsol. Tombol ditekan = 0.
Inilah hasil dari pekerjaan ini:
Lanjutan di seri berikutnya,
Pip-Pip-Pip