; ********************************************************** ; * * ; * TurtleDecruncher V2.0 by Him & Mr.Crook Of VOX DEI. * ; * * ; * Put the crunched data on the label 'cruncheddata' * ; * Remember to have allocated enough memory at the label * ; * 'decruncheddata' or the decruncher will perhaps over- * ; * write some important memorylocations. * ; * * ; * It is possible to optimize the routine further but you * ; * have to do it yourself, we are to lazy. * ; * * ; * This decruncher uses all register (D0-D7/A0-A6) * ; ********************************************************** section TurtleDecruncher,code movem.l d0-d7/a0-a6,-(SP) lea algobuffer,a0 move.l a2,a0 lea 32(a2),a2 move.l a2,$10(a0) move.l #4500,$14(a0) move.l #decruncheddata,8(a0) lea cruncheddata,a1 addq.l #8,a1 move.l a1,(a0) bsr.b startdecrunch movem.l (SP)+,d0-d7/a0-a6 rts ;**************************************************** startdecrunch pea (a0) bsr.b decrunchit move.l a1,d0 movea.l (sp)+,a0 sub.l 8(a0),d0 move.l d0,12(a0) rts ;************************************************************** ; DECRUNCH THE BUFFER ;************************************************************** decrunchit pea (a0) movea.l $10(a0),a6 movea.l a6,a0 lea $c60(a6),a1 lea $76e(a6),a2 moveq #-2,d0 moveq #0,d3 moveq #1,d1 moveq #2,d2 move.w #$13c,d7 preploop1 move.w d1,(a0)+ move.w d0,(a1)+ move.w d3,-(a2) sub.w d2,d0 add.w d2,d3 dbra d7,preploop1 moveq #0,d6 move.l #$27a,d7 movea.l a6,a0 lea $27a(a6),a1 lea $eda(a6),a2 lea $76e(a6),a3 moveq #4,d4 moveq #2,d2 move.w #$13b,d1 preploop2 move.w (a0)+,d0 add.w (a0)+,d0 move.w d0,(a1)+ move.w d6,(a2)+ move.w d7,(a3)+ move.w d7,(a3)+ add.w d4,d6 add.w d2,d7 dbra d1,preploop2 move.w d1,(a1) clr.w $c5e(a6) movea.l (sp)+,a5 movea.l (a5),a0 movea.l 8(a5),a1 movea.l $10(a5),a6 movea.l a6,a5 lea $76e(a6),a4 lea $c60(a6),a3 moveq #1,d4 moveq #15,d5 move.w (a0)+,d6 bra.s beginprep nomoveloop neg.w d7 lsr.w d4,d7 sub.w d4,d7 move.b d7,(a1)+ beginprep move.w $4f0(a3),d7 loop1 add.w d6,d6 bcc.b skip1 move.w 2(a3,d7.w),d7 dbmi d5,loop1 bmi.b onminus2 doagain moveq #15,d5 move.w (a0)+,d6 bra.s loop1 skip1 move.w 0(a3,d7.w),d7 dbmi d5,loop1 bpl.s doagain onminus2 dbra d5,loop3 move.w (a0)+,d6 moveq #15,d5 loop3 cmpi.w #$8000,$4f0(a5) beq.b checkloop move.w 0(a4,d7.w),d0 movestuff lea 0(a5,d0.w),a2 move.w (a2),d1 add.w d4,d1 move.w d1,(a2)+ cmp.w (a2)+,d1 bls.s gomove onhigh cmp.w (a2)+,d1 bhi.s onhigh subq.l #4,a2 move.l a2,d2 sub.l a5,d2 move.w (a2),0(a5,d0.w) move.w d1,(a2) move.w 0(a3,d0.w),d1 bmi.s negative move.w d2,2(a4,d1.w) negative move.w d2,0(a4,d1.w) move.w 0(a3,d2.w),d3 bmi.s negative2 move.w d0,2(a4,d3.w) negative2 move.w d1,0(a3,d2.w) move.w d0,0(a4,d3.w) move.w d3,0(a3,d0.w) move.w 0(a4,d2.w),d0 bne.s movestuff bra.s checkloop gomove move.w 0(a4,d0.w),d0 bne.s movestuff checkloop cmpi.w #$fe00,d7 bge.w nomoveloop cmpi.w #$fd86,d7 bgt.s notfinish rts notfinish rol.w #8,d6 subq.w #7,d5 bcc.s skipswap moveq #0,d3 move.w (a0)+,d3 swap d3 neg.w d5 rol.l d5,d3 move.w d3,d1 or.b d6,d1 swap d3 move.w d3,d6 neg.w d5 moveq #15,d2 add.w d2,d5 bra.s wordalign skipswap moveq #0,d1 move.b d6,d1 clr.b d6 dbra d5,wordalign move.w (a0)+,d6 moveq #15,d5 wordalign move.w d1,d3 add.w d3,d3 move.w crunchtable(pc,d3.w),d3 clr.w d2 move.b d3,d2 clr.b d3 lsr.w #2,d3 loop4 add.w d6,d6 addx.w d1,d1 dbra d5,skip2 moveq #15,d5 move.w (a0)+,d6 skip2 dbra d2,loop4 andi.w #$3f,d1 or.w d3,d1 lea (a1),a2 suba.w d1,a2 neg.w d7 sub.w #513,d7 lsr.w #1,d7 btst #1,d7 beq.b blue move.w #$0500,$dff180 bra.b red blue move.w #$0005,$dff180 red movel move.b (a2)+,(a1)+ dbra d7,movel bra.w beginprep crunchtable DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DC.B $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DC.B $02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01 DC.B $02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01 DC.B $03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01 DC.B $03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01,$03,$01 DC.B $04,$02,$04,$02,$04,$02,$04,$02,$04,$02,$04,$02,$04,$02,$04,$02 DC.B $05,$02,$05,$02,$05,$02,$05,$02,$05,$02,$05,$02,$05,$02,$05,$02 DC.B $06,$02,$06,$02,$06,$02,$06,$02,$06,$02,$06,$02,$06,$02,$06,$02 DC.B $07,$02,$07,$02,$07,$02,$07,$02,$07,$02,$07,$02,$07,$02,$07,$02 DC.B $08,$02,$08,$02,$08,$02,$08,$02,$08,$02,$08,$02,$08,$02,$08,$02 DC.B $09,$02,$09,$02,$09,$02,$09,$02,$09,$02,$09,$02,$09,$02,$09,$02 DC.B $0A,$02,$0A,$02,$0A,$02,$0A,$02,$0A,$02,$0A,$02,$0A,$02,$0A,$02 DC.B $0B,$02,$0B,$02,$0B,$02,$0B,$02,$0B,$02,$0B,$02,$0B,$02,$0B,$02 DC.B $0C,$03,$0C,$03,$0C,$03,$0C,$03,$0D,$03,$0D,$03,$0D,$03,$0D,$03 DC.B $0E,$03,$0E,$03,$0E,$03,$0E,$03,$0F,$03,$0F,$03,$0F,$03,$0F,$03 DC.B $10,$03,$10,$03,$10,$03,$10,$03,$11,$03,$11,$03,$11,$03,$11,$03 DC.B $12,$03,$12,$03,$12,$03,$12,$03,$13,$03,$13,$03,$13,$03,$13,$03 DC.B $14,$03,$14,$03,$14,$03,$14,$03,$15,$03,$15,$03,$15,$03,$15,$03 DC.B $16,$03,$16,$03,$16,$03,$16,$03,$17,$03,$17,$03,$17,$03,$17,$03 DC.B $18,$04,$18,$04,$19,$04,$19,$04,$1A,$04,$1A,$04,$1B,$04,$1B,$04 DC.B $1C,$04,$1C,$04,$1D,$04,$1D,$04,$1E,$04,$1E,$04,$1F,$04,$1F,$04 DC.B $20,$04,$20,$04,$21,$04,$21,$04,$22,$04,$22,$04,$23,$04,$23,$04 DC.B $24,$04,$24,$04,$25,$04,$25,$04,$26,$04,$26,$04,$27,$04,$27,$04 DC.B $28,$04,$28,$04,$29,$04,$29,$04,$2A,$04,$2A,$04,$2B,$04,$2B,$04 DC.B $2C,$04,$2C,$04,$2D,$04,$2D,$04,$2E,$04,$2E,$04,$2F,$04,$2F,$04 DC.B $30,$05,$31,$05,$32,$05,$33,$05,$34,$05,$35,$05,$36,$05,$37,$05 DC.B $38,$05,$39,$05,$3A,$05,$3B,$05,$3C,$05,$3D,$05,$3E,$05,$3F,$05 algobuffer dcb.b 4532,0 ;------------------------------------------------------------- cruncheddata dc.b 0 ;put the crunched data here decruncheddata dc.b 0 ;the decrunched data will be here end