

		section "Recognizer",code

	incdir "includes:"
	include	"asm:datamaster.library/datamaster.i"
	include	"asm:datamaster.library/datamaster_lib.i"

value="M"<<24+"K"<<8

		RECOHEADER reco
reco:	dc.l	DMR_Flags,RECOF_CheckData+RECOF_CheckPatt+RECOF_SubType
	dc.l	DMR_DMVersion,2
	dc.l	DMR_Version,1<<16+4
	dc.l	DMR_Class,DMCLASSF_MUSIC
	dc.l	DMR_SubTypesTable,CheckTable
	dc.l	DMR_CheckRoutineHook,checkroutine
	dc.l	DMR_Name,.name
	dc.l	DMR_Descr,.descr
	dc.l	TAG_END


.name:	dc.b	"MUSIC-PtkClones",0

.descr:	dc.b	"Protracker clones...yeah!",0
	even


;had to include this personal checkroutine to modify the results
;of the XXXX_Check routines...(as they return good=NULL and datamaster
;needs to get d0=subtype string if good, else NULL) (!)

;get d0= output of the current sub-check & a0=pointer on current
;entry in the array
checkroutine:
	tst.l	d0
	beq.s	.good
.bad:	moveq	#0,d0
	rts
.good:	move.l	8(a0),d0	;get current subtype string
	rts

*----------------------------------------------------------------------------*
PTK_check:
	lea	1080(a0),a0
	move.l	(a0),d1
	and.l	#$ff00ff00,d1
	cmp.l	#value,d1
	bne.s	.err
	moveq	#0,d0
	rts
.err:	moveq	#1,d0	;nocheck match
	rts
	

*----------------------------------------------------------------------------*
ChipTracker_Check:
		move.l	$3b8(a0),d0
		sub.l	#`KRIS`,d0
		rts


*--------------------------- Testet auf Modul -------------------------------*
DSS_Check:	move.l	(a0),d0
		sub.l	#"MMU2",d0
		rts


*------------------------ Test auf KefrensPlayer ---------------------------*
LaxityPlayer_Check:
		lea	CheckText(pc),a1
		addq.l	#8,a0

		moveq	#15,d1
.Test		cmpm.b	(a0)+,(a1)+
		bne.s	.Return
		dbf	d1,.Test
		moveq	#0,d0
.Return		rts
CheckText:	dc.b	"YET ANOTHER COOL"
		even



*--------------------------- OLD-Promizer Check ----------------------------*
Promizer01_Check:
		*move.l	DTG_ChkData(a5),a0	; ptr to module
		move.l	a0,a3
		add.l	d1,a3
		move.l	d1,-(sp)

		*add.l	DTG_ChkSize(a5),a3
		moveq	#0,d2
		move.w	#762,d2
		moveq	#-1,d0			; Modul nicht erkannt (default)
		move.l	(a0,d2.w),d3		; get patternlenght
		beq.s	.ChkEnd
		addi.l	d2,d3			; add pattern offset
		moveq	#30,d2			; #instr
.ChkSamp:	cmp.l	a3,a0
		bhi.s	.ChkEnd
		moveq	#0,d1
		move.w	(a0),d1			; samplelength in words
		add.l	d1,d1			; samplelength in bytes
		add.l	d1,d3			; add length of sample
		addq.l	#8,a0			; next sample info
		dbf	d2,.ChkSamp

;		sub.l	DTG_ChkSize(a5),d3
		sub.l	(sp),d3			; test size of module

		cmpi.l	#-64,d3			; - 64 Bytes
		blt.s	.ChkEnd			; too small
		cmpi.l	#+64,d3			; + 64 Bytes
		bgt.s	.ChkEnd			; too big
		moveq	#0,d0			; Modul erkannt
.ChkEnd:	move.l	(sp)+,d1
		rts

*---------------------------------------------------------------------------*
Promizer1x_Check:cmp.b	#$60,(a0)
		bne.s	.Error
		cmp.w	#$6000,6(a0)
		bne.s	.Error
		cmp.w	#$6000,10(a0)
		bne.s	.Error
		moveq	#0,d0
