Arbeiten mit Programmen auf dem C64

Als ich mich nach zig Jahren wieder mit dem Commodore C64 beschäftigt habe, war ich am Anfang etwas überfordert mit der Art und Weise wie Programme (.prg) geladen und gestartet werden. Hier mein Versuch das Thema einfach zu erklären.

Der C64 erlaubt es dem Programmierer, neben BASIC-Programmen noch mehrere ausführbare Programme (.prg) auf einmal zu laden, solange diese in unterschiedlichen, nicht überlappenden Speicherbereichen ihren Platz finden. Die Programme teilen dazu dem C64 mit, ab welcher Startadresse sie im Speicher geladen werden wollen.

Um dies zu verdeutlichen stecke ich als erstes die Turbo Macro Pro-Floppy („TMP“, ein Assembler für den C64) ins Laufwerk und weise das Floppy-Laufwerk mit dem BASIC-Befehl LOAD „$“,8 an, mir den Inhalt der Disk auszugeben, den ich dann darauf hin mit dem Befehl LIST anzeige:

Im Beispiel habe ich die Bildschirmausgabe schnell mit der ESC-Taste unterbrochen. Der Computer zeigt uns hier ein Pseudo-Basic-Programm an, welches den Inhalt der Floppy wiedergibt. Am einfachsten fährt man nun mit dem Cursor in die Zeile hoch, in der das gewünschte Programm steht und lädt dieses in den Speicher mit bspw. LOAD „TMP V1.2/S.“,8,1
Turbo Macro Pro wird ab Adresse $8000 (8*4096 = 32768) in den Speicher geladen und kann daher aus BASIC heraus mit SYS 8*4096 oder SYS 32768 gestartet werden. Damit beginnt die Ausführung von TMP:

Wir springen mit PFEIL-LINKS gefolgt von 1 zurück ins BASIC und laden das nächste Programm, in diesem Fall den Speichermonitor SMON. Ich verwende die Version, die ab Adresse $C000 (49152) in den Speicher geladen wird. Erst führt man den BASIC-Befehl NEW aus, um die „? OUT OF MEMORY ERROR“ Fehlermeldung zu vermeiden. Dann wie oben beschrieben SMON-Floppy ins Laufwerk, LOAD „$“, 8 gefolgt von LIST, dann SMON mit LOAD „SMONPC000“,8,1: laden. Mit SYS 49152 bringen wir SMON anschließend zur Ausführung.

SMON meldete sich mit der Ausgabe der Register. Mit dem Befehl M 8000 habe ich SMON angewiesen, ab Adresse $8000 einen Memory Dump zu machen. $8000 war die Startadresse für TMP. Dabei sehen wir ab Adresse $8008 die Zeichenkette „TMP 1.2“. Es sieht also so aus, als wäre TMP noch im Speicher. Dies überprüfen wir indem wir mit dem Befehl G 8000 an diese Stelle im Speicher springen und den dortigen Maschinencode zur Ausführung bringen.

Unter Umständen zeigt uns TMP ein paar häßliche Speicherfragmente an, was aber nicht weiter schlimm ist. Mit dem TMP Befehl PFEIL-LINKS und c einen Kaltstart durchführen, danach sieht der Bildschirm wieder normal aus.
Mit dem Befehl PFEIL-LINKS und 1 springen wir wieder ins BASIC ohne TMP zu beenden. Dort geben wir erneut SYS 49152 ein um uns zu vergewissern, dass SMON ebenfalls noch im Speicher ist. Und tatsächlich, SMON meldet sich brav mit den Registerinhalten:

Mit dem Befehl X habe ich SMON beendet um im BASIC Eingabe-Editor den vorletzten Test zu machen:

Und ja, das einfache BASIC-Programm läuft neben TMP und SMON ebenfalls. Der Computer speichert das zweizeilige BASIC-Programm ab Adresse $0801 (2049), wodurch es zu keinen Konflikten kommt. Das kann man wiederum mit SMON und M 0801 überprüfen:

Nach dem Zeiger $0815, der Zeilennummer $000A („10“) , einem $00-Byte folgt der Token für den BASIC-Befehl PRINT ($99), dann ein Leerzeichen ($20), gefolgt von unserer Zeichenkette „HELLO WORLD“.

Damit nicht genug rufen wir TMP auf und geben ein beliebiges, kurzes Programm ein, welches ab Speicheradresse $1000 (4096) startet:

Das Programm wird mit dem Befehl PFEIL-LINKS und 3 assembliert (was TMP mit ein paar komischen Zeichen quittiert, es funktioniert aber trotzdem). Zurück in BASIC starten wir den Maschinencode ab Adresse 4096 mit dem Befehl SYS 4096 und unser Programm wird neben TMP und SMON zur Ausführung gebracht, selbst die beiden BASIC-Zeilen sind noch da:

Wem jetzt schwindlig geworden ist, empfehle ich alles mal in Ruhe auszuprobieren. Ich habe selber gemerkt, dass man nach etwas Übung die Befehle im Schlaf eingeben kann und ebenso zwischen Programmen wechselt.

Schreibe einen Kommentar

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