Cómo calcular el tiempo de un bucle 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

Re: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Bubu » 07 Jun 2018, 18:12

PD: Si en lugar de la rutina simple de decrementar bc, que tarda sólo 26 ciclos, hago una menos efectiva que tarde el doble, 52 ciclos, pos ya tengo que el bucle tardaría justo 1 segundo.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Namek » 07 Jun 2018, 23:30

Si las interrupciones van a estar activas, la forma mas facil de hacer una pausa de exactamente un segundo seria:

ld b,50
loop:
halt
djnz loop

mas simple imposible...

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: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Bubu » 08 Jun 2018, 00:27

JAjAjajaJjAjAA, ¡¡es verdura!! Lo único que es lo que tú dices, que las interrupciones tién que estar astivas, si no, la pausa sería forever. Per sí, no había yo caído en esa simpleza :D

Sería algo así como:

Código: Seleccionar todo

ld b, segundos*50
loop:
halt
djnz loop
ret


¿y el halt y el djnz no aportarían tiempo? Bueno, creo que es lo de menos, en todo caso sería recalcular el 50, que sería a lo mejor 48 o algo así.

Sí, señor, Namek, ese método del halt me ha gustado oyes :D
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1442
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 9 veces
Gracias recibidas: 209 veces

Re: Cómo calcular el tiempo de un bucle en Z80

Mensajepor BlackHole » 08 Jun 2018, 01:29

El DJNZ aportaría 13 ciclos si hay bucle (Z=0) y 8 si se llega a cero (Z=1). 4 ó 2 microsegundos. Vamos... una nimiedad.

¿Por cierto, para qué es la rutina y para qué máquina? Lo digo por si hubiese soluciones más elegantes.

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: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Bubu » 08 Jun 2018, 09:18

Pues es que estoy haciendo un jueguecico, sólo por divertirme y prasticar Z80, y la máquina es el Spectrum, jiji. Por otra parte no quiero utilizar la ROM, me gusta pogramármelo todo, en RAM. Yo la solución la veo bastante bien, y es elegante ;)
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1442
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 9 veces
Gracias recibidas: 209 veces

Re: Cómo calcular el tiempo de un bucle en Z80

Mensajepor BlackHole » 08 Jun 2018, 13:51

No, si la solución del HALT es correcta (cuidado de no caer en un DI-HALT si no se está en un emulador que pueda abortar), pero claro, el contenido de los cálculos efectuados en la interrupción puede hacer muy difícil estimar lapsos exactos.

Normalmente en las interrupciones se aprovecha a mover elementos por pantalla que deben ser fluidos y no pararse. El HALT se podría meter al final de todo para que cuando se lanza la siguiente interrupción en el "vertical blank" todo esté sincronizado y no vaya a saltos (evitar que a veces sea más rápido cuando hay pocas "cuentas", y a veces más lento cuando hay más).

El problema del Spectrum es que no tiene interrupciones por raster (como el Commodore 64) que podamos programar en cualquier momento, sino que solo existe una cuando se reinicia el barrido en el siguiente frame. Por eso la solución ofrecida por Namek yo solo la uso en bucles infinitos que esperan una respuesta externa (una tecla, un disparo) para continuar, o en pantallas estáticas.

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: Cómo calcular el tiempo de un bucle en Z80

Mensajepor mcleod_ideafix » 08 Jun 2018, 18:30

Bubu escribió:OK, esa rutina es la que puse, pero no quiero poner el HALT, es decir, quiero que las interrupciones salten cuando tengan que saltar.

Bubu escribió:Sí, señor, Namek, ese método del halt me ha gustado oyes :D


¿En qué quedamos? ¿Te vale o no te vale usar HALT? Porque es precisamente lo que te puse como solución antes y la rechazaste por eso.
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: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Bubu » 08 Jun 2018, 21:35

Pues sí y no, lo del HALT me sirve al 50%, uséase, sólo cuando estén activas las interrupciones, como dije antes. Lo que yo he calculado es mucho más genérica. Así que cuando tenga DI pondré la mía, y cuando tenga EI (no vaaayas presumieeendo por ahí), la vuestra.
Como resumen, he aprendido que HALT requiere un bucle de 50 para cá segundo, y sin HALT requiere decrementar 16 bits para medio segundo.

¡¡Gracias!!
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: Cómo calcular el tiempo de un bucle en Z80

Mensajepor Bubu » 08 Jun 2018, 23:38

Bueno, pos no entiendo un pimién. Resulta que estoy probando ambos métodos, siempre con las interrupciones habilitadas, y observo esto:

(1) Con mi método del decremento de 16 bits, va bien
(2) Con el método de los halts, va demasiado rápido

Pruebo a llamar a mi método 10 veces, y como cá vez es medio segundo, pos tarda 5 segundos (algo menos, pero poco apreciable). Cuando pruebo a llamar el método de los halts 5 veces, no llega ni a 2 segundos.

Lo he catado tanto en EmuZWin como en ZesarUX.

Código: Seleccionar todo

wait:
 ; Realiza una pausa de medio segundo
  ld bc, $FFFF
 wait_01:
  dec bc
  ld a, b
  or c
  jr nz, wait_01
  ret



Código: Seleccionar todo

pause:
 ; Realiza una pausa
 ; IN: c=número de segundos
 ld b, 50
pause_01:
 halt
 dec b
 djnz pause_01
 dec c
 jr nz, pause
 ret
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1442
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 9 veces
Gracias recibidas: 209 veces

Re: Cómo calcular el tiempo de un bucle en Z80

Mensajepor BlackHole » 09 Jun 2018, 03:53

Claro, tarda la mitad porque tu código está mal.
La orden DJNZ ya decrementa B por sí misma y por lo tanto te sobra el DEC B :roll:


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

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