561 lines
6.9 KiB
Plaintext
561 lines
6.9 KiB
Plaintext
#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 #$09
|
|
sta cursor_y
|
|
ldx #$0000
|
|
stx dirptr_idx
|
|
stx menu_sel
|
|
lda #$01
|
|
sta menu_dirty
|
|
rts
|
|
|
|
menuloop:
|
|
menuloop_s1
|
|
sep #$20 : .as
|
|
rep #$10 : .xl
|
|
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 listdisp
|
|
beq +
|
|
pha
|
|
clc
|
|
adc #$09
|
|
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 #$08
|
|
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
|
|
lda #$20
|
|
and pad1trig+1
|
|
bne key_select
|
|
lda #$80
|
|
and pad1trig
|
|
bne key_a
|
|
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
|
|
key_a
|
|
jsr menu_key_a
|
|
bra menuupd_out
|
|
key_select
|
|
jsr menu_key_select
|
|
bra menuupd_out
|
|
|
|
menuupd_out
|
|
lda #$09
|
|
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
|
|
lsr
|
|
lsr
|
|
cmp listdisp
|
|
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 listdisp
|
|
dec
|
|
cmp menu_sel
|
|
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
|
|
+ lda menu_sel
|
|
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 listdisp
|
|
sec
|
|
sbc listdisp
|
|
sec
|
|
sbc listdisp
|
|
sec
|
|
sbc listdisp
|
|
bcc +
|
|
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 listdisp
|
|
asl
|
|
asl
|
|
clc
|
|
adc dirptr_addr
|
|
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
|
|
|
|
menu_key_select:
|
|
lda barstep
|
|
beq do_setup448
|
|
do_setup224
|
|
jsr setup_224
|
|
rts
|
|
do_setup448
|
|
jsr setup_448
|
|
rts
|
|
|
|
menu_key_a:
|
|
rep #$20 : .al
|
|
lda dirstart_addr
|
|
beq skip_key_a
|
|
sta dirptr_addr
|
|
lda #$0000
|
|
sta menu_sel
|
|
bra select_item
|
|
skip_key_a
|
|
sep #$20 : .as
|
|
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
|
|
dey
|
|
lda (dirptr_addr), y
|
|
sta @AVR_PARAM+2
|
|
rep #$20 : .al
|
|
dey
|
|
dey
|
|
lda (dirptr_addr), y
|
|
sta @AVR_PARAM
|
|
sep #$20 : .as
|
|
lda #$01
|
|
sta @AVR_CMD
|
|
lda #$00
|
|
sta @$4200
|
|
cli
|
|
jsl @infloop
|
|
rts
|
|
|
|
select_dir: ; y = direntry ptr
|
|
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
|
|
lda #$0000
|
|
sta @menu_sel
|
|
sep #$20 : .as
|
|
lda #$01
|
|
sta @menu_dirty
|
|
plb
|
|
rts
|
|
|
|
|
|
setup_224:
|
|
php
|
|
rep #$30 : .xl : .al
|
|
lda #18
|
|
sta listdisp
|
|
dec
|
|
cmp menu_sel
|
|
bmi setup_228_adjsel
|
|
bra +
|
|
setup_228_adjsel
|
|
sta menu_sel
|
|
+
|
|
lda #19*64
|
|
sta textdmasize
|
|
lda #$0007
|
|
sta hdma_scroll+8
|
|
sep #$20 : .as
|
|
lda #$07
|
|
sta $2110
|
|
lda #$00
|
|
sta $2110
|
|
lda #$00
|
|
sta barstep
|
|
ora #$08
|
|
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 #36
|
|
sta listdisp
|
|
lda #38*64
|
|
sta textdmasize
|
|
lda #$ffc6
|
|
sta hdma_scroll+8
|
|
sep #$20 : .as
|
|
lda #$c6
|
|
sta $2110
|
|
lda #$ff
|
|
sta $2110
|
|
lda #$01
|
|
sta barstep
|
|
ora #$08
|
|
sta $2133
|
|
lda #$06
|
|
sta hdma_math+6
|
|
lda #$01
|
|
sta menu_dirty
|
|
plp
|
|
rts
|
|
|
|
|