;*---------------------------------------------------------------------------
;  :Program.    TSM.asm
;  :Contents.   Decruncher for XFDMaster.Library
;  :Author.     WEPL
;  :Address.    unknown
;  :Shortcut.   unknown
;  :History.    V 0.9 29-Oct-94
;		V 1.0 19-Nov-94 angepaßt auf orginal includes
;  :Copyright.  Public Domain
;  :Language.   68000 Assembler
;  :Translator. MaxonAsm V1.1
;---------------------------------------------------------------------------*
;##########################################################################

	INCDIR	Includes:
	INCLUDE	lvo/exec.i
	INCLUDE	libraries/xfdmaster.i

;##########################################################################

;----------------------------------------
; XFD-Library-Header

		moveq	#-1,d0
		rts	

		dc.l	XFDF_ID		;id
		dc.w	XFDF_VERSION	;version
		dc.w	0
		dc.l	0,0		;private
		dc.l	_xfdSlave1	;first slave

;----------------------------------------
; version string

		dc.b	'$VER: External TSM! decruncher V1.0 ('
	DATE 1
		dc.b	') by WEPL for xfdmaster.library',0
	CNOP 4

;----------------------------------------
; xfdSlave-structure

_xfdSlave1	dc.l	0		; next slave
		dc.w	XFDS_VERSION	; structure version
		dc.w	33		; req xfdmaster version
		dc.l	_name1		; cruncher name
		dc.w	XFDPFF_DATA	; cruncher flags
		dc.w	0		; max length of special info (passwd)
		dc.l	_check1		; check routine
		dc.l	_decrunch1	; decrunch routine
		dc.l	0		; segment recog routine
		dc.l	0		; segment decrunch routine

;----------------------------------------
; name of packer

_name1		dc.b	'(TSM!) Cruncher',0
	EVEN

;----------------------------------------
; code to check crunched
; Übergabe :	D0 = ULONG data size
;		A0 = APTR  data
; Rückgabe :	D0 = BOOL  success

_check1		cmp.l	#12,d0		;minimum 12 bytes
		blo	.no
		cmpi.l	#"TSM!",(a0)
		beq	.yes
.no		moveq	#0,d0
		rts

.yes		moveq	#-1,d0
		rts

;----------------------------------------
; code to decrunch the file
; Übergabe :	A0 = APTR xfdBufferInfo
; Rückgabe :	D0 = BOOL success

_decrunch1	movem.l	a4-a6,-(a7)
		move.l	a0,a5				;A5 = xfdbi
		move.l	(xfdbi_SourceBuffer,a5),a4	;A4 = source
		move.l	(8,a4),d0
		move.l	d0,(xfdbi_TargetBufLen,a5)
		move.l	d0,(xfdbi_TargetBufSaveLen,a5)
		move.l	(xfdbi_TargetBufMemType,a5),d1
		move.l	(4).w,a6
		jsr	(_LVOAllocMem,a6)
		move.l	d0,(xfdbi_TargetBuffer,a5)
		beq	.nomem
		
		move.l	d0,a1
		move.l	a4,a0
		bsr	_TSM_Dec
		tst.l	d0
		beq	.dataerr
		
		clr.w	(xfdbi_Error,a5)
		moveq	#-1,d0

.quit		movem.l	(a7)+,a4-a6
		rts	

.nomem		move.w	#XFDERR_NOMEMORY,(xfdbi_Error,a5)
		bra	.quit
.dataerr	move.w	#XFDERR_CORRUPTEDDATA,(xfdbi_Error,a5)
		bra	.quit

;----------------------------------------
; Format :	$0	dc.l	"TSM!"
;		$4	ULONG	size packed
;		$8	ULONG	size unpacked
;		$C		Daten...
;
; Übergabe :	A0 = APTR source
;		A1 = APTR destination
; Rückgabe :	D0 = BOOL success

_TSM_Dec
	MOVEM.L	D2-d7/a2-A6,-(A7)
	addq.l	#4,a0
	MOVE.L	(A0)+,D0		;d0 packed size
	LEA	-8(A0,D0.L),A5		;a5 end of packed-file
	
	move.l	a1,a4
	move.l	a1,a6
	add.l	(a0)+,a6
	
	BSR.B	.8E78
	BSR.B	.8E4C

	MOVEM.L	(A7)+,D2-d7/a2-A6
	RTS	

