Tenemos puerto de joystick analogico de PC en las 8 bits!
Como comentaba aca LINK pude agregar una entrada para joystick analogico de PC al sintetizador HD1, algo que habia querido hacer con el HR4 pero no se pudo por falta de memoria de programa. La parte tecnica es complicada (un poco explico en el foro de proyectos) pero se puede resumir asi: - Para conectar un joystick analogico hay que agregar 2 resistencias de 100K (una por cada eje), y 2 resistencias de 10K (una por cada boton). - Para leer el joystick desde una computadora hay que enviar un byte pidiendo el estado de uno de los ejes del joystick, e inmediatamente recibir un byte que contiene 7 bits con el valor y 1 bit con el estado del boton. - Se piden por separado los datos del eje X + estado del boton 1, y del eje Y + estado del boton 2. - La comunicacion se hace a la velocidad que uno quiera de las 4 disponibles, en la prueba yo uso 57600 bps simplemente para minimizar el tiempo empleado. - El sintetizador captura continuamente el estado del joystick, 60 veces por segundo, y uno puede consultar por comando el ultimo valor de captura.
Aca se puede ver un video probando el joystick en una Commodore 64, durante la rutina de interrupcion se envia continuamente texto para hablar, y ademas se pide el estado del joystick, todo esto enviando y recibiendo a 57600 bps. En cada interrupcion (60 veces por segundo) se envia 1 byte, se recibe un byte, y si el buffer del sintetizador no esta lleno, se envia un byte para la voz.
Para que las rutinas de transmision y recepcion a 57600 bps en la 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 a la PC, modem wifi o cualquier otro dispositivo, que la C64 está lista 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 la 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 la 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.
Acá se puede ver un video probando la recepción y la transmisión, con la C64 conectada tanto a una PC por RS232 como al sintetizador de voz HD1.
Lo que viene desde la PC se lee a 57K de a 1 byte por cuadro (60 caracteres por segundo), y lo que envía la C64 va hacia el sintetizador y hacia la PC. En la primera prueba, la C64 recibe caracteres a 57K, los imprime en pantalla, y los envía de vuelta a la PC, y al sintetizador de voz. El texto que enviemos desde la terminal va hacia la 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 la 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 la C64 envíe un texto al sintetizador de voz y a la PC, que va a aparecer en la terminal. En la terminal se puede ver abajo lo que se envió hacia la C64, y arriba lo que la C64 envía a la PC y al sintetizador de voz. Ahora queda probar si el módulo wifi se comporta de la misma manera que la PC, es decir si chequea RTS justo antes de enviar un byte a la 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.
Lo bueno de esto es que aunque lo pruebo en una C64, todo es portable a otras maquinas, siempre que tengan las entradas y salidas necesarias, por ejemplo la MSX con el puerto de joystick. En maquinas mas basicas como la Spectrum es limitado lo que se puede hacer, pero supongo que tambien le va a llegar el turno porque me interesa que todo funcione en la TS2068 algun dia.
Algun dia voy a tener una C64, siempre me gustaron, de chico use algunas, por ejemplo en casa de un amigo de mi viejo.. tengo recuerdos de pasar horas con el juego Mission imposible, y de tipear algunos programas en basic de la revista K64.. pero también ver esto en una Talent seria para mi impresionante.. recuerdo que cosas como estas las soñaba de chico, y lo veia como que eran cosas del futuro! bueno, parece que ese futuro ya llego.. la verdad me alegra mucho, voy a seguir de cerca este proyecto, me gusta..
En la MSX hay ventajas, el procesador es mas rapido, el chip de video no detiene al Z80 50 o 60 veces por segundo, lo que hace que todos los malabares que hago para sincronizar el envio y recepcion justo cuando se dibuja el borde (porque ahi el VIC no accede a "VRAM" y por lo tanto no detiene al 6510) no sean necesarios, simplificando el soft, y tiene la cantidad justa de salidas en el puerto de joystick (3) que se necesitan para controlar el sintetizador y el modulo wifi juntos. Pero lamentablemente tengo poco tiempo y las pruebas las tengo que hacer cada tanto y en unas pocas horas continuadas, asi que para maximizar el avance lo mejor es probarlo en una maquina y procesador que conozco bien. Para desarrollar en MSX tengo que usar diskettes, armar y desarmar la maquina cada vez que voy a probar cosas, y ademas programar en asm de Z80 no me sale naturalmente. Pero bueno, cuando ya haya algo terminado se buscan programadores de MSX y se porta la parte de soft de 6502 a Z80, no deberia ser complicado de adaptar.