diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po
index 29b34de6..e4f89cdb 100644
Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ
diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po
index 4d9a6cd6..935dd628 100644
Binary files a/.Floppies/A2OSX.SRC.po and b/.Floppies/A2OSX.SRC.po differ
diff --git a/.Tools/userDefineLang.xml b/.Tools/userDefineLang.xml
index e3e573b4..2bd35e18 100644
--- a/.Tools/userDefineLang.xml
+++ b/.Tools/userDefineLang.xml
@@ -24,7 +24,7 @@
- .BS
.DA
.AS
.AT
.EQ
.MA
.EM
.OR
.TF
.LIST
.HS
.IN
.INB
.OP
.TA
.EM
.PH
.EP
.DUMMY
.ED
.DO
.ELSE
.FIN
+ .BS
.DA
.AS
.AT
.AZ
.EQ
.MA
.EM
.OR
.TF
.LIST
.HS
.IN
.INB
.OP
.TA
.EM
.PH
.EP
.DUMMY
.ED
.DO
.ELSE
.FIN
adc
and
asl
bit
brk
clc
cld
cli
clv
cmp
cpx
cpy
dec
dex
dey
eor
inc
inx
iny
lda
ldx
ldy
lsr
nop
ora
rmb
rol
ror
rti
rts
sbc
sec
sed
sei
smb
sta
stp
stx
sty
stz
tax
tay
trb
tsb
tsx
txa
txs
tya
wai
$
%
/
#
&
.1
.2
.3
.4
.5
.6
.7
.8
.9
diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt
new file mode 100644
index 00000000..6bbb18ba
--- /dev/null
+++ b/INC/LIBPAK.I.txt
@@ -0,0 +1,22 @@
+PR#3
+PREFIX /A2OSX.BUILD
+NEW
+INC 1
+AUTO 6
+ .LIST OFF
+ .OP 65C02
+*--------------------------------------
+S.PAKSTAT.SIZE .EQ 0
+S.PAKSTAT.BL .EQ 2
+S.PAKSTAT.REP .EQ 4
+S.PAKSTAT.S3 .EQ 6
+S.PAKSTAT.S4 .EQ 8
+S.PAKSTAT.STORE .EQ 10
+*
+S.PAKSTAT .EQ 12
+*--------------------------------------
+LIBPAK.Pak .EQ 4
+LIBPAK.UnPak .EQ 6
+*--------------------------------------
+MAN
+SAVE /A2OSX.BUILD/INC/LIBPAK.I
diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt
index a2248db9..595a8310 100644
--- a/LIB/LIBPAK.S.txt
+++ b/LIB/LIBPAK.S.txt
@@ -26,14 +26,6 @@ S.PAKHDR.SHORT3 .EQ 18
*
S.PAKHDR .EQ 26
*--------------------------------------
-S.PAKSTAT.BL .EQ 0
-S.PAKSTAT.REP .EQ 2
-S.PAKSTAT.S3 .EQ 4
-S.PAKSTAT.S4 .EQ 6
-S.PAKSTAT.STORE .EQ 8
-*
-S.PAKSTAT .EQ 10
-*--------------------------------------
PIPELEN .EQ 18
*--------------------------------------
* BITSTREAM :
@@ -57,11 +49,13 @@ PIPELEN .EQ 18
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
+ .INB /A2OSX.BUILD/INC/LIBPAK.I
*--------------------------------------
Pak.SrcPtr .EQ ZPLIB
Pak.SrcBlPtr .EQ ZPLIB+2
Pak.SrcBlPtrT .EQ ZPLIB+4
Pak.DstPtr .EQ ZPLIB+6
+Pak.StatPtr .EQ ZPLIB+8
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@@ -86,34 +80,43 @@ CS.START cld
LIB.LOAD
LIB.UNLOAD clc
rts
-*--------------------------------------
-* In :
-* PULLW = Src PTR
-* PULLW = Src LEN
-* PULLW = Dst PTR Compressed Buffer
-*--------------------------------------
-Pak >PULLYA
- >STYA Pak.Src Init for pass #1
- >STYA Pak.SrcPtr
+*/--------------------------------------
+* # Pak
+* ## In :
+* PUSHW = Src PTR
+* PUSHW = Src Length
+* PUSHW = Dst PTR Output Buffer
+* PUSHW = Dst PTR S.PAKSTAT
+*\--------------------------------------
+Pak >PULLW Pak.StatPtr
+
+ >PULLW Pak.DstPtr
+
>PULLA Get Src Len LO
eor #$ff
sta Pak.SrcCnt
sta Pak.Cnt Init for pass #1
+ sta Pak.DstCnt
tax
>PULLA Get Src Len HI
eor #$ff
sta Pak.SrcCnt+1
sta Pak.Cnt+1 Init for pass #1
+ sta Pak.DstCnt+1
tay
- >PULLW Pak.DstPtr
txa
jsr Pak.PutByte
tya
- jsr Pak.PutByte
+ jsr Pak.PutByte
+
+ >PULLYA Get Src PTR
+ >STYA Pak.Src Init for pass #1
+ >STYA Pak.SrcPtr
ldx #S.PAKSTAT-1
+
.1 stz PakStat,x Reset Stats
dex
bpl .1
@@ -121,6 +124,7 @@ Pak >PULLYA
* PASS #1 : Count occurence for each value...
Pak.1 ldx #0
+
.1 stz Pak.CntL,x
stz Pak.CntH,x
inx
@@ -173,7 +177,7 @@ Pak.1 ldx #0
stz Pak.CntH,x
dey
bpl .6
-
+
ldx #15
.9 lda PakHdr+S.PAKHDR.SHORT4,x Store SHORT4 in reverse order
@@ -203,7 +207,7 @@ Pak.2 >LDYA Pak.Src Init for pass #2
stz Pak.Byte
stz Pak.PipeLen
-
+
Pak.2.LOOP ldx Pak.PipeLen Always fill Bytes in the PIPE until full
.1 jsr Pak.GetByte Load PIPE....
@@ -222,7 +226,14 @@ Pak.2.LOOP ldx Pak.PipeLen Always fill Bytes in the PIPE until full
jmp Pak.2.Store only one....store it
-Pak.2.EXIT clc
+Pak.2.EXIT ldy #S.PAKSTAT-1
+
+.1 lda PakStat,y
+* sta (Pak.StatPtr),y
+ dey
+ bpl .1
+
+ clc
rts
* try finding REPeating same bytes.....
@@ -241,6 +252,7 @@ Pak.2.REP ldx #0
phx REP 1 + 0 or more....save REP count for later....
jsr Pak.PutA a = byte to store
+ bcs .91
lda #%11100000
plx
@@ -251,10 +263,13 @@ Pak.2.REP ldx #0
.3 ldy #4
jsr Pak.PutYBits
+ bcs .91
+
txa
beq .4 if not REP 2 or more no extra count
ldy #4
jsr Pak.PutYBits
+ bcs .90
.4 pla
clc
@@ -264,7 +279,12 @@ Pak.2.REP ldx #0
ldx #S.PAKSTAT.REP
jsr Pak.UpdateStats
- jmp Pak.2.LOOP
+ jmp Pak.2.LOOP
+
+.91 pla
+.90 lda #K.E.OOM
+ sec
+ rts
Pak.2.BL
* Try finding best matching BackLink between SrcBlPtr and SrcPtr (max 512)
.4 lda Pak.SrcPtr
@@ -306,6 +326,7 @@ Pak.2.BL
lda #%1100000
ldy #3
jsr Pak.PutYBits
+ bcs .91
lda Pak.Limit
sec
@@ -314,6 +335,7 @@ Pak.2.BL
ldy #8
jsr Pak.PutYBits
+ bcs .92
plp
lda Pak.Limit+1
@@ -321,7 +343,7 @@ Pak.2.BL
sbc Pak.SrcBlPtrT+1
jsr Pak.PutBit
-
+ bcs .91
ply Get back BL len
phy
@@ -336,10 +358,17 @@ Pak.2.BL
asl
ldy #4 store 4 bits len
jsr Pak.PutYBits
+ bcs .90
+
ldx #S.PAKSTAT.BL
jsr Pak.UpdateStats
jmp Pak.2.LOOP
-
+
+.92 pla
+.91 pla
+.90 lda #K.E.OOM
+ sec
+ rts
* No match...try starting at next byte
.9 inc Pak.SrcBlPtrT
bne .5
@@ -361,9 +390,11 @@ Pak.2.Store lda Pak.Pipe
lda #0
ldy #1
jsr Pak.PutYBits write 0
+ bcs .9
lda Pak.Pipe ...and byte
jsr Pak.PutA
+ bcs .9
ldy #1
jsr Pak.StripPipe
@@ -387,26 +418,39 @@ Pak.2.Store lda Pak.Pipe
ldy #6
.8 jsr Pak.PutYBits write 100xxxx
+ bcs .9
ldy #1
jsr Pak.StripPipe
jmp Pak.2.LOOP
+
+.9 lda #K.E.OOM
+ sec
+ rts
*--------------------------------------
Pak.PutA ldy #8
*--------------------------------------
Pak.PutYBits asl
jsr Pak.PutBit
+ bcs .9
dey
bne Pak.PutYBits
- rts
+.9 rts
*--------------------------------------
* Pak.PutBit (bit in C)
*--------------------------------------
-Pak.PutBit ldx #$ff
+Pak.PutBit ldx #$ff SELF MODIFIED
+
pha
bne .1
+
lda Pak.Byte
+ php
+
jsr Pak.PutByte
+ bcs .9
+
+ plp
stz Pak.Byte
ldx #8
@@ -414,21 +458,42 @@ Pak.PutBit ldx #$ff
stx Pak.PutBit+1
bcc .8 Nothing to "light up"
- lda Pak.Byte
lda Pak.BitMask,x
- sta Pak.Byte
+ tsb Pak.Byte
+ clc
+
.8 pla
- rts
+ rts
+
+.9 plp
+ pla
+ sec
+ rts
*--------------------------------------
-Pak.PutByte sta (Pak.DstPtr)
- inc Pak.DstPtr
+Pak.PutByte inc Pak.DstCnt
bne .1
+ inc Pak.DstCnt+1
+ beq .9
+
+ bra .8
+
+.1 sta (Pak.DstPtr)
+ inc Pak.DstPtr
+ bne .2
inc Pak.DstPtr+1
-.1 inc PakHdr+S.PAKHDR.LEN
- bne .2
+.2 inc PakHdr+S.PAKHDR.LEN
+ bne .3
inc PakHdr+S.PAKHDR.LEN+1
-.2
+
+.3 inc PakStat+S.PAKSTAT.SIZE
+ bne .8
+ inc PakStat+S.PAKSTAT.SIZE+1
+
+.8 clc
+ rts
+
+.9 sec
rts
*--------------------------------------
* Y = count to remove from PIPE
@@ -454,9 +519,9 @@ Pak.UpdateStats inc PakStat,x
inc PakStat+1,x
.8 rts
*--------------------------------------
-Pak.GetByte inc UnPak.Cnt
+Pak.GetByte inc Pak.Cnt
bne .1
- inc UnPak.Cnt+1
+ inc Pak.Cnt+1
beq .9
.1 lda (Pak.SrcPtr)
@@ -634,12 +699,13 @@ CS.END
Pak.Src .BS 2
Pak.SrcCnt .BS 2
Pak.Cnt .BS 2
+Pak.DstCnt .BS 2
Pak.CntL .BS 256
Pak.CntH .BS 256
Pak.Byte .BS 1
Pak.Limit .BS 2
Pak.PipeLen .BS 1
-Pak.Pipe .BS 18
+Pak.Pipe .BS PIPELEN
Pak.BitMask .HS 0102040810204080
*--------------------------------------
PakHdr .BS S.PAKHDR
diff --git a/TEST.S.txt b/TEST.S.txt
index 9a10e5c6..60438553 100644
--- a/TEST.S.txt
+++ b/TEST.S.txt
@@ -8,6 +8,7 @@ AUTO 4,1
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
+ .INB /A2OSX.BUILD/INC/LIBPAK.I
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@@ -28,6 +29,7 @@ CS.START cld
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
+L.LIBPAK .DA LIBPAK
L.FLOAT1 .DA FLOAT1
L.FLOAT2 .DA FLOAT2
L.FLOAT3 .DA FLOAT3
@@ -41,12 +43,78 @@ L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
L.MSG4 .DA MSG4
L.MSG5 .DA MSG5
+L.MSG6 .DA MSG6
.DA 0
*--------------------------------------
-CS.INIT clc
+CS.INIT >LDYA L.LIBPAK
+ >SYSCALL LoadLib.YA
+ 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 SYS.FOpen.R
+
+ lda #1
+ >SYSCALL GetArg.A
+ >SYSCALL RealPath.YA
+ >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.YA
+ bcs .9
+
+ txa
+ >STA.G PAK.hOutBuf
+
+ >LDA.G PAK.hFileBuf
+ >SYSCALL GetMemPtr.A
+ >PUSHYA
+
+ >PUSHW.G PAK.FileSize
+
+ >LDA.G PAK.hOutBuf
+ >SYSCALL GetMemPtr.A
+ >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.SIZE
+ >PUSHW.G PAK.FileSize
+
+ >LDYA L.MSG6
+ >SYSCALL PrintF.YA
+
+ lda #0
+ sec
rts
*--------------------------------------
-CS.RUN >PUSHEA.G ENDPTR
+CS.RUN.Math >PUSHEA.G ENDPTR
>PUSHW L.CONST2
>PUSHEA.G MYFLOAT2
>SYSCALL StrToF
@@ -99,7 +167,6 @@ CS.RUN >PUSHEA.G ENDPTR
>PUSHEA.G MYFLOAT1
>LDYA L.MSG5
>SYSCALL PrintF.YA
-*--------------------------------------
lda #0
sec
rts
@@ -107,11 +174,32 @@ CS.RUN >PUSHEA.G ENDPTR
CS.DOEVENT sec
rts
*--------------------------------------
-CS.QUIT clc
+CS.QUIT >LDA.G PAK.hFileName
+ beq .1
+
+ >SYSCALL FreeMem.A
+
+.1 >LDA.G PAK.hFileBuf
+ beq .2
+
+ >SYSCALL FreeMem.A
+
+.2 >LDA.G PAK.hOutBuf
+ beq .8
+
+ >SYSCALL FreeMem.A
+
+.8 lda hLIBPAK
+ >SYSCALL UnloadLib.A
+ clc
rts
*--------------------------------------
CS.END
-MSG1 .AZ "PrintF:%e, %e, %e\r\n%e, %e\r\nStrToF:%e, %e\r\n"
+LIBPAK .AZ "libpak.o"
+hLIBPAK .BS 1
+MSG1 .AS "PrintF:%e, %e, %e\r\n"
+ .AS "%e, %e\r\n"
+ .AZ "StrToF:%e, %e\r\n"
FLOAT1 .HS 9B3EBC1FFD 99,999,999.9
FLOAT2 .HS 9E6E6B27FD 999,999,999
FLOAT3 .HS 9E6E6B2800 1,000,000,000
@@ -124,6 +212,13 @@ MSG2 .AZ "PI/3=%e\r\n"
MSG3 .AZ "COS(PI/3)=%e\r\n"
MSG4 .AZ "Long=%L\r\n"
MSG5 .AZ "Float=%e\r\n"
+MSG6 .AS "Src Length : %D\r\n"
+ .AS "Compressed : %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"
*--------------------------------------
.DUMMY
.OR 0
@@ -133,6 +228,12 @@ MYFLOAT2 .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
*--------------------------------------