2012-01-15 8 views
27

La CPU Game Boy Z80 ha un flag half-carry e non riesco a trovare molte informazioni su quando impostarlo/cancellarlo.GBZ80: cosa costituisce un "mezzo carico"?

Quello che ho capito finora è che qualsiasi operazione di aggiunta, sottrazione, spostamento o rotazione a 8 bit (e forse altri?) Lo imposta sul bit 4 del risultato (?), E l'istruzione DAA imposta/usa questo in qualche modo. Quello che non sono sicuro è il modo in cui le istruzioni a 16 bit lo influenzano e se è influenzato o no dall'uso di certi registri.

+0

Er, non è domanda elettronica? –

+11

Sto scrivendo un emulatore, quindi non credo ... – Rena

risposta

23

È il carry dal bit 3 al bit 4, proprio come i normali record flag carry portano dal bit 7. Quindi, ad es. per ottenere il bit di mezzo trasporta dentro un componente aggiuntivo:

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

che dà 0x10 se la metà carry deve essere impostato, 0 altrimenti. Ottenere metà del trasporto dalle altre operazioni rilevanti segue naturalmente - la domanda è se ci sia stato il carry dal basso nibble all'alto.

Per mettere le cose in prospettiva, lo z80 ha un ALU a 4 bit ed esegue operazioni a 8 bit facendo due operazioni a 4 bit. Quindi ottiene metà carry in modo molto naturale, come risultato intermedio.

DAA è interessato al contrassegno perché se è impostato il trasporto a metà, nel rullino basso vengono aggiunte due cifre che ne sommano più di 16; che avrà prodotto correttamente portare nel morso superiore, ma avrà lasciato il basso nibble 6 più basso di quanto dovrebbe essere, poiché c'erano altri sei valori tra 10, quando avrebbe dovuto generare carry, e 16, quando lo ha fatto.

+1

OK, ma che dire delle operazioni a 16 bit? Il mezzo trasportino è impostato sul byte alto o basso? – Rena

+2

Il byte alto; è il mezzo trasporto più recente. E probabilmente lo hai già trovato, ma trovo http://datasheets.chipdb.org/Zilog/Z80/z80-documented-0.90.pdf per avere una buona descrizione di DAA, oltre a spiegazioni su dove arriva il mezzo trasporto casi limite come CCF (dove è impostato su vecchio carry, se la memoria serve). – Tommy

+0

Una cosa da aggiungere che mi è chiara: l'aggiunta di, ad esempio, 0x37 e 0x44 non causerà un half-carry in quanto si guardano solo i 4 bit inferiori di ciascun byte, li si sommano e si vede se si verifica un overflow. 0x0F + 0x01 sì, 0x37 + 0x44 no. –

6

Per le operazioni a 16 bit, il carry dal bit 3 al bit 4 nel byte alto del registro imposta il flag. In altre parole, il bit 11 al bit 12.

(Nota i bit di cui sopra sono etichettati 0-15, dal meno al più significativo)

Vedi qui: 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 
Problemi correlati