Pero el otro día pensando en ello me vino a la cabeza una reflexión y una pregunta a la que ahora no dejo de dar vueltas así que paso a exponerla a ver si alguien me puede ilustrar y sacar de dudas

Los dispositivos en el spectrum se comunican con el procesador mediante puertos, que en el z80 están mapeados en memoria, esto significa que usan el bus de direcciones para identificar los diferentes puertos, que pueden ser de entrada y salida. Básicamente y sin entrar en gran detalle, la comunicación entre un dispositivo y el z80 consiste en seleccionar un puerto (una dirección de memoria) e indicar que se quiere realizar una operación de entrada o salida (activando la señal IOREQ del z80) para a continuación leer o dejar en el bus de datos el dato a leer o escribir. Mientras no se produce una operación de E/S en el bus de datos "no hay nada" porque ningún dispositivo escribe ni lee del bus, y mientras el bus está "vacío" tiene todos los valores a 1, es decir un dato 255 (hasta donde recuerdo) y el bus se encuentra en un estado de alta impedancia, esto significa que no es posible escribir en el bus y que si se lee de él se obtiene un valor 255.
Esto está muy bien, cada dispositivo accede al bus cuando lo solicita pero hay un par de problemas.
¿quién se encarga de poner en el bus de datos el valor que se va a utilizar? pues depende, si es un operación de salida, es el z80 el que se encarga de poner el dato en el bus para que lo pueda leer el dispositivo y si es una operación de entrada, es el propio dispositivo el que escribe en el bus para que pueda leer el dato el z80. Pero esto significa que es el dispositivo el que decide qué escribir en el bus, por lo tanto el dispositivo tiene una lógica (un programa o un circuito) que construye el dato de salida, y tarda un tiempo en hacerlo.
Bueno, todo más o menos coherente hasta que ponemos en la ecuación dispositivos importantes como la pantalla, la memoria o el teclado. Los dos primeros no tienen mucho problema pues son gobernados por el z80 u otro dispositivo y los "utiliza" en interrupciones concretas. Pero el teclado funciona de forma "aleatoria", en cualquier momento se puede pulsar una tecla y el z80 (u otro dispositivo) no puede prever cuando se producirá ese evento. Podemos considerar que el teclado es un dispositivo solamente de entrada (aunque no tiene por qué) y la cuestión se reduce a saber cómo funciona el dispositivo de entrada teclado, es decir cómo y cuándo hace peticiones de entrada a la cpu, cuándo activa el IOREQ.
El teclado, dado que es un dispositivo, tiene que solicitar una operacion de entrada (IOREQ) cuando detecta una pulsacion de una tecla y debe dejar en el bus de direcciones la dirección del puerto que tiene asociado, ¿pero cuándo hace esto? ¿todo el rato? ¿sincronizado con interrupciones, p.ej cada FRAME? y ¿qué pasa si el teclado quiere escribir en el bus pero hay otro dispositivo escribiendo? ¿espera el teclado o espera el otro dispositivo?
Además, según entiendo, el spectrum lee el teclado mediante polling, esto significa que periódicamente consulta el estado del teclado, es decir, lee el puerto asociado al teclado para ver si se ha pulsado una tecla. Esto significa que el teclado tiene que dejar el valor de su estado (la tecla pulsada) al menos tan rapidamente como la cpu hace el polling.
En fin, que me gustaría saber el funcionamiento exacto del teclado en cuestión de prioridades y timings, o al menos a un nivel de detalle suficiente para aclarar mis dudas. Si alguien puede aportar le estaría muy agradecido.