;Willams cart Bank Copy / Run routine ;written by Nir Dary ; ;i.e SpeedKing game from Mastertronics ;Loads to memory $5480 -> $9840, Run address $9800 DOSVEC = $0A TMPFROM = $CA ;Tmp Source addrss TMPTO = $CC ;Tmp Destination address TMPEND = $CE ;Tmp Last source address to copy TMPTABLE = $D0 ;Table address TMPRUN = $D2 ;Game Run address *=$0600 ; (This Data will be located at $A000) TABLE .BYTE $00,$32 ; Game Start Addrss $3200 .BYTE $00,$00,$A2,$E7,$2F,$00,$B4 ; Bank 00, A100 -> 2FE7 (move bytes) .BYTE $FF,$00,$00,$00,$00,$00,$00 ; $FF to end copy routine. .BYTE $00,$00,$00,$00,$00,$00,$00 ; $00 are extra space for future .BYTE $00,$00,$00,$00,$00,$00,$00 ; Hex edit purpose .BYTE $00,$00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00,$00 .BYTE $00 START STX $03E9 ;address $0700 ($A100) STX $03EA DEX STX $D301 LDA #$01 STA $09 STA $42 STA $03F8 LDA #TABLE STA TMPTABLE+1 LDA (TMPTABLE),Y ; Load GameRun Address from table STA TMPRUN INC TMPTABLE LDA (TMPTABLE),Y STA TMPRUN+1 INC TMPTABLE LDA #$00 ; Move 0100 bytes to 0600 region, jump there to finish load STA TMPTO STA TMPFROM TAY LDA #$06 STA TMPTO+1 LDA #$A0 STA TMPFROM+1 L11 LDA (TMPFROM),Y STA (TMPTO),Y INY BNE L11 JMP COPY ;ie. jmp 0600 region to move code out of cartridge COPY LDA #$00 STA $D40E SEI LDA #$FE STA $D301 L22 LDY #$00 ;Load Bank# from table into X register LDA (TMPTABLE),Y ;and deted if End of Table then exit to run game CMP #$FF BEQ EXITCOPY TAX INC TMPTABLE LDA (TMPTABLE),Y ; Load Source Address from table STA TMPFROM INC TMPTABLE LDA (TMPTABLE),Y STA TMPFROM+1 INC TMPTABLE LDA (TMPTABLE),Y ;Load Destination Address from table STA TMPTO INC TMPTABLE LDA (TMPTABLE),Y STA TMPTO+1 INC TMPTABLE LDA (TMPTABLE),Y ;Load End address of copy sequace STA TMPEND INC TMPTABLE LDA (TMPTABLE),Y STA TMPEND+1 INC TMPTABLE ;Start of Copy Routine MAINLOOP STA $D500,X ;enter Williams cart desired bank LDA (TMPFROM),Y STA $D508 ;Turn cartrige off STA (TMPTO),Y INC TMPFROM BNE L1 INC TMPFROM+1 L1 INC TMPTO BNE L2 INC TMPTO+1 L2 LDA TMPFROM+1 ; Copy unitl address end addres in table CMP TMPEND+1 BNE MAINLOOP LDA TMPFROM CMP TMPEND BNE MAINLOOP BEQ L22 ; Do next Bank? EXITCOPY LDA #$22 STA $D400 ;DMA control LDA #$FF STA $D301 ;RAM under ROM off, ROM on LDA #$40 ;Some games need C0??? STA $D40E ;NMI interrupts allowed, see Mapping Atari CLI LDA TMPRUN STA DOSVEC LDA TMPRUN+1 STA DOSVEC+1 LDA #$C0 ;C000 high byte STA $2E4 ;system size, sometimes not important, sometimes is! STA $6A ;dl list ends here and goes down in memory apprx0300h bytes. LDA #$00 ;cart interlock, could be LDA d013 STA $03FA ;off STA $42 ;critic OK for long interrupts RTS .BYTE $00,$00,$00,$00,$00 ; extra bytes to fill till $*+0100 *=$BFFA .WORD START .BYTE $00 ;MUST BE 0 .BYTE $04 ;DOS=5,NODOS=4 .WORD START