home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / ACE-R11-SCR2.ARC / SH.S < prev    next >
Encoding:
Text File  |  2019-04-13  |  23.4 KB  |  1,670 lines

  1. ;┴├┼ COMMAND SHELL BY ├RAIG ┬RUCE
  2.  
  3. .SEQ ACEHEAD.S
  4. ACE╙HELL┴DDRESS = $1300  ;╦╠╒╟┼
  5. .ORG ACE╙HELL┴DDRESS
  6. .OBJ "@0:SH"
  7.  
  8. JMP MAIN
  9. .BYTE "S","╚",ACE╔─3
  10. .BYTE 64,0 ;*STACK,RESERVED
  11.  
  12. LIBWORK = $60
  13. CHR├╥ = 13
  14. CHR╤UOTE = 34
  15. CHR╘AB = 9
  16. CHR├╠╥ = 147
  17.  
  18. STACK╨TR = $60
  19. NAME     = $62
  20. SHELL╥EDIRECT╙TDIN  .BUF 1
  21. SHELL╥EDIRECT╙TDOUT .BUF 1
  22. SHELL╥EDIRECT╙TDERR .BUF 1
  23. PARSE┴RGC .BUF 2
  24. PARSE┴RGV .BUF 2
  25. SHELL┼XIT╞LAG .BUF 1
  26. SHELL╨ROMPT╞LAG .BUF 1
  27. CHECK╨ROMPT╞LAG .BUF 1
  28. SUPPRESS╨ROMPT╞LAG .BUF 1
  29. ABORT├OMMAND╞LAG .BUF 1
  30. REGSAVE .BUF 3
  31.  
  32. ;******** SHELL ********
  33.  
  34. MAIN = *
  35.    LDA #<SHELL╘ITLE
  36.    LDY #>SHELL╘ITLE
  37.    JSR PUTS
  38.    JMP SHELL
  39.  
  40. SHELL╘ITLE .ASC "┴├┼ ╙HELL VERS 0.71.00 - ├╙┬ 25-┴PR-94"
  41.            .BYTE CHR├╥,CHR├╥,0
  42.  
  43. SHELL = *
  44.    LDA #$FF
  45.    STA CHECK╨ROMPT╞LAG
  46.    STA SHELL╥EDIRECT╙TDIN
  47.    STA SHELL╥EDIRECT╙TDOUT
  48.    STA SHELL╥EDIRECT╙TDERR
  49.    LDA #0
  50.    STA SUPPRESS╨ROMPT╞LAG
  51.  
  52.    GET├OMMAND = *
  53.    LDA #0
  54.    STA ABORT├OMMAND╞LAG
  55.    LDA CHECK╨ROMPT╞LAG
  56.    BEQ +
  57.    JSR SHELL├HECK╨ROMPTABILITY
  58. +  LDA SHELL╨ROMPT╞LAG
  59.    BEQ +
  60.    LDA SUPPRESS╨ROMPT╞LAG
  61.    BNE +
  62.    LDA #"["
  63.    LDX #STDERR
  64.    JSR PUTC
  65.    LDA #<ACE├UR─IR╬AME
  66.    LDY #>ACE├UR─IR╬AME
  67.    JSR EPUTS
  68.    LDA #<SHELL╥EADY2
  69.    LDY #>SHELL╥EADY2
  70.    JSR EPUTS
  71. +  LDA #0
  72.    STA SUPPRESS╨ROMPT╞LAG
  73.    STA SHELL┼XIT╞LAG
  74.    LDA ACE═EM╘OP+0
  75.    LDY ACE═EM╘OP+1
  76.    STA STACK╨TR+0
  77.    STY STACK╨TR+1
  78.    JSR SHELL╟ET┴RGS
  79.    BCS SHELL╞INISH
  80.    LDA PARSE┴RGC+0
  81.    ORA PARSE┴RGC+1
  82.    BEQ +
  83.    LDA ABORT├OMMAND╞LAG
  84.    BNE +
  85.    JSR SETUP╥EDIRECTS
  86.    JSR SHELL├ONSTRUCT╞RAME
  87.    JSR SHELL┼XEC├OMMAND
  88.    JSR SHELL╥EMOVE╞RAME
  89.    JSR UNSET╥EDIRECTS
  90. +  JSR CLOSE╥EDIRECTS
  91.    BIT SHELL┼XIT╞LAG
  92.    BMI SHELL╞INISH
  93.    JMP GET├OMMAND
  94.  
  95.    SHELL╞INISH = *
  96.    RTS
  97.  
  98. SHELL╥EADY2 .ASC "] "
  99.             .BYTE 0
  100.  
  101. SHELL├HECK╨ROMPTABILITY = *
  102.    LDX #0
  103.    JSR DEVINFO
  104.    LDX #$FF
  105.    CMP #0
  106.    BEQ +
  107.    LDX #0
  108. +  STX SHELL╨ROMPT╞LAG
  109.    LDA #0
  110.    STA CHECK╨ROMPT╞LAG
  111.    RTS
  112.  
  113. ;=== COMMAND PARSING ===
  114.  
  115. ARG╨TR = $02
  116. ARG╤UOTE = $03
  117. ARG╫AS╤UOTED = $04
  118.  
  119. SHELL╟ET┴RGS = *
  120.    LDA #0
  121.    STA PARSE┴RGC+0
  122.    STA PARSE┴RGC+1
  123.  
  124.    NEWARG = *
  125.    JSR GETCHAR
  126.    BCC +
  127.    JMP ARG┼OF
  128. +  CMP #" "
  129.    BEQ NEWARG
  130.    CMP #CHR╘AB
  131.    BEQ NEWARG
  132.    CMP #CHR├╥
  133.    BNE +
  134.    JMP ARG┼ND╧F╠INE
  135. +  CMP #";"
  136.    BNE +
  137.    LDA #$FF
  138.    STA SUPPRESS╨ROMPT╞LAG
  139.    JMP ARG┼ND╧F╠INE
  140. +  LDX #0
  141.    STX ARG╨TR
  142.    STX ARG╫AS╤UOTED
  143.  
  144.    ARG╬EW╤UOTE = *
  145.    LDX #0
  146.    STX ARG╤UOTE
  147.    CMP #$22
  148.    BEQ ARG╙TART╤UOTE
  149.    CMP #"'"
  150.    BNE +
  151.    ARG╙TART╤UOTE = *
  152.    STA ARG╤UOTE
  153.    STA ARG╫AS╤UOTED
  154.    JMP ARG╬EXT├HAR
  155.  
  156. +  LDX ARG╨TR
  157.    STA ARG┬UFFER,X
  158.    INC ARG╨TR
  159.  
  160.    ARG╬EXT├HAR = *
  161.    JSR GETCHAR
  162.    BCS ARG┼OF
  163.    LDX ARG╤UOTE
  164.    BNE ARG╤UOTE═ODE
  165.    CMP #" "
  166.    BEQ ARG╨ROCESS
  167.    CMP #CHR╘AB
  168.    BEQ ARG╨ROCESS
  169. -  CMP #";"
  170.    BNE +
  171.    LDX ARG╫AS╤UOTED
  172.    BNE +
  173.    LDA #$FF
  174.    STA SUPPRESS╨ROMPT╞LAG
  175.    LDA #CHR├╥
  176. +  CMP #CHR├╥
  177.    BEQ ARG╨ROCESS
  178.    LDX ARG╨TR
  179.    STA ARG┬UFFER,X
  180.    INC ARG╨TR
  181.    JMP ARG╬EXT├HAR
  182.  
  183.    ARG╤UOTE═ODE = *
  184.    CMP #0
  185.    BEQ -
  186.    CMP ARG╤UOTE
  187.    BNE -
  188.    JSR GETCHAR
  189.    BCS ARG┼OF
  190.    CMP #" "
  191.    BEQ ARG╨ROCESS
  192.    CMP #CHR╘AB
  193.    BEQ ARG╨ROCESS
  194.    CMP #CHR├╥
  195.    BEQ ARG╨ROCESS
  196.    JMP ARG╬EW╤UOTE
  197.  
  198.    ARG╨ROCESS = *
  199.    PHA
  200.    LDX ARG╨TR
  201.    LDA #0
  202.    STA ARG┬UFFER,X
  203.    JSR SHELL╚ANDLE┴RG
  204.    PLA
  205.    CMP #CHR├╥
  206.    BEQ ARG┼ND╧F╠INE
  207.    JMP NEWARG
  208.    ARG┼ND╧F╠INE = *
  209.    CLC
  210.    ARG┼OF = *
  211.    RTS
  212.  
  213. SHELL╚ANDLE┴RG = *
  214.    LDA ABORT├OMMAND╞LAG
  215.    BEQ +
  216.    RTS
  217. +  LDA ARG╫AS╤UOTED
  218.    BNE +
  219.    LDX #STDIN
  220.    LDY #"R"
  221.    LDA ARG┬UFFER
  222.    CMP #"<"
  223.    BEQ SHELL╚ANDLE╥EDIRECT
  224.    LDX #STDOUT
  225.    LDY #"W"
  226.    CMP #">"
  227.    BEQ SHELL╚ANDLE╥EDIRECT
  228.    JSR CHECK╫ILDCARDS
  229.    BCC +
  230.    RTS
  231. +  JSR SHELL╙TORE┴RG
  232.    RTS
  233.  
  234. SHELL╙TORE┴RG = *
  235.    LDA STACK╨TR+0
  236.    LDY STACK╨TR+1
  237.    CLC
  238.    SBC ARG╨TR
  239.    BCS +
  240.    DEY
  241. +  STA STACK╨TR+0
  242.    STY STACK╨TR+1
  243.    STA ZP+0
  244.    STY ZP+1
  245.    LDY #0
  246. -  LDA ARG┬UFFER,Y
  247.    STA (ZP),Y
  248.    BEQ +
  249.    INY
  250.    BNE -
  251. +  LDA PARSE┴RGC+1
  252.    STA ZP+1
  253.    LDA PARSE┴RGC+0
  254.    ASL
  255.    ROL ZP+1
  256.    CLC
  257.    ADC #<ARG┴RGV┬UFFER
  258.    STA ZP+0
  259.    LDA ZP+1
  260.    ADC #>ARG┴RGV┬UFFER
  261.    STA ZP+1
  262.    LDY #0
  263.    LDA STACK╨TR+0
  264.    STA (ZP),Y
  265.    INY
  266.    LDA STACK╨TR+1
  267.    STA (ZP),Y
  268.    INC PARSE┴RGC+0
  269.    BNE +
  270.    INC PARSE┴RGC+1
  271. +  RTS
  272.  
  273. SHELL╚ANDLE╥EDIRECT = *   ;( .╪=FD, .┘=MODE )
  274.    LDA #<ARG┬UFFER+1
  275.    STA ZP
  276.    LDA #>ARG┬UFFER+1
  277.    STA ZP+1
  278.    LDA ARG┬UFFER+1
  279.    CMP #">"
  280.    BNE +
  281.    JSR SHELL╥EDIR╔NC
  282.    LDY #"A"
  283.    LDA ARG┬UFFER+2
  284. +  CMP #"!"
  285.    BNE +
  286. -  LDX #STDERR
  287.    JSR SHELL╥EDIR╔NC
  288.    LDA #0
  289. +  CMP #"&"
  290.    BEQ -
  291.    LDA SHELL╥EDIRECT╙TDIN,X
  292.    CMP #255
  293.    BNE REDIRECT═ULTI┼RROR
  294.    TYA
  295.    STX CMD┬UFFER
  296.    STA REGSAVE
  297. -  JSR OPEN
  298.    BCC ++
  299.    LDA ERRNO
  300.    CMP #ACE┼RR╞ILE┼XISTS
  301.    BNE +
  302.    JSR REMOVE
  303.    BCS REDIRECT┼RROR
  304.    LDA REGSAVE
  305.    JMP -
  306. +  CMP #ACE┼RR╞ILE╬OT╞OUND
  307.    BNE REDIRECT┼RROR
  308.    LDA REGSAVE
  309.    CMP #"A"
  310.    BNE REDIRECT┼RROR
  311.    LDA #"W"
  312.    STA REGSAVE
  313.    JMP -
  314. +  LDX CMD┬UFFER
  315.    STA SHELL╥EDIRECT╙TDIN,X
  316.    RTS
  317.  
  318. REDIRECT┼RROR = *
  319.    LDA #<REDIRECT┼RROR═SG
  320.    LDY #>REDIRECT┼RROR═SG
  321. REDIRECT┼RROR╫MSG = *
  322.    PHA
  323.    TYA
  324.    PHA
  325.    LDA #$FF
  326.    STA ABORT├OMMAND╞LAG
  327.    LDA ZP+0
  328.    LDY ZP+1
  329.    JSR EPUTS
  330.    PLA
  331.    TAY
  332.    PLA
  333.    JSR EPUTS
  334.    RTS
  335.  
  336.    REDIRECT┼RROR═SG = *
  337.    .ASC ": ┼RROR OPENING REDIRECTION FILE."
  338.    .BYTE CHR├╥,0
  339.  
  340. REDIRECT═ULTI┼RROR = *
  341.    LDA #<REDIRECT═ULTI┼RROR═SG
  342.    LDY #>REDIRECT═ULTI┼RROR═SG
  343.    JMP REDIRECT┼RROR╫MSG
  344.  
  345.    REDIRECT═ULTI┼RROR═SG = *
  346.    .ASC ": ┼RROR - ═ULTIPLE REDIRECTIONS OF SAME STREAM."
  347.    .BYTE CHR├╥,0
  348.  
  349. SHELL╥EDIR╔NC = *
  350.    INC ZP+0
  351.    BNE +
  352.    INC ZP+1
  353. +  RTS
  354.  
  355. SHELL╙ETUP╥ED = 2
  356.  
  357. SETUP╥EDIRECTS = *
  358. UNSET╥EDIRECTS = *
  359.    LDX #0
  360.    STX SHELL╙ETUP╥ED
  361. -  LDA SHELL╥EDIRECT╙TDIN,X
  362.    CMP #255
  363.    BEQ +
  364.    TAY
  365.    JSR FDSWAP
  366. +  INC SHELL╙ETUP╥ED
  367.    LDX SHELL╙ETUP╥ED
  368.    CPX #3
  369.    BCC -
  370.    RTS
  371.  
  372. SHELL├LOSE╥ED = 2
  373.  
  374. CLOSE╥EDIRECTS = *
  375.    LDX #0
  376.    STX SHELL├LOSE╥ED
  377. -  LDA SHELL╥EDIRECT╙TDIN,X
  378.    CMP #$FF
  379.    BEQ +
  380.    JSR CLOSE
  381.    LDX SHELL├LOSE╥ED
  382.    LDA #$FF
  383.    STA SHELL╥EDIRECT╙TDIN,X
  384. +  INC SHELL├LOSE╥ED
  385.    LDX SHELL├LOSE╥ED
  386.    CPX #3
  387.    BCC -
  388.    RTS
  389.  
  390. WILD╨REFIX = 10
  391. WILD╙UFFIX = 11
  392.  
  393. CHECK╫ILDCARDS = *
  394.    LDA #255
  395.    STA WILD╨REFIX
  396.    STA WILD╙UFFIX
  397.    LDX ARG╨TR
  398. -  DEX
  399.    CPX #255
  400.    BEQ +
  401.    LDA ARG┬UFFER,X
  402.    CMP #":"
  403.    BEQ +
  404.    CMP #"*"
  405.    BNE -
  406.    LDY WILD╙UFFIX
  407.    CPY #255
  408.    BNE -
  409.    STX WILD╙UFFIX
  410.    INC WILD╙UFFIX
  411.    JMP -
  412. +  INX
  413.    STX WILD╨REFIX
  414.    LDA WILD╙UFFIX
  415.    CMP #255
  416.    BNE +
  417.    CLC
  418.    RTS
  419. +  JSR HANDLE╫ILDCARDS
  420.    SEC
  421.    RTS
  422.  
  423. WILD╠ENGTH = 12
  424. WILD╙UFFIX╠ENGTH = 13
  425. WILD╞CB = 14
  426. WILD═ATCH = 15
  427.  
  428. HANDLE╫ILDCARDS = *
  429.    LDA #0
  430.    STA WILD═ATCH
  431.    LDX ARG╨TR
  432.    INX
  433. -  DEX
  434.    LDA ARG┬UFFER,X
  435.    STA CMD┬UFFER+1,X
  436.    CPX WILD╨REFIX
  437.    BNE -
  438.    LDA #0
  439.    STA CMD┬UFFER,X
  440.    STA ARG┬UFFER,X
  441.    LDX WILD╙UFFIX
  442.    STA CMD┬UFFER,X
  443.    INC WILD╨REFIX
  444.    INC WILD╙UFFIX
  445.    LDX #0
  446. -  LDA ARG┬UFFER,X
  447.    BEQ +
  448.    STA CMD┬UFFER,X
  449.    INX
  450.    BNE -
  451. +  SEC
  452.    LDA ARG╨TR
  453.    SBC WILD╙UFFIX
  454.    STA WILD╙UFFIX╠ENGTH
  455.    INC WILD╙UFFIX╠ENGTH
  456.    SEC
  457.    LDA ARG╨TR
  458.    SBC WILD╨REFIX
  459.    STA WILD╠ENGTH
  460.  
  461.    LDA #<CMD┬UFFER
  462.    LDY #>CMD┬UFFER
  463.    STA ZP+0
  464.    STY ZP+1
  465.    JSR DIROPEN
  466.    BCS NO═ATCH
  467.    STA WILD╞CB
  468.    LDX WILD╞CB
  469.    JSR DIRREAD
  470.    BCS +
  471.    BEQ +
  472.    JSR SCAN╫ILDCARD
  473. +  LDA WILD╞CB
  474.    JSR DIRCLOSE
  475.    LDA WILD═ATCH
  476.    BNE +
  477.    NO═ATCH = *
  478.    LDA #$FF
  479.    STA ABORT├OMMAND╞LAG
  480.    LDA #<NO═ATCH═SG
  481.    LDY #>NO═ATCH═SG
  482.    JSR EPUTS
  483. +  RTS
  484.  
  485. NO═ATCH═SG = *
  486.    .ASC "╬O MATCH FOR WILDCARD"
  487.    .BYTES CHR├╥,0
  488.  
  489. SCAN╫ILDCARD = *
  490.    LDX WILD╞CB
  491.    JSR DIRREAD
  492.    BCS +
  493.    BNE ++
  494. +  RTS
  495. +  LDA ACE─IRENT╬AME
  496.    BNE +
  497.    RTS
  498. +  LDA ACE─IRENT╒SAGE
  499.    AND #%00010000
  500.    BNE SCAN╫ILDCARD
  501.    LDA ACE─IRENT╬AME╠EN
  502.    CMP WILD╠ENGTH
  503.    BCC SCAN╫ILDCARD
  504.    LDX WILD╨REFIX
  505.    LDY #0
  506.    JSR SUBSTR├MP
  507.    BCS SCAN╫ILDCARD
  508.    LDX WILD╙UFFIX
  509.    SEC
  510.    LDA ACE─IRENT╬AME╠EN
  511.    SBC WILD╙UFFIX╠ENGTH
  512.    TAY
  513.    JSR SUBSTR├MP
  514.    BCS SCAN╫ILDCARD
  515.  
  516.    LDX #0
  517. -  LDA CMD┬UFFER,X
  518.    BEQ +
  519.    STA ARG┬UFFER,X
  520.    INX
  521.    BNE -
  522. +  LDY #0
  523. -  LDA ACE─IRENT╬AME,Y
  524.    STA ARG┬UFFER,X
  525.    BEQ +
  526.    INX
  527.    INY
  528.    BNE -
  529. +  LDA ACE─IRENT╘YPE
  530.    CMP #"S"
  531.    BEQ +
  532.    STA ARG┬UFFER+1,X
  533.    LDA #","
  534.    STA ARG┬UFFER,X
  535.    INX
  536.    INX
  537.    LDA #0
  538.    STA ARG┬UFFER,X
  539. +  STX ARG╨TR
  540.    JSR SHELL╙TORE┴RG
  541.    LDA #$FF
  542.    STA WILD═ATCH
  543.    JMP SCAN╫ILDCARD
  544.  
  545. SUBSTR├MP = *  ;( .╪=CMDBUF╧FF, .┘=DIRENT╬AME╧FF ) : .├├=MATCH
  546. -  LDA CMD┬UFFER,X
  547.    BNE +
  548.    CLC
  549.    RTS
  550. +  CMP ACE─IRENT╬AME,Y
  551.    BNE +
  552.    INY
  553.    INX
  554.    BNE -
  555. +  SEC
  556.    RTS
  557.  
  558. ;=== STACK MANAGEMENT ===
  559.  
  560. FRAME┴RGV╙OURCE = $02
  561. FRAME┴RGV─EST = $04
  562. FRAME┴RGV┬YTES = $06
  563.  
  564. SHELL├ONSTRUCT╞RAME = *
  565.    ;** PUSH THE ┌┼╥╧ TRAILER ARGV
  566.    SEC
  567.    LDA STACK╨TR+0
  568.    SBC #2
  569.    STA STACK╨TR+0
  570.    BCS +
  571.    DEC STACK╨TR+1
  572. +  LDY #0
  573.    LDA #0
  574.    STA (STACK╨TR),Y
  575.    INY
  576.    STA (STACK╨TR),Y
  577.  
  578.    ;** PUSH ARGV[] ARRAY HERE
  579.    LDA PARSE┴RGC+0
  580.    LDY PARSE┴RGC+1
  581.    STY FRAME┴RGV┬YTES+1
  582.    ASL
  583.    STA FRAME┴RGV┬YTES+0
  584.    ROL FRAME┴RGV┬YTES+1
  585.    SEC
  586.    LDA STACK╨TR+0
  587.    SBC FRAME┴RGV┬YTES+0
  588.    STA STACK╨TR+0
  589.    STA FRAME┴RGV─EST+0
  590.    LDA STACK╨TR+1
  591.    SBC FRAME┴RGV┬YTES+1
  592.    STA STACK╨TR+1
  593.    STA FRAME┴RGV─EST+1
  594.    LDA #<ARG┴RGV┬UFFER
  595.    LDY #>ARG┴RGV┬UFFER
  596.    STA FRAME┴RGV╙OURCE+0
  597.    STY FRAME┴RGV╙OURCE+1
  598. -  LDA FRAME┴RGV┬YTES+0
  599.    ORA FRAME┴RGV┬YTES+1
  600.    BEQ FRAME╙ET┴RGV╨TR
  601.    LDY #0
  602.    LDA (FRAME┴RGV╙OURCE),Y
  603.    STA (FRAME┴RGV─EST),Y
  604.    INC FRAME┴RGV╙OURCE+0
  605.    BNE +
  606.    INC FRAME┴RGV╙OURCE+1
  607. +  INC FRAME┴RGV─EST+0
  608.    BNE +
  609.    INC FRAME┴RGV─EST+1
  610. +  LDA FRAME┴RGV┬YTES+0
  611.    BNE +
  612.    DEC FRAME┴RGV┬YTES+1
  613. +  DEC FRAME┴RGV┬YTES+0
  614.    JMP -
  615.  
  616.    ;** SET ARGV POINTER
  617.    FRAME╙ET┴RGV╨TR = *
  618.    LDA STACK╨TR+0
  619.    LDY STACK╨TR+1
  620.    STA PARSE┴RGV+0
  621.    STY PARSE┴RGV+1
  622.    ;** PUT UN-REDIRECTION INFO INTO [MP]
  623.    LDA SHELL╥EDIRECT╙TDIN
  624.    LDX SHELL╥EDIRECT╙TDOUT
  625.    LDY SHELL╥EDIRECT╙TDERR
  626.    STA MP+0
  627.    STX MP+1
  628.    STY MP+2
  629.    RTS
  630.  
  631. SHELL╥EMOVE╞RAME = *
  632.    ;** RECOVER UN-REDIRECTION INFO FROM [MP]
  633.    LDA MP+0
  634.    LDX MP+1
  635.    LDY MP+2
  636.    STA SHELL╥EDIRECT╙TDIN
  637.    STX SHELL╥EDIRECT╙TDOUT
  638.    STY SHELL╥EDIRECT╙TDERR
  639.    RTS
  640.  
  641. ;=== DISPATCH ===
  642.  
  643. DISP┴RGV = $02
  644. DISP┴RG╨TR = $04
  645. DISP╓ECTOR = $02
  646.  
  647. SHELL┼XEC├OMMAND = *
  648.    ;** FETCH THE COMMAND NAME
  649.    LDA PARSE┴RGV+0
  650.    LDY PARSE┴RGV+1
  651.    STA DISP┴RGV+0
  652.    STY DISP┴RGV+1
  653.    LDY #1
  654. -  LDA (DISP┴RGV),Y
  655.    STA DISP┴RG╨TR,Y
  656.    DEY
  657.    BPL -
  658.    LDY #0
  659. -  LDA (DISP┴RG╨TR),Y
  660.    STA ARG┬UFFER,Y
  661.    BEQ +
  662.    INY
  663.    BNE -
  664.  
  665.    ;** SEARCH INTERNAL DISPATCH TABLE FOR NAME
  666. +  LDY #0
  667.    DISP├MP├OMMAND = *
  668.    LDA DISP╘ABLE,Y
  669.    BEQ SHELL╠OAD┼XTERNAL
  670.    LDX #0
  671. -  LDA ARG┬UFFER,X
  672.    CMP DISP╘ABLE,Y
  673.    BNE +
  674.    CMP #0
  675.    BEQ DISP═ATCH
  676.    INX
  677.    INY
  678.    BNE -
  679.    BRK
  680. +  DEY
  681. -  INY
  682.    LDA DISP╘ABLE,Y
  683.    BNE -
  684.    INY
  685.    INY
  686.    INY
  687.    JMP DISP├MP├OMMAND
  688.  
  689.    DISP═ATCH = *
  690.    LDA DISP╘ABLE+1,Y
  691.    PHA
  692.    LDA DISP╘ABLE+2,Y
  693.    TAY
  694.    PLA
  695.    JSR DISP╙ETUP
  696.    JMP EXECSUB
  697.  
  698.    DISP╙ETUP = *  ;( (.┴┘)=ZP CONTENTS ) : ZP, ZW, .┴┘=ARGC
  699.    STA ZP+0
  700.    STY ZP+1
  701.    LDA PARSE┴RGV+0
  702.    LDY PARSE┴RGV+1
  703.    STA ZW+0
  704.    STY ZW+1
  705.    LDA PARSE┴RGC+0
  706.    LDY PARSE┴RGC+1
  707.    RTS
  708.  
  709. ;** LOAD EXTERNAL FILE INTO TRANSIENT PROGRAM AREA
  710. LOAD╨ATH = 2
  711. LOAD╨ATH╨OS = 4
  712. LOAD╟IVE╒P = 7
  713.  
  714. SHELL╠OAD┼XTERNAL = *
  715.    LDA #0
  716.    STA ACE┴PP┴DDRESS+3
  717.    LDA #0
  718.    STA LOAD╨ATH╨OS
  719.    STA LOAD╟IVE╒P
  720.    LDA #<ACE╙HELL╨ATH
  721.    LDY #>ACE╙HELL╨ATH
  722.    STA LOAD╨ATH+0
  723.    STY LOAD╨ATH+1
  724.  
  725.    SHELL╘RY╠OAD┴GAIN = *
  726.    LDY LOAD╨ATH╨OS
  727.    LDA (LOAD╨ATH),Y
  728.    BEQ DISP├MD╬OT╞OUND
  729.    LDA LOAD╟IVE╒P
  730.    BNE DISP├MD╬OT╞OUND
  731.    LDA PARSE┴RGV+0
  732.    LDY PARSE┴RGV+1
  733.    STA ZW+0
  734.    STY ZW+1
  735.    LDY #0
  736.    LDA (ZW),Y
  737.    STA ZP+0
  738.    STA NAME+0
  739.    INY
  740.    LDA (ZW),Y
  741.    STA ZP+1
  742.    STA NAME+1
  743.    JSR GET╠OAD╨ATHNAME
  744.    LDA #<ACE┴PP┴DDRESS
  745.    LDY #>ACE┴PP┴DDRESS
  746.    JSR BLOAD
  747.    BCS DISP╠OAD┼RROR
  748.    LDA ACE┴PP┴DDRESS+3
  749.    CMP #ACE╔─1
  750.    BNE DISP┬AD╨ROG
  751.    LDA ACE┴PP┴DDRESS+4
  752.    CMP #ACE╔─2
  753.    BNE DISP┬AD╨ROG
  754.    LDA ACE┴PP┴DDRESS+5
  755.    CMP #ACE╔─3
  756.    BNE DISP┬AD╨ROG
  757.    LDA #<ACE┴PP┴DDRESS
  758.    LDY #>ACE┴PP┴DDRESS
  759.    JSR DISP╙ETUP
  760.    JMP EXECSUB
  761.  
  762.    DISP┬AD╨ROG = *
  763.    LDA NAME+0
  764.    LDY NAME+1
  765.    JSR EPUTS
  766.    LDA #<DISP┬AD╨ROG═SG
  767.    LDY #>DISP┬AD╨ROG═SG
  768.    JSR EPUTS
  769.    RTS
  770.  
  771.    DISP╠OAD┼RROR = *
  772.    LDA ERRNO
  773.    CMP #ACE┼RR╞ILE╬OT╞OUND
  774.    BEQ SHELL╘RY╠OAD┴GAIN
  775.    CMP #ACE┼RR─EVICE╬OT╨RESENT
  776.    BEQ SHELL╘RY╠OAD┴GAIN
  777.    LDA NAME+0
  778.    LDY NAME+1
  779.    JSR EPUTS
  780.    LDA #<DISP╠OAD┼RROR═SG1
  781.    LDY #>DISP╠OAD┼RROR═SG1
  782.    JMP EPUTS
  783.  
  784.    DISP├MD╬OT╞OUND = *
  785.    LDA NAME+0
  786.    LDY NAME+1
  787.    JSR EPUTS
  788.    LDA #<DISP╠OAD┼RROR═SG2
  789.    LDY #>DISP╠OAD┼RROR═SG2
  790.    JMP EPUTS
  791.    DISP╠OAD┼RROR═SG1 = *
  792.    .ASC ": ┼XTERNAL PROGRAM LOAD ERROR"
  793.    .BYTE CHR├╥,0
  794.    DISP╠OAD┼RROR═SG2 = *
  795.    .ASC ": ├OMMAND NOT FOUND"
  796.    .BYTE CHR├╥,0
  797.    DISP┬AD╨ROG═SG = *
  798.    .ASC ": ┬AD EXTERNAL PROGRAM FORMAT"
  799.    .BYTE CHR├╥,0
  800.  
  801. GET╠OAD╨ATHNAME = *
  802.    LDY LOAD╨ATH╨OS
  803.    LDX #0
  804. -  LDA (LOAD╨ATH),Y
  805.    BEQ +
  806.    STA CMD┬UFFER,X
  807.    INY
  808.    INX
  809.    BNE -
  810. +  INY
  811.    STY LOAD╨ATH╨OS
  812.    LDY #1
  813.    LDA (ZP),Y
  814.    CMP #":"
  815.    BEQ +
  816.    DEY
  817.    LDA (ZP),Y
  818.    CMP #"/"
  819.    BNE GET╨ATH╥EALLY
  820. +  STA LOAD╟IVE╒P
  821.    LDX #0
  822.  
  823.    GET╨ATH╥EALLY = *
  824.    LDY #0
  825. -  LDA (ZP),Y
  826.    STA CMD┬UFFER,X
  827.    BEQ +
  828.    INX
  829.    INY
  830.    BNE -
  831. +  LDA #<CMD┬UFFER
  832.    LDY #>CMD┬UFFER
  833.    STA ZP+0
  834.    STY ZP+1
  835.    RTS
  836.  
  837. ;===INTERNAL COMMAND NAME AND DISPATCH TABLE===
  838.  
  839. DISP╘ABLE = *
  840. .ASC "ECHO"
  841. .BYTE 0
  842. .WORD ECHO
  843. .ASC "SH"
  844. .BYTE 0
  845. .WORD SHELL├MD
  846. .ASC "DIR"
  847. .BYTE 0
  848. .WORD DIR╫ITH├LS
  849. .ASC "D"
  850. .BYTE 0
  851. .WORD DIR
  852. .ASC "LS"
  853. .BYTE 0
  854. .WORD LS
  855. .ASC "CD"
  856. .BYTE 0
  857. .WORD CD
  858. .ASC "CAT"
  859. .BYTE 0
  860. .WORD CAT
  861. .ASC "CLS"
  862. .BYTE 0
  863. .WORD CLS
  864. .ASC "CLEAR"
  865. .BYTE 0
  866. .WORD CLS
  867. .ASC "EXIT"
  868. .BYTE 0
  869. .WORD SHELL┼XIT
  870. .ASC "X"
  871. .BYTE 0
  872. .WORD SHELL┼XIT
  873. .ASC "CLSL"
  874. .BYTE 0
  875. .WORD LS╫ITH├LS
  876. .ASC "@"
  877. .BYTE 0
  878. .WORD DOS
  879. .ASC "DOS"
  880. .BYTE 0
  881. .WORD DOS
  882. .ASC "PATH"
  883. .BYTE 0
  884. .WORD PATH
  885.  
  886. .BYTE 0
  887.  
  888. ;===ECHO===
  889. ECHO┴RGV = $02
  890. ECHO╙PACE = $04
  891. ECHO╘EMP = $06
  892.  
  893. ECHO = *
  894.    LDA #0
  895.    STA ECHO╙PACE
  896.    LDA ACE┴RGV+0
  897.    LDY ACE┴RGV+1
  898.  
  899.    ECHO╬EW┴RG = *
  900.    CLC
  901.    ADC #2
  902.    BCC +
  903.    INY
  904. +  STA ECHO┴RGV+0
  905.    STY ECHO┴RGV+1
  906.    LDY #0
  907.    LDA (ECHO┴RGV),Y
  908.    STA ECHO╘EMP+0
  909.    INY
  910.    LDA (ECHO┴RGV),Y
  911.    STA ECHO╘EMP+1
  912.    ORA ECHO╘EMP+0
  913.    BEQ ECHO┼XIT
  914.    LDA #" "
  915.    CMP ECHO╙PACE
  916.    BNE +
  917.    JSR PUTCHAR
  918. +  LDA #" "
  919.    STA ECHO╙PACE
  920.    LDA ECHO╘EMP+0
  921.    LDY ECHO╘EMP+1
  922.    JSR PUTS
  923.    LDA ECHO┴RGV+0
  924.    LDY ECHO┴RGV+1
  925.    JMP ECHO╬EW┴RG
  926.    
  927.    ECHO┼XIT = *
  928.    LDA #CHR├╥
  929.    JSR PUTCHAR
  930.    RTS
  931.  
  932. ;===COPY PARAMETERS===
  933. COPY┬UFFER╨TR = $02
  934. COPY┬UFFER╠ENGTH = $04
  935.  
  936. GET┬UFFER╨ARMS = *
  937.    LDA #<COPY┬UFFER
  938.    LDY #>COPY┬UFFER
  939.    STA COPY┬UFFER╨TR+0
  940.    STY COPY┬UFFER╨TR+1
  941.    SEC
  942.    LDA ACE═EM╘OP+0
  943.    SBC COPY┬UFFER╨TR+0
  944.    STA COPY┬UFFER╠ENGTH+0
  945.    LDA ACE═EM╘OP+1
  946.    SBC COPY┬UFFER╨TR+1
  947.    STA COPY┬UFFER╠ENGTH+1
  948.    RTS
  949.  
  950. GETARG = *
  951.    STY ZP+1
  952.    ASL
  953.    STA ZP+0
  954.    ROL ZP+1
  955.    CLC
  956.    LDA ACE┴RGV+0
  957.    ADC ZP+0
  958.    STA ZP+0
  959.    LDA ACE┴RGV+1
  960.    ADC ZP+1
  961.    STA ZP+1
  962.    LDY #0
  963.    LDA (ZP),Y
  964.    TAX
  965.    INY
  966.    LDA (ZP),Y
  967.    STX ZP+0
  968.    STA ZP+1
  969.    RTS
  970.  
  971. ;===DIR===
  972. DIR╞CB = $02
  973. DIR├OLUMNS = $03
  974. DIR├UR├OL = $04
  975. DIR╠ONG = $05
  976. DIR╙PACES = $06
  977. DIRLINE╠EN = $07
  978. DIR├H├OLS = $08
  979.  
  980. DIR╫ITH├LS = *
  981.    JSR CLS
  982.    JMP DIR
  983.  
  984. LS╫ITH├LS = *
  985.    JSR CLS
  986.    JMP LS
  987.  
  988. LS = *
  989.    LDX #1
  990.    JSR DEVINFO
  991.    STX DIR├H├OLS
  992.    CMP #0
  993.    BNE +
  994.    TXA
  995.    LDX #$FF
  996. -  INX
  997.    SBC #20
  998.    BCS -
  999.    TXA
  1000.    BNE LS╙ET├OLS
  1001.  
  1002. +  LDA #1
  1003.    LS╙ET├OLS = *
  1004.    STA DIR├OLUMNS
  1005.    LDA #0
  1006.    STA DIR╠ONG
  1007.    JMP DIR├OMMON
  1008.  
  1009. DIR = *
  1010.    LDX #1
  1011.    JSR DEVINFO
  1012.    STX DIR├H├OLS
  1013.    LDA #1
  1014.    STA DIR├OLUMNS
  1015.    LDA #$FF
  1016.    STA DIR╠ONG
  1017.  
  1018. DIR├OMMON = *
  1019.    LDA #0
  1020.    STA DIR├UR├OL
  1021.    LDA #<DIR─EFAULT─IRECTORY
  1022.    LDY #>DIR─EFAULT─IRECTORY
  1023.    STA ZP
  1024.    STY ZP+1
  1025.    LDA ACE┴RGC+1
  1026.    BNE +
  1027.    LDA ACE┴RGC+0
  1028.    CMP #2
  1029.    BCC DIR╟OT╬AME
  1030. +  LDA #1
  1031.    LDY #0
  1032.    JSR GETARG
  1033.  
  1034.    DIR╟OT╬AME = *
  1035.    JSR DIROPEN
  1036.    BCC +
  1037.    RTS
  1038. +  STA DIR╞CB
  1039.    LDX DIR╞CB
  1040.    JSR DIRREAD
  1041.    BCS DIR┼XIT
  1042.    BEQ DIR┼XIT
  1043.    JSR STOPKEY
  1044.    BCS DIR┼XIT
  1045.    LDA DIR╠ONG
  1046.    BPL +
  1047.    JSR DIR─ISPLAY╚EADING
  1048. /  LDX DIR╞CB 
  1049.    JSR DIRREAD
  1050.    BCS DIR┼XIT
  1051.    BEQ DIR┼XIT
  1052.    JSR STOPKEY
  1053.    BCS DIR┼XIT
  1054.    LDA ACE─IRENT╬AME
  1055.    BEQ DIR╘RAILER┼XIT
  1056.    LDA ACE─IRENT╒SAGE
  1057.    AND #%00010000
  1058.    BNE -
  1059.    JSR DIR─ISPLAY
  1060.    JMP -
  1061.  
  1062.    DIR╘RAILER┼XIT = *
  1063.    LDA DIR╠ONG
  1064.    BPL DIR┼XIT
  1065.    JSR DIR─ISPLAY╘RAILER
  1066.  
  1067.    DIR┼XIT = *
  1068.    LDA DIR├UR├OL
  1069.    BEQ +
  1070.    LDA #CHR├╥
  1071.    JSR PUTCHAR
  1072. +  LDA DIR╞CB
  1073.    JMP CLOSE
  1074.  
  1075.    DIR─EFAULT─IRECTORY = *
  1076.    .ASC ".:"
  1077.    .BYTE 0
  1078.  
  1079. DIR─ISPLAY = *
  1080.    BIT DIR╠ONG
  1081.    BMI +
  1082.    JMP DIR─ISPLAY╙HORT
  1083. +  JSR DIR╙ETUP─IRLINE
  1084.    LDA #<DIRLINE
  1085.    LDY #>DIRLINE
  1086.    STA ZP
  1087.    STY ZP+1
  1088.    LDA DIRLINE╠EN
  1089.    LDY #0
  1090.    LDX #STDOUT
  1091.    JMP WRITE
  1092.  
  1093. ;*            0000000000111111111122222222223333333333444444444455555555556666
  1094. ;*       POS: 0123456789012345678901234567890123456789012345678901234567890123
  1095. DIRLINE .ASC "DRWX*E-T  00-╪XX-00  12:00A 12345678 *╙┼╤  1234567890123456"
  1096.         .BYTE CHR├╥,0
  1097. DIR╞LAG╬AMES .ASC "DRWX*E-T"
  1098. DIR─ATE╙TR .ASC "  00-╪XX-00  12:00A "
  1099. DIR─ATE┼ND = *
  1100.  
  1101. DIR╙ETUP─IRLINE = *
  1102.    ;** FLAGS
  1103.    LDX #0
  1104.    LDA ACE─IRENT╞LAGS
  1105. -  ASL
  1106.    PHA
  1107.    LDA #"-"
  1108.    BCC +
  1109.    LDA DIR╞LAG╬AMES,X
  1110. +  STA DIRLINE+0,X
  1111.    PLA
  1112.    INX
  1113.    CPX #8
  1114.    BCC -
  1115.    ;** DATE
  1116.    LDX #DIR─ATE┼ND-DIR─ATE╙TR-1
  1117. -  LDA DIR─ATE╙TR,X
  1118.    STA DIRLINE+8,X
  1119.    DEX
  1120.    BPL -
  1121.    ;** BYTES
  1122.    LDA ACE─IRENT┬YTES+0
  1123.    LDY ACE─IRENT┬YTES+1
  1124.    LDX ACE─IRENT┬YTES+2
  1125.    JSR ITOA
  1126.    LDY #28
  1127.    LDA DIR├H├OLS
  1128.    CMP #59
  1129.    BCS +
  1130.    LDY #8
  1131. +  LDX #0
  1132. -  LDA ITOA╬UMBER,X
  1133.    STA DIRLINE,Y
  1134.    INY
  1135.    INX
  1136.    CPX #8
  1137.    BCC -
  1138.    LDA #" "
  1139.    STA DIRLINE,Y
  1140.    INY
  1141.    ;** UNCLOSED FLAG
  1142.    LDA DIRLINE+4
  1143.    CMP #"-"
  1144.    BNE +
  1145.    LDA #" "
  1146. +  STA DIRLINE,Y
  1147.    INY
  1148.    ;** FILETYPE
  1149.    LDX #0
  1150. -  LDA ACE─IRENT╘YPE,X
  1151.    ORA #$80
  1152.    STA DIRLINE,Y
  1153.    INY
  1154.    INX
  1155.    CPX #3
  1156.    BCC -
  1157.    LDA #" "
  1158.    STA DIRLINE,Y
  1159.    INY
  1160.    STA DIRLINE,Y
  1161.    INY
  1162.    ;** FILENAME
  1163.    LDX #0
  1164. -  LDA ACE─IRENT╬AME,X
  1165.    BEQ +
  1166.    STA DIRLINE,Y
  1167.    INY
  1168.    INX
  1169.    BNE -
  1170. +  LDA #CHR├╥
  1171.    STA DIRLINE,Y
  1172.    INY
  1173.    LDA #0
  1174.    STA DIRLINE,Y
  1175.    STY DIRLINE╠EN
  1176.    RTS
  1177.  
  1178. DIR─ISPLAY╙HORT = *
  1179.    LDA #<ACE─IRENT╬AME
  1180.    LDY #>ACE─IRENT╬AME
  1181.    JSR PUTS
  1182.    INC DIR├UR├OL
  1183.    LDA DIR├UR├OL
  1184.    CMP DIR├OLUMNS
  1185.    BCC +
  1186.    LDA #0
  1187.    STA DIR├UR├OL
  1188.    LDA #CHR├╥
  1189.    JMP PUTCHAR
  1190. +  LDY #$FF
  1191. -  INY
  1192.    LDA ACE─IRENT╬AME,Y
  1193.    BNE -
  1194.    STY DIR╙PACES
  1195.    LDA #20
  1196.    SBC DIR╙PACES
  1197.    STA DIR╙PACES
  1198. -  LDA #" "
  1199.    JSR PUTCHAR
  1200.    DEC DIR╙PACES
  1201.    BNE -
  1202.    RTS
  1203.  
  1204. DIR─ISPLAY╚EADING = *
  1205.    LDA #<DIR╚EADING═SG
  1206.    LDY #>DIR╚EADING═SG
  1207.    JSR PUTS
  1208.    LDA #<ACE─IRENT╬AME
  1209.    LDY #>ACE─IRENT╬AME
  1210.    JSR PUTS
  1211.    LDA #CHR├╥
  1212.    JSR PUTCHAR
  1213.    RTS
  1214.  
  1215.    DIR╚EADING═SG = *
  1216.    .ASC "─IR: "
  1217.    .BYTE 0
  1218.  
  1219. DIR─ISPLAY╘RAILER = *
  1220.    LDA ACE─IRENT┬YTES+0
  1221.    LDY ACE─IRENT┬YTES+1
  1222.    LDX ACE─IRENT┬YTES+2
  1223.    JSR ITOA╙TRIP
  1224.    LDA #<ITOA╬UMBER
  1225.    LDY #>ITOA╬UMBER
  1226.    JSR PUTS
  1227.    LDA #<DIR╘RAILING═SG
  1228.    LDY #>DIR╘RAILING═SG
  1229.    JSR PUTS
  1230.    RTS
  1231.  
  1232.    DIR╘RAILING═SG = *
  1233.    .ASC " BYTES FREE"
  1234.    .BYTE CHR├╥
  1235.    .BYTE 0
  1236.  
  1237. ;===CD===
  1238. CD╙CAN╙AVE .BUF 1
  1239.  
  1240. CD = *
  1241.    LDA ACE┴RGC+0
  1242.    CMP #2
  1243.    LDA ACE┴RGC+1
  1244.    SBC #0
  1245.    BCS +
  1246.    JSR CDHOME
  1247.    RTS
  1248. +  LDA #1
  1249.    LDY #0
  1250.    JSR GETARG
  1251.  
  1252.    CD╙ET─EVICE = *
  1253.    LDX #2
  1254.    LDY #0
  1255.    LDA (ZP),Y
  1256.    STA ARG┬UFFER+0
  1257.    INY
  1258.    LDA (ZP),Y
  1259.    STA ARG┬UFFER+1
  1260.    INY
  1261.    CMP ":"
  1262.    BNE +
  1263.    LDA ARG┬UFFER+0
  1264.    CMP #$40
  1265.    BCC +
  1266.    CMP #$60
  1267.    BCC CD├HECK╨ATH
  1268. +  LDX #0
  1269.    LDY #0
  1270.  
  1271.    CD├HECK╨ATH = *
  1272.    STY CD╙CAN╙AVE
  1273. -  LDA (ZP),Y
  1274.    CMP #"0"
  1275.    BCC +
  1276.    CMP #"9"+1
  1277.    BCS +
  1278.    INY
  1279.    BNE -
  1280. +  STA ARG┬UFFER,X
  1281.    CMP #0
  1282.    BNE +
  1283.    CPY CD╙CAN╙AVE
  1284.    BEQ CD╧KAY
  1285. +  LDY CD╙CAN╙AVE
  1286.    CMP #"/"
  1287.    BEQ CD╨ATH╧KAY
  1288.    CMP #":"
  1289.    BEQ CD╨ATH╧KAY
  1290. +  LDA #"/"
  1291.    STA ARG┬UFFER,X
  1292.    INX
  1293.  
  1294.    CD╨ATH╧KAY = *
  1295. -  LDA (ZP),Y
  1296.    STA ARG┬UFFER,X
  1297.    BEQ CD├HECK┼ND
  1298.    INX
  1299.    INY
  1300.    BNE -
  1301.  
  1302.    CD├HECK┼ND = *
  1303.    DEX
  1304.    LDA ARG┬UFFER,X
  1305.    CMP #":"
  1306.    BEQ +
  1307.    INX
  1308.    LDA #":"
  1309.    STA ARG┬UFFER,X
  1310.    LDA #0
  1311.    STA ARG┬UFFER+1,X
  1312. +  DEX
  1313.    LDA ARG┬UFFER,X
  1314.    CMP #"/"
  1315.    BEQ CD╧KAY
  1316.    LDA #"/"
  1317.    STA ARG┬UFFER+1,X
  1318.    LDA #":"
  1319.    STA ARG┬UFFER+2,X
  1320.    LDA #0
  1321.    STA ARG┬UFFER+3,X
  1322.  
  1323.    CD╧KAY = *
  1324.    LDA #<ARG┬UFFER
  1325.    LDY #>ARG┬UFFER
  1326.    STA ZP+0
  1327.    STY ZP+1
  1328.    JSR CHDIR
  1329.    BCS +
  1330.    RTS
  1331. +  LDA #<CD┼RR═SG
  1332.    LDY #>CD┼RR═SG
  1333.    JMP EPUTS
  1334.  
  1335. CD┼RR═SG = *
  1336.    .ASC "┼RROR CHANGING DIRECTORY"
  1337.    .BYTE CHR├╥,0
  1338.  
  1339. ;===CAT===
  1340. CAT┬UFFER╨TR = $02
  1341. CAT┬UFFER╠ENGTH = $04
  1342. CAT┴RG = $06
  1343. CAT╞CB = $08
  1344. CAT┴BORT = 10
  1345.  
  1346. CAT = *
  1347.    LDA #0
  1348.    STA CAT┴BORT
  1349.    JSR GET┬UFFER╨ARMS
  1350.    LDX #STDOUT
  1351.    JSR DEVINFO
  1352.    CMP #0
  1353.    BNE +
  1354.    LDA CAT┬UFFER╠ENGTH+1
  1355.    BEQ +
  1356.    LDA #<254
  1357.    LDY #>254
  1358.    STA CAT┬UFFER╠ENGTH+0
  1359.    STY CAT┬UFFER╠ENGTH+1
  1360. +  LDA #1
  1361.    LDY #0
  1362.    STA CAT┴RG+0
  1363.    STY CAT┴RG+1
  1364.    LDA ACE┴RGC+0
  1365.    CMP #2
  1366.    LDA ACE┴RGC+1
  1367.    SBC #0
  1368.    BCS CAT╞ILES
  1369.    LDA #0
  1370.    STA CAT╞CB
  1371.    JMP CAT╞ILE
  1372.  
  1373.    CAT╞ILES = *
  1374.    LDA CAT┴RG+0
  1375.    LDY CAT┴RG+1
  1376.    JSR GETARG
  1377.    LDA #"R"
  1378.    JSR OPEN
  1379.    BCC +
  1380.    LDA ZP+0
  1381.    LDY ZP+1
  1382.    JSR EPUTS
  1383.    LDA #<CAT┼RR═SG
  1384.    LDY #>CAT┼RR═SG
  1385.    JSR EPUTS
  1386.    JMP ++
  1387. +  STA CAT╞CB
  1388.    JSR CAT╞ILE
  1389.    LDA CAT╞CB
  1390.    JSR CLOSE
  1391. +  INC CAT┴RG
  1392.    BNE +
  1393.    INC CAT┴RG+1
  1394. +  LDA CAT┴BORT
  1395.    BNE +
  1396.    LDA CAT┴RG
  1397.    CMP ACE┴RGC
  1398.    LDA CAT┴RG+1
  1399.    SBC ACE┴RGC+1
  1400.    BCC CAT╞ILES
  1401. +  RTS
  1402.  
  1403. CAT┼RR═SG = *
  1404.    .ASC ": CANNOT OPEN"
  1405.    .BYTE CHR├╥,0
  1406.  
  1407. CAT╞ILE = *
  1408.    LDA CAT┬UFFER╨TR
  1409.    LDY CAT┬UFFER╨TR+1
  1410.    STA ZP
  1411.    STY ZP+1
  1412. -  LDA CAT┬UFFER╠ENGTH
  1413.    LDY CAT┬UFFER╠ENGTH+1
  1414.    LDX CAT╞CB
  1415.    JSR READ
  1416.    BEQ +
  1417.    BCS +
  1418.    LDX #1
  1419.    JSR WRITE
  1420.    BCS +
  1421.    JSR STOPKEY
  1422.    BCS PRINT╙TOPPED═SG
  1423.    JMP -
  1424. +  RTS
  1425.  
  1426. PRINT╙TOPPED═SG = *
  1427.    LDA #$FF
  1428.    STA CAT┴BORT
  1429.    LDA #<STOPPED═SG
  1430.    LDY #>STOPPED═SG
  1431.    JMP EPUTS
  1432.    STOPPED═SG = *
  1433.    .ASC "<╙TOPPED>"
  1434.    .BYTE CHR├╥,0
  1435.  
  1436. ;===EXIT===
  1437. SHELL┼XIT = *
  1438.    LDA #$FF
  1439.    STA SHELL┼XIT╞LAG
  1440.    RTS
  1441.  
  1442. ;===DOS===
  1443. DOS╞CB = $02
  1444.  
  1445. DOS = *
  1446.    ;** OPEN COMMAND CHANNEL
  1447.    LDA #<DOS├UR─EVICE
  1448.    LDY #>DOS├UR─EVICE
  1449.    STA ZP
  1450.    STY ZP+1
  1451.    JSR CMDOPEN
  1452.    BCC +
  1453.    RTS
  1454. +  STA DOS╞CB
  1455.  
  1456.    ;** SEND COMMAND
  1457.    LDA #1
  1458.    LDY #0
  1459.    JSR GETARG
  1460.    LDA ZP
  1461.    ORA ZP+1
  1462.    BEQ DOS╙TATUS╧NLY
  1463.    LDA ZP
  1464.    LDY ZP+1
  1465.    LDX DOS╞CB
  1466.    JSR CMDSEND
  1467.    BCS +
  1468.  
  1469.    ;** READ STATUS
  1470.    DOS╙TATUS╧NLY = *
  1471.    LDA #<CMD┬UFFER
  1472.    LDY #>CMD┬UFFER
  1473.    LDX DOS╞CB
  1474.    JSR CMDSTATUS
  1475.    BCS +
  1476.    LDA #<CMD┬UFFER
  1477.    LDY #>CMD┬UFFER
  1478.    JSR PUTS
  1479.    LDA #CHR├╥
  1480.    JSR PUTCHAR
  1481.  
  1482.    ;** CLOSE COMMAND CHANNEL
  1483. +  LDA DOS╞CB
  1484.    JMP CMDCLOSE
  1485.    
  1486. DOS├UR─EVICE .ASC ".:"
  1487.              .BYTE 0
  1488.  
  1489. ;===SHELL===
  1490. SHELL├MD = *
  1491.    JSR SHELL
  1492.    LDA #0
  1493.    STA SHELL┼XIT╞LAG
  1494.    LDA #255
  1495.    STA CHECK╨ROMPT╞LAG
  1496.    RTS
  1497.  
  1498. ;===PATH===
  1499. PATH╨TR = 2
  1500. PATH╨OS = 4
  1501. PATH┴RG = 6
  1502. PATH╙OURCE╨OS = 7
  1503.  
  1504. PATH = *
  1505.    LDA #<ACE╙HELL╨ATH
  1506.    LDY #>ACE╙HELL╨ATH
  1507.    STA PATH╨TR+0
  1508.    STY PATH╨TR+1
  1509.    LDA #0
  1510.    STA PATH╨OS
  1511.    LDA ACE┴RGC+1
  1512.    BEQ +
  1513.    RTS
  1514. +  LDA ACE┴RGC
  1515.    CMP #2
  1516.    BCS PATH╙ET
  1517.    LDA #<PATH═SG
  1518.    LDY #>PATH═SG
  1519.    JSR PUTS
  1520.    
  1521.    DISPLAY╨ATH = *
  1522.    LDY PATH╨OS
  1523.    LDA (PATH╨TR),Y
  1524.    BNE +
  1525.    LDA #CHR├╥
  1526.    JSR PUTCHAR
  1527.    RTS
  1528. +  LDA #CHR╤UOTE
  1529.    STA CMD┬UFFER
  1530.    LDX #1
  1531. -  LDA (PATH╨TR),Y
  1532.    STA CMD┬UFFER,X
  1533.    BEQ +
  1534.    INY
  1535.    INX
  1536.    BNE -
  1537. +  INY
  1538.    STY PATH╨OS
  1539.    LDA #CHR╤UOTE
  1540.    STA CMD┬UFFER,X
  1541.    INX
  1542.    LDA #" "
  1543.    STA CMD┬UFFER,X
  1544.    INX
  1545.    LDA #<CMD┬UFFER
  1546.    LDY #>CMD┬UFFER
  1547.    STA ZP
  1548.    STY ZP+1
  1549.    TXA
  1550.    LDY #0
  1551.    LDX #1
  1552.    JSR WRITE
  1553.    JMP DISPLAY╨ATH
  1554.  
  1555.    PATH═SG = *
  1556.    .ASC "PATH "
  1557.    .BYTE 0
  1558.  
  1559. PATH╙ET = *
  1560.    LDY #0
  1561.    STY PATH╨OS
  1562.    LDA #1
  1563.    STA PATH┴RG
  1564.  
  1565.    PATH╬EXT┴RG = *
  1566.    LDA PATH┴RG
  1567.    LDY #0
  1568.    JSR GETARG
  1569.    LDA ZP
  1570.    ORA ZP+1
  1571.    BNE +
  1572.    LDA #0
  1573.    LDY PATH╨OS
  1574.    STA (PATH╨TR),Y
  1575.    RTS
  1576. +  LDY #0
  1577.    STY PATH╙OURCE╨OS
  1578. -  LDY PATH╙OURCE╨OS
  1579.    INC PATH╙OURCE╨OS
  1580.    LDA (ZP),Y
  1581.    LDY PATH╨OS
  1582.    INC PATH╨OS
  1583.    STA (PATH╨TR),Y
  1584.    CMP #0
  1585.    BNE -
  1586.    INC PATH┴RG
  1587.    JMP PATH╬EXT┴RG
  1588.  
  1589. ;******** STANDARD LIBRARY ********
  1590. EPUTS = *
  1591.    LDX #STDERR
  1592.    JMP FPUTS
  1593. PUTS = *
  1594.    LDX #STDOUT
  1595. FPUTS = *
  1596.    STA ZP+0
  1597.    STY ZP+1
  1598.    LDY #$FF
  1599. -  INY
  1600.    LDA (ZP),Y
  1601.    BNE -
  1602.    TYA
  1603.    LDY #0
  1604.    JMP WRITE
  1605.  
  1606. PUTCHAR = *
  1607.    LDX #STDOUT
  1608. PUTC = *
  1609.    STA PUTC┬UFFER
  1610.    LDA #<PUTC┬UFFER
  1611.    LDY #>PUTC┬UFFER
  1612.    STA ZP+0
  1613.    STY ZP+1
  1614.    LDA #1
  1615.    LDY #0
  1616.    JMP WRITE
  1617.    PUTC┬UFFER .BUF 1
  1618.  
  1619. GETCHAR = *
  1620.    LDX #STDIN
  1621. GETC = *
  1622.    LDA #<GETC┬UFFER
  1623.    LDY #>GETC┬UFFER
  1624.    STA ZP+0
  1625.    STY ZP+1
  1626.    LDA #1
  1627.    LDY #0
  1628.    JSR READ
  1629.    BEQ +
  1630.    LDA GETC┬UFFER
  1631.    RTS
  1632. +  SEC
  1633.    RTS
  1634.    GETC┬UFFER .BUF 1
  1635.  
  1636. CLS = *
  1637.    LDA #CHR├╠╥
  1638.    JMP PUTCHAR
  1639.  
  1640. ITOA┬IN = LIBWORK
  1641. ITOA╬UMBER .BUF 11
  1642. ITOA = *
  1643.    JSR ITOA╨REPARE
  1644.    JMP UTOA
  1645. ITOA╙TRIP = *
  1646.    JSR ITOA╨REPARE
  1647.    LDA #1
  1648.    JMP UTOA
  1649. ITOA╨REPARE = *
  1650.    STA ITOA┬IN+0
  1651.    STY ITOA┬IN+1
  1652.    STX ITOA┬IN+2
  1653.    LDA #0
  1654.    STA ITOA┬IN+3
  1655.    LDA #<ITOA╬UMBER
  1656.    LDY #>ITOA╬UMBER
  1657.    STA ZP+0
  1658.    STY ZP+1
  1659.    LDA #8
  1660.    LDX #ITOA┬IN
  1661.    RTS
  1662.  
  1663. ;*** BSS ***
  1664.  
  1665. BSS           = ACE┴PP┴DDRESS
  1666. CMD┬UFFER     = BSS+0
  1667. ARG┬UFFER     = CMD┬UFFER+256
  1668. ARG┴RGV┬UFFER = ARG┬UFFER+256
  1669. COPY┬UFFER    = ARG┴RGV┬UFFER
  1670.