A2osX/BIN/UNPAK.S.txt

457 lines
8.7 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 ROOT/UNPAK
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBPAK.I
*--------------------------------------
ZPPakHdrPtr .EQ ZPBIN
ZPPakDataPtr .EQ ZPBIN+2
ZPPakSrcPtr .EQ ZPBIN+4
*--------------------------------------
UNPAK.Mask .EQ ZPBIN+8
UNPAK.LastByte .EQ ZPBIN+9
UNPAK.Cnt .EQ ZPBIN+10
UNPAK.Ofs .EQ ZPBIN+12
UNPAK.BLOfs .EQ ZPBIN+14
*--------------------------------------
* 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 #16 ZP
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBPAK .DA LIBPAK
L.CONST.PI .DA CONST.PI
L.CONST.3 .DA CONST.3
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
L.MSG4 .DA MSG4
L.MSG5 .DA MSG5
L.MSG6 .DA MSG6
L.MSG.UnpakErr .DA MSG.UnpakErr
L.MSG.DEBUG.S3 .DA MSG.DEBUG.S3
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBPAK
>SYSCALL LoadLib
bcs .9
sta hLIBPAK
clc
.9 rts
*--------------------------------------
CS.RUN ldy #S.PS.ARGC
lda (pPs),y
bne CS.RUN.Pak
jmp CS.RUN.Math
*--------------------------------------
CS.RUN.Pak >PUSHWI 0 Aux type
>PUSHBI 0
>PUSHBI O.RDONLY
lda #1
>SYSCALL ArgV
>SYSCALL RealPath
>PUSHYA
txa
>STA.G PAK.hFileName
>SYSCALL LoadFile
bcs .9
>STYA.G PAK.FileSize
txa
>STA.G PAK.hFileBuf
>LDYA.G PAK.FileSize
>SYSCALL getmem
bcs .9
>STYA ZPPakSrcPtr
txa
>STA.G PAK.hOutBuf
>LDA.G PAK.hFileBuf
>SYSCALL GetMemPtr
>PUSHYA
>PUSHW.G PAK.FileSize
>LDA.G PAK.hOutBuf
>SYSCALL GetMemPtr
>STYA ZPPakHdrPtr
>PUSHYA
>PUSHEA.G PAK.Stat
>LIBCALL hLIBPAK,LIBPAK.Pak
bcc .1
.9 rts
.1 >PUSHW.G PAK.Stat+S.PAKSTAT.STORE
>PUSHW.G PAK.Stat+S.PAKSTAT.S4
>PUSHW.G PAK.Stat+S.PAKSTAT.S3
>PUSHW.G PAK.Stat+S.PAKSTAT.REP
>PUSHW.G PAK.Stat+S.PAKSTAT.BL
>PUSHW.G PAK.Stat+S.PAKSTAT.PASS2
>PUSHW.G PAK.Stat+S.PAKSTAT.PASS1
>PUSHW.G PAK.FileSize
>PUSHBI 16
>LDYA L.MSG6
>SYSCALL printf
*--------------------------------------
CS.RUN.Unpak lda ZPPakHdrPtr
clc
adc #S.PAKSTAT
sta ZPPakDataPtr
lda ZPPakHdrPtr+1
adc /S.PAKSTAT
sta ZPPakDataPtr+1
lda (ZPPakHdrPtr)
eor #$ff
sta UNPAK.Cnt
ldy #1
lda (ZPPakHdrPtr),y
eor #$ff
sta UNPAK.Cnt+1
lda #$80
sta UNPAK.Mask
>LDA.G PAK.hFileBuf
>SYSCALL GetMemPtr
>STYA ZPPakSrcPtr
stz UNPAK.Ofs
stz UNPAK.Ofs+1
.1 inc UNPAK.Cnt
bne .2
inc UNPAK.Cnt+1
bne .2
lda #0
sec
rts
.2 lda #'>'
>SYSCALL PutChar
jsr CS.RUN.UnpakGetBitInC
bcs .3
*--------------------------------------
* SHORT3
ldx #3
jsr CS.RUN.UnpakGetXBitInA
clc
adc #S.PAKHDR.SHORT3
tay
lda (ZPPakHdrPtr),y
sta UNPAK.LastByte
jsr DEBUG.S3
jsr CS.RUN.UnpakCmpA
bcs .9
bra .1
.3 jsr CS.RUN.UnpakGetBitInC
bcs .4
*--------------------------------------
* SHORT4
ldx #4
jsr CS.RUN.UnpakGetXBitInA
clc
adc #S.PAKHDR.SHORT4
tay
lda (ZPPakHdrPtr),y
sta UNPAK.LastByte
jsr CS.RUN.UnpakCmpA
bcs .9
bra .1
.4 jsr CS.RUN.UnpakGetBitInC
bcs .5
*--------------------------------------
* REPn
ldx #4
jsr CS.RUN.UnpakGetXBitInA
tay
tax
lda UNPAK.LastByte
.41 jsr CS.RUN.UnpakCmpA
bcs .9
dey
bne .41
.42 txa
clc
adc UNPAK.Cnt
sta UNPAK.Cnt
bcc .2
inc UNPAK.Cnt+1
bra .2
.5 jsr CS.RUN.UnpakGetBitInC
bcs .6
*--------------------------------------
* BACKLINK
ldx #4
jsr CS.RUN.UnpakGetXBitInA
sta UNPAK.BLOfs+1
jsr CS.RUN.UnpakGetByteInA
sta UNPAK.BLOfs
jsr CS.RUN.UnpakGetByteInA
tax
tay
.51
bra .42
*--------------------------------------
* STOREn
.6 ldx #4
jsr CS.RUN.UnpakGetXBitInA
tay
tax
.61 jsr CS.RUN.UnpakGetByteInA
dey
bne .61
sta UNPAK.LastByte
bra .42
.9 >PUSHW UNPAK.Ofs
>PUSHBI 2
>LDYA L.MSG.UnpakErr
>SYSCALL printf
lda #0
sec
rts
*--------------------------------------
CS.RUN.UnpakGetByteInA
ldx #8
*--------------------------------------
CS.RUN.UnpakGetXBitInA
lda #0
.1 jsr CS.RUN.UnpakGetBitInC
rol
dex
bne .1
rts
*--------------------------------------
CS.RUN.UnpakGetBitInC
pha
clc
lda (ZPPakDataPtr)
and UNPAK.Mask
beq .1
sec
.1 php
lsr UNPAK.Mask
bne .8
lda #$80
sta UNPAK.Mask
inc ZPPakDataPtr
bne .8
inc ZPPakDataPtr+1
.8 plp
pla
rts
*--------------------------------------
CS.RUN.UnpakCmpA
cmp (ZPPakSrcPtr)
bne .9
inc ZPPakSrcPtr
bne .1
inc ZPPakSrcPtr+1
.1 inc UNPAK.Ofs
bne .8
inc UNPAK.Ofs+1
.8 clc
rts
.9 sec
rts
*--------------------------------------
DEBUG.S3 pha
phx
phy
>PUSHA
>PUSHBI 1
>LDYA L.MSG.DEBUG.S3
>SYSCALL printf
ply
plx
pla
rts
*--------------------------------------
CS.RUN.Math >PUSHEA.G ENDPTR
>LDYA L.CONST.PI
>SYSCALL StrToF
>PULLF.G MYFLOAT.PI
>PUSHEA.G ENDPTR
>LDYA L.CONST.3
>SYSCALL StrToF
>PULLF.G MYFLOAT.3
>PUSHF.G MYFLOAT.PI
>PUSHF.G MYFLOAT.3
>PUSHF FLOAT5
>PUSHF FLOAT4
>PUSHF FLOAT3
>PUSHF FLOAT2
>PUSHF FLOAT1
>PUSHBI 35
>LDYA L.MSG1
>SYSCALL printf
*--------------------------------------
>PUSHF.G MYFLOAT.PI
>PUSHF.G MYFLOAT.3
>SYSCALL FDiv
>PULLF.G MYFLOAT3
>PUSHF.G MYFLOAT3
>PUSHBI 5
>LDYA L.MSG2
>SYSCALL printf
*--------------------------------------
>PUSHF.G MYFLOAT3
>SYSCALL Cos
>PULLF.G MYFLOAT3
>PUSHF.G MYFLOAT3
>PUSHBI 5
>LDYA L.MSG3
>SYSCALL printf
*--------------------------------------
>PUSHF FLOAT1
>SYSCALL LRIntF
>PULLL.G MYLONG
>PUSHL.G MYLONG
>PUSHBI 4
>LDYA L.MSG4
>SYSCALL printf
*--------------------------------------
>PUSHL LONG1
>SYSCALL Float
* >PULLF.G MYFLOAT3
* >PUSHF.G MYFLOAT3
>PUSHBI 5
>LDYA L.MSG5
>SYSCALL printf
lda #0
sec
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT >LDA.G PAK.hFileName
beq .1
>SYSCALL FreeMem
.1 >LDA.G PAK.hFileBuf
beq .2
>SYSCALL FreeMem
.2 >LDA.G PAK.hOutBuf
beq .8
>SYSCALL FreeMem
.8 lda hLIBPAK
>SYSCALL UnloadLib
clc
rts
*--------------------------------------
CS.END
LIBPAK .AZ "libpak.o"
hLIBPAK .BS 1
MSG1 .AS "PrintF:\r\n"
.AS " %e, %e, %e, %e, %e\r\n"
.AS "StrToF:\r\n"
.AZ " %e, %e\r\n"
MSG2 .AZ "PI/3=%e\r\n"
MSG3 .AZ "COS(PI/3)=%e\r\n"
MSG4 .AZ "LRIntF(99,999,999.9)=%L\r\n"
MSG5 .AZ "Float(123456789)=%e\r\n"
CONST.PI .AZ "3.141592653"
CONST.3 .AZ "3"
FLOAT1 .HS 9B3EBC1FFD 99,999,999.9
FLOAT2 .HS 9E6E6B27FD 999,999,999
FLOAT3 .HS 9E6E6B2800 1,000,000,000
FLOAT4 .HS 8100000000 1
FLOAT5 .HS 9080000000 -32768
LONG1 .DA >123456789
*--------------------------------------
MSG6 .AS "Src Length : %D\r\n"
.AS "Pass #1 : %D\r\n"
.AS "Pass #2 : %D\r\n"
.AS "BL Count : %D\r\n"
.AS "REP Count : %D\r\n"
.AS "S3 Count : %D\r\n"
.AS "S4 Count : %D\r\n"
.AZ "STO Count : %D\r\n"
MSG.UnpakErr .AZ "UnPak Error at Offset : %H\r\n"
MSG.DEBUG.S3 .AZ "S3:%h\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
MYFLOAT.PI .BS 5
MYFLOAT.3 .BS 5
MYFLOAT3 .BS 5
MYLONG .BS 4
ENDPTR .BS 2
PAK.hFileName .BS 1
PAK.FileSize .BS 2
PAK.hFileBuf .BS 1
PAK.hOutBuf .BS 1
PAK.Stat .BS S.PAKSTAT
DS.END
.ED
*--------------------------------------
MAN
SAVE BIN/UNPAK.S
ASM