lunes, 23 de noviembre de 2020

Tutorial hacking PSX: como usar el joypad analogico en los primeros juegos de la playstation

 Si alguna vez habéis decidido usar de nuevo vuestra PS-ONE y habeis puesto uno de los primeros juegos que salieron, os habréis dado cuenta de que si usáis el mando analógico, este no funciona. Al principio los juegos no tenían soporte porque este mando ni siquiera existía.

Entonces, ¿que pasa si queréis jugar estos juegos en hardware original y el pad digital os parece duro, o incomodo? En este tutorial de m...iercoles os enseñaré como hackear estos juegos, para que si teneis la PS con chip/swapdisk podais usar el stick analogico emulando al pad digital para mayor comodidad:

Pongamos como ejemplo uno de los juegos más vendidos, el de Tomb Rider. Al activar el modo analógico en el mando, la pantalla se oscurece, y el juego se pausa.

Tras analizar un poco que causa esto, vemos que hay una función en 0x80055514 encargada de leer la memoria mapeada al joypad, y setear un flag indicando si el dispositivo conectado es un joypad digital (0x80089580) y las teclas que hay pulsadas en este joypad digital (0x80089ca4). Vamos a modificar unicamente esta función:

Empezamos con el checkeo de joypad digital que hace que se oscurezca la pantalla cuando activas el modo analógico
Aquí vemos que se compara el id de dispositivo del joypad digital (0x04) con el id de dispositivo conectado, en este caso un joypad analogico (0x07). Por este motivo, la instruccion je no salta, setea el flag de joypad digital conectado a 0, y se salta todo el código encargado de leer las teclas.

Si cambiamos el salto condicional por uno incondicional, ahora al activar el modo analógico en el pad, el juego ya no se para y los botones funcionan (los sticks siguen sin hacer nada).
El código que sigue a continuación hace algunas cosas como comprobar que SELECT y START estan presionados simultaneamente, incrementando un contador que cuando llega a 0x31, setea un flag en memoria que termina el juego y vuelve a la pantalla de menu. Pero lo más importante, y a lo que vamos... setea distintos bits de r4 que indican las teclas que hay pulsadas, para luego escribir r4 en memoria.
Lo que voy a hacer es, antes de escribir r4 en memoria y retornar, añadir código en el que comprobamos otra vez si el mando conectado es analogico, y en ese caso leer los valores de los sticks, y si se han movido hasta cierto punto, setear los flags del pad digital con operaciones OR como se esta haciendo ya con los botones en el código de arriba.

Pero claro, para inyectar mi código necesito hueco.
"Dame hueco, que habiendo hueco ya sabre..." - Jose Mota
Pues nada, abrimos el PSX.EXE con un editor hexadecimal y buscamos hueco.

Aquí hay un hueco bien hermoso, no mu grande, pero suficiente. El EXE en este juego esta cargado a partir de 0x8000F800 así que le sumamos ese valor en el código.
Y ahora a picar código...
Ahora inyectamos el PSX.EXE modificado en la ISO original con vuestro programa favorito (yo uso psx-mode2, programa de origen español, como debe ser) y lo grabamos. ¡Y ya esta! ¿dudas? ¿comentarios? ok.