|
@@ -0,0 +1,420 @@
|
|
|
+#include "memmap.i65"
|
|
|
+#include "dma.i65"
|
|
|
+
|
|
|
+menu_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 menu_state
|
|
|
+ stz dirend_onscreen
|
|
|
+ lda #$04
|
|
|
+ sta cursor_x
|
|
|
+ lda #$0A
|
|
|
+ sta cursor_y
|
|
|
+ ldx #$0000
|
|
|
+ stx dirptr_idx
|
|
|
+ stx menu_sel
|
|
|
+ lda #$01
|
|
|
+ sta menu_dirty
|
|
|
+ rts
|
|
|
+
|
|
|
+menuloop:
|
|
|
+ sep #$20 : .as
|
|
|
+ rep #$10 : .xl
|
|
|
+menuloop_s1
|
|
|
+ lda isr_done
|
|
|
+ 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
|
|
|
+ beq menuloop_redraw ;then do
|
|
|
+ bra menuloop_s1
|
|
|
+menuloop_redraw
|
|
|
+ stz menu_dirty
|
|
|
+ jsr menu_redraw
|
|
|
+ bra menuloop_s1
|
|
|
+ rts
|
|
|
+
|
|
|
+menu_cleanup:
|
|
|
+ sep #$20 : .as
|
|
|
+ rep #$10 : .xl
|
|
|
+ lda dirend_onscreen
|
|
|
+ beq menu_cleanup_out
|
|
|
+ lda dirend_idx
|
|
|
+ lsr
|
|
|
+ lsr
|
|
|
+ pha
|
|
|
+menu_cleanup_loop
|
|
|
+ cmp #17
|
|
|
+ beq +
|
|
|
+ pha
|
|
|
+ clc
|
|
|
+ adc #$0a
|
|
|
+ sta print_y
|
|
|
+ lda #^space64
|
|
|
+ ldx #!space64
|
|
|
+ sta print_bank
|
|
|
+ stx print_src
|
|
|
+ stz print_pal
|
|
|
+ lda #64
|
|
|
+ sta print_count
|
|
|
+ jsr hiprint
|
|
|
+ pla
|
|
|
+ inc
|
|
|
+ bra menu_cleanup_loop
|
|
|
++
|
|
|
+ pla
|
|
|
+ cmp menu_sel
|
|
|
+ beq menu_cleanup_out
|
|
|
+ bpl menu_cleanup_out
|
|
|
+ sta menu_sel
|
|
|
+menu_cleanup_out
|
|
|
+ rts
|
|
|
+
|
|
|
+
|
|
|
+menu_updates:
|
|
|
+;update selection, scroll etc
|
|
|
+ lda menu_sel
|
|
|
+ asl
|
|
|
+ asl
|
|
|
+ sta dirptr_idx
|
|
|
+ lda menu_sel
|
|
|
+ clc
|
|
|
+ adc #$09
|
|
|
+ sta bar_yl
|
|
|
+
|
|
|
+;get input
|
|
|
+ jsr read_pad
|
|
|
+ lda #$04
|
|
|
+ and pad1trig+1
|
|
|
+ bne key_down
|
|
|
+ lda #$08
|
|
|
+ and pad1trig+1
|
|
|
+ bne key_up
|
|
|
+ lda #$01
|
|
|
+ and pad1trig+1
|
|
|
+ bne key_right
|
|
|
+ lda #$02
|
|
|
+ and pad1trig+1
|
|
|
+ bne key_left
|
|
|
+ lda #$80
|
|
|
+ and pad1trig+1
|
|
|
+ bne key_b
|
|
|
+ bra menuupd_out
|
|
|
+key_down
|
|
|
+ jsr menu_key_down
|
|
|
+ bra menuupd_out
|
|
|
+key_up
|
|
|
+ jsr menu_key_up
|
|
|
+ bra menuupd_out
|
|
|
+key_right
|
|
|
+ jsr menu_key_right
|
|
|
+ bra menuupd_out
|
|
|
+key_left
|
|
|
+ jsr menu_key_left
|
|
|
+ bra menuupd_out
|
|
|
+key_b
|
|
|
+ jsr menu_key_b
|
|
|
+ bra menuupd_out
|
|
|
+menuupd_out
|
|
|
+ lda #$0A
|
|
|
+ sta cursor_y
|
|
|
+ rts
|
|
|
+
|
|
|
+
|
|
|
+menu_redraw:
|
|
|
+ lda menu_state
|
|
|
+ beq redraw_filelist
|
|
|
+; cmp 1
|
|
|
+; beq redraw_main
|
|
|
+menu_redraw_out
|
|
|
+ rts
|
|
|
+
|
|
|
+redraw_filelist
|
|
|
+ ldy #$0000
|
|
|
+ sty dirptr_idx
|
|
|
+ stz dirend_idx
|
|
|
+ stz dirend_onscreen
|
|
|
+redraw_filelist_loop
|
|
|
+ ldy dirptr_idx
|
|
|
+ tya
|
|
|
+ cmp #17*4
|
|
|
+ beq redraw_filelist_last
|
|
|
+ lda dirptr_bank
|
|
|
+ phb
|
|
|
+ pha
|
|
|
+ plb
|
|
|
+ rep #$20 : .al
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ sta @dirent_addr
|
|
|
+ iny
|
|
|
+ iny
|
|
|
+ sep #$20 : .as
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ clc
|
|
|
+ adc #$c0
|
|
|
+ sta @dirent_bank
|
|
|
+ cmp #$c0
|
|
|
+ beq redraw_filelist_dirend
|
|
|
+ iny
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ iny
|
|
|
+ sta @dirent_type
|
|
|
+ plb
|
|
|
+ sty dirptr_idx
|
|
|
+ jsr print_direntry
|
|
|
+ bra redraw_filelist_loop
|
|
|
+redraw_filelist_dirend
|
|
|
+ plb
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ sty dirend_idx
|
|
|
+ lda #$01
|
|
|
+ sta dirend_onscreen
|
|
|
+ bra redraw_filelist_out
|
|
|
+redraw_filelist_last ;check if next offscreen item is end of dir
|
|
|
+ lda dirptr_bank
|
|
|
+ phb
|
|
|
+ pha
|
|
|
+ plb
|
|
|
+ iny
|
|
|
+ iny
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ beq redraw_filelist_dirend
|
|
|
+ plb
|
|
|
+redraw_filelist_out
|
|
|
+ ldx #$0000
|
|
|
+ stx dirptr_idx
|
|
|
+ brl menu_redraw_out
|
|
|
+
|
|
|
+print_direntry:
|
|
|
+ lda dirent_bank
|
|
|
+ ldx dirent_addr
|
|
|
+
|
|
|
+ phb
|
|
|
+ pha
|
|
|
+ plb
|
|
|
+
|
|
|
+ lda @dirent_type
|
|
|
+ cmp #$80
|
|
|
+ rep #$20 : .al
|
|
|
+ bne dirent_is_file
|
|
|
+dirent_is_dir
|
|
|
+ lda #$04 ;skip dir tgt
|
|
|
+ sta @fd_fnoff
|
|
|
+ lda #$01 ;different color for dirs
|
|
|
+ sta @print_pal
|
|
|
+ bra dirent_type_cont
|
|
|
+dirent_is_file
|
|
|
+ lda #$40 ;skip game header
|
|
|
+ sta @fd_fnoff
|
|
|
+ lda #$00
|
|
|
+ sta @print_pal ;palette 0 (white)
|
|
|
+dirent_type_cont
|
|
|
+ txa
|
|
|
+ clc
|
|
|
+ adc @fd_fnoff
|
|
|
+ tax
|
|
|
+ sep #$20 : .as
|
|
|
+ lda !0, x ;load offset of leaf (file) name
|
|
|
+ clc
|
|
|
+ adc #1
|
|
|
+ rep #$20 : .al
|
|
|
+ and #$00ff ;kill hi byte
|
|
|
+ sta @fd_fnoff
|
|
|
+ txa
|
|
|
+ adc @fd_fnoff
|
|
|
+ sta @fd_fnoff
|
|
|
+ plb
|
|
|
+
|
|
|
+ lda cursor_y
|
|
|
+ sta print_y
|
|
|
+ inc
|
|
|
+ sta cursor_y
|
|
|
+ lda cursor_x
|
|
|
+ sta print_x
|
|
|
+
|
|
|
+ sep #$20 : .as
|
|
|
+ ldx fd_fnoff
|
|
|
+ lda #58
|
|
|
+ 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 #58
|
|
|
+ sec
|
|
|
+ sbc print_done
|
|
|
+ sta print_count
|
|
|
+ lda #^space64
|
|
|
+ ldx #!space64
|
|
|
+ sta print_bank
|
|
|
+ stx print_src
|
|
|
+ jsr hiprint
|
|
|
+
|
|
|
+ rts
|
|
|
+
|
|
|
+menu_key_down:
|
|
|
+ lda menu_sel
|
|
|
+ cmp #$10
|
|
|
+ bne +
|
|
|
+ lda #$01
|
|
|
+ sta menu_dirty
|
|
|
+ lda dirend_onscreen
|
|
|
+ bne down_out
|
|
|
+ rep #$20 : .al
|
|
|
+ lda dirptr_addr
|
|
|
+ clc
|
|
|
+ adc #$04
|
|
|
+ sta dirptr_addr
|
|
|
+ sep #$20 : .as
|
|
|
+ rts
|
|
|
++ inc
|
|
|
+ sta menu_sel
|
|
|
+down_out
|
|
|
+ rts
|
|
|
+
|
|
|
+menu_key_up:
|
|
|
+ lda menu_sel
|
|
|
+ bne +
|
|
|
+ lda #$01
|
|
|
+ sta menu_dirty
|
|
|
+ rep #$20 : .al
|
|
|
+ lda dirptr_addr
|
|
|
+ cmp dirstart_addr
|
|
|
+ beq up_out
|
|
|
+ sec
|
|
|
+ sbc #$04
|
|
|
+ sta dirptr_addr
|
|
|
+ bra up_out
|
|
|
++ dec
|
|
|
+ sta menu_sel
|
|
|
+up_out
|
|
|
+ sep #$20 : .as
|
|
|
+ rts
|
|
|
+
|
|
|
+menu_key_left:
|
|
|
+ lda #$01
|
|
|
+ sta menu_dirty
|
|
|
+ rep #$20 : .al
|
|
|
+ lda dirptr_addr
|
|
|
+ beq +
|
|
|
+ sec
|
|
|
+ sbc #17*4
|
|
|
+ cmp dirstart_addr
|
|
|
+ bcc +
|
|
|
+- sta dirptr_addr
|
|
|
+ sep #$20 : .as
|
|
|
+ rts
|
|
|
++ lda dirstart_addr
|
|
|
+ sep #$20 : .as
|
|
|
+ stz menu_sel
|
|
|
+ rep #$20 : .al
|
|
|
+ bra -
|
|
|
+
|
|
|
+menu_key_right:
|
|
|
+ sep #$20 : .as
|
|
|
+ lda dirend_onscreen
|
|
|
+ bne menuupd_lastcursor
|
|
|
+ lda #$01
|
|
|
+ sta menu_dirty
|
|
|
+ rep #$20 : .al
|
|
|
+ lda dirptr_addr
|
|
|
+ clc
|
|
|
+ adc #17*4
|
|
|
+ sta dirptr_addr
|
|
|
+ sep #$20 : .as
|
|
|
+ rts
|
|
|
+menuupd_lastcursor
|
|
|
+ lda dirend_idx
|
|
|
+ lsr
|
|
|
+ lsr
|
|
|
+ sta menu_sel
|
|
|
+ rts
|
|
|
+
|
|
|
+menu_key_b:
|
|
|
+ jsr select_item
|
|
|
+ rts
|
|
|
+
|
|
|
+select_item:
|
|
|
+ rep #$20 : .al
|
|
|
+ lda menu_sel
|
|
|
+ and #$00ff
|
|
|
+ asl
|
|
|
+ asl
|
|
|
+ tay
|
|
|
+ sep #$20 : .as
|
|
|
+ lda dirptr_bank
|
|
|
+ phb
|
|
|
+ pha
|
|
|
+ plb
|
|
|
+ iny
|
|
|
+ iny
|
|
|
+ iny
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ beq sel_is_file
|
|
|
+ cmp #$80
|
|
|
+ beq sel_is_dir
|
|
|
+select_item_cont
|
|
|
+ plb
|
|
|
+ rts
|
|
|
+sel_is_file
|
|
|
+ jsr select_file
|
|
|
+ bra select_item_cont
|
|
|
+sel_is_dir
|
|
|
+ jsr select_dir
|
|
|
+ bra select_item_cont
|
|
|
+
|
|
|
+select_file:
|
|
|
+ ; have avr load the rom
|
|
|
+ rts
|
|
|
+
|
|
|
+select_dir: ; y = direntry ptr
|
|
|
+ sta @$ffffff ;for great breakpoint
|
|
|
+ dey
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ clc
|
|
|
+ adc #$c0
|
|
|
+ sta @dirent_bank
|
|
|
+ dey
|
|
|
+ dey
|
|
|
+ rep #$20 : .al
|
|
|
+ lda (dirptr_addr), y
|
|
|
+ sta @dirent_addr
|
|
|
+ tax
|
|
|
+ sep #$20 : .as
|
|
|
+ lda @dirent_bank
|
|
|
+ phb
|
|
|
+ pha
|
|
|
+ plb
|
|
|
+ lda !2, x ; load linked dir start bank
|
|
|
+ clc
|
|
|
+ adc #$c0
|
|
|
+ sta @dirptr_bank
|
|
|
+ sta @dirstart_bank
|
|
|
+ rep #$20 : .al
|
|
|
+ lda !0, x ; load linked dir start address
|
|
|
+ sta @dirptr_addr
|
|
|
+ sta @dirstart_addr
|
|
|
+ sep #$20 : .as
|
|
|
+ lda #$01
|
|
|
+ sta @menu_dirty
|
|
|
+ plb
|
|
|
+ rts
|