Confundido acerca de la arquitectura IN/OUT del chip z80

Estoy leyendo el manual, y es un poco complejo. No puedo entender la codificación del código de la máquina por mi vida, pero esa no es mi principal preocupación... mi principal preocupación son los buses de dirección/datos .

No entiendo la diferencia entre la "dirección de salida" de la instrucción OUT y la configuración del puerto, Y la participación de los operandos de datos de registro.

Citado directamente del manual z80:

El contenido del registro C se coloca en la mitad inferior (A0 a A7) del bus de direcciones para seleccionar el dispositivo de E/S en uno de los 256 puertos posibles.

Hora de preguntar:

1.¿Qué significa "la mitad inferior"?

2.¿Dónde/cuáles son los 256 puertos posibles, y cómo selecciona uno, y adónde va exactamente desde allí?

Siguiente cita:

Si el contenido del registro C es 01H y el contenido del registro D es 5AH, en la ejecución de OUT (C), el byte D 5AH se escribe en el dispositivo periférico asignado a la dirección del puerto de E/S 01H.

Entonces, si tengo 1 en el registro C y 90 en D, y escribo OUT (C), ¿D 90 se escribe en algo asignado a 1? ¿Cómo sé qué está mapeado en 1?

PD: Además, si tengo hardware en la dirección asignada 1, ¿a dónde va 90 (el valor representado) en ese hardware?

No me malinterpreten por mi confusión aquí, soy un programador... Solo tengo una experiencia muy limitada en la codificación a este bajo nivel, y solo necesito algunas aclaraciones.

Respuestas (4)

Las versiones de las instrucciones INy OUTque incluyen una dirección de E/S solo permiten especificar los 8 bits inferiores de la dirección en la instrucción. Por esa razón, la mayoría del hardware de E/S basado en Z80 ignora los bits de dirección más allá de los 8 bits inferiores y, en la mayoría de los casos, los programadores no se preocupan por lo que hace el procesador con los 8 bits superiores. En realidad, el Z80 genera BC como una dirección (como lo haría, por ejemplo LD A,(BC)), pero si el hardware no se preocupa por los bits de dirección superiores, no hay razón para que los programadores se preocupen por lo que contiene el registro B. Por cierto, no creo que OUT nn,Asiempre genere cero en los bits de dirección superiores; Recuerdo vagamente que emite elIvalor, pero no estoy seguro. Lo importante es que si el hardware de decodificación de E/S se preocupa por los bits de dirección superiores, el código siempre debe usar la OUT (BC),rforma de la instrucción y asegurarse de que Bse cargue adecuadamente.

EDITAR : una aclaración adicional sobre el direccionamiento: cuando el código ejecuta una instrucción como LD (BC),AoOUT (C),A, al Z80 realmente no le importa lo que "significa" la dirección en BC. El Z80 maneja el bus de direcciones con el contenido del registro BC, coloca el contenido del registro A en el bus de datos y afirma una combinación de señales que indican "escritura de memoria" o "E/S escrita". Cada memoria o dispositivo debe estar conectado con el hardware para que sepa qué se supone que debe hacer, si es que debe hacer algo, con cualquier solicitud dada; debe hacerlo de tal manera que ignore cualquier solicitud dirigida a otros dispositivos, pero eso no significa que necesariamente ignorará las solicitudes dirigidas a todas las direcciones "no utilizadas". Por ejemplo, si los únicos dispositivos de E/S en un sistema fueran dos chips UART, cada uno de los cuales tenía cuatro direcciones de E/S, un diseñador de sistemas puede diseñar cosas para que cualquier solicitud de E/S donde el bit de dirección 7 sea bajo acceda al primer chip, usando los bits de dirección 0-1 para seleccionar una función, y cualquier solicitud donde el bit de dirección 7 sea alto acceda al segundo. El diseñador podría especificar que el primer chip usó las direcciones 00h-7Fh, y el segundo usó 80h a 0FFh, pero en realidad el primer chip respondería a las direcciones 04h, 08h, 0Ch, 10h, ... 7Ch, tal como lo haría con 00h; respondería igualmente a las 05h, etc. tal como lo haría a las 01h. Hacer que el chip ignore las escrituras en direcciones en el rango 04h-7Fh requeriría más hardware que simplemente hacer que dichas direcciones "sombreen" las funciones de las especificadas. El diseñador podría especificar que el primer chip usó las direcciones 00h-7Fh, y el segundo usó 80h a 0FFh, pero en realidad el primer chip respondería a las direcciones 04h, 08h, 0Ch, 10h, ... 7Ch, tal como lo haría con 00h; respondería igualmente a las 05h, etc. tal como lo haría a las 01h. Hacer que el chip ignore las escrituras en direcciones en el rango 04h-7Fh requeriría más hardware que simplemente hacer que dichas direcciones "sombreen" las funciones de las especificadas. El diseñador podría especificar que el primer chip usó las direcciones 00h-7Fh, y el segundo usó 80h a 0FFh, pero en realidad el primer chip respondería a las direcciones 04h, 08h, 0Ch, 10h, ... 7Ch, tal como lo haría con 00h; respondería igualmente a las 05h, etc. tal como lo haría a las 01h. Hacer que el chip ignore las escrituras en direcciones en el rango 04h-7Fh requeriría más hardware que simplemente hacer que dichas direcciones "sombreen" las funciones de las especificadas.

