Pregunta

La CPU de Game Boy Z80 tiene una bandera de medio transporte, y parece que no puedo encontrar mucha información sobre cuándo configurarla/limpiarla.

Lo que entiendo hasta ahora es que cualquier operación adicional de 8 bits, reto, cambio o rotación (¿y tal vez otros?) Establezca en el bit 4 del resultado (?), Y la instrucción DAA establece/lo usa de alguna manera. Lo que no estoy seguro es cómo las instrucciones de 16 bits lo afectan y si se ve afectada o no por el uso de ciertos registros.

¿Fue útil?

Solución

Es el transporte del bit 3 al bit 4, al igual que los registros de bandera de transporte normales llevan desde el bit 7. Entonces, por ejemplo, obtener el bit de medio transporte en un ADD:

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

Que da 0x10 si se debe establecer la mitad de transporte, 0 de lo contrario. Obtener la mitad de los otros OPS relevantes sigue naturalmente: las preguntas es si se llevaba a cabo desde el bajo mordisco a lo alto.

Para poner las cosas en perspectiva, el Z80 tiene un Alu de 4 bits y realiza OPS de 8 bits haciendo dos operaciones de 4 bits. Por lo tanto, obtiene la mitad de transporte de manera muy natural, como resultado intermedio.

DAA está interesado en la bandera porque si la mitad de transporte se establece, se agregaron dos dígitos que se suman a más de 16 en el mordisco bajo; Eso habrá producido correctamente el transporte en el mordisco superior, pero habrá dejado el mordisco bajo 6 más bajo de lo que debería ser, ya que había seis valores más entre 10, cuando debería haber generado transporte y 16, cuando lo hizo.

Otros consejos

Para operaciones de 16 bits, el transporte de bit 3 a bit 4 en el byte alto del registro establece la bandera. En otras palabras, bit 11 a bit 12.

(Tenga en cuenta que los bits anteriores están etiquetados 0-15, de menos a lo más significativo)

Mira 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top