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.
Las versiones de las instrucciones IN
y OUT
que 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,A
siempre genere cero en los bits de dirección superiores; Recuerdo vagamente que emite elI
valor, 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),r
forma de la instrucción y asegurarse de que B
se cargue adecuadamente.
EDITAR : una aclaración adicional sobre el direccionamiento: cuando el código ejecuta una instrucción como LD (BC),A
oOUT (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.
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.
Se llama "mitad inferior" porque estas ocho líneas de dirección son las 8 inferiores de las 16 líneas de dirección.
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.
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.
subrayado_d
C
no para el direccionamiento. Luego, podrían, de un solo golpe, actuarLD BC,(addr << 8) | data
y luegoOUT (C),C
, por lo tanto, actuar de manera efectivaOUT (B),C
. Una microoptimización interesante creada por un diseño de hardware bastante extraño tanto en el CPC como en el Z80.Super gato
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.subrayado_d
A
yBC
toman 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".Super gato
subrayado_d
Super gato
Sedat Kapanoglu
jeremy
A
las líneas de dirección superiores al ejecutarIN/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 deA
).