A2osX/BIN/UNPAK.S.txt
2019-09-23 16:08:17 +02:00

602 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/UNPAK
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/MLI.E.I
.INB INC/LIBPAK.I
*--------------------------------------
CHNK.SIZE .EQ 4096
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPInBufPtr .BS 2
ZPULen .BS 2
ZPPakHdrPtr .BS 2
ZPPakDataPtr .BS 2
ZPPakSrcPtr .BS 2
ZPFullPathPtr .BS 2
ZPRelPathPtr .BS 2
UNPAK.Mask .BS 2
UNPAK.LastByte .BS 2
UNPAK.Cnt .BS 2
UNPAK.Ofs .BS 2
UNPAK.BLOfs .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #64 SS
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE
L.MSG.DIR .DA MSG.DIR
L.MSG.FILE .DA MSG.FILE
L.MSG.OK .DA MSG.OK
L.MSG.ERR .DA MSG.ERR
L.MSG.E.IARC .DA MSG.E.IARC
L.MSG.E.OFS .DA MSG.E.OFS
L.MSG.DEBUG .DA MSG.DEBUG
.DA 0
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN >LDYAI CHNK.SIZE
>SYSCALL getmem
bcs .9
>STYA ZPInBufPtr
txa
>STA.G hInBuf
lda #1
>SYSCALL Argv
bcs .9
jsr CS.RUN.OpenArc
bcs .9
>LDYAI 256
>SYSCALL getmem
bcs .9
>STYA ZPFullPathPtr
txa
>STA.G hFullPath
lda #2
>SYSCALL Argv
bcc .1
ldy #S.PS.hCWD
lda (pPS),y
>SYSCALL getmemptr
.1 jsr CS.RUN.SetupPath
>LDYAI CHNK.SIZE
>SYSCALL getmem
bcs .9
txa
>STA.G hOutBuf
jsr CS.RUN.LOOP
bcs .9
lda #0
sec
.9 rts
.99 >PUSHBI 0
>LDYA L.MSG.USAGE
>SYSCALL printf
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.SetupPath
>STYA ZPPtr1
ldy #$ff
.2 iny
lda (ZPPtr1),y
sta (ZPFullPathPtr),y
bne .2
dey
lda #'/'
cmp (ZPFullPathPtr),y
beq .3
iny
sta (ZPFullPathPtr),y
.3 tya
sec
adc ZPFullPathPtr
sta ZPRelPathPtr
lda #0
adc ZPFullPathPtr+1
sta ZPRelPathPtr+1
rts
*--------------------------------------
CS.RUN.LOOP jsr CS.RUN.GetByte
bcs .9
.10 cmp #CHNK.T.DIR
bne .1
jsr CS.RUN.GetFileName
bcs .9
ldx #0
jsr CS.RUN.PrintFN
jsr CS.RUN.CheckDir
bcs .99
>LDYA L.MSG.OK
>SYSCALL puts
bra CS.RUN.LOOP
clc
.99 rts
.9 jmp CS.RUN.E.IARC
.1 cmp #CHNK.T.FILE
bne .9
jsr CS.RUN.GetFileType
bcs .9
jsr CS.RUN.GetFileName
bcs .9
ldx #2
jsr CS.RUN.PrintFN
jsr CS.RUN.OpenFile
bcs .9
*--------------------------------------
jsr CS.RUN.GetByte DATA
bcs .8 eof
.2 cmp #CHNK.T.DATA
bne .3 Could be a 0 byte file
.20 jsr CS.RUN.GetByte ALG
bcs .9
cmp #0 STORE
bne .9
jsr CS.RUN.GetByte ULEN LO
bcs .9
sta ZPULen
jsr CS.RUN.GetByte ULEN HI
bcs .9
sta ZPULen+1
jsr CS.RUN.ReadData
bcs .9
jsr CS.RUN.WriteFile
bcs .9
jsr CS.RUN.GetByte
bcs .8
cmp #CHNK.T.DATA
beq .20
.3 pha
jsr .8
pla
jmp .10
.8 >LDA.G hFile
>SYSCALL fclose
>LDYA L.MSG.OK
>SYSCALL puts
rts
*--------------------------------------
CS.RUN.PrintFN >PUSHW ZPFullPathPtr
>PUSHBI 2
>LDYA L.MSG.DIR,x
>SYSCALL printf
rts
*--------------------------------------
CS.RUN.OpenArc pha
>PUSHWZ Aux type
>PUSHBI $CF PAK
>PUSHBI O.RDONLY
pla
>SYSCALL FOpen
bcs .9
>STA.G hArcFile
pha
>PUSHWI 3
>PUSHW ZPInBufPtr
pla
>SYSCALL fread
bcs .9
cpy #3
bne .99
dey
.1 lda MSG.PAK,y
cmp (ZPInBufPtr),y
bne .99
dey
bpl .1
clc
.9 rts
.99
CS.RUN.E.IARC >LDYA L.MSG.E.IARC
>SYSCALL puts
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.GetFileType
>PUSHWI 3
>PUSHEA.G FileType
>LDA.G hArcFile
>SYSCALL fread
rts
*--------------------------------------
CS.RUN.GetFileName
jsr CS.RUN.GetByte
bcs .9
tay
lda #0
>PUSHYA
>PUSHW ZPRelPathPtr
>LDA.G hArcFile
>SYSCALL fread
bcs .9
lda #0
sta (ZPRelPathPtr),y
* clc
.9 rts
*--------------------------------------
CS.RUN.ReadData >PUSHW ZPULen
>PUSHW ZPInBufPtr
>LDA.G hArcFile
>SYSCALL fread
rts
*--------------------------------------
CS.RUN.GetByte >LDA.G hArcFile
>SYSCALL getc
rts
*--------------------------------------
CS.RUN.CheckDir >PUSHEA.G STAT
>LDYA ZPFullPathPtr
>SYSCALL stat
bcc .1
>LDYA ZPFullPathPtr
>SYSCALL mkdir
rts
.1 ldy #STAT+S.STAT.P.TYPE
lda (pData),y
cmp #$F
bne .99
clc
rts
.99 lda #MLI.E.INVPATH
sec
.9 rts
*--------------------------------------
CS.RUN.OpenFile >PUSHW.G FileAuxType
>PUSHB.G FileType
>PUSHBI O.CREATE+O.WRONLY+O.TRUNC
>LDYA ZPFullPathPtr
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
*--------------------------------------
CS.RUN.WriteFile
>PUSHW ZPULen
>PUSHW ZPInBufPtr
>LDA.G hFile
>SYSCALL fwrite
rts
*--------------------------------------
* Y,A = Ptr to Shunk Header:
* +0 : Flags
* 10000000 : LZ8 encoded, 1 byte (ESC) follow
* 01000000 : BS
*--------------------------------------
CS.RUN.UnpakChnk
lda ZPPakHdrPtr
clc
adc #S.PAKSTAT
sta ZPPakDataPtr
lda ZPPakHdrPtr+1
adc /S.PAKSTAT
sta ZPPakDataPtr+1
lda (ZPPakHdrPtr)
eor #$ff
sta UNPAK.Cnt
ldy #1
lda (ZPPakHdrPtr),y
eor #$ff
sta UNPAK.Cnt+1
lda #$80
sta UNPAK.Mask
stz UNPAK.Ofs
stz UNPAK.Ofs+1
.1 inc UNPAK.Cnt
bne .2
inc UNPAK.Cnt+1
bne .2
lda #0
sec
rts
.2 lda #'>'
>SYSCALL PutChar
jsr CS.RUN.UnpakGetBitInC
bcs .3
*--------------------------------------
* SHORT3
ldx #3
jsr CS.RUN.UnpakGetXBitInA
clc
* adc #S.PAKHDR.SHORT3
tay
lda (ZPPakHdrPtr),y
sta UNPAK.LastByte
jsr CS.RUN.UnpakCmpA
bcs .9
bra .1
.3 jsr CS.RUN.UnpakGetBitInC
bcs .4
*--------------------------------------
* SHORT4
ldx #4
jsr CS.RUN.UnpakGetXBitInA
clc
* adc #S.PAKHDR.SHORT4
tay
lda (ZPPakHdrPtr),y
sta UNPAK.LastByte
jsr CS.RUN.UnpakCmpA
bcs .9
bra .1
.4 jsr CS.RUN.UnpakGetBitInC
bcs .5
*--------------------------------------
* REPn
ldx #4
jsr CS.RUN.UnpakGetXBitInA
tay
tax
lda UNPAK.LastByte
.41 jsr CS.RUN.UnpakCmpA
bcs .9
dey
bne .41
.42 txa
clc
adc UNPAK.Cnt
sta UNPAK.Cnt
bcc .2
inc UNPAK.Cnt+1
bra .2
.5 jsr CS.RUN.UnpakGetBitInC
bcs .6
*--------------------------------------
* BACKLINK
ldx #4
jsr CS.RUN.UnpakGetXBitInA
sta UNPAK.BLOfs+1
jsr CS.RUN.UnpakGetByteInA
sta UNPAK.BLOfs
jsr CS.RUN.UnpakGetByteInA
tax
tay
.51
bra .42
*--------------------------------------
* STOREn
.6 ldx #4
jsr CS.RUN.UnpakGetXBitInA
tay
tax
.61 jsr CS.RUN.UnpakGetByteInA
dey
bne .61
sta UNPAK.LastByte
bra .42
.9 >PUSHW UNPAK.Ofs
>PUSHBI 2
>LDYA L.MSG.ERR
>SYSCALL printf
lda #0
sec
rts
*--------------------------------------
CS.RUN.UnpakGetByteInA
ldx #8
*--------------------------------------
CS.RUN.UnpakGetXBitInA
lda #0
.1 jsr CS.RUN.UnpakGetBitInC
rol
dex
bne .1
rts
*--------------------------------------
CS.RUN.UnpakGetBitInC
pha
clc
lda (ZPPakDataPtr)
and UNPAK.Mask
beq .1
sec
.1 php
lsr UNPAK.Mask
bne .8
lda #$80
sta UNPAK.Mask
inc ZPPakDataPtr
bne .8
inc ZPPakDataPtr+1
.8 plp
pla
rts
*--------------------------------------
CS.RUN.UnpakCmpA
cmp (ZPPakSrcPtr)
bne .9
inc ZPPakSrcPtr
bne .1
inc ZPPakSrcPtr+1
.1 inc UNPAK.Ofs
bne .8
inc UNPAK.Ofs+1
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT >LDA.G hFile
beq .1
>SYSCALL fclose
.1 >LDA.G hFullPath
beq .2
>SYSCALL FreeMem
.2 >LDA.G hOutBuf
beq .3
>SYSCALL FreeMem
.3 >LDA.G hInBuf
beq .4
>SYSCALL FreeMem
.4 >LDA.G hArcFile
beq .8
>SYSCALL fclose
.8 clc
rts
*--------------------------------------
CS.END
MSG.USAGE .AZ "Usage : UNPAK Archive [DstDir]\r\n"
MSG.DIR .AZ "Creating Dir:%s..."
MSG.FILE .AZ "Extracting File:%s..."
MSG.OK .AZ "[OK]"
MSG.ERR .AZ "[%h]\r\n"
MSG.E.IARC .AZ "Invalid/corrupt archive"
MSG.E.OFS .AZ "UnPak Error at Offset : %L\r\n"
MSG.PAK .AS "PAK"
*--------------------------------------
MSG.DEBUG .AS "Src Length : %D\r\n"
.AS "Pass #1 : %D\r\n"
.AS "Pass #2 : %D\r\n"
.AS "BL Count : %D\r\n"
.AS "REP Count : %D\r\n"
.AS "S3 Count : %D\r\n"
.AS "S4 Count : %D\r\n"
.AZ "STO Count : %D\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
hArcFile .BS 1
hFullPath .BS 1
hInBuf .BS 1
hOutBuf .BS 1
hFile .BS 1
FileType .BS 1
FileAuxType .BS 2
STAT .BS S.STAT
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/UNPAK.S
ASM