2011-09-07 13 views
5

Sto scrivendo un emulatore 68k interpretato come un progetto personale/educativo. In questo momento sto cercando di sviluppare un semplice meccanismo di decodifica generale.Decodifica istruzioni 68k

A quanto ho capito, i primi due byte di ciascuna istruzione sono sufficienti per identificare univocamente l'operazione (con due rare eccezioni) e il numero di parole da leggere, se presenti.

Ecco cosa desidero realizzare nella mia fase di decodifica:

1. read two bytes 
2. determine which instruction it is 
3. extract the operands 
4. pass the opcode and the operands on to the execute phase 

non può semplicemente passare i primi due byte in una tabella di ricerca come ho potuto con i primi bit di un arco RISC , perché gli operandi sono "nel modo". Come posso realizzare la parte 2 in modo generale?

In generale, la mia domanda è: Come si rimuove la variabilità degli operandi dal processo di decodifica?

più di fondo:

Ecco una tabella parziale dalla sezione 8.2 del di programmazione Manuale di riferimento:

Table 8.2. Operation Code Map 

Bits 15-12  Operation 
0000   Bit Manipulation/MOVEP/Immediate 
0001   Move Byte 
... 
1110   Shift/Rotate/Bit Field 
1111   Coprocessor Interface... 

Ciò ha grande senso per me, ma poi guardo i modelli di bit per ogni istruzioni e si noti che non esiste una singola istruzione in cui i bit 15-12 sono 0001, 0010 o 0011. Deve esserci qualche pezzo grosso dell'immagine che mi manca.

Questo sito Decoding Z80 Opcodes spiega esplicitamente la decodifica, che è qualcosa che non ho trovato nel manuale di riferimento del programmatore 68k o su Google.

+0

Quanto è cresciuto il tuo progetto, hai un disassemblatore o un emulatore? –

+0

Sto ancora costruendo uno script che genera una tabella di ricerca completa. Circa il 70% fatto. – mwcz

+0

@CountablyInfinite Stai lavorando a un progetto simile? – mwcz

risposta

2

Ho deciso di creare semplicemente una tabella di ricerca con ogni modello possibile per ogni istruzione. Era la mia prima idea, ma l'ho scartata come "sprecona, inelegante". Ora, lo accetto come "veramente veloce".

+1

Ah, la prima regola della codifica dell'emulatore: a volte l'approccio bruto-forza dall'aspetto sbronzo è il migliore uno. :) –

+1

E dipende tanto dalla CPU che esegue l'emulazione. Un L2 da 16 megabyte può fare miracoli. :) –