Ha llegado el otoño , el
repollo ha florecido , es casi la mitad del invierno, y acabo de terminar de jugar con él. Pero aún así, ha llegado el momento en que quieres tocar algo viejo, con el sonido de una tormenta de nieve fuera de la ventana, por ejemplo, el gusano de Sonic o Jim. Al final del artículo hay un video con resultados preliminares.

Si jugó juegos SMD en el emulador, probablemente notó que el pad de juego más conveniente para estos juegos es el gamepad nativo de SMD. Para la mayoría de las otras consolas, cuando se juega en el emulador, es bastante posible sobrevivir con la misma consola Xbox o Logitech, el estándar se formó a finales de los 90. Pero hasta finales de los 90, todos se salieron de su camino como pudo.
No es difícil comprar un gamepad de SMD y, por regla general, puede comprarlo donde se venden los clones de las consolas, a un precio bastante asequible, alrededor de 300 rublos.
Como antes, organicé la conexión al Raspberry pi usando un cable usb del estuche fuera de servicio y el conector papá DB-9. Y GPIO pintó las conclusiones en el programa. El gamepad funciona muy bien desde 3.3 voltios.

Como siempre, surgió la pregunta acerca de elegir un emulador, y la mejor opción era el emulador: Picodrive, está optimizado para ARM, bien estructurado y, según tengo entendido, es parte del ensamblaje RetroPi. Pero con la asamblea tuve que jugar un poco. El código fuente se encuentra en el servicio Github,
en esta dirección .
Para construir, necesitamos 3 componentes de éxito del repositorio del autor del emulador:
- Picodrive emulador en sí;
- Emulador de CPU - cyclone68000;
- y FrontEnd - Libpicofe.
Ahora todo esto debe ser organizado correctamente. Desempaquete o no desempaquete
Picodrive , dependiendo de cómo lo haya descargado. Ahora abra el directorio con
cyclone68000 , su contenido debe copiarse en el directorio:
/ /picodrive-master/cpu/cyclone
También debe
tratar con los contenidos del directorio
Libpicofe , sus contenidos se copian en el directorio:
/ /picodrive-master/platform/libpicofe
Ahora necesita prepararse para la asamblea:
hacer configuración
sudo ./configure
Una vez completada la configuración, se creará un archivo:
config.mak , en el que deberá buscar y cambiar algunas líneas. A continuación se muestra el resultado final:
AS = arm-linux-as LDLIBS += -L/usr/lib/arm-linux-gnueabihf -lSDL -lasound -lpng -lm -lz -lwiringPi ARCH = arm PLATFORM = rpi1
A continuación, debe editar el archivo:
config.h . Se encuentra en el directorio:
/ /picodrive-master/cpu/cyclone
En él, debe poner los que están en las variables:
#define HAVE_ARMv6 1 #define CYCLONE_FOR_GENESIS 1
Y ahora la parte del softwareComo siempre, fue necesario encontrar un lugar donde se procese la información sobre los botones presionados, comprender
y perdonar el código, y reemplazarlo.
Sin atrapar el suspenso, diré de inmediato que los archivos que está buscando se encuentran en el directorio:
/ /picodrive-master/pico/
Aquí estamos interesados en 3 archivos:
pico.c ,
memory.c ,
memory.h . Probablemente puedas hacerlo con un número más pequeño y agrupar todo en uno, pero me pareció más fácil.
Y así, en el archivo
pico.c, inicializo la biblioteca y configuro inicialmente los pines GPIO.
Inmediatamente le daré parte del encabezado del archivo:
#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;
Como puede ver, el encabezado de la biblioteca
WiringPi se
establece y se anuncian las definiciones, que aparecerán un poco más abajo. Bueno, por ejemplo, ahora en la función
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); }
Esta es una función de inicialización de memoria del emulador (más o menos). Y aquí es donde inserté todas las configuraciones de los pines GPIO.
Aquí está el pinout del conector DB-9 .
Aquí debo decir que el gamepad tiene 6 contactos de información (Data0 ... Data5), un controlador (Selest) y alimentación.
A continuación, tenemos las mismas definiciones: definir, necesitamos repetirlo nuevamente. Esto se puede hacer tanto en
memory.h como en
memory.c . Elegí la primera opción. No tiene sentido enumerar esto.
Entonces llegamos a lo más interesante: el archivo
memory.c . Tiene 2 funciones con nombres elocuentes:
static u32 read_pad_3btn(int i, u32 out_bits) static u32 read_pad_6btn(int i, u32 out_bits)
Los nombres parecen insinuar discretamente la lectura del estado de los gamepads de 3 y 6 botones.
Aquí debe aclararse que cualquier gamepad de 6 botones puede funcionar como un botón de 3 botones. Y la parte del león de los juegos funciona exactamente con este modo del gamepad. En este modo, una vez cada 16 milisegundos, el estado de la salida Seleccionar cambia. Cuando Seleccionar = 0, los valores de los botones se leen: ARRIBA, ABAJO, A, Inicio. Cuando Seleccionar = 1 se lee el estado de los botones: ARRIBA, ABAJO, IZQUIERDA, DERECHA, B, C. A continuación se muestra un ejemplo de cómo funciona este modo.

Inmediatamente le daré una lista de esta función con los cambios:
static u32 read_pad_3btn(int i, u32 out_bits) { u32 pad = ~PicoIn.padInt[i];
Aquí
i es el número del gamepad, y la expresión
if (out_bits & 0x40) // TH solo es responsable del estado de la salida Select. Vale la pena señalar que en el emulador el estado de los botones se da en la misma forma que en la consola. Botón presionado = 0.
Aquí está el resultado del trabajo:
Continúa en la próxima serie,
Pip-Pip-Pip