Cómo calcular el tiempo de un bucle en Z80
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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!!
- Namek
- Atari 1040 STf
- Mensajes: 840
- 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
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...
ld b,50
loop:
halt
djnz loop
mas simple imposible...
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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 
Sería algo así como:
¿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

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

Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!
-
- Amiga 1200
- Mensajes: 1489
- 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: 14 veces
- Gracias recibidas: 244 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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.
¿Por cierto, para qué es la rutina y para qué máquina? Lo digo por si hubiese soluciones más elegantes.
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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!!
-
- Amiga 1200
- Mensajes: 1489
- 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: 14 veces
- Gracias recibidas: 244 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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.
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.
- mcleod_ideafix
- 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: 54 veces
- Contactar:
Re: Cómo calcular el tiempo de un bucle en Z80
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
¿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
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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!!
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!!
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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.
(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!!
-
- Amiga 1200
- Mensajes: 1489
- 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: 14 veces
- Gracias recibidas: 244 veces
Re: Cómo calcular el tiempo de un bucle en Z80
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
La orden DJNZ ya decrementa B por sí misma y por lo tanto te sobra el DEC B

¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados