
	incdir	"includes:"
	include	"misc/DeliPlayer.i"

;
;
	SECTION Player,Code
;
;

	PLAYERHEADER PlayerTagArray

	dc.b '$VER: Game Music Creator player module V1.5 (30 Mar 92)',0
	even

PlayerTagArray
	dc.l	DTP_PlayerVersion,1
	dc.l	DTP_PlayerName,PName
	dc.l	DTP_Creator,CName
	dc.l	DTP_Check2,Check
	dc.l	DTP_Interrupt,Int
	dc.l	DTP_InitPlayer,InitPlay
	dc.l	DTP_EndPlayer,EndPlay
	dc.l	DTP_InitSound,InitSnd
	dc.l	DTP_EndSound,RemSnd
	dc.l	TAG_DONE

*-----------------------------------------------------------------------*
;
; Player/Creatorname und lokale Daten

PName	dc.b 'G.M.C',0
CName	dc.b 'Andreas Tadic,',10
	dc.b 'adapted by Delirium',0
	even

*-----------------------------------------------------------------------*
;
;Interrupt für G.M.C Replay

Int
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	MU_playsong 			; DudelDiDum
	movem.l	(sp)+,d0-d7/a0-a6
	rts

*-----------------------------------------------------------------------*
;
; Testet auf GameMusicCreator-Modul

Check
	move.l	dtg_ChkData(a5),a0

	lea	244(a0),a1			; Start der Patternsequenz
	move.l	240(a0),d0			; Anzahl der Pattern
	subq.l	#1,d0
	moveq	#0,d2
Chk_bigpat:					; find biggest Pattern
	move.w	(a1)+,d1
	cmp.w	d1,d2
	bge.s	Chk_nobigpat
	move.w	d1,d2
Chk_nobigpat:
	dbf     d0,Chk_bigpat
	add.l   #444+1024,d2			; + Patternbeginn + 1 Pattern
	moveq	#14,d0
Chk_calcins:
	tst.l	(a0)				; Sample da ?
	beq.s	Chk_nocalc			; Nein !
	moveq	#0,d1
	move.w	4(a0),d1			; add sampletable
	lsl.l   #1,d1
	add.l   d1,d2
Chk_nocalc:
	lea	16(a0),a0			; next sample
	dbf     d0,Chk_calcins

	move.l	dtg_ChkSize(a5),d0		; size of module
	move.l	d0,d1
	sub.l	#$40,d0				; - 64 Bytes
	add.l	#$40,d1				; + 64 Bytes
	cmp.l	d0,d2
	blt.s	Chk_fail			; too small
	cmp.l	d1,d2
	bgt.s	Chk_fail			; too big

	moveq	#0,d0				; Modul erkannt
	bra.s	ChkEnd
Chk_fail
	moveq	#-1,d0				; Modul nicht erkannt
ChkEnd
	rts

*-----------------------------------------------------------------------*
;
; Init Player

InitPlay
	move.l	dtg_AudioAlloc(a5),a0		; Function
	jsr	(a0)				; returncode is already set !
	rts

*-----------------------------------------------------------------------*
;
; End Player

EndPlay
	move.l	dtg_AudioFree(a5),a0		; Function
	jsr	(a0)
	rts

*-----------------------------------------------------------------------*
;
; Init Sound

InitSnd
	moveq	#0,d0
	move.l	dtg_GetListData(a5),a0		; Function
	jsr	(a0)
	bsr	MU_startmusic
	rts

*-----------------------------------------------------------------------*
;
; End Sound

RemSnd
	bsr	MU_stopmusic
	rts

*-----------------------------------------------------------------------*
;
; G.M.C-Replay

*******************************************************
******** GameMusicCreator Replay-routine v1.0 *********
*******************************************************

