Dies ist ein bisschen inspiriert von der Intel 8086-Herausforderung, die auch hier stattfindet, aber ich dachte, eine 6502-Herausforderung wäre auch interessant.
Die Herausforderung
Ich dachte, es würde Spaß machen, die Ergebnisse zu sehen. Dieser ist offensichtlich in Richtung der fortgeschritteneren Seite des Spektrums. Die Herausforderung besteht darin, einen eigenen 6502-CPU-Emulator zu schreiben. Dazu gehört natürlich das Verstehen des Befehlssatzes und des Codierungsformats. Ressourcen sind unten verlinkt. Der 6502 ist einer der am einfachsten zu emulierenden Prozessoren der realen Welt. Für diese Herausforderung brauchen Sie sich keine Gedanken über das Timing der Zyklen zu machen, wenn Sie nicht möchten - aber das ist immer ein Pluspunkt!
KOPIEREN SIE NICHT DEN CODE EINES ANDEREN !! Natürlich können Sie auch einen Blick auf andere Emulatoren werfen, um das zu verstehen, aber kein Kopieren und Einfügen! :)
Sobald Ihr Code funktioniert, können Sie jederzeit noch einen Schritt weiter gehen und ihn in einen Apple II-Emulator oder NES, C64, VIC-20 oder eines der anderen Milliarden alter 6502-basierter Systeme von damals verwandeln.
Testen Sie Ihren Emulator
Ich habe eine 6502-Testsuite kompiliert, deren Quellcode ich hier gefunden habe: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Meine kompilierte Version kann hier heruntergeladen werden: http://rubbermallet.org/AllSuiteA.zip
Laden Sie die 48-KB-Binärdatei für 4000 US-Dollar in den Speicher Ihres Emulators. Darunter verbleiben 16 KB Lese- / Schreib-RAM. Wenn der Test beendet ist, sollte der Wert in Adresse $ 0210 $ FF sein, wenn Ihre CPU bestanden hat. Sie werden wissen, dass der Test beendet ist, wenn der Programmzähler (PC) die Adresse $ 45C0 erreicht hat.
Weitere Tests sind auch hier verfügbar: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Interaktiver damit umgehen
Sobald Ihre CPU funktioniert, werden Sie wahrscheinlich mehr Spaß haben, als auf die Testausgabe zu starren! Ich habe ein ROM-Image von Enhanced BASIC für den 6502 kompiliert. Es ist 16 KB groß, daher sollten Sie es in $ C000 Ihres emulierten Speicherplatzes laden, Ihren virtuellen 6502 zurücksetzen und mit der Ausführung beginnen.
Laden Sie diese ZIP-Datei herunter, die ehbasic.bin enthält: http://rubbermallet.org/ehbasic.zip
Die Art und Weise, wie EhBASIC mit Ein- und Ausgängen umgeht, ist sehr einfach. Wenn ein Zeichen in die Konsole geschrieben werden soll, wird das Byte in den Speicherort $ F001 geschrieben. Wenn Ihr Emulator sieht, dass der 6502 versucht, an diesen Speicherort zu schreiben, drucken Sie diesen Zeichenwert einfach mit einem printf ("% c", value) auf die Konsole . oder wie auch immer Sie möchten. (Diese Herausforderung ist natürlich nicht auf C beschränkt)
Wenn es nach einem Zeichen fragt, das von der Konsole eingegeben wird, ist es ziemlich ähnlich. Es liest weiter vom Speicherort $ F004, an dem der nächste ASCII-Zeichenwert von der Tastatur auf das Lesen wartet. Wenn keine weitere Eingabe zum Lesen vorhanden ist, sollte der Wert Null zurückgegeben werden.
EhBASIC fragt den Wert an dieser Stelle ab, bis er nicht mehr Null ist. Dadurch wird angezeigt, dass das Byte eine gültige Tastatureingabe ist. Aus diesem Grund sollte der Emulator dort Null zurückgeben, wenn keine Eingabe mehr zu lesen ist. EhBASIC dreht sich darauf bis zum nächsten gültigen Schlüssel, wenn nach einer Eingabe gesucht wird.
Wenn Sie diesen Wert nicht auf Null setzen, nachdem er den letzten Schlüsselwert gelesen hat, wird er wiederholt, als ob Sie die Taste gedrückt halten. Achten Sie also darauf, dass Sie dies korrekt tun!
Wenn Ihr Emulator ordnungsgemäß funktioniert, wird auf Ihrer Konsole Folgendes gedruckt, wenn das ROM-Image ausgeführt wird:
6502 EhBASIC [C]old/[W]arm ?
Drücken Sie C und anschließend die Eingabetaste. Folgendes sollte angezeigt werden:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Die freien Bytes mögen für Sie unterschiedlich sein, aber in meinem Emulator habe ich den beschreibbaren Speicherbereich auf eine Obergrenze von 32 KB begrenzt. Sie könnten wirklich bis zu dem Punkt gehen, an dem das ROM beginnt, dh bis zur 48-KB-Marke.
6502 CPU-Ressourcenverknüpfungen
Hier sind einige Ressourcen, die Ihnen genügend Informationen zum Arbeiten geben sollten:
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 <- Dieser hat einige sehr interessante Informationen
http://en.wikipedia.org/wiki/MOS_Technology_6502
Wenn Sie Fragen haben oder weitere technische Informationen benötigen, können Sie mich gerne kontaktieren. Es gibt auch eine enorme Fülle anderer 6502-Informationen im Web. Google ist dein Freund!
quelle
Antworten:
Dachte, ich würde weitermachen und meine eigene Implementierung posten. Es ist VOLLSTÄNDIG ungolfed, aber es ist eine vollständige Implementierung.
quelle
Ein MOS 6502-Emulator in Haskell. Features sind:
Dies ist eine etwas golferische Version einer vollständigen Implementierung (mit mehr Funktionen), die ich für diese Herausforderung gemacht habe, die ich später veröffentlichen werde. Trotz des Golfs ist der Code immer noch einfach. Einzige bekannte fehlende Funktion ist der BCD-Modus (kommt ...)
Führt den ehBASIC-Code aus:
Und der Code, bei weniger als 300 Zeilen insgesamt:
quelle
Für alle Interessierten dachte ich, ich würde meine Implementierung des 6502 in C # teilen. Wie bei anderen Posts hier ist es völlig ungolfed, aber es handelt sich um eine vollständige Implementierung.
Ich habe dieses Projekt gestartet, indem ich eine Tabelle mit Anweisungen erstellt habe, als ich das erste Mal etwas über die CPU gelernt habe. Ich erkannte, dass ich diese Tabelle verwenden könnte, um mir das Tippen zu ersparen. Ich habe daraus eine Textdatei-Tabelle gemacht, die der Emulator lädt, um die Zyklen zu zählen und die Ausgabe zu vereinfachen.
Das gesamte Projekt ist unter Github https://github.com/amensch/e6502 verfügbar
quelle