Pregunta

¿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 solamente una pequeña descripción acerca de esto. Necesito una explicación detallada al respecto, para emular esta CPU.

¿Fue útil?

Solución 4

Finalmente encontrarlo!

crear una variable llamada autobús donde va código de operación de interrupción. Entonces, llamé a 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. instrucciones EI y DI manejan INTE.

Cuando INT y INTE es cierto se ejecuta interrupción.

Otros consejos

El 8080 tiene una línea de interrupción (pin 14). Todos los periféricos están conectados a esta clavija, generalmente en un "cable-OR" configuración (lo que significa salidas de solicitud de interrupción están abiertos-colector y el pin de interrupción se tira alta con una resistencia). Internamente, el procesador tiene una habilitación de interrupción de bit. Dos instrucciones, IE y DI, establecer y restablecer este bit. Todo el sistema de interrupción es así enciende o se apaga, las interrupciones individuales no pueden ser enmascarados en el "desnudo" 8080. Cuando un dispositivo cuestiones una interrupción, responde el procesador con una señal de "reconocimiento de interrupción" (~ INTA). Esta señal tiene el mismo tiempo que la señal de "lectura de memoria" (~ MEMR) y se pretende para activar el dispositivo periférico para colocar una instrucción de "Reiniciar" en el bus de datos. La señal de reconocimiento de interrupción es básicamente una recuperación de instrucciones ciclo, se produce sólo en respuesta a una interrupción.

Hay ocho instrucciones de reinicio, RST 0 - 7. RST RST 7 se opcode "0xFF". Las instrucciones Restart causan que el procesador empujar el contador de programa en la ejecución de la pila y comenzar en un lugar reinicio del vector. RST 0 vectores a 0x0000, RST 1 vectores a 0x0008, RST 2 vectores a 0x0010 y así sucesivamente. Reinicie 7 vectores a 0x0038. Estas direcciones de vectores están destinados a contener código ejecutable, por lo general una instrucción de salto a una rutina de servicio de interrupción. La rutina de interrupción se acumulará todos los registros que utiliza, realizar las funciones de E / S necesarias, desapilar todos los registros y volver al programa principal a través de la misma instrucción de retorno que termina subrutinas (RET, código de operación 0xC9).

instrucciones

Reiniciar los códigos de operación son reales, lo que significa que van a hacer lo mismo si se obtienen de la memoria durante la ejecución del programa. Era conveniente utilizar Reiniciar 7 como "arranque en caliente" para un programa de monitor de teclado / depurador porque los primeros EPROM contenidos generalmente 0xFF en cada lugar en blanco. Si estaba ejecutando EPROM en blanco, que significaba algo había ido mal y es probable que quería volver a la pantalla de todos modos.

Tenga en cuenta que RST 0 vectores en la misma ubicación de memoria como RESET, tanto de inicio de ejecución en 0x0000. Pero RST 0 hojas una dirección de retorno en la pila. En cierto modo, de RESET puede ser pensado como el único no enmascarable interrupción del 8080 tenían.

Una señal de interrupción también se borrará la interrupción poco para una rutina de servicio de interrupción tendrá que ejecutar una instrucción de la IE, por lo general inmediatamente antes de la RET. De lo contrario, el sistema responderá a uno y sólo un evento de interrupción.

CP / M reservado los primeros 256 bytes de memoria para uso del sistema - y que mapa vector de interrupción utiliza los primeros 64 bytes (8 bytes por instrucción de reinicio). En CP / M sistemas, la memoria RAM comenzaron a 0x0000 y cualquier ROM vivían en el extremo superior de la memoria. Estos sistemas utilizan algún tipo de conmutación de bancos inteligente de interruptor en una EPROM o algo inmediatamente después de un RESET para proporcionar una instrucción de salto a la ROM del sistema por lo que podría comenzar la secuencia de arranque. Los sistemas que tenían ROM en el extremo inferior del mapa de memoria programados instrucciones de salto a vectores situados en la memoria RAM en los primeros 64 bytes. Estos sistemas tenían para inicializar los vectores de la RAM en el arranque.

punteros de función a los controladores de interrupción se almacenan en la memoria baja. Alrededor del 32 más o menos de las primeras direcciones son las interrupciones de hardware:. Hardware desencadenado

El próximo 32 o así de direcciones son activables por el usuario, estos se llaman interrupciones de software. Ellos son provocados por una instrucción INT.

El parámetro a INT es la interrupción de software número vector , que será la interrupción llamados.

Se tendrá que utilizar la instrucción IRET para volver de interrupciones.

Es probable que debiera interrupciones también desactivar como el primero que haces al entrar en una interrupción.

Para más detalle, se debe hacer referencia a la documentación del modelo de procesador específico, tiende a variar ampliamente.

El 8080 fue dependiente de hardware externo para controlar el manejo de interrupciones, por lo que es imposible generalizar. Busque información sobre los Intel 8214 o 8259 controladores de interrupciones.

Una interrupción es una manera de interrumpir la CPU con una notificación al mango otra cosa, no estoy seguro del chip de Intel 8080, pero desde mi experiencia, la mejor manera de describir una interrupción es la siguiente:

El CS:IP (Código Segmento: Instrucción puntero) está en esta instrucción en la dirección de memoria 0x0000: 0020, como un ejemplo para el bien de la explicación siguiendo las instrucciones que Intel 8086, el ensamblador es un galimatías y no tiene ningún 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 los CS: puntos IP a la siguiente línea y un INTerrupt 15 hexadecimal se emite, esto es lo que sucede, la CPU empuja los registros y banderas en la pila y luego ejecutar código en 0x1000: 0100, que da servicio a la 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 los CS: accesos IP en la instrucción 0x1000: 014B, un IRET (Interrupción de retorno), que aparece fuera de los registros de todos y restaurar el estado, se emite y cuando el fichero es ejecutado CS de la CPU: puntos IP de nuevo aquí , después de la instrucción en 0x0000:. 0021

0x0000:0022   CMP AX, 0
0x0000:0023   ....

Como la CPU sabe dónde saltar un desplazamiento en particular se basa en la tabla de vectores 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 maneja la interrupción

En los viejos días, bajo Turbo C, no había un medio para anular las rutinas tabla de vectores de interrupción con sus propias funciones de gestión de interrupción mediante las funciones setvect y getvect en el que los manejadores de interrupciones reales se desvían a su propio código .

Espero haber explicado lo suficientemente bien, está bien, no es Intel 8080, pero esa es mi entendimiento, y estaría seguro de que el concepto es el mismo para ese chip como la familia Intel x86 de chips de vino de eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top