@cholok, post #150
@Don_Adan, post #148
******************************************************* ** XFD external decruncher ** ** for Atomik Cruncher 3.4 ** ** adapted by Wanted Team ** ******************************************************* INCDIR "SYS:Programs/ASM-One/Include/" INCLUDE "SYS:Programs/ASM-One/Include/Libraries/xfdmaster.i" ; xfdForeman structure MUST be first thing in all external decrunchers ForeMan moveq #-1,d0 ;security rts dc.l XFDF_ID ;id dc.w 1 ;version dc.w 0 dc.l 0,0 ;private dc.l S_ATM4 ;first slave ************************************************** ; xfdSlave structure: this one doesn't support data scanning S_ATM4 dc.l 0 ;no more slaves dc.w 2 ;version dc.w 39 ;master version dc.l N_ATM4 ;name dc.w XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET dc.w 0 dc.l RB_ATM4 ;recog buffer dc.l DB_ATM4 ;decrunch buffer dc.l 0 ;recog segment dc.l 0 ;decrunch segment dc.w 0,0 dc.l 12+2 dc.b "$VER: ATM4 v2.0 (23 Nov 2002) by Wanted Team",10 dc.b "Special greetings to MCoder.",0 N_ATM4 dc.b "Atomik (ATM4) Cruncher 3.4",0 even ;------------------------------------------------- ; Recog buffer function: receives buffer + length in a0/d0 RB_ATM4 moveq #0,D0 cmp.l #"ATM4",(A0)+ bne.b Exit tst.b (A0) bne.b Exit move.l (A0),xfdrr_MinTargetLen(A1) move.l (A0)+,xfdrr_FinalTargetLen(A1) tst.b (A0) bne.b Exit moveq #12,D1 add.l (A0),D1 move.l D1,xfdrr_MinSourceLen(A1) moveq #1,D0 Exit rts ;------------------------------------------------- ; Decrunch buffer function: receives bufferinfo in a0 ; This style requires xfdmaster.library V39 DB_ATM4 movem.l D2-D7/A2-A6,-(A7) move.l A0,A5 move.l xfdbi_SourceBuffer(A5),A0 move.l xfdbi_UserTargetBuf(A5),A1 bsr.b D_ATM4 moveq #1,D0 movem.l (A7)+,D2-D7/A2-A6 rts ;------------------------------------------------- ; Decruncher for Atomik 3.4 Cruncher data files D_ATM4 lbC0000E0 ; MOVE.L D0,-(SP) ; LEA 4(A0,D0.L),A5 addq.l #4,A0 move.l (A0)+,D0 lea (A1,D0.L),A5 MOVE.L (A0)+,D0 MOVEA.L A0,A6 ADDA.L D0,A6 LINK.W A2,#-$1A ; LEA 0(A5),A5 MOVE.B -(A6),D7 BRA.W lbC0001F4 lbC0000FA MOVE.W D3,D5 lbC0000FC ADD.B D7,D7 lbC0000FE DBCS D5,lbC0000FC BEQ.S lbC000120 BCC.S lbC00010C SUB.W D3,D5 NEG.W D5 BRA.S lbC000130 lbC00010C MOVEQ #3,D6 BSR.S lbC00016E BEQ.S lbC000114 BRA.S lbC00012E lbC000114 MOVEQ #7,D6 BSR.S lbC00016E BEQ.S lbC000126 ADDI.W #15,D5 BRA.S lbC00012E lbC000120 MOVE.B -(A6),D7 ADDX.B D7,D7 BRA.S lbC0000FE lbC000126 MOVEQ #13,D6 BSR.S lbC00016E ADDI.W #$10E,D5 lbC00012E ADD.W D3,D5 lbC000130 LEA lbW00025A(PC),A4 MOVE.W D5,D2 BNE.S lbC000184 ADD.B D7,D7 BNE.S lbC000140 MOVE.B -(A6),D7 ADDX.B D7,D7 lbC000140 BCS.S lbC000146 MOVEQ #1,D6 BRA.S lbC000186 lbC000146 MOVEQ #3,D6 BSR.S lbC00016E TST.B -$1A(A2) BEQ.S lbC000158 MOVE.B -$10(A2,D5.W),-(A5) BRA.W lbC0001EC lbC000158 MOVE.B (A5),D0 BTST #3,D5 BNE.S lbC000162 BRA.S lbC000166 lbC000162 ADDI.B #$F0,D5 lbC000166 SUB.B D5,D0 MOVE.B D0,-(A5) BRA.W lbC0001EC lbC00016E CLR.W D5 lbC000170 ADD.B D7,D7 BEQ.S lbC00017E lbC000174 ADDX.W D5,D5 DBRA D6,lbC000170 TST.W D5 RTS lbC00017E MOVE.B -(A6),D7 ADDX.B D7,D7 BRA.S lbC000174 lbC000184 MOVEQ #2,D6 lbC000186 BSR.S lbC00016E MOVE.W D5,D4 MOVE.B 14(A4,D4.W),D6 EXT.W D6 TST.B -$19(A2) BNE.S lbC00019A ADDQ.W #4,D6 BRA.S lbC0001C8 lbC00019A BSR.S lbC00016E MOVE.W D5,D1 LSL.W #4,D1 MOVEQ #2,D6 BSR.S lbC00016E CMP.B #7,D5 BLT.S lbC0001C0 MOVEQ #0,D6 BSR.S lbC00016E BEQ.S lbC0001BA MOVEQ #2,D6 BSR.S lbC00016E ADD.W D5,D5 OR.W D1,D5 BRA.S lbC0001CA lbC0001BA OR.B -$18(A2),D1 BRA.S lbC0001C4 lbC0001C0 OR.B -$17(A2,D5.W),D1 lbC0001C4 MOVE.W D1,D5 BRA.S lbC0001CA lbC0001C8 BSR.S lbC00016E lbC0001CA ADD.W D4,D4 BEQ.S lbC0001D2 ADD.W -2(A4,D4.W),D5 lbC0001D2 LEA 1(A5,D5.W),A4 MOVE.B -(A4),-(A5) lbC0001D8 MOVE.B -(A4),-(A5) DBRA D2,lbC0001D8 BRA.S lbC0001EC lbC0001E0 ADD.B D7,D7 BNE.S lbC0001E8 MOVE.B -(A6),D7 ADDX.B D7,D7 lbC0001E8 BCS.S lbC000250 MOVE.B -(A6),-(A5) lbC0001EC CMPA.L A5,A3 BNE.S lbC0001E0 CMPA.L A6,A0 BEQ.S lbC000254 lbC0001F4 MOVEQ #0,D6 BSR.W lbC00016E BEQ.S lbC00021C MOVE.B -(A6),D0 LEA -$18(A2),A1 MOVE.B D0,(A1)+ MOVEQ #1,D1 MOVEQ #6,D2 lbC000208 CMP.B D0,D1 BNE.S lbC00020E ADDQ.W #2,D1 lbC00020E MOVE.B D1,(A1)+ ADDQ.W #2,D1 DBRA D2,lbC000208 ST -$19(A2) BRA.S lbC000220 lbC00021C SF -$19(A2) lbC000220 MOVEQ #0,D6 BSR.W lbC00016E BEQ.S lbC00023A LEA -$10(A2),A1 MOVEQ #15,D0 lbC00022E MOVE.B -(A6),(A1)+ DBRA D0,lbC00022E ST -$1A(A2) BRA.S lbC00023E lbC00023A SF -$1A(A2) lbC00023E CLR.W D3 MOVE.B -(A6),D3 MOVE.B -(A6),-(SP) MOVE.B -(A6),-(SP) MOVE.W (SP)+,D0 MOVE.B (SP)+,D0 MOVEA.L A5,A3 SUBA.W D0,A3 BRA.S lbC0001E0 lbC000250 BRA.W lbC0000FA lbC000254 UNLK A2 ; MOVE.L (SP)+,D6 RTS lbW00025A dc.w $20 dc.w $60 dc.w $160 dc.w $360 dc.w $760 dc.w $F60 dc.w $1F60 dc.w 1 dc.w $304 dc.w $506 dc.w $708
; ------------------------------------------ ; PackFire 1.2k - (large depacker) ; ------------------------------------------ ; ------------------------------------------ ; Constants KTOPVALUE = 16777216 KBITMODELTOTAL = 2048 KNUMMOVEBITS = 5 KNUMPOSBITSMAX = 4 KLENNUMLOWBITS = 3 KLENNUMMIDBITS = 3 KLENNUMLOWSYMBOLS = 8 KLENNUMMIDSYMBOLS = 8 KLENNUMHIGHBITS = 8 LENCHOICE2 = 1 LENLOW = 2 LENMID = 130 LENHIGH = 258 KNUMLITSTATES = 7 KSTARTPOSMODELINDEX = 4 KENDPOSMODELINDEX = 14 KNUMPOSSLOTBITS = 6 KNUMLENTOPOSSTATES = 4 KNUMALIGNBITS = 4 KMATCHMINLEN = 2 ISREP = 192 ISREPG0 = 204 ISREPG1 = 216 ISREPG2 = 228 ISREP0LONG = 240 POSSLOT = 432 SPECPOS = 688 ALIGN = 802 LENCODER = 818 REPLENCODER = 1332 LITERAL = 1846 ; ------------------------------------------ ; packed data in a0 ; dest in a1 ; probs buffer in a2 (must be 15980 bytes) start: lea var(pc),a5 movem.l (a0)+,d0/d5 move.l d0,d2 lea (a2),a6 lea (a1),a3 clear_dest: sf.b (a3)+ subq.l #1,d0 bge.b clear_dest move.w #7990-1,d7 fill_probs: move.w #KBITMODELTOTAL>>1,(a2)+ dbf d7,fill_probs lea (a1),a4 moveq #0,d3 moveq #0,d4 moveq #0,d6 moveq #-1,d7 move.l d7,(a5)+ neg.l d7 move.l d7,(a5)+ move.l d7,(a5)+ move.l d7,(a5) lea -12(a5),a5 move.l d6,a2 depack_loop: move.l d2,-(a7) lea (a6),a1 move.l d4,d0 lsl.l #KNUMPOSBITSMAX,d0 bsr.w Check_Fix_Range2 bne.b fix_range1 lea (LITERAL*2)(a6),a3 moveq #1,d3 cmp.w #KNUMLITSTATES,d4 bmi.b max_lit_state_2 move.l a2,d0 sub.l d7,d0 moveq #0,d1 move.b (a4,d0.l),d1 max_lit_loop1: add.l d1,d1 move.l d1,d2 and.l #$100,d2 move.l d2,d0 add.w #$100,d0 add.w d0,d0 lea (a3,d0.l),a1 bsr.w Check_Code_Bound bne.b Check_Code_Bound_1 tst.l d2 bne.b max_lit_state_2 bra.b No_Check_Code_Bound_1 Check_Code_Bound_1: tst.l d2 beq.b max_lit_state_2 No_Check_Code_Bound_1: cmp.w #$100,d3 bmi.b max_lit_loop1 max_lit_state_2: cmp.w #$100,d3 bhs.b max_lit_state_exit bsr.w Check_Code_Bound2 bra.b max_lit_state_2 table_state: dc.b 0,0,0,0 dc.b 4-3,5-3,6-3,7-3,8-3,9-3 dc.b 10-6,11-6 max_lit_state_exit: move.b d3,d0 bsr.w store_prev_byte2 move.b table_state(pc,d4.w),d4 bra.w cont fix_range1: lea (ISREP*2)(a6),a1 bsr.w Check_Fix_Range3 bne.b Check_Fix_Range_2 move.l rep2-var(a5),rep3-var(a5) move.l rep1-var(a5),rep2-var(a5) move.l d7,rep1-var(a5) move.l d4,d0 moveq #0,d4 cmp.w #KNUMLITSTATES,d0 bmi.b change_state_3 moveq #3,d4 change_state_3: lea (LENCODER*2)(a6),a1 bra.b Check_Fix_Range_3 Check_Fix_Range_2: lea (ISREPG0*2)(a6),a1 bsr.w Check_Fix_Range3 bne.b Check_Fix_Range_4 lea (ISREP0LONG*2)(a6),a1 move.l d4,d0 lsl.l #KNUMPOSBITSMAX,d0 bsr.w Check_Fix_Range2 bne.b Check_Fix_Range_5 move.l d4,d0 moveq #9,d4 cmp.w #KNUMLITSTATES,d0 bmi.b change_state_4 moveq #11,d4 change_state_4: bsr.w store_prev_byte bra.w cont Check_Fix_Range_4: lea (ISREPG1*2)(a6),a1 bsr.w Check_Fix_Range3 bne.b Check_Fix_Range_6b move.l rep1-var(a5),d1 bra.b Check_Fix_Range_7 Check_Fix_Range_6b: lea (ISREPG2*2)(a6),a1 bsr.w Check_Fix_Range3 bne.b Check_Fix_Range_8 move.l rep2-var(a5),d1 bra.b Check_Fix_Range_9 Check_Fix_Range_8: move.l rep3-var(a5),d1 move.l rep2-var(a5),rep3-var(a5) Check_Fix_Range_9: move.l rep1-var(a5),rep2-var(a5) Check_Fix_Range_7: move.l d7,rep1-var(a5) move.l d1,d7 Check_Fix_Range_5: move.l d4,d0 moveq #8,d4 cmp.w #KNUMLITSTATES,d0 bmi.b change_state_5 moveq #11,d4 change_state_5: lea (REPLENCODER*2)(a6),a1 Check_Fix_Range_3: lea (a1),a3 bsr.w Check_Fix_Range bne.b Check_Fix_Range_10 lea (LENLOW*2)+(KLENNUMLOWBITS*2)(a3),a3 moveq #0,d3 moveq #KLENNUMLOWBITS,d1 bra.b Check_Fix_Range_11 Check_Fix_Range_10: lea (LENCHOICE2*2)(a3),a1 bsr.w Check_Fix_Range bne.b Check_Fix_Range_12 lea (LENMID*2)+(KLENNUMMIDBITS*2)(a3),a3 moveq #KLENNUMLOWSYMBOLS,d3 moveq #KLENNUMMIDBITS,d1 bra.b Check_Fix_Range_11 Check_Fix_Range_12: lea (LENHIGH*2)(a3),a3 moveq #KLENNUMLOWSYMBOLS+KLENNUMMIDSYMBOLS,d3 moveq #KLENNUMHIGHBITS,d1 Check_Fix_Range_11: move.l d1,d2 moveq #1,d6 Check_Code_Bound_Loop: exg.l d6,d3 bsr.w Check_Code_Bound2 exg.l d6,d3 subq.l #1,d2 bne.b Check_Code_Bound_Loop moveq #1,d0 lsl.l d1,d0 sub.l d0,d6 add.l d3,d6 cmp.w #4,d4 bhs.w change_state_6 addq.w #KNUMLITSTATES,d4 move.l d6,d0 cmp.w #KNUMLENTOPOSSTATES,d0 bmi.b check_len moveq #KNUMLENTOPOSSTATES-1,d0 check_len: lea (POSSLOT*2)(a6),a3 lsl.l #KNUMPOSSLOTBITS+1,d0 add.l d0,a3 moveq #KNUMPOSSLOTBITS,d2 moveq #1,d3 Check_Code_Bound_Loop2: bsr.w Check_Code_Bound2 subq.l #1,d2 bne.b Check_Code_Bound_Loop2 sub.w #(1<<KNUMPOSSLOTBITS),d3 cmp.w #KSTARTPOSMODELINDEX,d3 bmi.b Check_PosSlot_1 move.l d3,d1 lsr.l #1,d1 subq.l #1,d1 move.l d3,d0 moveq #1,d7 and.l d7,d0 addq.l #2,d0 move.l d0,d7 cmp.w #KENDPOSMODELINDEX,d3 bhs.b Check_PosSlot_3 lsl.l d1,d0 move.l d0,d7 lea (SPECPOS*2)(a6),a3 sub.l d3,d0 subq.l #1,d0 add.l d0,d0 add.l d0,a3 bra.b Check_PosSlot_4 Check_PosSlot_3: subq.l #KNUMALIGNBITS,d1 Shift_Range_Loop: move.l (a5),d0 lsr.l #1,d0 add.l d7,d7 move.l d0,(a5) cmp.l d5,d0 bhi.b Check_Code sub.l d0,d5 addq.l #1,d7 Check_Code: bsr.b Get_Code subq.l #1,d1 bne.b Shift_Range_Loop lea (ALIGN*2)(a6),a3 lsl.l #KNUMALIGNBITS,d7 moveq #KNUMALIGNBITS,d1 Check_PosSlot_4: moveq #1,d2 moveq #1,d3 Check_Code_Bound_Loop3: bsr.b Check_Code_Bound2 beq.b Check_Code_Bound_2 or.l d2,d7 Check_Code_Bound_2: add.l d2,d2 subq.l #1,d1 bne.b Check_Code_Bound_Loop3 bra.b Check_PosSlot_2 Check_PosSlot_1: move.l d3,d7 Check_PosSlot_2: addq.l #1,d7 change_state_6: addq.l #KMATCHMINLEN,d6 Copy_Rem_Bytes: bsr.b store_prev_byte subq.l #1,d6 bne.b Copy_Rem_Bytes cont: move.l (a7)+,d2 cmp.l d2,a2 bmi.w depack_loop rts store_prev_byte: move.l a2,d0 sub.l d7,d0 move.b (a4,d0.l),d0 store_prev_byte2: move.b d0,(a4,a2.l) addq.l #1,a2 rts Check_Fix_Range3: move.l d4,d0 Check_Fix_Range2: add.l d0,d0 add.l d0,a1 Check_Fix_Range: move.l (a5),d0 lsr.l #8,d0 lsr.l #3,d0 move.l d1,-(a7) move.l d0,d1 swap d1 mulu.w (a1),d0 mulu.w (a1),d1 swap d1 add.l d1,d0 move.l (a7)+,d1 cmp.l d5,d0 bls.b Range_Lower move.l d0,(a5) move.w #KBITMODELTOTAL,d0 sub.w (a1),d0 lsr.w #KNUMMOVEBITS,d0 add.w d0,(a1) Get_Code: move.l (a5),d0 cmp.l #KTOPVALUE,d0 bhs.b top_range lsl.l #8,d0 move.l d0,(a5) lsl.l #8,d5 move.b (a0)+,d5 top_range: moveq #0,d0 rts Check_Code_Bound2: lea (a3),a1 Check_Code_Bound: add.l d3,d3 lea (a1,d3.l),a1 bsr.b Check_Fix_Range beq.b Lower_Bound addq.l #1,d3 Lower_Bound: rts Range_Lower: sub.l d0,(a5) sub.l d0,d5 move.w (a1),d0 lsr.w #KNUMMOVEBITS,d0 sub.w d0,(a1) bsr.b Get_Code moveq #1,d0 rts var: range: dc.l -1 rep3: dc.l 1 rep2: dc.l 1 rep1: dc.l 1
; ------------------------------------------ ; PackFire 1.2k - (tiny depacker) ; ------------------------------------------ ; ------------------------------------------ ; packed data in a0 ; dest in a1 start: lea 26(a0),a2 move.b (a2)+,d7 lit_copy: move.b (a2)+,(a1)+ main_loop: bsr.b get_bit bcs.b lit_copy moveq #-1,d3 get_index: addq.l #1,d3 bsr.b get_bit bcc.b get_index cmp.w #$10,d3 beq.b depack_stop bsr.b get_pair move.w d3,d6 ; save it for the copy cmp.w #2,d3 ble.b out_of_range moveq #0,d3 out_of_range: moveq #0,d0 move.b table_len(pc,d3.w),d1 move.b table_dist(pc,d3.w),d0 bsr.b get_bits bsr.b get_pair move.l a1,a3 sub.l d3,a3 copy_bytes: move.b (a3)+,(a1)+ subq.w #1,d6 bne.b copy_bytes bra.b main_loop table_len: dc.b $04,$02,$04 table_dist: dc.b $10,$30,$20 get_pair: sub.l a6,a6 moveq #$f,d2 calc_len_dist: move.w a6,d0 and.w d2,d0 bne.b node moveq #1,d5 node: move.w a6,d4 lsr.w #1,d4 move.b (a0,d4.w),d1 moveq #1,d4 and.w d4,d0 beq.b nibble lsr.b #4,d1 nibble: move.w d5,d0 and.w d2,d1 lsl.l d1,d4 add.l d4,d5 addq.w #1,a6 dbf d3,calc_len_dist get_bits: moveq #0,d3 getting_bits: subq.b #1,d1 bhs.b cont_get_bit add.w d0,d3 depack_stop: rts cont_get_bit: bsr.b get_bit addx.l d3,d3 bra.b getting_bits get_bit: add.b d7,d7 bne.b byte_done move.b (a2)+,d7 addx.b d7,d7 byte_done: rts
@Don_Adan, post #151
Poczytaj sobie, PackFire LZMA (w wersji packer) vs lha (archiwizer). 2.37MB vs 8.25MB.
LZX jest slabszy niz ARJ mode 7.
Takich testow nie robi sie tylko na 1 pliku, ale na calej grupie plikow
41˙015˙429 org 17˙244˙589 packfire 20˙062˙422 lzx (-9) 20˙408˙259 arj (m7) 20˙875˙955 lha (lh7) 20˙940˙447 zip (-9) 21˙720˙812 lha (lh5)
@tukinem, post #152
******************************************************* ** XFD external decruncher ** ** for PackFire (LZMA MODE) ** ** adapted by Wanted Team ** ******************************************************* INCDIR "SYS:Programs/ASM-One/Include/" INCLUDE "Libraries/xfdmaster.i" ; xfdForeman structure MUST be first thing in all external decrunchers ForeMan moveq #-1,d0 ;security rts dc.l XFDF_ID ;id dc.w 1 ;version dc.w 0 dc.l 0,0 ;private dc.l S_TUKI ;first slave ************************************************** ; xfdSlave structure: this one doesn't support data scanning S_TUKI dc.l 0 ;no more slaves dc.w 2 ;version dc.w 39 ;master version dc.l N_TUKI ;name dc.w XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET dc.w 0 dc.l RB_TUKI ;recog buffer dc.l DB_TUKI ;decrunch buffer dc.l 0 ;recog segment dc.l 0 ;decrunch segment dc.w 0,0 dc.l 12+2 dc.b "$VER: TUKI v2.0 (8 Jan 2025) by Wanted Team",0 N_TUKI dc.b "PackFire 1.2k (LZMA mode)",0 even ;------------------------------------------------- ; Recog buffer function: receives buffer + length in a0/d0 RB_TUKI moveq #0,D0 cmp.l #"TUKI",(A0)+ bne.b Exit tst.b (A0) bne.b Exit moveq #8,D1 add.l (A0)+,D1 move.l D1,xfdrr_MinSourceLen(A1) tst.b (A0) bne.b Exit move.l (A0),D1 move.l D1,xfdrr_FinalTargetLen(A1) add.l #15980,D1 move.l D1,xfdrr_MinTargetLen(A1) moveq #1,D0 Exit rts ;------------------------------------------------- ; Decrunch buffer function: receives bufferinfo in a0 ; This style requires xfdmaster.library V39 DB_TUKI movem.l D2-D7/A2-A6,-(A7) move.l A0,A5 move.l xfdbi_SourceBuffer(A5),A0 move.l xfdbi_UserTargetBuf(A5),A1 bsr.b D_TUKI moveq #1,D0 movem.l (A7)+,D2-D7/A2-A6 rts ;------------------------------------------------- ; Decruncher for TUKI data files D_TUKI addq.l #8,A0 ; skip added header bytes move.l (A0),D0 ; depacked size addq.l #1,D0 bclr #0,D0 ; even length lea (A1,D0.L), A2 ; probs buffer ; place for ; ------------------------------------------ ; PackFire 1.2k - (large depacker) ; ------------------------------------------
@cholok, post #153
@Don_Adan, post #156
@tukinem, post #159
@tukinem, post #159
@Don_Adan, post #161
@Don_Adan, post #163
@tukinem, post #164
@Don_Adan, post #165
Cos do BB2 i xfdmaster.library jest na Aminecie
@Don_Adan, post #167
@tukinem, post #168
@tukinem, post #168
@cholok, post #171
41˙015˙429 org 17˙244˙589 packfire 20˙062˙422 lzx (-9) 20˙408˙259 arj (m7) 20˙875˙955 lha (lh7) 20˙940˙447 zip (-9) 21˙045˙560 zx0 (salvador) 21˙720˙812 lha (lh5)
@cholok, post #173
@cholok, post #172
W LZX użyłeś parametru -9 (max compression)?
lzx -r -e -9 a ...
lzx -r -e-9 a ...