A2osX/BIN/PAKME.S.txt
2019-10-29 17:11:45 +01:00

390 lines
6.8 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/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
ZPSrcBufPtr .BS 2
ZPDstBufPtr .BS 2
ZPSrcFileSize .BS 2
ZPDstTableOfs .BS 2
ZPChunkIndex .BS 1
ZPChunkCnt .BS 1
ZPChunkOfs .BS 2
ZPChunkLen .BS 2
hSrcFile .BS 1
hDstFile .BS 1
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.OK .DA MSG.OK
L.MSG.ERR .DA MSG.ERR
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
>PUSHW.G STATBUF+S.STAT.P.AUXTYPE
>PUSHB.G STATBUF+S.STAT.P.TYPE
>PUSHBI O.CREATE+O.WRONLY
lda #2
>SYSCALL ArgV
>SYSCALL FOpen
bcs .99
sta hDstFile
bra CS.RUN.START
.9 >PUSHBI 0
>LDYA L.MSG.USAGE
>SYSCALL printf
lda #E.SYN
sec
.99 rts
*--------------------------------------
CS.RUN.START >PUSHB.G PAKME.HEADER+7
>PUSHW ZPSrcFileSize
>PUSHW.G PAKME.HEADER+5
lda #1
>SYSCALL ArgV
>PUSHYA
>PUSHBI 7
>LDYA L.MSG.SRCFILE
>SYSCALL printf
*--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL feof
bcs .9
tay
bne .1
>SYSCALL GetChar
bcs .9
cmp #$03 Ctrl-C
beq .9 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 .9
>PUSHW ZPChunkLen
>PUSHW ZPChunkOfs
>PUSHB ZPChunkIndex
>PUSHBI 3
>LDYA L.MSG.CHUNK
>SYSCALL printf
dec ZPChunkCnt
beq .8
jmp CS.RUN.LOOP
.8 lda #0
sec
.9 rts
*--------------------------------------
CS.RUN.CheckSrcFile
>PUSHWZ Aux type
>PUSHBI 0 Type
>PUSHBI O.RDONLY
lda #1
>SYSCALL ArgV
>SYSCALL FOpen
bcs .99
sta hSrcFile
>PUSHEA.G STATBUF
lda hSrcFile
>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 >PUSHBI SEEK.SET
>PUSHWZ
lda ZPSrcFileSize
sec
sbc #10
tay
lda ZPSrcFileSize+1
sbc #0
>PUSHYA
lda hSrcFile
>SYSCALL fseek
bcs CS.RUN.CheckSrcFile.RTS
>PUSHWI 10
>PUSHEA.G PAKME.HEADER
lda hSrcFile
>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 >PUSHBI SEEK.SET
>PUSHWZ
>LDA.G PAKME.HEADER+8
sec
>SBC.G PAKME.HEADER+5
sta ZPDstTableOfs+1
pha
>LDA.G PAKME.HEADER+9
>SBC.G PAKME.HEADER+6
sta ZPDstTableOfs
ply
>PUSHYA
lda hSrcFile
>SYSCALL fseek
bcs .9
>LDA.G PAKME.HEADER+7
sta ZPChunkCnt
asl
tay
lda #0
>PUSHYA
>PUSHEA.G PAKME.TABLE
lda hSrcFile
>SYSCALL fread
.9 rts
*--------------------------------------
CS.RUN.GetChunk lda ZPChunkIndex
inc 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
>PUSHBI SEEK.SET
>PUSHWZ
>PUSHW ZPChunkOfs
lda hSrcFile
>SYSCALL fseek
bcs .9
>PUSHWI 3
>PUSHEA.G CHUNK.HEADER
lda hSrcFile
>SYSCALL fread
bcs .9
>LDA.G CHUNK.HEADER
* bne .90
>LDA.G CHUNK.HEADER+1
sta ZPChunkLen
iny
lda (pData),y
sta ZPChunkLen+1
clc
rts
.90 lda #MLI.E.INCFF
sec
.9 rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT lda hDstFile
beq .2
>SYSCALL fclose
.2 lda hSrcFile
beq .3
>SYSCALL fclose
.3 >LDA.G hDstBuf
beq .4
>SYSCALL FreeMem
.4 >LDA.G hSrcBuf
beq .5
>SYSCALL FreeMem
.5 lda hLIB
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.END
*--------------------------------------
MSG.USAGE .AZ "Usage : PAKME SourceBIN PackedBIN\r\n"
MSG.SRCFILE .AZ "Source File : %s, Org=$%H Size=%D, %d Chunks.\r\n"
MSG.CHUNK .AZ " Chunk #%02d : Ofs=%H, Len=%D\r\n"
MSG.OK .AZ "[OK]"
MSG.ERR .AZ "[%h]\r\n"
MSG.E.IARC .AZ "Invalid/corrupt archive"
TAG .AZ "PAKME"
*--------------------------------------
LIBPAK .AZ "libpak"
hLIB .BS 1
*--------------------------------------
.DUMMY
.OR 0
DS.START
hSrcBuf .BS 1
hDstBuf .BS 1
Shunk.SrcSize .BS 2
Shunk.DstSize .BS 2
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