sábado, 9 de junio de 2018

Uno de mis propósitos para este año era escribir, al menos, dos posts mensuales en el blog, algo que no he podido cumplir por diversos problemas médicos de mi madre, los cuales se han ido agravando hasta que falleció el mes pasado.

Es hora de ir retomando poco a poco el ritmo, escribir algo por aquí e ir terminando los siguientes vídeos de MSX-Inside. Así que cuando hace unas semanas Xavirompe (creador del Rookie drive) se puso en contacto conmigo para comentarme que estaba haciendo pads compatibles con el Arkanoid y pedirme si podía estudiar el protocolo para poder implementarlo en el NeoPong 512, me pareció un buen punto de partida para volver a hacer cosas para MSX.

¿Quién no conoce el Arkanoid? Ese maravilloso juego consistente en machacar y machacar los ladrillos que tenemos enfrente a base de pelotazos. Aunque aquí nos llegara en cassette, originalmente se publicó en formato cartucho que venía acompañado de un pad especial para jugarlo. Dicho pad es compatible tanto con este juego como con su secuela (Arkanoid 2 - Revenge of Doh), que también venía con un pad (idéntico, pero de diferente color). Estos pads consisten en una ruleta que podemos mover a derecha e izquierda y un único botón, que nos permitía comenzar el juego o disparar. A partir de ahora, al referirme a los pads de Arkanoid estaré hablando indistintamente de uno u otro.

Hasta donde yo se, aparte del Arkanoid 1 y 2, ningún otro juego (¡hasta ahora!) soporta este pad, que utiliza un protocolo propio para comunicarse con el MSX.

¿Cómo funcionan los pads? Bueno, a diferencia de un joystick digital (que indica qué dirección se está pulsando), el pad es un joystick analógico, que envía un valor numérico que será interpretado de una u otra forma según el software que lo esté consultando. Así, los pads de Arkanoid envían un valor de 9 bits (que modificaremos girando la ruleta) que depende un poco del pad. Hemos probado con dos pads originales de Arkanoid 2 diferentes y mientras uno nos daba valores entre aproximadamente $096 y $1E6, el otro nos daba valores entre $085 y $18E. Añadamos, además, que esos valores no coinciden con los límites que nos arroja la emulación del BlueMSX ($098 y $135).

Al parecer Taito sabía que dos pads diferentes podían devolver valores en rangos no idénticos y optó por comprobar un rango de valores más reducido, asegurándose así de que todos los pads pudieran devolver esos valores: $0A4 como límite izquierdo, $135 como límite derecho y $0EC como centro.

Vamos a ver rápidamente cómo funciona el protocolo y cómo podríamos detectar si tenemos (o no) un pad de Arkanoid conectado a alguno de los puertos de nuestro MSX.

Como ya he comentado, el pad manda un valor de 9 bits al MSX. El problema es que esos 9 bits son enviados en serie, es decir: hemos de leer cada bit de forma independiente. Esto supone que la lectura del pad es lenta (muuuuuy lenta) comparada con la lectura de un joystick. En esta página de la wiki del MRC se puede ver el protocolo de comunicación. Básicamente hay que leer el estado del joystick 9 veces (intercalando las lecturas con el envío de señales para pasar a recibir el siguiente bit) y en el bit 0 (el que se correspondería con la dirección "arriba") iremos recibiendo los 9 bits desde el MSB al LSB. Al mismo tiempo (y con independencia del valor obtenido en el bit 0), en el bit 1 (el que se correspondería con la dirección "abajo") recibiremos la información sobre si se pulsa el botón del pad (valdrá 0) o no (valdrá 1).

Basándome en esa página y en el código desensamblado de la lectura del pad en el Arkanoid, he conseguido implementar el protocolo casi en su totalidad. Y digo casi porque, al no tener el hardware original, no he podido probar si se detecta bien la presencia del pad o no tal y como se indica en la wiki del MRC, ya que eso aún no está implementado en el BlueMSX (y, por falta de tiempo, no he podido probar si lo está en el OpenMSX).

Sin embargo, he ideado una forma de detectar si el pad está presente o no. Aprovechando que es muy difícil que cambie el estado del joystick entre lectura y lectura, podemos asumir como casi cierto que el valor de los 9 bits será uniforme: o todos 1, o todos 0. Eso implica que el valor leído sería $1FF si son todos 1 y $000 si son todos 0. Cualquiera de esos valores está fuera del rango que devuelve el pad, así que si al leer obtenemos uno de esos valores, entonces es que no tenemos conectado un pad de Arkanoid. Hasta que pueda probar si la desconexión puede detectarse tal y como se indica en la wiki del MRC, esta solución me parece razonable y además funciona bastante bien.

Una vez implementado el protocolo, hice un pequeño programa de test que era capaz de leer los pads del Arkanoid en ambos puertos y mostrar la información por pantalla (es con este programa con el que hemos obtenido los datos de los rangos de los pads originales del Arkanoid 2). Sin embargo, mostrar el uso del pad en la RU con este programa no era atractivo. El siguiente paso era incluir el código en el NeoPong 512. El resultado ha sido una versión del juego que se está pudiendo probar en estos momentos en la LXIII RU de Barcelona, aunque no se va a distribuir públicamente aún, ya que constituye el primer paso de una nueva versión con soporte para teclado, joysticks, pads y ratones (sí, en plural). De momento habrá que esperar un poco para tener esa nueva versión.

La integración ha sido bastante sencilla, ya que el rango de valores entre los que se mueven los bates en el NeoPong 512 mide exáctamente lo mismo que el rango de valores que utilizó Taito. Así pues, una vez leído el valor del pad sólo he tenido que hacer una simple resta y ya tenía el valor de la posición del bate. ¡Más sencillo imposible!

Como ya he comentado, el código aún no está completamente implementado, pero cuando lo esté haré una entrada explicándolo en más detalle y lo colgaré en la página de descarga de código fuente. Además de la lectura, incluye rutinas para detectar si el pad está presente o no y para limitar el rango de valores al de Taito. En caso de no tener pad, se puede obtener directamente la lectura del joystick (no vamos a repetir el trabajo una décima vez cuando ya lo hemos hecho 9, ¿verdad?).

Espero que los que puedan probar el NeoPong 512 en la LXIII RU con los pads de Arkanoid (originales o las versiones de Xavirompe) nos comenten qué tal se juega con ellos.