dispositivos y teclado

Si por algo se caracteriza el Spectrum es por su gran variedad de periféricos (clásicos y modernos)

Moderador: Sir Cilve Sinclair

Responder
ultimate
Herbert
Mensajes: 54
Registrado: Dom Nov 09, 2008 2:08 am

dispositivos y teclado

Mensaje por ultimate » Sab Sep 23, 2023 11:22 am

El funcionamiento de los dispositivos o periféricos en el spectrum es un tema que daba por hecho, nunca me había planteado, simplemente estaba ahí, sabía como funcionaba a grandes rasgos.

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.

Avatar de Usuario
Kyp
Sabreman
Mensajes: 444
Registrado: Lun Dic 16, 2013 6:16 pm

Re: dispositivos y teclado

Mensaje por Kyp » Dom Sep 24, 2023 4:36 pm

Es mucho más simple que eso. El teclado no guarda ni señaliza ni hace nada de nada. El teclado no es más que 40 pulsadores conectados en forma de matriz de 8 filas (los bits 8 a 15 del bus de direcciones) de 5 columnas (los bits 0 a 4 del bus de datos). Cuando el Z80 lee el puerto del teclado, esto es cualquier puerto con el bit 0 del bus de direcciones a 0, la ULA que es quien maneja ese puerto conecta el resultado de esa matriz al bus de datos del Z80 y eso es lo que se lee tal como esté en ese instante. Es algo más complicado porque no conecta todas las filas sino que solo 'conecta' aquellas que tienen su bit correspondiente a 0 y si hay varias 'activas' se lee un AND entre los bits de cada columna.

ultimate
Herbert
Mensajes: 54
Registrado: Dom Nov 09, 2008 2:08 am

Re: dispositivos y teclado

Mensaje por ultimate » Lun Sep 25, 2023 4:00 pm

Kyp escribió: Dom Sep 24, 2023 4:36 pm Cuando el Z80 lee el puerto del teclado, esto es cualquier puerto con el bit 0 del bus de direcciones a 0, la ULA que es quien maneja ese puerto conecta el resultado de esa matriz al bus de datos del Z80 y eso es lo que se lee tal como esté en ese instante.
Pero esto tan solo desplaza el problema a la ULA, que se puede considerar el dispositivo de teclado. Es decir, es la ULA la que debe poner el valor de la tecla pulsada en el bus de direcciones y esto requiere un tiempo por mínimo que sea y también requiere una petición IOREQ para poder acceder a los puertos, de lo contario se entendería que accede a posiciones de memoria y no a puertos.

Entonces, cuando tu haces un IN (puerto) siendo puerto uno de los asociados a cada semifila del teclado, es la ULA el dispositivo que gestiona esa petición de información al puerto. El mero hecho de usar una instrucción IN ya implica la activación de IOREQ porque estamos accediendo a un puerto, como todos los puertos de semifilas se asocian en ultima instancia al puerto 254 que está asociado a la ULA, ésta sabe que puerto concreto está usando al mirar el byte superior del bus de direcciones, que indica la semifila a comprobar y por tanto el puerto real a usar.

¿pero qué ocurre si haces lecturas del puerto a una velocidad tal que a la ULA no le da tiempo a leer la matriz del teclado y dejar su valor en el bus de datos (si tal cosa es posible)? o por ejemplo, ¿y si lees el teclado justo en el momento en que la ULA está ocupada pintando en pantalla?

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: dispositivos y teclado

Mensaje por jzx » Lun Sep 25, 2023 8:09 pm

No puedes hacer lecturas con IN mas rapido de lo que puede aceptarlas la ula, se diseño de forma que la ula fuera mas rapida que la cpu. Si no hubiera sido asi, hubieran tenido que señalizar al z80 que espere con el pin wait. En el caso de que la ula este leyendo la memoria para hacer la imagen, si que hace esperar al procesador. Lo normal es que lo hiciera con wait, pero en el spectrum la ula si tiene que hacer esperar al procesador lo que hace es pararle el reloj, el efecto es parecido y se ahorraban un pin de la ula.

Por cierto, antes has dicho que si se lee un puerto en donde no hay nada se lee 255, pues en el spectrum normal no es cierto del todo, ya que a veces se leen datos de los que circulan entre la ram y la ula para generar la imagen, lo que se llama "bus flotante", y hay juegos que dependen de eso y si no se leen esos datos raros no funcionan.

