Tercera parte de esta serie de interesantes artículos sobre ensamblador, creada por Armando Pérez (Ramones).
Aquí van un ejemplo completito de como usar el teclado y el joystick. Este tema es un poco «duro», desde el punto de vista que existen muchas maneras de hacerlo, y además puede ser algo «no standard» cuando hablamos de algunas teclas.
Básicamente, existen muchos tipos de teclado en el ámbito del MSX. No todas las teclas están posicionadas en la misma fila/columna en todos los MSX. Pero cuando hablamos de las teclas comunmente utilizadas en los juegos, si tenemos una misma correspondencia.
Así pues el ejemplo nos demuestra como usar ambos joysticks, el teclado, formas de leer una tecla continuamente y esperar a que el player suelte, y además dos formas de leer el buffer del teclado, con y sin BIOS.
También podemos encontrar en MSX ASSEMBLY (http://map.tni.nl/), un interesante artículo del problema de algunos teclados MSX, que «autopulsan» teclas con la combinación de otras.
Breve explicación del programa.
INITMAIN
Inicializa la ROM, de una forma sobradamente conocida, posiciona Screen 0 con 40 columnas y unos colores para poder escribir texto y que sea visible. Elimina el keyclick, obliga a la rutina OUTDO a escribir en pantalla e inicializa los textos.
También hace una lectura forzada de teclado para inicializar los bufferes de teclado, y seguidamente espera a que se produzca una interrupción para rellenar adecuadamente el buffer de teclado antiguo.
MAIN
El bucle principal no tiene mucho misterio. En cada interrupción revisa si hemos pulsado/soltado:
- Cualquier tecla, y mantiene a 1 hasta que no se suelta.
- Cualquier tecla, y solo mantiene a 1 durante una interrupción. No se volverá a poner a uno hasta que no soltemos y pulsemos de nuevo.
- El botón 1 de Joystick y SPACE, se pondrá a 1 solo cuando pulsemos y soltemos. Mientras no soltemos no se pondrá a 0.
- Idem con botón 2 Joystick y CTRL, solo que siempre estará pulsado hasta que no soltemos.
Por ultimo imprime los resultados de esa interrupción, espera a que se produzca una nueva interrupción y relee los buffers de teclado.
PANTALLITA
Esta parte no creo que sea necesaria de explicar. Son unas rutinas rapiditas para imprimir en pantalla con la BIOS.
KEYBOARD AND JOY SUBR
Aquí empieza la «chicha».
- Presskey: Activará el flag Cy, si alguna tecla ha sido pulsada o está pulsada.
- PressKeyTrigger: Activará el flag Cy si alguna tecla es pulsada, pero no lo activará de nuevo hasta que no sea soltada y vuelta a pulsar.
- CheckFire: Aunque no se usa en los ejemplos, activa el flag Cy cuando el botón 1 del Joystick, Shift, Space, TAB y Return están pulsados. Una manera de tener más de un botón de fuego en nuestras aplicaciones, y evitar el «sobreuso» de SPACE.
- CheckFireTrigger: Idem que el anterior, peeero, solo se activa el flag Cy, si se pulsa, se suelta y se vuelve a pulsar.
- CheckFiretrigger2: Para botón 2 de Joystick, CTRL y GRAPH, con «trigger».
Aquí faltaría añadir la rutina Checkfire2, para saber si está pulsado en cada interrupción sin soltar 😀 La dejo como ejercicio.
- CheckfireTriggerall: Pues para saber si cualquier botón de fuego, 1 o 2, de cualquier joystick y teclado está pulsado y se suelta y se vuelve a pulsar.
- TECLADO: Esta rutina se ha de llamar al principio de cada interrupción. El hacerlo así es para poder aprovechar las teclas leídas de la BIOS, en caso de usar ese modo. En caso de usar el modo manual, pues lee el teclado. Básicamente lo que hace es pasar el buffer actual a viejo, leer el nuevo teclado y leer los joysticks.
- JOYSTICK Y JOYSTICK2: Una manera muy curiosa de leer los joysticks, y aprovecharlos para el mismo player, ya que el ejemplo sería funcionar para un juego de 1 jugador. Lo que hacen estas rutinas, además de leer ambos joysticks (PORT 1 Y 2), es aprovechar el buffer de teclado para marcar si ha sido pulsado alguno de los botónes, y las direcciones. De esta manera nuestro bucle principal solo lee «teclas», y no necesita leer teclado por un lado y joysticks por otro lado.
- READKEYBOARD: Esta rutina solo se ensambla si usamos el modo de lectura de teclado NO BIOS. Basicamente lee todas las filas de teclado y las almacena en keys.
- TECLAOLD: La madre del cordero 😀 Le pasamos en A la fila que deseamos consultar con «trigger». Es decir que solo nos devolverá que una tecla de esa fila ha sido pulsada, en caso de que estuviese soltada. Si en el antiguo frame estaba pulsada la devuelve como no pulsada 😀
NOTAS FINALES
Para finalizar, comentar que el programa tiene dos maneras de leer el teclado, aunque ya se ha explicado por encima en las descripciones de las rutinas. Normalmente si hacemos una ROM y no «jugueteamos» con pilas y punteros, la rutina de 38h nos lee automáticamente el buffer del teclado, cual rutina «readkeyboard». Si la BIOS lo hace, y ya que normalmente salta a 38h, ¿por qué hacerlo nosotros? 😉
El modo «sin bios», es muy recomendable para de todo tipo que parcheen completamente la rutina de interrupción.
Enlace relacionado: Archivo RAR con el tutorial y archivos de ejemplo.