Domanda

Attualmente sto sviluppando un emulatore per il buon vecchio gameboy e sto affrontando alcuni problemi a capire come devono essere implementati alcuni codici operativi di base.

Proprio ora sto implementazione e operazioni; I primi (0xa0 -> 0xa3; 0xa6 & 0xa7) sono piuttosto semplici ma le e le operazioni per i registri H, l sono un po 'diverse.

È possibile scaricare la documentazione dello Z80 in questo collegamento: UM0080.pdf (Pagina 172)

Ecco alcuni esempi per mostrare cosa intendo (con pseudo-codice) e fondamentalmente quello che faccio:

e a, h (nota il bit-shifting)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;
.

e a, l (nota il bit-mascheramento)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
.

Conosco tutte le operazioni di bit e so cosa fanno, ma sembra che non riesca a capire perché è necessario essere fatti così. Ho delle teorie (correggimi se sbaglio: -)):

Quello che ho già capito è che i registri H e L sono fondamentalmente il registro HL, che è un registro a 16 bit. Poiché la CPU / BUS può gestire solo le operazioni a 8 bit, ha bisogno di essere divisi; O il suggerimento più logico: dal momento del suo unico registro, i valori di H e L sono mascherati nel registro e devono semplicemente essere separati l'uno dall'altro (nibble più alto / inferiore?).

Sarei profondamente grato se qualcuno può renderlo più chiaro per me perché voglio solo avere qualche conoscenza di background (come tutte queste cose funzionano internamente) così è molto importante per me che so cosa sto facendo.

È stato utile?

Soluzione

Poiché i commenti hanno sottolineato, il fatto che l'implementazione che hai trovato memorizza i registri H & L insieme come l'entità a 16 bit HL e poi si decompone che in H spostando il passaggio a destra e in l mascherare è puramente un'implementazione specifico.

L'originale Z80 ha un ALU a 4 bit (vedere i commenti di Shima a partire dal fondo della pagina 9 in questa trascrizione del pannello del museo della cronologia del computer ) in modo che in realtà sarebbe (i) e i bassi quattro bit di L e l'accumulatore; Quindi (ii) e gli alti quattro bit di L e l'accumulatore. Tuttavia espone i suoi registri come entità discrete a 8 bit in modo che l'implementazione interna sia interamente nascosta.

HL è chiamato una coppia di registro perché sono due registri presi insieme per creare una quantità a 16 bit. Ignorando i registri dell'ombra e dell'indice, l'originale Z80 ha in realtà tre di quelle - HL, BC e DE. BC e DE sopravvive nella CPU di GameBoy come coppie alternative per il caricamento indiretto (come OPCODE 0x1A - LD A, (BC)) e per aritmetico a 16 bit (ad esempio, 0x09 aggiungi HL, BC) e avere alcuni altri usi su A Z80.

SP e PC sono generalmente considerati come registri indivisibili a 16 bit (però, ovviamente, è possibile dividerli memorizzandoli in memoria e leggere i byte indietro singolarmente) e AF esiste per spingere e spuntare ma f è un tale speciale Caso che l'AF non è solitamente utile come un numero intero a 16 bit.

breve riassunto Allora: non hai problemi con la comprensione della comprensione del modo in cui OPCODE devono essere implementati, semplicemente come sono stati implementati da un particolare autore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top