UNPAK: Added -p flag which shows progress spinner

This commit is contained in:
Bobbi Webber-Manners 2021-06-18 20:35:05 -04:00
parent baf9655700
commit f03f4d82d7

View File

@ -1,407 +1,479 @@
NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/unpak
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/unpak
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.e.i
.INB inc/pak.i
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.e.i
.INB inc/pak.i
*--------------------------------------
.DUMMY
.OR ZPBIN
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPInBufPtr .BS 2
ZPOutBufPtr .BS 2
ZPInBufPtr .BS 2
ZPOutBufPtr .BS 2
ZPnCnt .BS 2
ZPInMask .BS 1
ZPBLOfsLBits .BS 1
ZPBLOfsHBits .BS 1
ZPBLLenBits .BS 1
ZPnCnt .BS 2
ZPInMask .BS 1
ZPBLOfsLBits .BS 1
ZPBLOfsHBits .BS 1
ZPBLLenBits .BS 1
ZPInBufLen .BS 2
ZPOutBufLen .BS 2
ZPInBufLen .BS 2
ZPOutBufLen .BS 2
ZPFullPathPtr .BS 2
ZPRelPathPtr .BS 2
ZPFullPathPtr .BS 2
ZPRelPathPtr .BS 2
ZS.END .ED
ZPProgress .BS 1
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
* 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
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.E.IARC .DA MSG.E.IARC
.DA 0
.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.E.IARC .DA MSG.E.IARC
L.MSG.SPINNER .DA MSG.SPINNER
.DA 0
*--------------------------------------
CS.INIT clc
rts
CS.INIT clc
rts
*--------------------------------------
CS.RUN >LDYAI CHNK.SIZE
>SYSCALL GetMem
bcs .9
>STYA ZPInBufPtr
txa
>STA.G hInBuf
CS.RUN stz ZPProgress
>LDYAI CHNK.SIZE
>SYSCALL GetMem
bcc s1
rts
s1
>STYA ZPInBufPtr
txa
>STA.G hInBuf
lda #1
>SYSCALL ArgV
bcs .99
jsr CS.RUN.OpenArc
bcs .9
>LDYAI 256
>SYSCALL GetMem
bcs .9
lda #1
>SYSCALL ArgV
bcs .99
>STYA ZPFullPathPtr
txa
>STA.G hFullPath
>STYA ZPPtr1 See if first arg is -p
pha
lda (ZPPtr1)
cmp #'-'
bne .1 No dash-arguments
pla
ldy #$01
lda (ZPPtr1),y
cmp #'p'
bne .99 -p is only valid argument
sty ZPProgress
lda #2
>SYSCALL ArgV
bcs .99
bra .11
lda #2
>SYSCALL ArgV
bcc .1
.1 pla
.11 jsr CS.RUN.OpenArc
bcs .9
>LDYAI 256
>SYSCALL GetMem
bcc .15
rts
ldy #S.PS.hCWD
lda (pPS),y
>SYSCALL GetMemPtr
.15 >STYA ZPFullPathPtr
txa
>STA.G hFullPath
.1 jsr CS.RUN.SetupPath
lda ZPProgress See if -p was provided
beq .2
lda #' ' Space for spinner to eat
>SYSCALL PutChar
lda #3 Have dash-args, check arg #3
bra .3
.2 lda #2 No dash-args, check arg #2
.3 >SYSCALL ArgV
bcc .4
>LDYAI CHNK.SIZE
>SYSCALL GetMem
bcs .9
ldy #S.PS.hCWD
lda (pPS),y
>SYSCALL GetMemPtr
txa
>STA.G hOutBuf
.4 jsr CS.RUN.SetupPath
jsr CS.RUN.LOOP
bcs .9
>LDYAI CHNK.SIZE
>SYSCALL GetMem
bcs .9
lda #0
sec
.9 rts
txa
>STA.G hOutBuf
.99 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
rts
jsr CS.RUN.LOOP
bcs .9
jsr CS.RUN.TidyUp
lda #0
sec
.9 rts
.99 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.SetupPath
>STYA ZPPtr1
>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
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
CS.RUN.LOOP jsr CS.RUN.GetByte
bcs .9
.10 cmp #CHNK.T.DIR
bne .1
.10 cmp #CHNK.T.DIR
bne .1
jsr CS.RUN.GetFileName
bcs .99
ldx #0
jsr CS.RUN.PrintFN
jsr CS.RUN.GetFileName
bcs .99
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
jsr CS.RUN.CheckDir
bcs .99
lda ZPProgress
bne CS.RUN.LOOP
>LDYA L.MSG.OK
>SYSCALL PutS
bra CS.RUN.LOOP
clc
.99 rts
.9 jmp CS.RUN.E.IARC
.9 jmp CS.RUN.E.IARC
.1 cmp #CHNK.T.FILE
bne .9
.1 cmp #CHNK.T.FILE
bne .9
jsr CS.RUN.GetFileType
bcs .99
jsr CS.RUN.GetFileType
bcs .99
jsr CS.RUN.GetFileName
bcs .99
jsr CS.RUN.GetFileName
bcs .99
ldx #2
jsr CS.RUN.PrintFN
jsr CS.RUN.OpenFile
bcs .99
ldx #2
jsr CS.RUN.PrintFN
jsr CS.RUN.OpenFile
bcs .99
*--------------------------------------
jsr CS.RUN.GetByte DATA
bcs .8 eof
.2 cmp #CHNK.T.DATA
bne .3 Could be a 0 byte file
jsr CS.RUN.GetByte DATA
bcs .8 eof
.2 cmp #CHNK.T.DATA
bne .3 Could be a 0 byte file
.20 lda #'.'
>SYSCALL PutChar
.20 lda ZPProgress
beq .21
jsr CS.RUN.Spinner
bra .22
.21 lda #'.'
>SYSCALL PutChar
jsr CS.RUN.GetByte DataLen LO
bcs .99
sta ZPInBufLen
.22 jsr CS.RUN.GetByte DataLen LO
bcs .99
sta ZPInBufLen
jsr CS.RUN.GetByte DataLen HI
bcs .99
sta ZPInBufLen+1
jsr CS.RUN.GetByte DataLen HI
bcs .99
sta ZPInBufLen+1
jsr CS.RUN.ReadData
bcs .99
jsr CS.RUN.ReadData
bcs .99
ldy #1
lda (ZPInBufPtr),y
sta ZPOutBufLen
iny
lda (ZPInBufPtr),y
sta ZPOutBufLen+1
ldy #1
lda (ZPInBufPtr),y
sta ZPOutBufLen
iny
lda (ZPInBufPtr),y
sta ZPOutBufLen+1
>LDA.G hOutBuf
>SYSCALL GetMemPtr
>STYA ZPOutBufPtr
jsr X.Unpak
bcs .9
jsr CS.RUN.WriteFile
bcs .99
>LDA.G hOutBuf
>SYSCALL GetMemPtr
>STYA ZPOutBufPtr
jsr X.Unpak
bcs .9
jsr CS.RUN.WriteFile
bcs .99
jsr CS.RUN.GetByte
bcs .8
jsr CS.RUN.GetByte
bcs .8
cmp #CHNK.T.DATA
beq .20
cmp #CHNK.T.DATA
beq .20
.3 pha
jsr .8
pla
jmp .10
.3 pha
jsr .8
pla
jmp .10
.8 >LDA.G hFile
>SYSCALL FClose
>LDYA L.MSG.OK
>SYSCALL PutS
rts
.8 >LDA.G hFile
>SYSCALL FClose
LDA ZPProgress
bne S1
>LDYA L.MSG.OK
>SYSCALL PutS
S1 rts
*--------------------------------------
CS.RUN.PrintFN >PUSHW L.MSG.DIR,x
>PUSHW ZPFullPathPtr
>PUSHBI 2
>SYSCALL PrintF
rts
CS.RUN.PrintFN lda ZPProgress
bne .9
>PUSHW L.MSG.DIR,x
>PUSHW ZPFullPathPtr
>PUSHBI 2
>SYSCALL PrintF
.9 rts
*--------------------------------------
CS.RUN.OpenArc >PUSHYA
>PUSHBI O.RDONLY
>PUSHBI $CF PAK
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hArcFile
>PUSHA
>PUSHW ZPInBufPtr
>PUSHWI 3
>SYSCALL FRead
bcs .9
CS.RUN.Spinner lda #8 Backspace
>SYSCALL PutChar
>LDYA L.MSG.SPINNER
>STYA ZPPtr2
>LDA.G SpinState
tay
lda (ZPPtr2),y
>SYSCALL PutChar
>INC.G SpinState
cmp #4
bne .9
>STZ.G SpinState
.9 rts
*--------------------------------------
CS.RUN.NewLine LDA #C.CR
>SYSCALL PutChar
LDA #C.LF
>SYSCALL PutChar
rts
*--------------------------------------
CS.RUN.TidyUp lda ZPProgress
beq .9
lda #8
>SYSCALL PutChar
lda #' '
>SYSCALL PutChar
jsr CS.RUN.NewLine
.9 rts
*--------------------------------------
CS.RUN.OpenArc >PUSHYA
>PUSHBI O.RDONLY
>PUSHBI $CF PAK
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hArcFile
>PUSHA
>PUSHW ZPInBufPtr
>PUSHWI 3
>SYSCALL FRead
bcs .9
cpy #3
bne .99
cpy #3
bne .99
dey
.1 lda MSG.PAK,y
cmp (ZPInBufPtr),y
bne .99
dey
.1 lda MSG.PAK,y
cmp (ZPInBufPtr),y
bne .99
dey
bpl .1
dey
bpl .1
clc
.9 rts
clc
.9 rts
.99
CS.RUN.E.IARC >PUSHW L.MSG.E.IARC
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
rts
CS.RUN.E.IARC >PUSHW L.MSG.E.IARC
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.GetFileType
>PUSHB.G hArcFile
>PUSHEA.G FileType
>PUSHWI 3
>SYSCALL FRead
rts
>PUSHB.G hArcFile
>PUSHEA.G FileType
>PUSHWI 3
>SYSCALL FRead
rts
*--------------------------------------
CS.RUN.GetFileName
jsr CS.RUN.GetByte
bcs .9
pha
>PUSHB.G hArcFile
>PUSHW ZPRelPathPtr
jsr CS.RUN.GetByte
bcs .9
pha
>PUSHB.G hArcFile
>PUSHW ZPRelPathPtr
ply
lda #0
>PUSHYA
>SYSCALL FRead
bcs .9
ply
lda #0
>PUSHYA
>SYSCALL FRead
bcs .9
lda #0
sta (ZPRelPathPtr),y
lda #0
sta (ZPRelPathPtr),y
* clc
.9 rts
* clc
.9 rts
*--------------------------------------
CS.RUN.ReadData >PUSHB.G hArcFile
>LDA.G hInBuf
>SYSCALL GetMemPtr
>STYA ZPInBufPtr
>PUSHYA
>PUSHW ZPInBufLen
>SYSCALL FRead
rts
CS.RUN.ReadData >PUSHB.G hArcFile
>LDA.G hInBuf
>SYSCALL GetMemPtr
>STYA ZPInBufPtr
>PUSHYA
>PUSHW ZPInBufLen
>SYSCALL FRead
rts
*--------------------------------------
CS.RUN.GetByte >LDA.G hArcFile
>SYSCALL GetC
rts
CS.RUN.GetByte >LDA.G hArcFile
>SYSCALL GetC
rts
*--------------------------------------
CS.RUN.CheckDir >PUSHW ZPFullPathPtr
>PUSHEA.G STAT
>SYSCALL Stat
bcc .1
CS.RUN.CheckDir >PUSHW ZPFullPathPtr
>PUSHEA.G STAT
>SYSCALL Stat
bcc .1
>PUSHW ZPFullPathPtr
>PUSHWI S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU
>SYSCALL MKDir
>PUSHW ZPFullPathPtr
>PUSHWI S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU
>SYSCALL MKDir
rts
rts
.1 ldy #STAT+S.STAT.MODE+1
lda (pData),y
and #$F0
cmp /S.STAT.MODE.DIR
bne .99
clc
rts
.1 ldy #STAT+S.STAT.MODE+1
lda (pData),y
and #$F0
cmp /S.STAT.MODE.DIR
bne .99
clc
rts
.99 lda #MLI.E.INVPATH
sec
.9 rts
.99 lda #MLI.E.INVPATH
sec
.9 rts
*--------------------------------------
CS.RUN.OpenFile >PUSHW ZPFullPathPtr
>PUSHBI O.CREATE+O.WRONLY+O.TRUNC
>PUSHB.G FileType
>PUSHW.G FileAuxType
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
CS.RUN.OpenFile >PUSHW ZPFullPathPtr
>PUSHBI O.CREATE+O.WRONLY+O.TRUNC
>PUSHB.G FileType
>PUSHW.G FileAuxType
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
*--------------------------------------
CS.RUN.WriteFile
>PUSHB.G hFile
>LDA.G hOutBuf
>SYSCALL GetMemPtr
>PUSHYA
>PUSHW ZPOutBufLen
>SYSCALL FWrite
rts
>PUSHB.G hFile
>LDA.G hOutBuf
>SYSCALL GetMemPtr
>PUSHYA
>PUSHW ZPOutBufLen
>SYSCALL FWrite
rts
*--------------------------------------
CS.DOEVENT sec
rts
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT >LDA.G hFile
beq .1
>SYSCALL FClose
CS.QUIT >LDA.G hFile
beq .1
>SYSCALL FClose
.1 >LDA.G hFullPath
beq .2
.1 >LDA.G hFullPath
beq .2
>SYSCALL FreeMem
.2 >LDA.G hOutBuf
beq .3
>SYSCALL FreeMem
.2 >LDA.G hOutBuf
beq .3
>SYSCALL FreeMem
.3 >LDA.G hInBuf
beq .4
>SYSCALL FreeMem
.3 >LDA.G hInBuf
beq .4
>SYSCALL FreeMem
>SYSCALL FreeMem
.4 >LDA.G hArcFile
beq .8
>SYSCALL FClose
.8 clc
rts
.4 >LDA.G hArcFile
beq .8
>SYSCALL FClose
.8 clc
rts
*--------------------------------------
.INB usr/src/shared/x.unpak.s
.INB usr/src/shared/x.unpak.s
*--------------------------------------
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.E.IARC .AZ "\r\nInvalid/corrupt archive"
MSG.PAK .AS "PAK"
MSG.USAGE .AS "Usage : UNPAK [-p] Archive [DstDir]\r\n"
.AZ " -p: Show progress spinner\r\n"
MSG.DIR .AZ "Creating Dir:%s..."
MSG.FILE .AZ "Extracting File:%s..."
MSG.OK .AZ "[OK]"
MSG.E.IARC .AZ "\r\nInvalid/corrupt archive"
MSG.PAK .AS "PAK"
MSG.SPINNER .AS "|/-\"
*--------------------------------------
.DUMMY
.OR 0
.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
hArcFile .BS 1
hFullPath .BS 1
hInBuf .BS 1
hOutBuf .BS 1
hFile .BS 1
FileType .BS 1
FileAuxType .BS 2
SpinState .BS 1
STAT .BS S.STAT
DS.END
.ED
.ED
*--------------------------------------
MAN
SAVE usr/src/bin/unpak.s