diff --git a/snes/const.a65 b/snes/const.a65 index 99dfcf7..70b5de3 100644 --- a/snes/const.a65 +++ b/snes/const.a65 @@ -71,7 +71,7 @@ hdma_cg_addr_src .byt $00 hdma_mode_src .byt 74, $03, $01, $05, $00 hdma_scroll_src .byt 74 - .byt $00, $00, $ff, $00 + .byt $00, $00, $ff, $0f .byt $01 .byt $fc, $00, $05, $00 .byt $00 diff --git a/snes/data.a65 b/snes/data.a65 index ba80005..f0f0d1d 100644 --- a/snes/data.a65 +++ b/snes/data.a65 @@ -67,6 +67,11 @@ fd_fnoff .word 0 ; offset of filename in file descriptor pad1mem .word 0 pad1trig .word 0 pad1delay .word 0 +;----------menu layout/system constants (224/448) +listdisp .word 0 ; number of displayable list entries +textdmasize .word 0 ; number of bytes to copy each frame +barstep .byt 0 ; step size for bar + ;----------hdma tables in WRAM (must be stable when cartridge is cut off) hdma_pal .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/main.a65 b/snes/main.a65 index 6a35e2d..7d8e66e 100644 --- a/snes/main.a65 +++ b/snes/main.a65 @@ -53,12 +53,12 @@ setup_gfx: ;clear BG1 tilemap ldx #BG1_TILE_BASE stx $2116 - DMA0(#$09, #$800, #^zero, #!zero, #$18) + DMA0(#$09, #$1000, #^zero, #!zero, #$18) ;clear BG2 tilemap ldx #BG2_TILE_BASE stx $2116 - DMA0(#$09, #$800, #^zero, #!zero, #$18) + DMA0(#$09, #$1000, #^zero, #!zero, #$18) ;copy logo tiles ldx #$2000 @@ -123,17 +123,18 @@ tests: rep #$10 : .xl ;16-bit index lda #$03 ;mode 3, mode 5 via HDMA :D sta $2105 - lda #$54 ;Tilemap addr 0xA800 + lda #$58 ;Tilemap addr 0xB000 + ora #$02 ;SC size 32x64 sta $2107 ;for BG1 lda #$50 ;Tilemap addr 0xA000 + ora #$02 ;SC size 32x64 sta $2108 ;for BG2 lda #$40 ;chr base addr: sta $210b ;BG1=0x0000, BG2=0x8000 lda #$03 ;enable BG1+BG2 sta $212c ;BG Main sta $212d ;BG Sub - lda #$00 ;224 (01=448) - sta $2133 ; + jsr setup_224 lda #$00 sta $2130 stz $2121 @@ -202,6 +203,7 @@ snes_init: stz $2120 ; stz $2121 ; stz $2122 ; (CG Data?!) + stz $2122 ; (CG Data?!) stz $2123 ; stz $2124 ; stz $2125 ; diff --git a/snes/menu.a65 b/snes/menu.a65 index 22d73b3..7dcd57e 100644 --- a/snes/menu.a65 +++ b/snes/menu.a65 @@ -53,7 +53,7 @@ menu_cleanup: lsr pha menu_cleanup_loop - cmp #17 + cmp listdisp beq + pha clc @@ -108,6 +108,9 @@ menu_updates: lda #$80 and pad1trig+1 bne key_b + lda #$20 + and pad1trig+1 + bne key_select bra menuupd_out key_down jsr menu_key_down @@ -124,6 +127,10 @@ key_left key_b jsr menu_key_b bra menuupd_out +key_select + jsr menu_key_select + bra menuupd_out + menuupd_out lda #$0A sta cursor_y @@ -146,7 +153,9 @@ redraw_filelist redraw_filelist_loop ldy dirptr_idx tya - cmp #17*4 + lsr + lsr + cmp listdisp beq redraw_filelist_last lda dirptr_bank phb @@ -272,8 +281,9 @@ dirent_type_cont rts menu_key_down: - lda menu_sel - cmp #$10 + lda listdisp + dec + cmp menu_sel bne + lda #$01 sta menu_dirty @@ -286,7 +296,8 @@ menu_key_down: sta dirptr_addr sep #$20 : .as rts -+ inc ++ lda menu_sel + inc sta menu_sel down_out rts @@ -317,9 +328,16 @@ menu_key_left: lda dirptr_addr beq + sec - sbc #17*4 + sbc listdisp + sec + sbc listdisp + sec + sbc listdisp + sec + sbc listdisp cmp dirstart_addr bcc + + bmi + - sta dirptr_addr sep #$20 : .as rts @@ -336,9 +354,11 @@ menu_key_right: lda #$01 sta menu_dirty rep #$20 : .al - lda dirptr_addr + lda listdisp + asl + asl clc - adc #17*4 + adc dirptr_addr sta dirptr_addr sep #$20 : .as rts @@ -353,6 +373,16 @@ menu_key_b: jsr select_item rts +menu_key_select: + lda barstep + beq do_setup448 +do_setup224 + jsr setup_224 + rts +do_setup448 + jsr setup_448 + rts + select_item: rep #$20 : .al lda menu_sel @@ -384,7 +414,6 @@ sel_is_dir select_file: ; have avr load the rom - sta @$fffffe dey lda (dirptr_addr), y sta @AVR_PARAM+2 @@ -399,7 +428,6 @@ select_file: rts select_dir: ; y = direntry ptr - sta @$ffffff ;for great breakpoint dey lda (dirptr_addr), y clc @@ -432,3 +460,77 @@ select_dir: ; y = direntry ptr sta @menu_dirty plb rts + + +setup_224: + php + rep #$30 : .xl : .al + lda #17 + sta listdisp + dec + cmp menu_sel + bmi setup_228_adjsel + bra + +setup_228_adjsel + sta menu_sel ++ + lda #18*64 + sta textdmasize + lda #$0005 + sta hdma_scroll+8 + sep #$20 : .as + lda #$05 + sta $2110 + lda #$00 + sta $2110 + lda #$00 + sta barstep + sta $2133 + lda #$0a + sta hdma_math+6 + lda #$01 + sta menu_dirty + lda #^space64 + ldx #!space64 + sta print_bank + stx print_src + stz print_pal + lda #64 + sta print_count + lda #27 + sta print_y + stz print_x + jsr hiprint + lda #28 + sta print_y + jsr hiprint + jsr hiprint + + plp + rts + +setup_448: + php + rep #$30 : .xl : .al + lda #34 + sta listdisp + lda #36*64 + sta textdmasize + lda #$ffba + sta hdma_scroll+8 + sep #$20 : .as + lda #$ba + sta $2110 + lda #$ff + sta $2110 + lda #$01 + sta barstep + sta $2133 + lda #$06 + sta hdma_math+6 + lda #$01 + sta menu_dirty + plp + rts + + diff --git a/snes/reset.a65 b/snes/reset.a65 index 9fb9466..749f636 100644 --- a/snes/reset.a65 +++ b/snes/reset.a65 @@ -20,11 +20,11 @@ NMI_ROUTINE: ldx #BG1_TILE_BASE+32*10 stx $2116 - DMA0(#$01, #$380*2-64*10, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18) + DMA0(#$01, #34*64, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18) ldx #BG2_TILE_BASE+32*10 stx $2116 - DMA0(#$01, #$380*2-64*10, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18) + DMA0(#$01, #34*64, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18) ldx #BG2_TILE_BASE stx $2116 @@ -33,7 +33,18 @@ NMI_ROUTINE: lda bar_yl asl asl + tax + lda barstep + php + txa + plp + bne small_bar asl + bra normal_bar +small_bar + clc + adc #36 +normal_bar sta bar_y lda bar_y diff --git a/src/main.c b/src/main.c index 70927f3..8558e80 100644 --- a/src/main.c +++ b/src/main.c @@ -245,11 +245,13 @@ int main(void) { } dprintf("cmd was %x, going to snes main loop\n", cmd); + led_std(); cmd=0; while(1) { if(get_snes_reset()) { dprintf("RESET\n"); } + sram_reliable(); snes_main_loop(); } diff --git a/src/memory.c b/src/memory.c index e22320f..8eb1b52 100644 --- a/src/memory.c +++ b/src/memory.c @@ -218,30 +218,30 @@ uint32_t load_sram(uint8_t* filename, uint32_t base_addr) { void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) { - uint32_t count = 0; + uint32_t count = 0; uint32_t num = 0; spi_none(); - file_open(filename, FA_CREATE_ALWAYS | FA_WRITE); + file_open(filename, FA_CREATE_ALWAYS | FA_WRITE); if(file_res) { uart_putc(0x30+file_res); } - while(count