;(C)1994 by John Hendrikx Opt O+ Move.l a6,-(sp) Move.l a0,a6 Move.l (a6),a0 Move.l 8(a6),a1 Moveq #0,d7 Move.w (a0)+,d7 Move.l d7,16(a6) Bsr.s Unsquash Moveq #0,d0 Move.l (sp)+,a6 Rts Unsquash ;a0 = Source% ;a1 = Dest% ;d7 = Length to decrunch Move.l a1,a6 Add.l d7,a6 Moveq #0,d0 BitOffset Moveq #0,d1 Algmode Moveq #0,d2 Algdelta Moveq #0,d3 Vorig Sub.w a2,a2 Vorigekeer Lea CodeTable(pc),a3 Move.b (a0)+,d3 Move.b d3,(a1)+ MainLoop Cmp.w #8,d1 AlgMode Bhs.s .Delta IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne Lzss Addq.l #1,d0 Moveq #0,d5 Moveq #8,d6 IFNE P68000 Bra ELoop ELSE Bra.s ELoop ENDC .Delta IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} If v=0 ENDC IFNE P68000 Bne .Other2 ELSE Bne.s .Other2 ENDC Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} If v=1 ENDC IFNE P68000 Beq Lzss ELSE Beq.s Lzss ENDC Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} If v=0 ENDC Bne.s .Else Moveq #2,d6 Bra.s .GetCode2 .Else Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Beq.s .Else2 IFNE P68000 Movem.l d0-d2,-(sp) Moveq #0,d6 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Moveq #2,d2 .Loop Add.w d6,d6 Btst d1,(a0,d0.l) Beq.s .Clr Addq.w #1,d6 .Clr Subq.w #1,d1 Bge.s .Ok Addq.l #1,d0 Moveq #7,d1 .Ok Dbra d2,.Loop Movem.l (sp)+,d0-d2 ELSE Bfextu (a0){d0:3},d6 d6: bit 2 always set (+4) ENDC Addq.l #3,d0 Bra.s .GetCode .Else2 Moveq #3,d6 .GetCode2 Addq.l #1,d0 .GetCode IFNE P68000 Move.w a2,d5 Lsl.w #3,d5 Lea -16(a3,d5.w),a4 ELSE Lea -16(a3,a2.w*8),a4 ENDC Move.b -1(a4,d6.w),d6 Mode Cmp.w #8,d6 Bne.s Extract2 .Skip Cmp.w #20,d2 AlgDelta Blo.s .Skip2 Moveq #1,d5 Bra.s Extract .Skip2 Moveq #0,d5 Bra.s ELoop .Other2 Addq.l #1,d0 Moveq #8,d6 Cmp.w d6,a2 VorigeKeer Beq.s .Skip Move.l a2,d6 Extract2 Moveq #4,d5 Extract ;d5 = len -1 ;d6 = mode Addq.w #8,d2 ELoop IFNE P68000 Movem.l d0-d1/d6,-(sp) Moveq #0,d4 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Subq.w #1,d6 Add.w d4,d4 Btst d1,(a0,d0.l) Beq.s .ClrZ Moveq #-1,d4 .ClrZ Subq.w #1,d1 Bge.s .OkZ Addq.l #1,d0 Moveq #7,d1 .OkZ Dbra d6,.LoopZ Bra.s .ExitZZ .LoopZ Add.w d4,d4 Btst d1,(a0,d0.l) Beq.s .ClrZZ Addq.w #1,d4 .ClrZZ Subq.w #1,d1 Bge.s .OkZZ Addq.l #1,d0 Moveq #7,d1 .OkZZ Dbra d6,.LoopZ .ExitZZ Movem.l (sp)+,d0-d1/d6 ELSE Bfexts (a0){d0:d6},d4 ENDC Add.l d6,d0 Sub.b d4,d3 V,Vorig Move.b d3,(a1)+ Dbra d5,ELoop Cmp.w #31,d1 Beq.s .Skip Addq.w #1,d1 .Skip Move.w d6,a2 EndLoop Move.w d2,d6 AlgDelta Lsr.w #3,d6 Sub.w d6,d2 AlgDelta Cmp.l a6,a1 Blt MainLoop Rts Lzss Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else1 Moveq #2,d4 IFNE P68000 Bra .End4 ELSE Bra.s .End4 ENDC .Else1 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else2 Moveq #4,d4 IFNE P68000 Bra .End4 ELSE Bra.s .End4 ENDC .Else2 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else3 Moveq #6,d4 IFNE P68000 Bra .End4 ELSE Bra.s .End4 ENDC .Else3 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else4 Addq.l #1,d0 IFNE P68000 Movem.l d0-d2,-(sp) Moveq #0,d6 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Moveq #2,d2 .LoopX Add.w d6,d6 Btst d1,(a0,d0.l) Beq.s .ClrX Addq.w #1,d6 .ClrX Subq.w #1,d1 Bge.s .OkX Addq.l #1,d0 Moveq #7,d1 .OkX Dbra d2,.LoopX Movem.l (sp)+,d0-d2 ELSE Bfextu (a0){d0:3},d6 ENDC Addq.l #3,d0 Addq.l #8,d6 Bra.s .End .Else4 Addq.l #1,d0 IFNE P68000 Movem.l d0-d2,-(sp) Moveq #0,d6 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Moveq #4,d2 .LoopY Add.w d6,d6 Btst d1,(a0,d0.l) Beq.s .ClrY Addq.w #1,d6 .ClrY Subq.w #1,d1 Bge.s .OkY Addq.l #1,d0 Moveq #7,d1 .OkY Dbra d2,.LoopY Movem.l (sp)+,d0-d2 ELSE Bfextu (a0){d0:5},d6 ENDC Addq.l #5,d0 Moveq #16,d4 Bra.s .End3 .End4 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Moveq #0,d6 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Beq.s .ClrB Moveq #1,d6 .ClrB Movem.l (sp)+,d0-d1 ELSE Bfextu (a0){d0:1},d6 ENDC Addq.l #1,d0 .End3 Add.w d4,d6 .End IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else5 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1,-(sp) Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Btst d1,(a0,d0.l) Movem.l (sp)+,d0-d1 ELSE Bftst (a0){d0:1} ENDC Bne.s .Else6 Moveq #8,d5 Sub.w a5,a5 Bra.s .End2 .Else6 Moveq #14,d5 Move.w #-4096-256,a5 Bra.s .End2 .Else5 Moveq #12,d5 Move.w #-256,a5 .End2 Addq.l #1,d0 IFNE P68000 Movem.l d0-d1/d5,-(sp) Moveq #0,d4 Move.l d0,d1 Lsr.l #3,d0 Neg.w d1 Subq.w #1,d1 And.w #7,d1 Subq.w #1,d5 .LoopC Add.w d4,d4 Btst d1,(a0,d0.l) Beq.s .Clr Addq.w #1,d4 .Clr Subq.w #1,d1 Bge.s .Ok Addq.l #1,d0 Moveq #7,d1 .Ok Dbra d5,.LoopC Movem.l (sp)+,d0-d1/d5 ELSE Bfextu (a0){d0:d5},d4 ENDC Add.l d5,d0 Subq.w #3,d6 Blo.s .Skip Beq.s .Skip2 Subq.w #1,d1 .Skip2 Subq.w #1,d1 Bge.s .Skip Moveq #0,d1 .Skip Addq.w #2,d6 l Lea -1(a1,a5.w),a4 Sub.w d4,a4 Lsr.w #1,d6 Bcc.s .InJump .Loop Move.b (a4)+,(a1)+ .InJump Move.b (a4)+,(a1)+ Dbra d6,.Loop Move.b -(a4),d3 Bra EndLoop CodeTable Dc.b 2,3,4,5,6,7,8,0 Dc.b 3,2,4,5,6,7,8,0 Dc.b 4,3,5,2,6,7,8,0 Dc.b 5,4,6,2,3,7,8,0 Dc.b 6,5,7,2,3,4,8,0 Dc.b 7,6,8,2,3,4,5,0 Dc.b 8,7,6,2,3,4,5,0