El puerto de teclado de la ula es lo mas simple que se puede hacer, equivale a un interruptor entre la entrada del teclado y el bus de datos, que se cierra en el momento de la lectura. Es decir cuando se hace el IN el bus de datos se conecta a los pines de las columnas del teclado y lo que haya se lee. Si en ese momento se ha soltado la tecla, aunque sea un microsegundo, el z80 ve una tecla sin pulsar. Eso pasa por los rebotes por ejemplo, y se soluciona por software.

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: dispositivos y teclado

Mensaje por jzx » Lun Sep 25, 2023 8:38 pm

En cuanto a lo del timing, como dices es polling, en el spectrum el teclado se lee cada vez que se produce una interrupcion por la ula, cuando inicia un cuadro, 50 veces por segundo.
Si hay tecla pulsada, el z80 la ve y la apunta. Si no esta pulsada en ese preciso momento, pues no la ve, y para el no esta pulsada. Entre medio no se entera de nada.
Si tus dedos fueran lo suficientemente rapidos para pulsar una tecla durante por ejemplo 15 ms de cada 20 ms, y dejarla libre justo en el momento en que el programa que atiende a la interrupcion lee el puerto, el z80 no se enteraria, y para el la tecla no se ha tocado.

Avatar de Usuario
Kyp
Sabreman
Mensajes: 444
Registrado: Lun Dic 16, 2013 6:16 pm

Re: dispositivos y teclado

Mensaje por Kyp » Mar Sep 26, 2023 6:30 pm

ultimate escribió: Lun Sep 25, 2023 4:00 pm ¿pero qué ocurre si haces lecturas del puerto a una velocidad tal que a la ULA no le da tiempo a leer la matriz del teclado y dejar su valor en el bus de datos (si tal cosa es posible)? o por ejemplo, ¿y si lees el teclado justo en el momento en que la ULA está ocupada pintando en pantalla?
Desde que la CPU activa las señales de lectura de un puerto (bus de direcciones, IORQ, RD) hasta que realmente lee el puerto pasa tanto tiempo (4 ciclos de reloj) que a la ULA le da tiempo más que de sobra para poner el estado de las teclas de las filas seleccionadas en el bus de datos.

Si la ULA está ocupada pintando la pantalla y se intenta leer el puerto del teclado el mecanismo de contienda paraliza la CPU hasta que ya no está ocupada.
jzx escribió: Lun Sep 25, 2023 8:09 pm Por cierto, antes has dicho que si se lee un puerto en donde no hay nada se lee 255, pues en el spectrum normal no es cierto del todo, ya que a veces se leen datos de los que circulan entre la ram y la ula para generar la imagen, lo que se llama "bus flotante", y hay juegos que dependen de eso y si no se leen esos datos raros no funcionan.
Si se lee un puerto impar (bit 0 a uno) y no hay ningún dispositivo que atienda a ese puerto, y la ULA está accediendo a la memoria de pantalla en ese momento, se lee el dato que hay en esa memoria. Si la ULA no está haciendo nada en ese momento se lee 255.

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: dispositivos y teclado

Mensaje por jzx » Mar Sep 26, 2023 7:47 pm

Kyp escribió: Mar Sep 26, 2023 6:30 pm ¿y si lees el teclado justo en el momento en que la ULA está ocupada pintando en pantalla?
En la ula hay unos cuantos circuitos que son independientes, la ula puede hacer varias cosas al mismo tiempo, podria perfectamente leer el teclado y al mismo tiempo la ram, pero el problema que tiene es que tiene que usar los mismos pines del bus de datos para las dos cosas, por eso no puede, no es un tema de velocidad. Un interface de joystick funciona igual que el teclado y no hay problema en que se lea mientras la ula lee la ram, lo mismo que se puede leer la ram superior, el problema es cuando el "interface" de teclado que esta dentro de la ula quiere usar el bus de datos de la ula mientras esta lo necesita para leer la ram, como no se pueden mandar dos datos a la vez por los mismos pines, la ula elige y para el procesador (con lo que se para la lectura del teclado, que es algo que está haciendo la cpu, no el teclado) porque si parara la lectura de la ram se producirian defectos en la imagen.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 15 invitados