.Error:		rts

*---------------------------------------------------------------------------*
Promizer40_Check:move.l	(a0),d0
		sub.l	#"PM40",d0
		rts

*---------------------------------------------------------------------------*
ProTracker4_Check:
		cmp.l	#`FORM`,(a0)
		bne	.return
		cmp.l	#`MODL`,8(a0)
		bne	.return
		moveq	#0,d0
.return		rts


*---------------------------------------------------------------------------*
SoundTracker26_Check:
		move.l	$5b8(a0),d0
		and.l	#$ffffff00,d0
		sub.l	#`MTN`*256,d0
		beq.s	.rts
		move.l	$5b8(a0),d0
		sub.l	#`IT10`,d0
.rts:		rts

*---------------------------------------------------------------------------*
SoundTrackerPro_Check:
		moveq	#-1,d0
		cmp.l	#`STP3`,(a0)
		bne.s	.rts
		cmp	#2,4(a0)
		bne.s	.rts
		moveq	#0,d0
.rts:		rts

*---------------------------------------------------------------------------*
StoneTracker_Check:
		moveq	#-1,d0
		move.l	(a0),d1
		move.b	#" ",d1
		cmp.l	#"SPS ",d1
		beq.s	.ok
		cmp.l	#"SPM ",d1
		beq.s	.ok
		rts
.ok:		moveq	#0,d0
		rts


;**************************************************************************

;				CHECKING TABLE

;**************************************************************************


CheckTable:
	dc.l	PTK_check,PTK_Patt,PTK_Name
	dc.l	ChipTracker_Check,ChipTracker_Patt,ChipTracker_Name
	dc.l	DSS_Check,DSS_Patt,DSS_Name
	dc.l	LaxityPlayer_Check,LaxityPlayer_Patt,LaxityPlayer_Name
	dc.l	Promizer01_Check,Promizer01_Patt,Promizer01_Name
	dc.l	Promizer1x_Check,Promizer1x_Patt,Promizer1x_Name
	dc.l	Promizer40_Check,Promizer40_Patt,Promizer40_Name
	dc.l	ProTracker4_Check,-1,ProTracker4_Name
	dc.l	SoundTracker26_Check,SoundTracker26_Patt,SoundTracker26_Name
	dc.l	SoundTrackerPro_Check,SoundTrackerPro_Patt,SoundTrackerPro_Name
	dc.l	StoneTracker_Check,StoneTracker_Patt,StoneTracker_Name
	dc.l	-1,NP_Patt,NP_Name
	dc.l	-1,HMC_Patt,HMC_Name
	dc.l	-1,PHA_Patt,PHA_Name
	dc.l	-1,WN_Patt,WN_Name
	dc.l	-1,SKYT_Patt,SKYT_Name
	dc.l	-1,PP_Patt,PP_Name
	dc.l	-1,PRU_Patt,PRU_Name
	dc.l	-1,UNIC_Patt,UNIC_Name
	dc.l	-1,NRU_Patt,NRU_Name
	dc.l	-1,EU_Patt,EU_Name
	dc.l	-1,AC1D_Patt,AC1D_Name
	dc.l	-1,PYGM_Patt,PYGM_Name
	dc.l	-1,DI_Patt,DI_Name
	dc.l	-1,CHN_Patt,CHN_Name
	dc.l	-1,STAR_Patt,STAR_Name
	dc.l	-1,GMC_Patt,GMC_Name
	dc.l	-1,MPRO_Patt,MPRO_Name
	dc.l	-1,FCM_Patt,FCM_Name
	dc.l	-1,ICE_Patt,ICE_Name
	dc.l	-1,FUZZ_Patt,FUZZ_Name
	dc.l	-1,KSM_Patt,KSM_Name
	dc.l	-1,TPL_Patt,TPL_Name
	dc.l	-1,TP_Patt,TP_Name
	dc.l	-1,NTPK_Patt,NTPK_Name
	dc.l	-1,POLK_Patt,POLK_Name
	dc.l	-1,PM_Patt,PM_Name
	dc.l	-1,ZEN_Patt,ZEN_Name
	dc.l	-1,HRT_Patt,HRT_Name
	dc.l	0,0,0


