home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / csbruce / ace-r9-src.kar < prev    next >
Text File  |  1993-12-24  |  309KB  |  20,374 lines

  1. 37
  2. ACE.S
  3. 1383
  4. ;ace-128/64 KERNEL BY cRAIG bRUCE, STARTED 04-mAR-1992.
  5.  
  6. ;* SYSTEM ZERO-PAGE MEMORY USAGE:
  7. ;*   $02-$7F = APPLICATION WORK AREA
  8. ;*   $80-$8F = SYSTEM WORK AREA
  9. ;*   $FA-$FF = SYSTEM PARAMETER AREA
  10.  
  11. ;* INITIAL ace ram0 ORGANIZATION
  12. ;*   $0000-$0EFF = SYSTEM STORAGE
  13. ;*   $0F00-$0FFF = KERNEL INTERFACE VARIABLES
  14. ;*   $1000-$12FF = SYSTEM STORAGE
  15. ;*   $1300-$1FFF = sHELL PROGRAM (3.25k)
  16. ;*   $2000-$27FF = CHARACTER SET (2k)
  17. ;*   $2800-$5FFF = ace KERNEL AND DEVICE DRIVERS (14k)
  18. ;*   $6000-$BFFF = APPLICATION AREA & STACK (24k)
  19. ;*   $C000-$FFFF = rom AND i/o, ram (16k)
  20.  
  21. ;* FAR MEMORY TYPES
  22. ;*   $00=NULL, $01=REU, $02=INTERNAL-512k, $06=RL-REU, $07=RL-RAM
  23.  
  24. COMPUTER = 128
  25.  
  26. .SEQ ACEHEAD.S
  27. .ORG $2800
  28.  
  29. .IF COMPUTER-64
  30.    .OBJ "@0:ACE128"
  31. .ELSE
  32.    .OBJ "@0:ACE64"
  33. .IFE
  34.  
  35. ;***JUMP TABLE
  36.  
  37. JMP ENTRYpOINT
  38. JMP ACEoPEN
  39. JMP ACEcLOSE
  40. JMP ACErEAD
  41. JMP ACEwRITE
  42. JMP ACEiSDIR
  43. JMP ACEbLOAD
  44. JMP ACEcMDoPEN
  45. JMP ACEcMDcLOSE
  46. JMP ACEcMDsEND
  47. JMP ACEcMDsTATUS
  48. JMP ACEdIRoPEN
  49. JMP ACEcLOSE
  50. JMP ACEdIRrEAD
  51. JMP ACEfCBsWAP
  52. JMP ACErEMOVE
  53. JMP ACErENAME
  54. JMP ACEcHdIR
  55. JMP ACEzPlOAD
  56. JMP ACEzPsTORE
  57. JMP ACEfETCH
  58. JMP ACEsTASH
  59. JMP ACEpAGEaLLOC
  60. JMP ACEpAGEfREE
  61. JMP ACEeXIT
  62. JMP ACEdEViNFO
  63. JMP ACEsTOPkEY
  64. JMP ACEuTOA
  65. JMP ACEgETdATE
  66. JMP ACEsETdATE
  67. JMP ACEeXEC
  68. JMP ACEcDhOME
  69. JMP ACEwINMAX
  70. JMP ACEwINCLS
  71. JMP ACEwINSET
  72. JMP ACEwINSIZE
  73. JMP ACEwINLOAD
  74. JMP ACEwINSAVE
  75. JMP ACEwINPUT
  76. JMP ACEwINCOLOR
  77. JMP ACEwINPOS
  78. JMP ACEwINCURSOR
  79. JMP ACEwINSCROLL
  80. JMP CONgETKEY
  81. JMP CONcOLOR
  82. JMP CONpALETTE
  83. JMP CONsCREEN
  84.  
  85. ;***GLOBAL DECLARATIONS
  86.  
  87. MAXzPuSE    = $90
  88. CONFIGbUF   = $800
  89. BASICzPsAVE = $900
  90. KEYLINE     = $B00
  91. CDbUFFER    = $C00
  92. RAM0fREEmAP = $D00
  93. FREEMAP     = $E00
  94.  
  95. .IF COMPUTER-64
  96.    MAXpAGE = $C0
  97.    BKace = $0E
  98.    BKkERNEL = $00
  99.    BKcHARSET = $0F
  100.    BKsELECT = $FF00
  101.    KERNELiRQhANDLER = $FA65
  102.    KERNELbRKhANDLER = $B003
  103.    KERNELnMIhANDLER = $FA40
  104. .ELSE
  105.    STRINGbUFFER = $A00
  106.    MAXpAGE = $D0
  107.    BKsELECT = $01
  108.    BKace = $76
  109.    BKkERNEL = $77
  110.    KERNELiRQhANDLER = $EA31
  111.    KERNELbRKhANDLER = $FE66
  112.    KERNELnMIhANDLER = $FE47
  113. .IFE
  114.  
  115. CIA1  = $DC00
  116. CHRcr = $0D
  117. ST    = $90
  118. TRUE  = $FF
  119. FALSE = $00
  120.  
  121. FCBcOUNT = 16
  122. LFTABLE   .BUF FCBcOUNT
  123. DEVTABLE  .BUF FCBcOUNT
  124. SATABLE   .BUF FCBcOUNT
  125. EOFTABLE  .BUF FCBcOUNT
  126. PIDTABLE  .BUF FCBcOUNT
  127. LFNULL = $FF
  128. FCBnULL = $FF
  129. MINdISK = 8
  130. REGSAVE .BUF 3
  131.  
  132. NEWLF .BUF 1
  133.  
  134. KERNELcLALL  = $FFE7
  135. KERNELsETBNK = $FF68
  136. KERNELsETMSG = $FF90
  137. KERNELrEADST = $FFB7
  138. KERNELsETLFS = $FFBA
  139. KERNELsETNAM = $FFBD
  140. KERNELoPEN   = $FFC0
  141. .IF COMPUTER-64
  142. KERNELcLOSE  = $FFC3
  143. .IFE
  144. KERNELcHKIN  = $FFC6
  145. KERNELcHKOUT = $FFC9
  146. KERNELcLRCHN = $FFCC
  147. KERNELcHRIN  = $FFCF
  148. KERNELcHROUT = $FFD2
  149. KERNELlOAD   = $FFD5
  150. KERNELsTOP   = $FFE1
  151. KERNELgETIN  = $FFE4
  152. KERNELsCRORG = $FFED
  153.  
  154. .IF COMPUTER-64
  155.    ;128 NOTHING HERE
  156. .ELSE
  157. ;*** KERNEL CLOSE WITH PSEUDO-CLOSE FOR DISK COMMAND CHANNEL FOR THE 64
  158. KERNELcLOSE = *
  159.    BCS +
  160.    JMP $FFC3
  161. +  LDX $98
  162. -  DEX
  163.    BMI KERNELcLOSEeXIT
  164.    CMP $259,X
  165.    BNE -
  166.    BEQ +
  167.    BRK
  168.    ;** FOUND ENTRY; COPY LAST ENTRY ON TOP IF IT
  169. +  LDY $98
  170.    DEY
  171.    LDA $259,Y   ;MOVE LFN
  172.    STA $259,X
  173.    LDA $263,Y   ;MOVE DEV NUM
  174.    STA $263,X
  175.    LDA $26D,Y   ;MOVE SEC ADDR
  176.    STA $26D,X
  177.    DEC $98
  178.    KERNELcLOSEeXIT = *
  179.    CLC
  180.    RTS
  181. .IFE
  182.  
  183. ;*** ENTRYPOINT()
  184.  
  185. ENTRYpOINT = *
  186.    LDA #0
  187.    PHA
  188.    PLP
  189.    LDA #BKace
  190.    STA BKsELECT
  191.    JMP MAIN
  192.  
  193. ;*** STARTUP()
  194.  
  195. ACEbOOTSTRAP = *
  196.    PHP
  197.    SEI
  198.    LDX #2
  199. -  LDA $00,X
  200.    STA BASICzPsAVE,X
  201.    LDA #0
  202.    STA $00,X
  203.    INX
  204.    CPX #MAXzPuSE
  205.    BCC -
  206.    LDA #<IRQiNIThANDLER
  207.    LDY #>IRQiNIThANDLER
  208.    STA $314
  209.    STY $315
  210.    LDA #<BRKhANDLER
  211.    LDY #>BRKhANDLER
  212.    STA $316
  213.    STY $317
  214.    LDA #<NMIhANDLER
  215.    LDY #>NMIhANDLER
  216.    STA $318
  217.    STY $319
  218.    LDX #127
  219.    LDA #0
  220. -  STA ERRNO,X
  221.    DEX
  222.    BPL -
  223.    LDA 186      ;LAST ACCESSED cOMMODORE DEVICE
  224.    CMP #8
  225.    BCS +
  226.    LDA #$04
  227. +  STA ACEcURRENTdEVICE
  228.    LDA #0
  229.    JSR KERNELsETMSG
  230. .IF COMPUTER-64
  231.    LDA #0
  232.    LDX #0
  233.    JSR KERNELsETBNK
  234. .IFE
  235.    JSR KERNELcLALL
  236.    PLP
  237.    RTS
  238.  
  239. ACEcONFIG = *
  240.    LDA #0
  241.    LDX BOOTdEVICE
  242.    LDY #0
  243.    JSR KERNELsETLFS
  244.    LDA #6
  245.    LDX #<ACEcONFIGnAME
  246.    LDY #>ACEcONFIGnAME
  247.    JSR KERNELsETNAM
  248.    LDA #0
  249.    LDX #<ACEaPPaDDRESS
  250.    LDY #>ACEaPPaDDRESS
  251.    JSR KERNELlOAD
  252.    BCC +
  253.    RTS
  254. +  LDA #<CONFIGbUF
  255.    LDY #>CONFIGbUF
  256.    STA 2
  257.    STY 3
  258.    LDA #<ACEsTARTUPmSG
  259.    LDY #>ACEsTARTUPmSG
  260.    STA 4
  261.    STY 5
  262.    LDA #<RAM0fREEmAP
  263.    LDY #>RAM0fREEmAP
  264.    STA 6
  265.    STY 7
  266.    LDX #>ACEbSSeND
  267.    LDA #<ACEbSSeND
  268.    BEQ +
  269.    INX
  270. +  STX 8
  271.    .IF COMPUTER-64
  272.    LDA #128
  273.    .ELSE
  274.    LDA #64
  275.    .IFE
  276.    STA 9
  277.    JSR ACEaPPaDDRESS
  278.    RTS
  279.    ACEcONFIGnAME = *
  280.    .ASC "CONFIG"
  281.  
  282. ACEsTARTUP = *
  283.    LDX #FCBcOUNT-1
  284.    LDA #LFNULL
  285. -  STA LFTABLE,X
  286.    DEX
  287.    BPL -
  288.    LDA #0
  289.    STA NEWLF
  290.    LDA ACEcURRENTdEVICE
  291.    LSR
  292.    LSR
  293.    ORA #$40
  294.    STA CDbUFFER
  295.    LDA #":"
  296.    STA CDbUFFER+1
  297.    LDA #0
  298.    STA CDbUFFER+2
  299.    LDA #<CDbUFFER
  300.    LDY #>CDbUFFER
  301.    STA ACEcURdIRnAME+0
  302.    STY ACEcURdIRnAME+1
  303.    JSR INITsTACK
  304.    LDA #<SHELLpATHbUF
  305.    LDY #>SHELLpATHbUF
  306.    STA ACEsHELLpATH+0
  307.    STY ACEsHELLpATH+1
  308.    LDX #31
  309. -  LDA CONFIGbUF+$E0,X
  310.    STA SHELLpATHbUF,X
  311.    DEX
  312.    BPL -
  313.    LDA #<SHELLaLIASbUF
  314.    LDY #>SHELLaLIASbUF
  315.    STA ACEsHELLaLIAS+0
  316.    STY ACEsHELLaLIAS+1
  317.    LDA #0
  318.    STA SHELLaLIASbUF
  319.    LDA #1
  320.    STA ACEpROCESSid
  321.    ;JSR ACEiRQiNIT
  322.    RTS
  323.  
  324. INITsTACK = *
  325.    LDA #$AC
  326.    STA ACEid
  327.    LDA #$E1
  328.    STA ACEid+1
  329.    LDA #0
  330.    .IF COMPUTER-64
  331.    LDY CONFIGbUF+$A8
  332.    .ELSE
  333.    LDY CONFIGbUF+$C6
  334.    .IFE
  335.    CPY #MAXpAGE
  336.    BCC +
  337.    LDY #MAXpAGE
  338. +  STA ACEsTACKtOP+0
  339.    STY ACEsTACKtOP+1
  340.    STA ACEsTACKpTR+0
  341.    STY ACEsTACKpTR+1
  342.    LDA #0      ;PUSH THE zero TRAILER ARGV
  343.    LDY #0
  344.    JSR PUSHay
  345.    LDA #0      ;PUSH ARGC
  346.    LDY #0
  347.    JSR PUSHay
  348.    LDA #$FF    ;PUSH FLAGS, RESTORE STDERR
  349.    LDY #$00
  350.    JSR PUSHay
  351.    LDA #$FF    ;PUSH RESTORE STDOUT, RESTORE STDIN
  352.    LDY #$FF
  353.    JSR PUSHay
  354.    LDA #$FF    ;PUSH PREVIOUS FRAME POINTER
  355.    LDY #$FF
  356.    JSR PUSHay
  357.    LDA ACEsTACKpTR
  358.    LDY ACEsTACKpTR+1
  359.    STA ACEfRAMEpTR
  360.    STY ACEfRAMEpTR+1
  361.    RTS
  362.  
  363. ZSP = $60
  364.  
  365. PUSHay = *
  366.    TAX
  367.    SEC
  368.    LDA ACEsTACKpTR
  369.    SBC #2
  370.    STA ACEsTACKpTR
  371.    STA ZSP
  372.    LDA ACEsTACKpTR+1
  373.    SBC #0
  374.    STA ACEsTACKpTR+1
  375.    STA ZSP+1
  376.    TYA
  377.    LDY #1
  378.    STA (ZSP),Y
  379.    DEY
  380.    TXA
  381.    STA (ZSP),Y
  382.    RTS
  383.  
  384. ;*** SHUTDOWN()
  385.  
  386. ACEsHUTDOWN = *
  387.    LDX #2
  388. -  LDA BASICzPsAVE,X
  389.    STA $00,X
  390.    INX
  391.    CPX #MAXzPuSE
  392.    BCC -
  393.    LDA #BKkERNEL
  394.    STA BKsELECT
  395.    PHP
  396.    SEI
  397.    LDA #<KERNELiRQhANDLER
  398.    LDY #>KERNELiRQhANDLER
  399.    STA $314
  400.    STY $315
  401.    LDA #<KERNELbRKhANDLER
  402.    LDY #>KERNELbRKhANDLER
  403.    STA $316
  404.    STY $317
  405.    LDA #<KERNELnMIhANDLER
  406.    LDY #>KERNELnMIhANDLER
  407.    STA $318
  408.    STY $319
  409. .IF COMPUTER-64
  410. .ELSE
  411.    LDA #%10000001
  412.    STA $DC0D
  413.    LDA #%01111111
  414.    STA $DD0D
  415.    BIT $DC0D
  416.    BIT $DD0D
  417.    LDA #%00000000
  418.    STA VIC+$1A
  419. .IFE
  420.    PLP
  421.    RTS
  422.  
  423.    LDA #0
  424.    PHA
  425.    PLP
  426.    RTS
  427.  
  428. ACEsHUTDOWNbASIC = *
  429. .IF COMPUTER-64
  430.    JSR VDCsHUTDOWN
  431.    JSR VICsHUTDOWN
  432. .ELSE
  433.    JSR VICsHUTDOWN
  434. .IFE
  435.    JSR ACEsHUTDOWN
  436. .IF COMPUTER-64
  437.    LDA #$16
  438.    STA 2604
  439.    STA $D018
  440.    LDA #0
  441.    STA $1C00
  442.    JSR $51D6
  443.    JMP $4DB7
  444. .ELSE
  445.    LDA #$16
  446.    STA $D018
  447.    LDA #0
  448.    STA $800
  449.    JSR $A642
  450.    JMP $A474
  451. .IFE
  452.    BRK
  453.  
  454. NMIhANDLER = *
  455. .IF COMPUTER-64
  456.    CLD
  457.    LDA #$7F
  458.    STA $DD0D
  459.    LDY $DD0D
  460.    BMI +
  461.    JSR $F63D
  462.    JSR $FFE1
  463.    BNE +
  464.    JSR ACEsHUTDOWN
  465.    JSR $E056
  466.    JSR $E109
  467.    JSR $C000
  468.    LDA #0
  469.    STA $1C00
  470.    JSR $51D6
  471.    JMP ($0A00)
  472. +  JMP $FF33
  473. .ELSE
  474.    CLD
  475.    PHA
  476.    TXA
  477.    PHA
  478.    TYA
  479.    PHA
  480.    LDA #$7F
  481.    STA $DD0D
  482.    LDY $DD0D
  483.    BMI +
  484.    JSR $F6BC
  485.    JSR $FFE1
  486.    BNE +
  487.    JSR ACEsHUTDOWN
  488.    JSR $FD15
  489.    JSR $FDA3
  490.    JSR $E518
  491.    LDA #0
  492.    STA $800
  493.    JSR $A642
  494.    JMP ($A002)
  495. +  PLA
  496.    TAY
  497.    PLA
  498.    TAX
  499.    PLA
  500.    RTI
  501. .IFE
  502.  
  503. IRQiNIThANDLER = *
  504.    CLD
  505.    JMP KERNELiRQhANDLER
  506.  
  507. ACEiRQiNIT = *
  508.    PHP
  509.    SEI
  510.    LDA #<IRQhANDLER
  511.    LDY #>IRQhANDLER
  512.    STA $314
  513.    STY $315
  514.    LDA #%01111111
  515.    STA $DC0D
  516.    STA $DD0D
  517.    BIT $DC0D
  518.    BIT $DD0D
  519.    LDA VIC+$11
  520.    AND #%01111111
  521.    ORA #%00000000
  522.    STA VIC+$11
  523.    LDA #252
  524.    STA VIC+$12
  525.    LDA #%00000001
  526.    STA VIC+$1A
  527.    PLP
  528.    RTS
  529.  
  530. IRQhANDLER = *  ;(.axy ALREADY SAVED, 128 BANK)
  531.    CLD
  532. .IF COMPUTER-64
  533. .ELSE
  534.    LDA BKsELECT
  535.    PHA
  536. .IFE
  537.    LDA VIC+$19
  538.    BPL +
  539.    AND #1
  540.    BNE SIXTY
  541. +  LDA $DC0D
  542.    JMP IRQeXIT
  543.  
  544. ;%%%
  545. SIXTY = *
  546.    STA VIC+$19
  547.    LDA #BKace
  548.    STA BKsELECT
  549.    JSR CONsCREENsAVE
  550.    JSR VICiRQcURSOR
  551.    JSR CONiRQkEYSCAN
  552.    JMP IRQeXIT
  553.  
  554. .IF COMPUTER-64
  555. IRQeXIT = $FF33
  556. .ELSE
  557. IRQeXIT = *
  558.    PLA
  559.    STA BKsELECT
  560.    PLA
  561.    TAY
  562.    PLA
  563.    TAX
  564.    PLA
  565.    RTI
  566. .IFE
  567.  
  568. BRKhANDLER = *
  569.    CLD
  570.    LDX #0
  571. -  LDA $00,X
  572.    STA $0400,X
  573.    DEX
  574.    BNE -
  575.    JSR ACEsHUTDOWN
  576. .IF COMPUTER-64
  577.    LDA #0
  578.    STA $1C00
  579.    ;JSR $51D6
  580. .ELSE
  581.    LDA #0
  582.    STA $800
  583.    JSR $A642
  584. .IFE
  585.    JMP KERNELbRKhANDLER
  586.  
  587. ;*** GETdEVICE( ZP=FILENAMEz ) : .a=DEVICE, .y=SCANpOS
  588.  
  589. GETdEVICE = *
  590.    LDY #0
  591.    LDA (ZP),Y
  592.    BEQ USEdEFAULT
  593.    LDY #1
  594.    LDA (ZP),Y
  595.    CMP #":"
  596.    BNE USEdEFAULT
  597.    LDY #0
  598.    LDA (ZP),Y
  599.    LDY #2
  600.    CMP #"."
  601.    BNE +
  602.    LDA ACEcURRENTdEVICE
  603.    JMP GOTdEV
  604. +  AND #$1F
  605.    ASL
  606.    ASL
  607.    JMP GOTdEV
  608.  
  609.    USEdEFAULT = *
  610.    LDA ACEcURRENTdEVICE
  611.    LDY #0
  612.  
  613.    GOTdEV = *
  614.    RTS
  615.  
  616. GETlFaNDfCB = * ;() : .x=FCB, .a=LF
  617.    OPENlFsEARCH = *
  618.    INC NEWLF
  619.    LDA NEWLF
  620.    AND #$7F
  621.    LDX #FCBcOUNT-1
  622. -  CMP LFTABLE,X
  623.    BEQ OPENlFsEARCH
  624.    DEX
  625.    BPL -
  626.    TAY
  627.    LDX #0
  628. -  LDA LFTABLE,X
  629.    BMI +
  630.    INX
  631.    CPX #FCBcOUNT
  632.    BCC -
  633.    LDA #ACEeRRnOfREEfCBS
  634.    SEC
  635.    RTS
  636. +  LDA ACEpROCESSid
  637.    STA PIDTABLE,X
  638.    TYA
  639.    CLC
  640.    RTS
  641.  
  642. ;*** ISDIR( (ZP)=fILENAMEz ) : .a=dEV, .x=ISdISK, .y=ISdIR
  643.  
  644. ACEiSDIR = *
  645.    JSR GETdEVICE
  646.    PHA
  647.    TAX
  648.    LDA CONFIGbUF+0,X
  649.    CMP #1
  650.    BEQ +
  651.    CMP #4
  652.    BEQ +
  653.    LDX #FALSE
  654.    LDY #FALSE
  655.    JMP ISdIReXIT
  656.    LDX #TRUE
  657. +  LDY #255
  658. -  INY
  659.    LDA (ZP),Y
  660.    BNE -
  661.    DEY
  662.    LDA (ZP),Y
  663.    LDY #TRUE
  664.    CMP #":"
  665.    BEQ ISdIReXIT
  666.    LDY #FALSE
  667.  
  668.    ISdIReXIT = *
  669.    PLA
  670.    RTS
  671.  
  672. ;*** OPEN( ZP=FILENAMEz, .a=MODE["R","W","A"] ) : .a=FCB
  673.  
  674. OPENfCB      = SYSWORK+0
  675. OPENnAMEsCAN = SYSWORK+1
  676. OPENmODE     = SYSWORK+2
  677. OPENnAMElENGTH = SYSWORK+3
  678. OPENdEVICE   = SYSWORK+4
  679. CHECKsTAT .BUF 1
  680.  
  681. ACEoPEN = *
  682.    STA OPENmODE
  683.    LDA #TRUE
  684.    STA CHECKsTAT
  685.    JSR GETlFaNDfCB
  686.    BCC +
  687.    RTS
  688. +  STA LFTABLE,X
  689.    LDA #$00
  690.    STA EOFTABLE,X
  691.    STX OPENfCB
  692.    JSR GETdEVICE
  693.    STY OPENnAMEsCAN
  694.    LDX OPENfCB
  695.    STA DEVTABLE,X
  696.    STA OPENdEVICE
  697.    TAX
  698.  
  699.    ;GET SA HERE
  700.    LDA CONFIGbUF+0,X
  701.    CMP #0
  702.    BNE +
  703.    LDY CONFIGbUF+2,X
  704.    JMP NONdISKsA
  705. +  LDY #0
  706.    CMP #1
  707.    BNE NONdISKsA
  708.  
  709.    LDY #2
  710.    DISKsAsEARCH = *
  711.    LDX #FCBcOUNT-1
  712. -  LDA LFTABLE,X
  713.    BMI +
  714.    LDA DEVTABLE,X
  715.    CMP OPENdEVICE
  716.    BNE +
  717.    TYA
  718.    CMP SATABLE,X
  719.    BNE +
  720.    INY
  721.    BNE DISKsAsEARCH
  722. +  DEX
  723.    BPL -
  724.  
  725.    NONdISKsA = *
  726.    LDX OPENfCB
  727.    TYA
  728.    STA SATABLE,X
  729.  
  730.    ;SET THE NAME
  731.    LDX #0
  732.    LDY OPENnAMEsCAN
  733. -  LDA (ZP),Y
  734.    STA STRINGbUFFER,X
  735.    BEQ +
  736.    INY
  737.    INX
  738.    BNE -
  739. +  LDY OPENdEVICE
  740.    LDA CONFIGbUF+0,Y
  741.    CMP #1
  742.    BNE NONdISKoPEN
  743.    ;** STICK THE MODE FOR DISK FILES
  744.    CPX #0
  745.    BNE +
  746.    LDA #ACEeRRoPENdIRECTORY
  747.    SEC
  748.    RTS
  749. +  LDA #","
  750.    STA STRINGbUFFER,X
  751.    INX
  752.    LDA OPENmODE
  753.    STA STRINGbUFFER,X
  754.    INX
  755.    JMP OPENgOTnAME
  756.  
  757.    ;** GET RID OF THE FILENAME FOR NON-DISKS
  758.    NONdISKoPEN = *
  759.    LDX #0
  760.  
  761.    OPENgOTnAME = *
  762.    ;** DISPATCH HERE FOR NON-KERNEL DEVICES
  763.    TXA
  764.    LDX #<STRINGbUFFER
  765.    LDY #>STRINGbUFFER
  766.    JSR KERNELsETNAM
  767.  
  768.    ;SET LFS
  769.    LDX OPENfCB
  770.    LDA LFTABLE,X
  771.    PHA
  772.    LDA SATABLE,X
  773.    TAY
  774.    LDA DEVTABLE,X
  775.    TAX
  776.    LDA CONFIGbUF+1,X
  777.    TAX
  778.    PLA
  779.    JSR KERNELsETLFS
  780.  
  781.    ;DO THE OPEN
  782.    JSR KERNELoPEN
  783.    BCS OPENeRROR
  784. +  LDX OPENdEVICE
  785.    LDA CONFIGbUF+0,X
  786.    CMP #1
  787.    BNE +
  788.    LDA CHECKsTAT
  789.    BEQ +
  790.    TXA
  791.    JSR OPENdISKsTATUS
  792.    BCC +
  793.  
  794.    OPENeRROR = *
  795.    STA ERRNO
  796.    LDX OPENfCB
  797.    LDA LFTABLE,X
  798.    CLC
  799.    JSR KERNELcLOSE
  800.    LDX OPENfCB
  801.    LDA #LFNULL
  802.    STA LFTABLE,X
  803.    SEC
  804.    LDA #FCBnULL
  805.    RTS
  806. +  LDA OPENfCB
  807.    CLC
  808.    RTS
  809.  
  810. OPENdISKsTATUS = *  ;( .a=DEVICE ) : ERRNO=.a=ERRCODE, .cs=ERRFLAG
  811.    JSR CMDCHoPEN
  812.    BCS +
  813.    JSR CHECKdISKsTATUS
  814.    PHP
  815.    PHA
  816.    JSR CMDCHcLOSE
  817.    PLA
  818.    PLP
  819. +  RTS
  820.  
  821. CMDCHoPEN = *  ;( .a=DEVICE )
  822.    PHA
  823.    JSR CMDCHcLOSE
  824.    PLA
  825.    TAX
  826.    LDA CONFIGbUF+1,X
  827.    TAX
  828.    LDY #15
  829.    LDA #LFNULL
  830.    JSR KERNELsETLFS
  831.    LDA #0
  832.    JSR KERNELsETNAM
  833.    JSR KERNELoPEN
  834.    BCC +
  835.    STA ERRNO
  836. +  RTS
  837.  
  838. CMDCHsEND = *  ;( STRINGbUFFER )
  839.    LDX #LFNULL
  840.    JSR KERNELcHKOUT
  841.    BCS CMDCHeRR
  842.    LDX #0
  843. -  LDA STRINGbUFFER,X
  844.    BEQ +
  845.    JSR KERNELcHROUT
  846.    BCS CMDCHeRR
  847.    INX
  848.    BNE -
  849. +  JSR KERNELcLRCHN
  850.    CLC
  851.    RTS
  852.  
  853.    CMDCHeRR = *
  854.    STA ERRNO
  855.    PHA
  856.    JSR KERNELcLRCHN
  857.    PLA
  858.    SEC
  859.    RTS
  860.  
  861. CHECKdISKsTATUScODE .BUF 1
  862.  
  863. CHECKdISKsTATUS = *
  864.    LDX #LFNULL
  865.    JSR KERNELcHKIN
  866.    BCS CMDCHeRR
  867.    JSR KERNELcHRIN
  868.    BCS CMDCHeRR
  869.    AND #$0F
  870.    STA CHECKdISKsTATUScODE
  871.    ASL
  872.    ASL
  873.    ADC CHECKdISKsTATUScODE
  874.    ASL
  875.    STA CHECKdISKsTATUScODE
  876.    JSR KERNELcHRIN
  877.    BCS CMDCHeRR
  878.    AND #$0F
  879.    CLC
  880.    ADC CHECKdISKsTATUScODE
  881.    STA CHECKdISKsTATUScODE
  882. -  JSR KERNELrEADST
  883.    AND #$80
  884.    BEQ +
  885.    LDA #ACEeRRdEVICEnOTpRESENT
  886.    SEC
  887.    BCS CMDCHeRR
  888. +  JSR KERNELcHRIN
  889.    BCS CMDCHeRR
  890.    CMP #CHRcr
  891.    BNE -
  892.    JSR KERNELcLRCHN
  893.    LDA CHECKdISKsTATUScODE
  894.    CMP #62
  895.    BNE +
  896.    LDA #ACEeRRfILEnOTfOUND
  897.    STA ERRNO
  898.    SEC
  899.    RTS
  900. +  CMP #20
  901.    BCC +
  902.    STA ERRNO
  903. +  RTS
  904.  
  905. CMDCHcLOSE = *
  906.    SEC
  907.    LDA #LFNULL
  908.    JSR KERNELcLOSE
  909.    BCC +
  910.    STA ERRNO
  911. +  RTS
  912.  
  913. ;*** CLOSE( .a=FCB )
  914.  
  915. ACEcLOSE = *
  916.    TAX
  917.    LDA LFTABLE,X
  918.    PHA
  919.    LDA #LFNULL
  920.    STA LFTABLE,X
  921.    PLA
  922.    CLC
  923.    JMP KERNELcLOSE
  924.  
  925. ;*** READ( .x=FCB, (ZP)=DATA, .ay=MAXlENGTH ) : .ay=LENGTH, .z=EOF
  926.  
  927. READmAXlEN     = SYSWORK+0
  928. READpTR        = SYSWORK+2
  929. READlENGTH     = SYSWORK+4
  930. READfCB        = SYSWORK+6
  931. READdEVICEdISK = SYSWORK+7
  932.  
  933. ACErEAD = *
  934.    STA READmAXlEN+0
  935.    STY READmAXlEN+1
  936.    STX READfCB
  937.    LDA ZP+0
  938.    LDY ZP+1
  939.    STA READpTR+0
  940.    STY READpTR+1
  941.    LDA #0
  942.    STA READlENGTH+0
  943.    STA READlENGTH+1
  944.    LDA EOFTABLE,X
  945.    BNE READeOFeXIT
  946.    LDY #0
  947.    LDA DEVTABLE,X
  948.    TAX
  949.    LDA CONFIGbUF+0,X
  950.    CMP #2
  951.    BNE +
  952.    JMP CONrEAD
  953. +  CMP #1
  954.    BNE +
  955.    LDY #$FF
  956. +  LDX READfCB
  957.    STY READdEVICEdISK
  958.    LDA LFTABLE,X
  959.    TAX
  960.    JSR KERNELcHKIN
  961.    BCC READbYTE
  962.    RTS
  963.  
  964.    READbYTE = *
  965.    LDA READlENGTH+0
  966.    CMP READmAXlEN+0
  967.    LDA READlENGTH+1
  968.    SBC READmAXlEN+1
  969.    BCS READeXIT
  970.    JSR KERNELcHRIN
  971.    LDY #0
  972.    STA (READpTR),Y
  973.    INC READpTR+0
  974.    BNE +
  975.    INC READpTR+1
  976. +  INC READlENGTH+0
  977.    BNE +
  978.    INC READlENGTH+1
  979. +  BIT READdEVICEdISK
  980.    BPL READbYTE
  981.    LDA ST
  982.    AND #$40
  983.    BEQ READbYTE
  984.    LDX READfCB
  985.    STA EOFTABLE,X
  986.  
  987.    READeXIT = *
  988.    JSR KERNELcLRCHN
  989.    READeXITnOCLR = *
  990.    LDA READlENGTH+0
  991.    LDY READlENGTH+1
  992.    LDX #$FF
  993.    CLC
  994.    RTS
  995.  
  996.    READeOFeXIT = *
  997.    LDA #0
  998.    LDY #0
  999.    CLC
  1000.    RTS
  1001.  
  1002. ;*** WRITE( .x=FCB, (ZP)=DATA, .ay=LENGTH )
  1003.  
  1004. WRITElENGTH = SYSWORK+0
  1005. WRITEpTR    = SYSWORK+2
  1006.  
  1007. ACEwRITE = *
  1008.    STA WRITElENGTH+0
  1009.    STY WRITElENGTH+1
  1010.    LDA ZP+0
  1011.    LDY ZP+1
  1012.    STA WRITEpTR+0
  1013.    STY WRITEpTR+1
  1014.    STX REGSAVE+1
  1015.    LDA DEVTABLE,X
  1016.    TAX
  1017.    LDA CONFIGbUF+0,X
  1018.    CMP #2
  1019.    ;BEQ WRITEbYTE
  1020.    BNE +
  1021.    JMP CONwRITE
  1022. +  LDX REGSAVE+1
  1023.    LDA LFTABLE,X
  1024.    TAX
  1025.    JSR KERNELcHKOUT
  1026.    BCC WRITEbYTE
  1027.    RTS
  1028.  
  1029.    WRITEbYTE = *
  1030.    LDA WRITElENGTH+0
  1031.    ORA WRITElENGTH+1
  1032.    BEQ WRITEfINISH
  1033.    LDY #0
  1034.    LDA (WRITEpTR),Y
  1035.    JSR KERNELcHROUT
  1036.    BCC +
  1037.    STA ERRNO
  1038.    JSR KERNELcLRCHN
  1039.    SEC
  1040.    RTS
  1041. +  INC WRITEpTR+0
  1042.    BNE +
  1043.    INC WRITEpTR+1
  1044. +  LDA WRITElENGTH+0
  1045.    BNE +
  1046.    DEC WRITElENGTH+1
  1047. +  DEC WRITElENGTH+0
  1048.    JMP WRITEbYTE
  1049.  
  1050.    WRITEfINISH = *
  1051.    JSR KERNELcLRCHN
  1052.    CLC
  1053.    RTS
  1054.  
  1055. ;*** CMDOPEN( (ZP)=dEVnAME ) : .a=fCB
  1056.  
  1057. GETdISKdEVICE = *  ;( (ZP)=DEVNAME ) : .a=DEVICE, .z=ISkERNALdISK
  1058.    JSR GETdEVICE
  1059.    TAX
  1060.    LDA CONFIGbUF+0,X
  1061.    CMP #1
  1062.    PHP
  1063.    TXA
  1064.    PLP
  1065.    RTS
  1066.  
  1067. ACEcMDoPEN = *
  1068.    JSR GETdISKdEVICE
  1069.    BEQ +
  1070.    LDA #ACEeRRdISKoNLYoPERATION
  1071.    STA ERRNO
  1072.    SEC
  1073.    RTS
  1074. +  STA OPENdEVICE
  1075.    JSR GETlFaNDfCB
  1076.    BCC +
  1077.    RTS
  1078. +  STA LFTABLE,X
  1079.    STX OPENfCB
  1080.    LDA OPENdEVICE
  1081.    STA DEVTABLE,X
  1082.    LDA #0
  1083.    STA EOFTABLE,X
  1084.    LDA #15
  1085.    STA SATABLE,X
  1086.    STX OPENfCB
  1087.    LDA #0
  1088.    STA STRINGbUFFER
  1089.    LDA #FALSE
  1090.    STA CHECKsTAT
  1091.    LDX #0
  1092.    JSR OPENgOTnAME
  1093.    BCC +
  1094.    RTS
  1095. +  LDA ST
  1096.    AND #$80
  1097.    BEQ +
  1098.    LDA #ACEeRRdEVICEnOTpRESENT
  1099.    STA ERRNO
  1100.    SEC
  1101.    RTS
  1102. +  LDA OPENfCB
  1103.    RTS
  1104.  
  1105. ;*** CMDCLOSE( .a=FCB )
  1106.  
  1107. ACEcMDcLOSE = *
  1108.    TAX
  1109.    LDA LFTABLE,X
  1110.    PHA
  1111.    LDA #LFNULL
  1112.    STA LFTABLE,X
  1113.    PLA
  1114.    SEC
  1115.    JMP KERNELcLOSE
  1116.  
  1117. ;*** CMDSEND( .x=fCB, .ay=cMD )
  1118.  
  1119. ACEcMDsEND = *
  1120.    STA SYSWORK+0
  1121.    STY SYSWORK+1
  1122.    LDA LFTABLE,X
  1123.    TAX
  1124.    JSR KERNELcHKOUT
  1125.    BCC +
  1126.    STA ERRNO
  1127.    RTS
  1128. +  LDY #0
  1129. -  LDA (SYSWORK),Y
  1130.    BEQ +
  1131.    JSR KERNELcHROUT
  1132.    BCS ++
  1133.    INY
  1134.    BNE -
  1135. +  JSR KERNELcLRCHN
  1136.    CLC
  1137.    RTS
  1138. +  STA ERRNO
  1139.    JSR KERNELcLRCHN
  1140.    SEC
  1141.    RTS
  1142.  
  1143. ;*** CMDSTATUS( .x=fCB, .ay=sTATUSbUF ) : sTATUSbUF, .a=STATUScODE
  1144.  
  1145. ACEcMDsTATUS = *
  1146.    STA SYSWORK+0
  1147.    STY SYSWORK+1
  1148.    LDA LFTABLE,X
  1149.    TAX
  1150.    JSR KERNELcHKIN
  1151.    BCC +
  1152. -  STA ERRNO
  1153.    JSR KERNELcLRCHN
  1154.    SEC
  1155.    RTS
  1156. +  LDY #0
  1157. -  JSR KERNELcHRIN
  1158.    BCS --
  1159.    CMP #$0D
  1160.    BEQ +
  1161.    STA (SYSWORK),Y
  1162.    INY
  1163.    JSR KERNELrEADST
  1164.    AND #$40
  1165.    BEQ -
  1166. +  LDA #0
  1167.    STA (SYSWORK),Y
  1168.    JSR KERNELcLRCHN
  1169.    LDY #0
  1170.    LDA (SYSWORK),Y
  1171.    AND #$0F
  1172.    ASL
  1173.    ASL
  1174.    ADC (SYSWORK),Y
  1175.    ASL
  1176.    STA SYSWORK+3
  1177.    INY
  1178.    LDA (SYSWORK),Y
  1179.    AND #$0F
  1180.    ADC SYSWORK+3
  1181.    CLC
  1182.    RTS
  1183.  
  1184. .SEQ ACECALL.S
  1185. .SEQ ACEMEM.S
  1186. .SEQ ACECON.S
  1187.  
  1188. ;*** SCREEN CALLS
  1189.  
  1190. TEXTmODE .BUF 1
  1191.  
  1192. .IF COMPUTER-64
  1193.    .SEQ ACEVDC.S
  1194.    .SEQ ACEVIC.S
  1195. .ELSE
  1196.    .SEQ ACEVIC80.S
  1197.    .SEQ ACEVIC.S
  1198. .IFE
  1199.  
  1200. SCREENiNIT = *
  1201. .IF COMPUTER-64
  1202.    JSR VDCiNIT
  1203.    JSR VICiNIT
  1204.    LDA #80
  1205.    BIT $D7
  1206.    BMI +
  1207.    LDA #40
  1208. +  JSR CONSCREEN
  1209. .ELSE
  1210.    LDA #40
  1211.    ;XX CHECK CONFIG FOR SCREEN
  1212.    JSR CONSCREEN
  1213. .IFE
  1214.    RTS
  1215.  
  1216. ACEwINMAX = *
  1217.    BIT TEXTmODE
  1218.    BMI +
  1219.    JMP VICwINMAX
  1220. +  JMP VDCwINMAX
  1221. ACEwINCLS = *
  1222.    BIT TEXTmODE
  1223.    BMI +
  1224.    JMP VICwINCLS
  1225. +  JMP VDCwINCLS
  1226. ACEwINSET = *
  1227.    BIT TEXTmODE
  1228.    BMI +
  1229.    JMP VICwINSET
  1230. +  JMP VDCwINSET
  1231. ACEwINSIZE = *
  1232.    BIT TEXTmODE
  1233.    BMI +
  1234.    JMP VICwINSIZE
  1235. +  JMP VDCwINSIZE
  1236. ACEwINLOAD = *
  1237.    BIT TEXTmODE
  1238.    BMI +
  1239.    JMP VICwINLOAD
  1240. +  JMP VDCwINLOAD
  1241. ACEwINSAVE = *
  1242.    BIT TEXTmODE
  1243.    BMI +
  1244.    JMP VICwINSAVE
  1245. +  JMP VDCwINSAVE
  1246. ACEwINPUT = *
  1247.    BIT TEXTmODE
  1248.    BMI +
  1249.    JMP VICwINPUT
  1250. +  JMP VDCwINPUT
  1251. ACEwINCOLOR = *
  1252.    BIT TEXTmODE
  1253.    BMI +
  1254.    JMP VICwINCOLOR
  1255. +  JMP VDCwINCOLOR
  1256. ACEwINPOS = *
  1257.    BIT TEXTmODE
  1258.    BMI +
  1259.    JMP VICwINPOS
  1260. +  JMP VDCwINPOS
  1261. ACEwINCURSOR = *
  1262.    BIT TEXTmODE
  1263.    BMI +
  1264.    JMP VICwINCURSOR
  1265. +  JMP VDCwINCURSOR
  1266. ACEwINSCROLL = *
  1267.    BIT TEXTmODE
  1268.    BMI +
  1269.    JMP VICwINSCROLL
  1270. +  JMP VDCwINSCROLL
  1271.  
  1272. ;*** MAIN()
  1273.  
  1274. BOOTdEVICE .BUF 1
  1275. TITLEpTR   .BUF 2
  1276. TITLElEN   .BUF 2
  1277.  
  1278. MAIN = *
  1279.    LDA #147
  1280.    JSR KERNELcHROUT
  1281.    LDA #14
  1282.    JSR KERNELcHROUT
  1283.    LDX #0
  1284. -  LDA ACEsTARTUPmSG,X
  1285.    BEQ +
  1286.    JSR KERNELcHROUT
  1287.    INX
  1288.    BNE -
  1289. +  SEI
  1290.    JSR ACEbOOTSTRAP
  1291.    LDA ACEcURRENTdEVICE
  1292.    STA BOOTdEVICE
  1293.    JSR INITmEMORY
  1294.    JSR ACEcONFIG
  1295.    BCS MAINeXIT
  1296.    LDA 2
  1297.    LDY 3
  1298.    STA TITLEpTR+0
  1299.    STY TITLEpTR+1
  1300.    LDA 4
  1301.    LDY 5
  1302.    STA TITLElEN+0
  1303.    STY TITLElEN+1
  1304.    JSR ACEsTARTUP
  1305.    JSR INITmEMORYaLLOC
  1306.    SEI
  1307.    JSR SCREENiNIT
  1308.    JSR CONiNIT
  1309.    JSR ACEiRQiNIT
  1310.    CLI
  1311.  
  1312.    ;** OPEN STD FILES
  1313.    LDA #<CONFIGbUF+$90
  1314.    LDY #>CONFIGbUF+$91
  1315.    STA ZP+0
  1316.    STY ZP+1
  1317.    JSR CHDIR
  1318.    LDA #<STDINnAME
  1319.    LDY #>STDINnAME
  1320.    STA ZP+0
  1321.    STY ZP+1
  1322.    LDA #"R"
  1323.    JSR OPEN  ;FCB=0
  1324.    LDA #<STDOUTnAME
  1325.    LDY #>STDOUTnAME
  1326.    STA ZP
  1327.    STY ZP+1
  1328.    LDA #"W"
  1329.    JSR OPEN   ;FCB=1
  1330.    LDA #"W"
  1331.    JSR OPEN   ;FCB=2
  1332.    LDA TITLEpTR+0
  1333.    LDY TITLEpTR+1
  1334.    STA ZP+0
  1335.    STY ZP+1
  1336.    LDA TITLElEN+0
  1337.    LDY TITLElEN+1
  1338.    LDX #STDOUT
  1339.    JSR WRITE
  1340.    CLI
  1341.  
  1342.    ;** CALL SHELL
  1343.    LDA #<ACEsHELLaDDRESS
  1344.    LDY #>ACEsHELLaDDRESS
  1345.    JSR EXEC
  1346.  
  1347.    ;** EXIT
  1348.    MAINeXIT = *
  1349.    LDA #STDIN
  1350.    JSR CLOSE
  1351.    LDA #STDOUT
  1352.    JSR CLOSE
  1353.    LDA #STDERR
  1354.    JSR CLOSE
  1355.    LDA BOOTdEVICE
  1356.    STA 186
  1357.    JSR SHUTDOWNmEMORY
  1358.    LDA #147
  1359.    JSR KERNELcHROUT
  1360.    JMP ACEsHUTDOWNbASIC
  1361.  
  1362. STDOUTnAME .ASC "S:"
  1363.            .BYTE 0
  1364. STDINnAME  .ASC "K:"
  1365.            .BYTE 0
  1366.  
  1367. ACEsTARTUPmSG = *
  1368. .IF COMPUTER-64
  1369.    .ASC "ace-128 "
  1370. .ELSE
  1371.    .ASC "ace-64  "
  1372. .IFE
  1373.    .ASC "kERNEL 0.54.00 - csb 30-nOV-93"
  1374.    .BYTE CHRcr,CHRcr,0
  1375.  
  1376. ;*** BSS: C128=768 BYTES, C64=512 BYTES
  1377.  
  1378. ACEbSS = *
  1379. SHELLaLIASbUF = ACEbSS+0
  1380. SHELLpATHbUF  = SHELLaLIASbUF+256
  1381. .IF COMPUTER-64
  1382.    STRINGbUFFER = SHELLpATHbUF+256
  1383.    ACEbSSeND = STRINGbUFFER+256
  1384. .ELSE
  1385.    ACEbSSeND = SHELLpATHbUF+256
  1386. .IFE
  1387. ACECALL.S
  1388. 801
  1389. ;*** DIROPEN( (ZP)=DEVICEnAME ) : .a=FCB
  1390.  
  1391. ACEdIRoPEN = *
  1392.    LDA #TRUE
  1393.    STA CHECKsTAT
  1394.    JSR GETdISKdEVICE
  1395.    BEQ +
  1396.    LDA #ACEeRRdISKoNLYoPERATION
  1397.    SEC
  1398.    RTS
  1399. +  STA OPENdEVICE
  1400.    STY OPENnAMEsCAN
  1401.    JSR GETlFaNDfCB
  1402.    BCC +
  1403.    RTS
  1404. +  STA LFTABLE,X
  1405.    LDA OPENdEVICE
  1406.    STA DEVTABLE,X
  1407.    LDA #0
  1408.    STA EOFTABLE,X
  1409.    LDA #0
  1410.    STA SATABLE,X
  1411.    STX OPENfCB
  1412.    LDA #"$"
  1413.    STA STRINGbUFFER
  1414.    LDA #"0"
  1415.    STA STRINGbUFFER+1
  1416.    LDA #0
  1417.    STA STRINGbUFFER+2
  1418.    LDX #2
  1419.    JSR DIRoPENsETnAME
  1420.    JSR OPENgOTnAME
  1421.    BCC +
  1422.    RTS
  1423. +  LDX OPENfCB
  1424.    LDA LFTABLE,X
  1425.    TAX
  1426.    JSR KERNELcHKIN
  1427.    JSR KERNELcHRIN
  1428.    JSR KERNELcHRIN
  1429.    JSR KERNELcLRCHN
  1430.    LDA OPENfCB
  1431.    CLC
  1432.    RTS
  1433.  
  1434.    DIRoPENsETnAME = *
  1435.    LDY OPENdEVICE
  1436.    LDA CONFIGbUF+3,Y
  1437.    BMI DIRnAMEdATE
  1438.    LDY OPENnAMEsCAN
  1439.    LDA (ZP),Y
  1440.    BNE +
  1441.    RTS
  1442. +  LDX #1
  1443.  
  1444.    DIRnAMEnORMAL = *
  1445. -  LDA (ZP),Y
  1446.    STA STRINGbUFFER,X
  1447.    BEQ +
  1448.    INY
  1449.    INX
  1450.    BNE -
  1451. +  DEX
  1452.    LDA #":"
  1453.    CMP STRINGbUFFER,X
  1454.    BEQ +
  1455.    INX
  1456.    STA STRINGbUFFER,X
  1457. +  INX
  1458.    LDA #"*"
  1459.    STA STRINGbUFFER,X
  1460.    INX
  1461.    LDA #0
  1462.    STA STRINGbUFFER,X
  1463.    RTS
  1464.  
  1465.    DIRnAMEdATE = *
  1466.    LDA #"="
  1467.    STA STRINGbUFFER+1
  1468.    LDA #"T"
  1469.    STA STRINGbUFFER+2
  1470.    LDX #3
  1471.    LDY OPENnAMEsCAN
  1472.    JSR DIRnAMEnORMAL
  1473.    LDA #"="
  1474.    STA STRINGbUFFER,X
  1475.    INX
  1476.    LDA #"L"
  1477.    STA STRINGbUFFER,X
  1478.    INX
  1479.    LDA #0
  1480.    STA STRINGbUFFER,X
  1481.    RTS
  1482.  
  1483.  
  1484. ;*** DIRREAD( .x=FCB ) : .z=EOF, ACEdIRENTbUFFER=DATA
  1485.  
  1486. DIRbLOCKS = SYSWORK+0
  1487.  
  1488. ACEdIRrEAD = *
  1489.    LDA LFTABLE,X
  1490.    TAX
  1491.    JSR KERNELcHKIN
  1492.    BCC +
  1493.    LDA #0
  1494.    RTS
  1495.    ;** READ THE LINK
  1496. +  JSR KERNELcHRIN
  1497.    STA SYSWORK+4
  1498.    JSR KERNELrEADST
  1499.    AND #$40
  1500.    BNE DIRREADeOFeXIT
  1501.    JSR KERNELcHRIN
  1502.    ORA SYSWORK+4
  1503.    BNE +
  1504.  
  1505.    DIRREADeOFeXIT = *
  1506.    JSR KERNELcLRCHN
  1507.    LDX #0
  1508.    RTS
  1509.    ;** READ THE BLOCK COUNT
  1510. +  JSR KERNELcHRIN
  1511.    STA DIRbLOCKS
  1512.    STA ACEdIRENTbYTES+1
  1513.    JSR KERNELcHRIN
  1514.    STA DIRbLOCKS+1
  1515.    STA ACEdIRENTbYTES+2
  1516.    ASL DIRbLOCKS
  1517.    ROL DIRbLOCKS+1
  1518.    LDA #0
  1519.    ROL
  1520.    STA DIRbLOCKS+2
  1521.    SEC
  1522.    LDA #0
  1523.    SBC DIRbLOCKS
  1524.    STA ACEdIRENTbYTES+0
  1525.    LDA ACEdIRENTbYTES+1
  1526.    SBC DIRbLOCKS+1
  1527.    STA ACEdIRENTbYTES+1
  1528.    LDA ACEdIRENTbYTES+2
  1529.    SBC DIRbLOCKS+2
  1530.    STA ACEdIRENTbYTES+2
  1531.    ;** READ THE FILENAME
  1532.    LDA #0
  1533.    STA ACEdIRENTnAME
  1534.    STA ACEdIRENTnAMElEN
  1535. -  JSR KERNELcHRIN
  1536.    BCS DIRREADeRReXIT
  1537.    BIT ST
  1538.    BVS DIRREADeRReXIT
  1539.    CMP #" "
  1540.    BEQ -
  1541.    CMP #18
  1542.    BEQ -
  1543.    CMP #$22
  1544.    BNE DIRREADeXIT
  1545.    LDX #0
  1546. -  JSR KERNELcHRIN
  1547.    BCS DIRREADeRReXIT
  1548.    BIT ST
  1549.    BVS DIRREADeRReXIT
  1550.    CMP #$22
  1551.    BEQ +
  1552.    STA ACEdIRENTnAME,X
  1553.    INX
  1554.    BNE -
  1555. +  LDA #0
  1556.    STA ACEdIRENTnAME,X
  1557.    STX ACEdIRENTnAMElEN
  1558. -  JSR KERNELcHRIN
  1559.    CMP #" "
  1560.    BEQ -
  1561.    ;** READ TYPE AND FLAGS
  1562.    LDX #%01100000
  1563.    STX ACEdIRENTfLAGS
  1564.    CMP #"*"
  1565.    BNE +
  1566.    LDA ACEdIRENTfLAGS
  1567.    ORA #%00001000
  1568.    STA ACEdIRENTfLAGS
  1569.    JSR KERNELcHRIN
  1570. +  LDX #3
  1571.    LDY #0
  1572.    JMP DIRtYPEfIRST
  1573. -  JSR KERNELcHRIN
  1574.    DIRtYPEfIRST = *
  1575.    STA ACEdIRENTtYPE,Y
  1576.    INY
  1577.    DEX
  1578.    BNE -
  1579.    LDA #0
  1580.    STA ACEdIRENTtYPE+3
  1581.    LDA ACEdIRENTtYPE
  1582.    CMP #"D"
  1583.    BNE +
  1584.    LDA ACEdIRENTfLAGS
  1585.    ORA #%10010000
  1586.    STA ACEdIRENTfLAGS
  1587.    JMP DIRREADeXIT
  1588. +  CMP #"P"
  1589.    BNE DIRREADeXIT
  1590.    LDA ACEdIRENTfLAGS
  1591.    ORA #%00010000
  1592.    STA ACEdIRENTfLAGS
  1593.    JMP DIRREADeXIT
  1594.  
  1595.    DIRREADeRReXIT = *
  1596.    STA ERRNO
  1597.    JSR KERNELcLRCHN
  1598.    LDX #0
  1599.    SEC
  1600.    RTS
  1601.  
  1602.    DIRREADeXIT = *
  1603.    JSR KERNELcHRIN
  1604.    CMP #0
  1605.    BEQ DIRREADrEALeXIT
  1606.    CMP #"<"
  1607.    BNE +
  1608.    LDA ACEdIRENTfLAGS
  1609.    AND #%11011111
  1610.    STA ACEdIRENTfLAGS
  1611. +  LDX #7
  1612.    LDA #0
  1613. -  STA ACEdIRENTdATE,X
  1614.    DEX
  1615.    BPL -
  1616. -  JSR KERNELcHRIN
  1617.    CMP #0
  1618.    BEQ DIRREADrEALeXIT
  1619.    CMP #"0"
  1620.    BCC -
  1621.    CMP #"9"+1
  1622.    BCS -
  1623.  
  1624.    DIRREADdATE = *
  1625.    JSR DIRgETnUMgOT
  1626.    STA ACEdIRENTdATE+2
  1627.    JSR DIRgETnUM
  1628.    STA ACEdIRENTdATE+3
  1629.    JSR DIRgETnUM
  1630.    STA ACEdIRENTdATE+1
  1631.    LDA CONFIGbUF+$86
  1632.    STA ACEdIRENTdATE+0
  1633.    JSR DIRgETnUM
  1634.    STA ACEdIRENTdATE+4
  1635.    JSR DIRgETnUM
  1636.    STA ACEdIRENTdATE+5
  1637.    JSR KERNELcHRIN
  1638.    JSR KERNELcHRIN
  1639.    CMP #"A"
  1640.    BNE DIRREADpm
  1641.  
  1642.    DIRREADam = *
  1643.    LDA ACEdIRENTdATE+4
  1644.    CMP #$12
  1645.    BNE +
  1646.    LDA #$00
  1647.    STA ACEdIRENTdATE+4
  1648.    JMP +
  1649.  
  1650.    DIRREADpm = *
  1651.    LDA ACEdIRENTdATE+4
  1652.    CMP #$12
  1653.    BEQ +
  1654.    CLC
  1655.    SEI
  1656.    SED
  1657.    ADC #$12
  1658.    CLD
  1659.    CLI
  1660.    STA ACEdIRENTdATE+4
  1661.  
  1662. /  JSR KERNELcHRIN
  1663.    CMP #0
  1664.    BNE -
  1665.  
  1666.    DIRREADrEALeXIT = *
  1667.    JSR KERNELcLRCHN
  1668.    LDX #$FF
  1669.    CLC
  1670.    RTS
  1671.  
  1672.    DIRgETnUM = *
  1673. -  JSR KERNELcHRIN
  1674.    DIRgETnUMgOT = *
  1675.    CMP #0
  1676.    BEQ +
  1677.    CMP #"0"
  1678.    BCC -
  1679.    CMP #"9"+1
  1680.    BCS -
  1681.    ASL
  1682.    ASL
  1683.    ASL
  1684.    ASL
  1685.    STA SYSWORK+6
  1686.    JSR KERNELcHRIN
  1687.    CMP #0
  1688.    BEQ +
  1689.    AND #$0F
  1690.    ORA SYSWORK+6
  1691. +  RTS
  1692.  
  1693. ;*** FCBSWAP( .x=fCB1, .y=fCB2 )
  1694.  
  1695. ACEfCBsWAP = *
  1696.    LDA LFTABLE,X
  1697.    PHA
  1698.    LDA LFTABLE,Y
  1699.    STA LFTABLE,X
  1700.    PLA
  1701.    STA LFTABLE,Y
  1702.    LDA DEVTABLE,X
  1703.    PHA
  1704.    LDA DEVTABLE,Y
  1705.    STA DEVTABLE,X
  1706.    PLA
  1707.    STA DEVTABLE,Y
  1708.    LDA SATABLE,X
  1709.    PHA
  1710.    LDA SATABLE,Y
  1711.    STA SATABLE,X
  1712.    PLA
  1713.    STA SATABLE,Y
  1714.    LDA EOFTABLE,X
  1715.    PHA
  1716.    LDA EOFTABLE,Y
  1717.    STA EOFTABLE,X
  1718.    PLA
  1719.    STA EOFTABLE,Y
  1720.    LDA PIDTABLE,X
  1721.    PHA
  1722.    LDA PIDTABLE,Y
  1723.    STA PIDTABLE,X
  1724.    PLA
  1725.    STA PIDTABLE,Y
  1726.    CLC
  1727.    RTS
  1728.  
  1729. ;*** BLOAD( (ZP)=nAME, .ay=aDDRESS ) : .ay=eND+1
  1730.  
  1731. BLOADaDDRESS = SYSWORK
  1732. BLOADfILENAME = SYSWORK+2
  1733. BLOADdEVICE = SYSWORK+4
  1734.  
  1735. ACEbLOAD = *
  1736.    STA BLOADaDDRESS+0
  1737.    STY BLOADaDDRESS+1
  1738.    JSR GETdEVICE
  1739.    STA BLOADdEVICE
  1740.    TAX
  1741.    CLC
  1742.    TYA
  1743.    ADC ZP+0
  1744.    STA BLOADfILENAME+0
  1745.    LDA ZP+1
  1746.    ADC #0
  1747.    STA BLOADfILENAME+1
  1748.    LDA CONFIGbUF+1,X
  1749.    TAX
  1750.    LDA #0
  1751.    LDY #0
  1752.    JSR KERNELsETLFS
  1753.    LDY #0
  1754. -  LDA (BLOADfILENAME),Y
  1755.    BEQ +
  1756.    INY
  1757.    BNE -
  1758. +  TYA
  1759.    LDX BLOADfILENAME+0
  1760.    LDY BLOADfILENAME+1
  1761.    JSR KERNELsETNAM
  1762.    LDA #0
  1763.    LDX BLOADaDDRESS+0
  1764.    LDY BLOADaDDRESS+1
  1765.    JSR KERNELlOAD
  1766.    STX BLOADaDDRESS+0
  1767.    STY BLOADaDDRESS+1
  1768.    BCC BLOADoK
  1769.    PHA
  1770.    CMP #ACEeRRdEVICEnOTpRESENT
  1771.    BEQ +
  1772.    LDX BLOADdEVICE
  1773.    LDA CONFIGbUF+0,X
  1774.    CMP #1
  1775.    BNE +
  1776.    TXA
  1777.    JSR OPENdISKsTATUS
  1778. +  PLA
  1779. -  STA ERRNO
  1780.    LDA #0
  1781.    LDA #0
  1782.    LDY #0
  1783.    SEC
  1784.    RTS
  1785.  
  1786.    BLOADoK = *
  1787.    LDX BLOADdEVICE
  1788.    LDA CONFIGbUF+0,X
  1789.    CMP #1
  1790.    BNE +
  1791.    TXA
  1792.    JSR OPENdISKsTATUS
  1793.    BCS -
  1794. +  LDA BLOADaDDRESS+0
  1795.    LDY BLOADaDDRESS+1
  1796.    RTS
  1797.  
  1798. ;*** REMOVE( (ZP)=nAME )
  1799.  
  1800. REMOVEdEVICE = SYSWORK
  1801.  
  1802. ACErEMOVE = *
  1803.    JSR GETdISKdEVICE
  1804.    STA REMOVEdEVICE
  1805.    LDA #"S"
  1806.    STA STRINGbUFFER
  1807.    LDA #":"
  1808.    STA STRINGbUFFER+1
  1809.    LDX #1
  1810.    LDA (ZP),Y
  1811.    CMP #"/"
  1812.    BEQ +
  1813.    LDX #2
  1814. /  LDA (ZP),Y
  1815.    STA STRINGbUFFER,X
  1816.    BEQ +
  1817.    INY
  1818.    INX
  1819.    BNE -
  1820. +  LDA #0
  1821.    STA STRINGbUFFER,X
  1822.    LDA REMOVEdEVICE
  1823.    JSR CMDCHoPEN
  1824.    BCS ++
  1825.    JSR CMDCHsEND
  1826.    BCS +
  1827.    JSR CHECKdISKsTATUS
  1828. +  PHP
  1829.    JSR CMDCHcLOSE
  1830.    PLP
  1831. +  RTS
  1832.  
  1833. ;*** CDHOME( )
  1834.  
  1835. ACEcDhOME = *
  1836.    LDA #<CONFIGbUF+$90
  1837.    LDY #>CONFIGbUF+$90
  1838.    STA ZP+0
  1839.    STY ZP+1
  1840.    ;XX FALL THROUGH
  1841.  
  1842. ;*** CHDIR( (ZP)=dIRnAME )
  1843.  
  1844. CHDIRdEVICE = SYSWORK+0
  1845. CHDIRsCAN   = SYSWORK+1
  1846. CHDIRnAMEsCAN = SYSWORK+2
  1847. CHDIRcMDoPEN  = SYSWORK+3
  1848.  
  1849. ACEcHdIR = *
  1850.    LDA #0
  1851.    STA CHDIRcMDoPEN
  1852.    JSR GETdISKdEVICE
  1853.    BEQ +
  1854.    LDA #ACEeRRdISKoNLYoPERATION
  1855.    STA ERRNO
  1856.    SEC
  1857.    RTS
  1858.  
  1859. +  STY CHDIRnAMEsCAN
  1860.    STA CHDIRdEVICE
  1861. +  LDA #"C"
  1862.    STA STRINGbUFFER+0
  1863.    LDA #"P"
  1864.    STA STRINGbUFFER+1
  1865.    LDX #2
  1866. -  LDA (ZP),Y
  1867.    CMP #"0"
  1868.    BCC +
  1869.    CMP #"9"+1
  1870.    BCS +
  1871.    STA STRINGbUFFER,X
  1872.    INX
  1873.    INY
  1874.    BNE -
  1875. +  CPX #2
  1876.    BEQ CHDIRcD
  1877.    LDA #0
  1878.    STA STRINGbUFFER,X
  1879.    STY CHDIRsCAN
  1880.    LDA CHDIRdEVICE
  1881.    JSR CMDCHoPEN
  1882.    BCC +
  1883.    RTS
  1884. +  LDA #$FF
  1885.    STA CHDIRcMDoPEN
  1886.    JSR CMDCHsEND
  1887.    BCS CHDIRaBORT
  1888.    JSR CHECKdISKsTATUS
  1889.    BCS CHDIRaBORT
  1890.    LDY CHDIRsCAN
  1891.  
  1892.    CHDIRcD = *
  1893.    LDA #"D"
  1894.    STA STRINGbUFFER+1
  1895.    LDX #2
  1896. -  LDA (ZP),Y
  1897.    STA STRINGbUFFER,X
  1898.    BEQ +
  1899.    CMP #":"
  1900.    BEQ +
  1901.    INY
  1902.    INX
  1903.    BNE -
  1904. +  CPX #2
  1905.    BEQ CHDIRsETnAME
  1906.    LDA #0
  1907.    STA STRINGbUFFER,X
  1908.    LDA CHDIRcMDoPEN
  1909.    BMI +
  1910.    LDA CHDIRdEVICE
  1911.    JSR CMDCHoPEN
  1912.    BCC +
  1913.    RTS
  1914. +  JSR CMDCHsEND
  1915.    BCS CHDIRaBORT
  1916.    JSR CHECKdISKsTATUS
  1917.    BCS CHDIRaBORT
  1918.    JSR CMDCHcLOSE
  1919.  
  1920.    CHDIRsETnAME = *
  1921.    LDA CHDIRdEVICE
  1922.    STA ACEcURRENTdEVICE
  1923.    LSR
  1924.    LSR
  1925.    ORA #$40
  1926.    STA CDbUFFER
  1927.    LDA #":"
  1928.    STA CDbUFFER+1
  1929.    LDX #2
  1930.    LDY CHDIRnAMEsCAN
  1931. -  LDA (ZP),Y
  1932.    STA CDbUFFER,X
  1933.    BEQ +
  1934.    INX
  1935.    INY
  1936.    BNE -
  1937. +  RTS
  1938.  
  1939.    CHDIRaBORT = *
  1940.    JSR CMDCHcLOSE
  1941.    SEC
  1942.    RTS
  1943.  
  1944. ;*** DEVINFO( .x=fCB ) : .a=dEVtYPE(0=CON,1=CHAR,2=DISK), .x=cOLS, .y=rOWS
  1945.  
  1946. ACEdEViNFO = *
  1947.    LDA DEVTABLE,X
  1948.    TAX
  1949.    LDA CONFIGbUF+0,X
  1950.    CMP #2
  1951.    BNE +
  1952.    JSR WINSIZE
  1953.    TAY
  1954.    LDX SYSWORK+0
  1955.    LDA #0
  1956.    RTS
  1957.  
  1958. +  LDX #80
  1959.    LDY #66
  1960.    CMP #1
  1961.    BEQ +
  1962.    CMP #4
  1963.    BEQ +
  1964.    LDA #1
  1965.    RTS
  1966. +  LDA #2
  1967.    RTS
  1968.  
  1969. ;*** UTOA( $0+x=VALUE32, ($80)=BUF, .a=MINlEN ) : BUF, .a=.y=LEN
  1970.  
  1971. UTOAbUF = SYSWORK       ;(2)
  1972. UTOAbIN = SYSWORK+2     ;(4)
  1973. UTOAbCD = SYSWORK+6     ;(5)
  1974. UTOAfLAG = SYSWORK+11   ;(1)
  1975. UTOAlEN = SYSWORK+12    ;(1)
  1976. UTOApOS = SYSWORK+13    ;(1)
  1977.  
  1978. ACEuTOA = *
  1979.    CMP #10
  1980.    BCC +
  1981.    LDA #10
  1982. +  STA UTOAlEN
  1983.    SEC
  1984.    LDA #10
  1985.    SBC UTOAlEN
  1986.    STA UTOAlEN
  1987.    LDY #0
  1988. -  LDA 0,X
  1989.    STA UTOAbIN,Y
  1990.    INX
  1991.    INY
  1992.    CPY #4
  1993.    BCC -
  1994.    LDX #4
  1995.    LDA #0
  1996. -  STA UTOAbCD,X
  1997.    DEX
  1998.    BPL -
  1999.    STA UTOAfLAG
  2000.    LDY #32
  2001.    SEI
  2002.    SED
  2003.  
  2004.    UTOAnEXTbIT = *
  2005.    ASL UTOAbIN+0
  2006.    ROL UTOAbIN+1
  2007.    ROL UTOAbIN+2
  2008.    ROL UTOAbIN+3
  2009.    LDX #4
  2010. -  LDA UTOAbCD,X
  2011.    ADC UTOAbCD,X
  2012.    STA UTOAbCD,X
  2013.    DEX
  2014.    BPL -
  2015.    DEY
  2016.    BNE UTOAnEXTbIT
  2017.    CLD
  2018.    CLI
  2019.  
  2020.    LDA #10
  2021.    STA UTOApOS
  2022.    LDX #0
  2023.    LDY #0
  2024. -  LDA UTOAbCD,X
  2025.    JSR UTOApUThEX
  2026.    INX
  2027.    CPX #5
  2028.    BCC -
  2029.    LDA #0
  2030.    STA (UTOAbUF),Y
  2031.    RTS
  2032.  
  2033.    UTOApUThEX = *
  2034.    PHA
  2035.    LSR
  2036.    LSR
  2037.    LSR
  2038.    LSR
  2039.    JSR UTOApUTdIGIT
  2040.    PLA
  2041.    AND #$0F
  2042.  
  2043.    UTOApUTdIGIT = *
  2044.    DEC UTOApOS
  2045.    BEQ UTOAfORCEdIGIT
  2046.    CMP UTOAfLAG
  2047.    BNE UTOAfORCEdIGIT
  2048.    DEC UTOAlEN
  2049.    BMI +
  2050.    RTS
  2051. +  LDA #$20
  2052.    BNE UTOApOKE
  2053.    UTOAfORCEdIGIT = *
  2054.    ORA #$30
  2055.    STA UTOAfLAG
  2056.  
  2057.    UTOApOKE = *
  2058.    STA (UTOAbUF),Y
  2059.    INY
  2060.    RTS
  2061.  
  2062. ;*** DATE( (.ay)=DATEsTRING )  FMT:yy:yy:mm:dd:hh:mm:ss:tw
  2063.  
  2064. ACEgETdATE = *
  2065.    STA SYSWORK
  2066.    STY SYSWORK+1
  2067.    LDY #3
  2068. -  LDA ACEdATE,Y
  2069.    STA (SYSWORK),Y
  2070.    DEY
  2071.    BPL -
  2072.    LDY #4
  2073.    LDA CIA1+$B
  2074.    BPL +
  2075.    AND #$1F
  2076.    SEI
  2077.    SED
  2078.    CLC
  2079.    ADC #$12
  2080.    CLD
  2081.    CLI
  2082. +  CMP #$12
  2083.    BNE +
  2084.    LDA #$00
  2085. +  CMP #$24
  2086.    BNE +
  2087.    LDA #$12
  2088. +  STA (SYSWORK),Y
  2089.    INY
  2090.    LDA CIA1+$A
  2091.    STA (SYSWORK),Y
  2092.    INY
  2093.    LDA CIA1+$9
  2094.    STA (SYSWORK),Y
  2095.    INY
  2096.    LDA CIA1+$8
  2097.    ASL
  2098.    ASL
  2099.    ASL
  2100.    ASL
  2101.    ORA ACEdow
  2102.    STA (SYSWORK),Y
  2103.    RTS
  2104.  
  2105. ACEsETdATE = *
  2106.    STA SYSWORK
  2107.    STY SYSWORK+1
  2108.    LDY #3
  2109. -  LDA (SYSWORK),Y
  2110.    STA ACEdATE,Y
  2111.    DEY
  2112.    BPL -
  2113.    LDY #4
  2114.    LDA (SYSWORK),Y
  2115.    CMP #$13
  2116.    BCC +
  2117.    SEI
  2118.    SED
  2119.    SEC
  2120.    SBC #$12
  2121.    CLD
  2122.    CLI
  2123.    ORA #$80
  2124. +  STA CIA1+$B
  2125.    INY
  2126.    LDA (SYSWORK),Y
  2127.    STA CIA1+$A
  2128.    INY
  2129.    LDA (SYSWORK),Y
  2130.    STA CIA1+$9
  2131.    INY
  2132.    LDA (SYSWORK),Y
  2133.    LSR
  2134.    LSR
  2135.    LSR
  2136.    LSR
  2137.    STA CIA1+$8
  2138.    LDA (SYSWORK),Y
  2139.    AND #$07
  2140.    STA ACEdow
  2141.    RTS
  2142.  
  2143. ;*** RENAME( (ZP)=oLDnAME, (ZW)=nEWnAME )
  2144. ;*** DON'T EVEN THINK ABOUT RENAMING FILES OUTSIDE THE CURRENT DIRECTORY
  2145.  
  2146. RENAMEdEVICE = SYSWORK+0
  2147. RENAMEsCAN   = SYSWORK+1
  2148.  
  2149. ACErENAME = *
  2150.    JSR GETdISKdEVICE
  2151.    STA RENAMEdEVICE
  2152.    STY RENAMEsCAN
  2153.    LDA #"R"
  2154.    STA STRINGbUFFER+0
  2155.    LDA #":"
  2156.    STA STRINGbUFFER+1
  2157.    ;** COPY NEW NAME
  2158.    LDY #0
  2159.    LDX #2
  2160. -  LDA (ZW),Y
  2161.    STA STRINGbUFFER,X
  2162.    BEQ +
  2163.    INY
  2164.    INX
  2165.    BNE -
  2166. +  LDA #"="
  2167.    STA STRINGbUFFER,X
  2168.    INX
  2169.    ;** COPY OLD NAME
  2170.    LDY RENAMEsCAN
  2171. -  LDA (ZP),Y
  2172.    STA STRINGbUFFER,X
  2173.    BEQ +
  2174.    INX
  2175.    INY
  2176.    BNE -
  2177. +  LDA RENAMEdEVICE
  2178.    JSR CMDCHoPEN
  2179.    BCS ++
  2180.    JSR CMDCHsEND
  2181.    BCS +
  2182.    JSR CHECKdISKsTATUS
  2183. +  PHP
  2184.    JSR CMDCHcLOSE
  2185.    PLP
  2186. +  RTS
  2187.  
  2188. ;BLANK LINE
  2189.  
  2190. ACECON.S
  2191. 991
  2192. ;ace-128/64 KERNEL CONSOLE DRIVER: HIGH LEVEL i/o & KEYBOARD
  2193.  
  2194. CONwINsTART  .BUF 2
  2195. CONwINrOWS   .BUF 1
  2196. CONwINcOLS   .BUF 1
  2197. CONrOWiNC    .BUF 2
  2198. CONlINEaDDR  .BUF 2
  2199. CONcURrOW    .BUF 1
  2200. CONcURcOL    .BUF 1
  2201.  
  2202. CONpUTmASK   .BYTE $80  ;.BUF 1
  2203. CONcHARcOLOR .BYTE $0E  ;.BUF 1
  2204. CONcURSORcOLOR .BYTE $07 ;.BUF 1
  2205. CHRtAB = $09
  2206.  
  2207. KEYLINEpTR   .BUF 1
  2208. KEYLINEcOUNT .BUF 1
  2209.  
  2210. .IF COMPUTER-64
  2211.    SHIFTvALUE = $D3
  2212. .ELSE
  2213.    SHIFTvALUE = $28D
  2214. .IFE
  2215.  
  2216. CONiNIT = *
  2217.    LDA CONFIGbUF+$8E
  2218.    STA CONsSmAX
  2219.    STA CONsScOUNTDOWN
  2220.    LDA #0
  2221.    STA KEYLINEcOUNT
  2222.    JSR KEYSCANiNIT
  2223.  
  2224. CONwINiNIT = *
  2225.    JSR WINSIZE
  2226.    STA CONwINrOWS
  2227.    LDA SYSWORK+0
  2228.    STA CONwINcOLS
  2229.    LDA SYSWORK+2
  2230.    LDY SYSWORK+3
  2231.    STA CONwINsTART+0
  2232.    STY CONwINsTART+1
  2233.    LDA SYSWORK+4
  2234.    LDY SYSWORK+5
  2235.    STA CONrOWiNC+0
  2236.    STY CONrOWiNC+1
  2237.  
  2238. CONcLS = *
  2239.    LDA #" "
  2240.    LDY CONcHARcOLOR
  2241.    LDX #$FF
  2242.    JSR WINCLS
  2243.    JSR CONhOME
  2244.    RTS
  2245.  
  2246. CONsHUTDOWN = *
  2247.    RTS
  2248.  
  2249. CONhOME = *
  2250.    LDA CONwINsTART+0
  2251.    LDY CONwINsTART+1
  2252.    STA CONlINEaDDR+0
  2253.    STY CONlINEaDDR+1
  2254.    LDA #0
  2255.    STA CONcURrOW
  2256.    STA CONcURcOL
  2257.    RTS
  2258.  
  2259. CONpUTsAVE .BUF 1
  2260.  
  2261. CONpUTCHAR = *  ;( .a=CHAR )
  2262.    CMP #CHRcr
  2263.    BEQ CONnEWLINE
  2264.    CMP #147
  2265.    BEQ CONcLS
  2266.    CMP #CHRtAB
  2267.    BNE +
  2268.    JMP CONtAB
  2269. +  STA CONpUTsAVE
  2270.    LDA CONcURcOL
  2271.    CMP CONwINcOLS
  2272.    BCC +
  2273.    JSR CONnEWLINE
  2274. +  CLC
  2275.    LDA CONlINEaDDR+0
  2276.    ADC CONcURcOL
  2277.    STA SYSWORK+0
  2278.    LDA CONlINEaDDR+1
  2279.    ADC #0
  2280.    STA SYSWORK+1
  2281.    LDA #<CONpUTsAVE
  2282.    LDY #>CONpUTsAVE
  2283.    STA ZW+0
  2284.    STY ZW+1
  2285.    LDX #1
  2286.    STX SYSWORK+5
  2287.    LDA CONpUTmASK
  2288.    LDY CONcHARcOLOR
  2289.    JSR WINPUT
  2290.    INC CONcURcOL
  2291.    RTS
  2292.  
  2293. CONgETcURSORaDDR = *
  2294.    CLC
  2295.    LDA CONlINEaDDR+0
  2296.    ADC CONcURcOL
  2297.    STA SYSWORK+0
  2298.    LDA CONlINEaDDR+1
  2299.    ADC #0
  2300.    STA SYSWORK+1
  2301.    RTS
  2302.  
  2303. CONsYNCHcURSOR = *
  2304.    LDA CONcURcOL
  2305.    CMP CONwINcOLS
  2306.    BCC +
  2307.    JSR CONnEWLINE
  2308. +  RTS
  2309.  
  2310. CONnEWLINE = *
  2311. -  LDA SHIFTvALUE
  2312.    AND #$0F
  2313.    CMP #$04
  2314.    BEQ -
  2315.    LDA SCROLLfREEZE
  2316.    BNE -
  2317.    LDA #0
  2318.    STA CONcURcOL
  2319.    INC CONcURrOW
  2320.    LDA CONcURrOW
  2321.    CMP CONwINrOWS
  2322.    BCS +
  2323.    CLC
  2324.    LDA CONlINEaDDR+0
  2325.    ADC CONrOWiNC+0
  2326.    STA CONlINEaDDR+0
  2327.    LDA CONlINEaDDR+1
  2328.    ADC CONrOWiNC+1
  2329.    STA CONlINEaDDR+1
  2330.    CLC
  2331.    RTS
  2332. +  DEC CONcURrOW
  2333.    JSR CONsCROLL
  2334.    CLC
  2335.    RTS
  2336.  
  2337. CONsCROLL = *
  2338.    LDA #"+"
  2339.    STA SYSWORK+4
  2340.    LDA CONpUTmASK
  2341.    LDX #1
  2342.    LDY CONcHARcOLOR
  2343.    JSR WINSCROLL
  2344.    RTS
  2345.  
  2346. CONtAB = *
  2347.    LDA CONcURcOL
  2348.    AND #7
  2349.    STA SYSWORK+0
  2350.    SEC
  2351.    LDA #8
  2352.    SBC SYSWORK+0
  2353.    CLC
  2354.    ADC CONcURcOL
  2355.    CMP CONwINcOLS
  2356.    BCC +
  2357.    LDA CONwINcOLS
  2358. +  STA CONcURcOL
  2359.    RTS
  2360.  
  2361. ;*** CONwRITE( WRITEpTR, WRITElENGTH ) **ZW GETS MODIFIED**
  2362.  
  2363. CONwRITEpTR    = SYSWORK+8
  2364. CONwRITElENGTH = SYSWORK+10
  2365.  
  2366. CONwRITE = *
  2367.    LDA WRITElENGTH+0
  2368.    LDY WRITElENGTH+1
  2369.    STA CONwRITElENGTH+0
  2370.    STY CONwRITElENGTH+1
  2371.    LDA WRITEpTR+0
  2372.    LDY WRITEpTR+1
  2373.    STA CONwRITEpTR+0
  2374.    STY CONwRITEpTR+1
  2375.  
  2376.    CONwRITEbYTE = *
  2377.    LDA CONwRITElENGTH+0
  2378.    ORA CONwRITElENGTH+1
  2379.    BEQ CONwRITEfINISH
  2380.    LDY #0
  2381.    LDA (CONwRITEpTR),Y
  2382.    JSR CONpUTCHAR
  2383.    INC CONwRITEpTR+0
  2384.    BNE +
  2385.    INC CONwRITEpTR+1
  2386. +  LDA CONwRITElENGTH+0
  2387.    BNE +
  2388.    DEC CONwRITElENGTH+1
  2389. +  DEC CONwRITElENGTH+0
  2390.    JMP CONwRITEbYTE
  2391.  
  2392.    CONwRITEfINISH = *
  2393.    CLC
  2394.    RTS
  2395.  
  2396. ;*** CONrEAD( READpTR, READmAXlEN, READlENGTH ) : .ay=LEN, .z
  2397.  
  2398. CONrEAD = *
  2399.    LDA READlENGTH+0
  2400.    CMP READmAXlEN+0
  2401.    LDA READlENGTH+1
  2402.    SBC READmAXlEN+1
  2403.    BCS CONrEADeXIT
  2404.    JSR KEYLINEgET
  2405.    BCS CONrEADeOFeXIT
  2406.    LDY #0
  2407.    STA (READpTR),Y
  2408.    INC READpTR+0
  2409.    BNE +
  2410.    INC READpTR+1
  2411. +  INC READlENGTH+0
  2412.    BNE +
  2413.    INC READlENGTH+1
  2414. +  CMP #$0D
  2415.    BEQ CONrEADeXIT
  2416.    JMP CONrEAD
  2417.  
  2418.    CONrEADeXIT = *
  2419.    LDA READlENGTH+0
  2420.    LDY READlENGTH+1
  2421.    LDX #$FF
  2422.    CLC
  2423.    RTS
  2424.  
  2425.    CONrEADeOFeXIT = *
  2426.    LDA #0
  2427.    LDY #0
  2428.    CLC
  2429.    RTS
  2430.  
  2431. KEYLINEgET = *  ;( KEYLINEpTR, KEYLINEcOUNT ) : .a=CHAR, .cs=EOF
  2432.    LDA KEYLINEcOUNT
  2433.    BNE +
  2434.    JSR CONiNPUT
  2435.    BCS ++
  2436. +  LDX KEYLINEpTR
  2437.    INC KEYLINEpTR
  2438.    DEC KEYLINEcOUNT
  2439.    LDA KEYLINE,X
  2440.    CLC
  2441. +  RTS
  2442.  
  2443. CONpARMsAVE .BUF 8
  2444.  
  2445. CONiNPUT = *
  2446.    LDX #7
  2447. -  LDA SYSWORK,X
  2448.    STA CONpARMsAVE,X
  2449.    DEX
  2450.    BPL -
  2451.    LDX #0
  2452.    STX KEYLINEpTR
  2453.    STX KEYLINEcOUNT
  2454.  
  2455.    CONiNnEXT = *
  2456.    JSR CONsYNCHcURSOR
  2457.    JSR CONcURSORoN
  2458.    JSR CONgETKEY
  2459.    JSR CONcURSORoFF
  2460.    CMP #$0D
  2461.    BEQ CONiNrETURN
  2462.    CMP #$14
  2463.    BEQ CONiNbACKSPACE
  2464.    CMP #$03
  2465.    BEQ CONiNnEXT
  2466.    CMP #147
  2467.    BEQ CONiNcLEAR
  2468.    CMP #$04
  2469.    BNE +
  2470.    JSR CONrESTOREpARMS
  2471.    SEC
  2472.    RTS
  2473. +  LDX KEYLINEpTR
  2474.    CPX #254
  2475.    BCS CONiNnEXT
  2476.    STA KEYLINE,X
  2477.    INC KEYLINEpTR
  2478.    JSR CONpUTCHAR
  2479.    JMP CONiNnEXT
  2480.  
  2481. CONiNrETURN = *
  2482.    LDX KEYLINEpTR
  2483.    STA KEYLINE,X
  2484.    INX
  2485.    STX KEYLINEcOUNT
  2486.    LDX #0
  2487.    STX KEYLINEpTR
  2488.    JSR CONpUTCHAR
  2489.    JSR CONrESTOREpARMS
  2490.    CLC
  2491.    RTS
  2492.  
  2493. CONiNbACKSPACE = *
  2494.    LDX KEYLINEpTR
  2495.    BEQ +
  2496.    DEC KEYLINEpTR
  2497.    JSR CONbACKSPACE
  2498.    LDA #" "
  2499.    JSR CONpUTCHAR
  2500.    JSR CONbACKSPACE
  2501. +  JMP CONiNnEXT
  2502.  
  2503. CONiNcLEAR = *
  2504.    JSR CONpUTCHAR
  2505.    LDA #0
  2506.    STA KEYLINEpTR
  2507.    JMP CONiNnEXT
  2508.  
  2509. CONrESTOREpARMS = *
  2510.    LDX #7
  2511. -  LDA CONpARMsAVE,X
  2512.    STA SYSWORK,X
  2513.    DEX
  2514.    BPL -
  2515.    RTS
  2516.  
  2517. CONbACKSPACE = *
  2518.    DEC CONcURcOL
  2519.    BPL +
  2520.    LDX CONwINcOLS
  2521.    DEX
  2522.    STX CONcURcOL
  2523.    LDA CONcURrOW
  2524.    BEQ +
  2525.    DEC CONcURrOW
  2526.    SEC
  2527.    LDA CONlINEaDDR+0
  2528.    SBC CONrOWiNC+0
  2529.    STA CONlINEaDDR+0
  2530.    LDA CONlINEaDDR+1
  2531.    SBC CONrOWiNC+1
  2532.    STA CONlINEaDDR+1
  2533. +  RTS
  2534.  
  2535. CONcURSORoN = *  ;( )
  2536.    JSR CONgETcURSORaDDR
  2537.    LDY CONcURSORcOLOR
  2538.    LDA #$FF
  2539.    JSR WINCURSOR
  2540.    RTS
  2541.  
  2542. CONcURSORoFF = *  ;( )  ;.a PRESERVED
  2543.    PHA
  2544.    JSR CONgETcURSORaDDR
  2545.    LDA #0
  2546.    JSR WINCURSOR
  2547.    PLA
  2548.    RTS
  2549.  
  2550. CONcOLOR = *
  2551.    CMP #128
  2552.    BCC +
  2553.    STX CONcHARcOLOR
  2554. +  AND #64
  2555.    BEQ +
  2556.    STY CONcURSORcOLOR
  2557. +  LDX CONcHARcOLOR
  2558.    LDY CONcURSORcOLOR
  2559.    RTS
  2560.  
  2561. CONpALETTE = *
  2562.    LDY #0
  2563.    BIT TEXTmODE
  2564.    BMI +
  2565.    LDY #8
  2566. +  LDX #0
  2567. -  NOP
  2568.    .IF COMPUTER-64
  2569.    LDA CONFIGbUF+$B0,Y
  2570.    .ELSE
  2571.    LDA CONFIGbUF+$D0,Y
  2572.    .IFE
  2573.    STA SYSWORK+0,X
  2574.    INY
  2575.    INX
  2576.    CPX #8
  2577.    BCC -
  2578.    RTS
  2579.  
  2580. CONsCREEN = *
  2581.    LDX #$00
  2582.    CMP #40+1
  2583.    BCC +
  2584.    LDX #$80
  2585. +  STX TEXTmODE
  2586. .IF COMPUTER-64
  2587.    ;** 128-SET FAST/SLOW
  2588.    CPX #0
  2589.    BEQ +
  2590.    LDA VIC+$11
  2591.    AND #%11101111
  2592.    STA VIC+$11
  2593.    LDA #1
  2594.    STA VIC+$30
  2595.    JMP ++
  2596. +  LDA #0
  2597.    STA VIC+$30
  2598.    LDA VIC+$11
  2599.    ORA #%00010000
  2600.    STA VIC+$11
  2601. +  NOP
  2602. .ELSE
  2603.    ;** 64-INITIALIZE SCREEN HARDWARE
  2604.    CPX #$00
  2605.    BNE +
  2606.    JSR VICiNIT
  2607.    JMP ++
  2608. +  JSR VDCiNIT
  2609. +  NOP
  2610. .IFE
  2611.    ;** CHANGE COLORS
  2612.    JSR CONPALETTE
  2613.    LDX SYSWORK+0
  2614.    LDY SYSWORK+1
  2615.    LDA #$FF
  2616.    JSR CONCOLOR
  2617.    JSR CONPALETTE
  2618.    LDX SYSWORK+7
  2619.    LDY SYSWORK+6
  2620.    LDA #$FF
  2621.    JSR WINCOLOR
  2622.    ;** WINDOW PARMS
  2623.    JSR WINMAX
  2624.    JSR CONwINiNIT
  2625.    RTS
  2626.  
  2627. ;3-kEY rOLLOVER-128 BY cRAIG bRUCE 18-jUN-93 FROM c= hACKING MAGAZINE
  2628.  
  2629. .IF COMPUTER-64
  2630.    SCANROWS = 11
  2631.    PK = $D02F
  2632.    NEWPOS = $CC
  2633.    KEYCODE = $D4
  2634.    PREVkEYCODE = $D5
  2635.    XSAVE = $CD
  2636.    MASK = $CC
  2637.    CAPSpORT = $0001
  2638.    KEYMAPpTR = $CC
  2639. .ELSE
  2640.    SCANROWS = 8
  2641.    PK .BUF 1  ;DUMMY
  2642.    NEWPOS = $F5
  2643.    KEYCODE = $CB
  2644.    PREVkEYCODE = $C5
  2645.    XSAVE = $F6
  2646.    MASK = $F5
  2647.    CAPSpORT .BYTE $40
  2648.    KEYMAPpTR = $F5
  2649. .IFE
  2650. STOPkEYrOW .BUF 1
  2651. ROLLOVER = 3
  2652. NULLkEY = $FF
  2653.  
  2654. PA = $DC00
  2655. PB = $DC01
  2656.  
  2657. CONiRQkEYSCAN = *
  2658.    LDA #0
  2659.    STA PA
  2660.    STA PK
  2661. -  LDA PB
  2662.    CMP PB
  2663.    BNE -
  2664.    CMP #$FF
  2665.    BEQ NOkEYpRESSED
  2666.  
  2667.    JSR CONsCREENuNSAVE
  2668.    JSR CHECKjOYSTICK
  2669.    BCC NOkEYpRESSED
  2670.    JSR KEYSCAN
  2671.    JSR CHECKjOYSTICK
  2672.    BCC NOkEYpRESSED
  2673.    LDA SCANtABLE+7
  2674.    STA STOPkEYrOW
  2675.    JSR SELECTmOUSE
  2676.    JSR SHIFTDECODE
  2677.    JSR KEYDECODE
  2678.    JSR KEYORDER
  2679.    BIT IGNOREkEYS
  2680.    BMI +
  2681.    LDA PREVkEYS+0
  2682.    CMP #NULLkEY
  2683.    BEQ +
  2684.    STA KEYCODE
  2685.    JMP INTERPkEY
  2686.  
  2687.    NOkEYpRESSED = *
  2688.    JSR SELECTmOUSE
  2689.    LDA #NULLkEY
  2690.    LDX #ROLLOVER-1
  2691. -  STA PREVkEYS,X
  2692.    DEX
  2693.    BPL -
  2694.    JSR SCANcAPS
  2695.    LDA #0
  2696.    STA IGNOREkEYS
  2697.    STA STOPkEYrOW
  2698.  
  2699. +  LDA #NULLkEY
  2700.    STA KEYCODE
  2701.    STA PREVkEYCODE
  2702.    RTS
  2703.  
  2704. SELECTmOUSE = *
  2705.    LDA #$FF
  2706.    STA PK
  2707.    LDA #$7F  ;SELECTS PADDLE/MOUSE a
  2708.    STA PA
  2709.    RTS
  2710.  
  2711. KEYSCANiNIT = *
  2712.    LDA #NULLkEY
  2713.    LDX #ROLLOVER-1
  2714. -  STA PREVkEYS,X
  2715.    DEX
  2716.    BPL -
  2717.    LDA #0
  2718.    STA IGNOREkEYS
  2719.    RTS
  2720.  
  2721. KEYSCAN = *
  2722. .IF COMPUTER-64
  2723.    LDX #$FF
  2724.    LDY #$FF
  2725.    LDA #$FE
  2726.    STA MASK+0
  2727.    LDA #$FF
  2728.    STA MASK+1
  2729.    JMP +
  2730.    NEXTrOW = *
  2731. -  LDA PB
  2732.    CMP PB
  2733.    BNE -
  2734.    STY PA
  2735.    STY PK
  2736.    EOR #$FF
  2737.    STA SCANtABLE,X
  2738.    SEC
  2739.    ROL MASK+0
  2740.    ROL MASK+1
  2741. +  LDA MASK+0
  2742.    STA PA
  2743.    LDA MASK+1
  2744.    STA PK
  2745.    INX
  2746.    CPX #SCANROWS
  2747.    BCC NEXTrOW
  2748.    RTS
  2749. .ELSE
  2750.    LDX #$FF
  2751.    LDY #$FF
  2752.    LDA #$FE
  2753.    STA MASK
  2754.    JMP +
  2755.    NEXTrOW = *
  2756. -  LDA PB
  2757.    CMP PB
  2758.    BNE -
  2759.    STY PA
  2760.    EOR #$FF
  2761.    STA SCANtABLE,X
  2762.    SEC
  2763.    ROL MASK
  2764. +  LDA MASK
  2765.    STA PA
  2766.    INX
  2767.    CPX #SCANROWS
  2768.    BCC NEXTrOW
  2769.    RTS
  2770. .IFE
  2771.  
  2772. SHIFTrOWS .BYTE $01,$06,$07,$07,$0A
  2773. SHIFTbITS .BYTE $80,$10,$20,$04,$01
  2774. SHIFTmASK .BYTE $01,$01,$02,$04,$08
  2775.  
  2776. SHIFTDECODE = *
  2777.    JSR SCANcAPS
  2778. .IF COMPUTER-64
  2779.    LDY #4
  2780. .ELSE
  2781.    LDY #3
  2782. .IFE
  2783. -  LDX SHIFTrOWS,Y
  2784.    LDA SCANtABLE,X
  2785.    AND SHIFTbITS,Y
  2786.    BEQ +
  2787.    LDA SHIFTmASK,Y
  2788.    ORA SHIFTvALUE
  2789.    STA SHIFTvALUE
  2790.    LDA SHIFTbITS,Y
  2791.    EOR #$FF
  2792.    AND SCANtABLE,X
  2793.    STA SCANtABLE,X
  2794. +  DEY
  2795.    BPL -
  2796.    RTS
  2797.  
  2798. SCANcAPS = *
  2799. -  LDA CAPSpORT
  2800.    CMP CAPSpORT
  2801.    BNE -
  2802.    EOR #$FF
  2803.    AND #$40
  2804.    LSR
  2805.    LSR
  2806.    STA SHIFTvALUE
  2807.    RTS
  2808.  
  2809. KEYDECODE = *
  2810.    LDX #ROLLOVER-1
  2811.    LDA #$FF
  2812. -  STA NEWkEYS,X
  2813.    DEX
  2814.    BPL -
  2815.    LDY #0
  2816.    STY NEWPOS
  2817.    LDX #0
  2818.    STX KEYCODE
  2819.  
  2820.    DECODEnEXTrOW = *
  2821.    LDA SCANtABLE,X
  2822.    BEQ DECODEcONTINUE
  2823.  
  2824.    LDY KEYCODE
  2825. -  LSR
  2826.    BCC ++
  2827.    PHA
  2828.    STX XSAVE
  2829.    LDX NEWPOS
  2830.    CPX #ROLLOVER
  2831.    BCS +
  2832.    TYA
  2833.    STA NEWkEYS,X
  2834.    INC NEWPOS
  2835. +  LDX XSAVE
  2836.    PLA
  2837. +  INY
  2838.    CMP #$00
  2839.    BNE -
  2840.  
  2841.    DECODEcONTINUE = *
  2842.    CLC
  2843.    LDA KEYCODE
  2844.    ADC #8
  2845.    STA KEYCODE
  2846.    INX
  2847.    CPX #SCANROWS
  2848.    BCC DECODEnEXTrOW
  2849.    RTS
  2850.  
  2851. KEYORDER = *
  2852.    ;** REMOVE OLD KEYS NO LONGER HELD
  2853.    LDY #0
  2854.    NEXTrEMOVE = *
  2855.    LDA PREVkEYS,Y
  2856.    CMP #$FF
  2857.    BEQ ++
  2858.    LDX #ROLLOVER-1
  2859. -  CMP NEWkEYS,X
  2860.    BEQ +
  2861.    DEX
  2862.    BPL -
  2863.    TYA
  2864.    TAX
  2865. -  LDA PREVkEYS+1,X
  2866.    STA PREVkEYS+0,X
  2867.    INX
  2868.    CPX #ROLLOVER-1
  2869.    BCC -
  2870.    LDA #$FF
  2871.    STA PREVkEYS+ROLLOVER-1
  2872.    STA IGNOREkEYS
  2873. +  INY
  2874.    CPY #ROLLOVER
  2875.    BCC NEXTrEMOVE
  2876.  
  2877.    ;** INSERT NEW KEY AT FRONT
  2878. +  LDY #0
  2879.    NEXTiNSERT = *
  2880.    LDA NEWkEYS,Y
  2881.    CMP #$FF
  2882.    BEQ ++
  2883.    LDX #ROLLOVER-1
  2884. -  CMP PREVkEYS,X
  2885.    BEQ +
  2886.    DEX
  2887.    BPL -
  2888.    PHA
  2889.    LDX #ROLLOVER-2
  2890. -  LDA PREVkEYS+0,X
  2891.    STA PREVkEYS+1,X
  2892.    DEX
  2893.    BPL -
  2894.    LDA #0
  2895.    STA IGNOREkEYS
  2896.    PLA
  2897.    STA PREVkEYS+0
  2898.    LDY #ROLLOVER
  2899. +  INY
  2900.    CPY #ROLLOVER
  2901.    BCC NEXTiNSERT
  2902. +  RTS
  2903.  
  2904. CHECKjOYSTICK = *
  2905.    LDA #$FF
  2906.    STA PA
  2907.    STA PK
  2908. -  LDA PB
  2909.    CMP PB
  2910.    BNE -
  2911.    CMP #$FF
  2912.    RTS
  2913.  
  2914. SCANtABLE  .BUF SCANROWS
  2915. NEWkEYS    .BUF ROLLOVER
  2916. IGNOREkEYS .BUF 1
  2917. PREVkEYS   .BUF ROLLOVER+2
  2918.  
  2919. SCROLLfREEZE    .BYTE $00
  2920. DELAYcOUNTDOWN  .BYTE $00
  2921. REPEATcOUNTDOWN .BYTE $00
  2922.  
  2923. INTERPkEY = *  ;( KEYCODE )
  2924.    LDA KEYCODE
  2925.    ;** NOSCROLL
  2926. .IF COMPUTER-64
  2927.    CMP #87      ;NOSCROLL
  2928.    BNE INTERPcAPS
  2929. .ELSE
  2930.    CMP #63      ;RUN/STOP
  2931.    BNE INTERPcAPS
  2932.    LDA SHIFTvALUE
  2933.    AND #%1111
  2934.    CMP #4       ;CONTROL
  2935.    BNE INTERPcAPS
  2936.    LDA KEYCODE
  2937. .IFE
  2938.    CMP PREVkEYCODE
  2939.    BEQ +
  2940.    STA PREVkEYCODE
  2941.    LDA SCROLLfREEZE
  2942.    EOR #$FF
  2943.    STA SCROLLfREEZE
  2944. +  RTS
  2945.  
  2946.    INTERPcAPS = *
  2947. .IF COMPUTER-64
  2948. .ELSE
  2949.    LDA KEYCODE
  2950.    CMP #63      ;RUN/STOP
  2951.    BNE INTERPsHIFTS
  2952.    LDA SHIFTvALUE
  2953.    AND #%1111
  2954.    CMP #2       ;COMMODORE
  2955.    BNE INTERPsHIFTS
  2956.    LDA KEYCODE
  2957.    CMP PREVkEYCODE
  2958.    BEQ +
  2959.    STA PREVkEYCODE
  2960.    LDA CAPSpORT
  2961.    EOR #$40
  2962.    STA CAPSpORT
  2963. +  RTS
  2964. .IFE
  2965.  
  2966.    INTERPsHIFTS = *
  2967.    LDA SHIFTvALUE
  2968.    AND #%00011111
  2969.    CMP #%00010000
  2970.    BNE +
  2971.    LDA #5
  2972.    JMP HANDLEkEY  ;CAPS
  2973. +  AND #%1111
  2974.    TAX
  2975.    LDA SHIFTpRIvEC,X
  2976.    JMP HANDLEkEY
  2977.  
  2978. SHIFTpRIvEC = *
  2979. .IF COMPUTER-64
  2980. ;          0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  2981.    .BYTE $00,$01,$02,$02,$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04
  2982. .ELSE
  2983.    .BYTE $00,$01,$02,$02,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04
  2984. .IFE
  2985.  
  2986. HANDLEkEY = * ;( KEYCODE, .a=SHIFTtABLEnUM )
  2987.    ASL
  2988.    TAX
  2989.    LDA KEYCODE
  2990.    CMP PREVkEYCODE
  2991.    BEQ HANDLErEPEAT
  2992.    JMP HANDLEoRIGkEY
  2993.  
  2994. HANDLErEPEAT = *
  2995.    STX XSAVE
  2996.    LDA DELAYcOUNTDOWN
  2997.    BEQ +
  2998.    DEC DELAYcOUNTDOWN
  2999.    BEQ ++
  3000.    RTS
  3001. +  DEC REPEATcOUNTDOWN
  3002.    BEQ +
  3003. -  RTS
  3004. +  LDA #3
  3005.    STA REPEATcOUNTDOWN
  3006.    LDA KEYBUFcOUNT
  3007.    BNE -
  3008.    LDX XSAVE
  3009.    JMP +
  3010.  
  3011. HANDLEoRIGkEY = * ;( .x=SHIFTtABoFF )
  3012.    LDA #20
  3013.    STA DELAYcOUNTDOWN
  3014.    LDA #0
  3015.    STA SCROLLfREEZE
  3016. +  LDA CONkEYMAPiNDIRECT+0,X
  3017.    STA KEYMAPpTR+0
  3018.    LDA CONkEYMAPiNDIRECT+1,X
  3019.    STA KEYMAPpTR+1
  3020.    LDY KEYCODE
  3021.    STY PREVkEYCODE
  3022.    LDA (KEYMAPpTR),Y
  3023.    BNE STOREkEY
  3024.    RTS
  3025.  
  3026. KEYBUFhEAD  .BYTE 0
  3027. KEYBUFtAIL  .BYTE 0
  3028. KEYBUFcOUNT .BYTE 0
  3029. KEYBUFsIZE  = 16  ;POWER OF 2
  3030. KEYBUFdATA  .BUF KEYBUFsIZE
  3031.  
  3032. STOREkEY = *  ;( .a=CHAR )
  3033.    LDX KEYBUFcOUNT
  3034.    CPX #KEYBUFsIZE
  3035.    BCC +
  3036.    ;XX RING BELL
  3037.    RTS
  3038. +  LDX KEYBUFtAIL
  3039.    STA KEYBUFdATA,X
  3040.    INC KEYBUFtAIL
  3041.    LDA KEYBUFtAIL
  3042.    AND #KEYBUFsIZE-1
  3043.    STA KEYBUFtAIL
  3044.    INC KEYBUFcOUNT
  3045.    RTS
  3046.  
  3047. ;*** GETKEY( ) : .a=KEYcHAR
  3048.  
  3049. CONgETKEY = *
  3050. -  LDA KEYBUFcOUNT
  3051.    BEQ -
  3052.    SEI
  3053.    LDX KEYBUFhEAD
  3054.    DEC KEYBUFcOUNT
  3055.    INC KEYBUFhEAD
  3056.    LDA KEYBUFhEAD
  3057.    AND #KEYBUFsIZE-1
  3058.    STA KEYBUFhEAD
  3059.    LDA KEYBUFdATA,X
  3060.    CLI
  3061.    RTS
  3062.  
  3063. ;*** STOPKEY( ) : .cc=NOTpRESSED
  3064.  
  3065. ACEsTOPkEY = *
  3066.    SEI
  3067.    LDA STOPkEYrOW
  3068.    CMP #$80
  3069.    BEQ +
  3070. -  CLC
  3071.    CLI
  3072.    RTS
  3073. +  LDA SHIFTvALUE
  3074.    AND #$0F
  3075.    BNE -
  3076.    LDA #0
  3077.    STA KEYBUFcOUNT
  3078.    STA KEYBUFhEAD
  3079.    STA KEYBUFtAIL
  3080.    STA SCROLLfREEZE
  3081.    LDA #ACEeRRsTOPPED
  3082.    STA ERRNO
  3083.    SEC
  3084.    CLI
  3085.    RTS
  3086.  
  3087. CONkEYMAPiNDIRECT = *
  3088.    .WORD CONkEYMAPnORMAL,CONkEYMAPsHIFT,CONkEYMAPcOMMODORE,CONkEYMAPcONTROL
  3089.    .WORD CONkEYMAPaLTERNATE,CONkEYMAPcAPS
  3090.  
  3091. CONkEYMAPnORMAL = *
  3092.    .BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$57,$41,$34,$5A,$53,$45,$01
  3093.    .BYTE $35,$52,$44,$36,$43,$46,$54,$58,$0037,$59,$47,$38,$42,$48,$55,$56
  3094.    .BYTE $39,$49,$4A,$30,$4D,$4B,$4F,$4E,$002B,$50,$4C,$2D,$2E,$3A,$40,$2C
  3095.    .BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$51,$03
  3096.    .BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  3097.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3098.  
  3099. CONkEYMAPsHIFT = *
  3100.    .BYTE $94,$8D,$9D,$8C,$89,$8A,$8B,$91,$0023,$D7,$C1,$24,$DA,$D3,$C5,$01
  3101.    .BYTE $25,$D2,$C4,$26,$C3,$C6,$D4,$D8,$0027,$D9,$C7,$28,$C2,$C8,$D5,$D6
  3102.    .BYTE $29,$C9,$CA,$30,$CD,$CB,$CF,$CE,$00DB,$D0,$CC,$DD,$3E,$5B,$BA,$3C
  3103.    .BYTE $A9,$C0,$5D,$93,$01,$3D,$DE,$3F,$0021,$5F,$04,$22,$A0,$02,$D1,$83
  3104.    .BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
  3105.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3106.  
  3107. CONkEYMAPcOMMODORE = *
  3108.    .BYTE $94,$8D,$9D,$8C,$89,$8A,$8B,$91,$0096,$B3,$B0,$97,$AD,$AE,$B1,$01
  3109.    .BYTE $98,$B2,$AC,$99,$BC,$BB,$A3,$BD,$009A,$B7,$A5,$9B,$BF,$B4,$B8,$BE
  3110.    .BYTE $29,$A2,$B5,$30,$A7,$A1,$B9,$AA,$00A6,$AF,$B6,$DC,$3E,$5B,$A4,$3C
  3111.    .BYTE $A8,$DF,$5D,$93,$01,$3D,$DE,$3F,$0081,$5F,$04,$95,$A0,$02,$AB,$03
  3112.    .BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
  3113.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3114.  
  3115. CONkEYMAPcONTROL = *
  3116.    .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$001C,$17,$01,$9F,$1A,$13,$05,$00
  3117.    .BYTE $9C,$12,$04,$1E,$03,$06,$14,$18,$001F,$19,$07,$9E,$02,$08,$15,$16
  3118.    .BYTE $12,$09,$0A,$92,$0D,$0B,$0F,$0E,$00FF,$10,$0C,$00,$00,$1B,$00,$00
  3119.    .BYTE $1C,$00,$1D,$00,$00,$1F,$1E,$00,$0090,$06,$00,$05,$00,$00,$11,$00
  3120.    .BYTE $84,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
  3121.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3122.  
  3123. CONkEYMAPaLTERNATE = *
  3124.    .BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$57,$41,$34,$5A,$53,$45,$01
  3125.    .BYTE $35,$E2,$44,$36,$43,$46,$54,$58,$0037,$59,$47,$38,$42,$48,$55,$56
  3126.    .BYTE $39,$49,$4A,$30,$4D,$4B,$4F,$4E,$002B,$50,$4C,$2D,$2E,$3A,$40,$2C
  3127.    .BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$51,$03
  3128.    .BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  3129.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3130.  
  3131. CONkEYMAPcAPS = *
  3132.    .BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$D7,$C1,$34,$DA,$D3,$C5,$01
  3133.    .BYTE $35,$D2,$C4,$36,$C3,$C6,$D4,$D8,$0037,$D9,$C7,$38,$C2,$C8,$D5,$D6
  3134.    .BYTE $39,$C9,$CA,$30,$CD,$CB,$CF,$CE,$002B,$D0,$CC,$2D,$2E,$3A,$40,$2C
  3135.    .BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$D1,$03
  3136.    .BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  3137.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  3138.  
  3139. CONsScOUNTDOWN .BYTE 1
  3140. CONjIFSpERmIN = 3600+255
  3141. CONsSmINUTE .WORD CONjIFSpERmIN
  3142. CONsSmAX .BYTE 1
  3143. CONsSaCTIVE .BYTE $00
  3144.  
  3145. CONsCREENsAVE = *
  3146.    LDA CONsScOUNTDOWN
  3147.    BNE +
  3148. -  RTS
  3149. +  DEC CONsSmINUTE+0
  3150.    BNE -
  3151.    DEC CONsSmINUTE+1
  3152.    BNE -
  3153.    LDA #<CONjIFSpERmIN
  3154.    LDY #>CONjIFSpERmIN
  3155.    STA CONsSmINUTE+0
  3156.    STY CONsSmINUTE+1
  3157.    DEC CONsScOUNTDOWN
  3158.    BNE -
  3159.    JSR VDCsCREENsAVE
  3160.    JSR VICsCREENsAVE
  3161.    LDA #$FF
  3162.    STA CONsSaCTIVE
  3163.    RTS
  3164.  
  3165. CONsCREENuNSAVE = *
  3166.    LDA CONsSmAX
  3167.    STA CONsScOUNTDOWN
  3168.    LDA #<CONjIFSpERmIN
  3169.    LDY #>CONjIFSpERmIN
  3170.    STA CONsSmINUTE+0
  3171.    STY CONsSmINUTE+1
  3172.    LDA CONsSaCTIVE
  3173.    BNE +
  3174.    RTS
  3175. +  JSR VDCsCREENuNSAVE
  3176.    JSR VICsCREENuNSAVE
  3177.    LDA #$00
  3178.    STA CONsSaCTIVE
  3179.    RTS
  3180.  
  3181. ;THE END + BLANK LINE
  3182.  
  3183. ACEHEAD.S
  3184. 139
  3185. ;===ACE SYSTEM INTERFACE DECLARATIONS===
  3186.  
  3187. ZP = $FA  ;(4)
  3188. ZW = $FE  ;(2)
  3189. SYSWORK = $80  ;(16)
  3190.  
  3191. ACEcALLbASE = $2800
  3192. REBOOT    = ACEcALLbASE+0   ;( )
  3193. OPEN      = ACEcALLbASE+3   ;( (ZP)=nAME, .a=mODE ) : .a=fCB
  3194. CLOSE     = ACEcALLbASE+6   ;( .a=fCB )
  3195. READ      = ACEcALLbASE+9   ;( .x=fCB, (ZP)=bUF, .ay=lEN ) : .ay=lEN, .z
  3196. WRITE     = ACEcALLbASE+12  ;( .x=fCB, (ZP)=bUF, .ay=lEN )
  3197. ISDIR     = ACEcALLbASE+15  ;( (ZP)=nAME ) : .a=dEV, .x=ISdISK, .y=ISdIR
  3198. BLOAD     = ACEcALLbASE+18  ;( (ZP)=nAME, .ay=aDDRESS ) : .ay=eND+1
  3199. CMDOPEN   = ACEcALLbASE+21  ;( (ZP)=dEVnAME ) : .a=fCB
  3200. CMDCLOSE  = ACEcALLbASE+24  ;( .a=fCB )
  3201. CMDSEND   = ACEcALLbASE+27  ;( .x=fCB, .ay=cMD )
  3202. CMDSTATUS = ACEcALLbASE+30  ;( .x=fCB, .ay=sTATbUFpTR ) : sTATbUF, .a=STATUScODE
  3203. DIROPEN   = ACEcALLbASE+33  ;( (ZP)=dEVnAME ) : .a=fCB
  3204. DIRCLOSE  = ACEcALLbASE+36  ;( .a=fCB )
  3205. DIRREAD   = ACEcALLbASE+39  ;( .x=fCB ) : DIRENTbUFFER, .z=EOF
  3206. FCBSWAP   = ACEcALLbASE+42  ;( .x=fCB1, .y=fCB2 )
  3207. REMOVE    = ACEcALLbASE+45  ;( (ZP)=nAME )
  3208. RENAME    = ACEcALLbASE+48  ;( (ZP)=nAME, (ZW)=nEWnAME )
  3209. CHDIR     = ACEcALLbASE+51  ;( (ZP)=dIRnAME )
  3210. ZPLOAD    = ACEcALLbASE+54  ;( [ZP]=sOURCE, .x=zPdEST, .y=lENGTH )
  3211. ZPSTORE   = ACEcALLbASE+57  ;( .x=zPsOURCE, [ZP]=dEST, .y=lENGTH )
  3212. FETCH     = ACEcALLbASE+60  ;( [ZP]=fARsOURCE, (ZW)=rAM0dEST, .ay=lENGTH )
  3213. STASH     = ACEcALLbASE+63  ;( (ZW)=rAM0sOURCE, [ZP]=fARdEST, .ay=LENGTH )
  3214. PAGEALLOC = ACEcALLbASE+66  ;( .a=pAGEcOUNT ) : [ZP]=fARpOINTER
  3215. PAGEFREE  = ACEcALLbASE+69  ;( [ZP]=fARpOINTER, .a=pAGEcOUNT )
  3216. EXIT      = ACEcALLbASE+72  ;( .a=EXITcODE, .x=EXITbUFdATAlEN )
  3217. DEVINFO   = ACEcALLbASE+75  ;( .x=fCB ) : .a=dEVtYPE, .x=cOLS, .y=rOWS
  3218. STOPKEY   = ACEcALLbASE+78  ;( ) : .cc=NOTpRESSED
  3219. UTOA      = ACEcALLbASE+81  ;( $0+x=VALUE32, ($80)=BUF, .a=MINlEN ) :BUF, .y=LEN
  3220. GETDATE   = ACEcALLbASE+84  ;( (.ay)=DATEsTRING ) : DATEsTRING
  3221. SETDATE   = ACEcALLbASE+87  ;( (.ay)=DATEsTRING )
  3222. EXEC      = ACEcALLbASE+90  ;( (.ay)=ADDR ) : .a=EXITcODE
  3223. CDHOME    = ACEcALLbASE+93  ;( )
  3224. WINMAX    = ACEcALLbASE+96  ;( )
  3225. WINCLS    = ACEcALLbASE+99  ;( .a=CHAR, .y=COLOR, .x=CHAR:$80/ATTR:$40 FLAGS )
  3226. WINSET    = ACEcALLbASE+102 ;( .y=SCRrOW, .x=SCRcOL, .a=ROWS, SYSWORK=COLS )
  3227. WINSIZE   = ACEcALLbASE+105 ;( ) : ^^^,(SW+2)=ADDR,(SW+4)=ROWINC,(SW+6)=SAVESIZE
  3228. WINLOAD   = ACEcALLbASE+108 ;( [ZP]=FARaDDR )
  3229. WINSAVE   = ACEcALLbASE+111 ;( [ZP]=FARaDDR, .a=ATTRfLAG )
  3230. WINPUT    = ACEcALLbASE+114 ;( (SW+0)=ADDR,(ZW)=CHARpTR,.a=ATTR,.y=COLOR,.x=LEN
  3231.                             ;  SW+4=FILLcHAR, SW+5=FIELDlEN )
  3232. WINCOLOR  = ACEcALLbASE+117 ;( .x=SCREEN, .y=BORDER, .a=WHICH ) : .x=SCR, .y=BOR
  3233. WINPOS    = ACEcALLbASE+120 ;( .a=ROW, .x=COL ) : (SW+0)=ADDR
  3234. WINCURSOR = ACEcALLbASE+123 ;( (SW+0)=ADDR, .y=COLOR, .a=$FF:ON/$00:OFF)
  3235. WINSCROLL = ACEcALLbASE+126 ;( .a=$80/$40:CHAR/ATTR+$01:UP/DOWN, .x=ROWS,
  3236.                             ;  SW+4=FILLcHAR, .y=FILLcOLOR )
  3237. GETKEY    = ACEcALLbASE+129 ;( ) : .a=KEY
  3238. CONCOLOR  = ACEcALLbASE+132 ;( .a=WHICH, .x=CHAR, .y=CURSOR ) : .x=CHAR,.y=CURSR
  3239. CONPALETTE = ACEcALLbASE+135 ;( ) : SW+0...SW+7=PALETTE [8 COLORS]
  3240. CONSCREEN = ACEcALLbASE+138 ;( .a=COLS )
  3241. CONPOS    = ACEcALLbASE+141 ;( .a=ROW, .x=COL ) ;**not implemented
  3242.  
  3243. ACEsTATUSbASE = $F00
  3244. ERRNO           = ACEsTATUSbASE+0   ;(1)
  3245. ACEid           = ACEsTATUSbASE+2   ;(2)
  3246. ACEaRGC         = ACEsTATUSbASE+4   ;(2)
  3247. ACEaRGV         = ACEsTATUSbASE+6   ;(2)
  3248. ACEsTACKpTR     = ACEsTATUSbASE+8   ;(2)
  3249. ACEfRAMEpTR     = ACEsTATUSbASE+10  ;(2)
  3250. ACEsTACKtOP     = ACEsTATUSbASE+12  ;(2)
  3251. ACEsHELLpATH    = ACEsTATUSbASE+14  ;(2)
  3252. ACEsHELLaLIAS   = ACEsTATUSbASE+16  ;(2)
  3253. ACEcURRENTdEVICE = ACEsTATUSbASE+18 ;(1)
  3254. ACEcURdIRnAME   = ACEsTATUSbASE+20  ;(2)
  3255. ACEdATE         = ACEsTATUSbASE+22  ;(4) yyyy:mm:dd
  3256. ACEdow          = ACEsTATUSbASE+26  ;(1) 1-7,1=sUN
  3257. ACEpROCESSid    = ACEsTATUSbASE+27  ;(1)
  3258. ACEfREEmEMORY   = ACEsTATUSbASE+28  ;(4)
  3259. ACEtOTALmEMORY  = ACEsTATUSbASE+32  ;(4)
  3260. ACEiNTERNALbANKS = ACEsTATUSbASE+36 ;(1/2WASTED)
  3261. ACEiNTERNALcUR  = ACEsTATUSbASE+39  ;(1)
  3262. ACErAM0fREEMAP  = ACEsTATUSbASE+40  ;(2)
  3263. ACErAM1fREEMAP  = ACEsTATUSbASE+42  ;(1)
  3264. ACErEUsTART     = ACEsTATUSbASE+43  ;(1)
  3265. ACErEUbANKS     = ACEsTATUSbASE+44  ;(1)
  3266. ACErEUcUR       = ACEsTATUSbASE+45  ;(1)
  3267. ACErAMLINKsTART = ACEsTATUSbASE+46  ;(2)
  3268. ACErAMLINKbANKS = ACEsTATUSbASE+48  ;(1)
  3269. ACErAMLINKcUR   = ACEsTATUSbASE+49  ;(1)
  3270. ACErAMLINKrEUsTART = ACEsTATUSbASE+50  ;(2)
  3271. ACErAMLINKrEUbANKS = ACEsTATUSbASE+52  ;(1)
  3272. ACErAMLINKrEUcUR   = ACEsTATUSbASE+53  ;(1)
  3273. ACEvIRTUALpARTS = ACEsTATUSbASE+54  ;(1)
  3274. ACErESTOREsTACK = ACEsTATUSbASE+55  ;(1)
  3275.  
  3276. ;ACEdIRENTbUFFER = ACEsTATUSbASE+92
  3277. ACEjUNK = ACEsTATUSbASE+92
  3278. ACEdIRENTbYTES   = ACEjUNK+0   ;(4)
  3279. ACEdIRENTdATE    = ACEjUNK+4   ;(8) = yy:yy:mm:dd:hh:mm:ss:tw
  3280. ACEdIRENTtYPE    = ACEjUNK+12  ;(4)
  3281. ACEdIRENTfLAGS   = ACEjUNK+16  ;(1) = DRWX*-MT
  3282. ACEdIRENTnAMElEN = ACEjUNK+17 ;(1)
  3283. ACEdIRENTnAME    = ACEjUNK+18  ;(17)
  3284. ACEdIRENTlENGTH  = 35
  3285.  
  3286. ACEsHELLaDDRESS = $1300
  3287. ACEaPPaDDRESS = $6000
  3288. ACEid1 = "C"
  3289. ACEid2 = "b"
  3290. ACEid3 = 9
  3291.  
  3292. ACEmEMnULL = $00
  3293. ACEmEMreu = $01
  3294. ACEmEMiNTERNAL = $02
  3295. ACEmEMrlreu = $06
  3296. ACEmEMrl = $07
  3297. ACEmEMtYPES = 8
  3298.  
  3299. ACEeRRsTOPPED = 0
  3300. ACEeRRtOOmANYfILES = 1
  3301. ACEeRRfILEoPEN = 2
  3302. ACEeRRfILEnOToPEN = 3
  3303. ACEeRRfILEnOTfOUND = 4
  3304. ACEeRRdEVICEnOTpRESENT = 5
  3305. ACEeRRfILEnOTiNPUT = 6
  3306. ACEeRRfILEnOToUTPUT = 7
  3307. ACEeRRmISSINGfILENAME = 8
  3308. ACEeRRiLLEGALdEVICE = 9
  3309. ACEeRRwRITEpROTECT = 26
  3310. ACEeRRfILEeXISTS = 63
  3311. ACEeRRfILEtYPEmISMATCH = 64
  3312. ACEeRRnOcHANNEL = 70
  3313. ACEeRRiNSUFFICIENTmEMORY = 128
  3314. ACEeRRoPENdIRECTORY = 129
  3315. ACEeRRnOfREEfCBS = 130
  3316. ACEeRRdISKoNLYoPERATION = 131
  3317. ACEeRRnULLpOINTER = 132
  3318. ACEeRRiNVALIDfREEpARMS = 133
  3319. ACEeRRfREEnOToWNED = 134
  3320. STDIN  = 0
  3321. STDOUT = 1
  3322. STDERR = 2
  3323. ;===END OF ACE INTERFACE DECLARATIONS===
  3324. ACEMEM.S
  3325. 1053
  3326. ;ace-128/64 KERNEL dYNAMIC mEMORY ROUTINE BY cRAIG bRUCE.
  3327.  
  3328. ;*** MEMORY ROUTINES ***
  3329.  
  3330. COMcODEbUFFER = $200
  3331. TEMP1 = $8F
  3332.  
  3333. BKsELECTrAM0 = $FF01
  3334. .IF COMPUTER-64
  3335.    BKrAM0 = $3F
  3336. .ELSE
  3337.    BKrAM0 = $70
  3338. .IFE
  3339. REU = $DF00
  3340. RL = $DE00
  3341. RLrEGS = $E0A9
  3342. RLeXEC = $FE1E
  3343.  
  3344. ;***STARTUP
  3345.  
  3346. INITmEMORY = *
  3347. .IF COMPUTER-64
  3348.    LDX #0
  3349. -  LDA COMcODEsTART,X
  3350.    STA COMcODEbUFFER,X
  3351.    INX
  3352.    CPX #COMcODEeND-COMcODEsTART
  3353.    BCC -
  3354. .IFE
  3355.    RTS
  3356.  
  3357. SHUTDOWNmEMORY = *
  3358. .IF COMPUTER-64
  3359.    LDX #0
  3360.    LDA #0
  3361. -  STA COMcODEbUFFER,X
  3362.    INX
  3363.    CPX #COMcODEeND-COMcODEsTART
  3364.    BNE -
  3365. .IFE
  3366.    RTS
  3367.  
  3368. INTERNbANKcONFIGS = *
  3369. .IF COMPUTER-64
  3370.    .BYTE $3F,$7F,$BF,$FF,$BF,$FF,$BF,$FF,$3F
  3371. .ELSE
  3372.    .BYTE $70,$70
  3373. .IFE
  3374.  
  3375. INTERNbANKgROUPS = *
  3376. .IF COMPUTER-64
  3377.    .BYTE $04,$04,$04,$04,$14,$14,$24,$24,$04
  3378. .IFE
  3379.  
  3380. ;***COMMON CODE
  3381.  
  3382. COMcODEsTART = *
  3383.  
  3384. COMzPlOAD = *
  3385.    STY TEMP1
  3386.    LDY ZP+2
  3387. .IF COMPUTER-64
  3388.    LDA INTERNbANKgROUPS,Y
  3389.    STA $D506
  3390. .ELSE
  3391.    PHP
  3392.    SEI
  3393. .IFE
  3394.    LDA INTERNbANKcONFIGS,Y
  3395.    STA BKsELECT
  3396.    LDY #0
  3397. -  LDA (ZP),Y
  3398.    STA 0,X
  3399.    INX
  3400.    INY
  3401.    CPY TEMP1
  3402.    BCC -
  3403.    LDA #BKace
  3404.    STA BKsELECT
  3405. .IF COMPUTER-64
  3406. .ELSE
  3407.    PLP
  3408. .IFE
  3409.    CLC
  3410.    RTS
  3411.  
  3412. COMzPsTORE = *
  3413.    STY TEMP1
  3414.    LDY ZP+2
  3415. .IF COMPUTER-64
  3416.    LDA INTERNbANKgROUPS,Y
  3417.    STA $D506
  3418. .ELSE
  3419.    PHP
  3420.    SEI
  3421. .IFE
  3422.    LDA INTERNbANKcONFIGS,Y
  3423.    STA BKsELECT
  3424.    LDY #0
  3425. -  LDA 0,X
  3426.    STA (ZP),Y
  3427.    INX
  3428.    INY
  3429.    CPY TEMP1
  3430.    BCC -
  3431.    LDA #BKace
  3432.    STA BKsELECT
  3433. .IF COMPUTER-64
  3434. .ELSE
  3435.    PLP
  3436. .IFE
  3437.    CLC
  3438.    RTS
  3439.  
  3440. COMcOPYtOrAM0 = *
  3441.    LDX ZP+2
  3442. .IF COMPUTER-64
  3443.    LDA INTERNbANKgROUPS,X
  3444.    STA $D506
  3445.    LDA INTERNbANKcONFIGS,X
  3446.    TAX
  3447. .ELSE
  3448.    PHP
  3449.    SEI
  3450.    LDA INTERNbANKcONFIGS,X
  3451.    STA BKsELECT
  3452. .IFE
  3453.    DEY
  3454.    BEQ +
  3455. .IF COMPUTER-64
  3456. -  STX BKsELECT
  3457.    LDA (ZP),Y
  3458.    STA BKsELECTrAM0
  3459. .ELSE
  3460. -  LDA (ZP),Y
  3461. .IFE
  3462.    STA (ZW),Y
  3463.    DEY
  3464.    BNE -
  3465. .IF COMPUTER-64
  3466. +  STX BKsELECT
  3467.    LDA (ZP),Y
  3468.    STA BKsELECTrAM0
  3469. .ELSE
  3470. +  LDA (ZP),Y
  3471. .IFE
  3472.    STA (ZW),Y
  3473.    LDA #BKace
  3474.    STA BKsELECT
  3475. .IF COMPUTER-64
  3476. .ELSE
  3477.    PLP
  3478. .IFE
  3479.    CLC
  3480.    RTS
  3481.  
  3482. COMcOPYfROMrAM0 = *
  3483.    LDX ZP+2
  3484. .IF COMPUTER-64
  3485.    LDA INTERNbANKgROUPS,X
  3486.    STA $D506
  3487.    LDA INTERNbANKcONFIGS,X
  3488.    TAX
  3489. .ELSE
  3490.    PHP
  3491.    SEI
  3492.    LDA INTERNbANKcONFIGS,X
  3493.    STA BKsELECT
  3494. .IFE
  3495.    DEY
  3496.    BEQ +
  3497. .IF COMPUTER-64
  3498. -  STA BKsELECTrAM0
  3499.    LDA (ZW),Y
  3500.    STX BKsELECT
  3501. .ELSE
  3502. -  LDA (ZW),Y
  3503. .IFE
  3504.    STA (ZP),Y
  3505.    DEY
  3506.    BNE -
  3507. .IF COMPUTER-64
  3508. +  STA BKsELECTrAM0
  3509.    LDA (ZW),Y
  3510.    STX BKsELECT
  3511. .ELSE
  3512. +  LDA (ZW),Y
  3513. .IFE
  3514.    STA (ZP),Y
  3515.    LDA #BKace
  3516.    STA BKsELECT
  3517. .IF COMPUTER-64
  3518. .ELSE
  3519.    PLP
  3520. .IFE
  3521.    CLC
  3522.    RTS
  3523.  
  3524. COMcODEeND = *
  3525.  
  3526. ;*** ZPLOAD( [ZP]=sOURCE, .x=zPdEST, .y=lENGTH ) : .cs=ERR, [ZP]PRESERVED
  3527.  
  3528. ACEzPlOAD = *
  3529.    LDA ZP+3
  3530.    BEQ NULLpTReRROR
  3531.    CMP #$02
  3532.    BCC +
  3533.    BNE ZPlOADrl
  3534. .IF COMPUTER-64
  3535.    JMP COMzPlOAD-COMcODEsTART+COMcODEbUFFER
  3536. .ELSE
  3537.    JMP COMzPlOAD
  3538. .IFE
  3539. +  STY REU+7
  3540.    LDY #$91
  3541.  
  3542. ZEROpAGErEUoP = *
  3543.    LDA ZP+2
  3544.    STA REU+6
  3545.    STX REU+2
  3546.    LDA #0
  3547.    STA REU+3
  3548.    STA REU+8
  3549.    LDA ZP
  3550.    STA REU+4
  3551.    LDA ZP+1
  3552.    STA REU+5
  3553. .IF COMPUTER-64
  3554.    LDA VIC+$30
  3555.    LDX #$00
  3556.    STX VIC+$30
  3557. .IFE
  3558.    STY REU+1
  3559. .IF COMPUTER-64
  3560.    STA VIC+$30
  3561. .IFE
  3562.    CLC
  3563.    RTS
  3564.  
  3565. NULLpTReRROR = *
  3566.    LDA #ACEeRRnULLpOINTER
  3567.    STA ERRNO
  3568.    SEC
  3569.    RTS
  3570.  
  3571. ZPlOADrl = *
  3572.    LDA #$91
  3573. ZEROpAGErLoP = *  ;( .a=OPCODE, .x=ZPADDR, .y=LEN, [ZP]=FARpTR )
  3574.    STA RAMLINKoPCODE
  3575.    LDA #0
  3576.    STY RAMLINKlENGTH
  3577.    STA RAMLINKlENGTH+1
  3578.    STX RAMLINKnEARpTR
  3579.    STA RAMLINKnEARpTR+1
  3580.    JMP RAMLINKoP
  3581.  
  3582. RAMLINKoPCODE .BUF 1
  3583. RAMLINKlENGTH .BUF 2
  3584. RAMLINKnEARpTR .BUF 2
  3585.  
  3586. RAMLINKoP = *  ;( [ZP]=FARpTR, RAMLINKnEARpTR, RAMLINKlENGTH, RAMLINKoPCODE )
  3587.    JSR RLrEGS
  3588.    LDA RAMLINKoPCODE
  3589.    STA RL+1
  3590.    LDA RAMLINKnEARpTR
  3591.    LDY RAMLINKnEARpTR+1
  3592.    STA RL+2
  3593.    STY RL+3
  3594.    LDX #0
  3595.    LDA ZP+3
  3596.    CMP #ACEmEMrl
  3597.    BEQ +
  3598.    LDX #4
  3599. +  LDA ZP
  3600.    STA RL+4
  3601.    CLC
  3602.    LDA ACErAMLINKsTART,X
  3603.    ADC ZP+1
  3604.    STA RL+5
  3605.    LDA ACErAMLINKsTART+1,X
  3606.    ADC ZP+2
  3607.    STA RL+6
  3608.    LDA RAMLINKlENGTH
  3609.    LDY RAMLINKlENGTH+1
  3610.    STA RL+7
  3611.    STY RL+8
  3612.    LDA #0
  3613.    STA RL+10
  3614.    STA RL+16
  3615.    JSR RLeXEC
  3616.    CLC
  3617.    RTS
  3618.  
  3619. ;*** ZPSTORE( .x=zPsOURCE, [ZP]=dEST, .y=lENGTH ) : .cs=ERR, [ZP]PRESERVED
  3620.  
  3621. ACEzPsTORE = *
  3622.    LDA ZP+3
  3623.    BEQ NULLpTReRROR
  3624.    CMP #$02
  3625.    BCC +
  3626.    BNE ZPsTORErl
  3627. .IF COMPUTER-64
  3628.    JMP COMzPsTORE-COMcODEsTART+COMcODEbUFFER
  3629. .ELSE
  3630.    JMP COMzPsTORE
  3631. .IFE
  3632. +  STY REU+7
  3633.    LDY #$90
  3634.    JMP ZEROpAGErEUoP
  3635.  
  3636. ZPsTORErl = *
  3637.    LDA #$90
  3638.    JMP ZEROpAGErLoP
  3639.  
  3640. ;*** FETCH( [ZP]=fARsOURCE, (ZW)=rAM0dEST, .ay=lENGTH )
  3641.  
  3642. FETCHlENGTH     .BUF 2
  3643. FETCHsAVEsOURCE .BUF 1
  3644. FETCHsAVEdEST   .BUF 1
  3645.  
  3646. ACEfETCH = *
  3647.    LDX ZP+3
  3648.    BEQ FETCHnULLpTReRROR
  3649.    CPX #ACEmEMiNTERNAL
  3650.    BCS +
  3651.    LDX #$91
  3652.    JMP DOrEU
  3653. +  BNE FETCHrl
  3654.    CPY #0
  3655.    BNE FETCHlONG
  3656.    TAY
  3657.    BNE FETCHpAGE
  3658.    CLC
  3659.    RTS
  3660.  
  3661.    FETCHnULLpTReRROR = *
  3662.    JMP NULLpTReRROR
  3663.  
  3664.    FETCHpAGE = *  ;( [ZP]=FROM, (ZW)=TO, .y=LEN(0=256) )
  3665.    LDX ZP+2
  3666.    CPX #0
  3667.    BEQ +
  3668.    JMP COMcOPYtOrAM0-COMcODEsTART+COMcODEbUFFER
  3669. .IF COMPUTER-64
  3670. +  STX BKsELECTrAM0
  3671. .ELSE
  3672. +  PHP
  3673.    SEI
  3674.    LDX #BKrAM0
  3675.    STX BKsELECT
  3676. .IFE
  3677.    DEY
  3678.    BEQ +
  3679. -  LDA (ZP),Y
  3680.    STA (ZW),Y
  3681.    DEY
  3682.    BNE -
  3683. +  LDA (ZP),Y
  3684.    STA (ZW),Y
  3685.    LDA #BKace
  3686.    STA BKsELECT
  3687. .IF COMPUTER-64
  3688. .ELSE
  3689.    PLP
  3690. .IFE
  3691.    CLC
  3692.    RTS
  3693.  
  3694.    FETCHlONG = *
  3695.    STA FETCHlENGTH
  3696.    STY FETCHlENGTH+1
  3697.    LDA ZP+1
  3698.    STA FETCHsAVEsOURCE
  3699.    LDA ZW+1
  3700.    STA FETCHsAVEdEST
  3701.    LDA FETCHlENGTH+1
  3702.    BEQ FETCHlONGeXIT
  3703. -  LDY #0
  3704.    JSR FETCHpAGE
  3705.    INC ZP+1
  3706.    INC ZW+1
  3707.    DEC FETCHlENGTH+1
  3708.    BNE -
  3709.  
  3710.    FETCHlONGeXIT = *
  3711.    LDY FETCHlENGTH
  3712.    BEQ +
  3713.    JSR FETCHpAGE
  3714. +  LDA FETCHsAVEsOURCE
  3715.    STA ZP+1
  3716.    LDA FETCHsAVEdEST
  3717.    STA ZW+1
  3718.    CLC
  3719.    RTS
  3720.  
  3721. FETCHrl = *
  3722.    LDX #$91
  3723. LARGErLoP = *
  3724.    STX RAMLINKoPCODE
  3725.    STA RAMLINKlENGTH
  3726.    STY RAMLINKlENGTH+1
  3727.    LDA ZW
  3728.    LDY ZW+1
  3729.    STA RAMLINKnEARpTR
  3730.    STY RAMLINKnEARpTR+1
  3731.    JMP RAMLINKoP
  3732.  
  3733. ;*** STASH( (ZW)=rAM0sOURCE, [ZP]=fARdEST, .ay=LENGTH )
  3734.  
  3735. STASHlENGTH     .BUF 2
  3736. STASHsAVEsOURCE .BUF 1
  3737. STASHsAVEdEST   .BUF 1
  3738.  
  3739. ACEsTASH = *
  3740.    LDX ZP+3
  3741.    BEQ STASHnULLpTReRROR
  3742.    CPX #ACEmEMiNTERNAL
  3743.    BCS +
  3744.    LDX #$90
  3745.    JMP DOrEU
  3746. +  BNE STASHrl
  3747.    CPY #0
  3748.    BNE STASHlONG
  3749.    TAY
  3750.    BNE STASHpAGE
  3751.    CLC
  3752.    RTS
  3753.  
  3754.    STASHnULLpTReRROR = *
  3755.    JMP NULLpTReRROR
  3756.  
  3757.    STASHpAGE = *
  3758.    LDX ZP+2
  3759.    CPX #0
  3760.    BEQ +
  3761.    JMP COMcOPYfROMrAM0-COMcODEsTART+COMcODEbUFFER
  3762. .IF COMPUTER-64
  3763. +  STX BKsELECTrAM0
  3764. .ELSE
  3765. +  PHP
  3766.    SEI
  3767.    LDX #BKrAM0
  3768.    STX BKsELECT
  3769. .IFE
  3770.    DEY
  3771.    BEQ +
  3772. -  LDA (ZW),Y
  3773.    STA (ZP),Y
  3774.    DEY
  3775.    BNE -
  3776. +  LDA (ZW),Y
  3777.    STA (ZP),Y
  3778.    LDA #BKace
  3779.    STA BKsELECT
  3780. .IF COMPUTER-64
  3781. .ELSE
  3782.    PLP
  3783. .IFE
  3784.    CLC
  3785.    RTS
  3786.  
  3787.    STASHlONG = *
  3788.    STA STASHlENGTH
  3789.    STY STASHlENGTH+1
  3790.    LDA ZW+1
  3791.    STA STASHsAVEsOURCE
  3792.    LDA ZP+1
  3793.    STA STASHsAVEdEST
  3794.    LDA STASHlENGTH+1
  3795.    BEQ STASHlONGeXIT
  3796. -  LDY #0
  3797.    JSR STASHpAGE
  3798.    INC ZP+1
  3799.    INC ZW+1
  3800.    DEC STASHlENGTH+1
  3801.    BNE -
  3802.  
  3803.    STASHlONGeXIT = *
  3804.    LDY STASHlENGTH
  3805.    BEQ +
  3806.    LDX ZP+2
  3807.    JSR STASHpAGE
  3808. +  LDA STASHsAVEsOURCE
  3809.    STA ZW+1
  3810.    LDA STASHsAVEdEST
  3811.    STA ZP+1
  3812.    CLC
  3813.    RTS
  3814.  
  3815. STASHrl = *
  3816.    LDX #$90
  3817.    JMP LARGErLoP
  3818.  
  3819. ;*** RAM0 LOAD/STORE(.x) EXPANSION MEMORY [ZP] <- -> (ZW) FOR .ay BYTES
  3820.  
  3821. DOrEU = *
  3822.    STA REU+7
  3823.    STY REU+8
  3824.    LDA ZW
  3825.    LDY ZW+1
  3826.    STA REU+2
  3827.    STY REU+3
  3828.    LDA ZP
  3829.    LDY ZP+1
  3830.    STA REU+4
  3831.    STY REU+5
  3832.    LDA ZP+2
  3833.    STA REU+6
  3834.    LDY VIC+$30
  3835.    LDA #0
  3836.    STA VIC+$30
  3837.    STX REU+1
  3838.    STY VIC+$30
  3839.    CLC
  3840.    RTS
  3841.  
  3842. ;*** MEMORY ALLOCATION ROUTINES
  3843.  
  3844. FREEMAPbANK     .BUF 2
  3845. FREEMAPdIRTY    .BUF 1
  3846. FREEMAPpAGE     .BUF 1
  3847. SEARCHmINfAIL   .BUF 8
  3848.  
  3849. INITmEMORYaLLOC = *
  3850.    LDX #0
  3851.    LDY #0
  3852.    STX FREEMAPpAGE
  3853.    STX FREEMAPdIRTY
  3854. -  LDA RAM0fREEmAP,X
  3855.    STA FREEMAP,X
  3856.    BNE +
  3857.    INY
  3858. +  INX
  3859.    BNE -
  3860.    LDA #0
  3861.    LDY #ACEmEMiNTERNAL
  3862.    STA FREEMAPbANK+0
  3863.    STY FREEMAPbANK+1
  3864.    LDA #$00
  3865.    LDX #0
  3866. -  STA SEARCHmINfAIL,X
  3867.    INX
  3868.    CPX #8
  3869.    BCC -
  3870.    CLC
  3871.    RTS
  3872.  
  3873. FREEMAPbANKsAVE .BUF 2
  3874.  
  3875. GETfREEMAP = *  ;( .ay=BANK )
  3876.    CMP FREEMAPbANK+0
  3877.    BNE +
  3878.    CPY FREEMAPbANK+1
  3879.    BNE +
  3880.    RTS
  3881.  
  3882.    ;** SAVE OLD FREEMAP
  3883. +  STA FREEMAPbANKsAVE+0
  3884.    STY FREEMAPbANKsAVE+1
  3885.    LDA FREEMAPdIRTY
  3886.    BEQ +
  3887.    LDA FREEMAPbANK+0
  3888.    LDY FREEMAPbANK+1
  3889.    JSR LOCATEbANKfREEMAP
  3890.    JSR SETzWfREEMAP
  3891.    JSR STASH
  3892.  
  3893.    ;** LOAD NEW FREEMAP
  3894. +  LDA FREEMAPbANKsAVE+0
  3895.    LDY FREEMAPbANKsAVE+1
  3896.    STA FREEMAPbANK+0
  3897.    STY FREEMAPbANK+1
  3898.    JSR LOCATEbANKfREEMAP
  3899.    JSR SETzWfREEMAP
  3900.    JSR FETCH
  3901.    LDA #0
  3902.    STA FREEMAPdIRTY
  3903.    STA FREEMAPpAGE
  3904.    RTS
  3905.  
  3906.    SETzWfREEMAP = *  ;() : .ay=#256
  3907.    LDA #<FREEMAP
  3908.    LDY #>FREEMAP
  3909.    STA ZW+0
  3910.    STY ZW+1
  3911.    LDA #<256
  3912.    LDY #>256
  3913.    RTS
  3914.  
  3915. LOCATEbANKfREEMAP = *  ;( .ay=BANK ) : [ZP]
  3916.    STA ZP+2
  3917.    STY ZP+3
  3918.    LDA #<$FF00
  3919.    LDX #>$FF00
  3920.    STA ZP+0
  3921.    STX ZP+1
  3922.    CPY #ACEmEMiNTERNAL
  3923.    BEQ +
  3924.    RTS
  3925. +  LDA ZP+2
  3926.    BNE +
  3927.    ;** RAM0
  3928.    LDA ACErAM0fREEMAP+0
  3929.    LDY ACErAM0fREEMAP+1
  3930. -  STA ZP+0
  3931.    STY ZP+1
  3932.    RTS
  3933. +  CMP #1
  3934.    BNE +
  3935.    ;** RAM1
  3936.    LDA #0
  3937.    LDY ACErAM1fREEMAP
  3938.    JMP -
  3939.    ;** EXP.INT.RAM
  3940. +  LDA #<$0400
  3941.    LDY #>$0400
  3942.    JMP -
  3943.  
  3944. SEARCHtYPEsTART .BUF 1
  3945. SEARCHtYPEsTOP  .BUF 1
  3946. SEARCHsIZE      .BUF 1
  3947. SEARCHtYPEjMP = *
  3948.    .WORD 0,PAGEaLLOCreu,PAGEaLLOCiNTERNAL,0,0,0,PAGEaLLOCrlreu,PAGEaLLOCrl
  3949.  
  3950. ACEpAGEaLLOC = *  ;( .a=PAGES, .x=STtYPE, .y=ENDtYPE ) : [ZP]=FARpTR
  3951.    STA SEARCHsIZE
  3952.    CMP #0
  3953.    BNE +
  3954.    JSR PAGEaLLOCfAIL
  3955.    CLC
  3956.    RTS
  3957. +  CPX #ACEmEMreu
  3958.    BCS +
  3959.    LDX #ACEmEMreu
  3960. +  CPY #ACEmEMrl
  3961.    BEQ +
  3962.    BCC +
  3963.    LDY #ACEmEMrl
  3964. +  STX SEARCHtYPEsTART
  3965.    STY SEARCHtYPEsTOP
  3966. -  LDA SEARCHtYPEsTART
  3967.    CMP SEARCHtYPEsTOP
  3968.    BEQ +
  3969.    BCS PAGEaLLOCfAIL
  3970. +  LDX SEARCHtYPEsTART
  3971.    LDA SEARCHmINfAIL,X
  3972.    BEQ +
  3973.    CMP SEARCHsIZE
  3974.    BEQ PAGEaLLOCnEXT
  3975.    BCC PAGEaLLOCnEXT
  3976. +  LDA SEARCHtYPEsTART
  3977.    ASL
  3978.    TAX
  3979.    LDA SEARCHtYPEjMP+0,X
  3980.    STA ZP+0
  3981.    LDA SEARCHtYPEjMP+1,X
  3982.    BEQ PAGEaLLOCnEXT
  3983.    STA ZP+1
  3984.    JSR PAGEaLLOCdISPATCH
  3985.    BCC ++
  3986.    LDX SEARCHtYPEsTART
  3987.    LDA SEARCHmINfAIL,X
  3988.    BEQ +
  3989.    CMP SEARCHsIZE
  3990.    BCC PAGEaLLOCnEXT
  3991. +  LDA SEARCHsIZE
  3992.    STA SEARCHmINfAIL,X
  3993.  
  3994.    PAGEaLLOCnEXT = *
  3995.    INC SEARCHtYPEsTART
  3996.    JMP -
  3997. +  LDX ZP+3
  3998.    LDA ZP+2
  3999.    CMP MINuSEDbANK,X
  4000.    BCS +
  4001.    STA MINuSEDbANK,X
  4002. +  CMP MAXuSEDbANK,X
  4003.    BCC +
  4004.    STA MAXuSEDbANK,X
  4005. +  CLC
  4006.    RTS
  4007.  
  4008.    PAGEaLLOCdISPATCH = *
  4009.    JMP (ZP)
  4010.  
  4011.    PAGEaLLOCfAIL = *
  4012.    LDA #ACEeRRiNSUFFICIENTmEMORY
  4013.    STA ERRNO
  4014.    LDA #$00
  4015.    STA ZP+0
  4016.    STA ZP+1
  4017.    STA ZP+2
  4018.    STA ZP+3
  4019.    SEC
  4020.    RTS
  4021.  
  4022. PAGEaLLOCreu = *  ;( ) : .x=PAGE, FREEMAPbANK, .cc=OK
  4023.    LDA #ACEmEMreu
  4024.    STA ZP+3
  4025.    LDA ACErEUcUR
  4026.    LDX ACErEUsTART
  4027.    LDY ACErEUbANKS
  4028.    JSR SEARCHtYPE
  4029.    STA ACErEUcUR
  4030.    RTS
  4031.  
  4032. PAGEaLLOCiNTERNAL = *
  4033.    LDA #ACEmEMiNTERNAL
  4034.    STA ZP+3
  4035.    LDA ACEiNTERNALcUR
  4036.    LDX #$00
  4037.    LDY ACEiNTERNALbANKS
  4038.    JSR SEARCHtYPE
  4039.    STA ACEiNTERNALcUR
  4040.    RTS
  4041.  
  4042. PAGEaLLOCrlreu = *
  4043.    LDA #ACEmEMrlreu
  4044.    STA ZP+3
  4045.    LDA ACErAMLINKrEUcUR
  4046.    LDX ACErEUsTART
  4047.    LDY ACErAMLINKrEUbANKS
  4048.    JSR SEARCHtYPE
  4049.    STA ACErAMLINKrEUcUR
  4050.    RTS
  4051.  
  4052. PAGEaLLOCrl = *
  4053.    LDA #ACEmEMrl
  4054.    STA ZP+3
  4055.    LDA ACErAMLINKcUR
  4056.    LDX #$00
  4057.    LDY ACErAMLINKbANKS
  4058.    JSR SEARCHtYPE
  4059.    STA ACErAMLINKcUR
  4060.    RTS
  4061.  
  4062. SEARCHcURRENT .BUF 1
  4063. SEARCHsTART   .BUF 1
  4064. SEARCHsTOP    .BUF 1
  4065.  
  4066. SEARCHtYPE = *  ;( ZP+3=TYPE, .a=CURRENT, .x=START, .y=STOP ):[ZP],.cc,.a=CUR,.x
  4067.    STA SEARCHcURRENT
  4068.    STA ZP+2
  4069.    STX SEARCHsTART
  4070.    STY SEARCHsTOP
  4071.    CPX SEARCHsTOP
  4072.    BCC +
  4073.    RTS
  4074. /  LDA ZP+2
  4075.    LDY ZP+3
  4076.    JSR GETfREEMAP
  4077.    LDY SEARCHsIZE
  4078.    JSR SEARCHfREEMAP
  4079.    BCS +
  4080.    LDA #0
  4081.    STA ZP+0
  4082.    STX ZP+1
  4083.    LDA ZP+2
  4084.    CLC
  4085.    RTS
  4086. +  INC ZP+2
  4087.    LDA ZP+2
  4088.    CMP SEARCHsTOP
  4089.    BCC +
  4090.    LDA SEARCHsTART
  4091.    STA ZP+2
  4092. +  LDA ZP+2
  4093.    CMP SEARCHcURRENT
  4094.    BNE -
  4095.    SEC
  4096.    RTS
  4097.  
  4098. SEARCHpAGES .BUF 1
  4099. NEWMAX      .BUF 1
  4100.  
  4101. SEARCHfREEMAP = *  ;( .y=PAGES ) : .cc=FOUND, .x=FIRSTpG
  4102.    ;** FIRST FREE
  4103.    LDX FREEMAPpAGE
  4104.    LDA FREEMAP,X
  4105.    BEQ +
  4106. -  INX
  4107.    BEQ FREEMAPfULL
  4108.    LDA FREEMAP,X
  4109.    BNE -
  4110.    STX FREEMAPpAGE
  4111.    JMP +
  4112.    FREEMAPfULL = *
  4113.    SEC
  4114.    RTS
  4115.  
  4116.    ;** SEARCH
  4117. +  STY SEARCHpAGES
  4118.    CPX #0
  4119.    BEQ +
  4120.    DEX
  4121. -  LDY SEARCHpAGES
  4122. -  INX
  4123.    BEQ FREEMAPfULL
  4124. +  LDA FREEMAP,X
  4125.    BNE --
  4126.    DEY
  4127.    BNE -
  4128.  
  4129.    ;** ALLOCATE
  4130.    STX NEWMAX
  4131.    LDY SEARCHpAGES
  4132.    LDA ACEpROCESSid
  4133. -  STA FREEMAP,X
  4134.    DEX
  4135.    DEY
  4136.    BNE -
  4137.    INX
  4138.    CPX FREEMAPpAGE
  4139.    BNE +
  4140.    LDY NEWMAX
  4141.    INY
  4142.    STY FREEMAPpAGE
  4143. +  LDA #$FF
  4144.    STA FREEMAPdIRTY
  4145.    SEC
  4146.    LDA ACEfREEmEMORY+1
  4147.    SBC SEARCHpAGES
  4148.    STA ACEfREEmEMORY+1
  4149.    LDA ACEfREEmEMORY+2
  4150.    SBC #0
  4151.    STA ACEfREEmEMORY+2
  4152.    BCS +
  4153.    DEC ACEfREEmEMORY+3
  4154. +  CLC
  4155.    RTS
  4156.  
  4157. FREEpAGE .BUF 1
  4158. FREElEN  .BUF 1
  4159.  
  4160. ACEpAGEfREE = *  ;( [ZP]=fARpTR, .a=PAGES )
  4161.    STA FREElEN
  4162.    CMP #0
  4163.    BNE +
  4164.    JMP PAGEfREEeXIT
  4165. +  LDA ZP+3
  4166.    CMP #ACEmEMnULL
  4167.    BNE +
  4168.    LDA #ACEeRRnULLpOINTER
  4169.    JMP PAGEfREEfAIL
  4170. +  LDA #ACEeRRiNVALIDfREEpARMS
  4171.    LDX ZP+0
  4172.    BNE PAGEfREEfAIL
  4173.    LDA ZP+1
  4174.    STA FREEpAGE
  4175.    CLC
  4176.    ADC FREElEN
  4177.    BCC +
  4178.    LDA #ACEeRRiNVALIDfREEpARMS
  4179.    JMP PAGEfREEfAIL
  4180. +  LDA ZP+2
  4181.    LDY ZP+3
  4182.    JSR GETfREEMAP
  4183.    LDA ACEpROCESSid
  4184.    LDX FREEpAGE
  4185.    LDY FREElEN
  4186. -  CMP FREEMAP,X
  4187.    BEQ +
  4188.    LDA #ACEeRRfREEnOToWNED
  4189.    JMP PAGEfREEfAIL
  4190. +  INX
  4191.    DEY
  4192.    BNE -
  4193.    LDX FREEpAGE
  4194.    LDY FREElEN
  4195.    LDA #$00
  4196. -  STA FREEMAP,X
  4197.    INX
  4198.    DEY
  4199.    BNE -
  4200.    LDA #$FF
  4201.    STA FREEMAPdIRTY
  4202.    LDA FREEpAGE
  4203.    CMP FREEMAPpAGE
  4204.    BCS +
  4205.    STA FREEMAPpAGE
  4206.    ;** ASSUME 2*(MIN-1)+LEN+1 NEW MIN
  4207. +  LDX ZP+3
  4208.    LDA SEARCHmINfAIL,X
  4209.    BEQ ++
  4210.    SEC
  4211.    SBC #1
  4212.    ASL
  4213.    BCS +
  4214.    SEC
  4215.    ADC FREElEN
  4216.    BCC ++
  4217. +  LDA #0
  4218. +  STA SEARCHmINfAIL,X
  4219.  
  4220.    CLC
  4221.    LDA ACEfREEmEMORY+1
  4222.    ADC FREElEN
  4223.    STA ACEfREEmEMORY+1
  4224.    BCC PAGEfREEeXIT
  4225.    INC ACEfREEmEMORY+2
  4226.    BNE PAGEfREEeXIT
  4227.    INC ACEfREEmEMORY+3
  4228.  
  4229.    PAGEfREEeXIT = *
  4230.    CLC
  4231.    RTS
  4232.  
  4233.    PAGEfREEfAIL = *
  4234.    STA ERRNO
  4235.    SEC
  4236.    RTS
  4237.  
  4238. RECLAIMmEMtYPE .BUF 1
  4239.  
  4240. RECLAIMpROCmEMORY = *
  4241.    LDX #0
  4242. -  LDA MINuSEDbANK,X
  4243.    CMP MAXuSEDbANK,X
  4244.    BEQ +
  4245.    BCS ++
  4246. +  STX RECLAIMmEMtYPE
  4247.    LDA MINuSEDbANK,X
  4248.    LDY MAXuSEDbANK,X
  4249.    TAX
  4250.    LDA RECLAIMmEMtYPE
  4251.    JSR RECLAIMpROCtYPE
  4252.    LDX RECLAIMmEMtYPE
  4253. +  INX
  4254.    CPX #ACEmEMtYPES
  4255.    BCC -
  4256.    RTS
  4257.  
  4258. RPbANK  .BUF 2
  4259. RPeND   .BUF 1
  4260.  
  4261. RECLAIMpROCtYPE = *  ;( .a=TYPE, .x=STARTbANK, .y=ENDbANK )
  4262.    STX RPbANK+0
  4263.    STA RPbANK+1
  4264.    STY RPeND
  4265. -  LDA RPbANK+0
  4266.    LDY RPbANK+1
  4267.    CMP RPeND
  4268.    BEQ +
  4269.    BCS ++
  4270. +  JSR GETfREEMAP
  4271.    JSR RECLAIMpROCfREEMAP
  4272.    INC RPbANK+0
  4273.    BNE -
  4274. +  RTS
  4275.  
  4276. RECLAIMpROCfREEMAP = *  ;( ) : .y=PAGESrEMOVED
  4277.    LDY #0
  4278.    LDX #0
  4279.    LDA ACEpROCESSid
  4280.    JMP +
  4281. -  INX
  4282.    BEQ ++
  4283. +  CMP FREEMAP,X
  4284.    BNE -
  4285.    LDA #0
  4286.    STA FREEMAP,X
  4287.    INY
  4288.    LDA ACEpROCESSid
  4289.    JMP -
  4290. +  CPY #0
  4291.    BEQ +
  4292.    LDA #0
  4293.    STA FREEMAPpAGE
  4294.    LDX FREEMAPbANK+1
  4295.    STA SEARCHmINfAIL,X
  4296.    LDA #$FF
  4297.    STA FREEMAPdIRTY
  4298.    TYA
  4299.    CLC
  4300.    ADC ACEfREEmEMORY+1
  4301.    STA ACEfREEmEMORY+1
  4302.    BCC +
  4303.    INC ACEfREEmEMORY+2
  4304.    BNE +
  4305.    INC ACEfREEmEMORY+3
  4306. +  CLC
  4307.    RTS
  4308.  
  4309. MINuSEDbANK .BUF ACEmEMtYPES
  4310. MAXuSEDbANK .BUF ACEmEMtYPES  ;PLUS 1
  4311.  
  4312. CLEARmEMORYiNFO = *
  4313.    LDX #ACEmEMtYPES-1
  4314. -  LDA #$FF
  4315.    STA MINuSEDbANK,X
  4316.    LDA #$00
  4317.    STA MAXuSEDbANK,X
  4318.    DEX
  4319.    BPL -
  4320.    RTS
  4321.  
  4322. ;*** PROCESS PRIMITIVES
  4323.  
  4324. EXITcODEsAVE .BUF 1
  4325.  
  4326. ACEeXEC = *
  4327.    STA SYSWORK+0
  4328.    STY SYSWORK+1
  4329.    ;XX PUSH OLD MEMORY INFO
  4330.    JSR CLEARmEMORYiNFO
  4331.    LDA ACErESTOREsTACK
  4332.    PHA
  4333.    TSX
  4334.    STX ACErESTOREsTACK
  4335.    INC ACEpROCESSid
  4336.    JSR ACEeNTER
  4337.    LDA #0
  4338.  
  4339.    ACErEeNTER = *
  4340.    STA EXITcODEsAVE
  4341.    PLA
  4342.    STA ACErESTOREsTACK
  4343.    JSR RECLAIMoPENfILES
  4344.    JSR RECLAIMpROCmEMORY
  4345.    JSR CLEARmEMORYiNFO ;** MAKE RESTORE MEMORY INFO
  4346.    DEC ACEpROCESSid
  4347.    LDA EXITcODEsAVE
  4348.    CLC
  4349.    RTS
  4350.  
  4351.    ACEeNTER = *
  4352.    JMP (SYSWORK)
  4353.  
  4354. ACEeXIT = *
  4355.    LDX ACErESTOREsTACK
  4356.    TXS
  4357.    JMP ACErEeNTER
  4358.  
  4359. RECLAIMsAVE .BUF 1
  4360.  
  4361. RECLAIMoPENfILES = *
  4362.    JSR KERNELcLRCHN
  4363.    LDX #0
  4364. -  LDA LFTABLE,X
  4365.    CMP #LFNULL
  4366.    BEQ +
  4367.    LDA PIDTABLE,X
  4368.    CMP ACEpROCESSid
  4369.    BNE +
  4370.    STX RECLAIMsAVE
  4371.    TXA
  4372.    JSR CLOSE
  4373.    LDX RECLAIMsAVE
  4374. +  INX
  4375.    CPX #FCBcOUNT
  4376.    BCC -
  4377.    RTS
  4378.  
  4379. ACEVDC.S
  4380. 578
  4381. ;ace-128/64 KERNEL vdc 80-COLUMN SCREEN DRIVER CODE
  4382.  
  4383. ;VDC MEMORY LAYOUT: $0000=CHAR,$1000=COLOR,$2000=CHARSET,$3000=ALTCHARSET
  4384.  
  4385. VDCcOLORaDDR = $1000
  4386. VDCcHARSETaDDR = $2000
  4387. VDCsELECT = $D600
  4388. VDCsTATUS = $D600
  4389. VDCdATA = $D601
  4390. VDCrOWiNC = 80
  4391.  
  4392. VDCwINsCRx   .BUF 1
  4393. VDCwINsCRy   .BUF 1
  4394. VDCwINrOWS   .BUF 1
  4395. VDCwINcOLS   .BUF 1
  4396. VDCwINsTART  .BUF 2
  4397. VDCwINsAVEsZ .BUF 2
  4398.  
  4399. VDCiNIT = *
  4400.    ;** CHARSET
  4401.    JSR VDCfILLmODE
  4402.    JSR VDClOADcHARSET
  4403.    ;** INIT SCREEN COLORS
  4404.    NOP
  4405.    ;** MOVE ATTRIBUTES
  4406.    LDA #<VDCcOLORaDDR
  4407.    LDY #>VDCcOLORaDDR
  4408.    LDX #$14
  4409.    JSR VDCwRITE16
  4410.    ;** CURSOR HEIGHT
  4411.    LDA #8
  4412.    LDX #$0B
  4413.    JSR VDCwRITE
  4414.    ;** WINDOW PARAMETERS
  4415.    JSR VDCwINMAX
  4416.    RTS
  4417.  
  4418. VDCsHUTDOWN = *
  4419.    ;** RESTORE CHARSET
  4420.    LDA #<$D000
  4421.    LDY #>$D000
  4422.    STA SYSWORK+0
  4423.    STY SYSWORK+1
  4424.    LDA #<$2000
  4425.    LDY #>$2000
  4426.    STA SYSWORK+2
  4427.    STY SYSWORK+3
  4428.    SEI
  4429.    LDA #BKcHARSET
  4430.    STA BKsELECT
  4431.    LDX #8
  4432.    LDY #0
  4433. -  LDA (SYSWORK+0),Y
  4434.    STA (SYSWORK+2),Y
  4435.    INY
  4436.    BNE -
  4437.    INC SYSWORK+1
  4438.    INC SYSWORK+3
  4439.    DEX
  4440.    BNE -
  4441.    LDA #BKace
  4442.    STA BKsELECT
  4443.    CLI
  4444.    JSR VDClOADcHARSET
  4445.    ;** RESTORE ATTRIBUTES
  4446.    LDA #<$800
  4447.    LDY #>$800
  4448.    LDX #$14
  4449.    JSR VDCwRITE16
  4450.    ;** RESTORE CURSOR HEIGHT
  4451.    LDA #7
  4452.    LDX #$0B
  4453.    JSR VDCwRITE
  4454.    RTS
  4455.  
  4456. CHSsOURCE = SYSWORK+0
  4457. CHScOUNT  = SYSWORK+2
  4458.  
  4459. VDClOADcHARSET = *
  4460.    LDA #<VDCcHARSETaDDR
  4461.    LDY #>VDCcHARSETaDDR
  4462.    JSR VDCaDDRwRITE16
  4463.    LDA #<$2000
  4464.    LDY #>$2000
  4465.    STA CHSsOURCE+0
  4466.    STY CHSsOURCE+1
  4467.    LDX #0
  4468.    STX CHScOUNT
  4469.  
  4470.    CHARlOOP = *
  4471.    LDA #$1F
  4472.    STA VDCsELECT
  4473.    LDY #0
  4474. -  LDA (CHSsOURCE),Y
  4475. -  BIT VDCsTATUS
  4476.    BPL -
  4477.    STA VDCdATA
  4478.    INY
  4479.    CPY #8
  4480.    BCC --
  4481.    LDA #$00
  4482.    JSR VDCrAMwRITE
  4483.    LDX #$1E
  4484.    LDA #7
  4485.    JSR VDCwRITE
  4486.    CLC
  4487.    LDA CHSsOURCE+0
  4488.    ADC #8
  4489.    STA CHSsOURCE+0
  4490.    BCC +
  4491.    INC CHSsOURCE+1
  4492. +  INC CHScOUNT
  4493.    BNE CHARlOOP
  4494.    RTS
  4495.  
  4496. VDCfILLmODE = *  ;( )
  4497.    LDX #$18
  4498.    JSR VDCrEAD
  4499.    AND #$7F
  4500.    JSR VDCwRITE
  4501.    RTS
  4502.  
  4503. VDCcOPYmODE = *  ;( )
  4504.    LDX #$18
  4505.    JSR VDCrEAD
  4506.    ORA #$80
  4507.    JSR VDCwRITE
  4508.    RTS
  4509.  
  4510. VDCrAMwRITE = *  ;( .a=VALUE )
  4511.    LDX #$1F
  4512.  
  4513. VDCwRITE = *  ;( .x=REGISTER, .a=VALUE )
  4514.    STX VDCsELECT
  4515. -  BIT VDCsTATUS
  4516.    BPL -
  4517.    STA VDCdATA
  4518.    RTS
  4519.  
  4520. VDCaDDRwRITE16 = *  ;( .ay=VALUE )
  4521.    LDX #$12
  4522.  
  4523. VDCwRITE16 = *  ;( .x=HIrEGISTER, .ay=VALUE )
  4524.    STX VDCsELECT
  4525. -  BIT VDCsTATUS
  4526.    BPL -
  4527.    STY VDCdATA
  4528.    INX
  4529.    STX VDCsELECT
  4530. -  BIT VDCsTATUS
  4531.    BPL -
  4532.    STA VDCdATA
  4533.    RTS
  4534.  
  4535. VDCrAMrEAD = *  ;( ) : .a=VALUE
  4536.    LDX #$1F
  4537.  
  4538. VDCrEAD = *  ;( .x=REGISTER ) : .a=VALUE
  4539.    STX VDCsELECT
  4540. -  BIT VDCsTATUS
  4541.    BPL -
  4542.    LDA VDCdATA
  4543.    RTS
  4544.  
  4545. VDCwINMAX = *
  4546.    LDA #0
  4547.    STA VDCwINsCRx
  4548.    STA VDCwINsCRy
  4549.    STA VDCwINsTART+0
  4550.    STA VDCwINsTART+1
  4551.    LDA #25
  4552.    LDX #80
  4553.    STA VDCwINrOWS
  4554.    STX VDCwINcOLS
  4555.    LDA #<2000+2000+16
  4556.    LDY #>2000+2000+16
  4557.    STA VDCwINsAVEsZ+0
  4558.    STY VDCwINsAVEsZ+1
  4559.    CLC
  4560.    RTS
  4561.  
  4562. VDCcLScOLOR .BUF 1
  4563.  
  4564. VDCwINCLS = *
  4565.    STA VDCfILLbYTE
  4566.    STY VDCcLScOLOR
  4567.    STX SYSWORK+2
  4568.    BIT SYSWORK+2
  4569.    BPL +
  4570.    JSR VDCwINCLSsETUP
  4571.    JSR VDCrOWfILL
  4572. +  BIT SYSWORK+2
  4573.    BVC +
  4574.    JSR VDCwINCLSsETUP
  4575.    LDA VDCcLScOLOR
  4576.    STA VDCfILLbYTE
  4577.    JSR VDCaDDcOLOR
  4578.    JSR VDCrOWfILL
  4579. +  RTS
  4580.  
  4581. VDCwINCLSsETUP = *
  4582.    LDA VDCwINsTART+0
  4583.    LDY VDCwINsTART+1
  4584.    STA SYSWORK+0
  4585.    STY SYSWORK+1
  4586.    LDA VDCwINrOWS
  4587.    STA VDCfILLrOWS
  4588.    RTS
  4589.  
  4590. VDCaDDcOLOR = *
  4591.    CLC
  4592.    LDA SYSWORK+1
  4593.    ADC #>VDCcOLORaDDR
  4594.    STA SYSWORK+1
  4595.    RTS
  4596.  
  4597. VDCfILLbYTE .BUF 1
  4598. VDCfILLrOWS .BUF 1
  4599. VDCfILLcOLS .BUF 1
  4600.  
  4601. VDCrOWfILL = * ;( (SW+0)=ADDR++, VDCfILLbYTE, VDCfILLrOWS-- )
  4602.    LDA VDCwINcOLS
  4603.    STA VDCfILLcOLS
  4604.    LDA VDCfILLrOWS
  4605.    BNE +
  4606.    RTS
  4607. /  JSR VDCcOLfILL
  4608.    CLC
  4609.    LDA SYSWORK+0
  4610.    ADC #VDCrOWiNC
  4611.    STA SYSWORK+0
  4612.    BCC +
  4613.    INC SYSWORK+1
  4614. +  DEC VDCfILLrOWS
  4615.    BNE -
  4616.    RTS
  4617.  
  4618. VDCcOLfILL = * ;( (SW+0)=ADDR, VDCfILLbYTE, VDCfILLcOLS )
  4619.    LDA SYSWORK+0
  4620.    LDY SYSWORK+1
  4621.    JSR VDCaDDRwRITE16
  4622. VDCcOLfILLgOTaDDR = *
  4623.    LDA VDCfILLcOLS
  4624.    BEQ +
  4625.    LDA VDCfILLbYTE
  4626.    JSR VDCrAMwRITE
  4627.    LDX VDCfILLcOLS
  4628.    DEX
  4629.    BEQ +
  4630.    TXA
  4631.    LDX #$1E
  4632.    JSR VDCwRITE
  4633. +  RTS
  4634.  
  4635. VDCwINSET = *
  4636.    RTS
  4637.  
  4638. VDCwINSIZE = *
  4639.    LDA VDCwINcOLS
  4640.    STA SYSWORK
  4641.    LDA VDCwINsTART+0
  4642.    LDY VDCwINsTART+1
  4643.    STA SYSWORK+2
  4644.    STY SYSWORK+3
  4645.    LDA #<VDCrOWiNC
  4646.    LDY #>VDCrOWiNC
  4647.    STA SYSWORK+4
  4648.    STY SYSWORK+5
  4649.    LDA VDCwINsAVEsZ+0
  4650.    LDY VDCwINsAVEsZ+1
  4651.    STA SYSWORK+6
  4652.    STY SYSWORK+7
  4653.    LDX VDCwINsCRx
  4654.    LDY VDCwINsCRy
  4655.    LDA VDCwINrOWS
  4656.    CLC
  4657.    RTS
  4658.  
  4659. VDCwINLOAD = *
  4660.    RTS
  4661. VDCwINSAVE = *
  4662.    RTS
  4663.  
  4664. VDCpUTwHICH .BUF 1
  4665. VDCpUTcOLOR .BUF 1
  4666. VDCpUTlEN   .BUF 1
  4667.  
  4668. VDCwINPUT = *
  4669.    STA VDCpUTwHICH
  4670.    STY VDCfILLbYTE
  4671.    STX VDCpUTlEN
  4672.    BIT VDCpUTwHICH
  4673.    BPL VDCwINPUTcOLOR
  4674.    LDA SYSWORK+0
  4675.    LDY SYSWORK+1
  4676.    JSR VDCaDDRwRITE16
  4677.    LDY #0
  4678.    CPY VDCpUTlEN
  4679.    BEQ +
  4680.    LDA #$1F
  4681.    STA VDCsELECT
  4682. -  LDA (ZW),Y
  4683. -  BIT VDCsTATUS
  4684.    BPL -
  4685.    STA VDCdATA
  4686.    INY
  4687.    CPY VDCpUTlEN
  4688.    BCC --
  4689. +  SEC
  4690.    LDA SYSWORK+5
  4691.    SBC VDCpUTlEN
  4692.    BEQ VDCwINPUTcOLOR
  4693.    TAY
  4694.    LDA SYSWORK+4
  4695.    JSR VDCrAMwRITE
  4696.    DEY
  4697.    BEQ VDCwINPUTcOLOR
  4698.    TYA
  4699.    LDX #$1E
  4700.    JSR VDCwRITE
  4701.  
  4702.    VDCwINPUTcOLOR = *
  4703.    BIT VDCpUTwHICH
  4704.    BVS +
  4705.    RTS
  4706. +  LDA SYSWORK+1
  4707.    CLC
  4708.    ADC #>VDCcOLORaDDR
  4709.    TAY
  4710.    LDA SYSWORK+0
  4711.    JSR VDCaDDRwRITE16
  4712.    LDA SYSWORK+5
  4713.    STA VDCfILLcOLS
  4714.    JSR VDCcOLfILLgOTaDDR
  4715.    RTS
  4716.  
  4717. VDCwINCOLOR = *
  4718.    PHP
  4719.    SEI
  4720.    CMP #128
  4721.    BCC +
  4722.    TXA
  4723.    LDX #$1A
  4724.    JSR VDCwRITE
  4725. +  AND #64
  4726.    BEQ +
  4727.    TYA
  4728.    NOP
  4729. +  LDX #$1A
  4730.    JSR VDCrEAD
  4731.    AND #$0F
  4732.    TAX
  4733.    TAY
  4734.    PLP
  4735.    RTS
  4736.  
  4737. VDCwINPOScOL .BUF 1
  4738.  
  4739. VDCwINPOS = *
  4740.    STA SYSWORK+0  ;(0 TO 50)
  4741.    STX VDCwINPOScOL
  4742.    LDX #0
  4743.    STX SYSWORK+1
  4744.    ASL
  4745.    ASL
  4746.    ADC SYSWORK+0
  4747.    ASL
  4748.    ROL SYSWORK+1
  4749.    ASL
  4750.    ROL SYSWORK+1
  4751.    ASL
  4752.    ROL SYSWORK+1
  4753.    ASL
  4754.    ROL SYSWORK+1
  4755.    CLC
  4756.    ADC VDCwINPOScOL
  4757.    BCC +
  4758.    INC SYSWORK+1
  4759. +  CLC
  4760.    ADC VDCwINsTART+0
  4761.    STA SYSWORK+0
  4762.    LDA SYSWORK+1
  4763.    ADC VDCwINsTART+1
  4764.    STA SYSWORK+1
  4765.    RTS
  4766.  
  4767. VDCcURSORsAVE  .BUF 1
  4768. VDCcURSORcOLOR .BUF 1
  4769.  
  4770. VDCwINCURSOR = *
  4771.    CMP #0
  4772.    BEQ VDCcURSORoFF
  4773.    STY VDCcURSORcOLOR
  4774.    LDA SYSWORK+0
  4775.    LDY SYSWORK+1
  4776.    LDX #$0E
  4777.    JSR VDCwRITE16
  4778.    LDX #$0A
  4779.    JSR VDCrEAD
  4780.    AND #$1F
  4781.    ORA #$60
  4782.    JSR VDCwRITE
  4783.    JSR VDCsETcOLORaDDR
  4784.    JSR VDCrAMrEAD
  4785.    STA VDCcURSORsAVE
  4786.    JSR VDCsETcOLORaDDR
  4787.    LDA VDCcURSORsAVE
  4788.    AND #$F0
  4789.    ORA VDCcURSORcOLOR
  4790.    JSR VDCrAMwRITE
  4791.    RTS
  4792.  
  4793. VDCcURSORoFF = *
  4794.    LDX #$0E
  4795.    JSR VDCwRITE16
  4796.    LDX #$0A
  4797.    JSR VDCrEAD
  4798.    AND #$1F
  4799.    ORA #$20
  4800.    JSR VDCwRITE
  4801.    JSR VDCsETcOLORaDDR
  4802.    LDA VDCcURSORsAVE
  4803.    JSR VDCrAMwRITE
  4804.    RTS
  4805.  
  4806. VDCsETcOLORaDDR = *  ;( (SW+0)=ADDR )
  4807.    CLC
  4808.    LDA SYSWORK+1
  4809.    ADC #>VDCcOLORaDDR
  4810.    TAY
  4811.    LDA SYSWORK+0
  4812.    JMP VDCaDDRwRITE16
  4813.  
  4814. VDCsCROLLdEST   = SYSWORK+0
  4815. VDCsCROLLsOURCE = SYSWORK+2
  4816. VDCsCROLLrOWS   .BUF 1
  4817. VDCsCROLLeXTRA  .BUF 1
  4818.  
  4819. VDCwINSCROLL = *
  4820.    STA SYSWORK+5
  4821.    STY VDCcLScOLOR
  4822.    STX VDCsCROLLeXTRA
  4823.    CPX #0
  4824.    BNE +
  4825.    RTS
  4826. +  CPX VDCwINrOWS
  4827.    BCC +
  4828.    LDA SYSWORK+4
  4829.    LDX SYSWORK+5
  4830.    LDY VDCcLScOLOR
  4831.    JSR VDCwINCLS
  4832.    RTS
  4833. +  BIT SYSWORK+5
  4834.    BPL +
  4835.    JSR VDCsCROLLuPsETUP
  4836.    JSR VDCrOWsCROLLuP
  4837.    LDA #" "
  4838.    JSR VDCdOsCROLLeXTRA
  4839. +  BIT SYSWORK+5
  4840.    BVC +
  4841.    JSR VDCsCROLLuPsETUP
  4842.    JSR VDCsCROLLaDDcOLOR
  4843.    JSR VDCrOWsCROLLuP
  4844.    LDA VDCcLScOLOR
  4845.    JSR VDCdOsCROLLeXTRA
  4846. +  RTS
  4847.  
  4848. VDCsCROLLuPsETUP = *
  4849.    LDA VDCsCROLLeXTRA
  4850.    LDX #0
  4851.    JSR VDCwINPOS
  4852.    LDA SYSWORK+0
  4853.    LDY SYSWORK+1
  4854.    STA VDCsCROLLsOURCE+0
  4855.    STY VDCsCROLLsOURCE+1
  4856.    LDA VDCwINsTART+0
  4857.    LDY VDCwINsTART+1
  4858.    STA VDCsCROLLdEST+0
  4859.    STY VDCsCROLLdEST+1
  4860.    SEC
  4861.    LDA VDCwINrOWS
  4862.    SBC VDCsCROLLeXTRA
  4863.    STA VDCsCROLLrOWS
  4864.    RTS
  4865.  
  4866. VDCsCROLLaDDcOLOR = *
  4867.    CLC
  4868.    LDA SYSWORK+1
  4869.    ADC #>VDCcOLORaDDR
  4870.    STA SYSWORK+1
  4871.    LDA SYSWORK+3
  4872.    ADC #>VDCcOLORaDDR
  4873.    STA SYSWORK+3
  4874.    RTS
  4875.  
  4876. VDCdOsCROLLeXTRA = *  ;( .a=FILLbYTE, (SW+0)=ADDR )
  4877.    STA VDCfILLbYTE
  4878.    LDA VDCsCROLLeXTRA
  4879.    STA VDCfILLrOWS
  4880.    LDA VDCwINcOLS
  4881.    STA VDCfILLcOLS
  4882.    JSR VDCrOWfILL
  4883.    RTS
  4884.  
  4885. VDCrOWsCROLLuP = * ;( VDCsCROLLsOURCE++, VDCsCROLLdEST++, VDCsCROLLrOWS-- )
  4886.    LDA VDCsCROLLrOWS
  4887.    BNE +
  4888.    RTS
  4889. +  JSR VDCcOPYmODE
  4890. -  JSR VDCcOLsCROLL
  4891.    CLC
  4892.    LDA VDCsCROLLsOURCE+0
  4893.    ADC #VDCrOWiNC
  4894.    STA VDCsCROLLsOURCE+0
  4895.    BCC +
  4896.    INC VDCsCROLLsOURCE+1
  4897. +  CLC
  4898.    LDA VDCsCROLLdEST+0
  4899.    ADC #VDCrOWiNC
  4900.    STA VDCsCROLLdEST+0
  4901.    BCC +
  4902.    INC VDCsCROLLdEST+1
  4903. +  DEC VDCsCROLLrOWS
  4904.    BNE -
  4905.    JSR VDCfILLmODE
  4906.    RTS
  4907.  
  4908. VDCcOLsCROLL = * ;( VDCsCROLLsOURCE, VDCsCROLLdEST, VDCwINcOLS )
  4909.    LDA VDCsCROLLdEST+0
  4910.    LDY VDCsCROLLdEST+1
  4911.    JSR VDCaDDRwRITE16
  4912.    LDA VDCsCROLLsOURCE+0
  4913.    LDY VDCsCROLLsOURCE+1
  4914.    LDX #$20
  4915.    JSR VDCwRITE16
  4916.    LDA VDCwINcOLS
  4917.    LDX #$1E
  4918.    JSR VDCwRITE
  4919.    RTS
  4920.  
  4921. ;*** INTERRUPT SCREEN-SAVER CODE: **POTENTIAL VDC-ACCESS CONFLICTS**
  4922.  
  4923. VDCsScOLOR .BUF 1
  4924. VDCsSrOWS  .BUF 1
  4925. VDCsSaCTIVE .BYTE $00
  4926.  
  4927. VDCsCREENsAVE = *
  4928. RTS
  4929.    LDX #$06
  4930.    JSR VDCrEAD
  4931.    STA VDCsSrOWS
  4932.    LDX #$1A
  4933.    JSR VDCrEAD
  4934.    STA VDCsScOLOR
  4935.    LDA #$FF
  4936.    STA VDCsSaCTIVE
  4937.    LDX #$06
  4938.    LDA #0
  4939.    JSR VDCwRITE
  4940.    LDX #$1A
  4941.    LDA #$E0
  4942.    JSR VDCwRITE
  4943.    RTS
  4944.  
  4945. VDCsCREENuNSAVE = *
  4946. RTS
  4947.    LDX #$06
  4948.    LDA VDCsSrOWS
  4949.    JSR VDCwRITE
  4950.    LDX #$1A
  4951.    LDA VDCsScOLOR
  4952.    JSR VDCwRITE
  4953.    LDA #$00
  4954.    STA VDCsSaCTIVE
  4955.    RTS
  4956.  
  4957. ;THE END + BLANK LINE
  4958.  
  4959. ACEVIC.S
  4960. 487
  4961. ;ace-128/64 KERNEL vic 40-COLUMN SCREEN DRIVER CODE
  4962.  
  4963. VICcHARaDDR = $0400
  4964. VICcOLORoFF = $D400
  4965. VICrOWiNC = 40
  4966. VIC = $D000
  4967.  
  4968. VICwINsCRx   .BUF 1
  4969. VICwINsCRy   .BUF 1
  4970. VICwINrOWS   .BUF 1
  4971. VICwINcOLS   .BUF 1
  4972. VICwINsTART  .BUF 2
  4973. VICwINsAVEsZ .BUF 2
  4974.  
  4975. VICiNIT = *
  4976.    LDA #$18
  4977.    STA VIC+$18
  4978.    ;** WINDOW PARAMETERS
  4979.    JSR VICwINMAX
  4980.    RTS
  4981.  
  4982. VICsHUTDOWN = *
  4983.    RTS
  4984.  
  4985. VICwINMAX = *
  4986.    LDA #0
  4987.    STA VICwINsCRx
  4988.    STA VICwINsCRy
  4989.    LDA #<VICcHARaDDR
  4990.    LDY #>VICcHARaDDR
  4991.    STA VICwINsTART+0
  4992.    STY VICwINsTART+1
  4993.    LDA #25
  4994.    LDX #40
  4995.    STA VICwINrOWS
  4996.    STX VICwINcOLS
  4997.    LDA #<1000+1000+16
  4998.    LDY #>1000+1000+16
  4999.    STA VICwINsAVEsZ+0
  5000.    STY VICwINsAVEsZ+1
  5001.    CLC
  5002.    RTS
  5003.  
  5004. RGBI2VICtAB .BYTE 0,12,6,14,5,13,11,3,2,10,8,4,9,7,15,1
  5005.  
  5006. RGBI2VIC = *
  5007.    AND #$0F
  5008.    TAX
  5009.    LDA RGBI2VICtAB,X
  5010.    RTS
  5011.  
  5012. VIC2RGBItAB .BYTE 0,15,8,7,11,4,2,13,10,12,9,6,1,5,3,14
  5013.  
  5014. VIC2RGBI = *
  5015.    AND #$0F
  5016.    TAX
  5017.    LDA VIC2RGBItAB,X
  5018.    RTS
  5019.  
  5020. VICcLScOLOR .BUF 1
  5021.  
  5022. VICwINCLS = *
  5023.    STA VICfILLbYTE
  5024.    STY VICcLScOLOR
  5025.    STX SYSWORK+2
  5026.    BIT SYSWORK+2
  5027.    BPL +
  5028.    JSR VICwINCLSsETUP
  5029.    JSR VICrOWfILL
  5030. +  BIT SYSWORK+2
  5031.    BVC +
  5032.    JSR VICwINCLSsETUP
  5033.    LDA VICcLScOLOR
  5034.    JSR RGBI2VIC
  5035.    STA VICfILLbYTE
  5036.    JSR VICaDDcOLOR
  5037.    JSR VICrOWfILL
  5038. +  RTS
  5039.  
  5040. VICwINCLSsETUP = *
  5041.    LDA VICwINsTART+0
  5042.    LDY VICwINsTART+1
  5043.    STA SYSWORK+0
  5044.    STY SYSWORK+1
  5045.    LDA VICwINrOWS
  5046.    STA VICfILLrOWS
  5047.    RTS
  5048.  
  5049. VICaDDcOLOR = *
  5050.    CLC
  5051.    LDA SYSWORK+1
  5052.    ADC #>VICcOLORoFF
  5053.    STA SYSWORK+1
  5054.    RTS
  5055.  
  5056. VICfILLbYTE .BUF 1
  5057. VICfILLrOWS .BUF 1
  5058. VICfILLcOLS .BUF 1
  5059.  
  5060. VICrOWfILL = * ;( (SW+0)=ADDR++, VICfILLbYTE, VICfILLrOWS-- )
  5061.    LDA VICwINcOLS
  5062.    STA VICfILLcOLS
  5063.    LDA VICfILLrOWS
  5064.    BNE +
  5065.    RTS
  5066. /  JSR VICcOLfILL
  5067.    CLC
  5068.    LDA SYSWORK+0
  5069.    ADC #VICrOWiNC
  5070.    STA SYSWORK+0
  5071.    BCC +
  5072.    INC SYSWORK+1
  5073. +  DEC VICfILLrOWS
  5074.    BNE -
  5075.    RTS
  5076.  
  5077. VICcOLfILL = * ;( (SW+0)=ADDR, VICfILLbYTE, VICfILLcOLS )
  5078.    LDY VICfILLcOLS
  5079.    BEQ +
  5080.    DEY
  5081.    LDA VICfILLbYTE
  5082. -  STA (SYSWORK),Y
  5083.    DEY
  5084.    BPL -
  5085. +  RTS
  5086.  
  5087. VICwINSET = *
  5088.    RTS
  5089.  
  5090. VICwINSIZE = *
  5091.    LDA VICwINcOLS
  5092.    STA SYSWORK
  5093.    LDA VICwINsTART+0
  5094.    LDY VICwINsTART+1
  5095.    STA SYSWORK+2
  5096.    STY SYSWORK+3
  5097.    LDA #<VICrOWiNC
  5098.    LDY #>VICrOWiNC
  5099.    STA SYSWORK+4
  5100.    STY SYSWORK+5
  5101.    LDA VICwINsAVEsZ+0
  5102.    LDY VICwINsAVEsZ+1
  5103.    STA SYSWORK+6
  5104.    STY SYSWORK+7
  5105.    LDX VICwINsCRx
  5106.    LDY VICwINsCRy
  5107.    LDA VICwINrOWS
  5108.    CLC
  5109.    RTS
  5110.  
  5111. VICwINLOAD = *
  5112.    RTS
  5113. VICwINSAVE = *
  5114.    RTS
  5115.  
  5116. VICpUTwHICH .BUF 1
  5117. VICpUTlEN   .BUF 1
  5118.  
  5119. VICwINPUT = *
  5120.    STA VICpUTwHICH
  5121.    STY VICfILLbYTE
  5122.    STX VICpUTlEN
  5123.    BIT VICpUTwHICH
  5124.    BPL VICwINPUTcOLOR
  5125.    LDY #0
  5126.    CPY VICpUTlEN
  5127.    BEQ +
  5128. -  LDA (ZW),Y
  5129.    STA (SYSWORK+0),Y
  5130.    INY
  5131.    CPY VICpUTlEN
  5132.    BCC -
  5133. +  CPY SYSWORK+5
  5134.    BEQ VICwINPUTcOLOR
  5135.    LDA SYSWORK+4
  5136. -  STA (SYSWORK+0),Y
  5137.    INY
  5138.    CPY SYSWORK+5
  5139.    BCC -
  5140.  
  5141.    VICwINPUTcOLOR = *
  5142.    BIT VICpUTwHICH
  5143.    BVS +
  5144.    RTS
  5145. +  CLC
  5146.    LDA SYSWORK+1
  5147.    ADC #>VICcOLORoFF
  5148.    STA SYSWORK+1
  5149.    LDA VICfILLbYTE
  5150.    JSR RGBI2VIC
  5151.    LDY SYSWORK+5
  5152.    DEY
  5153.    BMI +
  5154. -  STA (SYSWORK),Y
  5155.    DEY
  5156.    BPL -
  5157. +  SEC
  5158.    LDA SYSWORK+1
  5159.    SBC #>VICcOLORoFF
  5160.    STA SYSWORK+1
  5161.    RTS
  5162.  
  5163. VICwINCOLOR = *
  5164.    PHP
  5165.    SEI
  5166.    CMP #128
  5167.    BCC +
  5168.    PHA
  5169.    TXA
  5170.    JSR RGBI2VIC
  5171.    STA VIC+$21
  5172.    PLA
  5173. +  AND #64
  5174.    BEQ VICwINCOLOReXIT
  5175.    TYA
  5176.    JSR RGBI2VIC
  5177.    BIT VICsSaCTIVE
  5178.    BMI +
  5179.    STA VIC+$20
  5180.    JMP VICwINCOLOReXIT
  5181. +  STA VICsScOLOR
  5182.  
  5183.    VICwINCOLOReXIT = *
  5184.    BIT VICsSaCTIVE
  5185.    BMI +
  5186.    LDA VIC+$20
  5187.    JMP ++
  5188. +  LDA VICsScOLOR
  5189. +  JSR VIC2RGBI
  5190.    TAY
  5191.    LDA VIC+$21
  5192.    JSR VIC2RGBI
  5193.    TAX
  5194.    PLP
  5195.    RTS
  5196.  
  5197. VICwINPOScOL .BUF 1
  5198.  
  5199. VICwINPOS = *
  5200.    STA SYSWORK+0  ;(0 TO 24)
  5201.    STX VICwINPOScOL
  5202.    LDX #0
  5203.    STX SYSWORK+1
  5204.    ASL
  5205.    ASL
  5206.    ADC SYSWORK+0
  5207.    ASL
  5208.    ROL SYSWORK+1
  5209.    ASL
  5210.    ROL SYSWORK+1
  5211.    ASL
  5212.    ROL SYSWORK+1
  5213.    CLC
  5214.    ADC VICwINPOScOL
  5215.    BCC +
  5216.    INC SYSWORK+1
  5217. +  CLC
  5218.    ADC VICwINsTART+0
  5219.    STA SYSWORK+0
  5220.    LDA SYSWORK+1
  5221.    ADC VICwINsTART+1
  5222.    STA SYSWORK+1
  5223.    RTS
  5224.  
  5225. VICcURSORcHAR  .BUF 1
  5226. VICcURSORcOLOR .BUF 1
  5227. VICcURSORfLASH .BYTE $00  ;$00=INACTIVE, $FF=ACTIVE
  5228. VICcURSORcOUNTDOWN .BUF 1
  5229. VICcURSORaDDR  .BUF 2
  5230.  
  5231. VICwINCURSOR = *
  5232.    CMP #0
  5233.    BEQ VICcURSORoFF
  5234.    TYA
  5235.    JSR RGBI2VIC
  5236.    STA VICcURSORcOLOR
  5237.    LDA SYSWORK+0
  5238.    LDY SYSWORK+1
  5239.    STA VICcURSORaDDR+0
  5240.    STY VICcURSORaDDR+1
  5241.    LDY #0
  5242.    LDA (SYSWORK+0),Y
  5243.    STA VICcURSORcHAR
  5244.    JSR VICsETcOLORaDDR
  5245.    LDY #0
  5246.    LDA (SYSWORK+0),Y
  5247.    TAX
  5248.    LDA VICcURSORcOLOR
  5249.    STA (SYSWORK+0),Y
  5250.    STX VICcURSORcOLOR
  5251.    JSR VICuNSETcOLORaDDR
  5252.    LDA #1
  5253.    STA VICcURSORcOUNTDOWN
  5254.    JSR VICiRQcURSOR
  5255.    LDA #$FF
  5256.    STA VICcURSORfLASH
  5257.    RTS
  5258.  
  5259. VICcURSORoFF = *
  5260.    LDA #$00
  5261.    STA VICcURSORfLASH
  5262.    LDY #0
  5263.    LDA VICcURSORcHAR
  5264.    STA (SYSWORK+0),Y
  5265.    JSR VICsETcOLORaDDR
  5266.    LDA VICcURSORcOLOR
  5267.    STA (SYSWORK+0),Y
  5268.    JSR VICuNSETcOLORaDDR
  5269.    RTS
  5270.  
  5271. VICiRQwORK = $A0
  5272.  
  5273. VICiRQcURSOR = *
  5274.    BIT VICcURSORfLASH
  5275.    BMI +
  5276. -  RTS
  5277. +  DEC VICcURSORcOUNTDOWN
  5278.    BNE -
  5279.    LDA #20
  5280.    STA VICcURSORcOUNTDOWN
  5281.    LDA VICcURSORaDDR+0
  5282.    LDY VICcURSORaDDR+1
  5283.    STA VICiRQwORK+0
  5284.    STY VICiRQwORK+1
  5285.    LDY #0
  5286.    LDA (VICiRQwORK),Y
  5287.    PHA
  5288.    SEC
  5289.    SBC #32
  5290.    AND #%01000000
  5291.    BNE +
  5292.    PLA
  5293.    SEC
  5294.    SBC #64
  5295.    JMP ++
  5296. +  PLA
  5297.    CLC
  5298.    ADC #64
  5299. +  STA (VICiRQwORK),Y
  5300.    RTS
  5301.  
  5302. VICsETcOLORaDDR = *  ;( (SW+0)=ADDR ) : (SW+0)=COLORaDDR
  5303.    CLC
  5304.    LDA SYSWORK+1
  5305.    ADC #>VICcOLORoFF
  5306.    STA SYSWORK+1
  5307.    RTS
  5308.  
  5309. VICuNSETcOLORaDDR = *  ;( (SW+0)=COLORaDDR ) : (SW+0)=ADDR
  5310.    SEC
  5311.    LDA SYSWORK+1
  5312.    SBC #>VICcOLORoFF
  5313.    STA SYSWORK+1
  5314.    RTS
  5315.  
  5316. VICsCROLLdEST   = SYSWORK+0
  5317. VICsCROLLsOURCE = SYSWORK+2
  5318. VICsCROLLrOWS   .BUF 1
  5319. VICsCROLLeXTRA  .BUF 1
  5320.  
  5321. VICwINSCROLL = *
  5322.    STA SYSWORK+5
  5323.    STY VICcLScOLOR
  5324.    STX VICsCROLLeXTRA
  5325.    CPX #0
  5326.    BNE +
  5327.    RTS
  5328. +  CPX VICwINrOWS
  5329.    BCC +
  5330.    LDA SYSWORK+4
  5331.    LDX SYSWORK+5
  5332.    LDY VICcLScOLOR
  5333.    JSR VICwINCLS
  5334.    RTS
  5335. +  BIT SYSWORK+5
  5336.    BPL +
  5337.    JSR VICsCROLLuPsETUP
  5338.    JSR VICrOWsCROLLuP
  5339.    LDA #" "
  5340.    JSR VICdOsCROLLeXTRA
  5341. +  BIT SYSWORK+5
  5342.    BVC +
  5343.    JSR VICsCROLLuPsETUP
  5344.    JSR VICsCROLLaDDcOLOR
  5345.    JSR VICrOWsCROLLuP
  5346.    LDA VICcLScOLOR
  5347.    JSR VICdOsCROLLeXTRA
  5348. +  RTS
  5349.  
  5350. VICsCROLLuPsETUP = *
  5351.    LDA VICsCROLLeXTRA
  5352.    LDX #0
  5353.    JSR VICwINPOS
  5354.    LDA SYSWORK+0
  5355.    LDY SYSWORK+1
  5356.    STA VICsCROLLsOURCE+0
  5357.    STY VICsCROLLsOURCE+1
  5358.    LDA VICwINsTART+0
  5359.    LDY VICwINsTART+1
  5360.    STA VICsCROLLdEST+0
  5361.    STY VICsCROLLdEST+1
  5362.    SEC
  5363.    LDA VICwINrOWS
  5364.    SBC VICsCROLLeXTRA
  5365.    STA VICsCROLLrOWS
  5366.    RTS
  5367.  
  5368. VICsCROLLaDDcOLOR = *
  5369.    CLC
  5370.    LDA SYSWORK+1
  5371.    ADC #>VICcOLORoFF
  5372.    STA SYSWORK+1
  5373.    LDA SYSWORK+3
  5374.    ADC #>VICcOLORoFF
  5375.    STA SYSWORK+3
  5376.    RTS
  5377.  
  5378. VICdOsCROLLeXTRA = *  ;( .a=FILLbYTE, (SW+0)=ADDR )
  5379.    STA VICfILLbYTE
  5380.    LDA VICsCROLLeXTRA
  5381.    STA VICfILLrOWS
  5382.    LDA VICwINcOLS
  5383.    STA VICfILLcOLS
  5384.    JSR VICrOWfILL
  5385.    RTS
  5386.  
  5387. VICrOWsCROLLuP = * ;( VICsCROLLsOURCE++, VICsCROLLdEST++, VICsCROLLrOWS-- )
  5388.    LDA VICsCROLLrOWS
  5389.    BNE +
  5390.    RTS
  5391. +  NOP
  5392. -  JSR VICcOLsCROLL
  5393.    CLC
  5394.    LDA VICsCROLLsOURCE+0
  5395.    ADC #VICrOWiNC
  5396.    STA VICsCROLLsOURCE+0
  5397.    BCC +
  5398.    INC VICsCROLLsOURCE+1
  5399. +  CLC
  5400.    LDA VICsCROLLdEST+0
  5401.    ADC #VICrOWiNC
  5402.    STA VICsCROLLdEST+0
  5403.    BCC +
  5404.    INC VICsCROLLdEST+1
  5405. +  DEC VICsCROLLrOWS
  5406.    BNE -
  5407.    RTS
  5408.  
  5409. VICcOLsCROLL = * ;( VICsCROLLsOURCE, VICsCROLLdEST, VICwINcOLS )
  5410.    LDY VICwINcOLS
  5411.    DEY
  5412. -  LDA (VICsCROLLsOURCE),Y
  5413.    STA (VICsCROLLdEST),Y
  5414.    DEY
  5415.    BPL -
  5416.    RTS
  5417.  
  5418. ;*** INTERRUPT SCREEN-SAVE STUFF
  5419.  
  5420. VICsScOLOR  .BUF 1
  5421. VICsSrOWS   .BUF 1
  5422. VICsSaCTIVE .BYTE $00
  5423.  
  5424. VICsCREENsAVE = *
  5425.    LDA VIC+$11
  5426.    STA VICsSrOWS
  5427.    LDA VIC+$20
  5428.    STA VICsScOLOR
  5429.    LDA #$FF
  5430.    STA VICsSaCTIVE
  5431.    LDA #$00
  5432.    STA VIC+$11
  5433.    LDA #$00
  5434.    STA VIC+$20
  5435.    RTS
  5436.  
  5437. VICsCREENuNSAVE = *
  5438.    LDA VICsSrOWS
  5439.    STA VIC+$11
  5440.    LDA VICsScOLOR
  5441.    STA VIC+$20
  5442.    LDA #$00
  5443.    STA VICsSaCTIVE
  5444.    RTS
  5445.  
  5446. ;THE END + BLANK LINE
  5447.  
  5448. ACEVIC80.S
  5449. 37
  5450. ;ace-64 KERNEL vic BITMAPPED 80-COLUMN SCREEN DRIVER CODE
  5451.  
  5452. VDCiNIT = *
  5453.    RTS
  5454.  
  5455. VDCsHUTDOWN = *
  5456.    RTS
  5457.  
  5458. VDCwINMAX = *
  5459.    RTS
  5460. VDCwINCLS = *
  5461.    RTS
  5462. VDCwINSET = *
  5463.    RTS
  5464. VDCwINSIZE = *
  5465.    RTS
  5466. VDCwINLOAD = *
  5467.    RTS
  5468. VDCwINSAVE = *
  5469.    RTS
  5470. VDCwINPUT = *
  5471.    RTS
  5472. VDCwINCOLOR = *
  5473.    RTS
  5474. VDCwINPOS = *
  5475.    RTS
  5476. VDCwINCURSOR = *
  5477.    RTS
  5478. VDCwINSCROLL = *
  5479.    RTS
  5480. VDCsCREENsAVE = *
  5481.    RTS
  5482. VDCsCREENuNSAVE = *
  5483.    RTS
  5484.  
  5485. ;THE END + BLANK LINE
  5486.  
  5487. AS.S
  5488. 630
  5489. ;*** AS PROGRAM
  5490.  
  5491. .SEQ ACEHEAD.S
  5492. .ORG ACEaPPaDDRESS
  5493. .OBJ "@0:AS"
  5494.  
  5495. JMP ASMAIN
  5496. .ASC "Cb"
  5497.  
  5498. ;*** GLOBAL DECLARATIONS
  5499.  
  5500. LIBWORK = $60
  5501. CHRcr = $0D
  5502. CHRqUOTE = $22
  5503. CHRtAB = $09
  5504. CHReof = $00
  5505.  
  5506. ;******** STANDARD LIBRARY ********
  5507. PUTS = *
  5508.    LDX #STDOUT
  5509. FPUTS = *
  5510.    STA ZP
  5511.    STY ZP+1
  5512.    LDY #$FF
  5513. -  INY
  5514.    LDA (ZP),Y
  5515.    BNE -
  5516.    TYA
  5517.    LDY #0
  5518.    JMP WRITE
  5519.  
  5520. PUTCHAR = *
  5521.    LDX #STDOUT
  5522. PUTC = *
  5523.    STA PUTCbUFFER
  5524.    LDA #<PUTCbUFFER
  5525.    LDY #>PUTCbUFFER
  5526.    STA ZP
  5527.    STY ZP+1
  5528.    LDA #1
  5529.    LDY #0
  5530.    JMP WRITE
  5531.    PUTCbUFFER .BUF 1
  5532.  
  5533. GETCHAR = *
  5534.    LDX #STDIN
  5535. GETC = *
  5536.    LDA #<GETCbUFFER
  5537.    LDY #>GETCbUFFER
  5538.    STA ZP
  5539.    STY ZP+1
  5540.    LDA #1
  5541.    LDY #0
  5542.    JSR READ
  5543.    BEQ +
  5544.    LDA GETCbUFFER
  5545.    RTS
  5546. +  SEC
  5547.    RTS
  5548.    GETCbUFFER .BUF 1
  5549.  
  5550. GETARG = *
  5551.    STY ZP+1
  5552.    ASL
  5553.    STA ZP
  5554.    ROL ZP+1
  5555.    CLC
  5556.    LDA ACEaRGV
  5557.    ADC ZP
  5558.    STA ZP
  5559.    LDA ACEaRGV+1
  5560.    ADC ZP+1
  5561.    STA ZP+1
  5562.    LDY #0
  5563.    LDA (ZP),Y
  5564.    TAX
  5565.    INY
  5566.    LDA (ZP),Y
  5567.    STX ZP
  5568.    STA ZP+1
  5569.    RTS
  5570.  
  5571. SOURCEfCB  =  2 ;(1)
  5572. BUFPTR     =  3 ;(1)
  5573. SOURCElINE =  4 ;(4)
  5574. NUMBER     =  8 ;(4)
  5575. STRINGlEN  = 12 ;(1)
  5576. PREVcHAR   = 13 ;(1)
  5577.  
  5578. TOKENiDENTIFIER = 0
  5579. TOKENnUMBER = 1
  5580. TOKENsTRING = 2
  5581. TOKENsPECIAL = 3
  5582.  
  5583. CHReRRiDENTtOOlONG = $F0
  5584. CHReRRsTRINGtOOlONG = $F1
  5585. CHReRRnOcLOSEqUOTE = $F2
  5586. CHReRRbADnUMBER = $F3
  5587. CHReRRnUMoVERFLOW = $F4
  5588.  
  5589. ASMAIN = *
  5590.    LDA ACEaRGC+1
  5591.    BEQ +
  5592.    ;** USAGE ERROR!
  5593. -  RTS
  5594. +  LDA ACEaRGC
  5595.    CMP #2
  5596.    BNE -
  5597.    LDA #1
  5598.    LDY #0
  5599.    JSR GETARG
  5600.    LDA #"R"
  5601.    JSR OPEN
  5602.    BCC +
  5603.    ;** SOURCE OPEN ERROR!
  5604.    RTS
  5605. +  STA SOURCEfCB
  5606.    LDA #1
  5607.    STA SOURCElINE
  5608.    LDA #0
  5609.    STA SOURCElINE+1
  5610.    STA SOURCElINE+2
  5611.    STA SOURCElINE+3
  5612.    LDA #255
  5613.    STA BUFPTR
  5614.    JSR ASdRIVER
  5615.    LDA SOURCEfCB
  5616.    JSR CLOSE
  5617.    RTS
  5618.  
  5619. ;=FILL ENTIRE BUFFER, PAD WITH SPACES; .cs=EOF
  5620. FILLBUF = *
  5621.    LDA #<SOURCEbUF
  5622.    LDY #>SOURCEbUF
  5623.    STA ZP
  5624.    STY ZP+1
  5625.    LDA #0
  5626.    LDY #1
  5627.    STA BUFPTR
  5628.    LDX SOURCEfCB
  5629.    JSR READ
  5630.    BNE +
  5631.    SEC
  5632.    RTS
  5633. +  CPY #1
  5634.    BCC +
  5635.    CLC
  5636.    RTS
  5637. +  TAY
  5638.    LDA #" "
  5639. -  STA SOURCEbUF,Y
  5640.    INY
  5641.    BNE -
  5642.    CLC
  5643.    RTS
  5644.  
  5645. GETnEXTcHAR = *
  5646.    INC BUFPTR
  5647.    BEQ +
  5648. -  LDY BUFPTR
  5649.    LDA SOURCEbUF,Y
  5650.    RTS
  5651. +  JSR FILLBUF
  5652.    BCC -
  5653.    LDA #CHReof
  5654.    RTS
  5655.  
  5656. EATwHITESPACE = *  ;() : .a=nEXTcHAR
  5657.    LDA PREVcHAR
  5658.    CMP #" "
  5659.    BEQ +
  5660.    CMP #CHRtAB
  5661.    BEQ +
  5662.    RTS
  5663. +  LDY BUFPTR
  5664. -  INY
  5665.    BEQ +
  5666.    EATwHcONT = *
  5667.    LDA SOURCEbUF,Y
  5668.    CMP #" "
  5669.    BEQ -
  5670.    CMP #CHRtAB
  5671.    BEQ -
  5672.    STY BUFPTR
  5673.    RTS
  5674. +  JSR FILLBUF
  5675.    BCS +
  5676.    LDY #0
  5677.    JMP EATwHcONT
  5678. +  LDA #CHReof
  5679.    RTS
  5680.  
  5681. ;===TOKEN DISPATCH===
  5682. ;RET: .x=TOKENiDENTIFIER, .a=NEXTcHAR, .y=STRLEN, STRINGlEN, STRINGbUF
  5683. ;     .x=TOKENnUMBER,     .y=NUMLEN, NUMBER
  5684. ;     .x=TOKENsTRING,     .a=FIRSTcHAR,.y=STRLEN, STRINGlEN, STRINGbUF
  5685. ;     .x=TOKENsPECIAL,    .a=CHAR
  5686.  
  5687. GETtOKEN = *
  5688.    LDA PREVcHAR
  5689.    CMP #" "
  5690.    BNE +
  5691. -  JSR EATwHITESPACE
  5692. +  CMP #CHRtAB
  5693.    BEQ -
  5694.    CMP #"@"
  5695.    BCC +
  5696.    JMP GETiDENTIFIER
  5697. +  CMP #"'"
  5698.    BCC CMPmORE1
  5699.    BNE +
  5700.    JMP GETsTRING
  5701. +  CMP #"0"
  5702.    BCC TOKsPECIAL
  5703.    CMP #":"
  5704.    BCS +
  5705.  
  5706.    TOKnUM = *
  5707.    JMP GETnUMBER
  5708.  
  5709. +  CMP #";"
  5710.    BNE +
  5711.    JMP EATcOMMENT
  5712.  
  5713.    TOKsPECIAL = *
  5714.    JMP GETsPECIALtOKEN
  5715.  
  5716.    CMPmORE1 = *
  5717.    CMP #"$"
  5718.    BCC +
  5719.    BEQ TOKnUM
  5720.    CMP #"%"
  5721.    BEQ TOKnUM
  5722.    JMP GETsPECIALtOKEN
  5723.  
  5724. +  CMP #CHRqUOTE
  5725.    BNE TOKsPECIAL
  5726.    JMP GETsTRING
  5727.  
  5728. ;===COMMENT===
  5729.  
  5730. EATcOMMENT = *
  5731.    LDY BUFPTR
  5732. -  INY
  5733.    BEQ +
  5734.  
  5735.    COMMENTcHAR = *
  5736.    LDA SOURCEbUF,Y
  5737.    CMP #CHRcr
  5738.    BNE -
  5739.    STY BUFPTR
  5740.    JMP GETsPECIALtOKEN
  5741. +  JSR FILLBUF
  5742.    BCS +
  5743.    LDY #0
  5744.    BEQ COMMENTcHAR
  5745. +  LDA #CHReof
  5746.    JMP GETsPECIALtOKEN
  5747.  
  5748. ;===SPECIAL===
  5749.  
  5750. GETsPECIALtOKEN = *
  5751.    PHA
  5752.    CMP #CHRcr
  5753.    BNE +
  5754.    INC SOURCElINE
  5755.    BNE +
  5756.    INC SOURCElINE+1
  5757.    BNE +
  5758.    INC SOURCElINE+2
  5759.    BNE +
  5760.    INC SOURCElINE+3
  5761. +  CMP #CHReof
  5762.    BEQ +
  5763.    JSR GETnEXTcHAR
  5764. +  STA PREVcHAR
  5765.    PLA
  5766.    LDX #TOKENsPECIAL
  5767.    RTS
  5768.  
  5769. ;===IDENTIFIER===
  5770.  
  5771. GETiDENTIFIER = *
  5772.    STA STRINGbUF
  5773.    LDY #1
  5774.    STY STRINGlEN
  5775. -  JSR GETnEXTcHAR
  5776.    CMP #"@"
  5777.    BCC IDENTeXIT
  5778.  
  5779.    IDENTgOODcHAR = *
  5780.    LDY STRINGlEN
  5781.    STA STRINGbUF,Y
  5782.    INC STRINGlEN
  5783.    BNE -
  5784.    STA PREVcHAR
  5785.    LDX #TOKENsPECIAL
  5786.    LDA #CHReRRiDENTtOOlONG
  5787.    RTS
  5788.  
  5789.    IDENTeXIT = *
  5790.    CMP #"."
  5791.    BEQ IDENTgOODcHAR
  5792.    CMP #"_"
  5793.    BEQ IDENTgOODcHAR
  5794.    CMP #"0"
  5795.    BCC +
  5796.    CMP #":"
  5797.    BCC IDENTgOODcHAR
  5798. +  CMP #" "
  5799.    BNE +
  5800. -  STA PREVcHAR
  5801.    JSR EATwHITESPACE
  5802. +  CMP #CHRtAB
  5803.    BEQ -
  5804.    STA PREVcHAR
  5805.    LDA #0
  5806.    LDY STRINGlEN
  5807.    STA STRINGbUF,Y
  5808.    LDA PREVcHAR
  5809.    LDY STRINGlEN
  5810.    LDX #TOKENiDENTIFIER
  5811.    RTS
  5812.  
  5813. ;===STRING===
  5814.  
  5815. STRdELIMIT = 20
  5816.  
  5817. GETsTRING = *
  5818.    STA STRdELIMIT
  5819.    LDA #0
  5820.    STA STRINGlEN
  5821. -  JSR GETnEXTcHAR
  5822.    STA PREVcHAR
  5823.    CMP #CHReof
  5824.    BEQ STReOF
  5825.    CMP STRdELIMIT
  5826.    BEQ STReXIT
  5827.    CMP #CHRcr
  5828.    BEQ STReOF
  5829.    CMP #"\"
  5830.    BEQ STReSC
  5831.    GETsTRpUT = *
  5832.    LDY STRINGlEN
  5833.    STA STRINGbUF,Y
  5834.    INC STRINGlEN
  5835.    BNE -
  5836.    STA PREVcHAR
  5837.    LDA #CHReRRsTRINGtOOlONG
  5838.    LDX #TOKENsPECIAL
  5839.    RTS
  5840.  
  5841. STReSC = *
  5842.    JSR GETnEXTcHAR
  5843.    CMP #CHRcr
  5844.    BEQ STReOF
  5845.    CMP #CHReof
  5846.    BEQ STReOF
  5847.    LDX #STReSCcHAReND-STReSCcHAR-1
  5848. -  CMP STReSCcHAR,X
  5849.    BEQ +
  5850.    DEX
  5851.    BPL -
  5852.    JMP GETsTRpUT
  5853. +  LDA STReSCtRANS,X
  5854.    JMP GETsTRpUT
  5855.  
  5856. STReSCcHAR = *
  5857.    .ASC "\NBTRAZ'E0"
  5858.    .BYTE CHRqUOTE
  5859.    STReSCcHAReND = *
  5860. STReSCtRANS = *
  5861.    .BYTE 92,13,157,9,13,7,0,39,27,0,34
  5862.  
  5863. STReOF = *
  5864.    LDA #CHReRRnOcLOSEqUOTE
  5865.    LDX #TOKENsPECIAL
  5866.    RTS
  5867.  
  5868. STReXIT = *
  5869.    JSR GETnEXTcHAR
  5870.    STA PREVcHAR
  5871.    LDA #0  ;BUT MAY CONTAIN \0
  5872.    LDY STRINGlEN
  5873.    STA STRINGbUF,Y
  5874.    LDA STRINGbUF
  5875.    LDX #TOKENsTRING
  5876.    RTS
  5877.  
  5878. NUMbASE = 20  ;(1)
  5879. NUMsAVE = 21  ;(4)
  5880.  
  5881. GETnUMBER = *
  5882.    PHA
  5883.    LDX #3
  5884.    LDA #0
  5885. -  STA NUMBER,X
  5886.    DEX
  5887.    BPL -
  5888.    PLA
  5889.    LDX #16
  5890.    CMP #"$"
  5891.    BEQ +
  5892.    LDX #2
  5893.    CMP #"%"
  5894.    BEQ +
  5895.    LDX #10
  5896.    STX NUMbASE
  5897.    BNE GOTnEXTdIGIT
  5898. +  STX NUMbASE
  5899.    JSR GETnEXTcHAR
  5900.    STA PREVcHAR
  5901.    JSR CHECKdIGIT
  5902.    BCC +
  5903.    LDA #CHReRRbADnUMBER
  5904.    LDX #TOKENsPECIAL
  5905.    RTS
  5906. +  TXA
  5907.    JMP GOTnEXTdIGIT
  5908.  
  5909. NEXTdIGIT = *
  5910.    JSR GETnEXTcHAR
  5911.    STA PREVcHAR
  5912.    CMP #"_"
  5913.    BEQ NEXTdIGIT
  5914. GOTnEXTdIGIT = *
  5915.    JSR CHECKdIGIT
  5916.    BCS GETnUMeXIT
  5917.    PHA
  5918.    JSR SHIFTnUMBER
  5919.    BCS OVERFLOWeXITpLA
  5920.    PLA
  5921.    CLC
  5922.    ADC NUMBER
  5923.    STA NUMBER
  5924.    BCC +
  5925.    INC NUMBER+1
  5926.    BNE +
  5927.    INC NUMBER+2
  5928.    BNE +
  5929.    INC NUMBER+3
  5930.    BEQ OVERFLOWeXIT
  5931. +  JMP NEXTdIGIT
  5932.  
  5933. OVERFLOWeXITpLA = *
  5934.    PLA
  5935. OVERFLOWeXIT = *
  5936.    LDX #TOKENsPECIAL
  5937.    LDA #CHReRRnUMoVERFLOW
  5938.    RTS
  5939.  
  5940. GETnUMeXIT = *
  5941.    LDX #TOKENnUMBER
  5942.    LDY #3
  5943. -  LDA NUMBER,Y
  5944.    BEQ +
  5945.    DEY
  5946.    BPL -
  5947. +  INY
  5948.    RTS
  5949.  
  5950. CHECKdIGIT = *  ;( .a=ASCIIdIGIT ) : .a=BINdIGIT, .x=ASCIIdIGIT, .cc=OK
  5951.    TAX
  5952.    CMP #"0"
  5953.    BCC CHECKbAD
  5954.    CMP #"9"+1
  5955.    BCC CHECKaND
  5956.    CMP #"A"
  5957.    BCC CHECKbAD
  5958.    CMP #"F"+1
  5959.    BCC +
  5960.    CMP #"a"
  5961.    BCC CHECKbAD
  5962.    CMP #"f"+1
  5963.    BCS CHECKbAD
  5964. +  SEC
  5965.    SBC #7
  5966.    CHECKaND = *
  5967.    AND #$0F
  5968.    CMP NUMbASE
  5969.    RTS
  5970.    CHECKbAD = *
  5971.    SEC
  5972.    RTS
  5973.  
  5974. SHIFTnUMBER = *
  5975.    LDA NUMbASE
  5976.    CMP #10
  5977.    BNE +
  5978.    LDX #3
  5979. -  LDA NUMBER,X
  5980.    STA NUMsAVE,X
  5981.    DEX
  5982.    BPL -
  5983.    LDX #2
  5984.    JSR ROLLnUMBER
  5985.    JSR ADDnUMBER
  5986.    LDX #1
  5987.    JSR ROLLnUMBER
  5988.    RTS
  5989. +  LDX #1
  5990.    CMP #16
  5991.    BNE +
  5992.    LDX #4
  5993. +  JSR ROLLnUMBER
  5994.    RTS
  5995.  
  5996.    ROLLnUMBER = *  ;( .x=TIMES )
  5997.    ASL NUMBER
  5998.    ROL NUMBER+1
  5999.    ROL NUMBER+2
  6000.    ROL NUMBER+3
  6001.    BCS +
  6002.    DEX
  6003.    BNE ROLLnUMBER
  6004.    RTS
  6005. +  PLA
  6006.    PLA
  6007.    SEC
  6008.    RTS
  6009.  
  6010.    ADDnUMBER = *
  6011.    LDX #0
  6012.    CLC
  6013. -  LDA NUMBER,X
  6014.    ADC NUMsAVE,X
  6015.    STA NUMBER,X
  6016.    INX
  6017.    TXA
  6018.    AND #$03
  6019.    BNE -
  6020.    BCS +
  6021.    RTS
  6022. +  PLA
  6023.    PLA
  6024.    SEC
  6025.    RTS
  6026.  
  6027. ASdRIVER = *
  6028.    LDA #$FF
  6029.    STA BUFPTR
  6030.    LDA #" "
  6031.    STA PREVcHAR
  6032.  
  6033.    NEXTtOKEN = *
  6034.    JSR STOPKEY
  6035.    BCC +
  6036.    LDA #1
  6037.    JMP EXIT
  6038. +  JSR GETtOKEN
  6039.    CPX #TOKENiDENTIFIER
  6040.    BEQ DISPiDENTIFIER
  6041.    CPX #TOKENsTRING
  6042.    BEQ DISPsTRING
  6043.    CPX #TOKENsPECIAL
  6044.    BEQ DISPsPECIAL
  6045.    CPX #TOKENnUMBER
  6046.    BEQ DISPnUMBER
  6047.    JMP NEXTtOKEN
  6048.  
  6049. DISPiDENTIFIER = *
  6050.    PHA
  6051.    LDA #"I"
  6052.    JSR PUTCHAR
  6053.    LDA #":"
  6054.    JSR PUTCHAR
  6055.    JSR SHOWsTR
  6056.    LDA #","
  6057.    JSR PUTCHAR
  6058.    PLA
  6059.    SHOWcHAR = *
  6060.    CMP #CHRcr
  6061.    BNE +
  6062.    LDA #"_"
  6063. +  JSR PUTCHAR
  6064.    SHOWcr = *
  6065.    LDA #CHRcr
  6066.    JSR PUTCHAR
  6067.    JMP NEXTtOKEN
  6068.  
  6069. DISPsTRING = *
  6070.    LDA #"S"
  6071.    JSR PUTCHAR
  6072.    LDA #":"
  6073.    JSR PUTCHAR
  6074.    JSR SHOWsTR
  6075.    JMP SHOWcr
  6076.  
  6077. SHOWsTR = *
  6078.    LDA #<STRINGbUF
  6079.    LDY #>STRINGbUF
  6080.    STA ZP
  6081.    STY ZP+1
  6082.    LDA STRINGlEN
  6083.    LDY #0
  6084.    LDX #STDOUT
  6085.    JSR WRITE
  6086.    RTS
  6087.  
  6088. DISPsPECIAL = *
  6089.    CMP #CHReof
  6090.    BNE +
  6091.    RTS
  6092. +  PHA
  6093.    LDA #"C"
  6094.    JSR PUTCHAR
  6095.    LDA #":"
  6096.    JSR PUTCHAR
  6097.    PLA
  6098.    JMP SHOWcHAR
  6099.  
  6100. DISPnUMBER = *
  6101.    LDA #"N"
  6102.    JSR PUTCHAR
  6103.    LDA #":"
  6104.    JSR PUTCHAR
  6105.    LDA #<STRINGbUF
  6106.    LDY #>STRINGbUF
  6107.    STA $80
  6108.    STY $81
  6109.    LDX #NUMBER
  6110.    LDA #1
  6111.    JSR UTOA
  6112.    STY STRINGlEN
  6113.    JSR SHOWsTR
  6114.    JMP SHOWcr
  6115.  
  6116. SOURCEbUF = *
  6117. STRINGbUF = SOURCEbUF+256
  6118. ASeND = STRINGbUF+256
  6119. BCODE.S
  6120. 1150
  6121. ;*** bcode: BCODE ENCODER VERSION 1.00 - BY cRAIG bRUCE - 17-nOV-93
  6122.  
  6123. ;BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ...
  6124.  
  6125. .SEQ ACEHEAD.S
  6126. .ORG ACEaPPaDDRESS
  6127. .OBJ "@0:BCODE"
  6128.  
  6129. JMP MAIN
  6130. .BYTE ACEid1,ACEid2,ACEid3
  6131.  
  6132. ;*** GLOBAL DECLARATIONS
  6133.  
  6134. CHRcr       = $0D
  6135. CHRlf       = $0A
  6136. CHRqUOTE    = $22
  6137. TRUE        = $FF
  6138. FALSE       = $00
  6139. MAXcHUNK    = 54
  6140. MAXlINE     = 80
  6141. TRpETSCII   = 0
  6142. TRaSCIIcRlF = 1
  6143. TRaSCIIlF   = 2
  6144.  
  6145. ARG         = 2  ;(2)  ;CURRENT ARGUMENT NUMBER
  6146. NAME        = 4  ;(2)  ;NAME OF FILE BEING BCODED
  6147. STRING      = 8  ;(2)  ;TEMP STRING
  6148. MAXLINES    = 10 ;(4)  ;MAX NUMBER OF LINES PER SEGMENT
  6149. LINELIMIT   = 14 ;(1)  ;WHETHER THERE IS A RESTRICTION ON LINES/SEG
  6150. ALIAS       = 16 ;(2)  ;CURRENT ALIAS NAME TO USE
  6151. TRANStO     = 18 ;(1)  ;OUTPUT FILE TRANSLATION: PETSCII, ASC-CRLF, ASC-LF
  6152. PROGNAME    = 19 ;(2)  ;POINTER TO ARGV[0]
  6153. VERBOSE     = 21 ;(1)  ;FLAG FOR GIVING VERBOSE INFORMATION
  6154. FILENAMEuSED = 22;(1)  ;FLAG: IF A FILENAME HAS BEEN ENCOUNTERED ON THE CMD LINE
  6155. BUFpTR      = 23 ;(2)  ;POINTER TO NEXT CHAR IN INPUT BUFFER
  6156. BUFcOUNT    = 25 ;(2)  ;NUMBER OF BYTES LEFT IN INPUT BUFFER
  6157. INbUFsIZE   = 27 ;(2)  ;MAXIMUM SIZE OF INPUT BUFFER
  6158. INFILE      = 29 ;(1)  ;FD OF INPUT BINARY FILE
  6159. OUTFILE     = 30 ;(1)  ;FD TO OUTPUT BCODED DATA TO
  6160. CHUNKlEN    = 31 ;(1)  ;LENGTH OF CHUNK FOR ENCODING
  6161. CHUNKpOS    = 32 ;(1)  ;SCANNING POSITION IN CHUNK DURING ENCODING
  6162. BCTEMP      = 33 ;(1)  ;TEMPORARY FOR CONVERSION FROM 8 TO 6 BITS
  6163. TRpUTpTR    = 34 ;(2)  ;POINTER TO TRANSLATED-PUTS STRING
  6164. TRpUTiNDEX  = 36 ;(1)  ;INDEX INTO TRANSLATED-PUTS STRING
  6165. CRC         = 37 ;(4)  ;CUMULATIVE CRC-32 OF SEGMENT
  6166. BYTES       = 41 ;(4)  ;CUMULATIVE BYTES IN SEGMENT
  6167. SEGNUM      = 45 ;(4)  ;CURRENT SEGMENT NUMBER
  6168. STOPcOUNTDN = 49 ;(1)  ;COUNTDOWN TO CHECK STOP KEY
  6169. SCANvAL     = 50 ;(4)  ;RESULT OF CONVERTING STRING TO 32-BIT NUMBER
  6170. LINENUM     = 54 ;(4)  ;CURRENT LINE NUMBER BEING ENCODED
  6171. ISlASTsEG   = 58 ;(1)  ;WHETHER WE HAVE JUST ENCODED THE LAST SEGMENT
  6172. WORK        = 112;(16) ;MISC WORK AREA
  6173.  
  6174. ;===MAIN===
  6175.  
  6176. MAIN = *
  6177.    ;** CHECK FOR LARGE ENOUGH tpa
  6178.    SEC
  6179.    LDA #<BSSeND
  6180.    CMP ACEsTACKpTR+0
  6181.    LDA #>BSSeND
  6182.    SBC ACEsTACKpTR+1
  6183.    BCS +
  6184.    JMP MAINiNIT
  6185. +  LDA #<TPAmSG
  6186.    LDY #>TPAmSG
  6187.    JSR EPUTS
  6188. DIE = *
  6189.    LDA #1
  6190.    LDX #0
  6191.    JMP EXIT
  6192.  
  6193. TPAmSG = *
  6194.    .ASC "iNSUFFICIENT PROGRAM SPACE TO RUN BCODE"
  6195.    .BYTE CHRcr,0
  6196.  
  6197. USAGE = *
  6198.    LDA #<USAGEmSG
  6199.    LDY #>USAGEmSG
  6200.    JSR EPUTS
  6201.    JMP DIE
  6202.  
  6203. USAGEmSG = *
  6204.    .ASC "USAGE: BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ..."
  6205.    .BYTE CHRcr
  6206.    .ASC "FLAGS: -V:VERBOSE, -U:UNIX-ASCII, -M:MS-DOS-ASCII"
  6207.    .BYTE CHRcr,0
  6208.  
  6209. DEFAULTaLIAS = *
  6210.    .ASC "STDIN"
  6211.    .BYTE 0
  6212.  
  6213. MAINiNIT = *
  6214.    ;** SET GLOBALS
  6215.    LDA #TRUE
  6216.    STA VERBOSE
  6217.    LDA #0
  6218.    LDY #0
  6219.    JSR GETARG
  6220.    LDA ZP+0
  6221.    LDY ZP+1
  6222.    STA PROGNAME+0
  6223.    STY PROGNAME+1
  6224.    LDA #FALSE
  6225.    STA FILENAMEuSED
  6226.    LDA #0
  6227.    STA ARG+0
  6228.    STA ARG+1
  6229.    LDA #<DEFAULTaLIAS
  6230.    LDY #>DEFAULTaLIAS
  6231.    STA ALIAS+0
  6232.    STY ALIAS+1
  6233.    LDA #FALSE
  6234.    STA LINELIMIT
  6235.    LDA #TRpETSCII
  6236.    STA TRANStO
  6237.    ;** GET INPUT BUFFER LENGTH
  6238.    SEC
  6239.    LDA ACEsTACKpTR+0
  6240.    SBC #<INbUF
  6241.    STA INbUFsIZE+0
  6242.    LDA ACEsTACKpTR+1
  6243.    SBC #>INbUF
  6244.    STA INbUFsIZE+1
  6245.  
  6246.    MAINnEXT = *
  6247.    JSR CHECKsTOP
  6248.    INC ARG+0
  6249.    BNE +
  6250.    INC ARG+1
  6251. +  LDA ARG+0
  6252.    LDY ARG+1
  6253.    JSR GETARG
  6254.    LDA ZP+0
  6255.    ORA ZP+1
  6256.    BEQ MAINeXIT
  6257.    LDA ZP+0
  6258.    LDY ZP+1
  6259.    STA NAME+0
  6260.    STY NAME+1
  6261.    LDY #0
  6262.    LDA (ZP),Y
  6263.    CMP #"-"
  6264.    BNE +
  6265.    JMP HANDLEfLAGS
  6266. +  JSR ECHO
  6267.    JSR BCODE
  6268.    JMP MAINnEXT
  6269.  
  6270. MAINeXIT = *
  6271.    BIT FILENAMEuSED
  6272.    BMI +
  6273.    ;XX SHOULD READ FROM STDIN IF NO FILES
  6274.    NOP
  6275. +  RTS
  6276.  
  6277. HANDLEfLAGS = *
  6278.    INY
  6279.    LDA (ZP),Y
  6280.    BNE +
  6281.    JMP MAINnEXT
  6282. +  CMP #"V"
  6283.    BEQ FLAGv
  6284.    CMP #"M"
  6285.    BEQ FLAGm
  6286.    CMP #"A"
  6287.    BEQ FLAGm
  6288.    CMP #"U"
  6289.    BEQ FLAGu
  6290.    CMP #"L"
  6291.    BEQ FLAGl
  6292.    CMP #"H"
  6293.    BNE +
  6294.    JMP USAGE
  6295. +  NOP
  6296.    ;XX UNRECOGNIZED OPTION
  6297.    JMP HANDLEfLAGS
  6298.  
  6299. FLAGv = *
  6300.    LDA #TRUE
  6301.    STA VERBOSE
  6302.    JMP HANDLEfLAGS
  6303.  
  6304. FLAGm = *
  6305.    LDA #TRaSCIIcRlF
  6306.    STA TRANStO
  6307.    JMP HANDLEfLAGS
  6308.  
  6309. FLAGu = *
  6310.    LDA #TRaSCIIlF
  6311.    STA TRANStO
  6312.    JMP HANDLEfLAGS
  6313.  
  6314. FLAGl = *
  6315.    INC ARG+0
  6316.    BNE +
  6317.    INC ARG+1
  6318. +  LDA ARG+0
  6319.    LDY ARG+1
  6320.    JSR GETARG
  6321.    LDA ZP+0
  6322.    ORA ZP+1
  6323.    BEQ FLAGlERROR
  6324.    LDY #0
  6325.    JSR SCANnUM
  6326.    BCS FLAGlERROR
  6327.    LDX #3
  6328. -  LDA SCANvAL,X
  6329.    STA MAXLINES,X
  6330.    DEX
  6331.    BPL -
  6332.    LDA MAXLINES+0
  6333.    ORA MAXLINES+1
  6334.    ORA MAXLINES+2
  6335.    ORA MAXLINES+3
  6336.    BEQ FLAGlERROR
  6337.    LDA #TRUE
  6338.    STA LINELIMIT
  6339.    JMP MAINnEXT
  6340. FLAGlERROR = *
  6341.    LDA #<FLAGlERRORmSG
  6342.    LDY #>FLAGlERRORmSG
  6343.    JSR EPUTS
  6344.    JMP DIE
  6345. FLAGlERRORmSG = *
  6346.    .ASC "error: INVALID MAXIMUM LINE LIMIT GIVEN WITH -L OPTION"
  6347.    .BYTE CHRcr,0
  6348.  
  6349. ECHO = *
  6350.    LDA #<ECHOmSG1
  6351.    LDY #>ECHOmSG1
  6352.    JSR EPUTS
  6353.    LDA NAME+0
  6354.    LDY NAME+1
  6355.    JSR EPUTS
  6356.    LDA #<ECHOmSG2
  6357.    LDY #>ECHOmSG2
  6358.    JSR EPUTS
  6359.    RTS
  6360.  
  6361. ECHOmSG1 = *
  6362.    .ASC "BCODING FILE "
  6363.    .BYTE CHRqUOTE,0
  6364. ECHOmSG2 = *
  6365.    .BYTE CHRqUOTE
  6366.    .ASC "..."
  6367.    .BYTE CHRcr,0
  6368.  
  6369. CHECKsTOP = *
  6370.    JSR STOPKEY
  6371.    BCS +
  6372.    RTS
  6373. +  LDA #<STOPPEDmSG
  6374.    LDY #>STOPPEDmSG
  6375.    JSR EPUTS
  6376.    JMP DIE
  6377.  
  6378.    STOPPEDmSG = *
  6379.    .ASC "<sTOPPED>"
  6380.    .BYTE CHRcr,0
  6381.  
  6382. BCODE = *
  6383.    LDA #TRUE
  6384.    STA FILENAMEuSED
  6385.    LDA NAME+0
  6386.    LDY NAME+1
  6387.    STA ZP+0
  6388.    STY ZP+1
  6389.    LDA #"R"
  6390.    JSR OPEN
  6391.    BCS OPENeRROR
  6392.    STA INFILE
  6393.    LDA #0
  6394.    STA BUFcOUNT+0
  6395.    STA BUFcOUNT+1
  6396.    JSR SETbASE64tABLE
  6397.    LDA #1
  6398.    LDY #0
  6399.    STA SEGNUM+0
  6400.    STY SEGNUM+1
  6401.    STY SEGNUM+2
  6402.    STY SEGNUM+3
  6403.  
  6404.    BCODEnEXTsEGMENT = *
  6405.    LDA #STDOUT
  6406.    STA OUTFILE
  6407.    BIT LINELIMIT
  6408.    BPL +
  6409.    JSR GEToUTFILE
  6410. +  JSR BCODEsEGMENT
  6411.    LDA OUTFILE
  6412.    CMP #STDOUT
  6413.    BEQ +
  6414.    JSR CLOSE
  6415. +  BIT ISlASTsEG
  6416.    BPL +
  6417.    LDA INFILE
  6418.    JSR CLOSE
  6419.    RTS
  6420. +  INC SEGNUM+0
  6421.    BNE +
  6422.    INC SEGNUM+1
  6423.    BNE +
  6424.    INC SEGNUM+2
  6425.    BNE +
  6426.    INC SEGNUM+3
  6427. +  JMP BCODEnEXTsEGMENT
  6428.  
  6429. OPENeRROR = *
  6430.    LDA #<OPENeRRORmSG1
  6431.    LDY #>OPENeRRORmSG1
  6432.    JSR EPUTS
  6433.    LDA NAME+0
  6434.    LDY NAME+1
  6435.    JSR EPUTS
  6436.    LDA #<OPENeRRORmSG2
  6437.    LDY #>OPENeRRORmSG2
  6438.    JSR EPUTS
  6439.    RTS
  6440. OPENeRRORmSG1 = *
  6441.    .ASC "error: CANNOT OPEN "
  6442.    .BYTE CHRqUOTE,0
  6443. OPENeRRORmSG2 = *
  6444.    .BYTE CHRqUOTE,CHRcr,0
  6445.  
  6446. OUTFILEfILElEN = WORK+0
  6447. OUTFILEeXTlEN  = WORK+1
  6448. OUTFILEtEMP    = WORK+2
  6449.  
  6450. GEToUTFILE = *
  6451.    ;** GET FILENAME
  6452.    LDA NAME+0
  6453.    LDY NAME+1
  6454.    STA ZP+0
  6455.    STY ZP+1
  6456.    JSR BASENAME
  6457.    STX OUTFILEfILElEN
  6458.    ;** GET SEG NUMBER, 2+ DIGITS
  6459.    LDA #<NUMBUF
  6460.    LDY #>NUMBUF
  6461.    STA SYSWORK+0
  6462.    STY SYSWORK+1
  6463.    LDA #1
  6464.    LDX #SEGNUM
  6465.    JSR UTOA
  6466.    CPY #1
  6467.    BNE +
  6468.    LDA NUMBUF+0
  6469.    STA NUMBUF+1
  6470.    LDA #"0"
  6471.    STA NUMBUF+0
  6472.    LDA #0
  6473.    STA NUMBUF+2
  6474.    INY
  6475. +  TYA
  6476.    CLC
  6477.    ADC #2
  6478.    STA OUTFILEeXTlEN
  6479.    CLC
  6480.    LDA OUTFILEfILElEN
  6481.    ADC OUTFILEeXTlEN
  6482.    LDY OUTFILEfILElEN
  6483.    CMP #17
  6484.    BCC +
  6485.    SEC
  6486.    LDA #16
  6487.    SBC OUTFILEeXTlEN  ;GIVES ALLOWED FILENAME LEN
  6488.    TAY
  6489. +  LDA #"."
  6490.    STA OUTbUF,Y
  6491.    INY
  6492.    LDA #"B"
  6493.    STA OUTbUF,Y
  6494.    INY
  6495.    LDX #0
  6496. -  LDA NUMBUF,X
  6497.    STA OUTbUF,Y
  6498.    BEQ +
  6499.    INX
  6500.    INY
  6501.    BNE -
  6502.    ;** OPEN THE FILE
  6503. +  LDA #<OUTbUF
  6504.    LDY #>OUTbUF
  6505.    STA ZP+0
  6506.    STY ZP+1
  6507.    LDA #"W"
  6508.    JSR OPENoVERWRITE
  6509.    STA OUTFILE
  6510.    BCC +
  6511.    LDA #<OUTFILEeRRmSG1
  6512.    LDY #>OUTFILEeRRmSG1
  6513.    JSR EPUTS
  6514.    LDA #<OUTbUF
  6515.    LDY #>OUTbUF
  6516.    JSR EPUTS
  6517.    LDA #<OUTFILEeRRmSG2
  6518.    LDY #>OUTFILEeRRmSG2
  6519.    JSR EPUTS
  6520.    JMP DIE
  6521.    ;** ECHO OPENING
  6522. +  LDA #<OUTFILEmSG
  6523.    LDY #>OUTFILEmSG
  6524.    JSR EPUTS
  6525.    LDA #<OUTbUF
  6526.    LDY #>OUTbUF
  6527.    JSR EPUTS
  6528.    LDA #CHRqUOTE
  6529.    JSR EPUTCHAR
  6530.    LDA #CHRcr
  6531.    JMP EPUTCHAR
  6532.  
  6533. OUTFILEmSG = *
  6534.    .ASC "OUTPUTTING TO FILE "
  6535.    .BYTE CHRqUOTE,0
  6536. OUTFILEeRRmSG1 = *
  6537.    .ASC "error: CANNOT OPEN "
  6538.    .BYTE CHRqUOTE,0
  6539. OUTFILEeRRmSG2 = *
  6540.    .BYTE CHRqUOTE
  6541.    .ASC ", ABORTING!"
  6542.    .BYTE CHRcr,0
  6543.  
  6544. BCODEsEGMENT = *  ;( ) : ISlASTsEG
  6545.    ;** HEADER LINE
  6546.    LDA #<BCODEhEADERmSG
  6547.    LDY #>BCODEhEADERmSG
  6548.    JSR TRpUTS
  6549.    LDX #SEGNUM
  6550.    JSR TRpUTNUM
  6551.    LDA #" "
  6552.    JSR TRpUTCHAR
  6553.    LDA NAME+0
  6554.    LDY NAME+1
  6555.    STA ZP+0
  6556.    STY ZP+1
  6557.    JSR BASENAME
  6558.    LDA #<OUTbUF
  6559.    LDY #>OUTbUF
  6560.    JSR TRpUTS
  6561.    LDA #CHRcr
  6562.    JSR TRpUTCHAR
  6563.    JSR CRCiNIT
  6564.    LDA #0
  6565.    STA LINENUM+0
  6566.    STA LINENUM+1
  6567.    STA LINENUM+2
  6568.    STA LINENUM+3
  6569.    ;** LOOP
  6570.    ENCODEnEXT = *
  6571.    JSR ENCODElINE
  6572.    BCC +
  6573.    LDA #TRUE
  6574.    STA ISlASTsEG
  6575.    JMP ENCODEsEGfINISH
  6576. +  BIT LINELIMIT
  6577.    BPL ENCODEnEXT
  6578.    INC LINENUM+0
  6579.    BNE +
  6580.    INC LINENUM+1
  6581.    BNE +
  6582.    INC LINENUM+2
  6583.    BNE +
  6584.    INC LINENUM+3
  6585. +  SEC
  6586.    LDY #4
  6587.    LDX #0
  6588. -  LDA LINENUM,X
  6589.    SBC MAXLINES,X
  6590.    INX
  6591.    DEY
  6592.    BNE -
  6593.    BCC ENCODEnEXT
  6594.    LDA #FALSE
  6595.    STA ISlASTsEG
  6596.  
  6597.    ;** END LINE
  6598.    ENCODEsEGfINISH = *
  6599.    JSR CRCfINISH
  6600.    BIT ISlASTsEG
  6601.    BPL +
  6602.    LDA #<BCODEeNDmSG
  6603.    LDY #>BCODEeNDmSG
  6604.    JMP ++
  6605. +  LDA #<BCODEcONTINUEDmSG
  6606.    LDY #>BCODEcONTINUEDmSG
  6607. +  JSR TRpUTS
  6608.    LDX #SEGNUM
  6609.    JSR TRpUTNUM
  6610.    LDA #" "
  6611.    JSR TRpUTCHAR
  6612.    LDX #BYTES
  6613.    JSR TRpUTNUM
  6614.    LDA #" "
  6615.    JSR TRpUTCHAR
  6616.    LDX #CRC
  6617.    JSR TRpUTHEX
  6618.    LDA #CHRcr
  6619.    JSR TRpUTCHAR
  6620.    RTS
  6621.  
  6622. BCODEhEADERmSG = *
  6623.    .ASC "--BCODE-BEGIN "
  6624.    .BYTE 0
  6625. BCODEeNDmSG = *
  6626.    .ASC "--BCODE-END "
  6627.    .BYTE 0
  6628. BCODEcONTINUEDmSG = *
  6629.    .ASC "--BCODE-CONTINUED "
  6630.    .BYTE 0
  6631.  
  6632. BASENAMEsTART .BUF 1
  6633. BASENAME = * ;( (ZP)=INNAME ) : OUTbUF=OUTNAME, .x=BASENAMElEN
  6634.    LDY #255
  6635.    STY BASENAMEsTART
  6636. -  INY
  6637.    LDA (ZP),Y
  6638.    BEQ BASENAMEdONE
  6639.    CMP #":"
  6640.    BEQ +
  6641.    CMP #"/"
  6642.    BNE -
  6643. +  STY BASENAMEsTART
  6644.    JMP -
  6645.    BASENAMEdONE = *
  6646.    LDY BASENAMEsTART
  6647.    LDX #255
  6648. -  INY
  6649.    INX
  6650.    LDA (ZP),Y
  6651.    STA OUTbUF,X
  6652.    BNE -
  6653.    CPX #2
  6654.    BCC +
  6655.    LDA OUTbUF-2,X
  6656.    CMP #","
  6657.    BNE +
  6658.    LDA #0
  6659.    STA OUTbUF-2,X
  6660.    DEX
  6661.    DEX
  6662. +  RTS
  6663.  
  6664. ENCODElINE = *
  6665.    INC STOPcOUNTDN
  6666.    LDA STOPcOUNTDN
  6667.    AND #7
  6668.    BNE +
  6669.    JSR CHECKsTOP
  6670.    ;** GET THE CHUNK
  6671. +  JSR READcHUNK
  6672.    BCC +
  6673.    RTS
  6674. +  STX CHUNKlEN
  6675.    LDA #0
  6676.    STA INcHUNK+0,X
  6677.    STA INcHUNK+1,X
  6678.    JSR CRCcHUNK
  6679.    ;** ENCODE THE CHUNK
  6680.    LDX #0  ;CHUNKPOS
  6681.    LDY #0  ;LINEPOS
  6682. -  JSR ENCODEfOURcHARS
  6683.    CPX CHUNKlEN
  6684.    BCC -
  6685.    ;** FIX NON-INTEGRAL-LENGTH (LAST) LINE
  6686.    BEQ +
  6687.    LDA #"="
  6688.    STA OUTbUF-1,Y
  6689.    DEX
  6690.    CPX CHUNKlEN
  6691.    BEQ +
  6692.    STA OUTbUF-2,Y
  6693.    ;** OUTPUT THE LINE
  6694. +  LDA #CHRcr
  6695.    STA OUTbUF,Y
  6696.    LDX TRANStO
  6697.    CPX #TRpETSCII
  6698.    BEQ +
  6699.    INY
  6700.    LDA #CHRlf
  6701.    STA OUTbUF,Y
  6702.    CPX #TRaSCIIcRlF
  6703.    BEQ +
  6704.    DEY
  6705.    STA OUTbUF,Y
  6706. +  INY
  6707.    TYA
  6708.    LDA #<OUTbUF
  6709.    LDX #>OUTbUF
  6710.    STA ZP+0
  6711.    STX ZP+1
  6712.    TYA
  6713.    LDY #0
  6714.    LDX OUTFILE
  6715.    JSR WRITE
  6716.    RTS
  6717.  
  6718. ENCODEfOURcHARS = *  ;( .x++=CHUNKPOS, .y++=LINEPOS )
  6719.    STX CHUNKpOS
  6720.    ;** PUT BYTES INTO OUTPUT LINE
  6721. ;POS  76543210  76543210  76543210  76543210
  6722. ;BYT  XX111111  XX112222  XX222233  XX333333
  6723. ;BIT    765432    107654    321076    543210
  6724.    ;** FIRST BYTE
  6725.    LDA INcHUNK+0,X
  6726.    LSR
  6727.    LSR
  6728.    TAX
  6729.    LDA BASE64cHAR,X
  6730.    STA OUTbUF,Y
  6731.    INY
  6732.  
  6733.    ;** SECOND BYTE
  6734.    LDX CHUNKpOS
  6735.    LDA INcHUNK+0,X
  6736.    ASL
  6737.    ASL
  6738.    ASL
  6739.    ASL
  6740.    STA BCTEMP
  6741.    LDA INcHUNK+1,X
  6742.    LSR
  6743.    LSR
  6744.    LSR
  6745.    LSR
  6746.    ORA BCTEMP
  6747.    AND #%00111111
  6748.    TAX
  6749.    LDA BASE64cHAR,X
  6750.    STA OUTbUF,Y
  6751.    INY
  6752.  
  6753.    ;** THIRD BYTE
  6754.    LDX CHUNKpOS
  6755.    LDA INcHUNK+1,X
  6756.    ASL
  6757.    ASL
  6758.    STA BCTEMP
  6759.    LDA INcHUNK+2,X
  6760.    ASL
  6761.    ROL
  6762.    ROL
  6763.    AND #%00000011
  6764.    ORA BCTEMP
  6765.    AND #%00111111
  6766.    TAX
  6767.    LDA BASE64cHAR,X
  6768.    STA OUTbUF,Y
  6769.    INY
  6770.  
  6771.    ;** FOURTH BYTE
  6772.    LDX CHUNKpOS
  6773.    LDA INcHUNK+2,X
  6774.    AND #%00111111
  6775.    TAX
  6776.    LDA BASE64cHAR,X
  6777.    STA OUTbUF,Y
  6778.    INY
  6779.    LDX CHUNKpOS
  6780.    INX
  6781.    INX
  6782.    INX
  6783.    RTS
  6784.  
  6785. BASE64iNDEX .BUF 1
  6786. SETbASE64tABLE = *
  6787.    LDY #0
  6788.    LDX #0
  6789.    LDA TRANStO
  6790.    CMP #TRpETSCII
  6791.    BEQ +
  6792.    LDX #BASE64dESCaSC-BASE64dESCpET
  6793. +  STX BASE64iNDEX
  6794. -  LDX BASE64iNDEX
  6795.    LDA BASE64dESCpET+0,X
  6796.    BEQ +
  6797.    PHA
  6798.    LDA BASE64dESCpET+1,X
  6799.    TAX
  6800.    PLA
  6801. -  STA BASE64cHAR,Y
  6802.    CLC
  6803.    ADC #1
  6804.    INY
  6805.    DEX
  6806.    BNE -
  6807.    INC BASE64iNDEX
  6808.    INC BASE64iNDEX
  6809.    BNE --
  6810. +  RTS
  6811.  
  6812. BASE64dESCpET = *
  6813.    .BYTE "a",26,"A",26,"0",10,"+",1,"/",1,$00
  6814. BASE64dESCaSC = *
  6815.    .BYTE $41,26,$61,26,"0",10,"+",1,"/",1,$00
  6816.  
  6817. READcHUNK = *  ;( ) : .x=LEN
  6818.    LDX #0
  6819. -  STX CHUNKlEN
  6820.    JSR GETbYTE
  6821.    LDX CHUNKlEN
  6822.    BCS +
  6823.    STA INcHUNK,X
  6824.    INX
  6825.    CPX #MAXcHUNK
  6826.    BCC -
  6827. -  CLC
  6828.    RTS
  6829. +  CPX #0
  6830.    BNE -
  6831.    SEC
  6832.    RTS
  6833.  
  6834. GETbYTE = *
  6835.    LDA BUFcOUNT+0
  6836.    ORA BUFcOUNT+1
  6837.    BEQ GETbYTEfILLbUF
  6838.    LDY #0
  6839.    LDA (BUFpTR),Y
  6840.    INC BUFpTR+0
  6841.    BNE +
  6842.    INC BUFpTR+1
  6843. +  LDX BUFcOUNT+0
  6844.    BNE +
  6845.    DEC BUFcOUNT+1
  6846. +  DEC BUFcOUNT+0
  6847.    CLC
  6848.    RTS
  6849.  
  6850. GETbYTEfILLbUF = *
  6851.    JSR CHECKsTOP
  6852.    LDA #<INbUF
  6853.    LDY #>INbUF
  6854.    STA ZP+0
  6855.    STY ZP+1
  6856.    STA BUFpTR+0
  6857.    STY BUFpTR+1
  6858.    LDA INbUFsIZE+0
  6859.    LDY INbUFsIZE+1
  6860.    LDX INFILE
  6861.    JSR READ
  6862.    BEQ +
  6863.    BCS +
  6864.    STA BUFcOUNT+0
  6865.    STY BUFcOUNT+1
  6866.    JMP GETbYTE
  6867. +  SEC
  6868.    RTS
  6869.  
  6870. CRCtABLE0 = *
  6871.    .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
  6872.    .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
  6873.    .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
  6874.    .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
  6875.    .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
  6876.    .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
  6877.    .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
  6878.    .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
  6879.    .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
  6880.    .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
  6881.    .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
  6882.    .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
  6883.    .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
  6884.    .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
  6885.    .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
  6886.    .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
  6887.  
  6888. CRCtABLE1 = *
  6889.    .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
  6890.    .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
  6891.    .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
  6892.    .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
  6893.    .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
  6894.    .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
  6895.    .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
  6896.    .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
  6897.    .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
  6898.    .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
  6899.    .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
  6900.    .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
  6901.    .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
  6902.    .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
  6903.    .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
  6904.    .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
  6905.  
  6906. CRCtABLE2 = *
  6907.    .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
  6908.    .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
  6909.    .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
  6910.    .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
  6911.    .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
  6912.    .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
  6913.    .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
  6914.    .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
  6915.    .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
  6916.    .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
  6917.    .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
  6918.    .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
  6919.    .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
  6920.    .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
  6921.    .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
  6922.    .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
  6923.  
  6924. CRCtABLE3 = *
  6925.    .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
  6926.    .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
  6927.    .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
  6928.    .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
  6929.    .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
  6930.    .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
  6931.    .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
  6932.    .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
  6933.    .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
  6934.    .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
  6935.    .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
  6936.    .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
  6937.    .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
  6938.    .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
  6939.    .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
  6940.    .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
  6941.  
  6942. ;** CRC = 0Xffffffff;
  6943. ;** WHILE( (C=GETC(FP)) != eof ) {$7b}
  6944. ;**     CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
  6945. ;** {$7d}
  6946. ;** RETURN( CRC^0Xffffffff );
  6947.  
  6948. CRCiNIT = *
  6949.    LDX #3
  6950. -  LDA #$FF
  6951.    STA CRC,X
  6952.    LDA #0
  6953.    STA BYTES,X
  6954.    DEX
  6955.    BPL -
  6956.    RTS
  6957.  
  6958. CRCcHUNK = *
  6959.    LDY #0
  6960.    CPY CHUNKlEN
  6961.    BCS +
  6962. -  LDA INcHUNK,Y         ;.x = (CRC^C) & 0Xff
  6963.    EOR CRC+0
  6964.    TAX
  6965.    LDA CRC+1            ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
  6966.    EOR CRCtABLE0,X
  6967.    STA CRC+0
  6968.    LDA CRC+2
  6969.    EOR CRCtABLE1,X
  6970.    STA CRC+1
  6971.    LDA CRC+3
  6972.    EOR CRCtABLE2,X
  6973.    STA CRC+2
  6974.    LDA CRCtABLE3,X
  6975.    STA CRC+3
  6976.    INY
  6977.    CPY CHUNKlEN
  6978.    BCC -
  6979. +  CLC
  6980.    LDA BYTES+0
  6981.    ADC CHUNKlEN
  6982.    STA BYTES+0
  6983.    BCC +
  6984.    INC BYTES+1
  6985.    BNE +
  6986.    INC BYTES+2
  6987.    BNE +
  6988.    INC BYTES+3
  6989. +  RTS
  6990.  
  6991. CRCfINISH = *
  6992.    LDX #3
  6993. -  LDA CRC,X
  6994.    EOR #$FF
  6995.    STA CRC,X
  6996.    DEX
  6997.    BPL -
  6998.    RTS
  6999.  
  7000. TRpUTS = *
  7001.    STA TRpUTpTR+0
  7002.    STY TRpUTpTR+1
  7003.    LDY #0
  7004.    STY TRpUTiNDEX
  7005. -  LDY TRpUTiNDEX
  7006.    LDA (TRpUTpTR),Y
  7007.    BEQ +
  7008.    JSR TRpUTCHAR
  7009.    INC TRpUTiNDEX
  7010.    BNE -
  7011. +  RTS
  7012.  
  7013. TRpUTCHAR = *
  7014.    LDX TRANStO
  7015.    CPX #TRpETSCII
  7016.    BEQ +
  7017.    CMP #CHRcr
  7018.    BEQ ++
  7019.    JSR CONVpET2aSC
  7020. +  LDX OUTFILE
  7021.    JMP PUTC
  7022. +  LDX TRANStO
  7023.    CPX #TRaSCIIlF
  7024.    BEQ +
  7025.    LDA #CHRcr
  7026.    LDX OUTFILE
  7027.    JSR PUTC
  7028. +  LDA #CHRlf
  7029.    LDX OUTFILE
  7030.    JMP PUTC
  7031.  
  7032. CONVpET2aSC = *
  7033.    CMP #"A"
  7034.    BCS +
  7035.    RTS
  7036. +  TAX
  7037.    BPL +
  7038.    SBC #$C0-$60
  7039.    TAX
  7040. +  AND #$1F
  7041.    BNE +
  7042. -  TXA
  7043.    RTS
  7044. +  CMP #$1B
  7045.    BCS -
  7046.    TXA
  7047.    EOR #$20
  7048.    RTS
  7049.  
  7050. TRpUTNUM = * ;( .x=NUMBER32 )
  7051.    LDA #<NUMBUF
  7052.    LDY #>NUMBUF
  7053.    STA SYSWORK+0
  7054.    STY SYSWORK+1
  7055.    LDA #1
  7056.    JSR UTOA
  7057.    TRpUTNUMdUMP = *
  7058.    LDA #<NUMBUF
  7059.    LDY #>NUMBUF
  7060.    JSR TRpUTS
  7061.    RTS
  7062.  
  7063. TRpUTHEX = * ;( .x=NUMBER32 )
  7064.    LDA #4
  7065.    STA WORK
  7066.    LDY #0
  7067.    INX
  7068.    INX
  7069.    INX
  7070. -  LDA 0,X
  7071.    PHA
  7072.    LSR
  7073.    LSR
  7074.    LSR
  7075.    LSR
  7076.    JSR TRpUTHEXdIGIT
  7077.    PLA
  7078.    JSR TRpUTHEXdIGIT
  7079.    DEX
  7080.    DEC WORK
  7081.    BNE -
  7082.    LDA #0
  7083.    STA NUMBUF,Y
  7084.    JMP TRpUTNUMdUMP
  7085.  
  7086. TRpUTHEXdIGIT = *  ;( .a=DIGIT, .y=NUMBUFiNDEX )
  7087.    AND #$0F
  7088.    ORA #$30
  7089.    CMP #$3A
  7090.    BCC +
  7091.    ADC #6
  7092. +  STA NUMBUF,Y
  7093.    INY
  7094.    RTS
  7095.  
  7096. ;=== STANDARD LIBRARY ===
  7097.  
  7098. PUTS = *
  7099.    LDX #STDOUT
  7100. FPUTS = *
  7101.    STA ZP+0
  7102.    STY ZP+1
  7103.    LDY #$FF
  7104. -  INY
  7105.    LDA (ZP),Y
  7106.    BNE -
  7107.    TYA
  7108.    LDY #0
  7109.    JMP WRITE
  7110. EPUTS = *
  7111.    LDX #STDERR
  7112.    JMP FPUTS
  7113.  
  7114. EPUTCHAR = *
  7115.    LDX #STDERR
  7116.    JMP PUTC
  7117. PUTCHAR = *
  7118.    LDX #STDOUT
  7119. PUTC = *
  7120.    STA PUTCbUFFER
  7121.    LDA #<PUTCbUFFER
  7122.    LDY #>PUTCbUFFER
  7123.    STA ZP+0
  7124.    STY ZP+1
  7125.    LDA #1
  7126.    LDY #0
  7127.    JMP WRITE
  7128.    PUTCbUFFER .BUF 1
  7129.  
  7130. GETARG = *
  7131.    STY ZP+1
  7132.    ASL
  7133.    STA ZP+0
  7134.    ROL ZP+1
  7135.    CLC
  7136.    LDA ACEaRGV+0
  7137.    ADC ZP+0
  7138.    STA ZP+0
  7139.    LDA ACEaRGV+1
  7140.    ADC ZP+1
  7141.    STA ZP+1
  7142.    LDY #0
  7143.    LDA (ZP),Y
  7144.    TAX
  7145.    INY
  7146.    LDA (ZP),Y
  7147.    STX ZP+0
  7148.    STA ZP+1
  7149.    RTS
  7150.  
  7151. SCANdIGIT    .BUF 1
  7152. SCANsAVE     .BUF 4
  7153. SCANtEMP     .BUF 1
  7154. SCANiNDEX    .BUF 1
  7155. SCANaNYTHING .BUF 1
  7156.  
  7157. SCANnUM = *  ;( (ZP)=NUMsTR, .y=NUMiNDEX ) : .y=SCAN, [SCANvAL]=NUM, .cs=ERR
  7158.    LDX #3
  7159.    LDA #0
  7160. -  STA SCANvAL,X
  7161.    DEX
  7162.    BPL -
  7163.    LDA #0
  7164.    STA SCANaNYTHING
  7165. -  LDA (ZP),Y
  7166.    CMP #" "
  7167.    BNE SCANnUMnEXT
  7168.    INY
  7169.    BNE -
  7170.    SEC
  7171.    RTS
  7172.  
  7173.    SCANnUMnEXT = *
  7174.    LDA (ZP),Y
  7175.    CMP #"0"
  7176.    BCC +
  7177.    CMP #"9"+1
  7178.    BCC ++
  7179. +  LDA SCANaNYTHING
  7180.    BEQ SCANeRROR
  7181.    CLC
  7182.    RTS
  7183. +  AND #$0F
  7184.    STA SCANdIGIT
  7185.    LDA #$FF
  7186.    STA SCANaNYTHING
  7187.    ;** TIMES TEN
  7188.    STY SCANtEMP
  7189.    LDX #3
  7190. -  LDA SCANvAL,X
  7191.    STA SCANsAVE,X
  7192.    DEX
  7193.    BPL -
  7194.    LDA #2
  7195.    STA SCANiNDEX
  7196. -  CLC
  7197.    LDY #4
  7198.    LDX #0
  7199. -  ROL SCANvAL,X
  7200.    INX
  7201.    DEY
  7202.    BNE -
  7203.    BCS SCANeRROR
  7204.    DEC SCANiNDEX
  7205.    BNE --
  7206.    CLC
  7207.    LDY #4
  7208.    LDX #0
  7209. -  LDA SCANvAL,X
  7210.    ADC SCANsAVE,X
  7211.    STA SCANvAL,X
  7212.    INX
  7213.    DEY
  7214.    BNE -
  7215.    BCS SCANeRROR
  7216.    CLC
  7217.    LDY #4
  7218.    LDX #0
  7219. -  ROL SCANvAL,X
  7220.    INX
  7221.    DEY
  7222.    BNE -
  7223.    BCS SCANeRROR
  7224.    CLC
  7225.    LDY #4
  7226.    LDX #0
  7227.    LDA SCANdIGIT
  7228. -  ADC SCANvAL,X
  7229.    STA SCANvAL,X
  7230.    LDA #0
  7231.    INX
  7232.    DEY
  7233.    BNE -
  7234.    BCS SCANeRROR
  7235.  
  7236.    LDY SCANtEMP
  7237.    INY
  7238.    BEQ SCANeRROR
  7239.    JMP SCANnUMnEXT
  7240.  
  7241.    SCANeRROR = *
  7242.    SEC
  7243.    RTS
  7244.  
  7245. OPENoVmODE .BUF 1
  7246. OPENoVERWRITE = *  ;( (ZP)=NAME, .a=MODE ) : .a=fCB, .cs=ERR
  7247.    STA OPENoVmODE
  7248.    JSR OPEN
  7249.    BCS +
  7250.    RTS
  7251. +  LDA ERRNO
  7252.    CMP #ACEeRRfILEeXISTS
  7253.    BEQ +
  7254. -  SEC
  7255.    RTS
  7256. +  JSR REMOVE
  7257.    LDA OPENoVmODE
  7258.    JSR OPEN
  7259.    BCS -
  7260.    RTS
  7261.  
  7262. ;===BSS===
  7263.  
  7264. BSS = *
  7265. OUTbUF     = BSS
  7266. INcHUNK    = OUTbUF+MAXlINE+1
  7267. BASE64cHAR = INcHUNK+MAXcHUNK+5
  7268. NUMBUF     = BASE64cHAR+64
  7269. INbUF      = NUMBUF+12
  7270. BSSeND     = INbUF+64
  7271. BRK.S
  7272. 9
  7273. .SEQ ACEHEAD.S
  7274. .ORG ACEaPPaDDRESS
  7275. .OBJ "@0:BRK"
  7276.  
  7277. JMP MAIN
  7278. .ASC "Cb"
  7279.  
  7280. MAIN = *
  7281.    BRK
  7282. CONFIG.S
  7283. 1172
  7284. ;*** cONFIGURATION pROGRAM ***
  7285.  
  7286. .SEQ ACEHEAD.S
  7287. .ORG ACEaPPaDDRESS
  7288. .OBJ "@0:CONFIG"
  7289.  
  7290. JMP MAIN
  7291. .ASC "Cf"
  7292.  
  7293. KERNELsETLFS = $FFBA
  7294. KERNELsETNAM = $FFBD
  7295. KERNELoPEN   = $FFC0
  7296. KERNELcLOSE  = $FFC3
  7297. KERNELcHKIN  = $FFC6
  7298. KERNELcHKOUT = $FFC9
  7299. KERNELcLRCHN = $FFCC
  7300. KERNELcHRIN  = $FFCF
  7301. KERNELlOAD = $FFD5
  7302. KERNELsWAPPER = $FF5F
  7303. ST = $90
  7304. TOTALbANKS = ACEtOTALmEMORY+2
  7305. CHRcr = 13
  7306. CHRqUOTE = 34
  7307.  
  7308. CONFIGbUF = 2   ;(2)
  7309. SYSnAME  = 4    ;(2)
  7310. RAM0fREEmAP = 6 ;(2)
  7311. ACEeNDpAGE = 8  ;(1)
  7312. SYStYPE  = 9    ;(1)
  7313. MEMrEAD  = 12   ;(2)
  7314. MEMwRITE = 14   ;(2)
  7315. BANKS = 16      ;(1)
  7316. BANKlIMIT = 17  ;(1)
  7317. SAVE0 = 18      ;(2)
  7318. SAVE2 = 20      ;(2)
  7319. SAVEn = 22      ;(2)
  7320. TITLEpTR = $70  ;(2)
  7321.  
  7322. MAIN = *
  7323.    LDA #<TITLE
  7324.    LDY #>TITLE
  7325.    STA TITLEpTR+0
  7326.    STY TITLEpTR+1
  7327.    JSR LOADcONFIG
  7328.    BCS +
  7329.    JSR LOADcHARSET
  7330.    BCS +
  7331.    JSR LOADsHELL
  7332.    BCS +
  7333.    JSR SCREENiNIT
  7334.    JSR SETdATE
  7335.    JSR DISPLAYdATE
  7336.    JSR GETrAMLINKpARMS
  7337.    JSR INTERNALmEMORY
  7338.    JSR REUmEMORY
  7339.    JSR RLREUmEMORY
  7340.    JSR RLmEMORY
  7341.    JSR TOTALmEMORY
  7342.    CLC
  7343.    LDA #<TITLE
  7344.    LDY #>TITLE
  7345.    STA 2
  7346.    STY 3
  7347.    SEC
  7348.    LDA TITLEpTR+0
  7349.    SBC #<TITLE
  7350.    STA 4
  7351.    LDA TITLEpTR+1
  7352.    SBC #>TITLE
  7353.    STA 5
  7354.    CLC
  7355. +  RTS
  7356.  
  7357. TESTmEMORYtYPE = *  ;( .a=TYPE, .x=BANKlIMIT ) : .a=BANKcOUNT
  7358.    STA ZP+3
  7359.    STX BANKlIMIT
  7360.    LDA #$00
  7361.    LDY #$80
  7362.    LDX #$00
  7363.    STA ZP
  7364.    STY ZP+1
  7365.    STX ZP+2
  7366.    LDA #0
  7367.    STA BANKS
  7368.  
  7369.    NEXTbANK = *
  7370.    LDA BANKS
  7371.    STA ZP+2
  7372.    JSR SAVEbANK
  7373.    LDA #$FF-$CB
  7374.    STA MEMwRITE
  7375.    LDA ZP+2
  7376.    STA MEMwRITE+1
  7377.    LDX #MEMwRITE
  7378.    LDY #2
  7379.    JSR ZPSTORE
  7380.    LDA #$FF-$CB
  7381.    LDX ZP+2
  7382.    JSR TESTbANK
  7383.    BCS BANKfAIL
  7384.    LDA #$CB
  7385.    STA MEMwRITE
  7386.    LDX #MEMwRITE
  7387.    LDY #2
  7388.    JSR ZPSTORE
  7389.    LDA #$CB
  7390.    LDX ZP+2
  7391.    JSR TESTbANK
  7392.    BCS BANKfAIL
  7393.    LDA #$CB
  7394.    LDX #0
  7395.    JSR TESTbANK
  7396.    BCS BANKfAIL
  7397.    LDA ZP+2
  7398.    CMP #2
  7399.    BCC +
  7400.    LDA #$CB
  7401.    LDX #2
  7402.    JSR TESTbANK
  7403.    BCS BANKfAIL
  7404. +  JSR RESTOREbANK
  7405.    INC BANKS
  7406.    LDA BANKS
  7407.    CMP BANKlIMIT
  7408.    BCC NEXTbANK
  7409.  
  7410.    BANKfAIL = *
  7411.    JSR RESTOREwRAPbANKS
  7412.    LDA BANKS
  7413.    RTS
  7414.  
  7415. SAVEbANK = *  ;()
  7416.    LDX #SAVEn
  7417.    LDY #2
  7418.    LDA ZP+2
  7419.    CMP #0
  7420.    BNE +
  7421.    LDX #SAVE0
  7422. +  CMP #2
  7423.    BNE +
  7424.    LDX #SAVE2
  7425. +  JSR ZPLOAD
  7426.    RTS
  7427.  
  7428. RESTOREbANK = *  ;()
  7429.    LDA ZP+2
  7430.    CMP #0
  7431.    BEQ +
  7432.    CMP #2
  7433.    BEQ +
  7434.    LDX #SAVEn
  7435.    LDY #2
  7436.    JSR ZPSTORE
  7437. +  RTS
  7438.  
  7439. RESTOREwRAPbANKS = *  ;()
  7440.    LDA BANKS
  7441.    CMP #3
  7442.    BCC +
  7443. +  LDA #2
  7444.    STA ZP+2
  7445.    LDX #SAVE2
  7446.    LDY #2
  7447.    JSR ZPSTORE
  7448.    LDA BANKS
  7449.    CMP #1
  7450.    BCC +
  7451.    LDA #0
  7452.    STA ZP+2
  7453.    LDX #SAVE0
  7454.    LDY #2
  7455.    JSR ZPSTORE
  7456. +  RTS
  7457.  
  7458. RDvAL  = 10  ;(1)
  7459. RDbANK = 11  ;(1)
  7460.  
  7461. TESTbANK = *  ;( .a=DATA, .x=BANK ) : .cs=ERR
  7462.    STA RDvAL
  7463.    LDA ZP+2
  7464.    STA RDbANK
  7465.    STX ZP+2
  7466.    LDA #$FF
  7467.    STA MEMrEAD
  7468.    STA MEMrEAD+1
  7469.    LDX #MEMrEAD
  7470.    LDY #2
  7471.    JSR ZPLOAD
  7472.    LDA MEMrEAD
  7473.    CMP RDvAL
  7474.    BNE +
  7475.    LDA MEMrEAD+1
  7476.    CMP ZP+2
  7477.    BNE +
  7478.    LDA RDbANK
  7479.    STA ZP+2
  7480.    CLC
  7481.    RTS
  7482. +  LDA RDbANK
  7483.    STA ZP+2
  7484.    SEC
  7485.    RTS
  7486.  
  7487. PUTS = *
  7488.    STA $40
  7489.    STY $41
  7490.    LDY #0
  7491. -  LDA ($40),Y
  7492.    BEQ +
  7493.    JSR CHROUT
  7494.    INY
  7495.    BNE -
  7496.    INC $41
  7497.    BNE -
  7498. +  RTS
  7499.  
  7500. LOADcONFIG = *
  7501.    LDA #0
  7502.    LDX 186
  7503.    LDY #0
  7504.    JSR KERNELsETLFS
  7505.    LDA #10
  7506.    LDX #<LOADcONFIGnAME
  7507.    LDY #>LOADcONFIGnAME
  7508.    JSR KERNELsETNAM
  7509.    LDA #0
  7510.    LDX CONFIGbUF
  7511.    LDY CONFIGbUF+1
  7512.    JSR KERNELlOAD
  7513.    BCS +
  7514.    CLC
  7515.    RTS
  7516. +  LDA #<BADcONFIG
  7517.    LDY #>BADcONFIG
  7518.    JSR PUTS
  7519.    SEC
  7520.    RTS
  7521.  
  7522.    LOADcONFIGnAME = *
  7523.    .ASC "CONFIG.SYS"
  7524.    BADcONFIG = *
  7525.    .ASC "eRROR ATTEMPTING TO B-LOAD "
  7526.    .BYTE CHRqUOTE
  7527.    .ASC "CONFIG.SYS"
  7528.    .BYTE CHRqUOTE
  7529.    .ASC ", ABORTING."
  7530.    .BYTE CHRcr,0
  7531.  
  7532. LOADcHARSET = *
  7533.    LDA #0
  7534.    LDX 186
  7535.    LDY #0
  7536.    JSR KERNELsETLFS
  7537.    LDA #11
  7538.    LDX #<LOADcHARSETnAME
  7539.    LDY #>LOADcHARSETnAME
  7540.    JSR KERNELsETNAM
  7541.    LDA #0
  7542.    LDX #<$2000
  7543.    LDY #>$2000
  7544.    JSR KERNELlOAD
  7545.    BCS +
  7546.    CLC
  7547.    RTS
  7548. +  LDA #<BADcHARSET
  7549.    LDY #>BADcHARSET
  7550.    JSR PUTS
  7551.    SEC
  7552.    RTS
  7553.  
  7554.    LOADcHARSETnAME = *
  7555.    .ASC "ACE-CHARSET"
  7556.    BADcHARSET = *
  7557.    .ASC "eRROR ATTEMPTING TO B-LOAD "
  7558.    .BYTE CHRqUOTE
  7559.    .ASC "ACE-CHARSET"
  7560.    .BYTE CHRqUOTE
  7561.    .ASC ", ABORTING."
  7562.    .BYTE CHRcr,0
  7563.  
  7564. LOADsHELL = *
  7565.    LDA #0
  7566.    LDX 186
  7567.    LDY #0
  7568.    JSR KERNELsETLFS
  7569.    LDA #2
  7570.    LDX #<LOADsHELLnAME
  7571.    LDY #>LOADsHELLnAME
  7572.    JSR KERNELsETNAM
  7573.    LDA #0
  7574.    LDX #<ACEsHELLaDDRESS
  7575.    LDY #>ACEsHELLaDDRESS
  7576.    JSR KERNELlOAD
  7577.    BCS +
  7578.    CLC
  7579.    RTS
  7580. +  LDA #<BADsHELL
  7581.    LDY #>BADsHELL
  7582.    JSR PUTS
  7583.    SEC
  7584.    RTS
  7585.  
  7586.    LOADsHELLnAME = *
  7587.    .ASC "SH"
  7588.    BADsHELL = *
  7589.    .ASC "eRROR ATTEMPTING TO B-LOAD "
  7590.    .BYTE CHRqUOTE
  7591.    .ASC "SH"
  7592.    .BYTE CHRqUOTE
  7593.    .ASC ", ABORTING."
  7594.    .BYTE CHRcr,0
  7595.  
  7596. SCREENiNIT = *
  7597.    LDA #147
  7598.    JSR $FFD2
  7599.    LDA SYSnAME+0
  7600.    LDY SYSnAME+1
  7601.    JSR PUTS
  7602.    RTS
  7603.  
  7604. DISPLAYdATE = *
  7605.    LDA #<DATEbUF
  7606.    LDY #>DATEbUF
  7607.    JSR GETDATE
  7608.    ;** YEAR
  7609.    LDA DATEbUF+0
  7610.    LDX #11
  7611.    JSR PUTdIGITS
  7612.    LDA DATEbUF+1
  7613.    LDX #13
  7614.    JSR PUTdIGITS
  7615.    ;** MONTH
  7616.    LDA DATEbUF+2
  7617.    CMP #$10
  7618.    BCC +
  7619.    SEC
  7620.    SBC #$10-10
  7621. +  TAX
  7622.    LDA MONTHsTR+0,X
  7623.    STA DATEsTR+7
  7624.    LDA MONTHsTR+13,X
  7625.    STA DATEsTR+8
  7626.    LDA MONTHsTR+26,X
  7627.    STA DATEsTR+9
  7628.    ;** DAY
  7629.    LDA DATEbUF+3
  7630.    LDX #4
  7631.    JSR PUTdIGITS
  7632.    ;** HOUR
  7633.    LDA DATEbUF+4
  7634.    LDX #"A"
  7635.    CMP #$00
  7636.    BNE +
  7637.    LDA #$12
  7638.    JMP PUThOUR
  7639. +  CMP #$12
  7640.    BCC PUThOUR
  7641.    LDX #"P"
  7642.    CMP #$12
  7643.    BEQ PUThOUR
  7644.    SEI
  7645.    SED
  7646.    SEC
  7647.    SBC #$12
  7648.    CLD
  7649.    CLI
  7650.    PUThOUR = *
  7651.    STX DATEsTR+26
  7652.    LDX #17
  7653.    JSR PUTdIGITS
  7654.    ;** MINUTE
  7655.    LDA DATEbUF+5
  7656.    LDX #20
  7657.    JSR PUTdIGITS
  7658.    ;** SECOND
  7659.    LDA DATEbUF+6
  7660.    LDX #23
  7661.    JSR PUTdIGITS
  7662.    ;** DAY OF WEEK
  7663.    LDA DATEbUF+7
  7664.    AND #$07
  7665.    TAX
  7666.    LDA DOWsTR+0,X
  7667.    STA DATEsTR+0
  7668.    LDA DOWsTR+8,X
  7669.    STA DATEsTR+1
  7670.    LDA DOWsTR+16,X
  7671.    STA DATEsTR+2
  7672.    LDA #<DATEsTR
  7673.    LDY #>DATEsTR
  7674.    JSR PUTS
  7675.    RTS
  7676.  
  7677.    PUTdIGITS = *  ;( .a=NUM, .x=OFFSET )
  7678.    PHA
  7679.    LSR
  7680.    LSR
  7681.    LSR
  7682.    LSR
  7683.    ORA #$30
  7684.    STA DATEsTR,X
  7685.    PLA
  7686.    AND #$0F
  7687.    ORA #$30
  7688.    STA DATEsTR+1,X
  7689.    RTS
  7690.  
  7691.    DATEsTR = *
  7692.         ;0123456789012345678901234567
  7693.    .ASC "tUE-05-mAY-1993  11:34:12 PM"
  7694.    .BYTE 13,13,0
  7695.    DATEbUF .BUF 10
  7696.    DOWsTR = *
  7697.    .ASC "*smtwtfs"
  7698.    .ASC "*UOUEHRA"
  7699.    .ASC "*NNEDUIT"
  7700.    MONTHsTR = *
  7701.    .ASC "*jfmamjjasond"
  7702.    .ASC "*AEAPAUUUECOE"
  7703.    .ASC "*NBRRYNLGPTVC"
  7704.  
  7705. TRYdATE = 10
  7706.  
  7707. SETdATE = *
  7708.    LDY #$82
  7709. -  STY TRYdATE
  7710.    LDA (CONFIGbUF),Y
  7711.    CMP #$FF
  7712.    BEQ +
  7713.    JSR CMDoPEN
  7714.    BCS +
  7715.    LDA #<QUERYdATEsTR
  7716.    LDY #>QUERYdATEsTR
  7717.    JSR CMDsEND
  7718.    BCS QUERYeRROR
  7719.    LDA #<DATEbUF
  7720.    LDY #>DATEbUF
  7721.    LDX #9
  7722.    JSR CMDdATA
  7723.    BCS QUERYeRROR
  7724.    JSR CMDcLOSE
  7725.    JMP CONVERTcMDdATE
  7726.  
  7727.    QUERYeRROR = *
  7728.    JSR CMDcLOSE
  7729. +  INC TRYdATE
  7730.    LDY TRYdATE
  7731.    CPY #$86
  7732.    BCC -
  7733.  
  7734.    SETdEFAULTdATE = *
  7735.    LDA CONFIGbUF
  7736.    LDY CONFIGbUF+1
  7737.    CLC
  7738.    ADC #$86
  7739.    BCC +
  7740.    INY
  7741. +  JMP SETDATE
  7742.  
  7743.    QUERYdATEsTR = *
  7744.    .ASC "T-RB"
  7745.    .BYTE 13,0
  7746.  
  7747. CONVERTcMDdATE = *
  7748.    LDA DATEbUF+4
  7749.    LDX DATEbUF+7
  7750.    BEQ +
  7751.    SEI
  7752.    SED
  7753.    CLC
  7754.    ADC #$12
  7755.    CLD
  7756.    CLI
  7757. +  CMP #$12
  7758.    BNE +
  7759.    LDA #$00
  7760. +  CMP #$24
  7761.    BNE +
  7762.    LDA #$12
  7763. +  STA DATEbUF+4
  7764.    CLC
  7765.    LDA DATEbUF+0
  7766.    ADC #$51
  7767.    STA DATEbUF+7
  7768.    LDX #$19
  7769.    LDA DATEbUF+1
  7770.    CMP #$70
  7771.    BCS +
  7772.    LDX #$20
  7773. +  STX DATEbUF+0
  7774.    LDA #<DATEbUF
  7775.    LDY #>DATEbUF
  7776.    JSR SETDATE
  7777.    RTS
  7778.  
  7779. CMDoPEN = *  ;( .a=DEVICE ) : .cs=ERR
  7780.    TAX
  7781.    LDA #6
  7782.    LDY #15
  7783.    JSR KERNELsETLFS
  7784.    LDA #0
  7785.    JSR KERNELsETNAM
  7786.    JSR KERNELoPEN
  7787.    RTS
  7788.  
  7789. CMDcLOSE = *  ;()
  7790.    CLC
  7791.    LDA #6
  7792.    JSR KERNELcLOSE
  7793.    RTS
  7794.  
  7795. CMDsEND = *  ;( (.ay)=CMDsTRz ) : .cs=ERR
  7796.    STA $40
  7797.    STY $41
  7798.    LDX #6
  7799.    JSR KERNELcHKOUT
  7800.    BCC +
  7801.    RTS
  7802. +  LDY #0
  7803. -  LDA ($40),Y
  7804.    BEQ +
  7805.    JSR $FFD2
  7806.    INY
  7807.    BNE -
  7808. +  JSR KERNELcLRCHN
  7809.    CLC
  7810.    RTS
  7811.  
  7812. CMDdATA = *  ;( (.ay)=CMDbUF, .x=LEN ) : .cs=ERR
  7813.    STA $40
  7814.    STY $41
  7815.    STX $42
  7816.    LDX #6
  7817.    JSR KERNELcHKIN
  7818.    BCC +
  7819.    RTS
  7820. +  LDX #0
  7821.    JSR KERNELcHRIN
  7822.    CMP #"0"
  7823.    BCC ++
  7824.    CMP #"9"+1
  7825.    BCS ++
  7826.    BADdATA = *
  7827. -  JSR KERNELcHRIN
  7828.    BCS +
  7829.    BIT ST
  7830.    BVS +
  7831.    CMP #13
  7832.    BNE -
  7833. +  JSR KERNELcLRCHN
  7834.    SEC
  7835.    RTS
  7836. +  LDY #0
  7837.    STA ($40),Y
  7838.    INY
  7839. -  JSR KERNELcHRIN
  7840.    STA ($40),Y
  7841.    INY
  7842.    CPY $42
  7843.    BCC -
  7844.    CMP #13
  7845.    BNE BADdATA
  7846.    JSR KERNELcLRCHN
  7847.    CLC
  7848.    RTS
  7849.  
  7850. GETrAMLINKpARMS = *
  7851.    LDY #$80
  7852.    LDA (CONFIGbUF),Y
  7853.    JSR CMDoPEN
  7854.    BCS RLpARMSeRROR
  7855.  
  7856.    ;** RAMLINK RAM ACCESS
  7857.    LDA #<PARTrLcMD
  7858.    LDY #>PARTrLcMD
  7859.    JSR CMDsEND
  7860.    BCS RLpARMSeRROR
  7861.    LDA #<RLiDENT
  7862.    LDY #>RLiDENT
  7863.    JSR CHECKpARTITION
  7864.    BCS +
  7865.    STA ACErAMLINKsTART
  7866.    STY ACErAMLINKsTART+1
  7867.    STX ACErAMLINKbANKS
  7868.  
  7869.    ;** INDIRECT REU ACCESS
  7870. +  LDA #<PARTrLREUcMD
  7871.    LDY #>PARTrLREUcMD
  7872.    JSR CMDsEND
  7873.    BCS RLpARMSeRROR
  7874.    LDA #<RLREUiDENT
  7875.    LDY #>RLREUiDENT
  7876.    JSR CHECKpARTITION
  7877.    BCS RLpARMSeRROR
  7878.    STA ACErAMLINKrEUsTART
  7879.    STY ACErAMLINKrEUsTART+1
  7880.    STX ACErAMLINKrEUbANKS
  7881.  
  7882.    RLpARMSeRROR = *
  7883.    JSR CMDcLOSE
  7884.    RTS
  7885.  
  7886. CHECKpARTITION = *  ;( (.ay)=NAME ) : .cs=ERR, .ay=START, .x=BANKS
  7887.    STA $44
  7888.    STY $45
  7889.    LDA #<PARTITIONbUF
  7890.    LDY #>PARTITIONbUF
  7891.    LDX #31
  7892.    JSR CMDdATA
  7893.    BCS CHECKeRReXIT
  7894.    LDA PARTITIONbUF+0
  7895.    CMP #7
  7896.    BNE CHECKeRReXIT
  7897.    LDY #0
  7898. -  LDA ($44),Y
  7899.    BEQ +
  7900.    CMP PARTITIONbUF+3,Y
  7901.    BNE CHECKeRReXIT
  7902.    INY
  7903.    BNE -
  7904. +  LDA PARTITIONbUF+21
  7905.    LDY PARTITIONbUF+20
  7906.    LDX PARTITIONbUF+28
  7907.    CLC
  7908.    RTS
  7909.  
  7910.    CHECKeRReXIT = *
  7911.    SEC
  7912.    RTS
  7913.  
  7914. PARTrLcMD = *
  7915.    .ASC "G-P"
  7916.    .BYTE 31,0
  7917. RLiDENT = *
  7918.    .ASC "RL-RAM"
  7919.    .BYTE $A0,0
  7920. PARTrLREUcMD = *
  7921.    .ASC "G-P"
  7922.    .BYTE 30,0
  7923. RLREUiDENT = *
  7924.    .ASC "INDIRECT-REU"
  7925.    .BYTE $A0,0
  7926. PARTITIONbUF .BUF 35
  7927.  
  7928. PUTNUM = *  ;( [$44]=NUM, .a=WIDTH )
  7929.    PHA
  7930.    LDA #<OUTCHAR
  7931.    LDY #>OUTCHAR
  7932.    STA $80
  7933.    STY $81
  7934.    LDX #$44
  7935.    PLA
  7936.    JSR UTOA
  7937.    JSR PUTCOMMA
  7938.    LDX #0
  7939. -  LDA OUTCHAR,X
  7940.    BEQ +
  7941.    JSR CHROUT
  7942.    INX
  7943.    BNE -
  7944. +  RTS
  7945.    OUTCHAR .BUF 11
  7946.  
  7947. PUTCOMMA = *  ;( OUTCHAR )
  7948.    LDX #$FF
  7949. -  INX
  7950.    LDA OUTCHAR,X
  7951.    BNE -
  7952. -  DEX
  7953.    DEX
  7954.    DEX
  7955.    DEX
  7956.    CPX #$80
  7957.    BCC +
  7958.    RTS
  7959. +  CPX #0
  7960.    BCS +
  7961.    RTS
  7962. +  LDA OUTCHAR,X
  7963.    CMP #" "
  7964.    BNE +
  7965.    RTS
  7966. +  STX $44
  7967.    LDY #0
  7968. -  LDA OUTCHAR+1,Y
  7969.    STA OUTCHAR,Y
  7970.    INY
  7971.    CPY $44
  7972.    BCC -
  7973.    LDA #","
  7974.    STA OUTCHAR,Y
  7975.    JMP --
  7976.    RTS
  7977.  
  7978. DISPLAYaVAIL = *  ;( (.ay)=NAME, (.x,$45)=BANKS )
  7979.    STA $40
  7980.    STY $41
  7981.    STX $44
  7982.    LDY #0
  7983. -  LDA ($40),Y
  7984.    JSR CHROUT
  7985.    INY
  7986.    CPY #6
  7987.    BCC -
  7988.    LDA #":"
  7989.    JSR CHROUT
  7990.    TXA
  7991.    CLC
  7992.    ADC TOTALbANKS
  7993.    STA TOTALbANKS
  7994.    LDA $45
  7995.    ADC TOTALbANKS+1
  7996.    STA TOTALbANKS+1
  7997.    LDA #0
  7998.    STA $46
  7999.    STA $47
  8000.    LDX #6
  8001. -  ASL $44
  8002.    ROL $45
  8003.    ROL $46
  8004.    ROL $47
  8005.    DEX
  8006.    BNE -
  8007.    LDA #6
  8008.    JSR PUTNUM
  8009.    LDA #"k"
  8010.    JSR CHROUT
  8011.    RTS
  8012.  
  8013. ADDtOfREE = *  ;( [$44]=BYTES )
  8014.    CLC
  8015.    LDA $44
  8016.    ADC ACEfREEmEMORY+0
  8017.    STA ACEfREEmEMORY+0
  8018.    LDA $45
  8019.    ADC ACEfREEmEMORY+1
  8020.    STA ACEfREEmEMORY+1
  8021.    LDA $46
  8022.    ADC ACEfREEmEMORY+2
  8023.    STA ACEfREEmEMORY+2
  8024.    BCC +
  8025.    INC ACEfREEmEMORY+3
  8026. +  RTS
  8027.  
  8028. DISPLAYfREE = *  ;( [$44]=BYTES )
  8029.    LDA #<FREEmSG
  8030.    LDY #>FREEmSG
  8031.    JSR PUTS
  8032.    LDA #10
  8033.    JSR PUTNUM
  8034.    LDA #13
  8035.    JSR CHROUT
  8036.    RTS
  8037.    FREEmSG = *
  8038.    .ASC "   FREE:"
  8039.    .BYTE 0
  8040.  
  8041. RESETfREE = *
  8042.    LDA #0
  8043.    LDX #3
  8044. -  STA $44,X
  8045.    DEX
  8046.    BPL -
  8047.    RTS
  8048.  
  8049. INTERNALmEMORY = *
  8050.    LDA #ACEmEMiNTERNAL
  8051.    LDX #255
  8052.    SEI
  8053.    JSR TESTmEMORYtYPE
  8054.    CLI
  8055.    STA ACEiNTERNALbANKS
  8056.    PHA
  8057.    JSR INSTALLiNTERNvECTORS
  8058.    PLA
  8059.    TAX
  8060.    LDA #0
  8061.    STA $45
  8062.    LDA #<INTERNALnAME
  8063.    LDY #>INTERNALnAME
  8064.    JSR DISPLAYaVAIL
  8065.    JSR RESETfREE
  8066.  
  8067.    ;** RAM0
  8068.    LDA #ACEmEMiNTERNAL
  8069.    STA ZP+3
  8070.    LDA #0
  8071.    STA ACEiNTERNALcUR
  8072.    LDA RAM0fREEmAP+0
  8073.    LDY RAM0fREEmAP+1
  8074.    STA ACErAM0fREEMAP+0
  8075.    STY ACErAM0fREEMAP+1
  8076.    LDX #0
  8077.    STA ZP+0
  8078.    STY ZP+1
  8079.    STX ZP+2
  8080.    LDY #$A3
  8081.    BIT SYStYPE
  8082.    BMI +
  8083.    LDY #$C1
  8084. +  LDA (CONFIGbUF),Y
  8085.    TAY
  8086.    LDA #1
  8087.    LDX #>ACEaPPaDDRESS
  8088.    JSR INITbANKS
  8089.    JSR FREErAM0aFTERkERNEL
  8090.  
  8091.    ;** RAM1
  8092.    BIT SYStYPE
  8093.    BPL EXPiNTERNAL64
  8094.    LDA #$00
  8095.    STA ZP+0
  8096.    LDY #$A0
  8097.    LDA (CONFIGbUF),Y
  8098.    STA ZP+1
  8099.    STA ACErAM1fREEMAP
  8100.    LDA #1
  8101.    STA ZP+2
  8102.    LDY #$A1
  8103.    LDA (CONFIGbUF),Y
  8104.    TAY
  8105.    LDA #2
  8106.    LDX ZP+1
  8107.    INX
  8108.    JSR INITbANKS
  8109.  
  8110.    ;** RAM2-7 C128
  8111.    EXPiNTERNAL128 = *
  8112.    LDA #2
  8113.    STA ZP+2
  8114.    LDA #$00
  8115.    LDY #$04
  8116.    STA ZP+0
  8117.    STY ZP+1
  8118.    LDY #$A5
  8119.    LDA (CONFIGbUF),Y
  8120.    LDX ACEiNTERNALbANKS
  8121.    JSR MIN
  8122.    STA ACEiNTERNALbANKS
  8123.    LDX #$05
  8124.    LDY #$FF
  8125.    JSR INITbANKS
  8126.    JSR ADDtOfREE
  8127.    JSR DISPLAYfREE
  8128.    RTS
  8129.  
  8130.    ;** RAM1-3 C64
  8131.    EXPiNTERNAL64 = *
  8132.    LDA #1
  8133.    STA ACEiNTERNALbANKS
  8134.    JSR ADDtOfREE
  8135.    JSR DISPLAYfREE
  8136.    RTS
  8137.  
  8138.    INTERNALnAME = *
  8139.    .ASC "INTERN"
  8140.  
  8141. RESERVEtpa = *
  8142.    LDY #$A8
  8143.    BIT SYStYPE
  8144.    BMI +
  8145.    LDY #$C6
  8146. +  LDA (CONFIGbUF),Y
  8147.    STA $40
  8148.    LDY #>ACEaPPaDDRESS
  8149.    LDA #$FE
  8150.    CPY $40
  8151.    BCS +
  8152. -  STA (RAM0fREEmAP),Y
  8153.    INY
  8154.    CPY $40
  8155.    BCC -
  8156. +  SEC
  8157.    LDA $40
  8158.    SBC #>ACEaPPaDDRESS
  8159.    STA $40
  8160.    SEC
  8161.    LDA ACEfREEmEMORY+1
  8162.    SBC $40
  8163.    STA ACEfREEmEMORY+1
  8164.    LDA ACEfREEmEMORY+2
  8165.    SBC #0
  8166.    STA ACEfREEmEMORY+2
  8167.    LDA ACEfREEmEMORY+3
  8168.    SBC #0
  8169.    STA ACEfREEmEMORY+3
  8170.    RTS
  8171.  
  8172. FREErAM0aFTERkERNEL = *
  8173.    ;** FREE END.KERNEL->ST.SHELL
  8174.    LDY ACEeNDpAGE
  8175.    CPY #>ACEaPPaDDRESS
  8176.    BCS +
  8177.    LDA #$00
  8178. -  STA (RAM0fREEmAP),Y
  8179.    INY
  8180.    CPY #>ACEaPPaDDRESS
  8181.    BCC -
  8182. +  SEC
  8183.    LDA #>ACEaPPaDDRESS
  8184.    SBC ACEeNDpAGE
  8185.    STA $40
  8186.    CLC
  8187.    LDA $45
  8188.    ADC $40
  8189.    STA $45
  8190.    BCC +
  8191.    INC $46
  8192.    BNE +
  8193.    INC $47
  8194. +  RTS
  8195.  
  8196. INSTALLiNTERNvECTORS = *
  8197.    BIT SYStYPE
  8198.    BPL INSTALLvECTORS64
  8199.    LDA ACEiNTERNALbANKS
  8200.    CMP #2
  8201.    BCS +
  8202.    RTS
  8203. +  SEI
  8204.    LDA #2
  8205.    LDY #ACEmEMiNTERNAL
  8206.    STA ZP+2
  8207.    STY ZP+3
  8208. -  LDA #$05
  8209.    LDY #$FF
  8210.    STA ZP+0
  8211.    STY ZP+1
  8212.    STA ZW+0
  8213.    STY ZW+1
  8214.    LDA #<251
  8215.    LDY #>251
  8216.    JSR STASH
  8217.    INC ZP+2
  8218.    LDA ZP+2
  8219.    CMP ACEiNTERNALbANKS
  8220.    BCC -
  8221.    CLI
  8222.    RTS
  8223.  
  8224. INSTALLvECTORS64 = *
  8225.    LDX #$3F
  8226. -  LDA VECTORcODE64,X
  8227.    STA $FFC0,X
  8228.    DEX
  8229.    BPL -
  8230.    ;XX COPY TO EXP BANKS
  8231.    RTS
  8232.  
  8233.    VECTORcODE64 = *
  8234.    .BYTE $00
  8235.    ;XX VECTOR DISPATCH CODE HERE
  8236.  
  8237. REUmEMORY = *
  8238.    LDA #ACEmEMreu
  8239.    LDX #255
  8240.    JSR TESTmEMORYtYPE
  8241.    STA ACErEUbANKS
  8242.    TAX
  8243.    BNE +
  8244.    LDA ACErAMLINKrEUbANKS
  8245.    BEQ +
  8246.    RTS
  8247. +  LDA #0
  8248.    STA $45
  8249.    LDA #<REUnAME
  8250.    LDY #>REUnAME
  8251.    JSR DISPLAYaVAIL
  8252.    JSR RESETfREE
  8253.    LDA #ACEmEMreu
  8254.    STA ZP+3
  8255.    LDY #$A6
  8256.    BIT SYStYPE
  8257.    BMI +
  8258.    LDY #$C2
  8259. +  LDA (CONFIGbUF),Y
  8260.    STA ACErEUsTART
  8261.    STA ACErEUcUR
  8262.    LDY #$A7
  8263.    BIT SYStYPE
  8264.    BMI +
  8265.    LDY #$C3
  8266. +  LDA (CONFIGbUF),Y
  8267.    LDX ACErEUbANKS
  8268.    JSR MIN
  8269.    STA ACErEUbANKS
  8270.    LDA #$00
  8271.    LDY #$FF
  8272.    LDX ACErEUsTART
  8273.    STA ZP+0
  8274.    STY ZP+1
  8275.    STX ZP+2
  8276.    LDA ACErEUbANKS
  8277.    LDX #$00
  8278.    LDY #$FF
  8279.    JSR INITbANKS
  8280.    JSR ADDtOfREE
  8281.    JSR DISPLAYfREE
  8282.    RTS
  8283.    REUnAME = *
  8284.    .ASC "REU   "
  8285.  
  8286. RLREUmEMORY = *
  8287.    LDA ACErEUbANKS
  8288.    BEQ +
  8289.    LDA #0
  8290.    STA ACErAMLINKrEUbANKS
  8291. -  RTS
  8292. +  LDX ACErAMLINKrEUbANKS
  8293.    BEQ -
  8294.    LDA #0
  8295.    STA $45
  8296.    LDA #<RLREUnAME
  8297.    LDY #>RLREUnAME
  8298.    JSR DISPLAYaVAIL
  8299.    JSR RESETfREE
  8300.    LDA #ACEmEMrlreu
  8301.    STA ZP+3
  8302.    LDY #$A6
  8303.    BIT SYStYPE
  8304.    BMI +
  8305.    LDY #$C2
  8306. +  LDA (CONFIGbUF),Y
  8307.    STA ACErEUsTART  ;**SIC
  8308.    STA ACErAMLINKrEUcUR
  8309.    LDY #$A7
  8310.    BIT SYStYPE
  8311.    BMI +
  8312.    LDY #$C3
  8313. +  LDA (CONFIGbUF),Y
  8314.    LDX ACErAMLINKrEUbANKS
  8315.    JSR MIN
  8316.    STA ACErAMLINKrEUbANKS
  8317.    LDA #$00
  8318.    LDY #$FF
  8319.    LDX ACErAMLINKrEUsTART
  8320.    STA ZP+0
  8321.    STY ZP+1
  8322.    STX ZP+2
  8323.    LDA ACErAMLINKrEUbANKS
  8324.    LDX #$00
  8325.    LDY #$FF
  8326.    JSR INITbANKS
  8327.    JSR ADDtOfREE
  8328.    JSR DISPLAYfREE
  8329.    RTS
  8330.    RLREUnAME = *
  8331.    .ASC "RL-REU"
  8332.  
  8333. RLmEMORY = *
  8334.    LDX ACErAMLINKbANKS
  8335.    LDA #0
  8336.    STA $45
  8337.    LDA #<RLnAME
  8338.    LDY #>RLnAME
  8339.    JSR DISPLAYaVAIL
  8340.    JSR RESETfREE
  8341.    LDY #$81
  8342.    LDA (CONFIGbUF),Y
  8343.    LDX ACErAMLINKbANKS
  8344.    JSR MIN
  8345.    STA ACErAMLINKbANKS
  8346.    LDA #ACEmEMrl
  8347.    STA ZP+3
  8348.    LDA #$00
  8349.    LDY #$FF
  8350.    LDX #0
  8351.    STX ACErAMLINKcUR
  8352.    STA ZP+0
  8353.    STY ZP+1
  8354.    STX ZP+2
  8355.    LDA ACErAMLINKbANKS
  8356.    LDX #$00
  8357.    LDY #$FF
  8358.    JSR INITbANKS
  8359.    JSR ADDtOfREE
  8360.    JSR DISPLAYfREE
  8361.    RTS
  8362.    RLnAME = *
  8363.    .ASC "RL-RAM"
  8364.  
  8365. TOTALmEMORY = *
  8366.    LDX TOTALbANKS
  8367.    LDA TOTALbANKS+1
  8368.    STA $45
  8369.    LDA #<TOTALnAME
  8370.    LDY #>TOTALnAME
  8371.    JSR DISPLAYaVAIL
  8372.    LDX #3
  8373. -  LDA ACEfREEmEMORY,X
  8374.    STA $44,X
  8375.    DEX
  8376.    BPL -
  8377.    JSR DISPLAYfREE
  8378.    LDA #13
  8379.    JSR CHROUT
  8380.    JSR RESERVEtpa
  8381.    RTS
  8382.    TOTALnAME = *
  8383.    .ASC "TOTAL "
  8384.    RTS
  8385.  
  8386. ENDbANK   = 10  ;(1)
  8387. STARTfREE = 11  ;(1)
  8388. ENDfREE   = 12  ;(1)
  8389.  
  8390. INITbANKS = *  ;( [ZP]=FIRSTfREEMAP, .a=ENDbANK+1, .x=STARTfREE, .y=ENDfREE+1 )
  8391.    STA ENDbANK
  8392.    STX STARTfREE
  8393.    STY ENDfREE
  8394.    LDA #<FREEMAP
  8395.    LDY #>FREEMAP
  8396.    STA ZW
  8397.    STY ZW+1
  8398.    LDX #0
  8399.    LDA #$FF
  8400. -  STA FREEMAP,X
  8401.    INX
  8402.    BNE -
  8403.    LDX STARTfREE
  8404.    CPX ENDfREE
  8405.    BCS FREEnEXTbANK
  8406.    LDA #$00
  8407. -  STA FREEMAP,X
  8408.    INX
  8409.    CPX ENDfREE
  8410.    BCC -
  8411.  
  8412.    FREEnEXTbANK = *
  8413.    LDA ZP+2
  8414.    CMP ENDbANK
  8415.    BCS +
  8416.    LDA #<256
  8417.    LDY #>256
  8418.    JSR STASH
  8419.    INC ZP+2
  8420.    SEC
  8421.    LDA ENDfREE
  8422.    SBC STARTfREE
  8423.    CLC
  8424.    ADC $45
  8425.    STA $45
  8426.    BCC FREEnEXTbANK
  8427.    INC $46
  8428.    BNE FREEnEXTbANK
  8429.    INC $47
  8430.    JMP FREEnEXTbANK
  8431. +  RTS
  8432.  
  8433. MIN = *  ;( .a=NUM1, .x=NUM2 ) : .a=MIN
  8434.    STX $40
  8435.    CMP $40
  8436.    BCC +
  8437.    LDA $40
  8438. +  RTS
  8439.  
  8440. CHROUTsAVE .BUF 1
  8441.  
  8442. CHROUT = *
  8443.    JSR $FFD2
  8444.    STY CHROUTsAVE
  8445.    LDY #0
  8446.    STA (TITLEpTR),Y
  8447.    INC TITLEpTR+0
  8448.    BNE +
  8449.    INC TITLEpTR+1
  8450. +  LDY CHROUTsAVE
  8451.    CLC
  8452.    RTS
  8453.  
  8454. FREEMAP = *
  8455. TITLE = FREEMAP+256
  8456. CP.S
  8457. 458
  8458. ;*** CP PROGRAM ***
  8459.  
  8460. .SEQ ACEHEAD.S
  8461. .ORG ACEaPPaDDRESS
  8462. .OBJ "@0:CP"
  8463.  
  8464. JMP COPYMAIN
  8465. .ASC "Cb"
  8466.  
  8467. ;*** GLOBAL DECLARATIONS
  8468.  
  8469. LIBWORK = $60
  8470. CHRcr = $0D
  8471. CHRqUOTE = $22
  8472. OVERWRITEaLLfLAG .BUF 1
  8473. ABORTfLAG .BUF 1
  8474.  
  8475. ;******** STANDARD LIBRARY ********
  8476. EPUTS = *
  8477.    LDX #STDERR
  8478.    JMP FPUTS
  8479. PUTS = *
  8480.    LDX #STDOUT
  8481. FPUTS = *
  8482.    STA ZP
  8483.    STY ZP+1
  8484.    LDY #$FF
  8485. -  INY
  8486.    LDA (ZP),Y
  8487.    BNE -
  8488.    TYA
  8489.    LDY #0
  8490.    JMP WRITE
  8491.  
  8492. PUTCHAR = *
  8493.    LDX #STDOUT
  8494. PUTC = *
  8495.    STA PUTCbUFFER
  8496.    LDA #<PUTCbUFFER
  8497.    LDY #>PUTCbUFFER
  8498.    STA ZP
  8499.    STY ZP+1
  8500.    LDA #1
  8501.    LDY #0
  8502.    JMP WRITE
  8503.    PUTCbUFFER .BUF 1
  8504.  
  8505. GETCHAR = *
  8506.    LDX #STDIN
  8507. GETC = *
  8508.    LDA #<GETCbUFFER
  8509.    LDY #>GETCbUFFER
  8510.    STA ZP
  8511.    STY ZP+1
  8512.    LDA #1
  8513.    LDY #0
  8514.    JSR READ
  8515.    BEQ +
  8516.    LDA GETCbUFFER
  8517.    RTS
  8518. +  SEC
  8519.    RTS
  8520.    GETCbUFFER .BUF 1
  8521.  
  8522. ;===COPY LIBRARY===
  8523. COPYbUFFERpTR = 2
  8524. COPYbUFFERlENGTH = 4
  8525.  
  8526. GETbUFFERpARMS = *
  8527.    LDA #<CPeND
  8528.    LDY #>CPeND
  8529.    STA COPYbUFFERpTR
  8530.    STY COPYbUFFERpTR+1
  8531.    SEC
  8532.    LDA ACEsTACKpTR
  8533.    SBC COPYbUFFERpTR
  8534.    STA COPYbUFFERlENGTH
  8535.    LDA ACEsTACKpTR+1
  8536.    SBC COPYbUFFERpTR+1
  8537.    STA COPYbUFFERlENGTH+1
  8538.    RTS
  8539.  
  8540. GETARG = *
  8541.    STY ZP+1
  8542.    ASL
  8543.    STA ZP
  8544.    ROL ZP+1
  8545.    CLC
  8546.    LDA ACEaRGV
  8547.    ADC ZP
  8548.    STA ZP
  8549.    LDA ACEaRGV+1
  8550.    ADC ZP+1
  8551.    STA ZP+1
  8552.    LDY #0
  8553.    LDA (ZP),Y
  8554.    TAX
  8555.    INY
  8556.    LDA (ZP),Y
  8557.    STX ZP
  8558.    STA ZP+1
  8559.    RTS
  8560.  
  8561. GETlASTaRG = *
  8562.    LDA ACEaRGC
  8563.    LDY ACEaRGC+1
  8564.    SEC
  8565.    SBC #1
  8566.    BCS +
  8567.    DEY
  8568. +  JMP GETARG
  8569.  
  8570. ;===COPY===
  8571. COPYiNfILE = 6
  8572. COPYoUTfILE = 7
  8573. COPYiNnAME = 8
  8574. COPYoUTnAME = 10
  8575.  
  8576. COPYMAIN = *
  8577.    LDA #0
  8578.    STA OVERWRITEaLLfLAG
  8579.    STA ABORTfLAG
  8580.    JSR GETbUFFERpARMS
  8581.    ;** CHECK FOR AT LEAST THREE ARGUMENTS
  8582.    LDA ACEaRGC+1
  8583.    BNE +
  8584.    LDA ACEaRGC
  8585.    CMP #3
  8586.    BCC COPYuSAGEeRROR
  8587.    ;** CHECK IF DESTINATION IS A DIRECTORY
  8588. +  JSR GETlASTaRG
  8589.    JSR ISDIR
  8590.    CPY #0
  8591.    BEQ +
  8592.    JMP COPYtOdIR
  8593.    ;** CHECK FOR EXACTLY THREE PARAMETERS
  8594. +  LDA ACEaRGC+1
  8595.    BNE COPYuSAGEeRROR
  8596.    LDA ACEaRGC
  8597.    CMP #3
  8598.    BNE COPYuSAGEeRROR
  8599.    ;** GET BUFFER PARAMETERS
  8600.    LDA #1
  8601.    LDY #0
  8602.    JSR GETARG
  8603.    LDA ZP
  8604.    LDY ZP+1
  8605.    STA COPYiNnAME
  8606.    STY COPYiNnAME+1
  8607.    LDA #2
  8608.    LDY #0
  8609.    JSR GETARG
  8610.    LDA ZP
  8611.    LDY ZP+1
  8612.    STA COPYoUTnAME
  8613.    STY COPYoUTnAME+1
  8614.    JSR COPYFILE
  8615.    RTS
  8616.  
  8617. COPYuSAGEeRROR = *
  8618.    LDA #<COPYuSAGEeRRORmSG
  8619.    LDY #>COPYuSAGEeRRORmSG
  8620.    LDX #STDERR
  8621.    JSR FPUTS
  8622.    RTS
  8623.    COPYuSAGEeRRORmSG = *
  8624.    .ASC "USAGE: CP FROMFILE TOFILE"
  8625.    .BYTE CHRcr
  8626.    .ASC "       CP FROMFILE1 FROM2 ...FROMn TODIR"
  8627.    .BYTE CHRcr,0
  8628.  
  8629. COPYFILE = *
  8630.    ;** OPEN FILES
  8631.    LDA COPYiNnAME
  8632.    LDY COPYiNnAME+1
  8633.    STA ZP
  8634.    STY ZP+1
  8635.    LDA #"R"
  8636.    JSR OPEN
  8637.    BCC +
  8638.    LDA COPYiNnAME
  8639.    LDY COPYiNnAME+1
  8640.    JMP COPYoPENeRROR
  8641. +  STA COPYiNfILE
  8642. COPYFILEoUTPUT = *
  8643.    LDA COPYoUTnAME
  8644.    LDY COPYoUTnAME+1
  8645.    STA ZP
  8646.    STY ZP+1
  8647.    LDA #"W"
  8648.    JSR OPEN
  8649.    BCC COPYwRITEoK
  8650.    LDA ERRNO
  8651.    CMP #ACEeRRfILEeXISTS
  8652.    BEQ +
  8653. -  LDA COPYiNfILE
  8654.    JSR CLOSE
  8655.    LDA COPYoUTnAME
  8656.    LDY COPYoUTnAME+1
  8657.    JMP COPYoPENeRROR
  8658. +  JSR COPYaSKoVERWRITE
  8659.    BEQ +
  8660.    LDA COPYiNfILE
  8661.    JSR CLOSE
  8662.    SEC
  8663.    RTS
  8664. +  JSR COPYrEMOVEoUTFILE
  8665.    JMP COPYFILEoUTPUT
  8666.  
  8667.    COPYwRITEoK = *
  8668.    STA COPYoUTfILE
  8669.    JSR COPYfILEcONTENTS
  8670.    LDA COPYoUTfILE
  8671.    JSR CLOSE
  8672.    LDA COPYiNfILE
  8673.    JSR CLOSE
  8674.    RTS
  8675.  
  8676. COPYaSKoVERWRITE = *  ;() : .cs=QUIT, .eq=YES, .ne=NO
  8677.    LDA OVERWRITEaLLfLAG
  8678.    BEQ +
  8679.    LDA #0
  8680.    RTS
  8681. /  LDA #<COPYaSKoVERWRITEmSG
  8682.    LDY #>COPYaSKoVERWRITEmSG
  8683.    JSR PUTS
  8684.    LDA COPYoUTnAME
  8685.    LDY COPYoUTnAME+1
  8686.    JSR PUTS
  8687.    LDA #<COPYaSKoVERWRITEmSG2
  8688.    LDY #>COPYaSKoVERWRITEmSG2
  8689.    JSR PUTS
  8690.    JSR GETCHAR
  8691.    CMP #CHRcr
  8692.    BEQ -
  8693.    PHA
  8694. -  JSR GETCHAR
  8695.    CMP #CHRcr
  8696.    BNE -
  8697.    PLA
  8698.    CMP #"Q"
  8699.    BNE +
  8700. -  LDA #$FF
  8701.    STA ABORTfLAG
  8702.    SEC
  8703.    RTS
  8704. +  CMP #"q"
  8705.    BEQ -
  8706.    CMP #"A"
  8707.    BNE +
  8708. -  LDA #$FF
  8709.    STA OVERWRITEaLLfLAG
  8710.    LDA #"Y"
  8711. +  CMP #"a"
  8712.    BEQ -
  8713.    CMP #"Y"
  8714.    BEQ +
  8715.    CMP #"y"
  8716. +  CLC
  8717.    RTS
  8718.    COPYaSKoVERWRITEmSG = *
  8719.    .ASC "oVERWRITE "
  8720.    .BYTE CHRqUOTE,0
  8721.    COPYaSKoVERWRITEmSG2 = *
  8722.    .BYTE CHRqUOTE
  8723.    .ASC " (Y/N/A/Q)? "
  8724.    .BYTE 0
  8725.  
  8726. COPYrEMOVEoUTFILE = *
  8727.    LDA COPYoUTnAME
  8728.    LDY COPYoUTnAME+1
  8729.    STA ZP
  8730.    STY ZP+1
  8731.    JSR REMOVE
  8732.    RTS
  8733.  
  8734. COPYfILEcONTENTS = *
  8735.    ;** COPY FILE CONTENTS
  8736.    LDA COPYbUFFERpTR
  8737.    LDY COPYbUFFERpTR+1
  8738.    STA ZP
  8739.    STY ZP+1
  8740. -  LDA COPYbUFFERlENGTH
  8741.    LDY COPYbUFFERlENGTH+1
  8742.    LDX COPYiNfILE
  8743.    JSR READ
  8744.    BCS COPYfILEeRROR
  8745.    BEQ +
  8746.    LDX COPYoUTfILE
  8747.    JSR WRITE
  8748.    BCC -
  8749.    BCS COPYfILEeRROR
  8750. +  RTS
  8751.  
  8752.    COPYoPENnAME = 14
  8753.    COPYoPENeRROR = *
  8754.    STA COPYoPENnAME
  8755.    STY COPYoPENnAME+1
  8756.    LDA #<COPYoPENeRRORmSG1
  8757.    LDY #>COPYoPENeRRORmSG1
  8758.    LDX #STDERR
  8759.    JSR FPUTS
  8760.    LDA COPYoPENnAME
  8761.    LDY COPYoPENnAME+1
  8762.    LDX #STDERR
  8763.    JSR FPUTS
  8764.    LDA #<COPYoPENeRRORmSG2
  8765.    LDY #>COPYoPENeRRORmSG2
  8766.    LDX #STDERR
  8767.    JSR FPUTS
  8768.    RTS
  8769.  
  8770.    COPYoPENeRRORmSG1 = *
  8771.    .ASC "eRROR OPENING FILE "
  8772.    .BYTE CHRqUOTE
  8773.    .BYTE 0
  8774.    COPYoPENeRRORmSG2 = *
  8775.    .BYTE CHRqUOTE
  8776.    .BYTE CHRcr
  8777.    .BYTE 0
  8778.  
  8779.    COPYfILEeRROR = *
  8780.    LDA #<COPYfILEeRRORmSG
  8781.    LDY #>COPYfILEeRRORmSG
  8782.    LDX #STDERR
  8783.    JMP FPUTS
  8784.    COPYfILEeRRORmSG = *
  8785.    .ASC "fILE DATA ERROR!"
  8786.    .BYTE CHRcr
  8787.    .BYTE 0
  8788.  
  8789. COPYaRG = 12
  8790. LASTaRG = 14
  8791. COPYtOdIR = *
  8792.    LDA #1
  8793.    LDY #0
  8794.    STA COPYaRG
  8795.    STY COPYaRG+1
  8796. -  LDA ACEaRGC
  8797.    LDY ACEaRGC+1
  8798.    SEC
  8799.    SBC #1
  8800.    BCS +
  8801.    DEY
  8802. +  CMP COPYaRG
  8803.    BNE +
  8804.    CPY COPYaRG+1
  8805.    BEQ COPYtOdIReXIT
  8806. +  JSR STOPKEY
  8807.    BCS COPYtOdIRsTOPPED
  8808.    LDA COPYaRG
  8809.    LDY COPYaRG+1
  8810.    JSR GETARG
  8811.    LDA ZP
  8812.    LDY ZP+1
  8813.    STA COPYiNnAME
  8814.    STY COPYiNnAME+1
  8815.    JSR COPYfILEtOdIR
  8816.    LDA ABORTfLAG
  8817.    BNE COPYtOdIRsTOPPED
  8818.    INC COPYaRG
  8819.    BNE +
  8820.    INC COPYaRG+1
  8821. +  JMP -
  8822.  
  8823. COPYtOdIReXIT = *
  8824.    RTS
  8825. COPYtOdIRsTOPPED = *
  8826.    LDA #<STOPPEDmSG
  8827.    LDY #>STOPPEDmSG
  8828.    JSR EPUTS
  8829.    RTS
  8830.    STOPPEDmSG = *
  8831.    .ASC "<sTOPPED>"
  8832.    .BYTE CHRcr,0
  8833.  
  8834. SCANpOS = 6
  8835.  
  8836. COPYfILEtOdIR = *
  8837.    ;** GENERATE OUTPUT FILE NAME
  8838.    JSR GETlASTaRG
  8839.    LDY #0
  8840. -  LDA (ZP),Y
  8841.    BEQ +
  8842.    STA COPYnAMEbUF,Y
  8843.    INY
  8844.    BNE -
  8845. +  TYA
  8846.    TAX
  8847.    ;** EXTRACT BASENAME
  8848.    LDY #0
  8849.    STY SCANpOS
  8850. -  LDA (COPYiNnAME),Y
  8851.    BEQ +
  8852.    CMP #":"
  8853.    BNE BASENAMEnEXT
  8854.    INY
  8855.    STY SCANpOS
  8856.    DEY
  8857.    BASENAMEnEXT = *
  8858.    INY
  8859.    BNE -
  8860.  
  8861. +  LDY SCANpOS
  8862. -  LDA (COPYiNnAME),Y
  8863.    STA COPYnAMEbUF,X
  8864.    BEQ +
  8865.    INX
  8866.    INY
  8867.    BNE -
  8868.    ;** COPY FILE
  8869. +  LDA #<COPYnAMEbUF
  8870.    LDY #>COPYnAMEbUF
  8871.    STA COPYoUTnAME
  8872.    STY COPYoUTnAME+1
  8873.    JSR COPYtOdIRsTATUS
  8874.    JSR COPYFILE
  8875.    RTS
  8876.  
  8877. NAMEsPACE .BUF 1
  8878.  
  8879. COPYtOdIRsTATUS = *
  8880.    LDA COPYiNnAME
  8881.    LDY COPYiNnAME+1
  8882.    JSR PUTS
  8883.  
  8884.    LDY #255
  8885. -  INY
  8886.    LDA (COPYiNnAME),Y
  8887.    BNE -
  8888.    TYA
  8889. -  SEC
  8890.    SBC #10
  8891.    BCS -
  8892.    ADC #10
  8893.    STA NAMEsPACE
  8894.    STA NAMEsPACE
  8895.    SEC
  8896.    LDA #10
  8897.    SBC NAMEsPACE
  8898.    STA NAMEsPACE
  8899.  
  8900. -  LDA #" "
  8901.    JSR PUTCHAR
  8902.    DEC NAMEsPACE
  8903.    BNE -
  8904.  
  8905.    LDA COPYoUTnAME
  8906.    LDY COPYoUTnAME+1
  8907.    JSR PUTS
  8908.    LDA #CHRcr
  8909.    JSR PUTCHAR
  8910.    RTS
  8911.  
  8912. ;===THE END===
  8913. CPbSS = *
  8914. COPYnAMEbUF = CPbSS+0
  8915. CPeND = CPbSS+256
  8916. CRC32.S
  8917. 394
  8918. ;*** CRC32B PROGRAM - BY cRAIG bRUCE - 14-oCT-93
  8919.  
  8920. .SEQ ACEHEAD.S
  8921. .ORG ACEaPPaDDRESS
  8922. .OBJ "@0:CRC32B"
  8923.  
  8924. JMP CRCmAIN
  8925. .BYTE ACEid1,ACEid2,ACEid3
  8926.  
  8927. ;*** GLOBAL DECLARATIONS
  8928.  
  8929. LIBWORK = $40
  8930.  
  8931. CHRcr = $0D
  8932. CHRqUOTE = $22
  8933.  
  8934. CRCtABLE0 = *
  8935.    .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
  8936.    .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
  8937.    .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
  8938.    .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
  8939.    .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
  8940.    .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
  8941.    .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
  8942.    .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
  8943.    .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
  8944.    .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
  8945.    .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
  8946.    .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
  8947.    .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
  8948.    .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
  8949.    .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
  8950.    .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
  8951.  
  8952. CRCtABLE1 = *
  8953.    .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
  8954.    .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
  8955.    .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
  8956.    .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
  8957.    .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
  8958.    .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
  8959.    .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
  8960.    .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
  8961.    .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
  8962.    .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
  8963.    .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
  8964.    .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
  8965.    .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
  8966.    .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
  8967.    .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
  8968.    .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
  8969.  
  8970. CRCtABLE2 = *
  8971.    .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
  8972.    .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
  8973.    .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
  8974.    .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
  8975.    .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
  8976.    .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
  8977.    .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
  8978.    .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
  8979.    .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
  8980.    .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
  8981.    .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
  8982.    .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
  8983.    .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
  8984.    .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
  8985.    .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
  8986.    .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
  8987.  
  8988. CRCtABLE3 = *
  8989.    .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
  8990.    .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
  8991.    .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
  8992.    .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
  8993.    .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
  8994.    .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
  8995.    .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
  8996.    .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
  8997.    .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
  8998.    .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
  8999.    .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
  9000.    .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
  9001.    .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
  9002.    .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
  9003.    .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
  9004.    .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
  9005.  
  9006. ;******** STANDARD LIBRARY ********
  9007.  
  9008. PUTS = *
  9009.    LDX #STDOUT
  9010. FPUTS = *
  9011.    STA ZP+0
  9012.    STY ZP+1
  9013.    LDY #$FF
  9014. -  INY
  9015.    LDA (ZP),Y
  9016.    BNE -
  9017.    TYA
  9018.    LDY #0
  9019.    JMP WRITE
  9020. EPUTS = *
  9021.    LDX #STDERR
  9022.    JMP FPUTS
  9023.  
  9024. PUTCHAR = *
  9025.    LDX #STDOUT
  9026. PUTC = *
  9027.    STA PUTCbUFFER
  9028.    LDA #<PUTCbUFFER
  9029.    LDY #>PUTCbUFFER
  9030.    STA ZP+0
  9031.    STY ZP+1
  9032.    LDA #1
  9033.    LDY #0
  9034.    JMP WRITE
  9035.    PUTCbUFFER .BUF 1
  9036.  
  9037. GETCHAR = *
  9038.    LDX #STDIN
  9039. GETC = *
  9040.    LDA #<GETCbUFFER
  9041.    LDY #>GETCbUFFER
  9042.    STA ZP+0
  9043.    STY ZP+1
  9044.    LDA #1
  9045.    LDY #0
  9046.    JSR READ
  9047.    BEQ +
  9048.    LDA GETCbUFFER
  9049.    RTS
  9050. +  SEC
  9051.    RTS
  9052.    GETCbUFFER .BUF 1
  9053.  
  9054. GETARG = *
  9055.    STY ZP+1
  9056.    ASL
  9057.    STA ZP+0
  9058.    ROL ZP+1
  9059.    CLC
  9060.    LDA ACEaRGV
  9061.    ADC ZP+0
  9062.    STA ZP+0
  9063.    LDA ACEaRGV+1
  9064.    ADC ZP+1
  9065.    STA ZP+1
  9066.    LDY #0
  9067.    LDA (ZP),Y
  9068.    TAX
  9069.    INY
  9070.    LDA (ZP),Y
  9071.    STX ZP+0
  9072.    STA ZP+1
  9073.    RTS
  9074.  
  9075. ;===CRC32===
  9076. CRCaRG = 2
  9077. CRCnAME = 4
  9078. INbUFlEN = 6
  9079.  
  9080. CRCmAIN = *
  9081.    ;** CHECK ARGUMENT COUNT
  9082.    LDA ACEaRGC+1
  9083.    BNE CRCeNOUGHaRGS
  9084.    LDA ACEaRGC+0
  9085.    CMP #2
  9086.    BCS CRCeNOUGHaRGS
  9087.  
  9088. CRCuSAGE = *
  9089.    LDA #<CRCuSAGEmSG
  9090.    LDY #>CRCuSAGEmSG
  9091.    JMP EPUTS
  9092.  
  9093. CRCuSAGEmSG = *
  9094.    .ASC "uSAGE: CRC32B FILE1 FILE2 ... FILEn"
  9095.    .BYTE CHRcr
  9096.    .BYTE 0
  9097.  
  9098. CRCeNOUGHaRGS = *
  9099.    ;** GET INPUT BUFFER LENGTH
  9100.    SEC
  9101.    LDA ACEsTACKpTR+0
  9102.    SBC #<CRCiNbUF
  9103.    STA INbUFlEN+0
  9104.    LDA ACEsTACKpTR+1
  9105.    SBC #>CRCiNbUF
  9106.    STA INbUFlEN+1
  9107.    ;** MAIN LOOP
  9108.    LDA #1
  9109.    LDY #0
  9110.    STA CRCaRG+0
  9111.    STY CRCaRG+1
  9112. -  JSR STOPKEY
  9113.    BCS CRCsTOPPED
  9114.    LDA CRCaRG+0
  9115.    LDY CRCaRG+1
  9116.    JSR GETARG
  9117.    LDA ZP+0
  9118.    LDY ZP+1
  9119.    STA CRCnAME
  9120.    STY CRCnAME+1
  9121.    ORA ZP+1
  9122.    BEQ CRCeXIT
  9123.    JSR CRC32
  9124.    BCC +
  9125.    JSR CRCeRROR
  9126. +  INC CRCaRG+0
  9127.    BNE +
  9128.    INC CRCaRG+1
  9129. +  JMP -
  9130.  
  9131. CRCeXIT = *
  9132.    RTS
  9133.  
  9134. CRCsTOPPED = *
  9135.    LDA #<STOPPEDmSG
  9136.    LDY #>STOPPEDmSG
  9137.    JSR EPUTS
  9138.    RTS
  9139.    STOPPEDmSG = *
  9140.    .ASC "<sTOPPED>"
  9141.    .BYTE CHRcr,0
  9142.  
  9143. CRCeRROR = *
  9144.    LDA #<CRCeRRORmSG1
  9145.    LDY #>CRCeRRORmSG1
  9146.    JSR EPUTS
  9147.    LDA CRCnAME+0
  9148.    LDY CRCnAME+1
  9149.    JSR EPUTS
  9150.    LDA #<CRCeRRORmSG2
  9151.    LDY #>CRCeRRORmSG2
  9152.    JMP EPUTS
  9153.  
  9154. CRCeRRORmSG1 = *
  9155.    .ASC "eRROR READING FILE "
  9156.    .BYTE CHRqUOTE,0
  9157.  
  9158. CRCeRRORmSG2 = *
  9159.    .BYTE CHRqUOTE,CHRcr,0
  9160.  
  9161. BUFpTR = 8
  9162. BUFcOUNT = 10
  9163. INFILE = 12
  9164.  
  9165. CRC32 = *
  9166.    ;** OPEN FILE
  9167.    LDA CRCnAME+0
  9168.    LDY CRCnAME+1
  9169.    STA ZP+0
  9170.    STY ZP+1
  9171.    LDA #"R"
  9172.    JSR OPEN
  9173.    BCC +
  9174.    RTS
  9175. +  STA INFILE
  9176.    ;** ENCODE FILE
  9177.    JSR CRCbODY
  9178.    ;** CLOSE FILE
  9179.    LDA INFILE
  9180.    JSR CLOSE
  9181.    RTS
  9182.  
  9183. CH = 13         ;(1)
  9184. CRCaCCUM = 34   ;(4)
  9185. CRCtEMP  = 38   ;(4)
  9186.  
  9187. CRCbODY = *
  9188.    LDX #3
  9189.    LDA #$FF
  9190. -  STA CRCaCCUM,X
  9191.    DEX
  9192.    BPL -
  9193.    LDA #0
  9194.    STA BUFcOUNT+0
  9195.    STA BUFcOUNT+1
  9196.  
  9197.    ;***SCAN FILE
  9198.  
  9199.    NEXTcHAR = *
  9200.    JSR GETbYTE
  9201.    BCS CRCpRINT
  9202.    STA CH
  9203.  
  9204. ;** CRC = 0Xffffffff;
  9205. ;** WHILE( (C=GETC(FP)) != eof ) {$7b}
  9206. ;**     CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
  9207. ;** {$7d}
  9208. ;** RETURN( CRC^0Xffffffff );
  9209.  
  9210.    LDA CRCaCCUM+0       ;.x = (CRC^C) & 0Xff
  9211.    EOR CH
  9212.    TAX
  9213.  
  9214.    LDA CRCaCCUM+1       ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
  9215.    EOR CRCtABLE0,X
  9216.    STA CRCaCCUM+0
  9217.    LDA CRCaCCUM+2
  9218.    EOR CRCtABLE1,X
  9219.    STA CRCaCCUM+1
  9220.    LDA CRCaCCUM+3
  9221.    EOR CRCtABLE2,X
  9222.    STA CRCaCCUM+2
  9223.    LDA CRCtABLE3,X
  9224.    STA CRCaCCUM+3
  9225.    JMP NEXTcHAR
  9226.  
  9227.    CRCpRINT = *
  9228.    LDA #<RESmSG1+8
  9229.    LDY #>RESmSG1+8
  9230.    STA SYSWORK+0
  9231.    STY SYSWORK+1
  9232.    LDY #9
  9233.    LDX #3
  9234. -  LDA CRCaCCUM,X
  9235.    EOR #$FF
  9236.    PHA
  9237.    LSR
  9238.    LSR
  9239.    LSR
  9240.    LSR
  9241.    JSR PUThEX
  9242.    PLA
  9243.    JSR PUThEX
  9244.    DEX
  9245.    BPL -
  9246.    LDA #<RESmSG1
  9247.    LDY #>RESmSG1
  9248.    JSR PUTS
  9249.    LDA CRCnAME+0
  9250.    LDY CRCnAME+1
  9251.    JSR PUTS
  9252.    LDA #<RESmSG2
  9253.    LDY #>RESmSG2
  9254.    JSR PUTS
  9255.    CLC
  9256.    RTS
  9257.  
  9258. PUThEX = *
  9259.    AND #$0F
  9260.    ORA #$30
  9261.    CMP #$3A
  9262.    BCC +
  9263.    ADC #6
  9264. +  STA RESmSG1,Y
  9265.    INY
  9266.    RTS
  9267.  
  9268. RESmSG1 = *
  9269.    .ASC "CRC32B = 12345678 FOR "
  9270.    .BYTE CHRqUOTE,0
  9271. RESmSG2 = *
  9272.    .BYTE CHRqUOTE,CHRcr,0
  9273.  
  9274. GETbYTE = *
  9275.    LDA BUFcOUNT+0
  9276.    ORA BUFcOUNT+1
  9277.    BEQ GETbYTEfILLbUF
  9278.    LDY #0
  9279.    LDA (BUFpTR),Y
  9280.    INC BUFpTR
  9281.    BNE +
  9282.    INC BUFpTR+1
  9283. +  LDX BUFcOUNT+0
  9284.    BNE +
  9285.    DEC BUFcOUNT+1
  9286. +  DEC BUFcOUNT+0
  9287.    CLC
  9288.    RTS
  9289.  
  9290. GETbYTEfILLbUF = *
  9291.    LDA #<CRCiNbUF
  9292.    LDY #>CRCiNbUF
  9293.    STA ZP+0
  9294.    STY ZP+1
  9295.    STA BUFpTR+0
  9296.    STY BUFpTR+1
  9297.    LDA INbUFlEN+0
  9298.    LDY INbUFlEN+1
  9299.    LDX INFILE
  9300.    JSR READ
  9301.    BEQ +
  9302.    BCS +
  9303.    STA BUFcOUNT+0
  9304.    STY BUFcOUNT+1
  9305.    JMP GETbYTE
  9306. +  SEC
  9307.    RTS
  9308.  
  9309. ;===THE END===
  9310. CRCbSS = *
  9311. CRCiNbUF  = CRCbSS
  9312. CRC32A.S
  9313. 308
  9314. ;*** CRC32A PROGRAM - BY cRAIG bRUCE
  9315.  
  9316. .SEQ ACEHEAD.S
  9317. .ORG ACEaPPaDDRESS
  9318. .OBJ "@0:CRC32A"
  9319.  
  9320. JMP CRCmAIN
  9321. .ASC "Cb"
  9322.  
  9323. ;*** GLOBAL DECLARATIONS
  9324.  
  9325. LIBWORK = $40
  9326.  
  9327. CHRcr = $0D
  9328. CHRqUOTE = $22
  9329.  
  9330. ;******** STANDARD LIBRARY ********
  9331. PUTS = *
  9332.    LDX #STDOUT
  9333. FPUTS = *
  9334.    STA ZP
  9335.    STY ZP+1
  9336.    LDY #$FF
  9337. -  INY
  9338.    LDA (ZP),Y
  9339.    BNE -
  9340.    TYA
  9341.    LDY #0
  9342.    JMP WRITE
  9343. EPUTS = *
  9344.    LDX #STDERR
  9345.    JMP FPUTS
  9346.  
  9347. PUTCHAR = *
  9348.    LDX #STDOUT
  9349. PUTC = *
  9350.    STA PUTCbUFFER
  9351.    LDA #<PUTCbUFFER
  9352.    LDY #>PUTCbUFFER
  9353.    STA ZP
  9354.    STY ZP+1
  9355.    LDA #1
  9356.    LDY #0
  9357.    JMP WRITE
  9358.    PUTCbUFFER .BUF 1
  9359.  
  9360. GETCHAR = *
  9361.    LDX #STDIN
  9362. GETC = *
  9363.    LDA #<GETCbUFFER
  9364.    LDY #>GETCbUFFER
  9365.    STA ZP
  9366.    STY ZP+1
  9367.    LDA #1
  9368.    LDY #0
  9369.    JSR READ
  9370.    BEQ +
  9371.    LDA GETCbUFFER
  9372.    RTS
  9373. +  SEC
  9374.    RTS
  9375.    GETCbUFFER .BUF 1
  9376.  
  9377. GETARG = *
  9378.    STY ZP+1
  9379.    ASL
  9380.    STA ZP
  9381.    ROL ZP+1
  9382.    CLC
  9383.    LDA ACEaRGV
  9384.    ADC ZP
  9385.    STA ZP
  9386.    LDA ACEaRGV+1
  9387.    ADC ZP+1
  9388.    STA ZP+1
  9389.    LDY #0
  9390.    LDA (ZP),Y
  9391.    TAX
  9392.    INY
  9393.    LDA (ZP),Y
  9394.    STX ZP
  9395.    STA ZP+1
  9396.    RTS
  9397.  
  9398. ;===CRC32===
  9399. CRCaRG = 2
  9400. CRCnAME = 4
  9401. INbUFlEN = 6
  9402.  
  9403. CRCmAIN = *
  9404.    ;** CHECK ARGUMENT COUNT
  9405.    LDA ACEaRGC+1
  9406.    BNE CRCeNOUGHaRGS
  9407.    LDA ACEaRGC
  9408.    CMP #2
  9409.    BCS CRCeNOUGHaRGS
  9410.  
  9411. CRCuSAGE = *
  9412.    LDA #<CRCuSAGEmSG
  9413.    LDY #>CRCuSAGEmSG
  9414.    JMP EPUTS
  9415.  
  9416. CRCuSAGEmSG = *
  9417.    .ASC "uSAGE: CRC32 FILE1 FILE2 ... FILEn"
  9418.    .BYTE CHRcr
  9419.    .BYTE 0
  9420.  
  9421. CRCeNOUGHaRGS = *
  9422.    ;** GET INPUT BUFFER LENGTH
  9423.    SEC
  9424.    LDA ACEsTACKpTR
  9425.    SBC #<CRCiNbUF
  9426.    STA INbUFlEN
  9427.    LDA ACEsTACKpTR+1
  9428.    SBC #>CRCiNbUF
  9429.    STA INbUFlEN+1
  9430.    ;** MAIN LOOP
  9431.    LDA #1
  9432.    LDY #0
  9433.    STA CRCaRG
  9434.    STY CRCaRG+1
  9435. -  JSR STOPKEY
  9436.    BCS CRCsTOPPED
  9437.    LDA CRCaRG
  9438.    LDY CRCaRG+1
  9439.    JSR GETARG
  9440.    LDA ZP
  9441.    LDY ZP+1
  9442.    STA CRCnAME
  9443.    STY CRCnAME+1
  9444.    ORA ZP+1
  9445.    BEQ CRCeXIT
  9446.    JSR CRC32
  9447.    BCC +
  9448.    JSR CRCeRROR
  9449. +  INC CRCaRG
  9450.    BNE +
  9451.    INC CRCaRG+1
  9452. +  JMP -
  9453.  
  9454. CRCeXIT = *
  9455.    RTS
  9456.  
  9457. CRCsTOPPED = *
  9458.    LDA #<STOPPEDmSG
  9459.    LDY #>STOPPEDmSG
  9460.    JSR EPUTS
  9461.    RTS
  9462.    STOPPEDmSG = *
  9463.    .ASC "<sTOPPED>"
  9464.    .BYTE CHRcr,0
  9465.  
  9466. CRCeRROR = *
  9467.    LDA #<CRCeRRORmSG1
  9468.    LDY #>CRCeRRORmSG1
  9469.    JSR EPUTS
  9470.    LDA CRCnAME
  9471.    LDY CRCnAME+1
  9472.    JSR EPUTS
  9473.    LDA #<CRCeRRORmSG2
  9474.    LDY #>CRCeRRORmSG2
  9475.    JMP EPUTS
  9476.  
  9477. CRCeRRORmSG1 = *
  9478.    .ASC "eRROR READING FILE "
  9479.    .BYTE CHRqUOTE,0
  9480.  
  9481. CRCeRRORmSG2 = *
  9482.    .BYTE CHRqUOTE,CHRcr,0
  9483.  
  9484. BUFpTR = 8
  9485. BUFcOUNT = 10
  9486. INFILE = 12
  9487.  
  9488. CRC32 = *
  9489.    ;** OPEN FILE
  9490.    LDA CRCnAME
  9491.    LDY CRCnAME+1
  9492.    STA ZP
  9493.    STY ZP+1
  9494.    LDA #"R"
  9495.    JSR OPEN
  9496.    BCC +
  9497.    RTS
  9498. +  STA INFILE
  9499.    ;** ENCODE FILE
  9500.    JSR CRCbODY
  9501.    ;** CLOSE FILE
  9502.    LDA INFILE
  9503.    JSR CLOSE
  9504.    RTS
  9505.  
  9506. ;CRC32 VERSION 1.0 FOR THE c-128 AND c-64 BY cRAIG bRUCE 23-mAY-92
  9507.  
  9508. CH = 13         ;(1)
  9509. CRCaCCUM = 34   ;(4)
  9510.  
  9511. CRClOW  = $B7
  9512. CRCmID1 = $1D
  9513. CRCmID2 = $C1
  9514. CRChIGH = $04
  9515.  
  9516. CRCbODY = *
  9517.    LDX #3
  9518.    LDA #0
  9519. -  STA CRCaCCUM,X
  9520.    DEX
  9521.    BPL -
  9522.    STA BUFcOUNT
  9523.    STA BUFcOUNT+1
  9524.  
  9525.    ;***SCAN FILE
  9526.  
  9527.    NEXTcHAR = *
  9528.    JSR GETbYTE
  9529.    BCS CRCpRINT
  9530.    STA CH
  9531.    LDX #8
  9532.  
  9533.    NEXTbIT = *
  9534.    ASL CH
  9535.    ROL CRCaCCUM+0
  9536.    ROL CRCaCCUM+1
  9537.    ROL CRCaCCUM+2
  9538.    ROL CRCaCCUM+3
  9539.    BCC +
  9540.    LDA CRCaCCUM+0
  9541.    EOR #CRClOW
  9542.    STA CRCaCCUM+0
  9543.    LDA CRCaCCUM+1
  9544.    EOR #CRCmID1
  9545.    STA CRCaCCUM+1
  9546.    LDA CRCaCCUM+2
  9547.    EOR #CRCmID2
  9548.    STA CRCaCCUM+2
  9549.    LDA CRCaCCUM+3
  9550.    EOR #CRChIGH
  9551.    STA CRCaCCUM+3
  9552. +  DEX
  9553.    BNE NEXTbIT
  9554.    JMP NEXTcHAR
  9555.  
  9556.    CRCpRINT = *
  9557.    LDA #<RESmSG1+9
  9558.    LDY #>RESmSG1+9
  9559.    STA SYSWORK+0
  9560.    STY SYSWORK+1
  9561.    LDX #CRCaCCUM
  9562.    LDA #10
  9563.    JSR UTOA
  9564.    LDA #" "
  9565.    STA RESmSG1+19
  9566.    LDA #<RESmSG1
  9567.    LDY #>RESmSG1
  9568.    JSR PUTS
  9569.    LDA CRCnAME
  9570.    LDY CRCnAME+1
  9571.    JSR PUTS
  9572.    LDA #<RESmSG2
  9573.    LDY #>RESmSG2
  9574.    JSR PUTS
  9575.    CLC
  9576.    RTS
  9577.  
  9578. RESmSG1 = *
  9579.    .ASC "CRC32A = 1234567890 FOR "
  9580.    .BYTE CHRqUOTE,0
  9581. RESmSG2 = *
  9582.    .BYTE CHRqUOTE,CHRcr,0
  9583.  
  9584. GETbYTE = *
  9585.    LDA BUFcOUNT
  9586.    ORA BUFcOUNT+1
  9587.    BEQ GETbYTEfILLbUF
  9588.    LDY #0
  9589.    LDA (BUFpTR),Y
  9590.    INC BUFpTR
  9591.    BNE +
  9592.    INC BUFpTR+1
  9593. +  LDX BUFcOUNT
  9594.    BNE +
  9595.    DEC BUFcOUNT+1
  9596. +  DEC BUFcOUNT
  9597.    CLC
  9598.    RTS
  9599.  
  9600. GETbYTEfILLbUF = *
  9601.    LDA #<CRCiNbUF
  9602.    LDY #>CRCiNbUF
  9603.    STA ZP
  9604.    STY ZP+1
  9605.    STA BUFpTR
  9606.    STY BUFpTR+1
  9607.    LDA INbUFlEN
  9608.    LDY INbUFlEN+1
  9609.    LDX INFILE
  9610.    JSR READ
  9611.    BEQ +
  9612.    BCS +
  9613.    STA BUFcOUNT
  9614.    STY BUFcOUNT+1
  9615.    JMP GETbYTE
  9616. +  SEC
  9617.    RTS
  9618.  
  9619. ;===THE END===
  9620. CRCbSS = *
  9621. CRCiNbUF  = CRCbSS
  9622. DATE.S
  9623. 58
  9624. ;DATE PROGRAM
  9625.  
  9626. .SEQ ACEHEAD.S
  9627. .ORG ACEaPPaDDRESS
  9628. .OBJ "@:DATE"
  9629.  
  9630. JMP MAIN
  9631. .ASC "Cb"
  9632.  
  9633. MAIN = *
  9634.    LDA #<DATEbUF
  9635.    LDY #>DATEbUF
  9636.    JSR GETDATE
  9637.    LDY #7
  9638. -  LDA DATEbUF,Y
  9639.    JSR GETASC
  9640.    PHA
  9641.    TXA
  9642.    LDX DATEnUMfIELDS,Y
  9643.    STA DATEnUM+1,X
  9644.    PLA
  9645.    STA DATEnUM,X
  9646.    DEY
  9647.    BPL -
  9648.    LDA #13
  9649.    STA DATEnUM+21
  9650.    LDA #<DATEnUM
  9651.    LDY #>DATEnUM
  9652.    STA ZP
  9653.    STY ZP+1
  9654.    LDA #22
  9655.    LDY #0
  9656.    LDX #STDOUT
  9657.    JMP WRITE
  9658.  
  9659. GETASC = *  ;( .a=BCD ) : .a=ASCHI, .x=ASCLO
  9660.    PHA
  9661.    AND #$0F
  9662.    ORA #$30
  9663.    TAX
  9664.    PLA
  9665.    LSR
  9666.    LSR
  9667.    LSR
  9668.    LSR
  9669.    ORA #$30
  9670.    RTS
  9671.  
  9672. DATEnUM = *
  9673.         ;0123456789012345678901
  9674.    .ASC "1993/05/16-18:04:50.3Z"
  9675. DATEnUMfIELDS = *
  9676.    .BYTE 0,2,5,8,11,14,17,20
  9677. DATEsTR = *
  9678.         ;0123456789012345678901234567
  9679.    .ASC "sUN-16-mAY-1993  06:03:50 PM"
  9680.    .BYTE 0
  9681. DATEbUF = *
  9682. EIGHTY.S
  9683. 10
  9684. .SEQ ACEHEAD.S
  9685. .ORG ACEaPPaDDRESS
  9686. .OBJ "@0:EIGHTY"
  9687.  
  9688. JMP MAIN
  9689. .ASC "Cb"
  9690.  
  9691. MAIN = *
  9692.    LDA #80
  9693.    JMP CONSCREEN
  9694. FAST.S
  9695. 14
  9696. .SEQ ACEHEAD.S
  9697. .ORG ACEaPPaDDRESS
  9698. .OBJ "@0:FAST"
  9699.  
  9700. JMP MAIN
  9701. .ASC "Cb"
  9702.  
  9703. MAIN = *
  9704.    LDA $D011
  9705.    AND #%11101111
  9706.    STA $D011
  9707.    LDA #$01
  9708.    STA $D030
  9709.    RTS
  9710. FORTY.S
  9711. 10
  9712. .SEQ ACEHEAD.S
  9713. .ORG ACEaPPaDDRESS
  9714. .OBJ "@0:FORTY"
  9715.  
  9716. JMP MAIN
  9717. .ASC "Cb"
  9718.  
  9719. MAIN = *
  9720.    LDA #40
  9721.    JMP CONSCREEN
  9722. GREP.S
  9723. 507
  9724. ;*** GREP PROGRAM
  9725.  
  9726. .SEQ ACEHEAD.S
  9727. .ORG ACEaPPaDDRESS
  9728. .OBJ "@0:GREP"
  9729.  
  9730. JMP GREPmAIN
  9731. .ASC "Cb"
  9732.  
  9733. ;*** GLOBAL DECLARATIONS
  9734.  
  9735. LIBWORK = $40
  9736.  
  9737. CHRcr = $0D
  9738. CHRqUOTE = $22
  9739. MAXlINElEN = 2049
  9740.  
  9741. INVERSEfLAG .BUF 1
  9742. IGNOREcASEfLAG .BUF 1
  9743. DISPLAYfILENAMEfLAG .BUF 1
  9744. ANCHORlEFTfLAG .BUF 1
  9745. ANCHORrIGHTfLAG .BUF 1
  9746. STRINGlEN .BUF 1
  9747.  
  9748. ;******** STANDARD LIBRARY ********
  9749. PUTS = *
  9750.    LDX #STDOUT
  9751. FPUTS = *
  9752.    STA ZP
  9753.    STY ZP+1
  9754.    LDY #$FF
  9755. -  INY
  9756.    LDA (ZP),Y
  9757.    BNE -
  9758.    TYA
  9759.    LDY #0
  9760.    JMP WRITE
  9761. EPUTS = *
  9762.    LDX #STDERR
  9763.    JMP FPUTS
  9764.  
  9765. PUTCHAR = *
  9766.    LDX #STDOUT
  9767. PUTC = *
  9768.    STA PUTCbUFFER
  9769.    LDA #<PUTCbUFFER
  9770.    LDY #>PUTCbUFFER
  9771.    STA ZP
  9772.    STY ZP+1
  9773.    LDA #1
  9774.    LDY #0
  9775.    JMP WRITE
  9776.    PUTCbUFFER .BUF 1
  9777.  
  9778. GETCHAR = *
  9779.    LDX #STDIN
  9780. GETC = *
  9781.    LDA #<GETCbUFFER
  9782.    LDY #>GETCbUFFER
  9783.    STA ZP
  9784.    STY ZP+1
  9785.    LDA #1
  9786.    LDY #0
  9787.    JSR READ
  9788.    BEQ +
  9789.    LDA GETCbUFFER
  9790.    RTS
  9791. +  SEC
  9792.    RTS
  9793.    GETCbUFFER .BUF 1
  9794.  
  9795. GETARG = *
  9796.    STY ZP+1
  9797.    ASL
  9798.    STA ZP
  9799.    ROL ZP+1
  9800.    CLC
  9801.    LDA ACEaRGV
  9802.    ADC ZP
  9803.    STA ZP
  9804.    LDA ACEaRGV+1
  9805.    ADC ZP+1
  9806.    STA ZP+1
  9807.    LDY #0
  9808.    LDA (ZP),Y
  9809.    TAX
  9810.    INY
  9811.    LDA (ZP),Y
  9812.    STX ZP
  9813.    STA ZP+1
  9814.    RTS
  9815.  
  9816. ;===GREP===
  9817. GREPaRG = 2
  9818. GREPnAME = 4
  9819. INbUFlEN = 6
  9820. GREPsTRING = 8
  9821.  
  9822. GREPmAIN = *
  9823.    ;** CHECK ARGUMENT COUNT
  9824.    LDA #0
  9825.    STA INVERSEfLAG
  9826.    STA IGNOREcASEfLAG
  9827.    STA DISPLAYfILENAMEfLAG
  9828.    STA ANCHORlEFTfLAG
  9829.    STA ANCHORrIGHTfLAG
  9830.    LDA ACEaRGC+1
  9831.    BNE GREPeNOUGHaRGS
  9832.    LDA ACEaRGC
  9833.    CMP #3
  9834.    BCS GREPeNOUGHaRGS
  9835.  
  9836. GREPuSAGE = *
  9837.    LDA #<GREPuSAGEmSG
  9838.    LDY #>GREPuSAGEmSG
  9839.    JMP EPUTS
  9840.  
  9841. GREPuSAGEmSG = *
  9842.    .ASC "USAGE: GREP [-[I][V]] [^]SUBSTR[$] FILES"
  9843.    .BYTE CHRcr,0
  9844.  
  9845. GREPeNOUGHaRGS = *
  9846.    ;** GET INPUT BUFFER LENGTH
  9847.    SEC
  9848.    LDA ACEsTACKpTR
  9849.    SBC #<GREPiNbUF
  9850.    STA INbUFlEN
  9851.    LDA ACEsTACKpTR+1
  9852.    SBC #>GREPiNbUF
  9853.    STA INbUFlEN+1
  9854.    ;** MAIN LOOP
  9855.    LDA #1
  9856.    LDY #0
  9857.    STA GREPaRG
  9858.    STY GREPaRG+1
  9859.    JSR GETARG
  9860.    LDY #0
  9861.    LDA (ZP),Y
  9862.    CMP #"-"
  9863.    BNE SUBSTRaRG
  9864.    INC GREPaRG
  9865. -  INY
  9866.    LDA (ZP),Y
  9867.    BEQ SUBSTRaRG
  9868.    CMP #"I"
  9869.    BNE +
  9870.    LDA #$FF
  9871.    STA IGNOREcASEfLAG
  9872. +  CMP #"V"
  9873.    BNE +
  9874.    LDA #$FF
  9875.    STA INVERSEfLAG
  9876. +  JMP -
  9877.  
  9878.    SUBSTRaRG = *
  9879.    LDA GREPaRG
  9880.    LDY #0
  9881.    JSR GETARG
  9882.    LDA ZP
  9883.    LDY ZP+1
  9884.    STA GREPsTRING
  9885.    STY GREPsTRING+1
  9886.    BIT IGNOREcASEfLAG
  9887.    BPL +
  9888.    JSR FOLDsTRING
  9889. +  JSR CHECKaNCHORS
  9890.    INC GREPaRG
  9891.  
  9892.    FIRSTaRG = *
  9893.    LDA GREPaRG
  9894.    LDY #0
  9895.    JSR GETARG
  9896.    LDA ZP
  9897.    ORA ZP+1
  9898.    BNE +
  9899.    JMP GREPuSAGE
  9900. +  CLC
  9901.    LDA GREPaRG
  9902.    ADC #1
  9903.    LDY #0
  9904.    JSR GETARG
  9905.    LDA ZP
  9906.    ORA ZP+1
  9907.    BEQ NEXTaRG
  9908.    LDA #$FF
  9909.    STA DISPLAYfILENAMEfLAG
  9910.  
  9911.    NEXTaRG = *
  9912.    JSR STOPKEY
  9913.    BCS GREPsTOPPED
  9914.    LDA GREPaRG
  9915.    LDY GREPaRG+1
  9916.    JSR GETARG
  9917.    LDA ZP
  9918.    LDY ZP+1
  9919.    STA GREPnAME
  9920.    STY GREPnAME+1
  9921.    ORA ZP+1
  9922.    BEQ GREPeXIT
  9923.    JSR GREP
  9924.    BCC +
  9925.    JSR GREPeRROR
  9926. +  INC GREPaRG
  9927.    BNE +
  9928.    INC GREPaRG+1
  9929. +  JMP NEXTaRG
  9930.  
  9931. GREPeXIT = *
  9932.    RTS
  9933.  
  9934. FOLDsTRING = *
  9935.    LDY #0
  9936. -  LDA (GREPsTRING),Y
  9937.    BNE +
  9938.    RTS
  9939. +  CMP #"a"
  9940.    BCC +
  9941.    CMP #"z"+1
  9942.    BCS +
  9943.    SEC
  9944.    SBC #"a"-"A"
  9945.    STA (GREPsTRING),Y
  9946. +  INY
  9947.    BNE -
  9948.    RTS
  9949.  
  9950. CHECKaNCHORS = *
  9951.    LDY #0
  9952.    LDA (GREPsTRING),Y
  9953.    CMP #"^"
  9954.    BNE +
  9955.    LDA #$FF
  9956.    STA ANCHORlEFTfLAG
  9957.    INC GREPsTRING
  9958.    BNE +
  9959.    INC GREPsTRING+1
  9960. +  LDY #255
  9961. -  INY
  9962.    LDA (GREPsTRING),Y
  9963.    BNE -
  9964.    STY STRINGlEN
  9965.    DEY
  9966.    CPY #255
  9967.    BEQ +
  9968.    LDA (GREPsTRING),Y
  9969.    CMP #"$"
  9970.    BNE +
  9971.    LDA #$FF
  9972.    STA ANCHORrIGHTfLAG
  9973.    LDA #0
  9974.    STA (GREPsTRING),Y
  9975.    STY STRINGlEN
  9976. +  RTS
  9977.  
  9978. GREPsTOPPED = *
  9979.    LDA #<STOPPEDmSG
  9980.    LDY #>STOPPEDmSG
  9981.    JSR EPUTS
  9982.    RTS
  9983.    STOPPEDmSG = *
  9984.    .ASC "<sTOPPED>"
  9985.    .BYTE CHRcr,0
  9986.  
  9987. GREPeRROR = *
  9988.    LDA #<GREPeRRORmSG1
  9989.    LDY #>GREPeRRORmSG1
  9990.    JSR EPUTS
  9991.    LDA GREPnAME
  9992.    LDY GREPnAME+1
  9993.    JSR EPUTS
  9994.    LDA #<GREPeRRORmSG2
  9995.    LDY #>GREPeRRORmSG2
  9996.    JMP EPUTS
  9997.  
  9998. GREPeRRORmSG1 = *
  9999.    .ASC "eRROR READING FILE "
  10000.    .BYTE CHRqUOTE,0
  10001.  
  10002. GREPeRRORmSG2 = *
  10003.    .BYTE CHRqUOTE,CHRcr,0
  10004.  
  10005. BUFpTR = 10
  10006. BUFcOUNT = 12
  10007. INFILE = 14
  10008.  
  10009. GREP = *
  10010.    ;** OPEN FILE
  10011.    LDA GREPnAME
  10012.    LDY GREPnAME+1
  10013.    STA ZP
  10014.    STY ZP+1
  10015.    LDA #"R"
  10016.    JSR OPEN
  10017.    BCC +
  10018.    RTS
  10019. +  STA INFILE
  10020.    ;** ENCODE FILE
  10021.    JSR GREPbODY
  10022.    ;** CLOSE FILE
  10023.    LDA INFILE
  10024.    JSR CLOSE
  10025.    RTS
  10026.  
  10027. LINElEN = $40      ;(2)
  10028. LINEpTR = $42      ;(2)
  10029.  
  10030. GREPbODY = *
  10031.    LDA #0
  10032.    STA BUFcOUNT
  10033.    STA BUFcOUNT+1
  10034. -  JSR GETLINE
  10035.    BCC +
  10036.    RTS
  10037. +  JSR CHECKlINE
  10038.    BIT INVERSEfLAG
  10039.    BMI +
  10040.    BCC -
  10041.    JSR WRITElINE
  10042.    JMP -
  10043. +  BCS -
  10044.    JSR WRITElINE
  10045.    JMP -
  10046.  
  10047. LINErESET = $44   ;(2)
  10048. STRINGpOS = $46   ;(1)
  10049.  
  10050. CHECKlINE = *  ;() : .cc=NO_MATCH, .cs=MATCH
  10051.    BIT ANCHORrIGHTfLAG
  10052.    BPL CHECKsUBSTR
  10053.    CLC
  10054.    LDA LINEpTR
  10055.    ADC LINElEN
  10056.    STA LINEpTR
  10057.    LDA LINEpTR+1
  10058.    ADC LINElEN+1
  10059.    STA LINEpTR+1
  10060.    SEC
  10061.    LDA LINEpTR
  10062.    SBC STRINGlEN
  10063.    STA LINEpTR
  10064.    LDA LINEpTR+1
  10065.    SBC #0
  10066.    STA LINEpTR+1
  10067.  
  10068.    CHECKsUBSTR = *
  10069.    LDA LINEpTR
  10070.    LDY LINEpTR+1
  10071.    STA LINErESET
  10072.    STY LINErESET+1
  10073.    INC LINErESET
  10074.    BNE +
  10075.    INC LINErESET+1
  10076. +  LDY #0
  10077.    STY STRINGpOS
  10078.  
  10079.    CHECKcHAR = *
  10080. +  LDY STRINGpOS
  10081.    LDA (GREPsTRING),Y
  10082.    BEQ ENDoFsTRING
  10083.    LDY #0
  10084.    CMP (LINEpTR),Y
  10085.    BNE MISMATCH
  10086. -  INC STRINGpOS
  10087.    INC LINEpTR
  10088.    BNE +
  10089.    INC LINEpTR+1
  10090. +  JMP CHECKcHAR
  10091.  
  10092.    MISMATCH = *
  10093.    LDY #0
  10094.    LDA (LINEpTR),Y
  10095.    BEQ ENDoFlINE
  10096.    BIT IGNOREcASEfLAG
  10097.    BPL +
  10098.    CMP #"a"
  10099.    BCC +
  10100.    CMP #"z"+1
  10101.    BCS +
  10102.    SEC
  10103.    SBC #"a"-"A"
  10104.    LDY STRINGpOS
  10105.    CMP (GREPsTRING),Y
  10106.    BEQ -
  10107. +  LDA LINErESET
  10108.    LDY LINErESET+1
  10109.    STA LINEpTR
  10110.    STY LINEpTR+1
  10111.    JMP CHECKsUBSTR
  10112.  
  10113.    ENDoFlINE = *
  10114.    CLC
  10115.    RTS
  10116.  
  10117.    ENDoFsTRING = *
  10118.    BIT ANCHORlEFTfLAG
  10119.    BMI +
  10120.    SEC
  10121.    RTS
  10122. +  LDA LINErESET
  10123.    BNE +
  10124.    DEC LINErESET+1
  10125. +  DEC LINErESET
  10126.    LDA LINErESET
  10127.    CMP #<GREPlINE
  10128.    BNE ENDoFlINE
  10129.    LDA LINErESET+1
  10130.    CMP #>GREPlINE
  10131.    BNE ENDoFlINE
  10132.    SEC
  10133.    RTS
  10134.  
  10135. WRITElINE = *
  10136.    LDA DISPLAYfILENAMEfLAG
  10137.    BEQ +
  10138.    LDA GREPnAME
  10139.    LDY GREPnAME+1
  10140.    JSR PUTS
  10141.    LDA #":"
  10142.    JSR PUTCHAR
  10143. +  LDA #<GREPlINE
  10144.    LDY #>GREPlINE
  10145.    STA ZP
  10146.    STY ZP+1
  10147.    LDA LINElEN
  10148.    LDY LINElEN+1
  10149.    LDX #STDOUT
  10150.    JSR WRITE
  10151.    LDA #CHRcr
  10152.    JSR PUTCHAR
  10153.    RTS
  10154.  
  10155. GETLINE = *  ;() : LINElEN, LINEpTR
  10156.    ;** IGNORES CHARS BEYOND MAX LINE LEN, IGNORES LAST LINE NOT ENDING IN cr,
  10157.    ;** LINE ENDS WITH \0
  10158.    LDA #0
  10159.    STA LINElEN
  10160.    STA LINElEN+1
  10161.    LDA #<GREPlINE
  10162.    LDY #>GREPlINE
  10163.    STA LINEpTR
  10164.    STY LINEpTR+1
  10165. -  JSR GETbYTE
  10166.    BCC +
  10167.    RTS
  10168. +  CMP #CHRcr
  10169.    BNE +
  10170.    LDA #0
  10171.    LDY #0
  10172.    STA (LINEpTR),Y
  10173.    LDA #<GREPlINE
  10174.    LDY #>GREPlINE
  10175.    STA LINEpTR
  10176.    STY LINEpTR+1
  10177.    CLC
  10178.    RTS
  10179. +  LDX LINElEN+1
  10180.    CPX #>MAXlINElEN
  10181.    BCS -
  10182.    LDY #0
  10183.    STA (LINEpTR),Y
  10184.    INC LINEpTR
  10185.    BNE +
  10186.    INC LINEpTR+1
  10187. +  INC LINElEN
  10188.    BNE +
  10189.    INC LINElEN+1
  10190. +  JMP -
  10191.  
  10192. GETbYTE = *
  10193.    LDA BUFcOUNT
  10194.    ORA BUFcOUNT+1
  10195.    BEQ GETbYTEfILLbUF
  10196.    LDY #0
  10197.    LDA (BUFpTR),Y
  10198.    INC BUFpTR
  10199.    BNE +
  10200.    INC BUFpTR+1
  10201. +  LDX BUFcOUNT
  10202.    BNE +
  10203.    DEC BUFcOUNT+1
  10204. +  DEC BUFcOUNT
  10205.    CLC
  10206.    RTS
  10207.  
  10208. GETbYTEfILLbUF = *
  10209.    LDA #<GREPiNbUF
  10210.    LDY #>GREPiNbUF
  10211.    STA ZP
  10212.    STY ZP+1
  10213.    STA BUFpTR
  10214.    STY BUFpTR+1
  10215.    LDA INbUFlEN
  10216.    LDY INbUFlEN+1
  10217.    LDX INFILE
  10218.    JSR READ
  10219.    BEQ +
  10220.    BCS +
  10221.    STA BUFcOUNT
  10222.    STY BUFcOUNT+1
  10223.    JMP GETbYTE
  10224. +  SEC
  10225.    RTS
  10226.  
  10227. ;===THE END===
  10228. GREPbSS = *
  10229. GREPlINE = GREPbSS
  10230. GREPiNbUF  = GREPlINE+MAXlINElEN
  10231. INC.S
  10232. 20
  10233. .SEQ ACEHEAD.S
  10234. .ORG ACEaPPaDDRESS
  10235. .OBJ "@0:INC"
  10236.  
  10237. JMP MAIN
  10238. .ASC "Cb"
  10239.  
  10240. MAIN = *
  10241.    LDA #15
  10242.    LDX #255
  10243.    LDY #0
  10244. -  INC $D020
  10245.    INY
  10246.    BNE -
  10247.    DEX
  10248.    BNE -
  10249.    SEC
  10250.    SBC #1
  10251.    BCS -
  10252.    RTS
  10253. MEM.S
  10254. 190
  10255. .SEQ ACEHEAD.S
  10256. .ORG ACEaPPaDDRESS
  10257. .OBJ "@:MEM"
  10258. JMP MAIN
  10259. .ASC "Cb"
  10260.  
  10261. REP = 4
  10262.  
  10263. MAIN = *
  10264.    LDA #<PROCESSmSG
  10265.    LDY #>PROCESSmSG
  10266.    JSR PUTS
  10267.    LDA ACEpROCESSid
  10268.    ORA #$30
  10269.    JSR CHROUT
  10270.    LDA #13
  10271.    JSR CHROUT
  10272.    JSR PRINTfREEMAP
  10273.    JSR DISPLAYfREE
  10274.    JSR DISPLAYtpa
  10275.    RTS
  10276.  
  10277. PROCESSmSG = *
  10278.    .ASC "pROCESSid="
  10279.    .BYTE 0
  10280.  
  10281. DISPLAYfREE = *
  10282.    LDA #<FREEmSG
  10283.    LDY #>FREEmSG
  10284.    JSR PUTS
  10285.    LDA #<NUMBUF
  10286.    LDY #>NUMBUF
  10287.    STA SYSWORK+0
  10288.    STY SYSWORK+1
  10289.    LDA #10
  10290.    LDX #$40
  10291.    JSR UTOA
  10292.    LDX #0
  10293. -  LDA NUMBUF,X
  10294.    BEQ +
  10295.    JSR CHROUT
  10296.    INX
  10297.    BNE -
  10298. +  LDA #13
  10299.    JSR CHROUT
  10300.    RTS
  10301.  
  10302. FREEmSG = *
  10303.    .ASC "dYNAMIC fREE ="
  10304.    .BYTE 0
  10305.  
  10306. NUMBUF .BUF 12
  10307.  
  10308. DISPLAYtpa = *
  10309.    LDA #<TPAfREE
  10310.    LDY #>TPAfREE
  10311.    JSR PUTS
  10312.    LDA #<NUMBUF
  10313.    LDY #>NUMBUF
  10314.    STA SYSWORK+0
  10315.    STY SYSWORK+1
  10316.    LDA #0
  10317.    STA 6
  10318.    STA 7
  10319.    SEC
  10320.    LDA ACEsTACKpTR+0
  10321.    SBC #<ACEaPPaDDRESS
  10322.    STA 4
  10323.    LDA ACEsTACKpTR+1
  10324.    SBC #>ACEaPPaDDRESS
  10325.    STA 5
  10326.    LDA #10
  10327.    LDX #4
  10328.    JSR UTOA
  10329.    LDX #0
  10330. -  LDA NUMBUF,X
  10331.    BEQ +
  10332.    JSR CHROUT
  10333.    INX
  10334.    BNE -
  10335. +  LDA #13
  10336.    JSR CHROUT
  10337.    RTS
  10338.  
  10339. TPAfREE = *
  10340.    .ASC "pROGRAM fREE ="
  10341.    .BYTE 0
  10342.  
  10343. FREEMAP = 2
  10344.  
  10345. PRINTfREEMAP = *
  10346.    LDA ACErAM0fREEMAP+0
  10347.    LDY ACErAM0fREEMAP+1
  10348.    INY   ;FREEMAP
  10349.    STA FREEMAP+0
  10350.    STY FREEMAP+1
  10351.    LDY #0
  10352. -  LDX #"."
  10353.    LDA (FREEMAP),Y
  10354.    BEQ +
  10355.    LDX #"*"
  10356.    CMP #$FF
  10357.    BEQ +
  10358.    LDX #"#"
  10359.    CMP #$FE
  10360.    BEQ +
  10361.    LDX #"+"
  10362. +  TXA
  10363.    JSR CHROUT
  10364.    INY
  10365.    BNE -
  10366.    LDA #13
  10367.    JSR CHROUT
  10368.    LDX #3
  10369. -  LDA ACEfREEmEMORY,X
  10370.    STA $40,X
  10371.    DEX
  10372.    BPL -
  10373.    RTS
  10374.  
  10375. PRINTzP = *
  10376.    LDX #3
  10377. -  LDA ZP,X
  10378.    JSR PRINThEX
  10379.    DEX
  10380.    BPL -
  10381.    LDA #13
  10382.    JSR CHROUT
  10383.    RTS
  10384.  
  10385. PRINThEX = *
  10386.    PHA
  10387.    LSR
  10388.    LSR
  10389.    LSR
  10390.    LSR
  10391.    JSR PRINThEXIT
  10392.    PLA
  10393.    AND #$0F
  10394.  
  10395. PRINThEXIT = *
  10396.    ORA #$30
  10397.    CMP #$3A
  10398.    BCC +
  10399.    ADC #6
  10400. +  JSR CHROUT
  10401.    RTS
  10402.  
  10403. CHROUT = *
  10404.    STX SAVER+0
  10405.    STY SAVER+1
  10406.    STA CHAR
  10407.    LDA ZP
  10408.    PHA
  10409.    LDA ZP+1
  10410.    PHA
  10411.    LDA #<CHAR
  10412.    LDY #>CHAR
  10413.    STA ZP
  10414.    STY ZP+1
  10415.    LDA #1
  10416.    LDY #0
  10417.    LDX #1
  10418.    JSR WRITE
  10419.    PLA
  10420.    STA ZP+1
  10421.    PLA
  10422.    STA ZP
  10423.    LDA CHAR
  10424.    LDX SAVER+0
  10425.    LDY SAVER+1
  10426.    RTS
  10427. CHAR .BUF 1
  10428. SAVER .BUF 2
  10429.  
  10430. PUTS = *
  10431.    LDX #STDOUT
  10432. FPUTS = *
  10433.    STA ZP
  10434.    STY ZP+1
  10435.    LDY #$FF
  10436. -  INY
  10437.    LDA (ZP),Y
  10438.    BNE -
  10439.    TYA
  10440.    LDY #0
  10441.    JMP WRITE
  10442. EPUTS = *
  10443.    LDX #STDERR
  10444.    JMP FPUTS
  10445. MV.S
  10446. 223
  10447. ;*** MV (RENAME) PROGRAM
  10448.  
  10449. .SEQ ACEHEAD.S
  10450. .ORG ACEaPPaDDRESS
  10451. .OBJ "@0:MV"
  10452.  
  10453. JMP MAIN
  10454. .BYTE ACEid1,ACEid2,ACEid3
  10455.  
  10456. ;*** GLOBAL DECLARATIONS
  10457.  
  10458. CHRcr = $0D
  10459. CHRqUOTE = $22
  10460.  
  10461. ;******** STANDARD LIBRARY ********
  10462. PUTS = *
  10463.    LDX #STDOUT
  10464. FPUTS = *
  10465.    STA ZP+0
  10466.    STY ZP+1
  10467.    LDY #$FF
  10468. -  INY
  10469.    LDA (ZP),Y
  10470.    BNE -
  10471.    TYA
  10472.    LDY #0
  10473.    JMP WRITE
  10474. EPUTS = *
  10475.    LDX #STDERR
  10476.    JMP FPUTS
  10477.  
  10478. PUTCHAR = *
  10479.    LDX #STDOUT
  10480. PUTC = *
  10481.    STA PUTCbUFFER
  10482.    LDA #<PUTCbUFFER
  10483.    LDY #>PUTCbUFFER
  10484.    STA ZP+0
  10485.    STY ZP+1
  10486.    LDA #1
  10487.    LDY #0
  10488.    JMP WRITE
  10489.    PUTCbUFFER .BUF 1
  10490.  
  10491. GETCHAR = *
  10492.    LDX #STDIN
  10493. GETC = *
  10494.    LDA #<GETCbUFFER
  10495.    LDY #>GETCbUFFER
  10496.    STA ZP+0
  10497.    STY ZP+1
  10498.    LDA #1
  10499.    LDY #0
  10500.    JSR READ
  10501.    BEQ +
  10502.    LDA GETCbUFFER
  10503.    RTS
  10504. +  SEC
  10505.    RTS
  10506.    GETCbUFFER .BUF 1
  10507.  
  10508. GETARG = *
  10509.    STY ZP+1
  10510.    ASL
  10511.    STA ZP+0
  10512.    ROL ZP+1
  10513.    CLC
  10514.    LDA ACEaRGV
  10515.    ADC ZP+0
  10516.    STA ZP+0
  10517.    LDA ACEaRGV+1
  10518.    ADC ZP+1
  10519.    STA ZP+1
  10520.    LDY #0
  10521.    LDA (ZP),Y
  10522.    TAX
  10523.    INY
  10524.    LDA (ZP),Y
  10525.    STX ZP+0
  10526.    STA ZP+1
  10527.    RTS
  10528.  
  10529. ;===RENAME===
  10530.  
  10531. ARG = 2
  10532. OLDNAME = 4
  10533. NEWNAME = 6
  10534.  
  10535. MAIN = *
  10536.    ;** CHECK ARGUMENT COUNT
  10537.    LDA ACEaRGC+1
  10538.    BNE ENOUGHaRGS
  10539.    LDA ACEaRGC+0
  10540.    CMP #3
  10541.    BCS ENOUGHaRGS
  10542.  
  10543. USAGE = *
  10544.    LDA #<USAGEmSG
  10545.    LDY #>USAGEmSG
  10546.    JMP PUTS
  10547.  
  10548. USAGEmSG = *
  10549.    .ASC "uSAGE: MV OLDNAME NEWNAME ..."
  10550.    .BYTE CHRcr
  10551.    .ASC "       WHERE ... MEANS REPEAT NAMES IN OLD/NEW PAIRS"
  10552.    .BYTE CHRcr,0
  10553.  
  10554. ENOUGHaRGS = *
  10555.    LDA #1
  10556.    LDY #0
  10557.    STA ARG+0
  10558.    STY ARG+1
  10559.  
  10560.    MAINnEXT = *
  10561.    LDA ARG+0
  10562.    LDY ARG+1
  10563.    JSR GETARG
  10564.    LDA ZP+0
  10565.    LDY ZP+1
  10566.    STA OLDNAME+0
  10567.    STY OLDNAME+1
  10568.    ORA ZP+1
  10569.    BEQ MAINeXIT
  10570.    INC ARG+0
  10571.    BNE +
  10572.    INC ARG+1
  10573. +  LDA ARG+0
  10574.    LDY ARG+1
  10575.    JSR GETARG
  10576.    LDA ZP+0
  10577.    LDY ZP+1
  10578.    STA NEWNAME+0
  10579.    STY NEWNAME+1
  10580.    ORA ZP+1
  10581.    BEQ MAINeXIT
  10582.  
  10583.    JSR CHECKSTOP
  10584.    JSR ECHO
  10585.    LDA OLDNAME+0
  10586.    LDY OLDNAME+1
  10587.    STA ZP+0
  10588.    STY ZP+1
  10589.    LDA NEWNAME+0
  10590.    LDY NEWNAME+1
  10591.    STA ZW+0
  10592.    STY ZW+1
  10593.    JSR RENAME
  10594.    BCC +
  10595.    JSR ERROR
  10596. +  INC ARG+0
  10597.    BNE +
  10598.    INC ARG+1
  10599. +  JMP MAINnEXT
  10600.  
  10601. MAINeXIT = *
  10602.    RTS
  10603.  
  10604. CHECKSTOP = *
  10605.    JSR STOPKEY
  10606.    BCS +
  10607.    RTS
  10608. +  LDA #<STOPPEDmSG
  10609.    LDY #>STOPPEDmSG
  10610.    JSR EPUTS
  10611.    LDA #1
  10612.    LDX #0
  10613.    JMP EXIT
  10614.  
  10615.    STOPPEDmSG = *
  10616.    .ASC "<STOPPED>"
  10617.    .BYTE CHRcr,0
  10618.  
  10619. ERROR = *
  10620.    LDA #<ERRORmSG1
  10621.    LDY #>ERRORmSG1
  10622.    JSR EPUTS
  10623.    LDA OLDNAME+0
  10624.    LDY OLDNAME+1
  10625.    JSR EPUTS
  10626.    LDA #<ERRORmSG2
  10627.    LDY #>ERRORmSG2
  10628.    JMP EPUTS
  10629.  
  10630. ERRORmSG1 = *
  10631.    .ASC "eRROR ATTEMPTING TO RENAME "
  10632.    .BYTE CHRqUOTE,0
  10633.  
  10634. ERRORmSG2 = *
  10635.    .BYTE CHRqUOTE,CHRcr,0
  10636.  
  10637. ECHO = *
  10638.    LDA #<ECHOmSG1
  10639.    LDY #>ECHOmSG1
  10640.    JSR EPUTS
  10641.    LDA OLDNAME+0
  10642.    LDY OLDNAME+1
  10643.    JSR EPUTS
  10644.    LDA #<ECHOmSG2
  10645.    LDY #>ECHOmSG2
  10646.    JSR EPUTS
  10647.    LDA NEWNAME+0
  10648.    LDY NEWNAME+1
  10649.    JSR EPUTS
  10650.    LDA #<ECHOmSG3
  10651.    LDY #>ECHOmSG3
  10652.    JSR EPUTS
  10653.    RTS
  10654.  
  10655. ECHOmSG1 = *
  10656.    .ASC "rENAMING FILE "
  10657.    .BYTE CHRqUOTE,0
  10658.  
  10659. ECHOmSG2 = *
  10660.    .BYTE CHRqUOTE
  10661.    .ASC " TO "
  10662.    .BYTE CHRqUOTE,0
  10663.  
  10664. ECHOmSG3 = *
  10665.    .BYTE CHRqUOTE,CHRcr,0
  10666.  
  10667. ;===THE END===
  10668. BSS    = *
  10669. BSSeND = BSS+0
  10670. READ.S
  10671. 282
  10672. ;*** FILE READER PROGRAM
  10673.  
  10674. .SEQ ACEHEAD.S
  10675. .ORG ACEaPPaDDRESS
  10676. .OBJ "@:READ"
  10677.  
  10678. JMP CRCmAIN
  10679. .ASC "Cb"
  10680.  
  10681. ;*** GLOBAL DECLARATIONS
  10682.  
  10683. LIBWORK = $40
  10684.  
  10685. CHRcr = $0D
  10686. CHRqUOTE = $22
  10687.  
  10688. ;******** STANDARD LIBRARY ********
  10689. PUTS = *
  10690.    LDX #STDOUT
  10691. FPUTS = *
  10692.    STA ZP
  10693.    STY ZP+1
  10694.    LDY #$FF
  10695. -  INY
  10696.    LDA (ZP),Y
  10697.    BNE -
  10698.    TYA
  10699.    LDY #0
  10700.    JMP WRITE
  10701. EPUTS = *
  10702.    LDX #STDERR
  10703.    JMP FPUTS
  10704.  
  10705. PUTCHAR = *
  10706.    LDX #STDOUT
  10707. PUTC = *
  10708.    STA PUTCbUFFER
  10709.    LDA #<PUTCbUFFER
  10710.    LDY #>PUTCbUFFER
  10711.    STA ZP
  10712.    STY ZP+1
  10713.    LDA #1
  10714.    LDY #0
  10715.    JMP WRITE
  10716.    PUTCbUFFER .BUF 1
  10717.  
  10718. GETCHAR = *
  10719.    LDX #STDIN
  10720. GETC = *
  10721.    LDA #<GETCbUFFER
  10722.    LDY #>GETCbUFFER
  10723.    STA ZP
  10724.    STY ZP+1
  10725.    LDA #1
  10726.    LDY #0
  10727.    JSR READ
  10728.    BEQ +
  10729.    LDA GETCbUFFER
  10730.    RTS
  10731. +  SEC
  10732.    RTS
  10733.    GETCbUFFER .BUF 1
  10734.  
  10735. GETARG = *
  10736.    STY ZP+1
  10737.    ASL
  10738.    STA ZP
  10739.    ROL ZP+1
  10740.    CLC
  10741.    LDA ACEaRGV
  10742.    ADC ZP
  10743.    STA ZP
  10744.    LDA ACEaRGV+1
  10745.    ADC ZP+1
  10746.    STA ZP+1
  10747.    LDY #0
  10748.    LDA (ZP),Y
  10749.    TAX
  10750.    INY
  10751.    LDA (ZP),Y
  10752.    STX ZP
  10753.    STA ZP+1
  10754.    RTS
  10755.  
  10756. ITOAbIN = LIBWORK       ;(4)
  10757. ITOAbCD = LIBWORK+4     ;(5)
  10758. ITOAfLAG = LIBWORK+9    ;(1)
  10759. ITOAnUMBER .BUF 11
  10760. ITOA = *  ;( .x=NUMzPADDR ) : ITOAnUMBER
  10761.    LDY #0
  10762. -  LDA 0,X
  10763.    STA ITOAbIN,Y
  10764.    INX
  10765.    INY
  10766.    CPY #4
  10767.    BCC -
  10768.    LDX #5
  10769.    LDA #0
  10770. -  STA ITOAbCD,X   ;ZEROS "ITOAfLAG" TOO
  10771.    DEX
  10772.    BPL -
  10773.    LDY #32
  10774.    SEI
  10775.    SED
  10776.  
  10777.    ITOAnEXTbIT = *
  10778.    ASL ITOAbIN+0
  10779.    ROL ITOAbIN+1
  10780.    ROL ITOAbIN+2
  10781.    ROL ITOAbIN+3
  10782.    LDX #4
  10783. -  LDA ITOAbCD,X
  10784.    ADC ITOAbCD,X
  10785.    STA ITOAbCD,X
  10786.    DEX
  10787.    BPL -
  10788.    DEY
  10789.    BNE ITOAnEXTbIT
  10790.    CLD
  10791.    CLI
  10792.    LDX #0
  10793.    LDY #0
  10794. -  LDA ITOAbCD,X
  10795.    JSR ITOApUThEX
  10796.    INX
  10797.    CPX #5
  10798.    BCC -
  10799.    LDA #0
  10800.    STA ITOAnUMBER,Y
  10801.    RTS
  10802.  
  10803.    ITOApUThEX = *
  10804.    PHA
  10805.    LSR
  10806.    LSR
  10807.    LSR
  10808.    LSR
  10809.    JSR ITOApUTdIGIT
  10810.    PLA
  10811.    AND #$0F
  10812.  
  10813.    ITOApUTdIGIT = *
  10814.    CMP ITOAfLAG
  10815.    BNE +
  10816.    CPY #7
  10817.    BCS +
  10818.    LDA #$20
  10819.    BNE ITOApOKE
  10820. +  ORA #$30
  10821.    STA ITOAfLAG
  10822.  
  10823.    ITOApOKE = *
  10824.    STA ITOAnUMBER,Y
  10825.    INY
  10826.    RTS
  10827.  
  10828. ;===CRC32===
  10829. CRCaRG = 2
  10830. CRCnAME = 4
  10831. INbUFlEN = 6
  10832.  
  10833. CRCmAIN = *
  10834.    ;** CHECK ARGUMENT COUNT
  10835.    LDA ACEaRGC+1
  10836.    BNE CRCeNOUGHaRGS
  10837.    LDA ACEaRGC
  10838.    CMP #2
  10839.    BCS CRCeNOUGHaRGS
  10840.  
  10841. CRCuSAGE = *
  10842.    LDA #<CRCuSAGEmSG
  10843.    LDY #>CRCuSAGEmSG
  10844.    JMP EPUTS
  10845.  
  10846. CRCuSAGEmSG = *
  10847.    .ASC "USAGE: READ FILE1 FILE2 ... FILEn"
  10848.    .BYTE CHRcr
  10849.    .BYTE 0
  10850.  
  10851. CRCeNOUGHaRGS = *
  10852.    ;** GET INPUT BUFFER LENGTH
  10853.    SEC
  10854.    LDA ACEsTACKpTR
  10855.    SBC #<CRCiNbUF
  10856.    STA INbUFlEN
  10857.    LDA ACEsTACKpTR+1
  10858.    SBC #>CRCiNbUF
  10859.    STA INbUFlEN+1
  10860.    ;** MAIN LOOP
  10861.    LDA #1
  10862.    LDY #0
  10863.    STA CRCaRG
  10864.    STY CRCaRG+1
  10865. -  JSR STOPKEY
  10866.    BCS CRCsTOPPED
  10867.    LDA CRCaRG
  10868.    LDY CRCaRG+1
  10869.    JSR GETARG
  10870.    LDA ZP
  10871.    LDY ZP+1
  10872.    STA CRCnAME
  10873.    STY CRCnAME+1
  10874.    ORA ZP+1
  10875.    BEQ CRCeXIT
  10876.    JSR DOrEAD
  10877.    BCC +
  10878.    JSR CRCeRROR
  10879. +  INC CRCaRG
  10880.    BNE +
  10881.    INC CRCaRG+1
  10882. +  JMP -
  10883.  
  10884. CRCeXIT = *
  10885.    RTS
  10886.  
  10887. CRCsTOPPED = *
  10888.    LDA #<STOPPEDmSG
  10889.    LDY #>STOPPEDmSG
  10890.    JSR EPUTS
  10891.    RTS
  10892.    STOPPEDmSG = *
  10893.    .ASC "<sTOPPED>"
  10894.    .BYTE CHRcr,0
  10895.  
  10896. CRCeRROR = *
  10897.    LDA #<CRCeRRORmSG1
  10898.    LDY #>CRCeRRORmSG1
  10899.    JSR EPUTS
  10900.    LDA CRCnAME
  10901.    LDY CRCnAME+1
  10902.    JSR EPUTS
  10903.    LDA #<CRCeRRORmSG2
  10904.    LDY #>CRCeRRORmSG2
  10905.    JMP EPUTS
  10906.  
  10907. CRCeRRORmSG1 = *
  10908.    .ASC "eRROR READING FILE "
  10909.    .BYTE CHRqUOTE,0
  10910.  
  10911. CRCeRRORmSG2 = *
  10912.    .BYTE CHRqUOTE,CHRcr,0
  10913.  
  10914. BUFpTR = 8
  10915. BUFcOUNT = 10
  10916. INFILE = 12
  10917.  
  10918. DOrEAD = *
  10919.    ;** OPEN FILE
  10920.    LDA CRCnAME
  10921.    LDY CRCnAME+1
  10922.    STA ZP
  10923.    STY ZP+1
  10924.    LDA #"R"
  10925.    JSR OPEN
  10926.    BCC +
  10927.    RTS
  10928. +  STA INFILE
  10929.    ;** READ FILE
  10930.    JSR READbODY
  10931.    ;** CLOSE FILE
  10932.    LDA INFILE
  10933.    JSR CLOSE
  10934.    RTS
  10935.  
  10936. READbODY = *
  10937.    LDA #<CRCiNbUF
  10938.    LDY #>CRCiNbUF
  10939.    STA ZP
  10940.    STY ZP+1
  10941.    LDA INbUFlEN+0
  10942.    LDY INbUFlEN+1
  10943.    LDX INFILE
  10944.    JSR READ
  10945.    BEQ +
  10946.    BCS +
  10947.    JMP READbODY
  10948. +  SEC
  10949.    RTS
  10950.  
  10951. ;===THE END===
  10952. CRCbSS = *
  10953. CRCiNbUF  = CRCbSS
  10954. RM.S
  10955. 190
  10956. ;*** RM PROGRAM
  10957.  
  10958. .SEQ ACEHEAD.S
  10959. .ORG ACEaPPaDDRESS
  10960. .OBJ "@0:RM"
  10961.  
  10962. JMP REMOVEmAIN
  10963. .ASC "Cb"
  10964.  
  10965. ;*** GLOBAL DECLARATIONS
  10966.  
  10967. LIBWORK = $60
  10968.  
  10969. CHRcr = $0D
  10970. CHRqUOTE = $22
  10971.  
  10972. ;******** STANDARD LIBRARY ********
  10973. PUTS = *
  10974.    LDX #STDOUT
  10975. FPUTS = *
  10976.    STA ZP
  10977.    STY ZP+1
  10978.    LDY #$FF
  10979. -  INY
  10980.    LDA (ZP),Y
  10981.    BNE -
  10982.    TYA
  10983.    LDY #0
  10984.    JMP WRITE
  10985. EPUTS = *
  10986.    LDX #STDERR
  10987.    JMP FPUTS
  10988.  
  10989. PUTCHAR = *
  10990.    LDX #STDOUT
  10991. PUTC = *
  10992.    STA PUTCbUFFER
  10993.    LDA #<PUTCbUFFER
  10994.    LDY #>PUTCbUFFER
  10995.    STA ZP
  10996.    STY ZP+1
  10997.    LDA #1
  10998.    LDY #0
  10999.    JMP WRITE
  11000.    PUTCbUFFER .BUF 1
  11001.  
  11002. GETCHAR = *
  11003.    LDX #STDIN
  11004. GETC = *
  11005.    LDA #<GETCbUFFER
  11006.    LDY #>GETCbUFFER
  11007.    STA ZP
  11008.    STY ZP+1
  11009.    LDA #1
  11010.    LDY #0
  11011.    JSR READ
  11012.    BEQ +
  11013.    LDA GETCbUFFER
  11014.    RTS
  11015. +  SEC
  11016.    RTS
  11017.    GETCbUFFER .BUF 1
  11018.  
  11019. ;===REMOVE LIBRARY===
  11020. GETARG = *
  11021.    STY ZP+1
  11022.    ASL
  11023.    STA ZP
  11024.    ROL ZP+1
  11025.    CLC
  11026.    LDA ACEaRGV
  11027.    ADC ZP
  11028.    STA ZP
  11029.    LDA ACEaRGV+1
  11030.    ADC ZP+1
  11031.    STA ZP+1
  11032.    LDY #0
  11033.    LDA (ZP),Y
  11034.    TAX
  11035.    INY
  11036.    LDA (ZP),Y
  11037.    STX ZP
  11038.    STA ZP+1
  11039.    RTS
  11040.  
  11041. ;===REMOVE===
  11042. RMaRG = 2
  11043. RMnAME = 4
  11044.  
  11045. REMOVEmAIN = *
  11046.    ;** CHECK ARGUMENT COUNT
  11047.    LDA ACEaRGC+1
  11048.    BNE RMeNOUGHaRGS
  11049.    LDA ACEaRGC
  11050.    CMP #2
  11051.    BCS RMeNOUGHaRGS
  11052.  
  11053. RMuSAGE = *
  11054.    LDA #<RMuSAGEmSG
  11055.    LDY #>RMuSAGEmSG
  11056.    JMP PUTS
  11057.  
  11058. RMuSAGEmSG = *
  11059.    .ASC "uSAGE: RM FILE1 FILE2 ... FILEn"
  11060.    .BYTE CHRcr
  11061.    .BYTE 0
  11062.  
  11063. RMeNOUGHaRGS = *
  11064.    LDA #1
  11065.    LDY #0
  11066.    STA RMaRG
  11067.    STY RMaRG+1
  11068. -  LDA RMaRG
  11069.    LDY RMaRG+1
  11070.    JSR GETARG
  11071.    LDA ZP
  11072.    LDY ZP+1
  11073.    STA RMnAME
  11074.    STY RMnAME+1
  11075.    ORA ZP+1
  11076.    BEQ RMeXIT
  11077.    JSR STOPKEY
  11078.    BCS STOPPED
  11079.    JSR RMeCHO
  11080.    LDA RMnAME
  11081.    LDY RMnAME+1
  11082.    STA ZP
  11083.    STY ZP+1
  11084.    JSR REMOVE
  11085.    BCC +
  11086.    JSR RMeRROR
  11087. +  INC RMaRG
  11088.    BNE +
  11089.    INC RMaRG+1
  11090. +  JMP -
  11091.  
  11092. RMeXIT = *
  11093.    RTS
  11094.  
  11095. STOPPED = *
  11096.    LDA #<STOPPEDmSG
  11097.    LDY #>STOPPEDmSG
  11098.    JMP EPUTS
  11099.    STOPPEDmSG = *
  11100.    .ASC "<STOPPED>"
  11101.    .BYTE CHRcr,0
  11102.  
  11103. RMeRROR = *
  11104.    LDA #<RMeRRORmSG1
  11105.    LDY #>RMeRRORmSG1
  11106.    JSR EPUTS
  11107.    LDA RMnAME
  11108.    LDY RMnAME+1
  11109.    JSR EPUTS
  11110.    LDA #<RMeRRORmSG2
  11111.    LDY #>RMeRRORmSG2
  11112.    JMP EPUTS
  11113.  
  11114. RMeRRORmSG1 = *
  11115.    .ASC "eRROR ATTEMPTING TO REMOVE "
  11116.    .BYTE CHRqUOTE
  11117.    .BYTE 0
  11118.  
  11119. RMeRRORmSG2 = *
  11120.    .BYTE CHRqUOTE
  11121.    .BYTE CHRcr
  11122.    .BYTE 0
  11123.  
  11124. RMeCHO = *
  11125.    LDA #<RMeCHOmSG1
  11126.    LDY #>RMeCHOmSG1
  11127.    JSR EPUTS
  11128.    LDA RMnAME
  11129.    LDY RMnAME+1
  11130.    JSR EPUTS
  11131.    LDA #<RMeCHOmSG2
  11132.    LDY #>RMeCHOmSG2
  11133.    JMP EPUTS
  11134.  
  11135. RMeCHOmSG1 = *
  11136.    .ASC "rEMOVING FILE "
  11137.    .BYTE CHRqUOTE,0
  11138.  
  11139. RMeCHOmSG2 = *
  11140.    .BYTE CHRqUOTE
  11141.    .ASC "..."
  11142.    .BYTE CHRcr,0
  11143.  
  11144. ;===THE END===
  11145. RMeND = *
  11146. SH.S
  11147. 1674
  11148. ;ace COMMAND SHELL BY cRAIG bRUCE
  11149.  
  11150. .SEQ ACEHEAD.S
  11151. .ORG ACEsHELLaDDRESS
  11152. .OBJ "@0:SH"
  11153.  
  11154. JMP MAIN
  11155. .BYTE "S","h",ACEid3
  11156.  
  11157. LIBWORK = $60
  11158. CHRcr = 13
  11159. CHRqUOTE = 34
  11160. CHRtAB = 9
  11161.  
  11162. SHELLrEDIRECTsTDIN  .BUF 1
  11163. SHELLrEDIRECTsTDOUT .BUF 1
  11164. SHELLrEDIRECTsTDERR .BUF 1
  11165. PARSEaRGC .BUF 2
  11166. SHELLeXITfLAG .BUF 1
  11167. SHELLpROMPTfLAG .BUF 1
  11168. CHECKpROMPTfLAG .BUF 1
  11169. SUPPRESSpROMPTfLAG .BUF 1
  11170. ABORTcOMMANDfLAG .BUF 1
  11171. REGSAVE .BUF 3
  11172.  
  11173. ;******** STANDARD LIBRARY ********
  11174. EPUTS = *
  11175.    LDX #STDERR
  11176.    JMP FPUTS
  11177. PUTS = *
  11178.    LDX #STDOUT
  11179. FPUTS = *
  11180.    STA ZP+0
  11181.    STY ZP+1
  11182.    LDY #$FF
  11183. -  INY
  11184.    LDA (ZP),Y
  11185.    BNE -
  11186.    TYA
  11187.    LDY #0
  11188.    JMP WRITE
  11189.  
  11190. PUTCHAR = *
  11191.    LDX #STDOUT
  11192. PUTC = *
  11193.    STA PUTCbUFFER
  11194.    LDA #<PUTCbUFFER
  11195.    LDY #>PUTCbUFFER
  11196.    STA ZP+0
  11197.    STY ZP+1
  11198.    LDA #1
  11199.    LDY #0
  11200.    JMP WRITE
  11201.    PUTCbUFFER .BUF 1
  11202.  
  11203. GETCHAR = *
  11204.    LDX #STDIN
  11205. GETC = *
  11206.    LDA #<GETCbUFFER
  11207.    LDY #>GETCbUFFER
  11208.    STA ZP+0
  11209.    STY ZP+1
  11210.    LDA #1
  11211.    LDY #0
  11212.    JSR READ
  11213.    BEQ +
  11214.    LDA GETCbUFFER
  11215.    RTS
  11216. +  SEC
  11217.    RTS
  11218.    GETCbUFFER .BUF 1
  11219.  
  11220. CLS = *
  11221.    LDA #147
  11222.    JMP PUTCHAR
  11223.  
  11224. ITOAbIN = LIBWORK
  11225. ITOAnUMBER .BUF 11
  11226. ITOA = *
  11227.    JSR ITOApREPARE
  11228.    JMP UTOA
  11229. ITOAsTRIP = *
  11230.    JSR ITOApREPARE
  11231.    LDA #1
  11232.    JMP UTOA
  11233. ITOApREPARE = *
  11234.    STA ITOAbIN+0
  11235.    STY ITOAbIN+1
  11236.    STX ITOAbIN+2
  11237.    LDA #0
  11238.    STA ITOAbIN+3
  11239.    LDA #<ITOAnUMBER
  11240.    LDY #>ITOAnUMBER
  11241.    STA SYSWORK+0
  11242.    STY SYSWORK+1
  11243.    LDA #8
  11244.    LDX #ITOAbIN
  11245.    RTS
  11246.  
  11247. ZSP = LIBWORK
  11248.  
  11249. PUSHay = *
  11250.    TAX
  11251.    SEC
  11252.    LDA ACEsTACKpTR+0
  11253.    SBC #2
  11254.    STA ACEsTACKpTR+0
  11255.    STA ZSP
  11256.    LDA ACEsTACKpTR+1
  11257.    SBC #0
  11258.    STA ACEsTACKpTR+1
  11259.    STA ZSP+1
  11260.    TYA
  11261.    LDY #1
  11262.    STA (ZSP),Y
  11263.    DEY
  11264.    TXA
  11265.    STA (ZSP),Y
  11266.    RTS
  11267.  
  11268. ;******** SHELL ********
  11269. ;cOMsHELL
  11270.  
  11271. MAIN = *
  11272.    LDA #<SHELLtITLE
  11273.    LDY #>SHELLtITLE
  11274.    JSR PUTS
  11275.    JMP SHELL
  11276.  
  11277. SHELLtITLE .ASC "ace sHELL VERS 0.54.00 - csb 25-nOV-93"
  11278.            .BYTE CHRcr,CHRcr
  11279.            .BYTE 0
  11280.  
  11281. SHELL = *
  11282.    LDA #$FF
  11283.    STA CHECKpROMPTfLAG
  11284.    STA SHELLrEDIRECTsTDIN
  11285.    STA SHELLrEDIRECTsTDOUT
  11286.    STA SHELLrEDIRECTsTDERR
  11287.    LDA #0
  11288.    STA SUPPRESSpROMPTfLAG
  11289.  
  11290.    GETcOMMAND = *
  11291.    LDA #0
  11292.    STA ABORTcOMMANDfLAG
  11293.    LDA CHECKpROMPTfLAG
  11294.    BEQ +
  11295.    JSR SHELLcHECKpROMPTABILITY
  11296. +  LDA SHELLpROMPTfLAG
  11297.    BEQ +
  11298.    LDA SUPPRESSpROMPTfLAG
  11299.    BNE +
  11300.    LDA #"["
  11301.    LDX #STDERR
  11302.    JSR PUTC
  11303.    LDA ACEcURdIRnAME+0
  11304.    LDY ACEcURdIRnAME+1
  11305.    JSR EPUTS
  11306.    LDA #<SHELLrEADY2
  11307.    LDY #>SHELLrEADY2
  11308.    JSR EPUTS
  11309. +  LDA #0
  11310.    STA SUPPRESSpROMPTfLAG
  11311.    STA SHELLeXITfLAG
  11312.    JSR SHELLgETaRGS
  11313.    BCS SHELLfINISH
  11314.    LDA PARSEaRGC+0
  11315.    ORA PARSEaRGC+1
  11316.    BEQ +
  11317.    LDA ABORTcOMMANDfLAG
  11318.    BNE +
  11319.    JSR SETUPrEDIRECTS
  11320.    JSR SHELLcONSTRUCTfRAME
  11321.    JSR SHELLeXECcOMMAND
  11322.    JSR SHELLrEMOVEfRAME
  11323.    JSR UNSETrEDIRECTS
  11324. +  JSR CLOSErEDIRECTS
  11325.    BIT SHELLeXITfLAG
  11326.    BMI SHELLfINISH
  11327.    JMP GETcOMMAND
  11328.  
  11329.    SHELLfINISH = *
  11330.    RTS
  11331.  
  11332. SHELLrEADY2 .ASC "] "
  11333.             .BYTE 0
  11334.  
  11335. SHELLcHECKpROMPTABILITY = *
  11336.    LDX #0
  11337.    JSR DEVINFO
  11338.    LDX #$FF
  11339.    CMP #0
  11340.    BEQ +
  11341.    LDX #0
  11342. +  STX SHELLpROMPTfLAG
  11343.    LDA #0
  11344.    STA CHECKpROMPTfLAG
  11345.    RTS
  11346.  
  11347. ;=== COMMAND PARSING ===
  11348.  
  11349. ARGpTR = $02
  11350. ARGqUOTE = $03
  11351. ARGwASqUOTED = $04
  11352.  
  11353. SHELLgETaRGS = *
  11354.    LDA #0
  11355.    STA PARSEaRGC+0
  11356.    STA PARSEaRGC+1
  11357.  
  11358.    NEWARG = *
  11359.    JSR GETCHAR
  11360.    BCC +
  11361.    JMP ARGeOF
  11362. +  CMP #" "
  11363.    BEQ NEWARG
  11364.    CMP #CHRtAB
  11365.    BEQ NEWARG
  11366.    CMP #CHRcr
  11367.    BNE +
  11368.    JMP ARGeNDoFlINE
  11369. +  CMP #";"
  11370.    BNE +
  11371.    LDA #$FF
  11372.    STA SUPPRESSpROMPTfLAG
  11373.    JMP ARGeNDoFlINE
  11374. +  LDX #0
  11375.    STX ARGpTR
  11376.    STX ARGwASqUOTED
  11377.  
  11378.    ARGnEWqUOTE = *
  11379.    LDX #0
  11380.    STX ARGqUOTE
  11381.    CMP #$22
  11382.    BEQ ARGsTARTqUOTE
  11383.    CMP #"'"
  11384.    BNE +
  11385.    ARGsTARTqUOTE = *
  11386.    STA ARGqUOTE
  11387.    STA ARGwASqUOTED
  11388.    JMP ARGnEXTcHAR
  11389.  
  11390. +  LDX ARGpTR
  11391.    STA ARGbUFFER,X
  11392.    INC ARGpTR
  11393.  
  11394.    ARGnEXTcHAR = *
  11395.    JSR GETCHAR
  11396.    BCS ARGeOF
  11397.    LDX ARGqUOTE
  11398.    BNE ARGqUOTEmODE
  11399.    CMP #" "
  11400.    BEQ ARGpROCESS
  11401.    CMP #CHRtAB
  11402.    BEQ ARGpROCESS
  11403. -  CMP #";"
  11404.    BNE +
  11405.    LDX ARGwASqUOTED
  11406.    BNE +
  11407.    LDA #$FF
  11408.    STA SUPPRESSpROMPTfLAG
  11409.    LDA #CHRcr
  11410. +  CMP #CHRcr
  11411.    BEQ ARGpROCESS
  11412.    LDX ARGpTR
  11413.    STA ARGbUFFER,X
  11414.    INC ARGpTR
  11415.    JMP ARGnEXTcHAR
  11416.  
  11417.    ARGqUOTEmODE = *
  11418.    CMP #0
  11419.    BEQ -
  11420.    CMP ARGqUOTE
  11421.    BNE -
  11422.    JSR GETCHAR
  11423.    BCS ARGeOF
  11424.    CMP #" "
  11425.    BEQ ARGpROCESS
  11426.    CMP #CHRtAB
  11427.    BEQ ARGpROCESS
  11428.    CMP #CHRcr
  11429.    BEQ ARGpROCESS
  11430.    JMP ARGnEWqUOTE
  11431.  
  11432.    ARGpROCESS = *
  11433.    PHA
  11434.    LDX ARGpTR
  11435.    LDA #0
  11436.    STA ARGbUFFER,X
  11437.    JSR SHELLhANDLEaRG
  11438.    PLA
  11439.    CMP #CHRcr
  11440.    BEQ ARGeNDoFlINE
  11441.    JMP NEWARG
  11442.    ARGeNDoFlINE = *
  11443.    CLC
  11444.    ARGeOF = *
  11445.    RTS
  11446.  
  11447. SHELLhANDLEaRG = *
  11448.    LDA ABORTcOMMANDfLAG
  11449.    BEQ +
  11450.    RTS
  11451. +  LDA ARGwASqUOTED
  11452.    BNE +
  11453.    LDX #STDIN
  11454.    LDY #"R"
  11455.    LDA ARGbUFFER
  11456.    CMP #"<"
  11457.    BEQ SHELLhANDLErEDIRECT
  11458.    LDX #STDOUT
  11459.    LDY #"W"
  11460.    CMP #">"
  11461.    BEQ SHELLhANDLErEDIRECT
  11462.    JSR CHECKwILDCARDS
  11463.    BCC +
  11464.    RTS
  11465. +  JSR SHELLsTOREaRG
  11466.    RTS
  11467.  
  11468. SHELLsTOREaRG = *
  11469.    LDA ACEsTACKpTR+0
  11470.    LDY ACEsTACKpTR+1
  11471.    CLC
  11472.    SBC ARGpTR
  11473.    BCS +
  11474.    DEY
  11475. +  STA ACEsTACKpTR+0
  11476.    STY ACEsTACKpTR+1
  11477.    STA ZP+0
  11478.    STY ZP+1
  11479.    LDY #0
  11480. -  LDA ARGbUFFER,Y
  11481.    STA (ZP),Y
  11482.    BEQ +
  11483.    INY
  11484.    BNE -
  11485. +  LDA PARSEaRGC+1
  11486.    STA ZP+1
  11487.    LDA PARSEaRGC+0
  11488.    ASL
  11489.    ROL ZP+1
  11490.    CLC
  11491.    ADC #<ARGaRGVbUFFER
  11492.    STA ZP+0
  11493.    LDA ZP+1
  11494.    ADC #>ARGaRGVbUFFER
  11495.    STA ZP+1
  11496.    LDY #0
  11497.    LDA ACEsTACKpTR+0
  11498.    STA (ZP),Y
  11499.    INY
  11500.    LDA ACEsTACKpTR+1
  11501.    STA (ZP),Y
  11502.    INC PARSEaRGC+0
  11503.    BNE +
  11504.    INC PARSEaRGC+1
  11505. +  RTS
  11506.  
  11507. SHELLhANDLErEDIRECT = *   ;( .x=FD, .y=MODE )
  11508.    LDA #<ARGbUFFER+1
  11509.    STA ZP
  11510.    LDA #>ARGbUFFER+1
  11511.    STA ZP+1
  11512.    LDA ARGbUFFER+1
  11513.    CMP #">"
  11514.    BNE +
  11515.    JSR SHELLrEDIRiNC
  11516.    LDY #"A"
  11517.    LDA ARGbUFFER+2
  11518. +  CMP #"!"
  11519.    BNE +
  11520. -  LDX #STDERR
  11521.    JSR SHELLrEDIRiNC
  11522.    LDA #0
  11523. +  CMP #"&"
  11524.    BEQ -
  11525.    LDA SHELLrEDIRECTsTDIN,X
  11526.    CMP #255
  11527.    BNE REDIRECTmULTIeRROR
  11528.    TYA
  11529.    STX CMDbUFFER
  11530.    STA REGSAVE
  11531. -  JSR OPEN
  11532.    BCC ++
  11533.    LDA ERRNO
  11534.    CMP #ACEeRRfILEeXISTS
  11535.    BNE +
  11536.    JSR REMOVE
  11537.    BCS REDIRECTeRROR
  11538.    LDA REGSAVE
  11539.    JMP -
  11540. +  CMP #ACEeRRfILEnOTfOUND
  11541.    BNE REDIRECTeRROR
  11542.    LDA REGSAVE
  11543.    CMP #"A"
  11544.    BNE REDIRECTeRROR
  11545.    LDA #"W"
  11546.    STA REGSAVE
  11547.    JMP -
  11548. +  LDX CMDbUFFER
  11549.    STA SHELLrEDIRECTsTDIN,X
  11550.    RTS
  11551.  
  11552. REDIRECTeRROR = *
  11553.    LDA #<REDIRECTeRRORmSG
  11554.    LDY #>REDIRECTeRRORmSG
  11555. REDIRECTeRRORwMSG = *
  11556.    PHA
  11557.    TYA
  11558.    PHA
  11559.    LDA #$FF
  11560.    STA ABORTcOMMANDfLAG
  11561.    LDA ZP+0
  11562.    LDY ZP+1
  11563.    JSR EPUTS
  11564.    PLA
  11565.    TAY
  11566.    PLA
  11567.    JSR EPUTS
  11568.    RTS
  11569.  
  11570.    REDIRECTeRRORmSG = *
  11571.    .ASC ": eRROR OPENING REDIRECTION FILE."
  11572.    .BYTE CHRcr,0
  11573.  
  11574. REDIRECTmULTIeRROR = *
  11575.    LDA #<REDIRECTmULTIeRRORmSG
  11576.    LDY #>REDIRECTmULTIeRRORmSG
  11577.    JMP REDIRECTeRRORwMSG
  11578.  
  11579.    REDIRECTmULTIeRRORmSG = *
  11580.    .ASC ": eRROR - mULTIPLE REDIRECTIONS OF SAME STREAM."
  11581.    .BYTE CHRcr,0
  11582.  
  11583. SHELLrEDIRiNC = *
  11584.    INC ZP+0
  11585.    BNE +
  11586.    INC ZP+1
  11587. +  RTS
  11588.  
  11589. SHELLsETUPrED = 2
  11590.  
  11591. SETUPrEDIRECTS = *
  11592. UNSETrEDIRECTS = *
  11593.    LDX #0
  11594.    STX SHELLsETUPrED
  11595. -  LDA SHELLrEDIRECTsTDIN,X
  11596.    CMP #255
  11597.    BEQ +
  11598.    TAY
  11599.    JSR FCBSWAP
  11600. +  INC SHELLsETUPrED
  11601.    LDX SHELLsETUPrED
  11602.    CPX #3
  11603.    BCC -
  11604.    RTS
  11605.  
  11606. SHELLcLOSErED = 2
  11607.  
  11608. CLOSErEDIRECTS = *
  11609.    LDX #0
  11610.    STX SHELLcLOSErED
  11611. -  LDA SHELLrEDIRECTsTDIN,X
  11612.    CMP #$FF
  11613.    BEQ +
  11614.    JSR CLOSE
  11615.    LDX SHELLcLOSErED
  11616.    LDA #$FF
  11617.    STA SHELLrEDIRECTsTDIN,X
  11618. +  INC SHELLcLOSErED
  11619.    LDX SHELLcLOSErED
  11620.    CPX #3
  11621.    BCC -
  11622.    RTS
  11623.  
  11624. WILDpREFIX = 10
  11625. WILDsUFFIX = 11
  11626.  
  11627. CHECKwILDCARDS = *
  11628.    LDA #255
  11629.    STA WILDpREFIX
  11630.    STA WILDsUFFIX
  11631.    LDX ARGpTR
  11632. -  DEX
  11633.    CPX #255
  11634.    BEQ +
  11635.    LDA ARGbUFFER,X
  11636.    CMP #":"
  11637.    BEQ +
  11638.    CMP #"*"
  11639.    BNE -
  11640.    LDY WILDsUFFIX
  11641.    CPY #255
  11642.    BNE -
  11643.    STX WILDsUFFIX
  11644.    INC WILDsUFFIX
  11645.    JMP -
  11646. +  INX
  11647.    STX WILDpREFIX
  11648.    LDA WILDsUFFIX
  11649.    CMP #255
  11650.    BNE +
  11651.    CLC
  11652.    RTS
  11653. +  JSR HANDLEwILDCARDS
  11654.    SEC
  11655.    RTS
  11656.  
  11657. WILDlENGTH = 12
  11658. WILDsUFFIXlENGTH = 13
  11659. WILDfCB = 14
  11660. WILDmATCH = 15
  11661.  
  11662. HANDLEwILDCARDS = *
  11663.    LDA #0
  11664.    STA WILDmATCH
  11665.    LDX ARGpTR
  11666.    INX
  11667. -  DEX
  11668.    LDA ARGbUFFER,X
  11669.    STA CMDbUFFER+1,X
  11670.    CPX WILDpREFIX
  11671.    BNE -
  11672.    LDA #0
  11673.    STA CMDbUFFER,X
  11674.    STA ARGbUFFER,X
  11675.    LDX WILDsUFFIX
  11676.    STA CMDbUFFER,X
  11677.    INC WILDpREFIX
  11678.    INC WILDsUFFIX
  11679.    LDX #0
  11680. -  LDA ARGbUFFER,X
  11681.    BEQ +
  11682.    STA CMDbUFFER,X
  11683.    INX
  11684.    BNE -
  11685. +  SEC
  11686.    LDA ARGpTR
  11687.    SBC WILDsUFFIX
  11688.    STA WILDsUFFIXlENGTH
  11689.    INC WILDsUFFIXlENGTH
  11690.    SEC
  11691.    LDA ARGpTR
  11692.    SBC WILDpREFIX
  11693.    STA WILDlENGTH
  11694.  
  11695.    LDA #<CMDbUFFER
  11696.    LDY #>CMDbUFFER
  11697.    STA ZP+0
  11698.    STY ZP+1
  11699.    JSR DIROPEN
  11700.    BCS NOmATCH
  11701.    STA WILDfCB
  11702.    JSR DIRREAD
  11703.    BCS +
  11704.    BEQ +
  11705.    JSR SCANwILDCARD
  11706. +  LDA WILDfCB
  11707.    JSR DIRCLOSE
  11708.    LDA WILDmATCH
  11709.    BNE +
  11710.    NOmATCH = *
  11711.    LDA #$FF
  11712.    STA ABORTcOMMANDfLAG
  11713.    LDA #<NOmATCHmSG
  11714.    LDY #>NOmATCHmSG
  11715.    JSR EPUTS
  11716. +  RTS
  11717.  
  11718. NOmATCHmSG = *
  11719.    .ASC "nO MATCH FOR WILDCARD"
  11720.    .BYTES CHRcr,0
  11721.  
  11722. SCANwILDCARD = *
  11723.    LDX WILDfCB
  11724.    JSR DIRREAD
  11725.    BCS +
  11726.    BNE ++
  11727. +  RTS
  11728. +  LDA ACEdIRENTnAME
  11729.    BNE +
  11730.    RTS
  11731. +  LDA ACEdIRENTnAMElEN
  11732.    CMP WILDlENGTH
  11733.    BCC SCANwILDCARD
  11734.    LDX WILDpREFIX
  11735.    LDY #0
  11736.    JSR SUBSTRcMP
  11737.    BCS SCANwILDCARD
  11738.    LDX WILDsUFFIX
  11739.    SEC
  11740.    LDA ACEdIRENTnAMElEN
  11741.    SBC WILDsUFFIXlENGTH
  11742.    TAY
  11743.    JSR SUBSTRcMP
  11744.    BCS SCANwILDCARD
  11745.  
  11746.    LDX #0
  11747. -  LDA CMDbUFFER,X
  11748.    BEQ +
  11749.    STA ARGbUFFER,X
  11750.    INX
  11751.    BNE -
  11752. +  LDY #0
  11753. -  LDA ACEdIRENTnAME,Y
  11754.    STA ARGbUFFER,X
  11755.    BEQ +
  11756.    INX
  11757.    INY
  11758.    BNE -
  11759. +  LDA ACEdIRENTtYPE
  11760.    CMP #"S"
  11761.    BEQ +
  11762.    STA ARGbUFFER+1,X
  11763.    LDA #","
  11764.    STA ARGbUFFER,X
  11765.    INX
  11766.    INX
  11767.    LDA #0
  11768.    STA ARGbUFFER,X
  11769. +  STX ARGpTR
  11770.    JSR SHELLsTOREaRG
  11771.    LDA #$FF
  11772.    STA WILDmATCH
  11773.    JMP SCANwILDCARD
  11774.  
  11775. SUBSTRcMP = *  ;( .x=CMDBUFoFF, .y=DIRENTnAMEoFF ) : .cc=MATCH
  11776. -  LDA CMDbUFFER,X
  11777.    BNE +
  11778.    CLC
  11779.    RTS
  11780. +  CMP ACEdIRENTnAME,Y
  11781.    BNE +
  11782.    INY
  11783.    INX
  11784.    BNE -
  11785. +  SEC
  11786.    RTS
  11787.  
  11788. ;=== STACK MANAGEMENT ===
  11789.  
  11790. FRAMEaRGVsOURCE = $02
  11791. FRAMEaRGVdEST = $04
  11792. FRAMEaRGVbYTES = $06
  11793.  
  11794. SHELLcONSTRUCTfRAME = *
  11795.    ;** PUSH THE zero TRAILER ARGV
  11796.    LDA #0
  11797.    LDY #0
  11798.    JSR PUSHay
  11799.    ;** PUSH ARGV[] HERE
  11800.    LDA PARSEaRGC
  11801.    LDY PARSEaRGC+1
  11802.    STY FRAMEaRGVbYTES+1
  11803.    ASL
  11804.    STA FRAMEaRGVbYTES
  11805.    ROL FRAMEaRGVbYTES+1
  11806.    SEC
  11807.    LDA ACEsTACKpTR
  11808.    SBC FRAMEaRGVbYTES
  11809.    STA ACEsTACKpTR
  11810.    STA FRAMEaRGVdEST
  11811.    LDA ACEsTACKpTR+1
  11812.    SBC FRAMEaRGVbYTES+1
  11813.    STA ACEsTACKpTR+1
  11814.    STA FRAMEaRGVdEST+1
  11815.    LDA #<ARGaRGVbUFFER
  11816.    LDY #>ARGaRGVbUFFER
  11817.    STA FRAMEaRGVsOURCE
  11818.    STY FRAMEaRGVsOURCE+1
  11819. -  LDA FRAMEaRGVbYTES
  11820.    ORA FRAMEaRGVbYTES+1
  11821.    BEQ FRAMEsETaRGVpTR
  11822.    LDY #0
  11823.    LDA (FRAMEaRGVsOURCE),Y
  11824.    STA (FRAMEaRGVdEST),Y
  11825.    INC FRAMEaRGVsOURCE
  11826.    BNE +
  11827.    INC FRAMEaRGVsOURCE+1
  11828. +  INC FRAMEaRGVdEST
  11829.    BNE +
  11830.    INC FRAMEaRGVdEST+1
  11831. +  LDA FRAMEaRGVbYTES
  11832.    BNE +
  11833.    DEC FRAMEaRGVbYTES+1
  11834. +  DEC FRAMEaRGVbYTES
  11835.    JMP -
  11836.    ;** SET ARGV POINTER
  11837.    FRAMEsETaRGVpTR = *
  11838.    LDA ACEsTACKpTR
  11839.    LDY ACEsTACKpTR+1
  11840.    STA ACEaRGV
  11841.    STY ACEaRGV+1
  11842.    ;** SET AND PUSH ARGC
  11843.    LDA PARSEaRGC
  11844.    LDY PARSEaRGC+1
  11845.    STA ACEaRGC
  11846.    STY ACEaRGC+1
  11847.    JSR PUSHay
  11848.    ;** PUSH UN-REDIRECTION INFO HERE
  11849.    LDA SHELLrEDIRECTsTDERR
  11850.    LDY #$FF
  11851.    JSR PUSHay
  11852.    LDA SHELLrEDIRECTsTDIN
  11853.    LDY SHELLrEDIRECTsTDOUT
  11854.    JSR PUSHay
  11855.    ;** PUSH AND SET FRAME POINTER
  11856.    LDA ACEfRAMEpTR
  11857.    LDY ACEfRAMEpTR+1
  11858.    JSR PUSHay
  11859.    LDA ACEsTACKpTR
  11860.    LDY ACEsTACKpTR+1
  11861.    STA ACEfRAMEpTR
  11862.    STY ACEfRAMEpTR+1
  11863.    RTS
  11864.  
  11865. FRAMEfp = $02
  11866. FRAMEnEWfp = $04
  11867.  
  11868. SHELLrEMOVEfRAME = *
  11869.    ;** GET FRAME POINTER
  11870.    LDA ACEfRAMEpTR
  11871.    LDY ACEfRAMEpTR+1
  11872.    STA FRAMEfp
  11873.    STY FRAMEfp+1
  11874.    ;** RESTORE THE STD FILES
  11875.    LDY #2
  11876. -  LDA (FRAMEfp),Y
  11877.    STA SHELLrEDIRECTsTDIN-2,Y
  11878.    INY
  11879.    CPY #5
  11880.    BCC -
  11881.    ;** BACK UP FRAME POINTER
  11882.    LDY #1
  11883. -  LDA (FRAMEfp),Y
  11884.    STA ACEfRAMEpTR,Y
  11885.    STA ACEsTACKpTR,Y
  11886.    STA FRAMEnEWfp,Y
  11887.    STA ACEaRGV,Y
  11888.    DEY
  11889.    BPL -
  11890.    ;** RESTORE THE ARGC, ARGV VALUES
  11891.    LDY #6
  11892.    LDA (FRAMEnEWfp),Y
  11893.    STA ACEaRGC
  11894.    INY
  11895.    LDA (FRAMEnEWfp),Y
  11896.    STA ACEaRGC+1
  11897.    CLC
  11898.    LDA ACEaRGV
  11899.    ADC #8
  11900.    STA ACEaRGV
  11901.    BCC +
  11902.    INC ACEaRGV+1
  11903. +  RTS
  11904.  
  11905. ;=== DISPATCH ===
  11906.  
  11907. DISPaRGV = $02
  11908. DISPaRGpTR = $04
  11909. DISPvECTOR = $02
  11910.  
  11911. SHELLeXECcOMMAND = *
  11912.    ;** FETCH THE COMMAND NAME
  11913.    LDA ACEaRGV
  11914.    LDY ACEaRGV+1
  11915.    STA DISPaRGV
  11916.    STY DISPaRGV+1
  11917.    LDY #1
  11918. -  LDA (DISPaRGV),Y
  11919.    STA DISPaRGpTR,Y
  11920.    DEY
  11921.    BPL -
  11922.    LDY #0
  11923. -  LDA (DISPaRGpTR),Y
  11924.    STA ARGbUFFER,Y
  11925.    BEQ +
  11926.    INY
  11927.    BNE -
  11928.    ;** SEARCH INTERNAL DISPATCH TABLE FOR NAME
  11929. +  LDY #0
  11930.  
  11931.    DISPcMPcOMMAND = *
  11932.    LDA DISPtABLE,Y
  11933.    BEQ SHELLlOADeXTERNAL
  11934.    LDX #0
  11935. -  LDA ARGbUFFER,X
  11936.    CMP DISPtABLE,Y
  11937.    BNE +
  11938.    CMP #0
  11939.    BEQ DISPmATCH
  11940.    INX
  11941.    INY
  11942.    BNE -
  11943.    BRK
  11944. +  DEY
  11945. -  INY
  11946.    LDA DISPtABLE,Y
  11947.    BNE -
  11948.    INY
  11949.    INY
  11950.    INY
  11951.    JMP DISPcMPcOMMAND
  11952.  
  11953.    DISPmATCH = *
  11954.    LDA DISPtABLE+1,Y
  11955.    STA DISPvECTOR
  11956.    LDA DISPtABLE+2,Y
  11957.    STA DISPvECTOR+1
  11958.    JMP (DISPvECTOR)
  11959.  
  11960. ;** LOAD EXTERNAL FILE INTO TRANSIENT PROGRAM AREA
  11961. LOADpATH = 2
  11962. LOADpATHpOS = 4
  11963. LOADgIVEuP = 7
  11964.  
  11965. SHELLlOADeXTERNAL = *
  11966.    LDA #0
  11967.    STA ACEaPPaDDRESS+3
  11968.    LDA #0
  11969.    STA LOADpATHpOS
  11970.    STA LOADgIVEuP
  11971.    LDA ACEsHELLpATH
  11972.    LDY ACEsHELLpATH+1
  11973.    STA LOADpATH
  11974.    STY LOADpATH+1
  11975.  
  11976.    SHELLtRYlOADaGAIN = *
  11977.    LDY LOADpATHpOS
  11978.    LDA (LOADpATH),Y
  11979.    BEQ DISPcMDnOTfOUND
  11980.    LDA LOADgIVEuP
  11981.    BNE DISPcMDnOTfOUND
  11982.    LDA #0
  11983.    LDY #0
  11984.    JSR GETARG
  11985.    JSR GETlOADpATHNAME
  11986.    LDA #<ACEaPPaDDRESS
  11987.    LDY #>ACEaPPaDDRESS
  11988.    JSR BLOAD
  11989.    BCS DISPlOADeRROR
  11990.    LDA ACEaPPaDDRESS+3
  11991.    CMP #"C"
  11992.    BNE DISPbADpROG
  11993.    LDA ACEaPPaDDRESS+4
  11994.    CMP #"b"
  11995.    BNE DISPbADpROG
  11996.    LDA #<ACEaPPaDDRESS
  11997.    LDY #>ACEaPPaDDRESS
  11998.    JMP EXEC
  11999.  
  12000.    DISPbADpROG = *
  12001.    LDA #<DISPbADpROGmSG
  12002.    LDY #>DISPbADpROGmSG
  12003.    JSR EPUTS
  12004.    RTS
  12005.  
  12006.    DISPbADpROGmSG = *
  12007.    .ASC "bAD EXTERNAL PROGRAM FORMAT"
  12008.    .BYTE CHRcr,0
  12009.  
  12010.    DISPlOADeRROR = *
  12011.    LDA ERRNO
  12012.    CMP #ACEeRRfILEnOTfOUND
  12013.    BEQ SHELLtRYlOADaGAIN
  12014.    CMP #ACEeRRdEVICEnOTpRESENT
  12015.    BEQ SHELLtRYlOADaGAIN
  12016.    LDA #<DISPlOADeRRORmSG1
  12017.    LDY #>DISPlOADeRRORmSG1
  12018.    JMP EPUTS
  12019.  
  12020.    DISPcMDnOTfOUND = *
  12021.    LDA #<DISPlOADeRRORmSG2
  12022.    LDY #>DISPlOADeRRORmSG2
  12023.    JMP EPUTS
  12024.    DISPlOADeRRORmSG1 = *
  12025.    .ASC "eXTERNAL PROGRAM LOAD ERROR"
  12026.    .BYTE CHRcr,0
  12027.    DISPlOADeRRORmSG2 = *
  12028.    .ASC "cOMMAND NOT FOUND"
  12029.    .BYTE CHRcr
  12030.    .BYTE 0
  12031.  
  12032. GETlOADpATHNAME = *
  12033.    LDY LOADpATHpOS
  12034.    LDX #0
  12035. -  LDA (LOADpATH),Y
  12036.    BEQ +
  12037.    STA CMDbUFFER,X
  12038.    INY
  12039.    INX
  12040.    BNE -
  12041. +  INY
  12042.    STY LOADpATHpOS
  12043.    LDY #1
  12044.    LDA (ZP),Y
  12045.    CMP #":"
  12046.    BEQ +
  12047.    DEY
  12048.    LDA (ZP),Y
  12049.    CMP #"/"
  12050.    BNE GETpATHrEALLY
  12051. +  STA LOADgIVEuP
  12052.    LDX #0
  12053.  
  12054.    GETpATHrEALLY = *
  12055.    LDY #0
  12056. -  LDA (ZP),Y
  12057.    STA CMDbUFFER,X
  12058.    BEQ +
  12059.    INX
  12060.    INY
  12061.    BNE -
  12062. +  LDA #<CMDbUFFER
  12063.    LDY #>CMDbUFFER
  12064.    STA ZP
  12065.    STY ZP+1
  12066.    RTS
  12067.  
  12068. ;===INTERNAL COMMAND NAME AND DISPATCH TABLE===
  12069.  
  12070. DISPtABLE = *
  12071. .ASC "ECHO"
  12072. .BYTE 0
  12073. .WORD ECHO
  12074. .ASC "SH"
  12075. .BYTE 0
  12076. .WORD SHELLcMD
  12077. .ASC "DIRECTORY"
  12078. .BYTE 0
  12079. .WORD DIRwITHcLS
  12080. .ASC "DIR"
  12081. .BYTE 0
  12082. .WORD DIRwITHcLS
  12083. .ASC "D"
  12084. .BYTE 0
  12085. .WORD DIR
  12086. .ASC "LS"
  12087. .BYTE 0
  12088. .WORD LS
  12089. .ASC "CD"
  12090. .BYTE 0
  12091. .WORD CD
  12092. .ASC "G"
  12093. .BYTE 0
  12094. .WORD CD
  12095. .ASC "CAT"
  12096. .BYTE 0
  12097. .WORD CAT
  12098. .ASC "TYPE"
  12099. .BYTE 0
  12100. .WORD CAT
  12101. .ASC "T"
  12102. .BYTE 0
  12103. .WORD CAT
  12104. .ASC "CLS"
  12105. .BYTE 0
  12106. .WORD CLS
  12107. .ASC "CLEAR"
  12108. .BYTE 0
  12109. .WORD CLS
  12110. .ASC "EXIT"
  12111. .BYTE 0
  12112. .WORD SHELLeXIT
  12113. .ASC "X"
  12114. .BYTE 0
  12115. .WORD SHELLeXIT
  12116. .ASC "CLSL"
  12117. .BYTE 0
  12118. .WORD LSwITHcLS
  12119. .ASC "@"
  12120. .BYTE 0
  12121. .WORD DOS
  12122. .ASC "DOS"
  12123. .BYTE 0
  12124. .WORD DOS
  12125. .ASC "PATH"
  12126. .BYTE 0
  12127. .WORD PATH
  12128.  
  12129. .BYTE 0
  12130.  
  12131. ;===ECHO===
  12132. ECHOaRGV = $02
  12133. ECHOsPACE = $04
  12134. ECHOtEMP = $06
  12135.  
  12136. ECHO = *
  12137.    LDA #0
  12138.    STA ECHOsPACE
  12139.    LDA ACEaRGV
  12140.    LDY ACEaRGV+1
  12141.  
  12142.    ECHOnEWaRG = *
  12143.    CLC
  12144.    ADC #2
  12145.    BCC +
  12146.    INY
  12147. +  STA ECHOaRGV
  12148.    STY ECHOaRGV+1
  12149.    LDA #" "
  12150.    CMP ECHOsPACE
  12151.    BNE +
  12152.    JSR PUTCHAR
  12153. +  LDA #" "
  12154.    STA ECHOsPACE
  12155.    LDY #0
  12156.    LDA (ECHOaRGV),Y
  12157.    STA ECHOtEMP
  12158.    INY
  12159.    LDA (ECHOaRGV),Y
  12160.    TAY
  12161.    ORA ECHOtEMP
  12162.    BEQ ECHOeXIT
  12163.    LDA ECHOtEMP
  12164.    JSR PUTS
  12165.    LDA ECHOaRGV
  12166.    LDY ECHOaRGV+1
  12167.    JMP ECHOnEWaRG
  12168.  
  12169.    ECHOeXIT = *
  12170.    LDA #CHRcr
  12171.    JSR PUTCHAR
  12172.    RTS
  12173.  
  12174. ;===COPY PARAMETERS===
  12175. COPYbUFFERpTR = $02
  12176. COPYbUFFERlENGTH = $04
  12177.  
  12178. GETbUFFERpARMS = *
  12179.    LDA #<COPYbUFFER
  12180.    LDY #>COPYbUFFER
  12181.    STA COPYbUFFERpTR
  12182.    STY COPYbUFFERpTR+1
  12183.    SEC
  12184.    LDA ACEsTACKpTR
  12185.    SBC COPYbUFFERpTR
  12186.    STA COPYbUFFERlENGTH
  12187.    LDA ACEsTACKpTR+1
  12188.    SBC COPYbUFFERpTR+1
  12189.    STA COPYbUFFERlENGTH+1
  12190.    RTS
  12191.  
  12192. GETARG = *
  12193.    STY ZP+1
  12194.    ASL
  12195.    STA ZP
  12196.    ROL ZP+1
  12197.    CLC
  12198.    LDA ACEaRGV
  12199.    ADC ZP
  12200.    STA ZP
  12201.    LDA ACEaRGV+1
  12202.    ADC ZP+1
  12203.    STA ZP+1
  12204.    LDY #0
  12205.    LDA (ZP),Y
  12206.    TAX
  12207.    INY
  12208.    LDA (ZP),Y
  12209.    STX ZP
  12210.    STA ZP+1
  12211.    RTS
  12212.  
  12213. ;===DIR===
  12214. DIRfCB = $02
  12215. DIRcOLUMNS = $03
  12216. DIRcURcOL = $04
  12217. DIRlONG = $05
  12218. DIRsPACES = $06
  12219. DIRLINElEN = $07
  12220. DIRcHcOLS = $08
  12221.  
  12222. DIRwITHcLS = *
  12223.    JSR CLS
  12224.    JMP DIR
  12225.  
  12226. LSwITHcLS = *
  12227.    JSR CLS
  12228.    JMP LS
  12229.  
  12230. LS = *
  12231.    LDX #1
  12232.    JSR DEVINFO
  12233.    STX DIRcHcOLS
  12234.    CMP #0
  12235.    BNE +
  12236.    TXA
  12237.    LDX #$FF
  12238. -  INX
  12239.    SBC #20
  12240.    BCS -
  12241.    TXA
  12242.    BNE LSsETcOLS
  12243.  
  12244. +  LDA #1
  12245.    LSsETcOLS = *
  12246.    STA DIRcOLUMNS
  12247.    LDA #0
  12248.    STA DIRlONG
  12249.    JMP DIRcOMMON
  12250.  
  12251. DIR = *
  12252.    LDX #1
  12253.    JSR DEVINFO
  12254.    STX DIRcHcOLS
  12255.    LDA #1
  12256.    STA DIRcOLUMNS
  12257.    LDA #$FF
  12258.    STA DIRlONG
  12259.  
  12260. DIRcOMMON = *
  12261.    LDA #0
  12262.    STA DIRcURcOL
  12263.    LDA #<DIRdEFAULTdIRECTORY
  12264.    LDY #>DIRdEFAULTdIRECTORY
  12265.    STA ZP
  12266.    STY ZP+1
  12267.    LDA ACEaRGC+1
  12268.    BNE +
  12269.    LDA ACEaRGC
  12270.    CMP #2
  12271.    BCC DIRgOTnAME
  12272. +  LDA #1
  12273.    LDY #0
  12274.    JSR GETARG
  12275.  
  12276.    DIRgOTnAME = *
  12277.    JSR DIROPEN
  12278.    BCC +
  12279.    RTS
  12280. +  STA DIRfCB
  12281.    LDX DIRfCB
  12282.    JSR DIRREAD
  12283.    BCS DIReXIT
  12284.    BEQ DIReXIT
  12285.    JSR STOPKEY
  12286.    BCS DIReXIT
  12287.    LDA DIRlONG
  12288.    BPL +
  12289.    JSR DIRdISPLAYhEADING
  12290. /  LDX DIRfCB
  12291.    JSR DIRREAD
  12292.    BCS DIReXIT
  12293.    BEQ DIReXIT
  12294.    JSR STOPKEY
  12295.    BCS DIReXIT
  12296.    LDA ACEdIRENTnAME
  12297.    BEQ DIRtRAILEReXIT
  12298.    JSR DIRdISPLAY
  12299.    JMP -
  12300.  
  12301.    DIRtRAILEReXIT = *
  12302.    LDA DIRlONG
  12303.    BPL DIReXIT
  12304.    JSR DIRdISPLAYtRAILER
  12305.  
  12306.    DIReXIT = *
  12307.    LDA DIRcURcOL
  12308.    BEQ +
  12309.    LDA #CHRcr
  12310.    JSR PUTCHAR
  12311. +  LDA DIRfCB
  12312.    JMP CLOSE
  12313.  
  12314.    DIRdEFAULTdIRECTORY = *
  12315.    .ASC ".:"
  12316.    .BYTE 0
  12317.  
  12318. DIRdISPLAY = *
  12319.    BIT DIRlONG
  12320.    BMI +
  12321.    JMP DIRdISPLAYsHORT
  12322. +  JSR DIRsETUPdIRLINE
  12323.    LDA #<DIRLINE
  12324.    LDY #>DIRLINE
  12325.    STA ZP
  12326.    STY ZP+1
  12327.    LDA DIRLINElEN
  12328.    LDY #0
  12329.    LDX #STDOUT
  12330.    JMP WRITE
  12331.  
  12332. ;*            0000000000111111111122222222223333333333444444444455555555556666
  12333. ;*       POS: 0123456789012345678901234567890123456789012345678901234567890123
  12334. DIRLINE .ASC "DRWX*-MT  00-xXX-00  12:00A 12345678 *seq  1234567890123456"
  12335.         .BYTE CHRcr,0
  12336. DIRfLAGnAMES .ASC "DRWX*-MT"
  12337. DIRdATEsTR .ASC "  00-xXX-00  12:00A "
  12338. DIRdATEeND = *
  12339.  
  12340. DIRsETUPdIRLINE = *
  12341.    ;** FLAGS
  12342.    LDX #0
  12343.    LDA ACEdIRENTfLAGS
  12344. -  ASL
  12345.    PHA
  12346.    LDA #"-"
  12347.    BCC +
  12348.    LDA DIRfLAGnAMES,X
  12349. +  STA DIRLINE+0,X
  12350.    PLA
  12351.    INX
  12352.    CPX #8
  12353.    BCC -
  12354.    ;** DATE
  12355.    LDX #DIRdATEeND-DIRdATEsTR-1
  12356. -  LDA DIRdATEsTR,X
  12357.    STA DIRLINE+8,X
  12358.    DEX
  12359.    BPL -
  12360.    ;** BYTES
  12361.    LDA ACEdIRENTbYTES+0
  12362.    LDY ACEdIRENTbYTES+1
  12363.    LDX ACEdIRENTbYTES+2
  12364.    JSR ITOA
  12365.    LDY #28
  12366.    LDA DIRcHcOLS
  12367.    CMP #59
  12368.    BCS +
  12369.    LDY #8
  12370. +  LDX #0
  12371. -  LDA ITOAnUMBER,X
  12372.    STA DIRLINE,Y
  12373.    INY
  12374.    INX
  12375.    CPX #8
  12376.    BCC -
  12377.    LDA #" "
  12378.    STA DIRLINE,Y
  12379.    INY
  12380.    ;** UNCLOSED FLAG
  12381.    LDA DIRLINE+4
  12382.    CMP #"-"
  12383.    BNE +
  12384.    LDA #" "
  12385. +  STA DIRLINE,Y
  12386.    INY
  12387.    ;** FILETYPE
  12388.    LDX #0
  12389. -  LDA ACEdIRENTtYPE,X
  12390.    ORA #$80
  12391.    STA DIRLINE,Y
  12392.    INY
  12393.    INX
  12394.    CPX #3
  12395.    BCC -
  12396.    LDA #" "
  12397.    STA DIRLINE,Y
  12398.    INY
  12399.    STA DIRLINE,Y
  12400.    INY
  12401.    ;** FILENAME
  12402.    LDX #0
  12403. -  LDA ACEdIRENTnAME,X
  12404.    BEQ +
  12405.    STA DIRLINE,Y
  12406.    INY
  12407.    INX
  12408.    BNE -
  12409. +  LDA #CHRcr
  12410.    STA DIRLINE,Y
  12411.    INY
  12412.    LDA #0
  12413.    STA DIRLINE,Y
  12414.    STY DIRLINElEN
  12415.    RTS
  12416.  
  12417. DIRdISPLAYsHORT = *
  12418.    LDA #<ACEdIRENTnAME
  12419.    LDY #>ACEdIRENTnAME
  12420.    JSR PUTS
  12421.    INC DIRcURcOL
  12422.    LDA DIRcURcOL
  12423.    CMP DIRcOLUMNS
  12424.    BCC +
  12425.    LDA #0
  12426.    STA DIRcURcOL
  12427.    LDA #CHRcr
  12428.    JMP PUTCHAR
  12429. +  LDY #$FF
  12430. -  INY
  12431.    LDA ACEdIRENTnAME,Y
  12432.    BNE -
  12433.    STY DIRsPACES
  12434.    LDA #20
  12435.    SBC DIRsPACES
  12436.    STA DIRsPACES
  12437. -  LDA #" "
  12438.    JSR PUTCHAR
  12439.    DEC DIRsPACES
  12440.    BNE -
  12441.    RTS
  12442.  
  12443. DIRdISPLAYhEADING = *
  12444.    LDA #<DIRhEADINGmSG
  12445.    LDY #>DIRhEADINGmSG
  12446.    JSR PUTS
  12447.    LDA #<ACEdIRENTnAME
  12448.    LDY #>ACEdIRENTnAME
  12449.    JSR PUTS
  12450.    LDA #CHRcr
  12451.    JSR PUTCHAR
  12452.    RTS
  12453.  
  12454.    DIRhEADINGmSG = *
  12455.    .ASC "dIR: "
  12456.    .BYTE 0
  12457.  
  12458. DIRdISPLAYtRAILER = *
  12459.    LDA ACEdIRENTbYTES+0
  12460.    LDY ACEdIRENTbYTES+1
  12461.    LDX ACEdIRENTbYTES+2
  12462.    JSR ITOAsTRIP
  12463.    LDA #<ITOAnUMBER
  12464.    LDY #>ITOAnUMBER
  12465.    JSR PUTS
  12466.    LDA #<DIRtRAILINGmSG
  12467.    LDY #>DIRtRAILINGmSG
  12468.    JSR PUTS
  12469.    RTS
  12470.  
  12471.    DIRtRAILINGmSG = *
  12472.    .ASC " BYTES FREE"
  12473.    .BYTE CHRcr
  12474.    .BYTE 0
  12475.  
  12476. ;===CD===
  12477. CD = *
  12478.    LDA ACEaRGC+0
  12479.    CMP #2
  12480.    LDA ACEaRGC+1
  12481.    SBC #0
  12482.    BCS +
  12483.    JSR CDHOME
  12484.    RTS
  12485.  
  12486. +  LDA #1
  12487.    LDY #0
  12488.    JSR GETARG
  12489.  
  12490.    CDsETdEVICE = *
  12491.    LDX #2
  12492.    LDY #0
  12493.    LDA (ZP),Y
  12494.    STA ARGbUFFER+0
  12495.    INY
  12496.    LDA (ZP),Y
  12497.    STA ARGbUFFER+1
  12498.    INY
  12499.    CMP ":"
  12500.    BEQ CDcHECKpATH
  12501.    LDX #0
  12502.    LDY #0
  12503.  
  12504.    CDcHECKpATH = *
  12505.    LDA (ZP),Y
  12506.    STA ARGbUFFER,X
  12507.    CMP #0
  12508.    BEQ CDoKAY
  12509.    CMP #"/"
  12510.    BEQ CDpATHoKAY
  12511.    CMP #"0"
  12512.    BCC +
  12513.    CMP #"9"+1
  12514.    BCC CDpATHoKAY
  12515. +  LDA #"/"
  12516.    STA ARGbUFFER,X
  12517.    INX
  12518.  
  12519.    CDpATHoKAY = *
  12520. -  LDA (ZP),Y
  12521.    STA ARGbUFFER,X
  12522.    BEQ CDcHECKeND
  12523.    INX
  12524.    INY
  12525.    BNE -
  12526.  
  12527.    CDcHECKeND = *
  12528.    DEX
  12529.    LDA ARGbUFFER,X
  12530.    CMP #":"
  12531.    BEQ +
  12532.    INX
  12533.    LDA #":"
  12534.    STA ARGbUFFER,X
  12535.    LDA #0
  12536.    STA ARGbUFFER+1,X
  12537. +  DEX
  12538.    LDA ARGbUFFER,X
  12539.    CMP #"/"
  12540.    BEQ CDoKAY
  12541.    LDA #"/"
  12542.    STA ARGbUFFER+1,X
  12543.    LDA #":"
  12544.    STA ARGbUFFER+2,X
  12545.    LDA #0
  12546.    STA ARGbUFFER+3,X
  12547.  
  12548.    CDoKAY = *
  12549.    LDA #<ARGbUFFER
  12550.    LDY #>ARGbUFFER
  12551.    STA ZP+0
  12552.    STY ZP+1
  12553.    JSR CHDIR
  12554.    BCS +
  12555.    RTS
  12556. +  LDA #<CDeRRmSG
  12557.    LDY #>CDeRRmSG
  12558.    JMP EPUTS
  12559.  
  12560. CDdEFAULT = *
  12561.    .ASC "A:"
  12562.    .BYTE 0
  12563. CDeRRmSG = *
  12564.    .ASC "eRROR CHANGING DIRECTORY"
  12565.    .BYTE CHRcr,0
  12566.  
  12567. ;===CAT===
  12568. CATbUFFERpTR = $02
  12569. CATbUFFERlENGTH = $04
  12570. CATaRG = $06
  12571. CATfCB = $08
  12572. CATaBORT = 10
  12573.  
  12574. CAT = *
  12575.    LDA #0
  12576.    STA CATaBORT
  12577.    JSR GETbUFFERpARMS
  12578.    LDX #STDOUT
  12579.    JSR DEVINFO
  12580.    CMP #0
  12581.    BNE +
  12582.    LDA CATbUFFERlENGTH+1
  12583.    BEQ +
  12584.    LDA #<254
  12585.    LDY #>254
  12586.    STA CATbUFFERlENGTH+0
  12587.    STY CATbUFFERlENGTH+1
  12588. +  LDA #1
  12589.    LDY #0
  12590.    STA CATaRG+0
  12591.    STY CATaRG+1
  12592.    LDA ACEaRGC+0
  12593.    CMP #2
  12594.    LDA ACEaRGC+1
  12595.    SBC #0
  12596.    BCS CATfILES
  12597.    LDA #0
  12598.    STA CATfCB
  12599.    JMP CATfILE
  12600.  
  12601.    CATfILES = *
  12602.    LDA CATaRG+0
  12603.    LDY CATaRG+1
  12604.    JSR GETARG
  12605.    LDA #"R"
  12606.    JSR OPEN
  12607.    BCC +
  12608.    LDA ZP+0
  12609.    LDY ZP+1
  12610.    JSR EPUTS
  12611.    LDA #<CATeRRmSG
  12612.    LDY #>CATeRRmSG
  12613.    JSR EPUTS
  12614.    JMP ++
  12615. +  STA CATfCB
  12616.    JSR CATfILE
  12617.    LDA CATfCB
  12618.    JSR CLOSE
  12619. +  INC CATaRG
  12620.    BNE +
  12621.    INC CATaRG+1
  12622. +  LDA CATaBORT
  12623.    BNE +
  12624.    LDA CATaRG
  12625.    CMP ACEaRGC
  12626.    LDA CATaRG+1
  12627.    SBC ACEaRGC+1
  12628.    BCC CATfILES
  12629. +  RTS
  12630.  
  12631. CATeRRmSG = *
  12632.    .ASC ": CANNOT OPEN"
  12633.    .BYTE CHRcr,0
  12634.  
  12635. CATfILE = *
  12636.    LDA CATbUFFERpTR
  12637.    LDY CATbUFFERpTR+1
  12638.    STA ZP
  12639.    STY ZP+1
  12640. -  LDA CATbUFFERlENGTH
  12641.    LDY CATbUFFERlENGTH+1
  12642.    LDX CATfCB
  12643.    JSR READ
  12644.    BEQ +
  12645.    BCS +
  12646.    LDX #1
  12647.    JSR WRITE
  12648.    BCS +
  12649.    JSR STOPKEY
  12650.    BCS PRINTsTOPPEDmSG
  12651.    JMP -
  12652. +  RTS
  12653.  
  12654. PRINTsTOPPEDmSG = *
  12655.    LDA #$FF
  12656.    STA CATaBORT
  12657.    LDA #<STOPPEDmSG
  12658.    LDY #>STOPPEDmSG
  12659.    JMP EPUTS
  12660.    STOPPEDmSG = *
  12661.    .ASC "<sTOPPED>"
  12662.    .BYTE CHRcr,0
  12663.  
  12664. ;===EXIT===
  12665. SHELLeXIT = *
  12666.    LDA #$FF
  12667.    STA SHELLeXITfLAG
  12668.    RTS
  12669.  
  12670. ;===DOS===
  12671. DOSfCB = $02
  12672.  
  12673. DOS = *
  12674.    ;** OPEN COMMAND CHANNEL
  12675.    LDA #<DOScURdEVICE
  12676.    LDY #>DOScURdEVICE
  12677.    STA ZP
  12678.    STY ZP+1
  12679.    JSR CMDOPEN
  12680.    BCC +
  12681.    RTS
  12682. +  STA DOSfCB
  12683.  
  12684.    ;** SEND COMMAND
  12685.    LDA #1
  12686.    LDY #0
  12687.    JSR GETARG
  12688.    LDA ZP
  12689.    ORA ZP+1
  12690.    BEQ DOSsTATUSoNLY
  12691.    LDA ZP
  12692.    LDY ZP+1
  12693.    LDX DOSfCB
  12694.    JSR CMDSEND
  12695.    BCS +
  12696.  
  12697.    ;** READ STATUS
  12698.    DOSsTATUSoNLY = *
  12699.    LDA #<CMDbUFFER
  12700.    LDY #>CMDbUFFER
  12701.    LDX DOSfCB
  12702.    JSR CMDSTATUS
  12703.    BCS +
  12704.    LDA #<CMDbUFFER
  12705.    LDY #>CMDbUFFER
  12706.    JSR PUTS
  12707.    LDA #CHRcr
  12708.    JSR PUTCHAR
  12709.  
  12710.    ;** CLOSE COMMAND CHANNEL
  12711. +  LDA DOSfCB
  12712.    JMP CMDCLOSE
  12713.  
  12714. DOScURdEVICE .ASC ".:"
  12715.              .BYTE 0
  12716.  
  12717. ;===SHELL===
  12718. SHELLcMD = *
  12719.    JSR SHELL
  12720.    LDA #0
  12721.    STA SHELLeXITfLAG
  12722.    LDA #255
  12723.    STA CHECKpROMPTfLAG
  12724.    RTS
  12725.  
  12726. ;===PATH===
  12727. PATHpTR = 2
  12728. PATHpOS = 4
  12729. PATHaRG = 6
  12730. PATHsOURCEpOS = 7
  12731.  
  12732. PATH = *
  12733.    LDA ACEsHELLpATH
  12734.    LDY ACEsHELLpATH+1
  12735.    STA PATHpTR
  12736.    STY PATHpTR+1
  12737.    LDA #0
  12738.    STA PATHpOS
  12739.    LDA ACEaRGC+1
  12740.    BEQ +
  12741.    RTS
  12742. +  LDA ACEaRGC
  12743.    CMP #2
  12744.    BCS PATHsET
  12745.    LDA #<PATHmSG
  12746.    LDY #>PATHmSG
  12747.    JSR PUTS
  12748.  
  12749.    DISPLAYpATH = *
  12750.    LDY PATHpOS
  12751.    LDA (PATHpTR),Y
  12752.    BNE +
  12753.    LDA #CHRcr
  12754.    JSR PUTCHAR
  12755.    RTS
  12756. +  LDA #CHRqUOTE
  12757.    STA CMDbUFFER
  12758.    LDX #1
  12759. -  LDA (PATHpTR),Y
  12760.    STA CMDbUFFER,X
  12761.    BEQ +
  12762.    INY
  12763.    INX
  12764.    BNE -
  12765. +  INY
  12766.    STY PATHpOS
  12767.    LDA #CHRqUOTE
  12768.    STA CMDbUFFER,X
  12769.    INX
  12770.    LDA #" "
  12771.    STA CMDbUFFER,X
  12772.    INX
  12773.    LDA #<CMDbUFFER
  12774.    LDY #>CMDbUFFER
  12775.    STA ZP
  12776.    STY ZP+1
  12777.    TXA
  12778.    LDY #0
  12779.    LDX #1
  12780.    JSR WRITE
  12781.    JMP DISPLAYpATH
  12782.  
  12783.    PATHmSG = *
  12784.    .ASC "PATH "
  12785.    .BYTE 0
  12786.  
  12787. PATHsET = *
  12788.    LDY #0
  12789.    STY PATHpOS
  12790.    LDA #1
  12791.    STA PATHaRG
  12792.  
  12793.    PATHnEXTaRG = *
  12794.    LDA PATHaRG
  12795.    LDY #0
  12796.    JSR GETARG
  12797.    LDA ZP
  12798.    ORA ZP+1
  12799.    BNE +
  12800.    LDA #0
  12801.    LDY PATHpOS
  12802.    STA (PATHpTR),Y
  12803.    RTS
  12804. +  LDY #0
  12805.    STY PATHsOURCEpOS
  12806. -  LDY PATHsOURCEpOS
  12807.    INC PATHsOURCEpOS
  12808.    LDA (ZP),Y
  12809.    LDY PATHpOS
  12810.    INC PATHpOS
  12811.    STA (PATHpTR),Y
  12812.    CMP #0
  12813.    BNE -
  12814.    INC PATHaRG
  12815.    JMP PATHnEXTaRG
  12816.  
  12817. BSS           = ACEaPPaDDRESS
  12818. CMDbUFFER     = BSS+0
  12819. ARGbUFFER     = CMDbUFFER+256
  12820. ARGaRGVbUFFER = ARGbUFFER+256
  12821. COPYbUFFER    = ARGaRGVbUFFER
  12822. SLOW.S
  12823. 14
  12824. .SEQ ACEHEAD.S
  12825. .ORG ACEaPPaDDRESS
  12826. .OBJ "@0:SLOW"
  12827.  
  12828. JMP MAIN
  12829. .ASC "Cb"
  12830.  
  12831. MAIN = *
  12832.    LDA $D011
  12833.    ORA #%00010000
  12834.    STA $D011
  12835.    LDA #$00
  12836.    STA $D030
  12837.    RTS
  12838. SORT.S
  12839. 1079
  12840. ;*** SORT PROGRAM - BY cRAIG bRUCE, STARTED 13-jUN-93
  12841.  
  12842. .SEQ ACEHEAD.S
  12843. .ORG ACEaPPaDDRESS
  12844. .OBJ "@0:SORT"
  12845.  
  12846. JMP MAIN
  12847. .ASC "Cb"
  12848. .BYTE $06
  12849.  
  12850. ;*** GLOBAL DECLARATIONS
  12851.  
  12852. LIBWORK = $40
  12853.  
  12854. CHRcr = $0D
  12855. CHRqUOTE = $22
  12856. MAXlINElEN = 2049
  12857. TRUE = $FF
  12858. FALSE = $00
  12859.  
  12860. REVERSEfLAG     .BUF 1
  12861. IGNOREcASEfLAG  .BUF 1
  12862. KEYpOSITION     .BUF 1
  12863.  
  12864. ;******** STANDARD LIBRARY ********
  12865. PUTS = *
  12866.    LDX #STDOUT
  12867. FPUTS = *
  12868.    STA ZP
  12869.    STY ZP+1
  12870.    LDY #$FF
  12871. -  INY
  12872.    LDA (ZP),Y
  12873.    BNE -
  12874.    TYA
  12875.    LDY #0
  12876.    JMP WRITE
  12877. EPUTS = *
  12878.    LDX #STDERR
  12879.    JMP FPUTS
  12880.  
  12881. PUTCHAR = *
  12882.    LDX #STDOUT
  12883. PUTC = *
  12884.    STA PUTCbUFFER
  12885.    LDA #<PUTCbUFFER
  12886.    LDY #>PUTCbUFFER
  12887.    STA ZP
  12888.    STY ZP+1
  12889.    LDA #1
  12890.    LDY #0
  12891.    JMP WRITE
  12892.    PUTCbUFFER .BUF 1
  12893.  
  12894. GETARG = *
  12895.    STY ZP+1
  12896.    ASL
  12897.    STA ZP
  12898.    ROL ZP+1
  12899.    CLC
  12900.    LDA ACEaRGV
  12901.    ADC ZP
  12902.    STA ZP
  12903.    LDA ACEaRGV+1
  12904.    ADC ZP+1
  12905.    STA ZP+1
  12906.    LDY #0
  12907.    LDA (ZP),Y
  12908.    TAX
  12909.    INY
  12910.    LDA (ZP),Y
  12911.    STX ZP
  12912.    STA ZP+1
  12913.    RTS
  12914.  
  12915. ;===MAIN===
  12916. ARG = 2
  12917. NAME = 4
  12918. STRING = 8
  12919.  
  12920. MAIN = *
  12921.    ;** CHECK ARGUMENT COUNT
  12922.    LDA #0
  12923.    STA REVERSEfLAG
  12924.    STA IGNOREcASEfLAG
  12925.    LDA #1
  12926.    STA KEYpOSITION
  12927.    LDA ACEaRGC+1
  12928.    BNE ENOUGHaRGS
  12929.    LDA ACEaRGC
  12930.    CMP #2
  12931.    BCS ENOUGHaRGS
  12932.  
  12933. USAGE = *
  12934.    LDA #<USAGEmSG
  12935.    LDY #>USAGEmSG
  12936.    JMP EPUTS
  12937.  
  12938. USAGEmSG = *
  12939.    .ASC "USAGE: SORT [-[I][V]] [+COLUMN] FILE ..."
  12940.    .BYTE CHRcr,0
  12941.  
  12942. ENOUGHaRGS = *
  12943.    ;** MAIN LOOP
  12944.    LDA #1
  12945.    LDY #0
  12946.    STA ARG+0
  12947.    STY ARG+1
  12948.    JSR GETARG
  12949.    LDY #0
  12950.    LDA (ZP),Y
  12951.    CMP #"-"
  12952.    BNE KEYaRG
  12953.    INC ARG
  12954. -  INY
  12955.    LDA (ZP),Y
  12956.    BEQ KEYaRG
  12957.    CMP #"I"
  12958.    BNE +
  12959.    LDA #TRUE
  12960.    STA IGNOREcASEfLAG
  12961. +  CMP #"V"
  12962.    BNE +
  12963.    LDA #TRUE
  12964.    STA REVERSEfLAG
  12965. +  JMP -
  12966.  
  12967.    KEYaRG = *
  12968.    LDA ARG
  12969.    LDY #0
  12970.    JSR GETARG
  12971.    LDY #0
  12972.    LDA (ZP),Y
  12973.    CMP #"+"
  12974.    BNE FILEaRG
  12975.    JSR GETkEYpOSITION
  12976.    INC ARG
  12977.  
  12978.    FILEaRG = *
  12979.    JSR SORTiNIT
  12980. -  JSR STOPKEY
  12981.    BCS STOPPED
  12982.    LDA ARG+0
  12983.    LDY ARG+1
  12984.    JSR GETARG
  12985.    LDA ZP+0
  12986.    LDY ZP+1
  12987.    STA NAME+0
  12988.    STY NAME+1
  12989.    ORA ZP+1
  12990.    BEQ MAINeXIT
  12991.    JSR SORTrEAD
  12992.    BCC +
  12993.    JSR ERROR
  12994. +  INC ARG+0
  12995.    BNE +
  12996.    INC ARG+1
  12997. +  JMP -
  12998.  
  12999. MAINeXIT = *
  13000.    JSR SORTrEAL
  13001.    JSR SORTpRINT
  13002.    JSR SORTcLEAN
  13003.    RTS
  13004.  
  13005. KEYdIGIT = $71
  13006.  
  13007. GETkEYpOSITION = *
  13008.    LDA #0
  13009.    STA KEYpOSITION
  13010.    INY
  13011. -  LDA (ZP),Y
  13012.    CMP #"0"
  13013.    BCC +
  13014.    CMP #"9"+1
  13015.    BCS +
  13016.    AND #$0F
  13017.    STA KEYdIGIT
  13018.    LDA KEYpOSITION
  13019.    ASL
  13020.    ASL
  13021.    CLC
  13022.    ADC KEYpOSITION
  13023.    ASL
  13024.    CLC
  13025.    ADC KEYdIGIT
  13026.    STA KEYpOSITION
  13027.    INY
  13028.    BNE -
  13029. +  RTS
  13030.  
  13031. STOPPED = *
  13032.    LDA #<STOPPEDmSG
  13033.    LDY #>STOPPEDmSG
  13034.    JSR EPUTS
  13035.    LDA #1
  13036.    JMP EXIT
  13037.    STOPPEDmSG = *
  13038.    .ASC "<sTOPPED>"
  13039.    .BYTE CHRcr,0
  13040.  
  13041. ERROR = *
  13042.    LDA #<ERRORmSG1
  13043.    LDY #>ERRORmSG1
  13044.    JSR EPUTS
  13045.    LDA NAME+0
  13046.    LDY NAME+1
  13047.    JSR EPUTS
  13048.    LDA #<ERRORmSG2
  13049.    LDY #>ERRORmSG2
  13050.    JMP EPUTS
  13051.    ERRORmSG1 = *
  13052.    .ASC "eRROR READING FILE "
  13053.    .BYTE CHRqUOTE,0
  13054.    ERRORmSG2 = *
  13055.    .BYTE CHRqUOTE,CHRcr,0
  13056.  
  13057. BUFpTR = 10   ;(1)
  13058. BUFcOUNT = 12 ;(1)
  13059. INFILE = 14   ;(1)
  13060.  
  13061. SORTrEAD = *
  13062.    ;** OPEN FILE
  13063.    LDA NAME+0
  13064.    LDY NAME+1
  13065.    STA ZP+0
  13066.    STY ZP+1
  13067.    LDA #"R"
  13068.    JSR OPEN
  13069.    BCC +
  13070.    RTS
  13071. +  STA INFILE
  13072.    JSR READbODY
  13073.    LDA INFILE
  13074.    JSR CLOSE
  13075.    RTS
  13076.  
  13077. ;===SORT ROUTINES===
  13078.  
  13079. SORTHEAD = 30  ;(4)
  13080. SORTp    = 34  ;(4)
  13081. SORTq    = 38  ;(4)
  13082. HEADER   = 42  ;(5)
  13083.  
  13084. SORTiNIT = *
  13085.    LDA #"S"
  13086.    JSR ECHOsTATUS
  13087.    JSR MALLOCiNIT
  13088.    LDA KEYpOSITION
  13089.    CMP #1
  13090.    BCC +
  13091.    SBC #1
  13092. +  STA KEYpOSITION
  13093.    LDX #3
  13094.    LDA #ACEmEMnULL
  13095. -  STA SORTHEAD,X
  13096.    DEX
  13097.    BPL -
  13098.    RTS
  13099.  
  13100. READbODY = *
  13101.    LDA #"R"
  13102.    JSR ECHOsTATUS
  13103.    LDA #0
  13104.    STA BUFcOUNT
  13105. -  JSR GETLINE
  13106.    BCS +
  13107.    JSR POSITIONlINE
  13108.    JSR STORELINE
  13109.    BCS +
  13110.    LDA #"."
  13111.    JSR ECHOsTATUS
  13112.    JMP -
  13113. +  RTS
  13114.  
  13115. SORTrEAL = *
  13116.    LDA REVERSEfLAG
  13117.    BMI +
  13118.    LDA #"V"
  13119.    JSR ECHOsTATUS
  13120.    JSR REVERSEfILE
  13121. +  RTS
  13122.  
  13123. SORTpRINT = *
  13124.    LDA #"W"
  13125.    JSR ECHOsTATUS
  13126.    LDA #13
  13127.    JSR ECHOsTATUS
  13128.    JSR WRITEFILE
  13129.    RTS
  13130.  
  13131. SORTcLEAN = *
  13132.    ;LDA #"F"
  13133.    ;JSR ECHOsTATUS
  13134.    ;JSR FREEFILE
  13135.    ;LDA #13
  13136.    ;JSR ECHOsTATUS
  13137.    RTS
  13138.  
  13139. ;*** FETCHLINE( SORTp=lINEpTR, .ay=rAM0BUF )
  13140.  
  13141. FETCHLINE = *
  13142.    STA ZW
  13143.    STY ZW+1
  13144.    LDX #3
  13145. -  LDA SORTp,X
  13146.    STA ZP,X
  13147.    DEX
  13148.    BPL -
  13149.    LDX #HEADER
  13150.    LDY #5
  13151.    JSR ZPLOAD
  13152.    LDA HEADER+4
  13153.    LDY #0
  13154.    JMP FETCH
  13155.  
  13156. ;*** SORTgtCMP( SORTLINE, CMPLINE ) : .c={$7b}SORTLINE >= CMPLINE{$7d}
  13157.  
  13158. SORTgtCMP = *
  13159.    LDX #0
  13160.    CLC
  13161.    LDA KEYpOSITION
  13162.    ADC #6
  13163.    CMP SORTBUFLEN
  13164.    BCC +
  13165.    INX
  13166. +  CMP CMPBUFLEN
  13167.    BCC +
  13168.    INX
  13169.    INX
  13170. +  TXA
  13171.    BEQ DOcOMPARE
  13172.    CMP #2
  13173.    RTS
  13174.  
  13175.    DOcOMPARE = *
  13176.    BIT IGNOREcASEfLAG
  13177.    BMI DOcASELESScOMPARE
  13178.    LDY KEYpOSITION
  13179. -  LDA SORTLINE,Y
  13180.    CMP CMPLINE,Y
  13181.    BNE +
  13182.    CMP #0
  13183.    BEQ +
  13184.    INY
  13185.    BNE -
  13186. +  RTS
  13187.  
  13188.    CASELESScHAR = $72
  13189.  
  13190.    DOcASELESScOMPARE = *
  13191.    LDY KEYpOSITION
  13192. -  LDA SORTLINE,Y
  13193.    JSR LOWCASE
  13194.    PHA
  13195.    LDA CMPLINE,Y
  13196.    JSR LOWCASE
  13197.    STA CASELESScHAR
  13198.    PLA
  13199.    CMP CASELESScHAR
  13200.    BNE +
  13201.    CMP #0
  13202.    BEQ +
  13203.    INY
  13204.    BNE -
  13205. +  RTS
  13206.  
  13207. LOWCASE = *
  13208.    CMP #"a"
  13209.    BCC +
  13210.    CMP #"z"+1
  13211.    BCS +
  13212.    AND #$7F
  13213. +  RTS
  13214.  
  13215. ;*** POSITIONlINE( SORTLINE ) : SORTq=PREV, SORTp=NEXT
  13216.  
  13217. POSITIONlINE = *
  13218.    LDX #3
  13219. -  LDA #ACEmEMnULL
  13220.    STA SORTq,X
  13221.    LDA SORTHEAD,X
  13222.    STA SORTp,X
  13223.    DEX
  13224.    BPL -
  13225.  
  13226.    POSITIONsEARCH = *
  13227.    LDA SORTp+3
  13228.    CMP #ACEmEMnULL
  13229.    BEQ POSITIONeXIT
  13230.    LDA #<CMPBUF
  13231.    LDY #>CMPBUF
  13232.    JSR FETCHLINE
  13233.    JSR SORTgtCMP
  13234.    BCS POSITIONeXIT    ;** CONTROLS SORT ORDER
  13235.    LDX #3
  13236. -  LDA SORTp,X
  13237.    STA SORTq,X
  13238.    LDA CMPBUF,X
  13239.    STA SORTp,X
  13240.    DEX
  13241.    BPL -
  13242.    BMI POSITIONsEARCH
  13243.  
  13244.    POSITIONeXIT = *
  13245.    RTS
  13246.  
  13247. ;*** STORELINE( SORTLINE )    {$7b}BETWEEN SORTq AND SORTp{$7d}
  13248.  
  13249. STORELINE = *
  13250.    LDA SORTBUFLEN
  13251.    LDY #0
  13252.    JSR MALLOC
  13253.    BCC +
  13254.    RTS
  13255. +  LDX #3
  13256. -  LDA SORTp,X
  13257.    STA SORTBUF,X
  13258.    DEX
  13259.    BPL -
  13260.    LDA #<SORTBUF
  13261.    LDY #>SORTBUF
  13262.    STA ZW+0
  13263.    STY ZW+1
  13264.    LDA SORTBUFLEN
  13265.    LDY #0
  13266.    JSR STASH
  13267.    LDA SORTq+3
  13268.    CMP #ACEmEMnULL
  13269.    BEQ STORELINEfIRST
  13270.    LDX #3
  13271. -  LDA ZP,X
  13272.    LDY SORTq,X
  13273.    STA SORTq,X
  13274.    STY ZP,X
  13275.    DEX
  13276.    BPL -
  13277.    LDX #SORTq
  13278.    LDY #4
  13279.    JSR ZPSTORE
  13280.    CLC
  13281.    RTS
  13282.  
  13283.    STORELINEfIRST = *
  13284.    LDX #3
  13285. -  LDA ZP,X
  13286.    STA SORTHEAD,X
  13287.    DEX
  13288.    BPL -
  13289.    CLC
  13290.    RTS
  13291.  
  13292. ;*** WRITEFILE()
  13293.  
  13294. WRITEFILE = *
  13295.    LDX #3
  13296. -  LDA SORTHEAD,X
  13297.    STA SORTp,X
  13298.    DEX
  13299.    BPL -
  13300.  
  13301.    WRITElINE = *
  13302.    LDA SORTp+3
  13303.    CMP #ACEmEMnULL
  13304.    BEQ WRITEeXIT
  13305.    LDA #<SORTBUF
  13306.    LDY #>SORTBUF
  13307.    JSR FETCHLINE
  13308.    JSR PUTLINE
  13309.    LDX #3
  13310. -  LDA SORTBUF,X
  13311.    STA SORTp,X
  13312.    DEX
  13313.    BPL -
  13314.    JMP WRITElINE
  13315.  
  13316.    WRITEeXIT = *
  13317.    RTS
  13318.  
  13319. ;*** REVERSElIST()
  13320.  
  13321. REVERSEfILE = *
  13322.    LDX #3
  13323. -  LDA SORTHEAD,X
  13324.    STA ZP,X
  13325.    LDA #ACEmEMnULL
  13326.    STA SORTHEAD,X
  13327.    DEX
  13328.    BPL -
  13329.  
  13330.    REVERSElINE = *
  13331.    LDA ZP+3
  13332.    CMP #ACEmEMnULL
  13333.    BEQ REVERSEeXIT
  13334.    LDX #SORTp
  13335.    LDY #4
  13336.    JSR ZPLOAD
  13337.    LDX #SORTHEAD
  13338.    LDY #4
  13339.    JSR ZPSTORE
  13340.    LDX #3
  13341. -  LDA ZP,X
  13342.    STA SORTHEAD,X
  13343.    LDA SORTp,X
  13344.    STA ZP,X
  13345.    DEX
  13346.    BPL -
  13347.    BMI REVERSElINE
  13348.  
  13349.    REVERSEeXIT = *
  13350.    RTS
  13351.  
  13352. ;*** FREEFILE()
  13353.  
  13354. FREEFILE = *
  13355.    LDX #3
  13356. -  LDA SORTHEAD,X
  13357.    STA ZP,X
  13358.    DEX
  13359.    BPL -
  13360.  
  13361.    FREElINE = *
  13362.    LDA ZP+3
  13363.    CMP #ACEmEMnULL
  13364.    BNE +
  13365.    RTS
  13366. +  LDX #HEADER
  13367.    LDY #5
  13368.    JSR ZPLOAD
  13369.    LDA HEADER+4
  13370.    LDY #0
  13371.    JSR FREE
  13372.    LDX #3
  13373. -  LDA HEADER,X
  13374.    STA ZP,X
  13375.    DEX
  13376.    BPL -
  13377.    JMP FREElINE
  13378.  
  13379. ECHOsTATUS = *
  13380.    LDX #STDERR
  13381.    JMP PUTC
  13382.  
  13383. ;===DYNAMIC MEMORY ROUTINES===
  13384.  
  13385. MALLOCwORK = $60
  13386.  
  13387. MALLOChEAD   .BUF 4
  13388. TPAfREEfIRST .BUF 1
  13389. TPAfREEmIN   .BUF 1
  13390. TPAfREEpAGES .BUF 1
  13391. TPAaREAsTART .BUF 1
  13392. TPAaREAeND   .BUF 1
  13393.  
  13394. ;*** MALLOCiNIT()
  13395.  
  13396. MALLOCiNIT = *
  13397.    LDA #ACEmEMnULL
  13398.    STA MALLOChEAD+3
  13399.    LDX #0
  13400.    LDA #$FF
  13401. -  STA TPAfREEMAP,X
  13402.    INX
  13403.    BNE -
  13404.    LDX #>BSSeND
  13405.    LDA #<BSSeND
  13406.    BEQ +
  13407.    INX
  13408. +  STX TPAfREEfIRST
  13409.    STX TPAaREAsTART
  13410.    LDX ACEsTACKpTR+1
  13411.    STX MALLOCwORK
  13412.    STX TPAaREAeND
  13413.    TXA
  13414.    SEC
  13415.    SBC TPAfREEfIRST
  13416.    BCS +
  13417.    LDA #0
  13418. +  STA TPAfREEpAGES
  13419.    CLC
  13420.    ADC #1
  13421.    STA TPAfREEmIN
  13422.    LDX TPAfREEfIRST
  13423.    CPX MALLOCwORK
  13424.    BCS +
  13425.    LDA #$00
  13426. -  STA TPAfREEMAP,X
  13427.    INX
  13428.    CPX MALLOCwORK
  13429.    BCC -
  13430. +  RTS
  13431.  
  13432. LIBpAGES .BUF 1
  13433.  
  13434. LIBpAGEaLLOC = *  ;( .a=PAGES ) : [ZP]
  13435.    STA LIBpAGES
  13436.    LDX #$00
  13437.    LDY #ACEmEMiNTERNAL-1
  13438.    JSR PAGEALLOC
  13439.    BCS +
  13440.    RTS
  13441. +  JSR TPApAGEaLLOC
  13442.    BCS +
  13443.    RTS
  13444. +  LDA LIBpAGES
  13445.    LDX #ACEmEMiNTERNAL
  13446.    LDY #$FF
  13447.    JSR PAGEALLOC
  13448.    BCS +
  13449.    RTS
  13450. +  LDA #<NOMEMmSG
  13451.    LDY #>NOMEMmSG
  13452.    JSR EPUTS
  13453.    LDA #1
  13454.    JMP EXIT
  13455.  
  13456.    NOMEMmSG = *
  13457.    .BYTE CHRcr
  13458.    .ASC "iNSUFFICIENT MEMORY, ABORTING."
  13459.    .BYTE CHRcr,0
  13460.  
  13461. NEWMAX   .BUF 1
  13462.  
  13463. TPApAGEaLLOC = *  ;( LIBpAGES ) : [ZP]
  13464.    LDA LIBpAGES
  13465.    CMP TPAfREEmIN
  13466.    BCS TPAfREEMAPfULL
  13467.    ;** FIRST FREE
  13468.    LDX TPAfREEfIRST
  13469.    LDA TPAfREEMAP,X
  13470.    BEQ ++
  13471. -  INX
  13472.    BEQ TPAfREEMAPfULL
  13473.    LDA TPAfREEMAP,X
  13474.    BNE -
  13475.    STX TPAfREEfIRST
  13476.    JMP ++
  13477.    TPAfREEMAPfULL = *
  13478.    LDA LIBpAGES
  13479.    CMP TPAfREEmIN
  13480.    BCS +
  13481.    STA TPAfREEmIN
  13482. +  SEC
  13483.    RTS
  13484.  
  13485.    ;** SEARCH
  13486. +  DEX
  13487. -  LDY LIBpAGES
  13488. -  INX
  13489.    BEQ TPAfREEMAPfULL
  13490.    LDA TPAfREEMAP,X
  13491.    BNE --
  13492.    DEY
  13493.    BNE -
  13494.  
  13495.    ;** ALLOCATE
  13496.    STX NEWMAX
  13497.    LDY LIBpAGES
  13498.    LDA #$41
  13499. -  STA TPAfREEMAP,X
  13500.    DEX
  13501.    DEY
  13502.    BNE -
  13503.    INX
  13504.    CPX TPAfREEfIRST
  13505.    BNE +
  13506.    LDY NEWMAX
  13507.    INY
  13508.    STY TPAfREEfIRST
  13509. +  SEC
  13510.    LDA TPAfREEpAGES
  13511.    SBC LIBpAGES
  13512.    STA TPAfREEpAGES
  13513.    LDA #0
  13514.    LDY #ACEmEMiNTERNAL
  13515.    STA ZP+0
  13516.    STX ZP+1
  13517.    STA ZP+2
  13518.    STY ZP+3
  13519.    CLC
  13520.    RTS
  13521.  
  13522. MALLOClENsAVE .BUF 3
  13523.  
  13524. MALLOC = *
  13525.    STA MALLOClENsAVE+0
  13526.    STY MALLOClENsAVE+1
  13527.    JSR LIBmALLOC
  13528.    BCS +
  13529.    RTS
  13530. +  LDX MALLOClENsAVE+1
  13531.    LDA MALLOClENsAVE+0
  13532.    BEQ +
  13533.    INX
  13534. +  TXA
  13535.    CPX #>1024
  13536.    BCS +
  13537.    LDX #>1024
  13538. +  TXA
  13539.    STA MALLOClENsAVE+2
  13540.    JSR LIBpAGEaLLOC
  13541.    BCC +
  13542.    RTS
  13543. +  LDA #0
  13544.    LDY MALLOClENsAVE+2
  13545.    JSR FREE
  13546.    LDA MALLOClENsAVE+0
  13547.    LDY MALLOClENsAVE+1
  13548.    JMP MALLOC
  13549.  
  13550. ;*** MALLOC( .ay=bYTES ) : [ZP]=fARpOINTER
  13551.  
  13552. MALLOCmEMnEXTpTR = MALLOCwORK+0 ;(4)
  13553. MALLOCmEMlENGTH  = MALLOCwORK+4 ;(2)
  13554. MALLOClENGTH     = MALLOCwORK+6 ;(2)
  13555. MALLOCq          = MALLOCwORK+8 ;(4)
  13556.  
  13557. LIBmALLOC = *
  13558.    CLC
  13559.    ADC #7
  13560.    BCC +
  13561.    INY
  13562. +  AND #$F8
  13563.    STA MALLOClENGTH
  13564.    STY MALLOClENGTH+1
  13565.    LDX #3
  13566. -  LDA MALLOChEAD,X
  13567.    STA ZP,X
  13568.    LDA #ACEmEMnULL
  13569.    STA MALLOCq,X
  13570.    DEX
  13571.    BPL -
  13572.  
  13573.    MALLOClOOK = *
  13574.    LDA ZP+3
  13575.    CMP #ACEmEMnULL
  13576.    BNE +
  13577.  
  13578.    MALLOCeRROReXIT = *
  13579.    LDA #ACEmEMnULL
  13580.    STA ZP+3
  13581.    LDA #ACEeRRiNSUFFICIENTmEMORY
  13582.    STA ERRNO
  13583.    SEC
  13584.    RTS
  13585.  
  13586. +  LDX #MALLOCmEMnEXTpTR
  13587.    LDY #6
  13588.    JSR ZPLOAD
  13589.    LDA MALLOCmEMlENGTH
  13590.    CMP MALLOClENGTH
  13591.    LDA MALLOCmEMlENGTH+1
  13592.    SBC MALLOClENGTH+1
  13593.    BCS MALLOCgOTbLOCK
  13594.    LDX #3
  13595. -  LDA ZP,X
  13596.    STA MALLOCq,X
  13597.    LDA MALLOCmEMnEXTpTR,X
  13598.    STA ZP,X
  13599.    DEX
  13600.    BPL -
  13601.    JMP MALLOClOOK
  13602.  
  13603.    MALLOCgOTbLOCK = *
  13604.    LDA MALLOCmEMlENGTH
  13605.    CMP MALLOClENGTH
  13606.    BNE +
  13607.    LDA MALLOCmEMlENGTH+1
  13608.    SBC MALLOClENGTH+1
  13609.    BEQ MALLOCtAKEwHOLEbLOCK
  13610. +  SEC
  13611.    LDA MALLOCmEMlENGTH
  13612.    SBC MALLOClENGTH
  13613.    STA MALLOCmEMlENGTH
  13614.    LDA MALLOCmEMlENGTH+1
  13615.    SBC MALLOClENGTH+1
  13616.    STA MALLOCmEMlENGTH+1
  13617.    LDX #MALLOCmEMnEXTpTR
  13618.    LDY #6
  13619.    JSR ZPSTORE
  13620.    CLC
  13621.    LDA ZP+0
  13622.    ADC MALLOCmEMlENGTH
  13623.    STA ZP+0
  13624.    LDA ZP+1
  13625.    ADC MALLOCmEMlENGTH+1
  13626.    STA ZP+1
  13627.    CLC
  13628.    RTS
  13629.  
  13630.    MALLOCtAKEwHOLEbLOCK = *
  13631.    LDA MALLOCq+3
  13632.    CMP #ACEmEMnULL
  13633.    BNE +
  13634.    LDX #3
  13635. -  LDA MALLOCmEMnEXTpTR,X
  13636.    STA MALLOChEAD,X
  13637.    DEX
  13638.    BPL -
  13639.    CLC
  13640.    RTS
  13641. +  LDX #3
  13642. -  LDA ZP,X
  13643.    LDY MALLOCq,X
  13644.    STA MALLOCq,X
  13645.    STY ZP,X
  13646.    DEX
  13647.    BPL -
  13648.    LDX #MALLOCmEMnEXTpTR
  13649.    LDY #4
  13650.    JSR ZPSTORE
  13651.    LDX #3
  13652. -  LDA MALLOCq,X
  13653.    STA ZP,X
  13654.    DEX
  13655.    BPL -
  13656.    CLC
  13657.    RTS
  13658.  
  13659. ;*** FREE( [ZP]=fARpOINTER, .ay=lENGTH )  {$7b}ALTERS [ZP]{$7d}
  13660.  
  13661. FREEmEMnEXTpTR = MALLOCwORK+0  ;(4)
  13662. FREEmEMlENGTH  = MALLOCwORK+4  ;(2)
  13663. FREElENGTH     = MALLOCwORK+6  ;(2)
  13664. FREEnEWpTR     = MALLOCwORK+8  ;(4)
  13665. FREEq          = MALLOCwORK+12 ;(4)
  13666.  
  13667. FREE = *
  13668.    CLC
  13669.    ADC #7
  13670.    BCC +
  13671.    INY
  13672. +  AND #$F8
  13673.    STA FREElENGTH+0
  13674.    STY FREElENGTH+1
  13675.    LDX #3
  13676. -  LDA ZP,X
  13677.    STA FREEnEWpTR,X
  13678.    LDA MALLOChEAD,X
  13679.    STA ZP,X
  13680.    LDA #ACEmEMnULL
  13681.    STA FREEq,X
  13682.    DEX
  13683.    BPL -
  13684.  
  13685.    FREEsEARCHlOOP = *
  13686.    LDA ZP+3
  13687.    CMP #ACEmEMnULL
  13688.    BEQ FREEcOALESCEqANDnEW
  13689.    LDA ZP+0
  13690.    CMP FREEnEWpTR+0
  13691.    LDA ZP+1
  13692.    SBC FREEnEWpTR+1
  13693.    LDA ZP+2
  13694.    SBC FREEnEWpTR+2
  13695.    LDA ZP+3
  13696.    SBC FREEnEWpTR+3
  13697.    BCS FREEcOALESCEqANDnEW
  13698. +  LDX #FREEmEMnEXTpTR
  13699.    LDY #4
  13700.    JSR ZPLOAD
  13701.    LDX #3
  13702. -  LDA ZP,X
  13703.    STA FREEq,X
  13704.    LDA FREEmEMnEXTpTR,X
  13705.    STA ZP,X
  13706.    DEX
  13707.    BPL -
  13708.    BMI FREEsEARCHlOOP
  13709.  
  13710.    FREEcOALESCEqANDnEW = *
  13711.    LDX #3
  13712. -  LDA FREEq,X
  13713.    STA ZP,X
  13714.    DEX
  13715.    BPL -
  13716.    LDA ZP+3
  13717.    CMP #ACEmEMnULL
  13718.    BNE +
  13719.    ;** PREV IS HEAD
  13720.    LDX #3
  13721. -  LDA MALLOChEAD,X
  13722.    STA FREEmEMnEXTpTR,X
  13723.    LDA FREEnEWpTR,X
  13724.    STA MALLOChEAD,X
  13725.    DEX
  13726.    BPL -
  13727.    LDA FREElENGTH+0
  13728.    LDY FREElENGTH+1
  13729.    STA FREEmEMlENGTH+0
  13730.    STY FREEmEMlENGTH+1
  13731.    JMP FREEcOALESCEnEWaNDp
  13732.  
  13733.    ;** PREV IS REAL
  13734. +  LDX #FREEmEMnEXTpTR
  13735.    LDY #6
  13736.    JSR ZPLOAD
  13737.    LDA ZP+3
  13738.    CMP FREEnEWpTR+3
  13739.    BNE +
  13740.    LDA ZP+2
  13741.    CMP FREEnEWpTR+2
  13742.    BNE +
  13743.    CLC
  13744.    LDA ZP
  13745.    ADC FREEmEMlENGTH
  13746.    TAX
  13747.    LDA ZP+1
  13748.    ADC FREEmEMlENGTH+1
  13749.    CMP FREEnEWpTR+1
  13750.    BNE +
  13751.    CPX FREEnEWpTR
  13752.    BNE +
  13753.    ;** PREV DOES COALESCE
  13754.    CLC
  13755.    LDA FREEmEMlENGTH
  13756.    ADC FREElENGTH
  13757.    STA FREEmEMlENGTH
  13758.    LDA FREEmEMlENGTH+1
  13759.    ADC FREElENGTH+1
  13760.    STA FREEmEMlENGTH+1
  13761.    LDX #3
  13762. -  LDA FREEq,X
  13763.    STA FREEnEWpTR,X
  13764.    DEX
  13765.    BPL -
  13766.    BMI FREEcOALESCEnEWaNDp
  13767.  
  13768.    ;** PREV DOES NOT COALESCE
  13769. +  LDX #FREEnEWpTR
  13770.    LDY #4
  13771.    JSR ZPSTORE
  13772.    LDA FREElENGTH+0
  13773.    LDY FREElENGTH+1
  13774.    STA FREEmEMlENGTH+0
  13775.    STY FREEmEMlENGTH+1
  13776.  
  13777.    FREEcOALESCEnEWaNDp = *
  13778.    LDA FREEnEWpTR+3
  13779.    CMP FREEmEMnEXTpTR+3
  13780.    BNE +
  13781.    LDA FREEnEWpTR+2
  13782.    CMP FREEmEMnEXTpTR+2
  13783.    BNE +
  13784.    CLC
  13785.    LDA FREEnEWpTR
  13786.    ADC FREEmEMlENGTH
  13787.    TAX
  13788.    LDA FREEnEWpTR+1
  13789.    ADC FREEmEMlENGTH+1
  13790.    CMP FREEmEMnEXTpTR+1
  13791.    BNE +
  13792.    CPX FREEmEMnEXTpTR
  13793.    BNE +
  13794.  
  13795.    ;** NEW AND NEXT COALESCE
  13796.    LDX #3
  13797. -  LDA FREEmEMnEXTpTR,X
  13798.    STA ZP,X
  13799.    DEX
  13800.    BPL -
  13801.    LDA FREEmEMlENGTH+1
  13802.    PHA
  13803.    LDA FREEmEMlENGTH+0
  13804.    PHA
  13805.    LDX #FREEmEMnEXTpTR
  13806.    LDY #6
  13807.    JSR ZPLOAD
  13808.    CLC
  13809.    PLA
  13810.    ADC FREEmEMlENGTH+0
  13811.    STA FREEmEMlENGTH+0
  13812.    PLA
  13813.    ADC FREEmEMlENGTH+1
  13814.    STA FREEmEMlENGTH+1
  13815.  
  13816. +  LDX #3
  13817. -  LDA FREEnEWpTR,X
  13818.    STA ZP,X
  13819.    DEX
  13820.    BPL -
  13821.    LDX #FREEmEMnEXTpTR
  13822.    LDY #6
  13823.    JSR ZPSTORE
  13824.    CLC
  13825.    RTS
  13826.  
  13827. ;=== LINE i/o ROUTINES ===
  13828.  
  13829. YSAVE = $70
  13830.  
  13831. GETLINE = *  ;( INFILE ) : SORTLINE, .cs=EOF
  13832.    LDY #0
  13833. -  STY YSAVE
  13834.    JSR GETbYTE
  13835.    LDY YSAVE
  13836.    BCS +
  13837.    STA SORTLINE,Y
  13838.    INY
  13839.    CPY #240
  13840.    BCS GETLINEeXIT
  13841.    CMP #13
  13842.    BNE -
  13843.    DEY
  13844.  
  13845.    GETLINEeXIT = *
  13846.    LDA #0
  13847.    STA SORTLINE,Y
  13848.    CLC
  13849.    TYA
  13850.    ADC #6
  13851.    STA SORTBUFLEN
  13852.    CLC
  13853. +  RTS
  13854.  
  13855. PUTLINE = *  ;( SORTBUF )
  13856.    JSR STOPKEY
  13857.    BCC +
  13858.    JSR STOPPED
  13859. +  LDY SORTBUFLEN
  13860.    LDA #13
  13861.    STA SORTBUF-1,Y
  13862.    LDA #<SORTLINE
  13863.    LDY #>SORTLINE
  13864.    STA ZP+0
  13865.    STY ZP+1
  13866.    SEC
  13867.    LDA SORTBUFLEN
  13868.    SBC #5
  13869.    LDY #0
  13870.    LDX #STDOUT
  13871.    JSR WRITE
  13872.    LDY SORTBUFLEN
  13873.    LDA #0
  13874.    STA SORTBUF-1,Y
  13875.    RTS
  13876.  
  13877. GETbYTE = *
  13878.    LDA BUFcOUNT
  13879.    BEQ GETbYTEfILLbUF
  13880.    LDY BUFpTR
  13881.    LDA INbUF,Y
  13882.    INC BUFpTR
  13883.    DEC BUFcOUNT
  13884.    CLC
  13885.    RTS
  13886.  
  13887. GETbYTEfILLbUF = *
  13888.    JSR STOPKEY
  13889.    BCC +
  13890.    JSR STOPPED
  13891. +  LDA #<INbUF
  13892.    LDY #>INbUF
  13893.    STA ZP+0
  13894.    STY ZP+1
  13895.    LDA #254
  13896.    LDY #0
  13897.    STY BUFpTR
  13898.    LDX INFILE
  13899.    JSR READ
  13900.    BEQ +
  13901.    BCS +
  13902.    STA BUFcOUNT
  13903.    JMP GETbYTE
  13904. +  SEC
  13905.    RTS
  13906.  
  13907. ;===BSS===
  13908.  
  13909. BSS        = *
  13910. SORTBUF    = BSS+0
  13911. SORTBUFLEN = SORTBUF+4
  13912. SORTLINE   = SORTBUF+5
  13913. CMPBUF     = SORTBUF+256
  13914. CMPBUFLEN  = CMPBUF+4
  13915. CMPLINE    = CMPBUF+5
  13916. INbUF      = CMPBUF+256
  13917. TPAfREEMAP = INbUF+256
  13918. BSSeND     = TPAfREEMAP+256
  13919. TR.S
  13920. 476
  13921. ;*** TRANSLATION PROGRAM - BY cRAIG bRUCE, STARTED 10-jUL-93
  13922.  
  13923. .SEQ ACEHEAD.S
  13924. .ORG ACEaPPaDDRESS
  13925. .OBJ "@0:TR"
  13926.  
  13927. JMP MAIN
  13928. .ASC "Cb"
  13929. .BYTE $06
  13930.  
  13931. ;*** GLOBAL DECLARATIONS
  13932.  
  13933. LIBWORK = $40
  13934.  
  13935. CHRcr = $0D
  13936. CHRqUOTE = $22
  13937. MAXlINElEN = 2049
  13938. TRUE = $FF
  13939. FALSE = $00
  13940.  
  13941. TRpETSCII     = 0
  13942. TRaSCIIcRlF   = 1
  13943. TRaSCIIlF     = 2
  13944. TRaSCIIcR     = 3
  13945. TRsPEEDSCRIPT = 4
  13946.  
  13947. TRfROM  .BUF 1
  13948. TRtO    .BUF 1
  13949.  
  13950. ;******** STANDARD LIBRARY ********
  13951. PUTS = *
  13952.    LDX #STDOUT
  13953. FPUTS = *
  13954.    STA ZP
  13955.    STY ZP+1
  13956.    LDY #$FF
  13957. -  INY
  13958.    LDA (ZP),Y
  13959.    BNE -
  13960.    TYA
  13961.    LDY #0
  13962.    JMP WRITE
  13963. EPUTS = *
  13964.    LDX #STDERR
  13965.    JMP FPUTS
  13966.  
  13967. PUTCHAR = *
  13968.    LDX #STDOUT
  13969. PUTC = *
  13970.    STA PUTCbUFFER
  13971.    LDA #<PUTCbUFFER
  13972.    LDY #>PUTCbUFFER
  13973.    STA ZP
  13974.    STY ZP+1
  13975.    LDA #1
  13976.    LDY #0
  13977.    JMP WRITE
  13978.    PUTCbUFFER .BUF 1
  13979.  
  13980. GETARG = *
  13981.    STY ZP+1
  13982.    ASL
  13983.    STA ZP
  13984.    ROL ZP+1
  13985.    CLC
  13986.    LDA ACEaRGV
  13987.    ADC ZP
  13988.    STA ZP
  13989.    LDA ACEaRGV+1
  13990.    ADC ZP+1
  13991.    STA ZP+1
  13992.    LDY #0
  13993.    LDA (ZP),Y
  13994.    TAX
  13995.    INY
  13996.    LDA (ZP),Y
  13997.    STX ZP
  13998.    STA ZP+1
  13999.    RTS
  14000.  
  14001. ;===MAIN===
  14002. ARG = 2
  14003. NAME = 4
  14004. STRING = 8
  14005.  
  14006. MAIN = *
  14007.    LDA #TRaSCIIcRlF
  14008.    STA TRfROM
  14009.    LDA #TRpETSCII
  14010.    STA TRtO
  14011.    ;** CHECK ARGUMENT COUNT
  14012.    LDA ACEaRGC+1
  14013.    BNE ENOUGHaRGS
  14014.    LDA ACEaRGC+0
  14015.    CMP #2
  14016.    BCS ENOUGHaRGS
  14017.    JMP USAGE
  14018.  
  14019. ENOUGHaRGS = *
  14020.    LDA #1
  14021.    LDY #0
  14022.    STA ARG+0
  14023.    STY ARG+1
  14024.    JSR GETARG
  14025.    LDY #0
  14026.    LDA (ZP),Y
  14027.    CMP #"-"
  14028.    BNE FILEaRG
  14029.    INC ARG
  14030.    INY
  14031.    JSR GETtRtYPE
  14032.    STX TRfROM
  14033.    INY
  14034.    JSR GETtRtYPE
  14035.    STX TRtO
  14036.  
  14037.    FILEaRG = *
  14038.    JSR INIToUTbUF
  14039. -  JSR STOPKEY
  14040.    BCC +
  14041.    JMP STOPPED
  14042. +  LDA ARG+0
  14043.    LDY ARG+1
  14044.    JSR GETARG
  14045.    LDA ZP+0
  14046.    LDY ZP+1
  14047.    STA NAME+0
  14048.    STY NAME+1
  14049.    ORA ZP+1
  14050.    BEQ MAINeXIT
  14051.    JSR TRfILE
  14052.    BCC +
  14053.    JSR ERROR
  14054. +  INC ARG+0
  14055.    BNE +
  14056.    INC ARG+1
  14057. +  JMP -
  14058.  
  14059. MAINeXIT = *
  14060.    JSR FLUSHoUTbUF
  14061.    RTS
  14062.  
  14063. GETtRtYPE = *  ;( (ZP)+.Y=STR ) : .x=TYPE
  14064.    LDA (ZP),Y
  14065.    INY
  14066.    LDX #TRpETSCII
  14067.    CMP #"P"
  14068.    BEQ GETtRrET
  14069.    LDX #TRsPEEDSCRIPT
  14070.    CMP #"S"
  14071.    BEQ GETtRrET
  14072.    LDX #TRaSCIIlF
  14073.    CMP #"U"
  14074.    BEQ GETtRrET
  14075.    LDX #TRaSCIIcRlF
  14076.    CMP #"M"
  14077.    BEQ GETtRrET
  14078.    LDX #TRpETSCII
  14079.    CMP #"C"
  14080.    BEQ GETtRrET
  14081.    CMP #"A"
  14082.    BNE USAGE
  14083.    LDA (ZP),Y
  14084.    INY
  14085.    LDX #TRaSCIIlF
  14086.    CMP #"L"
  14087.    BEQ GETtRrET
  14088.    LDX #TRaSCIIcR
  14089.    CMP #"C"
  14090.    BEQ GETtRrET
  14091.    CMP #"R"
  14092.    BEQ GETtRrET
  14093.    DEY
  14094.    LDX #TRaSCIIcRlF
  14095.    GETtRrET = *
  14096.    CLC
  14097.    RTS
  14098.  
  14099. USAGE = *
  14100.    LDA #<USAGEmSG
  14101.    LDY #>USAGEmSG
  14102.    JSR EPUTS
  14103.    LDA #1
  14104.    JMP EXIT
  14105.  
  14106. USAGEmSG = *
  14107.    .ASC "USAGE: TR [-FROMSET2TOSET] FILE ..."
  14108.    .BYTE CHRcr
  14109.    .ASC "WHERE FROMSET/TOSET=P,A,AL,AC,S,C,U,M"
  14110.    .BYTE CHRcr
  14111.    .ASC "(PETSCII,ASC-CRLF,ASC-LF,ASC-CR,"
  14112.    .BYTE CHRcr
  14113.    .ASC " SPEEDSCRIPT,COMMODORE,UNIX,MS-DOS)"
  14114.    .BYTE CHRcr,0
  14115.  
  14116. STOPPED = *
  14117.    LDA #<STOPPEDmSG
  14118.    LDY #>STOPPEDmSG
  14119.    JSR EPUTS
  14120.    LDA #1
  14121.    JMP EXIT
  14122.    STOPPEDmSG = *
  14123.    .ASC "<sTOPPED>"
  14124.    .BYTE CHRcr,0
  14125.  
  14126. ERROR = *
  14127.    LDA #<ERRORmSG1
  14128.    LDY #>ERRORmSG1
  14129.    JSR EPUTS
  14130.    LDA NAME+0
  14131.    LDY NAME+1
  14132.    JSR EPUTS
  14133.    LDA #<ERRORmSG2
  14134.    LDY #>ERRORmSG2
  14135.    JMP EPUTS
  14136.    ERRORmSG1 = *
  14137.    .ASC "eRROR READING FILE "
  14138.    .BYTE CHRqUOTE,0
  14139.    ERRORmSG2 = *
  14140.    .BYTE CHRqUOTE,CHRcr,0
  14141.  
  14142. BUFpTR     = 10 ;(2)
  14143. BUFcOUNT   = 12 ;(2)
  14144. INFILE     = 14 ;(1)
  14145. INbUFlEN   = 16 ;(2)
  14146. READtRtAB  = 18 ;(2)
  14147. WRITEtRtAB = 20 ;(2)
  14148. OUTbUFcOUNT = 22 ;(1)
  14149.  
  14150. TRfILE = *
  14151.    JSR INITtR
  14152.    JSR INITiNbUF
  14153.    LDA NAME+0
  14154.    LDY NAME+1
  14155.    STA ZP+0
  14156.    STY ZP+1
  14157.    LDA #"R"
  14158.    JSR OPEN
  14159.    BCC +
  14160.    RTS
  14161. +  STA INFILE
  14162.    JSR TRbODY
  14163.    LDA INFILE
  14164.    JSR CLOSE
  14165.    RTS
  14166.  
  14167. TRbODY = *
  14168.    JSR GETbYTE
  14169.    BCS BODYeXIT
  14170.    LDX TRfROM
  14171.    BEQ BODYwRITE
  14172.    CMP #13
  14173.    BNE +
  14174.    CPX #TRaSCIIcRlF
  14175.    BEQ TRbODY
  14176.    CPX #TRaSCIIcR
  14177.    BEQ BODYwRITE
  14178. +  TAY
  14179.    LDA (READtRtAB),Y
  14180.  
  14181.    BODYwRITE = *
  14182.    LDX TRtO
  14183.    BEQ BODYrEP
  14184.    CMP #13
  14185.    BNE +
  14186.    CPX #TRsPEEDSCRIPT
  14187.    BEQ +
  14188.    CPX #TRaSCIIcR
  14189.    BEQ BODYrEP
  14190.    CPX #TRaSCIIlF
  14191.    BEQ +
  14192.    JSR PUTbYTE
  14193.    LDA #13
  14194. +  TAY
  14195.    LDA (WRITEtRtAB),Y
  14196.  
  14197.    BODYrEP = *
  14198.    JSR PUTbYTE
  14199.    JMP TRbODY
  14200.  
  14201.    BODYeXIT = *
  14202.    RTS
  14203.  
  14204. GETbYTE = *
  14205.    LDA BUFcOUNT+0
  14206.    ORA BUFcOUNT+1
  14207.    BEQ GETbYTEfILLbUF
  14208.    LDY #0
  14209.    LDA (BUFpTR),Y
  14210.    INC BUFpTR+0
  14211.    BNE +
  14212.    INC BUFpTR+1
  14213. +  LDX BUFcOUNT+0
  14214.    BNE +
  14215.    DEC BUFcOUNT+1
  14216. +  DEC BUFcOUNT+0
  14217.    CLC
  14218.    RTS
  14219.  
  14220. GETbYTEfILLbUF = *
  14221.    JSR STOPKEY
  14222.    BCC +
  14223.    JSR STOPPED
  14224. +  LDA #<INbUF
  14225.    LDY #>INbUF
  14226.    STA ZP+0
  14227.    STY ZP+1
  14228.    STA BUFpTR+0
  14229.    STY BUFpTR+1
  14230.    LDA INbUFlEN+0
  14231.    LDY INbUFlEN+1
  14232.    LDX INFILE
  14233.    JSR READ
  14234.    BEQ +
  14235.    BCS +
  14236.    STA BUFcOUNT+0
  14237.    STY BUFcOUNT+1
  14238.    JMP GETbYTE
  14239. +  SEC
  14240.    RTS
  14241.  
  14242. INITiNbUF = *
  14243.    SEC
  14244.    LDA ACEsTACKpTR+0
  14245.    SBC #<INbUF
  14246.    STA INbUFlEN+0
  14247.    LDA ACEsTACKpTR+1
  14248.    SBC #>INbUF
  14249.    STA INbUFlEN+1
  14250.    LDA #0
  14251.    STA BUFcOUNT+0
  14252.    STA BUFcOUNT+1
  14253.    LDX #STDOUT
  14254.    JSR DEVINFO
  14255.    CMP #0
  14256.    BNE +
  14257.    LDA #<254
  14258.    LDY #>254
  14259.    STA INbUFlEN+0
  14260.    STY INbUFlEN+1
  14261. +  RTS
  14262.  
  14263. PUTbYTE = *
  14264.    LDX OUTbUFcOUNT
  14265.    CPX #254
  14266.    BCC +
  14267.    PHA
  14268.    JSR FLUSHoUTbUF
  14269.    PLA
  14270.    LDX OUTbUFcOUNT
  14271. +  STA OUTbUF,X
  14272.    INC OUTbUFcOUNT
  14273.    RTS
  14274.  
  14275. FLUSHoUTbUF = *
  14276.    JSR STOPKEY
  14277.    BCC +
  14278.    JMP STOPPED
  14279. +  LDA #<OUTbUF
  14280.    LDY #>OUTbUF
  14281.    STA ZP+0
  14282.    STY ZP+1
  14283.    LDA OUTbUFcOUNT
  14284.    LDY #0
  14285.    LDX #STDOUT
  14286.    JSR WRITE
  14287.    LDA #0
  14288.    STA OUTbUFcOUNT
  14289.    RTS
  14290.  
  14291. INIToUTbUF = *
  14292.    LDA #0
  14293.    STA OUTbUFcOUNT
  14294.    RTS
  14295.  
  14296. INITtR = *
  14297.    LDA TRfROM
  14298.    ASL
  14299.    TAX
  14300.    LDA READtR,X
  14301.    STA READtRtAB+0
  14302.    LDA READtR+1,X
  14303.    STA READtRtAB+1
  14304.    LDA TRtO
  14305.    ASL
  14306.    TAX
  14307.    LDA WRITEtR,X
  14308.    STA WRITEtRtAB+0
  14309.    LDA WRITEtR+1,X
  14310.    STA WRITEtRtAB+1
  14311.    RTS
  14312.  
  14313. READtR  .WORD 0,ASCtOpET,ASCtOpET,ASCtOpET,SPDtOpET
  14314. WRITEtR .WORD 0,PETtOaSC,PETtOaSC,PETtOaSC,PETtOsPD
  14315.  
  14316. ASCtOpET = *
  14317.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  14318. .BYTE $00,$01,$02,$03,$04,$05,$06,$07,$9D,$09,$0D,$0B,$93,$0A,$0E,$0F ;0
  14319. .BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;1
  14320. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  14321. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  14322. .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
  14323. .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
  14324. .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
  14325. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
  14326. .BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;8
  14327. .BYTE $90,$91,$92,$0C,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$08,$9E,$9F ;9
  14328. .BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;A
  14329. .BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;B
  14330. .BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;C
  14331. .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;D
  14332. .BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;E
  14333. .BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;F
  14334.  
  14335. SPDtOpET = *
  14336.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  14337. .BYTE $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;0
  14338. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$0D ;1
  14339. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  14340. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  14341. .BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
  14342. .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;5
  14343. .BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;6
  14344. .BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;7
  14345. .BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$5F,$0E,$0F ;8
  14346. .BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;9
  14347. .BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;A
  14348. .BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;B
  14349. .BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;C
  14350. .BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;D
  14351. .BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;E
  14352. .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;F
  14353.  
  14354. PETtOaSC = *
  14355.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  14356. .BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0D,$0B,$93,$0A,$0E,$0F ;0
  14357. .BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F ;1
  14358. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  14359. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  14360. .BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
  14361. .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
  14362. .BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;6
  14363. .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;7
  14364. .BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F ;8
  14365. .BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;9
  14366. .BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;A
  14367. .BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;B
  14368. .BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
  14369. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
  14370. .BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;E
  14371. .BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;F
  14372.  
  14373. PETtOsPD = *
  14374.        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  14375. .BYTE $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$1F,$8E,$8F ;0
  14376. .BYTE $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F ;1
  14377. .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  14378. .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  14379. .BYTE $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F ;4
  14380. .BYTE $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$8D ;5
  14381. .BYTE $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ;6
  14382. .BYTE $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ;7
  14383. .BYTE $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;8
  14384. .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ;9
  14385. .BYTE $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;A
  14386. .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F ;B
  14387. .BYTE $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
  14388. .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F ;D
  14389. .BYTE $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ;E
  14390. .BYTE $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF ;F
  14391.  
  14392. ;===BSS===
  14393.  
  14394. BSS     = *
  14395. OUTbUF  = BSS
  14396. INbUF   = OUTbUF+256
  14397. UNBCODE.S
  14398. 812
  14399. ;*** unbcode: BCODE DECODER VERSION 1.00 - BY cRAIG bRUCE - 25-nOV-93
  14400.  
  14401. ;ASSUMES 1-65535 SEGMENTS, 1-65536 TEMP FILES MAX, 0-4 g FILE LENGTH, 64 FRAGS
  14402.  
  14403. .SEQ ACEHEAD.S
  14404. .ORG ACEaPPaDDRESS
  14405. .OBJ "@0:UNBCODE"
  14406.  
  14407. JMP MAIN
  14408. .ASC "Cb"
  14409.  
  14410. ;*** GLOBAL DECLARATIONS
  14411.  
  14412. CHRlf = $0A
  14413. CHRcr = $0D
  14414. CHRqUOTE = $22
  14415. TRUE = $FF
  14416. FALSE = $00
  14417.  
  14418. MAXcHUNK    = 64
  14419. MAXlINE     = 85
  14420. MAXfILENAME = 85
  14421. MAXhAVE     = 64
  14422. MAXtEMPNAME = 20
  14423. COPYbUFsIZE = 4096
  14424. VERSION .ASC "1.00"
  14425.         .BYTE 0
  14426.  
  14427. HRfROMsEG      = 0  ;(2)
  14428. HRtOsEG        = 2  ;(2)
  14429. HRtEMPfILEnAME = 4  ;(2)
  14430. HRvALIDlENGTH  = 6  ;(4)
  14431. HRiSeND        = 10 ;(1)
  14432. HRfILENAME     = 11 ;(17)
  14433. HRsIZE         = 32 ;(REALLY 28)
  14434.  
  14435. ASCIIfILE .BUF 1
  14436. TEMP .BUF 1
  14437.  
  14438. PROGnAME     .BUF 2
  14439. INFORMATIVE  .BUF 1
  14440. VERBOSE      .BUF 1
  14441. DEBUG        .BUF 1
  14442. READfILENAME .BUF 2
  14443. READlINEnUM  .BUF 4
  14444. HAVEcOUNT    .BUF 1
  14445. STATUSfILEeXISTS .BUF 1
  14446. NEXTtEMPnAME .BUF 2
  14447. FILENAMEuSED .BUF 1
  14448.  
  14449. ARG        = 2  ;(2)
  14450. NAME       = 4  ;(2)
  14451. INbUFlEN   = 6  ;(2)
  14452. BUFpTR     = 8  ;(2)
  14453. BUFcOUNT   = 10 ;(2)
  14454. INFILE     = 12 ;(1)
  14455. OUTFILE    = 13 ;(1)
  14456. OUTnAME    = 14 ;(2)
  14457. SEGNUM     = 16 ;(4)
  14458. CONVERTlEN = 20 ;(1)
  14459. GETLINEpOS = 21 ;(1)
  14460. SCANvAL    = 22 ;(4)
  14461. CRC        = 26 ;(4)
  14462. BYTES      = 30 ;(4)
  14463. ISeND      = 34 ;(1)
  14464. CURhAVE    = 35 ;(1)
  14465. TEMPnAME   = 36 ;(4)  : REALLY ONLY USES 2
  14466. H          = 40 ;(2)
  14467. NEXTh      = 42 ;(2)
  14468. HAVErEC    = 44 ;(1)
  14469. FIN        = 45 ;(1)
  14470. FOUT       = 46 ;(1)
  14471. WORK       = 112 ;(16)
  14472.  
  14473. CRCtABLE0 = *
  14474.    .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
  14475.    .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
  14476.    .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
  14477.    .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
  14478.    .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
  14479.    .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
  14480.    .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
  14481.    .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
  14482.    .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
  14483.    .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
  14484.    .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
  14485.    .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
  14486.    .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
  14487.    .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
  14488.    .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
  14489.    .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
  14490.  
  14491. CRCtABLE1 = *
  14492.    .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
  14493.    .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
  14494.    .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
  14495.    .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
  14496.    .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
  14497.    .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
  14498.    .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
  14499.    .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
  14500.    .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
  14501.    .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
  14502.    .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
  14503.    .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
  14504.    .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
  14505.    .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
  14506.    .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
  14507.    .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
  14508.  
  14509. CRCtABLE2 = *
  14510.    .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
  14511.    .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
  14512.    .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
  14513.    .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
  14514.    .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
  14515.    .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
  14516.    .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
  14517.    .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
  14518.    .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
  14519.    .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
  14520.    .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
  14521.    .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
  14522.    .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
  14523.    .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
  14524.    .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
  14525.    .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
  14526.  
  14527. CRCtABLE3 = *
  14528.    .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
  14529.    .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
  14530.    .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
  14531.    .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
  14532.    .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
  14533.    .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
  14534.    .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
  14535.    .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
  14536.    .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
  14537.    .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
  14538.    .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
  14539.    .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
  14540.    .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
  14541.    .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
  14542.    .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
  14543.    .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
  14544.  
  14545. ;******** STANDARD LIBRARY ********
  14546. PUTS = *
  14547.    LDX #STDOUT
  14548. FPUTS = *
  14549.    STA ZP+0
  14550.    STY ZP+1
  14551.    LDY #$FF
  14552. -  INY
  14553.    LDA (ZP),Y
  14554.    BNE -
  14555.    TYA
  14556.    LDY #0
  14557.    JMP WRITE
  14558. EPUTS = *
  14559.    LDX #STDERR
  14560.    JMP FPUTS
  14561.  
  14562. EPUTCHAR = *
  14563.    LDX #STDERR
  14564.    JMP PUTC
  14565. PUTCHAR = *
  14566.    LDX #STDOUT
  14567. PUTC = *
  14568.    STA PUTCbUFFER
  14569.    LDA #<PUTCbUFFER
  14570.    LDY #>PUTCbUFFER
  14571.    STA ZP+0
  14572.    STY ZP+1
  14573.    LDA #1
  14574.    LDY #0
  14575.    JMP WRITE
  14576.    PUTCbUFFER .BUF 1
  14577.  
  14578. GETCHAR = *
  14579.    LDX #STDIN
  14580. GETC = *
  14581.    LDA #<GETCbUFFER
  14582.    LDY #>GETCbUFFER
  14583.    STA ZP+0
  14584.    STY ZP+1
  14585.    LDA #1
  14586.    LDY #0
  14587.    JSR READ
  14588.    BEQ +
  14589.    LDA GETCbUFFER
  14590.    RTS
  14591. +  SEC
  14592.    RTS
  14593.    GETCbUFFER .BUF 1
  14594.  
  14595. GETARG = *
  14596.    STY ZP+1
  14597.    ASL
  14598.    STA ZP+0
  14599.    ROL ZP+1
  14600.    CLC
  14601.    LDA ACEaRGV
  14602.    ADC ZP+0
  14603.    STA ZP+0
  14604.    LDA ACEaRGV+1
  14605.    ADC ZP+1
  14606.    STA ZP+1
  14607.    LDY #0
  14608.    LDA (ZP),Y
  14609.    TAX
  14610.    INY
  14611.    LDA (ZP),Y
  14612.    STX ZP+0
  14613.    STA ZP+1
  14614.    RTS
  14615.  
  14616. ;===UNBCODE===
  14617. MAIN = *
  14618.    ;** CHECK FOR LARGE ENOUGH tpa
  14619.    SEC
  14620.    LDA #<BSSeND
  14621.    CMP ACEsTACKpTR+0
  14622.    LDA #>BSSeND
  14623.    SBC ACEsTACKpTR+1
  14624.    BCC TPAoK
  14625.    LDA #<TPAmSG
  14626.    LDY #>TPAmSG
  14627.    JSR EPUTS
  14628. DIE = *
  14629.    LDA #1
  14630.    LDX #0
  14631.    JMP EXIT
  14632.  
  14633. TPAmSG = *
  14634.    .ASC "iNSUFFICIENT PROGRAM SPACE TO RUN UNBCODE"
  14635.    .BYTE CHRcr,0
  14636.  
  14637. TPAoK = *
  14638.    ;** CHECK ARGUMENT COUNT
  14639.    LDA ACEaRGC+1
  14640.    BEQ +
  14641.    JMP ENOUGHaRGS
  14642. +  LDA ACEaRGC+0
  14643.    CMP #2
  14644.    BCC USAGE
  14645.    JMP ENOUGHaRGS
  14646.  
  14647. USAGE = *
  14648.    LDA #<USAGEmSG
  14649.    LDY #>USAGEmSG
  14650.    JSR EPUTS
  14651.    JMP DIE
  14652.  
  14653. USAGEmSG = *
  14654.    .ASC "USAGE: UNBCODE [-V] [-I] [-D] [-HELP] FILENAME ..."
  14655.    .BYTE CHRcr
  14656.    .ASC "       [-V]=VERBOSE, [-I]=INFORMATIVE, [-D]=DEBUGGING INFO"
  14657.    .BYTE CHRcr,0
  14658.  
  14659. ENOUGHaRGS = *
  14660.    ;** SET GLOBALS
  14661.    LDA #TRUE
  14662.    STA INFORMATIVE
  14663.    LDA #FALSE
  14664.    STA VERBOSE
  14665.    LDA #FALSE
  14666.    STA DEBUG
  14667.    LDA #0
  14668.    LDY #0
  14669.    JSR GETARG
  14670.    LDA ZP+0
  14671.    LDY ZP+1
  14672.    STA PROGnAME+0
  14673.    STY PROGnAME+1
  14674.    LDA #FALSE
  14675.    STA FILENAMEuSED
  14676.    LDA #0
  14677.    STA TEMPpREFIX
  14678.    STA TEMPnAME+2
  14679.    STA TEMPnAME+3
  14680.    JSR LOADsTATUSfILE
  14681.  
  14682.    ;** GET INPUT BUFFER LENGTH
  14683.    SEC
  14684.    LDA ACEsTACKpTR+0
  14685.    SBC #<INbUF
  14686.    STA INbUFlEN+0
  14687.    LDA ACEsTACKpTR+1
  14688.    SBC #>INbUF
  14689.    STA INbUFlEN+1
  14690.    LDA #0
  14691.    STA ARG+0
  14692.    STA ARG+1
  14693.  
  14694.    MAINnEXT = *
  14695.    JSR CHECKsTOP
  14696.    INC ARG+0
  14697.    BNE +
  14698.    INC ARG+1
  14699. +  LDA ARG+0
  14700.    LDY ARG+1
  14701.    JSR GETARG
  14702.    LDA ZP+0
  14703.    ORA ZP+1
  14704.    BEQ MAINeXIT
  14705.    LDA ZP+0
  14706.    LDY ZP+1
  14707.    STA NAME+0
  14708.    STY NAME+1
  14709.    LDY #0
  14710.    LDA (ZP),Y
  14711.    CMP #"-"
  14712.    BNE +
  14713.    JSR HANDLEfLAGS
  14714.    JMP MAINnEXT
  14715. +  JSR ECHO
  14716.    JSR UNBCODE
  14717.    BCC +
  14718.    JSR ERROR
  14719. +  JMP MAINnEXT
  14720.  
  14721. MAINeXIT = *
  14722.    ;XX SHOULD READ FROM STDIN IF NO FILES
  14723.    JSR SAVEsTATUSfILE
  14724.    RTS
  14725.  
  14726. HANDLEfLAGS = *
  14727.    INY
  14728.    LDA (ZP),Y
  14729.    BNE +
  14730.    RTS
  14731. +  CMP #"D"
  14732.    BEQ FLAGd
  14733.    CMP #"V"
  14734.    BEQ FLAGv
  14735.    CMP #"I"
  14736.    BEQ FLAGi
  14737.    CMP #"H"
  14738.    BNE +
  14739.    JMP USAGE
  14740. +  NOP
  14741.    ;XX UNRECOGNIZED OPTION
  14742.    JMP HANDLEfLAGS
  14743.  
  14744. FLAGd = *
  14745.    LDA #TRUE
  14746.    STA DEBUG
  14747.    STA VERBOSE
  14748.    STA INFORMATIVE
  14749.    ;XX PRINT STUFF
  14750.    JMP HANDLEfLAGS
  14751.  
  14752. FLAGv = *
  14753.    LDA #TRUE
  14754.    STA VERBOSE
  14755.    STA INFORMATIVE
  14756.    ;XX PRINT VERSION
  14757.    JMP HANDLEfLAGS
  14758.  
  14759. FLAGi = *
  14760.    LDA #TRUE
  14761.    STA INFORMATIVE
  14762.    JMP HANDLEfLAGS
  14763.  
  14764. ERROR = *
  14765.    LDA #<ERRORmSG1
  14766.    LDY #>ERRORmSG1
  14767.    JSR EPUTS
  14768.    LDA NAME+0
  14769.    LDY NAME+1
  14770.    JSR EPUTS
  14771.    LDA #<ERRORmSG2
  14772.    LDY #>ERRORmSG2
  14773.    JSR EPUTS
  14774.    RTS
  14775.  
  14776. ERRORmSG1 = *
  14777.    .ASC "eRROR ATTEMPTING TO UNBCODE FILE "
  14778.    .BYTE CHRqUOTE,0
  14779. ERRORmSG2 = *
  14780.    .BYTE CHRqUOTE
  14781.    .ASC ", CONTINUING"
  14782.    .BYTE CHRcr,0
  14783.  
  14784. ECHO = *
  14785.    LDA #<ECHOmSG1
  14786.    LDY #>ECHOmSG1
  14787.    JSR EPUTS
  14788.    LDA NAME+0
  14789.    LDY NAME+1
  14790.    JSR EPUTS
  14791.    LDA #<ECHOmSG2
  14792.    LDY #>ECHOmSG2
  14793.    JMP EPUTS
  14794.  
  14795. ECHOmSG1 = *
  14796.    .ASC "UNBCODING FILE "
  14797.    .BYTE CHRqUOTE,0
  14798.  
  14799. ECHOmSG2 = *
  14800.    .BYTE CHRqUOTE
  14801.    .ASC "..."
  14802.    .BYTE CHRcr,0
  14803.  
  14804. CHECKsTOP = *
  14805.    JSR STOPKEY
  14806.    BCS +
  14807.    RTS
  14808. +  LDA #<STOPPEDmSG
  14809.    LDY #>STOPPEDmSG
  14810.    JSR EPUTS
  14811.    JMP DIE
  14812.  
  14813.    STOPPEDmSG = *
  14814.    .ASC "<sTOPPED>"
  14815.    .BYTE CHRcr,0
  14816.  
  14817. .SEQ UNBCODEHELP.S
  14818.  
  14819. STATfCB .BUF 1
  14820. STAThr  .BUF 1
  14821.  
  14822. WRITEsTATUSdATA = *  ;( STATfCB )
  14823.    LDA #255
  14824.    STA STAThr
  14825.    WRITEsTATUSnEXT = *
  14826.    INC STAThr
  14827.    LDA STAThr
  14828.    CMP HAVEcOUNT
  14829.    BCC +
  14830.    RTS
  14831. +  JSR GETh
  14832.    LDY #10
  14833. -  LDA (H),Y
  14834.    STA WORK,Y
  14835.    DEY
  14836.    BPL -
  14837.    ;** FROM SEGMENT
  14838.    LDX #WORK+HRfROMsEG
  14839.    JSR WRITEnUM5
  14840.    ;** TO SEGMENT
  14841.    LDX #WORK+HRtOsEG
  14842.    JSR WRITEnUM5
  14843.    ;** BEG/MID/END
  14844.    LDX #12
  14845.    LDA WORK+HRiSeND
  14846.    BNE +
  14847.    LDX #6
  14848.    LDA WORK+HRfROMsEG+0
  14849.    CMP #1
  14850.    BNE +
  14851.    LDA WORK+HRfROMsEG+1
  14852.    CMP #0
  14853.    BNE +
  14854.    LDX #0
  14855. +  TXA
  14856.    LDY #>BEGmIDeNDmSG
  14857.    CLC
  14858.    ADC #<BEGmIDeNDmSG
  14859.    BCC +
  14860.    INY
  14861. +  LDX STATfCB
  14862.    JSR FPUTS
  14863.    ;** LENGTH
  14864.    LDX #WORK+HRvALIDlENGTH
  14865.    JSR WRITEnUM10
  14866.    ;** TEMP NAME
  14867.    LDA #<TEMPnAMEpREFIX
  14868.    LDY #>TEMPnAMEpREFIX
  14869.    LDX STATfCB
  14870.    JSR FPUTS
  14871.    LDX #WORK+HRtEMPfILEnAME
  14872.    JSR WRITEnUM5
  14873.    ;** FILENAME
  14874.    LDA H+0
  14875.    LDY H+1
  14876.    CLC
  14877.    ADC #HRfILENAME
  14878.    BCC +
  14879.    INY
  14880. +  LDX STATfCB
  14881.    JSR FPUTS
  14882.    LDA #CHRcr
  14883.    LDX STATfCB
  14884.    JSR PUTC
  14885.    JMP WRITEsTATUSnEXT
  14886.  
  14887.    BEGmIDeNDmSG = *
  14888.    .BYTE "B","E","G"," "," ",0
  14889.    .BYTE "M","I","D"," "," ",0
  14890.    .BYTE "E","N","D"," "," ",0
  14891.    TEMPnAMEpREFIX = *
  14892.    .ASC "0bc"
  14893.    .BYTE 0
  14894.  
  14895. SAVEsTATUSfILE = *
  14896.    BIT VERBOSE
  14897.    BPL +
  14898.    LDA #<SAVEsTATmSG
  14899.    LDY #>SAVEsTATmSG
  14900.    JSR EPUTS
  14901. +  LDA #<STATUSfILENAME
  14902.    LDY #>STATUSfILENAME
  14903.    STA ZP+0
  14904.    STY ZP+1
  14905.    LDA HAVEcOUNT
  14906.    BNE ++
  14907.    LDA STATUSfILEeXISTS
  14908.    BNE +
  14909.    RTS
  14910. +  JSR REMOVE
  14911.    RTS
  14912. +  LDA #"W"
  14913.    JSR OPENoVERWRITE
  14914.    BCC +
  14915.    LDA #<STATUSwRITEeRRmSG
  14916.    LDY #>STATUSwRITEeRRmSG
  14917.    JSR EPUTS
  14918.    LDA #STDERR
  14919. +  STA STATfCB
  14920.    JSR WRITEsTATUSdATA
  14921.    LDA STATfCB
  14922.    CMP #STDERR
  14923.    BEQ +
  14924.    JSR CLOSE
  14925. +  RTS
  14926.  
  14927. SAVEsTATmSG = *
  14928.    .ASC "SAVING STATUS FILE 0bc-stat"
  14929.    .BYTE CHRcr,0
  14930. STATUSfILENAME = *
  14931.    .ASC "0bc-stat"
  14932.    .BYTE 0
  14933. STATUSwRITEeRRmSG = *
  14934.    .ASC "cANNOT OPEN "
  14935.    .BYTE CHRqUOTE
  14936.    .ASC "0bc-stat"
  14937.    .BYTE CHRqUOTE
  14938.    .ASC ", WRITING STATUS TO STDERR:"
  14939.    .BYTE CHRcr,0
  14940.  
  14941. DISCARDsEGMENT = *
  14942.    LDA CURhAVE
  14943.    JSR GETh
  14944.    LDY #HRfROMsEG
  14945.    LDA SEGNUM+0
  14946.    CMP (H),Y
  14947.    BNE DISCARDaPPENDEDsEG
  14948.    INY
  14949.    LDA SEGNUM+1
  14950.    CMP (H),Y
  14951.    BNE DISCARDaPPENDEDsEG
  14952.  
  14953.    ;** THIS IS THE ONLY SEGMENT IN THE FRAGMENT, DELETE IT
  14954.    LDA #<DISCmSG
  14955.    LDY #>DISCmSG
  14956.    JSR EPUTS
  14957.    JSR FETCHtEMPnAME
  14958.    LDA #TRUE
  14959.    JSR GETtEMPnAMEsTR
  14960.    LDA #<TEMPnAMEsTR
  14961.    LDY #>TEMPnAMEsTR
  14962.    STA ZP+0
  14963.    STY ZP+1
  14964.    JSR REMOVE
  14965.    LDA CURhAVE
  14966.    JSR REMOVEhAVErEC
  14967.  
  14968.    DISCARDsEGeXIT = *
  14969.    BIT DEBUG
  14970.    BPL +
  14971.    LDX #STDERR
  14972.    STX STATfCB
  14973.    JSR WRITEsTATUSdATA
  14974. +  RTS
  14975.  
  14976. DISCmSG = *
  14977.    .ASC "DISCARDING SEGMENT"
  14978.    .BYTE CHRcr,0
  14979.  
  14980. DISCARDaPPENDEDsEG = *
  14981.    LDY #HRtOsEG
  14982.    SEC
  14983.    LDA SEGNUM+0
  14984.    SBC #1
  14985.    STA (H),Y
  14986.    INY
  14987.    LDA SEGNUM+1
  14988.    SBC #0
  14989.    STA (H),Y
  14990.    LDA #<DISCaPPmSG
  14991.    LDY #>DISCaPPmSG
  14992.    JSR EPUTS
  14993.    ;** GET AND OPEN NEW TEMP FILE
  14994.    JSR GETtEMPfILEnAMEoNLY
  14995.    LDA #"W"
  14996.    STA FILEmODE
  14997.    JSR OPENtEMPfILE
  14998.    LDA OUTFILE
  14999.    STA FOUT
  15000.    BCS DISCARDsEGeXIT
  15001.    ;** OPEN OLD TEMP FILE
  15002.    LDA CURhAVE
  15003.    JSR GETh
  15004.    LDY #HRtEMPfILEnAME
  15005.    LDA (H),Y
  15006.    PHA
  15007.    LDA TEMPnAME+0
  15008.    STA (H),Y
  15009.    PLA
  15010.    STA TEMPnAME+0
  15011.    INY
  15012.    LDA (H),Y
  15013.    PHA
  15014.    LDA TEMPnAME+1
  15015.    STA (H),Y
  15016.    PLA
  15017.    STA TEMPnAME+1
  15018.    LDA #"R"
  15019.    STA FILEmODE
  15020.    JSR OPENtEMPfILE
  15021.    LDA OUTFILE
  15022.    STA FIN
  15023.    BCC +
  15024.    LDA FOUT
  15025.    JSR CLOSE
  15026.    JMP DISCARDsEGeXIT
  15027. +  STA FIN
  15028.    ;** COPY VALID CONTENTS INTO NEW TEMP FILE
  15029.    LDX #3
  15030.    LDY #HRvALIDlENGTH+3
  15031. -  LDA (H),Y
  15032.    STA BYTES,X
  15033.    DEY
  15034.    DEX
  15035.    BPL -
  15036.    JSR COPYfILE
  15037.    ;** REMOVE OLD TEMP FILE
  15038.    LDA #<TEMPnAMEsTR
  15039.    LDY #>TEMPnAMEsTR
  15040.    STA ZP+0
  15041.    STY ZP+1
  15042.    JSR REMOVE
  15043.    JMP DISCARDsEGeXIT
  15044.  
  15045. DISCaPPmSG = *
  15046.    .ASC "DISCARDING APPENDED SEGMENT"
  15047.    .BYTE CHRcr,0
  15048.  
  15049. LOADsTATUSfILE = *
  15050.    BIT VERBOSE
  15051.    BPL +
  15052.    LDA #<LOADsTATmSG
  15053.    LDY #>LOADsTATmSG
  15054.    JSR EPUTS
  15055. +  LDA #0
  15056.    STA HAVEcOUNT
  15057.    LDA #FALSE
  15058.    STA STATUSfILEeXISTS
  15059.    LDA #1
  15060.    LDY #0
  15061.    STA NEXTtEMPnAME+0
  15062.    STY NEXTtEMPnAME+1
  15063.    LDA #<STATUSfILENAME
  15064.    LDY #>STATUSfILENAME
  15065.    STA ZP+0
  15066.    STY ZP+1
  15067.    LDA #"R"
  15068.    JSR OPEN
  15069.    BCS +
  15070.    STA STATfCB
  15071.    LDA #TRUE
  15072.    STA STATUSfILEeXISTS
  15073.    JSR SCANsTATUSfILE
  15074.    LDA STATfCB
  15075.    JSR CLOSE
  15076. +  RTS
  15077.  
  15078. LOADsTATmSG = *
  15079.    .ASC "SCANNING STATUS FILE 0bc-stat"
  15080.    .BYTE CHRcr,0
  15081.  
  15082. SSpOS .BUF 1
  15083.  
  15084. SCANsTATUSfILE = *
  15085.    ;** READ STATUS LINE
  15086.    LDX #0
  15087.    STX SSpOS
  15088. -  LDX STATfCB
  15089.    JSR GETC
  15090.    BCC +
  15091.    RTS
  15092. +  CMP #CHRcr
  15093.    BEQ +
  15094.    LDX SSpOS
  15095.    CPX #MAXlINE-1
  15096.    BCS -
  15097.    STA INlINE,X
  15098.    INC SSpOS
  15099.    JMP -
  15100. +  LDA #0
  15101.    LDX SSpOS
  15102.    STA INlINE,X
  15103.    CPX #42
  15104.    BCC SCANsTATUSfILE
  15105.    STA INlINE+52
  15106.  
  15107.    ;** SCAN STATUS LINE
  15108.    BIT DEBUG
  15109.    BPL +
  15110.    LDA #<INlINE
  15111.    LDY #>INlINE
  15112.    JSR EPUTS
  15113.    LDA #CHRcr
  15114.    JSR EPUTCHAR
  15115. +  LDX #HRsIZE-1
  15116.    LDA #0
  15117. -  STA TEMPhAVErEC,X
  15118.    DEX
  15119.    BPL -
  15120.  
  15121. ;0----+----1----+----2----+----3----+----4----+----5----+--
  15122. ;00001  00002  BEG  0000001140  0bc00007  NEW4
  15123. ;00004  00004  END  0000000189  0bc00004  1234567890123456.
  15124. ;00002  00003  END  0000000529  0bc00006  NEW5
  15125.  
  15126.    ;** FILENAME
  15127.    LDX #0
  15128. -  LDA INlINE+41,X
  15129.    STA TEMPhAVErEC+HRfILENAME,X
  15130.    BEQ +
  15131.    INX
  15132.    BNE -
  15133.    ;** ISeND
  15134. +  LDX #TRUE
  15135.    LDA INlINE+14
  15136.    CMP #"E"
  15137.    BEQ +
  15138.    LDX #FALSE
  15139. +  STX TEMPhAVErEC+HRiSeND
  15140.    ;** FROMsEG
  15141.    LDY #0
  15142.    JSR SCANnUM
  15143.    BCS SCANeRR
  15144.    LDA SCANvAL+0
  15145.    LDY SCANvAL+1
  15146.    STA TEMPhAVErEC+HRfROMsEG+0
  15147.    STY TEMPhAVErEC+HRfROMsEG+1
  15148.    ;** TOsEG
  15149.    LDY #7
  15150.    JSR SCANnUM
  15151.    BCS SCANeRR
  15152.    LDA SCANvAL+0
  15153.    LDY SCANvAL+1
  15154.    STA TEMPhAVErEC+HRtOsEG+0
  15155.    STY TEMPhAVErEC+HRtOsEG+1
  15156.    ;** VALIDlENGTH
  15157.    LDY #19
  15158.    JSR SCANnUM
  15159.    BCS SCANeRR
  15160.    LDA SCANvAL+0
  15161.    LDY SCANvAL+1
  15162.    STA TEMPhAVErEC+HRvALIDlENGTH+0
  15163.    STY TEMPhAVErEC+HRvALIDlENGTH+1
  15164.    LDA SCANvAL+2
  15165.    LDY SCANvAL+3
  15166.    STA TEMPhAVErEC+HRvALIDlENGTH+2
  15167.    STY TEMPhAVErEC+HRvALIDlENGTH+3
  15168.    ;** TEMPfILEnAME
  15169.    LDY #34
  15170.    JSR SCANnUM
  15171.    BCS SCANeRR
  15172.    LDA SCANvAL+0
  15173.    LDY SCANvAL+1
  15174.    STA TEMPhAVErEC+HRtEMPfILEnAME+0
  15175.    STY TEMPhAVErEC+HRtEMPfILEnAME+1
  15176.  
  15177.    ;** STORE STATUS INFO
  15178.    LDA HAVEcOUNT
  15179.    CMP #MAXhAVE
  15180.    BCC +
  15181.    LDA #<SCANtOOmANYfRAGS
  15182.    LDY #<SCANtOOmANYfRAGS
  15183.    JSR EPUTS
  15184.    SCANeRR = *
  15185.    JMP SCANsTATUSfILE
  15186. +  LDA HAVEcOUNT
  15187.    INC HAVEcOUNT
  15188.    JSR GETh
  15189.    LDY #HRsIZE-1
  15190. -  LDA TEMPhAVErEC,Y
  15191.    STA (H),Y
  15192.    DEY
  15193.    BPL -
  15194.    JMP SCANsTATUSfILE
  15195.  
  15196. SCANtOOmANYfRAGS = *
  15197.    .ASC "TOO MANY FRAGMENTS IN 0bc-stat, IGNORING FRAGMENT"
  15198.    .BYTE CHRcr,0
  15199.  
  15200. ;===BSS===
  15201. BSS         = *
  15202. INlINE      = BSS+0
  15203. TEMPpREFIX  = INlINE+MAXlINE
  15204. TEMPnAMEsTR = TEMPpREFIX+20
  15205. HAVES       = TEMPnAMEsTR+MAXfILENAME
  15206. COPYbUF     = HRsIZE*MAXhAVE+HAVES
  15207. DECODEtABLE = COPYbUF+COPYbUFsIZE
  15208. TEMPhAVErEC = DECODEtABLE+256
  15209. INbUF       = TEMPhAVErEC+HRsIZE
  15210. BSSeND      = INbUF+64
  15211. UNBCODEHELP.S
  15212. 1598
  15213. UNBCODE = *
  15214.    ;** OPEN FILE
  15215.    LDA NAME+0
  15216.    LDY NAME+1
  15217.    STA ZP+0
  15218.    STY ZP+1
  15219.    LDA #"R"
  15220.    JSR OPEN
  15221.    BCC +
  15222.    RTS
  15223. +  STA INFILE
  15224.    ;** DECODE FILE
  15225.    JSR UNBCODEbODY
  15226.    ;** CLOSE FILE
  15227.    LDA INFILE
  15228.    JSR CLOSE
  15229.    RTS
  15230.  
  15231. UNBCODEbODY = *
  15232.    LDA #0
  15233.    STA BUFcOUNT+0
  15234.    STA BUFcOUNT+1
  15235.    STA HITlASTlINE
  15236.    STA LASTlINEtERMINATOR
  15237.  
  15238.    ;** SEARCH FOR "BEGIN" LINE
  15239.    SEARCHlINE = *
  15240.    JSR GETLINE
  15241.    BCC +
  15242.    CLC
  15243.    RTS
  15244. +  LDA INlINE
  15245.    CMP #"-"
  15246.    BNE SEARCHlINE
  15247.    JSR CHECKsTOP
  15248.    LDX #0
  15249.    LDA INlINE+2
  15250.    CMP #"B"
  15251.    BEQ +
  15252.    LDX #ASCIIbEGIN-PETSCIIbEGIN
  15253. +  LDY #0
  15254. -  LDA INlINE,Y
  15255.    CMP PETSCIIbEGIN,X
  15256.    BNE SEARCHlINE
  15257.    INX
  15258.    INY
  15259.    CPY #ASCIIbEGIN-PETSCIIbEGIN
  15260.    BCC -
  15261.    LDY #0
  15262.    CPX #ASCIIbEGIN-PETSCIIbEGIN+1
  15263.    BCC +
  15264.    LDY #$FF
  15265. +  STY ASCIIfILE
  15266.    JMP PROCESSbEGIN
  15267.  
  15268.    PETSCIIbEGIN = *
  15269.    .ASC "--BCODE-BEGIN "
  15270.    ASCIIbEGIN = *
  15271.    .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$62,$65,$67,$69,$6E,$20
  15272.  
  15273.    ;** PROCESS "BEGIN" LINE
  15274.    PROCESSbEGIN = *
  15275.    ;** EXTRACT THE SEGMENT NUMBER
  15276.    LDY #14
  15277.    JSR SCANnUM
  15278.    BCC +
  15279.    JMP BEGINeRROR
  15280. +  INY
  15281.    LDA SCANvAL+2
  15282.    ORA SCANvAL+3
  15283.    BEQ +
  15284.    LDA #<SEGtOObIGmSG
  15285.    LDY #>SEGtOObIGmSG
  15286.    JSR EPUTS
  15287.    JMP SEARCHlINE
  15288. +  LDA SCANvAL+0
  15289.    LDX SCANvAL+1
  15290.    STA SEGNUM+0
  15291.    STX SEGNUM+1
  15292.    LDA #0
  15293.    STA SEGNUM+2
  15294.    STA SEGNUM+3
  15295.    LDA SEGNUM+0
  15296.    ORA SEGNUM+1
  15297.    BNE +
  15298.    JMP BEGINeRROR
  15299.  
  15300.    ;** EXTRACT FILENAME, TRUNC TO 16 CHARS
  15301. +  CLC
  15302.    TYA
  15303.    ADC #<INlINE
  15304.    STA OUTnAME+0
  15305.    LDA #>INlINE
  15306.    ADC #0
  15307.    STA OUTnAME+1
  15308.    LDY #16
  15309.    LDA #0
  15310.    STA (OUTnAME),Y
  15311.    JSR MAKEpETSCIInAME
  15312.    JSR ECHOeXTRACTnAME
  15313.  
  15314.    ;** OPEN OUTPUT FILE
  15315.    JSR GETtEMPfILE
  15316.    BCC +
  15317.    JMP SEARCHlINE
  15318.  
  15319.    ;** READ BCODED DATA
  15320. +  JSR BUILDdECODEtABLE
  15321.    JSR CRCiNIT
  15322. -  JSR GETLINE
  15323.    BCS UNEXPECTEDeOF
  15324.    JSR CONVERTlINE
  15325.    BCC +
  15326.    ;** CHECK IF SEGMENT-END LINE
  15327.    LDA INlINE
  15328.    CMP #"-"
  15329.    BEQ FINISHfILE
  15330.    ;** REPORT INVALID CHARACTERS
  15331.    LDA #<BADcHARSmSG
  15332.    LDY #>BADcHARSmSG
  15333.    JSR EPUTS
  15334.    JMP -
  15335. +  JSR CRUNCHlINE
  15336.    JSR CRClINE
  15337.    JSR WRITElINE
  15338.    JMP -
  15339.  
  15340.    ;** FINISH WITH FILE
  15341.    FINISHfILE = *
  15342.    LDA OUTFILE
  15343.    JSR CLOSE
  15344.    JSR CRCfINISH
  15345.    JSR PROCESSfINISH
  15346.    ;** PROCESS FOR ANOTHER FILE
  15347.    JMP SEARCHlINE
  15348.  
  15349. UNEXPECTEDeOF = *
  15350.    LDA #<UNEXeOFmSG
  15351.    LDY #>UNEXeOFmSG
  15352.    JSR EPUTS
  15353.    LDA OUTFILE
  15354.    JSR CLOSE
  15355.    JSR DISCARDsEGMENT
  15356.    SEC
  15357.    RTS
  15358.  
  15359. UNEXeOFmSG = *
  15360.    .ASC "UNEXPECTED eof, IGNORING SEGMENT."
  15361.    .BYTE CHRcr,0
  15362.  
  15363. SEGtOObIGmSG = *
  15364.    .ASC "SEGMENT NUMBER IS LARGER THAN 65535, IGNORING SEGMENT."
  15365.    .BYTE CHRcr,0
  15366.  
  15367. BADcHARSmSG = *
  15368.    .ASC "WARNING: BAD CHARACTERS ON LINE, IGNORING LINE."
  15369.    .BYTE CHRcr,0
  15370.  
  15371. MAKEpETSCIInAME = *
  15372.    BIT ASCIIfILE
  15373.    BMI +
  15374.    RTS
  15375. +  LDY #0
  15376. -  LDA (OUTnAME),Y
  15377.    BEQ +
  15378.    JSR CONVaSC2pET
  15379.    STA (OUTnAME),Y
  15380.    INY
  15381.    BNE -
  15382. +  RTS
  15383.  
  15384. CONVaSC2pET = *
  15385.    AND #$7F
  15386.    CMP #$60
  15387.    BCC +
  15388.    CLC
  15389.    ADC #$C0-$60
  15390. +  TAX
  15391.    AND #$7F
  15392.    CMP #"A"
  15393.    BCS +
  15394. -  TXA
  15395.    RTS
  15396. +  CMP #"Z"+1
  15397.    BCS -
  15398.    TXA
  15399.    EOR #$80
  15400.    RTS
  15401.  
  15402. ECHOeXTRACTnAME = *
  15403.    LDA #<ECHOeXTRACTmSG1
  15404.    LDY #>ECHOeXTRACTmSG1
  15405.    JSR EPUTS
  15406.    LDA #<NUMBUF
  15407.    LDY #>NUMBUF
  15408.    STA SYSWORK+0
  15409.    STY SYSWORK+1
  15410.    LDA #1
  15411.    LDX #SEGNUM
  15412.    JSR UTOA
  15413.    LDA #<NUMBUF
  15414.    LDY #>NUMBUF
  15415.    JSR EPUTS
  15416.    LDA #<ECHOeXTRACTmSG2
  15417.    LDY #>ECHOeXTRACTmSG2
  15418.    JSR EPUTS
  15419.    LDA OUTnAME+0
  15420.    LDY OUTnAME+1
  15421.    JSR EPUTS
  15422.    LDA #<ECHOeXTRACTmSG3
  15423.    LDY #>ECHOeXTRACTmSG3
  15424.    JMP EPUTS
  15425.  
  15426. ECHOeXTRACTmSG1 = *
  15427.    .ASC "EXTRACTING SEG "
  15428.    .BYTE 0
  15429. ECHOeXTRACTmSG2 = *
  15430.    .ASC " OF "
  15431.    .BYTE CHRqUOTE,0
  15432. ECHOeXTRACTmSG3 = *
  15433.    .BYTE CHRqUOTE,CHRcr,0
  15434. NUMBUF .BUF 12
  15435.  
  15436. REPORToPENeRROR = *
  15437.    LDA ZP+0
  15438.    LDY ZP+1
  15439.    JSR EPUTS
  15440.    LDA #<REPORToPENeRRORmSG
  15441.    LDY #>REPORToPENeRRORmSG
  15442.    JSR EPUTS
  15443.    RTS
  15444.  
  15445.    REPORToPENeRRORmSG = *
  15446.    .ASC ": CANNOT OPEN, CONTINUING"
  15447.    .BYTE CHRcr,0
  15448.  
  15449. SCANdIGIT .BUF 1
  15450. SCANsAVE .BUF 4
  15451. SCANtEMP .BUF 1
  15452. SCANiNDEX .BUF 1
  15453. SCANaNYTHING .BUF 1
  15454.  
  15455. SCANnUM = *  ;( .y=INlINEiNDEX ) : .y=SCAN, [SCANvAL]=NUM, .cs=ERR
  15456.    LDX #3
  15457.    LDA #0
  15458. -  STA SCANvAL,X
  15459.    DEX
  15460.    BPL -
  15461.    LDA #0
  15462.    STA SCANaNYTHING
  15463. -  LDA INlINE,Y
  15464.    CMP #" "
  15465.    BNE SCANnUMnEXT
  15466.    INY
  15467.    BNE -
  15468.    SEC
  15469.    RTS
  15470.  
  15471.    SCANnUMnEXT = *
  15472.    LDA INlINE,Y
  15473.    CMP #"0"
  15474.    BCC +
  15475.    CMP #"9"+1
  15476.    BCC ++
  15477. +  LDA SCANaNYTHING
  15478.    BEQ SCANeRROR
  15479.    CLC
  15480.    RTS
  15481. +  AND #$0F
  15482.    STA SCANdIGIT
  15483.    LDA #$FF
  15484.    STA SCANaNYTHING
  15485.    ;** TIMES TEN
  15486.    STY SCANtEMP
  15487.    LDX #3
  15488. -  LDA SCANvAL,X
  15489.    STA SCANsAVE,X
  15490.    DEX
  15491.    BPL -
  15492.    LDA #2
  15493.    STA SCANiNDEX
  15494. -  CLC
  15495.    LDY #4
  15496.    LDX #0
  15497. -  ROL SCANvAL,X
  15498.    INX
  15499.    DEY
  15500.    BNE -
  15501.    BCS SCANeRROR
  15502.    DEC SCANiNDEX
  15503.    BNE --
  15504.    CLC
  15505.    LDY #4
  15506.    LDX #0
  15507. -  LDA SCANvAL,X
  15508.    ADC SCANsAVE,X
  15509.    STA SCANvAL,X
  15510.    INX
  15511.    DEY
  15512.    BNE -
  15513.    BCS SCANeRROR
  15514.    CLC
  15515.    LDY #4
  15516.    LDX #0
  15517. -  ROL SCANvAL,X
  15518.    INX
  15519.    DEY
  15520.    BNE -
  15521.    BCS SCANeRROR
  15522.    CLC
  15523.    LDY #4
  15524.    LDX #0
  15525.    LDA SCANdIGIT
  15526. -  ADC SCANvAL,X
  15527.    STA SCANvAL,X
  15528.    LDA #0
  15529.    INX
  15530.    DEY
  15531.    BNE -
  15532.    BCS SCANeRROR
  15533.  
  15534.    LDY SCANtEMP
  15535.    INY
  15536.    BEQ SCANeRROR
  15537.    JMP SCANnUMnEXT
  15538.  
  15539.    SCANeRROR = *
  15540.    SEC
  15541.    RTS
  15542.  
  15543. BEGINeRROR = *
  15544.    LDA #<BEGINeRRORmSG
  15545.    LDY #>BEGINeRRORmSG
  15546.    JSR EPUTS
  15547.    JMP SEARCHlINE
  15548.  
  15549. BEGINeRRORmSG = *
  15550.    .ASC "INVALID --BCODE-BEGIN LINE FORMAT, IGNORING SEGMENT"
  15551.    .BYTE CHRcr,0
  15552.  
  15553. CONVERTpADS .BUF 1
  15554. CONVERTcHARS .BUF 1
  15555.  
  15556. CONVERTlINE = *
  15557.    LDX #0
  15558.    STX CONVERTpADS
  15559. -  LDA INlINE,X
  15560.    BNE +
  15561.    STX CONVERTcHARS
  15562.    CLC
  15563.    RTS
  15564. +  CMP #"="
  15565.    BNE +
  15566.    INC CONVERTpADS
  15567. +  TAY
  15568.    LDA DECODEtABLE,Y
  15569.    BMI +
  15570.    STA INlINE,X
  15571.    INX
  15572.    BNE -
  15573. +  SEC
  15574.    RTS
  15575.  
  15576. CRUNCHbYTES .BUF 1
  15577.  
  15578. CRUNCHlINE = *
  15579.    LDX #0
  15580.    LDY #0
  15581. -  JSR CRUNCHqUANTUM
  15582.    CPX CONVERTcHARS
  15583.    BCC -
  15584.    TYA
  15585.    SEC
  15586.    SBC CONVERTpADS
  15587.    STA CRUNCHbYTES
  15588.    RTS
  15589.  
  15590. ;POS  76543210  76543210  76543210  76543210
  15591. ;BYT  XX111111  XX112222  XX222233  XX333333
  15592. ;BIT    765432    107654    321076    543210
  15593.  
  15594. CRUNCHqUANTUM = * ;(.x=iN4BYTESoFFSET, .y=oUT3BYTESoFFSET) : .x++, .y++
  15595.    LDA INlINE,X  ;*** OUTPUT BYTE 0
  15596.    ASL
  15597.    ASL
  15598.    STA TEMP
  15599.    INX
  15600.    LDA INlINE,X
  15601.    LSR
  15602.    LSR
  15603.    LSR
  15604.    LSR
  15605.    AND #%00000011
  15606.    ORA TEMP
  15607.    STA INlINE,Y
  15608.    INY
  15609.    LDA INlINE,X  ;*** OUTPUT BYTE 1
  15610.    ASL
  15611.    ASL
  15612.    ASL
  15613.    ASL
  15614.    STA TEMP
  15615.    INX
  15616.    LDA INlINE,X
  15617.    LSR
  15618.    LSR
  15619.    AND #%00001111
  15620.    ORA TEMP
  15621.    STA INlINE,Y
  15622.    INY
  15623.    LDA INlINE,X  ;*** OUTPUT BYTE 2
  15624.    INX
  15625.    ROR
  15626.    ROR
  15627.    ROR
  15628.    AND #%11000000
  15629.    STA TEMP
  15630.    LDA INlINE,X
  15631.    INX
  15632.    AND #%00111111
  15633.    ORA TEMP
  15634.    STA INlINE,Y
  15635.    INY
  15636.    RTS
  15637.  
  15638. WRITElINE = *
  15639.    LDA #<INlINE
  15640.    LDY #>INlINE
  15641.    STA ZP+0
  15642.    STY ZP+1
  15643.    LDA CRUNCHbYTES
  15644.    LDY #0
  15645.    LDX OUTFILE
  15646.    JSR WRITE
  15647.    RTS
  15648.  
  15649. ;** CRC = 0Xffffffff;
  15650. ;** WHILE( (C=GETC(FP)) != eof ) {$7b}
  15651. ;**     CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ (CRC^C) & 0Xff ];
  15652. ;** {$7d}
  15653. ;** RETURN( CRC^0Xffffffff );
  15654.  
  15655. CRCiNIT = *
  15656.    LDX #3
  15657. -  LDA #$FF
  15658.    STA CRC,X
  15659.    LDA #0
  15660.    STA BYTES,X
  15661.    DEX
  15662.    BPL -
  15663.    RTS
  15664.  
  15665. CRClINE = *
  15666.    LDY #0
  15667.    CPY CRUNCHbYTES
  15668.    BCS +
  15669. -  LDA INlINE,Y         ;.x = (CRC^C) & 0Xff
  15670.    EOR CRC+0
  15671.    TAX
  15672.    LDA CRC+1            ;CRC = (CRC>>8) & 0X00ffffff ^ CRCtABLE[ .x ]
  15673.    EOR CRCtABLE0,X
  15674.    STA CRC+0
  15675.    LDA CRC+2
  15676.    EOR CRCtABLE1,X
  15677.    STA CRC+1
  15678.    LDA CRC+3
  15679.    EOR CRCtABLE2,X
  15680.    STA CRC+2
  15681.    LDA CRCtABLE3,X
  15682.    STA CRC+3
  15683.    INY
  15684.    CPY CRUNCHbYTES
  15685.    BCC -
  15686. +  CLC
  15687.    LDA BYTES+0
  15688.    ADC CRUNCHbYTES
  15689.    STA BYTES+0
  15690.    BCC +
  15691.    INC BYTES+1
  15692.    BNE +
  15693.    INC BYTES+2
  15694.    BNE +
  15695.    INC BYTES+3
  15696. +  RTS
  15697.  
  15698. CRCfINISH = *
  15699.    LDX #3
  15700. -  LDA CRC,X
  15701.    EOR #$FF
  15702.    STA CRC,X
  15703.    DEX
  15704.    BPL -
  15705.    RTS
  15706.  
  15707. HITlASTlINE .BUF 1
  15708. LASTlINEtERMINATOR .BUF 1
  15709.  
  15710. GETLINE = *
  15711.    LDA HITlASTlINE
  15712.    BEQ +
  15713.    SEC
  15714.    RTS
  15715. +  LDX #0
  15716.    STX GETLINEpOS
  15717.  
  15718.    ;** TOSS AN lf THAT FOLLOWS A cr
  15719.    JSR GETbYTE
  15720.    BCS GETLINEpROCESS
  15721.    CMP #CHRlf
  15722.    CLC
  15723.    BNE GETLINEpROCESS
  15724.    LDX LASTlINEtERMINATOR
  15725.    CPX #CHRcr
  15726.    CLC
  15727.    BNE GETLINEpROCESS
  15728.  
  15729.    GETLINEcHAR = *
  15730.    JSR GETbYTE
  15731.    GETLINEpROCESS = *
  15732.    BCC +
  15733.    LDA #$FF
  15734.    STA HITlASTlINE
  15735.    JMP GETLINEfINISH
  15736. +  CMP #CHRcr
  15737.    BEQ GETLINEfINISH
  15738.    CMP #CHRlf
  15739.    BEQ GETLINEfINISH
  15740.    LDX GETLINEpOS
  15741.    CPX #98
  15742.    BCS +
  15743.    STA INlINE,X
  15744.    INC GETLINEpOS
  15745. +  JMP GETLINEcHAR
  15746.  
  15747.    GETLINEfINISH = *
  15748.    STA LASTlINEtERMINATOR
  15749.    LDX GETLINEpOS
  15750.    LDA #0
  15751.    STA INlINE,X
  15752.    CPX #0
  15753.    BEQ +
  15754.    CLC
  15755.    RTS
  15756. +  LDA HITlASTlINE
  15757.    CMP #1
  15758.    RTS
  15759.  
  15760. GETbYTE = *
  15761.    LDA BUFcOUNT+0
  15762.    ORA BUFcOUNT+1
  15763.    BEQ GETbYTEfILLbUF
  15764.    LDY #0
  15765.    LDA (BUFpTR),Y
  15766.    INC BUFpTR+0
  15767.    BNE +
  15768.    INC BUFpTR+1
  15769. +  LDX BUFcOUNT+0
  15770.    BNE +
  15771.    DEC BUFcOUNT+1
  15772. +  DEC BUFcOUNT+0
  15773.    CLC
  15774.    RTS
  15775.  
  15776. GETbYTEfILLbUF = *
  15777.    JSR CHECKsTOP
  15778.    LDA #<INbUF
  15779.    LDY #>INbUF
  15780.    STA ZP+0
  15781.    STY ZP+1
  15782.    STA BUFpTR+0
  15783.    STY BUFpTR+1
  15784.    LDA INbUFlEN+0
  15785.    LDY INbUFlEN+1
  15786.    LDX INFILE
  15787.    JSR READ
  15788.    BEQ +
  15789.    BCS +
  15790.    STA BUFcOUNT+0
  15791.    STY BUFcOUNT+1
  15792.    JSR CHECKsTOP
  15793.    JMP GETbYTE
  15794. +  SEC
  15795.    RTS
  15796.  
  15797. SETiNDEX .BUF 1
  15798. SETcOUNTDOWN .BUF 1
  15799.  
  15800. BUILDdECODEtABLE = *
  15801.    LDX #0
  15802.    LDA #$FF
  15803. -  STA DECODEtABLE,X
  15804.    INX
  15805.    BNE -
  15806.    LDY #0
  15807.    LDX #0
  15808.    BIT ASCIIfILE
  15809.    BPL +
  15810.    LDX #ASCtABLEsET-PETtABLEsET
  15811. +  STX SETiNDEX
  15812.    LDA #5
  15813.    STA SETcOUNTDOWN
  15814. -  LDX SETiNDEX
  15815.    LDA PETtABLEsET+1,X
  15816.    STA TEMP
  15817.    LDA PETtABLEsET+0,X
  15818.    INX
  15819.    INX
  15820.    STX SETiNDEX
  15821.    LDX TEMP
  15822.    JSR BUILDsET
  15823.    DEC SETcOUNTDOWN
  15824.    BNE -
  15825.    LDA #0
  15826.    STA DECODEtABLE+$3D
  15827.    RTS
  15828.  
  15829. PETtABLEsET .ASC "azAZ09++//"
  15830. ASCtABLEsET .BYTE $41,$5A,$61,$7A,$30,$39,$2B,$2B,$2F,$2F
  15831.  
  15832. SETlIMIT .BUF 1
  15833.  
  15834. BUILDsET = *
  15835.    INX
  15836.    STX SETlIMIT
  15837.    TAX
  15838. -  TYA
  15839.    STA DECODEtABLE,X
  15840.    INY
  15841.    INX
  15842.    CPX SETlIMIT
  15843.    BCC -
  15844.    RTS
  15845.  
  15846. PROCESSfINISH = *  ;PROCESS THE BCODE-END LINE
  15847.    LDA #TRUE
  15848.    STA ISeND
  15849.    LDX #ASCeND-PETeND-1
  15850.    BIT ASCIIfILE
  15851.    BPL +
  15852.    LDX #PETcONT-PETeND-1
  15853. +  LDY #ASCeND-PETeND-1
  15854.    JSR COMPAREfINISH
  15855.    LDY #ASCeND-PETeND-1
  15856.    BCC FINcHECKsEGMENT
  15857.    LDA #FALSE
  15858.    STA ISeND
  15859.    LDX #ASCcONT-PETeND-1
  15860.    BIT ASCIIfILE
  15861.    BPL +
  15862.    LDX #ASCcONTeND-PETeND-1
  15863. +  LDY #ASCcONT-PETcONT-1
  15864.    JSR COMPAREfINISH
  15865.    LDY #ASCcONT-PETcONT
  15866.    BCC FINcHECKsEGMENT
  15867.    LDA #0
  15868.    JMP BADfINISH
  15869.  
  15870.    FINcHECKsEGMENT = *
  15871.    JSR SCANnUM
  15872.    BCC +
  15873. -  LDA #1
  15874.    JMP BADfINISH
  15875. +  LDX #3
  15876. -  LDA SCANvAL,X
  15877.    CMP SEGNUM,X
  15878.    BNE --
  15879.    DEX
  15880.    BPL -
  15881.  
  15882.    FINcHECKsIZE = *
  15883.    JSR SCANnUM
  15884.    BCC +
  15885. -  LDA #2
  15886.    JMP BADfINISH
  15887. +  LDX #3
  15888. -  LDA SCANvAL,X
  15889.    CMP BYTES,X
  15890.    BNE --
  15891.    DEX
  15892.    BPL -
  15893.  
  15894.    FINcHECKcRC = *
  15895.    INY
  15896.    JSR SCANhEX
  15897.    BCC +
  15898. -  LDA #3
  15899.    JMP BADfINISH
  15900. +  LDX #3
  15901. -  LDA SCANvAL,X
  15902.    CMP CRC,X
  15903.    BNE --
  15904.    DEX
  15905.    BPL -
  15906.    JSR COMMITsEGMENT
  15907.    BIT DEBUG
  15908.    BPL +
  15909.    LDX #STDERR
  15910.    STX STATfCB
  15911.    JSR WRITEsTATUSdATA
  15912. +  JSR CHECKsTOP
  15913.    CLC
  15914.    RTS
  15915.  
  15916. SCANhEX = *
  15917.    LDX #3
  15918. -  LDA INlINE,Y
  15919.    INY
  15920.    JSR HEXtObIN
  15921.    BCS +
  15922.    ASL
  15923.    ASL
  15924.    ASL
  15925.    ASL
  15926.    STA TEMP
  15927.    LDA INlINE,Y
  15928.    INY
  15929.    JSR HEXtObIN
  15930.    BCS +
  15931.    ORA TEMP
  15932.    STA SCANvAL,X
  15933.    DEX
  15934.    BPL -
  15935.    CLC
  15936. +  RTS
  15937.  
  15938. HEXtObINxSAVE .BUF 1
  15939.  
  15940. HEXtObIN = *
  15941.    BIT ASCIIfILE
  15942.    BPL +
  15943.    STX HEXtObINxSAVE
  15944.    JSR CONVaSC2pET
  15945.    LDX HEXtObINxSAVE
  15946. +  CMP #"0"
  15947.    BCS +
  15948. -  SEC
  15949.    RTS
  15950. +  CMP #"9"+1
  15951.    BCC +
  15952.    AND #$7F
  15953.    CMP #"A"
  15954.    BCC -
  15955.    CMP #"F"+1
  15956.    BCS -
  15957.    SEC
  15958.    SBC #"A"-$0A
  15959. +  AND #$0F
  15960.    CLC
  15961.    RTS
  15962.  
  15963. COMPAREfINISH = *
  15964. -  LDA INlINE,Y
  15965.    CMP PETeND,X
  15966.    BNE +
  15967.    DEX
  15968.    DEY
  15969.    BPL -
  15970.    CLC
  15971.    RTS
  15972. +  SEC
  15973.    RTS
  15974.  
  15975. BADfINISH = *  ;.a=ERROR [0=TOKEN,1=SEGMENT,2=SIZE,3=CRC]
  15976.    PHA
  15977.    LDA NAME+0
  15978.    LDY NAME+1
  15979.    JSR EPUTS
  15980.    PLA
  15981.    ASL
  15982.    TAX
  15983.    LDA BADfINvEC+1,X
  15984.    TAY
  15985.    LDA BADfINvEC+0,X
  15986.    JSR EPUTS
  15987.    LDA #<BADfINdISCARD
  15988.    LDY #>BADfINdISCARD
  15989.    JSR EPUTS
  15990.    JSR DISCARDsEGMENT
  15991.    JSR CHECKsTOP
  15992.    RTS
  15993.  
  15994. BADfINvEC = *
  15995.    .WORD BADfINtOKEN,BADfINsEGMENT,BADfINsIZE,BADfINcRC
  15996. BADfINtOKEN = *
  15997.    .ASC ": INVALID TOKEN ON FINISH LINE"
  15998.    .BYTE 0
  15999. BADfINsEGMENT = *
  16000.    .ASC ": SEGMENT NUMBER MISMATCH"
  16001.    .BYTE 0
  16002. BADfINsIZE = *
  16003.    .ASC ": FILE SIZE MISMATCH"
  16004.    .BYTE 0
  16005. BADfINcRC = *
  16006.    .ASC ": crc-32 CHECKSUM MISMATCH"
  16007.    .BYTE 0
  16008. BADfINdISCARD = *
  16009.    .ASC ", IGNORING SEGMENT"
  16010.    .BYTE CHRcr,0
  16011.  
  16012. PETeND .ASC "--BCODE-END "
  16013. ASCeND .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$65,$6E,$64,$20
  16014.  
  16015. PETcONT .ASC "--BCODE-CONTINUED "
  16016. ASCcONT .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$63,$6F,$6E,$74,$69,$6E,$75
  16017.         .BYTE $65,$64,$20
  16018. ASCcONTeND = *
  16019.  
  16020. GETtEMPnAMEsTR = *  ;( TEMPnAME, .a=PUTfILETYPE ) : TEMPnAMEsTR, (ZP)
  16021.    PHA
  16022.    LDA #"0"
  16023.    STA TEMPnAMEsTR+0
  16024.    LDA #"b"
  16025.    STA TEMPnAMEsTR+1
  16026.    LDA #"c"
  16027.    STA TEMPnAMEsTR+2
  16028.    LDA #<TEMPnAMEsTR+3
  16029.    LDY #>TEMPnAMEsTR+3
  16030.    STA SYSWORK+0
  16031.    STY SYSWORK+1
  16032.    STA ZP+0
  16033.    STY ZP+1
  16034.    LDX #TEMPnAME
  16035.    LDA #5
  16036.    JSR UTOAZ
  16037.    PLA
  16038.    CMP #FALSE
  16039.    BEQ +
  16040.    LDA #","
  16041.    STA TEMPnAMEsTR+3,Y
  16042.    LDA #"P"
  16043.    STA TEMPnAMEsTR+4,Y
  16044.    LDA #0
  16045.    STA TEMPnAMEsTR+5,Y
  16046. +  RTS
  16047.  
  16048. UTOAZ = *  ;( 0+.x=VAR32, .a=WIDTH, (SYSWORK)=STORE )
  16049.    JSR UTOA
  16050.    LDY #0
  16051. -  LDA (SYSWORK),Y
  16052.    BEQ ++
  16053.    CMP #" "
  16054.    BNE +
  16055.    LDA #"0"
  16056.    STA (SYSWORK),Y
  16057. +  INY
  16058.    BNE -
  16059. +  RTS
  16060.  
  16061. FILEmODE .BUF 1
  16062.  
  16063. GETtEMPfILE = *  ;( OUTnAME, SEGNUM ) : CURhAVE, CURhAVEnUM, OUTFILE, .cs=ERR
  16064.    ;** SEARCH TO APPEND TO EXISTING FILE
  16065.    LDA #255
  16066.    STA CURhAVE
  16067.  
  16068.    CHECKnEXT = *
  16069.    INC CURhAVE
  16070.    LDA CURhAVE
  16071.    CMP HAVEcOUNT
  16072.    BCC +
  16073.    JMP CANNOTaPPEND
  16074. +  JSR GETh
  16075.    JSR CMPoUTnAMEh
  16076.    CMP #0
  16077.    BNE CHECKnEXT
  16078.    LDY #HRfROMsEG
  16079.    LDA SEGNUM+0
  16080.    CMP (H),Y
  16081.    LDA SEGNUM+1
  16082.    INY
  16083.    SBC (H),Y
  16084.    BCC +
  16085.    LDY #HRtOsEG
  16086.    LDA (H),Y
  16087.    CMP SEGNUM+0
  16088.    INY
  16089.    LDA (H),Y
  16090.    SBC SEGNUM+1
  16091.    BCC +
  16092.    LDA #<IGNOREdUPmSG
  16093.    LDY #>IGNOREdUPmSG
  16094.    JSR EPUTS
  16095.    SEC
  16096.    RTS
  16097.    IGNOREdUPmSG = *
  16098.    .ASC "IGNORING DUPLICATE SEGMENT"
  16099.    .BYTE CHRcr,0
  16100.  
  16101. +  LDY #HRtOsEG
  16102.    LDA (H),Y
  16103.    TAX
  16104.    INY
  16105.    LDA (H),Y
  16106.    TAY
  16107.    INX
  16108.    BNE +
  16109.    INY
  16110. +  CPX SEGNUM+0
  16111.    BNE +
  16112.    CPY SEGNUM+1
  16113.    BEQ CANaPPEND
  16114. +  JMP CHECKnEXT
  16115.  
  16116.    ;** HERE WE KNOW WE CAN APPEND TO AN EXISTING TEMP FILE
  16117.    CANaPPEND = *
  16118.    LDA #"A"
  16119.    STA FILEmODE
  16120.    LDY #HRtEMPfILEnAME
  16121.    LDA (H),Y
  16122.    STA TEMPnAME+0
  16123.    INY
  16124.    LDA (H),Y
  16125.    STA TEMPnAME+1
  16126.    LDY #HRtOsEG
  16127.    LDA SEGNUM+0
  16128.    STA (H),Y
  16129.    INY
  16130.    LDA SEGNUM+1
  16131.    STA (H),Y
  16132.    LDY #HRiSeND
  16133.    LDA #FALSE
  16134.    STA (H),Y
  16135.    JMP OPENtEMPfILE
  16136.  
  16137.    ;** CANNOT APPEND
  16138.    CANNOTaPPEND = *
  16139.    JSR GETtEMPfILEnAMEoNLY
  16140.  
  16141.    ;** CREATE NEW HAVE RECORD
  16142.    CREATEnEWhAVErEC = *
  16143.    JSR INSERThAVErEC
  16144.    BCS +
  16145.    LDA #"W"
  16146.    STA FILEmODE
  16147.    JMP OPENtEMPfILE
  16148. +  LDA #<HAVEoVERmSG
  16149.    LDY #>HAVEoVERmSG
  16150.    JSR EPUTS
  16151.    SEC
  16152.    RTS
  16153.    HAVEoVERmSG = *
  16154.    .ASC "FRAGMENT TABLE FULL, IGNORING CURRENT SEGMENT"
  16155.    .BYTE CHRcr,0
  16156.  
  16157.    ;** OPEN TEMPORARY FILE
  16158.    OPENtEMPfILE = *
  16159.    LDA #TRUE
  16160.    JSR GETtEMPnAMEsTR
  16161.    LDA #<TEMPnAMEsTR
  16162.    LDY #>TEMPnAMEsTR
  16163.    STA ZP+0
  16164.    STY ZP+1
  16165.    LDA FILEmODE
  16166.    JSR OPENoVERWRITE
  16167.    BCS +
  16168.    STA OUTFILE
  16169.    CLC
  16170.    RTS
  16171. +  LDA #<TEMPnAMEsTR
  16172.    LDY #>TEMPnAMEsTR
  16173.    JSR EPUTS
  16174.    LDA #<OPENeRRmSG
  16175.    LDY #>OPENeRRmSG
  16176.    JSR EPUTS
  16177.    SEC
  16178.    RTS
  16179.    OPENeRRmSG = *
  16180.    .ASC ": CANNOT OPEN, IGNORING SEGMENT"
  16181.    .BYTE CHRcr,0
  16182.  
  16183. GETtEMPfILEnAMEoNLY = *  ;( NEXTtEMPnAME ) : TEMPnAME
  16184.    LDA NEXTtEMPnAME+0
  16185.    LDY NEXTtEMPnAME+1
  16186.    STA TEMPnAME+0
  16187.    STY TEMPnAME+1
  16188.    INC NEXTtEMPnAME+0
  16189.    BNE +
  16190.    INC NEXTtEMPnAME+1
  16191. +  LDA #0
  16192.    STA WORK
  16193. -  CMP HAVEcOUNT
  16194.    BCC +
  16195.    RTS
  16196. +  LDA WORK
  16197.    JSR GETh
  16198.    LDY #HRtEMPfILEnAME
  16199.    LDA (H),Y
  16200.    CMP TEMPnAME+0
  16201.    BNE +
  16202.    INY
  16203.    LDA (H),Y
  16204.    CMP TEMPnAME+1
  16205.    BNE +
  16206.    JMP GETtEMPfILEnAMEoNLY
  16207. +  INC WORK
  16208.    LDA WORK
  16209.    JMP -
  16210.  
  16211. GETh = *  ;( .a=HAVErECnUM ) : H
  16212.    LDX #0
  16213.    STX H+1
  16214.    LDX #5
  16215. -  ASL
  16216.    ROL H+1
  16217.    DEX
  16218.    BNE -
  16219.    CLC
  16220.    ADC #<HAVES
  16221.    STA H+0
  16222.    LDA H+1
  16223.    ADC #>HAVES
  16224.    STA H+1
  16225.    RTS
  16226.  
  16227. GETnEXTh = *  ;( H ) : NEXTh
  16228.    CLC
  16229.    LDA H+0
  16230.    ADC #HRsIZE
  16231.    STA NEXTh+0
  16232.    LDA H+1
  16233.    ADC #0
  16234.    STA NEXTh+1
  16235.    RTS
  16236.  
  16237. CMPoUTnAMEh = *  ;( (OUTnAME)=STR1, (H)=HREC ) : .a=CMPrESULT[0=eq,1=gt,-1=lt]
  16238.    LDA H+0
  16239.    LDY H+1
  16240.    CLC
  16241.    ADC #HRfILENAME
  16242.    BCC +
  16243.    INY
  16244. +  STA WORK+0
  16245.    STY WORK+1
  16246.    LDY #255
  16247. -  INY
  16248.    LDA (OUTnAME),Y
  16249.    CMP (WORK),Y
  16250.    BNE +
  16251.    CMP #0
  16252.    BNE -
  16253.    LDA #0
  16254.    RTS
  16255. +  BCC +
  16256.    LDA #1
  16257.    RTS
  16258. +  LDA #$FF
  16259.    RTS
  16260.  
  16261. INSERThAVErEC = *  ;( SEGNUM, TEMPnAME, OUTnAME ) : CURhAVE
  16262.    ;** ALLOCATE NEW RECORD
  16263.    LDA HAVEcOUNT
  16264.    CMP #MAXhAVE
  16265.    BCC +
  16266.    RTS
  16267. +  STA CURhAVE
  16268.    INC HAVEcOUNT
  16269.  
  16270.    ;** FIND CORRECT POSITION FOR NEW RECORD
  16271. -  DEC CURhAVE
  16272.    LDA CURhAVE
  16273.    CMP #$FF
  16274.    BEQ INSERThAVErECiNIT
  16275.    JSR GETh
  16276.    JSR CMPoUTnAMEh
  16277.    CMP #1
  16278.    BEQ INSERThAVErECiNIT
  16279.    CMP #0
  16280.    BNE +
  16281.    LDY #HRfROMsEG
  16282.    LDA (H),Y
  16283.    CMP SEGNUM+0
  16284.    INY
  16285.    LDA (H),Y
  16286.    SBC SEGNUM+1
  16287.    BCC INSERThAVErECiNIT
  16288. +  JSR GETnEXTh
  16289.    LDY #HRsIZE-1
  16290. -  LDA (H),Y
  16291.    STA (NEXTh),Y
  16292.    DEY
  16293.    BPL -
  16294.    JMP --
  16295.  
  16296.    ;** INITIALIZE RECORD
  16297.    INSERThAVErECiNIT = *
  16298.    INC CURhAVE
  16299.    LDX #HRsIZE-1
  16300.    LDA #0
  16301. -  STA TEMPhAVErEC,X
  16302.    DEX
  16303.    BPL -
  16304.    LDA SEGNUM+0
  16305.    LDY SEGNUM+1
  16306.    STA TEMPhAVErEC+HRfROMsEG+0
  16307.    STY TEMPhAVErEC+HRfROMsEG+1
  16308.    STA TEMPhAVErEC+HRtOsEG+0
  16309.    STY TEMPhAVErEC+HRtOsEG+1
  16310.    LDA #FALSE
  16311.    STA TEMPhAVErEC+HRiSeND
  16312.    LDA TEMPnAME+0
  16313.    LDY TEMPnAME+1
  16314.    STA TEMPhAVErEC+HRtEMPfILEnAME+0
  16315.    STY TEMPhAVErEC+HRtEMPfILEnAME+1
  16316.    LDY #0
  16317. -  LDA (OUTnAME),Y
  16318.    STA TEMPhAVErEC+HRfILENAME,Y
  16319.    BEQ +
  16320.    INY
  16321.    CPY #16
  16322.    BCC -
  16323. +  LDA CURhAVE
  16324.    JSR GETh
  16325.    LDY #HRsIZE-1
  16326. -  LDA TEMPhAVErEC,Y
  16327.    STA (H),Y
  16328.    DEY
  16329.    BPL -
  16330.    CLC
  16331.    RTS
  16332.  
  16333. WRITEnUM5 = *  ;( 0+.x=NUM16 )
  16334.    LDA 0,X
  16335.    STA WORK+12
  16336.    LDA 1,X
  16337.    STA WORK+13
  16338.    LDA #0
  16339.    STA WORK+14
  16340.    STA WORK+15
  16341.    LDX #WORK+12
  16342.    LDA #5
  16343.    JMP WRITEnUM
  16344.  
  16345. WRITEnUM10 = *  ;( 0+.x=NUM32 )
  16346.    LDA #10
  16347. WRITEnUM = *
  16348.    PHA
  16349.    LDA #<NUMBUF
  16350.    LDY #>NUMBUF
  16351.    STA SYSWORK+0
  16352.    STY SYSWORK+1
  16353.    PLA
  16354.    JSR UTOAZ
  16355.    LDA #<NUMBUF
  16356.    LDY #>NUMBUF
  16357.    LDX STATfCB
  16358.    JSR FPUTS
  16359.    JSR WRITEsPACES
  16360.    RTS
  16361.  
  16362. WRITEsPACES = *
  16363.    LDA #<SPACESmSG
  16364.    LDY #>SPACESmSG
  16365.    LDX STATfCB
  16366.    JSR FPUTS
  16367.    RTS
  16368.    SPACESmSG = *
  16369.    .BYTE $20,$20,0
  16370.  
  16371. COMMITsEGMENT = *
  16372.    ;** ADD BYTE LENGTH, UPDATE iSeND FLAG IN HAVEREC
  16373.    LDA CURhAVE
  16374.    JSR GETh
  16375.    LDX #4
  16376.    LDY #HRvALIDlENGTH
  16377.    CLC
  16378. -  LDA (H),Y
  16379.    ADC BYTES-HRvALIDlENGTH,Y
  16380.    STA (H),Y
  16381.    INY
  16382.    DEX
  16383.    BNE -
  16384.    LDY #HRiSeND
  16385.    LDA ISeND
  16386.    STA (H),Y
  16387.    JSR CHECKcOALESCE
  16388.    JSR CHECKcOMPLETE
  16389.    RTS
  16390.  
  16391. CHECKfILENAMEpTR .BUF 2
  16392.  
  16393. CHECKcOMPLETE = *
  16394.    LDA CURhAVE
  16395.    JSR GETh
  16396.    LDY #HRiSeND
  16397.    LDA (H),Y
  16398.    BNE +
  16399. -  RTS
  16400. +  LDY #HRfROMsEG
  16401.    LDA (H),Y
  16402.    CMP #1
  16403.    BNE -
  16404.    INY
  16405.    LDA (H),Y
  16406.    BNE -
  16407.    JSR FETCHtEMPnAME
  16408.    LDA #FALSE
  16409.    JSR GETtEMPnAMEsTR
  16410.    LDA #<TEMPnAMEsTR
  16411.    LDY #>TEMPnAMEsTR
  16412.    STA ZP+0
  16413.    STY ZP+1
  16414.    LDA H+0
  16415.    LDY H+1
  16416.    CLC
  16417.    ADC #HRfILENAME
  16418.    BCC +
  16419.    INY
  16420. +  STA ZW+0
  16421.    STY ZW+1
  16422.    STA CHECKfILENAMEpTR+0
  16423.    STY CHECKfILENAMEpTR+1
  16424.    JSR RENAMEoVERWRITE
  16425.    LDA #<COMPLETEmSG1
  16426.    LDY #>COMPLETEmSG1
  16427.    JSR EPUTS
  16428.    LDA CHECKfILENAMEpTR+0
  16429.    LDY CHECKfILENAMEpTR+1
  16430.    JSR EPUTS
  16431.    LDA #<COMPLETEmSG2
  16432.    LDY #>COMPLETEmSG2
  16433.    JSR EPUTS
  16434.    LDA CURhAVE
  16435.    JSR REMOVEhAVErEC
  16436.    RTS
  16437.  
  16438. COMPLETEmSG1 = *
  16439.    .ASC "--rEASSEMBLED "
  16440.    .BYTE CHRqUOTE,0
  16441. COMPLETEmSG2 = *
  16442.    .BYTE CHRqUOTE,CHRcr,0
  16443.  
  16444. REMOVEhAVErEC = *  ;( .a=HAVErEC )
  16445.    DEC HAVEcOUNT
  16446.    STA HAVErEC
  16447. -  LDA HAVErEC
  16448.    CMP HAVEcOUNT
  16449.    BCC +
  16450.    RTS
  16451. +  LDA HAVErEC
  16452.    JSR GETh
  16453.    JSR GETnEXTh
  16454.    LDY #HRsIZE-1
  16455. -  LDA (NEXTh),Y
  16456.    STA (H),Y
  16457.    DEY
  16458.    BPL -
  16459.    INC HAVErEC
  16460.    JMP --
  16461.  
  16462. CHECKfROMpLUS1 .BUF 2
  16463.  
  16464. CHECKcOALESCE = *  ;( CURhAVE )
  16465.    LDX CURhAVE
  16466.    INX
  16467.    CPX HAVEcOUNT
  16468.    BCC +
  16469. -  RTS
  16470. +  LDA CURhAVE
  16471.    JSR GETh
  16472.    JSR GETnEXTh
  16473.    CLC
  16474.    LDA NEXTh+0
  16475.    ADC #HRfILENAME
  16476.    STA OUTnAME+0
  16477.    LDA NEXTh+1
  16478.    ADC #0
  16479.    STA OUTnAME+1
  16480.    JSR CMPoUTnAMEh
  16481.    CMP #0
  16482.    BNE -
  16483.    LDY #HRtOsEG
  16484.    CLC
  16485.    LDA (H),Y
  16486.    ADC #1
  16487.    STA CHECKfROMpLUS1+0
  16488.    INY
  16489.    LDA (H),Y
  16490.    ADC #0
  16491.    STA CHECKfROMpLUS1+1
  16492.    LDY #HRfROMsEG
  16493.    LDA (NEXTh),Y
  16494.    CMP CHECKfROMpLUS1+0
  16495.    BNE -
  16496.    INY
  16497.    LDA (NEXTh),Y
  16498.    CMP CHECKfROMpLUS1+1
  16499.    BNE -
  16500.  
  16501.    LDA #<COALESCEmSG1
  16502.    LDY #>COALESCEmSG1
  16503.    JSR EPUTS
  16504.    LDA H+0
  16505.    LDY H+1
  16506.    JSR EPUTrANGE
  16507.    LDA #","
  16508.    JSR EPUTCHAR
  16509.    LDA #" "
  16510.    JSR EPUTCHAR
  16511.    LDA NEXTh+0
  16512.    LDY NEXTh+1
  16513.    JSR EPUTrANGE
  16514.    LDA #<COALESCEmSG2
  16515.    LDY #>COALESCEmSG2
  16516.    JSR EPUTS
  16517.    CLC
  16518.    LDA H+0
  16519.    ADC #HRfILENAME
  16520.    LDY H+1
  16521.    BCC +
  16522.    INY
  16523. +  JSR EPUTS
  16524.    LDA #CHRqUOTE
  16525.    JSR EPUTCHAR
  16526.    LDA #CHRcr
  16527.    JSR EPUTCHAR
  16528.  
  16529.    LDX CURhAVE
  16530.    INX
  16531.    LDA #"R"
  16532.    JSR OPENtEMP
  16533.    BCC +
  16534.    RTS
  16535. +  STA FIN
  16536.    LDX CURhAVE
  16537.    LDA #"A"
  16538.    JSR OPENtEMP
  16539.    BCC +
  16540.    LDA FIN
  16541.    JSR CLOSE
  16542. +  STA FOUT
  16543.    LDA CURhAVE
  16544.    JSR GETh
  16545.    JSR GETnEXTh
  16546.    LDY #HRvALIDlENGTH+3
  16547.    LDX #3
  16548. -  LDA (NEXTh),Y
  16549.    STA BYTES,X
  16550.    DEY
  16551.    DEX
  16552.    BPL -
  16553.    JSR COPYfILE
  16554.    LDA FOUT
  16555.    JSR CLOSE
  16556.    LDA FIN
  16557.    JSR CLOSE
  16558.    LDY #HRiSeND
  16559.    LDA (NEXTh),Y
  16560.    STA (H),Y
  16561.    LDY #HRtOsEG
  16562.    LDA (NEXTh),Y
  16563.    STA (H),Y
  16564.    INY
  16565.    LDA (NEXTh),Y
  16566.    STA (H),Y
  16567.    LDX #4
  16568.    LDY #HRvALIDlENGTH
  16569.    CLC
  16570. -  LDA (H),Y
  16571.    ADC (NEXTh),Y
  16572.    STA (H),Y
  16573.    INY
  16574.    DEX
  16575.    BNE -
  16576.    LDA CURhAVE
  16577.    CLC
  16578.    ADC #1
  16579.    JSR GETh
  16580.    JSR FETCHtEMPnAME
  16581.    LDA #FALSE
  16582.    JSR GETtEMPnAMEsTR
  16583.    LDA #<TEMPnAMEsTR
  16584.    LDY #>TEMPnAMEsTR
  16585.    STA ZP+0
  16586.    STY ZP+1
  16587.    JSR REMOVE
  16588.    BCC +
  16589.    NOP  ;XX ERROR MSG
  16590. +  LDA CURhAVE
  16591.    CLC
  16592.    ADC #1
  16593.    JSR REMOVEhAVErEC
  16594.    RTS
  16595.  
  16596. COALESCEmSG1 = *
  16597.    .ASC "COALESCING SEGS "
  16598.    .BYTE 0
  16599. COALESCEmSG2 = *
  16600.    .ASC " OF "
  16601.    .BYTE CHRqUOTE,0
  16602.  
  16603. EPUTrANGE = *
  16604.    STA WORK+0
  16605.    STY WORK+1
  16606.    LDY #HRfROMsEG
  16607.    JSR EPUThAVEnUM
  16608.    LDA #"-"
  16609.    JSR EPUTCHAR
  16610.    LDY #HRtOsEG
  16611.  
  16612. EPUThAVEnUM = *
  16613.    LDA (WORK),Y
  16614.    STA WORK+4
  16615.    INY
  16616.    LDA (WORK),Y
  16617.    STA WORK+5
  16618.    LDA #0
  16619.    STA WORK+6
  16620.    STA WORK+7
  16621.    LDA #<NUMBUF
  16622.    LDY #>NUMBUF
  16623.    STA SYSWORK+0
  16624.    STY SYSWORK+1
  16625.    LDA #1
  16626.    LDX #WORK+4
  16627.    JSR UTOA
  16628.    LDA #<NUMBUF
  16629.    LDY #>NUMBUF
  16630.    JSR EPUTS
  16631.    RTS
  16632.  
  16633. FETCHtEMPnAME = *  ;( H )
  16634.    LDY #HRtEMPfILEnAME
  16635.    LDA (H),Y
  16636.    STA TEMPnAME+0
  16637.    INY
  16638.    LDA (H),Y
  16639.    STA TEMPnAME+1
  16640.    RTS
  16641.  
  16642. OPENtEMP = *  ;( .x=HAVErEC, .a=MODE ) : .a=FCB, .cs=ERR
  16643.    PHA
  16644.    TXA
  16645.    JSR GETh
  16646.    JSR FETCHtEMPnAME
  16647.    LDA #TRUE
  16648.    JSR GETtEMPnAMEsTR
  16649.    LDA #<TEMPnAMEsTR
  16650.    LDY #>TEMPnAMEsTR
  16651.    STA ZP+0
  16652.    STY ZP+1
  16653.    PLA
  16654.    JSR OPEN
  16655.    BCC +
  16656.    LDA #<TEMPnAMEsTR
  16657.    LDY #>TEMPnAMEsTR
  16658.    JSR EPUTS
  16659.    LDA #<OPENtEMPmSG
  16660.    LDY #>OPENtEMPmSG
  16661.    JSR EPUTS
  16662.    SEC
  16663. +  RTS
  16664.  
  16665.    OPENtEMPmSG = *
  16666.    .ASC ": CANNOT OPEN, SHOULD BE ABLE TO, CONTINUING"
  16667.    .BYTE CHRcr,0
  16668.  
  16669. COPYsEGlEN .BUF 2
  16670.            .BYTE $00,$00
  16671.  
  16672. COPYfILE = *  ;( FIN, FOUT, BYTES-- )
  16673.    LDA #<COPYbUF
  16674.    LDY #>COPYbUF
  16675.    STA ZP+0
  16676.    STY ZP+1
  16677.    LDA BYTES+2
  16678.    ORA BYTES+3
  16679.    BNE +
  16680.    LDA BYTES+0
  16681.    CMP #<COPYbUFsIZE
  16682.    LDA BYTES+1
  16683.    SBC #>COPYbUFsIZE
  16684.    BCS +
  16685.    LDA BYTES+0
  16686.    LDY BYTES+1
  16687.    JMP ++
  16688. +  LDA #<COPYbUFsIZE
  16689.    LDY #>COPYbUFsIZE
  16690. +  LDX FIN
  16691.    JSR READ
  16692.    BEQ +
  16693.    STA COPYsEGlEN+0
  16694.    STY COPYsEGlEN+1
  16695.    LDX FOUT
  16696.    JSR WRITE
  16697.    SEC
  16698.    LDY #4
  16699.    LDX #0
  16700. -  LDA BYTES,X
  16701.    SBC COPYsEGlEN,X
  16702.    STA BYTES,X
  16703.    INX
  16704.    DEY
  16705.    BNE -
  16706.    LDA BYTES+0
  16707.    ORA BYTES+1
  16708.    ORA BYTES+2
  16709.    ORA BYTES+3
  16710.    BNE COPYfILE
  16711.    RTS
  16712. +  LDA BYTES+0
  16713.    ORA BYTES+1
  16714.    ORA BYTES+2
  16715.    ORA BYTES+3
  16716.    BNE +
  16717.    RTS
  16718. +  LDA #<COPYlENmSG
  16719.    LDY #>COPYlENmSG
  16720.    JSR EPUTS
  16721.    RTS
  16722.  
  16723.    COPYlENmSG = *
  16724.    .ASC "iNSUFFICIENT TEMP DATA COALESCED, SHOULDN'T HAPPEN, CONTINUING"
  16725.    .BYTE CHRcr,0
  16726.  
  16727. OPENoVmODE .BUF 1
  16728.  
  16729. OPENoVERWRITE = *  ;( (ZP)=NAME, .a=MODE ) : .a=fCB, .cs=ERR
  16730.    STA OPENoVmODE
  16731.    JSR OPEN
  16732.    BCS +
  16733.    RTS
  16734. +  LDA ERRNO
  16735.    CMP #ACEeRRfILEeXISTS
  16736.    BEQ +
  16737. -  JSR REPORToPENeRROR
  16738.    SEC
  16739.    RTS
  16740. +  JSR REMOVE
  16741.    LDA OPENoVmODE
  16742.    JSR OPEN
  16743.    BCS -
  16744.    RTS
  16745.  
  16746. RENAMEoVnAME .BUF 2
  16747.  
  16748. RENAMEoVERWRITE = *  ;( (ZP)=NAME, (ZW)=NEWnAME ) : .cs=ERR
  16749.    JSR RENAME
  16750.    BCS +
  16751.    RTS
  16752. +  LDA ZP+0
  16753.    LDY ZP+1
  16754.    STA RENAMEoVnAME+0
  16755.    STY RENAMEoVnAME+1
  16756.    LDA ERRNO
  16757.    CMP #ACEeRRfILEeXISTS
  16758.    BEQ +
  16759. -  JSR REPORTrENAMEeRROR
  16760.    SEC
  16761.    RTS
  16762. +  LDA ZW+0
  16763.    LDY ZW+1
  16764.    STA ZP+0
  16765.    STY ZP+1
  16766.    JSR REMOVE
  16767.    LDA RENAMEoVnAME+0
  16768.    LDY RENAMEoVnAME+1
  16769.    STA ZP+0
  16770.    STY ZP+1
  16771.    JSR RENAME
  16772.    BCS -
  16773.    RTS
  16774.  
  16775. RENAMEoVnEWnAME .BUF 2
  16776.  
  16777. REPORTrENAMEeRROR = *
  16778.    LDA ZW+0
  16779.    LDY ZW+1
  16780.    STA RENAMEoVnEWnAME+0
  16781.    STY RENAMEoVnEWnAME+1
  16782.    LDA #<RENAMEeRRmSG1
  16783.    LDY #>RENAMEeRRmSG1
  16784.    JSR EPUTS
  16785.    LDA RENAMEoVnAME+0
  16786.    LDY RENAMEoVnAME+1
  16787.    JSR EPUTS
  16788.    LDA #<RENAMEeRRmSG2
  16789.    LDY #>RENAMEeRRmSG2
  16790.    JSR EPUTS
  16791.    LDA RENAMEoVnEWnAME+0
  16792.    LDY RENAMEoVnEWnAME+1
  16793.    JSR EPUTS
  16794.    LDA #<RENAMEeRRmSG3
  16795.    LDY #>RENAMEeRRmSG3
  16796.    JSR EPUTS
  16797.    RTS
  16798.  
  16799. RENAMEeRRmSG1 = *
  16800.    .ASC "cANNOT RENAME "
  16801.    .BYTE CHRqUOTE,0
  16802. RENAMEeRRmSG2 = *
  16803.    .BYTE CHRqUOTE
  16804.    .ASC " TO "
  16805.    .BYTE CHRqUOTE,0
  16806. RENAMEeRRmSG3 = *
  16807.    .BYTE CHRqUOTE
  16808.    .ASC ", CONTINUING."
  16809.    .BYTE CHRcr,0
  16810.  
  16811. UUDECODE.S
  16812. 660
  16813. ;*** UUDECODE PROGRAM
  16814.  
  16815. .SEQ ACEHEAD.S
  16816. .ORG ACEaPPaDDRESS
  16817. .OBJ "@0:UUDECODE"
  16818.  
  16819. JMP UUDECODEmAIN
  16820. .ASC "Cb"
  16821.  
  16822. ;*** GLOBAL DECLARATIONS
  16823.  
  16824. LIBWORK = $60
  16825.  
  16826. CHRlf = $0A
  16827. CHRcr = $0D
  16828. CHRqUOTE = $22
  16829.  
  16830. ASCIIfILE .BUF 1
  16831. TEMP .BUF 1
  16832.  
  16833. ;******** STANDARD LIBRARY ********
  16834. PUTS = *
  16835.    LDX #STDOUT
  16836. FPUTS = *
  16837.    STA ZP
  16838.    STY ZP+1
  16839.    LDY #$FF
  16840. -  INY
  16841.    LDA (ZP),Y
  16842.    BNE -
  16843.    TYA
  16844.    LDY #0
  16845.    JMP WRITE
  16846. EPUTS = *
  16847.    LDX #STDERR
  16848.    JMP FPUTS
  16849.  
  16850. PUTCHAR = *
  16851.    LDX #STDOUT
  16852. PUTC = *
  16853.    STA PUTCbUFFER
  16854.    LDA #<PUTCbUFFER
  16855.    LDY #>PUTCbUFFER
  16856.    STA ZP
  16857.    STY ZP+1
  16858.    LDA #1
  16859.    LDY #0
  16860.    JMP WRITE
  16861.    PUTCbUFFER .BUF 1
  16862.  
  16863. GETCHAR = *
  16864.    LDX #STDIN
  16865. GETC = *
  16866.    LDA #<GETCbUFFER
  16867.    LDY #>GETCbUFFER
  16868.    STA ZP
  16869.    STY ZP+1
  16870.    LDA #1
  16871.    LDY #0
  16872.    JSR READ
  16873.    BEQ +
  16874.    LDA GETCbUFFER
  16875.    RTS
  16876. +  SEC
  16877.    RTS
  16878.    GETCbUFFER .BUF 1
  16879.  
  16880. GETARG = *
  16881.    STY ZP+1
  16882.    ASL
  16883.    STA ZP
  16884.    ROL ZP+1
  16885.    CLC
  16886.    LDA ACEaRGV
  16887.    ADC ZP
  16888.    STA ZP
  16889.    LDA ACEaRGV+1
  16890.    ADC ZP+1
  16891.    STA ZP+1
  16892.    LDY #0
  16893.    LDA (ZP),Y
  16894.    TAX
  16895.    INY
  16896.    LDA (ZP),Y
  16897.    STX ZP
  16898.    STA ZP+1
  16899.    RTS
  16900.  
  16901. ;===UUDECODE===
  16902. UUDaRG = 2
  16903. UUDnAME = 4
  16904. INbUFlEN = 6
  16905.  
  16906. UUDECODEmAIN = *
  16907.    ;** CHECK ARGUMENT COUNT
  16908.    LDA ACEaRGC+1
  16909.    BNE UUDeNOUGHaRGS
  16910.    LDA ACEaRGC
  16911.    CMP #2
  16912.    BCS UUDeNOUGHaRGS
  16913.  
  16914. UUDuSAGE = *
  16915.    LDA #<UUDuSAGEmSG
  16916.    LDY #>UUDuSAGEmSG
  16917.    JMP PUTS
  16918.  
  16919. UUDuSAGEmSG = *
  16920.    .ASC "uSAGE: UUDECODE FILE1 FILE2 ... FILEn"
  16921.    .BYTE CHRcr,0
  16922.  
  16923. UUDeNOUGHaRGS = *
  16924.    ;** GET INPUT BUFFER LENGTH
  16925.    SEC
  16926.    LDA ACEsTACKpTR
  16927.    SBC #<UUDiNbUF
  16928.    STA INbUFlEN
  16929.    LDA ACEsTACKpTR+1
  16930.    SBC #>UUDiNbUF
  16931.    STA INbUFlEN+1
  16932.    ;** MAIN LOOP
  16933.    LDA #1
  16934.    LDY #0
  16935.    STA UUDaRG
  16936.    STY UUDaRG+1
  16937. -  LDA UUDaRG
  16938.    LDY UUDaRG+1
  16939.    JSR GETARG
  16940.    LDA ZP
  16941.    LDY ZP+1
  16942.    STA UUDnAME
  16943.    STY UUDnAME+1
  16944.    ORA ZP+1
  16945.    BEQ UUDeXIT
  16946.    JSR UUDeCHO
  16947.    JSR UUDECODE
  16948.    BCC +
  16949.    JSR UUDeRROR
  16950. +  INC UUDaRG
  16951.    BNE +
  16952.    INC UUDaRG+1
  16953. +  JMP -
  16954.  
  16955. UUDeXIT = *
  16956.    RTS
  16957.  
  16958. UUDeRROR = *
  16959.    LDA #<UUDeRRORmSG1
  16960.    LDY #>UUDeRRORmSG1
  16961.    JSR EPUTS
  16962.    LDA UUDnAME
  16963.    LDY UUDnAME+1
  16964.    JSR EPUTS
  16965.    LDA #<UUDeRRORmSG2
  16966.    LDY #>UUDeRRORmSG2
  16967.    JMP EPUTS
  16968.  
  16969. UUDeRRORmSG1 = *
  16970.    .ASC "eRROR ATTEMPTING TO UUDECODE FILE "
  16971.    .BYTE CHRqUOTE,0
  16972. UUDeRRORmSG2 = *
  16973.    .BYTE CHRqUOTE,CHRcr,0
  16974.  
  16975. UUDeCHO = *
  16976.    LDA #<UUDeCHOmSG1
  16977.    LDY #>UUDeCHOmSG1
  16978.    JSR EPUTS
  16979.    LDA UUDnAME
  16980.    LDY UUDnAME+1
  16981.    JSR EPUTS
  16982.    LDA #<UUDeCHOmSG2
  16983.    LDY #>UUDeCHOmSG2
  16984.    JMP EPUTS
  16985.  
  16986. UUDeCHOmSG1 = *
  16987.    .ASC "UUDECODING FILE "
  16988.    .BYTE CHRqUOTE,0
  16989.  
  16990. UUDeCHOmSG2 = *
  16991.    .BYTE CHRqUOTE
  16992.    .ASC "..."
  16993.    .BYTE CHRcr,0
  16994.  
  16995. BUFpTR = 8
  16996. BUFcOUNT = 10
  16997. INFILE = 12
  16998. OUTFILE = 13
  16999.  
  17000. UUDECODE = *
  17001.    ;** OPEN FILE
  17002.    LDA UUDnAME
  17003.    LDY UUDnAME+1
  17004.    STA ZP
  17005.    STY ZP+1
  17006.    LDA #"R"
  17007.    JSR OPEN
  17008.    BCC +
  17009.    RTS
  17010. +  STA INFILE
  17011.    ;** DECODE FILE
  17012.    JSR UUDECODEbODY
  17013.    ;** CLOSE FILE
  17014.    LDA INFILE
  17015.    JSR CLOSE
  17016.    RTS
  17017.  
  17018. UUDECODEbODY = *
  17019.    LDA #0
  17020.    STA BUFcOUNT
  17021.    STA BUFcOUNT+1
  17022.    STA HITlASTlINE
  17023.    STA LASTlINEtERMINATOR
  17024.  
  17025.    ;** SEARCH FOR "BEGIN" LINE
  17026.    UUDsEARCHlINE = *
  17027.    JSR GETLINE
  17028.    BCC +
  17029.    RTS
  17030. +  LDX #0
  17031.    LDA UUDiNlINE
  17032.    CMP #"B"
  17033.    BEQ +
  17034.    LDX #ASCIIbEGIN-PETSCIIbEGIN
  17035. +  LDY #0
  17036. -  LDA UUDiNlINE,Y
  17037.    CMP PETSCIIbEGIN,X
  17038.    BNE UUDsEARCHlINE
  17039.    INX
  17040.    INY
  17041.    CPY #6
  17042.    BCC -
  17043.    LDY #0
  17044.    CPX #ASCIIbEGIN-PETSCIIbEGIN+1
  17045.    BCC +
  17046.    LDY #$FF
  17047. +  STY ASCIIfILE
  17048.    LDA UUDiNlINE+9
  17049.    CMP #" "
  17050.    BNE UUDsEARCHlINE
  17051.    LDX #0
  17052. -  LDA UUDiNlINE+6,X
  17053.    CMP #"0"
  17054.    BCC UUDsEARCHlINE
  17055.    CMP #"8"
  17056.    BCS UUDsEARCHlINE
  17057.    INX
  17058.    CPX #3
  17059.    BCC -
  17060.    JMP PROCESSbEGIN
  17061.  
  17062.    PETSCIIbEGIN = *
  17063.    .ASC "BEGIN "
  17064.    ASCIIbEGIN = *
  17065.    .BYTE $62,$65,$67,$69,$6E,$20
  17066.  
  17067.    ;** PROCESS "BEGIN" LINE
  17068.    PROCESSbEGIN = *
  17069.    LDA ASCIIfILE
  17070.    BEQ +
  17071.    ;** JSR CONVERT FILENAME
  17072. +  JSR MAKEpETSCIInAME
  17073.    JSR DEFAULTpRGfILE
  17074.    JSR ECHOeXTRACTnAME
  17075.    LDA #<UUDiNlINE+10
  17076.    LDY #>UUDiNlINE+10
  17077.    STA ZP
  17078.    STY ZP+1
  17079.    LDA #"W"
  17080.    JSR OPEN
  17081.    BCC OPENoK
  17082.    LDA ERRNO
  17083.    CMP #ACEeRRfILEeXISTS
  17084.    BEQ +
  17085. -  JSR REPORToPENeRROR
  17086.    JMP UUDsEARCHlINE
  17087. +  JSR SCRATCHfILE
  17088.    LDA #"W"
  17089.    JSR OPEN
  17090.    BCS -
  17091.  
  17092.    OPENoK = *
  17093.    STA OUTFILE
  17094.  
  17095.    ;** READ UUENCODED DATA
  17096. -  JSR GETLINE
  17097.    BCS UUDfINISHfILE
  17098.    JSR UUcONVERTlINE
  17099.    BCC +
  17100.    ;** REPORT INVALID CHARACTERS
  17101.    LDA #<BADcHARSmSG
  17102.    LDY #>BADcHARSmSG
  17103.    JSR EPUTS
  17104.    JMP -
  17105. +  LDA UUDiNlINE
  17106.    BEQ UUDfINISHfILE
  17107.    JSR UUcRUNCHlINE
  17108.    JSR UUwRITElINE
  17109.    JMP -
  17110.  
  17111.    ;** FINISH WITH FILE
  17112.    UUDfINISHfILE = *
  17113.    LDA OUTFILE
  17114.    JSR CLOSE
  17115.    ;** PROCESS FOR ANOTHER FILE
  17116.    JMP UUDsEARCHlINE
  17117.  
  17118. BADcHARSmSG = *
  17119.    .ASC "WARNING: BAD CHARACTERS IN LINE; IGNORING LINE."
  17120.    .BYTE CHRcr,0
  17121.  
  17122. ;%%%
  17123. MAKEpETSCIInAME = *
  17124.    BIT ASCIIfILE
  17125.    BMI +
  17126.    RTS
  17127. +  LDX #0
  17128. -  LDA UUDiNlINE+10,X
  17129.    BEQ +
  17130.    JSR CONVaSC2pET
  17131.    STA UUDiNlINE+10,X
  17132.    INX
  17133.    BNE -
  17134. +  RTS
  17135.  
  17136. CONVaSC2pET = *
  17137.    AND #$7F
  17138.    CMP #$60
  17139.    BCC +
  17140.    CLC
  17141.    ADC #$C0-$60
  17142. +  TAY
  17143.    AND #$7F
  17144.    CMP #"A"
  17145.    BCS +
  17146. -  TYA
  17147.    RTS
  17148. +  CMP #"Z"+1
  17149.    BCS -
  17150.    TYA
  17151.    EOR #$80
  17152.    RTS
  17153.  
  17154. DEFAULTpRGfILE = *
  17155.    LDX #0
  17156. -  LDA UUDiNlINE+10,X
  17157.    BEQ +
  17158.    INX
  17159.    BNE -
  17160. +  LDA UUDiNlINE+8,X
  17161.    CMP #","
  17162.    BNE +
  17163.    RTS
  17164. +  LDA #","
  17165.    STA UUDiNlINE+10,X
  17166.    LDA #"P"
  17167.    STA UUDiNlINE+11,X
  17168.    LDA #0
  17169.    STA UUDiNlINE+12,X
  17170.    RTS
  17171.  
  17172. ECHOeXTRACTnAME = *
  17173.    LDA #<ECHOeXTRACTmSG1
  17174.    LDY #>ECHOeXTRACTmSG1
  17175.    JSR EPUTS
  17176.    LDA #<UUDiNlINE+10
  17177.    LDY #>UUDiNlINE+10
  17178.    JSR EPUTS
  17179.    LDA #<ECHOeXTRACTmSG2
  17180.    LDY #>ECHOeXTRACTmSG2
  17181.    JMP EPUTS
  17182.  
  17183. ECHOeXTRACTmSG1 = *
  17184.    .ASC "EXTRACTING FILE "
  17185.    .BYTE CHRqUOTE,0
  17186.  
  17187. ECHOeXTRACTmSG2 = *
  17188.    .BYTE CHRqUOTE
  17189.    .ASC "..."
  17190.    .BYTE CHRcr,0
  17191.  
  17192. REPORToPENeRROR = *
  17193.    LDA ZP
  17194.    LDY ZP+1
  17195.    JSR EPUTS
  17196.    LDA #<REPORToPENeRRORmSG
  17197.    LDY #>REPORToPENeRRORmSG
  17198.    JSR EPUTS
  17199.    RTS
  17200.  
  17201.    REPORToPENeRRORmSG = *
  17202.    .ASC ": CANNOT OPEN; SKIPPING THIS FILE."
  17203.    .BYTE CHRcr,0
  17204.  
  17205. SCRATCHfILE = *
  17206.    LDA #<SCRATCHfILEmSG1
  17207.    LDY #>SCRATCHfILEmSG1
  17208.    JSR EPUTS
  17209.    LDA #<UUDiNlINE+10
  17210.    LDY #>UUDiNlINE+10
  17211.    JSR EPUTS
  17212.    LDA #<SCRATCHfILEmSG2
  17213.    LDY #>SCRATCHfILEmSG2
  17214.    JSR EPUTS
  17215.    JSR GETCHAR
  17216.    PHA
  17217. -  CMP #CHRcr
  17218.    BEQ +
  17219.    JSR GETCHAR
  17220.    JMP -
  17221. +  LDA #<UUDiNlINE+10
  17222.    LDY #>UUDiNlINE+10
  17223.    STA ZP
  17224.    STY ZP+1
  17225.    PLA
  17226.    CMP #"Y"
  17227.    BEQ +
  17228.    CMP #"y"
  17229.    BEQ +
  17230.    RTS
  17231. +  JSR REMOVE
  17232.    RTS
  17233.  
  17234.    SCRATCHfILEmSG1 = *
  17235.    .ASC "oVERWRITE EXISTING FILE "
  17236.    .BYTE CHRqUOTE,0
  17237.    SCRATCHfILEmSG2 = *
  17238.    .BYTE CHRqUOTE
  17239.    .ASC "? "
  17240.    .BYTE 0
  17241.  
  17242. CONVERTfILL .BUF 1
  17243. CONVERTlEN = 15
  17244. UUcONVERTlINE = *
  17245.    LDA #0
  17246.    STA CONVERTfILL
  17247.    LDA UUDiNlINE
  17248.    BNE +
  17249.    CLC
  17250.    RTS
  17251. +  JSR UUcONVERTcHAR
  17252.    BCC +
  17253.    RTS
  17254. +  STA UUDiNlINE
  17255.    LDX #60
  17256.    CMP #46
  17257.    BCC +
  17258.    LDX #84
  17259. +  STX CONVERTlEN
  17260.    LDX #0
  17261. -  CPX CONVERTlEN
  17262.    BCC +
  17263.    CLC
  17264.    RTS
  17265. +  BIT CONVERTfILL
  17266.    BMI DOcONVERTfILL
  17267.    LDA UUDiNlINE+1,X
  17268.    BEQ +
  17269.    JSR UUcONVERTcHAR
  17270.    BCC CONVERTcONT
  17271.    RTS
  17272. +  LDA #$FF
  17273.    STA CONVERTfILL
  17274.  
  17275.    DOcONVERTfILL = *
  17276.    LDA #0
  17277.  
  17278.    CONVERTcONT = *
  17279.    STA UUDiNlINE+1,X
  17280.    INX
  17281.    BNE -
  17282.    RTS
  17283.  
  17284. UUcONVERTcHAR = *
  17285.    CMP #" "
  17286.    BCS +
  17287.    SEC
  17288.    RTS
  17289. +  CMP #"_"+1
  17290.    BCS +
  17291.    SEC
  17292.    SBC #" "
  17293.    CLC
  17294.    RTS
  17295. +  CMP #96
  17296.    BNE +
  17297. -  CLC
  17298.    LDA #0
  17299.    RTS
  17300. +  CMP #"{$60}"
  17301.    BEQ -
  17302.    BCS +
  17303.    SEC
  17304.    RTS
  17305. +  CMP #"z"+1
  17306.    BCC +
  17307.    RTS
  17308. +  SEC
  17309.    SBC #"a"-33
  17310.    CLC
  17311.    RTS
  17312.  
  17313. UUcRUNCHlINE = *
  17314.    LDX #0
  17315.    LDY #0
  17316. -  JSR UUcRUNCHgROUP
  17317.    CPY UUDiNlINE
  17318.    BCC -
  17319.    RTS
  17320.  
  17321. ;POS  76543210  76543210  76543210  76543210
  17322. ;BYT  XX111111  XX112222  XX222233  XX333333
  17323. ;BIT    765432    107654    321076    543210
  17324.  
  17325. UUcRUNCHgROUP = * ;(.x=iN4BYTESoFFSET, .y=oUT3BYTESoFFSET) : .x++, .y++
  17326.    LDA UUDiNlINE+1,X  ;*** OUTPUT BYTE 0
  17327.    ASL
  17328.    ASL
  17329.    STA TEMP
  17330.    INX
  17331.    LDA UUDiNlINE+1,X
  17332.    LSR
  17333.    LSR
  17334.    LSR
  17335.    LSR
  17336.    AND #%00000011
  17337.    ORA TEMP
  17338.    STA UUDiNlINE+1,Y
  17339.    INY
  17340.    LDA UUDiNlINE+1,X  ;*** OUTPUT BYTE 1
  17341.    ASL
  17342.    ASL
  17343.    ASL
  17344.    ASL
  17345.    STA TEMP
  17346.    INX
  17347.    LDA UUDiNlINE+1,X
  17348.    LSR
  17349.    LSR
  17350.    AND #%00001111
  17351.    ORA TEMP
  17352.    STA UUDiNlINE+1,Y
  17353.    INY
  17354.    LDA UUDiNlINE+1,X  ;*** OUTPUT BYTE 2
  17355.    INX
  17356.    ROR
  17357.    ROR
  17358.    ROR
  17359.    AND #%11000000
  17360.    STA TEMP
  17361.    LDA UUDiNlINE+1,X
  17362.    INX
  17363.    AND #%00111111
  17364.    ORA TEMP
  17365.    STA UUDiNlINE+1,Y
  17366.    INY
  17367.    RTS
  17368.  
  17369. UUwRITElINE = *
  17370.    LDA #<UUDiNlINE+1
  17371.    LDY #>UUDiNlINE+1
  17372.    STA ZP
  17373.    STY ZP+1
  17374.    LDA UUDiNlINE
  17375.    LDY #0
  17376.    LDX OUTFILE
  17377.    JSR WRITE
  17378.    RTS
  17379.  
  17380. GETLINEpOS = 14
  17381. HITlASTlINE .BUF 1
  17382. LASTlINEtERMINATOR .BUF 1
  17383.  
  17384. GETLINE = *
  17385.    LDA HITlASTlINE
  17386.    BEQ +
  17387.    SEC
  17388.    RTS
  17389. +  LDX #0
  17390.    STX GETLINEpOS
  17391.  
  17392.    ;** TOSS AN lf THAT FOLLOWS A cr
  17393.    JSR GETbYTE
  17394.    BCS GETLINEpROCESS
  17395.    CMP #CHRlf
  17396.    CLC
  17397.    BNE GETLINEpROCESS
  17398.    LDX LASTlINEtERMINATOR
  17399.    CPX #CHRcr
  17400.    CLC
  17401.    BNE GETLINEpROCESS
  17402.  
  17403.    GETLINEcHAR = *
  17404.    JSR GETbYTE
  17405.    GETLINEpROCESS = *
  17406.    BCC +
  17407.    LDA #$FF
  17408.    STA HITlASTlINE
  17409.    JMP GETLINEfINISH
  17410. +  CMP #CHRcr
  17411.    BEQ GETLINEfINISH
  17412.    CMP #CHRlf
  17413.    BEQ GETLINEfINISH
  17414.    LDX GETLINEpOS
  17415.    CPX #98
  17416.    BCS +
  17417.    STA UUDiNlINE,X
  17418.    INC GETLINEpOS
  17419. +  JMP GETLINEcHAR
  17420.  
  17421.    GETLINEfINISH = *
  17422.    STA LASTlINEtERMINATOR
  17423.    LDX GETLINEpOS
  17424.    LDA #0
  17425.    STA UUDiNlINE,X
  17426.    CPX #0
  17427.    BEQ +
  17428.    CLC
  17429.    RTS
  17430. +  LDA HITlASTlINE
  17431.    CMP #1
  17432.    RTS
  17433.  
  17434. GETbYTE = *
  17435.    LDA BUFcOUNT
  17436.    ORA BUFcOUNT+1
  17437.    BEQ GETbYTEfILLbUF
  17438.    LDY #0
  17439.    LDA (BUFpTR),Y
  17440.    INC BUFpTR
  17441.    BNE +
  17442.    INC BUFpTR+1
  17443. +  LDX BUFcOUNT
  17444.    BNE +
  17445.    DEC BUFcOUNT+1
  17446. +  DEC BUFcOUNT
  17447.    CLC
  17448.    RTS
  17449.  
  17450. GETbYTEfILLbUF = *
  17451.    LDA #<UUDiNbUF
  17452.    LDY #>UUDiNbUF
  17453.    STA ZP
  17454.    STY ZP+1
  17455.    STA BUFpTR
  17456.    STY BUFpTR+1
  17457.    LDA INbUFlEN
  17458.    LDY INbUFlEN+1
  17459.    LDX INFILE
  17460.    JSR READ
  17461.    BEQ +
  17462.    BCS +
  17463.    STA BUFcOUNT
  17464.    STY BUFcOUNT+1
  17465.    JMP GETbYTE
  17466. +  SEC
  17467.    RTS
  17468.  
  17469. ;===THE END===
  17470. UUDbSS = *
  17471. UUDiNlINE = UUDbSS+0
  17472. UUDiNbUF  = UUDbSS+100
  17473. UUENCODE.S
  17474. 443
  17475. ;*** UUENCODE PROGRAM
  17476.  
  17477. .SEQ ACEHEAD.S
  17478. .ORG ACEaPPaDDRESS
  17479. .OBJ "@0:UUENCODE"
  17480.  
  17481. JMP UUENCODEmAIN
  17482. .ASC "Cb"
  17483.  
  17484. ;*** GLOBAL DECLARATIONS
  17485.  
  17486. LIBWORK = $60
  17487.  
  17488. CHRcr = $0D
  17489. CHRqUOTE = $22
  17490.  
  17491. ;******** STANDARD LIBRARY ********
  17492. PUTS = *
  17493.    LDX #STDOUT
  17494. FPUTS = *
  17495.    STA ZP
  17496.    STY ZP+1
  17497.    LDY #$FF
  17498. -  INY
  17499.    LDA (ZP),Y
  17500.    BNE -
  17501.    TYA
  17502.    LDY #0
  17503.    JMP WRITE
  17504. EPUTS = *
  17505.    LDX #STDERR
  17506.    JMP FPUTS
  17507.  
  17508. PUTCHAR = *
  17509.    LDX #STDOUT
  17510. PUTC = *
  17511.    STA PUTCbUFFER
  17512.    LDA #<PUTCbUFFER
  17513.    LDY #>PUTCbUFFER
  17514.    STA ZP
  17515.    STY ZP+1
  17516.    LDA #1
  17517.    LDY #0
  17518.    JMP WRITE
  17519.    PUTCbUFFER .BUF 1
  17520.  
  17521. GETCHAR = *
  17522.    LDX #STDIN
  17523. GETC = *
  17524.    LDA #<GETCbUFFER
  17525.    LDY #>GETCbUFFER
  17526.    STA ZP
  17527.    STY ZP+1
  17528.    LDA #1
  17529.    LDY #0
  17530.    JSR READ
  17531.    BEQ +
  17532.    LDA GETCbUFFER
  17533.    RTS
  17534. +  SEC
  17535.    RTS
  17536.    GETCbUFFER .BUF 1
  17537.  
  17538. GETARG = *
  17539.    STY ZP+1
  17540.    ASL
  17541.    STA ZP
  17542.    ROL ZP+1
  17543.    CLC
  17544.    LDA ACEaRGV
  17545.    ADC ZP
  17546.    STA ZP
  17547.    LDA ACEaRGV+1
  17548.    ADC ZP+1
  17549.    STA ZP+1
  17550.    LDY #0
  17551.    LDA (ZP),Y
  17552.    TAX
  17553.    INY
  17554.    LDA (ZP),Y
  17555.    STX ZP
  17556.    STA ZP+1
  17557.    RTS
  17558.  
  17559. BASENAMEsTART = LIBWORK
  17560.  
  17561. BASENAME = * ;( (ZP)=INNAME ) : UUEoUTbUF=OUTNAME
  17562.    LDY #255
  17563.    STY BASENAMEsTART
  17564. -  INY
  17565.    LDA (ZP),Y
  17566.    BEQ BASENAMEdONE
  17567.    CMP #":"
  17568.    BEQ +
  17569.    CMP #"/"
  17570.    BNE -
  17571. +  STY BASENAMEsTART
  17572.    JMP -
  17573.    BASENAMEdONE = *
  17574.    LDY BASENAMEsTART
  17575.    LDX #255
  17576. -  INY
  17577.    INX
  17578.    LDA (ZP),Y
  17579.    STA UUEoUTbUF,X
  17580.    BNE -
  17581.    CPX #2
  17582.    BCC +
  17583.    LDA UUEoUTbUF-2,X
  17584.    CMP #","
  17585.    BNE +
  17586.    LDA #0
  17587.    STA UUEoUTbUF-2,X
  17588. +  RTS
  17589.  
  17590. ;===UUENCODE===
  17591. UUEaRG = 2
  17592. UUEnAME = 4
  17593. INbUFlEN = 6
  17594.  
  17595. UUENCODEmAIN = *
  17596.    ;** CHECK ARGUMENT COUNT
  17597.    LDA ACEaRGC+1
  17598.    BNE UUEeNOUGHaRGS
  17599.    LDA ACEaRGC
  17600.    CMP #2
  17601.    BCS UUEeNOUGHaRGS
  17602.  
  17603. UUEuSAGE = *
  17604.    LDA #<UUEuSAGEmSG
  17605.    LDY #>UUEuSAGEmSG
  17606.    JMP PUTS
  17607.  
  17608. UUEuSAGEmSG = *
  17609.    .ASC "uSAGE: UUENCODE FILE1 FILE2 ... FILEn"
  17610.    .BYTE CHRcr
  17611.    .BYTE 0
  17612.  
  17613. UUEeNOUGHaRGS = *
  17614.    ;** GET INPUT BUFFER LENGTH
  17615.    SEC
  17616.    LDA ACEsTACKpTR
  17617.    SBC #<UUEiNbUF
  17618.    STA INbUFlEN
  17619.    LDA ACEsTACKpTR+1
  17620.    SBC #>UUEiNbUF
  17621.    STA INbUFlEN+1
  17622.    ;** MAIN LOOP
  17623.    LDA #1
  17624.    LDY #0
  17625.    STA UUEaRG
  17626.    STY UUEaRG+1
  17627. -  LDA UUEaRG
  17628.    LDY UUEaRG+1
  17629.    JSR GETARG
  17630.    LDA ZP
  17631.    LDY ZP+1
  17632.    STA UUEnAME
  17633.    STY UUEnAME+1
  17634.    ORA ZP+1
  17635.    BEQ UUEeXIT
  17636.    JSR UUEeCHO
  17637.    JSR UUENCODE
  17638.    BCC +
  17639.    JSR UUEeRROR
  17640. +  INC UUEaRG
  17641.    BNE +
  17642.    INC UUEaRG+1
  17643. +  JMP -
  17644.  
  17645. UUEeXIT = *
  17646.    RTS
  17647.  
  17648. UUEeRROR = *
  17649.    LDA #<UUEeRRORmSG1
  17650.    LDY #>UUEeRRORmSG1
  17651.    JSR EPUTS
  17652.    LDA UUEnAME
  17653.    LDY UUEnAME+1
  17654.    JSR EPUTS
  17655.    LDA #<UUEeRRORmSG2
  17656.    LDY #>UUEeRRORmSG2
  17657.    JMP EPUTS
  17658.  
  17659. UUEeRRORmSG1 = *
  17660.    .ASC "eRROR ATTEMPTING TO UUENCODE "
  17661.    .BYTE CHRqUOTE
  17662.    .BYTE 0
  17663.  
  17664. UUEeRRORmSG2 = *
  17665.    .BYTE CHRqUOTE
  17666.    .BYTE CHRcr
  17667.    .BYTE 0
  17668.  
  17669. UUEeCHO = *
  17670.    LDA #<UUEeCHOmSG1
  17671.    LDY #>UUEeCHOmSG1
  17672.    JSR EPUTS
  17673.    LDA UUEnAME
  17674.    LDY UUEnAME+1
  17675.    JSR EPUTS
  17676.    LDA #<UUEeCHOmSG2
  17677.    LDY #>UUEeCHOmSG2
  17678.    JMP EPUTS
  17679.  
  17680. UUEeCHOmSG1 = *
  17681.    .ASC "uUENCODING FILE "
  17682.    .BYTE CHRqUOTE
  17683.    .BYTE 0
  17684.  
  17685. UUEeCHOmSG2 = *
  17686.    .BYTE CHRqUOTE
  17687.    .ASC "..."
  17688.    .BYTE CHRcr
  17689.    .BYTE 0
  17690.  
  17691. BUFpTR = 8
  17692. BUFcOUNT = 10
  17693. INFILE = 12
  17694.  
  17695. UUENCODE = *
  17696.    ;** OPEN FILE
  17697.    LDA UUEnAME
  17698.    LDY UUEnAME+1
  17699.    STA ZP
  17700.    STY ZP+1
  17701.    LDA #"R"
  17702.    JSR OPEN
  17703.    BCC +
  17704.    RTS
  17705. +  STA INFILE
  17706.    ;** ENCODE FILE
  17707.    JSR UUENCODEbODY
  17708.    ;** CLOSE FILE
  17709.    LDA INFILE
  17710.    JSR CLOSE
  17711.    RTS
  17712.  
  17713. UUENCODEbODY = *
  17714.    LDA #0
  17715.    STA BUFcOUNT
  17716.    STA BUFcOUNT+1
  17717.    ;** HEADER LINE
  17718.    LDA #<UUEhEADERmSG
  17719.    LDY #>UUEhEADERmSG
  17720.    JSR PUTS
  17721.    LDA UUEnAME
  17722.    LDY UUEnAME+1
  17723.    STA ZP
  17724.    STY ZP+1
  17725.    JSR BASENAME
  17726.    LDA #<UUEoUTbUF
  17727.    LDY #>UUEoUTbUF
  17728.    JSR PUTS
  17729.    LDA #CHRcr
  17730.    JSR PUTCHAR
  17731.    ;** LOOP
  17732. -  JSR UUlINE
  17733.    BCC -
  17734.    ;** END LINE
  17735.    LDA #<UUEeNDmSG
  17736.    LDY #>UUEeNDmSG
  17737.    JSR PUTS
  17738.    ;** CRC LINE
  17739.    RTS
  17740.  
  17741. UUEhEADERmSG = *
  17742.    .ASC "BEGIN 640 "
  17743.    .BYTE 0
  17744.  
  17745. UUEeNDmSG = *
  17746.    .ASC "{$60}"
  17747.    .BYTE CHRcr
  17748.    .ASC "END"
  17749.    .BYTE CHRcr,0
  17750.  
  17751. GETbYTE = *
  17752.    LDA BUFcOUNT
  17753.    ORA BUFcOUNT+1
  17754.    BEQ GETbYTEfILLbUF
  17755.    LDY #0
  17756.    LDA (BUFpTR),Y
  17757.    INC BUFpTR
  17758.    BNE +
  17759.    INC BUFpTR+1
  17760. +  LDX BUFcOUNT
  17761.    BNE +
  17762.    DEC BUFcOUNT+1
  17763. +  DEC BUFcOUNT
  17764.    CLC
  17765.    RTS
  17766.  
  17767. GETbYTEfILLbUF = *
  17768.    LDA #<UUEiNbUF
  17769.    LDY #>UUEiNbUF
  17770.    STA ZP
  17771.    STY ZP+1
  17772.    STA BUFpTR
  17773.    STY BUFpTR+1
  17774.    LDA INbUFlEN
  17775.    LDY INbUFlEN+1
  17776.    LDX INFILE
  17777.    JSR READ
  17778.    BEQ +
  17779.    BCS +
  17780.    STA BUFcOUNT
  17781.    STY BUFcOUNT+1
  17782.    JMP GETbYTE
  17783. +  SEC
  17784.    RTS
  17785.  
  17786. DATALEN = 13
  17787. OUTLINELEN = 14
  17788.  
  17789. UUlINE = *
  17790.    LDA #0
  17791.    STA DATALEN
  17792.    LDA #1
  17793.    STA OUTLINELEN
  17794.    ;** GET THE LINE
  17795. -  JSR GETfOURcHARS
  17796.    BCS +
  17797.    LDA DATALEN
  17798.    CMP #45
  17799.    BCC -
  17800.    CLC
  17801.    ;** PUT THE LINE
  17802. +  PHP
  17803.    LDY OUTLINELEN
  17804.    LDA #CHRcr
  17805.    STA UUEoUTbUF,Y
  17806.    INC OUTLINELEN
  17807.    LDA DATALEN
  17808.    CMP #0
  17809.    BEQ +
  17810.    JSR GETuUCHAR
  17811.    STA UUEoUTbUF
  17812.    LDA #<UUEoUTbUF
  17813.    LDY #>UUEoUTbUF
  17814.    STA ZP
  17815.    STY ZP+1
  17816.    LDA OUTLINELEN
  17817.    LDY #0
  17818.    LDX #1
  17819.    JSR WRITE
  17820. +  PLP
  17821.    RTS
  17822.  
  17823. UUTEMP = 15
  17824. UUBUF .BUF 3
  17825.  
  17826. GETfOURcHARS = *
  17827.    LDX #2
  17828.    LDA #0
  17829. -  STA UUBUF,X
  17830.    DEX
  17831.    BPL -
  17832.    ;** READ THE BYTES
  17833.    LDX #0
  17834. -  STX UUTEMP
  17835.    JSR GETbYTE
  17836.    BCS +
  17837.    LDX UUTEMP
  17838.    STA UUBUF,X
  17839.    INC DATALEN
  17840.    INX
  17841.    CPX #3
  17842.    BCC -
  17843.    CLC
  17844.    ;** PUT BYTES INTO OUTPUT LINE
  17845. ;POS  76543210  76543210  76543210  76543210
  17846. ;BYT  XX111111  XX112222  XX222233  XX333333
  17847. ;BIT    765432    107654    321076    543210
  17848. +  PHP
  17849.    LDY OUTLINELEN
  17850.    ;** FIRST BYTE
  17851.    LDA UUBUF
  17852.    LSR
  17853.    LSR
  17854.    JSR GETuUCHAR
  17855.    STA UUEoUTbUF,Y
  17856.    INY
  17857.  
  17858.    ;** SECOND BYTE
  17859.    LDA UUBUF
  17860.    ASL
  17861.    ASL
  17862.    ASL
  17863.    ASL
  17864.    STA UUTEMP
  17865.    LDA UUBUF+1
  17866.    LSR
  17867.    LSR
  17868.    LSR
  17869.    LSR
  17870.    ORA UUTEMP
  17871.    JSR GETuUCHAR
  17872.    STA UUEoUTbUF,Y
  17873.    INY
  17874.  
  17875.    ;** THIRD BYTE
  17876.    LDA UUBUF+1
  17877.    ASL
  17878.    ASL
  17879.    STA UUTEMP
  17880.    LDA UUBUF+2
  17881.    ASL
  17882.    ROL
  17883.    ROL
  17884.    AND #%00000011
  17885.    ORA UUTEMP
  17886.    JSR GETuUCHAR
  17887.    STA UUEoUTbUF,Y
  17888.    INY
  17889.  
  17890.    ;** FOURTH BYTE
  17891.    LDA UUBUF+2
  17892.    JSR GETuUCHAR
  17893.    STA UUEoUTbUF,Y
  17894.    INY
  17895.    STY OUTLINELEN
  17896.    PLP
  17897.    RTS
  17898.  
  17899. GETuUCHAR = *
  17900.    AND #%00111111
  17901.    BNE +
  17902.    LDA #"{$60}"
  17903.    RTS
  17904. +  CLC
  17905.    ADC #" "
  17906.    CMP #"A"
  17907.    BCS +
  17908.    RTS
  17909. +  CMP #"["
  17910.    BCS +
  17911.    ADC #128
  17912. +  RTS
  17913.  
  17914. ;===THE END===
  17915. UUEeND = *
  17916. UUEoUTbUF = UUEeND
  17917. UUEiNbUF = UUEoUTbUF+80
  17918. VI.S
  17919. 1084
  17920. ;*** ZED TEXT EDITOR PROGRAM
  17921.  
  17922. .SEQ ACEHEAD.S
  17923. .ORG ACEaPPaDDRESS
  17924. .OBJ "@0:VI"
  17925.  
  17926. JMP MAIN
  17927. .ASC "Cb"
  17928.  
  17929. ;*** GLOBAL DECLARATIONS
  17930.  
  17931. WORK1 = $02 ;(16)
  17932. WORK2 = $12 ;(16)
  17933. WORK3 = $22 ;(14)
  17934.  
  17935. CHRcr = $0D
  17936. CHRtAB = $09
  17937. CHRqUOTE = $22
  17938.  
  17939. ;SCREEN
  17940.  
  17941. SCRtOPaDDR      = $30 ;(2)
  17942. SCRlINEaDDR     = $32 ;(2)
  17943. CURrOW          = $34 ;(1)
  17944. CURcOL          = $35 ;(1)
  17945. SCRrOWS         = $36 ;(1)
  17946. SCRcOLS         = $37 ;(1)
  17947. SCRrOWiNC       = $38 ;(2)
  17948. CURlEFTmARGIN   = $3A ;(1)
  17949. STATUSmARGIN    .BUF 1
  17950.  
  17951. ;DOCUMENT
  17952.  
  17953. LINEpTR         = $40 ;(4)
  17954. LINEnUM         = $44 ;(4)
  17955. TOSlINEpTR      = $48 ;(4)
  17956. TOPlINEpTR      = $4C ;(4)
  17957. BOTlINEpTR      = $50 ;(4)
  17958. LINEcOUNT       = $54 ;(4)
  17959. FILElENGTH      = $58 ;(4)
  17960. TARGETlEN       = $5C ;(1)
  17961. WRAPfLAG        = $5D ;(1) ;128=WRAP,64=SHOWcr
  17962.  
  17963. ;MANAGEMENT
  17964.  
  17965. MODIFIED        = $3B ;(1) ;$00=NO, $FF=MODIFIED
  17966. MODEfLAGS       = $3C ;(1) ;$80=INSERT, $40=INDENT
  17967. STATUSuPDATE    = $3D ;(1) ;128=LINE,64=COL,32=MOD,16=INS,8=BYT,4=FRE,2=NM,1=MSG
  17968. MARKEDlINEpTR   .BUF 4 ;(4)
  17969. MARKEDlINEnUM   .BUF 4 ;(4)
  17970. MARKEDcOL       .BUF 4 ;(1)
  17971.  
  17972. ;LINE FORMAT
  17973.  
  17974. HEADbUFFER      = $70 ;(11)
  17975. HEADnEXTpTR     = $70 ;(4)
  17976. HEADpREVpTR     = $74 ;(4)
  17977. HEADlINElEN     = $78 ;(1)
  17978. HEADiNDENT      = $79 ;(1)
  17979. HEADfLAGS       = $7A ;(1) ;$80=CONNECTED, $40=NULLlINE, $3f=INDENT
  17980. HEADlENGTH      = $0B
  17981.  
  17982. ;KILL BUFFER
  17983.  
  17984. BUFFERtOPpTR    .BUF 4 ;(4)
  17985. BUFFERbOTpTR    .BUF 4 ;(4)
  17986. BUFFERlINEcOUNT .BUF 4 ;(4)
  17987.  
  17988. ;DOCUMENT BUFFERS
  17989.  
  17990. ;COLORS
  17991.  
  17992. CHARcOLOR   .BYTE $0C  ;$0E
  17993. CURSORcOLOR .BYTE $06
  17994. STATUScOLOR .BYTE $04
  17995. SEPARcOLOR  .BYTE $0F  ;$03
  17996. HILITEcOLOR .BYTE $0D  ;$0C
  17997. ALERTcOLOR  .BYTE $0F
  17998. BORDERcOLOR .BYTE $00
  17999. BKGNDcOLOR  .BYTE $00
  18000.  
  18001. ;=== NEW ===
  18002.  
  18003. SCREENiNIT = *
  18004.    ;** GET SCREEN PARMS
  18005.    JSR WINSIZE
  18006.    STA SCRrOWS
  18007.    LDA SYSWORK+0
  18008.    STA SCRcOLS
  18009.    LDA SYSWORK+2
  18010.    LDY SYSWORK+3
  18011.    STA SCRtOPaDDR+0
  18012.    STY SCRtOPaDDR+1
  18013.    STA $400
  18014.    STY $401
  18015.    LDA SYSWORK+4
  18016.    LDY SYSWORK+5
  18017.    STA SCRrOWiNC+0
  18018.    STY SCRrOWiNC+1
  18019.    ;** GET COLOR PALETTE
  18020.    JSR CONPALETTE
  18021.    LDX #7
  18022. -  LDA SYSWORK,X
  18023.    STA CHARcOLOR,X
  18024.    DEX
  18025.    BPL -
  18026.    ;** CLEAR SCREEN
  18027.    LDA #$A0
  18028.    LDY CHARcOLOR
  18029.    LDX #$FF
  18030.    JSR WINCLS
  18031.    ;** SET STATUS COLOR
  18032.    LDA SCRtOPaDDR+0
  18033.    LDY SCRtOPaDDR+1
  18034.    STA SYSWORK+0
  18035.    STY SYSWORK+1
  18036.    LDA SCRcOLS
  18037.    STA SYSWORK+5
  18038.    LDA #$40
  18039.    LDY STATUScOLOR
  18040.    LDX #0
  18041.    JSR WINPUT
  18042.    ;** SET SEPARATOR COLOR
  18043.    JSR SETsEPARaDDR
  18044.    LDA #$40
  18045.    LDY SEPARcOLOR
  18046.    LDX #0
  18047.    JSR WINPUT
  18048.    RTS
  18049.  
  18050.    JSR DISPLAYsEPARATOR
  18051.    LDA #$FF
  18052.    STA STATUSuPDATE
  18053.    JSR UPDATEsTATUS
  18054.    RTS
  18055.  
  18056. SETsEPARaDDR = *
  18057.    CLC
  18058.    LDA SCRtOPaDDR+0
  18059.    ADC SCRrOWiNC+0
  18060.    STA SYSWORK+0
  18061.    LDA SCRtOPaDDR+1
  18062.    ADC SCRrOWiNC+1
  18063.    STA SYSWORK+1
  18064.    RTS
  18065.  
  18066. DISPLAYsTATUS = *
  18067.    LDA SCRtOPaDDR+0
  18068.    LDY SCRtOPaDDR+1
  18069.    STA SYSWORK+0
  18070.    STY SYSWORK+1
  18071.    LDA #<STATUSlINE
  18072.    LDY #>STATUSlINE
  18073.    CLC
  18074.    ADC STATUSmARGIN
  18075.    BCC +
  18076.    INY
  18077. +  STA ZW+0
  18078.    STY ZW+1
  18079.    LDA SCRcOLS
  18080.    STA SYSWORK+5
  18081.    LDA #$80
  18082.    LDX SCRcOLS
  18083.    JSR WINPUT
  18084.    RTS
  18085.  
  18086. STATUSlINE = *
  18087.   .ASC "l:12345678c:241 *  iNS  iND  b:12345678  f:12345678 "
  18088.      ; "0----+----1----+----2----+----3----+----4----+----5-"
  18089.   .ASC "1234567890123456789012345678"
  18090.      ; "---+----6----+----7----+----"
  18091.  
  18092. UPDATEsTATUS = *
  18093.    JSR DISPLAYsTATUS
  18094.    RTS
  18095.  
  18096. DISPLAYsEPARATOR = *
  18097.    RTS
  18098.  
  18099. ;=== MAIN ===
  18100.  
  18101. MAIN = *
  18102.    JSR MALLOCiNIT
  18103.    JSR MAINiNIT
  18104.    JSR SCREENiNIT
  18105.    JSR DISPLAYsTATUS
  18106.    LDA #1
  18107.    LDY #0
  18108.    JSR GETARG
  18109.    JSR LOADfILE
  18110.    JSR DUMPdOC
  18111.    RTS
  18112.  
  18113. MSG .ASC "zED FOR ace VERSION ace-0.01"
  18114.     .BYTE CHRcr,0
  18115.  
  18116. MAINiNIT = *
  18117.    LDX #$7F-$02
  18118.    LDA #0
  18119. -  STA 2,X
  18120.    DEX
  18121.    BPL -
  18122.    LDA #$80
  18123.    STA WRAPfLAG
  18124.    JSR WINSIZE
  18125.    LDA SYSWORK+0
  18126.    STA TARGETlEN
  18127.    RTS
  18128.  
  18129. ;*** LOAD FILE: USES WORK2 ***
  18130.  
  18131. LOADhEAD  = WORK2+0
  18132. LOADtAIL  = WORK2+4
  18133. LOADlINES = WORK2+8
  18134. LOADbYTES = WORK2+12
  18135. LOADfCB      = WORK3+0
  18136. LOADlINEsCAN = WORK3+1
  18137. LOADlINElEN  = WORK3+2
  18138. LOADbUFcOUNT = WORK3+3
  18139. LOADbUFpTR   = WORK3+4
  18140.  
  18141. LOADfILE = *  ;( (ZP)=NAME ) : [W2]=HEAD, [W2]=TAIL, [W2]=LINES, [W2]=BYTES
  18142.    JSR SAVEwORK3
  18143.    JSR LOADiNIT
  18144.    LDA #"R"
  18145.    JSR OPEN
  18146.    STA LOADfCB
  18147. -  JSR LOADlINE
  18148.    BCS +
  18149.    JSR LOADlINEwRAP
  18150.    JSR LOADlINEsTORE
  18151.    JSR LOADlINEoVERFLOW
  18152.    JMP -
  18153. +  LDA LOADlINElEN
  18154.    BEQ +
  18155.    JSR LOADlINEwRAP
  18156.    LDA #$00
  18157.    STA HEADfLAGS
  18158.    JSR LOADlINEsTORE
  18159. +  LDA LOADfCB
  18160.    JSR CLOSE
  18161.    JSR RESTOREwORK3
  18162.    RTS
  18163.  
  18164. LOADiNIT = *
  18165.    LDA #0
  18166.    LDX #16+14-1
  18167. -  STA LOADhEAD,X
  18168.    DEX
  18169.    BPL -
  18170.    RTS
  18171.  
  18172. LOADlINE = *  ;( ) : .cs=END
  18173.    ;TAB EXPANSION WILL GO INTO THIS ROUTINE
  18174.    LDX LOADbUFpTR
  18175.    LDY LOADlINElEN
  18176.  
  18177.    LOADnEXTbYTE = *
  18178.    LDA LOADbUFcOUNT
  18179.    BNE ++
  18180.    STY LOADlINElEN
  18181.    JSR LOADbUF
  18182.    BCC +
  18183.    RTS
  18184. +  LDY LOADlINElEN
  18185.    LDX LOADbUFpTR
  18186. +  NOP
  18187.  
  18188. -  LDA FILEBUF,X
  18189.    STA LINE,Y
  18190.    INX
  18191.    INY
  18192.    CMP #CHRcr
  18193.    BEQ ++
  18194.    CPY TARGETlEN
  18195.    BEQ +  ;DETERMINES IF crS WILL GO BEYOND LEN
  18196.    BCS ++
  18197. +  DEC LOADbUFcOUNT
  18198.    BNE -
  18199.    BEQ LOADnEXTbYTE
  18200.  
  18201. +  DEC LOADbUFcOUNT
  18202.    STX LOADbUFpTR
  18203.    STY LOADlINElEN
  18204.    CLC
  18205.    RTS
  18206.  
  18207. LOADbUF = *  ;( ) : .cs=EOF
  18208.    JSR STOPKEY
  18209.    BCS +
  18210.    LDA #<FILEBUF
  18211.    LDY #>FILEBUF
  18212.    STA ZP+0
  18213.    STY ZP+1
  18214.    LDA #<254
  18215.    LDY #>254
  18216.    LDX LOADfCB
  18217.    JSR READ
  18218.    BCS +
  18219.    BEQ +
  18220.    STA LOADbUFcOUNT
  18221.    LDA #0
  18222.    STA LOADbUFpTR
  18223.    CLC
  18224.    RTS
  18225. +  SEC
  18226.    RTS
  18227.  
  18228. LOADlINEwRAP = *
  18229.    LDX LOADlINElEN
  18230.    DEX
  18231.    LDY #$00
  18232.    LDA LINE,X
  18233.    CMP #CHRcr
  18234.    BEQ +
  18235.    LDY #$80
  18236. +  STY HEADfLAGS
  18237.    CMP #CHRcr
  18238.    BNE +
  18239. -  STX HEADlINElEN
  18240.    STX LOADlINEsCAN
  18241.    STX LOADlINElEN
  18242.    RTS
  18243.  
  18244. +  LDX LOADlINElEN
  18245.    CPX TARGETlEN
  18246.    BCC -
  18247.  
  18248. +  BIT WRAPfLAG
  18249.    BMI +
  18250. -  LDA TARGETlEN
  18251.    STA LOADlINEsCAN
  18252.    STA HEADlINElEN
  18253.    RTS
  18254.  
  18255. +  LDX TARGETlEN
  18256. -  DEX
  18257.    CPX #255
  18258.    BEQ --
  18259.    LDA LINE,X
  18260.    CMP #" "
  18261.    BNE -
  18262. +  INX
  18263.    STX LOADlINEsCAN
  18264.    STX HEADlINElEN
  18265.    RTS
  18266.  
  18267. LOADlINEsTORE = *
  18268.    INC LOADlINES+0
  18269.    BNE +
  18270.    INC LOADlINES+1
  18271.    BNE +
  18272.    INC LOADlINES+2
  18273.    BNE +
  18274.    INC LOADlINES+3
  18275. +  SEC
  18276.    BIT HEADfLAGS
  18277.    BMI +
  18278.    CLC
  18279. +  LDA LOADbYTES+0
  18280.    ADC HEADlINElEN
  18281.    STA LOADbYTES+0
  18282.    BCC +
  18283.    INC LOADbYTES+1
  18284.    BNE +
  18285.    INC LOADbYTES+2
  18286.    BNE +
  18287.    INC LOADbYTES+3
  18288. +  LDX #3
  18289. -  LDA #ACEmEMnULL
  18290.    STA HEADnEXTpTR,X
  18291.    LDA LOADtAIL,X
  18292.    STA HEADpREVpTR,X
  18293.    DEX
  18294.    BPL -
  18295.    JSR STASHlINE
  18296.  
  18297.    ;** FIRST LINE TO BE STORED
  18298.    LDA LOADhEAD+3
  18299.    CMP #ACEmEMnULL
  18300.    BNE +
  18301.    LDX #3
  18302. -  LDA ZP,X
  18303.    STA LOADhEAD,X
  18304.    STA LOADtAIL,X
  18305.    DEX
  18306.    BPL -
  18307.    RTS
  18308.  
  18309.    ;** ADDITIONAL LINES
  18310. +  LDX #3
  18311. -  LDA ZP,X
  18312.    LDY LOADtAIL,X
  18313.    STA LOADtAIL,X
  18314.    STY ZP,X
  18315.    DEX
  18316.    BPL -
  18317.    JSR FETCHhEAD
  18318.    LDX #3
  18319. -  LDA LOADtAIL,X
  18320.    STA HEADnEXTpTR,X
  18321.    DEX
  18322.    BPL -
  18323.    JSR STASHhEAD
  18324.    RTS
  18325.  
  18326. LOADlINEoVERFLOW = *
  18327.    LDX LOADlINEsCAN
  18328.    LDY #0
  18329. -  CPX LOADlINElEN
  18330.    BCS +
  18331.    LDA LINE,X
  18332.    STA LINE,Y
  18333.    INX
  18334.    INY
  18335.    BNE -
  18336. +  STY LOADlINElEN
  18337.    RTS
  18338.  
  18339. ;=== MANAGEMENT ROUTINES ===
  18340.  
  18341. WORK3sAVE .BUF 14
  18342.  
  18343. SAVEwORK3 = *
  18344.    LDX #13
  18345. -  LDA WORK3,X
  18346.    STA WORK3sAVE,X
  18347.    DEX
  18348.    BPL -
  18349.    RTS
  18350.  
  18351. RESTOREwORK3 = *
  18352.    LDX #13
  18353. -  LDA WORK3sAVE,X
  18354.    STA WORK3,X
  18355.    DEX
  18356.    BPL -
  18357.    RTS
  18358.  
  18359. FETCHlINEeXTRA = 6
  18360.  
  18361. FETCHlINE = *  ;( [ZP]=FARlINE ) : HEAD*, LINEBUF
  18362.    LDA #<LINEBUF
  18363.    LDY #>LINEBUF
  18364.    STA ZW+0
  18365.    STY ZW+1
  18366.    LDA #HEADlENGTH+FETCHlINEeXTRA
  18367.    LDY #0
  18368.    JSR FETCH
  18369.    LDX #HEADlENGTH-1
  18370. -  LDA LINEBUF,X
  18371.    STA HEADbUFFER,X
  18372.    DEX
  18373.    BPL -
  18374.    LDA HEADlINElEN
  18375.    CMP #FETCHlINEeXTRA+1
  18376.    BCC +
  18377.    CLC
  18378.    ADC #HEADlENGTH
  18379.    LDY #0
  18380.    JSR FETCH
  18381. +  RTS
  18382.  
  18383. STASHlINE = *  ;( HEAD*, LINEBUF ) : [ZP]=STOREDlINE, .cs=ERR
  18384.    LDA #0
  18385.    STA HEADiNDENT
  18386.    LDX #HEADlENGTH-1
  18387. -  LDA HEADbUFFER,X
  18388.    STA LINEBUF,X
  18389.    DEX
  18390.    BPL -
  18391.    CLC
  18392.    LDA HEADlINElEN
  18393.    ADC #HEADlENGTH
  18394.    LDY #0
  18395.    JSR MALLOC
  18396.    BCC +
  18397.    RTS
  18398. +  LDA #<LINEBUF
  18399.    LDY #>LINEBUF
  18400.    STA ZW+0
  18401.    STY ZW+1
  18402.    CLC
  18403.    LDA HEADlINElEN
  18404.    ADC #HEADlENGTH
  18405.    LDY #0
  18406.    JSR STASH
  18407.    CLC
  18408.    RTS
  18409.  
  18410. FETCHhEAD = *  ;( [ZP]=FARlINEpTR ) : HEADbUFFER
  18411.    LDX #HEADbUFFER
  18412.    LDY #HEADlENGTH
  18413.    JSR ZPLOAD
  18414.    RTS
  18415.  
  18416. STASHhEAD = *  ;( [ZP]=FARlINEpTR, HEADbUFFER )
  18417.    LDX #HEADbUFFER
  18418.    LDY #HEADlENGTH
  18419.    JSR ZPSTORE
  18420.    RTS
  18421.  
  18422. ;=== DYNAMIC MEMORY ROUTINES ===
  18423.  
  18424. MALLOCwORK = WORK1
  18425.  
  18426. MALLOChEAD   .BUF 4
  18427. TPAfREEfIRST .BUF 1
  18428. TPAfREEmIN   .BUF 1
  18429. TPAfREEpAGES .BUF 1
  18430. TPAaREAsTART .BUF 1
  18431. TPAaREAeND   .BUF 1
  18432.  
  18433. ;*** MALLOCiNIT()
  18434.  
  18435. MALLOCiNIT = *
  18436.    LDA #ACEmEMnULL
  18437.    STA MALLOChEAD+3
  18438.    LDX #0
  18439.    LDA #$FF
  18440. -  STA TPAfREEMAP,X
  18441.    INX
  18442.    BNE -
  18443.    LDX #>BSSeND
  18444.    LDA #<BSSeND
  18445.    BEQ +
  18446.    INX
  18447. +  STX TPAfREEfIRST
  18448.    STX TPAaREAsTART
  18449.    LDX ACEsTACKpTR+1
  18450.    STX MALLOCwORK
  18451.    STX TPAaREAeND
  18452.    TXA
  18453.    SEC
  18454.    SBC TPAfREEfIRST
  18455.    BCS +
  18456.    LDA #0
  18457. +  STA TPAfREEpAGES
  18458.    CLC
  18459.    ADC #1
  18460.    STA TPAfREEmIN
  18461.    LDX TPAfREEfIRST
  18462.    CPX MALLOCwORK
  18463.    BCS +
  18464.    LDA #$00
  18465. -  STA TPAfREEMAP,X
  18466.    INX
  18467.    CPX MALLOCwORK
  18468.    BCC -
  18469. +  RTS
  18470.  
  18471. LIBpAGES .BUF 1
  18472.  
  18473. LIBpAGEaLLOC = *  ;( .a=PAGES ) : [ZP]
  18474.    STA LIBpAGES
  18475.    LDX #$00
  18476.    LDY #ACEmEMiNTERNAL-1
  18477.    JSR PAGEALLOC
  18478.    BCS +
  18479.    RTS
  18480. +  JSR TPApAGEaLLOC
  18481.    BCS +
  18482.    RTS
  18483. +  LDA LIBpAGES
  18484.    LDX #ACEmEMiNTERNAL
  18485.    LDY #$FF
  18486.    JSR PAGEALLOC
  18487.    BCS +
  18488.    RTS
  18489. +  LDA #<NOMEMmSG
  18490.    LDY #>NOMEMmSG
  18491.    JSR EPUTS
  18492.    LDA #1
  18493.    JMP EXIT
  18494.  
  18495.    NOMEMmSG = *
  18496.    .BYTE CHRcr
  18497.    .ASC "iNSUFFICIENT MEMORY, ABORTING."
  18498.    .BYTE CHRcr,0
  18499.  
  18500. NEWMAX   .BUF 1
  18501.  
  18502. TPApAGEaLLOC = *  ;( LIBpAGES ) : [ZP]
  18503.    LDA LIBpAGES
  18504.    CMP TPAfREEmIN
  18505.    BCS TPAfREEMAPfULL
  18506.    ;** FIRST FREE
  18507.    LDX TPAfREEfIRST
  18508.    LDA TPAfREEMAP,X
  18509.    BEQ ++
  18510. -  INX
  18511.    BEQ TPAfREEMAPfULL
  18512.    LDA TPAfREEMAP,X
  18513.    BNE -
  18514.    STX TPAfREEfIRST
  18515.    JMP ++
  18516.    TPAfREEMAPfULL = *
  18517.    LDA LIBpAGES
  18518.    CMP TPAfREEmIN
  18519.    BCS +
  18520.    STA TPAfREEmIN
  18521. +  SEC
  18522.    RTS
  18523.  
  18524.    ;** SEARCH
  18525. +  DEX
  18526. -  LDY LIBpAGES
  18527. -  INX
  18528.    BEQ TPAfREEMAPfULL
  18529.    LDA TPAfREEMAP,X
  18530.    BNE --
  18531.    DEY
  18532.    BNE -
  18533.  
  18534.    ;** ALLOCATE
  18535.    STX NEWMAX
  18536.    LDY LIBpAGES
  18537.    LDA #$41
  18538. -  STA TPAfREEMAP,X
  18539.    DEX
  18540.    DEY
  18541.    BNE -
  18542.    INX
  18543.    CPX TPAfREEfIRST
  18544.    BNE +
  18545.    LDY NEWMAX
  18546.    INY
  18547.    STY TPAfREEfIRST
  18548. +  SEC
  18549.    LDA TPAfREEpAGES
  18550.    SBC LIBpAGES
  18551.    STA TPAfREEpAGES
  18552.    LDA #0
  18553.    LDY #ACEmEMiNTERNAL
  18554.    STA ZP+0
  18555.    STX ZP+1
  18556.    STA ZP+2
  18557.    STY ZP+3
  18558.    CLC
  18559.    RTS
  18560.  
  18561. MALLOClENsAVE .BUF 3
  18562.  
  18563. MALLOC = *
  18564. QUICKmALLOC = *
  18565.    STA MALLOClENsAVE+0
  18566.    STY MALLOClENsAVE+1
  18567.    JSR LIBmALLOC
  18568.    BCS +
  18569.    RTS
  18570. +  LDX MALLOClENsAVE+1
  18571.    LDA MALLOClENsAVE+0
  18572.    BEQ +
  18573.    INX
  18574. +  TXA
  18575.    CPX #>1024
  18576.    BCS +
  18577.    LDX #>1024
  18578. +  TXA
  18579.    STA MALLOClENsAVE+2
  18580.    JSR LIBpAGEaLLOC
  18581.    BCC +
  18582.    RTS
  18583. +  LDA #0
  18584.    LDY MALLOClENsAVE+2
  18585.    JSR FREE
  18586.    LDA MALLOClENsAVE+0
  18587.    LDY MALLOClENsAVE+1
  18588.    JMP MALLOC
  18589.  
  18590. ;*** MALLOC( .ay=bYTES ) : [ZP]=fARpOINTER
  18591.  
  18592. MALLOCmEMnEXTpTR = MALLOCwORK+0 ;(4)
  18593. MALLOCmEMlENGTH  = MALLOCwORK+4 ;(2)
  18594. MALLOClENGTH     = MALLOCwORK+6 ;(2)
  18595. MALLOCq          = MALLOCwORK+8 ;(4)
  18596.  
  18597. LIBmALLOC = *
  18598.    CLC
  18599.    ADC #7
  18600.    BCC +
  18601.    INY
  18602. +  AND #$F8
  18603.    STA MALLOClENGTH
  18604.    STY MALLOClENGTH+1
  18605.    LDX #3
  18606. -  LDA MALLOChEAD,X
  18607.    STA ZP,X
  18608.    LDA #ACEmEMnULL
  18609.    STA MALLOCq,X
  18610.    DEX
  18611.    BPL -
  18612.  
  18613.    MALLOClOOK = *
  18614.    LDA ZP+3
  18615.    CMP #ACEmEMnULL
  18616.    BNE +
  18617.  
  18618.    MALLOCeRROReXIT = *
  18619.    LDA #ACEmEMnULL
  18620.    STA ZP+3
  18621.    LDA #ACEeRRiNSUFFICIENTmEMORY
  18622.    STA ERRNO
  18623.    SEC
  18624.    RTS
  18625.  
  18626. +  LDX #MALLOCmEMnEXTpTR
  18627.    LDY #6
  18628.    JSR ZPLOAD
  18629.    LDA MALLOCmEMlENGTH
  18630.    CMP MALLOClENGTH
  18631.    LDA MALLOCmEMlENGTH+1
  18632.    SBC MALLOClENGTH+1
  18633.    BCS MALLOCgOTbLOCK
  18634.    LDX #3
  18635. -  LDA ZP,X
  18636.    STA MALLOCq,X
  18637.    LDA MALLOCmEMnEXTpTR,X
  18638.    STA ZP,X
  18639.    DEX
  18640.    BPL -
  18641.    JMP MALLOClOOK
  18642.  
  18643.    MALLOCgOTbLOCK = *
  18644.    LDA MALLOCmEMlENGTH
  18645.    CMP MALLOClENGTH
  18646.    BNE +
  18647.    LDA MALLOCmEMlENGTH+1
  18648.    SBC MALLOClENGTH+1
  18649.    BEQ MALLOCtAKEwHOLEbLOCK
  18650. +  SEC
  18651.    LDA MALLOCmEMlENGTH
  18652.    SBC MALLOClENGTH
  18653.    STA MALLOCmEMlENGTH
  18654.    LDA MALLOCmEMlENGTH+1
  18655.    SBC MALLOClENGTH+1
  18656.    STA MALLOCmEMlENGTH+1
  18657.    LDX #MALLOCmEMnEXTpTR
  18658.    LDY #6
  18659.    JSR ZPSTORE
  18660.    CLC
  18661.    LDA ZP+0
  18662.    ADC MALLOCmEMlENGTH
  18663.    STA ZP+0
  18664.    LDA ZP+1
  18665.    ADC MALLOCmEMlENGTH+1
  18666.    STA ZP+1
  18667.    CLC
  18668.    RTS
  18669.  
  18670.    MALLOCtAKEwHOLEbLOCK = *
  18671.    LDA MALLOCq+3
  18672.    CMP #ACEmEMnULL
  18673.    BNE +
  18674.    LDX #3
  18675. -  LDA MALLOCmEMnEXTpTR,X
  18676.    STA MALLOChEAD,X
  18677.    DEX
  18678.    BPL -
  18679.    CLC
  18680.    RTS
  18681. +  LDX #3
  18682. -  LDA ZP,X
  18683.    LDY MALLOCq,X
  18684.    STA MALLOCq,X
  18685.    STY ZP,X
  18686.    DEX
  18687.    BPL -
  18688.    LDX #MALLOCmEMnEXTpTR
  18689.    LDY #4
  18690.    JSR ZPSTORE
  18691.    LDX #3
  18692. -  LDA MALLOCq,X
  18693.    STA ZP,X
  18694.    DEX
  18695.    BPL -
  18696.    CLC
  18697.    RTS
  18698.  
  18699. ;*** FREE( [ZP]=fARpOINTER, .ay=lENGTH )  {$7b}ALTERS [ZP]{$7d}
  18700.  
  18701. FREEmEMnEXTpTR = MALLOCwORK+0  ;(4)
  18702. FREEmEMlENGTH  = MALLOCwORK+4  ;(2)
  18703. FREElENGTH     = MALLOCwORK+6  ;(2)
  18704. FREEnEWpTR     = MALLOCwORK+8  ;(4)
  18705. FREEq          = MALLOCwORK+12 ;(4)
  18706.  
  18707. FREE = *
  18708.    CLC
  18709.    ADC #7
  18710.    BCC +
  18711.    INY
  18712. +  AND #$F8
  18713.    STA FREElENGTH+0
  18714.    STY FREElENGTH+1
  18715.    LDX #3
  18716. -  LDA ZP,X
  18717.    STA FREEnEWpTR,X
  18718.    LDA MALLOChEAD,X
  18719.    STA ZP,X
  18720.    LDA #ACEmEMnULL
  18721.    STA FREEq,X
  18722.    DEX
  18723.    BPL -
  18724.  
  18725.    FREEsEARCHlOOP = *
  18726.    LDA ZP+3
  18727.    CMP #ACEmEMnULL
  18728.    BEQ FREEcOALESCEqANDnEW
  18729.    LDA ZP+0
  18730.    CMP FREEnEWpTR+0
  18731.    LDA ZP+1
  18732.    SBC FREEnEWpTR+1
  18733.    LDA ZP+2
  18734.    SBC FREEnEWpTR+2
  18735.    LDA ZP+3
  18736.    SBC FREEnEWpTR+3
  18737.    BCS FREEcOALESCEqANDnEW
  18738. +  LDX #FREEmEMnEXTpTR
  18739.    LDY #4
  18740.    JSR ZPLOAD
  18741.    LDX #3
  18742. -  LDA ZP,X
  18743.    STA FREEq,X
  18744.    LDA FREEmEMnEXTpTR,X
  18745.    STA ZP,X
  18746.    DEX
  18747.    BPL -
  18748.    BMI FREEsEARCHlOOP
  18749.  
  18750.    FREEcOALESCEqANDnEW = *
  18751.    LDX #3
  18752. -  LDA FREEq,X
  18753.    STA ZP,X
  18754.    DEX
  18755.    BPL -
  18756.    LDA ZP+3
  18757.    CMP #ACEmEMnULL
  18758.    BNE +
  18759.    ;** PREV IS HEAD
  18760.    LDX #3
  18761. -  LDA MALLOChEAD,X
  18762.    STA FREEmEMnEXTpTR,X
  18763.    LDA FREEnEWpTR,X
  18764.    STA MALLOChEAD,X
  18765.    DEX
  18766.    BPL -
  18767.    LDA FREElENGTH+0
  18768.    LDY FREElENGTH+1
  18769.    STA FREEmEMlENGTH+0
  18770.    STY FREEmEMlENGTH+1
  18771.    JMP FREEcOALESCEnEWaNDp
  18772.  
  18773.    ;** PREV IS REAL
  18774. +  LDX #FREEmEMnEXTpTR
  18775.    LDY #6
  18776.    JSR ZPLOAD
  18777.    LDA ZP+3
  18778.    CMP FREEnEWpTR+3
  18779.    BNE +
  18780.    LDA ZP+2
  18781.    CMP FREEnEWpTR+2
  18782.    BNE +
  18783.    CLC
  18784.    LDA ZP
  18785.    ADC FREEmEMlENGTH
  18786.    TAX
  18787.    LDA ZP+1
  18788.    ADC FREEmEMlENGTH+1
  18789.    CMP FREEnEWpTR+1
  18790.    BNE +
  18791.    CPX FREEnEWpTR
  18792.    BNE +
  18793.    ;** PREV DOES COALESCE
  18794.    CLC
  18795.    LDA FREEmEMlENGTH
  18796.    ADC FREElENGTH
  18797.    STA FREEmEMlENGTH
  18798.    LDA FREEmEMlENGTH+1
  18799.    ADC FREElENGTH+1
  18800.    STA FREEmEMlENGTH+1
  18801.    LDX #3
  18802. -  LDA FREEq,X
  18803.    STA FREEnEWpTR,X
  18804.    DEX
  18805.    BPL -
  18806.    BMI FREEcOALESCEnEWaNDp
  18807.  
  18808.    ;** PREV DOES NOT COALESCE
  18809. +  LDX #FREEnEWpTR
  18810.    LDY #4
  18811.    JSR ZPSTORE
  18812.    LDA FREElENGTH+0
  18813.    LDY FREElENGTH+1
  18814.    STA FREEmEMlENGTH+0
  18815.    STY FREEmEMlENGTH+1
  18816.  
  18817.    FREEcOALESCEnEWaNDp = *
  18818.    LDA FREEnEWpTR+3
  18819.    CMP FREEmEMnEXTpTR+3
  18820.    BNE +
  18821.    LDA FREEnEWpTR+2
  18822.    CMP FREEmEMnEXTpTR+2
  18823.    BNE +
  18824.    CLC
  18825.    LDA FREEnEWpTR
  18826.    ADC FREEmEMlENGTH
  18827.    TAX
  18828.    LDA FREEnEWpTR+1
  18829.    ADC FREEmEMlENGTH+1
  18830.    CMP FREEmEMnEXTpTR+1
  18831.    BNE +
  18832.    CPX FREEmEMnEXTpTR
  18833.    BNE +
  18834.  
  18835.    ;** NEW AND NEXT COALESCE
  18836.    LDX #3
  18837. -  LDA FREEmEMnEXTpTR,X
  18838.    STA ZP,X
  18839.    DEX
  18840.    BPL -
  18841.    LDA FREEmEMlENGTH+1
  18842.    PHA
  18843.    LDA FREEmEMlENGTH+0
  18844.    PHA
  18845.    LDX #FREEmEMnEXTpTR
  18846.    LDY #6
  18847.    JSR ZPLOAD
  18848.    CLC
  18849.    PLA
  18850.    ADC FREEmEMlENGTH+0
  18851.    STA FREEmEMlENGTH+0
  18852.    PLA
  18853.    ADC FREEmEMlENGTH+1
  18854.    STA FREEmEMlENGTH+1
  18855.  
  18856. +  LDX #3
  18857. -  LDA FREEnEWpTR,X
  18858.    STA ZP,X
  18859.    DEX
  18860.    BPL -
  18861.    LDX #FREEmEMnEXTpTR
  18862.    LDY #6
  18863.    JSR ZPSTORE
  18864.    CLC
  18865.    RTS
  18866.  
  18867. ;=== STANDARD LIBRARY ===
  18868.  
  18869. PUTS = *
  18870.    LDX #STDOUT
  18871. FPUTS = *
  18872.    STA ZP+0
  18873.    STY ZP+1
  18874.    LDY #$FF
  18875. -  INY
  18876.    LDA (ZP),Y
  18877.    BNE -
  18878.    TYA
  18879.    LDY #0
  18880.    JMP WRITE
  18881. EPUTS = *
  18882.    LDX #STDERR
  18883.    JMP FPUTS
  18884.  
  18885. PUTCHAR = *
  18886.    STX XSAVE
  18887.    STY YSAVE
  18888.    LDX #STDOUT
  18889.    JSR PUTC
  18890.    LDX XSAVE
  18891.    LDY YSAVE
  18892.    RTS
  18893.    XSAVE .BUF 1
  18894.    YSAVE .BUF 1
  18895.  
  18896. PUTC = *
  18897.    STA PUTCbUFFER
  18898.    LDA #<PUTCbUFFER
  18899.    LDY #>PUTCbUFFER
  18900.    STA ZP+0
  18901.    STY ZP+1
  18902.    LDA #1
  18903.    LDY #0
  18904.    JMP WRITE
  18905.    PUTCbUFFER .BUF 1
  18906.  
  18907. GETCHAR = *
  18908.    LDX #STDIN
  18909. GETC = *
  18910.    LDA #<GETCbUFFER
  18911.    LDY #>GETCbUFFER
  18912.    STA ZP+0
  18913.    STY ZP+1
  18914.    LDA #1
  18915.    LDY #0
  18916.    JSR READ
  18917.    BEQ +
  18918.    LDA GETCbUFFER
  18919.    RTS
  18920. +  SEC
  18921.    RTS
  18922.    GETCbUFFER .BUF 1
  18923.  
  18924. GETARG = *
  18925.    STY ZP+1
  18926.    ASL
  18927.    STA ZP+0
  18928.    ROL ZP+1
  18929.    CLC
  18930.    LDA ACEaRGV
  18931.    ADC ZP+0
  18932.    STA ZP+0
  18933.    LDA ACEaRGV+1
  18934.    ADC ZP+1
  18935.    STA ZP+1
  18936.    LDY #0
  18937.    LDA (ZP),Y
  18938.    TAX
  18939.    INY
  18940.    LDA (ZP),Y
  18941.    STX ZP+0
  18942.    STA ZP+1
  18943.    RTS
  18944.  
  18945. ;===new functions===
  18946.  
  18947. STOPcOUNTDOWN .BYTE 0
  18948.  
  18949. DUMPdOC = *
  18950.    LDY CHARcOLOR
  18951.    LDX #$40
  18952.    JSR WINCLS
  18953.  
  18954.    LDX #3
  18955. -  LDA LOADhEAD,X
  18956.    STA ZP,X
  18957.    DEX
  18958.    BPL -
  18959.  
  18960. -  LDA ZP+3
  18961.    CMP #ACEmEMnULL
  18962.    BNE +
  18963.    RTS
  18964. +  JSR FETCHlINE
  18965.    LDA #<LINE
  18966.    LDY #>LINE
  18967.    STA ZP+0
  18968.    STY ZP+1
  18969.    LDA HEADlINElEN
  18970.    LDY #0
  18971.    LDX #STDOUT
  18972.    JSR WRITE
  18973.    LDA HEADfLAGS
  18974.    BPL +
  18975.    ;LDA #"="
  18976.    ;JSR PUTCHAR
  18977. +  LDA #CHRcr
  18978.    JSR PUTCHAR
  18979.    LDX #3
  18980. -  LDA HEADnEXTpTR,X
  18981.    STA ZP,X
  18982.    DEX
  18983.    BPL -
  18984.    INC STOPcOUNTDOWN
  18985.    LDA STOPcOUNTDOWN
  18986.    AND #7
  18987.    BNE +
  18988.    JSR STOPKEY
  18989.    BCC +
  18990.    LDA #1
  18991.    LDX #0
  18992.    JMP EXIT
  18993. +  JMP --
  18994.  
  18995. ;===BSS===
  18996.  
  18997. BSS             = *
  18998. LINEBUF         = BSS+0  ;(256)
  18999. LINE            = LINEBUF+HEADlENGTH ;(241)
  19000.  
  19001. FILEBUF         = LINEBUF+256  ;(256)
  19002. TPAfREEMAP      = FILEBUF+256  ;(256)
  19003. BSSeND          = TPAfREEMAP+256
  19004. WC.S
  19005. 392
  19006. ;*** WORD COUNTER PROGRAM
  19007.  
  19008. .SEQ ACEHEAD.S
  19009. .ORG ACEaPPaDDRESS
  19010. .OBJ "@0:WC"
  19011.  
  19012. JMP WCmAIN
  19013. .ASC "Cb"
  19014.  
  19015. ;*** GLOBAL DECLARATIONS
  19016.  
  19017. LIBWORK = $60
  19018.  
  19019. CHRcr = $0D
  19020. CHRqUOTE = $22
  19021.  
  19022. ;******** STANDARD LIBRARY ********
  19023. PUTS = *
  19024.    LDX #STDOUT
  19025. FPUTS = *
  19026.    STA ZP
  19027.    STY ZP+1
  19028.    LDY #$FF
  19029. -  INY
  19030.    LDA (ZP),Y
  19031.    BNE -
  19032.    TYA
  19033.    LDY #0
  19034.    JMP WRITE
  19035. EPUTS = *
  19036.    LDX #STDERR
  19037.    JMP FPUTS
  19038.  
  19039. PUTCHAR = *
  19040.    STX XSAVE
  19041.    STY YSAVE
  19042.    LDX #STDOUT
  19043.    JSR PUTC
  19044.    LDX XSAVE
  19045.    LDY YSAVE
  19046.    RTS
  19047.    XSAVE .BUF 1
  19048.    YSAVE .BUF 1
  19049.  
  19050. PUTC = *
  19051.    STA PUTCbUFFER
  19052.    LDA #<PUTCbUFFER
  19053.    LDY #>PUTCbUFFER
  19054.    STA ZP
  19055.    STY ZP+1
  19056.    LDA #1
  19057.    LDY #0
  19058.    JMP WRITE
  19059.    PUTCbUFFER .BUF 1
  19060.  
  19061. GETCHAR = *
  19062.    LDX #STDIN
  19063. GETC = *
  19064.    LDA #<GETCbUFFER
  19065.    LDY #>GETCbUFFER
  19066.    STA ZP
  19067.    STY ZP+1
  19068.    LDA #1
  19069.    LDY #0
  19070.    JSR READ
  19071.    BEQ +
  19072.    LDA GETCbUFFER
  19073.    RTS
  19074. +  SEC
  19075.    RTS
  19076.    GETCbUFFER .BUF 1
  19077.  
  19078. GETARG = *
  19079.    STY ZP+1
  19080.    ASL
  19081.    STA ZP
  19082.    ROL ZP+1
  19083.    CLC
  19084.    LDA ACEaRGV
  19085.    ADC ZP
  19086.    STA ZP
  19087.    LDA ACEaRGV+1
  19088.    ADC ZP+1
  19089.    STA ZP+1
  19090.    LDY #0
  19091.    LDA (ZP),Y
  19092.    TAX
  19093.    INY
  19094.    LDA (ZP),Y
  19095.    STX ZP
  19096.    STA ZP+1
  19097.    RTS
  19098.  
  19099. ;===WORD COUNT===
  19100. WCaRG = 2
  19101. WCnAME = 4
  19102. INbUFlEN = 6
  19103. FILES = $50
  19104.  
  19105. WCmAIN = *
  19106.    ;** CHECK ARGUMENT COUNT
  19107.    LDA ACEaRGC+1
  19108.    BNE WCeNOUGHaRGS
  19109.    LDA ACEaRGC
  19110.    CMP #2
  19111.    BCS WCeNOUGHaRGS
  19112.  
  19113. WCuSAGE = *
  19114.    LDA #<WCuSAGEmSG
  19115.    LDY #>WCuSAGEmSG
  19116.    JMP EPUTS
  19117.  
  19118. WCuSAGEmSG = *
  19119.    .ASC "uSAGE: WC FILE1 FILE2 ... FILEn"
  19120.    .BYTE CHRcr,0
  19121.  
  19122. WCeNOUGHaRGS = *
  19123.    ;** GET INPUT BUFFER LENGTH
  19124.    SEC
  19125.    LDA ACEsTACKpTR
  19126.    SBC #<WCiNbUF
  19127.    STA INbUFlEN
  19128.    LDA ACEsTACKpTR+1
  19129.    SBC #>WCiNbUF
  19130.    STA INbUFlEN+1
  19131.    ;** MAIN LOOP
  19132.    LDA #1
  19133.    LDY #0
  19134.    STA WCaRG
  19135.    STY WCaRG+1
  19136.    STY FILES
  19137.    JSR TOTiNIT
  19138. -  JSR STOPKEY
  19139.    BCS WCsTOPPED
  19140.    LDA WCaRG
  19141.    LDY WCaRG+1
  19142.    JSR GETARG
  19143.    LDA ZP
  19144.    LDY ZP+1
  19145.    STA WCnAME
  19146.    STY WCnAME+1
  19147.    ORA ZP+1
  19148.    BEQ WCeXIT
  19149.    JSR WCfILE
  19150.    BCS +
  19151.    LDA FILES
  19152.    BMI +
  19153.    INC FILES
  19154. +  BCC +
  19155.    JSR WCeRROR
  19156. +  INC WCaRG
  19157.    BNE +
  19158.    INC WCaRG+1
  19159. +  JMP -
  19160.  
  19161. WCeXIT = *
  19162.    LDA FILES
  19163.    CMP #2
  19164.    BCC +
  19165.    JSR REPORTtOTAL
  19166. +  RTS
  19167.  
  19168. WCsTOPPED = *
  19169.    LDA #<STOPPEDmSG
  19170.    LDY #>STOPPEDmSG
  19171.    JSR EPUTS
  19172.    RTS
  19173.    STOPPEDmSG = *
  19174.    .ASC "<sTOPPED>"
  19175.    .BYTE CHRcr,0
  19176.  
  19177. WCeRROR = *
  19178.    LDA #<WCeRRORmSG1
  19179.    LDY #>WCeRRORmSG1
  19180.    JSR EPUTS
  19181.    LDA WCnAME
  19182.    LDY WCnAME+1
  19183.    JSR EPUTS
  19184.    LDA #<WCeRRORmSG2
  19185.    LDY #>WCeRRORmSG2
  19186.    JMP EPUTS
  19187.  
  19188. WCeRRORmSG1 = *
  19189.    .ASC "eRROR READING FILE "
  19190.    .BYTE CHRqUOTE,0
  19191.  
  19192. WCeRRORmSG2 = *
  19193.    .BYTE CHRqUOTE,CHRcr,0
  19194.  
  19195. BUFcOUNT = 10
  19196. INFILE = 12
  19197.  
  19198. WCfILE = *
  19199.    ;** OPEN FILE
  19200.    LDA WCnAME
  19201.    LDY WCnAME+1
  19202.    STA ZP
  19203.    STY ZP+1
  19204.    LDA #"R"
  19205.    JSR OPEN
  19206.    BCC +
  19207.    RTS
  19208. +  STA INFILE
  19209.    ;** COUNT FILE
  19210.    JSR WCiNIT
  19211.    JSR WCbODY
  19212.    ;** CLOSE FILE
  19213.    LDA INFILE
  19214.    JSR CLOSE
  19215.    JSR WCrEPORT
  19216.    JSR ADDtOtOTAL
  19217.    RTS
  19218.  
  19219. WCbODY = *
  19220. -  LDA #<WCiNbUF
  19221.    LDY #>WCiNbUF+1
  19222.    STA ZP
  19223.    STY ZP+1
  19224.    LDA #254
  19225.    LDY #0
  19226.    LDX INFILE
  19227.    JSR READ
  19228.    STA BUFcOUNT
  19229.    STY BUFcOUNT+1
  19230.    BEQ +
  19231.    JSR WCsCANbUFFER
  19232.    JMP -
  19233. +  RTS
  19234.  
  19235. WCiNwORD = $4C ;(1)
  19236. WClINES = $40  ;(3)
  19237. WCwORDS = $44  ;(3)
  19238. WCbYTES = $48  ;(3)
  19239. TOTlINES = $20  ;(3)
  19240. TOTwORDS = $24  ;(3)
  19241. TOTbYTES = $28  ;(3)
  19242.  
  19243. WCiNIT = *
  19244.    LDA #0
  19245.    LDX #11
  19246. -  STA WClINES,X
  19247.    DEX
  19248.    BPL -
  19249.    STA WCiNwORD
  19250.    RTS
  19251.  
  19252. TOTiNIT = *
  19253.    LDA #0
  19254.    LDX #11
  19255. -  STA TOTlINES,X
  19256.    DEX
  19257.    BPL -
  19258.    RTS
  19259.  
  19260. WCsCANbUFFER = *
  19261.    LDY #0
  19262.    CPY BUFcOUNT
  19263.    BNE +
  19264.    RTS
  19265. +  LDX WCiNwORD
  19266. -  LDA WCiNbUF,Y
  19267.    CMP #CHRcr
  19268.    BNE +
  19269.    INC WClINES
  19270.    BNE +
  19271.    INC WClINES+1
  19272.    BNE +
  19273.    INC WClINES+2
  19274.    BNE +
  19275.    INC WClINES+3
  19276. +  CMP #33
  19277.    BCS ISlETTER
  19278.    CMP #" "
  19279.    BEQ ISdELIMITER
  19280.    CMP #CHRcr
  19281.    BEQ ISdELIMITER
  19282.    CMP #9
  19283.    BEQ ISdELIMITER
  19284.  
  19285.    ISlETTER = *
  19286.    CPX #1
  19287.    BEQ SCANcONT
  19288.    LDX #1
  19289.    INC WCwORDS
  19290.    BNE SCANcONT
  19291.    INC WCwORDS+1
  19292.    BNE SCANcONT
  19293.    INC WCwORDS+2
  19294.    BNE SCANcONT
  19295.    INC WCwORDS+3
  19296.    JMP SCANcONT
  19297.  
  19298.    ISdELIMITER = *
  19299.    LDX #0
  19300.  
  19301.    SCANcONT = *
  19302.    INY
  19303.    CPY BUFcOUNT
  19304.    BCC -
  19305.    CLC
  19306.    LDA WCbYTES
  19307.    ADC BUFcOUNT
  19308.    STA WCbYTES
  19309.    BCC +
  19310.    INC WCbYTES+1
  19311.    BNE +
  19312.    INC WCbYTES+2
  19313.    BNE +
  19314.    INC WCbYTES+3
  19315. +  STX WCiNwORD
  19316.    RTS
  19317.  
  19318. WCrEPORT = *
  19319.    LDX #WClINES
  19320.    LDA #6
  19321.    JSR PUTNUM
  19322.    LDX #WCwORDS
  19323.    LDA #6
  19324.    JSR PUTNUM
  19325.    LDX #WCbYTES
  19326.    LDA #7
  19327.    JSR PUTNUM
  19328.    LDA WCnAME
  19329.    LDY WCnAME+1
  19330.    JSR PUTS
  19331.    LDA #CHRcr
  19332.    JSR PUTCHAR
  19333.    RTS
  19334.  
  19335. PUTNUM = *
  19336.    LDY #<NUMBUF
  19337.    STY $80
  19338.    LDY #>NUMBUF
  19339.    STY $81
  19340.    JSR UTOA
  19341.    LDA #<NUMBUF
  19342.    LDY #>NUMBUF
  19343.    JSR PUTS
  19344.    LDA #" "
  19345.    JSR PUTCHAR
  19346.    RTS
  19347.  
  19348. ADDtOtOTAL = *
  19349.    CLC
  19350.    LDX #0
  19351. -  LDA TOTlINES,X
  19352.    ADC WClINES,X
  19353.    STA TOTlINES,X
  19354.    INX
  19355.    TXA
  19356.    AND #$03
  19357.    BNE -
  19358.    CLC
  19359.    LDX #0
  19360. -  LDA TOTwORDS,X
  19361.    ADC WCwORDS,X
  19362.    STA TOTwORDS,X
  19363.    INX
  19364.    TXA
  19365.    AND #$03
  19366.    BNE -
  19367.    CLC
  19368.    LDX #0
  19369. -  LDA TOTbYTES,X
  19370.    ADC WCbYTES,X
  19371.    STA TOTbYTES,X
  19372.    INX
  19373.    TXA
  19374.    AND #$03
  19375.    BNE -
  19376.    RTS
  19377.  
  19378. REPORTtOTAL = *
  19379.    LDA #<TOTALmSG
  19380.    LDY #>TOTALmSG
  19381.    STA WCnAME
  19382.    STY WCnAME+1
  19383.    LDX #11
  19384. -  LDA TOTlINES,X
  19385.    STA WClINES,X
  19386.    DEX
  19387.    BPL -
  19388.    JSR WCrEPORT
  19389.    RTS
  19390.    TOTALmSG = *
  19391.    .ASC "<TOTAL>"
  19392.    .BYTE 0
  19393.  
  19394. ;===THE END===
  19395. WCbSS = *
  19396. NUMBUF = WCbSS
  19397. WCiNbUF = NUMBUF+12
  19398. WRAP.S
  19399. 361
  19400. ;*** WRAP PROGRAM
  19401.  
  19402. .SEQ ACEHEAD.S
  19403. .ORG ACEaPPaDDRESS
  19404. .OBJ "@0:WRAP"
  19405.  
  19406. JMP MAIN
  19407. .ASC "Cb"
  19408.  
  19409. ;*** GLOBAL DECLARATIONS
  19410.  
  19411. WORK1 = $02 ;(16)
  19412. WORK2 = $12 ;(16)
  19413. WORK3 = $22 ;(14)
  19414.  
  19415. CHRcr = $0D
  19416. CHRtAB = $09
  19417. CHRqUOTE = $22
  19418.  
  19419. ;SCREEN
  19420.  
  19421. SCRtOPaDDR      = $30 ;(2)
  19422. SCRlINEaDDR     = $32 ;(2)
  19423. CURrOW          = $34 ;(1)
  19424. CURcOL          = $35 ;(1)
  19425. SCRrOWS         = $36 ;(1)
  19426. SCRcOLS         = $37 ;(1)
  19427. SCRrOWiNC       = $38 ;(2)
  19428. CURlEFTmARGIN   = $3A ;(1)
  19429.  
  19430. ;DOCUMENT
  19431.  
  19432. LINEpTR         = $40 ;(4)
  19433. LINEnUM         = $44 ;(4)
  19434. TOSlINEpTR      = $48 ;(4)
  19435. TOPlINEpTR      = $4C ;(4)
  19436. BOTlINEpTR      = $50 ;(4)
  19437. LINEcOUNT       = $54 ;(4)
  19438. FILElENGTH      = $58 ;(4)
  19439. TARGETlEN       = $5C ;(1)
  19440. WRAPfLAG        = $5D ;(1) ;128=WRAP,64=SHOWcr
  19441.  
  19442. ;MANAGEMENT
  19443.  
  19444. MODIFIED        = $3B ;(1) ;$00=NO, $FF=MODIFIED
  19445. MODEfLAGS       = $3C ;(1) ;$80=INSERT, $40=INDENT
  19446. STATUSuPDATE    = $3D ;(1) ;128=LINE,64=COL,32=MOD,16=INS,8=BYT,4=FRE,2=NM,1=MSG
  19447. MARKEDlINEpTR   .BUF 4 ;(4)
  19448. MARKEDlINEnUM   .BUF 4 ;(4)
  19449. MARKEDcOL       .BUF 4 ;(1)
  19450.  
  19451. ;LINE FORMAT
  19452.  
  19453. HEADnEXTpTR     = $70 ;(4)
  19454. HEADpREVpTR     = $74 ;(4)
  19455. HEADlINElEN     = $78 ;(1)
  19456. HEADiNDENT      = $79 ;(1)
  19457. HEADfLAGS       = $7A ;(1) ;$80=CONNECTED, $40=NULLlINE
  19458. HEADlENGTH      = $0B
  19459.  
  19460. ;KILL BUFFER
  19461.  
  19462. BUFFERtOPpTR    .BUF 4 ;(4)
  19463. BUFFERbOTpTR    .BUF 4 ;(4)
  19464. BUFFERlINEcOUNT .BUF 4 ;(4)
  19465.  
  19466. ;DOCUMENT BUFFERS
  19467.  
  19468. ;=== MAIN ===
  19469.  
  19470. MAIN = *
  19471.    JSR MAINiNIT
  19472.    LDA #1
  19473.    LDY #0
  19474.    JSR GETARG
  19475.    JSR LOADfILE
  19476.    RTS
  19477.  
  19478. MAINiNIT = *
  19479.    LDA #$80
  19480.    STA WRAPfLAG
  19481.    LDA #75
  19482.    STA TARGETlEN
  19483.    RTS
  19484.  
  19485. ;*** LOAD FILE: USES WORK2 ***
  19486.  
  19487. LOADhEAD  = WORK2+0
  19488. LOADtAIL  = WORK2+4
  19489. LOADlINES = WORK2+8
  19490. LOADbYTES = WORK2+12
  19491. LOADfCB      = WORK3+0
  19492. LOADlINEsCAN = WORK3+1
  19493. LOADlINElEN  = WORK3+2
  19494. LOADbUFcOUNT = WORK3+3
  19495. LOADbUFpTR   = WORK3+4
  19496.  
  19497. LOADfILE = *  ;( (ZP)=NAME ) : [W2]=HEAD, [W2]=TAIL, [W2]=LINES, [W2]=BYTES
  19498.    JSR SAVEwORK3
  19499.    JSR LOADiNIT
  19500.    LDA #"R"
  19501.    JSR OPEN
  19502.    STA LOADfCB
  19503. -  JSR LOADlINE
  19504.    BCS +
  19505.    JSR LOADlINEwRAP
  19506.    JSR LOADlINEsTORE
  19507.    JSR LOADlINEoVERFLOW
  19508.    JMP -
  19509. +  LDA LOADlINElEN
  19510.    BEQ +
  19511.    JSR LOADlINEwRAP
  19512.    LDA #$00
  19513.    STA LINEfLAGS
  19514.    JSR LOADlINEsTORE
  19515. +  LDA LOADfCB
  19516.    JSR CLOSE
  19517.    JSR RESTOREwORK3
  19518.    RTS
  19519.  
  19520. LOADiNIT = *
  19521.    LDA #0
  19522.    LDX #16+14-1
  19523. -  STA LOADhEAD,X
  19524.    DEX
  19525.    BPL -
  19526.    RTS
  19527.  
  19528. LOADlINE = *  ;( ) : .cs=END
  19529.    ;TAB EXPANSION WILL GO INTO THIS ROUTINE
  19530.    LDX LOADbUFpTR
  19531.    LDY LOADlINElEN
  19532.  
  19533.    LOADnEXTbYTE = *
  19534.    LDA LOADbUFcOUNT
  19535.    BNE ++
  19536.    STY LOADlINElEN
  19537.    JSR LOADbUF
  19538.    BCC +
  19539.    RTS
  19540. +  LDY LOADlINElEN
  19541.    LDX LOADbUFpTR
  19542. +  NOP
  19543.  
  19544. -  LDA FILEBUF,X
  19545.    STA LINE,Y
  19546.    INX
  19547.    INY
  19548.    CMP #CHRcr
  19549.    BEQ ++
  19550.    CPY TARGETlEN
  19551.    BEQ +  ;DETERMINES IF crS WILL GO BEYOND LEN
  19552.    BCS ++
  19553. +  DEC LOADbUFcOUNT
  19554.    BNE -
  19555.    BEQ LOADnEXTbYTE
  19556.  
  19557. +  DEC LOADbUFcOUNT
  19558.    STX LOADbUFpTR
  19559.    STY LOADlINElEN
  19560.    CLC
  19561.    RTS
  19562.  
  19563. LOADbUF = *  ;( ) : .cs=EOF
  19564.    JSR STOPKEY
  19565.    BCS +
  19566.    LDA #<FILEBUF
  19567.    LDY #>FILEBUF
  19568.    STA ZP+0
  19569.    STY ZP+1
  19570.    LDA #<254
  19571.    LDY #>254
  19572.    LDX LOADfCB
  19573.    JSR READ
  19574.    BCS +
  19575.    BEQ +
  19576.    STA LOADbUFcOUNT
  19577.    LDA #0
  19578.    STA LOADbUFpTR
  19579.    CLC
  19580.    RTS
  19581. +  SEC
  19582.    RTS
  19583.  
  19584. LOADlINEwRAP = *
  19585.    LDX LOADlINElEN
  19586.    DEX
  19587.    LDY #$00
  19588.    LDA LINE,X
  19589.    CMP #CHRcr
  19590.    BEQ +
  19591.    LDY #$80
  19592. +  STY LINEfLAGS
  19593.    CMP #CHRcr
  19594.    BNE +
  19595. -  STX LINElINElEN
  19596.    STX LOADlINEsCAN
  19597.    STX LOADlINElEN
  19598.    RTS
  19599.  
  19600. +  LDX LOADlINElEN
  19601.    CPX TARGETlEN
  19602.    BCC -
  19603.  
  19604. +  BIT WRAPfLAG
  19605.    BMI +
  19606. -  LDA TARGETlEN
  19607.    STA LOADlINEsCAN
  19608.    STA LINElINElEN
  19609.    RTS
  19610.  
  19611. +  LDX TARGETlEN
  19612. -  DEX
  19613.    CPX #255
  19614.    BEQ --
  19615.    LDA LINE,X
  19616.    CMP #" "
  19617.    BNE -
  19618. +  INX
  19619.    STX LOADlINEsCAN
  19620.    STX LINElINElEN
  19621.    RTS
  19622.  
  19623. LOADlINEsTORE = *
  19624.    LDA #<LINE
  19625.    LDY #>LINE
  19626.    STA ZP+0
  19627.    STY ZP+1
  19628.    LDA LINElINElEN
  19629.    LDY #0
  19630.    LDX #STDOUT
  19631.    JSR WRITE
  19632.    LDA #CHRcr
  19633.    JSR PUTCHAR
  19634.    RTS
  19635.  
  19636. LOADlINEoVERFLOW = *
  19637.    LDX LOADlINEsCAN
  19638.    LDY #0
  19639. -  CPX LOADlINElEN
  19640.    BCS +
  19641.    LDA LINE,X
  19642.    STA LINE,Y
  19643.    INX
  19644.    INY
  19645.    BNE -
  19646. +  STY LOADlINElEN
  19647.    RTS
  19648.  
  19649. ;=== MANAGEMENT ROUTINES ===
  19650.  
  19651. WORK3sAVE .BUF 14
  19652.  
  19653. SAVEwORK3 = *
  19654.    LDX #13
  19655. -  LDA WORK3,X
  19656.    STA WORK3sAVE,X
  19657.    DEX
  19658.    BPL -
  19659.    RTS
  19660.  
  19661. RESTOREwORK3 = *
  19662.    LDX #13
  19663. -  LDA WORK3sAVE,X
  19664.    STA WORK3,X
  19665.    DEX
  19666.    BPL -
  19667.    RTS
  19668.  
  19669. ;=== STANDARD LIBRARY ===
  19670.  
  19671. PUTS = *
  19672.    LDX #STDOUT
  19673. FPUTS = *
  19674.    STA ZP+0
  19675.    STY ZP+1
  19676.    LDY #$FF
  19677. -  INY
  19678.    LDA (ZP),Y
  19679.    BNE -
  19680.    TYA
  19681.    LDY #0
  19682.    JMP WRITE
  19683. EPUTS = *
  19684.    LDX #STDERR
  19685.    JMP FPUTS
  19686.  
  19687. PUTCHAR = *
  19688.    STX XSAVE
  19689.    STY YSAVE
  19690.    LDX #STDOUT
  19691.    JSR PUTC
  19692.    LDX XSAVE
  19693.    LDY YSAVE
  19694.    RTS
  19695.    XSAVE .BUF 1
  19696.    YSAVE .BUF 1
  19697.  
  19698. PUTC = *
  19699.    STA PUTCbUFFER
  19700.    LDA #<PUTCbUFFER
  19701.    LDY #>PUTCbUFFER
  19702.    STA ZP+0
  19703.    STY ZP+1
  19704.    LDA #1
  19705.    LDY #0
  19706.    JMP WRITE
  19707.    PUTCbUFFER .BUF 1
  19708.  
  19709. GETCHAR = *
  19710.    LDX #STDIN
  19711. GETC = *
  19712.    LDA #<GETCbUFFER
  19713.    LDY #>GETCbUFFER
  19714.    STA ZP+0
  19715.    STY ZP+1
  19716.    LDA #1
  19717.    LDY #0
  19718.    JSR READ
  19719.    BEQ +
  19720.    LDA GETCbUFFER
  19721.    RTS
  19722. +  SEC
  19723.    RTS
  19724.    GETCbUFFER .BUF 1
  19725.  
  19726. GETARG = *
  19727.    STY ZP+1
  19728.    ASL
  19729.    STA ZP+0
  19730.    ROL ZP+1
  19731.    CLC
  19732.    LDA ACEaRGV
  19733.    ADC ZP+0
  19734.    STA ZP+0
  19735.    LDA ACEaRGV+1
  19736.    ADC ZP+1
  19737.    STA ZP+1
  19738.    LDY #0
  19739.    LDA (ZP),Y
  19740.    TAX
  19741.    INY
  19742.    LDA (ZP),Y
  19743.    STX ZP+0
  19744.    STA ZP+1
  19745.    RTS
  19746.  
  19747. ;===BSS===
  19748.  
  19749. BSS             = *
  19750. LINEBUF         = BSS+0  ;(256)
  19751. LINEnEXTpTR     = LINEBUF+$0 ;(4)
  19752. LINEpREVpTR     = LINEBUF+$4 ;(4)
  19753. LINElINElEN     = LINEBUF+$8 ;(1)
  19754. LINEiNDENT      = LINEBUF+$9 ;(1)
  19755. LINEfLAGS       = LINEBUF+$A ;(1) ;$80=CONNECTED, $40=TAILlINE
  19756. LINE            = LINEBUF+$B ;(241)
  19757.  
  19758. FILEBUF         = LINEBUF+256  ;(256)
  19759. TPAfREEMAP      = FILEBUF+256  ;(256)
  19760. BSSeND          = TPAfREEMAP+256
  19761. XLS.S
  19762. 611
  19763. ;*** DIRECTORY PROGRAM - BY cRAIG bRUCE
  19764.  
  19765. .SEQ ACEHEAD.S
  19766. .ORG ACEaPPaDDRESS
  19767. .OBJ "@0:XLS"
  19768.  
  19769. JMP MAIN
  19770. .BYTE ACEid1,ACEid2,ACEid3
  19771.  
  19772. ;*** GLOBAL DECLARATIONS
  19773.  
  19774. LIBWORK = 80
  19775.  
  19776. CHRcr = $0D
  19777. CHRcLS = 147
  19778. CHRqUOTE = $22
  19779. TRUE = $FF
  19780. FALSE = $00
  19781.  
  19782. ARG        = 2
  19783. NAME       = 4
  19784. STRING     = 8
  19785. DIRfCB     = 16
  19786. DIRcOLUMNS = 17
  19787. DIRcURcOL  = 18
  19788. DIRlONG    = 19
  19789. DIRsPACES  = 20
  19790. DIRLINElEN = 21
  19791. DIRcHcOLS  = 22
  19792. DIRpAGED   = 23
  19793. DIRsHOWN   = 24
  19794. DIRcLS     = 25
  19795. DIRfILES   = 32
  19796. DIRbYTES   = 36
  19797. DIRfREE    = 40
  19798. WORK       = 64
  19799.  
  19800. MAIN = *
  19801.    LDA #FALSE
  19802.    STA DIRlONG
  19803.    STA DIRpAGED
  19804.    STA DIRsHOWN
  19805.    STA DIRcLS
  19806.  
  19807.    LDA #0
  19808.    LDY #0
  19809.    STA ARG+0
  19810.    STY ARG+1
  19811.  
  19812.    NEXTaRG = *
  19813.    JSR STOPKEY
  19814.    BCC +
  19815.    JMP STOPPED
  19816. +  INC ARG+0
  19817.    BNE +
  19818.    INC ARG+1
  19819. +  LDA ARG+0
  19820.    LDY ARG+1
  19821.    JSR GETARG
  19822.    LDA ZP+0
  19823.    ORA ZP+1
  19824.    BEQ MAINeXIT
  19825.    LDY #0
  19826.    LDA (ZP),Y
  19827.    CMP #"-"
  19828.    BNE NAMEaRG
  19829.    JSR HANDLEoPTION
  19830.    JMP NEXTaRG
  19831.  
  19832.    NAMEaRG = *
  19833.    LDA ZP+0
  19834.    LDY ZP+1
  19835.    STA NAME+0
  19836.    STY NAME+1
  19837.    JSR LS
  19838.    LDA #TRUE
  19839.    STA DIRsHOWN
  19840.    JMP NEXTaRG
  19841.  
  19842. MAINeXIT = *
  19843.    LDA DIRsHOWN
  19844.    BNE +
  19845.    LDA #<DEFAULTdIR
  19846.    LDY #>DEFAULTdIR
  19847.    STA NAME+0
  19848.    STY NAME+1
  19849.    JSR LS
  19850. +  RTS
  19851.  
  19852.    DEFAULTdIR = *
  19853.    .BYTE ".",":",0
  19854.  
  19855. HANDLEoPTION = *
  19856.    LDY #0
  19857.    STY WORK+2
  19858.    LDA ZP+0
  19859.    LDY ZP+1
  19860.    STA WORK+0
  19861.    STY WORK+1
  19862.  
  19863.    NEXToPTION = *
  19864.    INC WORK+2
  19865.    LDY WORK+2
  19866.    LDA (WORK),Y
  19867.    BNE +
  19868.    RTS
  19869. +  CMP #"?"
  19870.    BNE +
  19871.    LDA #<USAGEmSG
  19872.    LDY #>USAGEmSG
  19873.    JSR EPUTS
  19874.    LDA #0
  19875.    LDX #0
  19876.    JMP EXIT
  19877. +  CMP #"L"
  19878.    BNE +
  19879.    LDA #TRUE
  19880.    STA DIRlONG
  19881.    JMP NEXToPTION
  19882. +  CMP #"C"
  19883.    BNE +
  19884.    LDA #TRUE
  19885.    STA DIRcLS
  19886.    JMP NEXToPTION
  19887. +  JMP NEXToPTION
  19888.  
  19889. USAGEmSG = *
  19890.    .ASC "USAGE: LS [-][L][?][C] [DIRECTORY ...]"
  19891.    .BYTE CHRcr
  19892.    .ASC "OPTS:  L=LONG FORM, ?=HELP, C=CLEAR SCREEN"
  19893.    .BYTE CHRcr,0
  19894.  
  19895. STOPPED = *
  19896.    LDA #<STOPPEDmSG
  19897.    LDY #>STOPPEDmSG
  19898.    JSR EPUTS
  19899.    LDA #1
  19900.    LDX #0
  19901.    JMP EXIT
  19902.    STOPPEDmSG = *
  19903.    .ASC "<sTOPPED>"
  19904.    .BYTE CHRcr,0
  19905.  
  19906. ERROR = *
  19907.    LDA #<ERRORmSG1
  19908.    LDY #>ERRORmSG1
  19909.    JSR EPUTS
  19910.    LDA NAME+0
  19911.    LDY NAME+1
  19912.    JSR EPUTS
  19913.    LDA #<ERRORmSG2
  19914.    LDY #>ERRORmSG2
  19915.    JMP EPUTS
  19916.  
  19917.    ERRORmSG1 = *
  19918.    .ASC "eRROR READING DIRECTORY "
  19919.    .BYTE CHRqUOTE,0
  19920.    ERRORmSG2 = *
  19921.    .BYTE CHRqUOTE,CHRcr,0
  19922.  
  19923. ;===DIR===
  19924.  
  19925. LS = *
  19926.    LDA DIRcLS
  19927.    BEQ +
  19928.    LDA #CHRcLS
  19929.    JSR PUTCHAR
  19930. +  LDA DIRlONG
  19931.    BNE DIR
  19932.  
  19933. TRUElS = *
  19934.    LDX #1
  19935.    JSR DEVINFO
  19936.    STX DIRcHcOLS
  19937.    CMP #0
  19938.    BNE +
  19939.    TXA
  19940.    LDX #$FF
  19941. -  INX
  19942.    SBC #20
  19943.    BCS -
  19944.    TXA
  19945.    BNE LSsETcOLS
  19946.  
  19947. +  LDA #1
  19948.    LSsETcOLS = *
  19949.    STA DIRcOLUMNS
  19950.    JMP DIRcOMMON
  19951.  
  19952. DIR = *
  19953.    LDX #1
  19954.    JSR DEVINFO
  19955.    STX DIRcHcOLS
  19956.    LDA #1
  19957.    STA DIRcOLUMNS
  19958.  
  19959. DIRcOMMON = *
  19960.    LDA #0
  19961.    STA DIRcURcOL
  19962.    LDX #3
  19963. -  STA DIRbYTES,X
  19964.    STA DIRfILES,X
  19965.    DEX
  19966.    BPL -
  19967.  
  19968.    DIRgOTnAME = *
  19969.    LDA NAME+0
  19970.    LDY NAME+1
  19971.    STA ZP+0
  19972.    STY ZP+1
  19973.    JSR DIROPEN
  19974.    BCC +
  19975.    JMP ERROR
  19976. +  STA DIRfCB
  19977.    LDX DIRfCB
  19978.    JSR DIRREAD
  19979.    BCS DIReXIT
  19980.    BEQ DIReXIT
  19981.    JSR STOPKEY
  19982.    BCC +
  19983.    JMP STOPPED
  19984. +  LDA DIRlONG
  19985.    BPL +
  19986.    JSR DIRdISPLAYhEADING
  19987. /  LDX DIRfCB
  19988.    JSR DIRREAD
  19989.    BCS DIReXIT
  19990.    BEQ DIReXIT
  19991.    JSR STOPKEY
  19992.    BCC +
  19993.    JSR DIReXIT
  19994.    JMP STOPPED
  19995. +  LDA ACEdIRENTnAME
  19996.    BEQ DIRtRAILEReXIT
  19997.    JSR DIRdISPLAY
  19998.    JMP -
  19999.  
  20000.    DIRtRAILEReXIT = *
  20001.    LDA DIRlONG
  20002.    BPL DIReXIT
  20003.    JSR DIRdISPLAYtRAILER
  20004.  
  20005.    DIReXIT = *
  20006.    LDA DIRcURcOL
  20007.    BEQ +
  20008.    LDA #CHRcr
  20009.    JSR PUTCHAR
  20010. +  LDA DIRfCB
  20011.    JMP DIRCLOSE
  20012.  
  20013. DIRdISPLAY = *
  20014.    BIT ACEdIRENTfLAGS
  20015.    BMI ++
  20016.    INC DIRfILES+0
  20017.    BNE +
  20018.    INC DIRfILES+1
  20019.    BNE +
  20020.    INC DIRfILES+2
  20021.    BNE +
  20022.    INC DIRfILES+3
  20023. +  LDX #0
  20024.    LDY #4
  20025.    CLC
  20026. -  LDA DIRbYTES,X
  20027.    ADC ACEdIRENTbYTES,X
  20028.    STA DIRbYTES,X
  20029.    INX
  20030.    DEY
  20031.    BNE -
  20032. +  BIT DIRlONG
  20033.    BMI +
  20034.    JMP DIRdISPLAYsHORT
  20035. +  JSR DIRsETUPdIRLINE
  20036.    LDA #<DIRLINE
  20037.    LDY #>DIRLINE
  20038.    STA ZP+0
  20039.    STY ZP+1
  20040.    LDA DIRLINElEN
  20041.    LDY #0
  20042.    LDX #STDOUT
  20043.    JMP WRITE
  20044.  
  20045. ;*            000000000011111111112222222222333333333344444444445555555555
  20046. ;*       POS: 012345678901234567890123456789012345678901234567890123456789
  20047. DIRLINE .ASC "DRWX*-MT  00-xXX-00  12:00A 12345678 *seq  1234567890123456"
  20048.         .BYTE CHRcr,0
  20049. DIRfLAGnAMES .ASC "DRWX*-MT"
  20050. DIRdATEsTR .ASC "  00-xXX-00  12:00A "
  20051. DIRdATEeND = *
  20052.  
  20053. DIRsETUPdIRLINE = *
  20054.    ;** FLAGS
  20055.    LDX #0
  20056.    LDA ACEdIRENTfLAGS
  20057. -  ASL
  20058.    PHA
  20059.    LDA #"-"
  20060.    BCC +
  20061.    LDA DIRfLAGnAMES,X
  20062. +  STA DIRLINE+0,X
  20063.    PLA
  20064.    INX
  20065.    CPX #8
  20066.    BCC -
  20067.  
  20068.    ;** DATE
  20069.    JSR PUTiNdATE
  20070.    LDX #DIRdATEeND-DIRdATEsTR-1
  20071. -  LDA DIRdATEsTR,X
  20072.    STA DIRLINE+8,X
  20073.    DEX
  20074.    BPL -
  20075.  
  20076.    ;** BYTES
  20077.    LDX #3
  20078. -  LDA ACEdIRENTbYTES,X
  20079.    STA DIRfREE,X
  20080.    DEX
  20081.    BPL -
  20082.    LDA #<UTOAnUMBER
  20083.    LDY #>UTOAnUMBER
  20084.    STA SYSWORK+0
  20085.    STY SYSWORK+1
  20086.    LDA #8
  20087.    LDX #DIRfREE
  20088.    JSR UTOA
  20089.    LDY #28
  20090.    LDA DIRcHcOLS
  20091.    CMP #60
  20092.    BCS +
  20093.    LDY #8
  20094. +  LDX #0
  20095. -  LDA UTOAnUMBER,X
  20096.    STA DIRLINE,Y
  20097.    INY
  20098.    INX
  20099.    CPX #8
  20100.    BCC -
  20101.    LDA #" "
  20102.    STA DIRLINE,Y
  20103.    INY
  20104.  
  20105.    ;** UNCLOSED FLAG
  20106.    LDA DIRLINE+4
  20107.    CMP #"-"
  20108.    BNE +
  20109.    LDA #" "
  20110. +  STA DIRLINE,Y
  20111.    INY
  20112.  
  20113.    ;** FILETYPE
  20114.    LDX #0
  20115. -  LDA ACEdIRENTtYPE,X
  20116.    ORA #$80
  20117.    STA DIRLINE,Y
  20118.    INY
  20119.    INX
  20120.    CPX #3
  20121.    BCC -
  20122.    LDA #" "
  20123.    STA DIRLINE,Y
  20124.    INY
  20125.    STA DIRLINE,Y
  20126.    INY
  20127.  
  20128.    ;** FILENAME
  20129.    LDX #0
  20130. -  LDA ACEdIRENTnAME,X
  20131.    BEQ +
  20132.    STA DIRLINE,Y
  20133.    INY
  20134.    INX
  20135.    BNE -
  20136. +  LDA #CHRcr
  20137.    STA DIRLINE,Y
  20138.    INY
  20139.    LDA #0
  20140.    STA DIRLINE,Y
  20141.    STY DIRLINElEN
  20142.    RTS
  20143.  
  20144. DIRdISPLAYsHORT = *
  20145.    LDA #<ACEdIRENTnAME
  20146.    LDY #>ACEdIRENTnAME
  20147.    JSR PUTS
  20148.    INC DIRcURcOL
  20149.    LDA DIRcURcOL
  20150.    CMP DIRcOLUMNS
  20151.    BCC +
  20152.    LDA #0
  20153.    STA DIRcURcOL
  20154.    LDA #CHRcr
  20155.    JMP PUTCHAR
  20156. +  LDY #$FF
  20157. -  INY
  20158.    LDA ACEdIRENTnAME,Y
  20159.    BNE -
  20160.    STY DIRsPACES
  20161.    LDA #20
  20162.    SBC DIRsPACES
  20163.    STA DIRsPACES
  20164. -  LDA #" "
  20165.    JSR PUTCHAR
  20166.    DEC DIRsPACES
  20167.    BNE -
  20168.    RTS
  20169.  
  20170. DIRdISPLAYhEADING = *
  20171.    LDA #<DIRhEADINGmSG
  20172.    LDY #>DIRhEADINGmSG
  20173.    JSR PUTS
  20174.    LDA #<ACEdIRENTnAME
  20175.    LDY #>ACEdIRENTnAME
  20176.    JSR PUTS
  20177.    LDA #CHRcr
  20178.    JSR PUTCHAR
  20179.    RTS
  20180.  
  20181.    DIRhEADINGmSG = *
  20182.    .ASC "dIR: "
  20183.    .BYTE 0
  20184.  
  20185. DIRdISPLAYtRAILER = *
  20186.    LDX #3
  20187. -  LDA ACEdIRENTbYTES,X
  20188.    STA DIRfREE,X
  20189.    DEX
  20190.    BPL -
  20191.    LDX #0
  20192.    LDY #0
  20193. -  LDA DIRtRAILINGmSG,X
  20194.    BEQ +
  20195.    CMP #4
  20196.    BCC STOREnUM
  20197.    STA TRAILbUF,Y
  20198.    INX
  20199.    INY
  20200.    BNE -
  20201. +  LDA #<TRAILbUF
  20202.    LDX #>TRAILbUF
  20203.    STA ZP+0
  20204.    STX ZP+1
  20205.    TYA
  20206.    LDY #0
  20207.    LDX #STDOUT
  20208.    JMP WRITE
  20209.  
  20210.    STOREnUM = *
  20211.    STX WORK+0
  20212.    STY WORK+1
  20213.    SEC
  20214.    SBC #1
  20215.    ASL
  20216.    ASL
  20217.    ADC #DIRfILES
  20218.    TAX
  20219.    LDA #<UTOAnUMBER
  20220.    LDY #>UTOAnUMBER
  20221.    STA SYSWORK+0
  20222.    STY SYSWORK+1
  20223.    LDA #1
  20224.    JSR UTOA
  20225.    LDX #0
  20226.    LDY WORK+1
  20227. -  LDA UTOAnUMBER,X
  20228.    BEQ +
  20229.    STA TRAILbUF,Y
  20230.    INX
  20231.    INY
  20232.    BNE -
  20233. +  LDX WORK+0
  20234.    INX
  20235.    JMP --
  20236.  
  20237.    DIRtRAILINGmSG = *
  20238.    .ASC "FILES="
  20239.    .BYTE 1
  20240.    .ASC "  BYTES="
  20241.    .BYTE 2
  20242.    .ASC "  FREE="
  20243.    .BYTE 3
  20244.    .BYTE CHRcr
  20245.    .BYTE 0
  20246.  
  20247.    TRAILbUF .BUF 64
  20248.  
  20249. PUTiNdATE = *
  20250.    ;** YEAR
  20251.    LDA ACEdIRENTdATE+1
  20252.    LDX #9
  20253.    JSR PUTdIGITS
  20254.    ;** MONTH
  20255.    LDA ACEdIRENTdATE+2
  20256.    CMP #$10
  20257.    BCC +
  20258.    SEC
  20259.    SBC #$10-10
  20260. +  TAX
  20261.    LDA MONTHsTR+0,X
  20262.    STA DIRdATEsTR+5
  20263.    LDA MONTHsTR+13,X
  20264.    STA DIRdATEsTR+6
  20265.    LDA MONTHsTR+26,X
  20266.    STA DIRdATEsTR+7
  20267.    ;** DAY
  20268.    LDA ACEdIRENTdATE+3
  20269.    LDX #2
  20270.    JSR PUTdIGITS
  20271.    ;** HOUR
  20272.    LDA ACEdIRENTdATE+4
  20273.    LDX #"A"
  20274.    CMP #$00
  20275.    BNE +
  20276.    LDA #$12
  20277.    JMP PUThOUR
  20278. +  CMP #$12
  20279.    BCC PUThOUR
  20280.    LDX #"P"
  20281.    CMP #$12
  20282.    BEQ PUThOUR
  20283.    SEI
  20284.    SED
  20285.    SEC
  20286.    SBC #$12
  20287.    CLD
  20288.    CLI
  20289.    PUThOUR = *
  20290.    STX DIRdATEsTR+18
  20291.    LDX #13
  20292.    JSR PUTdIGITS
  20293.    ;** MINUTE
  20294.    LDA ACEdIRENTdATE+5
  20295.    LDX #16
  20296.    JSR PUTdIGITS
  20297.    RTS
  20298.  
  20299.    PUTdIGITS = *  ;( .a=NUM, .x=OFFSET )
  20300.    PHA
  20301.    LSR
  20302.    LSR
  20303.    LSR
  20304.    LSR
  20305.    ORA #$30
  20306.    STA DIRdATEsTR,X
  20307.    PLA
  20308.    AND #$0F
  20309.    ORA #$30
  20310.    STA DIRdATEsTR+1,X
  20311.    RTS
  20312.  
  20313.    MONTHsTR = *
  20314.    .ASC "xjfmamjjasond"
  20315.    .ASC "XAEAPAUUUECOE"
  20316.    .ASC "XNBRRYNLGPTVC"
  20317.  
  20318. ;******** STANDARD LIBRARY ********
  20319. PUTS = *
  20320.    LDX #STDOUT
  20321. FPUTS = *
  20322.    STA ZP
  20323.    STY ZP+1
  20324.    LDY #$FF
  20325. -  INY
  20326.    LDA (ZP),Y
  20327.    BNE -
  20328.    TYA
  20329.    LDY #0
  20330.    JMP WRITE
  20331. EPUTS = *
  20332.    LDX #STDERR
  20333.    JMP FPUTS
  20334.  
  20335. PUTCHAR = *
  20336.    LDX #STDOUT
  20337. PUTC = *
  20338.    STA PUTCbUFFER
  20339.    LDA #<PUTCbUFFER
  20340.    LDY #>PUTCbUFFER
  20341.    STA ZP
  20342.    STY ZP+1
  20343.    LDA #1
  20344.    LDY #0
  20345.    JMP WRITE
  20346.    PUTCbUFFER .BUF 1
  20347.  
  20348. GETARG = *
  20349.    STY ZP+1
  20350.    ASL
  20351.    STA ZP
  20352.    ROL ZP+1
  20353.    CLC
  20354.    LDA ACEaRGV
  20355.    ADC ZP
  20356.    STA ZP
  20357.    LDA ACEaRGV+1
  20358.    ADC ZP+1
  20359.    STA ZP+1
  20360.    LDY #0
  20361.    LDA (ZP),Y
  20362.    TAX
  20363.    INY
  20364.    LDA (ZP),Y
  20365.    STX ZP
  20366.    STA ZP+1
  20367.    RTS
  20368.  
  20369. UTOAnUMBER .BUF 11
  20370.  
  20371. ;===BSS===
  20372.  
  20373. BSS = *
  20374.