*************************************************
* Airball Musics by P.Shields and P.Hunter	*
* Adaptated by Mr.STYCKX / Nicolas Pomarede	*
*						*
* Original replay was in $5ff2			*
* Original musics+samples were in $ecb8		*
*						*
* Ripped : Sept/94.				*
* Relocated : 24/03/96, 29/03/96		*
* EaglePlayer / DeliTracker port : 07/04/96	*
*	Volume					*
*	Balance					*
*	SubSong					*
*	EP_Voices				*
*	EP_StructInit (Analyzer)		*
*************************************************

	opt	o+

	output	ram:CUST.Airball


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


	section	AirballReplay,code


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


	IFEQ	AB_TEST-0			; COMPLETE VERSION


	PLAYERHEADER PlayerTagArray

	dc.b '$VER: Airball Musics (1989) custom player V1.0, '
	dc.b 'ripped and adapted by Mr.STYCKX (04/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,AB_init		; init custom data
	dc.l	DTP_EndSound,AB_end		; clear DMA

	dc.l	DTP_SubSongRange,AB_SubSongRange

	dc.l	DTP_Interrupt,AB_Play

	dc.l	DTP_Volume,AB_Volume
	dc.l	DTP_Balance,AB_Volume

	dc.l	EP_Voices,AB_SetVoices
	dc.l	EP_StructInit,AB_StructInit

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

	dc.l	TAG_DONE


PName	dc.b	"Airball Custom v1.0",0
CName	dc.b	"Music by P.Shields, Player by P.Hunter. ",$a
	dc.b	"Adapted by Mr.STYCKX (07/04/96)",0

	EVEN


AB_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

AB_init
	move.w	dtg_SndNum(a5),d0	; sub song nbr (1..4)
	bsr	InitSong

	rts


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

AB_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

AB_Play
	move.l	a0,-(sp)

	lea	AB_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	UPS_Voice1Per(a0),AB_OldPer1
	move.w	UPS_Voice2Per(a0),AB_OldPer2
	move.w	UPS_Voice3Per(a0),AB_OldPer3
	move.w	UPS_Voice4Per(a0),AB_OldPer4

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

	bsr	NewVBL


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

	move.w	UPS_Voice1Per(a0),d0
	cmp.w	AB_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	AB_OldPer2(pc),d0
	bne.s	.3
	clr.w	UPS_Voice2Per(a0)

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

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

	clr.w	UPS_Enabled(a0)

	move.l	(sp)+,a0
	rts


*-----------------------------------------------------------------------*
;
; Returns min and max sub song

AB_SubSongRange
	moveq	#1,d0			; min
	moveq	#4,d1			; max

	rts


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

AB_Volume
	move.w	dtg_SndLBal(a5),d0	; Vol Left
	mulu	dtg_SndVol(a5),d0	; Vol Max
	lsr.w	#6,d0
	move.w	d0,AB_MasterVolA	; final Vol Left
	move.w	d0,AB_MasterVolD

	move.w	dtg_SndRBal(a5),d0
	mulu	dtg_SndVol(a5),d0
	lsr.w	#6,d0
	move.w	d0,AB_MasterVolB
	move.w	d0,AB_MasterVolC

	rts


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

AB_SetVoices
	move.w	d0,AB_DMA_EP	; bit=1 <=> voice is ON

	rts


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

AB_StructInit
	lea	AB_StructAnalyzer(pc),a0

	rts



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


	ELSEIF				; TESTVERSION


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


	move.l	$70.w,old70
	move.l	$6c.w,old6c

	moveq	#1,d0
	bsr	InitSong
	move.w	#$780,$dff09a

	move.l	#myvbl,$6c.w
	rts

Over
	move.l	old6c,$6c.w
	move.l	old70,$70.w
	move.w	#$f,$dff096
	rts

myvbl
	btst	#5,$dff01f
	beq.s	hop
	bsr	NewVBL

hop
	dc.w	$4ef9
old6c	dc.l	0


old70	dc.l	0

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


	ENDC



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

AB_DMA_EP	dc.w	%1111		; voix actives depuis EaglePlayer

AB_VoiceHardA	dcb.b	4+2+2+2,0	; start, len, per et vol
AB_VoiceHardB	dcb.b	4+2+2+2,0
AB_VoiceHardC	dcb.b	4+2+2+2,0
AB_VoiceHardD	dcb.b	4+2+2+2,0

AB_MasterVolA	dc.w	64		; 0 .. 64
AB_MasterVolB	dc.w	64
AB_MasterVolC	dc.w	64
AB_MasterVolD	dc.w	64

AB_OldPer1	dc.w	-1
AB_OldPer2	dc.w	-1
AB_OldPer3	dc.w	-1
AB_OldPer4	dc.w	-1


