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