2016-08-21 5 views
0

Я начал экспериментировать с программированием 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 
+0

IDK Z80, но проверка состояния цикла для '! = 0'? Является ли ваш начальный счет кратным 2, но не 3? –

+1

Не относится непосредственно к делу, но см. 'DJNZ' для более коротких циклов; он предает применяемую здесь логику: декремент, сравнение с нулем, прыжок, если сравнение терпит неудачу. Это то, что с OR для сравнения 16-битного значения, а не только с 8-битным значением - 'OR' устанавливает флаг нуля, и единственный способ, которым могут быть получены два значения, равен нулю, если оба они равны нулю. – Tommy

+0

@Tommy О, круто, спасибо! –

ответ

4

Количество раз цикл запускается на выполнение зависит от величины, загруженной в до н. Вы не указали, какое значение вы используете.

Если значение загрузки даже, dec bc, dec bc, dec bc заставит jr nz, simpleDelay не выйти из цикла в первый раз вокруг и значения bc к Wraparound. Это заставляет цикл выполнять больше раз, чем вы ожидаете.

+3

Фактически, если начальное значение равно и целое число, кратное 3 (например, 6), оно выйдет из цикла без обертывания. –

+0

Спасибо за объяснение! :) –