[#151] Re: Dewelopment gry Sołtys

@cholok, post #150

Albo slaby plik wybrales, albo cos nie tak zrobiles:

link

Poczytaj sobie, PackFire LZMA (w wersji packer) vs lha (archiwizer). 2.37MB vs 8.25MB.

LZX jest slabszy niz ARJ mode 7.
Zarowno jesli chodzi o packed ratio jak i depacking speed.
Sam to sprawdzalem.
I tutaj to ma byc depacker do wersji instalacyjnej gry na A1200 z fastem.
Wiec szybkosc depakowania nie ma znaczenia.
Takich testow nie robi sie tylko na 1 pliku, ale na calej grupie plikow (najgorzej sie zawsze pakuja sample i mody), dopiero wtedy wyniki sa w miare obiektywne.
Jak ja bym mial robic gre na malej ilosci dyskietek to:

- PackFire (LZMA) dla wersji instalacyjnej gry
- ARJ mode 7 dla gry dzialajacej z dyskietek

Ewentualnie ZX0 bym jeszcze rozwazyl zamiast ARJ7, ale musialbym porownac wyniki najpierw.
[#152] Re: Dewelopment gry Sołtys

@Don_Adan, post #148

Zmieniłem sobie ten kod, tylko zastanawiam się, czy packedSize to ma być rozmiar pliku spakowanego przed dodaniem tych 8 bajtów, czy po dodaniu?

Od razu podrzucę te listingi kodów i idę spać :)

ATM4.asm po zmianach dla zgodności z 68000
*******************************************************
**             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


depacker_large.asm:
; ------------------------------------------
; 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


depacker_tiny.asm
; ------------------------------------------
; 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


Tak się zastanawiam, czy w kodach depakerów z LZMA można zmienić mnemoniki BHS na BCC. Mają chyba te same działania według tego źródła, więc jeśli to nie będzie kolidować, to można by zmienić. Właśnie Blitz Basic miał problem z rozpoznaniem tego mnemonika.

Ostatnia aktualizacja: 08.01.2025 06:29:58 przez tukinem
[#153] Re: Dewelopment gry Sołtys

@Don_Adan, post #151

Poczytaj sobie, PackFire LZMA (w wersji packer) vs lha (archiwizer). 2.37MB vs 8.25MB.

Ja widzę: "Nieskompresowany plik LHA to 8,25 MB, a spakowany przez Packfire to 2,37 MB."
Gra zajmuje około 10 dyskietek, więc lha jest bez kompresji. Porównanie bez sensu.

LZX jest slabszy niz ARJ mode 7.

Nigdy w życiu. ARJ7 korzysta z tych samych algorytmów co lha, więc myślę, że skuteczność jest na poziomie lh7 co potwierdzają moje testy.

Takich testow nie robi sie tylko na 1 pliku, ale na calej grupie plikow

Tak, ale AVP jest dużym plikiem (exe z danymi) i pokazuje trendy. Test 40MB amigowej plikopartycji potwierdza te trendy:
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)


Czyli licząc "na grubo": 40 dysków lzx spakował na 20 dysków, pf na17 dysków. 3 dyski oszczędności. Gra ma 10 dyskietek. Ile można zyskać używając pf? Nie wiem, strzelam, że max to 1 dyskietka, ale czy na pewno. Dlatego najpierw polecam testy czy gra jest warta świeczki.
1
[#154] Re: Dewelopment gry Sołtys

@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)
; ------------------------------------------
[#155] Re: Dewelopment gry Sołtys

@Don_Adan, post #154

Jak czegos nie zwalilem to powinno dzialac.
Depacker musisz sam wkleic na koncu zrodel, bo mi sie nie miescil w pamieci schowka, i go przycinalo, jak chcialem kopiuj/wklej uzyc.
I sprawdz czy zassembluje sie.
[#156] Re: Dewelopment gry Sołtys

@tukinem, post #152

A co do bhs, to nie pamietam, chyba tego w ogole nie uzywalem.
Mozesz sprobowac zmienic w tym depackerze i zobaczyc czy zadziala.
[#157] Re: Dewelopment gry Sołtys

@cholok, post #153

To musisz poprosic Tukinema, zeby spakowal aktualne pliki z gry Soltys LZX oraz dla porownania wszystkie polaczone pliki PackFire'em znowu.
Wedlug mnie duzo zalezy od plikow jakie gra uzywa, grafika i muzyka zawsze sie slabo pakowaly, szczegolnie muzyka, w LZX. Exeki sie znacznie lepiej pakuja.
Wedlug mnie roznica bedzie jak 3 vs 5 dyskietek, na korzysc PackFire.
A w przypadku prawdziwej wersji instalacyjnej, to sa duze oszczednosci na kosztach zakupu potrzebnych dyskietek.
[#158] Re: Dewelopment gry Sołtys

@cholok, post #153

Jak juz robisz testy to spakuj jeszcze ZX0, bede mial odniesienie.
Wersji ross-a pewnie nie znajdziesz, ale jakas zwykla powinna byc.
Dzieki.
[#159] Re: Dewelopment gry Sołtys

@Don_Adan, post #156

Spakowałem dzisiaj na nowo pliki Sołtysa trzema archiwizerami i wynik jest jednoznaczny:


Po lewej stronie zaznaczyłem pliki po spakowaniu LZMA, a ich rozmiar jest wyświetlony na górze okna. Po prawej stronie są pliki LHA oraz LZX po spakowaniu gry.

Oczywiście to nie jest ostateczny wynik i tam w liście plików niepotrzebnie jeszcze jest dołączony paker LZMA, z tym że to niecały 1 kB.

LhA całkowicie odpada. Na chwilę obecną tworzy 8-dyskietkową wersję, gdzie ostatnia dyskietka miałaby niewiele danych

LzX jest lepszy o jakieś 300 kB z tego, co widzę, więc byłoby 7 dyskietek

LZMA zjechał niżej na około 6 dyskietek.

Niepotrzebnie pakowałem Crunchmanią moduły z muzyką. Będę musiał je trzymać jednak w rozpakowanej wersji. Ogólnie dla muzyki przyjąłem, że każdy moduł to będzie około 200kB plik .MOD, jednak Bartesek mnie zaskakuje i podsyła pliczki po około 80 kB co znacznie uszczupla grę.

Nie łączę plików przed pakowaniem w jeden plik, bo później musiałbym po wypakowaniu znowu go dzielić, a to będzie ogólnie masakra. Już teraz się zastanawiam, czy sam skrypt instalacyjny nie zajmie kilkuset kB, bo jednak sporo tu plików i każdy z osobna trzeba będzie wypakować i odpowiednio skopiować do miejsca docelowego.

No ale zajmijmy się narazie samym depakerem. Nie zmieniałem BHS na BCC. Asemblacja przeszła bez problemu. Skompilowałem go do pliku binarnego i co dalej? Jak rozpakować dowolny plik?
[#160] Re: Dewelopment gry Sołtys

@tukinem, post #159

Tylko to jest porownanie archiwizer (LZX) vs packer (LZMA). Zrob ten 1 plik dla testow i spakuj LZMA.
Ciekawe czy bedzie 2.7MB wtedy.

Gratulacje, ze zasemblowales depacker pod xfd.
Teraz trzeba sprawdzic czy dziala Ok.

Sciagnij to archiwum:
link
Uzyj Install.
A jak chcesz recznie to skopiuj xfdmaster.library do libs:
xfdDecrunch do c:
zaloz katalog xfd w libs: czyli bedzie libsfd
skopiuj do libsfd TUKI (taka nazwe bym uzyl dla pliku depakujacego.)

Wchodzisz do CLI i piszesz:

xfdDecrunch nazwaplikuspakowanego

I przesadzasz z wielkoscia skryptu Installera
To jest tylko 1 linijka, zeby rozpakowac wszystkie pliki w calym katalogu z gra.
Nikt nie rozspakowuje plikow po ich nazwie, o ile nie musi.
[#161] Re: Dewelopment gry Sołtys

@tukinem, post #159

I tak, nie pakuj niczego Crunchmania, jak chcesz robic wersje instalacyjna gry, bo to bez sensu, pisalem o tym.
Podwojne pakowanie jest zawsze gorsze, niz pojedyncze pakowanie dobrym pakerem.
Najpierw sprawdz jaki rozmiar ma cala gra.w formie LZMA (1 pliku spakowanego).
To wtedy bedzie znana wartosc minimalna archiwum jaka w teorii jest mozliwa do osiagniecia.
Czy to beda 3 czy 4 dyskietki.
Bo przy robieniu wersji instalacyjnej to jednak jest roznica czy to bedzie 6 czy 4 dyskietki.
[#162] Re: Dewelopment gry Sołtys

@Don_Adan, post #161

Narazie rozpakowałem moduły z muzyką i wywaliłem wszelkie CrmDecrunch z kodu (exe zmalał o 5kB, więc c64portal miał rację, że biblioteka crunchmanii w BB2 to nie jest 30kB, a 5kB).

Potraktowałem katalog Sołtysa LhA z parametrem -z aby nie było kompresji i zapisałem jako SOLTYS.JOIN

Następnie spakowałem go LZMA do pliku SOLTYS.P

SOLTYS.JOIN to 12 117 029 bajtów

SOLTYS.P to 3 679 452 bajtów (+8 bajtów, które dołożę na początek pliku zapewne)

Porównując do pakowania tamtych archiwizerów to wygląda tak:
LHA: 6 085 117 bajtów
LZX: 5 833 292 bajtów

Ostatnia aktualizacja: 08.01.2025 17:24:17 przez tukinem
[#163] Re: Dewelopment gry Sołtys

@tukinem, post #162

To 5 dyskietek powinna instalacyjna wersja miec, na 4 sie nie zmiesci.
Chyba, ze jeszcze tam byla cos spakowane juz Crunchmania, np. te MOD-y.

BTW. TUKI depacker dziala dobrze?
Bo nigdy tak wirtualnie nie pisalem jeszcze.
[#164] Re: Dewelopment gry Sołtys

@Don_Adan, post #163



Jesteś wielki :)

Wychodzi 5 dyskietek, z czego pierwsza miałaby sporo luzu, więc tam powstawiałbym skrypt Installera, katalog C z samym Installerem, LhA, katalog LIBS z xfdmaster.library i depakerem, a nie robiłbym katalogu S i bootblocku, bo to tylko zjadłoby część obszaru dyskietki. Lepiej chyba, żeby każdy sobie instalował po uruchomieniu systemu.
[#165] Re: Dewelopment gry Sołtys

@tukinem, post #164

Czyli dziala. To dobrze.

Cos do BB2 i xfdmaster.library jest na Aminecie
link

Ale w taki sposob to zeby zainstalowac gre potrzebne by bylo 16 MB fast.
Troche duzo.
Ja raczej bym stworzyl 2 mniejsze pliki LZMA, zeby 8 MB fast wystarczylo do zainstalowania gry.
Ewentualnie 4 lub 5 mniejsze pliki LZMA, po 1 pliku na kazda dyskietke.

No i mozesz jeszcze jeden test zrobic, wybierz 2 duze (pareset kilobajtow) pliki z gry.
Polacz je na 2 sposoby.
Najpierw plik numer 1 jest pierwszy a plik numer 2 drugi.
A potem plik numer 2 jest pierwszy a plik numer 1 drugi.

I spakuj oba utworzone pliki LZMA.
I zobacz czy bedzie jakas roznica w wielkosci spakowanego pliku.
Bo byc moze kolejnosc laczenia plikow tez moze miec znaczenie jesli chodzi o wielkosc pliku spakowanego.
I np. sample/mody nalezy po kolei polaczyc, zeby packed ratio bylo jak najlepsze.
A nie randomowo.




.
[#166] Re: Dewelopment gry Sołtys

@Don_Adan, post #165

Cos do BB2 i xfdmaster.library jest na Aminecie


Co do Blitz Basic, to trzeba by dodać bibliotekę z tymi funkcjami, które tam są zapisane. Raczej nie będę grzebać w tym bo jeszcze popsuję sobie IDE do pisania gier.

Gra ogólnie wymaga 2MB chip RAM + 1 MB fast RAM, więc może tego bym się trzymał, czyli po 1 pliku na dyskietkę. Wtedy kolejno installer prosiłby o wsadzenie konkretnej dyskietki, wypakowałby plik i kolejna i kolejna.

Do łączenia plików używam JoinSplittera, a tam jedynie wskazuję pliki do łączenia i on automatycznie je łączy. Tak jak Ty piszesz, to jedynie bym musiał w BB napisać sobie alokowanie pamięci ręcznie i tak kombinować, inaczej nie potrafię.
[#167] Re: Dewelopment gry Sołtys

@tukinem, post #166

Do laczenie plikow, uzyj FileMastera 2.2 ma opcje Join.
Ja jej bardzo czesto uzywalem.

Edycja. Tylko testuj na kopiach plikow.

Ostatnia aktualizacja: 08.01.2025 20:00:17 przez Don_Adan
[#168] Re: Dewelopment gry Sołtys

@Don_Adan, post #167

Spokojnie...

Mam katalog źródłowy z Sołtysem z całym bajzlem, katalog typowo gry, który ma być w takiej postaci po zainstalowaniu i to jego właśnie pakuję, a oprócz tego źródło siedzi na githubie.

Kurcze nie pomyślałem o tym, że wypakowywanie wymaga sporo fast ramu.

Można jeszcze zrobić tak, że kolejno:
- katalog połączyć w 1 plik
- plik podzielić na części po 512 kB
- te części spakować LZMA
- spakowane części połączyć w 1 plik
- ostateczne ten plik podzielić na dyskietki

O ile łączenie / dzielenie plików nie wymaga fast ramu, to by to miało sens. Pytanie, czy z poziomu skryptu installera można też dzielić pliki? W katalogu C w systemie siedzi Join od łączenia, lecz nie widzę Splitu od dzielenia, więc musiałby być takowy dograny znowu do instalki.
[#169] Re: Dewelopment gry Sołtys

@tukinem, post #168

To może jeszcze tak zupełnie z innej beczki, dla tych, co są znudzeni pakowaniem.

Ostatnio wróciłem na chwilkę do samej gry, aby nareszcie dorobić porządnie zapisyswanie gry zamiast RAMIGA+S. Z poziomu gry, jeśli klikniemy na belce na wyjście z gry, to wyskoczy nam okienko, które pyta czy chcemy zapisać grę. Nie ma napisu, bo musiałbym dodać kolejną porcję napisów do tablic z łańcuchami, dlatego wolałem "wypikslować" całe okienko, które nam się wyświetla z zapytaniem o zapis gry.

Oto filmik, jak działa:


Muzyka z dźwiękami oczywiście są przesunięte do przodu, bo tak już WinUAE nagrywa.

Dla porównania wersja PC nie pytała, a sama zapisywała grę przy wyjściu, oczywiście o ile się nie sypała na danym komputerze, a sypała się równo, stąd ScummVM uratował to.

Ostatnia aktualizacja: 08.01.2025 20:50:34 przez tukinem
[#170] Re: Dewelopment gry Sołtys

@tukinem, post #168

Mozna i tak.
Laczenie/dzielenie plikow nie wymaga dodatkowej pamieci.
Chyba, ze laczysz/dzielisz do RAM-u.
Ja uwazam, ze A1200 z HD to minimum 4 MB fast ma.
Wiec bym w taki konfig celowal.
Czyli na kazdej dyskietce bylby okolo 800-850kB plik LZMA, rozpakowujacy sie do max 3MB.
Wtedy 4MB fast styknie.
Niby A1200 (68020) moze miec 8 MB fast, ale to czesto jest 2x 4MB.
Czyli nie ma ciaglego obszaru 8MB.
A jak laczysz pliki lha to mozesz sobie wybrac, ktore chcesz a ktore nie chcesz zeby byly w archiwum.
Albo mozesz po prostu zrobic tymczasowy katalog gry i kopiowac do niego tylko te pliki, ktore sie maja laczyc.
Oczywiscie wtedy jest wiecej roboty, ale mozna samemu wybrac co ma byc w archiwum.
Mozna tez na boxie gry napisac, ze instalacja 4MB fast potrzebuje, a uruchomienie 1MB fast.


Ostatnia aktualizacja: 08.01.2025 22:12:31 przez Don_Adan
[#171] Re: Dewelopment gry Sołtys

@Don_Adan, post #158

Robiłem, ale packer jest ekstremalnie wolny (na PC) więc używalny na małych plikach, olałem temat.
[#172] Re: Dewelopment gry Sołtys

@tukinem, post #162

W LZX użyłeś parametru -9 (max compression)?
[#173] Re: Dewelopment gry Sołtys

@cholok, post #171

Sprawdziłem na programie salvador o prawie tej samej skuteczności, ale dużo szybszym.
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)

Jest blisko lha co ze względu na prosty algorytm jest świetnym rezultatem.
[#174] Re: Dewelopment gry Sołtys

@cholok, post #173

Czyli ZX0, do gry/dema z dyskietki moze byc.
O ile dobrze pamietam to ross twierdzil, ze jego wersja pakuje godzinami na szybkim PC-cie.
W sumie jak chcesz to mozesz porownac o ile jest wydajniejsza niz salvador.
ross przynajmniej jednego cracka zrobil uzywajac tej swojej wersji.
Czyli trzeba by pliki w tym cracku rozpakowac i spakowac salvador, i porownac rozmiar spakowanych plikow.
[#175] Re: Dewelopment gry Sołtys

@cholok, post #172

W LZX użyłeś parametru -9 (max compression)?


Sprawdziłem teraz i różnica niewielka w porównaniu do zwykłej kompresji LZX.

Spakowałem teraz dwoma wariantami i... wynik identyczny. Tzn tak, jakby nie użył tego parametru.

Próbowałem takiej składni:
lzx -r -e -9 a ...

lecz wywalało błąd i dopiero udało się tak:
lzx -r -e-9 a ...

ale rozmiar pliku identyczny, chyba że źle podałem parametry? Nigdy nie używałem tej opcji, a nawet nie wiedziałem, że istnieje.
[#176] Re: Dewelopment gry Sołtys

@tukinem, post #175

Używasz wersji registered (klucz jest free) bo tylko w tej działa?
[#177] Re: Dewelopment gry Sołtys

@Don_Adan, post #174

79˙248 org

37˙653 zx0 (optimal)
39˙457 zx0 (quick)
37˙656 salv

Akurat w tym przypadku różnica jest nieistotna, ale czasem bywa więcej. Zawsze salvador jest lepszy niż zx0 quick, a i tak pakuje szybciej. Jeśli używamy małych plików to jednak zx0 kosztem sporego czasu.
[#178] Re: Dewelopment gry Sołtys

@cholok, post #176

Jak kiedys sprawdzalem to nie bylo chyba zadnej roznicy przy uzyciu -9 w LZX, albo bardzo niewielka.
To byly czasy jak robilem CD ripy.
Zreszta spakuj swoj testowy plik LZX bez -9 i zobacz ile wtedy bedzie mialo to archiwum.
[#179] Re: Dewelopment gry Sołtys

@Don_Adan, post #178

Jeśli można to trzeba, na pewno jest nieco lepiej. Wiadomo, LZMA nie przebije na pewno, ale jak testujemy to na maksa.
[#180] Re: Dewelopment gry Sołtys

@cholok, post #176

Taką wersję mi wypisuje w CLI: 1.21 EC [Registered].
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem