Hello, Guest the thread was called1.3k times and contains 38 replays

last post from EgonOlsen71 at the

Kann man das Laden einer BASIC Erweiterung automatisieren?

  • Ich habe eine Diskette erstellt auf der ein einfaches "Hello World" Programm gespeichert ist. Um dieses auszuführen, muss vorher die BASIC Erweiterung "Supergrafik" von Axel Plenge geladen werden.

    Dazu müsste man folgendermaßen vorgehen:


    1.) Man lädt die BASIC-Erweiterung mit LOAD"SUPERGRAPHIK.O",8,1.

    2.) Dann startet man die Erweiterung mit SYS30464.

    3.) Dann lädt man innerhalb des erweiterten BASIC das HelloWorld-Programm mit LOAD"HELLOWORLD",8.

    4.) Und dann startet man es mit RUN.


    Gibt es eine Möglichkeit, die o.g. Schritte mit einem BASIC Programm zu automatisieren?

    Ich stelle mir das so vor, dass der Anwender die Diskette einlegt LOAD"*",8,1 und RUN eingibt und dann die Erweiterung und das HelloWorld-Programm automatisch hintereinander geladen und gestartet werden.

    So das der Anwender letztendlich gar nicht merkt, dass er es hier mit einer BASIC-Erweiterung zu tun hat.

  • Hallo Enigma. Danke für Deine Antwort.

    Das ist eine gute Idee. Aber nach dem SYS-Befehl wird leider der BASIC Speicher gelöscht. Der Rest meines Programms ist also nach dem SYS-Befehl weg.

    Gibt's noch eine andere Möglichkeit?


    Ich habe übrigens die Diskette mit den beiden benötigten Dateien in Post#1 angehängt, falls jemand Lust hat, das mal auszuprobieren.

  • Hmm, löschen tut es nicht unbedingt, aber es führt am Ende einen Sprung zum BASIC Warmstart aus, das setzt vermutlich diverse Pointer zurück. Das BASIC-Programm selbst ist im Speicher noch da. Evtl. reicht es, das JMP bei Supergraphik zu patchen, oder die BASIC-Pointer wiederherzustellen. Ein bisschen fummelig :)

  • Du kannst das Nachladen und Starten in den Tastaturpuffer poken, dann SYS ausführen...das scheint hier zu klappen. Siehe Anhang.


    Edit: RUNME laden, der Code selber steht in "2", damit ich nicht soviel poken musste...

  • Evtl. reicht es, das JMP bei Supergraphik zu patchen, oder die BASIC-Pointer wiederherzustellen.

    Äh, ja. Ich glaube das übersteigt meine Fähigkeiten ein wenig. :nixwiss:

    Du kannst das Nachladen und Starten in den Tastaturpuffer poken, dann SYS ausführen...das scheint hier zu klappen. Siehe Anhang.

    Hey, das ist ja obercool. :thumbsup: Genau so habe ich mir das vorgestellt.

    Kannst Du mir (einem Noob) ein bisschen erklären, wie Dein genialer "Loader" funktioniert?

    Vielleicht kann ich es zumindest so weit verstehen, dass ich selbst den nachzuladenden Dateinamen anpassen kann. :gruebel

  • Kannst Du mir (einem Noob) ein bisschen erklären, wie Dein genialer "Loader" funktioniert?

    Vielleicht kann ich es zumindest so weit verstehen, dass ich selbst den nachzuladenden Dateinamen anpassen kann. :gruebel

    Er schreibt die Befehlsfolge:


    lO"2",8<RETURN>rU<RETURN>


    Kurzform vom LOAD"2",8<RETURN>RUN<RETURN>


    in den Tastaturpuffer, setzt die Pufferlänge in 198 und startet dann die BASIC-Erweiterung. Die Befehlsfolge steht als PETSCII in den DATA-Zeilen.


    Aber Achtung: Eigentlich dürfte das gar nicht funktionieren, weil der Tastaturpuffer nur von 631 bis 640 reicht. Die Folge reicht aber bis inkl. 642, was laut Wiki "Startadresse im RAM für Betriebssystem (Low-/High-Byte)" ist. Wenn ich deren Funktion richtig verstanden habe, ist es nach dem Starten nicht relevant, was da drin steht (man möge mich korrigieren...). Aber zur Sicherheit könntest du in deinem Hauptprogramm diese mittels POKE 641,0:POKE 642,8 korrigieren.


    Deswegen sollte der Name auch nicht mehr als ein Zeichen haben...sonst platzt der Puffer endgültig.

  • Hallo EgonOlsen71.

    Danke für die Erläuterungen. Ich glaube, ich habe das sogar verstanden.


    Ich poste hier mal Deinen Code, weil der so genial ist.

    Code: Der Loader
    1. 10 if a=0 then a=1:load"supergraphik.o",8,1
    2. 20 p=631:c=0
    3. 30 read v:if v=-1 thenpoke198,c:sys 30464
    4. 40 poke p+c,v:c=c+1:goto 30
    5. 100 data 76,111,34,50,34,44,56,13,82,117,13,-1

    Das der Name der zu ladenden Datei nur ein Zeichen lang sein kann, ist mir völlig Wurst.

    Und das man POKE 641,0:POKE 642,8 ins Hauptprogramm schreiben muss, um evtl. auftretende Probleme zu fixen ist auch absolut vertretbar.


    Dieser Loader müsste ja theoretisch auch mit anderen BASIC Erweiterungen wie Simon's Basic oder COMAL anwendbar sein. Oder?

    Der gehört auf jeden Fall in meine Tipps & Tricks Sammlung rein, wo ich ihn auch umgehend aufnehmen werde.


    Vielen herzlichen Dank für diesen Super Trick. :thumbsup:

  • Deswegen sollte der Name auch nicht mehr als ein Zeichen haben...sonst platzt der Puffer endgültig.

    Da gibt es alternativ ja noch die Möglichkeit, im Startprogramm die benötigten Befehle an den passenden Stellen auf den Bildschirm zu schreiben, den Cursor neu zu positionieren und einfach die notwendige Anzahl an RETURNs in den Tastaturpuffer zu poken.

  • Dieser Loader müsste ja theoretisch auch mit anderen BASIC Erweiterungen wie Simon's Basic oder COMAL anwendbar sein. Oder?

    Ja, würde ich meinen.


    Übrigens müsste man das LOAD-Kommando nicht auch zwangsweise in den Tastaturpuffer zwängen und sich auf ein Zeichen Programmname beschränken.

    Code
    1. 10 if a=0 then a=1:print"supergraphik.o",8,1
    2. 20 printchr$(147)chr$(17)chr$(17)"lO"+chr$(34)+"meinprog"+chr$(34)+",8"ch$(19);
    3. 30 forp=631to634:readv:pokep,v:next
    4. 40 poke198,4:sys 30464
    5. 50 data 13,82,117,13

    Einfach den Bildschirm mitbenutzen:

    In Zeile 20 kann man dann auch einen längeren Dateinamen setzen. Wenn man die chr$() auch noch entsprechend direkt angibt (147 ClrScr, 17 Cursor down), hat man in der Zeile genug Platz - hier nur für die bessere Übertragbarkeit.

    Damit beschränkt sich das, was man in den Tastaturpuffer schreiben muss auf 4 Zeichen, nämlich

    Zeilenvorschub + abgekürztes RUN-Kommando + Zeilenvorschub


    Wenn man möchte, dass das unsichtbar abläuft, kann man auch die Hintergrundfarbe explizit setzen und die Zeichenfarbe auf die gleiche, dann ist das noch magischer ...

  • Da gibt es alternativ ja noch die Möglichkeit, im Startprogramm die benötigten Befehle an den passenden Stellen auf den Bildschirm zu schreiben, den Cursor neu zu positionieren und einfach die notwendige Anzahl an RETURNs in den Tastaturpuffer zu poken.

    Nee, das funktioniert in diesem Fall ja nicht. Der SYS zum Starten der Erweiterung räumt den Bildschirm ab und schreibt eine eigene Startmeldung. Deswegen muss man das komplett über den Puffer machen.

  • Ja, würde ich meinen.


    Übrigens müsste man das LOAD-Kommando nicht auch zwangsweise in den Tastaturpuffer zwängen und sich auf ein Zeichen Programmname beschränken.

    Einfach den Bildschirm mitbenutzen:

    Nein, kann man nicht in diesem Fall. Der SYS-Aufruf löscht den Bildschirm.

  • Ja, würde ich meinen.


    Übrigens müsste man das LOAD-Kommando nicht auch zwangsweise in den Tastaturpuffer zwängen und sich auf ein Zeichen Programmname beschränken.

    Einfach den Bildschirm mitbenutzen:

    Nein, kann man nicht in diesem Fall. Der SYS-Aufruf löscht den Bildschirm.

    Gut, das ist Argument. :)

    Eine Erweiterung wird auch mitunter den Tastaturpuffer zurücksetzen ...

    Es hängt also immer von der Erweiterung ab, mit welcher Methode man noch nach dem Aufruf die Kontrolle erlangen kann. Einen generellen Ansatz gibt es da vermutlich nicht.


    Meine Gra-Ext-Erweiterung erzeugt nur im Direktmodus eine "Aktivierungsmeldung", im Programm aufgerufen verhält sie sich still. ;)

  • Versuch es mal damit:

    in Variable dv kommt die Laufwerksnummer rein, könnte auch direkt zu.B. durch 8 ersetzt werden. Filename ebenfalls entsprechend ersetzen durch die Datei die geladen werden soll.

    Code
    1. open8,dv,1,"filename":poke780,0:sys65493:close8

    Was macht das? Da blicke ich gerade nicht durch. Es soll ja zuerst die BASIC-Erweiterung Supergraphik geladen und gestartet werden und dann innerhalb der Erweiterung noch ein BASIC Programm. Ich sehe nicht, wie dieser Code das macht. (Kann aber auch an mir liegen.)

    Einfach den Bildschirm mitbenutzen:

    Das geht leider nicht. Wie EgonOlsen71 schon geschrieben hat, wird bei der SUPERGRAPHIK nach dem SYS-Befehl der Bildschirm gelöscht (und wahrscheinlich einiges anderes zurückgesetzt). Bei COMAL ist das imho auch so. Und bei Simon's Basic auch.

    Einen generellen Ansatz gibt es da vermutlich nicht.

    Ich glaube, der Ansatz von EgonOlsen71 ist der universellste und müsste mit den meisten BASIC Erweiterungen funktionieren. (Habe aber bisher nur mit der SUPERGRAPHIK getestet.)



    Eine weitere Möglichkeit, die mir selbst eingefallen ist, und die mit jeder BASIC-Erweiterung funktioniert, ist, dass man ein Freeze-Modul wie Action Replay MK6 benutzt. Man lädt erst die BASIC Erweiterung und startet darin das eigene Programm, dann freezed man es am Anfang und speichert die Eiswürfel auf eine Diskette. Die resultierende Dateigröße ist dabei gar nicht so absurd groß wie ich dachte. Aber die Lösung von EgonOlsen71 ist natürlich sauberer und schöner und spart auch etwas Speicherplatz auf der Diskette.

  • Ich glaube, der Ansatz von EgonOlsen71 ist der universellste und müsste mit den meisten BASIC Erweiterungen funktionieren. (Habe aber bisher nur mit der SUPERGRAPHIK getestet.)

    Das "meisten" ist halt eine Vermutung. Man müsste das mit allen Erweiterungen durchtesten, um das qualifiziert zu beurteilen. ;)
    Aber wie gesagt, es hängt halt davon ab, was die Erweiterung so an Initialisierung macht. Vielleicht ist es ja wirklich so, dass die "meisten" den Tastaturpuffer beim Initialisieren nicht angreifen. ;)

  • Im Prinzip macht es das:

    LOAD"filename",8,1

    aber in einem BASIC Programm ohne Neustart vom BASIC Programm.

    Ich weiß nicht recht, wie ich das in diesem Fall verwenden soll. Der "Loader" muss ja erst die SUPERGRAPHIK-Erweiterung laden und starten UND danach, nachdem die SUPERGRAPHIK einen Warmstart durchgeführt hat, noch ein weiteres BASIC Programm laden und starten. So wie ich es sehe, geht das nur mit der Tastaturpuffer-Lösung von EgonOlsen71.

    Das "meisten" ist halt eine Vermutung. Man müsste das mit allen Erweiterungen durchtesten, um das qualifiziert zu beurteilen. ;)

    Ja, da hast Du wohl Recht. Ich werde das demnächst mal mit Simon's Basic testen. Bis dahin glaube ich einfach, die ultimative Lösung gefunden zu haben. Das macht mich zumindest so lange glücklich, bis ich andere Erkenntnisse habe. :D