Nachtrag:
Beschreibe bitte detailliert den Inhalt aller Register bei Aufruf von
"main" - was steht beispielsweise in U? Da Du den User-Stack
verwendest, sollte der auch initialisiert sein.
Warum verwendest Du den Userstack? Das Carry-Flag solltest Du auch
anderswo aufheben können, schlimmstenfalls auf dem normalen Stack, den
Du ja auch verwendest (mit JSR).
Achja, und was macht DEL_Xms und wo ist der Quelltext davon?
Hat Dein ROM-Monitor etwa in der Gegend von $3000 eine Art
Einsprungtabelle?
Warum verwendest Du LBNE, wenn bei Deiner Codegröße auch BNE
funktionieren würde?
In Zeile 23 ist LBNE übrigens falsch geschrieben.
Deine Hand-Assemblierung der beiden Branch-Befehle ist nicht in
Ordnung; Branch adressiert relativ zum Programmzähler.
Du schreibst
0247 LBNE lauf_links
(lauf_links ist bei 0238), und übersetzt das mit dem Opcode 10 26 02
38. Das springt an die Adresse 047F (0247 + 0238)
Tatsächlich aber müsstest Du den PC nicht um 0238 erhöhen, sondern um
000F reduzieren, so daß Dein Opcode besser 10 26 FF F0 lauten sollte.
Der 16-Bit-Offset ist hier aber ganz unnötig, so daß Dein Programm
durch die Verwendung von BNE um jeweils zwei Bytes kürzer wird:
0247 BNE lauf_links, was sich mit 26 F0 übersetzen lassen müsste.
Es ist bei mir schon seeehr lange her, daß ich mich das letzte Mal mit
6809-Assembler beschäftigt habe; meine Berechnung der Sprungziele bei
Branch-Befehlen mag ungenau sein und um einige Bytes danebenliegen.
Du solltest in Deiner Dokumentation des 6809 noch mal genau nachlesen,
wie exakt die Branch-Befehle funktionieren.
Es gibt beim 09 keine absolut adressierenden bedingten Sprünge, wie sie
von anderen Prozessoren wie Z80 etc. her bekannt sind. JMP und JSR sind
die Ausnahmen.
Dank BSR (und LBSR) lassen sich übrigend Programme vollkommen
relokatibel schreiben, das bedeutet, daß das Programm funktioniert,
egal, an welche Adresse im Speicher es in übersetzter Form geladen
wird.