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"