FakeIntena	dc.w	0
FakeDma		dc.w	0



;------------------------------------------------------------------------
; Airball Musics.
; Original replay by Paul Hunter, Musics by Paul Shields.
; Relocated on 29/03/1996 by Mr.STYCKX
;
; InitSong : D0 = 1 .. 4
; InterVBL : called every VBL
; AudioIRQ : called in $70.w
; NewVBL   : called every VBL, replaces InterVBL and AudioIRQ
;

OriginalSampleAdr	=	$11892
OriginalMusicAdr	=	$ecb8



NewVBL
	movem.l	d0-d2/a0-a3,-(sp)

	move.b	$dff006,d0
	addq.b	#8,d0

	bsr	InterVBL		; replay originale

.wait	cmp.b	$dff006,d0		; est-ce que 8 lignes sont écoulées
	bgt.s	.wait

	bsr	InstallRepeatSamples

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



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

SongsAdr				; $5ff2
	dc.l	Song3Data		; $fe80		Intro
	dc.l	Song4Data		; $10cca	In Game
	dc.l	Song2Data		; $f2a6		Hi Score
	dc.l	Song1Data		; $ecb8		Game Over


CurrentSongAdr				; $6002
	dc.l	0


SamplesAdr				; $6006		64 samples
SamplesSong1				; 16 samples
	dc.l	0
	dc.l	$11892-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1325A-OriginalSampleAdr+SamplesData
	dc.l	$14A92-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	0
	dc.l	$17076-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$19146-OriginalSampleAdr+SamplesData
	dc.l	$1AC3A-OriginalSampleAdr+SamplesData
	dc.l	$1BBDA-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1C986-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1F73A-OriginalSampleAdr+SamplesData

SamplesSong2				; 16 samples
	dc.l	0
	dc.l	$11892-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1325A-OriginalSampleAdr+SamplesData
	dc.l	$14A92-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	0
	dc.l	$17076-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$19146-OriginalSampleAdr+SamplesData
	dc.l	$1AC3A-OriginalSampleAdr+SamplesData
	dc.l	$1BBDA-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1C986-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	0

SamplesSong3				; 16 samples
	dc.l	0
	dc.l	$11892-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1325A-OriginalSampleAdr+SamplesData
	dc.l	$14A92-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	0
	dc.l	$17076-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	0
	dc.l	$1AC3A-OriginalSampleAdr+SamplesData
	dc.l	$1BBDA-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1C986-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1F73A-OriginalSampleAdr+SamplesData

SamplesSong4				; 16 samples
	dc.l	0
	dc.l	$11892-OriginalSampleAdr+SamplesData
	dc.l	0
	dc.l	$1D156-OriginalSampleAdr+SamplesData
	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



;------------------------------------------------------------------------
; Init les samples de la song D0 (0..3)

InitSamples
	lsl.w	#6,D0
	lea	SamplesAdr(pc),A5
	add.w	D0,A5
	move.l	CurrentSongAdr(pc),A3
	lea	SamplesInfos(PC),A2
	moveq	#15,D7
lbC00012A	move.w	D7,-(SP)
	sub.w	#15,D7
	neg.w	D7
	lsl.w	#2,D7
	move.l	0(A5,D7.W),A0
	clr.l	D7
	move.w	$16(A3),D7
	move.l	A0,A4
	add.w	$1A(A3),A4
	move.w	$1C(A3),D0
	cmp.w	#2,D0
	bcc.s	lbC000154
	moveq	#2,D0
	lea	SampleEmpty,A4
lbC000154	move.l	A0,(A2)+	; start
	move.w	D7,(A2)+		; len
	move.l	A4,(A2)+		; repeat start
	move.w	D0,(A2)+		; repeat len
	move.w	$1E(A3),(A2)+		; sample freq ?
	move.w	$18(A3),(A2)+		; vol
	add.w	#$20,A3
	move.w	(SP)+,D7
	dbra	D7,lbC00012A
	rts


;------------------------------------------------------------------------
; Initialise la song D0 (D0 = 1 .. 4)

InitSong				; $6162
	clr.w	lbW000D44
	move.w	#$f,$DFF096
	clr.w	FakeDma			; toutes les voix éteintes

	subq.w	#1,D0
	move.w	D0,-(SP)
	lsl.w	#2,D0
	lea	SongsAdr(pc),A0
	move.l	0(A0,D0.W),CurrentSongAdr
	move.w	(SP),D0
	bsr	InitSamples
	move.w	(SP)+,D0
	move.l	CurrentSongAdr(pc),A0
	lea	$DFF000,A6
