Question

C'est le week-end, alors je me détends de passer toute la semaine à programmer en écrivant un projet de loisir.

J'ai écrit hier le cadre d'un émulateur de processeur MOS 6502, les registres, la pile, la mémoire et tous les codes d'opération sont implémentés. (Lien vers la source ci-dessous)

Je peux exécuter manuellement une série d'opérations dans le débogueur que j'ai écrit, mais j'aimerais charger une rom NES et pointer simplement le compteur du programme sur ses instructions. J'ai pensé que ce serait le moyen le plus rapide de trouver des opcodes défectueux. .

J'ai écrit un chargeur de rom NES rapide et chargé les banques de ROM dans la mémoire du processeur.

Le problème est que je ne sais pas comment les opcodes sont codés. Je sais que les codes d'opération eux-mêmes suivent un modèle d'un octet par code d'opération qui identifie de manière unique le code d'opération,

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

etc

Cependant, je ne sais pas où je suis supposé trouver l'argument de code d'opération. Est-ce que l'octet suit directement? En mémoire absolue, je suppose que ce n'est peut-être pas un octet, mais un court.

Quelqu'un connaît-il le modèle de mémoire de ce processeur?

EDIT: Je me rends compte que cela a probablement été tourné dans le noir, mais j’espérais qu’il y aurait quelques hackers Apple et Commodore oldschool qui se cachent ici.

MODIFIER: merci de votre aide à tous. Après avoir mis en œuvre les modifications appropriées pour aligner chaque opération, la CPU peut charger et exécuter Mario Brothers. Il ne fait rien d’attendre la boucle en attendant Start, mais c’est bon signe:)

J'ai téléchargé la source:

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

Si vous vous êtes déjà demandé comment fonctionne un émulateur, il est très facile à suivre. Pas optimisé du tout, mais encore une fois, je suis émuler un processeur qui fonctionne à 2 MHz sur une machine 2,4 GHz:)

Était-ce utile?

La solution

L'opcode prend un octet et les opérandes sont dans les octets suivants. Consultez la colonne de taille en octets ici , par exemple.

Autres conseils

Si vous recherchez des références telles que http://www.atarimax.com /jindroush.atari.org/aopc.html , vous verrez que chaque opcode a un codage spécifié comme suit:

HEX LEN TIM

HEX est votre opcode à 1 octet. Immédiatement après, il s'agit de LEN octets de son argument. Consultez la référence pour voir quels sont ces arguments. Les données TIM sont importantes pour les émulateurs - c'est le nombre de cycles d'horloge que cette instruction prend pour s'exécuter. Vous en aurez besoin pour que votre timing soit correct.

Ces valeurs (LEN, TIM) ne sont pas codées dans l'opcode lui-même. Vous devez stocker ces données dans votre programme loader / executer. C'est juste une grande table de consultation. Vous pouvez également définir un mini-langage pour coder les données et le lecteur.

Ce livre pourrait vous aider: http://www.atariarchives.org/mlb/

Essayez également d’examiner tout autre assembleur / simulateur / débogueur 6502 pour voir comment Assembly est codé en tant que langage machine.

Les manuels 6502 sont sur le Web, sur divers sites historiques. Le KIM-1 expédié avec eux. Peut-être plus en eux que vous devez savoir.

Les roms d’Apple II incluaient un désassembleur, je crois que c’était ainsi qu’il s’appelait, et il vous montrerait dans un format agréable les opcodes hex, l’opcode à 3 caractères et les opérandes.

Donc, étant donné le peu de mémoire disponible, ils ont réussi à insérer dans le nombre d'octets d'opérande (toujours 0, 1 ou 2) l'opcode à 3 caractères de l'ensemble du jeu d'instructions 6502 dans un espace très restreint, car il n'y a pas beaucoup de celui-ci.

Si vous pouvez déterrer une ROM Apple II, vous pouvez simplement couper et coller à partir de là ...

Le 6502 a différents modes d’adressage, une même instruction a plusieurs opcodes différents selon son mode d’adressage. Consultez les liens suivants qui décrivent les différentes manières dont un 6502 peut extraire des données de la mémoire ou directement de la ROM.

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

C'est mieux - matrice 6502 Jeu d'instructions:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top