*************************************************
* Elite Music by Wally Beben (1988).		*
* Adapted by Mr.STYCKX / Nicolas Pomarede	*
*						*
* Original replay was in $59dc.			*
* (very similar to CUST.HammerFist).		*
*						*
* Ripped : 16/05/96				*
* Relocated : 17/05/96				*
* EaglePlayer / Delitracker port : 17/05/96	*
*	Volume					*
*	Balance					*
*	SubSong	(only 1)			*
*	EP_Voices				*
*	EP_StructInit (Analyzer)		*	
*************************************************

	opt	o+

	output	ram:CUST.Elite


EL_TEST		=	0		; 0 => BUILD COMPLETE CUSTOM MODULE
					; 1 => BUILD SMALL CODE FOR TESTING

	section EliteCode,code


	incdir	"Include:"
	include	"misc/DeliPlayer.i"
	include	"misc/EaglePlayer.i"


	IFEQ	EL_TEST-0			; COMPLETE VERSION


	PLAYERHEADER PlayerTagArray

	dc.b '$VER: Elite Music (1988) custom player V1.0, '
	dc.b 'ripped and adapted by Mr.STYCKX (05/96)',0

	EVEN

PlayerTagArray
	dc.l	DTP_CustomPlayer,1		; CustomPlayer - Tag (important !!!)
	dc.l	DTP_Flags,PLYF_CUSTOM

	dc.l	DTP_PlayerVersion,1<<16+0	; v1.0
	dc.l	EP_PlayerVersion,1
	dc.l	DTP_PlayerName,PName
	dc.l	DTP_Creator,CName

	dc.l	DTP_InitPlayer,InitPlay		; alloc audio
	dc.l	DTP_EndPlayer,EndPlay		; free audio
	dc.l	DTP_InitSound,EL_init		; init custom data
	dc.l	DTP_EndSound,EL_end		; clear DMA

	dc.l	DTP_SubSongRange,EL_SubSongRange

	dc.l	DTP_Interrupt,EL_Play

	dc.l	DTP_Volume,EL_Volume
	dc.l	DTP_Balance,EL_Volume

	dc.l	EP_Voices,EL_SetVoices
	dc.l	EP_StructInit,EL_StructInit

	dc.l	EP_Flags,EPB_Voices!EPB_Analyzer!EPB_Volume!EPB_Balance

	dc.l	TAG_DONE


PName	dc.b	"Elite Custom v1.0",0
CName	dc.b	"Music by Wally Beben (1988).",$a
	dc.b	"Adapted by Mr.STYCKX (17/05/96)",0

	EVEN


EL_StructAnalyzer			; transmis à EaglePlayer pour gérer
	ds.l	UPS_SizeOF		; les analyzers



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

InitPlay
	move.l	dtg_AudioAlloc(a5),a0		; Function
	jmp	(a0)


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

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


*-----------------------------------------------------------------------*
;
; Init Custom Replay Routine

EL_init
	move.w	dtg_SndNum(a5),d0	; sub song nbr (1..7)
	bsr	EL_InitSong

	rts


*-----------------------------------------------------------------------*
;
; Clear Audio Reg.

EL_end
	move.w	#$f,$dff096
	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8

	rts


*-----------------------------------------------------------------------*
;
; Interrupt routine called every 1/50 s

EL_Play
	bsr	EL_InterVBL
	rts


*-----------------------------------------------------------------------*
;
; Returns min and max sub song (only one subsong)

EL_SubSongRange
	moveq	#1,d0			; min
	moveq	#1,d1			; max

	rts


*-----------------------------------------------------------------------*
;
; Set Volume

EL_Volume
	move.w	dtg_SndLBal(a5),d0	; Vol Left
	mulu	dtg_SndVol(a5),d0	; Vol Max
	lsr.w	#6,d0
	move.w	d0,EL_MasterVolA	; final Vol Left
	move.w	d0,EL_MasterVolD

	move.w	dtg_SndRBal(a5),d0
	mulu	dtg_SndVol(a5),d0
	lsr.w	#6,d0
	move.w	d0,EL_MasterVolB
	move.w	d0,EL_MasterVolC

	rts


*-----------------------------------------------------------------------*
;
; Set DMA Voices

EL_SetVoices
	move.w	d0,EL_DMA_EP	; bit=1 <=> voice is ON

	rts


*-----------------------------------------------------------------------*
;
; Returns address of the UPS structure to EaglePlayer

EL_StructInit
	lea	EL_StructAnalyzer(pc),a0

	rts



*-----------------------------------------------------------------------*


	ELSEIF				; TESTVERSION


;-------
; Small code to test the player under a debugger


	bsr	Run
	bra	Stop

Run
	moveq	#1,d0
	bsr	EL_InitSong

	lea	Jmp+2(PC),A0
	move.l	$6C.W,(A0)
	lea	Vbl(PC),A0
	move.l	A0,$6C
	move.w	#$C020,$DFF09A
	rts

Stop
	move.l	Jmp+2(PC),$6C
	moveq	#0,D0
	bsr	EL_InitSong
	rts

Vbl
	btst	#5,$dff01f
	beq.s	Jmp

.wa	cmp.b	#60,$dff006
	blt.s	.wa

	move.w	#$700,$dff180

	jsr	EL_InterVBL(PC)

	move.w	#$567,$dff180

Jmp	jmp	0.l


EL_StructAnalyzer			; transmis à EaglePlayer pour gérer
	ds.l	UPS_SizeOF		; les analyzers


	ENDC



