Página 2 de 3

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

Publicado: 07 Jun 2018, 18:12
por Bubu
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.

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

Publicado: 07 Jun 2018, 23:30
por Namek
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...

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

Publicado: 08 Jun 2018, 00:27
por Bubu
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

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

Publicado: 08 Jun 2018, 01:29
por BlackHole
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.

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

Publicado: 08 Jun 2018, 09:18
por Bubu
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 ;)

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

Publicado: 08 Jun 2018, 13:51
por BlackHole
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.

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

Publicado: 08 Jun 2018, 18:30
por mcleod_ideafix
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.

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

Publicado: 08 Jun 2018, 21:35
por Bubu
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!!

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

Publicado: 08 Jun 2018, 23:38
por Bubu
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

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

Publicado: 09 Jun 2018, 03:53
por BlackHole
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: