diff --git a/snes/boot/Makefile b/snes/boot/Makefile new file mode 100644 index 0000000..009bafd --- /dev/null +++ b/snes/boot/Makefile @@ -0,0 +1,19 @@ +OBJS = header.ips reset.o65 main.o65 font.o65 palette.o65 data.o65 const.o65 text.o65 dma.o65 # gfx.o65 # vars.o65 + +all: menu.bin menu.smc + +menu.smc: menu.bin + cat menu.bin sd2snes.rom > $@ +menu.bin: $(OBJS) + sneslink -fsmc -o $@ $^ + +# Generic rule to create .o65 out from .a65 +%.o65: %.a65 + snescom -J -Wall -o $@ $< + +# Generic rule to create .ips out from .a65 +%.ips: %.a65 + snescom -I -J -Wall -o $@ $< + +clean: + rm -f *.ips *.o65 *~ menu.bin diff --git a/snes/boot/const.a65 b/snes/boot/const.a65 new file mode 100644 index 0000000..4a29dec --- /dev/null +++ b/snes/boot/const.a65 @@ -0,0 +1,14 @@ +version .byt " v0.1",0 +zero .word 0 +bg2tile .byt $20 + +space64 .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $20, $20, $20, $20, $20, $20, $20, $20 + .byt $00 +text_dirmark .byt " ", 0 diff --git a/snes/boot/data.a65 b/snes/boot/data.a65 new file mode 100644 index 0000000..65a3220 --- /dev/null +++ b/snes/boot/data.a65 @@ -0,0 +1,41 @@ +.data +;don't anger the stack! +;----------parameters for text output---------- +print_x .byt 0 ;x coordinate + .byt 0 +print_y .byt 0 ;y coordinate + .byt 0 +print_src .word 0 ;source data address +print_bank .byt 0 ;source data bank +print_pal .word 0 ;palette number for text output +print_temp .word 0 ;work variable +print_count .byt 0 ;how many characters may be printed? +print_count_tmp .byt 0 ;work variable +print_done .word 0 ;how many characters were printed? +;----------parameters for dma---------- +dma_a_bank .byt 0 +dma_a_addr .word 0 +dma_b_reg .byt 0 +dma_len .word 0 +dma_mode .byt 0 + +;----------state information---------- +isr_done .byt 0 ; isr done flag +;----------menu layout/system constants (224/448) +textdmasize .word 0 ; number of bytes to copy each frame + +infloop .byt 0,0 ; to be filled w/ 80 FE + +printloop_wram .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +loprint_wram .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/snes/boot/dma.a65 b/snes/boot/dma.a65 new file mode 100644 index 0000000..e4a8112 --- /dev/null +++ b/snes/boot/dma.a65 @@ -0,0 +1,30 @@ + +dma0: + rep #$10 : .xl + sep #$20 : .as + lda dma_mode + sta $4300 + lda dma_b_reg + sta $4301 + lda dma_a_bank + ldx dma_a_addr + stx $4302 + sta $4304 + ldx dma_len + stx $4305 + lda #$01 + sta $420b + rts + +setup_hdma: + sep #$20 : .as + rep #$10 : .xl + stz $420b + stz $420c + +; lda #$06 +; sta $420c ;enable HDMA ch. 1+2 + stz $4200 ;disable V-BLANK NMI + rts + + diff --git a/snes/boot/dma.i65 b/snes/boot/dma.i65 new file mode 100644 index 0000000..f5e6040 --- /dev/null +++ b/snes/boot/dma.i65 @@ -0,0 +1,13 @@ +#define DMA0(mode, len, a_bank, a_addr, b_reg)\ + lda mode \ +: sta dma_mode \ +: ldx a_addr \ +: lda a_bank \ +: stx dma_a_addr \ +: sta dma_a_bank \ +: ldx len \ +: stx dma_len \ +: lda b_reg \ +: sta dma_b_reg \ +: jsr dma0 + diff --git a/snes/boot/font.a65 b/snes/boot/font.a65 new file mode 100644 index 0000000..aac6543 --- /dev/null +++ b/snes/boot/font.a65 @@ -0,0 +1,256 @@ +font7 .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $30, $00, $30, $08, $30, $08, $30, $08 + .byt $20, $18, $00, $10, $30, $00, $00, $18 + .byt $6c, $00, $6c, $12, $24, $12, $00, $12 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $6c, $00, $6c, $12, $fe, $00, $6c, $13 + .byt $fe, $00, $6c, $13, $6c, $12, $00, $36 + .byt $10, $00, $7c, $44, $c6, $38, $f0, $03 + .byt $1e, $60, $c6, $09, $7c, $47, $10, $2e + .byt $42, $00, $a4, $01, $48, $12, $10, $24 + .byt $24, $08, $4a, $10, $84, $21, $00, $42 + .byt $70, $40, $c0, $38, $c4, $24, $6e, $4a + .byt $c4, $33, $c4, $22, $7c, $46, $00, $3e + .byt $18, $00, $18, $04, $10, $0c, $00, $08 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $18, $00, $30, $2c, $30, $08, $30, $08 + .byt $30, $08, $30, $28, $18, $00, $00, $0c + .byt $30, $00, $18, $08, $18, $04, $18, $04 + .byt $18, $04, $18, $0c, $30, $0c, $00, $18 + .byt $00, $00, $6c, $00, $38, $06, $7c, $00 + .byt $38, $06, $6c, $12, $00, $36, $00, $00 + .byt $00, $00, $30, $00, $30, $08, $fc, $00 + .byt $30, $4e, $30, $08, $00, $18, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $18, $00, $18, $04, $10, $08 + .byt $00, $00, $00, $00, $00, $00, $fc, $00 + .byt $00, $7e, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $18, $00, $18, $04, $00, $0c + .byt $18, $00, $18, $04, $30, $0c, $30, $08 + .byt $30, $08, $60, $18, $60, $10, $00, $30 + .byt $7c, $44, $e6, $38, $c6, $31, $c6, $21 + .byt $c6, $21, $ce, $29, $7c, $47, $00, $3e + .byt $08, $00, $18, $04, $18, $04, $18, $04 + .byt $18, $04, $18, $04, $18, $04, $00, $0c + .byt $fc, $00, $00, $7e, $06, $00, $7c, $07 + .byt $c0, $be, $c0, $20, $fe, $00, $00, $7f + .byt $fc, $00, $00, $7e, $06, $00, $3c, $07 + .byt $06, $18, $06, $01, $fc, $07, $00, $7e + .byt $c6, $00, $c6, $21, $c0, $23, $7e, $40 + .byt $06, $39, $06, $01, $06, $01, $00, $03 + .byt $fe, $00, $00, $7f, $c0, $00, $fc, $04 + .byt $06, $78, $06, $01, $fc, $07, $00, $7e + .byt $7c, $00, $00, $3e, $c0, $00, $fc, $04 + .byt $c6, $38, $c6, $a1, $7c, $07, $00, $3e + .byt $fe, $00, $00, $7f, $06, $00, $06, $01 + .byt $06, $01, $06, $01, $06, $01, $00, $03 + .byt $7c, $04, $06, $38, $c6, $01, $7c, $47 + .byt $c6, $38, $c6, $21, $7c, $47, $00, $3e + .byt $7c, $04, $06, $38, $c6, $01, $7e, $41 + .byt $06, $39, $06, $01, $7c, $07, $00, $3e + .byt $00, $00, $00, $00, $30, $00, $00, $18 + .byt $00, $00, $30, $00, $00, $18, $00, $00 + .byt $00, $00, $00, $00, $30, $00, $00, $18 + .byt $00, $00, $30, $00, $20, $18, $00, $10 + .byt $00, $00, $18, $00, $30, $0c, $60, $18 + .byt $30, $00, $18, $00, $00, $0c, $00, $00 + .byt $00, $00, $00, $00, $3c, $00, $00, $1e + .byt $00, $00, $3c, $00, $00, $1e, $00, $00 + .byt $00, $00, $30, $00, $18, $00, $0c, $00 + .byt $18, $06, $30, $0c, $00, $18, $00, $00 + .byt $f8, $08, $0c, $70, $0c, $02, $18, $06 + .byt $30, $0c, $00, $18, $30, $00, $00, $18 + .byt $7c, $04, $06, $38, $c6, $01, $de, $21 + .byt $de, $21, $c0, $2f, $7e, $40, $00, $3f + .byt $7c, $04, $06, $38, $c6, $01, $de, $21 + .byt $c6, $29, $c6, $21, $c6, $21, $00, $63 + .byt $fc, $04, $06, $78, $c6, $01, $dc, $27 + .byt $c6, $28, $c6, $21, $fc, $07, $00, $7e + .byt $7e, $00, $00, $3f, $c0, $00, $c0, $20 + .byt $c0, $20, $c0, $20, $7e, $40, $00, $3f + .byt $fc, $00, $06, $7a, $c6, $01, $c6, $21 + .byt $c6, $21, $c6, $23, $fc, $03, $00, $7e + .byt $fe, $00, $00, $7f, $c0, $00, $f8, $00 + .byt $c0, $3c, $c0, $20, $fe, $00, $00, $7f + .byt $fe, $00, $00, $7f, $c0, $00, $f8, $00 + .byt $c0, $3c, $c0, $20, $c0, $20, $00, $60 + .byt $7e, $00, $00, $3f, $c0, $00, $ce, $20 + .byt $c6, $21, $c6, $21, $7c, $47, $00, $3e + .byt $c6, $00, $06, $61, $c6, $01, $de, $21 + .byt $c6, $29, $c6, $21, $c6, $21, $00, $63 + .byt $18, $00, $18, $04, $18, $04, $18, $04 + .byt $18, $04, $18, $04, $18, $04, $00, $0c + .byt $0c, $00, $0c, $02, $0c, $02, $0c, $02 + .byt $0c, $02, $0c, $06, $f8, $06, $00, $7c + .byt $c6, $00, $c6, $21, $c0, $23, $fc, $04 + .byt $c6, $38, $c6, $21, $c6, $21, $00, $63 + .byt $c0, $00, $00, $60, $c0, $00, $c0, $20 + .byt $c0, $20, $c0, $20, $fc, $00, $00, $7e + .byt $fc, $04, $16, $68, $d6, $09, $d6, $29 + .byt $c6, $29, $c6, $21, $c6, $21, $00, $63 + .byt $fc, $04, $06, $78, $c6, $01, $c6, $21 + .byt $c6, $21, $c6, $21, $c6, $21, $00, $63 + .byt $7c, $04, $06, $38, $c6, $01, $c6, $21 + .byt $c6, $21, $c6, $21, $7c, $47, $00, $3e + .byt $fc, $04, $06, $78, $c6, $01, $c6, $01 + .byt $fc, $07, $c0, $3e, $c0, $20, $00, $60 + .byt $7c, $00, $06, $3a, $c6, $01, $c6, $21 + .byt $c6, $21, $ce, $21, $7e, $41, $00, $3f + .byt $fc, $04, $06, $78, $c6, $01, $fc, $06 + .byt $c6, $39, $c6, $21, $c6, $21, $00, $63 + .byt $7e, $00, $00, $3f, $c0, $00, $7c, $44 + .byt $06, $38, $06, $01, $fc, $07, $00, $7e + .byt $fe, $00, $00, $7f, $18, $00, $18, $04 + .byt $18, $04, $18, $04, $18, $04, $00, $0c + .byt $c6, $00, $06, $61, $c6, $01, $c6, $21 + .byt $c6, $21, $c6, $21, $7c, $47, $00, $3e + .byt $c6, $00, $06, $61, $c6, $01, $c6, $21 + .byt $66, $01, $36, $01, $1e, $01, $00, $0f + .byt $c6, $00, $06, $61, $c6, $01, $d6, $21 + .byt $d6, $29, $d6, $29, $7e, $41, $00, $3f + .byt $c6, $00, $06, $61, $c6, $01, $7c, $47 + .byt $c6, $38, $c6, $21, $c6, $21, $00, $63 + .byt $c6, $00, $06, $61, $c6, $01, $7e, $41 + .byt $06, $39, $06, $03, $fc, $03, $00, $7e + .byt $fe, $00, $00, $7f, $06, $00, $7c, $47 + .byt $c0, $3e, $c0, $20, $fe, $00, $00, $7f + .byt $3c, $00, $30, $0e, $30, $08, $30, $08 + .byt $30, $08, $30, $08, $3c, $00, $00, $1e + .byt $30, $00, $30, $08, $18, $00, $18, $04 + .byt $18, $04, $0c, $00, $0c, $02, $00, $06 + .byt $3c, $00, $0c, $12, $0c, $02, $0c, $02 + .byt $0c, $02, $0c, $02, $3c, $02, $00, $1e + .byt $18, $00, $3c, $24, $66, $18, $00, $33 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $fe, $00, $00, $7f + .byt $30, $00, $18, $00, $18, $04, $00, $0c + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $7c, $04, $06, $38 + .byt $7e, $41, $c6, $39, $7e, $41, $00, $3f + .byt $c0, $00, $c0, $20, $fc, $04, $c6, $38 + .byt $c6, $21, $c6, $21, $fc, $07, $00, $7e + .byt $00, $00, $00, $00, $7e, $40, $c0, $3f + .byt $c0, $20, $c0, $20, $7e, $40, $00, $3f + .byt $06, $00, $06, $01, $7e, $41, $c6, $39 + .byt $c6, $21, $c6, $21, $7e, $41, $00, $3f + .byt $00, $00, $00, $00, $7c, $44, $c6, $38 + .byt $de, $21, $c0, $2f, $7e, $40, $00, $3f + .byt $1e, $00, $30, $2f, $30, $08, $3c, $00 + .byt $30, $0e, $30, $08, $30, $08, $30, $08 + .byt $00, $00, $00, $00, $7e, $40, $c6, $38 + .byt $c6, $21, $7e, $41, $06, $39, $7c, $03 + .byt $c0, $00, $c0, $20, $fc, $04, $c6, $38 + .byt $c6, $21, $c6, $21, $c6, $21, $00, $63 + .byt $00, $00, $18, $00, $00, $0c, $18, $00 + .byt $18, $04, $18, $04, $18, $04, $00, $0c + .byt $00, $00, $18, $00, $00, $0c, $18, $00 + .byt $18, $04, $18, $04, $18, $0c, $30, $0c + .byt $c0, $00, $c6, $20, $c6, $21, $fc, $07 + .byt $c6, $38, $c6, $21, $c6, $21, $00, $63 + .byt $30, $00, $30, $08, $30, $08, $30, $08 + .byt $30, $08, $30, $28, $18, $00, $00, $0c + .byt $00, $00, $00, $00, $fc, $04, $d6, $28 + .byt $d6, $29, $d6, $29, $c6, $29, $00, $63 + .byt $00, $00, $00, $00, $fc, $04, $c6, $38 + .byt $c6, $21, $c6, $21, $c6, $21, $00, $63 + .byt $00, $00, $00, $00, $7c, $44, $c6, $38 + .byt $c6, $21, $c6, $21, $7c, $47, $00, $3e + .byt $00, $00, $00, $00, $fc, $04, $c6, $38 + .byt $c6, $21, $fc, $07, $c0, $3e, $c0, $20 + .byt $00, $00, $00, $00, $7e, $40, $c6, $39 + .byt $c6, $21, $7e, $41, $06, $39, $06, $01 + .byt $00, $00, $00, $00, $7c, $40, $c0, $3e + .byt $c0, $20, $c0, $20, $c0, $20, $00, $60 + .byt $00, $00, $00, $00, $7e, $40, $c0, $3f + .byt $7c, $44, $06, $38, $fc, $07, $00, $7e + .byt $30, $00, $30, $08, $3c, $00, $30, $0e + .byt $30, $08, $30, $08, $1e, $10, $00, $0f + .byt $00, $00, $00, $00, $c6, $00, $c6, $21 + .byt $c6, $21, $c6, $21, $7c, $47, $00, $3e + .byt $00, $00, $00, $00, $c6, $00, $c6, $21 + .byt $66, $01, $36, $01, $1e, $01, $00, $0f + .byt $00, $00, $00, $00, $c6, $00, $d6, $21 + .byt $d6, $29, $d6, $29, $7e, $41, $00, $3f + .byt $00, $00, $00, $00, $c6, $00, $c6, $21 + .byt $7c, $47, $c6, $38, $c6, $21, $00, $63 + .byt $00, $00, $00, $00, $c6, $00, $c6, $21 + .byt $7e, $41, $06, $39, $06, $01, $fc, $07 + .byt $00, $00, $00, $00, $fe, $00, $06, $79 + .byt $7c, $47, $c0, $3e, $fe, $00, $00, $7f + .byt $18, $00, $30, $0c, $30, $08, $70, $08 + .byt $30, $08, $30, $08, $18, $00, $00, $0c + .byt $18, $00, $18, $04, $18, $04, $00, $0c + .byt $18, $00, $18, $04, $18, $04, $00, $0c + .byt $30, $00, $18, $00, $18, $04, $1c, $00 + .byt $18, $06, $18, $04, $30, $0c, $00, $18 + .byt $00, $00, $00, $00, $72, $10, $fe, $01 + .byt $9c, $73, $00, $4e, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 + .byt $00, $00, $00, $00, $00, $00, $00, $00 diff --git a/snes/boot/header.a65 b/snes/boot/header.a65 new file mode 100644 index 0000000..e92d58f --- /dev/null +++ b/snes/boot/header.a65 @@ -0,0 +1,76 @@ +; This file is part of the snescom-asm demo - a demo of how to build a SNES program. +; See http://bisqwit.iki.fi/source/snescom.html for details. + +; Begin assembling to this address. +*= $C0FF00 + +RESET: + sei: clc: xce + jmp @GAME_MAIN + +IRQ_16bit: + php + rep #$30 + pha: phx: phy: phd: phb + jsl @IRQ_ROUTINE + rep #$30 + plb: pld: ply: plx: pla + plp + rti + +NMI_16bit: + php + rep #$30 + pha: phx: phy: phd: phb + jsl @NMI_ROUTINE + rep #$30 + plb: pld: ply: plx: pla + plp + rti + + +;error vectors +ABT_8bit: ABT_16bit: +BRK_8bit: BRK_16bit: +COP_8bit: COP_16bit: +IRQ_8bit: +NMI_8bit: + - wai: lda $ABCDEF : bra - + +*= $C0FFB0 + ; Zero the area from $FFB0 - $FFFF + ; to ensure that the linker won't get clever + ; and fill it with small pieces of code. + .word 0,0,0,0, 0,0,0,0 + .word 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 + .word 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 + +*= $C0FFB0 + +.byt "MR" ;2 bytes - company id +.byt "BOOT" ;4 bytes - rom id + +*= $C0FFC0 +.byt "SD2SNES BOOT " + ;123456789012345678901; - max 21 chars + +*= $C0FFD5 .byt $31 ;rom speed +*= $C0FFD6 .byt $02 ;rom type +*= $C0FFD7 .byt $06 ;rom size 64 kByte +*= $C0FFD8 .byt $03 ;sram size 8 kBit +*= $C0FFD9 .byt $09 ;rom region 4 = Finland +*= $C0FFDA .byt $33 ;company id flag + +*= $C0FFDC .word 0,0 ;checksums + +*= $C0FFE4 .word COP_16bit +*= $C0FFE6 .word BRK_16bit +*= $C0FFE8 .word ABT_16bit +*= $C0FFEA .word NMI_16bit +*= $C0FFEE .word IRQ_16bit +*= $C0FFF4 .word COP_8bit +*= $C0FFF8 .word ABT_8bit +*= $C0FFFA .word NMI_8bit +*= $C0FFFC .word RESET +*= $C0FFFE .word BRK_8bit +*= $C0FFFE .word IRQ_8bit diff --git a/snes/boot/main.a65 b/snes/boot/main.a65 new file mode 100644 index 0000000..fcfeeef --- /dev/null +++ b/snes/boot/main.a65 @@ -0,0 +1,284 @@ +#include "memmap.i65" +#include "dma.i65" + +GAME_MAIN: + sep #$20 : .as + stz $4200 ; inhibit VBlank NMI + jsr killdma + lda #$01 + sta $420d ; fast cpu + jsr snes_init + jsr setup_gfx + jsr colortest + jsr setup_hdma + jsr tests + + ; copy routines to WRAM + lda #^printloop_wram + ldx #!printloop_wram + sta $2183 + stx $2181 + DMA0(#$00, #$6F, #^printloop, #!printloop, #$80); + + lda #^loprint_wram + ldx #!loprint_wram + sta $2183 + stx $2181 + DMA0(#$00, #$4F, #^loprint, #!loprint, #$80); + + jsl @printloop_wram + +printloop + rep #$10 : .xl + sep #$20 : .as + lda #$00 + sta @print_x + lda #13 + sta @print_y + lda #^MCU_TXT + sta @print_bank + rep #$20 : .al + lda #!MCU_TXT + sta @print_src + sep #$20 : .as + lda #$00 + sta @print_pal + jsr loprint_wram +- lda @$4212 + and #$80 + bne - +- lda @$4212 + and #$80 + beq - + rep #$20 : .al + lda #!BG1_TILE_BASE + sta $2116 + sep #$20 : .as + lda #$01 + sta $4300 + lda #$18 + sta $4301 + lda #^BG1_TILE_BUF + sta $4304 + ldx #!BG1_TILE_BUF + stx $4302 + ldx #36*64 + stx $4305 + lda #$01 + sta $420b + bra printloop +printloop_end + + cli + stz $4200 + jmp @infloop ;infinite loop in WRAM + +killdma: + stz $420b + stz $420c + stz $4310 + stz $4311 + stz $4312 + stz $4313 + stz $4314 + stz $4320 + stz $4321 + stz $4322 + stz $4323 + stz $4324 + stz $4330 + stz $4331 + stz $4332 + stz $4333 + stz $4334 + stz $4340 + stz $4341 + stz $4342 + stz $4343 + stz $4344 + stz $4350 + stz $4351 + stz $4352 + stz $4353 + stz $4354 + rts + + + + +waitblank: +- lda $4212 + and #$80 + bne - +- lda $4212 + and #$80 + beq - + rts + +colortest: + sep #$20 : .as + rep #$10 : .xl + stz $2130 + rts + +setup_gfx: + sep #$20 : .as + rep #$10 : .xl + stz $4200 + stz $420b + stz $420c +;clear tilemap buffers + ldx #$B000 + stx $2181 + lda #$01 + sta $2183 + DMA0(#$08, #32*29*2, #^zero, #!zero, #$80) + +;copy 2bpp font + ldx #$0000 + stx $2116 + DMA0(#$01, #$800, #^font7, #!font7, #$18) + +;clear BG1 tilemap + ldx #BG1_TILE_BASE + stx $2116 + DMA0(#$09, #32*29*2, #^zero, #!zero, #$18) + +;clear OAM tables + ldx #$0000 + stx $2102 + DMA0(#$08, #544, #^zero, #!zero, #$04) + +;set palette + stz $2121 + DMA0(#$00, #$10, #^palette, #!palette, #$22) + + rts + +tests: + sep #$20 : .as ;8-bit accumulator + rep #$10 : .xl ;16-bit index + lda #$00 ;mode 0 + sta $2105 + lda #$58 ;Tilemap addr 0xB000 + ora #$02 ;SC size 32x64 + sta $2107 ;for BG1 + lda #$40 ;chr base addr: + sta $210b ;BG1=0x0000, BG2=0x8000 + lda #$01 ;enable BG1 + sta $212c ;BG Main + lda #$01 ;enable none + sta $212d ;BG Sub + lda #$00 + sta $2130 + stz $2121 + lda #$0f + sta $2100 ;screen on, full brightness + rts + +snes_init: + sep #$20 : .as ;8-bit accumulator + rep #$10 : .xl ;16-bit index + stz $4200 ; + lda #$ff + sta $4201 ; + stz $4202 ; + stz $4203 ; + stz $4204 ; + stz $4205 ; + stz $4206 ; + stz $4207 ; + stz $4208 ; + stz $4209 ; + stz $420a ; + stz $420b ; + stz $420c ; + lda #$00 + sta $420d ; FAAAAAST + lda #$8f + sta $2100 ;INIDISP: force blank + lda #$03 ; 8x8+16x16; name=0; base=3 + sta $2101 ; + stz $2102 ; + stz $2103 ; +; stz $2104 ; (OAM Data?!) +; stz $2104 ; (OAM Data?!) + stz $2105 ; + stz $2106 ; + stz $2107 ; + stz $2108 ; + stz $2109 ; + stz $210a ; + stz $210b ; + stz $210c ; + stz $210d ; + stz $210d ; + stz $210e ; + stz $210e ; + stz $210f ; + stz $210f ; + lda #$05 + sta $2110 ; + stz $2110 ; + stz $2111 ; + stz $2111 ; + stz $2112 ; + stz $2112 ; + stz $2113 ; + stz $2113 ; + stz $2114 ; + stz $2114 ; + lda #$80 + sta $2115 ; + stz $2116 ; + stz $2117 ; +; stz $2118 ;(VRAM Data?!) +; stz $2119 ;(VRAM Data?!) + stz $211a ; + stz $211b ; + lda #$01 + sta $211b ; + stz $211c ; + stz $211c ; + stz $211d ; + stz $211d ; + stz $211e ; + sta $211e ; + stz $211f ; + stz $211f ; + stz $2120 ; + stz $2120 ; + stz $2121 ; +; stz $2122 ; (CG Data?!) +; stz $2122 ; (CG Data?!) + stz $2123 ; + stz $2124 ; + stz $2125 ; + stz $2126 ; + stz $2127 ; + stz $2128 ; + stz $2129 ; + stz $212a ; + stz $212b ; + stz $212c ; + stz $212d ; + stz $212e ; + lda #$30 + sta $2130 ; + stz $2131 ; + lda #$e0 + sta $2132 ; + stz $2133 ; +;clear WRAM lower page +; ldx #$0200 +; stx $2181 +; lda #$00 +; sta $2183 +; DMA0(#$08, #$FF00, #^zero, #!zero, #$80) +; ldx #$0000 +; stx $2181 +; lda #$00 +; sta $2183 +; DMA0(#$08, #$1e0, #^zero, #!zero, #$80) + + rts diff --git a/snes/boot/memmap.i65 b/snes/boot/memmap.i65 new file mode 100644 index 0000000..e371461 --- /dev/null +++ b/snes/boot/memmap.i65 @@ -0,0 +1,17 @@ +#if 0 /* #if0'd because it's #included, and those don't get parsed properly by snescom */ +; This file is part of the snescom-asm demo - a demo of how to build a SNES program. +; See http://bisqwit.iki.fi/source/snescom.html for details. +#endif + +/* These must be defined as constants, because they're used + * in calculation that is sent to PPU as parameters */ + +#define BG1_TILE_BASE $5800 +#define BG2_TILE_BASE $5000 + +#define OAM_TILE_BASE $6000 + +#define BG1_TILE_BUF $7FB000 +#define BG2_TILE_BUF $7FA000 + +#define MCU_TXT $307000 diff --git a/snes/boot/palette.a65 b/snes/boot/palette.a65 new file mode 100644 index 0000000..efabf81 --- /dev/null +++ b/snes/boot/palette.a65 @@ -0,0 +1,4 @@ +palette +;fonts + .byt $42, $08, $ff, $7f, $00, $00, $9c, $73 + .byt $42, $08, $ff, $43, $00, $00, $18, $63 diff --git a/snes/boot/reset.a65 b/snes/boot/reset.a65 new file mode 100644 index 0000000..5612ad2 --- /dev/null +++ b/snes/boot/reset.a65 @@ -0,0 +1,34 @@ +; This file is part of the snescom-asm demo - a demo of how to build a SNES program. +; See http://bisqwit.iki.fi/source/snescom.html for details. + +#include "memmap.i65" +#include "dma.i65" + +#define TILE_ADDR_REG_VAL(addr, scsize) \ + (((addr & $FC00) >> 8) + scsize) +#define BMAP_ADDR_REG_VAL(addr, addr2) \ + (((addr & $F000) >> 12) | (((addr2 & $F000) >> 12) << 4)) + +; NMI - called on VBlank +NMI_ROUTINE: + sep #$20 : .as + rep #$10 : .xl + lda #$00 + pha + plb + lda $4210 + + ldx #BG1_TILE_BASE + stx $2116 + DMA0(#$01, #36*64, #^BG1_TILE_BUF, #!BG1_TILE_BUF, #$18) + + lda #$01 + sta isr_done + rtl + +; IRQ - called when triggered +IRQ_ROUTINE: + sep #$20 : .as + lda $4211 ;Acknowledge irq + rtl + diff --git a/snes/boot/text.a65 b/snes/boot/text.a65 new file mode 100644 index 0000000..c9b5035 --- /dev/null +++ b/snes/boot/text.a65 @@ -0,0 +1,47 @@ +.text +#include "memmap.i65" +loprint: + rep #$30 : .xl : .al + lda !print_x + and #$00ff + asl ;double the offset for WRAM addressing + clc + adc #!BG1_TILE_BUF + sta !print_temp + lda !print_y + and #$00ff + asl + asl + asl + asl + asl + asl ;double the offset for WRAM addressing + clc + adc !print_temp +; we need to transfer to WRAM and from there to VRAM via DMA during VBLANK +; because VRAM can only be accessed during VBLANK and forced blanking. + sta @$2181 + sep #$20 : .as + lda #$7f ;we really only need bit 0. full bank given for clarity + sta @$2183 + ldx !print_src + lda !print_bank + pha + plb +loprint_loop_inner + lda !0,x + beq loprint_end + sta @$2180 + lda #$00 + adc #$00 + ora #$20 + sta @$2180 + inx + bra loprint_loop_inner +loprint_end + lda #$00 + pha + plb + rts +loprint_endend + .byt $ff