;------------------------------------------------------------------------
; Données pour EaglePlayer / Delitracker

EL_DMA_EP	dc.w	%1111		; voix actives depuis EaglePlayer

EL_MasterVolA	dc.w	64		; 0 .. 64
EL_MasterVolB	dc.w	64
EL_MasterVolC	dc.w	64
EL_MasterVolD	dc.w	64

EL_StructA	dc.l	EL_StructAnalyzer
EL_StructB	dc.l	EL_StructAnalyzer+UPS_Modulo
EL_StructC	dc.l	EL_StructAnalyzer+UPS_Modulo*2
EL_StructD	dc.l	EL_StructAnalyzer+UPS_Modulo*3

EL_OldPer1	dc.w	-1
EL_OldPer2	dc.w	-1
EL_OldPer3	dc.w	-1
EL_OldPer4	dc.w	-1


FakeDma		dc.w	0

EL_VertPos	dc.w	0



;-----------------------------------------------------------------------
; Elite Music
; Original music by Wally Beben (located in $59dc) in 1988.
; Relocated on 17/5/96 by Mr.STYCKX
;
; EL_InitSong : D0 = 1..1, only one subsong
; EL_InterVBL : called every VBL
;


OriginalPatternsAdr	=	$6c54
OriginalSamplesAdr	=	$59fc6




;-----------------------------------------------------------------------
; Reloge les subsongs et init la subsong D0 (1..1)

EL_InitSong
	bsr.s	EL_RelocAdr

	move.b	d0,EL_SongNbr
	bsr	EL_StopSong
	rts


;-----------------------------------------------------------------------
; Reloge les adresses des patterns et des samples

EL_RelocAdr
	movem.l	d0-d1/a0-a1,-(sp)

	moveq	#15-1,d0		; 15 samples
	lea	SamplesAdr(pc),a0
	move.l	#SamplesBuf,d1
	cmp.l	(a0),d1			; déjà relogé
	beq.s	.done

	sub.l	#OriginalSamplesAdr,d1
.RelSamples
	add.l	d1,(a0)+
	dbf	d0,.RelSamples

	move.w	#44-1,d0		; 44 patterns
	lea	PatternsAdr(pc),a0
	move.l	#PatternsBuf,d1
	sub.l	#OriginalPatternsAdr,d1
.RelPatterns
	add.l	d1,(a0)+
	dbf	d0,.RelPatterns

.done	movem.l	(sp)+,d0-d1/a0-a1
	rts


;-----------------------------------------------------------------------
; Routine appelée à chaque VBL

EL_InterVBL
	movem.l	D0-D7/A0-A6,-(SP)

	lea	EL_StructAnalyzer(pc),a0
	move.w	#-1,UPS_Enabled(a0)
	move.w	#UPSB_Adr!UPSB_Len!UPSB_Per!UPSB_Vol!UPSB_DMACon,UPS_Flags(a0)

	move.w	EL_DMA_EP(pc),UPS_DMACon(a0)

	move.w	UPS_Voice1Per(a0),EL_OldPer1
	move.w	UPS_Voice2Per(a0),EL_OldPer2
	move.w	UPS_Voice3Per(a0),EL_OldPer3
	move.w	UPS_Voice4Per(a0),EL_OldPer4

	clr.w	UPS_Voice1Per(a0)
	clr.w	UPS_Voice2Per(a0)
	clr.w	UPS_Voice3Per(a0)
	clr.w	UPS_Voice4Per(a0)

	bsr.s	EL_VBL2

	; La replay d'HammerFist remet la période à chaque VBL,ce qui perturbe
	; les analyzers. On ne transmet donc une période que si elle est
	; différente de la VBL précédente.

	lea	EL_StructAnalyzer(pc),a0
	move.w	UPS_Voice1Per(a0),d0
	cmp.w	EL_OldPer1(pc),d0	; nouvelle fréquence
	bne.s	.2			; oui
	clr.w	UPS_Voice1Per(a0)	; non, on remet a 0

.2	move.w	UPS_Voice2Per(a0),d0
	cmp.w	EL_OldPer2(pc),d0
	bne.s	.3
	clr.w	UPS_Voice2Per(a0)

.3	move.w	UPS_Voice3Per(a0),d0
	cmp.w	EL_OldPer3(pc),d0
	bne.s	.4
	clr.w	UPS_Voice3Per(a0)

.4	move.w	UPS_Voice4Per(a0),d0
	cmp.w	EL_OldPer4(pc),d0
	bne.s	.0
	clr.w	UPS_Voice4Per(a0)
.0

	clr.w	UPS_Enabled(a0)

	movem.l	(SP)+,D0-D7/A0-A6
	rts


;-----------------------------------------------------------------------
; Routine VBL principale (teste si changement de subsong)

EL_VBL2
	moveq	#0,D0
	moveq	#0,D1
	moveq	#0,D2
	moveq	#0,D3
	moveq	#0,D4
	moveq	#0,D5
	moveq	#0,D6
	moveq	#0,D7
	move.b	EL_SongNbr(pc),D0
	bne.s	lbC000142
	move.b	D0,MusicActive		; OFF
	bsr	EL_StopVol
	bra	EndVBL


;----------------------------------------
; Teste s'il s'agit d'une autre subsong

lbC000142
	moveq	#2,D1			; max subsong ***
	cmp.b	D0,D1
	bcs	SameSubSong
