您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

2408 行
42KB

  1. ;
  2. ; kernal_os.asm
  3. ; sample C64 OS skeleton that keeps the KERNAL ROM visible
  4. ;
  5. ; build:
  6. ; ca65 kernal_os.asm -o kernal_os.o
  7. ; ld65 -C kernal_os.cfg kernal_os.o -o kernal_os.prg
  8. ;
  9. ; run:
  10. ; LOAD "KERNAL_OS.PRG",8
  11. ; RUN
  12. ;
  13. .setcpu "6502"
  14. ; ------------------------------------------------------------
  15. ; KERNAL routines
  16. ; ------------------------------------------------------------
  17. CINT = $FF81
  18. IOINIT = $FF84
  19. RESTOR = $FF8A
  20. CHROUT = $FFD2
  21. GETIN = $FFE4
  22. STOPKEY = $FFE1
  23. SCREEN = $FFED
  24. READST = $FFB7
  25. SETLFS = $FFBA
  26. SETNAM = $FFBD
  27. OPEN = $FFC0
  28. CLOSE = $FFC3
  29. CHKIN = $FFC6
  30. CHKOUT = $FFC9
  31. CLRCH = $FFCC
  32. BASIN = $FFCF
  33. CLALL = $FFE7
  34. LOAD = $FFD5
  35. ; ------------------------------------------------------------
  36. ; system locations
  37. ; ------------------------------------------------------------
  38. CPU_PORT = $0001
  39. PTR1_LO = $FB
  40. PTR1_HI = $FC
  41. ; ------------------------------------------------------------
  42. ; memory layout for this sample OS
  43. ; ------------------------------------------------------------
  44. OS_LOAD = $0801
  45. WORKSPACE = $A000
  46. FILE_BUFFER = $A100
  47. FILE_BUFFER_MAX = 224
  48. INPUT_MAX = 64
  49. DISK_DEV = 8
  50. LFN_DIR = 2
  51. LFN_CMD = 15
  52. EXEC_AREA = $2000
  53. SYS_ENTRY = 2061
  54. ; ------------------------------------------------------------
  55. ; PETSCII constants
  56. ; ------------------------------------------------------------
  57. CR = $0D
  58. CLR_HOME = $93
  59. .segment "LOADADDR"
  60. .word OS_LOAD
  61. .segment "BASIC"
  62. .word basic_end
  63. .word 10
  64. .byte $9E
  65. .byte "2061"
  66. .byte 0
  67. basic_end:
  68. .word 0
  69. .segment "CODE"
  70. start:
  71. jsr IOINIT
  72. jsr RESTOR
  73. jsr CINT
  74. jsr reset_file_state
  75. jsr set_os_memory
  76. jsr init_workspace
  77. jsr print_banner
  78. jmp main_loop
  79. main_loop:
  80. jsr print_prompt
  81. jsr read_line
  82. lda exit_requested
  83. beq parse_shell_command
  84. jmp exit_to_basic
  85. parse_shell_command:
  86. jsr parse_command
  87. lda exit_requested
  88. beq continue_shell
  89. jmp exit_to_basic
  90. continue_shell:
  91. jmp main_loop
  92. do_mem:
  93. lda #<msg_mode
  94. ldy #>msg_mode
  95. jsr print_string
  96. lda CPU_PORT
  97. jsr print_hex_byte
  98. lda #<msg_workspace
  99. ldy #>msg_workspace
  100. jsr print_string
  101. lda WORKSPACE
  102. jsr print_hex_byte
  103. lda #<msg_layout
  104. ldy #>msg_layout
  105. jsr print_string
  106. rts
  107. do_inc:
  108. inc workspace_counter
  109. lda workspace_counter
  110. sta WORKSPACE
  111. lda #<msg_written
  112. ldy #>msg_written
  113. jsr print_string
  114. lda WORKSPACE
  115. jsr print_hex_byte
  116. lda #CR
  117. jsr CHROUT
  118. rts
  119. do_dump:
  120. lda #<msg_dump
  121. ldy #>msg_dump
  122. jsr print_string
  123. ldx #0
  124. dump_loop:
  125. lda WORKSPACE,x
  126. jsr print_hex_byte
  127. lda #' '
  128. jsr CHROUT
  129. inx
  130. cpx #16
  131. bne dump_loop
  132. lda #CR
  133. jsr CHROUT
  134. rts
  135. do_zero:
  136. ldx #0
  137. zero_loop:
  138. lda #0
  139. sta WORKSPACE,x
  140. inx
  141. cpx #16
  142. bne zero_loop
  143. lda #0
  144. sta workspace_counter
  145. lda #<msg_zeroed
  146. ldy #>msg_zeroed
  147. jsr print_string
  148. rts
  149. do_sign:
  150. jsr write_signature
  151. lda #<msg_signed
  152. ldy #>msg_signed
  153. jsr print_string
  154. rts
  155. do_cls:
  156. lda #CLR_HOME
  157. jsr CHROUT
  158. rts
  159. do_help:
  160. lda #<msg_help
  161. ldy #>msg_help
  162. jsr print_string
  163. rts
  164. do_about:
  165. lda #<msg_about
  166. ldy #>msg_about
  167. jsr print_string
  168. rts
  169. do_screen:
  170. lda #<msg_screen
  171. ldy #>msg_screen
  172. jsr print_string
  173. jsr SCREEN
  174. txa
  175. jsr print_decimal_byte
  176. lda #'X'
  177. jsr CHROUT
  178. tya
  179. jsr print_decimal_byte
  180. lda #CR
  181. jsr CHROUT
  182. rts
  183. do_dir:
  184. lda #0
  185. sta dir_line_count
  186. jsr build_dir_spec
  187. jsr reset_file_state
  188. lda #LFN_DIR
  189. sta active_lfn
  190. ldx current_device
  191. ldy #0
  192. jsr SETLFS
  193. lda filename_len
  194. ldx #<filename_spec
  195. ldy #>filename_spec
  196. jsr SETNAM
  197. jsr OPEN
  198. bcc dir_channel_input
  199. jmp disk_open_error
  200. dir_channel_input:
  201. ldx #LFN_DIR
  202. jsr CHKIN
  203. bcc dir_next_line
  204. jmp disk_input_error
  205. dir_next_line:
  206. lda #0
  207. sta line_had_name
  208. sta quote_state
  209. jsr BASIN
  210. sta dir_link_lo
  211. jsr BASIN
  212. sta dir_link_hi
  213. lda dir_link_lo
  214. ora dir_link_hi
  215. beq dir_done
  216. jsr BASIN
  217. jsr BASIN
  218. lda dir_line_count
  219. beq dir_skip_line
  220. dir_line_loop:
  221. jsr BASIN
  222. beq dir_line_end
  223. sta temp_char
  224. cmp #'"'
  225. beq dir_toggle_quote
  226. lda quote_state
  227. beq dir_line_loop
  228. lda line_had_name
  229. bne dir_print_char
  230. lda #1
  231. sta line_had_name
  232. dir_print_char:
  233. lda temp_char
  234. jsr CHROUT
  235. jmp dir_line_loop
  236. dir_toggle_quote:
  237. lda quote_state
  238. eor #1
  239. sta quote_state
  240. jmp dir_line_loop
  241. dir_skip_line:
  242. jsr BASIN
  243. beq dir_line_end
  244. jmp dir_skip_line
  245. dir_line_end:
  246. inc dir_line_count
  247. lda line_had_name
  248. beq dir_next_line
  249. lda #CR
  250. jsr CHROUT
  251. jmp dir_next_line
  252. dir_done:
  253. jsr close_active_file
  254. rts
  255. do_status:
  256. lda #<msg_status
  257. ldy #>msg_status
  258. jsr print_string
  259. jsr print_current_target
  260. lda #CR
  261. jsr CHROUT
  262. jsr reset_file_state
  263. lda #LFN_CMD
  264. sta active_lfn
  265. ldx current_device
  266. ldy #15
  267. jsr SETLFS
  268. lda #0
  269. ldx #0
  270. ldy #0
  271. jsr SETNAM
  272. jsr OPEN
  273. bcc status_channel_input
  274. jmp disk_open_error
  275. status_channel_input:
  276. ldx #LFN_CMD
  277. jsr CHKIN
  278. bcc status_loop
  279. jmp disk_input_error
  280. status_loop:
  281. jsr BASIN
  282. jsr CHROUT
  283. jsr READST
  284. and #$40
  285. beq status_loop
  286. lda #CR
  287. jsr CHROUT
  288. jsr close_active_file
  289. rts
  290. do_init:
  291. lda #<msg_init
  292. ldy #>msg_init
  293. jsr print_string
  294. jsr print_current_target
  295. lda #CR
  296. jsr CHROUT
  297. jsr reset_file_state
  298. lda #LFN_CMD
  299. sta active_lfn
  300. ldx current_device
  301. ldy #15
  302. jsr SETLFS
  303. lda #1
  304. ldx #<fname_init
  305. ldy #>fname_init
  306. jsr SETNAM
  307. jsr OPEN
  308. bcc init_done
  309. jmp disk_open_error
  310. init_done:
  311. jsr close_active_file
  312. jmp do_status
  313. do_delete:
  314. jsr find_argument_start
  315. bcs delete_missing_name
  316. jsr build_scratch_command
  317. bcs delete_missing_name
  318. lda #<msg_delete
  319. ldy #>msg_delete
  320. jsr print_string
  321. jsr print_current_target
  322. lda #CR
  323. jsr CHROUT
  324. jsr reset_file_state
  325. lda #LFN_CMD
  326. sta active_lfn
  327. ldx current_device
  328. ldy #15
  329. jsr SETLFS
  330. lda scratch_len
  331. ldx #<scratch_command
  332. ldy #>scratch_command
  333. jsr SETNAM
  334. jsr OPEN
  335. bcc delete_done
  336. jmp disk_open_error
  337. delete_done:
  338. jsr close_active_file
  339. jmp do_status
  340. delete_missing_name:
  341. lda #<msg_delete_usage
  342. ldy #>msg_delete_usage
  343. jsr print_string
  344. rts
  345. do_touch:
  346. jsr find_argument_start
  347. bcs touch_missing_name
  348. jsr build_write_filename
  349. bcs touch_missing_name
  350. lda #<msg_touch
  351. ldy #>msg_touch
  352. jsr print_string
  353. jsr print_current_target
  354. lda #CR
  355. jsr CHROUT
  356. jsr reset_file_state
  357. lda #LFN_DIR
  358. sta active_lfn
  359. ldx current_device
  360. ldy #2
  361. jsr SETLFS
  362. lda filename_len
  363. ldx #<filename_spec
  364. ldy #>filename_spec
  365. jsr SETNAM
  366. jsr OPEN
  367. bcc touch_done
  368. jmp disk_open_error
  369. touch_done:
  370. jsr close_active_file
  371. jmp do_status
  372. touch_missing_name:
  373. lda #<msg_touch_usage
  374. ldy #>msg_touch_usage
  375. jsr print_string
  376. rts
  377. do_echo:
  378. jsr find_argument_start
  379. bcs echo_missing_text
  380. jsr copy_echo_to_buffer
  381. bcs echo_missing_text
  382. lda file_buffer_len
  383. beq echo_missing_text
  384. ldy #0
  385. echo_print_loop:
  386. cpy file_buffer_len
  387. beq echo_print_done
  388. lda FILE_BUFFER,y
  389. jsr CHROUT
  390. iny
  391. bne echo_print_loop
  392. echo_print_done:
  393. lda #CR
  394. jsr CHROUT
  395. lda pipe_found
  396. beq echo_done
  397. jsr rewrite_input_after_pipe
  398. lda input_buffer
  399. beq echo_done
  400. jmp parse_command
  401. echo_done:
  402. rts
  403. echo_missing_text:
  404. lda #<msg_echo_usage
  405. ldy #>msg_echo_usage
  406. jsr print_string
  407. rts
  408. do_type:
  409. jsr find_argument_start
  410. bcs type_missing_name
  411. jsr build_read_filename
  412. bcs type_missing_name
  413. jsr reset_file_state
  414. lda #LFN_DIR
  415. sta active_lfn
  416. ldx current_device
  417. ldy #2
  418. jsr SETLFS
  419. lda filename_len
  420. ldx #<filename_spec
  421. ldy #>filename_spec
  422. jsr SETNAM
  423. jsr OPEN
  424. bcc type_channel_input
  425. jmp disk_open_error
  426. type_channel_input:
  427. ldx #LFN_DIR
  428. jsr CHKIN
  429. bcc type_loop
  430. jmp disk_input_error
  431. type_loop:
  432. jsr BASIN
  433. jsr CHROUT
  434. jsr READST
  435. and #$40
  436. beq type_loop
  437. lda #CR
  438. jsr CHROUT
  439. jsr close_active_file
  440. rts
  441. type_missing_name:
  442. lda #<msg_type_usage
  443. ldy #>msg_type_usage
  444. jsr print_string
  445. rts
  446. do_load_file:
  447. jsr find_argument_start
  448. bcc load_have_arg
  449. jmp load_missing_name
  450. load_have_arg:
  451. jsr build_read_filename
  452. bcc load_name_ready
  453. jmp load_missing_name
  454. load_name_ready:
  455. jsr reset_file_state
  456. lda #LFN_DIR
  457. sta active_lfn
  458. ldx current_device
  459. ldy #2
  460. jsr SETLFS
  461. lda filename_len
  462. ldx #<filename_spec
  463. ldy #>filename_spec
  464. jsr SETNAM
  465. jsr OPEN
  466. bcc load_channel_input
  467. jmp disk_open_error
  468. load_channel_input:
  469. ldx #LFN_DIR
  470. jsr CHKIN
  471. bcc load_prepare
  472. jmp disk_input_error
  473. load_prepare:
  474. lda #0
  475. sta file_buffer_len
  476. sta file_truncated
  477. ldx #0
  478. load_loop:
  479. jsr BASIN
  480. sta temp_char
  481. ldy file_buffer_len
  482. cpy #FILE_BUFFER_MAX
  483. bcs load_set_truncated
  484. lda temp_char
  485. sta FILE_BUFFER,y
  486. inc file_buffer_len
  487. jmp load_check_eof
  488. load_set_truncated:
  489. lda #1
  490. sta file_truncated
  491. load_check_eof:
  492. jsr READST
  493. and #$40
  494. beq load_loop
  495. lda file_buffer_len
  496. tay
  497. cpy #FILE_BUFFER_MAX
  498. bcs load_report
  499. lda #0
  500. sta FILE_BUFFER,y
  501. load_report:
  502. jsr close_active_file
  503. lda #<msg_loaded
  504. ldy #>msg_loaded
  505. jsr print_string
  506. lda file_buffer_len
  507. jsr print_decimal_byte
  508. lda #<msg_bytes
  509. ldy #>msg_bytes
  510. jsr print_string
  511. lda file_truncated
  512. beq load_done
  513. lda #<msg_truncated
  514. ldy #>msg_truncated
  515. jsr print_string
  516. load_done:
  517. rts
  518. load_missing_name:
  519. lda #<msg_load_usage
  520. ldy #>msg_load_usage
  521. jsr print_string
  522. rts
  523. do_save_file:
  524. jsr find_argument_start
  525. bcs save_missing_name
  526. lda file_buffer_len
  527. bne save_have_data
  528. lda #<msg_buffer_empty
  529. ldy #>msg_buffer_empty
  530. jsr print_string
  531. rts
  532. save_have_data:
  533. jsr build_write_filename
  534. bcs save_missing_name
  535. jsr reset_file_state
  536. lda #LFN_DIR
  537. sta active_lfn
  538. ldx current_device
  539. ldy #2
  540. jsr SETLFS
  541. lda filename_len
  542. ldx #<filename_spec
  543. ldy #>filename_spec
  544. jsr SETNAM
  545. jsr OPEN
  546. bcc save_channel_output
  547. jmp disk_open_error
  548. save_channel_output:
  549. ldx #LFN_DIR
  550. jsr CHKOUT
  551. bcc save_loop_prepare
  552. jmp disk_input_error
  553. save_loop_prepare:
  554. ldy #0
  555. save_loop:
  556. cpy file_buffer_len
  557. beq save_done
  558. lda FILE_BUFFER,y
  559. jsr CHROUT
  560. iny
  561. bne save_loop
  562. save_done:
  563. jsr close_active_file
  564. lda #<msg_saved
  565. ldy #>msg_saved
  566. jsr print_string
  567. lda file_buffer_len
  568. jsr print_decimal_byte
  569. lda #<msg_bytes
  570. ldy #>msg_bytes
  571. jsr print_string
  572. rts
  573. save_missing_name:
  574. lda #<msg_save_usage
  575. ldy #>msg_save_usage
  576. jsr print_string
  577. rts
  578. do_device:
  579. jsr find_argument_start
  580. bcc device_parse_arg
  581. jmp show_current_target
  582. device_parse_arg:
  583. jsr parse_decimal_argument
  584. bcs device_usage
  585. lda parsed_number
  586. cmp #8
  587. bcc device_usage
  588. cmp #16
  589. bcs device_usage
  590. sta current_device
  591. lda #<msg_device_set
  592. ldy #>msg_device_set
  593. jsr print_string
  594. jsr print_current_target
  595. lda #CR
  596. jsr CHROUT
  597. rts
  598. device_usage:
  599. lda #<msg_device_usage
  600. ldy #>msg_device_usage
  601. jsr print_string
  602. rts
  603. do_drive:
  604. jsr find_argument_start
  605. bcc drive_parse_arg
  606. jmp show_current_target
  607. drive_parse_arg:
  608. jsr parse_decimal_argument
  609. bcs drive_usage
  610. lda parsed_number
  611. cmp #2
  612. bcs drive_usage
  613. sta current_drive
  614. lda #<msg_drive_set
  615. ldy #>msg_drive_set
  616. jsr print_string
  617. jsr print_current_target
  618. lda #CR
  619. jsr CHROUT
  620. rts
  621. drive_usage:
  622. lda #<msg_drive_usage
  623. ldy #>msg_drive_usage
  624. jsr print_string
  625. rts
  626. do_hex:
  627. lda file_buffer_len
  628. bne hex_have_data
  629. lda #<msg_buffer_empty
  630. ldy #>msg_buffer_empty
  631. jsr print_string
  632. rts
  633. hex_have_data:
  634. lda #<msg_hex
  635. ldy #>msg_hex
  636. jsr print_string
  637. ldy #0
  638. ldx #0
  639. hex_loop:
  640. cpy file_buffer_len
  641. beq hex_done
  642. lda FILE_BUFFER,y
  643. jsr print_hex_byte
  644. lda #' '
  645. jsr CHROUT
  646. iny
  647. inx
  648. cpx #8
  649. bne hex_loop
  650. lda #CR
  651. jsr CHROUT
  652. ldx #0
  653. jmp hex_loop
  654. hex_done:
  655. lda #CR
  656. jsr CHROUT
  657. rts
  658. do_run:
  659. lda file_buffer_len
  660. bne run_have_code
  661. lda #<msg_buffer_empty
  662. ldy #>msg_buffer_empty
  663. jsr print_string
  664. rts
  665. run_have_code:
  666. lda #<msg_run
  667. ldy #>msg_run
  668. jsr print_string
  669. jsr FILE_BUFFER
  670. rts
  671. do_rename:
  672. jsr find_argument_start
  673. bcs rename_missing_args
  674. jsr find_second_argument
  675. bcs rename_missing_args
  676. jsr build_rename_command
  677. bcs rename_missing_args
  678. lda #<msg_rename
  679. ldy #>msg_rename
  680. jsr print_string
  681. jsr print_current_target
  682. lda #CR
  683. jsr CHROUT
  684. jsr reset_file_state
  685. lda #LFN_CMD
  686. sta active_lfn
  687. ldx current_device
  688. ldy #15
  689. jsr SETLFS
  690. lda scratch_len
  691. ldx #<scratch_command
  692. ldy #>scratch_command
  693. jsr SETNAM
  694. jsr OPEN
  695. bcc rename_file_done
  696. jmp disk_open_error
  697. rename_file_done:
  698. jsr close_active_file
  699. jmp do_status
  700. rename_missing_args:
  701. lda #<msg_rename_usage
  702. ldy #>msg_rename_usage
  703. jsr print_string
  704. rts
  705. do_copy:
  706. jsr find_argument_start
  707. bcs copy_missing_args
  708. jsr find_second_argument
  709. bcs copy_missing_args
  710. jsr build_copy_command
  711. bcs copy_missing_args
  712. lda #<msg_copy
  713. ldy #>msg_copy
  714. jsr print_string
  715. jsr print_current_target
  716. lda #CR
  717. jsr CHROUT
  718. jsr reset_file_state
  719. lda #LFN_CMD
  720. sta active_lfn
  721. ldx current_device
  722. ldy #15
  723. jsr SETLFS
  724. lda scratch_len
  725. ldx #<scratch_command
  726. ldy #>scratch_command
  727. jsr SETNAM
  728. jsr OPEN
  729. bcc copy_file_done
  730. jmp disk_open_error
  731. copy_file_done:
  732. jsr close_active_file
  733. jmp do_status
  734. copy_missing_args:
  735. lda #<msg_copy_usage
  736. ldy #>msg_copy_usage
  737. jsr print_string
  738. rts
  739. exit_to_basic:
  740. jsr restore_normal_memory
  741. rts
  742. request_exit:
  743. lda #1
  744. sta exit_requested
  745. rts
  746. close_active_file:
  747. jsr CLRCH
  748. lda active_lfn
  749. jsr CLOSE
  750. lda #0
  751. sta active_lfn
  752. rts
  753. reset_file_state:
  754. jsr CLRCH
  755. jsr CLALL
  756. lda #0
  757. sta active_lfn
  758. rts
  759. disk_open_error:
  760. sta last_error
  761. jsr reset_file_state
  762. lda #<msg_disk_open_error
  763. ldy #>msg_disk_open_error
  764. jsr print_string
  765. lda last_error
  766. jsr print_hex_byte
  767. lda #CR
  768. jsr CHROUT
  769. rts
  770. disk_input_error:
  771. sta last_error
  772. jsr reset_file_state
  773. lda #<msg_disk_input_error
  774. ldy #>msg_disk_input_error
  775. jsr print_string
  776. lda last_error
  777. jsr print_hex_byte
  778. lda #CR
  779. jsr CHROUT
  780. rts
  781. parse_command:
  782. lda input_buffer
  783. bne check_help
  784. jmp command_empty
  785. check_help:
  786. lda #<cmd_help
  787. ldy #>cmd_help
  788. jsr str_equals_input
  789. bcc check_mem
  790. jmp do_help
  791. check_mem:
  792. lda #<cmd_mem
  793. ldy #>cmd_mem
  794. jsr str_equals_input
  795. bcc check_inc
  796. jmp do_mem
  797. check_inc:
  798. lda #<cmd_inc
  799. ldy #>cmd_inc
  800. jsr str_equals_input
  801. bcc check_dump
  802. jmp do_inc
  803. check_dump:
  804. lda #<cmd_dump
  805. ldy #>cmd_dump
  806. jsr str_equals_input
  807. bcc check_zero
  808. jmp do_dump
  809. check_zero:
  810. lda #<cmd_zero
  811. ldy #>cmd_zero
  812. jsr str_equals_input
  813. bcc check_sign
  814. jmp do_zero
  815. check_sign:
  816. lda #<cmd_sign
  817. ldy #>cmd_sign
  818. jsr str_equals_input
  819. bcc check_cls
  820. jmp do_sign
  821. check_cls:
  822. lda #<cmd_cls
  823. ldy #>cmd_cls
  824. jsr str_equals_input
  825. bcc check_screen
  826. jmp do_cls
  827. check_screen:
  828. lda #<cmd_screen
  829. ldy #>cmd_screen
  830. jsr str_equals_input
  831. bcc check_about
  832. jmp do_screen
  833. check_about:
  834. lda #<cmd_about
  835. ldy #>cmd_about
  836. jsr str_equals_input
  837. bcc check_dir
  838. jmp do_about
  839. check_dir:
  840. lda #<cmd_dir
  841. ldy #>cmd_dir
  842. jsr str_matches_command
  843. bcc check_status
  844. jmp do_dir
  845. check_status:
  846. lda #<cmd_status
  847. ldy #>cmd_status
  848. jsr str_equals_input
  849. bcc check_init
  850. jmp do_status
  851. check_init:
  852. lda #<cmd_init
  853. ldy #>cmd_init
  854. jsr str_equals_input
  855. bcc check_echo
  856. jmp do_init
  857. check_echo:
  858. lda #<cmd_echo
  859. ldy #>cmd_echo
  860. jsr str_matches_command
  861. bcc check_touch
  862. jmp do_echo
  863. check_touch:
  864. lda #<cmd_touch
  865. ldy #>cmd_touch
  866. jsr str_matches_command
  867. bcc check_type
  868. jmp do_touch
  869. check_type:
  870. lda #<cmd_type
  871. ldy #>cmd_type
  872. jsr str_matches_command
  873. bcc check_load
  874. jmp do_type
  875. check_load:
  876. lda #<cmd_load
  877. ldy #>cmd_load
  878. jsr str_matches_command
  879. bcc check_save
  880. jmp do_load_file
  881. check_save:
  882. lda #<cmd_save
  883. ldy #>cmd_save
  884. jsr str_matches_command
  885. bcc check_device
  886. jmp do_save_file
  887. check_device:
  888. lda #<cmd_device
  889. ldy #>cmd_device
  890. jsr str_matches_command
  891. bcc check_dev
  892. jmp do_device
  893. check_dev:
  894. lda #<cmd_dev
  895. ldy #>cmd_dev
  896. jsr str_matches_command
  897. bcc check_drive
  898. jmp do_device
  899. check_drive:
  900. lda #<cmd_drive
  901. ldy #>cmd_drive
  902. jsr str_matches_command
  903. bcc check_del
  904. jmp do_drive
  905. check_del:
  906. lda #<cmd_del
  907. ldy #>cmd_del
  908. jsr str_matches_command
  909. bcc check_erase
  910. jmp do_delete
  911. check_erase:
  912. lda #<cmd_erase
  913. ldy #>cmd_erase
  914. jsr str_matches_command
  915. bcc check_hex
  916. jmp do_delete
  917. check_hex:
  918. lda #<cmd_hex
  919. ldy #>cmd_hex
  920. jsr str_equals_input
  921. bcc check_run
  922. jmp do_hex
  923. check_run:
  924. lda #<cmd_run
  925. ldy #>cmd_run
  926. jsr str_equals_input
  927. bcc check_rename
  928. jmp do_run
  929. check_rename:
  930. lda #<cmd_rename
  931. ldy #>cmd_rename
  932. jsr str_matches_command
  933. bcc check_copy
  934. jmp do_rename
  935. check_copy:
  936. lda #<cmd_copy
  937. ldy #>cmd_copy
  938. jsr str_matches_command
  939. bcc check_exit
  940. jmp do_copy
  941. check_exit:
  942. lda #<cmd_exit
  943. ldy #>cmd_exit
  944. jsr str_matches_command
  945. bcc command_unknown
  946. jmp request_exit
  947. command_unknown:
  948. jmp do_exec
  949. command_empty:
  950. rts
  951. ; ------------------------------------------------------------
  952. ; external program loader
  953. ; ------------------------------------------------------------
  954. ; When the typed word does not match any built-in command,
  955. ; search the current disk device for a PRG file with that name.
  956. ; If found, load it to EXEC_AREA ($2000) and JSR there.
  957. ; The external program should end with RTS to return to the shell.
  958. ; All external programs must be assembled for address $2000.
  959. ; ------------------------------------------------------------
  960. do_exec:
  961. jsr build_exec_filename
  962. bcc exec_try_load
  963. jmp exec_not_found
  964. exec_try_load:
  965. jsr reset_file_state
  966. lda #LFN_DIR
  967. sta active_lfn
  968. ldx current_device
  969. ldy #1
  970. jsr SETLFS
  971. lda filename_len
  972. ldx #<filename_spec
  973. ldy #>filename_spec
  974. jsr SETNAM
  975. lda #0
  976. ldx #<EXEC_AREA
  977. ldy #>EXEC_AREA
  978. jsr LOAD
  979. bcc exec_loaded
  980. jsr reset_file_state
  981. jmp exec_not_found
  982. exec_loaded:
  983. jsr reset_file_state
  984. jsr set_os_memory
  985. lda #<msg_exec_run
  986. ldy #>msg_exec_run
  987. jsr print_string
  988. ldy #0
  989. exec_print_name:
  990. lda input_buffer,y
  991. beq exec_print_done
  992. cmp #' '
  993. beq exec_print_done
  994. jsr CHROUT
  995. iny
  996. bne exec_print_name
  997. exec_print_done:
  998. lda #CR
  999. jsr CHROUT
  1000. lda #<EXEC_AREA
  1001. sta PTR1_LO
  1002. lda #>EXEC_AREA
  1003. sta PTR1_HI
  1004. jsr call_indirect
  1005. jsr set_os_memory
  1006. rts
  1007. exec_not_found:
  1008. lda #<msg_exec_nf
  1009. ldy #>msg_exec_nf
  1010. jsr print_string
  1011. ldy #0
  1012. exec_nf_name:
  1013. lda input_buffer,y
  1014. beq exec_nf_done
  1015. cmp #' '
  1016. beq exec_nf_done
  1017. jsr CHROUT
  1018. iny
  1019. bne exec_nf_name
  1020. exec_nf_done:
  1021. lda #CR
  1022. jsr CHROUT
  1023. rts
  1024. ; JMP (PTR1) — turns a JSR into an indirect call.
  1025. ; Caller does: JSR call_indirect
  1026. ; The called code's RTS returns to call_indirect's caller.
  1027. call_indirect:
  1028. jmp (PTR1_LO)
  1029. ; build filename_spec = "{drive}:{cmdname}" from input_buffer word 0
  1030. build_exec_filename:
  1031. ldx #0
  1032. lda current_drive
  1033. clc
  1034. adc #'0'
  1035. sta filename_spec,x
  1036. inx
  1037. lda #':'
  1038. sta filename_spec,x
  1039. inx
  1040. ldy #0
  1041. exec_copy_name:
  1042. lda input_buffer,y
  1043. beq exec_name_done
  1044. cmp #' '
  1045. beq exec_name_done
  1046. sta filename_spec,x
  1047. inx
  1048. iny
  1049. cpx #35
  1050. bcc exec_copy_name
  1051. sec
  1052. rts
  1053. exec_name_done:
  1054. stx filename_len
  1055. lda #0
  1056. sta filename_spec,x
  1057. clc
  1058. rts
  1059. ; ------------------------------------------------------------
  1060. ; memory mode helpers
  1061. ; ------------------------------------------------------------
  1062. set_os_memory:
  1063. lda CPU_PORT
  1064. and #$F8
  1065. ora #$06
  1066. sta CPU_PORT
  1067. rts
  1068. restore_normal_memory:
  1069. lda CPU_PORT
  1070. and #$F8
  1071. ora #$07
  1072. sta CPU_PORT
  1073. rts
  1074. ; ------------------------------------------------------------
  1075. ; write an initial signature into RAM hidden under BASIC ROM
  1076. ; ------------------------------------------------------------
  1077. init_workspace:
  1078. lda #0
  1079. sta WORKSPACE
  1080. sta workspace_counter
  1081. sta exit_requested
  1082. sta dir_line_count
  1083. sta quote_state
  1084. sta line_had_name
  1085. sta argument_index
  1086. sta scratch_len
  1087. sta filename_len
  1088. sta parsed_number
  1089. sta temp_digit
  1090. sta temp_value
  1091. sta current_drive
  1092. sta file_buffer_len
  1093. sta file_truncated
  1094. sta pipe_found
  1095. sta pipe_index
  1096. sta argument2_index
  1097. lda #DISK_DEV
  1098. sta current_device
  1099. jsr write_signature
  1100. rts
  1101. write_signature:
  1102. ldx #0
  1103. copy_signature:
  1104. lda msg_signature,x
  1105. sta WORKSPACE + 1,x
  1106. beq workspace_done
  1107. inx
  1108. bne copy_signature
  1109. workspace_done:
  1110. rts
  1111. find_argument_start:
  1112. ldx #0
  1113. arg_seek_end:
  1114. lda input_buffer,x
  1115. beq arg_missing
  1116. cmp #' '
  1117. beq arg_skip_spaces
  1118. inx
  1119. bne arg_seek_end
  1120. arg_skip_spaces:
  1121. lda input_buffer,x
  1122. beq arg_missing
  1123. cmp #' '
  1124. bne arg_found
  1125. inx
  1126. bne arg_skip_spaces
  1127. arg_found:
  1128. stx argument_index
  1129. clc
  1130. rts
  1131. arg_missing:
  1132. sec
  1133. rts
  1134. find_second_argument:
  1135. ldy argument_index
  1136. sec_skip_first:
  1137. lda input_buffer,y
  1138. beq sec_arg_missing
  1139. cmp #' '
  1140. beq sec_find_start
  1141. iny
  1142. bne sec_skip_first
  1143. sec_find_start:
  1144. lda input_buffer,y
  1145. beq sec_arg_missing
  1146. cmp #' '
  1147. bne sec_arg_found
  1148. iny
  1149. bne sec_find_start
  1150. sec_arg_found:
  1151. sty argument2_index
  1152. clc
  1153. rts
  1154. sec_arg_missing:
  1155. sec
  1156. rts
  1157. build_scratch_command:
  1158. ldx #0
  1159. lda #'S'
  1160. sta scratch_command,x
  1161. inx
  1162. lda current_drive
  1163. clc
  1164. adc #'0'
  1165. sta scratch_command,x
  1166. inx
  1167. lda #':'
  1168. sta scratch_command,x
  1169. inx
  1170. ldy argument_index
  1171. copy_delete_name:
  1172. lda input_buffer,y
  1173. beq scratch_done
  1174. sta scratch_command,x
  1175. inx
  1176. iny
  1177. cpx #31
  1178. bcc copy_delete_name
  1179. sec
  1180. rts
  1181. scratch_done:
  1182. stx scratch_len
  1183. lda #0
  1184. sta scratch_command,x
  1185. clc
  1186. rts
  1187. build_dir_spec:
  1188. lda #'$'
  1189. sta filename_spec
  1190. lda current_drive
  1191. clc
  1192. adc #'0'
  1193. sta filename_spec + 1
  1194. lda #2
  1195. sta filename_len
  1196. lda #0
  1197. sta filename_spec + 2
  1198. rts
  1199. build_read_filename:
  1200. jsr build_drive_filename_prefix
  1201. bcs filename_build_error
  1202. lda #','
  1203. jsr append_filename_char
  1204. lda #'S'
  1205. jsr append_filename_char
  1206. lda #','
  1207. jsr append_filename_char
  1208. lda #'R'
  1209. jsr append_filename_char
  1210. bcs filename_build_error
  1211. jmp finish_filename_spec
  1212. build_write_filename:
  1213. jsr build_drive_filename_prefix
  1214. bcs filename_build_error
  1215. lda #','
  1216. jsr append_filename_char
  1217. lda #'S'
  1218. jsr append_filename_char
  1219. lda #','
  1220. jsr append_filename_char
  1221. lda #'W'
  1222. jsr append_filename_char
  1223. bcs filename_build_error
  1224. jmp finish_filename_spec
  1225. build_drive_filename_prefix:
  1226. ldx #0
  1227. lda current_drive
  1228. clc
  1229. adc #'0'
  1230. sta filename_spec,x
  1231. inx
  1232. lda #':'
  1233. sta filename_spec,x
  1234. inx
  1235. ldy argument_index
  1236. copy_filename_arg:
  1237. lda input_buffer,y
  1238. beq prefix_done
  1239. sta filename_spec,x
  1240. inx
  1241. iny
  1242. cpx #35
  1243. bcc copy_filename_arg
  1244. sec
  1245. rts
  1246. prefix_done:
  1247. stx filename_len
  1248. clc
  1249. rts
  1250. append_filename_char:
  1251. ldx filename_len
  1252. cpx #39
  1253. bcs filename_build_error
  1254. sta filename_spec,x
  1255. inx
  1256. stx filename_len
  1257. clc
  1258. rts
  1259. finish_filename_spec:
  1260. ldx filename_len
  1261. lda #0
  1262. sta filename_spec,x
  1263. clc
  1264. rts
  1265. filename_build_error:
  1266. sec
  1267. rts
  1268. ; builds R{d}:{newname}={oldname} in scratch_command
  1269. ; arg1=old (argument_index), arg2=new (argument2_index)
  1270. build_rename_command:
  1271. ldx #0
  1272. lda #'R'
  1273. sta scratch_command,x
  1274. inx
  1275. lda current_drive
  1276. clc
  1277. adc #'0'
  1278. sta scratch_command,x
  1279. inx
  1280. lda #':'
  1281. sta scratch_command,x
  1282. inx
  1283. ldy argument2_index
  1284. rename_copy_new_name:
  1285. lda input_buffer,y
  1286. beq rename_new_name_done
  1287. cmp #' '
  1288. beq rename_new_name_done
  1289. sta scratch_command,x
  1290. inx
  1291. iny
  1292. cpx #20
  1293. bcc rename_copy_new_name
  1294. sec
  1295. rts
  1296. rename_new_name_done:
  1297. lda #'='
  1298. sta scratch_command,x
  1299. inx
  1300. ldy argument_index
  1301. rename_copy_old_name:
  1302. lda input_buffer,y
  1303. beq rename_cmd_done
  1304. cmp #' '
  1305. beq rename_cmd_done
  1306. sta scratch_command,x
  1307. inx
  1308. iny
  1309. cpx #31
  1310. bcc rename_copy_old_name
  1311. sec
  1312. rts
  1313. rename_cmd_done:
  1314. stx scratch_len
  1315. lda #0
  1316. sta scratch_command,x
  1317. clc
  1318. rts
  1319. ; builds C{d}:{dstname}={d}:{srcname} in scratch_command
  1320. ; arg1=src (argument_index), arg2=dst (argument2_index)
  1321. build_copy_command:
  1322. ldx #0
  1323. lda #'C'
  1324. sta scratch_command,x
  1325. inx
  1326. lda current_drive
  1327. clc
  1328. adc #'0'
  1329. sta scratch_command,x
  1330. inx
  1331. lda #':'
  1332. sta scratch_command,x
  1333. inx
  1334. ldy argument2_index
  1335. copy_dst_name:
  1336. lda input_buffer,y
  1337. beq copy_dst_done
  1338. cmp #' '
  1339. beq copy_dst_done
  1340. sta scratch_command,x
  1341. inx
  1342. iny
  1343. cpx #16
  1344. bcc copy_dst_name
  1345. sec
  1346. rts
  1347. copy_dst_done:
  1348. lda #'='
  1349. sta scratch_command,x
  1350. inx
  1351. lda current_drive
  1352. clc
  1353. adc #'0'
  1354. sta scratch_command,x
  1355. inx
  1356. lda #':'
  1357. sta scratch_command,x
  1358. inx
  1359. ldy argument_index
  1360. copy_src_name:
  1361. lda input_buffer,y
  1362. beq copy_cmd_done
  1363. cmp #' '
  1364. beq copy_cmd_done
  1365. sta scratch_command,x
  1366. inx
  1367. iny
  1368. cpx #31
  1369. bcc copy_src_name
  1370. sec
  1371. rts
  1372. copy_cmd_done:
  1373. stx scratch_len
  1374. lda #0
  1375. sta scratch_command,x
  1376. clc
  1377. rts
  1378. parse_decimal_argument:
  1379. ldy argument_index
  1380. lda #0
  1381. sta parsed_number
  1382. parse_digit_loop:
  1383. lda input_buffer,y
  1384. beq parse_number_done
  1385. cmp #'0'
  1386. bcc parse_number_error
  1387. cmp #'9' + 1
  1388. bcs parse_number_error
  1389. sec
  1390. sbc #'0'
  1391. sta temp_digit
  1392. lda parsed_number
  1393. asl
  1394. sta temp_value
  1395. asl
  1396. asl
  1397. clc
  1398. adc temp_value
  1399. clc
  1400. adc temp_digit
  1401. sta parsed_number
  1402. iny
  1403. bne parse_digit_loop
  1404. parse_number_done:
  1405. clc
  1406. rts
  1407. parse_number_error:
  1408. sec
  1409. rts
  1410. copy_echo_to_buffer:
  1411. lda #0
  1412. sta pipe_found
  1413. sta file_buffer_len
  1414. ldy argument_index
  1415. ldx #0
  1416. echo_copy_loop:
  1417. lda input_buffer,y
  1418. beq echo_copy_done
  1419. cmp #'>'
  1420. beq echo_pipe_here
  1421. cpx #FILE_BUFFER_MAX
  1422. bcs echo_copy_done
  1423. sta FILE_BUFFER,x
  1424. inx
  1425. iny
  1426. bne echo_copy_loop
  1427. echo_pipe_here:
  1428. lda #1
  1429. sta pipe_found
  1430. sty pipe_index
  1431. echo_copy_done:
  1432. stx file_buffer_len
  1433. trim_echo_spaces:
  1434. cpx #0
  1435. beq echo_copy_finish
  1436. dex
  1437. lda FILE_BUFFER,x
  1438. cmp #' '
  1439. bne restore_echo_len
  1440. stx file_buffer_len
  1441. jmp trim_echo_spaces
  1442. restore_echo_len:
  1443. inx
  1444. stx file_buffer_len
  1445. echo_copy_finish:
  1446. ldy file_buffer_len
  1447. lda #0
  1448. sta FILE_BUFFER,y
  1449. clc
  1450. rts
  1451. rewrite_input_after_pipe:
  1452. ldy pipe_index
  1453. lda input_buffer,y
  1454. cmp #'>'
  1455. beq pipe_skip_marker
  1456. rts
  1457. pipe_skip_marker:
  1458. iny
  1459. pipe_skip_spaces:
  1460. lda input_buffer,y
  1461. beq clear_input_after_pipe
  1462. cmp #' '
  1463. bne pipe_copy_command
  1464. iny
  1465. bne pipe_skip_spaces
  1466. pipe_copy_command:
  1467. ldx #0
  1468. pipe_copy_loop:
  1469. lda input_buffer,y
  1470. beq pipe_rewrite_done
  1471. sta input_buffer,x
  1472. inx
  1473. iny
  1474. cpx #INPUT_MAX
  1475. bcc pipe_copy_loop
  1476. pipe_rewrite_done:
  1477. lda #0
  1478. sta input_buffer,x
  1479. rts
  1480. clear_input_after_pipe:
  1481. lda #0
  1482. sta input_buffer
  1483. rts
  1484. ; ------------------------------------------------------------
  1485. ; utility routines
  1486. ; ------------------------------------------------------------
  1487. print_prompt:
  1488. lda #<msg_prompt
  1489. ldy #>msg_prompt
  1490. jmp print_string
  1491. show_current_target:
  1492. lda #<msg_current_target
  1493. ldy #>msg_current_target
  1494. jsr print_string
  1495. jsr print_current_target
  1496. lda #CR
  1497. jsr CHROUT
  1498. rts
  1499. print_current_target:
  1500. lda current_device
  1501. jsr print_decimal_byte
  1502. lda #'/'
  1503. jsr CHROUT
  1504. lda current_drive
  1505. clc
  1506. adc #'0'
  1507. jsr CHROUT
  1508. rts
  1509. print_banner:
  1510. lda #CLR_HOME
  1511. jsr CHROUT
  1512. lda #<msg_banner
  1513. ldy #>msg_banner
  1514. jmp print_string
  1515. print_string:
  1516. sta PTR1_LO
  1517. sty PTR1_HI
  1518. print_loop:
  1519. ldy #0
  1520. lda (PTR1_LO),y
  1521. beq print_done
  1522. jsr CHROUT
  1523. inc PTR1_LO
  1524. bne print_loop
  1525. inc PTR1_HI
  1526. jmp print_loop
  1527. print_done:
  1528. rts
  1529. read_line:
  1530. lda #0
  1531. sta input_len
  1532. read_loop:
  1533. jsr STOPKEY
  1534. bne read_getin
  1535. jmp request_exit
  1536. read_getin:
  1537. jsr GETIN
  1538. beq read_loop
  1539. cmp #CR
  1540. beq read_done
  1541. cmp #$14
  1542. beq read_delete
  1543. ldx input_len
  1544. cpx #INPUT_MAX
  1545. bcs read_loop
  1546. jsr normalize_petscii_letter
  1547. sta input_buffer,x
  1548. inc input_len
  1549. jsr CHROUT
  1550. jmp read_loop
  1551. read_delete:
  1552. lda input_len
  1553. beq read_loop
  1554. dec input_len
  1555. lda #$14
  1556. jsr CHROUT
  1557. jmp read_loop
  1558. read_done:
  1559. ldx input_len
  1560. lda #0
  1561. sta input_buffer,x
  1562. lda #CR
  1563. jsr CHROUT
  1564. rts
  1565. str_equals_input:
  1566. sta PTR1_LO
  1567. sty PTR1_HI
  1568. lda #0
  1569. sta compare_index
  1570. compare_loop:
  1571. ldx compare_index
  1572. lda input_buffer,x
  1573. sta temp_char
  1574. ldy #0
  1575. lda (PTR1_LO),y
  1576. beq compare_end
  1577. cmp temp_char
  1578. bne compare_no
  1579. inc PTR1_LO
  1580. bne compare_next
  1581. inc PTR1_HI
  1582. compare_next:
  1583. inc compare_index
  1584. jmp compare_loop
  1585. compare_end:
  1586. ldx compare_index
  1587. lda input_buffer,x
  1588. beq compare_yes
  1589. compare_no:
  1590. clc
  1591. rts
  1592. compare_yes:
  1593. sec
  1594. rts
  1595. str_matches_command:
  1596. sta PTR1_LO
  1597. sty PTR1_HI
  1598. lda #0
  1599. sta compare_index
  1600. match_loop:
  1601. ldx compare_index
  1602. lda input_buffer,x
  1603. sta temp_char
  1604. ldy #0
  1605. lda (PTR1_LO),y
  1606. beq match_end
  1607. cmp temp_char
  1608. bne match_no
  1609. inc PTR1_LO
  1610. bne match_next
  1611. inc PTR1_HI
  1612. match_next:
  1613. inc compare_index
  1614. jmp match_loop
  1615. match_end:
  1616. ldx compare_index
  1617. lda input_buffer,x
  1618. beq match_yes
  1619. cmp #' '
  1620. beq match_yes
  1621. match_no:
  1622. clc
  1623. rts
  1624. match_yes:
  1625. sec
  1626. rts
  1627. print_hex_byte:
  1628. pha
  1629. lsr
  1630. lsr
  1631. lsr
  1632. lsr
  1633. jsr print_hex_nibble
  1634. pla
  1635. and #$0F
  1636. jsr print_hex_nibble
  1637. rts
  1638. print_hex_nibble:
  1639. cmp #10
  1640. bcc print_hex_digit
  1641. clc
  1642. adc #'A' - 10
  1643. jsr CHROUT
  1644. rts
  1645. print_hex_digit:
  1646. clc
  1647. adc #'0'
  1648. jsr CHROUT
  1649. rts
  1650. print_decimal_byte:
  1651. ldx #'0'
  1652. hundreds_loop:
  1653. cmp #100
  1654. bcc tens_setup
  1655. sec
  1656. sbc #100
  1657. inx
  1658. bne hundreds_loop
  1659. tens_setup:
  1660. stx dec_hundreds
  1661. ldx #'0'
  1662. tens_loop:
  1663. cmp #10
  1664. bcc decimal_ready
  1665. sec
  1666. sbc #10
  1667. inx
  1668. bne tens_loop
  1669. decimal_ready:
  1670. stx dec_tens
  1671. clc
  1672. adc #'0'
  1673. sta dec_ones
  1674. lda dec_hundreds
  1675. cmp #'0'
  1676. beq maybe_skip_hundreds
  1677. jsr CHROUT
  1678. lda dec_tens
  1679. jsr CHROUT
  1680. lda dec_ones
  1681. jsr CHROUT
  1682. rts
  1683. maybe_skip_hundreds:
  1684. lda dec_tens
  1685. cmp #'0'
  1686. beq print_last_digit
  1687. jsr CHROUT
  1688. lda dec_ones
  1689. jsr CHROUT
  1690. rts
  1691. print_last_digit:
  1692. lda dec_ones
  1693. jsr CHROUT
  1694. rts
  1695. normalize_petscii_letter:
  1696. cmp #'a'
  1697. bcc maybe_shifted_letter
  1698. cmp #'z' + 1
  1699. bcs maybe_shifted_letter
  1700. sec
  1701. sbc #$20
  1702. rts
  1703. maybe_shifted_letter:
  1704. cmp #$C1
  1705. bcc normalize_done
  1706. cmp #$DB
  1707. bcs normalize_done
  1708. and #$7F
  1709. normalize_done:
  1710. rts
  1711. .segment "RODATA"
  1712. msg_banner:
  1713. .byte "KERNAL OS SHELL", CR
  1714. .byte "BASIC OFF KERNAL ON I/O ON", CR
  1715. .byte "BOOT $0801 WORK $A000", CR
  1716. .byte "HELP FOR CMDS", CR, CR
  1717. .byte 0
  1718. msg_prompt:
  1719. .byte "OS> ", 0
  1720. msg_help:
  1721. .byte CR
  1722. .byte "HELP MEM INC DUMP ZERO SIGN", CR
  1723. .byte "SCREEN DIR STATUS INIT CLS", CR
  1724. .byte "ECHO TOUCH TYPE LOAD SAVE", CR
  1725. .byte "HEX RUN RENAME COPY", CR
  1726. .byte "DEVICE DEV DRIVE DEL ERASE", CR
  1727. .byte "ABOUT EXIT", CR
  1728. .byte "OTHER: LOAD+RUN PRG AT $2000", CR
  1729. .byte CR
  1730. .byte 0
  1731. msg_mode:
  1732. .byte "CPU PORT $0001 = $", 0
  1733. msg_workspace:
  1734. .byte CR, "WORK BYTE $A000 = $", 0
  1735. msg_layout:
  1736. .byte CR
  1737. .byte "$0001 LOW BITS %110", CR
  1738. .byte "$080D START $A000-$BFFF RAM", CR
  1739. .byte CR
  1740. .byte 0
  1741. msg_written:
  1742. .byte "WROTE $", 0
  1743. msg_dump:
  1744. .byte "A000:", ' ', 0
  1745. msg_zeroed:
  1746. .byte "ZEROED $A000-$A00F", CR, 0
  1747. msg_signed:
  1748. .byte "REWROTE SIGNATURE AT $A001", CR, 0
  1749. msg_about:
  1750. .byte CR
  1751. .byte "BASIC LINE 10 SYS 2061 BOOTS THIS.", CR
  1752. .byte "KERNAL STAYS MAPPED IN.", CR
  1753. .byte "SHELL CODE STARTS AT $080D.", CR
  1754. .byte "USE $A000-$BFFF AS WORK RAM.", CR
  1755. .byte "EXTERNAL CMDS LOAD AT $2000.", CR
  1756. .byte "ASSEMBLE CMDS WITH *=$2000.", CR
  1757. .byte CR
  1758. .byte 0
  1759. msg_screen:
  1760. .byte "SCREEN SIZE: ", 0
  1761. msg_status:
  1762. .byte CR, "STATUS OF TARGET ", 0
  1763. msg_init:
  1764. .byte CR, "INITIALIZING TARGET ", 0
  1765. msg_delete:
  1766. .byte CR, "SCRATCHING FILE ON TARGET ", 0
  1767. msg_delete_usage:
  1768. .byte "USAGE: DEL filename OR ERASE filename", CR, 0
  1769. msg_touch:
  1770. .byte CR, "CREATING EMPTY FILE ON TARGET ", 0
  1771. msg_touch_usage:
  1772. .byte "USAGE: TOUCH filename", CR, 0
  1773. msg_echo_usage:
  1774. .byte "USAGE: ECHO text OR ECHO text > SAVE file", CR, 0
  1775. msg_type_usage:
  1776. .byte "USAGE: TYPE filename", CR, 0
  1777. msg_load_usage:
  1778. .byte "USAGE: LOAD filename", CR, 0
  1779. msg_save_usage:
  1780. .byte "USAGE: SAVE filename", CR, 0
  1781. msg_loaded:
  1782. .byte "LOADED ", 0
  1783. msg_saved:
  1784. .byte "SAVED ", 0
  1785. msg_bytes:
  1786. .byte " BYTES", CR, 0
  1787. msg_truncated:
  1788. .byte " (TRUNCATED TO BUFFER SIZE)", CR, 0
  1789. msg_buffer_empty:
  1790. .byte "BUFFER EMPTY. USE LOAD FIRST.", CR, 0
  1791. msg_current_target:
  1792. msg_device_set:
  1793. .byte "TARGET ", 0
  1794. msg_device_usage:
  1795. .byte "USAGE: DEVICE 8-15 OR DEV 8-15", CR, 0
  1796. msg_drive_set:
  1797. .byte "TARGET ", 0
  1798. msg_drive_usage:
  1799. .byte "USAGE: DRIVE 0 OR DRIVE 1", CR, 0
  1800. msg_disk_open_error:
  1801. .byte "DISK OPEN ERROR $", 0
  1802. msg_disk_input_error:
  1803. .byte "DISK INPUT ERROR $", 0
  1804. msg_signature:
  1805. .byte "OSWORK", 0
  1806. fname_init:
  1807. .byte "I0:"
  1808. cmd_help:
  1809. .byte "HELP", 0
  1810. cmd_mem:
  1811. .byte "MEM", 0
  1812. cmd_inc:
  1813. .byte "INC", 0
  1814. cmd_dump:
  1815. .byte "DUMP", 0
  1816. cmd_zero:
  1817. .byte "ZERO", 0
  1818. cmd_sign:
  1819. .byte "SIGN", 0
  1820. cmd_cls:
  1821. .byte "CLS", 0
  1822. cmd_screen:
  1823. .byte "SCREEN", 0
  1824. cmd_about:
  1825. .byte "ABOUT", 0
  1826. cmd_dir:
  1827. .byte "DIR", 0
  1828. cmd_status:
  1829. .byte "STATUS", 0
  1830. cmd_init:
  1831. .byte "INIT", 0
  1832. cmd_echo:
  1833. .byte "ECHO", 0
  1834. cmd_touch:
  1835. .byte "TOUCH", 0
  1836. cmd_type:
  1837. .byte "TYPE", 0
  1838. cmd_load:
  1839. .byte "LOAD", 0
  1840. cmd_save:
  1841. .byte "SAVE", 0
  1842. cmd_device:
  1843. .byte "DEVICE", 0
  1844. cmd_dev:
  1845. .byte "DEV", 0
  1846. cmd_drive:
  1847. .byte "DRIVE", 0
  1848. cmd_del:
  1849. .byte "DEL", 0
  1850. cmd_erase:
  1851. .byte "ERASE", 0
  1852. cmd_exit:
  1853. .byte "EXIT", 0
  1854. cmd_hex:
  1855. .byte "HEX", 0
  1856. cmd_run:
  1857. .byte "RUN", 0
  1858. cmd_rename:
  1859. .byte "RENAME", 0
  1860. cmd_copy:
  1861. .byte "COPY", 0
  1862. msg_hex:
  1863. .byte "BUF HEX:", CR, 0
  1864. msg_run:
  1865. .byte "RUNNING $A100", CR, 0
  1866. msg_rename:
  1867. .byte CR, "RENAMING FILE ON TARGET ", 0
  1868. msg_rename_usage:
  1869. .byte "USAGE: RENAME oldname newname", CR, 0
  1870. msg_copy:
  1871. .byte CR, "COPYING FILE ON TARGET ", 0
  1872. msg_copy_usage:
  1873. .byte "USAGE: COPY srcname dstname", CR, 0
  1874. msg_exec_run:
  1875. .byte "EXEC: ", 0
  1876. msg_exec_nf:
  1877. .byte "? ", 0
  1878. .segment "BSS"
  1879. workspace_counter:
  1880. .res 1
  1881. exit_requested:
  1882. .res 1
  1883. active_lfn:
  1884. .res 1
  1885. last_error:
  1886. .res 1
  1887. dir_link_lo:
  1888. .res 1
  1889. dir_link_hi:
  1890. .res 1
  1891. dir_line_count:
  1892. .res 1
  1893. quote_state:
  1894. .res 1
  1895. line_had_name:
  1896. .res 1
  1897. argument_index:
  1898. .res 1
  1899. argument2_index:
  1900. .res 1
  1901. scratch_len:
  1902. .res 1
  1903. scratch_command:
  1904. .res 32
  1905. filename_len:
  1906. .res 1
  1907. filename_spec:
  1908. .res 40
  1909. parsed_number:
  1910. .res 1
  1911. temp_digit:
  1912. .res 1
  1913. temp_value:
  1914. .res 1
  1915. current_device:
  1916. .res 1
  1917. current_drive:
  1918. .res 1
  1919. file_buffer_len:
  1920. .res 1
  1921. file_truncated:
  1922. .res 1
  1923. pipe_found:
  1924. .res 1
  1925. pipe_index:
  1926. .res 1
  1927. input_buffer:
  1928. .res INPUT_MAX + 1
  1929. input_len:
  1930. .res 1
  1931. compare_index:
  1932. .res 1
  1933. temp_char:
  1934. .res 1
  1935. dec_hundreds:
  1936. .res 1
  1937. dec_tens:
  1938. .res 1
  1939. dec_ones:
  1940. .res 1

Powered by TurnKey Linux.