A2osX/BIN/PAKME.S.txt
2022-11-02 07:54:30 +01:00

572 lines
9.9 KiB
Plaintext
Raw Permalink 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/pakme
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/kernel.i
.INB inc/pak.i
.INB inc/libpak.i
.INB inc/mli.e.i
*--------------------------------------
CHUNK.MAX .EQ 32
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPSrcFileSize .BS 2
ZPDstTableOfs .BS 2
hSrcFile .BS 1
hDstFile .BS 1
ZPChunkIndex .BS 1
ZPChunkCnt .BS 1
ZPChunkOfs .BS 2
ZPChunkLen .BS 2
ZPChunkPakedLen .BS 2
ZPChunkNewOfs .BS 2
hSrcBuf .BS 1
hDstBuf .BS 1
ZPSrcBufPtr .BS 2
ZPDstBufPtr .BS 2
bPause .BS 1
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.LIBPAK .DA LIBPAK
L.MSG.USAGE .DA MSG.USAGE
L.MSG.SRCFILE .DA MSG.SRCFILE
L.MSG.CHUNK .DA MSG.CHUNK
L.MSG.PAKED .DA MSG.PAKED
L.MSG.STORE .DA MSG.STORE
L.MSG.E.IARC .DA MSG.E.IARC
L.TAG .DA TAG
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBPAK
>SYSCALL LoadLib
bcs .9
sta hLIB
.9 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 >LDYA L.MSG.USAGE
>SYSCALL PutS
lda #E.SYN
sec
.99 rts
*--------------------------------------
CS.RUN.START >PUSHW L.MSG.SRCFILE
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHW ZPSrcFileSize
>PUSHW.G PAKME.HEADER+5
>PUSHB.G PAKME.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 ZPSrcBufPtr
>PUSHW ZPDstTableOfs
>SYSCALL FRead
bcs CS.RUN.RTS
>PUSHB hDstFile
>PUSHW ZPSrcBufPtr
>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.Pak
bcs .2
jsr CS.RUN.WritePak
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 PAKME.HEADER
>PUSHWI 10
>SYSCALL FRead
bcs CS.RUN.CheckSrcFile.RTS
ldx #4
ldy #PAKME.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 PAKME.HEADER+8
sec
>SBC.G PAKME.HEADER+5
sta ZPDstTableOfs
>LDA.G PAKME.HEADER+9
>SBC.G PAKME.HEADER+6
sta ZPDstTableOfs+1
>PUSHB hSrcFile
>PUSHWZ
>PUSHW ZPDstTableOfs
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs .9
>PUSHB hSrcFile
>PUSHEA.G PAKME.TABLE
>LDA.G PAKME.HEADER+7
sta ZPChunkCnt
asl
tay
lda #0
>PUSHYA
>SYSCALL FRead
.9 rts
*--------------------------------------
CS.RUN.GetChunk lda ZPChunkIndex
asl
clc
adc #PAKME.TABLE+1
tay
lda (pData),y
pha
dey
lda (pData),y
sec
ldy #PAKME.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 3
>SYSCALL FRead
bcs .9
>LDA.G CHUNK.HEADER
bne .90
>LDA.G CHUNK.HEADER+1
sta ZPChunkLen
pha
iny
lda (pData),y
sta ZPChunkLen+1
ply
jsr CS.RUN.GetSrcBufYA
bcs .9
>PUSHB hSrcFile
>PUSHW ZPSrcBufPtr
>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 ZPSrcBufPtr
.9 rts
*--------------------------------------
CS.RUN.Pak >LDYA ZPChunkLen
>SYSCALL GetMem
bcs .9
stx hDstBuf
>STYA ZPDstBufPtr
>PUSHEA.G PAKSTAT
>PUSHW ZPDstBufPtr
>PUSHW ZPChunkLen
>PUSHW ZPSrcBufPtr
>LIBCALL hLIB,LIBPAK.Pak
bcs .9
>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 PAKME.TABLE
>LDA.G PAKME.HEADER+7
asl
tay
lda #0
>PUSHYA
>SYSCALL FWrite
CS.RUN.WriteTable.RTS
rts
*--------------------------------------
CS.RUN.WritePak lda hDstFile
>SYSCALL FTell
bcs .9
>PULLW ZPChunkNewOfs
inc pStack
inc pStack
>PUSHB hDstFile
>PUSHW ZPDstBufPtr
>PUSHW ZPChunkPakedLen
>SYSCALL FWrite
bcs .9
>PUSHW L.MSG.PAKED
>PUSHW ZPChunkPakedLen
>PUSHW ZPChunkNewOfs
>PUSHBI 4
>SYSCALL PrintF
.9
CS.RUN.WritePak.RTS
rts
*--------------------------------------
CS.RUN.WriteStore
lda hDstFile
>SYSCALL FTell
bcs CS.RUN.WritePak.RTS
>PULLW ZPChunkNewOfs
inc pStack
inc pStack
>PUSHB hDstFile
>PUSHEA.G CHUNK.HEADER
>PUSHWI 3
>SYSCALL FWrite
bcs .9
>PUSHB hDstFile
>PUSHW ZPSrcBufPtr
>PUSHW ZPChunkLen
>SYSCALL FWrite
bcs .9
>PUSHW L.MSG.STORE
>PUSHW ZPChunkLen
>PUSHW ZPChunkNewOfs
>PUSHBI 4
>SYSCALL PrintF
.9 rts
*--------------------------------------
CS.RUN.UpdateTable
ldy #PAKME.HEADER+6
lda (pData),y
pha
dey
lda (pData),y
pha
lda ZPChunkIndex
asl
clc
adc #PAKME.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 .3
>SYSCALL FClose
.3 jsr CS.QUIT.BUF
lda hLIB
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.QUIT.BUF lda hDstBuf
beq .1
stz hDstBuf
>SYSCALL FreeMem
.1 lda hSrcBuf
beq .8
stz hSrcBuf
>SYSCALL FreeMem
.8 rts
*--------------------------------------
CS.END
*--------------------------------------
MSG.USAGE .CZ "Usage : PAKME 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.PAKED .CZ "PAKed : %5D Bytes, New Ofs=$%H\r\n"
MSG.STORE .CZ "Store : %5D Bytes, New Ofs=$%H\r\n"
MSG.E.IARC .CZ "Invalid/corrupt archive"
TAG .CZ "PAKME"
*--------------------------------------
LIBPAK .AZ "libpak"
hLIB .BS 1
*--------------------------------------
.DUMMY
.OR 0
DS.START
STATBUF .BS S.STAT
PAKME.HEADER .BS 10
PAKME.TABLE .BS CHUNK.MAX*2
CHUNK.HEADER .BS 3
PAKSTAT .BS S.PAKSTAT
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/pakme.s
ASM