;**************************************************************************

;				SubTypes strings

;**************************************************************************

PTK_Name:		dc.b	"ProTracker",0
ChipTracker_Name:	dc.b	"ChipTracker",0
DSS_Name:		dc.b	"DSS",0
LaxityPlayer_Name:	dc.b	"Laxity-Player",0
Promizer01_Name:	dc.b	"Promizer 0.1",0
Promizer1x_Name:	dc.b	"Promizer 1.x",0
Promizer40_Name:	dc.b	"Promizer 4.0",0
ProTracker4_Name:	dc.b	"ProTracker4",0
SoundTracker26_Name:	dc.b	"SoundTracker 2.6",0
SoundTrackerPro_Name:	dc.b	"SoundTracker Pro II",0
StoneTracker_Name:	dc.b	"StoneTracker",0

NP_Name:		dc.b	"Noise Packer",0

HMC_Name:
	dc.b	"HeatSeeker Module Cruncher",0

XANN_Name:
	dc.b	"XANN Packer",0

PHA_Name:
	dc.b	"PHA Packer",0

WN_Name:dc.b	"WANTON Packer",0

SKYT_Name:
	dc.b	"SKYT Packer",0

PP_Name:dc.b	"Pro Packer",0


PRU_Name:
	dc.b	"ProRunner",0

UNIC_Name:
	dc.b	"UNIC Tracker",0

NRU_Name:
	dc.b	"NoiseRunner",0

EU_Name:dc.b	"EUREKA Packer",0

AC1D_Name:
	dc.b	"AC1D Packer",0

PYGM_Name:
	dc.b	"Pygmy Projects Packer",0

DI_Name:dc.b	"Digital Illusions",0

CHN_Name:
	dc.b	"Channel Player",0

STAR_Name:
	dc.b	"StarTrekker",0

GMC_Name:
	dc.b	"Game Music Creator",0

MPRO_Name:
	dc.b	"Module Protector",0

FCM_Name:
	dc.b	"FC-M Packer",0


ICE_Name:
	dc.b	"Ice Tracker",0

FUZZ_Name:
	dc.b	"Fuzzac Packer",0

KSM_Name:
	dc.b	"Kefrens Sound Machine",0

TPL_Name:dc.b	"The Player",0

TP_Name:dc.b	"Tracker Packer",0

NTPK_Name:
	dc.b	"NoiseTracker Packer",0

POLK_Name:
	dc.b	"Polka Packer",0

PM_Name:dc.b	"Power Music",0

ZEN_Name:
	dc.b	"Zen Packer",0

HRT_Name:
	dc.b	"Hornet Packer",0

			even


;**************************************************************************

;				;PATTERNS

;**************************************************************************


PTK_Patt:
	dc.b	"MOD.*",0
	dc.b	"*.MOD",0
	dc.b	$ff


ChipTracker_Patt:
	dc.b	"KRIS.*",0		; 19 Kris Tracker (ChipTracker)
	dc.b	"CT.*",0
	dc.b	"CHIP.*",0
	dc.b	$ff


DSS_Patt:
	dc.b	"DSS.*",0,$ff


LaxityPlayer_Patt:
	dc.b	"LAX.*",0,$ff		; 17 Laxity (Unic Tracker 2)


Promizer01_Patt:
	dc.b	"PR0.1.*",0,$ff		;="Eagleplayers/Promizer 0.1"/1.x/4.0


Promizer1x_Patt:
	dc.b	"PR1.?.*",0		;="Eagleplayers/Promizer 1.x"
	dc.b	"PROM.*",0,$ff		; 08 Promizer v0.1/1.0c/1.8a


