home *** CD-ROM | disk | FTP | other *** search
- ;*** ╦┴╥ FILE DECODER VERSION 1.00 - BY ├RAIG ┬RUCE - 05-═AR-94
-
- ;UNKAR [-HELP] FILE ...
-
- ;╦EVIN'S ┴╥CHIVER FORMAT, CREATED BY ╦EVIN ╨HILLIPS AND ├RAIG ┬RUCE, 1991
- ;LINE LENGTH LIMITED TO 250 CHARACTERS
-
- .SEQ ACEHEAD.S
- .ORG ACE┴PP┴DDRESS
- .OBJ "@0:UNKAR"
-
- JMP MAIN
- .BYTE ACE╔─1,ACE╔─2,ACE╔─3
- .BYTE 64,0 ;** STACK,RESERVED
-
- ;*** GLOBAL DECLARATIONS
-
- CHR┬┼╠ = $07
- CHR╘┴┬ = $09
- CHR╠╞ = $0A
- CHR├╥ = $0D
- CHR┬╙ = $14
- CHR├╠╥ = $93
- CHR╤╒╧╘┼ = $22
-
- ARG = 2 ;(2) ;CURRENT ARGUMENT NUMBER
- NAME = 4 ;(2) ;NAME OF FILE BEING BCODED
- IN┬UF╨TR = 6 ;(2) ;NEXT CHAR TO EXTRACT FROM IN┬UF
- IN┬UF├OUNT = 8 ;(2) ;NUMBER OF VALID CHARS IN IN┬UF
- IN┬UF╠EN = 10 ;(2) ;TOTAL SIZE OF INPUT BUFFER
- SCAN╓AL = 12 ;(4) ;SCAN╬UM: VALUE RETURNED
- SCAN╙AVE = 16 ;(4) ;SCAN╬UM: SAVE FOR *4 TO *5
- SCAN─IGIT = 20 ;(1) ;SCAN╬UM: NEW DIGIT
- SCAN╘EMP = 21 ;(1) ;SCAN╬UM: TEMP
- SCAN╔NDEX = 22 ;(1) ;SCAN╬UM: SCANNING INDEX
- SCAN┴NYTHING = 23 ;(1) ;SCAN╬UM: FLAG FOR IF ANYTHING SCANNED
- FILE├OUNT = 24 ;(4) ;FILES LEFT IN CURRENT ARCHIVE
- LINE├OUNT = 28 ;(4) ;LINES LEFT IN CURRENT FILE
- IN╞ILE = 32 ;(1) ;INPUT FILE DESCRIPTOR
- OUT╞ILE = 33 ;(1) ;OUTPUT FILE DESCRIPTOR
- WORK = 112 ;(16);TEMPORARY WORK AREA, LOWEST LEVEL
-
- ;===MAIN===
-
- MAIN = *
- ;** CHECK FOR LARGE ENOUGH ╘╨┴
- SEC
- LDA #<BSS┼ND
- CMP ACE═EM╘OP+0
- LDA #>BSS┼ND
- SBC ACE═EM╘OP+1
- BCS +
- JMP MAIN╔NIT
- + LDA #<TPA═SG
- LDY #>TPA═SG
- JSR EPUTS
- DIE = *
- LDA #1
- LDX #0
- JMP EXIT
-
- TPA═SG = *
- .ASC "╔NSUFFICIENT PROGRAM SPACE TO RUN MORE"
- .BYTE CHR├╥,0
-
- USAGE = *
- LDA #<USAGE═SG
- LDY #>USAGE═SG
- JSR EPUTS
- JMP DIE
-
- USAGE═SG = *
- .ASC "USAGE: UNKAR [-HELP] FILE ..."
- .BYTE CHR├╥,0
-
- MAIN╔NIT = *
- LDA #0
- STA ARG+0
- STA ARG+1
-
- MAIN╬EXT = *
- JSR CHECK╙TOP
- INC ARG+0
- BNE +
- INC ARG+1
- + LDA ARG+0
- LDY ARG+1
- JSR GETARG
- BEQ MAIN┼XIT
- LDA ZP+0
- LDY ZP+1
- STA NAME+0
- STY NAME+1
- LDY #0
- LDA (ZP),Y
- CMP #"-"
- BNE +
- JMP USAGE
- + JSR UNKAR
- JMP MAIN╬EXT
-
- MAIN┼XIT = *
- RTS
-
- CHECK╙TOP = *
- JSR STOPKEY
- BCS +
- RTS
- + LDA #<STOPPED═SG
- LDY #>STOPPED═SG
- JSR EPUTS
- JMP DIE
-
- STOPPED═SG = *
- .ASC "<╙TOPPED>"
- .BYTE CHR├╥,0
-
- UNKAR = *
- JSR ECHO
- ;** OPEN FILE
- LDA NAME+0
- LDY NAME+1
- STA ZP+0
- STY ZP+1
- LDA #"R"
- JSR OPEN
- BCC +
- ;XX OPEN ERROR
- RTS
- + STA IN╞ILE
- JSR INIT╟ET┬YTE
- ;** DECODE FILE
- JSR UNKAR┬ODY
- ;** CLOSE FILE
- LDA IN╞ILE
- JSR CLOSE
- RTS
-
- INVALID╞ORMAT═SG = *
- .ASC ": INVALID ╦┴╥ FILE FORMAT"
- .BYTE CHR├╥,0
- INVALID╞ORMAT = *
- LDA NAME+0
- LDY NAME+1
- JSR EPUTS
- LDA #<INVALID╞ORMAT═SG
- LDY #>INVALID╞ORMAT═SG
- JSR EPUTS
- RTS
-
- UNKAR┬ODY = *
- ;** GET THE FILE COUNT
- JSR GETLINE
- BCS INVALID╞ORMAT
- LDX #FILE├OUNT
- JSR GETNUM
- BCS INVALID╞ORMAT
-
- UNKAR╬EXT╞ILE = *
- JSR CHECK╙TOP
- LDA FILE├OUNT+0
- ORA FILE├OUNT+1
- ORA FILE├OUNT+2
- ORA FILE├OUNT+3
- BNE +
- RTS
- ;** GET FILENAME
- + JSR GETLINE
- BCS INVALID╞ORMAT
- JSR ECHO┼XTRACT
- LDA #<LINE
- LDY #>LINE
- STA ZP+0
- STY ZP+1
- LDA #"W"
- JSR OPEN
- BCC +
- ;XX CHECK FOR FILE EXISTS
- LDA #<LINE
- LDY #>LINE
- JSR EPUTS
- LDA #<CANNOT╧PEN═SG
- LDY #>CANNOT╧PEN═SG
- JSR EPUTS
- RTS
- + STA OUT╞ILE
- ;** GET FILE LINE COUNT
- JSR GETLINE
- BCS INVALID╞ORMAT├LOSE
- LDX #LINE├OUNT
- JSR GETNUM
- BCC UNKAR╬EXT╠INE
- INVALID╞ORMAT├LOSE = *
- LDA OUT╞ILE
- JSR CLOSE
- JMP INVALID╞ORMAT
-
- UNKAR╬EXT╠INE = *
- LDA LINE├OUNT+0
- ORA LINE├OUNT+1
- ORA LINE├OUNT+2
- ORA LINE├OUNT+3
- BNE +
- LDA OUT╞ILE
- JSR CLOSE
- LDX #FILE├OUNT
- JSR DEC32
- JMP UNKAR╬EXT╞ILE
-
- ;** COPY LINES OF FILE
- + JSR GETLINE
- BCS INVALID╞ORMAT├LOSE
- LDA #CHR├╥
- STA LINE,Y
- INY
- LDA #<LINE
- LDX #>LINE
- STA ZP+0
- STX ZP+1
- TYA
- LDY #0
- LDX OUT╞ILE
- JSR WRITE
- LDX #LINE├OUNT
- JSR DEC32
- JMP UNKAR╬EXT╠INE
-
- CANNOT╧PEN═SG = *
- .ASC ": CANNOT OPEN FOR WRITING"
- .BYTE CHR├╥,0
-
- DEC32 = *
- CLC
- LDY #4
- - LDA 0,X
- SBC #0
- STA 0,X
- INX
- DEY
- BNE -
- RTS
-
- ECHO = *
- LDA #<ECHO═SG1
- LDY #>ECHO═SG1
- JSR EPUTS
- LDA NAME+0
- LDY NAME+1
- JSR EPUTS
- LDA #<ECHO═SG2
- LDY #>ECHO═SG2
- JMP EPUTS
- ECHO═SG1 = *
- .ASC "UNKARING FILE "
- .BYTE CHR╤╒╧╘┼,0
- ECHO═SG2 = *
- .BYTE CHR╤╒╧╘┼,CHR├╥,0
-
- ECHO┼XTRACT = *
- LDA #<ECHO┼XTRACT═SG1
- LDY #>ECHO┼XTRACT═SG1
- JSR EPUTS
- LDA #<LINE
- LDY #>LINE
- JSR EPUTS
- LDA #<ECHO┼XTRACT═SG2
- LDY #>ECHO┼XTRACT═SG2
- JMP EPUTS
- ECHO┼XTRACT═SG1 = *
- .ASC "EXTRACTING FILE "
- .BYTE CHR╤╒╧╘┼,0
- ECHO┼XTRACT═SG2 = *
- .BYTE CHR╤╒╧╘┼,CHR├╥,0
-
- ;=== STANDARD LIBRARY ===
-
- PUTS = *
- LDX #STDOUT
- FPUTS = *
- STA ZP+0
- STY ZP+1
- LDY #$FF
- - INY
- LDA (ZP),Y
- BNE -
- TYA
- LDY #0
- JMP WRITE
- EPUTS = *
- LDX #STDERR
- JMP FPUTS
-
- EPUTCHAR = *
- LDX #STDERR
- JMP PUTC
- PUTCHAR = *
- LDX #STDOUT
- PUTC = *
- STA PUTC┬UFFER
- LDA #<PUTC┬UFFER
- LDY #>PUTC┬UFFER
- STA ZP+0
- STY ZP+1
- LDA #1
- LDY #0
- JMP WRITE
- PUTC┬UFFER .BUF 1
-
- GETARG = *
- STY ZP+1
- ASL
- STA ZP+0
- ROL ZP+1
- CLC
- LDA ACE┴RGV+0
- ADC ZP+0
- STA ZP+0
- LDA ACE┴RGV+1
- ADC ZP+1
- STA ZP+1
- LDY #0
- LDA (ZP),Y
- TAX
- INY
- LDA (ZP),Y
- STX ZP+0
- STA ZP+1
- ORA ZP+0
- RTS
-
- GETLINE = * ;( ) : LINE, .┘=LINE╠EN, .├╙=EOF
- LDY #0
- - STY WORK+0
- JSR GET┬YTE
- BCC +
- RTS
- + LDY WORK+0
- STA LINE,Y
- INY
- CPY #254
- BCS GETLINE╙KIP
- CMP #CHR├╥
- BNE -
- DEY
-
- GETLINE┼XIT = *
- LDA #0
- STA LINE,Y
- CLC
- RTS
-
- GETLINE╙KIP = *
- LDA #<GETLINE╘OO╠ONG═SG
- LDY #>GETLINE╘OO╠ONG═SG
- JSR EPUTS
- - JSR GET┬YTE
- BCC +
- RTS
- + CMP #CHR├╥
- BNE -
- LDY #254
- JMP GETLINE┼XIT
-
- GETLINE╘OO╠ONG═SG = *
- .ASC "UNKAR: LINE TOO LONG, TRUNCATING"
- .BYTE CHR├╥,0
-
- INIT╟ET┬YTE = *
- LDA #0
- STA IN┬UF├OUNT+0
- STA IN┬UF├OUNT+1
- SEC
- LDA ACE═EM╘OP+0
- SBC #<IN┬UF
- STA IN┬UF╠EN+0
- LDA ACE═EM╘OP+1
- SBC #>IN┬UF
- STA IN┬UF╠EN+1
- RTS
-
- GET┬YTE = *
- LDA IN┬UF├OUNT+0
- ORA IN┬UF├OUNT+1
- BEQ GET┬YTE╞ILL┬UF
- LDY #0
- LDA (IN┬UF╨TR),Y
- INC IN┬UF╨TR+0
- BNE +
- INC IN┬UF╨TR+1
- + LDX IN┬UF├OUNT+0
- BNE +
- DEC IN┬UF├OUNT+1
- + DEC IN┬UF├OUNT+0
- CLC
- RTS
-
- GET┬YTE╞ILL┬UF = *
- JSR CHECK╙TOP
- LDA #<IN┬UF
- LDY #>IN┬UF
- STA ZP+0
- STY ZP+1
- STA IN┬UF╨TR+0
- STY IN┬UF╨TR+1
- LDA IN┬UF╠EN+0
- LDY IN┬UF╠EN+1
- LDX IN╞ILE
- JSR READ
- BEQ +
- BCS +
- STA IN┬UF├OUNT+0
- STY IN┬UF├OUNT+1
- JMP GET┬YTE
- + SEC
- RTS
-
- SCAN╬UM = * ;( (ZP)=NUM, .┘=IN╠INE╔NDEX ) : .┘=SCAN, [SCAN╓AL]=NUM, .├╙=ERR
- LDX #3
- LDA #0
- - STA SCAN╓AL,X
- DEX
- BPL -
- LDA #0
- STA SCAN┴NYTHING
- - LDA (ZP),Y
- CMP #" "
- BNE SCAN╬UM╬EXT
- INY
- BNE -
- SEC
- RTS
-
- SCAN╬UM╬EXT = *
- LDA (ZP),Y
- CMP #"0"
- BCC +
- CMP #"9"+1
- BCC ++
- + LDA SCAN┴NYTHING
- BEQ SCAN┼RROR
- CLC
- RTS
- + AND #$0F
- STA SCAN─IGIT
- LDA #$FF
- STA SCAN┴NYTHING
- ;** TIMES TEN
- STY SCAN╘EMP
- LDX #3
- - LDA SCAN╓AL,X
- STA SCAN╙AVE,X
- DEX
- BPL -
- LDA #2
- STA SCAN╔NDEX
- - CLC
- LDY #4
- LDX #0
- - ROL SCAN╓AL,X
- INX
- DEY
- BNE -
- BCS SCAN┼RROR
- DEC SCAN╔NDEX
- BNE --
- CLC
- LDY #4
- LDX #0
- - LDA SCAN╓AL,X
- ADC SCAN╙AVE,X
- STA SCAN╓AL,X
- INX
- DEY
- BNE -
- BCS SCAN┼RROR
- CLC
- LDY #4
- LDX #0
- - ROL SCAN╓AL,X
- INX
- DEY
- BNE -
- BCS SCAN┼RROR
- CLC
- LDY #4
- LDX #0
- LDA SCAN─IGIT
- - ADC SCAN╓AL,X
- STA SCAN╓AL,X
- LDA #0
- INX
- DEY
- BNE -
- BCS SCAN┼RROR
-
- LDY SCAN╘EMP
- INY
- BEQ SCAN┼RROR
- JMP SCAN╬UM╬EXT
-
- SCAN┼RROR = *
- SEC
- RTS
-
- GETNUM = * ;( LINE, .╪=ZPADDR ) : .├╙=ERR
- STX WORK+0
- LDA #<LINE
- LDY #>LINE
- STA ZP+0
- STY ZP+1
- LDY #0
- JSR SCAN╬UM
- BCC +
- RTS
- + LDY #0
- LDX WORK+0
- - LDA SCAN╓AL,Y
- STA 0,X
- INX
- INY
- CPY #4
- BCC -
- CLC
- RTS
-
- ;===BSS===
-
- BSS = *
- LINE = BSS+0
- IN┬UF = LINE+256
- BSS┼ND = IN┬UF+64
-