;----------------------------------------------------------------------------- ; ; FREELOAD Cassette multi load program with raster tricks ; ; Original source by PAUL HUGHES ; Additional programming by RICHARD BAYLISS ; ; Requires the following tools: ; ; DASM cross assembler ; FREESAVE (Optional if you want to do standard tape masters transferrable ; on a Commodore 64 disk) ; otherwise google the following tools to help construct your tap ... ; TAPCLEAN (Latest version) - For extracting any of the FREELOAD boot loaders ; (view as DASM - Optional, as I provided the boot loader+header from SUB ; HUNTER). ; PRG2TAP (Latest version) - For making .tap files out of your programs ; ;----------------------------------------------------------------------------- ; ;This source is my EXPERIMENTAL BUILD for TheChaosEngine's PRG2TAP software ; ;Loader starts at $e000, tested on the SUB HUNTER boot tape turbo. You may ;change the address to where to put the loader. Music is linked at $f000 ;or assemble this source as A.PRG for FREESAVE, make sure the correct ;load address and jump address has been setr on the loader. ; ;----------------------------------------------------------------------------- ;LOADER'S FUNCTION ;Usage ... Plays music ($f000-$fffa), and displays picture then runs game ;music already attached to loader. ;Your picture, split into 3 different files. They are as follows ;Runs game when finished! ;----------------------------------------------------------------------------- MUSICINIT EQU $F000 ;Music initialise address MUSICPLAY EQU $F003 ;Music play address VIDEODATA EQU $BF40 ;Memory of relocated VIDEO RAM from picture COLOURDATA EQU $C328 ;Memory of relocated COLOUR RAM from picture BGCOLOUR EQU $C710 ;Picture's background colour ;----------------------------------------------------------------------------- processor 6502 ;----------------------------------------------------------------------------- ; ; Constants ; HEADER_BYTE EQU $40 ;header byte value HEADER_END EQU $5A ;header end byte value ;----------------------------------------------------------------------------- ; ;VARIABLES - Variables used by cassette loader, MUST follow contiguously ; seg.u data ZP EQU $20 ORG ZP XPOS EQU $05 LOAD_ADDR dc.w 0 ;loader data start LOAD_END dc.w 0 ;loader data end VERIFY dc.b 0 ;saved checksum CHECKSUM dc.b 0 ;checksum value BIT_COUNT dc.b 0 ;bit store LOAD_FLAG dc.b 0 ;loader monitor flag ;----------------------------------------------------------------------------- ; seg code ORG $e000 ;Or wherever you want to place it ! ;Clear the screen, by filling it with the spacebar character. LDX #$00 CLEARSCREEN1 LDA #$20 STA $0400,X STA $0500,X STA $0600,X STA $06E8,X INX BNE CLEARSCREEN1 ;Draw the yellow dividers. Scroll line should be white LDX #$00 DIVIDERS LDA #$40 STA $0770,X STA $07C0,X LDA #$07 STA $DB70,X STA $DBC0,X LDA #$01 STA $DB98,X INX CPX #$28 BNE DIVIDERS ;Due to the nature of the assembler, change the C64 ;character mode to display SHIFTED CHARS as normal ;letters. LDA #$16 STA $D018 ;Initialiase the scrolling message LDA #1 STA SCROLLACTIVE LDA #SCROLLTEXT STA MESSREAD+2 ;Reset file counter and black out border and background LDA #0 STA FILELOADED STA $D020 STA $D021 LDA #0 STA $83ff ;Set $83ff as overflow byte. If ;overwritten, the loader should ;switch off the picture. ;Call out to initialise turbo, and allow after each turbo load the tape ;loader to constantly loop, until a process in the filename check is ;finished to run the game. JSR INIT_TURBO LOADLOOP JSR TURBO_LOAD JMP LOADLOOP ;----------------------------------------------------------------------------- ; ; INIT_TURBO - Initialises Freeload ; INIT_TURBO SEI LDA #0 STA LOAD_FLAG ;reset load flag STA BIT_COUNT ;reset bit count STA $D01A ;halt rasters LDA #$0F STA $D019 ;halt NMI's LDA #$7F ;latch interrupts STA $DC0D STA $DD0D LDA $DC0D ;unlatch interrupts LDA $DD0D LDA #5 ;ROMS's out cassette motor on STA 1 LDA #<$0368 STA $DC04 ;set CIA #1 Timer A countdown time LDA #>$0368 STA $DC05 LDA #$90 STA $DC0D LDA #LOADER_IRQ STA $FFFF CLI JSR IRQLOADER ;Call the raster loops for scrolling, ;and playing music when valid. ;----------------------------------------------------------------------------- ; ; TURBO_LOAD - Entered with "Y" equals number of files to load ; TURBO_LOAD LDX LOAD_FLAG ;wait for nonzero loadflag value BEQ TURBO_LOAD INX ;reset loadflag STX LOAD_FLAG DEY ;get next file BNE TURBO_LOAD SEI LDA #$35 ;motor off, ROMS out STA 1 LDA #$7F ;unlatch interrupts STA $DC0D STA $DD0D LDA $DC0D LDA $DD0D LDA #0 ;reset border colour STA $D020 LDA #$1B STA $D011 ;screen on RTS ;----------------------------------------------------------------------------- ; ; LOADER_IRQ - All data is recieved through here ; LOADER_IRQ PHA TYA PHA LDA $D020 ;BORDER FLASH - THIS CAN BE CHANGED TO HOW YOU EOR #$05 ;WOULD LIKE YOUR SCHEME. STA $D020 LDA $DC05 LDY #$19 ;trigger the counters STY $DC0E EOR #2 LSR LSR ;shift in a BIT ROL BIT_COUNT ;until dummy bit 7 gets shifted out LDA BIT_COUNT BRANCH_MOD_1 BCC WAIT_HEADER ;self modified branch REFERENCE BCS EXIT WAIT_HEADER CMP #HEADER_BYTE ;is it a Header ? BNE EXIT LDA #HEADER_CHECK-REFERENCE STA BRANCH_MOD_1+1 SET_AND_EXIT LDA #%11111110 ;init bit counter for the next 8 STA BIT_COUNT EXIT LDA $DC0D ;acknowledge NMI PLA TAY PLA RTI ;return ;---- HEADER_CHECK CMP #HEADER_BYTE BEQ SET_AND_EXIT ;confirmed Header Byte CMP #HEADER_END ;is it a Header END marker ? BEQ CLEAR_CHECKSUM ;yes it is BNE SET_HEADER ;---- CLEAR_CHECKSUM LDA #SET_LOAD_ADDR-REFERENCE STA BRANCH_MOD_1+1 LDA #0 ;clear the checksum STA CHECKSUM BEQ SET_AND_EXIT ;branch always ! ;---- SET_LOAD_ADDR STA LOAD_ADDR ;store start Address INC SET_LOAD_ADDR+1 ;and end address LDA SET_LOAD_ADDR+1 CMP #LOAD_ADDR+4 BNE SET_AND_EXIT LDA #STORE_BYTE-REFERENCE STA BRANCH_MOD_1+1 BNE SET_AND_EXIT ;branch always ! ;---- STORE_BYTE LDY #0 DEC 1 ;page $D0 enabled STA (LOAD_ADDR),Y ;Store recieved BYTE INC 1 ;page $D0 disabled EOR CHECKSUM STA CHECKSUM ;store Checksum INC LOAD_ADDR ;bump the LOAD ADDRESS COUNTER BNE NO_DRAW INC LOAD_ADDR+1 INC $D020 ;BORDER CYCLE PER BLOCK LOADED - CAN ALSO BE DISABLED, USING BIT ;INSTEAD OF INC (OR JUST DELETE IT) IF YOU DON'T WANT THAT FEATURE NO_DRAW LDA LOAD_ADDR ;have we finished yet ? CMP LOAD_END LDA LOAD_ADDR+1 SBC LOAD_END+1 BCC SET_AND_EXIT ;no LDA #LOAD_COMPLETE-REFERENCE STA BRANCH_MOD_1+1 BNE SET_AND_EXIT ;branch always ! ;---- LOAD_COMPLETE STA VERIFY ;store the verify BYTE LDA #$FF ;signal to FREELOAD that a load STA LOAD_FLAG ;has completed LDA #LOAD_ADDR STA SET_LOAD_ADDR+1 ;reset low byte of load address JSR CHECKWHATLOADED ;Which program loaded? SET_HEADER LDA #WAIT_HEADER-REFERENCE STA BRANCH_MOD_1+1 ;reset ready for the next file BNE SET_AND_EXIT ;branch always ! AA ;------------------------------------------------------------ ; IRQ Loaders' raster control, for playing the music ;------------------------------------------------------------ IRQLOADER ;Let the raster reach a set position RASTER1 LDA $83FF ;Check byte CMP #$00 ;Zero byte overwritten? BEQ RASTER1B LDA #$7B ;Blank out the picture STA $D011 RASTER1B LDA $D012 CMP #$E2 BCC RASTER1 LDA XPOS STA $D016 ;If the loading music has loaded, then prompt ;music to be ready to play. Otherwise ignore it LDA MUSICREADY CMP #1 BNE RASTER2 ;Test scroll text routine ;MUSICREADY POINTER = 0, skips music playing. ;MUSICREADY POINTER = 1, allow play it :) JSR MUSICPLAY ;Let the raster skip past a set position RASTER2 LDA $D012 CMP #$E2 BCS RASTER2 LDA #$18 STA $D016 JSR SCROLLER JMP IRQLOADER ;Scroll text routine (Slides message across the screen) SCROLLER LDA SCROLLACTIVE CMP #1 BEQ DOSCROLL LDA #$18 STA XPOS RTS DOSCROLL LDA XPOS SEC SBC #2 ;SPEED OF SCROLLING MESSAGE AND #7 STA XPOS BCS EXITSCROLL LDX #$00 WRAP LDA $0799,X ;CHAR MOVER STA $0798,X INX CPX #$27 BNE WRAP MESSREAD LDA SCROLLTEXT ;IF BYTE 0 (@) DETECTED, LOOP SCROLL CMP #$00 BNE STORECHR LDA #SCROLLTEXT STA MESSREAD+2 JMP MESSREAD ;OTHERWISE STORE TO LAST CHARACTER STORECHR STA $07BF INC MESSREAD+1 BNE EXITSCROLL INC MESSREAD+2 EXITSCROLL RTS ;What has loaded FILELOADED is set to the following order: ; ; 1 - LOADING MUSIC ; 2 - KOALAPAINT PICTURE - COLOUR + VIDEO RAM DATA ; 3 - KOALAPAINT PICTURE - BITMAP DATA ; 4 - MAIN PROGRAM ; 5 - BASIC / RUN STARTER CODE FOR RUNNING THE GAME CHECKWHATLOADED LDA #$01 STA $FC LDA FILELOADED CLC ADC #1 STA FILELOADED LDA FILELOADED CMP #$01 ;Have we loaded the MUSIC? BEQ MUSICLOADED ;Yes, play it CMP #$02 ;Has the KOALAPIC loaded? BEQ DISPLAYPICTURE ;Yes, setup and display it,and disable scroll CMP #$03 ;Have we loaded the GAME? BEQ BLANKOUT ;Yes, blank screen and load BASIC RUN/INIT routine CMP #$04 ;Have we loaded the BASIC RUN/INIT Routine? BEQ RUNGAME ;Yes, run game. LDA #$00 STA $FC SKIPFILELOADED RTS ;Nothing Required. Simply skip loading BLANKOUT LDA #$7B STA $D011 RTS ;Loading music has loaded. Allow initialise the music once ;then switch the music player on. MUSICLOADED LDA #0 ;SONG NUMBER JSR MUSICINIT LDA #1 STA MUSICREADY RTS ;Our Koala Paint picture has finished loading. Setup and ;display the picture. DISPLAYPICTURE LDA #0 STA SCROLLACTIVE ;Disable scroll LDX #$00 COPYPICPROPS LDA COLOURDATA,X STA $D800,X LDA COLOURDATA+$100,X STA $D900,X LDA COLOURDATA+$200,X STA $DA00,X LDA COLOURDATA+$2E8,X STA $DAE8,X LDA VIDEODATA,X STA $8400,X LDA VIDEODATA+$100,X STA $8500,X LDA VIDEODATA+$200,X STA $8600,X LDA VIDEODATA+$2E8,X STA $86E8,X INX BNE COPYPICPROPS LDA #$01 STA $DD00 LDA #$3B STA $D011 LDA #$18 STA $D018 LDA #$18 STA $D016 LDA BGCOLOUR STA $D021 LDA #0 STA $D020 RTS ;Game has loaded. Run it RUNGAME SEI LDX #$00 CLEARSCREEN LDA #$00 STA $D800,X STA $D900,X STA $DA00,X STA $DAE8,X INX BNE CLEARSCREEN LDA #$1B STA $D011 LDA #$03 STA $DD00 LDA #$14 STA $D018 LDA #$08 STA $D016 LDA #0 STA $D020 STA $D021 LDX #$00 CLEARSID LDA #$00 STA $D400,X INX CPX #$18 BNE CLEARSID CLI JMP $0400 ;BASIC STARTER SCROLLACTIVE DC.B 0 FILELOADED DC.B 0 MUSICREADY DC.B 0 SCROLLTEXT DC.B "FREELOAD NOW LOADING STARFYSH ... COPYRIGHT 2017 THE NEW DIMENSION ... PROGRAMMING BY RICHARD BAYLISS ... " DC.B "GRAPHICS BY SHAUN PEARSON AND JON EGGLETON ... MUSIC BY RICHARD BAYLISS ... TAPE TURBO BY PAUL HUGHES ... " DC.B "MASTERED WITH PRG2TAP BY THE CHAOS ENGINEER/HOKUTO FORCE ... ENJOY THE SHOW ... " DC.B 0 ; ************** END OF LOADER **********************