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

  1. ;*** ╒╬┬├╧─┼: BCODE DECODER VERSION 1.00 - BY ├RAIG ┬RUCE - 25-╬OV-93
  2.  
  3. ;ASSUMES 1-65535 SEGMENTS, 1-65536 TEMP FILES MAX, 0-4 ╟ FILE LENGTH, 64 FRAGS
  4.  
  5. .SEQ ACEHEAD.S
  6. .ORG ACE┴PP┴DDRESS
  7. .OBJ "@0:UNBCODE"
  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╠╞ = $0A
  16. CHR├╥ = $0D
  17. CHR╤UOTE = $22
  18. TRUE = $FF
  19. FALSE = $00
  20.  
  21. MAX├HUNK    = 64
  22. MAX╠INE     = 85
  23. MAX╞ILENAME = 85
  24. MAX╚AVE     = 64
  25. MAX╘EMPNAME = 20
  26. COPY┬UF╙IZE = 4096
  27. VERSION .ASC "1.00"
  28.         .BYTE 0
  29.  
  30. HR╞ROM╙EG      = 0  ;(2)
  31. HR╘O╙EG        = 2  ;(2)
  32. HR╘EMP╞ILE╬AME = 4  ;(2)
  33. HR╓ALID╠ENGTH  = 6  ;(4)
  34. HR╔S┼ND        = 10 ;(1)
  35. HR╞ILENAME     = 11 ;(17)
  36. HR╙IZE         = 32 ;(REALLY 28)
  37.  
  38. ASCII╞ILE .BUF 1
  39. TEMP .BUF 1
  40.  
  41. PROG╬AME     .BUF 2
  42. INFORMATIVE  .BUF 1
  43. VERBOSE      .BUF 1
  44. DEBUG        .BUF 1
  45. READ╞ILENAME .BUF 2
  46. READ╠INE╬UM  .BUF 4
  47. HAVE├OUNT    .BUF 1
  48. STATUS╞ILE┼XISTS .BUF 1
  49. NEXT╘EMP╬AME .BUF 2
  50. FILENAME╒SED .BUF 1
  51.  
  52. ARG        = 2  ;(2)
  53. NAME       = 4  ;(2)
  54. IN┬UF╠EN   = 6  ;(2)
  55. BUF╨TR     = 8  ;(2)
  56. BUF├OUNT   = 10 ;(2)
  57. INFILE     = 12 ;(1)
  58. OUTFILE    = 13 ;(1)
  59. OUT╬AME    = 14 ;(2)
  60. SEGNUM     = 16 ;(4)
  61. CONVERT╠EN = 20 ;(1)
  62. GETLINE╨OS = 21 ;(1)
  63. SCAN╓AL    = 22 ;(4)
  64. CRC        = 26 ;(4)
  65. BYTES      = 30 ;(4)
  66. IS┼ND      = 34 ;(1)
  67. CUR╚AVE    = 35 ;(1)
  68. TEMP╬AME   = 36 ;(4)  : REALLY ONLY USES 2
  69. H          = 40 ;(2)
  70. NEXT╚      = 42 ;(2)
  71. HAVE╥EC    = 44 ;(1)
  72. FIN        = 45 ;(1)
  73. FOUT       = 46 ;(1)
  74. WORK       = 112 ;(16)
  75.  
  76. CRC╘ABLE0 = *
  77.    .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
  78.    .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
  79.    .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
  80.    .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
  81.    .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
  82.    .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
  83.    .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
  84.    .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
  85.    .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
  86.    .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
  87.    .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
  88.    .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
  89.    .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
  90.    .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
  91.    .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
  92.    .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
  93.  
  94. CRC╘ABLE1 = *
  95.    .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
  96.    .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
  97.    .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
  98.    .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
  99.    .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
  100.    .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
  101.    .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
  102.    .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
  103.    .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
  104.    .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
  105.    .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
  106.    .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
  107.    .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
  108.    .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
  109.    .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
  110.    .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
  111.  
  112. CRC╘ABLE2 = *
  113.    .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
  114.    .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
  115.    .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
  116.    .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
  117.    .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
  118.    .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
  119.    .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
  120.    .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
  121.    .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
  122.    .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
  123.    .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
  124.    .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
  125.    .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
  126.    .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
  127.    .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
  128.    .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
  129.  
  130. CRC╘ABLE3 = *
  131.    .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
  132.    .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
  133.    .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
  134.    .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
  135.    .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
  136.    .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
  137.    .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
  138.    .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
  139.    .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
  140.    .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
  141.    .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
  142.    .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
  143.    .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
  144.    .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
  145.    .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
  146.    .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
  147.  
  148. ;******** STANDARD LIBRARY ********
  149. PUTS = *
  150.    LDX #STDOUT
  151. FPUTS = *
  152.    STA ZP+0
  153.    STY ZP+1
  154.    LDY #$FF
  155. -  INY
  156.    LDA (ZP),Y
  157.    BNE -
  158.    TYA
  159.    LDY #0
  160.    JMP WRITE
  161. EPUTS = *
  162.    LDX #STDERR
  163.    JMP FPUTS
  164.  
  165. EPUTCHAR = *
  166.    LDX #STDERR
  167.    JMP PUTC
  168. PUTCHAR = *
  169.    LDX #STDOUT
  170. PUTC = *
  171.    STA PUTC┬UFFER
  172.    LDA #<PUTC┬UFFER
  173.    LDY #>PUTC┬UFFER
  174.    STA ZP+0
  175.    STY ZP+1
  176.    LDA #1
  177.    LDY #0
  178.    JMP WRITE
  179.    PUTC┬UFFER .BUF 1
  180.  
  181. GETCHAR = *
  182.    LDX #STDIN
  183. GETC = *
  184.    LDA #<GETC┬UFFER
  185.    LDY #>GETC┬UFFER
  186.    STA ZP+0
  187.    STY ZP+1
  188.    LDA #1
  189.    LDY #0
  190.    JSR READ
  191.    BEQ +
  192.    LDA GETC┬UFFER
  193.    RTS
  194. +  SEC
  195.    RTS
  196.    GETC┬UFFER .BUF 1
  197.  
  198. GETARG = *
  199.    STY ZP+1
  200.    ASL
  201.    STA ZP+0
  202.    ROL ZP+1
  203.    CLC
  204.    LDA ACE┴RGV
  205.    ADC ZP+0
  206.    STA ZP+0
  207.    LDA ACE┴RGV+1
  208.    ADC ZP+1
  209.    STA ZP+1
  210.    LDY #0
  211.    LDA (ZP),Y
  212.    TAX
  213.    INY
  214.    LDA (ZP),Y
  215.    STX ZP+0
  216.    STA ZP+1
  217.    RTS
  218.  
  219. ;===UNBCODE===
  220. MAIN = *
  221.    ;** CHECK FOR LARGE ENOUGH ╘╨┴
  222.    SEC
  223.    LDA #<BSS┼ND
  224.    CMP ACE═EM╘OP+0
  225.    LDA #>BSS┼ND
  226.    SBC ACE═EM╘OP+1
  227.    BCC TPA╧K
  228.    LDA #<TPA═SG
  229.    LDY #>TPA═SG
  230.    JSR EPUTS
  231. DIE = *
  232.    LDA #1
  233.    LDX #0
  234.    JMP EXIT
  235.  
  236. TPA═SG = *
  237.    .ASC "╔NSUFFICIENT PROGRAM SPACE TO RUN UNBCODE"
  238.    .BYTE CHR├╥,0
  239.  
  240. TPA╧K = *
  241.    ;** CHECK ARGUMENT COUNT
  242.    LDA ACE┴RGC+1
  243.    BEQ +
  244.    JMP ENOUGH┴RGS
  245. +  LDA ACE┴RGC+0
  246.    CMP #2
  247.    BCC USAGE
  248.    JMP ENOUGH┴RGS
  249.  
  250. USAGE = *
  251.    LDA #<USAGE═SG
  252.    LDY #>USAGE═SG
  253.    JSR EPUTS
  254.    JMP DIE
  255.  
  256. USAGE═SG = *
  257.    .ASC "USAGE: UNBCODE [-V] [-I] [-D] [-HELP] FILENAME ..."
  258.    .BYTE CHR├╥
  259.    .ASC "       [-V]=VERBOSE, [-I]=INFORMATIVE, [-D]=DEBUGGING INFO"
  260.    .BYTE CHR├╥,0
  261.  
  262. ENOUGH┴RGS = *
  263.    ;** SET GLOBALS
  264.    LDA #TRUE
  265.    STA INFORMATIVE
  266.    LDA #FALSE
  267.    STA VERBOSE
  268.    LDA #FALSE
  269.    STA DEBUG
  270.    LDA #0
  271.    LDY #0
  272.    JSR GETARG
  273.    LDA ZP+0
  274.    LDY ZP+1
  275.    STA PROG╬AME+0
  276.    STY PROG╬AME+1
  277.    LDA #FALSE
  278.    STA FILENAME╒SED
  279.    LDA #0
  280.    STA TEMP╨REFIX
  281.    STA TEMP╬AME+2
  282.    STA TEMP╬AME+3
  283.    JSR LOAD╙TATUS╞ILE
  284.  
  285.    ;** GET INPUT BUFFER LENGTH
  286.    SEC
  287.    LDA ACE═EM╘OP+0
  288.    SBC #<IN┬UF
  289.    STA IN┬UF╠EN+0
  290.    LDA ACE═EM╘OP+1
  291.    SBC #>IN┬UF
  292.    STA IN┬UF╠EN+1
  293.    LDA #0
  294.    STA ARG+0
  295.    STA ARG+1
  296.  
  297.    MAIN╬EXT = *
  298.    JSR CHECK╙TOP
  299.    INC ARG+0
  300.    BNE +
  301.    INC ARG+1
  302. +  LDA ARG+0
  303.    LDY ARG+1
  304.    JSR GETARG
  305.    LDA ZP+0
  306.    ORA ZP+1
  307.    BEQ MAIN┼XIT
  308.    LDA ZP+0
  309.    LDY ZP+1
  310.    STA NAME+0
  311.    STY NAME+1
  312.    LDY #0
  313.    LDA (ZP),Y
  314.    CMP #"-"
  315.    BNE +
  316.    JSR HANDLE╞LAGS
  317.    JMP MAIN╬EXT
  318. +  JSR ECHO
  319.    JSR UNBCODE
  320.    BCC +
  321.    JSR ERROR
  322. +  JMP MAIN╬EXT
  323.  
  324. MAIN┼XIT = *
  325.    ;XX SHOULD READ FROM STDIN IF NO FILES
  326.    JSR SAVE╙TATUS╞ILE
  327.    RTS
  328.  
  329. HANDLE╞LAGS = *
  330.    INY
  331.    LDA (ZP),Y
  332.    BNE +
  333.    RTS
  334. +  CMP #"D"
  335.    BEQ FLAG─
  336.    CMP #"V"
  337.    BEQ FLAG╓
  338.    CMP #"I"
  339.    BEQ FLAG╔
  340.    CMP #"H"
  341.    BNE +
  342.    JMP USAGE
  343. +  NOP
  344.    ;XX UNRECOGNIZED OPTION
  345.    JMP HANDLE╞LAGS
  346.  
  347. FLAG─ = *
  348.    LDA #TRUE
  349.    STA DEBUG
  350.    STA VERBOSE
  351.    STA INFORMATIVE
  352.    ;XX PRINT STUFF
  353.    JMP HANDLE╞LAGS
  354.  
  355. FLAG╓ = *
  356.    LDA #TRUE
  357.    STA VERBOSE
  358.    STA INFORMATIVE
  359.    ;XX PRINT VERSION
  360.    JMP HANDLE╞LAGS
  361.  
  362. FLAG╔ = *
  363.    LDA #TRUE
  364.    STA INFORMATIVE
  365.    JMP HANDLE╞LAGS
  366.  
  367. ERROR = *
  368.    LDA #<ERROR═SG1
  369.    LDY #>ERROR═SG1
  370.    JSR EPUTS
  371.    LDA NAME+0
  372.    LDY NAME+1
  373.    JSR EPUTS
  374.    LDA #<ERROR═SG2
  375.    LDY #>ERROR═SG2
  376.    JSR EPUTS
  377.    RTS
  378.  
  379. ERROR═SG1 = *
  380.    .ASC "┼RROR ATTEMPTING TO UNBCODE FILE "
  381.    .BYTE CHR╤UOTE,0
  382. ERROR═SG2 = *
  383.    .BYTE CHR╤UOTE
  384.    .ASC ", CONTINUING"
  385.    .BYTE CHR├╥,0
  386.  
  387. ECHO = *
  388.    LDA #<ECHO═SG1
  389.    LDY #>ECHO═SG1
  390.    JSR EPUTS
  391.    LDA NAME+0
  392.    LDY NAME+1
  393.    JSR EPUTS
  394.    LDA #<ECHO═SG2
  395.    LDY #>ECHO═SG2
  396.    JMP EPUTS
  397.  
  398. ECHO═SG1 = *
  399.    .ASC "UNBCODING FILE "
  400.    .BYTE CHR╤UOTE,0
  401.  
  402. ECHO═SG2 = *
  403.    .BYTE CHR╤UOTE
  404.    .ASC "..."
  405.    .BYTE CHR├╥,0
  406.  
  407. CHECK╙TOP = *
  408.    JSR STOPKEY
  409.    BCS +
  410.    RTS
  411. +  LDA #<STOPPED═SG
  412.    LDY #>STOPPED═SG
  413.    JSR EPUTS
  414.    JMP DIE
  415.  
  416.    STOPPED═SG = *
  417.    .ASC "<╙TOPPED>"
  418.    .BYTE CHR├╥,0
  419.  
  420. .SEQ UNBCODEHELP.S
  421.  
  422. STAT╞CB .BUF 1
  423. STAT╚╥  .BUF 1
  424.  
  425. WRITE╙TATUS─ATA = *  ;( STAT╞CB )
  426.    LDA #255
  427.    STA STAT╚╥
  428.    WRITE╙TATUS╬EXT = *
  429.    INC STAT╚╥
  430.    LDA STAT╚╥
  431.    CMP HAVE├OUNT
  432.    BCC +
  433.    RTS
  434. +  JSR GET╚
  435.    LDY #10
  436. -  LDA (H),Y
  437.    STA WORK,Y
  438.    DEY
  439.    BPL -
  440.    ;** FROM SEGMENT
  441.    LDX #WORK+HR╞ROM╙EG
  442.    JSR WRITE╬UM5
  443.    ;** TO SEGMENT
  444.    LDX #WORK+HR╘O╙EG
  445.    JSR WRITE╬UM5
  446.    ;** BEG/MID/END
  447.    LDX #12
  448.    LDA WORK+HR╔S┼ND
  449.    BNE +
  450.    LDX #6
  451.    LDA WORK+HR╞ROM╙EG+0
  452.    CMP #1
  453.    BNE +
  454.    LDA WORK+HR╞ROM╙EG+1
  455.    CMP #0
  456.    BNE +
  457.    LDX #0
  458. +  TXA
  459.    LDY #>BEG═ID┼ND═SG
  460.    CLC
  461.    ADC #<BEG═ID┼ND═SG
  462.    BCC +
  463.    INY
  464. +  LDX STAT╞CB
  465.    JSR FPUTS
  466.    ;** LENGTH
  467.    LDX #WORK+HR╓ALID╠ENGTH
  468.    JSR WRITE╬UM10
  469.    ;** TEMP NAME
  470.    LDA #<TEMP╬AME╨REFIX
  471.    LDY #>TEMP╬AME╨REFIX
  472.    LDX STAT╞CB
  473.    JSR FPUTS
  474.    LDX #WORK+HR╘EMP╞ILE╬AME
  475.    JSR WRITE╬UM5
  476.    ;** FILENAME
  477.    LDA H+0
  478.    LDY H+1
  479.    CLC
  480.    ADC #HR╞ILENAME
  481.    BCC +
  482.    INY
  483. +  LDX STAT╞CB
  484.    JSR FPUTS
  485.    LDA #CHR├╥
  486.    LDX STAT╞CB
  487.    JSR PUTC
  488.    JMP WRITE╙TATUS╬EXT
  489.  
  490.    BEG═ID┼ND═SG = *
  491.    .BYTE "B","E","G"," "," ",0
  492.    .BYTE "M","I","D"," "," ",0
  493.    .BYTE "E","N","D"," "," ",0
  494.    TEMP╬AME╨REFIX = *
  495.    .ASC "0┬├"
  496.    .BYTE 0
  497.  
  498. SAVE╙TATUS╞ILE = *
  499.    BIT VERBOSE
  500.    BPL +
  501.    LDA #<SAVE╙TAT═SG
  502.    LDY #>SAVE╙TAT═SG
  503.    JSR EPUTS
  504. +  LDA #<STATUS╞ILENAME
  505.    LDY #>STATUS╞ILENAME
  506.    STA ZP+0
  507.    STY ZP+1
  508.    LDA HAVE├OUNT
  509.    BNE ++
  510.    LDA STATUS╞ILE┼XISTS
  511.    BNE +
  512.    RTS
  513. +  JSR REMOVE
  514.    RTS
  515. +  LDA #"W"
  516.    JSR OPEN╧VERWRITE
  517.    BCC +
  518.    LDA #<STATUS╫RITE┼RR═SG
  519.    LDY #>STATUS╫RITE┼RR═SG
  520.    JSR EPUTS
  521.    LDA #STDERR
  522. +  STA STAT╞CB
  523.    JSR WRITE╙TATUS─ATA
  524.    LDA STAT╞CB
  525.    CMP #STDERR
  526.    BEQ +
  527.    JSR CLOSE
  528. +  RTS
  529.  
  530. SAVE╙TAT═SG = *
  531.    .ASC "SAVING STATUS FILE 0┬├-╙╘┴╘"
  532.    .BYTE CHR├╥,0
  533. STATUS╞ILENAME = *
  534.    .ASC "0┬├-╙╘┴╘"
  535.    .BYTE 0
  536. STATUS╫RITE┼RR═SG = *
  537.    .ASC "├ANNOT OPEN "
  538.    .BYTE CHR╤UOTE
  539.    .ASC "0┬├-╙╘┴╘"
  540.    .BYTE CHR╤UOTE
  541.    .ASC ", WRITING STATUS TO STDERR:"
  542.    .BYTE CHR├╥,0
  543.  
  544. DISCARD╙EGMENT = *
  545.    LDA CUR╚AVE
  546.    JSR GET╚
  547.    LDY #HR╞ROM╙EG
  548.    LDA SEGNUM+0
  549.    CMP (H),Y
  550.    BNE DISCARD┴PPENDED╙EG
  551.    INY
  552.    LDA SEGNUM+1
  553.    CMP (H),Y
  554.    BNE DISCARD┴PPENDED╙EG
  555.  
  556.    ;** THIS IS THE ONLY SEGMENT IN THE FRAGMENT, DELETE IT
  557.    LDA #<DISC═SG
  558.    LDY #>DISC═SG
  559.    JSR EPUTS
  560.    JSR FETCH╘EMP╬AME
  561.    LDA #TRUE
  562.    JSR GET╘EMP╬AME╙TR
  563.    LDA #<TEMP╬AME╙TR
  564.    LDY #>TEMP╬AME╙TR
  565.    STA ZP+0
  566.    STY ZP+1
  567.    JSR REMOVE
  568.    LDA CUR╚AVE
  569.    JSR REMOVE╚AVE╥EC
  570.  
  571.    DISCARD╙EG┼XIT = *
  572.    BIT DEBUG
  573.    BPL +
  574.    LDX #STDERR
  575.    STX STAT╞CB
  576.    JSR WRITE╙TATUS─ATA
  577. +  RTS
  578.  
  579. DISC═SG = *
  580.    .ASC "DISCARDING SEGMENT"
  581.    .BYTE CHR├╥,0
  582.  
  583. DISCARD┴PPENDED╙EG = *
  584.    LDY #HR╘O╙EG
  585.    SEC
  586.    LDA SEGNUM+0
  587.    SBC #1
  588.    STA (H),Y
  589.    INY
  590.    LDA SEGNUM+1
  591.    SBC #0
  592.    STA (H),Y
  593.    LDA #<DISC┴PP═SG
  594.    LDY #>DISC┴PP═SG
  595.    JSR EPUTS
  596.    ;** GET AND OPEN NEW TEMP FILE
  597.    JSR GET╘EMP╞ILE╬AME╧NLY
  598.    LDA #"W"
  599.    STA FILE═ODE
  600.    JSR OPEN╘EMP╞ILE
  601.    LDA OUTFILE
  602.    STA FOUT
  603.    BCS DISCARD╙EG┼XIT
  604.    ;** OPEN OLD TEMP FILE
  605.    LDA CUR╚AVE
  606.    JSR GET╚
  607.    LDY #HR╘EMP╞ILE╬AME
  608.    LDA (H),Y
  609.    PHA
  610.    LDA TEMP╬AME+0
  611.    STA (H),Y
  612.    PLA
  613.    STA TEMP╬AME+0
  614.    INY
  615.    LDA (H),Y
  616.    PHA
  617.    LDA TEMP╬AME+1
  618.    STA (H),Y
  619.    PLA
  620.    STA TEMP╬AME+1
  621.    LDA #"R"
  622.    STA FILE═ODE
  623.    JSR OPEN╘EMP╞ILE
  624.    LDA OUTFILE
  625.    STA FIN
  626.    BCC +
  627.    LDA FOUT
  628.    JSR CLOSE
  629.    JMP DISCARD╙EG┼XIT
  630. +  STA FIN
  631.    ;** COPY VALID CONTENTS INTO NEW TEMP FILE
  632.    LDX #3
  633.    LDY #HR╓ALID╠ENGTH+3
  634. -  LDA (H),Y
  635.    STA BYTES,X
  636.    DEY
  637.    DEX
  638.    BPL -
  639.    JSR COPY╞ILE
  640.    ;** REMOVE OLD TEMP FILE
  641.    LDA #<TEMP╬AME╙TR
  642.    LDY #>TEMP╬AME╙TR
  643.    STA ZP+0
  644.    STY ZP+1
  645.    JSR REMOVE
  646.    JMP DISCARD╙EG┼XIT
  647.  
  648. DISC┴PP═SG = *
  649.    .ASC "DISCARDING APPENDED SEGMENT"
  650.    .BYTE CHR├╥,0
  651.  
  652. LOAD╙TATUS╞ILE = *
  653.    BIT VERBOSE
  654.    BPL +
  655.    LDA #<LOAD╙TAT═SG
  656.    LDY #>LOAD╙TAT═SG
  657.    JSR EPUTS
  658. +  LDA #0
  659.    STA HAVE├OUNT
  660.    LDA #FALSE
  661.    STA STATUS╞ILE┼XISTS
  662.    LDA #1
  663.    LDY #0
  664.    STA NEXT╘EMP╬AME+0
  665.    STY NEXT╘EMP╬AME+1
  666.    LDA #<STATUS╞ILENAME
  667.    LDY #>STATUS╞ILENAME
  668.    STA ZP+0
  669.    STY ZP+1
  670.    LDA #"R"
  671.    JSR OPEN
  672.    BCS +
  673.    STA STAT╞CB
  674.    LDA #TRUE
  675.    STA STATUS╞ILE┼XISTS
  676.    JSR SCAN╙TATUS╞ILE
  677.    LDA STAT╞CB
  678.    JSR CLOSE
  679. +  RTS
  680.  
  681. LOAD╙TAT═SG = *
  682.    .ASC "SCANNING STATUS FILE 0┬├-╙╘┴╘"
  683.    .BYTE CHR├╥,0
  684.  
  685. SS╨OS .BUF 1
  686.  
  687. SCAN╙TATUS╞ILE = *
  688.    ;** READ STATUS LINE
  689.    LDX #0
  690.    STX SS╨OS
  691. -  LDX STAT╞CB
  692.    JSR GETC
  693.    BCC +
  694.    RTS
  695. +  CMP #CHR├╥
  696.    BEQ +
  697.    LDX SS╨OS
  698.    CPX #MAX╠INE-1
  699.    BCS -
  700.    STA IN╠INE,X
  701.    INC SS╨OS
  702.    JMP -
  703. +  LDA #0
  704.    LDX SS╨OS
  705.    STA IN╠INE,X
  706.    CPX #42
  707.    BCC SCAN╙TATUS╞ILE
  708.    STA IN╠INE+52
  709.  
  710.    ;** SCAN STATUS LINE
  711.    BIT DEBUG
  712.    BPL +
  713.    LDA #<IN╠INE
  714.    LDY #>IN╠INE
  715.    JSR EPUTS
  716.    LDA #CHR├╥
  717.    JSR EPUTCHAR
  718. +  LDX #HR╙IZE-1
  719.    LDA #0
  720. -  STA TEMP╚AVE╥EC,X
  721.    DEX
  722.    BPL -
  723.  
  724. ;0----+----1----+----2----+----3----+----4----+----5----+--
  725. ;00001  00002  BEG  0000001140  0┬├00007  NEW4
  726. ;00004  00004  END  0000000189  0┬├00004  1234567890123456.
  727. ;00002  00003  END  0000000529  0┬├00006  NEW5
  728.  
  729.    ;** FILENAME
  730.    LDX #0
  731. -  LDA IN╠INE+41,X
  732.    STA TEMP╚AVE╥EC+HR╞ILENAME,X
  733.    BEQ +
  734.    INX
  735.    BNE -
  736.    ;** IS┼ND
  737. +  LDX #TRUE
  738.    LDA IN╠INE+14
  739.    CMP #"E"
  740.    BEQ +
  741.    LDX #FALSE
  742. +  STX TEMP╚AVE╥EC+HR╔S┼ND
  743.    ;** FROM╙EG
  744.    LDY #0
  745.    JSR SCAN╬UM
  746.    BCS SCAN┼RR
  747.    LDA SCAN╓AL+0
  748.    LDY SCAN╓AL+1
  749.    STA TEMP╚AVE╥EC+HR╞ROM╙EG+0
  750.    STY TEMP╚AVE╥EC+HR╞ROM╙EG+1
  751.    ;** TO╙EG
  752.    LDY #7
  753.    JSR SCAN╬UM
  754.    BCS SCAN┼RR
  755.    LDA SCAN╓AL+0
  756.    LDY SCAN╓AL+1
  757.    STA TEMP╚AVE╥EC+HR╘O╙EG+0
  758.    STY TEMP╚AVE╥EC+HR╘O╙EG+1
  759.    ;** VALID╠ENGTH
  760.    LDY #19
  761.    JSR SCAN╬UM
  762.    BCS SCAN┼RR
  763.    LDA SCAN╓AL+0
  764.    LDY SCAN╓AL+1
  765.    STA TEMP╚AVE╥EC+HR╓ALID╠ENGTH+0
  766.    STY TEMP╚AVE╥EC+HR╓ALID╠ENGTH+1
  767.    LDA SCAN╓AL+2
  768.    LDY SCAN╓AL+3
  769.    STA TEMP╚AVE╥EC+HR╓ALID╠ENGTH+2
  770.    STY TEMP╚AVE╥EC+HR╓ALID╠ENGTH+3
  771.    ;** TEMP╞ILE╬AME
  772.    LDY #34
  773.    JSR SCAN╬UM
  774.    BCS SCAN┼RR
  775.    LDA SCAN╓AL+0
  776.    LDY SCAN╓AL+1
  777.    STA TEMP╚AVE╥EC+HR╘EMP╞ILE╬AME+0
  778.    STY TEMP╚AVE╥EC+HR╘EMP╞ILE╬AME+1
  779.  
  780.    ;** STORE STATUS INFO
  781.    LDA HAVE├OUNT
  782.    CMP #MAX╚AVE
  783.    BCC +
  784.    LDA #<SCAN╘OO═ANY╞RAGS
  785.    LDY #<SCAN╘OO═ANY╞RAGS
  786.    JSR EPUTS
  787.    SCAN┼RR = *
  788.    JMP SCAN╙TATUS╞ILE
  789. +  LDA HAVE├OUNT
  790.    INC HAVE├OUNT
  791.    JSR GET╚
  792.    LDY #HR╙IZE-1
  793. -  LDA TEMP╚AVE╥EC,Y
  794.    STA (H),Y
  795.    DEY
  796.    BPL -
  797.    JMP SCAN╙TATUS╞ILE
  798.  
  799. SCAN╘OO═ANY╞RAGS = *
  800.    .ASC "TOO MANY FRAGMENTS IN 0┬├-╙╘┴╘, IGNORING FRAGMENT"
  801.    .BYTE CHR├╥,0
  802.  
  803. ;===BSS===
  804. BSS         = *
  805. IN╠INE      = BSS+0
  806. TEMP╨REFIX  = IN╠INE+MAX╠INE
  807. TEMP╬AME╙TR = TEMP╨REFIX+20
  808. HAVES       = TEMP╬AME╙TR+MAX╞ILENAME
  809. COPY┬UF     = HR╙IZE*MAX╚AVE+HAVES
  810. DECODE╘ABLE = COPY┬UF+COPY┬UF╙IZE
  811. TEMP╚AVE╥EC = DECODE╘ABLE+256
  812. IN┬UF       = TEMP╚AVE╥EC+HR╙IZE
  813. BSS┼ND      = IN┬UF+64
  814.