Domanda

È il fine settimana, quindi mi rilasso dal passare tutta la settimana a programmare scrivendo un progetto per hobby.

Ieri ho scritto il framework di un emulatore di CPU MOS 6502, i registri, lo stack, la memoria e tutti gli opcode sono implementati. (Link alla fonte di seguito)

Posso eseguire manualmente una serie di operazioni nel debugger che ho scritto, ma mi piacerebbe caricare una rom NES e puntare il contatore del programma alle sue istruzioni, ho pensato che questo sarebbe il modo più veloce per trovare codici operativi difettosi .

Ho scritto un rapido caricatore di rom NES e ho caricato i banchi ROM nella memoria della CPU.

Il problema è che non so come sono codificati gli opcode. So che gli stessi codici operativi seguono uno schema di un byte per codice operativo che identifica in modo univoco il codice operativo,

0 - BRK
1 - ORA (D,X)
2 - COP b

etc

Tuttavia non sono sicuro di dove dovrei trovare l'argomento opcode. È il byte che segue direttamente? Nella memoria assoluta, suppongo che potrebbe non essere un byte ma un corto.

Qualcuno ha familiarità con il modello di memoria di questa CPU?

EDIT: mi rendo conto che questo è probabilmente girato al buio, ma speravo che ci fossero alcuni hacker Apple e Commodore di vecchia scuola in agguato qui.

MODIFICA: Grazie per il vostro aiuto a tutti. Dopo aver implementato le modifiche appropriate per allineare ogni operazione, la CPU può caricare ed eseguire Mario Brothers. Non fa altro che loop in attesa di Start, ma è un buon segno :)

Ho caricato la fonte:

https://archive.codeplex.com/?p=cpu6502

Se qualcuno si è mai chiesto come funziona un emulatore, è abbastanza facile da seguire. Non ottimizzato per niente, ma poi di nuovo, sto emulando una CPU che gira a 2mhz su una macchina da 2.4ghz :)

È stato utile?

Soluzione

Il codice operativo richiede un byte e gli operandi sono nei seguenti byte. Controlla la colonna delle dimensioni dei byte qui , ad esempio.

Altri suggerimenti

Se cerchi riferimenti come http://www.atarimax.com /jindroush.atari.org/aopc.html , vedrai che ogni codice operativo ha una codifica specificata come:

HEX LEN TIM

HEX è il tuo codice operativo a 1 byte. Immediatamente dopo sono LEN byte del suo argomento. Consultare il riferimento per vedere quali sono questi argomenti. I dati TIM sono importanti per gli emulatori: è il numero di cicli di clock che questa istruzione richiede per eseguire. Ne avrai bisogno per ottenere i tuoi tempi corretti.

Questi valori (LEN, TIM) non sono codificati nel codice operativo stesso. È necessario memorizzare questi dati nel proprio caricatore / programma. È solo una grande tabella di ricerca. Oppure puoi definire un mini-linguaggio per codificare i dati e il lettore.

Questo libro potrebbe aiutare: http://www.atariarchives.org/mlb/

Inoltre, prova ad esporre qualsiasi altro 6502 aseembler / simulator / debugger là fuori per vedere come Assembly viene codificato come linguaggio macchina.

I manuali 6502 sono sul Web, in vari siti storici. Il KIM-1 è stato spedito con loro. Forse più in loro di quanto tu abbia bisogno di sapere.

Le rom di apple II includevano un dissassemblatore, penso che sia stato chiamato così, e ti mostrerebbe in un bel formato i codici operativi esadecimali, il codice operativo a 3 caratteri e gli operandi.

Quindi, data la poca memoria disponibile, sono riusciti a inserire nel conteggio dei byte dell'operando (sempre 0, 1 o 2) il codice operativo a 3 caratteri per l'intero set di istruzioni 6502 in uno spazio davvero piccolo, perché non c'è davvero molto di esso.

Se riesci a scavare una rom di apple II, puoi semplicemente tagliare e incollare da lì ...

Il 6502 ha diverse modalità di indirizzamento, la stessa istruzione ha diversi codici operativi a seconda della sua modalità di indirizzamento. Dai un'occhiata ai seguenti link che descrivono i diversi modi in cui un 6502 può recuperare i dati dalla memoria o direttamente dalla ROM.

http://obelisk.me.uk/6502/addressing.html#IMM

Questo è meglio - 6502 matrice set di istruzioni:

https://www.masswerk.at/6502/6502_instruction_set.html

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