diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 7f4d16ba..03b7b78a 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/BIN/ASM.S.EXP.txt b/BIN/ASM.S.EXP.txt index e02af44d..9ea8f852 100644 --- a/BIN/ASM.S.EXP.txt +++ b/BIN/ASM.S.EXP.txt @@ -2,8 +2,13 @@ NEW PREFIX /A2OSX.BUILD AUTO 4,1 *--------------------------------------- -* U-Operators : -* B-Operators : +* EXP.Modifiers: +* # : 8b,Byte 1 +* / : 8b,Byte 2 +* ^ : 8b,Byte 3 +* < : 24b,Byte 1,2,3 +* > : 32b +*--------------------------------------- * Num Format : 0-9 -> decimal * $ = Hex * % = binary @@ -11,11 +16,11 @@ AUTO 4,1 * * = PC *--------------------------------------- EXP.Eval lda #2 - sta SRC.ACC.SIZE Assume WORD (2 bytes) + sta SRC.ACC.SIZE Default To WORD (2 bytes) - stz EXP.Modifier - - stz EXP.Operator + >STZ.G EXP.Modifier + >STZ.G EXP.Prefix + >STZ.G EXP.Operator jsr SRC.GetChar bcs EXP.Eval.Missing @@ -23,7 +28,11 @@ EXP.Eval lda #2 jsr SRC.IsMODReserved bcs EXP.Eval.Next1 - stx EXP.Modifier + txa + >STA.G EXP.Modifier + lda #'#' + >STA.G EXP.Prefix + bra EXP.Eval.Next EXP.Eval.Missing lda #ERR.MISSING.EXP @@ -123,7 +132,12 @@ EXP.Eval.Next1 cmp #'.' Local Label? bcs EXP.EvalExitUND bra EXP.EvalOperator -EXP.EvalExitOK clc +EXP.EvalExitOK >LDA.G EXP.Modifier + beq .8 + asl + tax + jmp (J.EXP.MOD,x) +.8 clc EXP.EvalExitRTS rts EXP.EvalExitSYN lda #ERR.SYNTAX.ERROR @@ -134,7 +148,7 @@ EXP.EvalExitUND lda #ERR.UNDEF.SYMBOL sec rts -EXP.EvalOperator lda EXP.Operator +EXP.EvalOperator >LDA.G EXP.Operator beq .7 jsr EXP.Compute @@ -151,8 +165,8 @@ EXP.EvalOperator lda EXP.Operator jsr SRC.IsEXPReserved bcs EXP.EvalExitSYN - - stx EXP.Operator + txa + >STA.G EXP.Operator ldx #3 @@ -213,6 +227,23 @@ EXP.Compute dec .8 clc rts *--------------------------------------- +EXP.MOD.8.3 lda SRC.ACC+2 + bra EXP.MOD.8 +EXP.MOD.8.2 lda SRC.ACC+1 +EXP.MOD.8 sta SRC.ACC +EXP.MOD.8.1 lda #1 + sta SRC.ACC.SIZE + clc + rts +EXP.MOD.24 lda #3 + sta SRC.ACC.SIZE + clc + rts +EXP.MOD.32 lda #4 + sta SRC.ACC.SIZE + clc + rts +*--------------------------------------- EXP.OP.EOR ldx #3 .1 lda SRC.ARG,x diff --git a/BIN/ASM.S.OUT.txt b/BIN/ASM.S.OUT.txt index 7e3b970a..7d8ea59d 100644 --- a/BIN/ASM.S.OUT.txt +++ b/BIN/ASM.S.OUT.txt @@ -76,7 +76,6 @@ OUT.PrintLine.9 rts OUT.PrintLineOn clc rts - >LDA.G ASM.LI.ON bpl .9 @@ -147,11 +146,11 @@ OUT.PrintLineAcc ldx SRC.ACC.SIZE dex bne .1 -.2 lda SRC.ACC.SIZE + lda SRC.ACC.SIZE asl tax - ldy L.MSG.EQU0,x +.2 ldy L.MSG.EQU0,x lda L.MSG.EQU0+1,x >SYSCALL PrintF.YA rts diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt index dc99f6ea..7e586cbc 100644 --- a/BIN/ASM.S.SRC.txt +++ b/BIN/ASM.S.SRC.txt @@ -178,7 +178,7 @@ SRC.ParseLine.LABEL lda #0 bit #SYM.F.RESOLVED bne SRC.ParseLine.Redef -.2 jsr SYM.UpdateGlobal +.2 jsr SYM.UpdateGlobalPC bra SRC.ParseLine.DirOp .3 jsr SYM.LookupGlobal Pass #2: should be already defined... @@ -243,7 +243,7 @@ SRC.ParseLine.ExecMacro rts *--------------------------------------- SRC.ParseLine.OpCode - stz SRC.AM.ID + stz SRC.AM.StrBuf >LDYA ZPOPtr >STYA ZPPtr1 @@ -310,20 +310,23 @@ SRC.ParseLine.OpCode sta ZPPtr1+1 bra .1 -.8 clc - rts +.8 jmp SRC.ParseLine.AMCheck .9 lda #ERR.INV.OPCODE sec .99 rts *--------------------------------------- -SRC.ParseLine.AM stz SRC.AM.StrBuf +SRC.ParseLine.AM >LDA.G EXP.Prefix + beq .1 + inc SRC.AM.StrBuf + ldx SRC.AM.StrBuf + sta SRC.AM.StrBuf,x .1 jsr SRC.GetChar - bcs .8 + bcs SRC.ParseLine.AMCheck .10 cmp #' ' another space ? - beq .8 ignore end of line (comment) + beq SRC.ParseLine.AMCheck ignore end of line (comment) jsr SRC.IsAMReserved bcs .2 @@ -333,18 +336,7 @@ SRC.ParseLine.AM stz SRC.AM.StrBuf sta SRC.AM.StrBuf,x bra .7 -.2 jsr SRC.IsMODReserved - bcs .3 - - lda #'#' - inc SRC.AM.StrBuf - ldx SRC.AM.StrBuf - sta SRC.AM.StrBuf,x - - jsr SRC.GetNextChar - bcs .9 - -.3 jsr SRC.IsLetter Any register? +.2 jsr SRC.IsLetter Any register? bcs .6 no, try something else >LDYA ZPRPtr Check in register table @@ -394,14 +386,23 @@ SRC.ParseLine.AM stz SRC.AM.StrBuf .7 jsr SRC.GetNextChar bcc .10 + + jmp SRC.ParseLine.AMCheck -.8 clc - rts - .9 lda #ERR.INV.AM.SYN sec .99 rts *--------------------------------------- +SRC.ParseLine.AMCheck + jsr OUT.PrintLine.1 + >PUSHW L.SRC.AM.StrBuf + >LDYA L.MSG.PSTRCRLF + >SYSCALL PrintF.YA + + >DEBUG + clc + rts +*--------------------------------------- SRC.GetDecimal jsr SRC.GetChar beq .99 @@ -618,9 +619,11 @@ SRC.GetBinary jsr SRC.GetNextChar skip '%' *--------------------------------------- SRC.GetKeyword >STYA ZPPtr1 KeyWord table - stz SRC.Keyword.ID + lda #0 Keyword.ID + +.1 pha -.1 lda (ZPPtr1) + lda (ZPPtr1) beq .9 End Of table tax KW len @@ -628,14 +631,14 @@ SRC.GetKeyword >STYA ZPPtr1 KeyWord table .2 ldy #0 .3 lda (ZPLinePtr),y - beq .5 + beq .6 jsr SRC.IsKeywordLetterUC - bcs .5 + bcs .6 iny cmp (ZPPtr1),y - bne .5 + bne .6 dex bne .3 @@ -644,31 +647,34 @@ SRC.GetKeyword >STYA ZPPtr1 KeyWord table beq .4 End of Line ? jsr SRC.IsKeywordLetterUC - bcc .5 Additional letters... + bcc .6 Additional letters... .4 lda ZPLinePtr clc adc (ZPPtr1) sta ZPLinePtr - bcc .41 + bcc .5 inc ZPLinePtr+1 -.41 ldx SRC.Keyword.ID + +.5 pla Keyword.ID clc rts -.5 lda (ZPPtr1) +.6 lda (ZPPtr1) sec Add keyword Len+1 adc ZPPtr1 sta ZPPtr1 - bcc .6 + bcc .7 inc ZPPtr1+1 -.6 inc SRC.Keyword.ID - inc SRC.Keyword.ID +.7 pla Keyword.ID + inc + inc bra .1 -.9 sec +.9 plx + sec rts *--------------------------------------- SRC.IsAMReserved ldx SRC.AM.RESERVED diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index 18f29d41..a33e7ad3 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -66,19 +66,13 @@ SYM.Dump stz ZPLinePtr >PUSHW ZPLinePtr >PUSHW ZPTmpBuf >SYSCALL SListGetByID - pha - txa - sta ZPLinePtr - tya - sta ZPLinePtr+1 - pla bcs .8 + stx ZPLinePtr Save Next ID + sty ZPLinePtr+1 >LDA.G ASM.LI.ON bpl .1 - >PUSHW ZPTmpBuf Label (PString) - lda (ZPTmpBuf) sec adc ZPTmpBuf @@ -87,8 +81,15 @@ SYM.Dump stz ZPLinePtr adc #0 sta ZPPtr1+1 - ldx #4 - ldy #2 + ldy #SYM.F Get Symbol Size + lda (ZPPtr1),y + and #3 + beq .3 + + pha + tax + + iny SYM.V .2 lda (ZPPtr1),y >PUSHA @@ -96,18 +97,26 @@ SYM.Dump stz ZPLinePtr dex bne .2 - >LDYA L.MSG.GSYMBOL + pla + asl + +.3 tax + ldy L.MSG.EQU0,x + lda L.MSG.EQU0+1,x >SYSCALL PrintF.YA + >PUSHW ZPTmpBuf Label (PString) + + >LDYA L.MSG.PSTRCRLF + >SYSCALL PrintF.YA bcc .1 rts .8 clc rts *--------------------------------------- -SYM.AddGlobalPC jsr SYM.PC2Global - - lda #SYM.F.RESOLVED +SYM.AddGlobalPC jsr SYM.PC2Global A=SYM.Len + ora #SYM.F.RESOLVED PC is always known *--------------------------------------- SYM.AddGlobal >STA.G SYM.Global+SYM.F @@ -170,8 +179,19 @@ SYM.UpdateGlobalAcc ldx #3 dey dex bpl .1 + + ldx #4 + ldy #3 + +.3 lda SRC.ACC,y + bne .4 + dex + dey + bne .3 + +.4 txa *--------------------------------------- -SYM.UpdateGlobal lda #SYM.F.RESOLVED +SYM.UpdateGlobal ora #SYM.F.RESOLVED >STA.G SYM.Global+SYM.F lda #5 F+DWORD @@ -203,6 +223,18 @@ SYM.PC2Global ldx #4 dey dex bne .2 + + ldx #4 + ldy #ASM.PC+3 + +.3 lda (pData),y + bne .4 + dex + dey + bne .3 + +.4 txa + rts *--------------------------------------- SYM.AddLocalPC tax Save ID diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 58fdf371..e1fb6d30 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -90,7 +90,7 @@ L.MSG.EQU0 .DA MSG.EQU0 L.MSG.SRCLINE .DA MSG.SRCLINE L.MSG.ERROR .DA MSG.ERROR L.MSG.SYMBOLS .DA MSG.SYMBOLS -L.MSG.GSYMBOL .DA MSG.GSYMBOL +L.MSG.PSTRCRLF .DA MSG.PSTRCRLF L.MSG.SUMMARY .DA MSG.SUMMARY L.MSG.PASS .DA MSG.PASS L.MSG.SRC.FILE .DA MSG.SRC.FILE @@ -150,7 +150,12 @@ J.LI .DA DIR.LI.ON .DA DIR.LI.MOFF .DA DIR.LI.XON .DA DIR.LI.XOFF -J.EXP.OP .DA EXP.OP.EOR ^!|&<=>+-*/ +J.EXP.MOD .DA EXP.MOD.8.1 + .DA EXP.MOD.8.2 + .DA EXP.MOD.8.3 + .DA EXP.MOD.24 + .DA EXP.MOD.32 +J.EXP.OP .DA EXP.OP.EOR ^!|&<=>+-*/ .DA EXP.OP.ORA .DA EXP.OP.ORA .DA EXP.OP.AND @@ -239,7 +244,7 @@ CS.RUN >SYSCALL GetChar >PUSHA >LDYA L.MSG.PASS >SYSCALL PrintF.YA - + ldy #SRC.hFILENAME lda (pData),y @@ -383,43 +388,38 @@ T.LI >PSTR "ON" >PSTR "XOFF" .HS 00 *--------------------------------------- -MSG.HELP >CSTR "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" -MSG.PASS >CSTR "Pass:#%d\r\n" -MSG.SRC.FILE >CSTR "Reading SRC File:%s\r\n" -MSG.OBJ.FILE >CSTR "Writing OBJ File:%s, Type=%02x\r\n" -MSG.T.FILE >CSTR "Loading CPU File:%s\r\n" -MSG.OUT0 >CSTR "%H- " -MSG.OUT1 >CSTR "%H-%h " -MSG.OUT2 >CSTR "%H-%h %h " -MSG.OUT3 >CSTR "%H-%h %h %h" -MSG.EQU0 >CSTR "[ ]" -MSG.EQU1 >CSTR "[ %h]" -MSG.EQU2 >CSTR "[ %h%h]" -MSG.EQU3 >CSTR "[ %h%h%h]" -MSG.EQU4 >CSTR "[ %h%h%h%h]" -MSG.SRCLINE >CSTR " %05D %s\r\n" -MSG.ERROR >CSTR "*** Fatal Error $%h " -MSG.SYMBOLS >CSTR "Symbol Table:\r\n" -MSG.GSYMBOL >CSTR "$%h%h%h%h:%S\r\n" -MSG.SUMMARY >CSTR "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n" -SRC.AM.RESERVED >PSTR "[]()," -SRC.MOD.RESERVED >PSTR "#/<>" +ASM.6502 .AZ "6502" +MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" +MSG.PASS .AZ "Pass:#%d\r\n" +MSG.SRC.FILE .AZ "Reading SRC File:%s\r\n" +MSG.OBJ.FILE .AZ "Writing OBJ File:%s, Type=%02x\r\n" +MSG.T.FILE .AZ "Loading CPU File:%s\r\n" +MSG.OUT0 .AZ "%H- " +MSG.OUT1 .AZ "%H-%h " +MSG.OUT2 .AZ "%H-%h %h " +MSG.OUT3 .AZ "%H-%h %h %h" +MSG.EQU0 .AZ "[ ?]" +MSG.EQU1 .AZ "[ %h]" +MSG.EQU2 .AZ "[ %h%h]" +MSG.EQU3 .AZ "[ %h%h%h]" +MSG.EQU4 .AZ "[ %h%h%h%h]" +MSG.SRCLINE .AZ " %05D %s\r\n" +MSG.ERROR .AZ "*** Fatal Error $%h " +MSG.SYMBOLS .AZ "Symbol Table:\r\n" +MSG.PSTRCRLF .AZ " %S\r\n" +MSG.SUMMARY .AZ "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n" +SRC.MOD.RESERVED >PSTR "#/^<>" SRC.EXP.RESERVED >PSTR "^!|&<=>+-*/" -ASM.6502 >CSTR "6502" +SRC.AM.RESERVED >PSTR "[]()," *--------------------------------------- ASM.T.FILENAME .BS 65 FIO.Stat .BS S.STAT -EXP.Modifier .BS 1 -EXP.Operator .BS 1 - -SRC.Keyword.ID .BS 1 SRC.ACC.SIZE .BS 1 SRC.ACC .BS 4 SRC.ACCTMP .BS 4 SRC.ARG .BS 4 -SRC.AM.ID .BS 1 SRC.AM.StrBuf .BS 32 *-------------------------------------- .DUMMY @@ -446,6 +446,11 @@ ASM.T.hMem .BS 1 DIR.Word .BS 2 DIR.Byte .BS 1 +EXP.Modifier .BS 1 +EXP.Prefix .BS 1 +EXP.Operator .BS 1 + + ASM.PASS .BS 1 ASM.DO.StackPtr .BS 1 ASM.DO.Stack .BS SRC.DO.MAXDEPTH diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt index 396b2eb1..8a37b841 100644 --- a/INC/LIBPAK.I.txt +++ b/INC/LIBPAK.I.txt @@ -1,10 +1,6 @@ -PR#3 -PREFIX /A2OSX.BUILD NEW -INC 1 -AUTO 6 - .LIST OFF - .OP 65C02 +PREFIX /A2OSX.BUILD +AUTO 4,1 *-------------------------------------- * File Header : *-------------------------------------- @@ -14,17 +10,12 @@ S.PAKFILE.VER .EQ 8 S.PAKFILE.TF .EQ 9 Target File (C-String) *-------------------------------------- * Shunk Header : -* WORD : !Target UNCompressed Length -* USED TO STOP UNPACK -* !!!NO EOF TOKEN!!! -* Short3 : [0..7] -* Short4 : [0..15] +* WORD : Target UNCompressed Length +* !!! USED TO STOP UNPACK,NO EOF TOKEN!!! *-------------------------------------- -S.PAKHDR.LEN .EQ 0 -S.PAKHDR.SHORT3 .EQ 2 -S.PAKHDR.SHORT4 .EQ 10 +S.PAKSHK.ULEN .EQ 0 Uncompressed length * -S.PAKHDR .EQ 26 +S.PAKSHK .EQ 26 *-------------------------------------- S.PAKSTAT.PASS1 .EQ 0 S.PAKSTAT.PASS2 .EQ 2 diff --git a/LIB/LIBPAK.S.AC.txt b/LIB/LIBPAK.S.AC.txt new file mode 100644 index 00000000..a5e55cb9 --- /dev/null +++ b/LIB/LIBPAK.S.AC.txt @@ -0,0 +1,10 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- + +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.AC +ASM diff --git a/LIB/LIBPAK.S.IN.txt b/LIB/LIBPAK.S.IN.txt new file mode 100644 index 00000000..930bda81 --- /dev/null +++ b/LIB/LIBPAK.S.IN.txt @@ -0,0 +1,71 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +Pak.In.Init >LDYA Pak.SrcPtr + >STYA ZPSrcPtr + + lda Pak.Hdr+S.PAKHDR.LEN + eor #$ff + sta Pak.SrcCnt + + lda Pak.Hdr+S.PAKHDR.LEN+1 + eor #$ff + sta Pak.SrcCnt+1 + + rts +*-------------------------------------- +Pak.In.GetRH lda #$ff + cmp Pak.SrcCnt+1 return 255 if not $ffxx + bne .1 + + lda Pak.SrcCnt + eor #$ff return !xx if $ffxx + +.1 rts +*-------------------------------------- +Pak.In.MoveFWA clc + adc ZPSrcPtr + sta ZPSrcPtr + bcc .8 + inc ZPSrcPtr+1 + +.8 rts +*-------------------------------------- +Pak.In.Get8Bits ldy #8 + .HS 2C bit abs +Pak.In.Get4Bits ldy #4 + lda #0 make sure to reset A before reading less than 8 bits only +.1 jsr Pak.In.GetBit and to exit with CC if even if 8 bits read + rol + dey + bne .1 + rts always CC +*-------------------------------------- +Pak.In.GetBit ldx Pak.In.Mask + bne .1 + jsr Pak.In.NxtByte + + ldx #8 + +.1 dex + stx Pak.In.GetBit+1 + + pha Don't trash A + lda (UnZPSrcPtr) + and Pak.In.BitMask,x + cmp #1 if 0:CC, i>0 CS + + pla + rts Bit is in C +*-------------------------------------- +Pak.In.GetByte lda (UnZPSrcPtr) +Pak.In.NxtByte inc UnZPSrcPtr + bne .8 + inc UnZPSrcPtr+1 +.8 rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.IN +ASM diff --git a/LIB/LIBPAK.S.LZ.txt b/LIB/LIBPAK.S.LZ.txt new file mode 100644 index 00000000..66463903 --- /dev/null +++ b/LIB/LIBPAK.S.LZ.txt @@ -0,0 +1,166 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +* Sliding Window = 4096 +*-------------------------------------- +WSIZE .EQ 4096 power of 2 +*-------------------------------------- +* Output BITSTREAM : +* 0 : Lit (8) +* 1 : Copy, L (4), P.HI (4), P.LO (8) +*-------------------------------------- +Pak.LZ jsr Pak.In.Init Init SrcPtr,SrcCnt + jsr Pak.Out.Init + +* future optimization, make P grows from 2 to 12 while increasing W size + +* lda #2 Ptr width starts at 2 bits +* sta Pak.LZ.PWidth + +* lda #%00000011 Ptr Mask Starts at %000000000011 +* sta Pak.LZ.PMaskLO +* stz Pak.LZ.PMaskHI + + lda #$ff + sta Pak.LZ.WCnt + sta Pak.LZ.WCnt+1 WCnt=!0 + +.1 jsr Pak.In.GetRH Z if EOF + beq .80 + + cmp #3 + bcc .8 no more than 2 bytes left....store + + cmp #19 more than 18 bytes left, limit to 18 + bcc .2 + lda #18 + +.2 tax X = Read ahead max size + + lda ZPSrcPtr make ZPSrcWPtr=ZPSrcPtr + sta ZPSrcWPtr + + lda ZPSrcPtr + sta ZPSrcWPtr + + lda Pak.LZ.WCnt + sta ZPCnt + lda Pak.LZ.WCnt+1 + sta ZPCnt+1 + + stz Pak.LZ.BestLen + +.3 inc ZPCnt + bne .4 + inc ZPCnt+1 + beq .7 reached begining of window....store + + lda ZPSrcWPtr make ZPSrcWPtr-=1 + sec + sbc #1 + sta ZPSrcWPtr + bcs .4 + dec ZPSrcWPtr+1 + +.4 ldy #0 + phx save Read ahead max size + +.5 lda (ZPSrcPtr),y Try to find a match + cmp (ZPSrcWPtr),y + bne .6 + + iny + dex don't exceed 18 or Src Buffer + bne .5 + +.6 plx get back Read ahead max size + + cpy #3 matched a least 3 chars ? + bcc .3 no....try one char back in Wnd + + cpy Pak.LZ.BestLen better than last match ? + bcc .3 no....try one char back in Wnd + + sty Pak.LZ.BestLen + lda ZPSrcWPtr + sta Pak.LZ.BestPtr + lda ZPSrcWPtr+1 + sta Pak.LZ.BestPtr+1 + bra .3 + +.7 lda Pak.LZ.BestLen do we match something ? + beq .8 + + lda Pak.LZ.BestPtr + sec + sbc ZPSrcPtr + sta Pak.LZ.BestPtr + + lda Pak.LZ.BestPtr+1 + sbc ZPSrcPtr+1 + sta Pak.LZ.BestPtr+1 + + tya get len + dec Adjust range 0-15 + dec + dec + ora Pak.LZ.BestPtr+1 merge with P.HI + + sec + jsr Pak.Out.PutCA Put 9 bits 1+LLLL+PPPP + bcs .99 + + lda Pak.LZ.BestPtr Put 8 bits pppppppp + + jsr Pak.Out.PutA + bcs .99 + + tya + bra .81 + +.8 lda (ZPSrcPtr) + clc + jsr Pak.Out.PutCA Put 9 bits 0+xxxxxxxx + bcs .99 + lda #1 + +.81 jsr Pak.In.MoveFWA + tya + jsr LZ.MoveWndY + bra .3 + bra .71 + +.80 clc +.99 rts +*-------------------------------------- +Unpak.LZ + + + clc + rts +*-------------------------------------- +LZ.MoveWndY tya + sec + sbc Pak.LZ.WCnt + tax + lda #0 + sbc Pak.LZ.WCnt+1 + + cpx #WSIZE^$FF + sbc /WSIZE^$FF + + bcs .1 + + ldx #WSIZE^$FF + lda /WSIZE^$FF + +.1 stx Pak.LZ.WCnt + sta Pak.LZ.WCnt+1 + + rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.LZ +ASM diff --git a/LIB/LIBPAK.S.OUT.txt b/LIB/LIBPAK.S.OUT.txt new file mode 100644 index 00000000..a9587e6d --- /dev/null +++ b/LIB/LIBPAK.S.OUT.txt @@ -0,0 +1,91 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +Pak.Out.Init lda #$80 + sta Pak.Out.Mask + stz Pak.Out.Byte + rts +*-------------------------------------- +Pak.Out.Close bit Pak.Out.Mask + bmi .8 + lda Pak.Out.Byte + jmp Pak.Out.PutByte +.8 clc + rts +*-------------------------------------- +Pak.Out.PutCA jsr Pak.Out.PutBitC + bcs Pak.Out.Put.rts + +Pak.Out.PutA ldy #8 + +.1 asl + jsr Pak.Out.PutBitC + bcs Pak.Out.Put.rts + dey + bne .1 + +Pak.Out.Put.rts rts +*-------------------------------------- +Pak.Out.PutBitC pha + + bcc .1 + lda Pak.Mask + tsb Pak.Byte + clc + +.1 lsr Pak.Mask + bne .8 + + jsr Pak.Out.PutByte + bcs .9 + + jsr Pak.Out.Init + +.8 pla +* clc + rts + +.9 pla +* sec + rts +*-------------------------------------- +Pak.Out.PutByte inc Pak.DstCnt + bne .1 + inc Pak.DstCnt+1 + beq .9 + +.1 ldx Pak.Pass + bne .6 + + phx + tax + + inc Pak.CntL,x + bne .2 + + inc Pak.CntH,x + +.2 plx + bra .7 + +.6 sta (ZPDstPtr) + + inc ZPDstPtr + bne .2 + inc ZPDstPtr+1 + +.7 inc Pak.Stat+S.PAKSTAT.PASS1,x + bne .8 + inc Pak.Stat+S.PAKSTAT.PASS1+1,x + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.OUT +ASM diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt index 4b592b34..fe71ed38 100644 --- a/LIB/LIBPAK.S.txt +++ b/LIB/LIBPAK.S.txt @@ -5,41 +5,14 @@ AUTO 4,1 .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/LIB/LIBPAK.O -*-------------------------------------- -* BITSTREAM : -*-------------------------------------- -* 0 : SHORT3 (1)+3=4 bits -* 3 bits : index in Short3 Table -*-------------------------------------- -* 10 : SHORT4 (2)+4=6 bits -* 4 bits : index in Short4 Table -*-------------------------------------- -* 110 : REPn (3)+5=8 bits -* 5 bits count (1+n) -*-------------------------------------- -* 1110 = BACKLINK : (4)+12+8=24 bits -* 12 bits : Offset (HI-4,LO-8) -* 8 bits : 4 + n (8 bits count) (259 max) -*-------------------------------------- -* 1111 : STOREn (4) + 4 cnt + 8n.... -*-------------------------------------- -PAK.B.SHORT3 .EQ %00000000 0xxx0000 -PAK.B.SHORT4 .EQ %10000000 10xxxx00 -PAK.B.REPn .EQ %11000000 110xxxxx -PAK.B.BACKLINK .EQ %11100000 1110hhhhllllllllxxxxxxxx -PAK.B.STOREn .EQ %11110000 1111xxxx ... -*-------------------------------------- -WSIZE .EQ 4096 -REPMAX .EQ 32 -STOREMAX .EQ 16 *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBPAK.I *-------------------------------------- -ZPSrcWPtr .EQ ZPLIB -ZPSrcPtr .EQ ZPLIB+2 - +ZPSrcPtr .EQ ZPLIB +ZPSrcWPtr .EQ ZPLIB+2 +ZPCnt .EQ ZPLIB+4 ZPHdrPtr .EQ ZPLIB+14 ZPDstPtr .EQ ZPLIB+16 ZPStatPtr .EQ ZPLIB+18 @@ -499,68 +472,24 @@ Pak.Flush ldx Pak.StoreCnt ldx #0 .1 lda Pak.StoreBuf,x - ldy #4 + sta Pak.LastByte update last byte for REP + ldy #8 jsr Pak.PutYBits bcs .9 - inx + + inc Pak.Stat+S.PAKSTAT.STORE + bne .2 + inc Pak.Stat+S.PAKSTAT.STORE+1 + +.2 inx dec Pak.StoreCnt bne .1 - ldx #S.PAKSTAT.STORE - jsr Pak.UpdateStats - + stz Pak.RepCnt Don't forget to set last byte valid + .8 clc .9 rts *-------------------------------------- -* Pak.PutBit (bit in C) -*-------------------------------------- -Pak.PutBit pha - - bcc .1 - lda Pak.Mask - tsb Pak.Byte - clc - -.1 lsr Pak.Mask - bne .8 - - jsr Pak.PutByte - bcs .9 - - stz Pak.Byte - lda #$80 - - sta Pak.Mask - -.8 pla -* clc - rts - -.9 pla -* sec - rts -*-------------------------------------- -Pak.PutByte inc Pak.DstCnt - bne .1 - inc Pak.DstCnt+1 - beq .9 - -.1 sta (ZPDstPtr) - - inc ZPDstPtr - bne .2 - inc ZPDstPtr+1 - -.2 inc Pak.Stat+S.PAKSTAT.PASS2 - bne .8 - inc Pak.Stat+S.PAKSTAT.PASS2+1 - -.8 clc - rts - -.9 sec - rts -*-------------------------------------- Pak.UpdateStats inc Pak.Stat,x bne .8 inc Pak.Stat+1,x @@ -684,45 +613,6 @@ UnPak >PULLA Get Dst PTR LO bne .9 jmp .1 *-------------------------------------- -UnPak.Get8Bits ldy #8 - .HS 2C bit abs -UnPak.Get4Bits ldy #4 - lda #0 make sure to reset A before reading less than 8 bits only -.1 jsr UnPak.GetBit and to exit with CC if even if 8 bits read - rol - dey - bne .1 - rts always CC -*-------------------------------------- -UnPak.GetBit ldx #$ff Self Modified code - bne .1 - jsr UnPak.NxtByte - - ldx #8 - -.1 dex - stx UnPak.GetBit+1 - - pha Don't trash A - lda (UnZPSrcPtr) - and UnPak.BitMask,x - cmp #1 if 0:CC, i>0 CS - - pla - rts Bit is in C -*-------------------------------------- -UnPak.GetByte lda (UnZPSrcPtr) -UnPak.NxtByte inc UnZPSrcPtr - bne .8 - inc UnZPSrcPtr+1 -.8 rts -*-------------------------------------- -UnPak.PutByte inc UnZPDstPtr - bne .8 - inc UnZPDstPtr+1 -.8 sta (UnZPDstPtr) - rts -*-------------------------------------- CS.END Pak.SrcPtr .BS 2 Pak.SrcCnt .BS 2 @@ -734,8 +624,6 @@ Pak.LastByte .BS 1 Pak.StoreCnt .BS 1 Pak.StoreBuf .BS STOREMAX -Pak.Mask .BS 1 -Pak.Byte .BS 1 Pak.Cnt .BS 2 @@ -747,6 +635,13 @@ Pak.BestBL .BS 2 Pak.WPtr .BS 2 Pak.WLimit .BS 2 Pak.WStrLen .BS 1 + +Pak.In.Byte .BS 1 +Pak.In.Mask .BS 1 + +Pak.Out.Byte .BS 1 +Pak.Out.Mask .BS 1 + *-------------------------------------- Pak.CntL .BS 256 Pak.CntH .BS 256