Question

Le processeur Game Boy Z80 a un drapeau de demi-portage, et je n'arrive pas à trouver beaucoup d'informations sur le moment de le définir / de l'effacer.

Ce que je comprends jusqu'à présent, c'est que toute opération d'ajout, de soustraction, de décalage ou de rotation 8 bits (et peut-être d'autres?) le définit sur le bit 4 du résultat (?), et les instructions DAA définissent / l'utilisent d'une manière ou d'une autre.Ce que je ne sais pas, c'est comment les instructions 16 bits l'affectent et si elles sont affectées ou non par l'utilisation de certains registres.

Était-ce utile?

La solution

C'est le report du bit 3 au bit 4, tout comme les enregistrements de drapeau de report normaux portent du bit 7. Donc, par ex.pour obtenir la moitié du bit de report dans un ajout:

((a&0xf) + (value&0xf))&0x10

Ce qui donne 0x10 si la moitié de report doit être définie, 0 sinon.Obtenir la moitié du report des autres opérations pertinentes suit naturellement - la question est de savoir s'il y a eu report du grignotage bas vers le haut.

Pour mettre les choses en perspective, le z80 a une ALU 4 bits et effectue des opérations 8 bits en effectuant deux opérations 4 bits.Il est donc à moitié porté très naturellement, comme résultat intermédiaire.

DAA s'intéresse à l'indicateur car si la moitié de report est définie, deux chiffres totalisant plus de 16 ont été ajoutés dans le quartet bas;qui aura correctement produit le portage dans le quartet supérieur mais aura laissé le quartet bas 6 plus bas qu'il ne devrait l'être, car il y avait six valeurs de plus entre 10, quand il aurait dû générer un portage, et 16, quand il l'a fait.

Autres conseils

Pour les opérations 16 bits, le report du bit 3 au bit 4 dans l'octet haut du registre définit le drapeau.En d'autres termes, du bit 11 au bit 12.

(Notez que les bits ci-dessus sont étiquetés de 0 à 15, du moins au plus significatif)

Voir ici: http://www.z80.info/z80code.htm

16 bit arithmetic

If  you want to add numbers that are more than the 0-255 that can
be stored in the A register,  then the HL, IX or IY registers can
be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000

The flags are set as follows.

C or carry flag          1 if answer >65535 else 0
Z or zero flag           not changed
P flag                   not changed
S or sign flag           not changed
N flag                   0
H or half carry flag     1 if carry from bit 11 to bit 12 else 0

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top