;;	move.w	#$4780,$9A(A6)
;;	move.w	#$f,$96(A6)
	move.w	#$FF,$9E(A6)
	lea	lbL000CE8(PC),A5
	move.l	A0,2(A5)
	add.w	#$200,A0
	clr.l	D1
	move.w	(A0)+,D1
	add.l	2(A5),D1
	move.l	D1,6(A5)
	clr.l	D1
	move.w	(A0)+,D1
	add.l	2(A5),D1
	move.l	D1,10(A5)
	clr.w	$10(A5)
	clr.w	14(A5)
	lea	VoiceDData(PC),A1
	move.w	#3,D0
lbC0001EC	clr.w	$2E(A1)
	clr.w	$30(A1)
	clr.w	$32(A1)
	clr.w	$1E(A1)
	clr.w	$4E(A1)
	move.w	(A0),$52(A1)
	move.w	(A0)+,$50(A1)
	clr.l	D1
	move.w	(A0)+,D1
	add.l	2(A5),D1
	move.l	D1,(A1)
	move.l	D1,4(A1)
	lea	lbB000CFC(PC),A2
	move.l	A2,12(A1)
	move.w	#1,$2A(A1)
	move.w	#1,$28(A1)
	move.w	#1,$14(A1)
	move.w	#1,$1A(A1)
	lea	SampleCopro1,A2
	move.l	A2,$10(A1)
	move.l	A2,$16(A1)
	lea	lbB000CFD(PC),A2
	move.l	A2,$34(A1)
	move.l	A2,$38(A1)
	move.l	A2,$40(A1)
	move.l	A2,$44(A1)
	move.w	#$100,$2C(A1)
	sub.w	#$8A,A1			; taille des données d'une voix
	dbra	D0,lbC0001EC
;;	move.w	#$C000,$9A(A6)
	rts


;------------------------------------------------------------------------
; Joue un sample décrit en A3 sur la voix pointée par A0 (inutilisé).
; Servait à jouer les bruitages du jeu.

PlaySFX
	clr.b	$56(A0)
	move.w	D0,$5C(A0)
	move.w	D1,$58(A0)
	move.w	D2,$5A(A0)
	move.b	(A1),$80(A0)
	move.b	(A1)+,$7E(A0)
	move.l	A1,$7A(A0)
	move.l	A1,$76(A0)
	move.b	(A2),$74(A0)
	move.b	(A2)+,$72(A0)
	move.l	A2,$6E(A0)
	move.l	A2,$6A(A0)
	move.l	(A3)+,$5E(A0)
	move.w	(A3)+,$62(A0)
	move.l	(A3)+,$64(A0)
	move.w	(A3)+,$68(A0)
	move.b	#1,$56(A0)
	rts


;------------------------------------------------------------------------
; Installe Repeat Start et Repeat Len
; La partie bruitage n'est utilisée qu'en cours de jeu.

AudioIRQ				; $62a8
	movem.l	D0/A0/A6,-(SP)
	lea	$DFF000,A6
	moveq	#$20,D0
lbC0002C2	dbra	D0,lbC0002C2
	move.w	$1E(A6),D0
	and.w	#$780,D0
	move.w	D0,$9A(A6)
	move.w	D0,$9C(A6)

	btst	#10,D0
	beq.s	lbC000300
	lea	VoiceDData(PC),A0
	tst.b	$56(A0)			; music ou bruitage ?
	beq.s	lbC0002F4
	move.l	$64(A0),$D0(A6)		; bruitage
	move.w	$68(A0),$D4(A6)
	bra.s	lbC000300
lbC0002F4	move.l	$16(A0),$D0(A6)	; music
	move.w	$1A(A0),$D4(A6)

lbC000300	btst	#9,D0
	beq.s	lbC00032A
	lea	VoiceCData(PC),A0
	tst.b	$56(A0)
	beq.s	lbC00031E
	move.l	$64(A0),$C0(A6)
	move.w	$68(A0),$C4(A6)
	bra.s	lbC00032A
lbC00031E	move.l	$16(A0),$C0(A6)
	move.w	$1A(A0),$C4(A6)

lbC00032A	btst	#8,D0
	beq.s	lbC000354
	lea	VoiceBData(PC),A0
	tst.b	$56(A0)
	beq.s	lbC000348
	move.l	$64(A0),$B0(A6)
	move.w	$68(A0),$B4(A6)
	bra.s	lbC000354
lbC000348	move.l	$16(A0),$B0(A6)
	move.w	$1A(A0),$B4(A6)

lbC000354	btst	#7,D0
	beq.s	lbC00037E
	lea	VoiceAData(PC),A0
	tst.b	$56(A0)
	beq.s	lbC000372
	move.l	$64(A0),$A0(A6)
	move.w	$68(A0),$A4(A6)
	bra.s	lbC00037E
