Prozessor-Emulator, wo anfangen?



  • Hiho

    In der Vergangenheit habe ich schon ein paar kleine Interpreter geschrieben in C++, die in einer rudimentären high-level VM liefen. Mit high-level ist gemeint, dass diese z.B. Hashtables mit Symbolen haben aber nicht tatsächliche Prozessorregister oder Cache.
    Ich denke, ich wäre bereit dafür, einen low-level Emulator für eine Prozessorarchitektur zu schreiben. Was ich jedoch nicht weiß, ist, wo ich dabei anfangen soll. Etwas Existierendes wie x86 ist unbeschreiblich umfangreich. Aber wenn ich mir hingegen selbst ein Modell und die Instruktionen ausdenke, dann habe ich keinen interessanten Code, den ich auf dieser Architektur ausführen kann. Einen C-Compiler für diese Architektur zu schriben, mute ich mir eher nicht zu. Von Backends oder IRs und dergleichen habe ich nur sehr wenig Ahnung.
    Kann mir jemand hierzu Tipps geben oder gibt es eine Standard-Antwort hierfür?

    LG



  • du kannst ja einen primitiven 8-bitter nachbauen, z.b. den 6502. das ist nicht so schwer und wurde schon oft gemacht.



  • swapper schrieb:

    du kannst ja einen primitiven 8-bitter nachbauen, z.b. den 6502. das ist nicht so schwer und wurde schon oft gemacht.

    Danke schonmal, swapper!
    Meine kurze Recherche hat ergeben, dass eine Variation dieser CPU im NES verbaut ist. Daraus schließe ich, dass es für diese Architektur ein hinreichendes Ecosystem, mitsamt Compiler, Debugger etc., gibt. Und weil die NES eine Spielekonsole war, gehe ich auch davon aus, dass es genug Funktionalität für Graphik-Programmierung gibt, richtig?
    Ich habe irgendwo gelesen, dass es für diese CPU auch viele undokumentierte Instruktionen gibt; stellt das ein Problem dar?



  • architekt schrieb:

    Etwas Existierendes wie x86 ist unbeschreiblich umfangreich.

    Nö. Beschränke dich einfach auf die 8086 Architektur.
    Die ist noch problemlos überschaubar.

    Allerdings muss man bei der mit segmentierter Programmierung arbeiten, was heutzutage eher unschön ist. Da sich das ganze aber wohl eher um ein Machbarkeitsprojekt handelt, reicht das völlig. Den RAM, den du bei der Segmentierten Programmierung hast, denn wirst du bei so kleinen Miniprogrämmchen wohl kaum sprengen.

    Wenn du dir aber den Aufwand machen willst, dann probier es mit der 80386 Architektur. Dann hast du wenigstens den Protected Mode und so etwas wie Paging zur Verfügung.
    Das ist schonmal deutlich umfangreicher als nur die 8086 Architektur, aber MMX, SSE, die XMM Register und Co hast du da noch längst nicht.

    Alternativ könntest du auch eine andere Prozessorarhcitektur nehmen.
    z.B. den MSP430 von Texas Instrument.
    Der hat ein flaches Speichermodell und ist eine 16 Bit CPU.


  • Mod

    architekt schrieb:

    Ich habe irgendwo gelesen, dass es für diese CPU auch viele undokumentierte Instruktionen gibt; stellt das ein Problem dar?

    Beantwortet sich die Frage nicht von selbst? Es stellt dann und nur dann ein Problem dar, wenn ein Programm ein solches "Feature" nutzt und du keine Dokumentation dazu findest. Beides sind durchaus realistische Szenarien wenn es um die exakte Simulation von trickreichen Programmen geht, aber weniger, wenn es darum geht, irgendwelche Wald- und Wiesensoftware in dem Emulator laufen zu lassen. Tatsächlich ist es quasi die hohe Kunst der Emulatorszene, diese Details korrekt hin zu bekommen. Insofern ist es heutzutage nicht mehr ganz so unmöglich, Dokumentation dazu zu finden, da wahrscheinlich irgendwo auf der Welt schon jemand mit viel Arbeit herausgefunden hat, wie etwas genau funktioniert.

    Zum Thema: Ich würde mir nicht zu viele Gedanken um die beste Wahl der Architektur machen, die du emulieren möchtest, sondern lieber mal anfangen. Ob 8086, 6502 oder MSP430 ist doch letztlich egal. Alle solltest du mit etwas Arbeit hin bekommen (oder du falls nicht, dann weißt du, dass das Thema vorerst nichts für dich ist) und keiner davon ist eine wesentlich bessere oder schlechtere Wahl als die anderen. Wenn du einen davon emulieren kannst, dann kannst du die anderen auch hin bekommen.



  • architekt schrieb:

    Etwas Existierendes wie x86 ist unbeschreiblich umfangreich.

    Beim ioccc gab es 2013 eine Emulation eines 8086 PC mitsamt typischer Hardware in 4043 Bytes C.


Anmelden zum Antworten