Veamos, hasta donde entiendo lees los codigos del teclado PS2, lees los valores de las filas que genera la C64, y generas los unos y ceros en las columnas para que la C64 los detecte e interprete la tecla adecuada que se presiono en el teclado PS2.
Si, el PS2 por cada tecla te envia un mensaje con una tecla para decirte que se apreto, y otro para avisarte que se solto. Ese codigo lo transformas al codigo de C64 (8*8 codigos+1 del restore que esta aparte), y lo guardas en una matriz de 8 bytes, + 1 bit del restore (guardas 1 cuando se apreta y 0 cuando suelta). Hasta ahi todo bien, el problema que toda esta transformacion lleva unos ciclos (muy pocos, peroobligatorios). Si justo en ese momento (muy pero muy pocas probabilidades) la C64 se le da por leer el estado del teclado, el pic no puede responder porque esta ocupado, y devuelve todo 0xff, nada apretado. Si hay una tecla apretada, la C64 lo toma como que se solto, pero al proximo ciclo la va a volver a leer y toma como que se apreto, o sea que se produjo una repeticion no deseada.
La interrupcion de timer no ayuda, porque igual se atraza bastante con respecto a lo necesario, y no es complicado hacer un loop que revise en cada ciclo el estado del PS2, y (lea un bit de ser necesario hasta formar un byte) y el estado de columna que solicita la C64, pero por mas chico que sea, en el peor de los casos (la C64 cambia el port de salida del teclado justo despues lo revisamos y vimos que no cambio) siempre se pierden muchos ciclos y puede que lleguemos tarde.
se obtendria la misma lectura en la C64. Ahora, hay que tener en cuenta que los joysticks hasta donde se creeria que no se conectan en medio de la placa del teclado de C64, aunque si esto es asi, en el conector de teclado tendria que haber lineas que vienen del joystick, que entran y salen de la placa del teclado. No me puse a ver los planos de la C64 asi que no puedo asegurar que no interfieran directamente en la placa, pero supongamos que no. En este caso lo
Tema joystick:
Una cosa es lo que a vos o a mi, usando nuestro conocimiento y sentido comun, deduscamos de como estan conectados los joystick, y otra muy distinta es como estan conectados en la realidad. Adjunto la parte del circuito que nos interesa. Yo segui el sentido comun y tube problemas, mire el circuito y dije, no puede ser, medi y si, era asi. Y luego recorde que, en el basic, cuando apretabas el joystick te metia toda clase de cosas por el teclado. (hace mas de 10 años que no uso la C64 en serio, la encendi para ver si andaba, pero me resulta muy incomoda ponerla en la TV y usar el datasete y todo eso)
Fijate que lo que leo de la C64, para saber que columna esta barriendo, puede estar conteniendo el estado del joystick, y ser cualquier cosa. El mismo problema lo tiene el teclado real, lo que pasa es que yo pensaba hacer una especia de prediccion, de ver que cada vez que cambiaba el valor del port, le mando la proxima columna, pero si se mete el joystick, va a ser un zafarrancho.
Voy a tener que hacer un programa de prueba para ver como interfiere el Joystick con el teclado, pero mucho no me atrae, porque tengo que grabarlo el programa (voy a tocar el handler de teclado) y no quiero usar el datasete :)
Lo de la resistencia no creo que afecte, porque es cierto que casi todas las teclas tienen unos 100 ohms, pero el Shift lock (unido al shift izquiedo) es 0ohm, y lo mismo los Joystick que tambien son contactos de 0 ohms ,si los apretas bien (por lo menos los mios de Atari y sin uso).
Te muestro como lee la kernel:
Aca aparentemente lee la tecla Commodore
E938 A9 7F LDA #$7F
E93A 8D 00 DC STA $DC00
E93D AD 01 DC LDA $DC01
E940 C9 FB CMP #$FB
Entre la instruccion STA $DC00 , la ejecucion de LDA .... el pic tiene que avivarse que se puso un valor en DC00, y sacar de la tabla el valor de la columna 7 (hay que transformar de 7f a 7, no es simple, son varios pasos) y responder a DC01. Tal vez se pueda, pero me suena mucho...
Aca verifica si hay al menos una tecla apretada (todas las columnas):
EA87 A9 00 LDA #$00
EA89 8D 8D 02 STA $028D
EA8C A0 40 LDY #$40
EA8E 84 CB STY $CB
EA90 8D 00 DC STA $DC00
EA93 AE 01 DC LDX $DC01
EA96 E0 FF CPX #$FF
EA98 F0 61 BEQ $EAFB
EA9A A8 TAY
EA9B A9 81 LDA #$81
Aca pasa a la proxima columna:
EAD5 68 PLA
EAD6 2A ROL
EAD7 8D 00 DC STA $DC00
EADA D0 CC BNE $EAA8
Como vez, tiene que saltar y recien ahi si lee el valor de la columna. Esto el PIC lo contesta de taquito.