... porque no coincidían los tiempos de la subrutina de espera:
la instrucción de decremento de 16 bits (dec bc o dec de) no afecta los flags!!
... porque no coincidían los tiempos de la subrutina de espera:
la instrucción de decremento de 16 bits (dec bc o dec de) no afecta los flags!!
Si, por eso había un ld a, un or y un cp
//CODE
; NOTE: ticks come in bcde, big endian
wait_32:
push af
push hl
ld a, 5
call sr_32
ld l, 0
wait_32_loop_0:
nop ; NOTE: just for the 4T
dec de
ld a, e
or d
wait_if_0:
cp l
jp nz, wait_32_loop_0
dec bc
ld a, c
or b
wait_if_1:
cp 0
jr nz, wait_32_loop_0
wait_32_loop_0_end:
pop hl
pop af
ret
include "sr_32.s"
//CODE
PS: Si no hubiera un cp jamás saldría del loop.
ok.
No me acordaba del código de tu subrutina, pensé que te habías olvidado que "dec bc" no afecta flags.
Para otra vez, no subas soluciones completas al foro.
Ahora que ya lo hiciste vamos a usarla.
Me parece que el error es que estás saliendo del loop cuando C es cero, y no cuando BC es cero que es lo que intentas hacer. O en el otro caso cuando E es cero y no cuando DE es 0.
La instrucción "CP dato" compara el acumulador con la constante "dato" y setea los flags de acuerdo al resultado. En el acumulador antes de comparar pusiste el byte bajo (ld a, e en un caso, ld a, c en el otro).
julio
Si, es eso, debería ser un jp p en vez de un jr nz.
Lo vi poniendo un out y contando las líneas de output.log del qemu y acá me lo confirmaste.
No subo más, creí que no había problema ya que no es parte de la tarea.
Gracias por la respuesta.