שתשת                                        ;-----------------------------------------------------------------------------
;S403 optimized data_decruncher v0.5
;(c) 1993 by Jouni 'Mr.Spiv' Korhonen (SWSW)
;-----------------------------------------------------------------------------
;call with registers: a0 = destination address
;                     a1 = crunched data
;returns : d0 = TRUE if crunched S403 data
;          d0 = FALSE if not S403 data
;-----------------------------------------------------------------------------


lflag:          MACRO
                subq    #1,d6
                bpl.s   \@l7
                move    -(a1),d7
                moveq   #15,d6
\@l7:           lsr     #1,d7
                ENDM

lbits:          MACRO
                move    d6,d0
                sub     d1,d6
                bpl.s   \@l9
                ror.l   d0,d7
                move    -(a1),d7
                rol.l   d0,d7
                add     d5,d6
\@l9:           move    d7,d0
                lsr.l   d1,d7
                add     d1,d1
                and     -4(a3,d1.w),d0
                ENDM


decrunch:       movem.l d3-d7/a2-a3,-(sp)
                cmp.l   #"S403",(a1)+
                beq.s   l0
                movem.l (sp)+,d3-d7/a2-a3
                moveq   #0,d0
                rts

l0:             addq    #4,a1
                move.l  a0,d4
                add.l   (a1)+,a0
                add.l   (a1)+,a1
                move    (a1),d6
                move    -(a1),d7
                moveq   #16,d5
                lea     l11(pc),a3

l1:             lflag
                bcs.s   l3

                moveq   #8,d1
                lbits
                move.b  d0,-(a0)
l2:             cmp.l   a0,d4
                blo.s   l1
lexit:          movem.l (sp)+,d3-d7/a2-a3
                moveq   #1,d0
                rts

l10:            dc.w    5,0,8,32,10,288,12,1312

l3:             moveq   #2,d1
                lbits
                add     d0,d0
                add     d0,d0
                movem   l10(pc,d0.w),d1/d3
                lbits
                add     d3,d0
                lea     1(a0,d0.w),a2

                lflag
                bcs.s   l5_2
                lflag
                bcs.s   l5_3
                lflag
                bcs.s   l5_4

                moveq   #0,d3
l4:             moveq   #3,d1
                lbits
                add     d0,d3
                subq    #7,d0
                beq.s   l4
l5:             move.b  -(a2),-(a0)
                dbf     d3,l5
l5_4:           move.b  -(a2),-(a0)
l5_3:           move.b  -(a2),-(a0)
l5_2:           move.b  -(a2),-(a0)
                move.b  -(a2),-(a0)
                cmp.l   a0,d4
                blo     l1
                movem.l (sp)+,d3-d7/a2-a3
                moveq   #1,d0
                rts

l11:            dc.w    $0003,$0007,$000f,$001f
                dc.w    $003f,$007f,$00ff,$01ff
                dc.w    $03ff,$07ff,$0fff
