Bueno, ya voy viendo cosas, no tiene buena pinta y, aviso a los incautos, me temo que esto va a ser un ladrillaco.
Lo primero, recordar la teoría porque va a ser necesaria. En el descriptor USB del dispositivo el fabricante nos dice cada cuanto tiempo podemos preguntar al dispositivo, en el caso del RZX, cada 10 ms. Como he explicado en el mensaje anterior, un teclado normal devuelve 8 bytes cada vez que le preguntas, lo que da para devolver todas las teclas de "estado" en forma de bits a 0/1 y hasta 6 códigos de teclas pulsadas simultáneamente. Huelga decir que la inmensa mayoría de teclados USB se hace la picha un lío en cuanto pulsas más de 3 teclas e incluso en ciertas combinaciones de dos, pero esa es otra historia y deberá ser contada en otra ocasión.
EL RZX tiene dos modos de funcionamiento, el modo "Game" y el modo "QWERTY". Este último modo funciona como un teclado USB quasi-normal. Al faltarle teclas han inventado un método de teclear las que faltan físicamente, pero ay! de mi, ay! infelice, han escogido como comodines las teclas CAPS-SHIFT y SYMBOL-SHIFT que no se comportan como modificadores equivalentes por ejemplo a May y Ctrl, sino que las trata el propio teclado de manera interna y nunca se envían como respuesta de teclado. Eso provoca que se pueda pulsar F1 y escoger la cinta pero es IM-PO-SI-BLE sacar las comillas necesarias para teclear nuestro querido LOAD "". Al menos, parece que el RZX sí maneja 6 teclas a la vez, habría que ver si hasta las 12 que hay declaradas en su descriptor USB. Pero incluso así tiene otra limitación, y es que no envía más de un cambio de tecla en cada transacción, es decir, si pulsas tres teclas necesita 3 transacciones USB (30 ms) para notificarlas y otras 3 para liberarlas (suponiendo que pulses y liberes las tres teclas a la vez).
El modo "Game" no es un modo, es un desastre de lo más vengativo que no sirve para jugar en la práctica en plataforma alguna. Recordad que cada 10 ms le preguntamos por el estado del teclado y, si hay algún cambio, el teclado nos contesta con la lista de teclas pulsadas. En cambio, en este modo el teclado emite dos estados para cada tecla pulsada y otros dos para cada tecla liberada, que son cuatro transacciones USB en total. Como para muestra bien vale un botón, veamos una traza USB del bicho en modo "Game" al pulsar simultáneamente las teclas '1' y '2', el tiempo está en hh:mm:ss.cc:
00:34:22.01 kernel: Key status (modifiers 00) 04 (Tecla '1' pulsada)
00:34:22.02 kernel: Key status (modifiers 00)
00:34:22.03 kernel: Key status (modifiers 00) 06 (Tecla '2' pulsada)
00:34:22.04 kernel: Key status (modifiers 00)
00:34:22.41 kernel: Key status (modifiers 00) 05 (Tecla '1' liberada)
00:34:22.42 kernel: Key status (modifiers 00)
00:34:22.43 kernel: Key status (modifiers 00) 07 (Tecla '2' liberada)
00:34:22.44 kernel: Key status (modifiers 00)
por comparación, en un teclado normal se ven las teclas que están pulsadas en ese momento, una tecla liberada simplemente no sale en la lista, de modo que veríamos algo así (no son esos scancodes, pero como ejemplo vale):
00:34:22.01 kernel: Key status (modifiers 00) 04 06 (Tecla '1' y '2' pulsadas)
00:34:22.44 kernel: Key status (modifiers 00)
Esto nos lleva a un funcionamiento completamente inaceptable porque, como puede deducirse, cada pulsación o liberación de tecla necesita 2 transacciones USB (20 ms), es decir, pulsar/liberar una sola tecla cuesta 40 ms de tiempo real para que el programa se entere. Eso son, prácticamente, 2 frames completos del Spectrum. En román paladino, la respuesta del teclado es
INFAME. Para enviar 6 teclas necesita 120 ms, una salvajada de tiempo. Si a eso le sumas que cualquier emulador ejecuta todo lo deprisa que puede el frame y luego espera al siguiente, la ventana de tiempos se estrecha muchísimo (en la PI-2 a 600 Mhz un frame de Spectrum se emula en aproximadamente 4 a 4.5 ms).
Además parece seguir un orden de pulsación/liberación de manera que tienen preferencia unas teclas y filas o columnas sobre otras, sin que haya podido concluir claramente cual es ese orden. Y no se pueden emular teclas como las Fx, Ctrl, Alt y AltGr.
Para colmo de los despropósitos, cada vez que se cambia de modo A (Game) a modo B (QWERTY) y viceversa, es como si el teclado se desconectara del bus y volviera a conectarse y una limitación de la librería Circle es, precisamente, que no se pueden conectar dispositivos en caliente.
Resumiendo y acabando: el modo "QWERTY" tiene muchas limitaciones y el modo "Game" es completamente inútil. Ciertamente, ahora mismo no se me ocurre cómo aprovechar este teclado, como no sea soportando dos teclados USB, el normal y el RZX y que el usuario se vea obligado a usar uno u otro para según qué cosas.
Se aceptan ideas/comentarios.