Autostart

Für diesen Beitrag wurde das CBM prg Studio verwendet.
weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

CBM prg StudioWie man ein Autostart realisieren kann.

Ihr denkt jetzt sicher: Autostart? Wie jetzt? Wenn ich eine .prg-Datei nach WinVICE ziehe oder mein Programm mit dem CBM prg Studio oder C64 Studio übersetzt und an WinVICE übergeben habe, dann startet doch alles automatisch!

Sicher, bei Emulatoren ist das so, aber wir wollen ja für den C64 entwickeln und dort laden wir Programme normalerweise über den Namen oder mit  LOAD":*",8,1  und müssen anschließend  RUN  eingeben.

Wie ihr ja wisst, geben wir im Assembler unsere Startadresse mit z. B.  *=$0801  an. Genaugenommen ist das nicht nur die Start-, sondern auch die Ladeadresse. Der C64 lädt bei einem  LOAD...,8,1  das Programm direkt an die von uns gewählte Startadresse. Wichtig ist hier die letzte Eins ( ,1 ), die nach der Geräteadresse kommt. Dadurch „weiß“ der C64, dass das Programm an die vom Programmierer bestimmte Adresse und nicht an die BASIC-Startadresse geladen werden soll.
Diesen Umstand können wir uns zunutze machen. Der C64 lädt unser Programm wirklich gnadenlos an die von uns bestimmte Adresse.

Wer das mal testen möchte, der probiere einfach folgendes Programm:

Das obige Programm wird direkt in den Bildschirmspeicher geladen! Daher müsst ihr vorsichtig sein, welche Tasten ihr wo betätigt.

Das eigentliche Programm, es besteht ja nur aus dem  inc $D020 und  jmp loop:  Befehl, findet ihr zwischen dem  programm start:  und dem ':ende Text.

Geht ihr nach dem Laden mit dem Cursor rauf zur Zeile, die mit sys1119  beginnt und drückt dort  <RETURN>, dann blinkt wieder der Rahmen.
Um zu beweisen, dass unser Programm tatsächlich im Bildschirmspeicher läuft, ladet es bitte nochmal, so dass wieder der gesamte Text erscheint. Bevor wir den sys -Befehl ausführen, geht aber bitte erstmal mit den Cursor-Tasten auf das Leerzeichen, dass ihr direkt über dem einzelnen Ausrufezeichen ! findet. Überschreibt das Leerzeichen nun mit einem Ausrufezeichen ! (wirklich nur ein ! und keine andere Taste). Geht dann mit den Cursor-Tasten zum sys -Befehl und drückt wieder <RETRUN> .
Cool, wir haben unser Assemblerprogramm direkt im BS-Speicher durch die Eingabe eines Zeichens geändert, nun sollte etwas Anderes blinken.
Ihr solltet mit dem Char-ROM eigentlich selbst darauf kommen, was wir eben gemacht haben.

 

Ooops, schon wieder vom Thema abgekommen 😉 , zurück zum eigentlichen Thema: Autostart.

Was bringt uns nun die Erkenntnis, dass der C64 unser Programm an nahezu (es gibt in der Tat Einschränkungen) jede beliebige Speicherstelle laden kann?
Das Betriebssystem des C64 befindet sich bekanntlich fest im Kernal-ROM. Wie ihr evtl. schon im Assember Tutorial gesehen habt, kann man zu den Kernal-Routinen entweder direkt ins ROM springen oder (und hier wird es nun interessant) über einen indirekten Sprung (Jump-Table). Diese Sprung-Adressen liegen im RAM und können somit von uns verändert werden (etwas Ähnliches wurde bei „Ein Modul erstellen“ gemacht). Wir benötigen jetzt also am Besten einen solchen indirekten Sprung, der nach dem  LOAD  Befehl angesprungen wird. Wenn ihr euch eine Speicher-Map anschaut, dann findet ihr auf der 2. Page (ab $0300) einige solcher Sprünge. Wir interessieren uns besonders für die sog. IMAIN-Routine, die in $0302 /  $0303 gespeichert ist. Diese springt zurück zur BASIC-Eingabeschleife. Sie wird nach jedem direkt eingegebenen Befehl, wie z. B.  LOAD  angesprungen, um auf den nächsten Befehl zu warten.
Für den geplanten Autostart können wir das jetzt ausnutzen. Wenn wir dafür sorgen, dass unser Programm an diese Adresse geladen wird und in die BYTES  $0302$0303 die Startadresse für unser eigentliches Programm einträgt, dann würde dieses nach dem Laden automatisch gestartet werden.

Das ist schon alles!??? Startet es einfach mal und ihr werdet feststellen, nein!
Ganz so einfach ist es anscheinend doch nicht. Die Theorie stimmt, aber unser Programm überschreibt die weiteren Sprungadressen, die ihr bis  $033B findet. Um einen Absturz zu vermeiden, müssen wir auch diese Adresse beibehalten. Dazu geben wir die BYTES bis  $033B einfach in unserem Programm mit an. Die benötigten Werte könnt ihr z. B. mit VICE ermitteln indem ihr über ALT-M den Monitor startet, das Memory-Fenster öffnet und die Werte von  $0304 bis  $033B abtippt. Nett wie ich nun mal bin, habe ich das schon für euch erledigt.

Startet ihr das Programm nun, dann sollte direkt der Rahmen blinken. OK, das ist jetzt kein Unterschied zu sonst, aber zumindest läuft das Programm. Ein Problem soll natürlich nicht verschwiegen werden: Habt ihr einen anderen Kernal in eurem C64, dann wird es fast zu 100% passieren, dass das Programm wieder abstürzt. Benutzt der Kernal nämlich andere Sprungadressen, als das original ROM von Commodore, dann passen unsere BYTE-Werte natürlich nicht.

Um das Beispiel jetzt richtig zu testen, benötigen wir eine Diskette bzw. eine D64-Datei für den Emulator.

Ihr könnt das Programm aber auch im Java-Emulator testen.

  • Gebt zu nächst mal  LOAD"$",8  ein oder klickt auf den gleichlautenden Link
  • Lasst euch dann mit  LIST das Inhaltsverzeichnis anzeigen, um sicherzugehen, dass die Diskette vom Java-Emulator „eingelegt“ wurde.
  • Ladet und startet das Programm dann mit  LOAD"*",8,1

 ASM-Autostart

Oder ihr holt euch das gezippte D64-Image, um es im Emulator bzw. am C64 zu probieren.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (1 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


 

<<< zurück |

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam