Files
sd2snes/snes/filesel.a65
ikari 48fecdb5c6 Fix refresh/cursor issues in "Favorite games" menu
Fixes #156

UI stuff is always the most painful...
- There was no way to return outside of the submenu system whether a
  function was executed so a `listsel_dirty` flag was introduced to force
  refresh
- Same for the `listsel_backup` variable
- Redrawing the list after removing a favorite resulted in some flickering so
  an additional `screen_dma_disable` flag was introduced to inhibit
  screen refresh (WRAM->VRAM DMA) until the redraw was finished.
  This feature can be useful for other redraw operations.
2023-02-20 00:40:41 +01:00

1256 lines
20 KiB
Plaintext

.link page $c0
#include "memmap.i65"
#include "dma.i65"
filesel_init:
sep #$20 : .as
rep #$10 : .xl
lda #^ROOT_DIR
ldx #!ROOT_DIR
sta dirptr_bank
stx dirptr_addr
sta dirstart_bank
stx dirstart_addr
stz filesel_state
stz dirend_onscreen
lda #$02
sta cursor_x
lda #$09
sta cursor_y
lda #$01
sta bar_xl
lda #$3e
sta bar_wl
ldx #$0000
stx dirptr_idx
stx filesel_sel
stx direntry_xscroll
stx direntry_xscroll_state
lda #$01
sta filesel_dirty
rep #$20 : .al
lda #!dirlog
sta dirlog_idx
sep #$20 : .as
lda #^dirlog
sta dirlog_idx+2
lda #$2f
sta @FILESEL_CWD
lda #$00
sta @FILESEL_CWD+1
jsr filesel_request_filelist
rts
fileselloop:
sep #$20 : .as
rep #$10 : .xl
lda isr_done
lsr
bcc fileselloop
stz isr_done
jsr printtime
jsr filesel_updates ; update stuff, check keys etc
lda filesel_dirty ; is there ANY reason to redraw the menu?
cmp #$01
beq fileselloop_redraw ; then do
jsr scroll_direntry
bra fileselloop
fileselloop_redraw
stz filesel_dirty
jsr filesel_statusbar
jsr filesel_redraw
jsr filesel_cleanup ; update phase 2
bra fileselloop
rts
filesel_cleanup:
sep #$20 : .as
rep #$10 : .xl
lda dirend_onscreen ; end of file list on screen?
beq filesel_cleanup_out
lda dirend_idx
lsr
lsr
pha
filesel_cleanup_loop ; pad rest of screen with empty lines
cmp listdisp ; end of screen reached?
beq + ; then leave
pha
clc
adc #$09 ; first line in text area
inc
sta print_y
stz print_x
lda #^space64
ldx #!space64
sta print_bank
stx print_src
stz print_pal
lda #64
sta print_count
jsr hiprint
pla
inc
bra filesel_cleanup_loop
+
pla
cmp filesel_sel
beq filesel_cleanup_out
bpl filesel_cleanup_out
sta filesel_sel
filesel_cleanup_out
rts
filesel_updates:
; update selection, scroll etc
lda filesel_sel
asl
asl
sta dirptr_idx
lda filesel_sel
clc
adc #$08
sta bar_yl
lda #$3e
sta bar_wl
lda #$01
sta bar_xl
; get input
jsr read_pad
lda pad_down
bne key_down
lda pad_up
bne key_up
lda pad_right
bne key_right
lda pad_left
bne key_left
lda pad_b
bne key_b
lda pad_start
bne key_start
lda pad_select
bne key_select
lda pad_a
bne key_a
lda pad_x
bne key_x
lda pad_y
bne key_y
lda pad_l
bne key_l
lda pad_r
bne key_r
bra fileselupd_out
key_down
jsr filesel_key_down
bra fileselupd_out
key_up
jsr filesel_key_up
bra fileselupd_out
key_right
jsr filesel_key_right
bra fileselupd_out
key_left
jsr filesel_key_left
bra fileselupd_out
key_b
jsr filesel_key_b
bra fileselupd_out
key_a
jsr filesel_key_a
bra fileselupd_out
key_x
jsr filesel_key_x
bra fileselupd_out
key_y
jsr filesel_key_y
bra fileselupd_out
key_select
jsr filesel_key_select
bra fileselupd_out
key_start
jsr filesel_key_start
bra fileselupd_out
key_l
jsr filesel_key_l
bra fileselupd_out
key_r
jsr filesel_key_r
bra fileselupd_out
fileselupd_out
lda #$09
sta cursor_y
rts
filesel_redraw:
lda filesel_state
beq redraw_filelist
; cmp 1
; beq redraw_main
filesel_redraw_out
rts
redraw_filelist
ldy #$0000
sty dirptr_idx
sty direntry_fits_idx
sty direntry_xscroll
sty direntry_xscroll_state
stz dirend_idx
stz dirend_onscreen
redraw_filelist_loop
ldy dirptr_idx
tya
lsr
lsr
cmp listdisp
beq redraw_filelist_last
rep #$20 : .al
lda [dirptr_addr], y
sta @dirent_addr
iny
iny
sep #$20 : .as
lda [dirptr_addr], y ; load fileinfo bank
clc
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
sta @dirent_type
sty dirptr_idx
jsr print_direntry
inc direntry_fits_idx
bra redraw_filelist_loop
redraw_filelist_dirend
dey ; recover last valid direntry number
dey ; (we had 2x iny of the direntry pointer above,
beq +
dey ; so account for those too)
dey
dey
dey
+ 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
iny
iny
lda [dirptr_addr], y
beq redraw_filelist_dirend
redraw_filelist_out
ldx #$0000
stx dirptr_idx
brl filesel_redraw_out
print_direntry:
lda cursor_y
sta print_y
inc
sta cursor_y
lda dirent_bank
ldx dirent_addr
phb
pha
plb
rep #$20 : .al
lda #$06 ; skip size string
sta @fd_fnoff
lda @dirent_type
and #TYPE_SUBDIR|TYPE_PARENT
beq dirent_is_file
dirent_is_dir
lda #$01 ; different color for dirs
bra dirent_type_cont
dirent_is_file
lda @dirent_type
and #$00ff
cmp #$0001 ; SMC -> palette 0 (white)
bne +
lda #$0000
bra dirent_type_cont
+
cmp #TYPE_SPC ; SPC -> palette 2
bne +
lda #$0002
bra dirent_type_cont
cmp #TYPE_IPS ; IPS -> palette 2 (green)
bne +
lda #$0002
bra dirent_type_cont
+
lda #$0000 ; default -> palette 0
dirent_type_cont
sta @print_pal
rep #$20 : .al
txa
clc
adc @fd_fnoff
clc
adc @direntry_xscroll
sta @fd_fnoff
plb
lda cursor_x
sta print_x
sep #$20 : .as
ldx fd_fnoff
lda #54
sta print_count
stx print_src
lda dirent_bank
sta print_bank
jsr hiprint
lda cursor_x
clc
adc print_done
sta print_x
lda print_over
ldy direntry_fits_idx
sta !direntry_fits, y
lda #54
sec
sbc print_done
sta print_count
lda #^space64
ldx #!space64
sta print_bank
stx print_src
jsr hiprint
sep #$20 : .as
lda dirent_type
and #$f0
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
sta print_bank
stx print_src
dirent_type_cont_2
lda #56
sta print_x
lda #6
sta print_count
jsr hiprint
rts
filesel_key_down:
jsr scroll_direntry_clean
lda listdisp
dec
cmp filesel_sel
bne down_noscroll
lda #$01
sta filesel_dirty
lda dirend_onscreen
bne down_out
rep #$20 : .al
lda dirptr_addr
clc
adc #$04
bcc +
inc dirptr_bank
+ sta dirptr_addr
sep #$20 : .as
rts
down_noscroll
lda dirend_onscreen
beq +
lda dirend_idx
lsr
lsr
cmp filesel_sel
beq fileselupd_lastcursor
bcc fileselupd_lastcursor
+ lda filesel_sel
inc
sta filesel_sel
down_out
rts
filesel_key_up:
jsr scroll_direntry_clean
lda filesel_sel
bne up_noscroll
lda #$01
sta filesel_dirty
rep #$20 : .al
lda dirptr_addr
cmp dirstart_addr
beq up_out
sec
sbc #$04
bcs +
dec dirptr_bank
+ sta dirptr_addr
bra up_out
up_noscroll
dec
sta filesel_sel
up_out
sep #$20 : .as
rts
fileselupd_lastcursor
jsr scroll_direntry_clean
lda dirend_idx
lsr
lsr
sta filesel_sel
rts
; go back one page
filesel_key_left:
stz direntry_xscroll
stz direntry_xscroll_state
lda #$01 ; must redraw afterwards
sta filesel_dirty
rep #$20 : .al
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 +
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 ; reset pointer to start of directory
stz filesel_sel ; reset the selection cursor too
bra -
; go forth one page
filesel_key_right:
stz direntry_xscroll
stz direntry_xscroll_state
sep #$20 : .as
lda dirend_onscreen
bne fileselupd_lastcursor
lda #$01
sta filesel_dirty
rep #$20 : .al
lda listdisp
asl
asl
clc
adc dirptr_addr
sta dirptr_addr
lda listdisp
asl
asl
clc
adc dirptr_addr
cmp dirend_addr
bmi +
lda dirend_addr
lsr
lsr
sec
sbc listdisp
asl
asl
sta dirptr_addr
sep #$20 : .as
lda listdisp
dec
sta filesel_sel
+ sep #$20 : .as
rts
filesel_key_a:
jsr select_item
rts
filesel_key_select:
jsl select_favorite_file
rts
filesel_key_start:
jsl select_last_file
rts
filesel_key_b:
stz direntry_xscroll
stz direntry_xscroll_state
jmp sel_is_parent
filesel_key_l:
stz direntry_xscroll
stz direntry_xscroll_state
ldx dirstart_addr
stx dirptr_addr
ldx #$0000
stx filesel_sel
lda #$01
sta filesel_dirty
rts
filesel_key_r:
stz direntry_xscroll
stz direntry_xscroll_state
lda dirend_onscreen
beq +
jmp fileselupd_lastcursor
+ lda #$01
sta filesel_dirty
; subtract listdisp from index to get first entry pos
; if less than one screen's worth, set to 0000, set cursor to last file
; else set cursor to listdisp
rep #$20 : .al
lda dirend_addr
lsr
lsr
sec
sbc dirstart_addr
cmp listdisp ; listdisp > ptr?
bpl +
beq +
stz dirptr_addr
tya
lsr
lsr
dec
sep #$20 : .as
sta filesel_sel
bra filesel_key_r_out
+ sbc listdisp
asl
asl
sta dirptr_addr
sep #$20 : .as
lda listdisp
dec
sta filesel_sel
filesel_key_r_out
rts
select_item:
rep #$20 : .al
lda filesel_sel
and #$00ff
asl
asl
tay
sep #$20 : .as
iny
iny
iny
lda [dirptr_addr], y
cmp #TYPE_ROM
beq sel_is_file
cmp #TYPE_SPC
beq sel_is_spc
cmp #TYPE_SUBDIR
beq sel_is_dir
cmp #TYPE_PARENT
beq sel_is_parent
select_item_cont
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
sel_is_spc
jsr select_spc
bra select_item_cont
select_file:
; have MCU load the rom
dey
rep #$20 : .al
lda [dirptr_addr], y
and #$00ff
sta @MCU_PARAM+6
dey
dey
lda [dirptr_addr], y
sta @MCU_PARAM+4
lda #!FILESEL_CWD
sta @MCU_PARAM
sep #$20 : .as
lda #^FILESEL_CWD
sta @MCU_PARAM+2
lda #$00
sta @MCU_PARAM+3
lda #CMD_LOADROM
jsr game_handshake
rts
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 @filesel_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
adc #$c0
sta @dirent_bank
dey
dey
rep #$20 : .al
lda [dirptr_addr], y
sta @dirent_addr
tay
sep #$20 : .as
lda @dirent_bank
phb
pha
plb
; append selected dir name to current working directory
ldx #$0000
find_path_end:
lda @FILESEL_CWD, x
beq path_end_found
inx
bra find_path_end
path_end_found
dex
lda @FILESEL_CWD, x
cmp #$2f
beq copy_new_path
inx
copy_new_path:
lda #$2f
sta @FILESEL_CWD, x
inx
copy_new_path_loop:
lda !6, y
sta @FILESEL_CWD, x
beq +
inx
iny
bra copy_new_path_loop
+ lda #$00
; kill trailing /
dex
sta @FILESEL_CWD, x
plb
; request directory listing
jsr filesel_request_filelist
rep #$20 : .al
lda #$0000
sta @dirptr_addr
sta @dirstart_addr
sep #$20 : .as
sta @filesel_sel
sta @direntry_xscroll
sta @direntry_xscroll_state
lda #$01
sta @filesel_dirty
rts
select_parent:
; truncate last subdirectory
sep #$20 : .as
ldx #$0000
- lda @FILESEL_CWD, x
beq parent_end_found
inx
bra -
parent_end_found:
cpx #$0001
beq cwd_is_root
- lda @FILESEL_CWD, x
cmp #$2f
beq +
dex
bra -
+ cpx #$0000
bne +
inx
+ lda #$00
sta @FILESEL_CWD, x
bra parent_do_chdir
cwd_is_root:
rts
parent_do_chdir
jsr filesel_request_filelist
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 filesel_sel
sta @filesel_sel
sep #$20 : .as
lda #$01
sta @filesel_dirty
rts
select_spc:
dey
rep #$20 : .al
lda [dirptr_addr], y
and #$00ff
sta @MCU_PARAM+6
dey
dey
lda [dirptr_addr], y
sta @MCU_PARAM+4
lda #!FILESEL_CWD
sta @MCU_PARAM
sep #$20 : .as
lda #^FILESEL_CWD
sta @MCU_PARAM+2
lda #$00
sta @MCU_PARAM+3
lda #CMD_LOADSPC
sta @MCU_CMD
wait_spc:
lda @MCU_CMD
cmp #$00
bne wait_spc
jsr spcplayer
rts
filesel_key_x:
jsr mainmenu
rts
filesel_key_y:
jsr open_context_menu
rts
open_context_menu:
rep #$20 : .al
lda filesel_sel
and #$00ff
asl
asl
tay
sep #$20 : .as
iny
iny
iny
lda [dirptr_addr], y
cmp #TYPE_ROM
beq ctx_is_file
cmp #TYPE_SPC
beq ctx_is_spc
cmp #TYPE_SUBDIR
beq ctx_is_dir
cmp #TYPE_PARENT
beq ctx_is_parent
open_context_menu_cont
rts
ctx_is_file
; "save" selected file path to MCU_PARAM in case we need to send it there later
dey
rep #$20 : .al
lda [dirptr_addr], y
and #$00ff
sta @MCU_PARAM+6
dey
dey
lda [dirptr_addr], y
sta @MCU_PARAM+4
lda #!FILESEL_CWD
sta @MCU_PARAM
sep #$20 : .as
lda #^FILESEL_CWD
sta @MCU_PARAM+2
lda #$00
sta @MCU_PARAM+3
jsr filesel_contextmenu_file
bra open_context_menu_cont
ctx_is_parent
bra open_context_menu_cont
ctx_is_dir
bra open_context_menu_cont
ctx_is_spc
bra open_context_menu_cont
add_selected_file_to_favorites:
; have MCU save the file to the favorites list
; the file path should already have been saved to MCU_PARAM before calling
; this routine
php
phb
sep #$20 : .as
lda #$01
jsr hide_cursor
jsr draw_loading_window
jsr waitblank
lda #$00
sta @SNES_CMD
lda #CMD_ADD_FAVORITE_ROM
sta @MCU_CMD
; wait for ACK/NACK
- lda @SNES_CMD
cmp #$55
; success
beq +
cmp #$aa
; failure
beq +
bra -
+ lda #$55
sta @MCU_CMD
jsr pop_window
plb
plp
rtl
setup_224:
php
rep #$30 : .xl : .al
lda #18
sta listdisp
dec
cmp filesel_sel
bmi setup_224_adjsel
bra +
setup_224_adjsel
sta filesel_sel
+
sep #$20 : .as
lda #$0b
sta $2110
lda #$00
sta $2110
ora #$08
sta $2133
lda #$01
sta filesel_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
filesel_statusbar
pha
phx
php
sep #$20 : .as
rep #$10 : .xl
lda #^text_statusbar_keys
sta @print_bank
rep #$20 : .al
lda #!text_statusbar_keys
sta @print_src
sep #$20 : .as
lda #$00
sta @print_pal
lda #$02
sta @print_x
lda #$40
sta @print_count
lda listdisp
clc
adc #$0a
sta @print_y
jsr hiprint
plp
plx
pla
rts
select_last_file:
php
sep #$20 : .as
rep #$10 : .xl
lda @ST_NUM_RECENT_GAMES
sta num_recent_games
stz recent_sel
bne +
plp
rtl
+ lda #^text_last
sta window_tbank
ldx #!text_last
stx window_taddr
lda @last_win_x
sta window_x
inc
inc
pha
lda @last_win_y
sta window_y
inc
pha
lda @last_win_w
sta window_w
lda @ST_NUM_RECENT_GAMES
inc
inc
sta window_h
jsr push_window
lda num_recent_games
sta listsel_max
jsr draw_window
stz print_pal
lda #^LAST_GAME
ldx #!LAST_GAME
sta print_bank
stx print_src
stz print_pal
pla
sta print_y
pla
sta print_x
- lda #56
sta print_count
jsr hiprint
inc print_src+1
inc print_y
dec num_recent_games
bne -
lda #$01
sta listsel_step
stz listsel_pickbutton
jsr menu_select
sta @MCU_PARAM
cmp #$ff
beq +
sep #$20 : .as
lda #CMD_LOADLAST
jsr game_handshake
+ jsr pop_window
plp
rtl
select_favorite_file:
; shows a window with a list of favorite games
php
sep #$20 : .as
rep #$10 : .xl
lda #$00
sta listsel_backup
select_favorite_redraw:
lda @ST_NUM_FAVORITE_GAMES
bne +
jmp select_favorite_file_out
+ sta num_favorite_games
lda #^text_favorite
sta window_tbank
ldx #!text_favorite
stx window_taddr
lda @last_win_x
sta window_x
inc
inc
pha
lda @last_win_y
sta window_y
inc
pha
lda @last_win_w
sta window_w
lda num_favorite_games
inc
inc
sta window_h
jsr push_window
lda num_favorite_games
sta listsel_max
dec ; listsel_max is an element count but listsel_sel is 0..max-1
cmp listsel_backup
bcs +
sta listsel_backup
+ lda listsel_backup
sta listsel_sel
jsr draw_window
stz print_pal
lda #^FAVORITE_GAMES
ldx #!FAVORITE_GAMES
sta print_bank
stx print_src
stz print_pal
pla
sta print_y
pla
sta print_x
- lda #56
sta print_count
jsr hiprint
inc print_src+1
inc print_y
dec num_favorite_games
bne -
stz listsel_dirty
jsr enable_screen_update
select_favorite_choose:
lda #$01
sta listsel_step
sta listsel_pickbutton ; allow button Y
jsr menu_select_noinit
sta listsel_backup
sta @MCU_PARAM ; store selected item index in mcu param
cmp #$ff ; if no selected item, do nothing
beq select_favorite_file_done
lda listsel_pickbutton
cmp #$00 ; if button A was pressed
beq select_favorite_file_play
cmp #$01 ; if button Y was pressed
beq select_favorite_file_context_menu
bra select_favorite_file_done ; unknown button was pressed
select_favorite_file_play
sep #$20 : .as
lda #CMD_LOADFAVORITE
jsr game_handshake
bra select_favorite_file_done
select_favorite_file_context_menu
jsr filesel_favorites_contextmenu
lda listsel_dirty ; need redraw?
bne +
jmp select_favorite_choose ; return to previous view
+ stz listsel_dirty
jsr pop_window
jsr disable_screen_update
jmp select_favorite_redraw ; redraw favorite list
select_favorite_file_done
jsr pop_window
select_favorite_file_out
jsr enable_screen_update
plp
rtl
remove_selected_favorite_file:
; have MCU remove the file from the favorites list
; the list index of the file should already have been saved to MCU_PARAM before
; calling this routine
php
phb
sep #$20 : .as
lda #$01
jsr hide_cursor
jsr draw_loading_window
jsr waitblank
lda #$00
sta @SNES_CMD
lda #CMD_REMOVE_FAVORITE_ROM
sta @MCU_CMD
; wait for ACK/NACK
- lda @SNES_CMD
cmp #$55
; success
beq +
cmp #$aa
; failure
beq +
bra -
+ lda #$55
sta @MCU_CMD
sta listsel_dirty
jsr pop_window
plb
plp
rtl
scroll_direntry_clean:
lda #$01
sta direntry_xscroll_state
stz direntry_xscroll
stz direntry_xscroll_wait
jsr scroll_direntry
stz direntry_xscroll_state
stz direntry_xscroll
rts
scroll_direntry:
ldy filesel_sel
lda direntry_xscroll_state
bne +
lda direntry_fits, y
bne scroll_direntry_enter
; stz direntry_xscroll_state
rts
scroll_direntry_enter
lda #$01
sta direntry_xscroll_state
stz direntry_xscroll_wait
+ lda direntry_xscroll_wait
beq +
dec direntry_xscroll_wait
rts
+ lda direntry_xscroll
bne scroll_direntry_scrollfast
lda #$28
bra +
scroll_direntry_scrollfast
lda #$10
+ sta direntry_xscroll_wait
tya
clc
adc #$09
sta cursor_y
lda #$02
sta cursor_x
rep #$20 : .al
lda filesel_sel
asl
asl
tay
lda [dirptr_addr], y
sta @dirent_addr
iny
iny
sep #$20 : .as
lda [dirptr_addr], y ; load fileinfo bank
clc
adc #$c0 ; add $C0 for memory map
sta @dirent_bank ; store as current bank
iny
lda [dirptr_addr], y
iny
sta @dirent_type
ldy filesel_sel
sty direntry_fits_idx
phy
jsr print_direntry
ply
lda direntry_fits, y
bne +
lda #$ff
sta direntry_xscroll_state
lda #$28
sta direntry_xscroll_wait
+ lda direntry_xscroll_state
clc
adc direntry_xscroll
sta direntry_xscroll
bne +
lda #$01
sta direntry_xscroll_state
+ rts
filesel_request_filelist:
php
phb
rep #$30 : .al : .xl
lda #!FILESEL_CWD
sta @MCU_PARAM
lda #!ROOT_DIR
sta @MCU_PARAM+4
sep #$20 : .as
lda #^FILESEL_CWD
sta @MCU_PARAM+2
lda #^ROOT_DIR
sta @MCU_PARAM+6
lda #TYPE_PARENT
sta @MCU_PARAM+8
lda #TYPE_SUBDIR
sta @MCU_PARAM+9
lda #TYPE_ROM
sta @MCU_PARAM+10
lda #TYPE_SPC
sta @MCU_PARAM+11
lda #$00
sta @MCU_PARAM+12
sta @SNES_CMD
lda #CMD_READDIR
sta @MCU_CMD
lda #$00
pha
plb
jsr hide_cursor
jsr draw_loading_window
filesel_request_filelist_wait_mcu:
jsl @WRAM_WAIT_MCU
jsr pop_window
ldy #$0002
- lda [dirstart_addr], y
beq +
iny
iny
iny
iny
bra -
+ rep #$20 : .al
tya
and #$fffc
sta dirend_addr
plb
plp
rts