Game Boy: ¿Qué constituye un "medio acarreo"?

Resuelto Rena asked hace 12 años • 3 respuestas

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.

Rena avatar Jan 15 '12 15:01 Rena
Aceptado

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.

Tommy avatar Jan 16 '2012 00:01 Tommy

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
Emir Akaydın avatar Jan 16 '2012 08:01 Emir Akaydın