lbC000372	move.l	$16(A0),$A0(A6)
	move.w	$1A(A0),$A4(A6)

lbC00037E	movem.l	(SP)+,D0/A0/A6
	rte


;------------------------------------------------------------------------
; Installe les valeurs repeat start et repeat len pour les 4 voix.
; On ne tient pas compte de la gestion des bruitages.
; Cette routine évite d'utiliser l'inter en $70.w et AudioIRQ.
; On met aussi à jour StructAnalyzer.

InstallRepeatSamples
	movem.l	d0/a0/a6,-(sp)
	lea	$dff000,a6
	move.w	FakeIntena(pc),d0

	btst	#7,d0
	beq.s	.noA
	lea	VoiceAData(PC),A0
	move.l	$16(A0),$A0(A6)
	move.w	$1A(A0),$A4(A6)

.noA	btst	#8,d0
	beq.s	.noB
	lea	VoiceBData(PC),A0
	move.l	$16(A0),$B0(A6)
	move.w	$1A(A0),$B4(A6)

.noB	btst	#9,d0
	beq.s	.noC
	lea	VoiceCData(PC),A0
	move.l	$16(A0),$C0(A6)
	move.w	$1A(A0),$C4(A6)

.noC	btst	#10,d0
	beq.s	.noD
	lea	VoiceDData(PC),A0
	move.l	$16(A0),$D0(A6)
	move.w	$1A(A0),$D4(A6)

.noD	movem.l	(sp)+,d0/a0/a6
	rts


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

InterVBL				; $6376
	movem.l	D0-D2/A0-A6,-(SP)
	lea	lbL000CE8(PC),A5
	lea	$DFF000,A6
	move.w	$10(A5),D0
	and.w	#$780,D0
;;	move.w	D0,$9C(A6)
;;	move.w	$10(A5),$9A(A6)
	move.w	$10(A5),FakeIntena

	move.w	14(A5),d1		; voix allumées par la replay
;;	move.w	d1,$96(A6)

	; Gère les voix ON/OFF

	move.w	AB_DMA_EP(pc),d2	; $f par défaut : voix autorisées par EP
	and.b	d2,d1
	and.w	d2,FakeDma		; supprime les voix OFF

	not.w	d2
	and.w	#$f,d2
	move.w	d2,$96(A6)		; coupe les voix non choisies depuis EP
	move.w	d1,$96(A6)		; voix ON = replay AND AB_DMA_EP
	or.w	d1,FakeDma		; ajoute les voix ON

	move.w	FakeDma,AB_StructAnalyzer+UPS_DMACon

	clr.w	14(A5)
	clr.w	$10(A5)

	bra.s	EndFade

	tst.b	lbB001CC2		; gestion du fade quand on sort
	beq.s	lbC0003C6
	cmp.w	#$40,$12(A5)
	beq.s	lbC0003C6
	subq.w	#1,$12(A5)
lbC0003C6	tst.b	lbB001CC3
	beq.s	lbC0003DA
	cmp.w	#$80,$12(A5)
	beq.s	lbC0003DA
	addq.w	#1,$12(A5)
lbC0003DA	tst.b	lbB001CC4
	beq.s	lbC0003F2
	cmp.w	#$40,lbW000D32
	beq.s	lbC0003F2
	addq.w	#1,lbW000D32
lbC0003F2	tst.b	lbB001CC5
	beq.s	lbC00040A
	cmp.w	#0,lbW000D32
	beq.s	lbC00040A
	subq.w	#1,lbW000D32
EndFade


lbC00040A
	lea	VoiceDData(PC),A0
	lea	$D0(A6),A4
	lea	AB_StructAnalyzer+UPS_Modulo*3(pc),a3	; voix 4

	move.w	#3,D2
lbC000416	btst	#0,$2C(A0)
	beq	lbC0007AE
	subq.w	#1,$4E(A0)
	bne.s	lbC000442
	move.w	$52(A0),D0
	cmp.w	$50(A0),D0
	beq.s	lbC000442
	bcs.s	lbC000438
	subq.w	#1,$52(A0)
	bra.s	lbC00043C

lbC000438	addq.w	#1,$52(A0)
lbC00043C	move.w	$4C(A0),$4E(A0)
lbC000442	subq.w	#1,$28(A0)
	bne	lbC0006C0
	btst	#2,$56(A0)
	beq.s	lbC000456
	clr.b	$56(A0)
lbC000456	move.l	12(A0),A1
lbC00045A	clr.w	D0
	move.b	(A1)+,D0
	jmp	lbC000462(PC,D0.W)

