;
; PowerPacker Decrunch assembler subroutine V1.1
;
; call as:
;    DecrunchBuffer (endcrun, buffer, efficiency);
; with:
;    endcrun   : UBYTE * just after last byte of crunched file
;    buffer    : UBYTE * to memory block to decrunch in
;    efficiency: Longword defining efficiency with wich file was crunched
;
; NOTE:
;    Decrunch a few bytes higher (safety margin) than the crunched file
;    to decrunch in the same memory space. (64 bytes suffice)
;

        XDEF _pp_DecrunchBuffer

_pp_DecrunchBuffer:
        movem.l d1-d7/a2-a6,-(a7)
        bsr.s Decrunch
        movem.l (a7)+,d1-d7/a2-a6
        rts
Decrunch:
        lea myBitsTable(PC),a5
        move.l d0,(a5)
        move.l a1,a2
        move.l -(a0),d5
        moveq #0,d1
        move.b d5,d1
        lsr.l #8,d5
        add.l d5,a1
        move.l -(a0),d5
        lsr.l d1,d5
        move.b #32,d7
        sub.b d1,d7
LoopCheckCrunch:
        bsr.s ReadBit
        tst.b d1
        bne.s CrunchedBytes
NormalBytes:
        moveq #0,d2
Read2BitsRow:
        moveq #2,d0
        bsr.s ReadD1
        add.w d1,d2
        cmp.w #3,d1
        beq.s Read2BitsRow
ReadNormalByte:
        move.w #8,d0
        bsr.s ReadD1
        move.b d1,-(a1)
        dbf d2,ReadNormalByte
        cmp.l a1,a2
        bcs.s CrunchedBytes
        rts
CrunchedBytes:
        moveq #2,d0
        bsr.s ReadD1
        moveq #0,d0
        move.b 0(a5,d1.w),d0
        move.l d0,d4
        move.w d1,d2
        addq.w #1,d2
        cmp.w #4,d2
        bne.s ReadOffset
        bsr.s ReadBit
        move.l d4,d0
        tst.b d1
        bne.s LongBlockOffset
        moveq #7,d0
LongBlockOffset:
        bsr.s ReadD1
        move.w d1,d3
Read3BitsRow:
        moveq #3,d0
        bsr.s ReadD1
        add.w d1,d2
        cmp.w #7,d1
        beq.s Read3BitsRow
        bra.s DecrunchBlock
ReadOffset:
        bsr.s ReadD1
        move.w d1,d3
DecrunchBlock:
        move.b 0(a1,d3.w),d0
        move.b d0,-(a1)
        dbf d2,DecrunchBlock
EndOfLoop:
        cmp.l a1,a2
        bcs.s LoopCheckCrunch
        rts
ReadBit:
        moveq #1,d0
ReadD1:
        moveq #0,d1
        subq.w #1,d0
ReadBits:
        lsr.l #1,d5
        roxl.l #1,d1
        subq.b #1,d7
        bne.s No32Read
        move.b #32,d7
        move.l -(a0),d5
No32Read:
        dbf d0,ReadBits
        rts
myBitsTable:
        dc.b $09,$0a,$0b,$0b


        end;