Promizer40_Patt:
	dc.b	"PM(2|4)0.*",0		; 10 Promizer v2.0 &v4.0
	dc.b	"PR4.0.*",0,$ff		;="Eagleplayers/Promizer 4.0"


SoundTracker26_Patt:
	dc.b	"ST26.*",0,$ff		; 36 SoundTracker v2.6


SoundTrackerPro_Patt:
	dc.b	"ST30.*",0,$ff		; 50 SoundTracker Pro 3.0


StoneTracker_Patt:
	dc.b	"SPS.*",0
	dc.b	"SPM.*",0
	dc.b	$ff


HMC_Patt:
	dc.b	"HMC.*",0,$ff		; 02 HeatSeeker Module Cruncher v1.0 (CRB)

XANN_Patt:
	dc.b	"XANN.*",0,$ff		; 03 Xann

PHA_Patt:
	dc.b	"PHA.*",0,$ff		; 04 Pha Packer (by Azatoth)

NP_Patt:
	dc.b	"NP.*",0
	dc.b	"NP(2|3).*",0,$ff	; 06 Noise Packer

WN_Patt:dc.b	"WN.*",0,$ff		; 11 Wanton Packer

SKYT_Patt:
	dc.b	"SKYT.*",0,$ff		; 12 SKYT

PP_Patt:dc.b	"PP10.*",0		; 13 ProPacker v1.0
	dc.b	"PP21.*",0		; 14 ProPacker v2.1
	dc.b	"PP30.*",0,$ff		; 15 ProPacker v3.0

PRU_Patt:
	dc.b	"PRU(1|2).*",0,$ff	; 16 ProRunner v1.0/2.0

UNIC_Patt:
	dc.b	"UNIC.*",0,$ff		; 18 Unic Tracker

NRU_Patt:
	dc.b	"NRU.*",0,$ff		; 21 Noise Runner

EU_Patt:dc.b	"EU.*",0,$ff		; 22 Eureka

AC1D_Patt:
	dc.b	"AC1D.*",0,$ff		; 23 AC1D

PYGM_Patt:
	dc.b	"PYGM.*",0,$ff		; 24 Pygmy Projects Packer

DI_Patt:dc.b	"DI.*",0,$ff		; 25 Digital Illusions

CHN_Patt:
	dc.b	"CHN(1|2|3).*",0,$ff	; 26 Channel Player 1

STAR_Patt:
	dc.b	"STAR.*",0,$ff		; 31 StarTrekker Packer

GMC_Patt:
	dc.b	"GMC.*",0,$ff		; 33 Game Music Creator

MPRO_Patt:
	dc.b	"MPRO.*",0,$ff		; 34 Module Protector

FCM_Patt:
	dc.b	"FC-M.*",0,$ff		; 37 FC-M

ICE_Patt:
	dc.b	"ICE.*",0,$ff		; 38 Ice Tracker

FUZZ_Patt:
	dc.b	"FUZZ.*",0,$ff		; 39 Fuzzac

KSM_Patt:
	dc.b	"KSM.*",0,$ff		; 40 Kefrens Sound Machine (Old Kefrens Packer)

TPL_Patt:dc.b	"P[0-9][0-9][A-F].*",0		;The Players X.X!! ;-)
	dc.b	"P[0-9][0-9][A-F]*",0,$ff	;The Players X.X!! ;-)

TP_Patt:dc.b	"TP[1|2|3].*",0,$ff		; 44 Tracker Packer 1/2/3

NTPK_Patt:
	dc.b	"NTPK.*",0,$ff		; 47 NoiseTracker Packer

POLK_Patt:
	dc.b	"POLK.*",0,$ff		; 48 Polka Packer (PWR)

PM_Patt:dc.b	"!PM!.*",0,$ff		; 49 Power Music


ZEN_Patt:
	dc.b	"ZEN.*",0,$ff		; 51 Zen Packer

HRT_Patt:
	dc.b	"HRT!.*",0,$ff		; 53 Hornet Packer