lbC000462
	bra.w	lbC00061C
	bra.w	lbC000930
	bra.w	lbC000614
	bra.w	lbC00049E
	bra.w	lbC0006B0
	bra.w	lbC0005E2
	bra.w	lbC0005BE
	bra.w	lbC0005EA
	bra.w	lbC000552
	bra.w	lbC0004B6
	bra.w	lbC0004C4
	bra.w	lbC00051A
	bra.w	lbC00054A
	bra.w	lbC0004D0
	bra.w	lbC0004CA


lbC00049E	subq.w	#1,$2A(A0)
	bne	lbC000542
	move.l	4(A0),A2
lbC0004AA	move.w	(A2)+,D0
	cmp.w	#$FFE8,D0
	bcs.s	lbC000520
	jmp	lbC00049E(PC,D0.W)

lbC0004B6	move.w	(A2)+,$50(A0)
	move.w	(A2),$4C(A0)
	move.w	(A2)+,$4E(A0)
	bra.s	lbC0004AA

lbC0004C4	move.w	(A2)+,$30(A0)
	bra.s	lbC0004AA

lbC0004CA	move.w	(A2)+,$2E(A0)
	bra.s	lbC0004AA

lbC0004D0	pea	(A0)
	move.w	(A2)+,D0
	move.w	(A2)+,D1
	lea	VoiceAData(PC),A0
	move.w	D0,$50(A0)
	move.w	D1,$4C(A0)
	move.w	D1,$4E(A0)
	lea	VoiceBData(PC),A0
	move.w	D0,$50(A0)
	move.w	D1,$4C(A0)
	move.w	D1,$4E(A0)
	lea	VoiceCData(PC),A0
	move.w	D0,$50(A0)
	move.w	D1,$4C(A0)
	move.w	D1,$4E(A0)
	lea	VoiceDData(PC),A0
	move.w	D0,$50(A0)
	move.w	D1,$4C(A0)
	move.w	D1,$4E(A0)
	move.l	(SP)+,A0
	bra.s	lbC0004AA

lbC00051A	move.l	(A0),A2
	bra.s	lbC0004AA

lbC000520	move.w	#1,$2A(A0)
	bclr	#15,D0
	beq.s	lbC000530
	move.w	(A2)+,$2A(A0)
lbC000530	move.l	2(A5),A1
	add.w	D0,A1
	move.l	A1,8(A0)
	move.l	A2,4(A0)
	bra	lbC00045A

lbC000542	move.l	8(A0),A1
	bra	lbC00045A

lbC00054A	clr.w	$2C(A0)
	bra	lbC0007AE

lbC000552	move.b	(A1)+,D0
	lsl.w	#3,D0
	btst	#3,$2C(A0)
	bne.s	lbC00056A
	move.w	D0,$20(A0)
	clr.w	D0
	move.b	(A1)+,D0
	lsl.w	#3,D0
	bra.s	lbC00057C

lbC00056A	bsr	lbC000900
	move.w	D0,$20(A0)
	clr.w	D0
	move.b	(A1)+,D0
	lsl.w	#3,D0
	bsr	lbC000900
lbC00057C	sub.w	$20(A0),D0
	clr.l	D1
	move.w	D0,D1
	bmi.s	lbC0005A0
	clr.w	D0
	bsr	lbC000920
	divu	D0,D1
	move.w	D1,$24(A0)
	clr.w	D1
	divu	D0,D1
	move.w	D1,$26(A0)
	bra	lbC00063A

lbC0005A0	neg.w	D1
	clr.w	D0
	bsr	lbC000920
	divu	D0,D1
	move.w	D1,$24(A0)
	clr.w	D1
	divu	D0,D1
	move.w	D1,$26(A0)
	neg.l	$24(A0)
	bra.s	lbC00063A

lbC0005BE	move.l	10(A5),A2
	move.b	(A1)+,D0
	move.w	0(A2,D0.W),D0
	move.l	2(A5),A2
	add.w	D0,A2
	move.b	(A2),$4A(A0)
	move.b	(A2)+,$48(A0)
	move.l	A2,$44(A0)
	move.l	A2,$40(A0)
	bra	lbC00045A

lbC0005E2	bset	#3,$2C(A0)
	bra.s	lbC0005F0

lbC0005EA	bclr	#3,$2C(A0)
lbC0005F0	move.l	6(A5),A2
	move.b	(A1)+,D0
	move.w	0(A2,D0.W),D0
	move.l	2(A5),A2
	add.w	D0,A2
	move.b	(A2),$3E(A0)
	move.b	(A2)+,$3C(A0)
	move.l	A2,$38(A0)
	move.l	A2,$34(A0)
	bra	lbC00045A

