Hello, Guest the thread was viewed3.7k times and contains 5 replies

last post from will at the

Assemblerprogramm unabhängig von Speichererweiterung schreiben

  • Der VC20 hat ja, je nachdem welche Speichererweiterung drinsteckt seinen BASIC-Beginn bei 4097, bei 1025 oder bei 4609. D.h., ein Maschinenprogramm mit SYS-Zeile, das für die kleinste Speicherversion geschrieben ist funktioniert nicht mehr wenn es auf einem VC-20 mit Speichererweiterung geladen wird.
    Abgesehen vom SYS-Befehl ist es auch sehr schwierig, ein Maschinenprogramm voll relokatibel zu schreiben.


    Gibt es da einen Trick wie man ohne großen Overhead ein Programm hinkriegt das in Assembler geschrieben ist, mit LOAD und RUN gestartet wird, und unabhängig von der Speichererweiterung läuft?

  • Ich würde das so angehen: [...]

    Es gibt bei diesem flexiblen BASIC-Stub nur noch ein kleineres Problem in Bezug auf VICE: standardmäßig ist die Load-Option beim Autostart auf LOAD"*",8,1 gesetzt. Heißt, mit dem 'falschen' gesteckten Speicherausbau landet der SYS nur an der Ladeadresse aus dem PRG-File-Header und nicht an dem BASIC-Start, der durch den Speicherausbau vorgegeben ist. Damit findet der RUN-Befehl nichts was er gescheit ausführen kann. Da nutzt also jegliche Programmiertechnik, die relokatiblen Code erzeugt (oder erzeugen kann) einfach mal gar nix.


    In der Praxis wird es wohl nur darum gehen, daß man Programme für den nicht erweiterten VC auf robuste Weise ans laufen bringt, obwohl eine Speichererweiterung 'gesteckt' ist und VICE einem zusätzlich Knüppel zwischen die Beine wirft. Der umgekehrte Fall ('großes' PRG auf kleiner Maschine) wird aufgrund des zu erwarteten Speichermangels wohl kaum praxisrelevant sein.


    Das folgende Programm schreibt einen Bootloader auf Disk. Wenn dieser Bootloader mit ",8,1" geladen wird, schaltet er vorhandene Speichererweiterungen ab, lädt ein frei wählbares Programm nach und startet es automatisch.


    Lädt man ihn (doch) mit ",8", dann sieht man nach LIST so einen BASIC-Stub, wie tokra ihn beschrieben hat. Das dadurch gestartete Maschinenprogramm *ist* relokatibel und startet wiederum den gewünschten Payload mit abgeschalteter Speichererweiterung:

    Für den Fall, daß das Nutzprogramm doch eine bestimmte Speichererweiterung braucht, kann ein zuerst nachgeladenes Programm erst einmal testen, ob der Erweiterungspeicher auch existiert, dann den Speicher wieder expandieren und dann das eigentliche Zielprogramm laden und starten.


    Viele Grüße,


    Michael

  • Mike: vielen Dank für den alles berücksichtigenden Beitrag. Ich habe mir jetzt einen Einfiler gebastelt der ein Programm unabhängig von der Lademethode und von der Speicherwerweiterung an Adresse $1000 kopiert und dann startet. Im Falle von ",8,1" muss sich das Programm selbst nochmal mir ",8" laden da ein Teil im Loch zwischen $400 und $fff verlorengeht, ist bei Programmen von maximal 3,5k Länge aber halb so schlimm.