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

  1. ;*** UUDECODE PROGRAM
  2.  
  3. .SEQ ACEHEAD.S
  4. .ORG ACE┴PP┴DDRESS
  5. .OBJ "@0:UUDECODE"
  6.  
  7. JMP UUDECODE═AIN
  8. .BYTE ACE╔─1,ACE╔─2,ACE╔─3
  9. .BYTE 64,0  ;** STACK,RESERVED
  10.  
  11. ;*** GLOBAL DECLARATIONS
  12.  
  13. LIBWORK = $60
  14.  
  15. CHR╠╞ = $0A
  16. CHR├╥ = $0D
  17. CHR╤UOTE = $22
  18.  
  19. ASCII╞ILE .BUF 1
  20. TEMP .BUF 1
  21.  
  22. ;******** STANDARD LIBRARY ********
  23. PUTS = *
  24.    LDX #STDOUT
  25. FPUTS = *
  26.    STA ZP
  27.    STY ZP+1
  28.    LDY #$FF
  29. -  INY
  30.    LDA (ZP),Y
  31.    BNE -
  32.    TYA
  33.    LDY #0
  34.    JMP WRITE
  35. EPUTS = *
  36.    LDX #STDERR
  37.    JMP FPUTS
  38.  
  39. PUTCHAR = *
  40.    LDX #STDOUT
  41. PUTC = *
  42.    STA PUTC┬UFFER
  43.    LDA #<PUTC┬UFFER
  44.    LDY #>PUTC┬UFFER
  45.    STA ZP
  46.    STY ZP+1
  47.    LDA #1
  48.    LDY #0
  49.    JMP WRITE
  50.    PUTC┬UFFER .BUF 1
  51.  
  52. GETCHAR = *
  53.    LDX #STDIN
  54. GETC = *
  55.    LDA #<GETC┬UFFER
  56.    LDY #>GETC┬UFFER
  57.    STA ZP
  58.    STY ZP+1
  59.    LDA #1
  60.    LDY #0
  61.    JSR READ
  62.    BEQ +
  63.    LDA GETC┬UFFER
  64.    RTS
  65. +  SEC
  66.    RTS
  67.    GETC┬UFFER .BUF 1
  68.  
  69. GETARG = *
  70.    STY ZP+1
  71.    ASL
  72.    STA ZP
  73.    ROL ZP+1
  74.    CLC
  75.    LDA ACE┴RGV
  76.    ADC ZP
  77.    STA ZP
  78.    LDA ACE┴RGV+1
  79.    ADC ZP+1
  80.    STA ZP+1
  81.    LDY #0
  82.    LDA (ZP),Y
  83.    TAX
  84.    INY
  85.    LDA (ZP),Y
  86.    STX ZP
  87.    STA ZP+1
  88.    RTS
  89.  
  90. CHECKSTOP = *
  91.    JSR STOPKEY
  92.    BCS +
  93.    RTS
  94. +  LDA #<STOPPED═SG
  95.    LDY #>STOPPED═SG
  96.    JSR EPUTS
  97.    LDA #1
  98.    LDX #0
  99.    JMP EXIT
  100.    STOPPED═SG = *
  101.    .ASC "<╙TOPPED>"
  102.    .BYTE CHR├╥,0
  103.  
  104. ;===UUDECODE===
  105. UUD┴RG = 2
  106. UUD╬AME = 4
  107. IN┬UF╠EN = 6
  108.  
  109. UUDECODE═AIN = *
  110.    ;** CHECK ARGUMENT COUNT
  111.    LDA ACE┴RGC+1
  112.    BNE UUD┼NOUGH┴RGS
  113.    LDA ACE┴RGC
  114.    CMP #2
  115.    BCS UUD┼NOUGH┴RGS
  116.  
  117. UUD╒SAGE = *
  118.    LDA #<UUD╒SAGE═SG
  119.    LDY #>UUD╒SAGE═SG
  120.    JMP PUTS
  121.  
  122. UUD╒SAGE═SG = *
  123.    .ASC "╒SAGE: UUDECODE FILE1 FILE2 ... FILE╬"
  124.    .BYTE CHR├╥,0
  125.  
  126. UUD┼NOUGH┴RGS = *
  127.    ;** GET INPUT BUFFER LENGTH
  128.    SEC
  129.    LDA ACE═EM╘OP+0
  130.    SBC #<UUD╔N┬UF
  131.    STA IN┬UF╠EN
  132.    LDA ACE═EM╘OP+1
  133.    SBC #>UUD╔N┬UF
  134.    STA IN┬UF╠EN+1
  135.    ;** MAIN LOOP
  136.    LDA #1
  137.    LDY #0
  138.    STA UUD┴RG
  139.    STY UUD┴RG+1
  140. -  JSR CHECKSTOP
  141.    LDA UUD┴RG
  142.    LDY UUD┴RG+1
  143.    JSR GETARG
  144.    LDA ZP
  145.    LDY ZP+1
  146.    STA UUD╬AME
  147.    STY UUD╬AME+1
  148.    ORA ZP+1
  149.    BEQ UUD┼XIT
  150.    JSR UUD┼CHO
  151.    JSR UUDECODE
  152.    BCC +
  153.    JSR UUD┼RROR
  154. +  INC UUD┴RG
  155.    BNE +
  156.    INC UUD┴RG+1
  157. +  JMP -
  158.  
  159. UUD┼XIT = *
  160.    RTS
  161.  
  162. UUD┼RROR = *
  163.    LDA #<UUD┼RROR═SG1
  164.    LDY #>UUD┼RROR═SG1
  165.    JSR EPUTS
  166.    LDA UUD╬AME
  167.    LDY UUD╬AME+1
  168.    JSR EPUTS
  169.    LDA #<UUD┼RROR═SG2
  170.    LDY #>UUD┼RROR═SG2
  171.    JMP EPUTS
  172.  
  173. UUD┼RROR═SG1 = *
  174.    .ASC "┼RROR ATTEMPTING TO UUDECODE FILE "
  175.    .BYTE CHR╤UOTE,0
  176. UUD┼RROR═SG2 = *
  177.    .BYTE CHR╤UOTE,CHR├╥,0
  178.  
  179. UUD┼CHO = *
  180.    LDA #<UUD┼CHO═SG1
  181.    LDY #>UUD┼CHO═SG1
  182.    JSR EPUTS
  183.    LDA UUD╬AME
  184.    LDY UUD╬AME+1
  185.    JSR EPUTS
  186.    LDA #<UUD┼CHO═SG2
  187.    LDY #>UUD┼CHO═SG2
  188.    JMP EPUTS
  189.  
  190. UUD┼CHO═SG1 = *
  191.    .ASC "UUDECODING FILE "
  192.    .BYTE CHR╤UOTE,0
  193.  
  194. UUD┼CHO═SG2 = *
  195.    .BYTE CHR╤UOTE
  196.    .ASC "..."
  197.    .BYTE CHR├╥,0
  198.  
  199. BUF╨TR = 8
  200. BUF├OUNT = 10
  201. INFILE = 12
  202. OUTFILE = 13
  203.  
  204. UUDECODE = *
  205.    ;** OPEN FILE
  206.    LDA UUD╬AME
  207.    LDY UUD╬AME+1
  208.    STA ZP
  209.    STY ZP+1
  210.    LDA #"R"
  211.    JSR OPEN
  212.    BCC +
  213.    RTS
  214. +  STA INFILE
  215.    ;** DECODE FILE
  216.    JSR UUDECODE┬ODY
  217.    ;** CLOSE FILE
  218.    LDA INFILE
  219.    JSR CLOSE
  220.    RTS
  221.  
  222. UUDECODE┬ODY = *
  223.    LDA #0
  224.    STA BUF├OUNT
  225.    STA BUF├OUNT+1
  226.    STA HIT╠AST╠INE
  227.    STA LAST╠INE╘ERMINATOR
  228.  
  229.    ;** SEARCH FOR "BEGIN" LINE
  230.    UUD╙EARCH╠INE = *
  231.    JSR GETLINE
  232.    BCC +
  233.    RTS
  234. +  LDX #0
  235.    LDA UUD╔N╠INE
  236.    CMP #"B"
  237.    BEQ +
  238.    LDX #ASCII┬EGIN-PETSCII┬EGIN
  239. +  LDY #0
  240. -  LDA UUD╔N╠INE,Y
  241.    CMP PETSCII┬EGIN,X
  242.    BNE UUD╙EARCH╠INE
  243.    INX
  244.    INY
  245.    CPY #6
  246.    BCC -
  247.    LDY #0
  248.    CPX #ASCII┬EGIN-PETSCII┬EGIN+1
  249.    BCC +
  250.    LDY #$FF
  251. +  STY ASCII╞ILE
  252.    LDA UUD╔N╠INE+9
  253.    CMP #" "
  254.    BNE UUD╙EARCH╠INE
  255.    LDX #0
  256. -  LDA UUD╔N╠INE+6,X
  257.    CMP #"0"
  258.    BCC UUD╙EARCH╠INE
  259.    CMP #"8"
  260.    BCS UUD╙EARCH╠INE
  261.    INX
  262.    CPX #3
  263.    BCC -
  264.    JMP PROCESS┬EGIN
  265.  
  266.    PETSCII┬EGIN = *
  267.    .ASC "BEGIN "
  268.    ASCII┬EGIN = *
  269.    .BYTE $62,$65,$67,$69,$6E,$20
  270.    
  271.    ;** PROCESS "BEGIN" LINE
  272.    PROCESS┬EGIN = *
  273.    LDA ASCII╞ILE
  274.    BEQ +
  275.    ;** JSR CONVERT FILENAME
  276. +  JSR MAKE╨ETSCII╬AME
  277.    JSR DEFAULT╨RG╞ILE
  278.    JSR ECHO┼XTRACT╬AME
  279.    LDA #<UUD╔N╠INE+10
  280.    LDY #>UUD╔N╠INE+10
  281.    STA ZP
  282.    STY ZP+1
  283.    LDA #"W"
  284.    JSR OPEN
  285.    BCC OPEN╧K
  286.    LDA ERRNO
  287.    CMP #ACE┼RR╞ILE┼XISTS
  288.    BEQ +
  289. -  JSR REPORT╧PEN┼RROR
  290.    JMP UUD╙EARCH╠INE
  291. +  JSR SCRATCH╞ILE
  292.    LDA #"W"
  293.    JSR OPEN
  294.    BCS -
  295.  
  296.    OPEN╧K = *
  297.    STA OUTFILE
  298.  
  299.    ;** READ UUENCODED DATA
  300. -  JSR GETLINE
  301.    BCS UUD╞INISH╞ILE
  302.    JSR UU├ONVERT╠INE
  303.    BCC +
  304.    ;** REPORT INVALID CHARACTERS
  305.    LDA #<BAD├HARS═SG
  306.    LDY #>BAD├HARS═SG
  307.    JSR EPUTS
  308.    JMP -
  309. +  LDA UUD╔N╠INE
  310.    BEQ UUD╞INISH╞ILE
  311.    JSR UU├RUNCH╠INE
  312.    JSR UU╫RITE╠INE
  313.    JMP -
  314.  
  315.    ;** FINISH WITH FILE
  316.    UUD╞INISH╞ILE = *
  317.    LDA OUTFILE
  318.    JSR CLOSE
  319.    ;** PROCESS FOR ANOTHER FILE
  320.    JMP UUD╙EARCH╠INE
  321.  
  322. BAD├HARS═SG = *
  323.    .ASC "WARNING: BAD CHARACTERS IN LINE; IGNORING LINE."
  324.    .BYTE CHR├╥,0
  325.  
  326. ;%%%
  327. MAKE╨ETSCII╬AME = *
  328.    BIT ASCII╞ILE
  329.    BMI +
  330.    RTS
  331. +  LDX #0
  332. -  LDA UUD╔N╠INE+10,X
  333.    BEQ +
  334.    JSR CONV┴SC2╨ET
  335.    STA UUD╔N╠INE+10,X
  336.    INX
  337.    BNE -
  338. +  RTS
  339.  
  340. CONV┴SC2╨ET = *
  341.    AND #$7F
  342.    CMP #$60
  343.    BCC +
  344.    CLC
  345.    ADC #$C0-$60
  346. +  TAY
  347.    AND #$7F
  348.    CMP #"A"
  349.    BCS +
  350. -  TYA
  351.    RTS
  352. +  CMP #"Z"+1
  353.    BCS -
  354.    TYA
  355.    EOR #$80
  356.    RTS
  357.  
  358. DEFAULT╨RG╞ILE = *
  359.    LDX #0
  360. -  LDA UUD╔N╠INE+10,X
  361.    BEQ +
  362.    INX
  363.    BNE -
  364. +  LDA UUD╔N╠INE+8,X
  365.    CMP #","
  366.    BNE +
  367.    RTS
  368. +  LDA #","
  369.    STA UUD╔N╠INE+10,X
  370.    LDA #"P"
  371.    STA UUD╔N╠INE+11,X
  372.    LDA #0
  373.    STA UUD╔N╠INE+12,X
  374.    RTS
  375.  
  376. ECHO┼XTRACT╬AME = *
  377.    LDA #<ECHO┼XTRACT═SG1
  378.    LDY #>ECHO┼XTRACT═SG1
  379.    JSR EPUTS
  380.    LDA #<UUD╔N╠INE+10
  381.    LDY #>UUD╔N╠INE+10
  382.    JSR EPUTS
  383.    LDA #<ECHO┼XTRACT═SG2
  384.    LDY #>ECHO┼XTRACT═SG2
  385.    JMP EPUTS
  386.  
  387. ECHO┼XTRACT═SG1 = *
  388.    .ASC "EXTRACTING FILE "
  389.    .BYTE CHR╤UOTE,0
  390.  
  391. ECHO┼XTRACT═SG2 = *
  392.    .BYTE CHR╤UOTE
  393.    .ASC "..."
  394.    .BYTE CHR├╥,0
  395.  
  396. REPORT╧PEN┼RROR = *
  397.    LDA ZP
  398.    LDY ZP+1
  399.    JSR EPUTS
  400.    LDA #<REPORT╧PEN┼RROR═SG
  401.    LDY #>REPORT╧PEN┼RROR═SG
  402.    JSR EPUTS
  403.    RTS
  404.  
  405.    REPORT╧PEN┼RROR═SG = *
  406.    .ASC ": CANNOT OPEN; SKIPPING THIS FILE."
  407.    .BYTE CHR├╥,0
  408.  
  409. SCRATCH╞ILE = *
  410.    LDA #<SCRATCH╞ILE═SG1
  411.    LDY #>SCRATCH╞ILE═SG1
  412.    JSR EPUTS
  413.    LDA #<UUD╔N╠INE+10
  414.    LDY #>UUD╔N╠INE+10
  415.    JSR EPUTS
  416.    LDA #<SCRATCH╞ILE═SG2
  417.    LDY #>SCRATCH╞ILE═SG2
  418.    JSR EPUTS
  419.    JSR GETCHAR
  420.    PHA
  421. -  CMP #CHR├╥
  422.    BEQ +
  423.    JSR GETCHAR
  424.    JMP -
  425. +  LDA #<UUD╔N╠INE+10
  426.    LDY #>UUD╔N╠INE+10
  427.    STA ZP
  428.    STY ZP+1
  429.    PLA
  430.    CMP #"Y"
  431.    BEQ +
  432.    CMP #"┘"
  433.    BEQ +
  434.    RTS
  435. +  JSR REMOVE
  436.    RTS
  437.  
  438.    SCRATCH╞ILE═SG1 = *
  439.    .ASC "╧VERWRITE EXISTING FILE "
  440.    .BYTE CHR╤UOTE,0
  441.    SCRATCH╞ILE═SG2 = *
  442.    .BYTE CHR╤UOTE
  443.    .ASC "? "
  444.    .BYTE 0
  445.  
  446. CONVERT╞ILL .BUF 1
  447. CONVERT╠EN = 15
  448. UU├ONVERT╠INE = *
  449.    LDA #0
  450.    STA CONVERT╞ILL
  451.    LDA UUD╔N╠INE
  452.    BNE +
  453.    CLC
  454.    RTS
  455. +  JSR UU├ONVERT├HAR
  456.    BCC +
  457.    RTS
  458. +  STA UUD╔N╠INE
  459.    LDX #60
  460.    CMP #46
  461.    BCC +
  462.    LDX #84
  463. +  STX CONVERT╠EN
  464.    LDX #0
  465. -  CPX CONVERT╠EN
  466.    BCC +
  467.    CLC
  468.    RTS
  469. +  BIT CONVERT╞ILL
  470.    BMI DO├ONVERT╞ILL
  471.    LDA UUD╔N╠INE+1,X
  472.    BEQ +
  473.    JSR UU├ONVERT├HAR
  474.    BCC CONVERT├ONT
  475.    RTS
  476. +  LDA #$FF
  477.    STA CONVERT╞ILL
  478.  
  479.    DO├ONVERT╞ILL = *
  480.    LDA #0
  481.  
  482.    CONVERT├ONT = *
  483.    STA UUD╔N╠INE+1,X
  484.    INX
  485.    BNE -
  486.    RTS
  487.  
  488. UU├ONVERT├HAR = *
  489.    CMP #" "
  490.    BCS +
  491.    SEC
  492.    RTS
  493. +  CMP #"_"+1
  494.    BCS +
  495.    SEC
  496.    SBC #" "
  497.    CLC
  498.    RTS
  499. +  CMP #96
  500.    BNE +
  501. -  CLC
  502.    LDA #0
  503.    RTS
  504. +  CMP #"└"
  505.    BEQ -
  506.    BCS +
  507.    SEC
  508.    RTS
  509. +  CMP #"┌"+1
  510.    BCC +
  511.    RTS
  512. +  SEC
  513.    SBC #"┴"-33
  514.    CLC
  515.    RTS
  516.  
  517. UU├RUNCH╠INE = *
  518.    LDX #0
  519.    LDY #0
  520. -  JSR UU├RUNCH╟ROUP
  521.    CPY UUD╔N╠INE
  522.    BCC -
  523.    RTS
  524.  
  525. ;POS  76543210  76543210  76543210  76543210
  526. ;BYT  XX111111  XX112222  XX222233  XX333333
  527. ;BIT    765432    107654    321076    543210
  528.  
  529. UU├RUNCH╟ROUP = * ;(.╪=╔N4BYTES╧FFSET, .┘=╧UT3BYTES╧FFSET) : .╪++, .┘++
  530.    LDA UUD╔N╠INE+1,X  ;*** OUTPUT BYTE 0
  531.    ASL
  532.    ASL
  533.    STA TEMP
  534.    INX
  535.    LDA UUD╔N╠INE+1,X
  536.    LSR
  537.    LSR
  538.    LSR
  539.    LSR
  540.    AND #%00000011
  541.    ORA TEMP
  542.    STA UUD╔N╠INE+1,Y
  543.    INY
  544.    LDA UUD╔N╠INE+1,X  ;*** OUTPUT BYTE 1
  545.    ASL
  546.    ASL
  547.    ASL
  548.    ASL
  549.    STA TEMP
  550.    INX
  551.    LDA UUD╔N╠INE+1,X
  552.    LSR
  553.    LSR
  554.    AND #%00001111
  555.    ORA TEMP
  556.    STA UUD╔N╠INE+1,Y
  557.    INY
  558.    LDA UUD╔N╠INE+1,X  ;*** OUTPUT BYTE 2
  559.    INX
  560.    ROR
  561.    ROR
  562.    ROR
  563.    AND #%11000000
  564.    STA TEMP
  565.    LDA UUD╔N╠INE+1,X
  566.    INX
  567.    AND #%00111111
  568.    ORA TEMP
  569.    STA UUD╔N╠INE+1,Y
  570.    INY
  571.    RTS
  572.  
  573. UU╫RITE╠INE = *
  574.    LDA #<UUD╔N╠INE+1
  575.    LDY #>UUD╔N╠INE+1
  576.    STA ZP
  577.    STY ZP+1
  578.    LDA UUD╔N╠INE
  579.    LDY #0
  580.    LDX OUTFILE
  581.    JSR WRITE
  582.    RTS
  583.  
  584. GETLINE╨OS = 14
  585. HIT╠AST╠INE .BUF 1
  586. LAST╠INE╘ERMINATOR .BUF 1
  587.  
  588. GETLINE = *
  589.    LDA HIT╠AST╠INE
  590.    BEQ +
  591.    SEC
  592.    RTS
  593. +  LDX #0
  594.    STX GETLINE╨OS
  595.  
  596.    ;** TOSS AN ╠╞ THAT FOLLOWS A ├╥
  597.    JSR GET┬YTE
  598.    BCS GETLINE╨ROCESS
  599.    CMP #CHR╠╞
  600.    CLC
  601.    BNE GETLINE╨ROCESS
  602.    LDX LAST╠INE╘ERMINATOR
  603.    CPX #CHR├╥
  604.    CLC
  605.    BNE GETLINE╨ROCESS
  606.  
  607.    GETLINE├HAR = *
  608.    JSR GET┬YTE
  609.    GETLINE╨ROCESS = *
  610.    BCC +
  611.    LDA #$FF
  612.    STA HIT╠AST╠INE
  613.    JMP GETLINE╞INISH
  614. +  CMP #CHR├╥
  615.    BEQ GETLINE╞INISH
  616.    CMP #CHR╠╞
  617.    BEQ GETLINE╞INISH
  618.    LDX GETLINE╨OS
  619.    CPX #98
  620.    BCS +
  621.    STA UUD╔N╠INE,X
  622.    INC GETLINE╨OS
  623. +  JMP GETLINE├HAR
  624.  
  625.    GETLINE╞INISH = *
  626.    STA LAST╠INE╘ERMINATOR
  627.    LDX GETLINE╨OS
  628.    LDA #0
  629.    STA UUD╔N╠INE,X
  630.    CPX #0
  631.    BEQ +
  632.    CLC
  633.    RTS
  634. +  LDA HIT╠AST╠INE
  635.    CMP #1
  636.    RTS
  637.  
  638. GET┬YTE = *
  639.    LDA BUF├OUNT
  640.    ORA BUF├OUNT+1
  641.    BEQ GET┬YTE╞ILL┬UF
  642.    LDY #0
  643.    LDA (BUF╨TR),Y
  644.    INC BUF╨TR
  645.    BNE +
  646.    INC BUF╨TR+1
  647. +  LDX BUF├OUNT
  648.    BNE +
  649.    DEC BUF├OUNT+1
  650. +  DEC BUF├OUNT
  651.    CLC
  652.    RTS
  653.  
  654. GET┬YTE╞ILL┬UF = *
  655.    JSR CHECKSTOP
  656.    LDA #<UUD╔N┬UF
  657.    LDY #>UUD╔N┬UF
  658.    STA ZP
  659.    STY ZP+1
  660.    STA BUF╨TR
  661.    STY BUF╨TR+1
  662.    LDA IN┬UF╠EN
  663.    LDY IN┬UF╠EN+1
  664.    LDX INFILE
  665.    JSR READ
  666.    BEQ +
  667.    BCS +
  668.    STA BUF├OUNT
  669.    STY BUF├OUNT+1
  670.    JMP GET┬YTE
  671. +  SEC
  672.    RTS
  673.  
  674. ;===THE END===
  675. UUD┬SS = *
  676. UUD╔N╠INE = UUD┬SS+0
  677. UUD╔N┬UF  = UUD┬SS+100
  678.