MU_startmusic:
	move.l  a0,MU_data
	move.l  a0,MU_tablepos
	move.l  a0,MU_songpointer
	add.l   #242,MU_tablepos
	add.l   #444,MU_songpointer
	move.w  #64,MU_patterncount
	clr.w   $dff0a8
	clr.w   $dff0b8
	clr.w   $dff0c8
	clr.w   $dff0d8
	move.w  #$f,$dff096
	clr.l   MU_vol0
	clr.l   MU_vol2
	clr.l   MU_pospointer
	clr.w   MU_songspeed
	clr.w   MU_note0
	clr.w   MU_note1
	clr.w   MU_note2
	clr.w   MU_note3
	clr.w   MU_slide0
	clr.w   MU_slide1
	clr.w   MU_slide2
	clr.w   MU_slide3
	clr.w   MU_stop
	clr.l   MU_chan0
	clr.l   MU_chan1
	clr.l   MU_chan2
	clr.l   MU_chan3
	move.w  #6,MU_songstep
	move.l  a0,a2
	add.l   #244,a2
	move.l  240(a0),d1
	sub.l   #1,d1
	clr.l   d0
MU_sizeloop:
	move.w  (a2)+,d2
	cmp.w   d2,d0
	bge     MU_nosizeadd
	move.w  d2,d0
MU_nosizeadd:
	dbf     d1,MU_sizeloop
	add.l   #1024,d0
	move.l  a0,a1
	add.l   #444,a1
	add.l   d0,a1
	move.l  #14,d7
	bsr     MU_calcins
;	move.l  $6c,MU_oldirq+2			; schauder !!!
;	move.l  #MU_interrupt,$6c		; würg !!!
	rts

MU_calcins:
	cmp.l   #0,(a0)
	bne     MU_calcit
	add.l   #16,a0
	dbf     d7,MU_calcins
	rts

MU_calcit:
	move.l  (a0),d0
	move.l  8(a0),d1
	sub.l   d0,d1  ;repeat
	move.l  a1,(a0)
	move.l  a1,d0
	add.l   d1,d0
	move.l  d0,8(a0) ;set repeat
	cmp.w   #2,12(a0)
	bne     MU_looping
	move.l  #MU_empty,8(a0)
MU_looping:
	clr.l   d0
	move.w  4(a0),d0 ;add sampletable
	lsl.l   #1,d0
	add.l   d0,a1
	add.l   #16,a0
	dbf     d7,MU_calcins
	rts

MU_stopmusic:
;	move.l  MU_oldirq+2,$6c			; hilfe !!!
	clr.w   $dff0a8
	clr.w   $dff0b8
	clr.w   $dff0c8
	clr.w   $dff0d8
	move.w  #$f,$dff096
	rts

;MU_interrupt:
;	movem.l  d0-d7/a0-a6,-(a7)
;	btst     #5,$dff01f			; kotz !!
;	beq      MU_novertblank
;	bsr      MU_playsong
;MU_novertblank:
;	movem.l  (a7)+,d0-d7/a0-a6
;MU_oldirq:  jmp $0				; oh weh !!!

MU_playsong:
	bsr     MU_everyvert
	add.w   #1,MU_songspeed
	move.w  MU_songstep,d0
	cmp.w   MU_songspeed,d0
	ble     MU_okplay
	rts
MU_okplay: 
	clr.w   MU_songspeed
	add.w   #1,MU_patterncount
	cmp.w   #65,MU_patterncount
	bne     MU_playit
MU_setnewpat:
	******* calc position ****
	add.l   #1,MU_pospointer
	move.l  MU_pospointer,d0
	move.l  MU_data,a5
	cmp.l   240(a5),d0
	bhi     MU_setstart
	***********************
	move.w  #1,MU_patterncount
	add.l   #2,MU_tablepos
	move.l  MU_tablepos,a0
	clr.l   d0
	move.w  (a0),d0
	move.l  MU_data,a0
	add.l   #444,a0
	add.l   d0,a0
	move.l  a0,MU_songpointer
	bra     MU_playit
	************************
MU_setstart:
	clr.l   MU_pospointer
	move.l  MU_data,MU_tablepos
	add.l   #242,MU_tablepos
	bra     MU_setnewpat
MU_playit:
	move.l  MU_songpointer,a0
	add.l   #16,MU_songpointer
	move.l  (a0),d0
	clr.w   d3
	move.w  #1,d2
	bsr     MU_setinstr
	bsr     MU_seteffect
	move.l  4(a0),d0
	move.w  #2,d2
	bsr     MU_setinstr
	bsr     MU_seteffect
	move.l  8(a0),d0
	move.w  #3,d2
	bsr     MU_setinstr
	bsr     MU_seteffect
	move.l  12(a0),d0
	move.w  #4,d2
	bsr     MU_setinstr
	bsr     MU_seteffect
	move.w  d3,$dff096
	rts

