Buffalo Roundup/Laderoutine
Aus C64-Wiki
Zur Navigation springenZur Suche springen
<< zurück zu Buffalo Roundup
Buffalo_Roundup/Laderoutine: Die folgenden Abschnitte stellen die Kassetten-Laderoutinen des Spiels "Buffalo Roundup" dar. Auf der Originalkassette des Spiels sind diese, verteilt auf eine Datei mit den Namen "BUFFALO" und eine weitere, namenlose Datei, dem eigentlichen, aber verschlüsselten Programmcode vorangestellt.
Autostart und erste Laderoutine (Datei "BUFFALO")[Bearbeiten | Quelltext bearbeiten]
ORG $01F8
; Überschreibt die Rücksprungadresse auf den Stack mit $0202
DB $02,$02,$02,$02,$02,$02,$02,$02,$02
; Laderoutine ab Adresse $0201
P_AA: NOP
NOP
NOP ; Einsprung nach Rückkehr aus der LOAD-Routine des Kernal
NOP
NOP
NOP
NOP
NOP
NOP
LDA #$00 ; Status "kein Fehler"
JSR $FF90 ; Status setzen
LDA #$01 ; Code für "Weiß"
STA $D020 ; als Rahmenfarbe setzen
TAX ; X=1 als Geräteadresse
TAY ; Y=1 als Sekundäradresse
JSR $FFBA ; Fileparameter setzen
LDA #$00 ; Länge des Dateinamens=0
JSR $FFBD ; Filenamenparameter setzen
LDA #$00 ; LOAD/VERIFY-Flag auf "LOAD"
JSR $FFD5 ; LOAD-Routine
INC $D020 ; Rahmenfarbe erhöhen
; Nachgeladenen Programmteil decodieren
LDX #$00 ; Index für Decodieren initialisieren
LDA P_BA,X ; Codiertes Byte lesen
EOR #$E3 ; und decodieren durch EOR und SBC
SEC
SBC #$7F
STA P_BA,X ; Decodiertes Byte zurückschreiben
INX ; Index für Speicherzugriff erhöhen
BNE $0228 ; Rücksprung falls noch nicht ganze Page decodiert
JMP P_BA ; sonst zweiten Teil der Laderoutine anspringen
; Füllbytes ohne Funktion
DB $00,$00,$00,$00,$00,$00,$00
Zweite, namenlose Laderoutine[Bearbeiten | Quelltext bearbeiten]
PRG $9F00
P_BA: INC $D020 ; Rahmenfarbe erhöhen
LDA #$93 ; Code für "Bildschirm löschen"
JSR $FFD2 ; Ausgabe eines Zeichens
LDA #$01 ; Logische Dateinummer
TAX ; Geräteadresse
TAY ; Sekundäradresse
JSR $FFBA ; Fileparameter setzen
LDA #$00 ; Länge des Dateinamens
JSR $FFBD ; Filenamenparameter setzen
LDA #$00 ; LOAD/VERIFY-Flag auf "LOAD"
JSR $FFD5 ; LOAD-Routine
BCC BA00 ; Sprung falls kein Fehler
JMP ($FFFC) ; sonst Reset auslösen
BA00: STX *$2D ; Endadresse+1 des gelesenen Programmteils speichern
STY *$2E
LDA *$2B ; Aufang des BASIC-Programms, Low-Byte
PHA ; auf Stack retten
LDA *$2C ; Anfang des BASIC-Programms, High-Byte
PHA ; auf Stack retten
LDY #$00 ; Index für Decodieren initialisieren
BA01: LDA ($2B),Y ; Geladenes Datenbyte lesen
SEC ; und decodieren durch je zweimaliges SBC und EOR
SBC #$1B
EOR #$AA
SEC
SBC #$FB
EOR #$55
STA ($2B),Y ; Decodiertes Byte zurückschreiben
INC *$2B ; Schreibzeiger erhöhen, Low-Byte
BNE BA02 ; Rücksprung falls kein Überlauf
INC *$2C ; Schreibzeiger erhöhen, High-Byte
BA02: LDA *$2C ; High-Byte des Schreibzeigers lesen
CMP *$2E ; und mit High-Byte der Endadresse vergleichen
BNE BA01 ; Rücksprung falls noch nicht erreicht
LDA *$2B ; Low-Byte des Schreibzeigers lesen
CMP *$2D ; und mit Low-Byte der Endadresse vergleichen
BNE BA01 ; Rücksprung falls noch nicht erreicht
PLA ; Anfang des BASIC-Programms zurückholen, High-Byte
STA *$2C ; und wiederherstellen
PLA ; Anfang des BASIC-Programms zurückholen, Low-Byte
STA *$2B ; und wiederhertellen
JSR $A533 ; BASIC-Zeilen neu binden
LDX #$15 ; Index für Umkopieren
BA03: LDA BA04,X ; Geladene Routine lesen
STA $02A7,X ; und umkopieren
DEX ; Index vermindern
BPL BA03 ; Rücksprung falls noch nicht fertig umkopiert
LDA #$4C ; Opcode für JMP absolute
STA *$73 ; an Anfang der CHRGET-Routine schreiben
LDA #$AD ; Sprungadresse, Low-Byte
STA *$74 ; in CHRGET-Routine schreiben
LDA #$02 ; Sprungadresse, High-Byte
STA *$75 ; in CHRGET-Routine schreiben
BA04: JSR $A68E ; Programmzeiger auf BASIC-Start
JMP $A7AE ; Sprung zur Interpreterschleife
; Nicht ausgeführter Programmteil
BA05: LDA *$3A ; High-Byte der momentanen BASIC-Zeilennummer
CMP #$FF ; mit $FF vergleichen
BEQ BA04 ; Spielprogramm starten, falls gleich
INC *$7A ; Programmzeiger erhöhen, Low-Byte
BNE BA06 ; Sprung falls kein Überlauf
INC *$7B ; Programmzeiger erhöhen, High-Byte
BA06: JMP $0079
; Unvollständiger Meldungstext im Anschluss an die Laderoutine
DB $93 ; Code für "Clear screen"
DB $11,$11 ; Code für "Cursor down"
DB " C64 TAPE PROTECTION - BY S. BEATS."
DB $11 ; Code fpr "Cursor down"
DB $0D ; Code für "Carriage return"
DB $00
DB " INSERT PROGRAM DISK INTO DRIVE"
DB $11 ; Code für "Cursor down"
DB $0D ; Code für "Carriage return"
DB " AND A BLANK TAPE INTO CASSETTE"
DB $11 ; Code für "Cursor down"
DB $0D ; Code für "Carriage return"
DB " (ENSURE TA"