miércoles, 15 de febrero de 2023

8bitdiskmenu con soporte para ratón en Amstrad CPC

8bitdiskmenu es el menú que hice en Locomotive Basic para hacer menús del contenido de mis disquetes de Amstrad CPC en mi juventud y que después de limpiar un poco el código puse disponible para la comunidad cepecera en GitlLab.

Recientemente los chicos del podcast de Cepeceros pusieron una compilación de juegos clásicos para CPC que se podían jugar con Multiplay, el adaptador de ratones de Amiga, emulado en la última versión de Retro Virtual Machine, la 2.1.

Para mi comodidad le añadí el archivo DISC.BAS de 8bitdiskmenu, pero pensé que ya que ellos habían adaptado los juegos para uso con ratón también debería estar adaptado el menú, aunque fuera poder simular los cursores arriba y abajo para seleccionar y clic con el botón derecho o izquierdo para lanzar el juego.

Me fije en como funcionaba su programa TEST.BAS que incluyen en la compilación de juegos adaptados, su listado no puede ser más simple y claro:

10 CLS
20 FOR x=0 TO 5
30 LOCATE 1,1+x:PRINT HEX$(&F990+x);": ";HEX$(INP(&F990+x),2)
40 NEXT
50 GOTO 20

Este programa va mostrando valores distintos según movamos el ratón, la rueda o hagamos clic con el botón derecho o izquierdo:

  • INP(&F990) detecta los clic de ratón: &10 para el botón derecho y &20 para el izquierdo.
  • INP(&F992) detecta el movimiento de la rueda del ratón: &F8 para arriba y &7 para abajo.
    INP(&F992) también detecta el movimiento del eje X del ratón: &F8 para izquierda y &7 para izquierda.
  • INP(&F993) detecta el movimiento del propio ratón en la mesa en el eje Y: &F8 para arriba y &7 para abajo.

Una vez conocidos los valores solo he tenido que añadir en mi menú unas líneas en el WHILE que esta leyendo continuamente las teclas que pulsamos para que si pasamos los valores que se capturan con el ratón crea que hemos pulsado la tecla que hace la misma función.

...
180 WHILE a$=""
190 a$=INKEY$
200 IF (INP(&F990)=&10 OR INP(&F990)=&20) THEN a$="X"
210 IF INP(&F993)=&F8 OR INP(&F992)=&F8 THEN a$=CHR$(240)
220 IF INP(&F993)=&7 OR INP(&F992)=&7 THEN a$=CHR$(241)
230 WEND
...

Lo bueno es que la inclusión de este nuevo código no afecta en nada al funcionamiento de los menús cuando no está presente la emulación de Multiplay, así que lo incluyo como mejora en el código.

No hay comentarios:

Publicar un comentario