Detección de interrupciones en Z80

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Detección de interrupciones en Z80

Mensajepor Bubu » 16 Ene 2019, 20:02

¡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"?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Detección de interrupciones en Z80

Mensajepor mcleod_ideafix » 17 Ene 2019, 19:23

¡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.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Detección de interrupciones en Z80

Mensajepor Bubu » 17 Ene 2019, 20:59

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 ;)
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Detección de interrupciones en Z80

Mensajepor zup » 18 Ene 2019, 16:32

¿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.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 171
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 16 veces
Gracias recibidas: 18 veces

Re: Detección de interrupciones en Z80

Mensajepor PabloMarmol » 18 Ene 2019, 18:53

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

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Detección de interrupciones en Z80

Mensajepor Bubu » 18 Ene 2019, 21:24

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Detección de interrupciones en Z80

Mensajepor Bubu » 18 Ene 2019, 21:26

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Detección de interrupciones en Z80

Mensajepor Bubu » 19 Ene 2019, 00:02

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Detección de interrupciones en Z80

Mensajepor mcleod_ideafix » 19 Ene 2019, 00:41

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.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 20 veces
Gracias recibidas: 60 veces

Re: Detección de interrupciones en Z80

Mensajepor Bubu » 19 Ene 2019, 00:44

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.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 14 invitados