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
wird dann sowas generiert:
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