MU_setinstr:
	move.w  d0,d5
	and.w   #$f000,d0
	cmp.w   #0,d0
	bne     MU_setit
	rts

MU_setit:
	swap    d0
	move.w  d0,d1
	clr.w   d0
	swap    d0
	lsr.w   #8,d0
	lsr.w   #4,d0
	sub.w   #1,d0
	lsl.w   #4,d0
	move.l  MU_data,a6
	add.l   d0,a6
	cmp.w   #1,d2
	bne     MU_conti1
	clr.w   $dff0a8
	move.l  a6,MU_chan0
	move.l  (a6),$dff0a0
	move.w  4(a6),$dff0a4
	move.w  d1,$dff0a6
	move.w  d1,MU_note0
	move.w  6(a6),MU_vol0
	clr.w   MU_slide0
	bset    #0,d3
	rts

MU_conti1:
	cmp.w   #2,d2
	bne     MU_conti2
	clr.w   $dff0b8
	move.l  a6,MU_chan1
	move.l  (a6),$dff0b0
	move.w  4(a6),$dff0b4
	move.w  d1,$dff0b6
	move.w  d1,MU_note1
	move.w  6(a6),MU_vol1
	clr.w   MU_slide1
	bset    #1,d3
	rts

MU_conti2:
	cmp.w   #3,d2
	bne     MU_conti3
	clr.w   $dff0c8
	move.l  a6,MU_chan2
	move.l  (a6),$dff0c0
	move.w  4(a6),$dff0c4
	move.w  d1,$dff0c6
	move.w  d1,MU_note2
	move.w  6(a6),MU_vol2
	clr.w   MU_slide2
	bset    #2,d3
	rts

MU_conti3:
	clr.w   $dff0d8
	move.l  a6,MU_chan3
	move.l  (a6),$dff0d0
	move.w  4(a6),$dff0d4
	move.w  d1,$dff0d6
	move.w  d1,MU_note3
	move.w  6(a6),MU_vol3
	clr.w   MU_slide3
	bset    #3,d3
	rts

MU_seteffect:
	move.w  d5,d6
	and.w   #$00ff,d5
	and.w   #$0f00,d6
	cmp.w   #0,d6
	beq     MU_effjump2
	cmp.w   #$0100,d6
	beq     MU_slideup
	cmp.w   #$0200,d6
	beq     MU_slidedown
	cmp.w   #$0300,d6
	beq     MU_setvolume
	cmp.w   #$0500,d6
	beq     MU_posjump
	cmp.w   #$0400,d6
	bne     MU_nobreak
MU_itsabreak:
	move.w  #64,MU_patterncount
	rts

MU_nobreak:
	cmp.w   #$0800,d6
	bne     MU_effjump0
	move.w  d5,MU_songstep
	rts

MU_effjump0:
	cmp.w   #$0600,d6
	bne     MU_effjump1
	bclr    #1,$bfe001
	rts

MU_effjump1:
	cmp.w   #$0700,d6
	bne     MU_effjump2
	bset    #1,$bfe001
MU_effjump2:
	rts

MU_posjump:
	clr.l   d4
	move.w  d5,d4
	sub.l   #1,d4
	move.l  d4,MU_pospointer
	add.l   #1,d4
	lsl.w   #1,d4
	sub.w   #2,d4
	move.l  MU_data,a0
	add.l   #244,a0
	add.l   d4,a0
	move.l  a0,MU_tablepos
	bra     MU_itsabreak
MU_slideup:
	neg.w   d5
MU_slidedown:
	cmp.w   #1,d2
	bne     MU_j1
	move.w  d5,MU_slide0
	rts

MU_j1:
	cmp.w   #2,d2
	bne     MU_j2
	move.w  d5,MU_slide1
	rts

MU_j2:
	cmp.w   #3,d2
	bne     MU_j3
	move.w  d5,MU_slide2
	rts

