User Tools

Site Tools


base:freeload_v5.0_saver

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:freeload_v5.0_saver [2015-04-17 04:32] (current)
Line 1: Line 1:
 +====== FreeLoad V5.0 Tape Saver ======
 +This code was used to master freeload files to tape.
 +
 +<code>
 +;----------------------------------------------------------------------------
 +;          * FREELOAD V5.0 Cassette mastering system By Paul Hughes *
 +;
 +;                              Rainbow Islands
 +;
 +;                     (C) Copyright 1984-1988 Paul Hughes
 +;
 +; Ported to DASM 09/11/04 by Paulie.
 +;----------------------------------------------------------------------------
 +
 + processor 6502
 +
 +      seg code
 +
 +;-----------------------------------------------------------------------------
 +
 +AT             EQU $80
 +FROM           EQU $FC
 +TO             EQU $FE
 +
 +;-----------------------------------------------------------------------------
 +; ZP
 +;-----------------------------------------------------------------------------
 +TX             EQU $20
 +TY             EQU $21
 +
 +BYTE           EQU $BD
 +LODFLAG        EQU $02
 +START          EQU $2B
 +TXTTAB         EQU $2B
 +END            EQU $2D
 +MSGFLAG        EQU $9D
 +BCOUNT         EQU $A3
 +BITIN          EQU $03
 +EADR           EQU $AE
 +SADR           EQU $C1
 +CHKSUM         EQU $05
 +VERIFY         EQU $06
 +CHKSM2         EQU $FB
 +LSTART         EQU $07
 +LEND           EQU $09
 +HEDNUM         EQU $80
 +HEDBYT         EQU $40
 +HEDEND         EQU $5A
 +
 +;-----------------------------------------------------------------------------
 +
 +
 +;
 +; S"SAVER",$0316,$03FF   <------ This MUST be the first file on the disk (!)
 +; S"PCODE",$C000,FINISH
 +;
 +
 + #if 0 ; :PH - Ignore the disk boot, just sys 49152 to fire it up for now
 +               ORG $0316
 +
 +VECT           dc.w $FE66                ; System Vectors
 +               dc.w $FE47
 +               dc.w $F34A
 +               dc.w $F291
 +               dc.w $F20E
 +               dc.w $F250
 +               dc.w $F333
 +               dc.w $F157
 +               dc.w AUTO_START
 +               dc.w $F6ED
 +               dc.w $F13E
 +               dc.w $F32F
 +               dc.w $FE66
 +               dc.w $F4A5
 +               dc.w $F5ED
 +
 +               ORG $0363
 +
 +AUTO_START     SEI                      ; FreeLoad Loader
 +               LDA #$37
 +               STA $01                  ; ROMS in
 +               LDA #$F1
 +               STA $0327                ; Point Vector
 +               LDA #$CA
 +               STA $0326
 +               LDA #0                   ; Messages OFF
 +               STA $9D
 +               CLI                      ; Enable Interrupts
 +               LDA #1
 +               LDX #8
 +               LDY #$FF
 +               JSR $FFBA
 +               LDA #FNLENGTH
 +               LDX #FILENAME
 +               LDY ^FILENAME
 +               JSR $FFBD                ; Set Header
 +               LDY #$04
 +               LDX #0
 +               LDA #0
 +               JSR $FFD5                ; Load File
 +               JMP SAVER_START          ; Fire Up
 +
 +FILENAME       DC.B "PCODE"
 +FNLENGTH       EQU @-FILENAME
 +
 + #endif
 +
 +;
 +; FreeLoad Cassette Saver starts here...
 +;
 +
 +               ORG $C000
 +
 +SAVER_START    LDA #$97                 ; The beginning of a nightmare!
 +               STA $DD00
 +               LDA #$15
 +               STA $D018
 +               LDA #$1B
 +               STA $D011
 +
 +               JSR CLS
 +               LDX #8
 +               STX $D020
 +               INX
 +               STX $D021
 +
 +               LDX #<INTRO
 +               LDY #>INTRO
 +               JSR SPRINT
 +
 +WAIT_SPACE     LDA #60
 +               JSR KEYSCAN
 +               BCC WAIT_SPACE
 +
 +               JSR CLS
 +               LDX #<MASTER_MODE
 +               LDY #>MASTER_MODE
 +               JSR SPRINT
 +
 +SELECT_MODE    LDX #0                   ; Selects the mastering mode
 +               LDA #56                  ; "1"
 +               JSR KEYSCAN
 +               BCS GOT_MODE
 +               INX
 +               LDA #59                  ; "2"
 +               JSR KEYSCAN
 +               BCC SELECT_MODE
 +
 +GOT_MODE       STX WHICH_MODE
 +
 +;-----------------------------------------------------------------------------
 +; SETUP - creates the slow loading turbo loader file (huh!)
 +;-----------------------------------------------------------------------------
 +
 +SETUP          SEI
 +               LDY #$33                 ; Copy in the Kernal vectors
 +VECToR         LDA IERRoR,Y
 +               STA SAVVEC,Y
 +               DEY
 +               BPL VECToR
 +
 +               LDX #<UNUSED              ; Point fire-up to the vectors
 +               LDY #>UNUSED
 +               STX SAVVEC+$02
 +               STY SAVVEC+$03
 +               STX SAVVEC+$16
 +               STY SAVVEC+$17
 +               STX SAVVEC+$24
 +               STY SAVVEC+$25
 +               STX SAVVEC+$2E
 +               STY SAVVEC+$2F
 +
 +               LDX #<ANMIVC              ; Point NMI to RTI
 +               LDY #>ANMIVC
 +               STX SAVVEC+$18
 +               STY SAVVEC+$19
 +
 +               JSR CLS
 +               LDA #1                   ; Ensure that
 +               STA 646                  ; Record & Play message is printed
 +               JSR $E544                ; in white
 +
 +               LDA #1                   ; Set the cassette device up
 +               TAX
 +               TAY
 +               JSR SETLFS
 +
 +               LDA #FILEND-FLNAME       ; Set up the file name pointers
 +               LDX #<FLNAME
 +               LDY #>FLNAME
 +               JSR SETNAM
 +
 +               LDA #0
 +               STA MSGFLAG              ; Kill Load & Save messages
 +
 +               LDX #<UNUSED
 +               LDY #>UNUSED              ; Set up the loader's Header Address
 +               STX SADR
 +               STY SADR+1               ; usually @ $02A7
 +               LDX #<UNUSD2
 +               LDY #>UNUSD2
 +               STX EADR
 +               STY EADR+1
 +               LDA #3                   ; Unrelocatable save
 +               JSR HEADER
 +
 +               LDX #<LOADER
 +               LDY #>LOADER              ; Save the loader from it's actual
 +               STX SADR
 +               STY SADR+1               ; position in memory.
 +               LDX #<LODEND
 +               LDY #>LODEND
 +               STX EADR
 +               STY EADR+1
 +               JSR SAVE
 +               LDA #1                   ; Close all output channels
 +               JSR CLOSE
 +
 +;----------------------------------------------------------------------------
 +
 +               LDY #HOWMANY-1           ; Set howmany files to save
 +               LDX #0
 +
 +NEXTSAVE       STY TY
 +               STX TX
 +
 +               LDA FLNAM,             ; Get the disk filename
 +               STA NUMBA
 +
 +               LDA WHICHDISK,         ; See if a new file disk is required
 +               BEQ NODISKCHANGE
 +
 +               ASL                      ; Yes, inform user of which disk
 +               TAY
 +               LDA WHICHMES,Y
 +               STA MESCH+1
 +               LDA WHICHMES+1,Y
 +               STA MESCH+2
 +
 +               JSR CLS
 +
 +               LDY #$27
 +MESCH          LDA $FFFF,             ; Self modified print address
 +               AND #$3F
 +               STA $0400+01*40,Y
 +               DEY
 +               BPL MESCH
 +
 +WAIT_SPACE_2   LDA #60                  ; Wait for the space bar
 +               JSR KEYSCAN
 +               BCC WAIT_SPACE_2
 +
 +               LDX TX
 +               LDY TY
 +
 +NODISKCHANGE   JSR GETFILE              ; Load that file
 +               LDX TX
 +               LDY TY
 +               LDA FILEDATA,X
 +               STA START
 +               LDA FILEDATA+1,X
 +               STA START+1
 +               LDA FILEDATA+2,X
 +               STA END
 +               LDA FILEDATA+3,X
 +               STA END+1
 +               STX TX
 +               STY TY
 +
 +               LDA WHICH_MODE           ; Check mastering mode
 +               BEQ DOTURBO
 +
 +;-----------------------------------------------------------------------------
 +
 +               JSR CLS                  ; Manual mastering mode
 +
 +               LDX #<WAIT_MES
 +               LDY #>WAIT_MES
 +               JSR SPRINT
 +
 +WAIT_SPACE_3   LDA #60
 +               JSR KEYSCAN
 +               BCC WAIT_SPACE_3
 +
 +;-----------------------------------------------------------------------------
 +
 +DOTURBO        JSR TURBO                ; AutoMaster mode selected
 +               LDX TX
 +               LDY TY
 +               INX                      ; Process the next file
 +               INX
 +               INX
 +               INX
 +               DEY
 +               BMI ALLDONE
 +               JMP NEXTSAVE
 +
 +;-----------------------------------------------------------------------------
 +
 +ALLDONE        JSR CLS                  ; Mastering Complete.
 +
 +               LDX #<ALL_DONE
 +               LDY #>ALL_DONE
 +               JSR SPRINT
 +
 +               LDX #8
 +               STX $D020
 +               INX
 +               STX $D021
 +
 +WAIT_SPACE_4   LDA #60
 +               JSR KEYSCAN
 +               BCC WAIT_SPACE_4
 +
 +FINISHED       JMP SAVER_START          ; Call BASIC ready
 +
 +;-----------------------------------------------------------------------------
 +
 +CLS            LDY #0                   ; Clear screen & attributes
 +CLR            LDA #$20
 +               STA $0400,Y
 +               STA $0500,Y
 +               STA $0600,Y
 +               STA $0700,Y
 +               LDA #1
 +               STA $D800,Y
 +               STA $D900,Y
 +               STA $DA00,Y
 +               STA $DB00,Y
 +               INY
 +               BNE CLR
 +               RTS
 +
 +;----------------------------------------------------------------------------
 +
 +GETFILE        JSR CLS                  ; Load a file from disk
 +
 +               LDX #8
 +               STX $D020
 +               INX
 +               STX $D021
 +
 +               LDX #<LOAD_MES
 +               LDY #>LOAD_MES
 +               JSR SPRINT
 +
 +               LDA NUMBA
 +               AND #$3F
 +               STA $0400+17
 +
 +               LDA #8                   ; Set up disk device
 +               TAX
 +               LDY #0
 +               JSR $FFBA
 +               LDA #1                   ; Point to filename
 +               LDX #<NUMBA
 +               LDY #>NUMBA
 +               JSR $FFBD
 +               LDA #0
 +               LDX #<$1000               ; Force load file to $1000
 +               LDY #>$1000
 +               JSR $FFD5
 +               RTS
 +
 +;----------------------------------------------------------------------------
 +; Messages & other such bunf
 +;----------------------------------------------------------------------------
 +TEXT
 +
 +INTRO          dc.b AT,4,2,"F R E E L O A D - BY PAUL HUGHES"
 +               dc.b AT,5,4,"CASSETTE MASTERING SYSTEM V5.0"
 +               dc.b AT,5,7,"SYSTEM INITIALISED FOR RAINBOW"
 +               dc.b AT,8,23,"PRESS SPACE  TO CONTINUE",0
 +
 +MASTER_MODE    dc.b AT,5,1,"SELECT FREELOAD MASTERING MODE"
 +               dc.b AT,1,6,"1. AUTOMASTER - THE LOOK NO HANDS MODE"
 +               dc.b AT,1,10,"2. MANUAL     - WAIT FOR A KEY (YAWN!)"
 +               dc.b AT,2,23,"IT'S MAKE YOUR MIND UP TIME - 1 OR 2",0
 +
 +LOAD_MES       dc.b AT,0,0,"NOW LOADING FILE",0
 +
 +ALL_DONE       dc.b AT,8,1,"CASSETTE MASTER COMPLETE"
 +               dc.b AT,8,23,"PRESS SPACE  TO CONTINUE",0
 +
 +WAIT_MES       dc.b AT,5,12,"PRESS SPACE TO SAVE THIS FILE.",0
 +
 +DISK2          dc.b " FLIP THIS DISK ...... THEN PRESS SPACE "
 +
 +;-----------------------------------------------------------------------------
 +;Saver variables
 +
 +WHICH_MODE     dc.b 0
 +NUMBA          dc.b 0
 +TEMP           dc.w 0
 +WHICHMES       dc.w DUMMY,DISK2
 +DUMMY          dc.b 0
 +
 +;-----------------------------------------------------------------------------
 +; Freeload file data
 +;
 +; WHICHDISK & FLNAM are read backwards !
 +;-----------------------------------------------------------------------------
 +HOWMANY        EQU 14
 +
 +FILEDATA       dc.w $0800,$0C40          ;A  Freeloader control software
 +               dc.w $4000,$5000          ;B  $D000-$E000
 +               dc.w $0800,$0C40          ;A  Overload of control software
 +               dc.w $B43E,$C800          ;C  Music
 +               dc.w $4000,$43FF          ;D  Colram
 +               dc.w $C800,$CBFF          ;E  Scrcol
 +               dc.w $E000,$FF40          ;F  Bitmap
 +               dc.w $0C40,$B43E          ;G  Game Code
 +               dc.w $C800,$CFFF          ;H  Game Code
 +               dc.w $E000,$FFFA          ;I  Game Code
 +               dc.w $0200,$02A6          ;J  Stack destroyer
 +               dc.w $0800,$0C40          ;A  Overload again !
 +               dc.w $B43E,$C800          ;K  Game Code
 +               dc.w $0400,$0C40          ;L  Game Code
 +
 +FLNAM          dc.b "LKAJIHGFEDCABA"
 +
 +WHICHDISK      dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0
 +
 +STARTUP        EQU $0800
 +
 +;-----------------------------------------------------------------------------
 +; TURBO - Blasts streams of data to the cassette
 +;-----------------------------------------------------------------------------
 +
 +
 +TURBO          JSR SENDHEADER
 +               LDA START                ; Send the correct file header
 +               JSR SENDBYTE
 +               LDA START+1
 +               JSR SENDBYTE
 +               LDA END
 +               JSR SENDBYTE
 +               LDA END+1
 +               JSR SENDBYTE
 +               STY CHKSM2               ; Store the Header's Checksum.
 +
 +               LDA END                  ; Send the data from $1000
 +        SEC
 +               SBC START
 +               STA TEMP
 +               LDA END+1
 +               SBC START+1
 +               STA TEMP+1               ; Calculate the actual File end addr
 +               LDA #<$1000
 +               STA START
 +               LDA #>$1000
 +               STA START+1
 +               LDA START
 +        CLC
 +               ADC TEMP
 +               STA END                  ; Point the start to $1000
 +               LDA START+1
 +               ADC TEMP+1
 +               STA END+1
 +
 +               LDY START
 +               LDA #0
 +               STA START
 +SAVELOOP       LDA (START),           ; Get a byte
 +               JSR SENDBYTE             ; Write that byte to tape
 +               INY
 +               BNE SAVE2
 +               INC START+1
 +               INC $D020                ; Change border colour every page
 +SAVE2          CPY END
 +               LDA START+1
 +               SBC END+1
 +               BCC SAVELOOP
 +               LDA CHKSM2
 +               JSR SENDBYTE
 +               JSR SENDBIT
 +               LDA #$1B
 +               STA $D011                ; Enable the screen
 +               LDA #$37
 +               STA $01
 +               CLI
 +               JSR IOINIT               ; Re-initialise the I/O's
 +               RTS
 +
 +;
 +; SENDHEADER - Sends header byte stream followed header termination bytes
 +;
 +
 +SENDHEADER     SEI
 +               LDA #5
 +               STA 1                    ; Cassette motor on, ROM's out
 +               LDA #$0B
 +               STA $D011
 +               LDY #0
 +               JSR DELAY                ; Let tape get to full speed
 +               JSR DELAY
 +               JSR DELAY
 +               LDA #<$00A0
 +               STA $DD04
 +               LDA #>$00A0
 +               STA $DD05
 +               LDA #$19
 +               STA $DD0E
 +
 +               LDY #HEDNUM
 +SENDHEAD       LDA #HEDBYT              ; Write $80 Header bytes ($40)
 +               JSR SENDBYTE
 +               DEY
 +               BNE SENDHEAD
 +               LDA #HEDEND              ; Header complete byte ($5A)
 +               JSR SENDBYTE
 +               RTS
 +
 +;
 +; SENDBYTE - Gets byte to be sent, then shifts out each bit
 +;
 +
 +SENDBYTE       STA BYTE                 ; Store Byte to be written
 +               EOR CHKSM2
 +               STA CHKSM2               ; Create a checksum
 +               LDA #8
 +               STA BCOUNT
 +GETBIT         ROL BYTE                 ; Rotate out & write each BIT
 +               JSR SENDBIT
 +               DEC BCOUNT
 +               BNE GETBIT
 +               RTS
 +
 +;
 +; SENDBIT - set CIA timer clock values, then sends tape pulse
 +;
 +
 +SENDBIT        LDX #$70                 ; Timing for a '0' bit
 +               BCC BIT1
 +               LDX #$FF                 ; Timing for a '1' bit
 +BIT1           STX $DD04
 +               LDA #$00
 +               STA $DD05
 +               LDA #$01
 +WAIT           BIT $DD0D                ; Wait for NMI
 +               BEQ WAIT
 +               LDA $01
 +               EOR #$08
 +               STA $01                  ; Send Pulse to tape
 +
 +               LDA $D020                ; Does the mindless border
 +               EOR #5
 +               STA $D020                ; flashing
 +
 +               LDA #$19
 +               STA $DD0E                ; Start timer counting down
 +               LDA #$01
 +WAIT2          BIT $DD0D                ; Wait for NMI
 +               BEQ WAIT2
 +               LDA $01
 +               EOR #$08
 +               STA $01                  ; Stop sending Pulse
 +               LDA #$19
 +               STA $DD0E                ; Stop the timer
 +               RTS
 +
 +;
 +
 +DELAY          DEX
 +               BNE DELAY                ; Delay to allow tape to reach
 +               DEY
 +               BNE DELAY
 +HERE           RTS                      ; speed - avoids load errors
 +
 +;-----------------------------------------------------------------------------
 +; SPRINT - Prints text pointed to in X&Y
 +;-----------------------------------------------------------------------------
 +
 +SPRINT         STX FROM
 +               STY FROM+1
 +
 +PRINT_LOOP     LDY #0
 +               LDA (FROM),Y
 +               BMI GET_COORDS
 +               BNE NOT_FINISH
 +               RTS
 +NOT_FINISH     AND #$3F
 +               STA (TO),Y
 +               INC FROM
 +               BNE SKIP_C
 +               INC FROM+1
 +SKIP_C         INC TO
 +               BNE PRINT_LOOP
 +               INC TO+1
 +               JMP PRINT_LOOP
 +;
 +GET_COORDS     INY
 +               LDA (FROM),Y
 +               STA X_TEMP
 +               INY
 +;               LAX (FROM),Y
 + LDA (FROM),y
 + TAX
 +               LDA SCR_TABLE_L,X
 +        CLC
 +               ADC X_TEMP
 +               STA TO
 +               LDA SCR_TABLE_H,X
 +               ADC #0                   ; eeeeeyuk !!
 +               STA TO+1
 +               LDA FROM
 +        CLC
 +               ADC #3
 +               STA FROM
 +               BCC PRINT_LOOP
 +               INC FROM+1
 +               JMP PRINT_LOOP
 +
 +;-----------------------------------------------------------------------------
 +X_TEMP         dc.b 0
 +
 +SCREEN_BASE    EQU $0400
 +
 +SCR_TABLE_L    dc.b <[SCREEN_BASE+(0*40) ]
 +               dc.b <[SCREEN_BASE+(1*40) ]
 +               dc.b <[SCREEN_BASE+(2*40) ]
 +               dc.b <[SCREEN_BASE+(3*40) ]
 +               dc.b <[SCREEN_BASE+(4*40) ]
 +               dc.b <[SCREEN_BASE+(5*40) ]
 +               dc.b <[SCREEN_BASE+(6*40) ]
 +               dc.b <[SCREEN_BASE+(7*40) ]
 +               dc.b <[SCREEN_BASE+(8*40) ]
 +               dc.b <[SCREEN_BASE+(9*40) ]
 +               dc.b <[SCREEN_BASE+(10*40)]
 +               dc.b <[SCREEN_BASE+(11*40)]
 +               dc.b <[SCREEN_BASE+(12*40)]
 +               dc.b <[SCREEN_BASE+(13*40)]
 +               dc.b <[SCREEN_BASE+(14*40)]
 +               dc.b <[SCREEN_BASE+(15*40)]
 +               dc.b <[SCREEN_BASE+(16*40)]
 +               dc.b <[SCREEN_BASE+(17*40)]
 +               dc.b <[SCREEN_BASE+(18*40)]
 +               dc.b <[SCREEN_BASE+(19*40)]
 +               dc.b <[SCREEN_BASE+(20*40)]
 +               dc.b <[SCREEN_BASE+(21*40)]
 +               dc.b <[SCREEN_BASE+(22*40)]
 +               dc.b <[SCREEN_BASE+(23*40)]
 +               dc.b <[SCREEN_BASE+(24*40)]
 +
 +SCR_TABLE_H    dc.b >[SCREEN_BASE+(0*40) ]
 +               dc.b >[SCREEN_BASE+(1*40) ]
 +               dc.b >[SCREEN_BASE+(2*40) ]
 +               dc.b >[SCREEN_BASE+(3*40) ]
 +               dc.b >[SCREEN_BASE+(4*40) ]
 +               dc.b >[SCREEN_BASE+(5*40) ]
 +               dc.b >[SCREEN_BASE+(6*40) ]
 +               dc.b >[SCREEN_BASE+(7*40) ]
 +               dc.b >[SCREEN_BASE+(8*40) ]
 +               dc.b >[SCREEN_BASE+(9*40) ]
 +               dc.b >[SCREEN_BASE+(10*40)]
 +               dc.b >[SCREEN_BASE+(11*40)]
 +               dc.b >[SCREEN_BASE+(12*40)]
 +               dc.b >[SCREEN_BASE+(13*40)]
 +               dc.b >[SCREEN_BASE+(14*40)]
 +               dc.b >[SCREEN_BASE+(15*40)]
 +               dc.b >[SCREEN_BASE+(16*40)]
 +               dc.b >[SCREEN_BASE+(17*40)]
 +               dc.b >[SCREEN_BASE+(18*40)]
 +               dc.b >[SCREEN_BASE+(19*40)]
 +               dc.b >[SCREEN_BASE+(20*40)]
 +               dc.b >[SCREEN_BASE+(21*40)]
 +               dc.b >[SCREEN_BASE+(22*40)]
 +               dc.b >[SCREEN_BASE+(23*40)]
 +               dc.b >[SCREEN_BASE+(24*40)]
 +
 +;-----------------------------------------------------------------------------
 +; KEYSCAN - Entered with desired key in A, Carry set if pressed.
 +;-----------------------------------------------------------------------------
 +
 +KEYSCAN        STY KEYT
 +               PHA
 +               LSR
 +               LSR
 +               LSR
 +               TAY
 +               LDA COLUMN,Y
 +               STA $DC00
 +               PLA
 +               AND #7
 +               TAY
 +               LDA $DC01
 +               AND ROW,Y
 +               BNE NOT_PRESS
 +               LDA #$FF
 +               STA $DC00
 +               LDA $DC01
 +               AND ROW,Y
 +               BEQ NOT_PRESS
 +               SEC
 +               BCS GOT_KEY              ; always
 +NOT_PRESS      CLC
 +GOT_KEY        LDY KEYT
 +               LDA #$FF
 +               STA $DC00
 +               LDA #$7F
 +               STA $DC01
 +               RTS
 +
 +;
 +KEYT           dc.b 0
 +COLUMN         HEX FEFDFBF7EFDFBF7F
 +ROW            HEX 0102040810204080
 +;
 +;-----------------------------------------------------------------------------
 +; LOADER - Suprisingly enough this bit handles the cassette loading !
 +;-----------------------------------------------------------------------------
 +
 +LOADER         SEI
 +               LDA #5                   ; ROMS's out cassette motor on
 +               STA 1
 +               LDA #$1F                 ; Clear any spurious interrupts
 +               STA $DC0D
 +               LDA $DC0D
 +               LDA #<$0368
 +               STA $DC04                ; Set CIA #1 Timer A countdown time
 +               LDA #>$0368
 +               STA $DC05
 +               LDA #$90
 +               STA $DC0D
 +               LDA #<CASBUF
 +               STA $FFFE                ; Point the interrupt vector to loader
 +               LDA #>CASBUF
 +               STA $FFFF
 +               LDA #0
 +               STA LODFLAG
 +               STA BITIN
 +
 +LEXIT          NOP                      ; Modifies from NOP-CLI-RTS
 +               JMP ASeCURE
 +;
 +RESTOAR        LDA #7
 +               STA 1
 +               LDA CHKSUM
 +               CMP VERIFY               ; Check the Checksum
 +               BNE LODERR
 +               RTS
 +
 +LODERR         JMP $FCE2                ; LOAD ERROR
 +
 +SeCURE         LDA #<APRIMR
 +               STA $FFFA                ; Set timer in single shot mode
 +               LDA #>APRIMR
 +               STA $FFFB                ; Start NMI but don't clear it
 +               LDA #$01
 +               STA $DD05                ; This screws up Freeze Frame IIIb
 +               LDA #$81
 +               STA $DD0D
 +               LDA #$99
 +               STA $DD0E
 +HOLD           BNE HOLD
 +
 +               ORG LOADER-UNUSED+IERRoR
 +SAVVEC
 +               ORG LOADER-UNUSED+UNUSD2
 +LODEND
 +
 +FLNAME         dc.b $05,$93              ; White text, Clear screen
 +               dc.b "RAINBOW.     "      ; Game file name 13 Letters MAX
 +               dc.b $1F                  ; Blue text
 +
 +LODIRQ         PHA
 +               TYA
 +               PHA
 +
 +               LDA $D020                ; Flash the screen
 +               EOR #5
 +               STA $D020
 +
 +               LDA $DC05
 +               LDY #$19                 ; Trigger the counters
 +               STY $DC0E
 +               EOR #$02
 +               LSR
 +               LSR                      ; Shift in a BIT
 +               ROL BITIN
 +               LDA BITIN
 +BITDEC         BCC BYTGOT               ; Got a full BYTE ?
 +BITDEF         BCS EXIT
 +BYTGOT         CMP #HEDBYT              ; Is it a Header ?
 +               BNE EXIT
 +               LDA #BYTGT1-BITDEF
 +               STA ABITDC
 +
 +EX1            LDA #$FE                 ; Get next sequence of BITS
 +               STA BITIN
 +EXIT           LDA $DC0D                ; Acknowledge NMI
 +               PLA
 +               TAY
 +               PLA
 +NMIVEC         RTI                      ; Return
 +
 +;
 +
 +BYTGT1         CMP #HEDBYT
 +               BEQ EX1                  ; Confirmed Header Byte
 +               CMP #HEDEND              ; Is it a Header END marker ?
 +               BEQ BYTGT2               ; Yes it is
 +               BNE BYTGT7
 +
 +BYTGT2         LDA #BYTGT3-BITDEF
 +               STA ABITDC
 +               LDA #0                   ; Clear the checksum
 +               STA CHKSUM
 +               BEQ EX1                  ; Branch Always !
 +
 +BYTGT3         STA LSTART               ; Store Load Address
 +               INC ABYTG3
 +               LDA ABYTG3
 +               CMP #LSTART+4
 +               BNE EX1
 +               LDA #BYTGT4-BITDEF
 +               STA ABITDC
 +               BNE EX1
 +
 +BYTGT4         LDY #0
 +               STA (LSTART),          ; Store recieved BYTE
 +               EOR CHKSUM
 +               STA CHKSUM               ; Store Checksum
 +               INC LSTART               ; Bump the LOAD ADDRESS COUNTER
 +               BNE BYTGT5
 +               INC LSTART+1
 +               INC $D020
 +
 +BYTGT5         LDA LSTART               ; Have we finished yet ?
 +               CMP LEND
 +               LDA LSTART+1
 +               SBC LEND+1
 +               BCC EX1                  ; No
 +               LDA #BYTGT6-BITDEF
 +               STA ABITDC
 +               BNE EX1
 +
 +BYTGT6         STA VERIFY               ; Store the verify BYTE
 +               LDA #$FF                 ; Signal to FREELOAD that a load
 +               STA LODFLAG              ; has completed
 +               LDA #LSTART
 +               STA ABYTG3
 +
 +BYTGT7         LDA #BYTGOT-BITDEF       ; Reset ready for next file
 +               STA ABITDC
 +               BNE EX1
 +
 +PRIMARY        CLI
 +               LDA #$58
 +               STA ALECLI               ; Self modifying CLI byte
 +               LDA #$1B
 +               STA $D011                ; Screen on
 +
 +PAUSE          LDA LODFLAG              ; Free running program to get
 +               BEQ PAUSE                ; the FREELOAD program in
 +
 +;      JSR ARESTR                       ; This does a checksum
 +
 +               LDA #<STARTUP
 +               STA ALEJMP               ; Point to the FREELOAD Start Address
 +               LDA #>STARTUP
 +               STA ALEJMP+1
 +               JMP UNUSED               ; Jump to it
 +
 +FILEND         EQU .
 +
 +;-----------------------------------------------------------------------------
 +;VARIABLES - Lots & lots of 'em
 +;-----------------------------------------------------------------------------
 +
 +VICCR1         EQU $D011
 +C1TIMA         EQU $DC04
 +C2TIMA         EQU $DD04
 +C1ICR          EQU $DC0D
 +C2ICR          EQU $DD0D
 +C1CRA          EQU $DC0E
 +C2CRA          EQU $DD0E
 +UNUSED         EQU $02A7
 +UNUSD2         EQU $0334
 +IERRoR         EQU $0300
 +CASBUF         EQU $0351
 +IOINIT         EQU $FF84
 +SETLFS         EQU $FFBA
 +SETNAM         EQU $FFBD
 +HEADER         EQU $F76A
 +SAVE           EQU $F867
 +CLOSE          EQU $FFC3
 +READY          EQU $A474
 +
 +; All these EQUates are used to relocate the Loader to $02A7
 +
 +APRIMR         EQU (PRIMARY-LODIRQ)+CASBUF
 +ABYTG3         EQU (BYTGT3-LODIRQ)+CASBUF+1
 +ANMIVC         EQU (NMIVEC-LODIRQ)+CASBUF
 +ABITDC         EQU (BITDEC-LODIRQ)+CASBUF+1
 +ALECLI         EQU (LEXIT-LOADER)+UNUSED
 +ALEJMP         EQU (LEXIT-LOADER)+UNUSED+2
 +ARESTR         EQU (RESTOAR-LOADER)+UNUSED
 +ASeCURE        EQU (SeCURE-LOADER)+UNUSED
 +
 +FINISH         EQU .
 +
 +;
 +; Finito, all is now done ...... Sleep !
 +;
 +
 +</code>
 +
 +
 +
  
base/freeload_v5.0_saver.txt ยท Last modified: 2015-04-17 04:32 (external edit)