lbC000614	move.b	(A1)+,$1F(A0)
	bra	lbC00045A

lbC00061C	move.b	(A1)+,D0
	lsl.w	#3,D0
	btst	#3,$2C(A0)
	beq.s	lbC00062C
	bsr	lbC000900
lbC00062C	move.w	D0,$20(A0)
	clr.w	D0
	bsr	lbC000920
	clr.l	$24(A0)
lbC00063A	move.w	$1E(A0),$1C(A0)
	move.b	$48(A0),$4A(A0)
	move.l	$40(A0),$44(A0)
	move.b	$3C(A0),$3E(A0)
	move.l	$34(A0),$38(A0)
	bclr	#1,$2C(A0)
	move.l	A1,12(A0)
	tst.b	$56(A0)
	bne	lbC0007B4
	move.w	$84(A0),$96(A6)		; DMA OFF
;;	move.w	$88(A0),$9A(A6)		; INTENA OFF
	move.w	$86(A0),D0		; INTENA ON
	or.w	D0,$10(A5)
	move.w	$82(A0),D0		; DMA ON
	or.w	D0,14(A5)

	move.l	$10(A0),(A4)
	move.w	$14(A0),4(A4)
	move.l	$10(a0),UPS_Voice1Adr(a3)	; analyzer Adr
	move.w	$14(a0),UPS_Voice1Len(a3)	; analyzer Len


lbC000692	subq.b	#1,$4A(A0)
	bne.s	lbC0006E4
	move.l	$44(A0),A1
lbC00069C	move.b	(A1)+,D0
	cmp.b	#$80,D0
	beq.s	lbC0006E4
	cmp.b	#$81,D0
	bne.s	lbC0006D4
	move.l	$40(A0),A1
	bra.s	lbC00069C

lbC0006B0	bset	#1,$2C(A0)
	bsr	lbC000920
	move.l	A1,12(A0)
	bra.s	lbC0006E4

lbC0006C0	btst	#1,$2C(A0)
	beq.s	lbC000692
	tst.w	$1C(A0)
	bmi.s	lbC0006E4
	subq.w	#2,$1C(A0)
	bra.s	lbC0006E4

lbC0006D4	ext.w	D0
	add.w	D0,$1C(A0)
	move.b	$48(A0),$4A(A0)
	move.l	A1,$44(A0)
lbC0006E4	move.l	$24(A0),D0
	add.l	D0,$20(A0)
	tst.b	$56(A0)
	bne	lbC0007B4
	subq.b	#1,$3E(A0)
	bne.s	lbC000722
	move.l	$38(A0),A1
lbC0006FE	move.b	(A1)+,D0
	cmp.b	#$80,D0
	beq.s	lbC000722
	cmp.b	#$81,D0
	bne.s	lbC000712
	move.l	$34(A0),A1
	bra.s	lbC0006FE

lbC000712	ext.w	D0
	add.w	D0,$20(A0)
	move.b	$3C(A0),$3E(A0)
	move.l	A1,$38(A0)
lbC000722	move.w	$20(A0),D0
	btst	#3,$2C(A0)
	bne.s	lbC000732
	bsr	lbC000900
lbC000732
	move.w	D0,6(A4)
	move.w	d0,UPS_Voice1Per(a3)	; analyzer Per

	move.w	$52(A0),D0
	add.w	$1C(A0),D0
	sub.w	$12(A5),D0
	move.w	D0,$54(A0)
	bpl.s	lbC00074C
	clr.w	D0
	bra.s	lbC000754

lbC00074C	cmp.w	#$40,D0
	ble.s	lbC000754
	moveq	#$40,D0
lbC000754
	move.w	d0,UPS_Voice1Vol(a3)	; analyzer Vol

	movem.l	d2/a0,-(sp)
	lea	AB_MasterVolA(pc),a0
	add.w	d2,d2			; adresse des mots
	mulu	(a0,d2.w),d0		; mastervol * Vol
	lsr.w	#6,d0
	movem.l	(sp)+,d2/a0

	move.w	D0,8(A4)		; volume apres ajustement


lbC000758
	sub.w	#$8A,A0
	lea	-UPS_Modulo(a3),a3	; voix UPS precedente
	sub.w	#$10,A4			; voix DMA precedente

	dbra	D2,lbC000416		; 4 voix
	movem.l	(SP)+,D0-D2/A0-A6
	rts


;------------------------------------------------------------------------
; Gestion des bruitages => routines non utilisées jusqu'a FreqTable