MU_j3:
	move.w  d5,MU_slide3
	rts

MU_setvolume:
	cmp.w   #1,d2
	bne     MU_j00
	move.w  d5,MU_vol0
	;move.w  d5,$dff0a8
	rts

MU_j00:
	cmp.w   #2,d2
	bne     MU_j22
	move.w  d5,MU_vol1
	;move.w  d5,$dff0b8
	rts

MU_j22:
	cmp.w   #3,d2
	bne     MU_j33
	move.w  d5,MU_vol2
	;move.w  d5,$dff0c8
	rts

MU_j33:
	move.w  d5,MU_vol3
	;move.w  d5,$dff0d8
	rts

MU_everyvert:
	move.w  MU_slide0,d0
	add.w   d0,MU_note0
	move.w  MU_note0,$dff0a6
	move.w  MU_slide1,d0
	add.w   d0,MU_note1
	move.w  MU_note1,$dff0b6
	move.w  MU_slide2,d0
	add.w   d0,MU_note2
	move.w  MU_note2,$dff0c6
	move.w  MU_slide3,d0
	add.w   d0,MU_note3
	move.w  MU_note3,$dff0d6
	btst    #0,MU_stop
	beq     MU_ok1
	bclr    #0,MU_stop
	move.l  MU_chan0,a0
	move.l  8(a0),$dff0a0
	move.w  12(a0),$dff0a4
	clr.l   MU_chan0
MU_ok1:
	btst    #1,MU_stop
	beq     MU_ok2
	bclr    #1,MU_stop
	move.l  MU_chan1,a0
	move.l  8(a0),$dff0b0
	move.w  12(a0),$dff0b4
	clr.l   MU_chan1
MU_ok2:
	btst    #2,MU_stop
	beq     MU_ok3
	bclr    #2,MU_stop
	move.l  MU_chan2,a0
	move.l  8(a0),$dff0c0
	move.w  12(a0),$dff0c4
	clr.l   MU_chan2
MU_ok3:
	btst    #3,MU_stop
	beq     MU_ok4
	bclr    #3,MU_stop
	move.l  MU_chan3,a0
	move.l  8(a0),$dff0d0
	move.w  12(a0),$dff0d4
	clr.l   MU_chan3
MU_ok4:
	move.w   #$8000,d3
	cmp.l    #0,MU_chan0
	beq      MU_okk1
	bset     #0,MU_stop
	bset     #0,d3
MU_okk1:
	cmp.l    #0,MU_chan1
	beq      MU_okk2
	bset     #1,MU_stop
	bset     #1,d3
MU_okk2:
	cmp.l    #0,MU_chan2
	beq      MU_okk3
	bset     #2,MU_stop
	bset     #2,d3
MU_okk3:
	cmp.l    #0,MU_chan3
	beq      MU_okk4
	bset     #3,MU_stop
	bset     #3,d3
MU_okk4:
	move.w   d3,$dff096
	move.w   MU_vol0,$dff0a8
	move.w   MU_vol1,$dff0b8
	move.w   MU_vol2,$dff0c8
	move.w   MU_vol3,$dff0d8
	rts

	********** variables *****
MU_stop:  dc.w 0
MU_slide0: dc.w 0
MU_slide1: dc.w 0
MU_slide2: dc.w 0
MU_slide3: dc.w 0
MU_chan0: dc.l 0
MU_chan1: dc.l 0
MU_chan2: dc.l 0
MU_chan3: dc.l 0
MU_note0: dc.w 0
MU_note1: dc.w 0
MU_note2: dc.w 0
MU_note3: dc.w 0
MU_vol0: dc.w 0
MU_vol1: dc.w 0
MU_vol2: dc.w 0
MU_vol3: dc.w 0
MU_songspeed: dc.w 0
MU_songstep: dc.w 5
MU_patterncount: dc.w 0
MU_songpointer: dc.l 0
MU_tablepos: dc.l 0
MU_pospointer: dc.l 0 
MU_data: dc.l  0

;
;
	SECTION GMCData,Data_C
;
;

MU_empty: dcb.l 2,0

	*************************************************
	*************************************************

