home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / ACE12-SRC-2.SFX / bcode.s < prev    next >
Encoding:
Text File  |  1990-02-12  |  20.6 KB  |  1,152 lines

  1. ;*** ┬├╧─┼: BCODE ENCODER VERSION 1.00 - BY ├RAIG ┬RUCE - 17-╬OV-93
  2.  
  3. ;BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ...
  4.  
  5. .SEQ ACEHEAD.S
  6. .ORG ACE┴PP┴DDRESS
  7. .OBJ "@0:BCODE"
  8.  
  9. JMP MAIN
  10. .BYTE ACE╔─1,ACE╔─2,ACE╔─3
  11. .BYTE 64,0  ;** STACK,RESERVED
  12.  
  13. ;*** GLOBAL DECLARATIONS
  14.  
  15. CHR├╥       = $0D
  16. CHR╠╞       = $0A
  17. CHR╤UOTE    = $22
  18. TRUE        = $FF
  19. FALSE       = $00
  20. MAX├HUNK    = 54
  21. MAX╠INE     = 80
  22. TR╨ETSCII   = 0
  23. TR┴SCII├R╠F = 1
  24. TR┴SCII╠F   = 2
  25.  
  26. ARG         = 2  ;(2)  ;CURRENT ARGUMENT NUMBER
  27. NAME        = 4  ;(2)  ;NAME OF FILE BEING BCODED
  28. STRING      = 8  ;(2)  ;TEMP STRING
  29. MAXLINES    = 10 ;(4)  ;MAX NUMBER OF LINES PER SEGMENT
  30. LINELIMIT   = 14 ;(1)  ;WHETHER THERE IS A RESTRICTION ON LINES/SEG
  31. ALIAS       = 16 ;(2)  ;CURRENT ALIAS NAME TO USE
  32. TRANS╘O     = 18 ;(1)  ;OUTPUT FILE TRANSLATION: PETSCII, ASC-CRLF, ASC-LF
  33. PROGNAME    = 19 ;(2)  ;POINTER TO ARGV[0]
  34. VERBOSE     = 21 ;(1)  ;FLAG FOR GIVING VERBOSE INFORMATION
  35. FILENAME╒SED = 22;(1)  ;FLAG: IF A FILENAME HAS BEEN ENCOUNTERED ON THE CMD LINE
  36. BUF╨TR      = 23 ;(2)  ;POINTER TO NEXT CHAR IN INPUT BUFFER
  37. BUF├OUNT    = 25 ;(2)  ;NUMBER OF BYTES LEFT IN INPUT BUFFER
  38. IN┬UF╙IZE   = 27 ;(2)  ;MAXIMUM SIZE OF INPUT BUFFER
  39. INFILE      = 29 ;(1)  ;FD OF INPUT BINARY FILE
  40. OUTFILE     = 30 ;(1)  ;FD TO OUTPUT BCODED DATA TO
  41. CHUNK╠EN    = 31 ;(1)  ;LENGTH OF CHUNK FOR ENCODING
  42. CHUNK╨OS    = 32 ;(1)  ;SCANNING POSITION IN CHUNK DURING ENCODING
  43. BCTEMP      = 33 ;(1)  ;TEMPORARY FOR CONVERSION FROM 8 TO 6 BITS
  44. TR╨UT╨TR    = 34 ;(2)  ;POINTER TO TRANSLATED-PUTS STRING
  45. TR╨UT╔NDEX  = 36 ;(1)  ;INDEX INTO TRANSLATED-PUTS STRING
  46. CRC         = 37 ;(4)  ;CUMULATIVE CRC-32 OF SEGMENT
  47. BYTES       = 41 ;(4)  ;CUMULATIVE BYTES IN SEGMENT
  48. SEGNUM      = 45 ;(4)  ;CURRENT SEGMENT NUMBER
  49. STOP├OUNTDN = 49 ;(1)  ;COUNTDOWN TO CHECK STOP KEY
  50. SCAN╓AL     = 50 ;(4)  ;RESULT OF CONVERTING STRING TO 32-BIT NUMBER
  51. LINENUM     = 54 ;(4)  ;CURRENT LINE NUMBER BEING ENCODED
  52. IS╠AST╙EG   = 58 ;(1)  ;WHETHER WE HAVE JUST ENCODED THE LAST SEGMENT
  53. WORK        = 112;(16) ;MISC WORK AREA
  54.  
  55. ;===MAIN===
  56.  
  57. MAIN = *
  58.    ;** CHECK FOR LARGE ENOUGH ╘╨┴
  59.    SEC
  60.    LDA #<BSS┼ND
  61.    CMP ACE═EM╘OP+0
  62.    LDA #>BSS┼ND
  63.    SBC ACE═EM╘OP+1
  64.    BCS +
  65.    JMP MAIN╔NIT
  66. +  LDA #<TPA═SG
  67.    LDY #>TPA═SG
  68.    JSR EPUTS
  69. DIE = *
  70.    LDA #1
  71.    LDX #0
  72.    JMP EXIT
  73.  
  74. TPA═SG = *
  75.    .ASC "╔NSUFFICIENT PROGRAM SPACE TO RUN BCODE"
  76.    .BYTE CHR├╥,0
  77.  
  78. USAGE = *
  79.    LDA #<USAGE═SG
  80.    LDY #>USAGE═SG
  81.    JSR EPUTS
  82.    JMP DIE
  83.  
  84. USAGE═SG = *
  85.    .ASC "USAGE: BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ..."
  86.    .BYTE CHR├╥
  87.    .ASC "FLAGS: -V:VERBOSE, -U:UNIX-ASCII, -M:MS-DOS-ASCII"
  88.    .BYTE CHR├╥,0
  89.  
  90. DEFAULT┴LIAS = *
  91.    .ASC "STDIN"
  92.    .BYTE 0
  93.  
  94. MAIN╔NIT = *
  95.    ;** SET GLOBALS
  96.    LDA #TRUE
  97.    STA VERBOSE
  98.    LDA #0
  99.    LDY #0
  100.    JSR GETARG
  101.    LDA ZP+0
  102.    LDY ZP+1
  103.    STA PROGNAME+0
  104.    STY PROGNAME+1
  105.    LDA #FALSE
  106.    STA FILENAME╒SED
  107.    LDA #0
  108.    STA ARG+0
  109.    STA ARG+1
  110.    LDA #<DEFAULT┴LIAS
  111.    LDY #>DEFAULT┴LIAS
  112.    STA ALIAS+0
  113.    STY ALIAS+1
  114.    LDA #FALSE
  115.    STA LINELIMIT
  116.    LDA #TR╨ETSCII
  117.    STA TRANS╘O
  118.    ;** GET INPUT BUFFER LENGTH
  119.    SEC
  120.    LDA ACE═EM╘OP+0
  121.    SBC #<IN┬UF
  122.    STA IN┬UF╙IZE+0
  123.    LDA ACE═EM╘OP+1
  124.    SBC #>IN┬UF
  125.    STA IN┬UF╙IZE+1
  126.  
  127.    MAIN╬EXT = *
  128.    JSR CHECK╙TOP
  129.    INC ARG+0
  130.    BNE +
  131.    INC ARG+1
  132. +  LDA ARG+0
  133.    LDY ARG+1
  134.    JSR GETARG
  135.    LDA ZP+0
  136.    ORA ZP+1
  137.    BEQ MAIN┼XIT
  138.    LDA ZP+0
  139.    LDY ZP+1
  140.    STA NAME+0
  141.    STY NAME+1
  142.    LDY #0
  143.    LDA (ZP),Y
  144.    CMP #"-"
  145.    BNE +
  146.    JMP HANDLE╞LAGS
  147. +  JSR ECHO
  148.    JSR BCODE
  149.    JMP MAIN╬EXT
  150.  
  151. MAIN┼XIT = *
  152.    BIT FILENAME╒SED
  153.    BMI +
  154.    ;XX SHOULD READ FROM STDIN IF NO FILES
  155.    NOP
  156. +  RTS
  157.  
  158. HANDLE╞LAGS = *
  159.    INY
  160.    LDA (ZP),Y
  161.    BNE +
  162.    JMP MAIN╬EXT
  163. +  CMP #"V"
  164.    BEQ FLAG╓
  165.    CMP #"M"
  166.    BEQ FLAG═
  167.    CMP #"A"
  168.    BEQ FLAG═
  169.    CMP #"U"
  170.    BEQ FLAG╒
  171.    CMP #"L"
  172.    BEQ FLAG╠
  173.    CMP #"H"
  174.    BNE +
  175.    JMP USAGE
  176. +  NOP
  177.    ;XX UNRECOGNIZED OPTION
  178.    JMP HANDLE╞LAGS
  179.  
  180. FLAG╓ = *
  181.    LDA #TRUE
  182.    STA VERBOSE
  183.    JMP HANDLE╞LAGS
  184.  
  185. FLAG═ = *
  186.    LDA #TR┴SCII├R╠F
  187.    STA TRANS╘O
  188.    JMP HANDLE╞LAGS
  189.  
  190. FLAG╒ = *
  191.    LDA #TR┴SCII╠F
  192.    STA TRANS╘O
  193.    JMP HANDLE╞LAGS
  194.  
  195. FLAG╠ = *
  196.    INC ARG+0
  197.    BNE +
  198.    INC ARG+1
  199. +  LDA ARG+0
  200.    LDY ARG+1
  201.    JSR GETARG
  202.    LDA ZP+0
  203.    ORA ZP+1
  204.    BEQ FLAG╠ERROR
  205.    LDY #0
  206.    JSR SCAN╬UM
  207.    BCS FLAG╠ERROR
  208.    LDX #3
  209. -  LDA SCAN╓AL,X
  210.    STA MAXLINES,X
  211.    DEX
  212.    BPL -
  213.    LDA MAXLINES+0
  214.    ORA MAXLINES+1
  215.    ORA MAXLINES+2
  216.    ORA MAXLINES+3
  217.    BEQ FLAG╠ERROR
  218.    LDA #TRUE
  219.    STA LINELIMIT
  220.    JMP MAIN╬EXT
  221. FLAG╠ERROR = *
  222.    LDA #<FLAG╠ERROR═SG
  223.    LDY #>FLAG╠ERROR═SG
  224.    JSR EPUTS
  225.    JMP DIE
  226. FLAG╠ERROR═SG = *
  227.    .ASC "┼╥╥╧╥: INVALID MAXIMUM LINE LIMIT GIVEN WITH -L OPTION"
  228.    .BYTE CHR├╥,0
  229.  
  230. ECHO = *
  231.    LDA #<ECHO═SG1
  232.    LDY #>ECHO═SG1
  233.    JSR EPUTS
  234.    LDA NAME+0
  235.    LDY NAME+1
  236.    JSR EPUTS
  237.    LDA #<ECHO═SG2
  238.    LDY #>ECHO═SG2
  239.    JSR EPUTS
  240.    RTS
  241.  
  242. ECHO═SG1 = *
  243.    .ASC "BCODING FILE "
  244.    .BYTE CHR╤UOTE,0
  245. ECHO═SG2 = *
  246.    .BYTE CHR╤UOTE
  247.    .ASC "..."
  248.    .BYTE CHR├╥,0
  249.  
  250. CHECK╙TOP = *
  251.    JSR STOPKEY
  252.    BCS +
  253.    RTS
  254. +  LDA #<STOPPED═SG
  255.    LDY #>STOPPED═SG
  256.    JSR EPUTS
  257.    JMP DIE
  258.  
  259.    STOPPED═SG = *
  260.    .ASC "<╙TOPPED>"
  261.    .BYTE CHR├╥,0
  262.  
  263. BCODE = *
  264.    LDA #TRUE
  265.    STA FILENAME╒SED
  266.    LDA NAME+0
  267.    LDY NAME+1
  268.    STA ZP+0
  269.    STY ZP+1
  270.    LDA #"R"
  271.    JSR OPEN
  272.    BCS OPEN┼RROR
  273.    STA INFILE
  274.    LDA #0
  275.    STA BUF├OUNT+0
  276.    STA BUF├OUNT+1
  277.    JSR SET┬ASE64╘ABLE
  278.    LDA #1
  279.    LDY #0
  280.    STA SEGNUM+0
  281.    STY SEGNUM+1
  282.    STY SEGNUM+2
  283.    STY SEGNUM+3
  284.  
  285.    BCODE╬EXT╙EGMENT = *
  286.    LDA #STDOUT
  287.    STA OUTFILE
  288.    BIT LINELIMIT
  289.    BPL +
  290.    JSR GET╧UTFILE
  291. +  JSR BCODE╙EGMENT
  292.    LDA OUTFILE
  293.    CMP #STDOUT
  294.    BEQ +
  295.    JSR CLOSE
  296. +  BIT IS╠AST╙EG
  297.    BPL +
  298.    LDA INFILE
  299.    JSR CLOSE
  300.    RTS
  301. +  INC SEGNUM+0
  302.    BNE +
  303.    INC SEGNUM+1
  304.    BNE +
  305.    INC SEGNUM+2
  306.    BNE +
  307.    INC SEGNUM+3
  308. +  JMP BCODE╬EXT╙EGMENT
  309.  
  310. OPEN┼RROR = *
  311.    LDA #<OPEN┼RROR═SG1
  312.    LDY #>OPEN┼RROR═SG1
  313.    JSR EPUTS
  314.    LDA NAME+0
  315.    LDY NAME+1
  316.    JSR EPUTS
  317.    LDA #<OPEN┼RROR═SG2
  318.    LDY #>OPEN┼RROR═SG2
  319.    JSR EPUTS
  320.    RTS
  321. OPEN┼RROR═SG1 = *
  322.    .ASC "┼╥╥╧╥: CANNOT OPEN "
  323.    .BYTE CHR╤UOTE,0
  324. OPEN┼RROR═SG2 = *
  325.    .BYTE CHR╤UOTE,CHR├╥,0
  326.  
  327. OUTFILE╞ILE╠EN = WORK+0
  328. OUTFILE┼XT╠EN  = WORK+1
  329. OUTFILE╘EMP    = WORK+2
  330.  
  331. GET╧UTFILE = *
  332.    ;** GET FILENAME
  333.    LDA NAME+0
  334.    LDY NAME+1
  335.    STA ZP+0
  336.    STY ZP+1
  337.    JSR BASENAME
  338.    STX OUTFILE╞ILE╠EN
  339.    ;** GET SEG NUMBER, 2+ DIGITS
  340.    LDA #<NUMBUF
  341.    LDY #>NUMBUF
  342.    STA ZP+0
  343.    STY ZP+1
  344.    LDA #1
  345.    LDX #SEGNUM
  346.    JSR UTOA
  347.    CPY #1
  348.    BNE +
  349.    LDA NUMBUF+0
  350.    STA NUMBUF+1
  351.    LDA #"0"
  352.    STA NUMBUF+0
  353.    LDA #0
  354.    STA NUMBUF+2
  355.    INY
  356. +  TYA
  357.    CLC
  358.    ADC #2
  359.    STA OUTFILE┼XT╠EN
  360.    CLC
  361.    LDA OUTFILE╞ILE╠EN
  362.    ADC OUTFILE┼XT╠EN
  363.    LDY OUTFILE╞ILE╠EN
  364.    CMP #17
  365.    BCC +
  366.    SEC
  367.    LDA #16
  368.    SBC OUTFILE┼XT╠EN  ;GIVES ALLOWED FILENAME LEN
  369.    TAY
  370. +  LDA #"."
  371.    STA OUT┬UF,Y
  372.    INY
  373.    LDA #"B"
  374.    STA OUT┬UF,Y
  375.    INY
  376.    LDX #0
  377. -  LDA NUMBUF,X
  378.    STA OUT┬UF,Y
  379.    BEQ +
  380.    INX
  381.    INY
  382.    BNE -
  383.    ;** OPEN THE FILE
  384. +  LDA #<OUT┬UF
  385.    LDY #>OUT┬UF
  386.    STA ZP+0
  387.    STY ZP+1
  388.    LDA #"W"
  389.    JSR OPEN╧VERWRITE
  390.    STA OUTFILE
  391.    BCC +
  392.    LDA #<OUTFILE┼RR═SG1
  393.    LDY #>OUTFILE┼RR═SG1
  394.    JSR EPUTS
  395.    LDA #<OUT┬UF
  396.    LDY #>OUT┬UF
  397.    JSR EPUTS
  398.    LDA #<OUTFILE┼RR═SG2
  399.    LDY #>OUTFILE┼RR═SG2
  400.    JSR EPUTS
  401.    JMP DIE
  402.    ;** ECHO OPENING
  403. +  LDA #<OUTFILE═SG
  404.    LDY #>OUTFILE═SG
  405.    JSR EPUTS
  406.    LDA #<OUT┬UF
  407.    LDY #>OUT┬UF
  408.    JSR EPUTS
  409.    LDA #CHR╤UOTE
  410.    JSR EPUTCHAR
  411.    LDA #CHR├╥
  412.    JMP EPUTCHAR
  413.  
  414. OUTFILE═SG = *
  415.    .ASC "OUTPUTTING TO FILE "
  416.    .BYTE CHR╤UOTE,0
  417. OUTFILE┼RR═SG1 = *
  418.    .ASC "┼╥╥╧╥: CANNOT OPEN "
  419.    .BYTE CHR╤UOTE,0
  420. OUTFILE┼RR═SG2 = *
  421.    .BYTE CHR╤UOTE
  422.    .ASC ", ABORTING!"
  423.    .BYTE CHR├╥,0
  424.  
  425. BCODE╙EGMENT = *  ;( ) : IS╠AST╙EG
  426.    ;** HEADER LINE
  427.    LDA #<BCODE╚EADER═SG
  428.    LDY #>BCODE╚EADER═SG
  429.    JSR TR╨UTS
  430.    LDX #SEGNUM
  431.    JSR TR╨UTNUM
  432.    LDA #" "
  433.    JSR TR╨UTCHAR
  434.    LDA NAME+0
  435.    LDY NAME+1
  436.    STA ZP+0
  437.    STY ZP+1
  438.    JSR BASENAME
  439.    LDA #<OUT┬UF
  440.    LDY #>OUT┬UF
  441.    JSR TR╨UTS
  442.    LDA #CHR├╥
  443.    JSR TR╨UTCHAR
  444.    JSR CRC╔NIT
  445.    LDA #0
  446.    STA LINENUM+0
  447.    STA LINENUM+1
  448.    STA LINENUM+2
  449.    STA LINENUM+3
  450.    ;** LOOP
  451.    ENCODE╬EXT = *
  452.    JSR ENCODE╠INE
  453.    BCC +
  454.    LDA #TRUE
  455.    STA IS╠AST╙EG
  456.    JMP ENCODE╙EG╞INISH
  457. +  BIT LINELIMIT
  458.    BPL ENCODE╬EXT
  459.    INC LINENUM+0
  460.    BNE +
  461.    INC LINENUM+1
  462.    BNE +
  463.    INC LINENUM+2
  464.    BNE +
  465.    INC LINENUM+3
  466. +  SEC
  467.    LDY #4
  468.    LDX #0
  469. -  LDA LINENUM,X
  470.    SBC MAXLINES,X
  471.    INX
  472.    DEY
  473.    BNE -
  474.    BCC ENCODE╬EXT
  475.    LDA #FALSE
  476.    STA IS╠AST╙EG
  477.  
  478.    ;** END LINE
  479.    ENCODE╙EG╞INISH = *
  480.    JSR CRC╞INISH
  481.    BIT IS╠AST╙EG
  482.    BPL +
  483.    LDA #<BCODE┼ND═SG
  484.    LDY #>BCODE┼ND═SG
  485.    JMP ++
  486. +  LDA #<BCODE├ONTINUED═SG
  487.    LDY #>BCODE├ONTINUED═SG
  488. +  JSR TR╨UTS
  489.    LDX #SEGNUM
  490.    JSR TR╨UTNUM
  491.    LDA #" "
  492.    JSR TR╨UTCHAR
  493.    LDX #BYTES
  494.    JSR TR╨UTNUM
  495.    LDA #" "
  496.    JSR TR╨UTCHAR
  497.    LDX #CRC
  498.    JSR TR╨UTHEX
  499.    LDA #CHR├╥
  500.    JSR TR╨UTCHAR
  501.    RTS
  502.  
  503. BCODE╚EADER═SG = *
  504.    .ASC "--BCODE-BEGIN "
  505.    .BYTE 0
  506. BCODE┼ND═SG = *
  507.    .ASC "--BCODE-END "
  508.    .BYTE 0
  509. BCODE├ONTINUED═SG = *
  510.    .ASC "--BCODE-CONTINUED "
  511.    .BYTE 0
  512.  
  513. BASENAME╙TART .BUF 1
  514. BASENAME = * ;( (ZP)=INNAME ) : OUT┬UF=OUTNAME, .╪=BASENAME╠EN
  515.    LDY #255
  516.    STY BASENAME╙TART
  517. -  INY
  518.    LDA (ZP),Y
  519.    BEQ BASENAME─ONE
  520.    CMP #":"
  521.    BEQ +
  522.    CMP #"/"
  523.    BNE -
  524. +  STY BASENAME╙TART
  525.    JMP -
  526.    BASENAME─ONE = *
  527.    LDY BASENAME╙TART
  528.    LDX #255
  529. -  INY
  530.    INX
  531.    LDA (ZP),Y
  532.    STA OUT┬UF,X
  533.    BNE -
  534.    CPX #2
  535.    BCC +
  536.    LDA OUT┬UF-2,X
  537.    CMP #","
  538.    BNE +
  539.    LDA #0
  540.    STA OUT┬UF-2,X
  541.    DEX
  542.    DEX
  543. +  RTS
  544.  
  545. ENCODE╠INE = *
  546.    INC STOP├OUNTDN
  547.    LDA STOP├OUNTDN
  548.    AND #7
  549.    BNE +
  550.    JSR CHECK╙TOP
  551.    ;** GET THE CHUNK
  552. +  JSR READ├HUNK
  553.    BCC +
  554.    RTS
  555. +  STX CHUNK╠EN
  556.    LDA #0
  557.    STA IN├HUNK+0,X
  558.    STA IN├HUNK+1,X
  559.    JSR CRC├HUNK
  560.    ;** ENCODE THE CHUNK
  561.    LDX #0  ;CHUNKPOS
  562.    LDY #0  ;LINEPOS
  563. -  JSR ENCODE╞OUR├HARS
  564.    CPX CHUNK╠EN
  565.    BCC -
  566.    ;** FIX NON-INTEGRAL-LENGTH (LAST) LINE
  567.    BEQ +
  568.    LDA #"="
  569.    STA OUT┬UF-1,Y
  570.    DEX
  571.    CPX CHUNK╠EN
  572.    BEQ +
  573.    STA OUT┬UF-2,Y
  574.    ;** OUTPUT THE LINE
  575. +  LDA #CHR├╥
  576.    STA OUT┬UF,Y
  577.    LDX TRANS╘O
  578.    CPX #TR╨ETSCII
  579.    BEQ +
  580.    INY
  581.    LDA #CHR╠╞
  582.    STA OUT┬UF,Y
  583.    CPX #TR┴SCII├R╠F
  584.    BEQ +
  585.    DEY
  586.    STA OUT┬UF,Y
  587. +  INY
  588.    TYA
  589.    LDA #<OUT┬UF
  590.    LDX #>OUT┬UF
  591.    STA ZP+0
  592.    STX ZP+1
  593.    TYA
  594.    LDY #0
  595.    LDX OUTFILE
  596.    JSR WRITE
  597.    RTS
  598.  
  599. ENCODE╞OUR├HARS = *  ;( .╪++=CHUNKPOS, .┘++=LINEPOS )
  600.    STX CHUNK╨OS
  601.    ;** PUT BYTES INTO OUTPUT LINE
  602. ;POS  76543210  76543210  76543210  76543210
  603. ;BYT  XX111111  XX112222  XX222233  XX333333
  604. ;BIT    765432    107654    321076    543210
  605.    ;** FIRST BYTE
  606.    LDA IN├HUNK+0,X
  607.    LSR
  608.    LSR
  609.    TAX
  610.    LDA BASE64├HAR,X
  611.    STA OUT┬UF,Y
  612.    INY
  613.  
  614.    ;** SECOND BYTE
  615.    LDX CHUNK╨OS
  616.    LDA IN├HUNK+0,X
  617.    ASL
  618.    ASL
  619.    ASL
  620.    ASL
  621.    STA BCTEMP
  622.    LDA IN├HUNK+1,X
  623.    LSR
  624.    LSR
  625.    LSR
  626.    LSR
  627.    ORA BCTEMP
  628.    AND #%00111111
  629.    TAX
  630.    LDA BASE64├HAR,X
  631.    STA OUT┬UF,Y
  632.    INY
  633.  
  634.    ;** THIRD BYTE
  635.    LDX CHUNK╨OS
  636.    LDA IN├HUNK+1,X
  637.    ASL
  638.    ASL
  639.    STA BCTEMP
  640.    LDA IN├HUNK+2,X
  641.    ASL
  642.    ROL
  643.    ROL
  644.    AND #%00000011
  645.    ORA BCTEMP
  646.    AND #%00111111
  647.    TAX
  648.    LDA BASE64├HAR,X
  649.    STA OUT┬UF,Y
  650.    INY
  651.  
  652.    ;** FOURTH BYTE
  653.    LDX CHUNK╨OS
  654.    LDA IN├HUNK+2,X
  655.    AND #%00111111
  656.    TAX
  657.    LDA BASE64├HAR,X
  658.    STA OUT┬UF,Y
  659.    INY
  660.    LDX CHUNK╨OS
  661.    INX
  662.    INX
  663.    INX
  664.    RTS
  665.  
  666. BASE64╔NDEX .BUF 1
  667. SET┬ASE64╘ABLE = *
  668.    LDY #0
  669.    LDX #0
  670.    LDA TRANS╘O
  671.    CMP #TR╨ETSCII
  672.    BEQ +
  673.    LDX #BASE64─ESC┴SC-BASE64─ESC╨ET
  674. +  STX BASE64╔NDEX
  675. -  LDX BASE64╔NDEX
  676.    LDA BASE64─ESC╨ET+0,X
  677.    BEQ +
  678.    PHA
  679.    LDA BASE64─ESC╨ET+1,X
  680.    TAX
  681.    PLA
  682. -  STA BASE64├HAR,Y
  683.    CLC
  684.    ADC #1
  685.    INY
  686.    DEX
  687.    BNE -
  688.    INC BASE64╔NDEX
  689.    INC BASE64╔NDEX
  690.    BNE --
  691. +  RTS
  692.  
  693. BASE64─ESC╨ET = *
  694.    .BYTE "┴",26,"A",26,"0",10,"+",1,"/",1,$00
  695. BASE64─ESC┴SC = *
  696.    .BYTE $41,26,$61,26,"0",10,"+",1,"/",1,$00
  697.  
  698. READ├HUNK = *  ;( ) : .╪=LEN
  699.    LDX #0
  700. -  STX CHUNK╠EN
  701.    JSR GET┬YTE
  702.    LDX CHUNK╠EN
  703.    BCS +
  704.    STA IN├HUNK,X
  705.    INX
  706.    CPX #MAX├HUNK
  707.    BCC -
  708. -  CLC
  709.    RTS
  710. +  CPX #0
  711.    BNE -
  712.    SEC
  713.    RTS
  714.  
  715. GET┬YTE = *
  716.    LDA BUF├OUNT+0
  717.    ORA BUF├OUNT+1
  718.    BEQ GET┬YTE╞ILL┬UF
  719.    LDY #0
  720.    LDA (BUF╨TR),Y
  721.    INC BUF╨TR+0
  722.    BNE +
  723.    INC BUF╨TR+1
  724. +  LDX BUF├OUNT+0
  725.    BNE +
  726.    DEC BUF├OUNT+1
  727. +  DEC BUF├OUNT+0
  728.    CLC
  729.    RTS
  730.  
  731. GET┬YTE╞ILL┬UF = *
  732.    JSR CHECK╙TOP
  733.    LDA #<IN┬UF
  734.    LDY #>IN┬UF
  735.    STA ZP+0
  736.    STY ZP+1
  737.    STA BUF╨TR+0
  738.    STY BUF╨TR+1
  739.    LDA IN┬UF╙IZE+0
  740.    LDY IN┬UF╙IZE+1
  741.    LDX INFILE
  742.    JSR READ
  743.    BEQ +
  744.    BCS +
  745.    STA BUF├OUNT+0
  746.    STY BUF├OUNT+1
  747.    JMP GET┬YTE
  748. +  SEC
  749.    RTS
  750.  
  751. CRC╘ABLE0 = *
  752.    .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
  753.    .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
  754.    .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
  755.    .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
  756.    .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
  757.    .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
  758.    .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
  759.    .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
  760.    .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
  761.    .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
  762.    .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
  763.    .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
  764.    .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
  765.    .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
  766.    .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
  767.    .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
  768.  
  769. CRC╘ABLE1 = *
  770.    .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
  771.    .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
  772.    .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
  773.    .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
  774.    .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
  775.    .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
  776.    .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
  777.    .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
  778.    .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
  779.    .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
  780.    .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
  781.    .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
  782.    .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
  783.    .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
  784.    .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
  785.    .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
  786.  
  787. CRC╘ABLE2 = *
  788.    .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
  789.    .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
  790.    .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
  791.    .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
  792.    .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
  793.    .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
  794.    .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
  795.    .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
  796.    .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
  797.    .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
  798.    .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
  799.    .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
  800.    .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
  801.    .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
  802.    .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
  803.    .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
  804.  
  805. CRC╘ABLE3 = *
  806.    .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
  807.    .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
  808.    .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
  809.    .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
  810.    .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
  811.    .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
  812.    .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
  813.    .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
  814.    .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
  815.    .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
  816.    .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
  817.    .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
  818.    .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
  819.    .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
  820.    .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
  821.    .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
  822.  
  823. ;** CRC = 0X╞╞╞╞╞╞╞╞;
  824. ;** WHILE( (C=GETC(FP)) != ┼╧╞ ) █
  825. ;**     CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ (CRC^C) & 0X╞╞ ];
  826. ;** ▌
  827. ;** RETURN( CRC^0X╞╞╞╞╞╞╞╞ );
  828.  
  829. CRC╔NIT = *
  830.    LDX #3
  831. -  LDA #$FF
  832.    STA CRC,X
  833.    LDA #0
  834.    STA BYTES,X
  835.    DEX
  836.    BPL -
  837.    RTS
  838.  
  839. CRC├HUNK = *
  840.    LDY #0
  841.    CPY CHUNK╠EN
  842.    BCS +
  843. -  LDA IN├HUNK,Y         ;.╪ = (CRC^C) & 0X╞╞
  844.    EOR CRC+0
  845.    TAX
  846.    LDA CRC+1            ;CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ .╪ ]
  847.    EOR CRC╘ABLE0,X
  848.    STA CRC+0
  849.    LDA CRC+2
  850.    EOR CRC╘ABLE1,X
  851.    STA CRC+1
  852.    LDA CRC+3
  853.    EOR CRC╘ABLE2,X
  854.    STA CRC+2
  855.    LDA CRC╘ABLE3,X
  856.    STA CRC+3
  857.    INY
  858.    CPY CHUNK╠EN
  859.    BCC -
  860. +  CLC
  861.    LDA BYTES+0
  862.    ADC CHUNK╠EN
  863.    STA BYTES+0
  864.    BCC +
  865.    INC BYTES+1
  866.    BNE +
  867.    INC BYTES+2
  868.    BNE +
  869.    INC BYTES+3
  870. +  RTS
  871.  
  872. CRC╞INISH = *
  873.    LDX #3
  874. -  LDA CRC,X
  875.    EOR #$FF
  876.    STA CRC,X
  877.    DEX
  878.    BPL -
  879.    RTS
  880.  
  881. TR╨UTS = *
  882.    STA TR╨UT╨TR+0
  883.    STY TR╨UT╨TR+1
  884.    LDY #0
  885.    STY TR╨UT╔NDEX
  886. -  LDY TR╨UT╔NDEX
  887.    LDA (TR╨UT╨TR),Y
  888.    BEQ +
  889.    JSR TR╨UTCHAR
  890.    INC TR╨UT╔NDEX
  891.    BNE -
  892. +  RTS
  893.  
  894. TR╨UTCHAR = *
  895.    LDX TRANS╘O
  896.    CPX #TR╨ETSCII
  897.    BEQ +
  898.    CMP #CHR├╥
  899.    BEQ ++
  900.    JSR CONV╨ET2┴SC
  901. +  LDX OUTFILE
  902.    JMP PUTC
  903. +  LDX TRANS╘O
  904.    CPX #TR┴SCII╠F
  905.    BEQ +
  906.    LDA #CHR├╥
  907.    LDX OUTFILE
  908.    JSR PUTC
  909. +  LDA #CHR╠╞
  910.    LDX OUTFILE
  911.    JMP PUTC
  912.  
  913. CONV╨ET2┴SC = *
  914.    CMP #"A"
  915.    BCS +
  916.    RTS
  917. +  TAX
  918.    BPL +
  919.    SBC #$C0-$60
  920.    TAX
  921. +  AND #$1F
  922.    BNE +
  923. -  TXA
  924.    RTS
  925. +  CMP #$1B
  926.    BCS -
  927.    TXA
  928.    EOR #$20
  929.    RTS
  930.  
  931. TR╨UTNUM = * ;( .╪=NUMBER32 )
  932.    LDA #<NUMBUF
  933.    LDY #>NUMBUF
  934.    STA ZP+0
  935.    STY ZP+1
  936.    LDA #1
  937.    JSR UTOA
  938.    TR╨UTNUM─UMP = *
  939.    LDA #<NUMBUF
  940.    LDY #>NUMBUF
  941.    JSR TR╨UTS
  942.    RTS
  943.  
  944. TR╨UTHEX = * ;( .╪=NUMBER32 )
  945.    LDA #4
  946.    STA WORK
  947.    LDY #0
  948.    INX
  949.    INX
  950.    INX
  951. -  LDA 0,X
  952.    PHA
  953.    LSR
  954.    LSR
  955.    LSR
  956.    LSR
  957.    JSR TR╨UTHEX─IGIT
  958.    PLA
  959.    JSR TR╨UTHEX─IGIT
  960.    DEX
  961.    DEC WORK
  962.    BNE -
  963.    LDA #0
  964.    STA NUMBUF,Y
  965.    JMP TR╨UTNUM─UMP
  966.  
  967. TR╨UTHEX─IGIT = *  ;( .┴=DIGIT, .┘=NUMBUF╔NDEX )
  968.    AND #$0F
  969.    ORA #$30
  970.    CMP #$3A
  971.    BCC +
  972.    ADC #6
  973. +  STA NUMBUF,Y
  974.    INY
  975.    RTS
  976.  
  977. ;=== STANDARD LIBRARY ===
  978.  
  979. PUTS = *
  980.    LDX #STDOUT
  981. FPUTS = *
  982.    STA ZP+0
  983.    STY ZP+1
  984.    LDY #$FF
  985. -  INY
  986.    LDA (ZP),Y
  987.    BNE -
  988.    TYA
  989.    LDY #0
  990.    JMP WRITE
  991. EPUTS = *
  992.    LDX #STDERR
  993.    JMP FPUTS
  994.  
  995. EPUTCHAR = *
  996.    LDX #STDERR
  997.    JMP PUTC
  998. PUTCHAR = *
  999.    LDX #STDOUT
  1000. PUTC = *
  1001.    STA PUTC┬UFFER
  1002.    LDA #<PUTC┬UFFER
  1003.    LDY #>PUTC┬UFFER
  1004.    STA ZP+0
  1005.    STY ZP+1
  1006.    LDA #1
  1007.    LDY #0
  1008.    JMP WRITE
  1009.    PUTC┬UFFER .BUF 1
  1010.  
  1011. GETARG = *
  1012.    STY ZP+1
  1013.    ASL
  1014.    STA ZP+0
  1015.    ROL ZP+1
  1016.    CLC
  1017.    LDA ACE┴RGV+0
  1018.    ADC ZP+0
  1019.    STA ZP+0
  1020.    LDA ACE┴RGV+1
  1021.    ADC ZP+1
  1022.    STA ZP+1
  1023.    LDY #0
  1024.    LDA (ZP),Y
  1025.    TAX
  1026.    INY
  1027.    LDA (ZP),Y
  1028.    STX ZP+0
  1029.    STA ZP+1
  1030.    RTS
  1031.  
  1032. SCAN─IGIT    .BUF 1
  1033. SCAN╙AVE     .BUF 4
  1034. SCAN╘EMP     .BUF 1
  1035. SCAN╔NDEX    .BUF 1
  1036. SCAN┴NYTHING .BUF 1
  1037.  
  1038. SCAN╬UM = *  ;( (ZP)=NUM╙TR, .┘=NUM╔NDEX ) : .┘=SCAN, [SCAN╓AL]=NUM, .├╙=ERR
  1039.    LDX #3
  1040.    LDA #0
  1041. -  STA SCAN╓AL,X
  1042.    DEX
  1043.    BPL -
  1044.    LDA #0
  1045.    STA SCAN┴NYTHING
  1046. -  LDA (ZP),Y
  1047.    CMP #" "
  1048.    BNE SCAN╬UM╬EXT
  1049.    INY
  1050.    BNE -
  1051.    SEC
  1052.    RTS
  1053.  
  1054.    SCAN╬UM╬EXT = *
  1055.    LDA (ZP),Y
  1056.    CMP #"0"
  1057.    BCC +
  1058.    CMP #"9"+1
  1059.    BCC ++
  1060. +  LDA SCAN┴NYTHING
  1061.    BEQ SCAN┼RROR
  1062.    CLC
  1063.    RTS
  1064. +  AND #$0F
  1065.    STA SCAN─IGIT
  1066.    LDA #$FF
  1067.    STA SCAN┴NYTHING
  1068.    ;** TIMES TEN
  1069.    STY SCAN╘EMP
  1070.    LDX #3
  1071. -  LDA SCAN╓AL,X
  1072.    STA SCAN╙AVE,X
  1073.    DEX
  1074.    BPL -
  1075.    LDA #2
  1076.    STA SCAN╔NDEX
  1077. -  CLC
  1078.    LDY #4
  1079.    LDX #0
  1080. -  ROL SCAN╓AL,X
  1081.    INX
  1082.    DEY
  1083.    BNE -
  1084.    BCS SCAN┼RROR
  1085.    DEC SCAN╔NDEX
  1086.    BNE --
  1087.    CLC
  1088.    LDY #4
  1089.    LDX #0
  1090. -  LDA SCAN╓AL,X
  1091.    ADC SCAN╙AVE,X
  1092.    STA SCAN╓AL,X
  1093.    INX
  1094.    DEY
  1095.    BNE -
  1096.    BCS SCAN┼RROR
  1097.    CLC
  1098.    LDY #4
  1099.    LDX #0
  1100. -  ROL SCAN╓AL,X
  1101.    INX
  1102.    DEY
  1103.    BNE -
  1104.    BCS SCAN┼RROR
  1105.    CLC
  1106.    LDY #4
  1107.    LDX #0
  1108.    LDA SCAN─IGIT
  1109. -  ADC SCAN╓AL,X
  1110.    STA SCAN╓AL,X
  1111.    LDA #0
  1112.    INX
  1113.    DEY
  1114.    BNE -
  1115.    BCS SCAN┼RROR
  1116.  
  1117.    LDY SCAN╘EMP
  1118.    INY
  1119.    BEQ SCAN┼RROR
  1120.    JMP SCAN╬UM╬EXT
  1121.  
  1122.    SCAN┼RROR = *
  1123.    SEC
  1124.    RTS
  1125.    
  1126. OPEN╧V═ODE .BUF 1
  1127. OPEN╧VERWRITE = *  ;( (ZP)=NAME, .┴=MODE ) : .┴=╞CB, .├╙=ERR
  1128.    STA OPEN╧V═ODE
  1129.    JSR OPEN
  1130.    BCS +
  1131.    RTS
  1132. +  LDA ERRNO
  1133.    CMP #ACE┼RR╞ILE┼XISTS
  1134.    BEQ +
  1135. -  SEC
  1136.    RTS
  1137. +  JSR REMOVE
  1138.    LDA OPEN╧V═ODE
  1139.    JSR OPEN
  1140.    BCS -
  1141.    RTS
  1142.  
  1143. ;===BSS===
  1144.  
  1145. BSS = *
  1146. OUT┬UF     = BSS
  1147. IN├HUNK    = OUT┬UF+MAX╠INE+1
  1148. BASE64├HAR = IN├HUNK+MAX├HUNK+5
  1149. NUMBUF     = BASE64├HAR+64
  1150. IN┬UF      = NUMBUF+12
  1151. BSS┼ND     = IN┬UF+64
  1152.