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

  1. ;*** ╦┴╥ FILE DECODER VERSION 1.00 - BY ├RAIG ┬RUCE - 05-═AR-94
  2.  
  3. ;UNKAR [-HELP] FILE ...
  4.  
  5. ;╦EVIN'S ┴╥CHIVER FORMAT, CREATED BY ╦EVIN ╨HILLIPS AND ├RAIG ┬RUCE, 1991
  6. ;LINE LENGTH LIMITED TO 250 CHARACTERS
  7.  
  8. .SEQ ACEHEAD.S
  9. .ORG ACE┴PP┴DDRESS
  10. .OBJ "@0:UNKAR"
  11.  
  12. JMP MAIN
  13. .BYTE ACE╔─1,ACE╔─2,ACE╔─3
  14. .BYTE 64,0  ;** STACK,RESERVED
  15.  
  16. ;*** GLOBAL DECLARATIONS
  17.  
  18. CHR┬┼╠ = $07
  19. CHR╘┴┬ = $09
  20. CHR╠╞ = $0A
  21. CHR├╥ = $0D
  22. CHR┬╙ = $14
  23. CHR├╠╥ = $93
  24. CHR╤╒╧╘┼ = $22
  25.  
  26. ARG          =  2 ;(2)  ;CURRENT ARGUMENT NUMBER
  27. NAME         =  4 ;(2)  ;NAME OF FILE BEING BCODED
  28. IN┬UF╨TR     =  6 ;(2)  ;NEXT CHAR TO EXTRACT FROM IN┬UF
  29. IN┬UF├OUNT   =  8 ;(2)  ;NUMBER OF VALID CHARS IN IN┬UF
  30. IN┬UF╠EN     = 10 ;(2)  ;TOTAL SIZE OF INPUT BUFFER
  31. SCAN╓AL      = 12 ;(4)  ;SCAN╬UM: VALUE RETURNED
  32. SCAN╙AVE     = 16 ;(4)  ;SCAN╬UM: SAVE FOR *4 TO *5
  33. SCAN─IGIT    = 20 ;(1)  ;SCAN╬UM: NEW DIGIT
  34. SCAN╘EMP     = 21 ;(1)  ;SCAN╬UM: TEMP
  35. SCAN╔NDEX    = 22 ;(1)  ;SCAN╬UM: SCANNING INDEX
  36. SCAN┴NYTHING = 23 ;(1)  ;SCAN╬UM: FLAG FOR IF ANYTHING SCANNED
  37. FILE├OUNT    = 24 ;(4)  ;FILES LEFT IN CURRENT ARCHIVE
  38. LINE├OUNT    = 28 ;(4)  ;LINES LEFT IN CURRENT FILE
  39. IN╞ILE       = 32 ;(1)  ;INPUT FILE DESCRIPTOR
  40. OUT╞ILE      = 33 ;(1)  ;OUTPUT FILE DESCRIPTOR
  41. WORK         = 112 ;(16);TEMPORARY WORK AREA, LOWEST LEVEL
  42.  
  43. ;===MAIN===
  44.  
  45. MAIN = *
  46.    ;** CHECK FOR LARGE ENOUGH ╘╨┴
  47.    SEC
  48.    LDA #<BSS┼ND
  49.    CMP ACE═EM╘OP+0
  50.    LDA #>BSS┼ND
  51.    SBC ACE═EM╘OP+1
  52.    BCS +
  53.    JMP MAIN╔NIT
  54. +  LDA #<TPA═SG
  55.    LDY #>TPA═SG
  56.    JSR EPUTS
  57. DIE = *
  58.    LDA #1
  59.    LDX #0
  60.    JMP EXIT
  61.  
  62. TPA═SG = *
  63.    .ASC "╔NSUFFICIENT PROGRAM SPACE TO RUN MORE"
  64.    .BYTE CHR├╥,0
  65.  
  66. USAGE = *
  67.    LDA #<USAGE═SG
  68.    LDY #>USAGE═SG
  69.    JSR EPUTS
  70.    JMP DIE
  71.  
  72. USAGE═SG = *
  73.    .ASC "USAGE: UNKAR [-HELP] FILE ..."
  74.    .BYTE CHR├╥,0
  75.  
  76. MAIN╔NIT = *
  77.    LDA #0
  78.    STA ARG+0
  79.    STA ARG+1
  80.  
  81.    MAIN╬EXT = *
  82.    JSR CHECK╙TOP
  83.    INC ARG+0
  84.    BNE +
  85.    INC ARG+1
  86. +  LDA ARG+0
  87.    LDY ARG+1
  88.    JSR GETARG
  89.    BEQ MAIN┼XIT
  90.    LDA ZP+0
  91.    LDY ZP+1
  92.    STA NAME+0
  93.    STY NAME+1
  94.    LDY #0
  95.    LDA (ZP),Y
  96.    CMP #"-"
  97.    BNE +
  98.    JMP USAGE
  99. +  JSR UNKAR
  100.    JMP MAIN╬EXT
  101.  
  102. MAIN┼XIT = *
  103.    RTS
  104.  
  105. CHECK╙TOP = *
  106.    JSR STOPKEY
  107.    BCS +
  108.    RTS
  109. +  LDA #<STOPPED═SG
  110.    LDY #>STOPPED═SG
  111.    JSR EPUTS
  112.    JMP DIE
  113.  
  114.    STOPPED═SG = *
  115.    .ASC "<╙TOPPED>"
  116.    .BYTE CHR├╥,0
  117.  
  118. UNKAR = *
  119.    JSR ECHO
  120.    ;** OPEN FILE
  121.    LDA NAME+0
  122.    LDY NAME+1
  123.    STA ZP+0
  124.    STY ZP+1
  125.    LDA #"R"
  126.    JSR OPEN
  127.    BCC +
  128.    ;XX OPEN ERROR
  129.    RTS
  130. +  STA IN╞ILE
  131.    JSR INIT╟ET┬YTE
  132.    ;** DECODE FILE
  133.    JSR UNKAR┬ODY
  134.    ;** CLOSE FILE
  135.    LDA IN╞ILE
  136.    JSR CLOSE
  137.    RTS
  138.  
  139. INVALID╞ORMAT═SG = *
  140.    .ASC ": INVALID ╦┴╥ FILE FORMAT"
  141.    .BYTE CHR├╥,0
  142. INVALID╞ORMAT = *
  143.    LDA NAME+0
  144.    LDY NAME+1
  145.    JSR EPUTS
  146.    LDA #<INVALID╞ORMAT═SG
  147.    LDY #>INVALID╞ORMAT═SG
  148.    JSR EPUTS
  149.    RTS
  150.  
  151. UNKAR┬ODY = *
  152.    ;** GET THE FILE COUNT
  153.    JSR GETLINE
  154.    BCS INVALID╞ORMAT
  155.    LDX #FILE├OUNT
  156.    JSR GETNUM
  157.    BCS INVALID╞ORMAT
  158.  
  159.    UNKAR╬EXT╞ILE = *
  160.    JSR CHECK╙TOP
  161.    LDA FILE├OUNT+0
  162.    ORA FILE├OUNT+1
  163.    ORA FILE├OUNT+2
  164.    ORA FILE├OUNT+3
  165.    BNE +
  166.    RTS
  167.    ;** GET FILENAME
  168. +  JSR GETLINE
  169.    BCS INVALID╞ORMAT
  170.    JSR ECHO┼XTRACT
  171.    LDA #<LINE
  172.    LDY #>LINE
  173.    STA ZP+0
  174.    STY ZP+1
  175.    LDA #"W"
  176.    JSR OPEN
  177.    BCC +
  178.    ;XX CHECK FOR FILE EXISTS
  179.    LDA #<LINE
  180.    LDY #>LINE
  181.    JSR EPUTS
  182.    LDA #<CANNOT╧PEN═SG
  183.    LDY #>CANNOT╧PEN═SG
  184.    JSR EPUTS
  185.    RTS
  186. +  STA OUT╞ILE
  187.    ;** GET FILE LINE COUNT
  188.    JSR GETLINE
  189.    BCS INVALID╞ORMAT├LOSE
  190.    LDX #LINE├OUNT
  191.    JSR GETNUM
  192.    BCC UNKAR╬EXT╠INE
  193.    INVALID╞ORMAT├LOSE = *
  194.    LDA OUT╞ILE
  195.    JSR CLOSE
  196.    JMP INVALID╞ORMAT
  197.  
  198.    UNKAR╬EXT╠INE = *
  199.    LDA LINE├OUNT+0
  200.    ORA LINE├OUNT+1
  201.    ORA LINE├OUNT+2
  202.    ORA LINE├OUNT+3
  203.    BNE +
  204.    LDA OUT╞ILE
  205.    JSR CLOSE
  206.    LDX #FILE├OUNT
  207.    JSR DEC32
  208.    JMP UNKAR╬EXT╞ILE
  209.  
  210.    ;** COPY LINES OF FILE
  211. +  JSR GETLINE
  212.    BCS INVALID╞ORMAT├LOSE
  213.    LDA #CHR├╥
  214.    STA LINE,Y
  215.    INY
  216.    LDA #<LINE
  217.    LDX #>LINE
  218.    STA ZP+0
  219.    STX ZP+1
  220.    TYA
  221.    LDY #0
  222.    LDX OUT╞ILE
  223.    JSR WRITE
  224.    LDX #LINE├OUNT
  225.    JSR DEC32
  226.    JMP UNKAR╬EXT╠INE
  227.  
  228.    CANNOT╧PEN═SG = *
  229.    .ASC ": CANNOT OPEN FOR WRITING"
  230.    .BYTE CHR├╥,0
  231.  
  232. DEC32 = *
  233.    CLC
  234.    LDY #4
  235. -  LDA 0,X
  236.    SBC #0
  237.    STA 0,X
  238.    INX
  239.    DEY
  240.    BNE -
  241.    RTS
  242.  
  243. ECHO = *
  244.    LDA #<ECHO═SG1
  245.    LDY #>ECHO═SG1
  246.    JSR EPUTS
  247.    LDA NAME+0
  248.    LDY NAME+1
  249.    JSR EPUTS
  250.    LDA #<ECHO═SG2
  251.    LDY #>ECHO═SG2
  252.    JMP EPUTS
  253. ECHO═SG1 = *
  254.    .ASC "UNKARING FILE "
  255.    .BYTE CHR╤╒╧╘┼,0
  256. ECHO═SG2 = *
  257.    .BYTE CHR╤╒╧╘┼,CHR├╥,0
  258.  
  259. ECHO┼XTRACT = *
  260.    LDA #<ECHO┼XTRACT═SG1
  261.    LDY #>ECHO┼XTRACT═SG1
  262.    JSR EPUTS
  263.    LDA #<LINE
  264.    LDY #>LINE
  265.    JSR EPUTS
  266.    LDA #<ECHO┼XTRACT═SG2
  267.    LDY #>ECHO┼XTRACT═SG2
  268.    JMP EPUTS
  269. ECHO┼XTRACT═SG1 = *
  270.    .ASC "EXTRACTING FILE "
  271.    .BYTE CHR╤╒╧╘┼,0
  272. ECHO┼XTRACT═SG2 = *
  273.    .BYTE CHR╤╒╧╘┼,CHR├╥,0
  274.  
  275. ;=== STANDARD LIBRARY ===
  276.  
  277. PUTS = *
  278.    LDX #STDOUT
  279. FPUTS = *
  280.    STA ZP+0
  281.    STY ZP+1
  282.    LDY #$FF
  283. -  INY
  284.    LDA (ZP),Y
  285.    BNE -
  286.    TYA
  287.    LDY #0
  288.    JMP WRITE
  289. EPUTS = *
  290.    LDX #STDERR
  291.    JMP FPUTS
  292.  
  293. EPUTCHAR = *
  294.    LDX #STDERR
  295.    JMP PUTC
  296. PUTCHAR = *
  297.    LDX #STDOUT
  298. PUTC = *
  299.    STA PUTC┬UFFER
  300.    LDA #<PUTC┬UFFER
  301.    LDY #>PUTC┬UFFER
  302.    STA ZP+0
  303.    STY ZP+1
  304.    LDA #1
  305.    LDY #0
  306.    JMP WRITE
  307.    PUTC┬UFFER .BUF 1
  308.  
  309. GETARG = *
  310.    STY ZP+1
  311.    ASL
  312.    STA ZP+0
  313.    ROL ZP+1
  314.    CLC
  315.    LDA ACE┴RGV+0
  316.    ADC ZP+0
  317.    STA ZP+0
  318.    LDA ACE┴RGV+1
  319.    ADC ZP+1
  320.    STA ZP+1
  321.    LDY #0
  322.    LDA (ZP),Y
  323.    TAX
  324.    INY
  325.    LDA (ZP),Y
  326.    STX ZP+0
  327.    STA ZP+1
  328.    ORA ZP+0
  329.    RTS
  330.  
  331. GETLINE = *  ;( ) : LINE, .┘=LINE╠EN, .├╙=EOF
  332.    LDY #0
  333. -  STY WORK+0
  334.    JSR GET┬YTE
  335.    BCC +
  336.    RTS
  337. +  LDY WORK+0
  338.    STA LINE,Y
  339.    INY
  340.    CPY #254
  341.    BCS GETLINE╙KIP
  342.    CMP #CHR├╥
  343.    BNE -
  344.    DEY
  345.  
  346.    GETLINE┼XIT = *
  347.    LDA #0
  348.    STA LINE,Y
  349.    CLC
  350.    RTS
  351.  
  352.    GETLINE╙KIP = *
  353.    LDA #<GETLINE╘OO╠ONG═SG
  354.    LDY #>GETLINE╘OO╠ONG═SG
  355.    JSR EPUTS
  356. -  JSR GET┬YTE
  357.    BCC +
  358.    RTS
  359. +  CMP #CHR├╥
  360.    BNE -
  361.    LDY #254
  362.    JMP GETLINE┼XIT
  363.  
  364.    GETLINE╘OO╠ONG═SG = *
  365.    .ASC "UNKAR: LINE TOO LONG, TRUNCATING"
  366.    .BYTE CHR├╥,0
  367.  
  368. INIT╟ET┬YTE = *
  369.    LDA #0
  370.    STA IN┬UF├OUNT+0
  371.    STA IN┬UF├OUNT+1
  372.    SEC
  373.    LDA ACE═EM╘OP+0
  374.    SBC #<IN┬UF
  375.    STA IN┬UF╠EN+0
  376.    LDA ACE═EM╘OP+1
  377.    SBC #>IN┬UF
  378.    STA IN┬UF╠EN+1
  379.    RTS
  380.  
  381. GET┬YTE = *
  382.    LDA IN┬UF├OUNT+0
  383.    ORA IN┬UF├OUNT+1
  384.    BEQ GET┬YTE╞ILL┬UF
  385.    LDY #0
  386.    LDA (IN┬UF╨TR),Y
  387.    INC IN┬UF╨TR+0
  388.    BNE +
  389.    INC IN┬UF╨TR+1
  390. +  LDX IN┬UF├OUNT+0
  391.    BNE +
  392.    DEC IN┬UF├OUNT+1
  393. +  DEC IN┬UF├OUNT+0
  394.    CLC
  395.    RTS
  396.  
  397. GET┬YTE╞ILL┬UF = *
  398.    JSR CHECK╙TOP
  399.    LDA #<IN┬UF
  400.    LDY #>IN┬UF
  401.    STA ZP+0
  402.    STY ZP+1
  403.    STA IN┬UF╨TR+0
  404.    STY IN┬UF╨TR+1
  405.    LDA IN┬UF╠EN+0
  406.    LDY IN┬UF╠EN+1
  407.    LDX IN╞ILE
  408.    JSR READ
  409.    BEQ +
  410.    BCS +
  411.    STA IN┬UF├OUNT+0
  412.    STY IN┬UF├OUNT+1
  413.    JMP GET┬YTE
  414. +  SEC
  415.    RTS
  416.  
  417. SCAN╬UM = *  ;( (ZP)=NUM, .┘=IN╠INE╔NDEX ) : .┘=SCAN, [SCAN╓AL]=NUM, .├╙=ERR
  418.    LDX #3
  419.    LDA #0
  420. -  STA SCAN╓AL,X
  421.    DEX
  422.    BPL -
  423.    LDA #0
  424.    STA SCAN┴NYTHING
  425. -  LDA (ZP),Y
  426.    CMP #" "
  427.    BNE SCAN╬UM╬EXT
  428.    INY
  429.    BNE -
  430.    SEC
  431.    RTS
  432.  
  433.    SCAN╬UM╬EXT = *
  434.    LDA (ZP),Y
  435.    CMP #"0"
  436.    BCC +
  437.    CMP #"9"+1
  438.    BCC ++
  439. +  LDA SCAN┴NYTHING
  440.    BEQ SCAN┼RROR
  441.    CLC
  442.    RTS
  443. +  AND #$0F
  444.    STA SCAN─IGIT
  445.    LDA #$FF
  446.    STA SCAN┴NYTHING
  447.    ;** TIMES TEN
  448.    STY SCAN╘EMP
  449.    LDX #3
  450. -  LDA SCAN╓AL,X
  451.    STA SCAN╙AVE,X
  452.    DEX
  453.    BPL -
  454.    LDA #2
  455.    STA SCAN╔NDEX
  456. -  CLC
  457.    LDY #4
  458.    LDX #0
  459. -  ROL SCAN╓AL,X
  460.    INX
  461.    DEY
  462.    BNE -
  463.    BCS SCAN┼RROR
  464.    DEC SCAN╔NDEX
  465.    BNE --
  466.    CLC
  467.    LDY #4
  468.    LDX #0
  469. -  LDA SCAN╓AL,X
  470.    ADC SCAN╙AVE,X
  471.    STA SCAN╓AL,X
  472.    INX
  473.    DEY
  474.    BNE -
  475.    BCS SCAN┼RROR
  476.    CLC
  477.    LDY #4
  478.    LDX #0
  479. -  ROL SCAN╓AL,X
  480.    INX
  481.    DEY
  482.    BNE -
  483.    BCS SCAN┼RROR
  484.    CLC
  485.    LDY #4
  486.    LDX #0
  487.    LDA SCAN─IGIT
  488. -  ADC SCAN╓AL,X
  489.    STA SCAN╓AL,X
  490.    LDA #0
  491.    INX
  492.    DEY
  493.    BNE -
  494.    BCS SCAN┼RROR
  495.  
  496.    LDY SCAN╘EMP
  497.    INY
  498.    BEQ SCAN┼RROR
  499.    JMP SCAN╬UM╬EXT
  500.  
  501.    SCAN┼RROR = *
  502.    SEC
  503.    RTS
  504.  
  505. GETNUM = *  ;( LINE, .╪=ZPADDR ) : .├╙=ERR
  506.    STX WORK+0
  507.    LDA #<LINE
  508.    LDY #>LINE
  509.    STA ZP+0
  510.    STY ZP+1
  511.    LDY #0
  512.    JSR SCAN╬UM
  513.    BCC +
  514.    RTS
  515. +  LDY #0
  516.    LDX WORK+0
  517. -  LDA SCAN╓AL,Y
  518.    STA 0,X
  519.    INX
  520.    INY
  521.    CPY #4
  522.    BCC -
  523.    CLC
  524.    RTS
  525.  
  526. ;===BSS===
  527.  
  528. BSS    = *
  529. LINE   = BSS+0  
  530. IN┬UF  = LINE+256
  531. BSS┼ND = IN┬UF+64
  532.