.8E4C	BSR.B	.8EA4
	BCC.B	.8E72
	MOVEQ	#0,D1
	BSR.B	.8EA4
	BCC.B	.8E6C
	LEA	.8F50(PC),A1
	MOVEQ	#4,D3
.8E5C	MOVE.L	-(A1),D0
	BSR.B	.8ECA
	SWAP	D0
	CMP.W	D0,D1
	DBNE	D3,.8E5C
	ADD.L	$0014(A1),D1
.8E6C	MOVE.B	-(A5),-(A6)		;a5 end of source
	DBRA	D1,.8E6C		;a6 end of dest
.8E72	CMPA.L	A4,A6			;a4 begin of dest
	BGT.B	.8ED8
	RTS	

.8E78	MOVEQ	#3,D0
.8E7A	MOVE.B	-(A5),D7
	ROR.L	#8,D7
	DBRA	D0,.8E7A
	RTS	

.8E84	MOVE.W	A5,D7
	BTST	#0,D7
	BNE.B	.8E92
	MOVE.L	-(A5),D7
	ADDX.l	D7,D7
	BRA.B	.8ED0

.8E92	MOVE.L	-5(A5),D7
	LSL.L	#8,D7
	MOVE.B	-(A5),D7
	SUBQ.L	#3,A5
	ADD.L	D7,D7
	BSET	#0,D7
	BRA.B	.8ED0

.8EA4	ADD.L	D7,D7
	BEQ.B	.8EAA
	RTS	

.8EAA	MOVE.W	A5,D7
	BTST	#0,D7
	BNE.B	.8EB8
	MOVE.L	-(A5),D7
	ADDX.l	D7,D7
	RTS	

.8EB8	MOVE.L	-5(A5),D7
	LSL.L	#8,D7
	MOVE.B	-(A5),D7
	SUBQ.L	#3,A5
	ADD.L	D7,D7
	BSET	#0,D7
	RTS	

.8ECA	MOVEQ	#0,D1
.8ECC	ADD.L	D7,D7
	BEQ.B	.8E84
.8ED0	ADDX.w	D1,D1
	DBRA	D0,.8ECC
	RTS	

.8ED8	LEA	.8F64(PC),A1
	MOVEQ	#3,D2
.8EDE	BSR.B	.8EA4
	DBCC	D2,.8EDE
	MOVEQ	#0,D4
	MOVEQ	#0,D1
	MOVE.B	1(A1,D2.W),D0
	EXT.W	D0
	BMI.B	.8EF2
	BSR.B	.8ECA
.8EF2	MOVE.B	6(A1,D2.W),D4
	ADD.W	D1,D4
	BEQ.B	.8F18
	LEA	.8F6E(PC),A1
	MOVEQ	#1,D2
.8F00	BSR.B	.8EA4
	DBCC	D2,.8F00
	MOVEQ	#0,D1
	MOVE.B	1(A1,D2.W),D0
	EXT.W	D0
	BSR.B	.8ECA
	ADD.W	D2,D2
	ADD.W	6(A1,D2.W),D1
	BRA.B	.8F2A

.8F18	MOVEQ	#0,D1
	MOVEQ	#5,D0
	MOVEQ	#0,D2
	BSR.B	.8EA4
	BCC.B	.8F26
	MOVEQ	#8,D0
	MOVEQ	#$0040,D2
.8F26	BSR.B	.8ECA
	ADD.W	D2,D1
.8F2A	LEA	2(A6,D4.W),A1
	ADDA.W	D1,A1
	MOVE.B	-(A1),-(A6)
.8F32	MOVE.B	-(A1),-(A6)
	DBRA	D4,.8F32
	BRA.W	.8E4C

	DC.W	$7FFF
	DC.W	$E
	DC.W	$FF
	DC.W	7
	DC.W	7
	DC.W	2
	DC.W	3
	DC.W	1
	DC.W	3
	DC.W	1
.8F50	DC.L	$10D
	DC.L	$E
	DC.L	7
	DC.L	4
	DC.L	1
.8F64	DC.L	$90100FF
	DC.L	-$F7FBFE
	DC.W	$100
.8F6E	DC.L	$B040700
	DC.L	$1200000
	DC.w	$20

;##########################################################################

	END

