Hello, Guest the thread was called2.9k times and contains 11 replays

last post from BastetFurry at the

Wie schreibe ich einen 6502 Assembler?

  • Hi,


    ich bastele zur Zeit an einem einfachen 6502-Emu, und wollte jetzt eine Art Monitor einbauen. Disassemblieren ist kein Problem, aber das Assemblieren (also: "LDA #$10" -> a9 10) bereitet mir etwas Schwierigkeiten. Genau gesagt, ich könnte zwar die Brute-Force-Methode anwenden (für jeden Opcode/Adressierungsmodus ne eigene Behandlung) aber es wird doch da bessere Methoden geben. Wie geht man sowas an?


    Ach ja, ich schreib das Ding in C. Und nein, es soll kein neuer C64-Emu bei rauskommen, ist nur was zum Lernen und basteln. :D

  • Den Acme hab ich mir schon angeschaut, aber der Sourcecode sieht für mich teilweise aus wie ne Modemstörung ;) Naja, vielleicht werd ich ja woanders fündig.


    Irgendwo hatte ich auch mal einen einfachen in C64-Basic geschriebenen 20-Zeiler gesehen, der ein in Data-Zeilen verpacktes Sourcelisting assembliert hat, also sooo kompliziert kann es dann ja nicht sein. Hab bloß keine Ahnung mehr wo das genau war.

  • Quote

    Original von kufi
    Irgendwo hatte ich auch mal einen einfachen in C64-Basic geschriebenen 20-Zeiler gesehen, der ein in Data-Zeilen verpacktes Sourcelisting assembliert hat, also sooo kompliziert kann es dann ja nicht sein. Hab bloß keine Ahnung mehr wo das genau war.


    Das kann imho nicht sein! Vermutlich war es ein Loader, der in Basic nur die Maschinensprache Daten in den Speicher geschaufelt hat und dann gestartet!


    Ciao,
    Lysander

  • Sorry, das ist nicht ganz richtig.
    Also ich kenne 2 Bücher mit Abdrücken des Quellcodes von Assembler / Reassembler.
    Vom Verlag Data Becker - Das große Commodore 64 Buch ( Autor: Hecht ) von 1990; beispielsweise.
    Hier ist das komplette Basiclisting eines 2 Pass Assemblers, eines ReAss und eines Monitores abgedruckt.


    gZ gour



    PS. Ich hab mir vor einigen Jahren mal die Mühe gemacht, den source abzutippeln. Hat bei dem Spagetthi codestyle aber außer blutigen fingerkuppen für mich nix gebracht ;-)

  • jaja, auch im DATA-Becker "Maschienensprachebuch für den C64" ist ein BASIC-Listing für einen Assembler; hab das aber noch nie abgetippt, oder näher angesehen...
    Prinzipiell stell ich mir das aber folgendermassen vor:
    Die einzelnen Opcodes sind ja 8Bit-Werte von 0-255 (wobei nicht alle gültige Opcodes sind!), eine Liste findest du im "Porgrammer's Reference Guide" oder anderer einschlägiger Literatur.
    Dann muß dein Assembler eben den Mnemonic erkennen und die dazugehörige Adressierungsart (Prüfe auf "#" vor dem Operand, Operand auf <256 prüfen --> Zeroppage, Komma nach dem Operand, Indexregister usw.) .
    Diie Aufteilung der Opcodes hat da schon irgendein System, weiß ich grad nicht auswendig, aber irgendwie der Art, z.B.: Bei unmittelbarer Adressierung ist immer Bit x gesetzt oder so...., d.h. du kannst den entsprechenden Opcode für die gewünschte Adressierungsart relativ leicht berechnen/ nachschlagen, da mußt du dir eben die Opcode-tabelle mal ganz genau durchsehen...
    Den Operand mußt du dann ja nur noch von ASCII in einen Binärwert umwandeln (dafür gibt es genügend Routinen) und evtl. in Hi/Lobyte zerlegen und abspeichern.


    Das sollte alles nicht soo schwierig sein, ich denke knifflig wirds erst, wenn Symbole benutzt werden, also Labels und dann die 2-Pass-Methode angewandt werden muss, aber so wie ich dich verstanden habe, brauchst du das ja gar nicht, oder?


    Wie das genau in C umgesetzt werden kann, kann ich dir leider nicht sagen, da ich C nur rudimentär kenne/ kann, sollte ja aber eigentlich kein Problem sein...

  • sind wir da etwas abgedriftet?
    Kufi, was ich nicht verstehe : du bastelst doch einen monitor und keinen assembler ... dachte ich ...
    der ist doch richtig einfach, vor allem; da das disassemblieren ja funktioniert. (dann hast du ja alles schon gemacht - wandeln opcode in mnemonic und ausgabe der daten etc,. assemblen funzt genauso ... die opcodes in records gehauen - byte opcodewert char(3) - Mnemonic --- nur jetzt net prüfen, ob match auf opcodewert sondern match auf Mnemo) ...


    Hannenz: naja, labels werden wie gehabt im ersten pass abgehandelt und absolut umgerechnet ... auch nicht wirklich ein Problem, ich sehe da jedenfalls keines.
    Eine Herausforderung dürften Macros darstellen.


    gZ gour

  • Quote

    Original von Lysander


    Das kann imho nicht sein! ...


    kufi hat recht, in der ausgabe 2/90 vom 64'er gabs diesen in basic geschriebenen mini-assembler, der nur 20(!) zeilen lang ist. das programm kann aber keine labels verarbeiten.


    ausserdem gabs in der ausgabe 12/89 auch einen dis-assembler in basic. beide programme habe ich sozusagen als beweis hier angehängt.