Bueno, lo primero, enhorabuena por la currada del teclado, aunque yo habría optado por otra solución para mi mucho más limpia, utilizar un microcontrolador que leyese directamente la matriz del teclado del ti99...
Quizás lo más peliagudo sería "hacer hablar" el lenguaje USB al microcontrolador, pero hay estupendas bibliotecas opensource para AVR que ya lo solucionan, así que con un pequeño ATMEGA8 sería más que suficiente, y además nos daría la opción de remapear teclas, crear macros y virguerías varias...
Para el caso de un teclado de A600 el principio es el mismo. Un microcontrolador escanea el teclado y envía los scancodes de las teclas pulsadas a través del USB utilizando el protocolo adecuado (HID device).
El tema del ghosting creo que ya lo expliqué en otro post, aunque ahora no recuerdo cual, y es producido por el hecho de que los teclados usualmente se forman creando matrices de teclas para simplificar el hardware, ya que con una matriz de 8 filas por 8 columnas podemos escanear 64 teclas utilizando solo 16 conexiones, mientras que utilizando una linea por tecla al final necesitaríamos 64 conexiones.
Con una matriz de teclas lo más habitual es ir activando una fila (o columna) y comprobar por que columna (o fila) se recibe esta señal. Si se recibe la señal por alguna de estas líneas, lo más lógico es suponer que se ha pulsado la tecla que está justo en la intersección de la fila (o columna) que hemos activado y la columna (o fila) por dónde hemos recibido la señal.
El problema de este tipo de configuración de teclado es que la pulsación de una tecla puede llegar a enmascarar todas las teclas de una fila o columna, dependiendo de como se haga el barrido.
Además, la pulsación de varias teclas puede dar como resultado la activación de varias lineas de salida del teclado, lo cual puede confundir al microcontrolador o rutina destinados a la lectura del estado del teclado.
Existen varias soluciones para esto. Una es distribuir las teclas en la matriz de una forma en la que se prevea que va a ser poco probable que coincidan las pulsaciones y distribuyendo las más "conflictivas" en filas o columnas separadas para cada una de ellas, pero esto depende mucho del lenguaje del teclado y del uso que se le de a este, aparte que tenemos un límite de filas y columnas para "repartir".
Otra es utilizar otro método diferente de escaneado, por ejemplo, activar las filas o columnas más rápido y realizando barridos en ambos sentidos (primero columna-fila y luego fila-columna, por ejemplo), e incluso activar varias filas al mismo tiempo y luego ir desactivando una a una, comparando todos estos resultados para averiguar cuales son las teclas exactas que se han pulsado.
Obviamente esto necesita un cierto estudio de la matriz del teclado y las posibles combinaciones de teclas que pueden surgir, pero es perfectamente posible de realizar.
Un ejemplo claro de un teclado con matriz totalmente ortogonal (8 filas x 8 columnas) con escaneado secuencial, y además con un ghosting bestial, es el C64.
La gente que se dedica "en serio" a programar en el C64 por lo general carga algún programa que parchea la rutina de escaneo de teclado del C64 por otra que realiza la lectura de forma dinámica y permite una escritura mucho más rápida y cómoda.
Edito: Incluso ciertos juegos modifican las rutinas de escaneo o las reemplazan totalmente para evitar el ghosting en las teclas que estos utilizan.
Bueno, de todo esto podemos deducir que en el caso de ciertos ordenadores, como en el PC y en el Amiga, el problema del ghosting es una combinación entre el hecho de utilizar una matriz (como el 99% de los teclados) y de la forma en la que el controlador de teclado realiza el escaneado de esta, por lo que la solución en este caso no es sencilla y pasaría por reprogramar el controlador para realizar un escaneado dinámico más "inteligente", o bien sustituirlo directamente por otro controlador que sea capaz de hacerlo y que además "entienda" la matriz de teclas y disponga del tipo de conexión necesaria con el interfaz de teclado de la máquina (USB, PS2, serie, etc...).
En el caso concreto del A600 y A1200 este se encuentra en la propia placa base, mientras que en el resto de modelos está en una placa independiente que forma parte del propio teclado, ya sea interno (A500 y familia) o externo (A1000, A2000, A3000, A4000 y CDTV, en cualquiera de sus variantes).
Usualmente en los sistemas de 8 bits, como el C64, ZX Spectrum, CPC, etc., no existe ningún procesador o hardware específicamente diseñado para realizar la lectura del teclado, siendo la CPU del sistema la encargada de comprobar periódicamente si se ha pulsado alguna tecla en la matriz del teclado, y siendo por esto susceptible de ser modificada o mejorada la parte del código responsable de realizar dicha tarea, lo que hace relativamente más sencillo atajar el problema.
Por otro lado, en algunos casos existen también limitaciones de software, como en el USB, en el que la especificación de los dispositivos HID establece un máximo de scancodes que pueden ser enviados en cada paquete de información de estado del dispositivo, pero este número es bastante amplio y realmente complicado de conseguir incluso utilizando todos los dedos de ambas manos y pies
.
Dicho todo esto, es perfectamente posible convertir un teclado de A600 a USB, microcontrolador mediante, y reducir al mínimo el efecto ghosting.
Edito:
Ya he encontrado el enlace que explica con detalle por que se produce el ghosting:
Keyboard Ghosting Explained!