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

  1. UNBCODE = *
  2.    ;** OPEN FILE
  3.    LDA NAME+0
  4.    LDY NAME+1
  5.    STA ZP+0
  6.    STY ZP+1
  7.    LDA #"R"
  8.    JSR OPEN
  9.    BCC +
  10.    RTS
  11. +  STA INFILE
  12.    ;** DECODE FILE
  13.    JSR UNBCODE┬ODY
  14.    ;** CLOSE FILE
  15.    LDA INFILE
  16.    JSR CLOSE
  17.    RTS
  18.  
  19. UNBCODE┬ODY = *
  20.    LDA #0
  21.    STA BUF├OUNT+0
  22.    STA BUF├OUNT+1
  23.    STA HIT╠AST╠INE
  24.    STA LAST╠INE╘ERMINATOR
  25.  
  26.    ;** SEARCH FOR "BEGIN" LINE
  27.    SEARCH╠INE = *
  28.    JSR GETLINE
  29.    BCC +
  30.    CLC
  31.    RTS
  32. +  LDA IN╠INE
  33.    CMP #"-"
  34.    BNE SEARCH╠INE
  35.    JSR CHECK╙TOP
  36.    LDX #0
  37.    LDA IN╠INE+2
  38.    CMP #"B"
  39.    BEQ +
  40.    LDX #ASCII┬EGIN-PETSCII┬EGIN
  41. +  LDY #0
  42. -  LDA IN╠INE,Y
  43.    CMP PETSCII┬EGIN,X
  44.    BNE SEARCH╠INE
  45.    INX
  46.    INY
  47.    CPY #ASCII┬EGIN-PETSCII┬EGIN
  48.    BCC -
  49.    LDY #0
  50.    CPX #ASCII┬EGIN-PETSCII┬EGIN+1
  51.    BCC +
  52.    LDY #$FF
  53. +  STY ASCII╞ILE
  54.    JMP PROCESS┬EGIN
  55.  
  56.    PETSCII┬EGIN = *
  57.    .ASC "--BCODE-BEGIN "
  58.    ASCII┬EGIN = *
  59.    .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$62,$65,$67,$69,$6E,$20
  60.    
  61.    ;** PROCESS "BEGIN" LINE
  62.    PROCESS┬EGIN = *
  63.    ;** EXTRACT THE SEGMENT NUMBER
  64.    LDY #14
  65.    JSR SCAN╬UM
  66.    BCC +
  67.    JMP BEGIN┼RROR
  68. +  INY
  69.    LDA SCAN╓AL+2
  70.    ORA SCAN╓AL+3
  71.    BEQ +
  72.    LDA #<SEG╘OO┬IG═SG
  73.    LDY #>SEG╘OO┬IG═SG
  74.    JSR EPUTS
  75.    JMP SEARCH╠INE
  76. +  LDA SCAN╓AL+0
  77.    LDX SCAN╓AL+1
  78.    STA SEGNUM+0
  79.    STX SEGNUM+1
  80.    LDA #0
  81.    STA SEGNUM+2
  82.    STA SEGNUM+3
  83.    LDA SEGNUM+0
  84.    ORA SEGNUM+1
  85.    BNE +
  86.    JMP BEGIN┼RROR
  87.  
  88.    ;** EXTRACT FILENAME, TRUNC TO 16 CHARS
  89. +  CLC
  90.    TYA
  91.    ADC #<IN╠INE
  92.    STA OUT╬AME+0
  93.    LDA #>IN╠INE
  94.    ADC #0
  95.    STA OUT╬AME+1
  96.    LDY #16
  97.    LDA #0
  98.    STA (OUT╬AME),Y
  99.    JSR MAKE╨ETSCII╬AME
  100.    JSR ECHO┼XTRACT╬AME
  101.  
  102.    ;** OPEN OUTPUT FILE
  103.    JSR GET╘EMP╞ILE
  104.    BCC +
  105.    JMP SEARCH╠INE
  106.  
  107.    ;** READ BCODED DATA
  108. +  JSR BUILD─ECODE╘ABLE
  109.    JSR CRC╔NIT
  110. -  JSR GETLINE
  111.    BCS UNEXPECTED┼OF
  112.    JSR CONVERT╠INE
  113.    BCC +
  114.    ;** CHECK IF SEGMENT-END LINE
  115.    LDA IN╠INE
  116.    CMP #"-"
  117.    BEQ FINISH╞ILE
  118.    ;** REPORT INVALID CHARACTERS
  119.    LDA #<BAD├HARS═SG
  120.    LDY #>BAD├HARS═SG
  121.    JSR EPUTS
  122.    JMP -
  123. +  JSR CRUNCH╠INE
  124.    JSR CRC╠INE
  125.    JSR WRITE╠INE
  126.    JMP -
  127.  
  128.    ;** FINISH WITH FILE
  129.    FINISH╞ILE = *
  130.    LDA OUTFILE
  131.    JSR CLOSE
  132.    JSR CRC╞INISH
  133.    JSR PROCESS╞INISH
  134.    ;** PROCESS FOR ANOTHER FILE
  135.    JMP SEARCH╠INE
  136.  
  137. UNEXPECTED┼OF = *
  138.    LDA #<UNEX┼OF═SG
  139.    LDY #>UNEX┼OF═SG
  140.    JSR EPUTS
  141.    LDA OUTFILE
  142.    JSR CLOSE
  143.    JSR DISCARD╙EGMENT
  144.    SEC
  145.    RTS
  146.  
  147. UNEX┼OF═SG = *
  148.    .ASC "UNEXPECTED ┼╧╞, IGNORING SEGMENT."
  149.    .BYTE CHR├╥,0
  150.  
  151. SEG╘OO┬IG═SG = *
  152.    .ASC "SEGMENT NUMBER IS LARGER THAN 65535, IGNORING SEGMENT."
  153.    .BYTE CHR├╥,0
  154.  
  155. BAD├HARS═SG = *
  156.    .ASC "WARNING: BAD CHARACTERS ON LINE, IGNORING LINE."
  157.    .BYTE CHR├╥,0
  158.  
  159. MAKE╨ETSCII╬AME = *
  160.    BIT ASCII╞ILE
  161.    BMI +
  162.    RTS
  163. +  LDY #0
  164. -  LDA (OUT╬AME),Y
  165.    BEQ +
  166.    JSR CONV┴SC2╨ET
  167.    STA (OUT╬AME),Y
  168.    INY
  169.    BNE -
  170. +  RTS
  171.  
  172. CONV┴SC2╨ET = *
  173.    AND #$7F
  174.    CMP #$60
  175.    BCC +
  176.    CLC
  177.    ADC #$C0-$60
  178. +  TAX
  179.    AND #$7F
  180.    CMP #"A"
  181.    BCS +
  182. -  TXA
  183.    RTS
  184. +  CMP #"Z"+1
  185.    BCS -
  186.    TXA
  187.    EOR #$80
  188.    RTS
  189.  
  190. ECHO┼XTRACT╬AME = *
  191.    LDA #<ECHO┼XTRACT═SG1
  192.    LDY #>ECHO┼XTRACT═SG1
  193.    JSR EPUTS
  194.    LDA #<NUMBUF
  195.    LDY #>NUMBUF
  196.    STA ZP+0
  197.    STY ZP+1
  198.    LDA #1
  199.    LDX #SEGNUM
  200.    JSR UTOA
  201.    LDA #<NUMBUF
  202.    LDY #>NUMBUF
  203.    JSR EPUTS
  204.    LDA #<ECHO┼XTRACT═SG2
  205.    LDY #>ECHO┼XTRACT═SG2
  206.    JSR EPUTS
  207.    LDA OUT╬AME+0
  208.    LDY OUT╬AME+1
  209.    JSR EPUTS
  210.    LDA #<ECHO┼XTRACT═SG3
  211.    LDY #>ECHO┼XTRACT═SG3
  212.    JMP EPUTS
  213.  
  214. ECHO┼XTRACT═SG1 = *
  215.    .ASC "EXTRACTING SEG "
  216.    .BYTE 0
  217. ECHO┼XTRACT═SG2 = *
  218.    .ASC " OF "
  219.    .BYTE CHR╤UOTE,0
  220. ECHO┼XTRACT═SG3 = *
  221.    .BYTE CHR╤UOTE,CHR├╥,0
  222. NUMBUF .BUF 12
  223.  
  224. REPORT╧PEN┼RROR = *
  225.    LDA ZP+0
  226.    LDY ZP+1
  227.    JSR EPUTS
  228.    LDA #<REPORT╧PEN┼RROR═SG
  229.    LDY #>REPORT╧PEN┼RROR═SG
  230.    JSR EPUTS
  231.    RTS
  232.  
  233.    REPORT╧PEN┼RROR═SG = *
  234.    .ASC ": CANNOT OPEN, CONTINUING"
  235.    .BYTE CHR├╥,0
  236.  
  237. SCAN─IGIT .BUF 1
  238. SCAN╙AVE .BUF 4
  239. SCAN╘EMP .BUF 1
  240. SCAN╔NDEX .BUF 1
  241. SCAN┴NYTHING .BUF 1
  242.  
  243. SCAN╬UM = *  ;( .┘=IN╠INE╔NDEX ) : .┘=SCAN, [SCAN╓AL]=NUM, .├╙=ERR
  244.    LDX #3
  245.    LDA #0
  246. -  STA SCAN╓AL,X
  247.    DEX
  248.    BPL -
  249.    LDA #0
  250.    STA SCAN┴NYTHING
  251. -  LDA IN╠INE,Y
  252.    CMP #" "
  253.    BNE SCAN╬UM╬EXT
  254.    INY
  255.    BNE -
  256.    SEC
  257.    RTS
  258.  
  259.    SCAN╬UM╬EXT = *
  260.    LDA IN╠INE,Y
  261.    CMP #"0"
  262.    BCC +
  263.    CMP #"9"+1
  264.    BCC ++
  265. +  LDA SCAN┴NYTHING
  266.    BEQ SCAN┼RROR
  267.    CLC
  268.    RTS
  269. +  AND #$0F
  270.    STA SCAN─IGIT
  271.    LDA #$FF
  272.    STA SCAN┴NYTHING
  273.    ;** TIMES TEN
  274.    STY SCAN╘EMP
  275.    LDX #3
  276. -  LDA SCAN╓AL,X
  277.    STA SCAN╙AVE,X
  278.    DEX
  279.    BPL -
  280.    LDA #2
  281.    STA SCAN╔NDEX
  282. -  CLC
  283.    LDY #4
  284.    LDX #0
  285. -  ROL SCAN╓AL,X
  286.    INX
  287.    DEY
  288.    BNE -
  289.    BCS SCAN┼RROR
  290.    DEC SCAN╔NDEX
  291.    BNE --
  292.    CLC
  293.    LDY #4
  294.    LDX #0
  295. -  LDA SCAN╓AL,X
  296.    ADC SCAN╙AVE,X
  297.    STA SCAN╓AL,X
  298.    INX
  299.    DEY
  300.    BNE -
  301.    BCS SCAN┼RROR
  302.    CLC
  303.    LDY #4
  304.    LDX #0
  305. -  ROL SCAN╓AL,X
  306.    INX
  307.    DEY
  308.    BNE -
  309.    BCS SCAN┼RROR
  310.    CLC
  311.    LDY #4
  312.    LDX #0
  313.    LDA SCAN─IGIT
  314. -  ADC SCAN╓AL,X
  315.    STA SCAN╓AL,X
  316.    LDA #0
  317.    INX
  318.    DEY
  319.    BNE -
  320.    BCS SCAN┼RROR
  321.  
  322.    LDY SCAN╘EMP
  323.    INY
  324.    BEQ SCAN┼RROR
  325.    JMP SCAN╬UM╬EXT
  326.  
  327.    SCAN┼RROR = *
  328.    SEC
  329.    RTS
  330.    
  331. BEGIN┼RROR = *
  332.    LDA #<BEGIN┼RROR═SG
  333.    LDY #>BEGIN┼RROR═SG
  334.    JSR EPUTS
  335.    JMP SEARCH╠INE
  336.  
  337. BEGIN┼RROR═SG = *
  338.    .ASC "INVALID --BCODE-BEGIN LINE FORMAT, IGNORING SEGMENT"
  339.    .BYTE CHR├╥,0
  340.  
  341. CONVERT╨ADS .BUF 1
  342. CONVERT├HARS .BUF 1
  343.  
  344. CONVERT╠INE = *
  345.    LDX #0
  346.    STX CONVERT╨ADS
  347. -  LDA IN╠INE,X
  348.    BNE +
  349.    STX CONVERT├HARS
  350.    CLC
  351.    RTS
  352. +  CMP #"="
  353.    BNE +
  354.    INC CONVERT╨ADS
  355. +  TAY
  356.    LDA DECODE╘ABLE,Y
  357.    BMI +
  358.    STA IN╠INE,X
  359.    INX
  360.    BNE -
  361. +  SEC
  362.    RTS
  363.  
  364. CRUNCH┬YTES .BUF 1
  365.  
  366. CRUNCH╠INE = *
  367.    LDX #0
  368.    LDY #0
  369. -  JSR CRUNCH╤UANTUM
  370.    CPX CONVERT├HARS
  371.    BCC -
  372.    TYA
  373.    SEC
  374.    SBC CONVERT╨ADS
  375.    STA CRUNCH┬YTES
  376.    RTS
  377.  
  378. ;POS  76543210  76543210  76543210  76543210
  379. ;BYT  XX111111  XX112222  XX222233  XX333333
  380. ;BIT    765432    107654    321076    543210
  381.  
  382. CRUNCH╤UANTUM = * ;(.╪=╔N4BYTES╧FFSET, .┘=╧UT3BYTES╧FFSET) : .╪++, .┘++
  383.    LDA IN╠INE,X  ;*** OUTPUT BYTE 0
  384.    ASL
  385.    ASL
  386.    STA TEMP
  387.    INX
  388.    LDA IN╠INE,X
  389.    LSR
  390.    LSR
  391.    LSR
  392.    LSR
  393.    AND #%00000011
  394.    ORA TEMP
  395.    STA IN╠INE,Y
  396.    INY
  397.    LDA IN╠INE,X  ;*** OUTPUT BYTE 1
  398.    ASL
  399.    ASL
  400.    ASL
  401.    ASL
  402.    STA TEMP
  403.    INX
  404.    LDA IN╠INE,X
  405.    LSR
  406.    LSR
  407.    AND #%00001111
  408.    ORA TEMP
  409.    STA IN╠INE,Y
  410.    INY
  411.    LDA IN╠INE,X  ;*** OUTPUT BYTE 2
  412.    INX
  413.    ROR
  414.    ROR
  415.    ROR
  416.    AND #%11000000
  417.    STA TEMP
  418.    LDA IN╠INE,X
  419.    INX
  420.    AND #%00111111
  421.    ORA TEMP
  422.    STA IN╠INE,Y
  423.    INY
  424.    RTS
  425.  
  426. WRITE╠INE = *
  427.    LDA #<IN╠INE
  428.    LDY #>IN╠INE
  429.    STA ZP+0
  430.    STY ZP+1
  431.    LDA CRUNCH┬YTES
  432.    LDY #0
  433.    LDX OUTFILE
  434.    JSR WRITE
  435.    RTS
  436.  
  437. ;** CRC = 0X╞╞╞╞╞╞╞╞;
  438. ;** WHILE( (C=GETC(FP)) != ┼╧╞ ) █
  439. ;**     CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ (CRC^C) & 0X╞╞ ];
  440. ;** ▌
  441. ;** RETURN( CRC^0X╞╞╞╞╞╞╞╞ );
  442.  
  443. CRC╔NIT = *
  444.    LDX #3
  445. -  LDA #$FF
  446.    STA CRC,X
  447.    LDA #0
  448.    STA BYTES,X
  449.    DEX
  450.    BPL -
  451.    RTS
  452.  
  453. CRC╠INE = *
  454.    LDY #0
  455.    CPY CRUNCH┬YTES
  456.    BCS +
  457. -  LDA IN╠INE,Y         ;.╪ = (CRC^C) & 0X╞╞
  458.    EOR CRC+0
  459.    TAX
  460.    LDA CRC+1            ;CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ .╪ ]
  461.    EOR CRC╘ABLE0,X
  462.    STA CRC+0
  463.    LDA CRC+2
  464.    EOR CRC╘ABLE1,X
  465.    STA CRC+1
  466.    LDA CRC+3
  467.    EOR CRC╘ABLE2,X
  468.    STA CRC+2
  469.    LDA CRC╘ABLE3,X
  470.    STA CRC+3
  471.    INY
  472.    CPY CRUNCH┬YTES
  473.    BCC -
  474. +  CLC
  475.    LDA BYTES+0
  476.    ADC CRUNCH┬YTES
  477.    STA BYTES+0
  478.    BCC +
  479.    INC BYTES+1
  480.    BNE +
  481.    INC BYTES+2
  482.    BNE +
  483.    INC BYTES+3
  484. +  RTS
  485.  
  486. CRC╞INISH = *
  487.    LDX #3
  488. -  LDA CRC,X
  489.    EOR #$FF
  490.    STA CRC,X
  491.    DEX
  492.    BPL -
  493.    RTS
  494.  
  495. HIT╠AST╠INE .BUF 1
  496. LAST╠INE╘ERMINATOR .BUF 1
  497.  
  498. GETLINE = *
  499.    LDA HIT╠AST╠INE
  500.    BEQ +
  501.    SEC
  502.    RTS
  503. +  LDX #0
  504.    STX GETLINE╨OS
  505.  
  506.    ;** TOSS AN ╠╞ THAT FOLLOWS A ├╥
  507.    JSR GET┬YTE
  508.    BCS GETLINE╨ROCESS
  509.    CMP #CHR╠╞
  510.    CLC
  511.    BNE GETLINE╨ROCESS
  512.    LDX LAST╠INE╘ERMINATOR
  513.    CPX #CHR├╥
  514.    CLC
  515.    BNE GETLINE╨ROCESS
  516.  
  517.    GETLINE├HAR = *
  518.    JSR GET┬YTE
  519.    GETLINE╨ROCESS = *
  520.    BCC +
  521.    LDA #$FF
  522.    STA HIT╠AST╠INE
  523.    JMP GETLINE╞INISH
  524. +  CMP #CHR├╥
  525.    BEQ GETLINE╞INISH
  526.    CMP #CHR╠╞
  527.    BEQ GETLINE╞INISH
  528.    LDX GETLINE╨OS
  529.    CPX #98
  530.    BCS +
  531.    STA IN╠INE,X
  532.    INC GETLINE╨OS
  533. +  JMP GETLINE├HAR
  534.  
  535.    GETLINE╞INISH = *
  536.    STA LAST╠INE╘ERMINATOR
  537.    LDX GETLINE╨OS
  538.    LDA #0
  539.    STA IN╠INE,X
  540.    CPX #0
  541.    BEQ +
  542.    CLC
  543.    RTS
  544. +  LDA HIT╠AST╠INE
  545.    CMP #1
  546.    RTS
  547.  
  548. GET┬YTE = *
  549.    LDA BUF├OUNT+0
  550.    ORA BUF├OUNT+1
  551.    BEQ GET┬YTE╞ILL┬UF
  552.    LDY #0
  553.    LDA (BUF╨TR),Y
  554.    INC BUF╨TR+0
  555.    BNE +
  556.    INC BUF╨TR+1
  557. +  LDX BUF├OUNT+0
  558.    BNE +
  559.    DEC BUF├OUNT+1
  560. +  DEC BUF├OUNT+0
  561.    CLC
  562.    RTS
  563.  
  564. GET┬YTE╞ILL┬UF = *
  565.    JSR CHECK╙TOP
  566.    LDA #<IN┬UF
  567.    LDY #>IN┬UF
  568.    STA ZP+0
  569.    STY ZP+1
  570.    STA BUF╨TR+0
  571.    STY BUF╨TR+1
  572.    LDA IN┬UF╠EN+0
  573.    LDY IN┬UF╠EN+1
  574.    LDX INFILE
  575.    JSR READ
  576.    BEQ +
  577.    BCS +
  578.    STA BUF├OUNT+0
  579.    STY BUF├OUNT+1
  580.    JSR CHECK╙TOP
  581.    JMP GET┬YTE
  582. +  SEC
  583.    RTS
  584.  
  585. SET╔NDEX .BUF 1
  586. SET├OUNTDOWN .BUF 1
  587.  
  588. BUILD─ECODE╘ABLE = *
  589.    LDX #0
  590.    LDA #$FF
  591. -  STA DECODE╘ABLE,X
  592.    INX
  593.    BNE -
  594.    LDY #0
  595.    LDX #0
  596.    BIT ASCII╞ILE
  597.    BPL +
  598.    LDX #ASC╘ABLE╙ET-PET╘ABLE╙ET
  599. +  STX SET╔NDEX
  600.    LDA #5
  601.    STA SET├OUNTDOWN
  602. -  LDX SET╔NDEX
  603.    LDA PET╘ABLE╙ET+1,X
  604.    STA TEMP
  605.    LDA PET╘ABLE╙ET+0,X
  606.    INX
  607.    INX
  608.    STX SET╔NDEX
  609.    LDX TEMP
  610.    JSR BUILD╙ET
  611.    DEC SET├OUNTDOWN
  612.    BNE -
  613.    LDA #0
  614.    STA DECODE╘ABLE+$3D
  615.    RTS
  616.  
  617. PET╘ABLE╙ET .ASC "┴┌AZ09++//"
  618. ASC╘ABLE╙ET .BYTE $41,$5A,$61,$7A,$30,$39,$2B,$2B,$2F,$2F
  619.  
  620. SET╠IMIT .BUF 1
  621.  
  622. BUILD╙ET = *
  623.    INX
  624.    STX SET╠IMIT
  625.    TAX
  626. -  TYA
  627.    STA DECODE╘ABLE,X
  628.    INY
  629.    INX
  630.    CPX SET╠IMIT
  631.    BCC -
  632.    RTS
  633.  
  634. PROCESS╞INISH = *  ;PROCESS THE BCODE-END LINE
  635.    LDA #TRUE
  636.    STA IS┼ND
  637.    LDX #ASC┼ND-PET┼ND-1
  638.    BIT ASCII╞ILE
  639.    BPL +
  640.    LDX #PET├ONT-PET┼ND-1
  641. +  LDY #ASC┼ND-PET┼ND-1
  642.    JSR COMPARE╞INISH
  643.    LDY #ASC┼ND-PET┼ND-1
  644.    BCC FIN├HECK╙EGMENT
  645.    LDA #FALSE
  646.    STA IS┼ND
  647.    LDX #ASC├ONT-PET┼ND-1
  648.    BIT ASCII╞ILE
  649.    BPL +
  650.    LDX #ASC├ONT┼ND-PET┼ND-1
  651. +  LDY #ASC├ONT-PET├ONT-1
  652.    JSR COMPARE╞INISH
  653.    LDY #ASC├ONT-PET├ONT
  654.    BCC FIN├HECK╙EGMENT
  655.    LDA #0
  656.    JMP BAD╞INISH
  657.  
  658.    FIN├HECK╙EGMENT = *
  659.    JSR SCAN╬UM
  660.    BCC +
  661. -  LDA #1
  662.    JMP BAD╞INISH
  663. +  LDX #3
  664. -  LDA SCAN╓AL,X
  665.    CMP SEGNUM,X
  666.    BNE --
  667.    DEX
  668.    BPL -
  669.  
  670.    FIN├HECK╙IZE = *
  671.    JSR SCAN╬UM
  672.    BCC +
  673. -  LDA #2
  674.    JMP BAD╞INISH
  675. +  LDX #3
  676. -  LDA SCAN╓AL,X
  677.    CMP BYTES,X
  678.    BNE --
  679.    DEX
  680.    BPL -
  681.    
  682.    FIN├HECK├RC = *
  683.    INY
  684.    JSR SCAN╚EX
  685.    BCC +
  686. -  LDA #3
  687.    JMP BAD╞INISH
  688. +  LDX #3
  689. -  LDA SCAN╓AL,X
  690.    CMP CRC,X
  691.    BNE --
  692.    DEX
  693.    BPL -
  694.    JSR COMMIT╙EGMENT
  695.    BIT DEBUG
  696.    BPL +
  697.    LDX #STDERR
  698.    STX STAT╞CB
  699.    JSR WRITE╙TATUS─ATA
  700. +  JSR CHECK╙TOP
  701.    CLC
  702.    RTS
  703.  
  704. SCAN╚EX = *
  705.    LDX #3
  706. -  LDA IN╠INE,Y
  707.    INY
  708.    JSR HEX╘O┬IN
  709.    BCS +
  710.    ASL
  711.    ASL
  712.    ASL
  713.    ASL
  714.    STA TEMP
  715.    LDA IN╠INE,Y
  716.    INY
  717.    JSR HEX╘O┬IN
  718.    BCS +
  719.    ORA TEMP
  720.    STA SCAN╓AL,X
  721.    DEX
  722.    BPL -
  723.    CLC
  724. +  RTS
  725.  
  726. HEX╘O┬IN╪SAVE .BUF 1
  727.  
  728. HEX╘O┬IN = *
  729.    BIT ASCII╞ILE
  730.    BPL +
  731.    STX HEX╘O┬IN╪SAVE
  732.    JSR CONV┴SC2╨ET
  733.    LDX HEX╘O┬IN╪SAVE
  734. +  CMP #"0"
  735.    BCS +
  736. -  SEC
  737.    RTS
  738. +  CMP #"9"+1
  739.    BCC +
  740.    AND #$7F
  741.    CMP #"A"
  742.    BCC -
  743.    CMP #"F"+1
  744.    BCS -
  745.    SEC
  746.    SBC #"A"-$0A
  747. +  AND #$0F
  748.    CLC
  749.    RTS
  750.  
  751. COMPARE╞INISH = *
  752. -  LDA IN╠INE,Y
  753.    CMP PET┼ND,X
  754.    BNE +
  755.    DEX
  756.    DEY
  757.    BPL -
  758.    CLC
  759.    RTS
  760. +  SEC
  761.    RTS
  762.  
  763. BAD╞INISH = *  ;.┴=ERROR [0=TOKEN,1=SEGMENT,2=SIZE,3=CRC]
  764.    PHA
  765.    LDA NAME+0
  766.    LDY NAME+1
  767.    JSR EPUTS
  768.    PLA
  769.    ASL
  770.    TAX
  771.    LDA BAD╞IN╓EC+1,X
  772.    TAY
  773.    LDA BAD╞IN╓EC+0,X
  774.    JSR EPUTS
  775.    LDA #<BAD╞IN─ISCARD
  776.    LDY #>BAD╞IN─ISCARD
  777.    JSR EPUTS
  778.    JSR DISCARD╙EGMENT
  779.    JSR CHECK╙TOP
  780.    RTS
  781.  
  782. BAD╞IN╓EC = *
  783.    .WORD BAD╞IN╘OKEN,BAD╞IN╙EGMENT,BAD╞IN╙IZE,BAD╞IN├RC
  784. BAD╞IN╘OKEN = *
  785.    .ASC ": INVALID TOKEN ON FINISH LINE"
  786.    .BYTE 0
  787. BAD╞IN╙EGMENT = *
  788.    .ASC ": SEGMENT NUMBER MISMATCH"
  789.    .BYTE 0
  790. BAD╞IN╙IZE = *
  791.    .ASC ": FILE SIZE MISMATCH"
  792.    .BYTE 0
  793. BAD╞IN├RC = *
  794.    .ASC ": ├╥├-32 CHECKSUM MISMATCH"
  795.    .BYTE 0
  796. BAD╞IN─ISCARD = *
  797.    .ASC ", IGNORING SEGMENT"
  798.    .BYTE CHR├╥,0
  799.  
  800. PET┼ND .ASC "--BCODE-END "
  801. ASC┼ND .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$65,$6E,$64,$20
  802.  
  803. PET├ONT .ASC "--BCODE-CONTINUED "
  804. ASC├ONT .BYTE $2D,$2D,$62,$63,$6F,$64,$65,$2D,$63,$6F,$6E,$74,$69,$6E,$75
  805.         .BYTE $65,$64,$20
  806. ASC├ONT┼ND = *
  807.  
  808. GET╘EMP╬AME╙TR = *  ;( TEMP╬AME, .┴=PUT╞ILETYPE ) : TEMP╬AME╙TR, (ZP)
  809.    PHA
  810.    LDA #"0"
  811.    STA TEMP╬AME╙TR+0
  812.    LDA #"┬"
  813.    STA TEMP╬AME╙TR+1
  814.    LDA #"├"
  815.    STA TEMP╬AME╙TR+2
  816.    LDA #<TEMP╬AME╙TR+3
  817.    LDY #>TEMP╬AME╙TR+3
  818.    STA ZP+0
  819.    STY ZP+1
  820.    LDX #TEMP╬AME
  821.    LDA #5
  822.    JSR UTOAZ
  823.    PLA
  824.    CMP #FALSE
  825.    BEQ +
  826.    LDA #","
  827.    STA TEMP╬AME╙TR+3,Y
  828.    LDA #"P"
  829.    STA TEMP╬AME╙TR+4,Y
  830.    LDA #0
  831.    STA TEMP╬AME╙TR+5,Y
  832. +  RTS
  833.  
  834. UTOAZ = *  ;( 0+.╪=VAR32, .┴=WIDTH, (ZP)=STORE )
  835.    JSR UTOA
  836.    LDY #0
  837. -  LDA (ZP),Y
  838.    BEQ ++
  839.    CMP #" "
  840.    BNE +
  841.    LDA #"0"
  842.    STA (ZP),Y
  843. +  INY
  844.    BNE -
  845. +  RTS
  846.  
  847. FILE═ODE .BUF 1
  848.  
  849. GET╘EMP╞ILE = *  ;( OUT╬AME, SEGNUM ) : CUR╚AVE, CUR╚AVE╬UM, OUTFILE, .├╙=ERR
  850.    ;** SEARCH TO APPEND TO EXISTING FILE
  851.    LDA #255
  852.    STA CUR╚AVE
  853.  
  854.    CHECK╬EXT = *
  855.    INC CUR╚AVE
  856.    LDA CUR╚AVE
  857.    CMP HAVE├OUNT
  858.    BCC +
  859.    JMP CANNOT┴PPEND
  860. +  JSR GET╚
  861.    JSR CMP╧UT╬AME╚
  862.    CMP #0
  863.    BNE CHECK╬EXT
  864.    LDY #HR╞ROM╙EG
  865.    LDA SEGNUM+0
  866.    CMP (H),Y
  867.    LDA SEGNUM+1
  868.    INY
  869.    SBC (H),Y
  870.    BCC +
  871.    LDY #HR╘O╙EG
  872.    LDA (H),Y
  873.    CMP SEGNUM+0
  874.    INY
  875.    LDA (H),Y
  876.    SBC SEGNUM+1
  877.    BCC +
  878.    LDA #<IGNORE─UP═SG
  879.    LDY #>IGNORE─UP═SG
  880.    JSR EPUTS
  881.    SEC
  882.    RTS
  883.    IGNORE─UP═SG = *
  884.    .ASC "IGNORING DUPLICATE SEGMENT"
  885.    .BYTE CHR├╥,0
  886.  
  887. +  LDY #HR╘O╙EG
  888.    LDA (H),Y
  889.    TAX
  890.    INY
  891.    LDA (H),Y
  892.    TAY
  893.    INX
  894.    BNE +
  895.    INY
  896. +  CPX SEGNUM+0
  897.    BNE +
  898.    CPY SEGNUM+1
  899.    BEQ CAN┴PPEND
  900. +  JMP CHECK╬EXT
  901.  
  902.    ;** HERE WE KNOW WE CAN APPEND TO AN EXISTING TEMP FILE
  903.    CAN┴PPEND = *
  904.    LDA #"A"
  905.    STA FILE═ODE
  906.    LDY #HR╘EMP╞ILE╬AME
  907.    LDA (H),Y
  908.    STA TEMP╬AME+0
  909.    INY
  910.    LDA (H),Y
  911.    STA TEMP╬AME+1
  912.    LDY #HR╘O╙EG
  913.    LDA SEGNUM+0
  914.    STA (H),Y
  915.    INY
  916.    LDA SEGNUM+1
  917.    STA (H),Y
  918.    LDY #HR╔S┼ND
  919.    LDA #FALSE
  920.    STA (H),Y
  921.    JMP OPEN╘EMP╞ILE
  922.  
  923.    ;** CANNOT APPEND
  924.    CANNOT┴PPEND = *
  925.    JSR GET╘EMP╞ILE╬AME╧NLY
  926.  
  927.    ;** CREATE NEW HAVE RECORD
  928.    CREATE╬EW╚AVE╥EC = *
  929.    JSR INSERT╚AVE╥EC
  930.    BCS +
  931.    LDA #"W"
  932.    STA FILE═ODE
  933.    JMP OPEN╘EMP╞ILE
  934. +  LDA #<HAVE╧VER═SG
  935.    LDY #>HAVE╧VER═SG
  936.    JSR EPUTS
  937.    SEC
  938.    RTS
  939.    HAVE╧VER═SG = *
  940.    .ASC "FRAGMENT TABLE FULL, IGNORING CURRENT SEGMENT"
  941.    .BYTE CHR├╥,0
  942.  
  943.    ;** OPEN TEMPORARY FILE
  944.    OPEN╘EMP╞ILE = *
  945.    LDA #TRUE
  946.    JSR GET╘EMP╬AME╙TR
  947.    LDA #<TEMP╬AME╙TR
  948.    LDY #>TEMP╬AME╙TR
  949.    STA ZP+0
  950.    STY ZP+1
  951.    LDA FILE═ODE
  952.    JSR OPEN╧VERWRITE
  953.    BCS +
  954.    STA OUTFILE
  955.    CLC
  956.    RTS
  957. +  LDA #<TEMP╬AME╙TR
  958.    LDY #>TEMP╬AME╙TR
  959.    JSR EPUTS
  960.    LDA #<OPEN┼RR═SG
  961.    LDY #>OPEN┼RR═SG
  962.    JSR EPUTS
  963.    SEC
  964.    RTS
  965.    OPEN┼RR═SG = *
  966.    .ASC ": CANNOT OPEN, IGNORING SEGMENT"
  967.    .BYTE CHR├╥,0
  968.  
  969. GET╘EMP╞ILE╬AME╧NLY = *  ;( NEXT╘EMP╬AME ) : TEMP╬AME
  970.    LDA NEXT╘EMP╬AME+0
  971.    LDY NEXT╘EMP╬AME+1
  972.    STA TEMP╬AME+0
  973.    STY TEMP╬AME+1
  974.    INC NEXT╘EMP╬AME+0
  975.    BNE +
  976.    INC NEXT╘EMP╬AME+1
  977. +  LDA #0
  978.    STA WORK
  979. -  CMP HAVE├OUNT
  980.    BCC +
  981.    RTS
  982. +  LDA WORK
  983.    JSR GET╚
  984.    LDY #HR╘EMP╞ILE╬AME
  985.    LDA (H),Y
  986.    CMP TEMP╬AME+0
  987.    BNE +
  988.    INY
  989.    LDA (H),Y
  990.    CMP TEMP╬AME+1
  991.    BNE +
  992.    JMP GET╘EMP╞ILE╬AME╧NLY
  993. +  INC WORK
  994.    LDA WORK
  995.    JMP -
  996.  
  997. GET╚ = *  ;( .┴=HAVE╥EC╬UM ) : H
  998.    LDX #0
  999.    STX H+1
  1000.    LDX #5
  1001. -  ASL
  1002.    ROL H+1
  1003.    DEX
  1004.    BNE -
  1005.    CLC
  1006.    ADC #<HAVES
  1007.    STA H+0
  1008.    LDA H+1
  1009.    ADC #>HAVES
  1010.    STA H+1
  1011.    RTS
  1012.  
  1013. GET╬EXT╚ = *  ;( H ) : NEXT╚
  1014.    CLC
  1015.    LDA H+0
  1016.    ADC #HR╙IZE
  1017.    STA NEXT╚+0
  1018.    LDA H+1
  1019.    ADC #0
  1020.    STA NEXT╚+1
  1021.    RTS
  1022.  
  1023. CMP╧UT╬AME╚ = *  ;( (OUT╬AME)=STR1, (H)=HREC ) : .┴=CMP╥ESULT[0=┼╤,1=╟╘,-1=╠╘]
  1024.    LDA H+0
  1025.    LDY H+1
  1026.    CLC
  1027.    ADC #HR╞ILENAME
  1028.    BCC +
  1029.    INY
  1030. +  STA WORK+0
  1031.    STY WORK+1
  1032.    LDY #255
  1033. -  INY
  1034.    LDA (OUT╬AME),Y
  1035.    CMP (WORK),Y
  1036.    BNE +
  1037.    CMP #0
  1038.    BNE -
  1039.    LDA #0
  1040.    RTS
  1041. +  BCC +
  1042.    LDA #1
  1043.    RTS
  1044. +  LDA #$FF
  1045.    RTS
  1046.  
  1047. INSERT╚AVE╥EC = *  ;( SEGNUM, TEMP╬AME, OUT╬AME ) : CUR╚AVE
  1048.    ;** ALLOCATE NEW RECORD
  1049.    LDA HAVE├OUNT
  1050.    CMP #MAX╚AVE
  1051.    BCC +
  1052.    RTS
  1053. +  STA CUR╚AVE
  1054.    INC HAVE├OUNT
  1055.  
  1056.    ;** FIND CORRECT POSITION FOR NEW RECORD
  1057. -  DEC CUR╚AVE
  1058.    LDA CUR╚AVE
  1059.    CMP #$FF
  1060.    BEQ INSERT╚AVE╥EC╔NIT
  1061.    JSR GET╚
  1062.    JSR CMP╧UT╬AME╚
  1063.    CMP #1
  1064.    BEQ INSERT╚AVE╥EC╔NIT
  1065.    CMP #0
  1066.    BNE +
  1067.    LDY #HR╞ROM╙EG
  1068.    LDA (H),Y
  1069.    CMP SEGNUM+0
  1070.    INY
  1071.    LDA (H),Y
  1072.    SBC SEGNUM+1
  1073.    BCC INSERT╚AVE╥EC╔NIT
  1074. +  JSR GET╬EXT╚
  1075.    LDY #HR╙IZE-1
  1076. -  LDA (H),Y
  1077.    STA (NEXT╚),Y
  1078.    DEY
  1079.    BPL -
  1080.    JMP --
  1081.  
  1082.    ;** INITIALIZE RECORD
  1083.    INSERT╚AVE╥EC╔NIT = *
  1084.    INC CUR╚AVE
  1085.    LDX #HR╙IZE-1
  1086.    LDA #0
  1087. -  STA TEMP╚AVE╥EC,X
  1088.    DEX
  1089.    BPL -
  1090.    LDA SEGNUM+0
  1091.    LDY SEGNUM+1
  1092.    STA TEMP╚AVE╥EC+HR╞ROM╙EG+0
  1093.    STY TEMP╚AVE╥EC+HR╞ROM╙EG+1
  1094.    STA TEMP╚AVE╥EC+HR╘O╙EG+0
  1095.    STY TEMP╚AVE╥EC+HR╘O╙EG+1
  1096.    LDA #FALSE
  1097.    STA TEMP╚AVE╥EC+HR╔S┼ND
  1098.    LDA TEMP╬AME+0
  1099.    LDY TEMP╬AME+1
  1100.    STA TEMP╚AVE╥EC+HR╘EMP╞ILE╬AME+0
  1101.    STY TEMP╚AVE╥EC+HR╘EMP╞ILE╬AME+1
  1102.    LDY #0
  1103. -  LDA (OUT╬AME),Y
  1104.    STA TEMP╚AVE╥EC+HR╞ILENAME,Y
  1105.    BEQ +
  1106.    INY
  1107.    CPY #16
  1108.    BCC -
  1109. +  LDA CUR╚AVE
  1110.    JSR GET╚
  1111.    LDY #HR╙IZE-1
  1112. -  LDA TEMP╚AVE╥EC,Y
  1113.    STA (H),Y
  1114.    DEY
  1115.    BPL -
  1116.    CLC
  1117.    RTS
  1118.  
  1119. WRITE╬UM5 = *  ;( 0+.╪=NUM16 )
  1120.    LDA 0,X
  1121.    STA WORK+12
  1122.    LDA 1,X
  1123.    STA WORK+13
  1124.    LDA #0
  1125.    STA WORK+14
  1126.    STA WORK+15
  1127.    LDX #WORK+12
  1128.    LDA #5
  1129.    JMP WRITE╬UM
  1130.  
  1131. WRITE╬UM10 = *  ;( 0+.╪=NUM32 )
  1132.    LDA #10
  1133. WRITE╬UM = *
  1134.    PHA
  1135.    LDA #<NUMBUF
  1136.    LDY #>NUMBUF
  1137.    STA ZP+0
  1138.    STY ZP+1
  1139.    PLA
  1140.    JSR UTOAZ
  1141.    LDA #<NUMBUF
  1142.    LDY #>NUMBUF
  1143.    LDX STAT╞CB
  1144.    JSR FPUTS
  1145.    JSR WRITE╙PACES
  1146.    RTS
  1147.  
  1148. WRITE╙PACES = *
  1149.    LDA #<SPACES═SG
  1150.    LDY #>SPACES═SG
  1151.    LDX STAT╞CB
  1152.    JSR FPUTS
  1153.    RTS
  1154.    SPACES═SG = *
  1155.    .BYTE $20,$20,0
  1156.  
  1157. COMMIT╙EGMENT = *
  1158.    ;** ADD BYTE LENGTH, UPDATE ╔S┼ND FLAG IN HAVEREC
  1159.    LDA CUR╚AVE
  1160.    JSR GET╚
  1161.    LDX #4
  1162.    LDY #HR╓ALID╠ENGTH
  1163.    CLC
  1164. -  LDA (H),Y
  1165.    ADC BYTES-HR╓ALID╠ENGTH,Y
  1166.    STA (H),Y
  1167.    INY
  1168.    DEX
  1169.    BNE -
  1170.    LDY #HR╔S┼ND
  1171.    LDA IS┼ND
  1172.    STA (H),Y
  1173.    JSR CHECK├OALESCE
  1174.    JSR CHECK├OMPLETE
  1175.    RTS
  1176.  
  1177. CHECK╞ILENAME╨TR .BUF 2
  1178.  
  1179. CHECK├OMPLETE = *
  1180.    LDA CUR╚AVE
  1181.    JSR GET╚
  1182.    LDY #HR╔S┼ND
  1183.    LDA (H),Y
  1184.    BNE +
  1185. -  RTS
  1186. +  LDY #HR╞ROM╙EG
  1187.    LDA (H),Y
  1188.    CMP #1
  1189.    BNE -
  1190.    INY
  1191.    LDA (H),Y
  1192.    BNE -
  1193.    JSR FETCH╘EMP╬AME
  1194.    LDA #FALSE
  1195.    JSR GET╘EMP╬AME╙TR
  1196.    LDA #<TEMP╬AME╙TR
  1197.    LDY #>TEMP╬AME╙TR
  1198.    STA ZP+0
  1199.    STY ZP+1
  1200.    LDA H+0
  1201.    LDY H+1
  1202.    CLC
  1203.    ADC #HR╞ILENAME
  1204.    BCC +
  1205.    INY
  1206. +  STA ZW+0
  1207.    STY ZW+1
  1208.    STA CHECK╞ILENAME╨TR+0
  1209.    STY CHECK╞ILENAME╨TR+1
  1210.    JSR RENAME╧VERWRITE
  1211.    LDA #<COMPLETE═SG1
  1212.    LDY #>COMPLETE═SG1
  1213.    JSR EPUTS
  1214.    LDA CHECK╞ILENAME╨TR+0
  1215.    LDY CHECK╞ILENAME╨TR+1
  1216.    JSR EPUTS
  1217.    LDA #<COMPLETE═SG2
  1218.    LDY #>COMPLETE═SG2
  1219.    JSR EPUTS
  1220.    LDA CUR╚AVE
  1221.    JSR REMOVE╚AVE╥EC
  1222.    RTS
  1223.  
  1224. COMPLETE═SG1 = *
  1225.    .ASC "--╥EASSEMBLED "
  1226.    .BYTE CHR╤UOTE,0
  1227. COMPLETE═SG2 = *
  1228.    .BYTE CHR╤UOTE,CHR├╥,0
  1229.  
  1230. REMOVE╚AVE╥EC = *  ;( .┴=HAVE╥EC )
  1231.    DEC HAVE├OUNT
  1232.    STA HAVE╥EC
  1233. -  LDA HAVE╥EC
  1234.    CMP HAVE├OUNT
  1235.    BCC +
  1236.    RTS
  1237. +  LDA HAVE╥EC
  1238.    JSR GET╚
  1239.    JSR GET╬EXT╚
  1240.    LDY #HR╙IZE-1
  1241. -  LDA (NEXT╚),Y
  1242.    STA (H),Y
  1243.    DEY
  1244.    BPL -
  1245.    INC HAVE╥EC
  1246.    JMP --
  1247.  
  1248. CHECK╞ROM╨LUS1 .BUF 2
  1249.  
  1250. CHECK├OALESCE = *  ;( CUR╚AVE )
  1251.    LDX CUR╚AVE
  1252.    INX
  1253.    CPX HAVE├OUNT
  1254.    BCC +
  1255. -  RTS
  1256. +  LDA CUR╚AVE
  1257.    JSR GET╚
  1258.    JSR GET╬EXT╚
  1259.    CLC
  1260.    LDA NEXT╚+0
  1261.    ADC #HR╞ILENAME
  1262.    STA OUT╬AME+0
  1263.    LDA NEXT╚+1
  1264.    ADC #0
  1265.    STA OUT╬AME+1
  1266.    JSR CMP╧UT╬AME╚
  1267.    CMP #0
  1268.    BNE -
  1269.    LDY #HR╘O╙EG
  1270.    CLC
  1271.    LDA (H),Y
  1272.    ADC #1
  1273.    STA CHECK╞ROM╨LUS1+0
  1274.    INY
  1275.    LDA (H),Y
  1276.    ADC #0
  1277.    STA CHECK╞ROM╨LUS1+1
  1278.    LDY #HR╞ROM╙EG
  1279.    LDA (NEXT╚),Y
  1280.    CMP CHECK╞ROM╨LUS1+0
  1281.    BNE -
  1282.    INY
  1283.    LDA (NEXT╚),Y
  1284.    CMP CHECK╞ROM╨LUS1+1
  1285.    BNE -
  1286.  
  1287.    LDA #<COALESCE═SG1
  1288.    LDY #>COALESCE═SG1
  1289.    JSR EPUTS
  1290.    LDA H+0
  1291.    LDY H+1
  1292.    JSR EPUT╥ANGE
  1293.    LDA #","
  1294.    JSR EPUTCHAR
  1295.    LDA #" "
  1296.    JSR EPUTCHAR
  1297.    LDA NEXT╚+0
  1298.    LDY NEXT╚+1
  1299.    JSR EPUT╥ANGE
  1300.    LDA #<COALESCE═SG2
  1301.    LDY #>COALESCE═SG2
  1302.    JSR EPUTS
  1303.    CLC
  1304.    LDA H+0
  1305.    ADC #HR╞ILENAME
  1306.    LDY H+1
  1307.    BCC +
  1308.    INY
  1309. +  JSR EPUTS
  1310.    LDA #CHR╤UOTE
  1311.    JSR EPUTCHAR
  1312.    LDA #CHR├╥
  1313.    JSR EPUTCHAR
  1314.  
  1315.    LDX CUR╚AVE
  1316.    INX
  1317.    LDA #"R"
  1318.    JSR OPEN╘EMP
  1319.    BCC +
  1320.    RTS
  1321. +  STA FIN
  1322.    LDX CUR╚AVE
  1323.    LDA #"A"
  1324.    JSR OPEN╘EMP
  1325.    BCC +
  1326.    LDA FIN
  1327.    JSR CLOSE
  1328. +  STA FOUT
  1329.    LDA CUR╚AVE
  1330.    JSR GET╚
  1331.    JSR GET╬EXT╚
  1332.    LDY #HR╓ALID╠ENGTH+3
  1333.    LDX #3
  1334. -  LDA (NEXT╚),Y
  1335.    STA BYTES,X
  1336.    DEY
  1337.    DEX
  1338.    BPL -
  1339.    JSR COPY╞ILE
  1340.    LDA FOUT
  1341.    JSR CLOSE
  1342.    LDA FIN
  1343.    JSR CLOSE
  1344.    LDY #HR╔S┼ND
  1345.    LDA (NEXT╚),Y
  1346.    STA (H),Y
  1347.    LDY #HR╘O╙EG
  1348.    LDA (NEXT╚),Y
  1349.    STA (H),Y
  1350.    INY
  1351.    LDA (NEXT╚),Y
  1352.    STA (H),Y
  1353.    LDX #4
  1354.    LDY #HR╓ALID╠ENGTH
  1355.    CLC
  1356. -  LDA (H),Y
  1357.    ADC (NEXT╚),Y
  1358.    STA (H),Y
  1359.    INY
  1360.    DEX
  1361.    BNE -
  1362.    LDA CUR╚AVE
  1363.    CLC
  1364.    ADC #1
  1365.    JSR GET╚
  1366.    JSR FETCH╘EMP╬AME
  1367.    LDA #FALSE
  1368.    JSR GET╘EMP╬AME╙TR
  1369.    LDA #<TEMP╬AME╙TR
  1370.    LDY #>TEMP╬AME╙TR
  1371.    STA ZP+0
  1372.    STY ZP+1
  1373.    JSR REMOVE
  1374.    BCC +
  1375.    NOP  ;XX ERROR MSG
  1376. +  LDA CUR╚AVE
  1377.    CLC
  1378.    ADC #1
  1379.    JSR REMOVE╚AVE╥EC
  1380.    RTS
  1381.  
  1382. COALESCE═SG1 = *
  1383.    .ASC "COALESCING SEGS "
  1384.    .BYTE 0
  1385. COALESCE═SG2 = *
  1386.    .ASC " OF "
  1387.    .BYTE CHR╤UOTE,0
  1388.  
  1389. EPUT╥ANGE = *
  1390.    STA WORK+0
  1391.    STY WORK+1
  1392.    LDY #HR╞ROM╙EG
  1393.    JSR EPUT╚AVE╬UM
  1394.    LDA #"-"
  1395.    JSR EPUTCHAR
  1396.    LDY #HR╘O╙EG
  1397.  
  1398. EPUT╚AVE╬UM = *
  1399.    LDA (WORK),Y
  1400.    STA WORK+4
  1401.    INY
  1402.    LDA (WORK),Y
  1403.    STA WORK+5
  1404.    LDA #0
  1405.    STA WORK+6
  1406.    STA WORK+7
  1407.    LDA #<NUMBUF
  1408.    LDY #>NUMBUF
  1409.    STA ZP+0
  1410.    STY ZP+1
  1411.    LDA #1
  1412.    LDX #WORK+4
  1413.    JSR UTOA
  1414.    LDA #<NUMBUF
  1415.    LDY #>NUMBUF
  1416.    JSR EPUTS
  1417.    RTS
  1418.  
  1419. FETCH╘EMP╬AME = *  ;( H )
  1420.    LDY #HR╘EMP╞ILE╬AME
  1421.    LDA (H),Y
  1422.    STA TEMP╬AME+0
  1423.    INY
  1424.    LDA (H),Y
  1425.    STA TEMP╬AME+1
  1426.    RTS
  1427.  
  1428. OPEN╘EMP = *  ;( .╪=HAVE╥EC, .┴=MODE ) : .┴=FCB, .├╙=ERR
  1429.    PHA
  1430.    TXA
  1431.    JSR GET╚
  1432.    JSR FETCH╘EMP╬AME
  1433.    LDA #TRUE
  1434.    JSR GET╘EMP╬AME╙TR
  1435.    LDA #<TEMP╬AME╙TR
  1436.    LDY #>TEMP╬AME╙TR
  1437.    STA ZP+0
  1438.    STY ZP+1
  1439.    PLA
  1440.    JSR OPEN
  1441.    BCC +
  1442.    LDA #<TEMP╬AME╙TR
  1443.    LDY #>TEMP╬AME╙TR
  1444.    JSR EPUTS
  1445.    LDA #<OPEN╘EMP═SG
  1446.    LDY #>OPEN╘EMP═SG
  1447.    JSR EPUTS
  1448.    SEC
  1449. +  RTS
  1450.  
  1451.    OPEN╘EMP═SG = *
  1452.    .ASC ": CANNOT OPEN, SHOULD BE ABLE TO, CONTINUING"
  1453.    .BYTE CHR├╥,0
  1454.  
  1455. COPY╙EG╠EN .BUF 2
  1456.            .BYTE $00,$00
  1457.  
  1458. COPY╞ILE = *  ;( FIN, FOUT, BYTES-- )
  1459.    LDA #<COPY┬UF
  1460.    LDY #>COPY┬UF
  1461.    STA ZP+0
  1462.    STY ZP+1
  1463.    LDA BYTES+2
  1464.    ORA BYTES+3
  1465.    BNE +
  1466.    LDA BYTES+0
  1467.    CMP #<COPY┬UF╙IZE
  1468.    LDA BYTES+1
  1469.    SBC #>COPY┬UF╙IZE
  1470.    BCS +
  1471.    LDA BYTES+0
  1472.    LDY BYTES+1
  1473.    JMP ++
  1474. +  LDA #<COPY┬UF╙IZE
  1475.    LDY #>COPY┬UF╙IZE
  1476. +  LDX FIN
  1477.    JSR READ
  1478.    BEQ +
  1479.    STA COPY╙EG╠EN+0
  1480.    STY COPY╙EG╠EN+1
  1481.    LDX FOUT
  1482.    JSR WRITE
  1483.    SEC
  1484.    LDY #4
  1485.    LDX #0
  1486. -  LDA BYTES,X
  1487.    SBC COPY╙EG╠EN,X
  1488.    STA BYTES,X
  1489.    INX
  1490.    DEY
  1491.    BNE -
  1492.    LDA BYTES+0
  1493.    ORA BYTES+1
  1494.    ORA BYTES+2
  1495.    ORA BYTES+3
  1496.    BNE COPY╞ILE
  1497.    RTS
  1498. +  LDA BYTES+0
  1499.    ORA BYTES+1
  1500.    ORA BYTES+2
  1501.    ORA BYTES+3
  1502.    BNE +
  1503.    RTS
  1504. +  LDA #<COPY╠EN═SG
  1505.    LDY #>COPY╠EN═SG
  1506.    JSR EPUTS
  1507.    RTS
  1508.  
  1509.    COPY╠EN═SG = *
  1510.    .ASC "╔NSUFFICIENT TEMP DATA COALESCED, SHOULDN'T HAPPEN, CONTINUING"
  1511.    .BYTE CHR├╥,0
  1512.  
  1513. OPEN╧V═ODE .BUF 1
  1514.  
  1515. OPEN╧VERWRITE = *  ;( (ZP)=NAME, .┴=MODE ) : .┴=╞CB, .├╙=ERR
  1516.    STA OPEN╧V═ODE
  1517.    JSR OPEN
  1518.    BCS +
  1519.    RTS
  1520. +  LDA ERRNO
  1521.    CMP #ACE┼RR╞ILE┼XISTS
  1522.    BEQ +
  1523. -  JSR REPORT╧PEN┼RROR
  1524.    SEC
  1525.    RTS
  1526. +  JSR REMOVE
  1527.    LDA OPEN╧V═ODE
  1528.    JSR OPEN
  1529.    BCS -
  1530.    RTS
  1531.  
  1532. RENAME╧V╬AME .BUF 2
  1533.  
  1534. RENAME╧VERWRITE = *  ;( (ZP)=NAME, (ZW)=NEW╬AME ) : .├╙=ERR
  1535.    JSR RENAME
  1536.    BCS +
  1537.    RTS
  1538. +  LDA ZP+0
  1539.    LDY ZP+1
  1540.    STA RENAME╧V╬AME+0
  1541.    STY RENAME╧V╬AME+1
  1542.    LDA ERRNO
  1543.    CMP #ACE┼RR╞ILE┼XISTS
  1544.    BEQ +
  1545. -  JSR REPORT╥ENAME┼RROR
  1546.    SEC
  1547.    RTS
  1548. +  LDA ZW+0
  1549.    LDY ZW+1
  1550.    STA ZP+0
  1551.    STY ZP+1
  1552.    JSR REMOVE
  1553.    LDA RENAME╧V╬AME+0
  1554.    LDY RENAME╧V╬AME+1
  1555.    STA ZP+0
  1556.    STY ZP+1
  1557.    JSR RENAME
  1558.    BCS -
  1559.    RTS
  1560.  
  1561. RENAME╧V╬EW╬AME .BUF 2
  1562.  
  1563. REPORT╥ENAME┼RROR = *
  1564.    LDA ZW+0
  1565.    LDY ZW+1
  1566.    STA RENAME╧V╬EW╬AME+0
  1567.    STY RENAME╧V╬EW╬AME+1
  1568.    LDA #<RENAME┼RR═SG1
  1569.    LDY #>RENAME┼RR═SG1
  1570.    JSR EPUTS
  1571.    LDA RENAME╧V╬AME+0
  1572.    LDY RENAME╧V╬AME+1
  1573.    JSR EPUTS
  1574.    LDA #<RENAME┼RR═SG2
  1575.    LDY #>RENAME┼RR═SG2
  1576.    JSR EPUTS
  1577.    LDA RENAME╧V╬EW╬AME+0
  1578.    LDY RENAME╧V╬EW╬AME+1
  1579.    JSR EPUTS
  1580.    LDA #<RENAME┼RR═SG3
  1581.    LDY #>RENAME┼RR═SG3
  1582.    JSR EPUTS
  1583.    RTS
  1584.  
  1585. RENAME┼RR═SG1 = *
  1586.    .ASC "├ANNOT RENAME "
  1587.    .BYTE CHR╤UOTE,0
  1588. RENAME┼RR═SG2 = *
  1589.    .BYTE CHR╤UOTE
  1590.    .ASC " TO "
  1591.    .BYTE CHR╤UOTE,0
  1592. RENAME┼RR═SG3 = *
  1593.    .BYTE CHR╤UOTE
  1594.    .ASC ", CONTINUING."
  1595.    .BYTE CHR├╥,0
  1596.  
  1597.