home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-02-12 | 20.6 KB | 1,152 lines |
- ;*** ┬├╧─┼: BCODE ENCODER VERSION 1.00 - BY ├RAIG ┬RUCE - 17-╬OV-93
-
- ;BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ...
-
- .SEQ ACEHEAD.S
- .ORG ACE┴PP┴DDRESS
- .OBJ "@0:BCODE"
-
- JMP MAIN
- .BYTE ACE╔─1,ACE╔─2,ACE╔─3
- .BYTE 64,0 ;** STACK,RESERVED
-
- ;*** GLOBAL DECLARATIONS
-
- CHR├╥ = $0D
- CHR╠╞ = $0A
- CHR╤UOTE = $22
- TRUE = $FF
- FALSE = $00
- MAX├HUNK = 54
- MAX╠INE = 80
- TR╨ETSCII = 0
- TR┴SCII├R╠F = 1
- TR┴SCII╠F = 2
-
- ARG = 2 ;(2) ;CURRENT ARGUMENT NUMBER
- NAME = 4 ;(2) ;NAME OF FILE BEING BCODED
- STRING = 8 ;(2) ;TEMP STRING
- MAXLINES = 10 ;(4) ;MAX NUMBER OF LINES PER SEGMENT
- LINELIMIT = 14 ;(1) ;WHETHER THERE IS A RESTRICTION ON LINES/SEG
- ALIAS = 16 ;(2) ;CURRENT ALIAS NAME TO USE
- TRANS╘O = 18 ;(1) ;OUTPUT FILE TRANSLATION: PETSCII, ASC-CRLF, ASC-LF
- PROGNAME = 19 ;(2) ;POINTER TO ARGV[0]
- VERBOSE = 21 ;(1) ;FLAG FOR GIVING VERBOSE INFORMATION
- FILENAME╒SED = 22;(1) ;FLAG: IF A FILENAME HAS BEEN ENCOUNTERED ON THE CMD LINE
- BUF╨TR = 23 ;(2) ;POINTER TO NEXT CHAR IN INPUT BUFFER
- BUF├OUNT = 25 ;(2) ;NUMBER OF BYTES LEFT IN INPUT BUFFER
- IN┬UF╙IZE = 27 ;(2) ;MAXIMUM SIZE OF INPUT BUFFER
- INFILE = 29 ;(1) ;FD OF INPUT BINARY FILE
- OUTFILE = 30 ;(1) ;FD TO OUTPUT BCODED DATA TO
- CHUNK╠EN = 31 ;(1) ;LENGTH OF CHUNK FOR ENCODING
- CHUNK╨OS = 32 ;(1) ;SCANNING POSITION IN CHUNK DURING ENCODING
- BCTEMP = 33 ;(1) ;TEMPORARY FOR CONVERSION FROM 8 TO 6 BITS
- TR╨UT╨TR = 34 ;(2) ;POINTER TO TRANSLATED-PUTS STRING
- TR╨UT╔NDEX = 36 ;(1) ;INDEX INTO TRANSLATED-PUTS STRING
- CRC = 37 ;(4) ;CUMULATIVE CRC-32 OF SEGMENT
- BYTES = 41 ;(4) ;CUMULATIVE BYTES IN SEGMENT
- SEGNUM = 45 ;(4) ;CURRENT SEGMENT NUMBER
- STOP├OUNTDN = 49 ;(1) ;COUNTDOWN TO CHECK STOP KEY
- SCAN╓AL = 50 ;(4) ;RESULT OF CONVERTING STRING TO 32-BIT NUMBER
- LINENUM = 54 ;(4) ;CURRENT LINE NUMBER BEING ENCODED
- IS╠AST╙EG = 58 ;(1) ;WHETHER WE HAVE JUST ENCODED THE LAST SEGMENT
- WORK = 112;(16) ;MISC WORK AREA
-
- ;===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 BCODE"
- .BYTE CHR├╥,0
-
- USAGE = *
- LDA #<USAGE═SG
- LDY #>USAGE═SG
- JSR EPUTS
- JMP DIE
-
- USAGE═SG = *
- .ASC "USAGE: BCODE [-HELP] [-V] [-U] [-M] [-L MAX_LINE_COUNT] FILENAME ..."
- .BYTE CHR├╥
- .ASC "FLAGS: -V:VERBOSE, -U:UNIX-ASCII, -M:MS-DOS-ASCII"
- .BYTE CHR├╥,0
-
- DEFAULT┴LIAS = *
- .ASC "STDIN"
- .BYTE 0
-
- MAIN╔NIT = *
- ;** SET GLOBALS
- LDA #TRUE
- STA VERBOSE
- LDA #0
- LDY #0
- JSR GETARG
- LDA ZP+0
- LDY ZP+1
- STA PROGNAME+0
- STY PROGNAME+1
- LDA #FALSE
- STA FILENAME╒SED
- LDA #0
- STA ARG+0
- STA ARG+1
- LDA #<DEFAULT┴LIAS
- LDY #>DEFAULT┴LIAS
- STA ALIAS+0
- STY ALIAS+1
- LDA #FALSE
- STA LINELIMIT
- LDA #TR╨ETSCII
- STA TRANS╘O
- ;** GET INPUT BUFFER LENGTH
- SEC
- LDA ACE═EM╘OP+0
- SBC #<IN┬UF
- STA IN┬UF╙IZE+0
- LDA ACE═EM╘OP+1
- SBC #>IN┬UF
- STA IN┬UF╙IZE+1
-
- MAIN╬EXT = *
- JSR CHECK╙TOP
- INC ARG+0
- BNE +
- INC ARG+1
- + LDA ARG+0
- LDY ARG+1
- JSR GETARG
- LDA ZP+0
- ORA ZP+1
- BEQ MAIN┼XIT
- LDA ZP+0
- LDY ZP+1
- STA NAME+0
- STY NAME+1
- LDY #0
- LDA (ZP),Y
- CMP #"-"
- BNE +
- JMP HANDLE╞LAGS
- + JSR ECHO
- JSR BCODE
- JMP MAIN╬EXT
-
- MAIN┼XIT = *
- BIT FILENAME╒SED
- BMI +
- ;XX SHOULD READ FROM STDIN IF NO FILES
- NOP
- + RTS
-
- HANDLE╞LAGS = *
- INY
- LDA (ZP),Y
- BNE +
- JMP MAIN╬EXT
- + CMP #"V"
- BEQ FLAG╓
- CMP #"M"
- BEQ FLAG═
- CMP #"A"
- BEQ FLAG═
- CMP #"U"
- BEQ FLAG╒
- CMP #"L"
- BEQ FLAG╠
- CMP #"H"
- BNE +
- JMP USAGE
- + NOP
- ;XX UNRECOGNIZED OPTION
- JMP HANDLE╞LAGS
-
- FLAG╓ = *
- LDA #TRUE
- STA VERBOSE
- JMP HANDLE╞LAGS
-
- FLAG═ = *
- LDA #TR┴SCII├R╠F
- STA TRANS╘O
- JMP HANDLE╞LAGS
-
- FLAG╒ = *
- LDA #TR┴SCII╠F
- STA TRANS╘O
- JMP HANDLE╞LAGS
-
- FLAG╠ = *
- INC ARG+0
- BNE +
- INC ARG+1
- + LDA ARG+0
- LDY ARG+1
- JSR GETARG
- LDA ZP+0
- ORA ZP+1
- BEQ FLAG╠ERROR
- LDY #0
- JSR SCAN╬UM
- BCS FLAG╠ERROR
- LDX #3
- - LDA SCAN╓AL,X
- STA MAXLINES,X
- DEX
- BPL -
- LDA MAXLINES+0
- ORA MAXLINES+1
- ORA MAXLINES+2
- ORA MAXLINES+3
- BEQ FLAG╠ERROR
- LDA #TRUE
- STA LINELIMIT
- JMP MAIN╬EXT
- FLAG╠ERROR = *
- LDA #<FLAG╠ERROR═SG
- LDY #>FLAG╠ERROR═SG
- JSR EPUTS
- JMP DIE
- FLAG╠ERROR═SG = *
- .ASC "┼╥╥╧╥: INVALID MAXIMUM LINE LIMIT GIVEN WITH -L OPTION"
- .BYTE CHR├╥,0
-
- ECHO = *
- LDA #<ECHO═SG1
- LDY #>ECHO═SG1
- JSR EPUTS
- LDA NAME+0
- LDY NAME+1
- JSR EPUTS
- LDA #<ECHO═SG2
- LDY #>ECHO═SG2
- JSR EPUTS
- RTS
-
- ECHO═SG1 = *
- .ASC "BCODING FILE "
- .BYTE CHR╤UOTE,0
- ECHO═SG2 = *
- .BYTE CHR╤UOTE
- .ASC "..."
- .BYTE CHR├╥,0
-
- CHECK╙TOP = *
- JSR STOPKEY
- BCS +
- RTS
- + LDA #<STOPPED═SG
- LDY #>STOPPED═SG
- JSR EPUTS
- JMP DIE
-
- STOPPED═SG = *
- .ASC "<╙TOPPED>"
- .BYTE CHR├╥,0
-
- BCODE = *
- LDA #TRUE
- STA FILENAME╒SED
- LDA NAME+0
- LDY NAME+1
- STA ZP+0
- STY ZP+1
- LDA #"R"
- JSR OPEN
- BCS OPEN┼RROR
- STA INFILE
- LDA #0
- STA BUF├OUNT+0
- STA BUF├OUNT+1
- JSR SET┬ASE64╘ABLE
- LDA #1
- LDY #0
- STA SEGNUM+0
- STY SEGNUM+1
- STY SEGNUM+2
- STY SEGNUM+3
-
- BCODE╬EXT╙EGMENT = *
- LDA #STDOUT
- STA OUTFILE
- BIT LINELIMIT
- BPL +
- JSR GET╧UTFILE
- + JSR BCODE╙EGMENT
- LDA OUTFILE
- CMP #STDOUT
- BEQ +
- JSR CLOSE
- + BIT IS╠AST╙EG
- BPL +
- LDA INFILE
- JSR CLOSE
- RTS
- + INC SEGNUM+0
- BNE +
- INC SEGNUM+1
- BNE +
- INC SEGNUM+2
- BNE +
- INC SEGNUM+3
- + JMP BCODE╬EXT╙EGMENT
-
- OPEN┼RROR = *
- LDA #<OPEN┼RROR═SG1
- LDY #>OPEN┼RROR═SG1
- JSR EPUTS
- LDA NAME+0
- LDY NAME+1
- JSR EPUTS
- LDA #<OPEN┼RROR═SG2
- LDY #>OPEN┼RROR═SG2
- JSR EPUTS
- RTS
- OPEN┼RROR═SG1 = *
- .ASC "┼╥╥╧╥: CANNOT OPEN "
- .BYTE CHR╤UOTE,0
- OPEN┼RROR═SG2 = *
- .BYTE CHR╤UOTE,CHR├╥,0
-
- OUTFILE╞ILE╠EN = WORK+0
- OUTFILE┼XT╠EN = WORK+1
- OUTFILE╘EMP = WORK+2
-
- GET╧UTFILE = *
- ;** GET FILENAME
- LDA NAME+0
- LDY NAME+1
- STA ZP+0
- STY ZP+1
- JSR BASENAME
- STX OUTFILE╞ILE╠EN
- ;** GET SEG NUMBER, 2+ DIGITS
- LDA #<NUMBUF
- LDY #>NUMBUF
- STA ZP+0
- STY ZP+1
- LDA #1
- LDX #SEGNUM
- JSR UTOA
- CPY #1
- BNE +
- LDA NUMBUF+0
- STA NUMBUF+1
- LDA #"0"
- STA NUMBUF+0
- LDA #0
- STA NUMBUF+2
- INY
- + TYA
- CLC
- ADC #2
- STA OUTFILE┼XT╠EN
- CLC
- LDA OUTFILE╞ILE╠EN
- ADC OUTFILE┼XT╠EN
- LDY OUTFILE╞ILE╠EN
- CMP #17
- BCC +
- SEC
- LDA #16
- SBC OUTFILE┼XT╠EN ;GIVES ALLOWED FILENAME LEN
- TAY
- + LDA #"."
- STA OUT┬UF,Y
- INY
- LDA #"B"
- STA OUT┬UF,Y
- INY
- LDX #0
- - LDA NUMBUF,X
- STA OUT┬UF,Y
- BEQ +
- INX
- INY
- BNE -
- ;** OPEN THE FILE
- + LDA #<OUT┬UF
- LDY #>OUT┬UF
- STA ZP+0
- STY ZP+1
- LDA #"W"
- JSR OPEN╧VERWRITE
- STA OUTFILE
- BCC +
- LDA #<OUTFILE┼RR═SG1
- LDY #>OUTFILE┼RR═SG1
- JSR EPUTS
- LDA #<OUT┬UF
- LDY #>OUT┬UF
- JSR EPUTS
- LDA #<OUTFILE┼RR═SG2
- LDY #>OUTFILE┼RR═SG2
- JSR EPUTS
- JMP DIE
- ;** ECHO OPENING
- + LDA #<OUTFILE═SG
- LDY #>OUTFILE═SG
- JSR EPUTS
- LDA #<OUT┬UF
- LDY #>OUT┬UF
- JSR EPUTS
- LDA #CHR╤UOTE
- JSR EPUTCHAR
- LDA #CHR├╥
- JMP EPUTCHAR
-
- OUTFILE═SG = *
- .ASC "OUTPUTTING TO FILE "
- .BYTE CHR╤UOTE,0
- OUTFILE┼RR═SG1 = *
- .ASC "┼╥╥╧╥: CANNOT OPEN "
- .BYTE CHR╤UOTE,0
- OUTFILE┼RR═SG2 = *
- .BYTE CHR╤UOTE
- .ASC ", ABORTING!"
- .BYTE CHR├╥,0
-
- BCODE╙EGMENT = * ;( ) : IS╠AST╙EG
- ;** HEADER LINE
- LDA #<BCODE╚EADER═SG
- LDY #>BCODE╚EADER═SG
- JSR TR╨UTS
- LDX #SEGNUM
- JSR TR╨UTNUM
- LDA #" "
- JSR TR╨UTCHAR
- LDA NAME+0
- LDY NAME+1
- STA ZP+0
- STY ZP+1
- JSR BASENAME
- LDA #<OUT┬UF
- LDY #>OUT┬UF
- JSR TR╨UTS
- LDA #CHR├╥
- JSR TR╨UTCHAR
- JSR CRC╔NIT
- LDA #0
- STA LINENUM+0
- STA LINENUM+1
- STA LINENUM+2
- STA LINENUM+3
- ;** LOOP
- ENCODE╬EXT = *
- JSR ENCODE╠INE
- BCC +
- LDA #TRUE
- STA IS╠AST╙EG
- JMP ENCODE╙EG╞INISH
- + BIT LINELIMIT
- BPL ENCODE╬EXT
- INC LINENUM+0
- BNE +
- INC LINENUM+1
- BNE +
- INC LINENUM+2
- BNE +
- INC LINENUM+3
- + SEC
- LDY #4
- LDX #0
- - LDA LINENUM,X
- SBC MAXLINES,X
- INX
- DEY
- BNE -
- BCC ENCODE╬EXT
- LDA #FALSE
- STA IS╠AST╙EG
-
- ;** END LINE
- ENCODE╙EG╞INISH = *
- JSR CRC╞INISH
- BIT IS╠AST╙EG
- BPL +
- LDA #<BCODE┼ND═SG
- LDY #>BCODE┼ND═SG
- JMP ++
- + LDA #<BCODE├ONTINUED═SG
- LDY #>BCODE├ONTINUED═SG
- + JSR TR╨UTS
- LDX #SEGNUM
- JSR TR╨UTNUM
- LDA #" "
- JSR TR╨UTCHAR
- LDX #BYTES
- JSR TR╨UTNUM
- LDA #" "
- JSR TR╨UTCHAR
- LDX #CRC
- JSR TR╨UTHEX
- LDA #CHR├╥
- JSR TR╨UTCHAR
- RTS
-
- BCODE╚EADER═SG = *
- .ASC "--BCODE-BEGIN "
- .BYTE 0
- BCODE┼ND═SG = *
- .ASC "--BCODE-END "
- .BYTE 0
- BCODE├ONTINUED═SG = *
- .ASC "--BCODE-CONTINUED "
- .BYTE 0
-
- BASENAME╙TART .BUF 1
- BASENAME = * ;( (ZP)=INNAME ) : OUT┬UF=OUTNAME, .╪=BASENAME╠EN
- LDY #255
- STY BASENAME╙TART
- - INY
- LDA (ZP),Y
- BEQ BASENAME─ONE
- CMP #":"
- BEQ +
- CMP #"/"
- BNE -
- + STY BASENAME╙TART
- JMP -
- BASENAME─ONE = *
- LDY BASENAME╙TART
- LDX #255
- - INY
- INX
- LDA (ZP),Y
- STA OUT┬UF,X
- BNE -
- CPX #2
- BCC +
- LDA OUT┬UF-2,X
- CMP #","
- BNE +
- LDA #0
- STA OUT┬UF-2,X
- DEX
- DEX
- + RTS
-
- ENCODE╠INE = *
- INC STOP├OUNTDN
- LDA STOP├OUNTDN
- AND #7
- BNE +
- JSR CHECK╙TOP
- ;** GET THE CHUNK
- + JSR READ├HUNK
- BCC +
- RTS
- + STX CHUNK╠EN
- LDA #0
- STA IN├HUNK+0,X
- STA IN├HUNK+1,X
- JSR CRC├HUNK
- ;** ENCODE THE CHUNK
- LDX #0 ;CHUNKPOS
- LDY #0 ;LINEPOS
- - JSR ENCODE╞OUR├HARS
- CPX CHUNK╠EN
- BCC -
- ;** FIX NON-INTEGRAL-LENGTH (LAST) LINE
- BEQ +
- LDA #"="
- STA OUT┬UF-1,Y
- DEX
- CPX CHUNK╠EN
- BEQ +
- STA OUT┬UF-2,Y
- ;** OUTPUT THE LINE
- + LDA #CHR├╥
- STA OUT┬UF,Y
- LDX TRANS╘O
- CPX #TR╨ETSCII
- BEQ +
- INY
- LDA #CHR╠╞
- STA OUT┬UF,Y
- CPX #TR┴SCII├R╠F
- BEQ +
- DEY
- STA OUT┬UF,Y
- + INY
- TYA
- LDA #<OUT┬UF
- LDX #>OUT┬UF
- STA ZP+0
- STX ZP+1
- TYA
- LDY #0
- LDX OUTFILE
- JSR WRITE
- RTS
-
- ENCODE╞OUR├HARS = * ;( .╪++=CHUNKPOS, .┘++=LINEPOS )
- STX CHUNK╨OS
- ;** PUT BYTES INTO OUTPUT LINE
- ;POS 76543210 76543210 76543210 76543210
- ;BYT XX111111 XX112222 XX222233 XX333333
- ;BIT 765432 107654 321076 543210
- ;** FIRST BYTE
- LDA IN├HUNK+0,X
- LSR
- LSR
- TAX
- LDA BASE64├HAR,X
- STA OUT┬UF,Y
- INY
-
- ;** SECOND BYTE
- LDX CHUNK╨OS
- LDA IN├HUNK+0,X
- ASL
- ASL
- ASL
- ASL
- STA BCTEMP
- LDA IN├HUNK+1,X
- LSR
- LSR
- LSR
- LSR
- ORA BCTEMP
- AND #%00111111
- TAX
- LDA BASE64├HAR,X
- STA OUT┬UF,Y
- INY
-
- ;** THIRD BYTE
- LDX CHUNK╨OS
- LDA IN├HUNK+1,X
- ASL
- ASL
- STA BCTEMP
- LDA IN├HUNK+2,X
- ASL
- ROL
- ROL
- AND #%00000011
- ORA BCTEMP
- AND #%00111111
- TAX
- LDA BASE64├HAR,X
- STA OUT┬UF,Y
- INY
-
- ;** FOURTH BYTE
- LDX CHUNK╨OS
- LDA IN├HUNK+2,X
- AND #%00111111
- TAX
- LDA BASE64├HAR,X
- STA OUT┬UF,Y
- INY
- LDX CHUNK╨OS
- INX
- INX
- INX
- RTS
-
- BASE64╔NDEX .BUF 1
- SET┬ASE64╘ABLE = *
- LDY #0
- LDX #0
- LDA TRANS╘O
- CMP #TR╨ETSCII
- BEQ +
- LDX #BASE64─ESC┴SC-BASE64─ESC╨ET
- + STX BASE64╔NDEX
- - LDX BASE64╔NDEX
- LDA BASE64─ESC╨ET+0,X
- BEQ +
- PHA
- LDA BASE64─ESC╨ET+1,X
- TAX
- PLA
- - STA BASE64├HAR,Y
- CLC
- ADC #1
- INY
- DEX
- BNE -
- INC BASE64╔NDEX
- INC BASE64╔NDEX
- BNE --
- + RTS
-
- BASE64─ESC╨ET = *
- .BYTE "┴",26,"A",26,"0",10,"+",1,"/",1,$00
- BASE64─ESC┴SC = *
- .BYTE $41,26,$61,26,"0",10,"+",1,"/",1,$00
-
- READ├HUNK = * ;( ) : .╪=LEN
- LDX #0
- - STX CHUNK╠EN
- JSR GET┬YTE
- LDX CHUNK╠EN
- BCS +
- STA IN├HUNK,X
- INX
- CPX #MAX├HUNK
- BCC -
- - CLC
- RTS
- + CPX #0
- BNE -
- SEC
- RTS
-
- GET┬YTE = *
- LDA BUF├OUNT+0
- ORA BUF├OUNT+1
- BEQ GET┬YTE╞ILL┬UF
- LDY #0
- LDA (BUF╨TR),Y
- INC BUF╨TR+0
- BNE +
- INC BUF╨TR+1
- + LDX BUF├OUNT+0
- BNE +
- DEC BUF├OUNT+1
- + DEC BUF├OUNT+0
- CLC
- RTS
-
- GET┬YTE╞ILL┬UF = *
- JSR CHECK╙TOP
- LDA #<IN┬UF
- LDY #>IN┬UF
- STA ZP+0
- STY ZP+1
- STA BUF╨TR+0
- STY BUF╨TR+1
- LDA IN┬UF╙IZE+0
- LDY IN┬UF╙IZE+1
- LDX INFILE
- JSR READ
- BEQ +
- BCS +
- STA BUF├OUNT+0
- STY BUF├OUNT+1
- JMP GET┬YTE
- + SEC
- RTS
-
- CRC╘ABLE0 = *
- .BYTE $00,$96,$2C,$BA,$19,$8F,$35,$A3,$32,$A4,$1E,$88,$2B,$BD,$07,$91
- .BYTE $64,$F2,$48,$DE,$7D,$EB,$51,$C7,$56,$C0,$7A,$EC,$4F,$D9,$63,$F5
- .BYTE $C8,$5E,$E4,$72,$D1,$47,$FD,$6B,$FA,$6C,$D6,$40,$E3,$75,$CF,$59
- .BYTE $AC,$3A,$80,$16,$B5,$23,$99,$0F,$9E,$08,$B2,$24,$87,$11,$AB,$3D
- .BYTE $90,$06,$BC,$2A,$89,$1F,$A5,$33,$A2,$34,$8E,$18,$BB,$2D,$97,$01
- .BYTE $F4,$62,$D8,$4E,$ED,$7B,$C1,$57,$C6,$50,$EA,$7C,$DF,$49,$F3,$65
- .BYTE $58,$CE,$74,$E2,$41,$D7,$6D,$FB,$6A,$FC,$46,$D0,$73,$E5,$5F,$C9
- .BYTE $3C,$AA,$10,$86,$25,$B3,$09,$9F,$0E,$98,$22,$B4,$17,$81,$3B,$AD
- .BYTE $20,$B6,$0C,$9A,$39,$AF,$15,$83,$12,$84,$3E,$A8,$0B,$9D,$27,$B1
- .BYTE $44,$D2,$68,$FE,$5D,$CB,$71,$E7,$76,$E0,$5A,$CC,$6F,$F9,$43,$D5
- .BYTE $E8,$7E,$C4,$52,$F1,$67,$DD,$4B,$DA,$4C,$F6,$60,$C3,$55,$EF,$79
- .BYTE $8C,$1A,$A0,$36,$95,$03,$B9,$2F,$BE,$28,$92,$04,$A7,$31,$8B,$1D
- .BYTE $B0,$26,$9C,$0A,$A9,$3F,$85,$13,$82,$14,$AE,$38,$9B,$0D,$B7,$21
- .BYTE $D4,$42,$F8,$6E,$CD,$5B,$E1,$77,$E6,$70,$CA,$5C,$FF,$69,$D3,$45
- .BYTE $78,$EE,$54,$C2,$61,$F7,$4D,$DB,$4A,$DC,$66,$F0,$53,$C5,$7F,$E9
- .BYTE $1C,$8A,$30,$A6,$05,$93,$29,$BF,$2E,$B8,$02,$94,$37,$A1,$1B,$8D
-
- CRC╘ABLE1 = *
- .BYTE $00,$30,$61,$51,$C4,$F4,$A5,$95,$88,$B8,$E9,$D9,$4C,$7C,$2D,$1D
- .BYTE $10,$20,$71,$41,$D4,$E4,$B5,$85,$98,$A8,$F9,$C9,$5C,$6C,$3D,$0D
- .BYTE $20,$10,$41,$71,$E4,$D4,$85,$B5,$A8,$98,$C9,$F9,$6C,$5C,$0D,$3D
- .BYTE $30,$00,$51,$61,$F4,$C4,$95,$A5,$B8,$88,$D9,$E9,$7C,$4C,$1D,$2D
- .BYTE $41,$71,$20,$10,$85,$B5,$E4,$D4,$C9,$F9,$A8,$98,$0D,$3D,$6C,$5C
- .BYTE $51,$61,$30,$00,$95,$A5,$F4,$C4,$D9,$E9,$B8,$88,$1D,$2D,$7C,$4C
- .BYTE $61,$51,$00,$30,$A5,$95,$C4,$F4,$E9,$D9,$88,$B8,$2D,$1D,$4C,$7C
- .BYTE $71,$41,$10,$20,$B5,$85,$D4,$E4,$F9,$C9,$98,$A8,$3D,$0D,$5C,$6C
- .BYTE $83,$B3,$E2,$D2,$47,$77,$26,$16,$0B,$3B,$6A,$5A,$CF,$FF,$AE,$9E
- .BYTE $93,$A3,$F2,$C2,$57,$67,$36,$06,$1B,$2B,$7A,$4A,$DF,$EF,$BE,$8E
- .BYTE $A3,$93,$C2,$F2,$67,$57,$06,$36,$2B,$1B,$4A,$7A,$EF,$DF,$8E,$BE
- .BYTE $B3,$83,$D2,$E2,$77,$47,$16,$26,$3B,$0B,$5A,$6A,$FF,$CF,$9E,$AE
- .BYTE $C2,$F2,$A3,$93,$06,$36,$67,$57,$4A,$7A,$2B,$1B,$8E,$BE,$EF,$DF
- .BYTE $D2,$E2,$B3,$83,$16,$26,$77,$47,$5A,$6A,$3B,$0B,$9E,$AE,$FF,$CF
- .BYTE $E2,$D2,$83,$B3,$26,$16,$47,$77,$6A,$5A,$0B,$3B,$AE,$9E,$CF,$FF
- .BYTE $F2,$C2,$93,$A3,$36,$06,$57,$67,$7A,$4A,$1B,$2B,$BE,$8E,$DF,$EF
-
- CRC╘ABLE2 = *
- .BYTE $00,$07,$0E,$09,$6D,$6A,$63,$64,$DB,$DC,$D5,$D2,$B6,$B1,$B8,$BF
- .BYTE $B7,$B0,$B9,$BE,$DA,$DD,$D4,$D3,$6C,$6B,$62,$65,$01,$06,$0F,$08
- .BYTE $6E,$69,$60,$67,$03,$04,$0D,$0A,$B5,$B2,$BB,$BC,$D8,$DF,$D6,$D1
- .BYTE $D9,$DE,$D7,$D0,$B4,$B3,$BA,$BD,$02,$05,$0C,$0B,$6F,$68,$61,$66
- .BYTE $DC,$DB,$D2,$D5,$B1,$B6,$BF,$B8,$07,$00,$09,$0E,$6A,$6D,$64,$63
- .BYTE $6B,$6C,$65,$62,$06,$01,$08,$0F,$B0,$B7,$BE,$B9,$DD,$DA,$D3,$D4
- .BYTE $B2,$B5,$BC,$BB,$DF,$D8,$D1,$D6,$69,$6E,$67,$60,$04,$03,$0A,$0D
- .BYTE $05,$02,$0B,$0C,$68,$6F,$66,$61,$DE,$D9,$D0,$D7,$B3,$B4,$BD,$BA
- .BYTE $B8,$BF,$B6,$B1,$D5,$D2,$DB,$DC,$63,$64,$6D,$6A,$0E,$09,$00,$07
- .BYTE $0F,$08,$01,$06,$62,$65,$6C,$6B,$D4,$D3,$DA,$DD,$B9,$BE,$B7,$B0
- .BYTE $D6,$D1,$D8,$DF,$BB,$BC,$B5,$B2,$0D,$0A,$03,$04,$60,$67,$6E,$69
- .BYTE $61,$66,$6F,$68,$0C,$0B,$02,$05,$BA,$BD,$B4,$B3,$D7,$D0,$D9,$DE
- .BYTE $64,$63,$6A,$6D,$09,$0E,$07,$00,$BF,$B8,$B1,$B6,$D2,$D5,$DC,$DB
- .BYTE $D3,$D4,$DD,$DA,$BE,$B9,$B0,$B7,$08,$0F,$06,$01,$65,$62,$6B,$6C
- .BYTE $0A,$0D,$04,$03,$67,$60,$69,$6E,$D1,$D6,$DF,$D8,$BC,$BB,$B2,$B5
- .BYTE $BD,$BA,$B3,$B4,$D0,$D7,$DE,$D9,$66,$61,$68,$6F,$0B,$0C,$05,$02
-
- CRC╘ABLE3 = *
- .BYTE $00,$77,$EE,$99,$07,$70,$E9,$9E,$0E,$79,$E0,$97,$09,$7E,$E7,$90
- .BYTE $1D,$6A,$F3,$84,$1A,$6D,$F4,$83,$13,$64,$FD,$8A,$14,$63,$FA,$8D
- .BYTE $3B,$4C,$D5,$A2,$3C,$4B,$D2,$A5,$35,$42,$DB,$AC,$32,$45,$DC,$AB
- .BYTE $26,$51,$C8,$BF,$21,$56,$CF,$B8,$28,$5F,$C6,$B1,$2F,$58,$C1,$B6
- .BYTE $76,$01,$98,$EF,$71,$06,$9F,$E8,$78,$0F,$96,$E1,$7F,$08,$91,$E6
- .BYTE $6B,$1C,$85,$F2,$6C,$1B,$82,$F5,$65,$12,$8B,$FC,$62,$15,$8C,$FB
- .BYTE $4D,$3A,$A3,$D4,$4A,$3D,$A4,$D3,$43,$34,$AD,$DA,$44,$33,$AA,$DD
- .BYTE $50,$27,$BE,$C9,$57,$20,$B9,$CE,$5E,$29,$B0,$C7,$59,$2E,$B7,$C0
- .BYTE $ED,$9A,$03,$74,$EA,$9D,$04,$73,$E3,$94,$0D,$7A,$E4,$93,$0A,$7D
- .BYTE $F0,$87,$1E,$69,$F7,$80,$19,$6E,$FE,$89,$10,$67,$F9,$8E,$17,$60
- .BYTE $D6,$A1,$38,$4F,$D1,$A6,$3F,$48,$D8,$AF,$36,$41,$DF,$A8,$31,$46
- .BYTE $CB,$BC,$25,$52,$CC,$BB,$22,$55,$C5,$B2,$2B,$5C,$C2,$B5,$2C,$5B
- .BYTE $9B,$EC,$75,$02,$9C,$EB,$72,$05,$95,$E2,$7B,$0C,$92,$E5,$7C,$0B
- .BYTE $86,$F1,$68,$1F,$81,$F6,$6F,$18,$88,$FF,$66,$11,$8F,$F8,$61,$16
- .BYTE $A0,$D7,$4E,$39,$A7,$D0,$49,$3E,$AE,$D9,$40,$37,$A9,$DE,$47,$30
- .BYTE $BD,$CA,$53,$24,$BA,$CD,$54,$23,$B3,$C4,$5D,$2A,$B4,$C3,$5A,$2D
-
- ;** CRC = 0X╞╞╞╞╞╞╞╞;
- ;** WHILE( (C=GETC(FP)) != ┼╧╞ ) █
- ;** CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ (CRC^C) & 0X╞╞ ];
- ;** ▌
- ;** RETURN( CRC^0X╞╞╞╞╞╞╞╞ );
-
- CRC╔NIT = *
- LDX #3
- - LDA #$FF
- STA CRC,X
- LDA #0
- STA BYTES,X
- DEX
- BPL -
- RTS
-
- CRC├HUNK = *
- LDY #0
- CPY CHUNK╠EN
- BCS +
- - LDA IN├HUNK,Y ;.╪ = (CRC^C) & 0X╞╞
- EOR CRC+0
- TAX
- LDA CRC+1 ;CRC = (CRC>>8) & 0X00╞╞╞╞╞╞ ^ CRC╘ABLE[ .╪ ]
- EOR CRC╘ABLE0,X
- STA CRC+0
- LDA CRC+2
- EOR CRC╘ABLE1,X
- STA CRC+1
- LDA CRC+3
- EOR CRC╘ABLE2,X
- STA CRC+2
- LDA CRC╘ABLE3,X
- STA CRC+3
- INY
- CPY CHUNK╠EN
- BCC -
- + CLC
- LDA BYTES+0
- ADC CHUNK╠EN
- STA BYTES+0
- BCC +
- INC BYTES+1
- BNE +
- INC BYTES+2
- BNE +
- INC BYTES+3
- + RTS
-
- CRC╞INISH = *
- LDX #3
- - LDA CRC,X
- EOR #$FF
- STA CRC,X
- DEX
- BPL -
- RTS
-
- TR╨UTS = *
- STA TR╨UT╨TR+0
- STY TR╨UT╨TR+1
- LDY #0
- STY TR╨UT╔NDEX
- - LDY TR╨UT╔NDEX
- LDA (TR╨UT╨TR),Y
- BEQ +
- JSR TR╨UTCHAR
- INC TR╨UT╔NDEX
- BNE -
- + RTS
-
- TR╨UTCHAR = *
- LDX TRANS╘O
- CPX #TR╨ETSCII
- BEQ +
- CMP #CHR├╥
- BEQ ++
- JSR CONV╨ET2┴SC
- + LDX OUTFILE
- JMP PUTC
- + LDX TRANS╘O
- CPX #TR┴SCII╠F
- BEQ +
- LDA #CHR├╥
- LDX OUTFILE
- JSR PUTC
- + LDA #CHR╠╞
- LDX OUTFILE
- JMP PUTC
-
- CONV╨ET2┴SC = *
- CMP #"A"
- BCS +
- RTS
- + TAX
- BPL +
- SBC #$C0-$60
- TAX
- + AND #$1F
- BNE +
- - TXA
- RTS
- + CMP #$1B
- BCS -
- TXA
- EOR #$20
- RTS
-
- TR╨UTNUM = * ;( .╪=NUMBER32 )
- LDA #<NUMBUF
- LDY #>NUMBUF
- STA ZP+0
- STY ZP+1
- LDA #1
- JSR UTOA
- TR╨UTNUM─UMP = *
- LDA #<NUMBUF
- LDY #>NUMBUF
- JSR TR╨UTS
- RTS
-
- TR╨UTHEX = * ;( .╪=NUMBER32 )
- LDA #4
- STA WORK
- LDY #0
- INX
- INX
- INX
- - LDA 0,X
- PHA
- LSR
- LSR
- LSR
- LSR
- JSR TR╨UTHEX─IGIT
- PLA
- JSR TR╨UTHEX─IGIT
- DEX
- DEC WORK
- BNE -
- LDA #0
- STA NUMBUF,Y
- JMP TR╨UTNUM─UMP
-
- TR╨UTHEX─IGIT = * ;( .┴=DIGIT, .┘=NUMBUF╔NDEX )
- AND #$0F
- ORA #$30
- CMP #$3A
- BCC +
- ADC #6
- + STA NUMBUF,Y
- INY
- RTS
-
- ;=== 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
- RTS
-
- SCAN─IGIT .BUF 1
- SCAN╙AVE .BUF 4
- SCAN╘EMP .BUF 1
- SCAN╔NDEX .BUF 1
- SCAN┴NYTHING .BUF 1
-
- SCAN╬UM = * ;( (ZP)=NUM╙TR, .┘=NUM╔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
-
- OPEN╧V═ODE .BUF 1
- OPEN╧VERWRITE = * ;( (ZP)=NAME, .┴=MODE ) : .┴=╞CB, .├╙=ERR
- STA OPEN╧V═ODE
- JSR OPEN
- BCS +
- RTS
- + LDA ERRNO
- CMP #ACE┼RR╞ILE┼XISTS
- BEQ +
- - SEC
- RTS
- + JSR REMOVE
- LDA OPEN╧V═ODE
- JSR OPEN
- BCS -
- RTS
-
- ;===BSS===
-
- BSS = *
- OUT┬UF = BSS
- IN├HUNK = OUT┬UF+MAX╠INE+1
- BASE64├HAR = IN├HUNK+MAX├HUNK+5
- NUMBUF = BASE64├HAR+64
- IN┬UF = NUMBUF+12
- BSS┼ND = IN┬UF+64
-