menu.a65 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. #include "memmap.i65"
  2. #include "dma.i65"
  3. menu_init:
  4. sep #$20 : .as
  5. rep #$10 : .xl
  6. lda #^ROOT_DIR
  7. ldx #!ROOT_DIR
  8. sta dirptr_bank
  9. stx dirptr_addr
  10. sta dirstart_bank
  11. stx dirstart_addr
  12. stz menu_state
  13. stz dirend_onscreen
  14. lda #$02
  15. sta cursor_x
  16. lda #$09
  17. sta cursor_y
  18. lda #$01
  19. sta bar_xl
  20. lda #$3e
  21. sta bar_wl
  22. ldx #$0000
  23. stx dirptr_idx
  24. stx menu_sel
  25. stx direntry_xscroll
  26. stx direntry_xscroll_state
  27. lda #$01
  28. sta menu_dirty
  29. rep #$20 : .al
  30. lda #!dirlog
  31. sta dirlog_idx
  32. sep #$20 : .as
  33. lda #^dirlog
  34. sta dirlog_idx+2
  35. rts
  36. menuloop:
  37. menuloop_s1
  38. sep #$20 : .as
  39. rep #$10 : .xl
  40. lda isr_done
  41. lsr
  42. bcc menuloop_s1
  43. stz isr_done
  44. jsr printtime
  45. jsr menu_updates ;update stuff, check keys etc
  46. lda menu_dirty ;is there ANY reason to redraw the menu?
  47. cmp #$01
  48. beq menuloop_redraw ;then do
  49. jsr scroll_direntry
  50. bra menuloop_s1
  51. menuloop_redraw
  52. stz menu_dirty
  53. jsr menu_statusbar
  54. jsr menu_redraw
  55. jsr menu_cleanup ;update phase 2
  56. bra menuloop_s1
  57. rts
  58. menu_cleanup:
  59. sep #$20 : .as
  60. rep #$10 : .xl
  61. lda dirend_onscreen ;end of file list on screen?
  62. beq menu_cleanup_out ;
  63. lda dirend_idx
  64. lsr
  65. lsr
  66. pha
  67. menu_cleanup_loop ;pad rest of screen with empty lines
  68. cmp listdisp ;end of screen reached?
  69. beq + ;then leave
  70. pha
  71. clc
  72. adc #$09 ;first line in text area
  73. inc
  74. sta print_y
  75. stz print_x
  76. lda #^space64
  77. ldx #!space64
  78. sta print_bank
  79. stx print_src
  80. stz print_pal
  81. lda #64
  82. sta print_count
  83. jsr hiprint
  84. pla
  85. inc
  86. bra menu_cleanup_loop
  87. +
  88. pla
  89. cmp menu_sel
  90. beq menu_cleanup_out
  91. bpl menu_cleanup_out
  92. sta menu_sel
  93. menu_cleanup_out
  94. rts
  95. menu_updates:
  96. ;update selection, scroll etc
  97. lda menu_sel
  98. asl
  99. asl
  100. sta dirptr_idx
  101. lda menu_sel
  102. clc
  103. adc #$08
  104. sta bar_yl
  105. lda #$3e
  106. sta bar_wl
  107. lda #$01
  108. sta bar_xl
  109. ;get input
  110. jsr read_pad
  111. lda #$04
  112. and pad1trig+1
  113. bne key_down
  114. lda #$08
  115. and pad1trig+1
  116. bne key_up
  117. lda #$01
  118. and pad1trig+1
  119. bne key_right
  120. lda #$02
  121. and pad1trig+1
  122. bne key_left
  123. lda #$80
  124. and pad1trig+1
  125. bne key_b
  126. lda #$10
  127. and pad1trig+1
  128. bne key_start
  129. lda #$20
  130. and pad1trig+1
  131. bne key_select
  132. lda #$80
  133. and pad1trig
  134. bne key_a
  135. lda #$40
  136. and pad1trig
  137. bne key_x
  138. bra menuupd_out
  139. key_down
  140. jsr menu_key_down
  141. bra menuupd_out
  142. key_up
  143. jsr menu_key_up
  144. bra menuupd_out
  145. key_right
  146. jsr menu_key_right
  147. bra menuupd_out
  148. key_left
  149. jsr menu_key_left
  150. bra menuupd_out
  151. key_b
  152. jsr menu_key_b
  153. bra menuupd_out
  154. key_a
  155. jsr menu_key_a
  156. bra menuupd_out
  157. key_x
  158. jsr menu_key_x
  159. bra menuupd_out
  160. key_select
  161. jsr menu_key_select
  162. bra menuupd_out
  163. key_start
  164. jsr menu_key_start
  165. bra menuupd_out
  166. menuupd_out
  167. lda #$09
  168. sta cursor_y
  169. rts
  170. menu_redraw:
  171. lda menu_state
  172. beq redraw_filelist
  173. ; cmp 1
  174. ; beq redraw_main
  175. menu_redraw_out
  176. rts
  177. redraw_filelist
  178. ldy #$0000
  179. sty dirptr_idx
  180. sty direntry_fits_idx
  181. stz dirend_idx
  182. stz dirend_onscreen
  183. redraw_filelist_loop
  184. ldy dirptr_idx
  185. tya
  186. lsr
  187. lsr
  188. cmp listdisp
  189. beq redraw_filelist_last
  190. rep #$20 : .al
  191. lda [dirptr_addr], y
  192. sta @dirent_addr
  193. iny
  194. iny
  195. sep #$20 : .as
  196. lda [dirptr_addr], y ; load fileinfo bank
  197. clc
  198. adc #$c0 ; add $C0 for memory map
  199. sta @dirent_bank ; store as current bank
  200. cmp #$c0 ; if bank was 0 -> dirend entry in DB
  201. beq redraw_filelist_dirend ; handle dirend
  202. iny
  203. lda [dirptr_addr], y
  204. iny
  205. sta @dirent_type
  206. sty dirptr_idx
  207. jsr print_direntry
  208. inc direntry_fits_idx
  209. bra redraw_filelist_loop
  210. redraw_filelist_dirend
  211. dey ; recover last valid direntry number
  212. dey ; (we had 2x iny of the direntry pointer above,
  213. beq +
  214. dey ; so account for those too)
  215. dey
  216. dey
  217. dey
  218. + sty dirend_idx ; dirend_idx <- last valid directory entry.
  219. lda #$01 ; encountered during redraw, so must be on screen
  220. sta dirend_onscreen
  221. bra redraw_filelist_out
  222. redraw_filelist_last ;check if next offscreen item is end of dir
  223. iny
  224. iny
  225. lda [dirptr_addr], y
  226. beq redraw_filelist_dirend
  227. redraw_filelist_out
  228. ldx #$0000
  229. stx dirptr_idx
  230. brl menu_redraw_out
  231. print_direntry:
  232. lda cursor_y
  233. sta print_y
  234. inc
  235. sta cursor_y
  236. lda dirent_bank
  237. ldx dirent_addr
  238. phb
  239. pha
  240. plb
  241. lda @dirent_type
  242. and #$f0
  243. cmp #$80
  244. rep #$20 : .al
  245. bne dirent_is_file
  246. dirent_is_dir
  247. lda #$04 ;skip dir tgt
  248. sta @fd_fnoff
  249. lda #$01 ;different color for dirs
  250. bra dirent_type_cont
  251. dirent_is_file
  252. lda #$06 ;skip size string
  253. sta @fd_fnoff
  254. lda @dirent_type
  255. and #$00ff
  256. cmp #$0001 ;SMC -> palette 0 (white)
  257. bne +
  258. lda #$0000
  259. bra dirent_type_cont
  260. +
  261. cmp #$0004 ;IPS -> palette 2 (green)
  262. bne +
  263. lda #$0002
  264. bra dirent_type_cont
  265. +
  266. lda #$0000 ;default -> palette 0
  267. dirent_type_cont
  268. sta @print_pal
  269. rep #$20 : .al
  270. txa
  271. clc
  272. adc @fd_fnoff
  273. tax
  274. sep #$20 : .as
  275. lda !0, x ;load offset of leaf (file) name
  276. inc
  277. rep #$20 : .al
  278. and #$00ff ;kill hi byte
  279. sta @fd_fnoff
  280. txa
  281. clc
  282. adc @fd_fnoff
  283. clc
  284. adc @direntry_xscroll
  285. sta @fd_fnoff
  286. plb
  287. lda cursor_x
  288. sta print_x
  289. sep #$20 : .as
  290. ldx fd_fnoff
  291. lda #54
  292. sta print_count
  293. stx print_src
  294. lda dirent_bank
  295. sta print_bank
  296. jsr hiprint
  297. lda cursor_x
  298. clc
  299. adc print_done
  300. sta print_x
  301. lda print_over
  302. ldy direntry_fits_idx
  303. sta !direntry_fits, y
  304. lda #54
  305. sec
  306. sbc print_done
  307. sta print_count
  308. lda #^space64
  309. ldx #!space64
  310. sta print_bank
  311. stx print_src
  312. jsr hiprint
  313. sep #$20 : .as
  314. lda dirent_type
  315. and #$f0
  316. cmp #$80
  317. bne dirent_is_file_2
  318. lda #^text_dirmark
  319. ldx #!text_dirmark
  320. sta print_bank
  321. stx print_src
  322. bra dirent_type_cont_2
  323. dirent_is_file_2
  324. lda dirent_bank
  325. ldx dirent_addr
  326. sta print_bank
  327. stx print_src
  328. dirent_type_cont_2
  329. lda #56
  330. sta print_x
  331. lda #6
  332. sta print_count
  333. jsr hiprint
  334. rts
  335. menu_key_down:
  336. jsr scroll_direntry_clean
  337. lda listdisp
  338. dec
  339. cmp menu_sel
  340. bne down_noscroll
  341. lda #$01
  342. sta menu_dirty
  343. lda dirend_onscreen
  344. bne down_out
  345. rep #$20 : .al
  346. lda dirptr_addr
  347. clc
  348. adc #$04
  349. bcc +
  350. inc dirptr_bank
  351. + sta dirptr_addr
  352. sep #$20 : .as
  353. rts
  354. down_noscroll
  355. lda dirend_onscreen
  356. beq +
  357. lda dirend_idx
  358. lsr
  359. lsr
  360. cmp menu_sel
  361. beq menuupd_lastcursor
  362. bcc menuupd_lastcursor
  363. + lda menu_sel
  364. inc
  365. sta menu_sel
  366. down_out
  367. rts
  368. menu_key_up:
  369. jsr scroll_direntry_clean
  370. lda menu_sel
  371. bne up_noscroll
  372. lda #$01
  373. sta menu_dirty
  374. rep #$20 : .al
  375. lda dirptr_addr
  376. cmp dirstart_addr
  377. beq up_out
  378. sec
  379. sbc #$04
  380. bcs +
  381. dec dirptr_bank
  382. + sta dirptr_addr
  383. bra up_out
  384. up_noscroll
  385. dec
  386. sta menu_sel
  387. up_out
  388. sep #$20 : .as
  389. rts
  390. menuupd_lastcursor
  391. jsr scroll_direntry_clean
  392. lda dirend_idx
  393. lsr
  394. lsr
  395. sta menu_sel
  396. rts
  397. ; go back one page
  398. menu_key_left:
  399. stz direntry_xscroll
  400. stz direntry_xscroll_state
  401. lda #$01 ; must redraw afterwards
  402. sta menu_dirty
  403. rep #$20 : .al
  404. lda dirptr_addr ; get current direntry pointer
  405. beq + ; special case: if 0, we are at the first entry in memory
  406. lsr
  407. lsr ; make comparable to listdisp
  408. cmp listdisp ; if there's less or equal previous entries...
  409. beq + ; ...than display lines, reset to directory start
  410. bcc +
  411. sec
  412. sbc listdisp ; subtract one screen page's worth of entries
  413. asl
  414. asl ; make comparable to dirstart_addr again
  415. cmp dirstart_addr ; check whether calculated offset is before...
  416. bcc + ; ...start of directory
  417. - sta dirptr_addr ; store new selected entry
  418. sep #$20 : .as
  419. rts
  420. + lda dirstart_addr ; reset pointer to start of directory
  421. stz menu_sel ; reset the selection cursor too
  422. bra -
  423. ; go forth one page
  424. menu_key_right:
  425. stz direntry_xscroll
  426. stz direntry_xscroll_state
  427. sep #$20 : .as
  428. lda dirend_onscreen
  429. bne menuupd_lastcursor
  430. lda #$01
  431. sta menu_dirty
  432. rep #$20 : .al
  433. lda listdisp
  434. asl
  435. asl
  436. clc
  437. adc dirptr_addr
  438. sta dirptr_addr
  439. sep #$20 : .as
  440. rts
  441. menu_key_a:
  442. jsr select_item
  443. rts
  444. menu_key_select:
  445. rts
  446. menu_key_start:
  447. jsr select_last_file
  448. rts
  449. menu_key_b:
  450. stz direntry_xscroll
  451. stz direntry_xscroll_state
  452. rep #$20 : .al
  453. lda dirstart_addr
  454. beq skip_key_b
  455. sta dirptr_addr
  456. lda #$0000
  457. sta menu_sel
  458. bra select_item
  459. skip_key_b
  460. sep #$20 : .as
  461. rts
  462. select_item:
  463. rep #$20 : .al
  464. lda menu_sel
  465. and #$00ff
  466. asl
  467. asl
  468. tay
  469. sep #$20 : .as
  470. iny
  471. iny
  472. iny
  473. lda [dirptr_addr], y
  474. cmp #$01
  475. beq sel_is_file
  476. cmp #$04
  477. beq sel_is_file
  478. cmp #$80
  479. beq sel_is_dir
  480. cmp #$81
  481. beq sel_is_parent
  482. select_item_cont
  483. rts
  484. sel_is_file
  485. jsr select_file
  486. bra select_item_cont
  487. sel_is_parent
  488. jsr select_parent
  489. bra select_item_cont
  490. sel_is_dir
  491. jsr select_dir
  492. bra select_item_cont
  493. select_file:
  494. ; have avr load the rom
  495. dey
  496. rep #$20 : .al
  497. lda [dirptr_addr], y
  498. and #$00ff
  499. sta @AVR_PARAM+2
  500. dey
  501. dey
  502. lda [dirptr_addr], y
  503. sta @AVR_PARAM
  504. sep #$20 : .as
  505. lda #$01
  506. sta @AVR_CMD
  507. select_file_fade:
  508. lda #$00
  509. sta @$4200
  510. sei
  511. jsl @wram_fadeloop
  512. rts
  513. select_dir:
  514. tyx
  515. ; save old dir position
  516. rep #$20 : .al
  517. ldy #$0000
  518. lda @dirstart_addr
  519. sta [dirlog_idx], y
  520. iny
  521. iny
  522. lda @dirstart_bank
  523. sta [dirlog_idx], y
  524. iny
  525. lda @dirptr_addr
  526. sta [dirlog_idx], y
  527. iny
  528. iny
  529. lda @dirptr_bank
  530. sta [dirlog_idx], y
  531. iny
  532. lda @menu_sel
  533. sta [dirlog_idx], y
  534. lda @dirlog_idx
  535. clc
  536. adc #$0008
  537. sta @dirlog_idx
  538. sep #$20 : .as
  539. ;---
  540. ; y = direntry ptr
  541. txy
  542. dey
  543. lda [dirptr_addr], y
  544. clc
  545. adc #$c0
  546. sta @dirent_bank
  547. dey
  548. dey
  549. rep #$20 : .al
  550. lda [dirptr_addr], y
  551. sta @dirent_addr
  552. tax
  553. sep #$20 : .as
  554. lda @dirent_bank
  555. phb
  556. pha
  557. plb
  558. lda !2, x ; load linked dir start bank
  559. clc
  560. adc #$c0
  561. sta @dirptr_bank
  562. sta @dirstart_bank
  563. rep #$20 : .al
  564. lda !0, x ; load linked dir start address
  565. sta @dirptr_addr
  566. sta @dirstart_addr
  567. lda #$0000
  568. sta @menu_sel
  569. sep #$20 : .as
  570. lda #$01
  571. sta @menu_dirty
  572. plb
  573. rts
  574. select_parent:
  575. rep #$20 : .al
  576. lda @dirlog_idx
  577. sec
  578. sbc #$0008
  579. sta @dirlog_idx
  580. ldy #$0000
  581. lda [dirlog_idx], y ; load dirstart_addr
  582. sta @dirstart_addr
  583. iny
  584. iny
  585. sep #$20 : .as
  586. lda [dirlog_idx], y ; load dirstart_bank
  587. sta @dirstart_bank
  588. iny
  589. rep #$20 : .al
  590. lda [dirlog_idx], y ; load dirptr_addr
  591. sta @dirptr_addr
  592. iny
  593. iny
  594. sep #$20 : .as
  595. lda [dirlog_idx], y ; load dirptr_bank
  596. sta @dirptr_bank
  597. iny
  598. rep #$20 : .al
  599. lda [dirlog_idx], y ; load menu_sel
  600. sta @menu_sel
  601. sep #$20 : .as
  602. lda #$01
  603. sta @menu_dirty
  604. rts
  605. menu_key_x:
  606. jsr mainmenu
  607. rts
  608. setup_224:
  609. php
  610. rep #$30 : .xl : .al
  611. lda #18
  612. sta listdisp
  613. dec
  614. cmp menu_sel
  615. bmi setup_224_adjsel
  616. bra +
  617. setup_224_adjsel
  618. sta menu_sel
  619. +
  620. lda #18*64
  621. sta textdmasize
  622. lda #$000b
  623. sta hdma_scroll+8
  624. sep #$20 : .as
  625. lda #$0b
  626. sta $2110
  627. lda #$00
  628. sta $2110
  629. lda #$00
  630. sta barstep
  631. ora #$08
  632. sta $2133
  633. lda #$08
  634. sta hdma_math_selection
  635. stz vidmode
  636. lda #$01
  637. sta menu_dirty
  638. lda #^space64
  639. ldx #!space64
  640. sta print_bank
  641. stx print_src
  642. stz print_pal
  643. lda #64
  644. sta print_count
  645. lda #27
  646. sta print_y
  647. stz print_x
  648. jsr hiprint
  649. lda #28
  650. sta print_y
  651. jsr hiprint
  652. jsr hiprint
  653. plp
  654. rts
  655. menu_statusbar
  656. pha
  657. phx
  658. php
  659. sep #$20 : .as
  660. rep #$10 : .xl
  661. lda #^text_statusbar_keys
  662. sta @print_bank
  663. rep #$20 : .al
  664. lda #!text_statusbar_keys
  665. sta @print_src
  666. sep #$20 : .as
  667. lda #$00
  668. sta @print_pal
  669. lda #$02
  670. sta @print_x
  671. lda #$40
  672. sta @print_count
  673. lda listdisp
  674. clc
  675. adc #$0a
  676. clc
  677. adc vidmode
  678. sta @print_y
  679. jsr hiprint
  680. plp
  681. plx
  682. pla
  683. rts
  684. select_last_file:
  685. php
  686. sep #$20 : .as
  687. rep #$10 : .xl
  688. lda @LAST_STATUS
  689. bne +
  690. plp
  691. rts
  692. + jsr backup_screen
  693. lda #^text_last
  694. sta window_tbank
  695. ldx #!text_last
  696. stx window_taddr
  697. lda @last_win_x
  698. sta window_x
  699. inc
  700. inc
  701. sta bar_xl
  702. pha
  703. lda @last_win_y
  704. sta window_y
  705. inc
  706. sta bar_yl
  707. inc
  708. pha
  709. lda @last_win_w
  710. sta window_w
  711. lda @last_win_h
  712. sta window_h
  713. jsr draw_window
  714. stz print_pal
  715. lda #^LAST_GAME
  716. ldx #!LAST_GAME
  717. sta print_bank
  718. stx print_src
  719. stz print_pal
  720. pla
  721. sta print_y
  722. pla
  723. sta print_x
  724. lda #56
  725. sta bar_wl
  726. sta print_count
  727. jsr hiprint
  728. - lda isr_done
  729. lsr
  730. bcc -
  731. jsr printtime
  732. jsr read_pad
  733. lda #$80
  734. and pad1trig+1
  735. bne +
  736. lda #$10
  737. and pad1trig+1
  738. beq -
  739. lda #$04
  740. sta @AVR_CMD
  741. jmp select_file_fade
  742. + jsr restore_screen
  743. plp
  744. rts
  745. scroll_direntry_clean:
  746. lda #$01
  747. sta direntry_xscroll_state
  748. stz direntry_xscroll
  749. stz direntry_xscroll_wait
  750. jsr scroll_direntry
  751. stz direntry_xscroll_state
  752. stz direntry_xscroll
  753. rts
  754. scroll_direntry:
  755. ldy menu_sel
  756. lda direntry_xscroll_state
  757. bne +
  758. lda direntry_fits, y
  759. bne scroll_direntry_enter
  760. ; stz direntry_xscroll_state
  761. rts
  762. scroll_direntry_enter
  763. lda #$01
  764. sta direntry_xscroll_state
  765. stz direntry_xscroll_wait
  766. + lda direntry_xscroll_wait
  767. beq +
  768. dec direntry_xscroll_wait
  769. rts
  770. + lda direntry_xscroll
  771. bne scroll_direntry_scrollfast
  772. lda #$28
  773. bra +
  774. scroll_direntry_scrollfast
  775. lda #$10
  776. + sta direntry_xscroll_wait
  777. tya
  778. clc
  779. adc #$09
  780. sta cursor_y
  781. lda #$02
  782. sta cursor_x
  783. rep #$20 : .al
  784. lda menu_sel
  785. asl
  786. asl
  787. tay
  788. lda [dirptr_addr], y
  789. sta @dirent_addr
  790. iny
  791. iny
  792. sep #$20 : .as
  793. lda [dirptr_addr], y ; load fileinfo bank
  794. clc
  795. adc #$c0 ; add $C0 for memory map
  796. sta @dirent_bank ; store as current bank
  797. iny
  798. lda [dirptr_addr], y
  799. iny
  800. sta @dirent_type
  801. ldy menu_sel
  802. sty direntry_fits_idx
  803. phy
  804. jsr print_direntry
  805. ply
  806. lda direntry_fits, y
  807. bne +
  808. lda #$ff
  809. sta direntry_xscroll_state
  810. lda #$28
  811. sta direntry_xscroll_wait
  812. + lda direntry_xscroll_state
  813. adc direntry_xscroll
  814. sta direntry_xscroll
  815. bne +
  816. lda #$01
  817. sta direntry_xscroll_state
  818. + rts