Browse Source

dedicated mapper for menu, new logo gfx, TODO: fix avr mem access again
also minor cleanups.

ikari 14 years ago
parent
commit
a120be76bd

BIN
gfx/logo_v2.chi


BIN
gfx/logo_v2_sprites.chi


BIN
gfx/sd2snes_v2-sprites-b15-15-gradient_orig.xcf


BIN
gfx/sd2snes_v2.psd


+ 43 - 16
snes/const.a65

@@ -3,33 +3,33 @@ zero		.word	0
 bg2tile		.byt $20
 hdma_pal_src	.byt 44
 		.byt $60, $2d
-		.byt 24
+		.byt 14
 		.byt $00, $00
 		.byt 2
 		.byt $60, $2d
-		.byt 10
+		.byt 11
 		.byt $00, $00
-		.byt 10
+		.byt 11
 		.byt $20, $04
-		.byt 10
+		.byt 11
 		.byt $40, $08
-		.byt 10
+		.byt 11
 		.byt $60, $0c
-		.byt 10
+		.byt 11
 		.byt $80, $10
-		.byt 10
+		.byt 11
 		.byt $a0, $14
-		.byt 10
+		.byt 11
 		.byt $c0, $18
-		.byt 10
+		.byt 11
 		.byt $e0, $1c
-		.byt 10
+		.byt 11
 		.byt $00, $21
-		.byt 10
+		.byt 11
 		.byt $20, $25
-		.byt 10
+		.byt 11
 		.byt $40, $29
-		.byt 32
+		.byt 31
 		.byt $60, $2d
 		.byt 2
 		.byt $20, $04
@@ -69,8 +69,8 @@ hdma_cg_addr_src
 		.byt $00, $00, $00, $00, $00, $00, $00, $00
 		.byt $00, $00, $00, $00, $00, $00, $00, $00
 		.byt $00
-hdma_mode_src	.byt 74, $03, $01, $05, $00
-hdma_scroll_src	.byt 74
+hdma_mode_src	.byt 64, $03, $01, $05, $00
+hdma_scroll_src	.byt 64
 		.byt $00, $00, $ff, $0f
 		.byt $01
 		.byt $fc, $00, $05, $00
@@ -80,11 +80,38 @@ hdma_math_src	.byt 1
 		.byt 1
 		.byt $00, $e0
 		.byt 10
-		.byt $20, $ea
+		.byt $70, $ff
 		.byt 1
 		.byt $00, $e0
 		.byt 0
 
+oam_data_l	.byt 75, 56, 31, $0e
+		.byt 83, 56, 1, $0e
+		.byt 91, 56, 2, $0e
+		.byt 99, 56, 3, $0e
+		.byt 107, 56, 4, $0e
+		.byt 115, 56, 5, $0e
+		.byt 123, 56, 6, $0e
+		.byt 131, 56, 7, $0e
+;x shift left due to mode switch glitch
+		.byt 75, 64, 8, $0e
+		.byt 83, 64, 9, $0e
+		.byt 91, 64, 10, $0e
+		.byt 99, 64, 11, $0e
+		.byt 107, 64, 12, $0e
+		.byt 115, 64, 13, $0e
+		.byt 123, 64, 14, $0e
+		.byt 131, 64, 15, $0e
+		.byt 75, 72, 16, $0e
+		.byt 83, 72, 17, $0e
+		.byt 91, 72, 18, $0e
+		.byt 99, 72, 19, $0e
+		.byt 75, 80, 24, $0e
+		.byt 83, 80, 25, $0e
+		.byt 91, 80, 26, $0e
+		
+oam_data_h	.byt 0, 0, 0, 0, 0, 0, 0, 0
+
 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

File diff suppressed because it is too large
+ 392 - 993
snes/logo.a65


+ 23 - 3
snes/main.a65

