ADD_HL_R16 mauvais flag

ADD_HL_R16 mauvais flag

par Gil Christian Tinde,
Number of replies: 2

Bonjour, 

Nous avons l'erreur suivante dans le test de ADD_HL_R16 (semaine 8): 

Dispatch ALU ADD Tests:test_ADD_HL_R16:0: Opcode 0x9:  (0xFFFF, 0x1) => flag 0x0 (!= 0x30)

S'il s'agit bien de l'addition de 0xFFFF et 0x1, et que les fanions H et C correspondent à l’addition des 8 bits de poids fort, pourquoi le flag attendu est-il 0x30 ? 

Merci,

Gil Tinde

In reply to Gil Christian Tinde

Re: ADD_HL_R16 mauvais flag

par Jean-Cédric Chappelier,

Je pense que vous faites ici une confusion sur le rôle des fanions dans une opération : ils représentent l'information sur l'OPERATION ENTIERE. Lorsque cette opération porte sur 16 bits, ils peuvent alors représenter l'information de la partie haute ou de la partie basse, mais de TOUTE l'opération.
Ainsi, dans l'addition 16 bit de 0xFFFF ex 0x0001, le résultat est bien 0x0000. Ca c'est l'opération (en entier). Après on s'intéresse à regarder ce qu'il s'est passé soit avec les 8 bits du haut, soit avec les 8 bits du bas ; mais ce qui s'est passé dans CETTE opération, pas dans une autre qui consisterait à d'abord tronquer les opérandes.

Donc avec alu_add16_high() par exemple on regarde ce qu'il s'est passé avec les 8 bits de poids forts. Ces 8 bits ont en fait fait l'opération 0xFF + 0x01 (et non pas 0xFF + 0x00 comme vous semblez le croire). Et donc en effet H et C (et Z) sont mis à 1. Donc le résultat des fanions est 0xB0 (qui est réduit à 0x30 dans le cas de ADD_HL_R16SP puisque pour cette famille d'instructions les fanions conservés sont -0HC (ordre ZNHC comme dans la donnée).

Est-ce plus clair ?