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 ?