NewSubSong
	subq.w	#1,D0
	asl.w	#4,D0			; 4 mots longs par subsong
	lea	SongPatterns(pc),A0
	add.w	D0,A0
	lea	lbL000CD2(pc),A1
	move.l	(A0)+,(A1)+
	move.l	(A0)+,(A1)+
	move.l	(A0)+,(A1)+
	move.l	(A0),(A1)
	moveq	#3,D1
	moveq	#0,D0
.initvoice
	lea	VoicesData(pc),A0
	add.w	D1,A0
	move.b	D0,$14(A0)
	move.b	D0,$18(A0)
	move.b	D0,12(A0)
	bsr.s	lbC0001A2
	dbra	D1,.initvoice
	bsr	EL_StopSong
	move.b	#1,MusicActive		; ON
	move.b	#15,lbB000C86
	bra	EndVBL


;----------------------------------------
; Initialise une voix en A0

lbC0001A2	lea	lbL000CD2(pc),A1
	move.w	D1,D2
	asl.w	#2,D2
	add.w	D2,A1
	move.l	(A1),lbL000CE2
lbC0001B4	lea	lbL000CE2(pc),A1
	move.l	(A1),A1
	moveq	#0,D0
	move.b	12(A0),D0
	addq.b	#1,12(A0)
	add.w	D0,A1
	move.b	(A1),D0
	cmp.b	#$C0,D0
	bls.s	lbC0001F4
	cmp.b	#$FF,D0
	bne.s	lbC0001E2
	clr.b	12(A0)
	bra.s	lbC0001B4

lbC0001E2	add.w	#$20,D0
	move.b	D0,$20(A0)
	bra.s	lbC0001B4

lbC0001F4	asl.w	#2,D0
	lea	lbL000E7A(pc),A1
	add.w	D0,A1
	lea	lbL000CC2(pc),A2
	move.l	(A1),0(A2,D2.W)
	move.l	(A1),lbL000CE6
	moveq	#0,D0
	rts

;----------------------------------------
; Continue à jouer la subsong actuelle déjà initialisée

SameSubSong
	tst.b	MusicActive
	beq	EndVBL
	move.b	#3,ActualVoice
lbC000224	lea	VoicesData(pc),A0
	moveq	#0,d1
	move.b	ActualVoice(pc),D1
	move.w	D1,D2
	asl.b	#2,D2
	move.w	D2,ActualVoicex4	; pour adresser des mots longs
	move.w	D1,D2
	asl.b	#1,D2
	move.w	D2,ActualVoicex2	; pour adresser des mots
	add.w	D1,A0
	move.b	(A0),lbB000C82
	tst.b	lbB000C7D
	bne.s	lbC0002A8
	subq.b	#1,$14(A0)
	tst.b	$70(A0)
	bne.s	lbC00027A
	tst.b	$14(A0)
	beq.s	lbC000270
	bra.s	lbC00027A

lbC000270	bset	D1,lbB000C86
	bra.s	lbC000282

lbC00027A	tst.b	$14(A0)
	bmi.s	lbC0002BE
lbC000282	tst.b	$2C(A0)
	bne.s	lbC000296
	tst.b	$30(A0)
	bne.s	lbC0002A2
	bra.s	lbC0002BA

lbC000296	subq.b	#1,8(A0)
lbC00029A	bsr	lbC000B00
	bra	lbC000776

lbC0002A2	addq.b	#1,8(A0)
	bra.s	lbC00029A

lbC0002A8	tst.b	$34(A0)
	beq.s	lbC0002BA
	clr.b	$34(A0)
	subq.b	#2,8(A0)
	bra.s	lbC00029A

lbC0002BA	bra	lbC0004F6

lbC0002BE	cmp.b	#2,$18(A0)
	beq.s	lbC0002D0
	clr.b	$18(A0)
	clr.b	$1C(A0)
lbC0002D0	clr.b	lbB000C81
	clr.b	$24(A0)
	clr.b	$2C(A0)
	clr.b	$30(A0)
	clr.b	$6C(A0)
	lea	lbL000CC2(pc),A1
	add.w	ActualVoicex4(pc),A1
	move.l	(A1),lbL000CE6
lbC0002F8	moveq	#0,D4
	moveq	#0,D0
	move.b	lbB000C81(pc),D4
	addq.b	#1,lbB000C81
	move.l	lbL000CE6(pc),A3
	move.b	(A3)+,D0
	addq.b	#1,D4
	cmp.b	#$FF,D0
	bne.s	lbC000328
	moveq	#0,D0
lbC00031C	bsr	lbC0001A2
	clr.b	lbB000C81
	bra.s	lbC0002F8

lbC000328	cmp.b	#$FE,D0
	bne.s	lbC00033C
	clr.b	EL_SongNbr
lbC000336	moveq	#0,D0
	bra	EL_VBL2

lbC00033C	cmp.b	#$FC,D0
	bne.s	lbC00034C
	move.b	(A3),EL_SongNbr
	bra.s	lbC000336

lbC00034C	cmp.b	#$EF,D0
	bls.s	lbC000362
	and.b	#15,D0
	move.b	D0,lbB000C7C
	move.b	(A3)+,D0
	addq.b	#1,D4

lbC000362
***	cmp.b	#$E0,D0
***	bne.s	lbC000382
	cmp.b	#$DF,D0
	bls.s	lbC000382
***	move.b	(A3)+,D0
	and.b	#$f,d0
	asl.b	#3,D0
	move.b	D0,$4C(A0)
	move.b	(A3)+,D0
***	addq.b	#2,D4
	addq.b	#1,D4
	cmp.b	#$FF,D0
	bne.s	lbC000382
	moveq	#0,D0
	bra.s	lbC00031C

