diff --git a/snes/const.a65 b/snes/const.a65 index 12d8f3b..e27b31c 100644 --- a/snes/const.a65 +++ b/snes/const.a65 @@ -121,4 +121,4 @@ 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 $00 -text_dirmark .byt " ", 0 +text_dirmark .byt " ", 0 diff --git a/snes/menu.a65 b/snes/menu.a65 index dcb90da..ff3e246 100644 --- a/snes/menu.a65 +++ b/snes/menu.a65 @@ -31,7 +31,6 @@ menuloop_s1 lsr bcc menuloop_s1 stz isr_done - jsr menu_cleanup ;update phase 2 jsr menu_updates ;update stuff, check keys etc lda menu_dirty ;is there ANY reason to redraw the menu? cmp #$01 @@ -40,24 +39,25 @@ menuloop_s1 menuloop_redraw stz menu_dirty jsr menu_redraw + jsr menu_cleanup ;update phase 2 bra menuloop_s1 rts menu_cleanup: sep #$20 : .as rep #$10 : .xl - lda dirend_onscreen - beq menu_cleanup_out + lda dirend_onscreen ;end of file list on screen? + beq menu_cleanup_out ; lda dirend_idx lsr lsr pha -menu_cleanup_loop - cmp listdisp - beq + +menu_cleanup_loop ;pad rest of screen with empty lines + cmp listdisp ;end of screen reached? + beq + ;then leave pha clc - adc #$09 + adc #$09 ;first line in text area inc sta print_y stz print_x @@ -175,12 +175,12 @@ redraw_filelist_loop iny iny sep #$20 : .as - lda (dirptr_addr), y + lda (dirptr_addr), y ; load fileinfo bank clc - adc #$c0 - sta @dirent_bank - cmp #$c0 - beq redraw_filelist_dirend + adc #$c0 ; add $C0 for memory map + sta @dirent_bank ; store as current bank + cmp #$c0 ; if bank was 0 -> dirend entry in DB + beq redraw_filelist_dirend ; handle dirend iny lda (dirptr_addr), y iny @@ -191,14 +191,14 @@ redraw_filelist_loop bra redraw_filelist_loop redraw_filelist_dirend plb + dey ; recover last valid direntry number + dey ; (we had 2x iny of the direntry pointer above, + dey ; so account for those too) dey dey dey - dey - dey - dey - sty dirend_idx - lda #$01 + sty dirend_idx ; dirend_idx <- last valid directory entry. + lda #$01 ; encountered during redraw, so must be on screen sta dirend_onscreen bra redraw_filelist_out redraw_filelist_last ;check if next offscreen item is end of dir @@ -240,19 +240,19 @@ dirent_is_dir sta @print_pal bra dirent_type_cont dirent_is_file - lda #$09 - sta @fd_fnoff ;no offset - lda #$00 - sta @print_pal ;palette 0 (white) + lda #$06 ;skip size string + sta @fd_fnoff + lda #$00 ;palette 0 (white) + sta @print_pal dirent_type_cont - rep #$20 : .al + rep #$20 : .al txa clc adc @fd_fnoff tax sep #$20 : .as lda !0, x ;load offset of leaf (file) name - inc + inc rep #$20 : .al and #$00ff ;kill hi byte sta @fd_fnoff @@ -267,7 +267,7 @@ dirent_type_cont sep #$20 : .as ldx fd_fnoff - lda #52 + lda #54 sta print_count stx print_src lda dirent_bank @@ -279,7 +279,7 @@ dirent_type_cont adc print_done sta print_x - lda #52 + lda #54 sec sbc print_done sta print_count @@ -290,28 +290,26 @@ dirent_type_cont jsr hiprint sep #$20 : .as - lda dirent_type - cmp #$80 - bne dirent_is_file_2 - lda #^text_dirmark - ldx #!text_dirmark - inx - sta print_bank - stx print_src - bra dirent_type_cont_2 + lda dirent_type + cmp #$80 + bne dirent_is_file_2 + lda #^text_dirmark + ldx #!text_dirmark + sta print_bank + stx print_src + bra dirent_type_cont_2 dirent_is_file_2 - lda dirent_bank - ldx dirent_addr - inx - sta print_bank - stx print_src + lda dirent_bank + ldx dirent_addr + sta print_bank + stx print_src dirent_type_cont_2 - lda #54 - sta print_x - lda #8 - sta print_count - jsr hiprint - + lda #56 + sta print_x + lda #6 + sta print_count + jsr hiprint + rts menu_key_down: @@ -330,6 +328,14 @@ menu_key_down: sta dirptr_addr sep #$20 : .as rts ++ lda dirend_onscreen + beq + + lda dirend_idx + lsr + lsr + cmp menu_sel + beq menuupd_lastcursor + bcc menuupd_lastcursor + lda menu_sel inc sta menu_sel @@ -355,32 +361,39 @@ up_out sep #$20 : .as rts -menu_key_left: - lda #$01 +menuupd_lastcursor + lda dirend_idx + lsr + lsr + sta menu_sel + rts + +; go back one page +menu_key_left: + lda #$01 ; must redraw afterwards sta menu_dirty rep #$20 : .al - lda dirptr_addr - beq + - sec - sbc listdisp - sec - sbc listdisp - sec - sbc listdisp - sec - sbc listdisp + lda dirptr_addr ; get current direntry pointer + beq + ; special case: if 0, we are at the first entry in memory + lsr + lsr ; make comparable to listdisp + cmp listdisp ; if there's less or equal previous entries... + beq + ; ...than display lines, reset to directory start bcc + - cmp dirstart_addr - bcc + -- sta dirptr_addr + sec + sbc listdisp ; subtract one screen page's worth of entries + asl + asl ; make comparable to dirstart_addr again + cmp dirstart_addr ; check whether calculated offset is before... + bcc + ; ...start of directory +- sta dirptr_addr ; store new selected entry sep #$20 : .as rts -+ lda dirstart_addr - sep #$20 : .as - stz menu_sel - rep #$20 : .al ++ lda dirstart_addr ; reset pointer to start of directory + stz menu_sel ; reset the selection cursor too bra - - + +; go forth one page menu_key_right: sep #$20 : .as lda dirend_onscreen @@ -396,12 +409,6 @@ menu_key_right: sta dirptr_addr sep #$20 : .as rts -menuupd_lastcursor - lda dirend_idx - lsr - lsr - sta menu_sel - rts menu_key_b: jsr select_item @@ -519,9 +526,9 @@ setup_224: sta listdisp dec cmp menu_sel - bmi setup_228_adjsel + bmi setup_224_adjsel bra + -setup_228_adjsel +setup_224_adjsel sta menu_sel + lda #19*64