; raw frame for generic 64KB cartridge images ; v 1.0 enthusi 06/2012 ; this 64 KB Cartridge framework was written for http://www.rgcd.co.uk ; feel free to use/change this code and give credits :) ; you will find this document also at http://codebase64.org ; this is a VERY simple but efficient approach, you can make more ; sophisticated usage of ROM using an own depacker routine etc.... ; sources are in XA format but no special features are used ; I strongly recommend the usage of cartconv which comes with vice ;---------------------------------------------------------- ; recent builds of VICE support the RGCD cartridge format, ; grab it at http://vice.pokefinder.org ;--------------------------------------------------------- ; example usage: ; xa -M frame64kb.asm -o game_raw.bin ; cartconv -t rgcd -i game_raw.bin -o game.crt ; x64sc -cartcrt frame.crt ;---------------------------------------------------------- ;no load-adress for bin-file, so no header here *=$8000 .word launcher ;cold start .word launcher ;warm start .byte $c3 ;c .byte $c2 ;b .byte $cd ;m .byte $38 ;8 .byte $30 ;0 launcher stx $d016 jsr $fda3 ;prepare irq jsr $fd50 ;init memory jsr $fd15 ;init i/o jsr $ff5b ;init video ;make sure this sets up everything you need, ;the calls above are probably sufficient ldx #$fb txs ;clear screen and set to black lda #0 ldx #250 clearloop sta $d800-1+250*0,x sta $d800-1+250*1,x sta $d800-1+250*2,x sta $d800-1+250*3,x dex bne clearloop sei lda #$00 sta $d020 sta $d021 lda #$37 sta $01 ;---------------------------- ;prepare cart-loader in stack init_mover ldx #$00 loop1 lda mover,x sta $0100,x inx cpx #(mover_end-mover) bne loop1 ;display RGCD-logo jsr setup_logo jmp $0100 ;======================== mover lda #$00 sta $fc lda #$89 sta $fd lda #$01 sta $fe lda #$08 sta $ff ldx #$17 loop2 ldy #$00 loop3 lda ($fc),y ;8900 sta ($fe),y ;0800 iny bne loop3 inc $fd inc $ff dex bne loop2 ;continue on bank 1 lda #$01 ;de00 =1 sta $fb ;----------------------- loop4 sta $de00 lda #$00 sta $fc lda #$80 sta $fd ldx #$20 loop5 ldy #$00 loop6 lda ($fc),y ;8000 (start of bank) inc $01 sta ($fe),y ;continue from 0800 on... dec $01 iny bne loop6 ;1 page inc $fd inc $ff dex bne loop5 ;32 pages = 8 KB inc $fb ;0-7 lda $fb cmp #$08 bne loop4 sei lda #$08 ;kill cart sta $de00 ldx #$ff txs lda #$00 tax tay lda $d011 and #%11101111 sta $d011 ;launch main program, configure this adress here and make sure ;to have ZP, I/O, VIC-REGS properly set up! jmp $80d mover_end ;-------------------------------- #define OFF 7 setup_logo .( ldx #0 sll1 lda text,x sta $f000+40*(1+OFF),x inx bne sll1 sll2 lda text+$100,x sta $f000+40*(1+OFF)+$100,x inx bne sll2 ;charset csl lda charset+$100*0,x sta $f800 +$100*0,x lda charset+$100*1,x sta $f800 +$100*1,x lda charset+$100*2,x sta $f800 +$100*2,x lda charset+$100*3,x sta $f800 +$100*3,x lda charset+$100*4,x sta $f800 +$100*4,x lda charset+$100*5,x sta $f800 +$100*5,x lda charset+$100*6,x sta $f800 +$100*6,x dex bne csl ;colors ldx #$28 cl2 lda #9 sta $d800+40*(1+OFF),x lda #2 sta $d800+40*(2+OFF),x lda #4 sta $d800+40*(3+OFF),x lda #14 sta $d800+40*(4+OFF),x lda #3 sta $d800+40*(5+OFF),x lda #13 sta $d800+40*(6+OFF),x lda #1 sta $d800+40*(7+OFF),x lda #6 sta $d800+40*(8+OFF),x dex bpl cl2 lda #6 sta $d800+40*(7+OFF)+18 sta $d800+40*(7+OFF)+19 sta $d800+40*(7+OFF)+20 sta $d800+40*(7+OFF)+21 sta $d800+40*(6+OFF)+19 sta $d800+40*(6+OFF)+20 lda #%11001110 sta $d018 lda #%00010100 sta $dd00 rts text .bin 2,0,"logo.screen" charset .bin 2,0,"logo.bitmap" after_charset .) ;------------------------- .dsb $8900-*,0 .bin 2,0,"heartlight.prg" e1 .dsb $18000-*,0 ;fill up to complete 65535 Bytes e2 You find this file and the 3 addition files "logo.screen" "logo.bitmap" "heartlight.prg" In this zip-file: {{:sourcecode:frame64kb.zip|}}