Dejamos el tema en espera durante algún tiempo, y el otro día retomamos el tema. Después de algunas pruebas a distancia, Fermars me envió el IF2 y este es el resultado.

Pinchar para ver video de demostración
Foto del invento funcionando:

Y esta la caja cerrada con el conjunto dentro:

La idea era utilizar una GAL20v8 para sustituir a la ULA, pero al final me han hecho falta también algunas resistencias y diodos.
El esquema final es este (abrir en una pestaña nueva para ver en detalle):
https://lh6.googleusercontent.com/-Ozpn ... %2Bsch.png
Estos los archivos Eagle.
https://drive.google.com/file/d/0B69T2l ... sp=sharing
Y el archivo JED este otro.
https://drive.google.com/file/d/0B69T2l ... sp=sharing
Aquí tenéis los fuentes en ABEL HDL.
https://drive.google.com/file/d/0B69T2l ... sp=sharing
Lo primero que hice fue probar en una placa de entrenamiento casera.
Y después de algunos cambios las pruebas fueron satisfactorias. La idea inicial era utilizar solo la GAL sin ningún componente adicional, pero enseguida me encontré con algunas dificultades.
La primera de ellas fue que la distribución lógica de la GAL no permitía dejar cada una de las salidas por separado en estado de alta impedancia sin consumir una patilla adicional. Esto era necesario, para no bloquear las semifilas superiores del teclado.
El tema es que hay que forzar solo los bits que son cero del bus de datos, que correponden con una tecla pulsada, ya que si forzamos los unos el teclado no podrá poner ceros en el bus y no nos funcionarán las dos semifilas superiores.
Este hecho me obligó a añadir diodos para dejar pasar únicamente los ceros. El resultado debería ser un OR entre las pulsaciones del bus y el teclado.
Otra conclusión es que no te puedes fiar de las resistencias internas de pull-up, porque si dejas desconectada una patilla se comporta como si fuera un registro, es decir conserva su último estado. Pienso que esto debe ser configurable por algún sitio pero no he encontrado la opción. Son por tanto necesarias las resistencias de pull-up de entrada correspondientes a las direcciones de los dos joystick.
Voy a exponer el comportamiento teórico que debe tener:
- Para que se habiliten las salidas debemos tener 0v en las siguientes señales: /RD, /IORQ, A0 y al menos una entre A11 y A12.
- La semifila de la izquierda "12345" es el primer joystick y utiliza el puerto $F7FE (1111 0111 1111 1110). Se identifica con la decodificación parcial A11=0 y A0=0. Se corresponden las siguientes teclas y botones de joystick:
[tab=30] - D0 = "Tecla 1" = LEFT1
[tab=30] - D1 = "Tecla 2" = RIGHT1
[tab=30] - D3 = "Tecla 3" = DOWN1
[tab=30] - D4 = "Tecla 4" = UP1
[tab=30] - D5 = "Tecla 5" = FIRE1
- La semifila de la derecha "67890" es el segundo joystick y utiliza el puerto $EFFE (1110 1111 1111 1110). Se identifica con la decodificación parcial A12=0 y A0=0. Se corresponden las siguientes teclas y botones de joystick:
[tab=30] - D0 = "Tecla 0" = FIRE2
[tab=30] - D1 = "Tecla 9" = UP2
[tab=30] - D3 = "Tecla 8" = DOWN2
[tab=30] - D4 = "Tecla 7" = RIGHT2
[tab=30] - D5 = "Tecla 6" = LEFT2
Si tenemos las resistencias colocadas en las entradas entre +5v y cada patilla, las entradas se mantienen a +5v en estado de reposo. Estos +5v son débiles gracias a la resistencia que hemos intercalado, por lo que cualquier pulsación de una de las direcciones o del botón de fuego conecta el pin con masa y lo lleva a 0v.
Mientras el ordenador no está consultando el teclado, la GAL mantiene en alta impedancia las salidas ya que no se cumple /RD=/IORQ=A0=0. En el momento en el que consulta, por ejemplo, la semifila izquierda /RD=/IORQ=A0=A11=0, momento en el cual las salidas copian el estado de las entradas, es decir, si teníamos pulsado LEFT1, tendremos su patilla a 0V y D0 tendrá 0V mientras que el resto de las entradas estarán a +5v gracias a las resistencias de pull-up, y por tanto las salidas D1,D2,D2 y D4 tendrán 5v (o algo parecido mayor que 2,5V).
Para la otra semifila será lo mismo pero se deberá cumplir /RD=/IORQ=A0=A12=0.