emulation - for - super game boy emulator
GBZ80: ¿Qué constituye un "medio transporte"? (2)
Es el acarreo del bit 3 al bit 4, al igual que los registros de bandera de acarreo normales transportados desde el bit 7. Por lo tanto, por ejemplo, para obtener el medio bit de acarreo en un complemento:
((a&0xf) + (value&0xf))&0x10
Lo que da 0x10 si se debe configurar la mitad de transporte, 0 en caso contrario. Obtener la mitad de la carga de las otras operaciones relevantes sigue naturalmente, la pregunta es si hubo acarreo desde el mínimo mordisco hasta el máximo.
Para poner las cosas en perspectiva, el z80 tiene una ALU de 4 bits y realiza operaciones de 8 bits haciendo dos operaciones de 4 bits. Por lo tanto, se lleva a la mitad muy naturalmente, como un resultado intermedio.
A DAA le interesa la bandera porque si se establece medio acarreo, se agregaron dos dígitos que suman más de 16 en el mordisco bajo; que habrá producido correctamente el acarreo en el nibble superior, pero habrá dejado el nibble 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 acarreo, y 16, cuando lo hizo.
La CPU Game Boy Z80 tiene una bandera de medio llevar, y parece que no puedo encontrar mucha información sobre cuándo establecerla / borrarla.
Lo que entiendo hasta ahora es que cualquier operación de suma, resta, desplazamiento o rotación de 8 bits (y tal vez otros?) Lo 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 las instrucciones de 16 bits lo afectan y si se ve afectado o no por el uso de ciertos registros.
Para operaciones de 16 bits, el acarreo desde el bit 3 al bit 4 en el byte alto del registro establece el indicador. En otras palabras, bit 11 a bit 12.
(Tenga en cuenta que los bits anteriores están etiquetados como 0-15, de menos a más significativos)
Consulte 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