¿Cómo funcionan las interrupciones en el Intel 8080? He buscado en Google y en la documentación oficial de Intel (197X), y he encontrado solo una pequeña descripción sobre esto. Necesito una explicación detallada al respecto, para emular esta CPU.¿Cómo funcionan las interrupciones en el Intel 8080?
Respuesta
¡Finalmente lo encuentro!
Creo una variable llamada bus donde va el código de interrupción. Entonces, me llama una función para manejar la interrupción:
void i8080::interruption()
{
// only for RST
cycles -= cycles_table[bus];
instruction[bus]();
INT = false;
}
INT es cierto cuando se necesita una interrupción. Las instrucciones EI y DI manejan INTE.
Cuando INT e INTE es verdadero se ejecuta la interrupción.
Los punteros de función para los controladores de interrupción se almacenan en la memoria baja. Unas 32 o más de las primeras direcciones son interrupciones de hardware: hardware activado.
Las siguientes 32 o más direcciones son activables por el usuario, estas se llaman interrupciones de software. Se activan mediante una instrucción INT
.
El parámetro a INT es el software de interrupción número vector, que será la interrupción llamada.
Deberá usar la instrucción IRET
para regresar de las interrupciones.
Es probable que también deba desactivar las interrupciones como la primera cosa que hace al ingresar una interrupción.
Para más detalles, debe consultar la documentación de su modelo de procesador específico, que tiende a variar ampliamente.
Esto describe el 8086, no el 8080. –
El 8080 dependía de hardware externo para controlar su manejo de interrupciones, por lo que es imposible generalizar. Busque información sobre los controladores de interrupción Intel 8214 o 8259.
¿Pero viene del autobús? – Facon
Una interrupción es una manera de interrumpir la CPU con una notificación de manejar algo más, no estoy seguro de la 8080 de chips Intel, pero desde mi experiencia, la mejor manera de describir una interrupción es esto:
El CS:IP
(Segmento de código: Puntero de instrucción) está en esta instrucción en la dirección de memoria 0x0000: 0020, como un ejemplo para explicarlo usando las instrucciones Intel 8086, el ensamblador es un galimatías y no tiene un significado real ... las instrucciones son imaginativos
0x0000:001C MOV AH, 07 0x0000:001D CMP AH, 0 0x0000:001E JNZ 0x0020 0x0000:001F MOV BX, 20 0x0000:0020 MOV CH, 10 ; CS:IP is pointing here 0x0000:0021 INT 0x15
Cuando CS: IP apunta a la línea siguiente y se emite un hexadecimal INT
errupt 15, esto es lo que sucede, la CPU empuja los registros y las banderas en la pila y luego ejecuta el código en 0x1000: 0100, que da servicio al INT 15 como un ejemplo
0x1000:0100 PUSH AX 0x1000:0101 PUSH BX 0x1000:0102 PUSH CX 0x1000:0103 PUSH DX 0x1000:0104 PUSHF 0x1000:0105 MOV ES, CS 0x1000:0106 INC AX 0x1000:0107 .... 0x1000:014B IRET
Luego, cuando el CS: IP golpea en la instrucción 0x1000: 014B, un IRET
(interrupción de retorno), que se dispara todos los registros y restaurar el estado, se emite y cuando el fichero es ejecutado CS de la CPU : Puntos de IP a aquí, después de la instrucción en 0x0000: 0021.
0x0000:0022 CMP AX, 0 0x0000:0023 ....
cómo la CPU sabe dónde saltar a una determinada compensación se basa en la tabla vector de interrupción, esta tabla de vectores de interrupción es establecido por el BIOS en un lugar determinado en el BIOS, que se vería así:
INT BIOS's LOCATION OF INSTRUCTION POINTER --- -------------------------------------- 0 0x3000 1 0x2000 .. .... 15 0x1000 <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO
esa tabla se almacena en el BIOS y cuando se ejecuta el INT
15, el BIOS, redireccionará el CS: IP a la ubicación en el BIOS para ejecutar el código de servicio que se encarga de la interrupción.
En los viejos días, bajo Turbo C, no era un medio para anular las rutinas de la tabla de vectores de interrupción con sus propias funciones de manejo de interrupción utilizando las funciones setvect
y getvect
en el que los manejadores de interrupciones reales se desvían a su propio código.
Espero haberlo explicado lo suficientemente bien, vale, no es Intel 8080, pero entiendo, y estoy seguro de que el concepto es el mismo para ese chip que la familia de chips Intel x86.
¡Buena explicación! Gracias. – Leonardo
esto es para el 8086, no el 080 –
El 8080 tiene una línea de interrupción (pin 14). Todos los periféricos están conectados a este pin, por lo general en una configuración de "cable O" (lo que significa que las salidas de solicitud de interrupción son de colector abierto y el pin de interrupción se eleva con una resistencia). Internamente, el procesador tiene un bit de habilitación de interrupción. Dos instrucciones, EI y DI, establecen y borran este bit. Todo el sistema de interrupción se activa o desactiva, las interrupciones individuales no se pueden enmascarar en el 8080 "descubierto". Cuando un dispositivo emite una interrupción, el procesador responde con una señal de "Reconocimiento de interrupción" (~ INTA). Esta señal tiene la misma temporización que la señal "Memoria de lectura" (~ MEMR) y está destinada a activar el dispositivo periférico para colocar una instrucción "Reiniciar" en el bus de datos. La señal de confirmación de interrupción es básicamente un ciclo de búsqueda de instrucción, se produce solo en respuesta a una interrupción.
Hay ocho instrucciones de reinicio, RST 0 - RST 7. RST 7 es el código de operación "0xFF". Las instrucciones de reinicio hacen que el procesador presione el contador del programa en la pila y comience la ejecución en una ubicación de vector de reinicio. RST 0 vectores a 0x0000, RST 1 vectores a 0x0008, RST 2 vectores a 0x0010 y así sucesivamente. Reinicia 7 vectores a 0x0038. Estas direcciones vectoriales están destinadas a contener código ejecutable, generalmente una instrucción de salto a una rutina de servicio de interrupción. La rutina de servicio de interrupción apilará todos los registros que utiliza, realizará las funciones de E/S necesarias, desapilará todos los registros y regresará al programa principal mediante la misma instrucción de retorno que finaliza las subrutinas (RET, opcode 0xC9).
Las instrucciones de reinicio son códigos de operación reales, lo que significa que harán lo mismo si se extraen de la memoria durante la ejecución del programa. Era conveniente usar Restart 7 como "reinicio templado" para un programa de monitor/depurador de teclado porque las EPROM tempranas generalmente contenían 0xFF en cada ubicación en blanco. Si estuvieras ejecutando una EPROM en blanco, eso significaba que algo había salido mal y, de todos modos, probablemente querrías volver al monitor.
Observe que los vectores RST 0 en la misma ubicación de memoria que RESTABLECER, ambos empiezan a ejecutarse en 0x0000. Pero RST 0 deja una dirección de retorno en la pila. En cierto modo, se puede pensar en RESET como la única interrupción no enmascarable que tenía el 8080.
Una señal de interrupción también borrará el bit de interrupción, por lo que una rutina de servicio de interrupción deberá ejecutar una instrucción EI, generalmente inmediatamente antes del RET. De lo contrario, el sistema responderá a uno y solo un evento de interrupción.
CP/M reservó los primeros 256 bytes de memoria para el uso del sistema, y ese mapa vectorial de interrupción utilizó los primeros 64 bytes (8 bytes por instrucción de reinicio).En los sistemas CP/M, la RAM comenzó en 0x0000 y cualquier ROM vivía en el extremo superior de la memoria. Estos sistemas utilizaron alguna forma de conmutación bancaria inteligente para conmutar en una EPROM o algo inmediatamente después de un RESET para proporcionar una instrucción JUMP a la ROM del sistema para que pudiera comenzar la secuencia de arranque. Los sistemas que tenían ROM en el extremo inferior del mapa de memoria programaron las instrucciones JUMP a los vectores ubicados en la RAM en los primeros 64 bytes. Estos sistemas tuvieron que inicializar esos vectores RAM al inicio.
- 1. ¿Cómo funcionan las interrupciones en máquinas multinúcleo/multicpu?
- 2. ¿Cómo funcionan las interrupciones en la CPU ARM multinúcleo
- 3. ¿Cómo se manejan las interrupciones en SMP?
- 4. ¿Cómo manejar adecuadamente las interrupciones de audio?
- 5. ¿Por qué las aplicaciones genéricas funcionan en procesadores Intel y AMD?
- 6. Activación de interrupciones de coma flotante en Mac OS X Intel
- 7. ¿Cómo funcionan las cookies?
- 8. ¿Qué se entiende por deshabilitar las interrupciones?
- 9. Probando interrupciones de red en el software
- 10. Arduino Interrupciones en serie
- 11. ¿Cómo funcionan las funciones trigonométricas?
- 12. ¿Cómo se comparten las memorias caché en CPU Intel multinúcleo?
- 13. Java: cómo funcionan las matrices
- 14. ¿Cómo funcionan las claves externas?
- 15. ¿Cómo funcionan las declaraciones preparadas?
- 16. ¿Cómo funcionan las pasarelas API?
- 17. Cómo manejar las interrupciones de conexión Mongoose DB
- 18. ¿Cómo funcionan las excepciones en Haskell?
- 19. Cómo funcionan las sesiones en Codeigniter
- 20. ¿Cómo funcionan las actualizaciones en tiempo real?
- 21. ¿Cómo funcionan las ecuaciones matemáticas en Java?
- 22. posición: interrupciones fijas en IE9
- 23. ¿Cómo funcionan las banderas en C?
- 24. ¿Cómo funcionan los índices en las vistas?
- 25. iptables redirigir 80 a 8080 pero bloquear 8080 acceso público
- 26. ¿Cómo funciona el scalable_allocator de Intel TBB?
- 27. ¿cómo funcionan las llamadas a procedimiento en el ensamblador?
- 28. ¿Cómo funcionan las pruebas unitarias en el iPhone?
- 29. ¿Cómo funcionan las expresiones regulares en el selenio?
- 30. manejo de interrupciones (Linux/General)
Si se trata de una variable "donde va el código de operación", ¿por qué no llamarlo "código de operación"? –
El código de operación se utiliza como tipo de datos, de todos modos, como veo, el código de operación de la interrupción va al bus externo de 8080, así que creo que estaba bien. ¡Gracias a todos! – Facon