lbC00076A	move.w	$84(A0),$96(A6)	; DMA OFF
;;	move.w	$88(A0),$9A(A6)		; INTENA OFF
	move.w	$86(A0),D0		; INTENA ON
	or.w	D0,$10(A5)
	move.w	$82(A0),D0		; DMA ON
	or.w	D0,14(A5)
	move.b	#2,$56(A0)
	move.l	$5E(A0),(A4)
	move.w	$62(A0),4(A4)
	bra.s	lbC000758

lbC00079A	bset	#2,$56(A0)
;;	move.w	$88(A0),$9A(A6)		; INTENA OFF
	move.w	$84(A0),$96(A6)		; DMA OFF
	bra.s	lbC000758

lbC0007AE	tst.b	$56(A0)
	beq.s	lbC000758
lbC0007B4
	btst	#0,$56(A0)
	bne.s	lbC00076A
	subq.w	#1,$58(A0)
	bmi.s	lbC00079A
	subq.b	#1,$80(A0)
	bne.s	lbC0007F0
	move.l	$7A(A0),A1
lbC0007CC	move.b	(A1)+,D0
	cmp.b	#$80,D0
	beq.s	lbC0007F0
	cmp.b	#$81,D0
	bne.s	lbC0007E0
	move.l	$76(A0),A1
	bra.s	lbC0007CC

lbC0007E0	ext.w	D0
	add.w	D0,$5A(A0)
	move.b	$7E(A0),$80(A0)
	move.l	A1,$7A(A0)
lbC0007F0	move.w	$5A(A0),D0
	bpl.s	lbC0007FA
	clr.w	D0
	bra.s	lbC000802

lbC0007FA	cmp.w	#$40,D0
	ble.s	lbC000802
	moveq	#$40,D0
lbC000802	move.w	D0,8(A4)
	subq.b	#1,$74(A0)
	bne.s	lbC000834
	move.l	$6E(A0),A1
lbC000810	move.b	(A1)+,D0
	cmp.b	#$80,D0
	beq.s	lbC000834
	cmp.b	#$81,D0
	bne.s	lbC000824
	move.l	$6A(A0),A1
	bra.s	lbC000810

lbC000824	ext.w	D0
	add.w	D0,$5C(A0)
	move.b	$72(A0),$74(A0)
	move.l	A1,$6E(A0)
lbC000834	move.w	$5C(A0),D0
	move.w	D0,6(A4)
	bra	lbC000758


FreqTable
	dc.w	$6AE4
	dc.w	$6A1F
	dc.w	$695C
	dc.w	$689A
	dc.w	$67D9
	dc.w	$671A
	dc.w	$665C
	dc.w	$659F
	dc.w	$64E4
	dc.w	$642A
	dc.w	$6372
	dc.w	$62BB
	dc.w	$6205
	dc.w	$6150
	dc.w	$609D
	dc.w	$5FEB
	dc.w	$5F3A
	dc.w	$5E8B
	dc.w	$5DDD
	dc.w	$5D30
	dc.w	$5C84
	dc.w	$5BDA
	dc.w	$5B31
	dc.w	$5A89
	dc.w	$59E2
	dc.w	$593D
	dc.w	$5898
	dc.w	$57F5
	dc.w	$5753
	dc.w	$56B2
	dc.w	$5613
	dc.w	$5574
	dc.w	$54D7
	dc.w	$543A
	dc.w	$539F
	dc.w	$5305
	dc.w	$526C
	dc.w	$51D5
	dc.w	$513E
	dc.w	$50A8
	dc.w	$5014
	dc.w	$4F80
	dc.w	$4EEE
	dc.w	$4E5C
	dc.w	$4DCC
	dc.w	$4D3D
	dc.w	$4CAF
	dc.w	$4C21
	dc.w	$4B95
	dc.w	$4B0A
	dc.w	$4A80
	dc.w	$49F7
	dc.w	$496E
	dc.w	$48E7
	dc.w	$4861
	dc.w	$47DC
	dc.w	$4757
	dc.w	$46D4
	dc.w	$4651
	dc.w	$45D0
	dc.w	$454F
	dc.w	$44D0
	dc.w	$4451
	dc.w	$43D3
	dc.w	$4356
	dc.w	$42DA
	dc.w	$425F
	dc.w	$41E5
	dc.w	$416B
	dc.w	$40F3
	dc.w	$407B
	dc.w	$4005
	dc.w	$3F8F
	dc.w	$3F1A
	dc.w	$3EA5
	dc.w	$3E32
	dc.w	$3DBF
	dc.w	$3D4E
	dc.w	$3CDD
	dc.w	$3C6D
	dc.w	$3BFD
	dc.w	$3B8F
	dc.w	$3B21
	dc.w	$3AB4
	dc.w	$3A48
	dc.w	$39DD
	dc.w	$3972
	dc.w	$3909
	dc.w	$38A0
	dc.w	$3837
	dc.w	$37D0
	dc.w	$3769
	dc.w	$3703
	dc.w	$369E
	dc.w	$3639
	dc.w	$35D5

