A2osX/BIN/ARCME.S.txt
2023-11-12 14:20:15 +01:00

587 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/arcme
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/kernel.i
.INB inc/mli.e.i
.INB inc/arc.i
*--------------------------------------
CHUNK.MAX .EQ 32
DBG .EQ 1
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPSrcFileSize .BS 2
ZPDstTableOfs .BS 2
ZPChunkOfs .BS 2
ZPChunkLen .BS 2
hSrcBuf .BS 1
hDstBuf .BS 1
bPause .BS 1
hSrcFile .BS 1
hDstFile .BS 1
ZPChunkIndex .BS 1
ZPChunkCnt .BS 1
ZPAlg .BS 1
ZPChunkPakedLen .BS 2
ZPChunkNewOfs .BS 2
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.SRCFILE .DA MSG.SRCFILE
L.MSG.CHUNK .DA MSG.CHUNK
L.MSG.STORED .DA MSG.STORED
.DA MSG.ARCEDT
.DA MSG.ARCEDBL
.DA MSG.ARCEDTBL
L.MSG.ARCED .DA MSG.ARCED
L.MSG.E.IARC .DA MSG.E.IARC
L.TAG .DA TAG
.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 ldy #S.PS.ARGC
lda (pPS),y
cmp #2
bne .9
jsr CS.RUN.CheckSrcFile
bcs .99
lda #2
>SYSCALL ArgV
>PUSHYA
>PUSHBI O.CREATE+O.WRONLY
>PUSHB.G STATBUF+S.STAT.P.TYPE
>PUSHW.G STATBUF+S.STAT.P.AUXTYPE
>SYSCALL FOpen
bcs .99
sta hDstFile
bra CS.RUN.START
.9 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
.99 rts
*--------------------------------------
CS.RUN.START >PUSHW L.MSG.SRCFILE
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHW ZPSrcFileSize
>PUSHW.G ARCME.HEADER+5
>PUSHB.G ARCME.HEADER+7
>PUSHW ZPDstTableOfs
>PUSHBI 9
>SYSCALL PrintF
>LDYA ZPDstTableOfs
jsr CS.RUN.GetSrcBufYA
bcs CS.RUN.RTS
>PUSHB hSrcFile
>PUSHLZ
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs CS.RUN.RTS
>PUSHB hSrcFile
>PUSHW ZPInBufPtr
>PUSHW ZPDstTableOfs
>SYSCALL FRead
bcs CS.RUN.RTS
>PUSHB hDstFile
>PUSHW ZPInBufPtr
>PUSHW ZPDstTableOfs
>SYSCALL FWrite
bcs CS.RUN.RTS
jsr CS.QUIT.BUF
jsr CS.RUN.WriteTable Write Fake table
bcc CS.RUN.LOOP
CS.RUN.RTS rts
*--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL FEOF
bcs CS.RUN.RTS
tay
bne .1
>SYSCALL GetChar
bcs CS.RUN.RTS
cmp #$03 Ctrl-C
beq CS.RUN.RTS 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 CS.RUN.GetChunk
bcs CS.RUN.RTS
>PUSHW L.MSG.CHUNK
lda ZPChunkIndex
inc
>PUSHA
>PUSHW ZPChunkOfs
>PUSHW ZPChunkLen
>PUSHBI 5
>SYSCALL PrintF
bcs .9
jsr CS.RUN.Arc
bcs .2
jsr CS.RUN.WriteArc
bcc .7
rts
.2 jsr CS.RUN.WriteStore
bcs .9
.7 jsr CS.QUIT.BUF
jsr CS.RUN.UpdateTable
inc ZPChunkIndex
dec ZPChunkCnt
beq .8
jmp CS.RUN.LOOP
.8 jsr CS.RUN.RewriteTable Write modified Table
bcs .9
lda #0
sec
.9 rts
*--------------------------------------
CS.RUN.CheckSrcFile
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHBI O.RDONLY
>PUSHBI 0 Type
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .99
sta hSrcFile
>PUSHB hSrcFile
>PUSHEA.G STATBUF
>SYSCALL FStat
.99 bcs .9
>LDA.G STATBUF+S.STAT.SIZE+3
dey
ora (pData),y
bne .90
dey
lda (pData),y
sta ZPSrcFileSize+1
dey
lda (pData),y
sta ZPSrcFileSize
jsr CS.RUN.CheckTAG
bcs .9
jsr CS.RUN.GetTable
bcs .9
clc
rts
.90 lda #MLI.E.INCFF
sec
.9
CS.RUN.CheckSrcFile.RTS
rts
*--------------------------------------
CS.RUN.CheckTAG >PUSHB hSrcFile
>PUSHWZ
lda ZPSrcFileSize
sec
sbc #10
tay
lda ZPSrcFileSize+1
sbc #0
>PUSHYA
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs CS.RUN.CheckSrcFile.RTS
>PUSHB hSrcFile
>PUSHEA.G ARCME.HEADER
>PUSHWI 10
>SYSCALL FRead
bcs CS.RUN.CheckSrcFile.RTS
ldx #4
ldy #ARCME.HEADER+4
.1 lda TAG,x
cmp (pData),y
bne .90
dey
dex
bpl .1
clc
rts
.90 lda #MLI.E.INCFF
sec
.9 rts
*--------------------------------------
CS.RUN.GetTable >LDA.G ARCME.HEADER+8
sec
>SBC.G ARCME.HEADER+5
sta ZPDstTableOfs
>LDA.G ARCME.HEADER+9
>SBC.G ARCME.HEADER+6
sta ZPDstTableOfs+1
>PUSHB hSrcFile
>PUSHWZ
>PUSHW ZPDstTableOfs
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs .9
>PUSHB hSrcFile
>PUSHEA.G ARCME.TABLE
>LDA.G ARCME.HEADER+7
sta ZPChunkCnt
asl
tay
lda #0
>PUSHYA
>SYSCALL FRead
.9 rts
*--------------------------------------
CS.RUN.GetChunk lda ZPChunkIndex
asl
clc
adc #ARCME.TABLE+1
tay
lda (pData),y
pha
dey
lda (pData),y
sec
ldy #ARCME.HEADER+5
sbc (pData),y
sta ZPChunkOfs
iny
pla
sbc (pData),y
sta ZPChunkOfs+1
>PUSHB hSrcFile
>PUSHWZ
>PUSHW ZPChunkOfs
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs .9
>PUSHB hSrcFile
>PUSHEA.G CHUNK.HEADER
>PUSHWI S.ARCSHNK.H
>SYSCALL FRead
bcs .9
>LDA.G CHUNK.HEADER+2
iny
ora (pData),y
bne .90
>LDA.G CHUNK.HEADER
sta ZPChunkLen
pha
iny
lda (pData),y
sta ZPChunkLen+1
ply
jsr CS.RUN.GetSrcBufYA
bcs .9
>PUSHB hSrcFile
>PUSHW ZPInBufPtr
>PUSHW ZPChunkLen
>SYSCALL FRead
bcs .9
* clc
rts
.90 lda #MLI.E.INCFF
sec
.9 rts
*--------------------------------------
CS.RUN.GetSrcBufYA
>SYSCALL GetMem
bcs .9
stx hSrcBuf
>STYA ZPInBufPtr
.9 rts
*--------------------------------------
CS.RUN.Arc >LDYA ZPChunkLen
>SYSCALL GetMem
bcs .9
stx hDstBuf
>STYA ZPOutBufPtr
>LDYA ZPChunkLen
jsr X.Arc
bcs .9
stx ZPAlg
>STYA ZPChunkPakedLen
.9 rts
*--------------------------------------
CS.RUN.RewriteTable
>PUSHB hDstFile
>PUSHWZ
>PUSHW ZPDstTableOfs
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs CS.RUN.WriteTable.RTS
*--------------------------------------
CS.RUN.WriteTable
>PUSHB hDstFile
>PUSHEA.G ARCME.TABLE
>LDA.G ARCME.HEADER+7
asl
tay
lda #0
>PUSHYA
>SYSCALL FWrite
CS.RUN.WriteTable.RTS
rts
*--------------------------------------
CS.RUN.WriteArc lda hDstFile
>SYSCALL FTell
bcs .9
>PULLW ZPChunkNewOfs
inc pStack
inc pStack
>PUSHB hDstFile
>PUSHW ZPOutBufPtr
>PUSHW ZPChunkPakedLen
>SYSCALL FWrite
bcs .9
>PUSHW L.MSG.ARCED
ldx ZPAlg
>PUSHW L.MSG.STORED,x
>PUSHW ZPChunkPakedLen
>PUSHW ZPChunkNewOfs
>PUSHBI 6
>SYSCALL PrintF
.9
CS.RUN.WriteArc.RTS
rts
*--------------------------------------
CS.RUN.WriteStore
lda hDstFile
>SYSCALL FTell
bcs CS.RUN.WriteArc.RTS
>PULLW ZPChunkNewOfs
inc pStack
inc pStack
>PUSHB hDstFile
>PUSHEA.G CHUNK.HEADER
>PUSHWI S.ARCSHNK.H
>SYSCALL FWrite
bcs .9
>PUSHB hDstFile
>PUSHW ZPInBufPtr
>PUSHW ZPChunkLen
>SYSCALL FWrite
bcs .9
>PUSHW L.MSG.ARCED
>PUSHW L.MSG.STORED
>PUSHW ZPChunkPakedLen
>PUSHW ZPChunkNewOfs
>PUSHBI 6
>SYSCALL PrintF
.9 rts
*--------------------------------------
CS.RUN.UpdateTable
ldy #ARCME.HEADER+6
lda (pData),y
pha
dey
lda (pData),y
pha
lda ZPChunkIndex
asl
clc
adc #ARCME.TABLE
tay
pla
clc
adc ZPChunkNewOfs
sta (pData),y
iny
pla
adc ZPChunkNewOfs+1
sta (pData),y
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT lda hDstFile
beq .2
>SYSCALL FClose
.2 lda hSrcFile
beq CS.QUIT.BUF
>SYSCALL FClose
*--------------------------------------
CS.QUIT.BUF lda hDstBuf
beq .1
stz hDstBuf
>SYSCALL FreeMem
.1 lda hSrcBuf
beq .8
stz hSrcBuf
>SYSCALL FreeMem
.8 clc
rts
*--------------------------------------
.INB usr/src/shared/x.arc.s
*--------------------------------------
MSG.USAGE .CZ "Usage : ARCME SourceBIN PackedBIN\r\n"
MSG.SRCFILE .CZ "Source File : %s, Size=%5D, Org=$%H, %d Chunks at $%H.\r\n"
MSG.CHUNK .CZ " Chunk #%02d : Ofs=$%H, Len=%5D ... "
MSG.STORED .CZ "Stored "
MSG.ARCEDT .CZ "ARCed/T "
MSG.ARCEDBL .CZ "ARCed/BL "
MSG.ARCEDTBL .CZ "ARCed/TBL"
MSG.ARCED .CZ "%s : %5D Bytes, New Ofs=$%H\r\n"
.CZ %5D Bytes, New Ofs=$%H\r\n"
MSG.E.IARC .CZ "Invalid/corrupt archive"
TAG .CZ "ARCME"
.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
STATBUF .BS S.STAT
ARCME.HEADER .BS 10
ARCME.TABLE .BS CHUNK.MAX*2
CHUNK.HEADER .BS 4
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/arcme.s
ASM