Immagino che tu non abbia mai avuto il piacere di un corso universitario in cui hai dovuto auto-assemblare e disassemblare il tuo codice, o progettare una CPU. È noioso, ma in realtà non così difficile.
Prendiamo come esempio il Microchip PIC set di istruzioni , che ho scelto perché è molto semplice, solo 35 istruzioni. Se si guarda la colonna "14-bit instruction word" nella tabella a pagina 3, questi sono i bit che in realtà vengono scritti in flash, ciò che viene utilizzato principalmente oggi anziché ROM. Ogni istruzione ha un prefisso fisso univoco. ADDWF
ha un prefisso di 00 0111
, ad esempio.
Un emulatore deve semplicemente controllare il valore dalla ROM rispetto a tutti i prefissi delle istruzioni finché non trova una corrispondenza, quindi analizza il resto dell'istruzione. Per ADDWF
, il bit d
diventa l'argomento d
e i bit f
diventano l'argomento f
. Quindi usi questi argomenti per fare un add in Javascript, qualcosa del tipo:
addwf = function(f, d) {
if (d == 0)
w = w + registers[f]
else
registers[f] = w + registers[f]
}
Naturalmente, ci sono anche dei bit di carry e tali da impostare, ma questa è l'idea di base per emulare una CPU. Per una console di gioco, devi anche emulare l'IO, ma ci sono documenti di specifiche tecniche su Internet per aiutarti a sapere come farlo. Ad esempio, scrivere un 0x0000ff
in una determinata posizione di memoria potrebbe trasformare un pixel specifico in blu. Il tuo emulatore quindi deve solo rilevare le scritture in quella posizione di memoria emulata dalla CPU emulata e tradurla in qualsiasi comando Javascript trasformi un pixel blu.
Questa è una grossolana semplificazione. Ci vuole una notevole quantità di lavoro di ottimizzazione per rendere un'emulazione abbastanza veloce da gestire il frame rate desiderato di un gioco, ma questi sono i principi di base.