2012-01-15 7 views
27

La CPU Game Boy Z80 tiene un indicador de medio llevar, y parece que no puedo encontrar mucha información sobre cuándo establecerlo/borrarlo.GBZ80: ¿Qué constituye un "medio transporte"?

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 algun modo. 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.

+0

Er, no es ¿pregunta electrónica? –

+11

Escribo un emulador, así que no lo creo ... – Rena

Respuesta

23

Es el acarreo del bit 3 al bit 4, al igual que los registros de bandera de acarreo normales llevan del bit 7. Por lo tanto, p. para obtener la mitad de bit de acarreo en un complemento:

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

cual da 0x10 si la mitad de transporte se debe establecer, 0 en caso contrario. Conseguir la mitad del resto de las operaciones relevantes sigue naturalmente: la pregunta es si hubo un acarreo desde el mordisco bajo al máximo.

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 lleva a la mitad muy naturalmente, como un resultado intermedio.

DAA está interesado en la bandera porque si se ha configurado la mitad del recorrido, se agregaron dos dígitos que suman más de 16 en el nibble 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.

+1

Muy bien, pero ¿qué pasa con las operaciones de 16 bits? ¿El conjunto de medio transporte está en el byte alto o bajo? – Rena

+2

El byte alto; es el medio medio más reciente. Y probablemente ya lo haya encontrado, pero encuentro que http://datasheets.chipdb.org/Zilog/Z80/z80-documented-0.90.pdf tiene una gran descripción de DAA, además de las explicaciones de dónde viene el medio acarreo en cajas de borde como CCF (donde está configurado en transporte antiguo, si la memoria sirve). – Tommy

+0

Una cosa para agregar me lo deja en claro: Agregar, por ejemplo, 0x37 y 0x44 no causará un medio acarreo porque solo se observan los 4 bits inferiores de cada byte, se los agrega y se ve si se desborda. 0x0F + 0x01, 0x37 + 0x44 no. –

6

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

(Nota los bits anteriormente se identificarán 0-15, de menos a 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 
Cuestiones relacionadas