@@ -60,16 +60,34 @@ setup_gfx:
 	stx $2116
 	DMA0(#$09, #$1000, #^zero, #!zero, #$18)
 
+;clear OAM tables
+	ldx #$0000
+	stx $2102
+	DMA0(#$08, #$544, #^zero, #!zero, #$04)
+
 ;copy logo tiles
 	ldx #$2000
 	stx $2116
-	DMA0(#$01, #$3480, #^logo, #!logo, #$18)
+	DMA0(#$01, #$3740, #^logo, #!logo, #$18)
 
 ;copy logo tilemap
 	ldx #BG1_TILE_BASE
 	stx $2116
 	DMA0(#$01, #$280, #^logomap, #!logomap, #$18)
 
+;copy sprites tiles
+	ldx #OAM_TILE_BASE
+	stx $2116
+	DMA0(#$01, #$400, #^logospr, #!logospr, #$18)
+
+;set OAM tables
+	ldx #$0000
+	stx $2102
+	DMA0(#$00, #$5C, #^oam_data_l, #!oam_data_l, #$04)
+	ldx #$0100
+	stx $2102
+	DMA0(#$00, #$08, #^oam_data_h, #!oam_data_h, #$04)
+
 ;set palette
 	stz $2121
 	DMA0(#$00, #$200, #^palette, #!palette, #$22)
@@ -131,8 +149,9 @@ tests:
 	sta $2108		;for BG2
 	lda #$40		;chr base addr:
 	sta $210b		;BG1=0x0000, BG2=0x8000
-	lda #$03		;enable BG1+BG2 
+	lda #$13		;enable BG1+BG2+OBJ 
 	sta $212c		;BG Main
+	lda #$13		;enable BG1+BG2+OBJ 
 	sta $212d		;BG Sub
 	jsr setup_224
 	lda #$00
@@ -151,7 +170,8 @@ snes_init:
 	sta $420d		; FAAAAAST
 	lda #$8f
 	sta $2100		;INIDISP: force blank
-	stz $2101		;
+	lda #$03		; 8x8+16x16; name=0; base=3
+	sta $2101		;
 	stz $2102		;
 	stz $2103		;
 ;	stz $2104		; (OAM Data?!)

+ 14 - 12
snes/menu.a65

@@ -14,7 +14,7 @@ menu_init:
 	stz dirend_onscreen
 	lda #$04
 	sta cursor_x
-	lda #$0A
+	lda #$09
 	sta cursor_y
 	ldx #$0000
 	stx dirptr_idx
@@ -57,7 +57,7 @@ menu_cleanup_loop
 	beq +
 	pha
 	clc
-	adc #$0a
+	adc #$09
 	sta print_y
 	lda #^space64
 	ldx #!space64
@@ -88,7 +88,7 @@ menu_updates:
 	sta dirptr_idx
 	lda menu_sel
 	clc
-	adc #$09
+	adc #$08
 	sta bar_yl
 
 ;get input
@@ -138,7 +138,7 @@ key_select
 	bra menuupd_out
 
 menuupd_out
-	lda #$0A
+	lda #$09
 	sta cursor_y
 	rts
 
@@ -487,7 +487,7 @@ select_dir: ; y = direntry ptr
 setup_224:
 	php
 	rep #$30 : .xl : .al
-	lda #17
+	lda #18
 	sta listdisp
 	dec
 	cmp menu_sel
@@ -496,17 +496,18 @@ setup_224:
 setup_228_adjsel
 	sta menu_sel
 +
-	lda #18*64
+	lda #19*64
 	sta textdmasize
-	lda #$0005
+	lda #$0007
 	sta hdma_scroll+8
 	sep #$20 : .as
-	lda #$05
+	lda #$07
 	sta $2110
 	lda #$00
 	sta $2110
 	lda #$00
 	sta barstep
+	ora #$08
 	sta $2133
 	lda #$0a
 	sta hdma_math+6
@@ -534,19 +535,20 @@ setup_228_adjsel
 setup_448:
 	php
 	rep #$30 : .xl : .al
-	lda #34
+	lda #36
 	sta listdisp
-	lda #36*64
+	lda #38*64
 	sta textdmasize
-	lda #$ffba
+	lda #$ffc6
 	sta hdma_scroll+8
 	sep #$20 : .as
-	lda #$ba
+	lda #$c6
 	sta $2110
 	lda #$ff
 	sta $2110
 	lda #$01
 	sta barstep
+	ora #$08
 	sta $2133
 	lda #$06
 	sta hdma_math+6

+ 61 - 54
snes/palette.a65

@@ -1,64 +1,71 @@
-palette .byt  $42, $08, $ff, $7f, $00, $00, $18, $63
-	.byt  $42, $08, $ff, $43, $00, $00, $18, $63
+palette
+;fonts
+	.byt  $42, $08, $ff, $7f, $00, $00, $18, $63
+        .byt  $42, $08, $ff, $43, $00, $00, $18, $63
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $42, $08, $ff, $43, $00, $00, $18, $63
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
+;logo
+        .byt  $10, $42, $82, $35, $23, $46, $85, $4e
+        .byt  $a0, $39, $c8, $56, $09, $5f, $e9, $5a
+        .byt  $6b, $6f, $2a, $63, $66, $4e, $8d, $73
+        .byt  $6e, $6f, $a0, $35, $04, $42, $4a, $6b
+        .byt  $42, $46, $07, $63, $e7, $5a, $20, $46
+        .byt  $4d, $6b, $29, $67, $a4, $52, $64, $4a
+        .byt  $c0, $3d, $e1, $41, $c3, $3d, $c6, $56
+        .byt  $a7, $52, $45, $4a, $21, $25, $40, $29
+        .byt  $e1, $1c, $00, $21, $84, $31, $88, $52
+        .byt  $a9, $56, $a1, $14, $c6, $18, $5a, $67
+        .byt  $a5, $14, $39, $63, $ff, $7f, $c1, $18
+        .byt  $83, $10, $17, $5f, $f7, $5a, $84, $10
+        .byt  $72, $4a, $7b, $6b, $4a, $29, $21, $04
+        .byt  $b5, $52, $de, $7b, $ad, $35, $42, $08
+        .byt  $63, $0c, $30, $42, $41, $04, $93, $4e
+        .byt  $d5, $56, $61, $0c, $41, $08, $6b, $2d
+        .byt  $08, $21, $bd, $77, $29, $25, $0f, $3e
+        .byt  $e7, $1c, $ee, $39, $21, $08, $82, $14
+        .byt  $63, $10, $62, $10, $9c, $73, $81, $10
+        .byt  $ac, $31, $62, $0c, $51, $46, $83, $0c
+        .byt  $62, $08, $42, $0c, $43, $29, $82, $4e
+        .byt  $53, $4a, $a5, $10, $00, $7f, $06, $7f
+        .byt  $a6, $6e, $67, $5e, $a7, $6e, $e4, $7a
+        .byt  $02, $7f, $e6, $76, $e5, $7e, $64, $2d
+        .byt  $45, $56, $a6, $62, $e6, $72, $44, $56
+        .byt  $23, $4e, $a7, $6a, $c3, $41, $52, $29
+        .byt  $6a, $2d, $7e, $14, $37, $29, $be, $14
+        .byt  $be, $18, $4f, $29, $11, $21, $12, $25
+        .byt  $2f, $25, $bc, $18, $66, $31, $db, $1c
+        .byt  $6d, $2d, $ca, $5a, $82, $10, $82, $08
+        .byt  $a4, $2d, $ac, $2a, $89, $11, $a3, $08
+        .byt  $83, $2d, $ed, $2a, $4e, $23, $0e, $27
+        .byt  $4f, $27, $69, $2e, $86, $5e, $83, $39
+        .byt  $6b, $31, $34, $25, $7e, $10, $d8, $1c
+        .byt  $6d, $31, $9f, $10, $19, $25, $6b, $1a
+        .byt  $4a, $1a, $04, $0d, $cc, $1e, $6b, $22
+;sprite palette 3
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
         .byt  $10, $42, $10, $42, $10, $42, $10, $42
-        .byt  $10, $42, $03, $21, $64, $2d, $62, $0c
-        .byt  $e2, $20, $44, $29, $85, $31, $c5, $3d
-        .byt  $8c, $73, $47, $4a, $23, $25, $84, $31
-        .byt  $e7, $3d, $e5, $41, $65, $5a, $c6, $3d
-        .byt  $a6, $62, $06, $7f, $04, $4a, $08, $7b
-        .byt  $e3, $45, $83, $39, $c6, $6e, $24, $52
-        .byt  $e4, $7a, $e6, $76, $45, $52, $c7, $72
-        .byt  $e4, $49, $23, $4e, $86, $5e, $68, $4e
-        .byt  $a2, $31, $c5, $35, $85, $62, $c5, $2d
-        .byt  $87, $5e, $a4, $2d, $c4, $3d, $a5, $6a
-        .byt  $47, $5a, $07, $4a, $4d, $29, $16, $29
-        .byt  $a7, $35, $36, $25, $be, $18, $1a, $21
-        .byt  $83, $2d, $18, $21, $50, $31, $fb, $20
-        .byt  $4a, $2d, $2e, $29, $dc, $1c, $31, $29
-        .byt  $6a, $2d, $de, $1c, $aa, $31, $87, $31
-        .byt  $53, $2d, $e6, $41, $40, $46, $aa, $32
-        .byt  $28, $2e, $2f, $2b, $4f, $27, $0e, $27
-        .byt  $cb, $2a, $68, $2a, $e4, $2d, $83, $29
-        .byt  $61, $29, $0d, $2f, $4f, $2b, $ec, $2a
-        .byt  $ab, $2a, $cc, $2e, $68, $2e, $4e, $2b
-        .byt  $8a, $2e, $ad, $26, $a4, $31, $0d, $2b
-        .byt  $26, $19, $4e, $27, $ef, $2a, $47, $19
-        .byt  $c4, $14, $c2, $39, $c3, $49, $c2, $45
-        .byt  $46, $56, $65, $2d, $f8, $20, $4c, $29
-        .byt  $2f, $29, $19, $29, $51, $29, $c9, $18
-        .byt  $da, $18, $a8, $18, $9c, $18, $d1, $18
-        .byt  $84, $10, $db, $18, $7e, $14, $f1, $1c
-        .byt  $eb, $20, $a2, $18, $48, $2a, $20, $25
-        .byt  $e3, $20, $ee, $26, $4a, $22, $e5, $18
-        .byt  $ef, $21, $50, $1e, $48, $19, $e5, $14
-        .byt  $58, $1f, $ff, $17, $bd, $1f, $ab, $1d
-        .byt  $f7, $1e, $cc, $19, $ff, $1f, $d5, $1e
-        .byt  $c4, $10, $7a, $1f, $6a, $19, $ef, $19
-        .byt  $72, $1e, $94, $1a, $93, $1e, $ce, $1d
-        .byt  $49, $15, $9c, $1f, $b3, $1e, $94, $1e
-        .byt  $bd, $17, $18, $1f, $de, $1f, $8b, $19
-        .byt  $71, $22, $49, $19, $d4, $18, $ce, $18
-        .byt  $88, $10, $b6, $18, $b1, $18, $a6, $14
-        .byt  $c4, $5a, $e2, $5e, $d4, $1e, $06, $15
-        .byt  $ed, $1d, $38, $1f, $ce, $19, $27, $19
-        .byt  $a0, $39, $a9, $56, $0b, $63, $45, $4a
-        .byt  $2a, $63, $c8, $56, $88, $52, $6b, $6f
-        .byt  $6e, $6f, $4d, $6b, $ae, $77, $24, $46
-        .byt  $09, $5f, $23, $46, $4a, $6b, $e9, $5a
-        .byt  $e1, $41, $c3, $3d, $e4, $41, $82, $35
-        .byt  $64, $4a, $a7, $52, $86, $4e, $2c, $63
-        .byt  $a4, $52, $ca, $5a, $65, $4e, $43, $29
-        .byt  $62, $2d, $8d, $73, $8f, $6f, $66, $4e
-        .byt  $c8, $5a, $42, $46, $21, $25, $29, $67
-        .byt  $42, $4a, $c6, $56, $e2, $1c, $02, $21
-        .byt  $07, $63, $a2, $14, $eb, $5e, $c1, $18
-        .byt  $82, $10, $e7, $5a, $cf, $7b, $82, $4e
+;logo
+        .byt  $87, $19, $c8, $1d, $49, $19, $ad, $19
+        .byt  $31, $1e, $b5, $1e, $d5, $1a, $72, $1e
+        .byt  $ac, $19, $46, $2d, $e6, $10, $49, $2d
+        .byt  $a3, $0c, $a8, $35, $17, $21, $cc, $18
+        .byt  $41, $0c, $ce, $18, $a8, $18, $c1, $14
+        .byt  $e9, $1d, $a9, $1d, $d6, $26, $f7, $22
+        .byt  $30, $22, $ff, $13, $de, $17, $ff, $1b
+        .byt  $39, $1f, $93, $1e, $7a, $1f, $df, $1b
+        .byt  $48, $19, $9a, $23, $ee, $21, $a9, $14
+        .byt  $b8, $18, $49, $36, $d0, $2a, $36, $27
+        .byt  $bc, $1f, $78, $27, $13, $2f, $6f, $32
+        .byt  $07, $32, $62, $2d, $10, $42, $10, $42
+;sprite palette 7
+        .byt  $3f, $7c, $20, $08, $84, $0c, $a5, $14
+        .byt  $08, $21, $5a, $6b, $bc, $73, $fe, $7b
+        .byt  $f7, $5e, $73, $4e, $10, $42, $42, $08
+        .byt  $00, $00, $ad, $35, $b5, $56, $6b, $2d
+

+ 7 - 6
snes/reset.a65

@@ -18,17 +18,17 @@ NMI_ROUTINE:
 	plb
         lda $4210
 
-	ldx #BG1_TILE_BASE+32*10
+	ldx #BG1_TILE_BASE+32*9
 	stx $2116
-	DMA0(#$01, #34*64, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18)
+	DMA0(#$01, #36*64, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*9, #$18)
 
-	ldx #BG2_TILE_BASE+32*10
+	ldx #BG2_TILE_BASE+32*9
 	stx $2116
-	DMA0(#$01, #34*64, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18)
+	DMA0(#$01, #36*64, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*9, #$18)
 
 	ldx #BG2_TILE_BASE
 	stx $2116
-	DMA0(#$01, #64*10, #^BG2_TILE_BUF, #!BG2_TILE_BUF, #$18)
+	DMA0(#$01, #64*9, #^BG2_TILE_BUF, #!BG2_TILE_BUF, #$18)
 
 	lda bar_yl
 	asl
@@ -37,13 +37,14 @@ NMI_ROUTINE:
 	lda barstep
 	php
 	txa
+	dec
 	plp
 	bne small_bar
 	asl
 	bra normal_bar
 small_bar
 	clc
-	adc #36
+	adc #31
 normal_bar
 	sta bar_y
 

+ 2 - 0
snes/text.a65

@@ -59,6 +59,7 @@ print_loop_inner
 	asl
 	asl
 	adc #$00
+	ora #$20
 	sta @$2180
 	lda @print_done
 	inc
@@ -105,6 +106,7 @@ print_loop2_inner
 	asl
 	asl
 	adc #$00
+	ora #$20
 	sta @$2180
 	lda @print_done
 	inc

+ 5 - 7
src/ff.c

@@ -1662,7 +1662,7 @@ FRESULT f_write (
   *bw = 0;
   res = validate(fs /*, fp->id*/);                     /* Check validity of the object */
   if (res != FR_OK) return res;
-  if (fp->flag & FA__ERROR) {dprintf("fp->flag & FA__ERROR \n"); return FR_RW_ERROR;}   /* Check error flag */
+  if (fp->flag & FA__ERROR) return FR_RW_ERROR;   /* Check error flag */
   if (!(fp->flag & FA_WRITE)) return FR_DENIED;   /* Check access mode */
   if (fp->fsize + btw < fp->fsize) return FR_OK;  /* File size cannot reach 4GB */
 
@@ -1680,18 +1680,17 @@ FRESULT f_write (
           clust = create_chain(fs, fp->curr_clust);         /* Trace or streach cluster chain */
         }
         if (clust == 0) break;                    /* Disk full */
-        if (clust == 1 || clust >= fs->max_clust) { dprintf("cluster alloc error\n"); goto fw_error; }
+        if (clust == 1 || clust >= fs->max_clust) goto fw_error;
         fp->curr_clust = clust;                   /* Current cluster */
         sect = clust2sect(fs, clust);             /* Get current sector */
         fp->csect = fs->csize;                    /* Re-initialize the left sector counter */
       }
-      if(!move_fp_window(fp,0)) {dprintf("move_fp_window error\n"); goto fw_error;}
+      if(!move_fp_window(fp,0)) goto fw_error;
       fp->curr_sect = sect;                       /* Update current sector */
       cc = btw / SS(fs);                          /* When left bytes >= SS(fs), */
       if (cc) {                                   /* Write maximum contiguous sectors directly */
         if (cc > fp->csect) cc = fp->csect;
-        if (disk_write(fs->drive, wbuff, sect, (BYTE)cc) != RES_OK)
-{ dprintf("disk_write error\n");          goto fw_error;}
+        if (disk_write(fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) goto fw_error;
         fp->csect -= (BYTE)(cc - 1);
         fp->curr_sect += cc - 1;
         wcnt = cc * SS(fs);
@@ -1705,8 +1704,7 @@ FRESULT f_write (
 #if _USE_1_BUF == 0
       fp->fptr < fp->fsize &&       /* Fill sector buffer with file data if needed */
 #endif
-      !move_fp_window(fp,fp->curr_sect))
-{    dprintf("fract write error\n "); goto fw_error; }
+      !move_fp_window(fp,fp->curr_sect)) goto fw_error;
       memcpy(&FPBUF.data[fp->fptr & (SS(fs) - 1)], wbuff, wcnt);
       FPBUF.dirty=TRUE;
     }

+ 0 - 2
src/fileops.c

@@ -44,9 +44,7 @@ UINT file_readblock(void* buf, uint32_t addr, uint16_t size) {
 	if(file_handle.fptr != addr) {
 		return 0;
 	}
-	if(file_res) { dprintf("no lseek %d\n", file_res); _delay_ms(30); return 0;}
 	file_res = f_read(&file_handle, buf, size, &bytes_read);
-	if(file_res) { dprintf("no read %d\n", file_res); _delay_ms(30); }
 	return bytes_read;
 }
 

+ 7 - 7
src/filetypes.c

@@ -90,10 +90,10 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
 					db_tgt += 0x00010000;
 					dprintf("new=%lx\n", db_tgt);
 				}
-				sram_writelong(parent_tgt, db_tgt);
+				sram_writelong((parent_tgt-SRAM_MENU_ADDR), db_tgt);
 				sram_writebyte(0, db_tgt+sizeof(next_subdir_tgt));
 				sram_writeblock("../\0", db_tgt+sizeof(next_subdir_tgt)+sizeof(len), 4);
-				sram_writelong(db_tgt|((uint32_t)0x80<<24), dir_tgt);
+				sram_writelong((db_tgt-SRAM_MENU_ADDR)|((uint32_t)0x80<<24), dir_tgt);
 				db_tgt += sizeof(next_subdir_tgt)+sizeof(len)+4;
 				dir_tgt += 4;
 			}
@@ -122,7 +122,7 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
 							// write element pointer to current dir structure
 							dprintf("d=%d Saving %lX to Address %lX  [dir]\n", depth, db_tgt, dir_tgt);
 //							_delay_ms(50);
-							sram_writelong(db_tgt|((uint32_t)0x80<<24), dir_tgt);
+							sram_writelong((db_tgt-SRAM_MENU_ADDR)|((uint32_t)0x80<<24), dir_tgt);
 //							sram_writeblock((uint8_t*)&db_tgt, dir_tgt_save, sizeof(dir_tgt_save));
 
 							// save element:
@@ -136,7 +136,7 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
 							}
 							dprintf("    Saving dir descriptor to %lX, tgt=%lX, path=%s\n", db_tgt, next_subdir_tgt, path);
 //							_delay_ms(100);
-							sram_writelong(next_subdir_tgt, db_tgt);
+							sram_writelong((next_subdir_tgt-SRAM_MENU_ADDR), db_tgt);
 							sram_writebyte(len+1, db_tgt+sizeof(next_subdir_tgt));
 							sram_writeblock(path, db_tgt+sizeof(next_subdir_tgt)+sizeof(len), pathlen);
 							sram_writeblock("/\0", db_tgt + sizeof(next_subdir_tgt) + sizeof(len) + pathlen, 2);
@@ -180,7 +180,7 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
 											db_tgt += 0x00010000;
 											dprintf("new=%lx\n", db_tgt);
 										}
-										sram_writelong(db_tgt, dir_tgt);
+										sram_writelong((db_tgt-SRAM_MENU_ADDR), dir_tgt);
 //										sram_writeblock((uint8_t*)&db_tgt, dir_tgt, sizeof(db_tgt));
 										dir_tgt += 4;
 										// save element:
@@ -214,8 +214,8 @@ uint16_t scan_dir(char* path, char mkdb, uint32_t this_dir_tgt) {
 	}
 //	dprintf("%x\n", crc);
 //	_delay_ms(50);
-	sram_writeblock(&db_tgt, SRAM_DB_ADDR+4, sizeof(db_tgt));
-	sram_writeblock(&dir_end, SRAM_DB_ADDR+8, sizeof(dir_end));
+	sram_writelong(db_tgt, SRAM_DB_ADDR+4);
+	sram_writelong(dir_end, SRAM_DB_ADDR+8);
 	return crc;
 }
 

+ 10 - 4
src/fpga.c

@@ -27,6 +27,7 @@
 #include "fpga_spi.h"
 #include "spi.h"
 #include "avrcompat.h"
+#include "led.h"
 
 /*DWORD get_fattime(void) {
 	return 0L;
@@ -75,6 +76,7 @@ void fpga_postinit() {
 void fpga_pgm(uint8_t* filename) {
 	int MAXRETRIES = 10;
 	int retries = MAXRETRIES;
+	int j=0;
 	do {
 		set_prog_b(0);
 		uart_putc('P');
@@ -93,6 +95,9 @@ void fpga_pgm(uint8_t* filename) {
 		}
 	
 		for (;;) {
+			if(!(j++ % 8)) {
+				toggle_pwr_led();
+			}
 			bytes_read = file_read();
 			if (file_res || bytes_read == 0) break;   // error or eof
 			for(int i=0; i<bytes_read; i++) {
@@ -105,6 +110,7 @@ void fpga_pgm(uint8_t* filename) {
 	if(!fpga_get_done()) {
 		dprintf("FPGA failed to configure after %d tries.\n", MAXRETRIES);
 		_delay_ms(50);
+		led_panic();
 	}
 	fpga_postinit();
 }
@@ -113,13 +119,13 @@ void set_avr_ena(uint8_t val) {
 	if(val) { // shared mode
 		PORTD |= _BV(PD7);
 		// Disable SPI double speed mode -> clock = f/4
-		SPSR = 0;
-		dprintf("SPI slow\n");
+// 		SPSR = 0;
+//		dprintf("SPI slow\n");
 	} else { // avr only
 		PORTD &= ~_BV(PD7);
 		// Enable SPI double speed mode -> clock = f/2
-		SPSR = _BV(SPI2X);
-		dprintf("SPI fast\n");
+//		SPSR = _BV(SPI2X);
+//		dprintf("SPI fast\n");
 	}
 }
 

+ 20 - 0
src/led.c

@@ -25,6 +25,7 @@
 */
 
 #include <avr/io.h>
+#include <util/delay.h>
 #include "config.h"
 #include "led.h"
 
@@ -34,11 +35,30 @@ static uint8_t led_bounce_dir = 1;
 
 volatile uint8_t led_state;
 
+void led_panic(void) {
+        led_std();
+
+        while(1) {
+                set_pwr_led(1);
+                set_busy_led(1);
+                _delay_ms(150);
+                set_pwr_led(0);
+                set_busy_led(0);
+                _delay_ms(150);
+        }
+
+}
+
 void toggle_busy_led(void) {
 	PORTB &= ~_BV(PB3);
 	DDRB ^= _BV(PB3);
 }
 
+void toggle_pwr_led(void) {
+	PORTB &= ~_BV(PB0);
+	DDRB ^= _BV(PB0);
+}
+
 void set_busy_led(uint8_t state) {
 	PORTB &= ~_BV(PB3);
 	if(state) {

+ 2 - 0
src/led.h

@@ -39,10 +39,12 @@ extern volatile uint8_t led_state;
 
 /* Update the LEDs to match the buffer state */
 void toggle_busy_led(void);
+void toggle_pwr_led(void);
 void set_busy_led(uint8_t);
 void set_pwr_led(uint8_t);
 void set_busy_pwm(uint8_t brightness);
 void bounce_busy_led(void);
 void led_pwm(void);
 void led_std(void);
+void led_panic(void);
 #endif

+ 4 - 15
src/main.c

@@ -261,8 +261,9 @@ restart:
 
 //	sram_hexdump(0, 0x200);
 	uart_putc('(');
-	load_rom((uint8_t*)"/sd2snes/menu.bin");
+	load_rom((uint8_t*)"/sd2snes/menu.bin", SRAM_MENU_ADDR);
 	set_rom_mask(0x3fffff); // force mirroring off
+	set_avr_mapper(0x7); // menu mapper
 	uart_putc(')');
 	uart_putcrlf();
 //	sram_hexdump(0x7ffff0, 0x10);
@@ -279,7 +280,6 @@ restart:
 	snes_reset(0);
 
 
-
 	uint8_t cmd = 0;
 
 	while(!sram_reliable());
@@ -292,7 +292,7 @@ restart:
 //				snes_reset(1);
 				set_avr_ena(0);
 				dprintf("Selected name: %s\n", file_lfn);
-				load_rom(file_lfn);
+				load_rom(file_lfn, SRAM_ROM_ADDR);
 //				save_sram((uint8_t*)"/sd2snes/test.smc", romprops.romsize_bytes, 0);
 				if(romprops.ramsize_bytes) {
 					strcpy(strrchr((char*)file_lfn, (int)'.'), ".srm");
@@ -318,7 +318,6 @@ restart:
 	cmd=0;
 	uint8_t snes_reset_prev=0, snes_reset_now=0, snes_reset_state=0;
 	uint16_t reset_count=0;
-// /* XXX */	writetest();
 	while(fpga_test() == FPGA_TEST_TOKEN) {
 		snes_reset_now=get_snes_reset();
 		if(snes_reset_now) {
@@ -359,17 +358,7 @@ restart:
 		snes_reset_prev = snes_reset_now;
 	}
 	// FPGA TEST FAIL. PANIC.
-
-	led_std();
-
-	while(1) {
-		set_pwr_led(1);
-		set_busy_led(1);
-		_delay_ms(150);
-		set_pwr_led(0);
-		set_busy_led(0);
-		_delay_ms(150);
-	}
+	led_panic();
 
 /* HERE BE LIONS */
 while(1)  {	

+ 13 - 8
src/memory.c

@@ -88,11 +88,15 @@ uint32_t sram_readlong(uint32_t addr) {
 	spi_fpga();
 	spiTransferByte(0x81);
 	spiTransferByte(0x00);
-
-	uint32_t val = spiTransferByte(0x00);
-	val |= ((uint32_t)spiTransferByte(0x00)<<8);
-	val |= ((uint32_t)spiTransferByte(0x00)<<16);
-	val |= ((uint32_t)spiTransferByte(0x00)<<24);
+	uint32_t count=0;
+	uint32_t val = spiTransferByte(count & 0xff);
+	count++;
+	val |= ((uint32_t)spiTransferByte(count & val)<<8);
+	count++;
+	val |= ((uint32_t)spiTransferByte(count & val)<<16);
+	count++;
+	val |= ((uint32_t)spiTransferByte(count & val)<<24);
+	count++;
 	spi_none();
 	return val;
 }
@@ -123,15 +127,15 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) {
 	spi_none();
 }
 
-uint32_t load_rom(uint8_t* filename) {
+uint32_t load_rom(uint8_t* filename, uint32_t base_addr) {
 //	uint8_t dummy;
-	set_avr_bank(0);
 	UINT bytes_read;
 	DWORD filesize;
 	UINT count=0;
 	file_open(filename, FA_READ);
 	filesize = file_handle.fsize;
 	smc_id(&romprops);
+	set_avr_addr(base_addr);
 	dprintf("no nervous breakdown beyond this point! or else!\n");
 	if(file_res) {
 		uart_putc('?');
@@ -293,8 +297,9 @@ uint8_t sram_reliable() {
 		val=sram_readlong(SRAM_SCRATCHPAD);
 		if(val==0x12345678) {
 			score++;
+		} else {
+			dprintf("i=%d val=%08lX\n", i, val);
 		}
-//		dprintf("val=%08lX\n", val);
 	}
 	if(score<SRAM_RELIABILITY_SCORE) {
 		result = 0;

+ 9 - 5
src/memory.h

@@ -4,16 +4,20 @@
 #ifndef MEMORY_H
 #define MEMORY_H
 
-#define SRAM_DB_ADDR (0x080000L)
-#define SRAM_DIR_ADDR (0x300000L)
-#define SRAM_CMD_ADDR (0x601004L)
-#define SRAM_FD_ADDR (0x601000L)
+#define SRAM_ROM_ADDR (0x000000L)
 #define SRAM_SAVE_ADDR (0x600000L)
+
+#define SRAM_MENU_ADDR (0x600000L)
+#define SRAM_DB_ADDR (0x620000L)
+#define SRAM_DIR_ADDR (0x610000L)
+#define SRAM_CMD_ADDR (0x7F1004L)
+#define SRAM_FD_ADDR (0x7F1000L)
+#define SRAM_MENU_SAVE_ADDR (0x7F0000L)
 #define SRAM_SCRATCHPAD (0x7FFF00L)
 #define SRAM_DIRID (0x7FFFF0L)
 #define SRAM_RELIABILITY_SCORE (0x100)
 
-	uint32_t load_rom(uint8_t* filename);
+	uint32_t load_rom(uint8_t* filename, uint32_t base_addr);
 	uint32_t load_sram(uint8_t* filename, uint32_t base_addr);
 	void sram_hexdump(uint32_t addr, uint32_t len);
 	uint8_t sram_readbyte(uint32_t addr);

+ 5 - 6
src/snes.c

@@ -15,7 +15,6 @@
 
 uint8_t initloop=1;
 uint32_t saveram_crc, saveram_crc_old;
-uint32_t saveram_base_addr = 0x600000; // chip 3
 void snes_init() {
 	DDRD |= _BV(PD5);	// PD5 = RESET_DIR
 	DDRD |= _BV(PD6); 	// PD6 = RESET
@@ -59,10 +58,10 @@ uint8_t sram_valid = 0;
 void snes_main_loop() {
 	if(!romprops.ramsize_bytes)return;
 	if(initloop) {
-		saveram_crc_old = calc_sram_crc(saveram_base_addr, romprops.ramsize_bytes);
+		saveram_crc_old = calc_sram_crc(SRAM_SAVE_ADDR, romprops.ramsize_bytes);
 		initloop=0;
 	}
-	saveram_crc = calc_sram_crc(saveram_base_addr, romprops.ramsize_bytes);
+	saveram_crc = calc_sram_crc(SRAM_SAVE_ADDR, romprops.ramsize_bytes);
 	sram_valid = sram_reliable();
 	if(crc_valid && sram_valid) {
 		if(saveram_crc != saveram_crc_old) {
@@ -82,7 +81,7 @@ void snes_main_loop() {
 			uart_puthexshort(saveram_crc);
 			uart_putcrlf();
 			set_busy_led(1);
-			save_sram(file_lfn, romprops.ramsize_bytes, saveram_base_addr);
+			save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR);
 			set_busy_led(0);
 			didnotsave=0;
 		}
@@ -90,7 +89,7 @@ void snes_main_loop() {
 			diffcount=0;
 			uart_putc('V');
 			set_busy_led(1);
-			save_sram(file_lfn, romprops.ramsize_bytes, saveram_base_addr);
+			save_sram(file_lfn, romprops.ramsize_bytes, SRAM_SAVE_ADDR);
 			didnotsave=0;	
                         set_busy_led(0);
 		}
@@ -121,5 +120,5 @@ uint8_t menu_main_loop() {
 void get_selected_name(uint8_t* fn) {
 	uint32_t addr = sram_readlong(SRAM_FD_ADDR);
 	dprintf("fd addr=%lX\n", addr);
-	sram_readblock(fn, addr+0x41, 256);
+	sram_readblock(fn, addr+0x41+SRAM_MENU_ADDR, 256);
 }

+ 8 - 8
utils/chili2chr.c

@@ -32,16 +32,16 @@ int main(int argc, char** argv) {
 //	depth = 2;
 // 4->2
 
-	pixperbyte = 2;
-	mask_shift = 4;
-	mask = 0x0f;
-	depth = 4;
+//	pixperbyte = 2;
+//	mask_shift = 4;
+//	mask = 0x0f;
+//	depth = 4;
 // 4->4?
 
-//	pixperbyte = 1;
-//	mask_shift = 0;
-//	mask = 0xff;
-//	depth = 8;
+	pixperbyte = 1;
+	mask_shift = 0;
+	mask = 0xff;
+	depth = 8;
 // 8->8
 
 	dsize = fsize * depth / (8/pixperbyte);

+ 4 - 4
utils/gentilemap.c

@@ -3,19 +3,19 @@
 
 int main(void) {
 uint16_t tile=256;
-uint16_t pad=0xa+256;
+uint16_t pad=256;
 	int i,j;
 	FILE *out;
 	if((out=fopen("tilemap", "wb"))==NULL) {
 		perror("Could not open output file 'tilemap'");
 		return 1;
 	}
-	for(i=0; i<10; i++) {
-		for(j=0; j<21; j++)	{
+	for(i=0; i<8; i++) {
+		for(j=0; j<26; j++)	{
 			fwrite(&tile, 2, 1, out);
 			tile++;			
 		}
-		for(j=21; j<32; j++) {
+		for(j=26; j<32; j++) {
 			fwrite(&pad, 2, 1, out);
 		}
 	}

+ 21 - 2
utils/palremap.c

@@ -18,8 +18,27 @@ int main(int argc, char **argv) {
 	while(1) {
 		uint8_t c=fgetc(in);
 		if(feof(in))break;
-		if(c>=1 && c<=48) {
-			c+=207;
+//		if(c>=1 && c<=48) {
+//			c+=207;
+//		}
+
+//		shift palette by 32
+//		keep color 0
+//		leave room for sprite pal 3 and 7 (176-192 and 240-255)
+		if(c) {
+			if(c>224) { // move upper colors to start
+				c-=224;
+			} else if(c==224) { // remap 224 to 32, not 0
+				c=32;
+			} else {	// shift colors, leave gap 176-191
+					// relocate 0xd0-0xdf (which would be
+					// remapped to 0x00-0x0f) to 0xb0-0xbf
+				c+=32;
+				if(c>=176) {
+					c+=16;
+					if(c<16) c=0xb0+c;
+				}
+			}
 		}
 		fputc(c, out);
 	}

+ 46 - 0
utils/palreorder.c

@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main(int argc, char **argv) {
+	if(argc<3) {
+		fprintf(stderr, "Usage: %s <infile> <outfile>\n", argv[0]);
+		return 1;
+	}
+	FILE *in, *out;
+	if((in=fopen(argv[1], "rb"))==NULL) {
+		perror("Could not open input file");
+		return 1;
+	}
+	if((out=fopen(argv[2], "wb"))==NULL) {
+		perror("Could not open output file");
+		return 1;
+	}
+	uint16_t palette_src[256];
+	uint16_t palette_tgt[256];
+	uint16_t i=0;
+	fread(palette_src, 2, 256, in);
+	for(i=0; i<256; i++) {
+		uint8_t tgt_index=i;
+                if(tgt_index) {
+                        if(tgt_index>224) { // move upper colors to start
+                                tgt_index-=224;
+                        } else if(tgt_index==224) { // remap 224 to 32, not 0
+                                tgt_index=32;
+                        } else {        // shift colors, leave gap 176-191
+                                        // relocate 0xd0-0xdf (which would be
+                                        // remapped to 0x00-0x0f) to 0xb0-0xbf
+                                tgt_index+=32;
+                                if(tgt_index>=176) {
+                                        tgt_index+=16;
+                                        if(tgt_index<16) tgt_index=0xb0+tgt_index;
+                                }
+                        }
+                }
+
+		palette_tgt[tgt_index] = palette_src[i];
+	}
+	fwrite(palette_tgt, 2, 256, out);
+	fclose(out);
+	fclose(in);
+	return 0;
+}

+ 8 - 1
verilog/sd2snes/address.v

@@ -55,6 +55,8 @@ end
       000      HiROM
       001      LoROM
       010      ExHiROM (48-64Mbit)
+      
+      111      menu (ROM in upper SRAM)
 */
 
 /*                               HiROM:   SRAM @ Bank 0x30-0x3f, 0xb0-0xbf
@@ -67,9 +69,11 @@ assign IS_ROM = ( (MAPPER == 3'b000) ? ( (!SNES_ADDR[22]
                                         |(SNES_ADDR[22]))                                         
                 : (MAPPER == 3'b010) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
                                        |(SNES_ADDR[22]))
+                : (MAPPER == 3'b111) ? ((!SNES_ADDR[22] & SNES_ADDR[15])
+                                       |(SNES_ADDR[22]))
                 : 1'b0);
 
-assign IS_SAVERAM = ((MAPPER == 3'b000 || MAPPER == 3'b010) ? (!SNES_ADDR[22]
+assign IS_SAVERAM = ((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b111) ? (!SNES_ADDR[22]
                                            & SNES_ADDR[21:20]                                           
                                            & &SNES_ADDR[14:13]
                                            & !SNES_ADDR[15]
@@ -94,6 +98,9 @@ assign SRAM_ADDR_FULL = (MODE) ? AVR_ADDR
                             :(MAPPER == 3'b010) ?
                               (IS_SAVERAM ? (SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK
                                           : ({!SNES_ADDR[23], SNES_ADDR[21:0]} & ROM_MASK))
+                            :(MAPPER == 3'b111) ?
+                              (IS_SAVERAM ? 23'h7F0000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK)
+                                          : ((SNES_ADDR[22:0] & ROM_MASK) + 23'h600000))
                             : 23'b0);
 
 assign SRAM_BANK = SRAM_ADDR_FULL[22:21];

+ 1 - 1
verilog/sd2snes/avr_cmd.v

@@ -147,7 +147,7 @@ always @(posedge clk) begin
 
 // Read pulse is two spi cycles to ensure that the value
 // is ready in the 2nd cycle in AVR master mode
-   if ((spi_bit_cnt == 3'h6 || spi_bit_cnt == 3'h7) & (cmd_data[7:4] == 4'h8) & (spi_byte_cnt > 32'h0))
+   if ((spi_bit_cnt == 3'h5 || spi_bit_cnt == 3'h6 || spi_bit_cnt == 3'h7) & (cmd_data[7:4] == 4'h8) & (spi_byte_cnt > 32'h0))
       AVR_READ_BUF <= 1'b0;
    else
       AVR_READ_BUF <= 1'b1;

Some files were not shown because too many files changed in this diff