Hola pep,
No suele ser normal resucitar hilos, sobre todo porque el OP ya no se acordará de qué iba eso
![Guiño ;)](./images/smilies/sc_jwink.gif)
. Si acaso que se pronuncie un moderador a ver cual es la postura "oficial"
![Muy Feliz :D](./images/smilies/sc_jgrin.gif)
.
Amplío un poco con ejemplos concretos para el caso del spectrum:
A un periférico de spectrum, normalmente, querrás escribir a un puerto determinado, eso lo harás con una instrucción OUT. Para leer, lo harás con una instrucción IN.
Éste es el diagrama de tiempos de una instrucción OUT y de una IN (están los dos juntos).
Sin contar con los trucos de la ULA de parar el reloj (contención), en un Spectrum 48k cada ciclo (T1,T2...) es de unos 286ns.
IO Z80.png
Veamos el caso de
envío de datos Spectrum -> Microcontrolador (OUT)
El microcontrolador debe monitorizar el bus de control buscando la combinación del puerto seleccionado en el bus de direcciones, un IOREQ y un WR. Eso son bastantes instrucciones de uC que, bien deben estar en un bucle, bien disparadas por una interrupción en el flanco de bajada de IOREQ, pero esas interrupciones se dispararán "en falso" muchas veces...
Una vez detectada la petición de escritura, el uC tiene que leer el bus de datos y obtener el byte enviado.
Incluso aunque insertes señales de wait adicionales a la que se inserta automáticamente, necesitarías detectar el puerto IO, IOREQ, WR y activar esa señal o leer el valor en menos de 600ns.
El caso de lectura de datos
Spectrum <- Microcontrolador (IN) es aún más complejo porque tendremos que escribir en el bus de datos en el momento adecuado y luego liberarlo, poniendo los pines del microcontrolador en modo in justo a tiempo. Ni muy pronto, porque el spectrum no leerá lo que le mandemos, ni muy tarde o habrá colisión con el ciclo M1 de la siguiente instrucción.
En resumen, toda la gestión de lectura y escritura, si se usa el método normal IN/OUT del Z80, hay que hacerla con una capa exterior de lógica discreta, gal o cpld, que es lo que se usa normalmente, complicando bastante el hw. Por tanto, hacerlo con un simple microcontrolador es prácticamente imposible, salvo uno muy muy rápido y que haga cosas muy simples. Tampoco podemos pasarnos con el WAIT, porque en equipos de 48k, paralizamos el refresco de la DRAM alta y se puede corromper.
Una opción es usar un método alternativo de comunicación y descargar esta función en código sw más complejo, tanto en el spectrum como en el microcontrolador. No elimina la necesidad de una pequeña lógica discreta (aunque se podría hacer con un microcontrolador con puertas incluidas).Eso es lo que he hecho en el
Dandanator Mini, que tiene un hardware muy simple y, en contrapartida, un sw bastante complejo para hacer la comunicación.
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.