25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

908 satır
20KB

  1. ;
  2. ; vim.asm - minimal modal text editor for the kernal-os-skeleton shell
  3. ;
  4. ; Build:
  5. ; ca65 vim.asm -o vim.o
  6. ; ld65 -C vim.cfg vim.o -o vim.prg
  7. ;
  8. ; From the OS shell type: VIM
  9. ; All external commands load at $2000 and end with RTS.
  10. ;
  11. ; Modes
  12. ; NORMAL (default) h j k l or cursor keys = move
  13. ; i = insert before cursor
  14. ; a = append after cursor
  15. ; o = open line below
  16. ; x = delete char under cursor
  17. ; : = enter command mode
  18. ; INSERT type text, DEL = backspace, RUN/STOP = back to NORMAL
  19. ; COMMAND :q quit :w NAME save to disk
  20. ; RUN/STOP = cancel
  21. ;
  22. ; Text model: the 24x40 text area of screen RAM IS the buffer.
  23. ; Row 24 (bottom line) is the status bar.
  24. ;
  25. .setcpu "6502"
  26. ; ---- KERNAL ----
  27. GETIN = $FFE4
  28. STOPKEY = $FFE1
  29. CHROUT = $FFD2
  30. SETLFS = $FFBA
  31. SETNAM = $FFBD
  32. OPEN = $FFC0
  33. CLOSE = $FFC3
  34. CHKOUT = $FFC9
  35. CLRCH = $FFCC
  36. CLALL = $FFE7
  37. ; ---- hardware ----
  38. SCRRAM = $0400
  39. ; ---- layout ----
  40. SCR_COLS = 40
  41. SCR_ROWS = 24 ; rows 0-23 = text, row 24 = status bar
  42. ; ---- modes ----
  43. MODE_NORMAL = 0
  44. MODE_INSERT = 1
  45. MODE_CMD = 2
  46. ; ---- PETSCII ----
  47. CR_CH = $0D
  48. DEL_CH = $14
  49. ; ---- command buffer ----
  50. CMD_MAX = 20
  51. ; ---- save LFN ----
  52. SAVE_LFN = 5
  53. SAVE_DEV = 8
  54. ; ---- zero page (user area, safe under OS banking) ----
  55. ZP_LO = $FB ; general destination pointer lo
  56. ZP_HI = $FC ; general destination pointer hi
  57. STR_LO = $FD ; string source pointer lo
  58. STR_HI = $FE ; string source pointer hi
  59. ZP_TMP = $02 ; scratch byte
  60. ; ================================================================
  61. ; PRG load address header
  62. ; ================================================================
  63. .segment "LOADADDR"
  64. .word $2000
  65. ; ================================================================
  66. ; CODE
  67. ; ================================================================
  68. .segment "CODE"
  69. ; ---- entry ----
  70. vim_main:
  71. jsr CLALL ; close any open channels from shell
  72. jsr vim_init
  73. jsr full_redraw
  74. main_loop:
  75. lda quit_flag
  76. beq ml_no_quit
  77. jmp vim_do_exit
  78. ml_no_quit:
  79. jsr get_key ; waits for keypress; $FF = RUN/STOP
  80. cmp #$FF
  81. bne ml_key_ok
  82. ; RUN/STOP pressed
  83. lda cur_mode
  84. beq ml_stop_quit ; normal mode: quit
  85. lda #MODE_NORMAL ; other modes: back to normal
  86. sta cur_mode
  87. jsr full_redraw
  88. jmp main_loop
  89. ml_stop_quit:
  90. lda #1
  91. sta quit_flag
  92. jmp main_loop
  93. ml_key_ok:
  94. sta last_key
  95. lda cur_mode
  96. cmp #MODE_INSERT
  97. bne ml_not_insert
  98. jmp handle_insert
  99. ml_not_insert:
  100. cmp #MODE_CMD
  101. bne ml_not_cmd
  102. jmp handle_cmd
  103. ml_not_cmd:
  104. ; fall through = normal mode
  105. ; ================================================================
  106. ; NORMAL MODE
  107. ; ================================================================
  108. handle_normal:
  109. lda last_key
  110. cmp #'H'
  111. beq nm_left
  112. cmp #$9D ; cursor-left hardware key
  113. beq nm_left
  114. cmp #'L'
  115. beq nm_right
  116. cmp #$1D ; cursor-right hardware key
  117. beq nm_right
  118. cmp #'K'
  119. beq nm_up
  120. cmp #$91 ; cursor-up hardware key
  121. beq nm_up
  122. cmp #'J'
  123. beq nm_down
  124. cmp #$11 ; cursor-down hardware key
  125. beq nm_down
  126. cmp #'I'
  127. beq nm_ins
  128. cmp #'A'
  129. beq nm_app
  130. cmp #'X'
  131. beq nm_del
  132. cmp #'O'
  133. beq nm_open
  134. cmp #':'
  135. beq nm_cmd
  136. jmp nm_done
  137. nm_left:
  138. jsr cursor_left
  139. jmp nm_done
  140. nm_right:
  141. jsr cursor_right
  142. jmp nm_done
  143. nm_up:
  144. jsr cursor_up
  145. jmp nm_done
  146. nm_down:
  147. jsr cursor_down
  148. jmp nm_done
  149. nm_ins:
  150. lda #MODE_INSERT
  151. sta cur_mode
  152. jmp nm_done
  153. nm_app:
  154. jsr cursor_right
  155. lda #MODE_INSERT
  156. sta cur_mode
  157. jmp nm_done
  158. nm_del:
  159. jsr delete_char
  160. jmp nm_done
  161. nm_open:
  162. jsr open_line_below
  163. lda #MODE_INSERT
  164. sta cur_mode
  165. jmp nm_done
  166. nm_cmd:
  167. lda #MODE_CMD
  168. sta cur_mode
  169. lda #0
  170. sta cmd_len
  171. nm_done:
  172. jsr full_redraw
  173. jmp main_loop
  174. ; ================================================================
  175. ; INSERT MODE
  176. ; ================================================================
  177. handle_insert:
  178. lda last_key
  179. cmp #CR_CH
  180. beq ins_nl
  181. cmp #DEL_CH
  182. beq ins_bs
  183. cmp #$20 ; ignore control chars below $20
  184. bcc ins_done
  185. cmp #$7F
  186. bcs ins_done
  187. jsr insert_char ; A = PETSCII char to insert
  188. jsr cursor_right
  189. jmp ins_done
  190. ins_nl:
  191. jsr do_newline
  192. jmp ins_done
  193. ins_bs:
  194. jsr backspace_char
  195. ins_done:
  196. jsr full_redraw
  197. jmp main_loop
  198. ; ================================================================
  199. ; COMMAND MODE
  200. ; ================================================================
  201. handle_cmd:
  202. lda last_key
  203. cmp #CR_CH
  204. beq cmd_exec
  205. cmp #DEL_CH
  206. beq cmd_bs
  207. cmp #$20
  208. bcc cmd_done
  209. cmp #$7F
  210. bcs cmd_done
  211. ldx cmd_len
  212. cpx #CMD_MAX
  213. bcs cmd_done
  214. sta cmd_buf,x
  215. inc cmd_len
  216. jmp cmd_done
  217. cmd_bs:
  218. lda cmd_len
  219. beq cmd_done
  220. dec cmd_len
  221. jmp cmd_done
  222. cmd_exec:
  223. jsr run_cmd
  224. cmd_done:
  225. jsr full_redraw
  226. jmp main_loop
  227. ; ================================================================
  228. ; EXIT
  229. ; ================================================================
  230. vim_do_exit:
  231. jsr restore_cursor ; de-invert cursor char before leaving
  232. rts ; return to kernal-os-skeleton shell
  233. ; ================================================================
  234. ; COMMAND EXECUTION
  235. ; ================================================================
  236. run_cmd:
  237. lda cmd_len
  238. beq rc_cancel
  239. ; --- :Q quit ---
  240. cmp #1
  241. bne rc_not_q
  242. lda cmd_buf
  243. cmp #'Q'
  244. bne rc_not_q
  245. lda #1
  246. sta quit_flag
  247. lda #MODE_NORMAL
  248. sta cur_mode
  249. rts
  250. rc_not_q:
  251. ; --- :W [NAME] save ---
  252. lda cmd_buf
  253. cmp #'W'
  254. bne rc_unknown
  255. jsr do_save
  256. lda #MODE_NORMAL
  257. sta cur_mode
  258. rts
  259. rc_unknown:
  260. ; show "?" in status then return to normal
  261. lda #<msg_cmd_err
  262. ldy #>msg_cmd_err
  263. jsr show_status_text
  264. rc_cancel:
  265. lda #MODE_NORMAL
  266. sta cur_mode
  267. rts
  268. ; ================================================================
  269. ; FILE SAVE
  270. ; do_save: reads cmd_buf "W NAME" and writes text to disk
  271. ; ================================================================
  272. do_save:
  273. ; need at least "W N" (3 chars: W, space, one char of name)
  274. lda cmd_len
  275. cmp #3
  276. bcs ds_len_ok
  277. jmp ds_no_name
  278. ds_len_ok:
  279. lda cmd_buf + 1
  280. cmp #' '
  281. beq ds_space_ok
  282. jmp ds_no_name
  283. ds_space_ok:
  284. ; copy filename from cmd_buf[2..] to save_fn
  285. ldy #2
  286. ldx #0
  287. ds_copy_name:
  288. lda cmd_buf,y
  289. beq ds_name_done
  290. cmp #' '
  291. beq ds_name_done
  292. sta save_fn,x
  293. inx
  294. iny
  295. cpx #15
  296. bcc ds_copy_name
  297. ds_name_done:
  298. stx save_fn_len
  299. lda #0
  300. sta save_fn,x
  301. ; build "0:NAME,S,W" in full_fn
  302. jsr build_save_fname
  303. ; SETLFS
  304. lda #SAVE_LFN
  305. ldx #SAVE_DEV
  306. ldy #2
  307. jsr SETLFS
  308. ; SETNAM
  309. lda full_fn_len
  310. ldx #<full_fn
  311. ldy #>full_fn
  312. jsr SETNAM
  313. jsr OPEN
  314. bcc ds_open_ok
  315. ; open error
  316. lda #<msg_disk_err
  317. ldy #>msg_disk_err
  318. jsr show_status_text
  319. rts
  320. ds_open_ok:
  321. lda #SAVE_LFN
  322. jsr CHKOUT
  323. bcc ds_write_rows
  324. jsr CLRCH
  325. lda #SAVE_LFN
  326. jsr CLOSE
  327. lda #<msg_disk_err
  328. ldy #>msg_disk_err
  329. jsr show_status_text
  330. rts
  331. ds_write_rows:
  332. lda #0
  333. sta save_row
  334. ds_row_loop:
  335. ldx save_row
  336. lda row_lo,x
  337. sta ZP_LO
  338. lda row_hi,x
  339. sta ZP_HI
  340. ; find rightmost non-space column
  341. ldy #SCR_COLS - 1
  342. ds_find_end:
  343. lda (ZP_LO),y
  344. cmp #$20
  345. bne ds_row_found
  346. tya
  347. beq ds_row_empty
  348. dey
  349. jmp ds_find_end
  350. ds_row_empty:
  351. ; empty row: just write CR
  352. lda #CR_CH
  353. jsr CHROUT
  354. jmp ds_row_done
  355. ds_row_found:
  356. ; write cols 0..Y then CR
  357. sty save_col_end
  358. ldy #0
  359. ds_write_col:
  360. lda (ZP_LO),y
  361. jsr screen_to_petscii
  362. jsr CHROUT
  363. cpy save_col_end
  364. beq ds_write_cr
  365. iny
  366. jmp ds_write_col
  367. ds_write_cr:
  368. lda #CR_CH
  369. jsr CHROUT
  370. ds_row_done:
  371. inc save_row
  372. lda save_row
  373. cmp #SCR_ROWS
  374. bne ds_row_loop
  375. ; close
  376. jsr CLRCH
  377. lda #SAVE_LFN
  378. jsr CLOSE
  379. lda #<msg_saved
  380. ldy #>msg_saved
  381. jsr show_status_text
  382. rts
  383. ds_no_name:
  384. lda #<msg_need_name
  385. ldy #>msg_need_name
  386. jsr show_status_text
  387. rts
  388. ; builds "0:save_fn,S,W" into full_fn, length into full_fn_len
  389. build_save_fname:
  390. ldx #0
  391. lda #'0'
  392. sta full_fn,x
  393. inx
  394. lda #':'
  395. sta full_fn,x
  396. inx
  397. ldy #0
  398. bsf_loop:
  399. lda save_fn,y
  400. beq bsf_suffix
  401. sta full_fn,x
  402. inx
  403. iny
  404. bne bsf_loop
  405. bsf_suffix:
  406. lda #','
  407. sta full_fn,x
  408. inx
  409. lda #'S'
  410. sta full_fn,x
  411. inx
  412. lda #','
  413. sta full_fn,x
  414. inx
  415. lda #'W'
  416. sta full_fn,x
  417. inx
  418. stx full_fn_len
  419. lda #0
  420. sta full_fn,x
  421. rts
  422. ; ================================================================
  423. ; CURSOR MOVEMENT
  424. ; ================================================================
  425. cursor_left:
  426. lda cur_col
  427. beq cl_wrap
  428. dec cur_col
  429. rts
  430. cl_wrap:
  431. lda cur_row
  432. beq cl_top
  433. dec cur_row
  434. lda #SCR_COLS - 1
  435. sta cur_col
  436. cl_top: rts
  437. cursor_right:
  438. lda cur_col
  439. cmp #SCR_COLS - 1
  440. bcs cr_wrap
  441. inc cur_col
  442. rts
  443. cr_wrap:
  444. lda cur_row
  445. cmp #SCR_ROWS - 1
  446. bcs cr_bot
  447. inc cur_row
  448. lda #0
  449. sta cur_col
  450. cr_bot: rts
  451. cursor_up:
  452. lda cur_row
  453. beq cu_top
  454. dec cur_row
  455. cu_top: rts
  456. cursor_down:
  457. lda cur_row
  458. cmp #SCR_ROWS - 1
  459. bcs cd_bot
  460. inc cur_row
  461. cd_bot: rts
  462. ; ================================================================
  463. ; TEXT EDITING
  464. ; ================================================================
  465. ; Set ZP_LO/ZP_HI to the screen RAM base for cur_row
  466. row_ptr:
  467. ldx cur_row
  468. lda row_lo,x
  469. sta ZP_LO
  470. lda row_hi,x
  471. sta ZP_HI
  472. rts
  473. ; Insert PETSCII char (in A) at cursor; shift rest of line right (last char lost)
  474. insert_char:
  475. jsr petscii_to_screen
  476. sta ZP_TMP
  477. jsr row_ptr
  478. ldy #SCR_COLS - 1
  479. ic_shift:
  480. cpy cur_col
  481. beq ic_write
  482. dey
  483. lda (ZP_LO),y
  484. iny
  485. sta (ZP_LO),y
  486. dey
  487. jmp ic_shift
  488. ic_write:
  489. lda ZP_TMP
  490. ldy cur_col
  491. sta (ZP_LO),y
  492. rts
  493. ; Delete char at cursor; shift rest of line left, fill end with space
  494. delete_char:
  495. jsr row_ptr
  496. ldy cur_col
  497. dc_shift:
  498. cpy #SCR_COLS - 1
  499. beq dc_space
  500. iny
  501. lda (ZP_LO),y
  502. dey
  503. sta (ZP_LO),y
  504. iny
  505. jmp dc_shift
  506. dc_space:
  507. lda #$20
  508. sta (ZP_LO),y
  509. rts
  510. ; Backspace: move cursor left then delete
  511. backspace_char:
  512. lda cur_col
  513. beq bs_done
  514. jsr cursor_left
  515. jsr delete_char
  516. bs_done:rts
  517. ; RETURN in insert mode: move to col 0 of next row
  518. do_newline:
  519. lda cur_row
  520. cmp #SCR_ROWS - 1
  521. bcs nl_done
  522. inc cur_row
  523. lda #0
  524. sta cur_col
  525. nl_done:rts
  526. ; Open new line below: advance row, clear it, col = 0
  527. open_line_below:
  528. lda cur_row
  529. cmp #SCR_ROWS - 1
  530. bcs ol_done
  531. inc cur_row
  532. lda #0
  533. sta cur_col
  534. jsr clear_current_row
  535. ol_done:rts
  536. clear_current_row:
  537. jsr row_ptr
  538. ldy #0
  539. lda #$20
  540. ccr_lp: sta (ZP_LO),y
  541. iny
  542. cpy #SCR_COLS
  543. bne ccr_lp
  544. rts
  545. ; Clear all 24 text rows to spaces
  546. clear_text:
  547. lda #0
  548. sta ZP_TMP
  549. ct_loop:
  550. ldx ZP_TMP
  551. lda row_lo,x
  552. sta ZP_LO
  553. lda row_hi,x
  554. sta ZP_HI
  555. ldy #0
  556. lda #$20
  557. ct_row: sta (ZP_LO),y
  558. iny
  559. cpy #SCR_COLS
  560. bne ct_row
  561. inc ZP_TMP
  562. lda ZP_TMP
  563. cmp #SCR_ROWS
  564. bne ct_loop
  565. rts
  566. ; ================================================================
  567. ; SCREEN RENDERING
  568. ; ================================================================
  569. ; Restore the saved char at (prev_row, prev_col)
  570. restore_cursor:
  571. ldx prev_row
  572. lda row_lo,x
  573. clc
  574. adc prev_col
  575. sta ZP_LO
  576. lda row_hi,x
  577. adc #0
  578. sta ZP_HI
  579. lda prev_char
  580. ldy #0
  581. sta (ZP_LO),y
  582. rts
  583. ; Show cursor by inverting char at (cur_row, cur_col); saves old char
  584. show_cursor:
  585. ldx cur_row
  586. lda row_lo,x
  587. clc
  588. adc cur_col
  589. sta ZP_LO
  590. lda row_hi,x
  591. adc #0
  592. sta ZP_HI
  593. ldy #0
  594. lda (ZP_LO),y
  595. sta prev_char
  596. ora #$80 ; set bit 7 = reversed character
  597. sta (ZP_LO),y
  598. lda cur_row
  599. sta prev_row
  600. lda cur_col
  601. sta prev_col
  602. rts
  603. ; Draw status bar at row 24
  604. draw_status:
  605. ; clear status row
  606. lda row_lo + 24
  607. sta ZP_LO
  608. lda row_hi + 24
  609. sta ZP_HI
  610. ldy #0
  611. lda #$20
  612. dstat_clr:
  613. sta (ZP_LO),y
  614. iny
  615. cpy #SCR_COLS
  616. bne dstat_clr
  617. lda cur_mode
  618. cmp #MODE_INSERT
  619. beq dstat_ins
  620. cmp #MODE_CMD
  621. beq dstat_cmd
  622. ; NORMAL
  623. lda #<str_normal
  624. ldy #>str_normal
  625. jsr write_str_to_status
  626. rts
  627. dstat_ins:
  628. lda #<str_insert
  629. ldy #>str_insert
  630. jsr write_str_to_status
  631. rts
  632. dstat_cmd:
  633. ; write ":" then cmd_buf
  634. lda row_lo + 24
  635. sta ZP_LO
  636. lda row_hi + 24
  637. sta ZP_HI
  638. lda #$3A ; screen code for ':'
  639. ldy #0
  640. sta (ZP_LO),y
  641. iny
  642. ldx #0
  643. dstat_cmd_lp:
  644. cpx cmd_len
  645. beq dstat_done
  646. lda cmd_buf,x
  647. jsr petscii_to_screen
  648. sta (ZP_LO),y
  649. iny
  650. inx
  651. cpy #SCR_COLS
  652. bcc dstat_cmd_lp
  653. dstat_done:
  654. rts
  655. ; Write null-terminated PETSCII string (A=lo, Y=hi) to status row
  656. write_str_to_status:
  657. sta STR_LO
  658. sty STR_HI
  659. lda row_lo + 24
  660. sta ZP_LO
  661. lda row_hi + 24
  662. sta ZP_HI
  663. ldy #0
  664. wss_lp:
  665. lda (STR_LO),y
  666. beq wss_done
  667. jsr petscii_to_screen
  668. sta (ZP_LO),y
  669. iny
  670. cpy #SCR_COLS
  671. bcc wss_lp
  672. wss_done:
  673. rts
  674. ; Copy a PETSCII string directly to status (no screen-code conversion)
  675. ; Used for messages that already have screen codes (msg_saved etc.)
  676. ; Actually we just reuse write_str_to_status since it converts
  677. show_status_text:
  678. jsr write_str_to_status
  679. rts
  680. ; Restore cursor, redraw cursor, redraw status bar
  681. full_redraw:
  682. jsr restore_cursor
  683. jsr show_cursor
  684. jsr draw_status
  685. rts
  686. ; ================================================================
  687. ; INIT
  688. ; ================================================================
  689. vim_init:
  690. lda #0
  691. sta cur_row
  692. sta cur_col
  693. sta prev_row
  694. sta prev_col
  695. sta cur_mode
  696. sta cmd_len
  697. sta quit_flag
  698. sta save_row
  699. sta save_col_end
  700. lda #$20 ; cursor starts on a space
  701. sta prev_char
  702. jsr clear_text
  703. rts
  704. ; ================================================================
  705. ; KEY INPUT
  706. ; ================================================================
  707. get_key:
  708. gk_loop:
  709. jsr STOPKEY
  710. bne gk_getin
  711. lda #$FF ; RUN/STOP = special exit code
  712. rts
  713. gk_getin:
  714. jsr GETIN
  715. beq gk_loop ; no key yet, keep polling
  716. rts
  717. ; ================================================================
  718. ; CHARACTER CONVERSION
  719. ; ================================================================
  720. ; PETSCII → screen code
  721. ; $41-$5A (A-Z unshifted) → $01-$1A (subtract $40)
  722. ; $61-$7A (a-z lowercase) → $01-$1A (subtract $60)
  723. ; $20-$3F (space,nums,punct) → same
  724. ; others: pass through
  725. petscii_to_screen:
  726. cmp #$41
  727. bcc pts_pass
  728. cmp #$5B
  729. bcc pts_upper
  730. cmp #$61
  731. bcc pts_pass
  732. cmp #$7B
  733. bcc pts_lower
  734. pts_pass:
  735. rts
  736. pts_upper:
  737. sec
  738. sbc #$40
  739. rts
  740. pts_lower:
  741. sec
  742. sbc #$60
  743. rts
  744. ; screen code → PETSCII (inverse of above)
  745. ; $01-$1A → $41-$5A (add $40)
  746. ; $20-$3F → same
  747. ; $00 → '@'
  748. ; others: return space $20
  749. screen_to_petscii:
  750. cmp #$01
  751. bcc stp_at
  752. cmp #$1B
  753. bcc stp_letter
  754. cmp #$20
  755. bcc stp_space
  756. cmp #$40
  757. bcc stp_pass
  758. stp_space:
  759. lda #$20
  760. rts
  761. stp_at:
  762. lda #$40 ; '@'
  763. rts
  764. stp_letter:
  765. clc
  766. adc #$40
  767. rts
  768. stp_pass:
  769. rts
  770. ; ================================================================
  771. ; RODATA
  772. ; ================================================================
  773. .segment "RODATA"
  774. str_normal:
  775. .byte "NORMAL (hjkl=move i=ins x=del :=cmd)", 0
  776. str_insert:
  777. .byte "INSERT (type text, DEL=bksp, STOP=normal)", 0
  778. msg_cmd_err:
  779. .byte "? unknown command", 0
  780. msg_saved:
  781. .byte "saved.", 0
  782. msg_disk_err:
  783. .byte "disk error.", 0
  784. msg_need_name:
  785. .byte "usage: :w filename", 0
  786. ; Row-base lookup tables (25 entries: rows 0-23 = text, row 24 = status)
  787. row_lo:
  788. .byte <(SCRRAM + 0*40), <(SCRRAM + 1*40), <(SCRRAM + 2*40)
  789. .byte <(SCRRAM + 3*40), <(SCRRAM + 4*40), <(SCRRAM + 5*40)
  790. .byte <(SCRRAM + 6*40), <(SCRRAM + 7*40), <(SCRRAM + 8*40)
  791. .byte <(SCRRAM + 9*40), <(SCRRAM + 10*40), <(SCRRAM + 11*40)
  792. .byte <(SCRRAM + 12*40), <(SCRRAM + 13*40), <(SCRRAM + 14*40)
  793. .byte <(SCRRAM + 15*40), <(SCRRAM + 16*40), <(SCRRAM + 17*40)
  794. .byte <(SCRRAM + 18*40), <(SCRRAM + 19*40), <(SCRRAM + 20*40)
  795. .byte <(SCRRAM + 21*40), <(SCRRAM + 22*40), <(SCRRAM + 23*40)
  796. .byte <(SCRRAM + 24*40)
  797. row_hi:
  798. .byte >(SCRRAM + 0*40), >(SCRRAM + 1*40), >(SCRRAM + 2*40)
  799. .byte >(SCRRAM + 3*40), >(SCRRAM + 4*40), >(SCRRAM + 5*40)
  800. .byte >(SCRRAM + 6*40), >(SCRRAM + 7*40), >(SCRRAM + 8*40)
  801. .byte >(SCRRAM + 9*40), >(SCRRAM + 10*40), >(SCRRAM + 11*40)
  802. .byte >(SCRRAM + 12*40), >(SCRRAM + 13*40), >(SCRRAM + 14*40)
  803. .byte >(SCRRAM + 15*40), >(SCRRAM + 16*40), >(SCRRAM + 17*40)
  804. .byte >(SCRRAM + 18*40), >(SCRRAM + 19*40), >(SCRRAM + 20*40)
  805. .byte >(SCRRAM + 21*40), >(SCRRAM + 22*40), >(SCRRAM + 23*40)
  806. .byte >(SCRRAM + 24*40)
  807. ; ================================================================
  808. ; BSS (zero-initialised by the OS / KERNAL CINT on cold start;
  809. ; vim_init zeros what it cares about explicitly)
  810. ; ================================================================
  811. .segment "BSS"
  812. cur_row: .res 1
  813. cur_col: .res 1
  814. prev_row: .res 1
  815. prev_col: .res 1
  816. prev_char: .res 1 ; screen code saved before cursor inversion
  817. cur_mode: .res 1
  818. cmd_len: .res 1
  819. cmd_buf: .res CMD_MAX + 1
  820. last_key: .res 1
  821. quit_flag: .res 1
  822. save_row: .res 1
  823. save_col_end: .res 1
  824. save_fn: .res 16 ; extracted filename (no path)
  825. save_fn_len: .res 1
  826. full_fn: .res 24 ; "0:filename,S,W"
  827. full_fn_len: .res 1

Powered by TurnKey Linux.