C'est un peu inspiré par le défi Intel 8086 qui est également ici, mais je pensais qu'un défi 6502 serait également intéressant.
Le défi
Je pensais que ce serait amusant de voir les résultats. Celui-ci est évidemment vers le côté le plus avancé du spectre. Le défi consiste à écrire votre propre émulateur de processeur 6502. Cela implique, bien sûr, de comprendre son jeu d'instructions et son format de codage. Les ressources sont liées au bas de cela. Le 6502 est l'un des processeurs du monde réel les plus faciles à émuler. Aux fins de ce défi, vous n'aurez pas à vous soucier de la durée du cycle si vous ne le souhaitez pas - mais c'est toujours un avantage à inclure!
NE COPIEZ PAS LE CODE D'AUTRE PERSONNE !! Bien sûr, vous pouvez certainement jeter un œil à d'autres émulateurs pour vous aider à comprendre, mais pas de copier-coller! :)
Une fois que votre code fonctionne, vous pouvez toujours faire un effort supplémentaire si vous le souhaitez et le transformer en un émulateur Apple II, ou NES, C64, VIC-20 ou l'un des milliards d'autres anciens systèmes 6502 à partir de la journée.
Test de votre émulateur
J'ai compilé une suite de tests 6502 dont j'ai trouvé le code source ici: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Ma version compilée peut être téléchargée ici: http://rubbermallet.org/AllSuiteA.zip
Chargez le binaire de 48 Ko dans l'espace mémoire de votre émulateur à 4000 $, ce qui laisse 16 Ko de RAM en lecture-écriture en dessous. Une fois le test terminé, la valeur de l'adresse $ 0210 doit être $ FF, si votre processeur a réussi. Vous saurez que le test est terminé lorsque le compteur de programmes (PC) a atteint l'adresse 45C0 $.
D'autres tests sont également disponibles ici: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Faire quelque chose de plus interactif avec
Une fois que votre CPU fonctionne, vous voudrez probablement faire quelque chose de plus amusant que de regarder la sortie de test! J'ai compilé une image ROM Enhanced BASIC pour le 6502. Il s'agit de 16 Ko, vous devez donc le charger dans $ C000 de votre espace mémoire émulé, réinitialiser votre 6502 virtuel et commencer l'exécution.
Téléchargez ce ZIP, qui contient ehbasic.bin: http://rubbermallet.org/ehbasic.zip
La façon dont EhBASIC gère les entrées / sorties est très simple. Lorsqu'il veut écrire un caractère sur la console, il écrit l'octet dans l'emplacement mémoire $ F001. Ainsi, lorsque votre émulateur voit le 6502 essayer d'écrire à cet emplacement, imprimez simplement cette valeur de caractère sur la console avec un printf ("% c", valeur); ou comme vous le souhaitez. (Ce défi n'est pas limité à C bien sûr)
Quand il interroge un personnage entré depuis la console, c'est assez similaire. Il continue à lire à partir de l'emplacement de mémoire $ F004, où vous devriez avoir la prochaine valeur de caractère ASCII du clavier en attente de lecture. S'il n'y a plus d'entrée à lire, il doit retourner une valeur nulle.
EhBASIC interroge la valeur à cet emplacement jusqu'à ce qu'elle soit différente de zéro, ce qui lui permet de savoir que l'octet est une entrée de clavier valide. C'est pourquoi s'il n'y a plus d'entrée à lire, l'émulateur devrait y retourner zéro. EhBASIC tournera dessus jusqu'à la prochaine clé valide lorsqu'il cherchera une entrée.
Si vous n'effacez pas cette valeur à zéro après avoir lu la dernière valeur de clé, cela la fera se répéter comme si vous mainteniez la touche enfoncée, alors faites attention à le faire correctement!
Si votre émulateur fonctionne correctement, voici ce que vous verrez imprimé sur votre console lors de l'exécution de l'image ROM:
6502 EhBASIC [C]old/[W]arm ?
Appuyez sur C, puis appuyez sur Entrée et vous devriez voir:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Les octets libres peuvent être différents pour vous, mais dans mon émulateur j'ai limité la zone de mémoire inscriptible à un plafond de 32 Ko. Vous pouvez vraiment aller jusqu'au début de la ROM, qui est la marque de 48 Ko.
6502 liens de ressources CPU
Voici quelques ressources qui devraient vous donner suffisamment d'informations pour travailler avec:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- celui-ci a des informations très intéressantes
http://en.wikipedia.org/wiki/MOS_Technology_6502
Si vous avez des questions ou avez besoin de plus d'informations techniques, n'hésitez pas à me les poser. Il existe également une multitude d'autres 6502 informations sur le Web. Google est ton ami!
la source
Réponses:
Je pensais que j'irais de l'avant et publierais ma propre mise en œuvre. Il est ENTIÈREMENT non golfé, mais c'est une implémentation complète.
la source
A MOS 6502 emulator in Haskell. Features include:
Il s'agit d'une version quelque peu golfique d'une implémentation complète (avec plus de fonctionnalités) que j'ai faite pour ce défi que je publierai plus tard. Malgré le golf, le code est toujours simple. La seule fonction manquante connue est le mode BCD (à venir ...)
Exécute le code ehBASIC:
Et le code, à moins de 300 lignes au total:
la source
Pour toute personne intéressée, je pensais partager mon implémentation du 6502 en C #. Comme pour les autres articles ici, il est complètement non golfé mais est une mise en œuvre complète de la fonctionnalité.
J'ai commencé ce projet en créant une feuille de calcul d'instructions lorsque j'ai découvert le processeur pour la première fois. J'ai réalisé que je pouvais utiliser cette feuille de calcul pour me sauver de la frappe. J'ai transformé cela en un tableau de fichiers texte que l'émulateur charge pour aider à compter les cycles et pour une sortie de démontage facile.
L'ensemble du projet est disponible sur Github https://github.com/amensch/e6502
la source