Página 1 de 2

Detección de interrupciones en Z80

Publicado: 16 Ene 2019, 20:02
por Bubu
¡Jarl, torpedos!

Resulta que estoy liao con el Z80, y me interesa hacer una rutina que al principio deshabilite las interrupciones, y al final las astive o desastive en función de como estuvieran antes de entrar. Así que lo primero que tengo que hacer es detestar el estado de la habilitación:

Código: Seleccionar todo

xor a
ld (INT_STAT), a
ld a, i
jr pe, no_int
inc (INT_STAT)
no_int:
di


Con este trozo grabo en (INT_STAT) un 0 si no están habilitadas, y 1 si sí, ¿nor?

Y al final..

Código: Seleccionar todo

ld a, (INT_STAT)
and a
retz
ei
ret


Con ese otro trozo habilito las interrupciones si antes lo estaban.

¿Lo veis corresto? ¿Está bien usada la condición "pe"?

Re: Detección de interrupciones en Z80

Publicado: 17 Ene 2019, 19:23
por mcleod_ideafix
¡Por qué no lo pruebas en un emulador y tú mismo podrás ver si funciona o no?
Pero antes, cambia lo de inc (INT_STAT) por otra cosa, ya que el Z80 no deja incrementar directamente el contenido de una dirección de memoria. Lo que sí te deja hacer es INC (HL) habiendo cargado antes HL con el valor INT_STAT.

Re: Detección de interrupciones en Z80

Publicado: 17 Ene 2019, 20:59
por Bubu
OK, claro que lo puedo probar, pero era por si alguien lo sabía del tirón, y además así iniciar un posible tema de conversación interesante ;)

Re: Detección de interrupciones en Z80

Publicado: 18 Ene 2019, 16:32
por zup
¿No sería más fácil poner una nota en la documentación que diga "a esta rutina hay que entrar con las interrupciones deshabilitadas"?

En serio, el programador debería conocer cómo tiene las interrupciones. En realidad solo se me ocurre un caso en el que no lo sepas y debas averiguarlo, y es cuando estás respondiendo a una NMI (¿es lo que intentas hacer?). Averiguar el estado de las interrupciones y restaurarlo es algo imprescindible en el caso de transfers (Phoenix, Transtape, Pokeador Automático)... si te apetece hacer trampa puedes desensamblar una rutina de esas para ver qué hace.

Y si no quieres pegarte el esfuerzo, tenemos por ahí un gran recurso para los usuarios de Spectrum (adaptable a cualquier Z80) como es la Microhobby. Si miramos en el artículo Transfer para el Pokeador automático, tenemos una rutina que hace exactamente lo que pides (líneas 30 a 90).

Por cierto, salvo por lo del inc (INC_STAT) has acertado en todo.

Re: Detección de interrupciones en Z80

Publicado: 18 Ene 2019, 18:53
por PabloMarmol
zup escribió:Por cierto, salvo por lo del inc (INC_STAT) has acertado en todo.

Pues yo que creo que el primer condicional lo tiene al revés ...

Re: Detección de interrupciones en Z80

Publicado: 18 Ene 2019, 21:24
por Bubu
zup escribió:¿No sería más fácil poner una nota en la documentación que diga "a esta rutina hay que entrar con las interrupciones deshabilitadas"?

En serio, el programador debería conocer cómo tiene las interrupciones. En realidad solo se me ocurre un caso en el que no lo sepas y debas averiguarlo, y es cuando estás respondiendo a una NMI (¿es lo que intentas hacer?).


Es que me quiero fabricar una librería en ensamblador que necesita tener deshabilitadas las interrupciones, y que el pogramador consuma la librería sin tener que adaptar su código a ella, simplemente haciendo un CALL a las rutinas que estén publicadas en mi librería.

Re: Detección de interrupciones en Z80

Publicado: 18 Ene 2019, 21:26
por Bubu
PabloMarmol escribió:Pues yo que creo que el primer condicional lo tiene al revés ...


OK, pos entóns voy a ponerme con una prueba de esto, a ver lo que hace. Sus contaré si es PE ó PO lo que indica INT habilitada.

Re: Detección de interrupciones en Z80

Publicado: 19 Ene 2019, 00:02
por Bubu
Pues al final lo he implementado así:

Código: Seleccionar todo

      ld a, i
      ld a, 0xF3            ;código del DI
      jp po, noint
      ld a, 0xFB            ;código del EI
noint   ld (rutina_end), a   ;mete el mnemónico al finalizar la rutina   
      di                  ;deshabilito las interrupciones

(... la rutina ...)

rutina_end:
      nop               ;Aquí se grabará un DI o un EI
      ret



Lo que hago es modificar el propio pograma poniendo la instrucción DI ó EI en función del overflow pe/po tras consultar el flip flop con ld a, i.

Re: Detección de interrupciones en Z80

Publicado: 19 Ene 2019, 00:41
por mcleod_ideafix
No sé si es la mejor idea haberlo implementado con código automodificable... de esa forma, tu librería no podrá ser usada para un programa grabado en un cartucho ROM.

Re: Detección de interrupciones en Z80

Publicado: 19 Ene 2019, 00:44
por Bubu
Es verdura, pero en este caso necesito que esa rutina sea rápida, y por tanto tié que estar en la memoria no contenida, y el cartucho abarca los primeros 16KB por lo que no sería lo suyo.