Quest for Quintana Roo/Laderoutine
<< zurück zu Quest for Quintana Roo
Quest_for_Quintana_Roo/Laderoutine: Die folgenden Abschnitte stellen die Kassetten-Laderoutinen des Spiels Quest for Quintana Roo dar. Auf der Originalkassette des Spiels sind diese, verteilt auf zwei einzelne Dateien mit den Namen "START" und "BOOT", dem eigentlichen Programmcode vorangestellt.
BASIC-Laderoutine (Datei "START")[Bearbeiten | Quelltext bearbeiten]
Das folgende Listing zeigt die BASIC-Routine, die in den Speicher übertragen wird, wenn man die Original-Kassette des Spiels "Quest for Quintana Roo" zurückspult und anschließend den BASIC-Befehl "LOAD" eingibt. Sie muss mit "RUN" gestartet werden, um den eigentlichen Programmcode des Spiels zu laden und auszuführen.
5 POKE53280,0:POKE53281,0
10 A=A+1:ONAGOTO20,40
20 PRINT"
LOADING GAME FROM TAPE"
30 LOAD"BOOT",1,1
40 SYS4096
Interessanterweise findet sich im Speicherbereich direkt hinter diesem BASIC-Programm noch eine Maschinensprache-Routine, die nie aufgerufen wird:
ORG $0876
P_AA: LDY #$00 ; Schreibindex initialisieren
TAY ; A mit Farbcode für "Schwarz" laden
AA00: STA D828,Y ; Obere Hälfte des Farb-RAM auf "schwarz" setzen
STA D928,Y
INY ; Schreibindex erhöhen
BNE AA00 ; Rücksprung falls kein Überlauf
LDA #$04 ; Rücksprungadresse-1 (High-Byte)
PHA ; auf Stack schieben
LDA #$27 ; Rücksprungadresse-1 (Low-Byte)
PHA ; auf Stack schieben
LDA #$01 ; Logische Dateinummer
LDX #$08 ; Geräteadresse (8=erstes Diskettenlaufwerk)
LDY #$01 ; Sekundäradresse (1=absolutes Laden)
JSR $FFBA ; Dateiparameter setzen
LDA #$08 ; Länge des Dateinamens
LDX #$76 ; Anfangsadresse des Dateinamens (Low-Byte)
LDY #$08 ; Anfangsadresse des Dateinamens (High-Byte)
JSR $FFBD ; Dateinamen setzen
LDA #$00 ; Load/Verify-Flag auf "LOAD" setzen
JMP $FFD5 ; Programm von Diskette laden, danach Ausführung bei $0428 fortsetzen
T000: DB "KILLER GAME"
Die Startadresse $0876 des Dateinamens in dieser Routine verweist auf keinen druckbaren String, und die angegebene Länge von 8 Bytes passt nicht zu der darauffolgenden Zeichenkette "KILLER GAME". Dennoch dient diese Routine offensichtlich dazu, ein Maschinenspracheprogramm von Diskette zu laden und durch einen Sprung an die Adresse $0428 zu starten, aber ihr Sinn bleibt rätselhaft — ebenso wie die Frage, wie dieses Programmfragment seinen Weg auf die Original-Kassette des Spiels "Quest for Quintana Roo" gefunden hat.
Assembler-Laderoutine (Datei "BOOT")[Bearbeiten | Quelltext bearbeiten]
Die im obigen Abschnitt beschriebene BASIC-Laderoutine lädt das nachfolgend aufgelistete Maschinensprache-Programm in den Speicher und führt es aus. Die Hauptaufgabe dieses Programms ist es, während des Ladevorgangs das BASIC-ROM auszublenden, da der Programmcode von "Quest for Quintana Roo" das darunterliegende RAM belegt. Zahlreiche weitere Schritte dieser Routine, wie das Abschalten von IRQs und NMIs, das falsch implementierte Umkopieren des Kernal-ROMs in das darunterliegende RAM oder das Löschen des Decimal-Flags, sind überflüssig und könnten auch entfallen.
ORG $1000
P_AA: LDA #$7F ; Alle Interrupts verbieten
STA $DC0D ; für CIA 1
STA $DD0D ; und für CIA 2
LDA #$00 ; Farbcode für "Schwarz"
STA $D020 ; Bildschirm-Rahmenfarbe auf "schwarz" setzen
STA $D021 ; Bildschirm-Hintergrundfarbe auf "schwarz" setzen
LDA #$00 ; Basisadresse des Kernal, Low-Byte
STA *$F0 ; als Zeiger in Zero-Page schreiben (Low-Byte)
LDA #$E0 ; Basisadresse des Kernal, High-Byte
STA *$F1 ; als Zeiger in Zero-Page schreiben (High-Byte)
LDY #$00 ; Indexregister für Umkopieren des Kernals vom ROM ins RAM löschen
AA00: LDA $00F0,Y ; Fälschlicherweise direkte statt indirekte Y-indizierte Adressierung
STA $00F0,Y ; Kopiert Speicherbereich $00F0..$01EF auf sich selbst
DEY ; Indexregister vermindern
BNE AA00 ; Weiter kopieren, falls noch nicht ganze Page kopiert
INC *$F1 ; Wirkungsloses Erhöhen des Zeigers (High-Byte)
BNE AA00 ; Rücksprung, falls noch kein Überlauf des Zeigers
LDA #$2F ; Standardwert für Ein-/Ausgabepins
STA *$00 ; in Datenrichtungsregister CPU-Port schreiben
LDA #$36 ; Wert für "BASIC-ROM abschalten"
STA *$01 ; in Datenregister CPU-Port schreiben
LDA #$01 ; Logische Dateinummer für nachzuladendes Programm
LDX #$01 ; Geräteadresse für nachzuladendes Programm (1=Datassette)
LDY #$FF ; Sekundäradresse für nachzuladendes Programm (≠0=Absolut laden)
JSR $FFBA ; Dateiparameter setzen
LDA #$04 ; Länge des Dateinamens
LDX #<T000 ; Startadresse des Dateinamens (Low-Byte)
LDY #>T000 ; Startadresse des Dateinamens (High-Byte)
JSR $FFBD ; Dateinamen auf "GAME" setzen
LDA #$00 ; Load/Verify-Flag auf "LOAD" setzen
JSR $FFD5 ; Programm nachladen
LDA #$2F ; Standardwert für Ein-/Ausgabepins
STA *$00 ; in Datenrichtungsregister CPU-Port schreiben
LDA #$36 ; Wert für "BASIC-ROM abschalten"
STA *$01 ; in Datenregister CPU-Port schreiben
LDA #$0B ; Bildschirmmodus "Monocolor-Text mit 40 Spalten" wiederherstellen
STA $D016
LDA #$1B ; Bildschirm wieder einschalten
STA $D011
LDA #$7F ; Alle Interrupts verbieten
STA $DC0D ; für CIA 1
STA $DD0D ; und für CIA 2
CLD ; Decimal-Flag löschen
JMP ($8000) ; Spiel starten
; Dateiname für nachzuladendes Programm
T000: DB "GAME"
; Füllbytes
T001: DB $20,$6E,$80,$4C,$09,$80,$20,$CC
Der eigentliche Programmcode von "Quest for Quintana Roo" findet sich in einer dritten Datei mit dem Namen "GAME" und belegt den Adressbereich $8000—$BFFE. Er könnte damit auch in einem Steckmodul mit einer Speicherkapazität von 16 kByte untergebracht werden, zumal ab Adresse $8000 zunächst zwei Sprungvektoren und die bei Modulen übliche "CBM80"-Kennung zu finden sind. Allerdings gibt es keine Hinweise darauf, dass "Quest for Quintana Roo" für den C64 auch tatsächlich als Cartridge erhältlich war.