CIA1: Lectura de los joysticks

El C64 admite conectar dos joysticks, uno al puerto de control 1 y otro al puerto de control 2:

Joysticks

El joystick conectado al puerto de control 1 se puede leer con el puerto CIAPRB del CIA1, y el joystick conectado al puerto de control 2 se puede leer con el puerto CIAPRA del CIA1. Sí, aunque no lo parezca, es correcto: joystick1 => CIAPRB y joystick2 => CIAPRA.

En realidad, el uso del joystick ya lo vimos en la entrada dedicada a las colisiones de sprites y, más en particular, en su programa de ejemplo (programa 37). Entonces no entramos a explicar los detalles y simplemente presentamos un código como éste:

LibJoy

Ahora ya sabemos que CIAPRA y CIAPRB son registros del CIA1. Y en realidad sería más adecuado llamar a las rutinas «leeJoystick1» (CIAPRB) y «leeJoystick2» (CIAPRA), ya que los usuarios identifican los joysticks en función del puerto de control al que están conectados (1 o 2), y no en función del puerto de datos con los que se leen.

Un joystick es un dispositivo electrónico que consta de cinco interruptores:

  • Arriba.
  • Abajo.
  • Izquierda.
  • Derecha.
  • Disparo.

Cuando el usuario empuja el joystick hacia arriba, ese interruptor se cierra, lo que hace que el voltaje de determinado pin del puerto de control se ponga a 0 voltios. Y lo mismo con el resto de interruptores.

Por supuesto, es posible cerrar varios interruptores a la vez. Por ejemplo, el disparo se puede combinar con cualquiera de las direcciones. Incluso hay direcciones que se puede combinar, como arriba y derecha/izquierda, o abajo y derecha/izquierda. Por último, hay combinaciones de interruptores que no tienen sentido, como arriba y abajo o derecha e izquierda a la vez.

Al final, cada pin del puerto de control se lee mediante un bit del puerto de datos correspondiente. Si se trata del puerto de control 1, se lee con el puerto CIAPRB; y si se trata del puerto de control 2 se lee con el puerto CIAPRA.

Tanto los puertos de control (las conexiones físicas) como los puertos de datos (los registros CIAPRA y CIAPRB) tienen ocho bits, pero como un joystick sólo tiene cinco interruptores, sólo se utilizan los cinco bits menos significativos:

  • %00011111 = nada pulsado.
  • %00001111 = disparo.
  • %00010111 = derecha.
  • %00011011 = izquierda.
  • %00011101 = abajo.
  • %00011110 = arriba.

Por último, en la entrada anterior ya se comentó que el puerto CIAPRB se utiliza para leer el teclado. Esto significa que puede haber confusiones entre teclado y joystick1. Cuando un programa lee CIAPRB, no tiene manera fácil de determinar si lo que lee ahí proviene del teclado o del joystick1, aunque hay algunos trucos como desactivar temporalmente el teclado mientras se lee el joystick1.

Y este es el motivo por el que muchos juegos del C64 utilizaban el joystick2. El joystick2 se lee con el puerto CIAPRA y, al no usarse este puerto para leer el teclado, se evitaba la confusión.


Programa de ejemplo: Prog56

Deja un comentario