lbC000382	cmp.b	#$BF,D0
	bls.s	lbC0003A6
	and.b	#$1F,D0
	asl.b	#3,D0
	move.b	D0,$50(A0)
	move.b	(A3)+,D0
	addq.b	#1,D4
	cmp.b	#$FF,D0
	bne.s	lbC0003A6
	moveq	#0,D0
	bra.s	lbC00031C

lbC0003A6	cmp.b	#$7F,D0
	bls.s	lbC0003BA
	and.b	#$3F,D0
	move.b	D0,$10(A0)
	move.b	(A3)+,D0
	addq.b	#1,D4
lbC0003BA	cmp.b	#$5F,D0
	bls.s	lbC0003DE
	cmp.b	#$7F,D0
	bne.s	lbC0003E2
	move.b	#1,$2C(A0)
	clr.b	$30(A0)
lbC0003D4	move.b	#1,$18(A0)
lbC0003DA	move.b	(A3)+,D0
	addq.b	#1,D4
lbC0003DE	bra.s	lbC00045C

lbC0003E2	cmp.b	#$7E,D0
	bne.s	lbC0003F6
	move.b	#1,$30(A0)
	clr.b	$2C(A0)
	bra.s	lbC0003D4

lbC0003F6	cmp.b	#$7D,D0
	bne.s	lbC00041A
	move.b	#1,D0
lbC000402	move.b	D0,$18(A0)
	move.b	(A3)+,D0
	addq.b	#1,D4
	move.b	D0,$1C(A0)
	move.b	D0,lbB000C80
	bsr	lbC0008E8
	bra.s	lbC0003DA

lbC00041A	cmp.b	#$7C,D0
	bne.s	lbC000428
	moveq	#2,D0
	bra.s	lbC000402

lbC000428	cmp.b	#$7B,D0
	bne.s	lbC00044C
	clr.b	$1C(A0)
	move.b	#1,$18(A0)
	move.b	(A3)+,D0
	add.b	$20(A0),D0
	move.b	D0,$24(A0)
	move.b	(A3)+,$28(A0)
	addq.b	#2,D4
	bra.s	lbC0003DA

lbC00044C	cmp.b	#$7A,D0
	bne.s	lbC00045C
	move.b	(A3)+,$44(A0)
	move.b	(A3),D0
	addq.b	#2,D4
lbC00045C	bclr	D1,lbB000C86
	moveq	#0,d5
	move.b	$64(A0),D5
	move.w	D5,$DFF096		; stoppe la voix audio en cours
	move.b	D4,lbB000C81
	movem.l	D0-D7/A0-A6,-(SP)
	bsr	lbC000A52
	bsr	lbC0009EC
	movem.l	(SP)+,D0-D7/A0-A6
	add.b	$20(A0),D0
	move.b	D0,8(A0)
	beq.s	lbC0004BC
	tst.b	$1C(A0)
	bne.s	lbC0004BC
	moveq	#0,d4
	move.b	$50(A0),D4
	lea	lbL001016(pc),A1
	add.w	D4,A1
	tst.b	$34(A0)
	beq.s	lbC0004BC
	addq.b	#2,8(A0)
lbC0004BC	bsr	lbC000B00
	lea	lbL000CC2(pc),A1
	add.w	ActualVoicex4(pc),A1
	moveq	#0,d0
	move.b	lbB000C81,D0
	add.l	D0,(A1)
	moveq	#0,D0
	move.b	$10(A0),$14(A0)
	move.b	$44(A0),$48(A0)
	move.b	4(A0),$38(A0)
	addq.b	#1,$38(A0)
lbC0004F2	bra	lbC000776

lbC0004F6	tst.b	8(A0)
	beq.s	lbC0004F2
	tst.b	$18(A0)
	bne.s	lbC000512
	tst.b	$68(A0)
	bne.s	lbC00053C
	move.b	$4E(A0),$80(A0)
lbC000512	bra	lbC00065E


lbC00053C	movem.l	D0-D7/A0-A6,-(SP)
	move.b	$68(A0),D0
	move.b	D0,lbB000C7F
	and.b	#15,lbB000C7F
	lsr.b	#4,D0
	move.b	D0,lbB000C7E
	moveq	#0,d0
	move.b	8(A0),D0
	asl.b	#1,D0
	lea	PerTable(pc),A1
	add.l	D0,A1
	move.w	(A1)+,D0
	sub.w	(A1),D0
	move.w	D0,lbW000CEA
lbC000578	subq.b	#1,lbB000C7F
	bmi.s	lbC000598
	lsr.w	lbW000CEA
	or.w	#1,lbW000CEA
	bra.s	lbC000578

lbC000598	tst.b	$3C(A0)
	bpl.s	lbC0005B4
	subq.b	#1,$40(A0)
	tst.b	$40(A0)
	bne.s	lbC0005D0
	addq.b	#1,$3C(A0)
	bpl.s	lbC0005D0
lbC0005B4	addq.b	#1,$40(A0)
	moveq	#0,d0
	move.b	$40(A0),D0
	cmp.b	lbB000C7E(pc),D0
	bls.s	lbC0005D0
	subq.b	#1,$3C(A0)
lbC0005D0	tst.b	$48(A0)
	beq.s	lbC0005E0
	subq.b	#1,$48(A0)
	bra.s	lbC000656

