
;------------------------------------------------------------------------------
;                REPLAYER SOURCE WITH INFORMATION FOR ALL CODERS
;------------------------------------------------------------------------------
;                         WRITTEN BY : mc68000 of TECH
;------------------------------------------------------------------------------

mt_replayinit=0
mt_songinit=2
mt_replayer=6
mt_stopsound=10
mt_fillstruct=14

	section	"song_replay",code_p

; YOU MUST CALL 2 DIFFERENT INIT ROUTINES, ONE INIT THE WHOLE REPLAYER ROUTINE,
; THE OTHER INIT THE SOUND YOU WANT TO PLAY !!!!
; YOU MUST START THEM BEFORE STARTING THE REPLAYCODE !! (IF NOT -> BYE BYE ...)

start
	lea	$dff000,a6
	lea	mt_data,a5			;this is my songbase

; FIRST LET US INIT THE REPLAYER !!!
; PARAMETER IN D0 : 0 = USE LEVEL 6 INTERUPT FOR DMA-REGISTER INIT
;                   1 = USE STANDART RASTERTIME-WAITING CODE (SLOWER)

	moveq	#0,d0
	jsr	mt_replayinit(a5)

; NOW LET'S INIT THE SOUND ... 
; PARAMETER IN D0 : SONGNUMBER (FIRST = 1)

	moveq	#1,d0
	jsr	mt_songinit(a5)

; LET'S PLAY THE WHOLE THING USING THE VBLANC INTERUPT ...

	move.w	$1c(a6),d7
	bset	#15,d7				;save old interupt status
	move.w	#$7fff,$9a(a6)
	move.l	$6c.w,d6			;save old vblanc
	lea	newint(pc),a0
	move.l	a0,$6c.w			;set our new interupt
	move.w	#$c020,$9a(a6)			;and start it ....

	move.l	#$10002,d1

buttwait
	btst	#10,$16(a6)
	bne.b	nonewsong			;rechte maustaste = swap sounds
wait2	btst	#10,$16(a6)
	beq.b	wait2
	move.w	#$7fff,$9a(a6)
	swap	d1
	move.w	d1,d0
	jsr	mt_songinit(a5)
	move.w	#$c020,$9a(a6)
nonewsong
	btst	#6,$bfe001
	bne.b	buttwait			;wait for the left mousebutton

	move.w	#$7fff,$9a(a6)
	move.l	d6,$6c.w			;start system interupt
	move.w	d7,$9a(a6)			;and init system status

	jmp	mt_stopsound(a5)		;end song

;---------------------------- INTERUPT HANDLER	-------------------------------

newint

; THE REPLAYING THING ...
; PARAMETER IN D0 : MAXIMUM VOLUME

	movem.l	d0-a6,-(a7)
	moveq	#64,d0
	lea	mt_data,a5
	jsr	mt_replayer(a5)
	movem.l	(a7)+,d0-a6
	move.w	#$20,$dff09c
	rte

;--------------------------------- THE SONG -----------------------------------

	section	"song_data",data_c
	incdir	dh0:
mt_data	incbin	mod.test

;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;
; YOU WANT TO CODE AN EQUILIZER ??? OR A SCOPE ??? OR ANOTHER SOUND SHOWER ???
;
;                           N O    P R O B L E M   ! ! ! !
;
; IF YOU HAVE CODED A THING LIKE THAT WITH A "NORMAL" REPLAY ROUTINE, IT'S NO
; PROBLEM FOR YOU TO DO THE SAME WITH THIS REPLAYER !!!
;
; I HAVE PUT A LITTLE ROUTINE IN THE REPLYER, THAT FILLS YOU A 28 BYTES LONG 
; STRUCTURE WITH POINTERS ON IMPORTENT SONG INFORMATIONS.
;
; STRUCT : 
;
; 	OFFSET: 	SIZE:  		MEANING:
;
; 		0		4       	CHAN_1_TEMP 
; 		4		4        	CHAN_2_TEMP 
; 		8 		4        	CHAN_3_TEMP 
;		12		4        	CHAN_4_TEMP 
;		16		4 		SONG_POSITION
;		20		4		NOTE_WAIT_COUNTER
;		24		4		PERIODTABLE
;
; BUT HOW TO CALL IT ???
;
; lea	struct(pc),a0		;POINTER OF YOUR STRUCT
; jsr 	mt_fillstruct(a5)	;A5=SONGBASE
;
; LOOK IN THE SCOPE_PLAYER HOW TO WORK WITH THIS POINTERS !!!
;
;------------------------------------------------------------------------------
;
; CHAN_X_TEMP_STRUCT :
;
; 	OFFSET: 	SIZE:  		MEANING:
;		0		2		NEW PERIOD (OR 0 FOR NO PLAY)
;		2		2		REST OF NOTE (1 NOTE = 4 BYTES)
;		4		4		SAMPLESTART
;		8		2		SAMPLE LENGHT
;		10		4		LOOPSTART
;		14		2		LOOPLENGTH
;		16		2		PERIOD
;		...		...		NOT IMPORTENT
;		19		1		VOLUME
;		...		...		NOT IMPORTENT
;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------

