Game Boy: ¿Qué constituye un "medio acarreo"?
La CPU Game Boy Z80 tiene un indicador de medio acarreo y parece que no puedo encontrar mucha información sobre cuándo configurarlo o borrarlo.
Lo que entiendo hasta ahora es que cualquier operación de suma, resta, desplazamiento o rotación de 8 bits (¿y tal vez otras?) la establece en el bit 4 del resultado (?), y la instrucción DAA establece/usa esto de alguna manera. Lo que no estoy seguro es cómo le afectan las instrucciones de 16 bits y si se ve afectado o no por el uso de ciertos registros.
Es el acarreo del bit 3 al bit 4, al igual que los registros de bandera de acarreo normales se transportan desde el bit 7. Entonces, por ejemplo, para obtener el bit de medio acarreo en una adición:
((a&0xf) + (value&0xf))&0x10
Lo que da 0x10 si se debe establecer la mitad del acarreo, 0 en caso contrario. Obtener la mitad del acarreo de las otras operaciones relevantes es algo natural: la pregunta es si hubo acarreo del bajo mordisco al alto.
Para poner las cosas en perspectiva, el z80 tiene una ALU de 4 bits y realiza operaciones de 8 bits realizando dos operaciones de 4 bits. Por lo tanto, se obtiene la mitad del acarreo de forma muy natural, como resultado intermedio.
DAA está interesada en la bandera porque si se establece la mitad del acarreo, entonces se agregaron dos dígitos que suman más de 16 en el nibble bajo; eso habrá producido correctamente el acarreo en el nibble superior pero habrá dejado el nibble inferior 6 más bajo de lo que debería estar, ya que había seis valores más entre 10, cuando debería haber generado acarreo, y 16, cuando lo hizo.
Para operaciones de 16 bits, el acarreo del bit 3 al bit 4 en el byte alto del registro establece la bandera. Es decir, del bit 11 al bit 12.
(Tenga en cuenta que los bits anteriores están etiquetados del 0 al 15, del menos al más significativo)
Ver aquí: 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