Hallo Besucher, der Thread wurde 511 mal aufgerufen und enthält 1 Antwort

letzter Beitrag von JeeK am

Automatisches Einfügen einer Longbranch-Konstruktion bei ca65-Assemblierung

  • Manchmal passiert es ja dass sich ein Branch (BEQ,BNE, BCS, BCC, BMI, BPL) nicht mehr ausgeht. Auf der 6502er-Architektur braucht man dann ein umgekehrtes Branch, ein JMP und ein Label.


    Wenn der Branch nach hinten geht kann man sich ein Assemblermakro schreiben, dass bei Rangeverletztungen automatisch den Branch durch den invertierten Branch und ein JMP ersetzt.


    also statt

    Code
    1.     BNE nach_weit_hinten

    wird dann sowas generiert:

    Code
    1.     BEQ :+
    2.     JMP nach_weit_hinten
    3. :

    Beim nach vorne springen weiß der Assembler zu dem Zeitpunkt aber leider noch nicht dass es sich nicht ausgehen wird und man bekommt eine Fehlermeldung wie diese testlongbranch.s(4): Error: Range error (129 not in [-128..127])

    Da die Longbranch-Konstruktion umständlicher, langsamer und größer ist soll sie natürlich nur dort verwendet werden wo es notwendig ist.


    Meine Frage ist: hat schon jemand etwas gehackt das in solchen Fällen den Quellcode in Zeile 4 (aus der Fehlermeldung ersichtlich) in eine Long Branch-Konstruktion umschreibt und dann neu assembliert?

    Meine Idee ist, die Fehlermeldung zu parsen und eine Kopie des Quelltextes zu erstellen in denen in der betreffenden Zeile Bxx label durchByy :+ <br> JMP label <br> : ersetzt wird. Das ggf. mehrere Male, da eine Ersetzung eines Branch durch eine Longbranch-Konstruktion möglicherweise ein anderes Branch aus seiner Reichweite bringt.


    P.S.: ich weiß schon dass man als Assemblerprogrammierer sowas normalerweise immer von Hand fixed, aber ich bin einfach zu faul und darum mach ich mir mehr Arbeit :-)

  • Vielleicht mit einem Makro, das abhängig von der Sprungweite ein Bxx oder Byy+JMP erzeugt.

    Z. B. wie in ACME im C64-Wiki als Beispiel angeführt.

    Das kann freilich auch noch zu uneindeutigen Zuständen führen. ACME macht da ja ergänzende Durchläufe, um zu einer Auflösung zu kommen. Das könnte natürlich zu einer Kettenreaktion führen, wo kaskadierte Makros im Dominoeffekt alle der Reihe nach von kurz auf lang umkippen. Fraglich, inwieweit hier ein Assembler hier Schritt halten kann.

    Theoretisch wäre ein Fehlerbehandlungsmechanismus im Assembler praktisch, wo man benutzerdefiniert Assembler-Fehler abfangen könnte ...