Beiträge von Diddl im Thema „An welcher Adresse laufe ich?“

    ...oder es patcht sich einfach selbst entsprechend, nachdem es wie hier beschrieben die eigene Ladeadresse herausgefunden hat. Wär ne spannende Fingerübung, so einen Patcher zu basteln. :)

    Das wäre gar nicht mal so wild.

    Wenn man erst mal weiß, wo man läuft, errechnet sich leicht ein Offset.

    Wenn man eine Tabelle aller absoluten Adressen hat, kann man sich selbst relativ einfach patchen.

    Aber so weit muss man ja gar nicht gehen.

    Im Grunde genügt es, sich selbst in den Zieladressbereich zu verschieben und neu zu starten.

    Ein solches Programm läuft ja - egal ob mit oder ohne diese gefragte Überprüfung - nur mit relativen Sprüngen bzw. ganz ohne Sprünge.

    Ja richtig.

    Mit relativen Sprüngen alleine wäre es relocatibel.

    Eine Sprungweite von +-127 Byte ist halt bitter.

    Aber damit könnte ich leben, aber ohne JSR ist es halt nicht lustig ... :D

    Also JSR und PC vom Stack holen geht nicht.

    Das geht schon, wenn Du zuvor eine Hilfsroutine an eine bekannte Stelle schreibst:

    Im Anschluß steht in X/Y die Adresse I_AM_HERE - 1.

    Ja genau, das war auch meine erste Idee.

    Funktioniert auch.

    Es ist allerdings sehr umständlich, weil ich ja Byte für Byte schreiben muss ...


    Am Ende ist das dann optimiert nur noch ein einziger Befehl an der bekannten Adresse: RTS

    Alles andere kann man dann auch wieder im Hauptprogramm machen.

    Wenn man davon ausgehen kann, dass das Kernal oder BASIC ROM verfügbar ist, kann man auch ein RTS da nutzen.

    Oder ganz raffiniert, einfach gucken ob ein RTS im ROM auch da ist und das verwenden,

    Alternativ ist wahrscheinlich die CHRGET Routine in der Zero Page vorhanden, da gibt es ein RTS.

    Alternativ, wenn kein ROM und kein CHRGET verfügbar ist, kann man immer noch in eine freie ZP Adresse ein RTS schreiben ...


    Das ist es wohl dann.

    Oder kommt noch eine gute Idee, habe ich irgendwas übersehen, ein spezieller Trick?

    Die Motorola 6809 hat mit relokatiblen Code kein Problem.

    • es gibt relative Sprünge mit 16 Bit Distanz
    • es gibt relativen Unterprogramm Aufruf: BSR

    Insofern kann ich da Code schreiben, der an jeder Adresse laufen kann.


    Mich interessiert nur, was man in dieser Richtung mit der 6502/6510 machen könnte, trotz aller Einschränkungen dieser Architektur.

    Wenn dein JSR an einer definitiven Stelle steht, kannst du doch das Offset zum Programmbeginn bestimmen. Nicht?

    Nee das JSR steht an einer unbekannten Adresse.

    Das Offset zum Programmbeginn könnte ich bestimmen.

    Aber was hilft mir das, wenn ich die Adresse des Programmbeginn nicht kenne?

    Wie kann ein Programm feststellen, an welcher Adresse es gerade läuft?

    - 6510 Assembler - C64

    Zusätzliche Erschwernis, es läuft gerade nicht an der geplanten Adresse.

    Also JSR und PC vom Stack holen geht nicht.

    Andere CPUs erlauben meist den Zugriff auf oder über den PC.

    Bei der 6510 ist das aber leider nicht so.

    Wie würdet ihr dieses Problem lösen?