Tabla de interrupciones

Tabla de interrupciones

de Franco Testore Canapa -
Número de respuestas: 4
Hola, al usar una tabla para las interrupciones nos da el error Program received signal SIGEMT, Emulation trap. pero cuando usamos loads para guardar las direcciones de las rutinas de atención a interrupción no tenemos ese problema.
En respuesta a Franco Testore Canapa

Re: Tabla de interrupciones

de Julia Azziz -
Hola Franco,
Con la primera opción (usar una tabla) te referís a poner la tabla en ROM e inicializar los valores con las direcciones de las rutinas, y con la segunda (usar loads) a poner la tabla en RAM e inicializarla con las direcciones en el programa principal? Si podes mostrar los cambios entre una opción y otra (donde ponen la tabla y como la inicializan) podemos ver bien que es lo que les pasa.
En respuesta a Julia Azziz

Re: Tabla de interrupciones

de Franco Testore Canapa -
Si es eso, cuando esta en ROM nos da el error, 
en el registro I cargamos 0x01

en cambio si esta en RAM funciona 
En respuesta a Franco Testore Canapa

Re: Tabla de interrupciones

de Julia Azziz -
Cuando usan la directiva .org, el salto de memoria no es absoluto, sino que es relativo al lugar de memoria donde están ubicados actualmente. Entonces es probable que la tabla_int no esté en 0x0100, y cuando cargan 0x01 en I en realidad no están cargando la dirección de la tabla, y cuando van a buscar las rutinas de atención a interrupciones terminan ejecutando lo que sea que haya en ese lugar de memoria.

Lo que tienen que hacer ahí para asegurarse de que están cargando el valor correcto en I es usar la etiqueta tabla_int, por ejemplo así:
LD HL, tabla_int
LD A, H
LD I, A

De esta forma siempre van a tener en I el byte alto de la dirección de la tabla sin importar donde quede ubicada.