Una historia interesante relacionada con esto es que la serie Amstrad CPC estaba cableada de tal manera que eran los 8 bits superiores 'extra' en B los que se usaban para seleccionar la dirección y Cno para el direccionamiento. Luego, podrían, de un solo golpe, actuar LD BC,(addr << 8) | datay luego OUT (C),C, por lo tanto, actuar de manera efectiva OUT (B),C. Una microoptimización interesante creada por un diseño de hardware bastante extraño tanto en el CPC como en el Z80.
Eso es algo inteligente, aunque a menos que uno esté obteniendo BC como un valor de 16 bits, no estoy seguro de qué ventaja tendría sobre LD A,data / OUT (addr),A. El formulario BC tardaría 10 ciclos en realizar la carga y 8 en obtener el OUT (más el tiempo para ejecutarlo); la forma A tomaría 7 para hacer la carga y 7 para buscar la SALIDA. No creo que el tiempo para terminar de ejecutar la SALIDA sea cuatro ciclos más largo en el caso A.
Hmm, buen punto: según mi lectura del manual, los métodos Ay BCtoman 18 vs 22 T estados resp. ¡No estoy seguro de haber revisado los tiempos! Tal vez esto no sea inteligente después de todo... solo una peculiaridad de cómo se conectó el CPC. En ese caso, tendría que retractarme de llamarlo "microoptimización".
@underscore_d: Pensándolo más, no estoy seguro de qué ventaja ofrece el uso de los bits de dirección superiores. Un truco que a veces es útil es usar bits de dirección como datos; por ejemplo, si para ocho salidas, en lugar de usar un 74LS373 que toma el bus de datos, uno usa un pestillo direccionable 74LS259 conectado a los 4 bits de dirección inferiores, uno puede establecer o borrar cualquier bit con "OUT (xx),A" sin tener que cargar "A" con cualquier valor en particular primero . A Steve Wozniak le gustaba mucho usar ese truco en Apple ][, aunque por alguna razón no he visto que se use mucho en otros lugares.
¡ Eso sí que es una microoptimización! En cuanto al asunto del CPC, parece que algunos dispositivos, con los que nunca trabajé durante mi tiempo de programación, también usan bits en los 8 inferiores: cpcwiki.eu/index.php/Default_I/O_Port_Summary Aunque todos parecen ser para periféricos complementarios. En otros lugares, los 8 inferiores son irrelevantes.
@underscore_d: No es solo una microoptimización. El uso de un pestillo direccionable hace que sea práctico hacer que un programa cambie un bit sin afectar a los demás sin tener que admitir un registro de colación, y el uso de la dirección en lugar de los datos facilita la sincronización, ya que la dirección se puede muestrear en cualquier momento en que phi2 sea alto, pero los datos deben ser muestreado algún tiempo después del borde ascendente de phi2.
@underscore_d Llegué a esta página buscando cómo amstrad cpc manejó esta dirección de puerto de 16 bits y proporcionó la información exacta con su comentario. gracias por eso :) Sabía vagamente cómo funcionaban, pero es bueno saberlo de una cuenta sólida de primera mano para obtener confirmación.
Según el manual, el Z80 original (al menos) muestra el contenido de Alas líneas de dirección superiores al ejecutar IN/OUT A. (Lo que significa que el uso de estas instrucciones en un sistema con espacio de E/S de 16 bits requiere cuidado con el contenido de A).

