
;Willams cart 64K 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
BASE      = $0600
RUNGAME = TABLE

        Org $0600 ; (This Data will be located at $A000)

TABLE  .BYTE $00,$0C                   ; Game Start Addrss $1300
       .BYTE $01,$00,$A0,$00,$0C,$00,$C0 ; Bank 01, A000 -> 5000 move 8K bytes
       .BYTE $02,$00,$A0,$00,$2C,$00,$C0 ; Bank 02, A000 -> 7000 move 8K bytes
       .BYTE $03,$00,$A0,$00,$4C,$00,$C0 ; etc
       .BYTE $04,$00,$A0,$00,$6C,$00,$C0
       .BYTE $05,$00,$A0,$00,$8C,$00,$C0
       .BYTE $06,$00,$A0,$00,$AC,$00,$B4
       .BYTE $FF,$00,$00,$00,$00,$00,$00,$00 ; $FF ends the copy routine

START   STX $03E9
        STX $03EA
        DEX
        STX $D301
        LDA #$01
        STA $09
        STA $42
        STA $03F8

        LDA #<TABLE      ; Points to the begining of the table
        STA TMPTABLE
        LDA #>TABLE
        STA TMPTABLE+1

        INC TMPTABLE     ; Skip first 2 bytes of table (games run address)
        INC TMPTABLE

; ** routine to copy more then 1 page ($A000->$0600) **

        LDX #$2            ; # of pages to move
        LDA #$00
        STA TMPFROM
        STA TMPTO
        LDA #$A0
        STA TMPFROM+1
        LDA #>BASE
        STA TMPTO+1
L11     LDY #0
L22     STA $D500
        LDA (TMPFROM),Y
        STA $D508
        STA (TMPTO),Y
        INY
        BNE L22
        DEX
        BEQ DONE
        INC TMPFROM+1  ; next page of RAM
        INC TMPTO+1
        JMP L11
DONE    JMP COPY    ; ie. jmp 0600 region to move code out of cartridge


COPY      LDA #$00
          STA $D40E
          SEI
          LDA #$FE
          STA $D301
L33       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 L33            ; 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 #<EXITCART ;**
          STA DOSVEC
          STA DOSINI
          LDA #>EXITCART ;**
          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
;
EXITCART     JMP (RUNGAME)



;
          Org $BFFA
          .WORD $0000
          .BYTE $00
          .BYTE $00
          .WORD START+$9A00
