2016-08-21 1 views
0

J'ai commencé à expérimenter avec la programmation Gameboy à l'aide de l'assemblage Z80, mais j'ai trouvé quelque chose de bizarre.Problème lié à l'utilisation de dec pour créer un délai

Je trouve un extrait de code utilisé pour créer un retard:

simpleDelay: 
dec bc 
ld a,b 
or c 
jr nz, simpleDelay 
ret 

Tout en jouant avec ça, j'ai découvert que l'écriture bc dec raccourcit deux fois le retard, mais l'écriture 3 fois rend le délai plus long que en l'utilisant une ou deux fois. Pourquoi avoir un nombre pair d'instructions dec raccourcit-il le délai?

EDIT: Voici l'extrait de code appelant le retard:

ld hl,Title2 
ld de, _SCRN0+3+(SCRN_VY_B*5) ; 
ld bc, Title2End-Title2 
call mem_CopyVRAM 
call simpleDelay 
+0

IDK Z80, mais la condition de boucle vérifie-t-elle '! = 0'? Votre nombre initial est-il un multiple de 2 mais pas de 3? –

+1

Pas directement pertinent, mais voir 'DJNZ' pour les boucles plus courtes; cela trahit la logique appliquée ici: décrément, compare à zéro, saute si la comparaison échoue. C'est avec un OU pour comparer une valeur de 16 bits plutôt que simplement une valeur de 8 bits - 'OR' définit l'indicateur zéro et la seule façon dont deux valeurs peuvent produire zéro est si les deux étaient individuellement zéro. – Tommy

+0

@Tommy Oh cool, merci! –

Répondre

4

Le nombre de fois que la boucle est exécuté dépend de la valeur chargée en Colombie-Britannique. Vous n'avez pas spécifié la valeur que vous utilisez.

Si la valeur du chargement est même, dec bc, dec bc, dec bc Fera jr nz, simpleDelay de ne pas sortir de la boucle la première fois et la valeur de bc à enveloppants. Cela provoque l'exécution de la boucle plus de fois que prévu.

+3

En fait, si la valeur initiale est pair et un multiple entier de 3 (par exemple 6), il quittera la boucle sans s'enrouler. –

+0

Merci pour l'explication! :) –