lbC0005E0	lea	lbL000C88(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	(A1),lbW000CEE
	moveq	#0,d0
	move.b	lbB000C7E(pc),D0
	lsr.b	#1,D0
	move.b	D0,D4
lbC000602	subq.b	#1,D4
	bmi.s	lbC00061C
	move.w	lbW000CEE(pc),D0
	add.w	lbW000CEA(pc),D0
	move.w	D0,lbW000CEE
	bra.s	lbC000602

lbC00061C	move.b	$40(A0),D4
lbC000626	subq.b	#1,D4
	bmi.s	lbC000642
	move.w	lbW000CEE(pc),D0
	sub.w	lbW000CEA(pc),D0
	move.w	D0,lbW000CEE
	bra.s	lbC000626

lbC000642	move.w	lbW000CEE(pc),D0
	lea	VoicesPer(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	D0,(A1)
lbC000656	movem.l	(SP)+,D0-D7/A0-A6
	bra	lbC000776

lbC00065E	tst.b	$1C(A0)
	beq.s	lbC0006BE
	movem.l	D0-D7/A0-A6,-(SP)
lbC00066A
	moveq	#0,d4
	move.b	$38(A0),D4
	lea	lbL000CFA(pc),A1
	add.w	D4,A1
	moveq	#0,d0
	move.b	(A1),D0
	cmp.b	#$FF,D0
	bne.s	lbC000694
	move.b	4(A0),$38(A0)
	bra.s	lbC00066A

lbC000694	add.b	8(A0),D0
	lea	PerTable(pc),A1
	asl.b	#1,D0
	add.w	D0,A1
	move.w	(A1),D0
	lea	VoicesPer(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	D0,(A1)
	addq.b	#1,$38(A0)
	movem.l	(SP)+,D0-D7/A0-A6
	bra	lbC000776

lbC0006BE	tst.b	$24(A0)
	beq	lbC000776
	move.b	$24(A0),lbB000949
	move.b	$28(A0),D0
	and.b	#15,D0
	move.b	D0,lbB0006F7
	move.b	D0,lbB0009D3
	move.b	$28(A0),D0
	lsr.b	#4,D0
	add.b	$14(A0),D0
	cmp.b	$10(A0),D0
	bgt.s	lbC00076A
	add.b	lbB0006F7(pc),D0
***
	cmp.b	$C(A0),D0
	bls.s	lbC000750
	move.b	8(A0),D5
	movem.l	D0-D7/A0-A6,-(SP)
	bsr	lbC000946
	movem.l	(SP)+,D0-D7/A0-A6
	lea	lbL000C88(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	(A1),D0
	lea	lbL000C98(pc),A2
	tst.b	lbB000C84
	beq.s	lbC000736
	sub.w	(A2),D0
	move.w	D0,(A1)
	bra.s	lbC00073A




lbC000736	add.w	(A2),D0
	move.w	D0,(A1)
lbC00073A	lea	VoicesPer(pc),A2
	add.w	ActualVoicex2(pc),A2
	move.w	(A1),(A2)
	bra.s	lbC00076A


lbC000750	lea	lbL000C88(pc),A1
	add.w	ActualVoicex2(pc),A1
	lea	lbL000C90(pc),A6
	add.w	ActualVoicex2(pc),A6
	move.w	(A6),(A1)
lbC00076A	tst.b	$80(A0)
	beq.s	lbC000776
	bra	lbC00053C

lbC000776	moveq	#0,D4
	moveq	#0,D5
	moveq	#0,D6
	tst.b	$14(A0)
	beq.s	lbC000804
	tst.b	$6C(A0)
	bne.s	lbC0007D6
	move.b	$14(A0),D6
	tst.b	$70(A0)
	bne.s	lbC0007A2
	move.b	#1,$6C(A0)
	bra.s	lbC000804

lbC0007A2	move.b	$70(A0),D4
	cmp.b	#$FF,D4
	beq.s	lbC000804
	move.b	$10(A0),D5
	divu	D4,D5
	sub.b	D5,D6
	tst.b	D6
	beq.s	lbC0007D6
	move.b	$60(A0),D0
	move.b	$54(A0),D4
	cmp.b	D0,D4
	beq.s	lbC000804
	add.b	$58(A0),D0
	move.b	D0,$60(A0)
	bra.s	lbC000804

lbC0007D6	move.b	#1,$6C(A0)
	moveq	#0,D0
	move.b	$60(A0),D0
	move.b	$5C(A0),D4
	sub.b	D4,D0
	tst.b	D0
	beq.s	lbC0007FA
	bmi.s	lbC0007FA
	move.b	D0,$60(A0)
	bra.s	lbC000804

lbC0007FA	clr.b	$60(A0)
	bset	D1,lbB000C86
lbC000804	subq.b	#1,ActualVoice
	bmi.s	lbC000812
	bra	lbC000224


;----------------------------------------
;

lbC000812
	bsr	SetDMAPerVol
	moveq	#0,D0
	moveq	#3,D1
	moveq	#12,D2
	moveq	#6,D3
	moveq	#$30,D4
	moveq	#0,D5
	moveq	#0,D7

	move.b	EL_VertPos(pc),d0
.wa	cmp.b	$dff006,d0		; on doit attendre un nombre de lignes
	bgt.s	.wa			; minimal avant d'installer le Repeat

	lea	EL_StructAnalyzer+UPS_Modulo*3(pc),a3

.dovoice
	moveq	#0,D6
	lea	RepeatLens(pc),A6
	move.w	0(A6,D3.W),D0
	lsr.w	#1,D0
	lea	$DFF0A4,A5
	move.w	D0,0(A5,D4.W)
	moveq	#0,D0
	lea	VoicesRepeat(pc),A6
	move.b	0(A6,D1.W),D0
	bne.s	.repeat_on

;;	lea	RepeatStarts(pc),A6
;;	move.w	0(A6,D3.W),D6
;;	lea	lbL000D6E(pc),A6			; ***
;;	add.l	0(A6,D2.W),D6

	move.l	#EmptySample,d6
	move.w	#1,UPS_Voice1Repeat(a3)	; repeat OFF

	bra.s	.lbC000882

.repeat_on
	lea	RepeatStarts(pc),A6
	move.w	0(A6,D3.W),D6
	lea	CurrentSamples(pc),A6
	add.l	0(A6,D2.W),D6
	clr.w	UPS_Voice1Repeat(a3)	; repeat ON
.lbC000882
	lea	$DFF0A0,A5
	move.l	D6,0(A5,D4.W)
	subq.w	#4,D2
	subq.w	#2,D3
	sub.w	#$10,D4
	lea	-UPS_Modulo(a3),a3
	dbra	D1,.dovoice

	subq.b	#1,lbB000C7D
	bpl.s	EndVBL
	move.b	lbB000C7C(pc),lbB000C7D

EndVBL	move.b	#$FF,EL_SongNbr		; subsong traitée
	rts


;----------------------------------------
; Met le volume à 0

EL_StopVol
	moveq	#0,D0
	move.l	#$DFF0A8,A5
	move.w	D0,(A5)
	move.w	D0,$10(A5)
	move.w	D0,$20(A5)
	move.w	D0,$30(A5)
	clr.w	EL_StructAnalyzer+UPS_Voice1Vol
	clr.w	EL_StructAnalyzer+UPS_Voice2Vol
	clr.w	EL_StructAnalyzer+UPS_Voice3Vol
	clr.w	EL_StructAnalyzer+UPS_Voice4Vol
	lea	VoicesVol(pc),A5
	move.l	D0,(A5)
	rts


;----------------------------------------
; Coupe le volume et stoppe la replay

EL_StopSong
	bsr.s	EL_StopVol
	move.b	D0,lbB000C7D
	move.b	D0,MusicActive		; replay OFF
	rts


;----------------------------------------
;

lbC0008E8	movem.l	D0-D7/A0-A6,-(SP)
	moveq	#0,D4
	move.b	4(A0),D4
	addq.b	#1,D4
	moveq	#0,D5
lbC0008F6	moveq	#0,D0
	move.b	lbB000C80(pc),D0
	btst	#0,D0
	beq.s	lbC000920
	lea	lbL000E02(pc),A1
	add.w	D5,A1
	move.b	(A1),D0
	lea	lbL000CFA(pc),A1
	add.w	D4,A1
	move.b	D0,(A1)
	addq.w	#1,D4
	move.b	lbB000C80(pc),D0
lbC000920	lsr.b	#1,D0
	move.b	D0,lbB000C80
	addq.w	#1,D5
	cmp.b	#8,D5
	bne.s	lbC0008F6

	lea	lbL000CFA(pc),A1
	add.w	D4,A1
	move.b	#$FF,(A1)
	clr.b	$24(A0)
	movem.l	(SP)+,D0-D7/A0-A6
	rts



lbC000946
	move.b	lbB000949(pc),D4
	cmp.b	D4,D5
	bcc.s	lbC00098E
	move.b	#1,lbB000C84
	lea	PerTable(pc),A1
	asl.b	#1,D4
	add.w	D4,A1
	move.w	(A1),D4
	move.l	A6,-(SP)
	lea	lbL000C90(pc),A6
	add.w	ActualVoicex2(pc),A6
	move.w	D4,(A6)
	move.l	(SP)+,A6
	asl.b	#1,D5
	lea	PerTable(pc),A1
	add.w	D5,A1
	move.w	(A1),D5
	sub.w	D4,D5
	move.w	D5,lbL000C98
	bra.s	lbC0009C6

lbC00098E	clr.b	lbB000C84
	lea	PerTable(pc),A1
	asl.b	#1,D4
	add.w	D4,A1
	move.w	(A1),D4
	move.l	A6,-(SP)
	lea	lbL000C90(pc),A6
	add.w	ActualVoicex2(pc),A6
	move.w	D4,(A6)
	move.l	(SP)+,A6
	asl.b	#1,D5
	lea	PerTable(pc),A1
	add.w	D5,A1
	move.w	(A1),D5
	sub.w	D5,D4
	move.w	D4,lbL000C98
lbC0009C6	moveq	#0,D4
	move.b	lbB000C7C(pc),D4
	moveq	#0,D0
lbC0009D0
	add.b	lbB0009D3(pc),D0
	dbra	D4,lbC0009D0
	moveq	#0,D4
	moveq	#0,D5
	move.w	lbL000C98(pc),D5
	divu	D0,D5
	move.w	D5,lbL000C98
	rts


lbC0009EC	moveq	#0,D0
	move.b	$50(A0),D0
	lea	lbL001016(pc),A2
	add.w	D0,A2
	move.b	(A2),$60(A0)
	move.b	1(A2),$54(A0)
	move.b	2(A2),$58(A0)
	move.b	3(A2),$5C(A0)
	move.b	4(A2),$70(A0)
	move.b	5(A2),$68(A0)
	tst.b	6(A2)
	beq.s	lbC000A3A
	move.b	6(A2),$1C(A0)
	move.b	#$7C,$18(A0)
	move.b	6(A2),lbB000C80
	bsr	lbC0008E8
lbC000A3A	tst.b	7(A2)
	beq.s	lbC000A50
	move.b	7(A2),D0
	btst	#3,D0
	beq.s	lbC000A50
	move.b	#1,$27(A0)
lbC000A50	rts


;----------------------------------------
; Initialise AudioStart et AudioLen

lbC000A52	moveq	#0,D0
	move.b	$4C(A0),D0
	lea	SamplesInfos(pc),A1
	add.w	D0,A1
	move.b	(A1),D4
	move.b	1(A1),$78(A0)		; repeat ON/OFF
	bne.s	lbC000A76
	move.w	2(A1),D0
	bra.s	lbC000A7E

lbC000A76	move.w	4(A1),D0
	add.w	6(A1),D0
lbC000A7E	lea	RepeatLens(pc),A6
	add.w	ActualVoicex2(pc),A6
	move.w	6(A1),(A6)
	lea	RepeatStarts(pc),A6
	add.w	ActualVoicex2(pc),A6
	move.w	4(A1),(A6)
	lea	$DFF0A4,A5
	moveq	#0,d6
	move.b	lbB000C82(pc),D6
	lsr.w	#1,D0
	move.w	D0,0(A5,D6.W)
	lea	EL_StructA(pc),a5
	add.w	ActualVoicex4(pc),A5
	move.l	(a5),a5
	move.w	d0,UPS_Voice1Len(a5)

	btst	#1,$78(A0)		; toujours à 0
	beq.s	lbC000ADA

	;; jamais pris
	moveq	#0,D0
	move.w	4(A1),D0
	lea	SamplesAdr(pc),A1
	asl.l	#2,D4
	add.l	D4,(A1)
	add.l	D0,(A1)
	move.l	(A1),(A5,D6.W)
	bra.s	lbC000AEE

lbC000ADA
	lea	SamplesAdr(pc),A1
	asl.l	#2,D4
	lea	$DFF0A0,A5
	move.l	0(A1,D4.W),0(A5,D6.W)
	lea	EL_StructA(pc),a5
	add.w	ActualVoicex4(pc),A5
	move.l	(a5),a5
	move.l	(a1,d4.w),UPS_Voice1Adr(a5)

lbC000AEE	lea	CurrentSamples(pc),A5
	add.w	ActualVoicex4(pc),A5
	move.l	0(A1,D4.W),(A5)

	move.b	$dff006,d0
	addq.b	#8,d0			; attend un min de 8 lignes rasters
	move.b	d0,EL_VertPos

	rts


lbC000B00	move.b	8(A0),D0
	add.b	D0,D0
	lea	PerTable(pc),A1
	move.w	0(A1,D0.W),D0
	lea	lbL000C88(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	D0,(A1)
	lea	VoicesPer(pc),A1
	add.w	ActualVoicex2(pc),A1
	move.w	D0,(A1)
	rts


;----------------------------------------
; Met à jour DMA, Per et Vol

SetDMAPerVol
	movem.l	d0-d1/a0-a3,-(sp)

	lea	EL_StructAnalyzer(pc),a3
	lea	VoicesPer(pc),A0
	lea	$DFF0A6,A2
	move.w	(A0),(A2)
	move.w	(a0)+,UPS_Voice1Per(a3)
	move.w	(A0),$10(A2)
	move.w	(a0)+,UPS_Voice2Per(a3)
	move.w	(A0),$20(A2)
	move.w	(a0)+,UPS_Voice3Per(a3)
	move.w	(A0),$30(A2)
	move.w	(a0),UPS_Voice4Per(a3)

	move.b	lbB000C86(pc),D1
	not.b	D1
	and.w	#15,D1
	and.w	EL_DMA_EP(pc),d1	; garde les voix ON depuis EP
 	move.w	d1,UPS_DMACon(a3)
	or.w	#$8200,D1
	move.w	D1,$DFF096		; voix ON
	eor.w	#$820F,D1
	move.w	D1,$DFF096		; voix OFF

	lea	VoicesVol(pc),A1
	moveq	#0,D0
	move.b	(A1)+,D0
	move.w	d0,UPS_Voice1Vol(A3)
	mulu	EL_MasterVolA(pc),d0
	lsr.w	#6,d0
	move.w	D0,2(A2)
	move.b	(A1)+,D0
	move.w	d0,UPS_Voice2Vol(A3)
	mulu	EL_MasterVolB(pc),d0
	lsr.w	#6,d0
	move.w	D0,$12(A2)
	move.b	(A1)+,D0
	move.w	d0,UPS_Voice3Vol(A3)
	mulu	EL_MasterVolC(pc),d0
	lsr.w	#6,d0
	move.w	D0,$22(A2)
	move.b	(A1),D0
	move.w	d0,UPS_Voice4Vol(A3)
	mulu	EL_MasterVolD(pc),d0
	lsr.w	#6,d0
	move.w	D0,$32(A2)

	movem.l	(sp)+,d0-d1/a0-a3
	rts



;-----------------------------------------------------------------------
; Données


EL_SongNbr
	dc.b	0			; subsong choisie


lbB0006F7	dc.b	0		; remplace du code auto-modifié
lbB000949	dc.b	0
lbB0009D3	dc.b	0

	EVEN


PerTable				; $6924
	dc.w	$06B0,$0650
	dc.w	$05F4,$05A0
	dc.w	$054C,$0500
	dc.w	$04B8,$0474
	dc.w	$0434,$03F8
	dc.w	$03C0,$0388
	dc.w	$0358,$0328
	dc.w	$02FA,$02D0
	dc.w	$02A6,$0280
	dc.w	$025C,$023A
	dc.w	$021A,$01FC
	dc.w	$01E0,$01C5
	dc.w	$01AC,$0194
	dc.w	$017D,$0168
	dc.w	$0153,$0140
	dc.w	$012E,$011D
	dc.w	$010D,$00FE
	dc.w	$00F0,$00E2
	dc.w	$00D6,$00CA
	dc.w	$00BE,$00B4
	dc.w	$00A9,$00A0
	dc.w	$0097,$008E
	dc.w	$0087,$007F
	dc.w	$0078,$0071

VoicesPer
	dc.w	0,0,0,0

VoicesData				; $698e
	dc.l	$102030
	dc.l	$A141E
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
VoicesVol	dc.b	0,0,0,0		; lbL000C56
	dc.b	1,2,4,8			; $64(a0) : pour stopper une voix audio
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
VoicesRepeat	dc.b	0,0,1,0
	dc.l	0
	dc.l	0

ActualVoice
	dc.b	0			; 0..3, voix en cours de traitement

MusicActive
	dc.b	0			; 0=OFF, 1=ON

lbB000C7C	dc.b	0
lbB000C7D	dc.b	0

lbB000C7E	dc.b	0
lbB000C7F	dc.b	0
lbB000C80	dc.b	0
lbB000C81	dc.b	0

lbB000C82	dc.b	0
	dc.b	0
lbB000C84	dc.b	0
	dc.b	0
lbB000C86	dc.b	0		; DMA OFF
	dc.b	0
lbL000C88				; Per
	dc.w	0,0,0,0
lbL000C90	dc.l	0
	dc.l	0
lbL000C98	dc.l	0
	dc.l	0
	dc.w	0


CurrentSamples
	dc.l	0,0,0,0
RepeatLens
	dc.w	0,0,0,0
RepeatStarts
	dc.w	0,0,0,0


lbL000CC2				; $6a50
	dc.l	0,0,0,0
lbL000CD2				; $6a60
	dc.l	0,0,0,0
lbL000CE2				; $6a70
	dc.l	0
lbL000CE6				; $6a74
	dc.l	0


lbW000CEA	dc.w	0
	dc.w	0
lbW000CEE	dc.w	0
	dc.w	0

ActualVoicex4				; valeur de ActualVoice * 4
	dc.w	0			; 0,4,8,12
ActualVoicex2				; valeur de ActualVoice * 2
	dc.w	0			; 0,2,4,6


lbL000CFA				; $6a88
	dcb.l	10,0


SamplesAdr				; $6ab0, 15 adresses
	dc.l	$59FC6
	dc.l	$5C28A
	dc.l	$5E86E
	dc.l	$609A2
	dc.l	$62F86
	dc.l	$65632
	dc.l	$67AEA
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84
	dc.l	$68B84



lbL000D6E				; $4fd98
	dc.l	EmptySample
	dc.l	0,0


SamplesInfos				; $6aec, 7 samples
	; .B SmplNbr (dans SamplesAdr)
	; .B Repeat ON/OFF (0=OFF)
	; .W Len
	; .W .W RepStart RepLen

	dc.w	$0000,$22C4,$0000,$0002
	dc.w	$0101,$25E4,$116E,$103C
	dc.w	$0201,$2134,$07C8,$17F2
	dc.w	$0301,$25E4,$0A00,$1564
	dc.w	$0401,$26AC,$01F4,$222E
	dc.w	$0500,$24B8,$0000,$0002
	dc.w	$0601,$109A,$0260,$099E


lbL000E02
	dc.b	3,4,5,7,8,9,$A,$C


PatternsAdr				; 44 adresses
SongPatterns				; $6ba4, 1 subsong
	dc.l	$06C54,$06C65,$06C76,$06C87

lbL000E7A				; $6bb4
	dc.l	$06C98,$06C9D,$06CEC,$06D1F
	dc.l	$06D3D,$06D58,$06DA0,$06DD2
	dc.l	$06E05,$06E34,$06E87,$06EBB
	dc.l	$06EEF,$06F23,$06F6B,$06F9C
	dc.l	$06FCD,$07000,$07045,$0707F
	dc.l	$070B8,$070EF,$070F7,$070FC
	dc.l	$07104,$0713F,$07174,$071A7
	dc.l	$07205,$07236,$0726C,$072A2
	dc.l	$072D8,$07312,$07351,$07385
	dc.l	$073BC,$07416,$0744F,$07488


lbL001016				; $6b24
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$363C0102
	dc.l	$01000000
	dc.l	$2C320102
	dc.l	$01000000
	dc.l	$34340001
	dc.l	$00000000
	dc.l	$383C0104
	dc.l	$00000000
	dc.l	$28280001
	dc.l	$01000000
	dc.l	$28280004
	dc.l	$00000000
	dc.l	$282C0101
	dc.l	$01000000
	dc.l	$18180002
	dc.l	$00000000
	dc.l	$18180002
	dc.l	$01000000
	dc.l	$3A3A0001
	dc.l	$01000000
	dc.l	$34340001
	dc.l	$01000000
	dc.l	$141E0201
	dc.l	$01000000
	dc.l	$1E1E0001
	dc.l	$00000000


PatternsBuf				; $6c54, 2158 octets
	incbin	b:Elite/Elite.pat



;-----------------------------------------------------------------------
; Données en CHIP


	section Samples,data_c


EmptySample
	dc.l	0,0

SamplesBuf				; $59fc6, 60350 octets
	incbin	b:Elite/Elite.smp

;-----------------------------------------------------------------------
; END
	end

