Я начал экспериментировать с программированием Gameboy с использованием сборки Z80, но я нашел что-то странное.Проблема с использованием dec для создания задержки
Я нашел фрагмент кода, используемый для создания задержки:
simpleDelay:
dec bc
ld a,b
or c
jr nz, simpleDelay
ret
Во время игры вокруг с этим, я обнаружил, что писать Декабрь Ьс дважды сокращает задержку, но писать его 3 раза делает задержку больше, чем используя его один или два раза. Почему наличие четного числа операторов dec
сокращает задержку?
EDIT: Вот фрагмент кода вызова задержки:
ld hl,Title2
ld de, _SCRN0+3+(SCRN_VY_B*5) ;
ld bc, Title2End-Title2
call mem_CopyVRAM
call simpleDelay
IDK Z80, но проверка состояния цикла для '! = 0'? Является ли ваш начальный счет кратным 2, но не 3? –
Не относится непосредственно к делу, но см. 'DJNZ' для более коротких циклов; он предает применяемую здесь логику: декремент, сравнение с нулем, прыжок, если сравнение терпит неудачу. Это то, что с OR для сравнения 16-битного значения, а не только с 8-битным значением - 'OR' устанавливает флаг нуля, и единственный способ, которым могут быть получены два значения, равен нулю, если оба они равны нулю. – Tommy
@Tommy О, круто, спасибо! –