;Willams cart Bank Copy / Run routine
;written by Nir Dary
;
;i.e SpeedKing game from Mastertronics
;Loads to memory $5480 -> $9840, Run address $9800
DOSINI = $0C ;**
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 = $DA ;Game Run address
Org $0600 ; (This Data will be located at $A000)
TABLE .BYTE $00,$50 ; Game Start Addrss $5000
.BYTE $01,$00,$A0,$00,$50,$00,$C0 ; Bank 01, A000 -> 5000 move 8K bytes
.BYTE $02,$00,$A0,$00,$70,$00,$C0 ; Bank 02, A000 -> 7000 move 8K bytes
.BYTE $FF,$00,$00,$00,$00,$00,$00 ; $FF ends the copy routine
.BYTE $00
START STX $03E9
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 #$C0 ;Some games need 40???**
STA $D40E ;NMI interrupts allowed, see Mapping Atari
CLI
LDA #WAIT3+1 ;**
STA DOSINI+1
STA DOSVEC+1
LDA #$C0 ;C000 high byte
STA $2E4 ;system size, sometimes not important, sometimes is!
STA $2E6 ;**
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
LDA #$00
STA $244 ; COLDST
LDA #$01
STA $08 ; WARMST
RTS
;
WAIT3 LDA $14 ;*****
CLC
ADC #$03 ;3 SCREENS
L3 CMP $14
BNE L3
JMP (TMPRUN) ;don't know if this works
;the way I want
;JMP (TMPRUN) ?
;JMP (0600) ?
;JMP $5000 is what I'd
;like, guess it don't
;matter much.
;
Org $BFFA
.WORD $0000
.BYTE $00
.BYTE $00
.WORD START