;ATOMIK DECRUNCH SOURCE CODE v3.5 (non optimise, pas le temps. sorry...) ;ce depacker est indissociable du programme ATOMIK V3.5 tous les mecs ;qui garderons se source dans l'espoir de prendre de l'importance ;en se disant moi je l'ai et pas l'autre sont des lamers. ;MODE=1 depack data from a0 to a0 ;MODE=0 depack data from a0 to a1 (RESTORE SPACE a 1 inutile! si MODE=0) ;PIC_ALGO = 0 decrunch file not encoded with special picture algorythm. ;PIC_ALGO = 1 decrunch all files with or without picture algorythm. ;DEC_SPACE = (lesser decrunch space is gived after packing by atomik v3.5) ;RESTORE_SPACE = 1 the allocated decrunch space will be restored . ;RESTORE_SPACE = 0 the allocated decrunch space will not be restored. ;call it by BSR DEPACK or JSR DEPACK but call it! MODE: EQU 0 PIC_ALGO: EQU 0 DEC_SPACE: EQU $80 ;MAX IS $7FFE (no odd value!) RESTORE_SPACE: EQU 0 depack: movem.l d0-a6,-(a7) cmp.l #"ATM5",(a0)+ bne not_packed link a2,#-28 move.l (a0)+,d0 ifne MODE lea 4(a0,d0.l),a5 move.l d0,-(a7) elseif move.l a1,a5 add.l d0,a5 endc move.l a5,a4 ifne MODE ifne DEC_SPACE lea DEC_SPACE(a4),a5 endc endc lea -$c(a4),a4 move.l (a0)+,d0 move.l a0,a6 add.l d0,a6 ifne PIC_ALGO moveq #0,d0 move.b -(a6),d0 move d0,-2(a2) ifne RESTORE_SPACE lsl #2,d0 sub d0,a4 endc elseif ifne RESTORE_SPACE clr -2(a2) endc subq #1,a6 endc ifne RESTORE_SPACE lea buff_marg(pc),a3 move -2(a2),d0 lsl #2,d0 add #DEC_SPACE+$C,d0 bra.s .save .save_m: move.b (a4)+,(a3)+ subq #1,d0 .save: bne.s .save_m movem.l a3-a4,-(a7) endc ifne PIC_ALGO pea (a5) endc move.b -(a6),d7 bra take_type decrunch: move d3,d5 take_lenght: add.b d7,d7 .cont_take: dbcs d5,take_lenght beq.s .empty1 bcc.s .next_cod sub d3,d5 neg d5 bra.s .do_copy1 .next_cod: moveq #3,d6 bsr.s get_bit2 beq.s .next_cod1 bra.s .do_copy .next_cod1: moveq #7,d6 bsr.s get_bit2 beq.s .next_cod2 add #15,d5 bra.s .do_copy .empty1: move.b -(a6),d7 addx.b d7,d7 bra.s .cont_take .next_cod2: moveq #13,d6 bsr.s get_bit2 add #255+15,d5 .do_copy: add d3,d5 .do_copy1: lea decrun_table(pc),a4 move d5,d2 bne.s bigger add.b d7,d7 bne.s .not_empty move.b -(a6),d7 addx.b d7,d7 .not_empty: bcs.s .ho_kesako moveq #1,d6 bra.s word .ho_kesako: moveq #3,d6 bsr.s get_bit2 tst.b -28(a2) beq.s .ho_kesako1 move.b 10-28(a2,d5.w),-(a5) bra tst_end .ho_kesako1: move.b (a5),d0 btst #3,d5 bne.s .ho_kesako2 bra.s .ho_kesako3 .ho_kesako2: add.b #$f0,d5 .ho_kesako3: sub.b d5,d0 move.b d0,-(a5) bra tst_end get_bit2: clr d5 .get_bits: add.b d7,d7 beq.s .empty .cont: addx d5,d5 dbf d6,.get_bits tst d5 rts .empty: move.b -(a6),d7 addx.b d7,d7 bra.s .cont bigger: moveq #2,d6 word: bsr.s get_bit2 contus: move d5,d4 move.b 14(a4,d4.w),d6 ext d6 tst.b 1-28(a2) bne.s .spe_ofcod1 addq #4,d6 bra.s .nospe_ofcod1 .spe_ofcod1: bsr.s get_bit2 move d5,d1 lsl #4,d1 moveq #2,d6 bsr.s get_bit2 cmp.b #7,d5 blt.s .take_orof moveq #0,d6 bsr.s get_bit2 beq.s .its_little moveq #2,d6 bsr.s get_bit2 add d5,d5 or d1,d5 bra.s .spe_ofcod2 .its_little: or.b 2-28(a2),d1 bra.s .spe_ofcod3 .take_orof: or.b 3-28(a2,d5.w),d1 .spe_ofcod3: move d1,d5 bra.s .spe_ofcod2 .nospe_ofcod1: bsr.s get_bit2 .spe_ofcod2: add d4,d4 beq.s .first add -2(a4,d4.w),d5 .first: lea 1(a5,d5.w),a4 move.b -(a4),-(a5) .copy_same: move.b -(a4),-(a5) dbf d2,.copy_same bra.s tst_end make_jnk: add.b d7,d7 bne.s .not_empty move.b -(a6),d7 addx.b d7,d7 .not_empty: bcs.s string move.b -(a6),-(a5) tst_end: cmp.l a5,a3 bne.s make_jnk cmp.l a6,a0 beq.s work_done take_type: moveq #0,d6 bsr get_bit2 beq.s .nospe_ofcod move.b -(a6),d0 lea 2-28(a2),a1 move.b d0,(a1)+ moveq #1,d1 moveq #6,d2 .next: cmp.b d0,d1 bne.s .no_off_4b addq #2,d1 .no_off_4b: move.b d1,(a1)+ addq #2,d1 dbf d2,.next st 1-28(a2) bra.s .spe_ofcod .nospe_ofcod: sf 1-28(a2) .spe_ofcod: moveq #0,d6 bsr get_bit2 beq.s .relatif lea 10-28(a2),a1 moveq #15,d0 .next_f: move.b -(a6),(a1)+ dbf d0,.next_f st -28(a2) bra.s .freq .relatif: sf -28(a2) .freq: clr d3 move.b -(a6),d3 move.b -(a6),d0 lsl #8,d0 move.b -(a6),d0 move.l a5,a3 sub d0,a3 bra.s make_jnk string: bra decrunch work_done: ifne PIC_ALGO move.l (a7)+,a0 pea (a2) bsr.s decod_picture move.l (a7)+,a2 endc ifne RESTORE_SPACE movem.l (a7)+,a3-a4 endc ifne MODE move.l (a7)+,d0 bsr copy_decrun endc ifne RESTORE_SPACE move -2(a2),d0 lsl #2,d0 add #DEC_SPACE+$C,d0 bra.s .restore .restore_m: move.b -(a3),-(a4) subq #1,d0 .restore: bne.s .restore_m endc unlk a2 not_packed: movem.l (a7)+,d0-a6 rts decrun_table: dc.w 32,32+64,32+64+256,32+64+256+512,32+64+256+512+1024 dc.w 32+64+256+512+1024+2048,32+64+256+512+1024+2048+4096 dc.b 0,1,3,4,5,6,7,8 ifne PIC_ALGO decod_picture: move -2(a2),d7 .next_picture: dbf d7,.decod_algo rts .decod_algo: move.l -(a0),d0 lea 0(a5,d0.l),a1 .no_odd: lea $7d00(a1),a2 .next_planes: moveq #3,d6 .next_word: move (a1)+,d0 moveq #3,d5 .next_bits: add d0,d0 addx d1,d1 add d0,d0 addx d2,d2 add d0,d0 addx d3,d3 add d0,d0 addx d4,d4 dbf d5,.next_bits dbf d6,.next_word movem d1-d4,-8(a1) cmp.l a1,a2 bne.s .next_planes bra.s .next_picture endc ifne MODE copy_decrun: lsr.l #4,d0 lea -12(a6),a6 .copy_decrun: rept 4 move.l (a5)+,(a6)+ endr dbf d0,.copy_decrun rts endc ifne RESTORE_SPACE buff_marg: dcb.b $90+DEC_SPACE+$C endc * END OF DECRUNCH SOURCE.