El bus de direcciones del Z80 tiene un ancho de 16 bits (bits A0 a A15), lo que significa que puede dirigirse a 65536 ubicaciones. Los 8 bits bajos del bus son los bits A0-A7, que pueden dirigirse a 256 ubicaciones. Cada uno de los puertos de E/S conectados al Z80 tiene una dirección correspondiente de 0-255 (256 direcciones en total). Solo un puerto responde a una dirección en particular.

If the contents of register C are 01H, and the contents of register D are 5AH, at
execution of OUT (C),D byte 5AH is written to the peripheral device mapped to I/O port
address 01H.

La dirección del periférico (01) se colocará en el bus de direcciones A0-A7. El contenido del registro D se colocará en el bus de datos de 8 bits y se escribirá en el periférico cuyo número de puerto es 01.

¿Qué quiere decir con los bits A0 a A15? ¿No son esos pinouts? Además, ¿qué pasa si el periférico no tiene el número de puerto 01? ¿Qué pasará en tal situación?
@JumpifnotEqual A0-A15 son pines del microprocesador que se pueden conectar a periféricos o memoria (hay otros dos pines, IORQ y MREQ, que determinan si se está direccionando un puerto de E/S o una memoria). Son impulsados ​​por el contenido de un registro interno en el microprocesador llamado registro de direcciones. Según la instrucción, el registro de direcciones puede contener la dirección de 8 bits de un puerto de E/S o una dirección de 16 bits en la memoria. Si no hay periféricos correspondientes a la dirección 01, la instrucción de E/S no tendrá efecto.
@JumpifnotEqual Aquí hay un manual PDF Z80. www.zilog.com/manage_directlink.php?filepath=docs/z80/um0080 Mire la página 5, lado superior derecho de la figura. A0 a A15.
  1. Se llama "mitad inferior" porque estas ocho líneas de dirección son las 8 inferiores de las 16 líneas de dirección.

  2. Los puertos dependen de su sistema, puede ser cualquier cosa. Hay algún hardware lógico en su sistema que selecciona el puerto para las direcciones. Por lo general, hay algún decodificador para los bits superiores de la dirección, y sus salidas van a la entrada de selección de chip (CS) de los chips que implementan E/S. Los bits inferiores van directamente a los chips para seleccionar uno de varios registros dentro de cada uno.

Lo que hace el hardware con el valor que escribe en algún puerto es arbitrario. Podría almacenar ese valor, pero también podría causar alguna acción arbitraria.

Por lo tanto, debe leer la documentación de su hardware para saber qué hacen los puertos.

¿Son "líneas de dirección" y "pins" lo mismo aquí? Porque A0-A15 son pines inferiores del microprocesador.
A0 - A15 son los nombres que reciben las 16 líneas del bus de direcciones. Los pines en el paquete IC están etiquetados con el nombre de la señal y el número de pin. Si el procesador está disponible en diferentes paquetes, el número de pin para una señal dada puede variar entre paquetes.

Por lo general, algunas de las líneas de dirección irán a alguna lógica que producirá señales de selección de chip basadas en la dirección que luego se utilizan para habilitar o seleccionar los dispositivos de entrada o salida.

Cuando un dispositivo de salida recibe una señal de selección de chip y la señal de escritura de E/S, los datos en el bus de datos se escribirán en ese dispositivo de salida; lo que haga el dispositivo con los datos depende del dispositivo en particular.

El diseñador del sistema decidirá qué direcciones de E/S corresponden a qué dispositivo de E/S. Si el programador escribe en una dirección de E/S no utilizada, los datos escritos simplemente caerán en el contenedor de bits.

Es raro que el hardware de los sistemas Z80 decodifique completamente las direcciones de E/S. El hardware generalmente examinará suficientes líneas de dirección para distinguir entre todas las funciones que deben distinguirse; por lo general, esto significa que solo se usarán ~3-6 cables de dirección y ~2-5 no se usarán. Cualquier dirección en la que un bit de dirección no utilizado sea un "1" generalmente se comportará igual que una dirección idéntica en la que el bit no utilizado es un "0".