A2osX/BIN/ARC.S.txt

699 lines
12 KiB
Plaintext
Raw Normal View History

2023-11-04 14:42:28 +00:00
NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/arc
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/kernel.i
.INB inc/arc.i
.INB inc/mli.e.i
*--------------------------------------
X.ENTER.SUBDIR .EQ 0
X.COPY.TO.DEST .EQ 0
X.DELETE.SOURCE .EQ 0
X.RESET.SRC.DIR .EQ 0 single pass
*--------------------------------------
DBG .EQ 1
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPFileName .BS 2
ZPFileStat .BS 2
ZPFullPath .BS 2
ZPRelPath .BS 2
bAppend .BS 1
bRecurse .BS 1
bPause .BS 1
ZPAlg .BS 1
ZPInBufPtr .BS 2
ZPOutBufPtr .BS 2
ZPBackPtr .BS 2
ZPStrPtr .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 Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #64 Stack Size
.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.ARC.Header .DA ARC.Header
.DO DBG
L.MSG.DBG1 .DA MSG.DBG1
L.MSG.DBG2 .DA MSG.DBG2
L.MSG.DBG3 .DA MSG.DBG3
.FIN
.DA 0
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN >INC.G ArgIndex
>SYSCALL ArgV
bcs .8
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
jsr CS.RUN.CheckOpt
bcs .9
bne CS.RUN
>INC.G ArgIndex -X
>SYSCALL ArgV
bcs .9
>SYSCALL StrDup
bcs .9
txa
>STA.G hIgnore
bra CS.RUN
.9 >LDYA L.MSG.USAGE
>SYSCALL PutS
lda #E.SYN
sec
.99 rts
*--------------------------------------
.4 >LDA.G ArcName
bne .5
>LDA.G ArgIndex
>STA.G ArcName
bra CS.RUN
.5 >LDA.G hSrcBasePath
bne .9
>LDYA ZPPtr1
jsr X.InitSrcDirYA
bcc CS.RUN
rts
.8 >LDA.G ArcName
beq .9
>LDA.G hSrcBasePath
beq .9
*--------------------------------------
>LDYAI 256
>SYSCALL GetMem
bcs .99
>STYA ZPFullPath
txa
>STA.G hSrcFullPath
>LDA.G hSrcBasePath
>SYSCALL GetMemPtr
>STYA ZPPtr1
ldy #$ff
.80 iny
lda (ZPPtr1),y
bne .80
tya
clc
adc ZPFullPath
sta ZPRelPath
lda ZPFullPath+1
adc #0
sta ZPRelPath+1
jsr CS.RUN.OpenArc
.98 bcs .99
>LDYAI CHNK.SIZE
>SYSCALL GetMem
bcs .98
>STYA ZPInBufPtr
txa
>STA.G hSrcBuf
>LDYAI CHNK.SIZE
>SYSCALL GetMem
bcs .98
>STYA ZPOutBufPtr
txa
>STA.G hDstBuf
*--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL FEOF
bcs .99
tay
bne .1
>SYSCALL GetChar
bcs .99
cmp #$03 Ctrl-C
beq .99 Abort....
cmp #$13 Ctrl-S
bne .1
lda bPause
eor #$ff
sta bPause
bne CS.RUN.LOOP
.1 lda bPause
bne CS.RUN.LOOP Pause...
*--------------------------------------
jsr X.GetEntry
bcs .9
jsr X.IncludeMatch
bcs .8 no match, skip....
jsr X.IgnoreMatch
bcc .8 match, skip
ldy #S.STAT.MODE+1
lda (ZPFileStat),y
and #$70
beq .6
cmp /S.STAT.MODE.DIR
bne .8
jsr CS.RUN.DIR
bcs .99
bra .8
.6 jsr CS.RUN.FILE
bcs .99
bra .8
.9 jsr X.LeaveSubDir
bcs .90
jsr X.BasePath..
.8 jsr X.GetNextEntry
jmp CS.RUN.LOOP
.90 lda #0
sec
.99 rts
*--------------------------------------
CS.RUN.DEV lda #E.BADPATH
sec
rts
*--------------------------------------
CS.RUN.DIR lda bRecurse
bpl .8
lda (ZPFileName)
cmp #'.'
bne .1
ldy #1
lda (ZPFileName),y
beq .8
cmp #'.'
bne .1
iny
lda (ZPFileName),y
beq .8
.1 jsr CS.RUN.BuildFilePath
>PUSHW L.MSG.DIR
>PUSHW ZPRelPath
>PUSHBI 2
>SYSCALL PrintF
bcs .9
jsr CS.RUN.WriteArcHdrDir
bcs .9
>LDYA ZPFileName
jsr X.EnterSubDirYA
.9 jmp CS.RUN.CheckErr
.8 clc
rts
*--------------------------------------
CS.RUN.FILE jsr CS.RUN.BuildFilePath
>PUSHW ZPFullPath
>LDA.G hArcFile
tay
lda FILEs.hName-1,y
>SYSCALL GetMemPtr
>PUSHYA
>SYSCALL StrCmp
bcc .8
>PUSHW L.MSG.FILE
>PUSHW ZPRelPath
>PUSHBI 2
>SYSCALL PrintF
bcs .9
jsr CS.RUN.WriteArcHdrFile
bcs .9
jsr CS.RUN.OpenFile
bcs .9
.1 lda #'.'
>SYSCALL PutChar
jsr CS.RUN.ReadFile
bcc .2
cmp #MLI.E.EOF
bne .4
jsr CS.RUN.CloseFile
bra .9
.2 jsr CS.RUN.Arc
bcs .3
jsr CS.RUN.WriteArcData
bcc .1
bra .4
.3 jsr CS.RUN.WriteSrcData
bcc .1
.4 pha
jsr CS.RUN.CloseFile
pla
sec
.9 jmp CS.RUN.CheckErr
.8 clc
rts
*--------------------------------------
CS.RUN.CheckErr bcs .1
>LDYA L.MSG.OK
>SYSCALL PutS
rts
.1 pha
>PUSHW L.MSG.ERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.BuildFilePath
>PUSHW ZPFullPath
>LDA.G hSrcBasePath
>SYSCALL GetMemPtr
>PUSHYA
>SYSCALL StrCpy
>PUSHW ZPFullPath
>PUSHW ZPFileName
>SYSCALL StrCat
rts
*--------------------------------------
CS.RUN.OpenFile >PUSHW ZPFullPath
>PUSHBI O.RDONLY
>PUSHBI 0 Type
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
*--------------------------------------
CS.RUN.ReadFile >PUSHB.G hFile
>PUSHW ZPInBufPtr
>PUSHWI CHNK.SIZE
>SYSCALL FRead
bcs .9
>STYA.G Shunk.SrcSize
.9 rts
*--------------------------------------
CS.RUN.CloseFile
>LDA.G hFile
>SYSCALL FClose
bcs .9
>STZ.G hFile
.9 rts
*--------------------------------------
CS.RUN.Arc >LDYA.G Shunk.SrcSize
jsr X.Arc
bcs .9
stx ZPAlg
>STYA.G Shunk.DstSize
.9 rts
*--------------------------------------
CS.RUN.OpenArc >LDA.G ArcName
>SYSCALL ArgV
>PUSHYA
bit bAppend
bmi CS.RUN.AppendArc
>PUSHBI O.CREATE+O.WRONLY
>PUSHBI $CF PAK
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hArcFile
>PUSHB.G hArcFile
>PUSHW L.ARC.Header
>SYSCALL FPutS
.9
CS.RUN.OpenArc.RTS
rts
*--------------------------------------
CS.RUN.AppendArc
>PUSHBI O.RDWR+O.APPEND
>PUSHBI $CF PAK
>PUSHWZ Aux type
>SYSCALL FOpen
bcs CS.RUN.OpenArc.RTS
>STA.G hArcFile
>PUSHB.G hArcFile
>PUSHLZ
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs CS.RUN.OpenArc.RTS
>PUSHB.G hArcFile
>PUSHW ZPInBufPtr
>PUSHWI 3
>SYSCALL FRead
bcs .9
cpy #3
bne .99
dey
.2 lda ARC.Header,y
cmp (ZPInBufPtr),y
bne .99
dey
bpl .2
>PUSHB.G hArcFile
>PUSHLZ
>PUSHBI SEEK.END
>SYSCALL FSeek
.9 rts
.99 >LDYA L.MSG.E.IARC
>SYSCALL PutS
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.WriteArcHdrDir
lda #CHNK.T.DIR
jsr CS.RUN.WriteArcByteA
bcc CS.RUN.WriteArcHdr
rts
CS.RUN.WriteArcHdrFile
lda #CHNK.T.FILE
jsr CS.RUN.WriteArcByteA
bcs CS.RUN.WriteArcHdr.9
ldy #S.STAT.P.TYPE
jsr CS.RUN.WriteArcByteY
bcs CS.RUN.WriteArcHdr.9
ldy #S.STAT.P.AUXTYPE
jsr CS.RUN.WriteArcByteY
bcs CS.RUN.WriteArcHdr.9
ldy #S.STAT.P.AUXTYPE+1
jsr CS.RUN.WriteArcByteY
bcs CS.RUN.WriteArcHdr.9
CS.RUN.WriteArcHdr
ldy #$ff
.1 iny
lda (ZPRelPath),y
bne .1
tya
jsr CS.RUN.WriteArcByteA
bcs CS.RUN.WriteArcHdr.9
>PUSHB.G hArcFile
>PUSHW ZPRelPath
>SYSCALL FPutS
CS.RUN.WriteArcHdr.9
rts
*--------------------------------------
CS.RUN.WriteSrcData
lda #CHNK.T.DATA
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk.SrcSize
clc
adc #3
pha
>LDA.G Shunk.SrcSize+1
adc #0
sta ZPPtr1+1
pla
jsr CS.RUN.WriteArcByteA
bcs .9
lda ZPPtr1+1
jsr CS.RUN.WriteArcByteA
bcs .9
lda #0 NO COMPRESSION
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk.SrcSize
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk.SrcSize+1
jsr CS.RUN.WriteArcByteA
bcs .9
>PUSHB.G hArcFile
>PUSHW ZPInBufPtr
>PUSHW.G Shunk.SrcSize
>SYSCALL FWrite
.9 rts
*--------------------------------------
CS.RUN.WriteArcData
lda #CHNK.T.DATA
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk.DstSize
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk.DstSize+1
jsr CS.RUN.WriteArcByteA
bcs .9
>PUSHB.G hArcFile
>PUSHW ZPOutBufPtr
>PUSHW.G Shunk.DstSize
>SYSCALL FWrite
.9 rts
*--------------------------------------
CS.RUN.WriteArcByteY
lda (ZPFileStat),y
CS.RUN.WriteArcByteA
pha
>PUSHB.G hArcFile
pla
>PUSHA
>SYSCALL FPutC
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr X.LeaveSubDir
bcc CS.QUIT
ldy #hIgnore
jsr .7
ldy #hInclude
jsr .7
ldy #hSrcFullPath
jsr .7
ldy #hDstBuf
jsr .7
ldy #hSrcBuf
jsr .7
>LDA.G hArcFile
beq .1
>SYSCALL FClose
.1 clc
rts
.7 lda (pData),y
beq .8
>SYSCALL FreeMem
.8 rts
*--------------------------------------
CS.RUN.CheckOpt ldy #1
lda (ZPPtr1),y
ldx #OptionVars-OptionList-1
.1 cmp OptionList,x
beq .2
dex
bpl .1
sec
rts
.2 ldy OptionVars,x
beq .8
lda #$ff
sta 0,y
.8 clc
rts
*--------------------------------------
.INB usr/src/shared/x.fileenum.s
.INB usr/src/shared/x.arc.s
*--------------------------------------
OptionList .AS "AaRrXx"
OptionVars .DA #bAppend,#bAppend,#bRecurse,#bRecurse,#0,#0
*--------------------------------------
MSG.USAGE .CS "Usage : ARC Archive [File *,? wildcards allowed]\r\n"
.CS " -A : Append to archive\r\n"
.CS " -R : Recurse subdirectories\r\n"
.CZ " -X <*,? wildcards allowed> : exclude files \r\n"
MSG.OK .CZ "[OK]"
MSG.ERR .CZ "[%h]\r\n"
MSG.E.IARC .CZ "Invalid/corrupt archive"
MSG.DIR .CZ "Reading Dir:%s..."
MSG.FILE .CZ "Adding File:%s..."
ARC.Header .CZ "ARC"
.DO DBG
MSG.DBG1 .CS "\r\n\r\n ULEN:%6u Bits, T:%6u Bits, BL:%6u Bits, TBL:%6u Bits\r\n"
.CS " TopT :%5d, TopTBL :%5d\r\n"
.CZ " STR.Max :%5d, BLL.Max :%5d, BLO.Max :%5D\r\n"
MSG.DBG2 .CS " S.TB.Cnt :%5D, STR.TB.Cnt:%5D, BL.TB.Cnt :%5D\r\n"
.CS " STR.SL.Cnt:%5D, STR.LL.Cnt:%5D, Bits: %d/%d\r\n"
.CS " BLL.SL.Cnt:%5D, BLL.LL.Cnt:%5D, Bits: %d/%d,%d\r\n"
.CZ " %5D %5D %5D %5D %5D %5D %5D %5D %5D %5D %5D %5D\r\n"
MSG.DBG3 .CZ " Output : %6u Bits, %5D Bytes, Alg=%d\r\n"
.FIN
*--------------------------------------
.DUMMY
.OR 0
DS.START
ArgIndex .BS 1
ArcName .BS 1
hSrcFullPath .BS 1
hFile .BS 1
hArcFile .BS 1
hSrcBuf .BS 1
hDstBuf .BS 1
Shunk.SrcSize .BS 2
Shunk.DstSize .BS 2
.INB usr/src/shared/x.fileenum.g
DS.END
.ED
*--------------------------------------
MAN
SAVE usr/src/bin/arc.s
ASM