lbC000900	add.w	$2E(A0),D0
	add.w	$32(A0),D0
	moveq	#-1,D1
lbC00090A	addq.w	#1,D1
	sub.w	#$60,D0
	bpl.s	lbC00090A
	add.w	D0,D0
	move.w	lbC000900(PC,D0.W),D0
	lsr.w	D1,D0
	add.w	$30(A0),D0
	rts

lbC000920	move.b	(A1)+,D0
	bne.s	lbC00092A
	move.b	(A1)+,D0
	lsl.w	#8,D0
	move.b	(A1)+,D0
lbC00092A	move.w	D0,$28(A0)
	rts

lbC000930	move.b	(A1)+,D0
	lsl.w	#4,D0
	lea	SamplesInfos(PC,D0.W),A2
	move.l	(A2)+,$10(A0)		; start
	move.w	(A2)+,$14(A0)		; len
	move.l	(A2)+,$16(A0)		; rep start
	move.w	(A2)+,$1A(A0)		; rep len
	move.w	(A2)+,$32(A0)		; freq ?
	bra	lbC00045A


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

SamplesInfos				; $6942 infos sur 23 samples (7 copro)
	REPT	16
	dc.l	0			; start
	dc.w	0			; len
	dc.l	0			; repeat start
	dc.w	0			; repeat len
	dc.w	0			; sample freq ?
	dc.w	0			; vol
	ENDR

	dc.l	SampleCopro1
	dc.w	2
	dc.l	SampleCopro1
	dc.w	2
	dc.l	0

	dc.l	SampleCopro2
	dc.w	4
	dc.l	SampleCopro2
	dc.w	4
	dc.l	0

	dc.l	SampleCopro3
	dc.w	2
	dc.l	SampleCopro3
	dc.w	2
	dc.l	0

	dc.l	SampleCopro4
	dc.w	4
	dc.l	SampleCopro4
	dc.w	4
	dc.l	0

	dc.l	SampleCopro5
	dc.w	2
	dc.l	SampleCopro5
	dc.w	2
	dc.l	0

	dc.l	SampleCopro6
	dc.w	4
	dc.l	SampleCopro6
	dc.w	4
	dc.l	0

	dc.l	SampleCopro7
	dc.w	$c8
	dc.l	SampleCopro7
	dc.w	$c8
	dc.l	0

VoiceAData				; $6ab2
	dcb.w	65,0
	dc.w	$8201,1			; DMACON ON/OFF
	dc.w	$C080,$80		; INTENA ON/OFF

VoiceBData				; $6b3c
	dcb.w	65,0
	dc.w	$8202,2
	dc.w	$C100,$100

VoiceCData				; $6bc6
	dcb.w	65,0
	dc.w	$8204,4
	dc.w	$C200,$200

VoiceDData				; $6c50
	dcb.w	65,0
	dc.w	$8208,8
	dc.w	$C400,$400

lbL000CE8
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	$40
lbB000CFC	dc.b	12
lbB000CFD	dc.b	$80


lbB001CC2	dc.b	0		; 4 compteurs utilisés pour les fades
lbB001CC3	dc.b	0		; => routines supprimées
lbB001CC4	dc.b	0
lbB001CC5	dc.b	0


lbW000D32	dc.w	$40
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
lbW000D44	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	$4A
	dc.w	0




Song1Data				; Game Over
	incbin	b:Airball/Airball.s1	; 1518 octets
Song2Data				; Hi Score
	incbin	b:Airball/Airball.s2	; 3034
Song3Data				; Intro
	incbin	b:Airball/Airball.s3	; 3658
Song4Data				; In Game
	incbin	b:Airball/Airball.s4	; 3016


;------------------------------------------------------------------------
; Donnees en CHIP

	section AirballSamples,data_c


SampleEmpty				; $6cf0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0

; Les samples copro ne sont en fait jamais utilisés

SampleCopro1	dc.l	$7F7F8181		; $6d00
SampleCopro2	dc.l	$7F7F7F7F,$81818181	; $6d04
SampleCopro3	dc.l	$007F0081		; $6d0c
SampleCopro4	dc.l	$00597F59,$00A781A7	; $6d10
SampleCopro5	dc.l	$7F2AD580		; $6d18
SampleCopro6	dc.l	$7F5A3611,$EEC9A580	; $6d1c

SampleCopro7				; pointait en $6376 (sur AudioIRQ !!)


SamplesData
	incbin	b:Airball/Airball.smp		; 59758 octets
	
;------------------------------------------------------------------------
; END

	end

