Quest for Quintana Roo/Laderoutine

Aus C64-Wiki
Zur Navigation springenZur Suche springen

<< 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.