diff --git a/snes/Makefile b/snes/Makefile index 51ee6d3..e687c31 100644 --- a/snes/Makefile +++ b/snes/Makefile @@ -3,7 +3,7 @@ OBJS = header.ips reset.o65 main.o65 font.o65 palette.o65 data.o65 const.o65 log all: menu.bin smc: menu.bin - cat menu.bin sd2snes.rom > $@ + cat menu.bin sd2snes.rom > menu.smc menu.bin: $(OBJS) sneslink -fsmc -o $@ $^ diff --git a/snes/data.a65 b/snes/data.a65 index 5e8a47e..0147868 100644 --- a/snes/data.a65 +++ b/snes/data.a65 @@ -8,19 +8,11 @@ dirend_addr .word 0 dirend_bank .byt 0 dirend_idx .word 0 dirptr_idx .word 0 -dirptr_table .word 0,0,0,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,0,0,0 dirent_addr .word 0 dirent_bank .byt 0 dirent_type .byt 0 dirend_onscreen .byt 0 -dirlog_idx .byt 0 -dirlog .word 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 - .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 - .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 +dirlog_idx .byt 0,0,0 ; long ptr ;----------parameters for text output---------- print_x .byt 0 ;x coordinate @@ -163,6 +155,19 @@ hdma_window .byt 0 .byt 0 .byt 0,0 .byt 0 +; dirlog format: +; dirstart_addr 2 +; dirstart_bank 1 +; dirptr_addr 2 +; dirptr_bank 1 +; menu_sel 2 +; total 8 bytes +dirlog .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 + .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 + .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 infloop .byt 0,0 ; to be filled w/ 80 FE wram_fadeloop .byt 0 diff --git a/snes/menu.a65 b/snes/menu.a65 index 9e7cba7..d6d065d 100644 --- a/snes/menu.a65 +++ b/snes/menu.a65 @@ -25,6 +25,12 @@ menu_init: stx menu_sel lda #$01 sta menu_dirty + rep #$20 : .al + lda #!dirlog + sta dirlog_idx + sep #$20 : .as + lda #^dirlog + sta dirlog_idx+2 rts menuloop: @@ -247,6 +253,7 @@ print_direntry: plb lda @dirent_type + and #$f0 cmp #$80 rep #$20 : .al bne dirent_is_file @@ -319,6 +326,7 @@ dirent_type_cont sep #$20 : .as lda dirent_type + and #$f0 cmp #$80 bne dirent_is_file_2 lda #^text_dirmark @@ -486,12 +494,17 @@ select_item: beq sel_is_file cmp #$80 beq sel_is_dir + cmp #$81 + beq sel_is_parent select_item_cont plb rts sel_is_file jsr select_file bra select_item_cont +sel_is_parent + jsr select_parent + bra select_item_cont sel_is_dir jsr select_dir bra select_item_cont @@ -516,7 +529,35 @@ select_file: jsl @wram_fadeloop rts -select_dir: ; y = direntry ptr +select_dir: + tyx +; save old dir position + rep #$20 : .al + ldy #$0000 + lda @dirstart_addr + sta [dirlog_idx], y + iny + iny + lda @dirstart_bank + sta [dirlog_idx], y + iny + lda @dirptr_addr + sta [dirlog_idx], y + iny + iny + lda @dirptr_bank + sta [dirlog_idx], y + iny + lda @menu_sel + sta [dirlog_idx], y + lda @dirlog_idx + clc + adc #$0008 + sta @dirlog_idx + sep #$20 : .as +;--- +; y = direntry ptr + txy dey lda (dirptr_addr), y clc @@ -550,6 +591,38 @@ select_dir: ; y = direntry ptr plb rts +select_parent: + rep #$20 : .al + lda @dirlog_idx + sec + sbc #$0008 + sta @dirlog_idx + ldy #$0000 + lda [dirlog_idx], y ; load dirstart_addr + sta @dirstart_addr + iny + iny + sep #$20 : .as + lda [dirlog_idx], y ; load dirstart_bank + sta @dirstart_bank + iny + rep #$20 : .al + lda [dirlog_idx], y ; load dirptr_addr + sta @dirptr_addr + iny + iny + sep #$20 : .as + lda [dirlog_idx], y ; load dirptr_bank + sta @dirptr_bank + iny + rep #$20 : .al + lda [dirlog_idx], y ; load menu_sel + sta @menu_sel + sep #$20 : .as + lda #$01 + sta @menu_dirty + rts + menu_key_x: jsr mainmenu rts