2010-01-29 14 views
6

¿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

1

¡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.

+0

Si se trata de una variable "donde va el código de operación", ¿por qué no llamarlo "código de operación"? –

+0

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

3

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.

+0

Esto describe el 8086, no el 8080. –

1

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.

+0

¿Pero viene del autobús? – Facon

3

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.

+0

¡Buena explicación! Gracias. – Leonardo

+0

esto es para el 8086, no el 080 –

10

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.

Cuestiones relacionadas