Para que las rutinas de transmision y recepcion a 57600 bps en el C64 tuvieran mas utilidad, necesitaba poder recibir un byte por cada cuadro, perdiendo el menor tiempo posible. Esto me llevó a experimentar con las líneas RTS y CTS, de manera de poder avisar al PC, modem wifi o cualquier otro dispositivo, que el C64 está listo para recibir datos, pero tenia que encontrar una secuencia donde sólo pasara 1 byte.
También había otro problema, que no sabía cuando el PC (o el modem wifi) tenía datos para transmitir, lo cual requería implementar una temporización para cancelar la espera de un byte después de cierto tiempo, que podría ser la duración de medio byte (85 microsegundos).
Experimentando un poco pude agregar el temporizador usando uno de los dos que tiene la CIA2, y encontrar la secuencia adecuada para activar y desactivar la línea RTS.
La secuencia es más o menos así:
- Entramos a la interrupción.
- Programamos el timer para dispararse en 85 microsegundos (la duración de medio byte a 57600 bps).
- Activamos RTS para indicar que el C64 puede recibir datos.
- Habilitamos una interrupción que se dispara al llegar un bit de start.
- Esperamos a que el timer llegue a 0.
- Si el timer llegó a 0, se cancela la recepción, se desactiva RTS y la interrupción del bit de start.
- Si se disparó la interrupción por bit de start, comenzamos a recibir el byte, y en tiempos muertos dentro de la recepción se desactiva RTS y la interrupción, para asegurarse de que al terminar la recepción del byte no se envíe otro.
Aquí se puede ver un video probando la recepción y la transmisión, con el C64 conectado tanto a un PC por RS232 como al sintetizador de voz HD1. El video tiene anotaciones, que según leí en youtube no se ven desde un móvil.
https://www.youtube.com/watch?v=c6Ug4zf_WooLos datos que vienen desde el PC se leen a 57K de a 1 byte por cuadro (60 caracteres por segundo por ser NTSC), y lo que envía el C64 va hacia el sintetizador y hacia el PC.
En la primera prueba, el C64 recibe caracteres a 57K, los imprime en pantalla, y los envía de vuelta al PC, y al sintetizador de voz. El texto que enviemos desde la terminal va hacia el C64, aparece en pantalla, se reenvía al sintetizador de voz para ser hablado, y vuelve a la terminal.
En la segunda prueba, los caracteres recibidos por el C64 no se imprimen directamente, sino que se ingresan al buffer del teclado, como si acabaramos de tipearlos. Esta vez no se usa el sintetizador de voz, lo que hacemos es ingresar remotamente un pequeño programa BASIC, y algunos comandos en modo directo.
La última prueba es similar, pero haciendo además que el C64 envíe un texto al sintetizador de voz y al PC, que va a aparecer en la terminal.
En la terminal se puede ver abajo lo que se envió hacia el C64, y arriba lo que el C64 envía al PC y al sintetizador de voz.
Ahora queda probar si el módulo wifi se comporta de la misma manera que el PC, es decir si chequea RTS justo antes de enviar un byte al C64, si funciona igual, entonces ya tenemos las rutinas para recibir datos por wifi durante la ejecución de un juego, y quedaría hacer un parser para decodificar las respuestas del módulo.