;*---------------------------------------------------------------------------
;  :Program.    SSUR.asm
;  :Contents.   Decruncher for XFDMaster.Library
;  :Author.     WEPL
;  :Address.    unknown
;  :Shortcut.   unknown
;  :History.    V 0.9 06-Nov-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 SSUR 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	'(SSUR) 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	#"SSUR",(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.b	(7,a4),d0
		lsl.l	#8,d0
		move.b	(6,a4),d0
		lsl.l	#8,d0
		move.b	(5,a4),d0
		lsl.l	#8,d0
		move.b	(4,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	_SSUR_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 :	dc.l	"SSUR"
;		dc.l	size unpacked (dc.b LSByte,...,MSByte)
;		dc.l	checksum      (dc.b LSByte,...,MSByte)
;
; Übergabe :	A0 = APTR source
;		A1 = APTR destination
; Rückgabe :	D0 = BOOL success

_SSUR_Dec	movem.l	d2-d7/a2,-(a7)
		moveq	#8,d5		;optimizing for .getlw
		move.l	a1,a2

		cmp.l	#"SSUR",(a0)+		
		bne	.err
		bsr	.getlw		;size decrunched
		add.l	d7,a1		;A1 = end of destination
		bsr	.getlw
		move.l	d7,d6		;D6 = checksum

		MOVEQ	#0,D2
		
		bsr	.A3
		BCS	.1120
.10C0		bsr	.A5
		MOVE.W	D0,D2
		MOVE.W	D0,D3
		SUBQ.W	#1,D2
.10C8		CLR.W	D0
		ADD.L	D7,D7
		BNE	.10D0
		bsr	.A3
.10D0		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.10D8
		bsr	.A3
.10D8		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.10E0
		bsr	.A3
.10E0		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.10E8
		bsr	.A3
.10E8		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.10F0
		bsr	.A3
.10F0		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.10F8
		bsr	.A3
.10F8		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.1100
		bsr	.A3
.1100		ADDX.W	D0,D0
		ADD.L	D7,D7
		BNE	.1108
		bsr	.A3
.1108		ADDX.W	D0,D0
		MOVE.B	D0,-(A1)
		DBRA	D2,.10C8
		CMPA.L	A2,A1
		BLE	.1136
		NOT.W	D3
		BNE	.1120
.1118		ADD.L	D7,D7
		BNE	.111E
		bsr	.A3
.111E		BCC	.10C0
.1120		bsr	.A5
		MOVE.W	D0,D2
		bsr	.A5
		MOVE.W	D0,D3
		ADDQ.W	#2,D3
.112A		MOVE.B	-1(A1,D2.L),-(A1)
		DBRA	D3,.112A
		CMPA.L	A2,A1
		BGT	.1118
.1136
		moveq	#-1,d0
		tst.l	d6		;checksumm
		beq	.end
.err		moveq	#0,d0
.end		movem.l	(a7)+,d2-d7/a2
		RTS

.A5		CLR.W	D0
		CLR.W	D1
		ADD.L	D7,D7
		BNE	.114C
		bsr	.A3
.114C		ADDX.W	D1,D1
		ADD.L	D7,D7
		BNE	.1154
		bsr	.A3
.1154		ADDX.W	D1,D1
		ADDQ.W	#1,D1
		ADD.W	D1,D1
		ADD.W	D1,D1
		SUBQ.W	#1,D1
.115E		ADD.L	D7,D7
		BNE	.1164
		bsr	.A3
.1164		ADDX.W	D0,D0
		DBRA	D1,.115E
		RTS	

.A3		BSR	.getlw
		NOT.L	D7
		SUB.L	D7,d6		;checksum
		ORI.B	#$0010,CCR
		ADDX.L	D7,D7
		RTS	

.getlw		MOVE.B	(A0)+,D7
		ROR.L	d5,D7
		MOVE.B	(A0)+,D7
		ROR.L	d5,D7
		MOVE.B	(A0)+,D7
		ROR.L	d5,D7
		MOVE.B	(A0)+,D7
		ROR.L	d5,D7
		RTS	

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

	END

