*-----------------------------------------------------------------------------

* POUR CHANGER UNE MUSIQUE:
* CHERCHER "VOICE_SET" ET ENTRER LE NOM DU FICHIER VOICE SET ("*.TVS")
* CHERCHER "SONG" ET ENTRER LE NOM DU FICHIER SON ("*.TRI")

*------------------------------------*
*----- INSIGNIA TRISOUND PLAYER -----*
*------------------------------------*
* (C)1991 HAGEN FROM HYSTERIA...
*
* (ET QUELQUES RAJOUTS DE FRAIS' GIN DRINKER)
*
* VERSION 2.00 (VOIX DIGIT ET CHANGEMENT DE FREQUENCE)
*
* APPEL: INIT-> JSR MUZIC, PLAY-> JSR MUZIC+2, FIN-> JSR MUZIC+4
*-----------------------------------------------------------------------------
	OPT	O+,X+,P+
*-----------------------------------------------------------------------------
TA_BN	EQU	5			BIT NUMMER TIMER A
IERA	EQU	$FFFFFA07
IMRA	EQU	$FFFFFA13
VECTOR	EQU	$FFFFFA17
TADR	EQU	$FFFFFA1F
TACR	EQU	$FFFFFA19
PSGREG	EQU	$FFFF8800
PSGWRITE	EQU	$FFFF8802
PAT_LEN	EQU	64			LENGTE PATTERN IN NOTEN
NOTE_LEN	EQU	12			LENGTE NOOT (PATTERN REGEL) IN BYTES
****** INSTRUMENT STRUCTURE EQUATES *****
I_NOISE_FREQ	EQU	0
I_SOUND_MODE	EQU	2
I_ENV_TYPE		EQU	3
I_ENV_FREQ		EQU	4
I_VIBR_SPEED	EQU	6
I_VIBR_DEPTH	EQU	8
I_INTERVAL1	EQU	252
I_INTERVAL2	EQU	254
I_ENV_ATTACK	EQU	10
I_ENV_SUSTAIN	EQU	12
I_ENV_RELEASE	EQU	14
I_ENV_START	EQU	16
I_PIT_ATTACK	EQU	240
I_PIT_SUSTAIN	EQU	242
I_PIT_RELEASE	EQU	244
I_PIT_START	EQU	128
I_TOTAL_LEN	EQU	256
*-----------------------------------------------------------------------------
MUSIC
	BRA.S	INIT
	BRA.S	PLAY
	BRA.S	FIN
	DC.B	" -INSIGNIA TRISOUND PLAYER- (C)1991 HAGEN FROM HYSTERIA...  "
	EVEN
*-----------------------------------------------------------------------------
INIT	
	MOVEM.L	D0-D7/A0-A6,-(SP)
	LEA	MUSIC(PC),A6
	BSR.S	INIT_YAM
* INIT CODE MODIFIE
	LEA.L	ADD_ADR+2(PC),A0
	LEA.L	SAM_ADR+2(PC),A1
	MOVE.L	A1,(A0)
	LEA.L	REST_ADR+4(PC),A0
	LEA	ADATA+SILENT(PC),A1
	MOVE.L	A1,(A0)
	BSR	INIT_SAM
	MOVEM.L	(SP)+,D0-D7/A0-A6
	RTS
*-----------------------------------------------------------------------------
PLAY	
	MOVEM.L	D0-D7/A0-A6,-(SP)
	LEA	MUSIC(PC),A6		POINTEUR PC RELATIF
	BSR	DO_PLAY
	MOVEM.L	(SP)+,D0-D7/A0-A6
	RTS
*-----------------------------------------------------------------------------
FIN	
	MOVE.L	SAV_USP-MUSIC(A6),A0
	MOVE.L	A0,USP
	LEA	SAV_134(PC),A0
	MOVE.L	(A0),$134.W
	LEA.L	SAV_VECTOR(PC),A0
	MOVE.B	(A0),(VECTOR).W
	BCLR	#TA_BN,(IERA).W		TIMER A INTERRUPT OFF
	MOVE.W	#$2300,SR
	RTS
*-----------------------------------------------------------------------------
INIT_YAM
	LEA.L	BSS_SECTION(PC),A0
	LEA.L	END_BSS(PC),A1
	MOVEQ	#0,D0
CLR_BSS
*	MOVE.W	D0,(A0)+
	CMP.L	A0,A1
*	BNE.S	CLR_BSS

	MOVE.W	LAST_PAT-MUSIC(A6),D0		HAAL AANTAL PATTERNS-1 (VOOR DBRA LUS)
	SUBQ.W	#1,D0
	LEA	PATTERNS(PC),A0		BEGIN ADRES PATTERNS
	LEA	PAT_TAB(PC),A1		BEGIN ADRES PATTERN TABEL
INIT_PAT_TAB
	MOVE.L	A0,(A1)+			SLA ADRES PATTERN OP
	ADD.L	#PAT_LEN*NOTE_LEN,A0		NAAR VOLGENDE PATTERN
	DBF	D0,INIT_PAT_TAB		NET ZO LANG TOT ALLE PATTERN GEWEEST ZIJN
	MOVE.W	#1,NOTE_COUNT-MUSIC(A6)	BEGIN METEEN MET NOOT
	CLR.W	POS_NOW-MUSIC(A6)		BEGIN BIJ POSITION #0
***** INITIALISEER VOICE STATUS STRUCTURE ******
	LEA	ENV_0(PC),A0
* VOIE A
	CLR.B	ADATA+SOUND_MODE-MUSIC(A6)
	MOVE.L	A0,ADATA+ENV_PTR-MUSIC(A6)
	MOVE.W	#2,ADATA+ENV_ATT-MUSIC(A6)
	MOVE.W	#5,ADATA+ENV_SUS-MUSIC(A6)
	MOVE.W	#9,ADATA+ENV_REL-MUSIC(A6)
	MOVE.L	A0,ADATA+PIT_PTR-MUSIC(A6)
	MOVE.W	#2,ADATA+PIT_ATT-MUSIC(A6)
	MOVE.W	#5,ADATA+PIT_SUS-MUSIC(A6)
	MOVE.W	#9,ADATA+PIT_REL-MUSIC(A6)
* VOIE B
	CLR.B	BDATA+SOUND_MODE-MUSIC(A6)
	MOVE.L	A0,BDATA+ENV_PTR-MUSIC(A6)
	MOVE.W	#2,BDATA+ENV_ATT-MUSIC(A6)
	MOVE.W	#5,BDATA+ENV_SUS-MUSIC(A6)
	MOVE.W	#9,BDATA+ENV_REL-MUSIC(A6)
	MOVE.L	A0,BDATA+PIT_PTR-MUSIC(A6)
	MOVE.W	#2,BDATA+PIT_ATT-MUSIC(A6)
	MOVE.W	#5,BDATA+PIT_SUS-MUSIC(A6)
	MOVE.W	#9,BDATA+PIT_REL-MUSIC(A6)
* VOIE C
	CLR.B	CDATA+SOUND_MODE-MUSIC(A6)
	MOVE.L	A0,CDATA+ENV_PTR-MUSIC(A6)
	MOVE.W	#2,CDATA+ENV_ATT-MUSIC(A6)
	MOVE.W	#5,CDATA+ENV_SUS-MUSIC(A6)
	MOVE.W	#9,CDATA+ENV_REL-MUSIC(A6)
	MOVE.L	A0,CDATA+PIT_PTR-MUSIC(A6)
	MOVE.W	#2,CDATA+PIT_ATT-MUSIC(A6)
	MOVE.W	#5,CDATA+PIT_SUS-MUSIC(A6)
	MOVE.W	#9,CDATA+PIT_REL-MUSIC(A6)
	BSR.S	CALC_POS
	BSR.S	CALC_SAM_PTRS
	RTS
***** LAAD NIEUWE POSITION *****
LOAD_POS
	CLR.W	PAT_LIN-MUSIC(A6)		ZET REGELNUMMER OP 0
LOAD_POS_WITHOUT_0
	MOVE.W	POS_NOW-MUSIC(A6),D0		HAAL POSITION
NEXT_POS
	ADDQ.W	#1,D0			NAAR VOLGENDE POSITION
	CMP.W	LAST_POS-MUSIC(A6),D0		ZIJN WE VOORBIJ DE LAATSTE POSITION
	BLS.S	NO_RESTART			NEE -> NIET RESTARTEN
	MOVE.W	RESTART-MUSIC(A6),D0		HAAL RESTART POSITION
NO_RESTART
	MOVE.W	D0,POS_NOW-MUSIC(A6)		SLA POSITION OP
CALC_POS
	LEA	POS_TAB(PC),A0		HAAL ADRES POSITION TABEL
	MOVE.W	POS_NOW-MUSIC(A6),D0		HAAL POSITION NUMMER
	MOVE.B	0(A0,D0.W),D0		HAAL HUIDIGE PATTERN NUMMER (VOOR ALS WE NET AANKOMEN MET CALC_POS)
	ANDI.W	#$7F,D0			MAAK ER EEN WORD VAN
	MOVE.W	D0,PAT_NOW-MUSIC(A6)		SLA OP
	LEA	PAT_TAB(PC),A0		HAAL TABEL MET PATTERNS
	ASL.W	#2,D0			VERMENIGVULDIG MET 4 VOOR TABEL MET LONGS
	MOVE.L	0(A0,D0.W),PAT_PTR-MUSIC(A6)	HAAL POINTER NAAR PATTERN
	RTS
***** CALCULATE SAMPLE POINTERS *****
CALC_SAM_PTRS
	LEA	SAM_TAB(PC),A0		HAAL ADRES TABEL MET POINTERS
	LEA	SAM_LEN(PC),A1		HAAL ADRES TABEL MET LENGTES
	LEA	SAM_FIRST(PC),A2		HAAL BEGIN ADRES EERSTE SAMPLE
	MOVEQ	#15,D0			POINTERS VAN 16 SAMPLES BEREKENEN
	MOVEQ	#0,D1			LENGTE ALLE SAMPLES SAMEN IS EERST 0
CALC_NEXT_SAM
	MOVE.L	A2,(A0)+			SLA POINTER NAAR SAMPLE OP
	ADD.L	(A1),A2			VERHOOG POINTER MET LENGTE SAMPLE
	ADD.L	(A1)+,D1			VERHOOG TOTALE LENGTE MET LENGTE SAMPLE
	DBF	D0,CALC_NEXT_SAM
	MOVE.L	D1,SAM_TOT-MUSIC(A6)		SLA TOTALE LENGTE SAMPLES OP
	RTS
*-----------------------------------------------------------------------------
INIT_SAM
	MOVE.W	#$2700,SR			ZET INTS UIT
	BSR.S	SND_INT
	MOVE.L	USP,A0
	MOVE.L	A0,SAV_USP-MUSIC(A6)
	LEA	SAV_134(PC),A0
	MOVE.L	$134.W,(A0)
	LEA.L	SAV_VECTOR(PC),A0
	MOVE.B	(VECTOR).W,(A0)
	BCLR.B	#3,(VECTOR).W
	LEA	TIMER_A(PC),A0
	MOVE.L	A0,$134.W
	CLR.B	(TACR).W			STOP TIMER A
	MOVE.B	#1,(TACR).W		START TIMER A
	CLR.B	(TADR).W			SET SPEED OF TIMER A TO 0(=256=SLOWEST)
	BSET.B	#TA_BN,(IMRA).W		TIMER A MASK
	BCLR.B	#TA_BN,(IERA).W		TIMER A DISABLE
	MOVE.W	#$2300,SR
	RTS
SND_INT
	BSET.B	#0,ADATA+SILENT-MUSIC(A6)		ZET KANALEN UIT
	BCLR.B	#1,ADATA+SILENT-MUSIC(A6)		GEEN SAMPLE OP KANAAL A
	BSET.B	#0,BDATA+SILENT-MUSIC(A6)
	BSET.B	#0,CDATA+SILENT-MUSIC(A6)
	ST.B	ADATA+INSTR_NO-MUSIC(A6)		MAAK INSTRUMENTEN NUMMER $FF ZODAT BIJ VERGELIJKING INSTRUMENT DATA OPNIEUW GELADEN WORDT
	ST.B	BDATA+INSTR_NO-MUSIC(A6)
	ST.B	CDATA+INSTR_NO-MUSIC(A6)
	LEA	(PSGREG).W,A0
	LEA	(PSGWRITE).W,A1
	MOVEQ	#13,D0
CL_SND	
	MOVE.B	D0,(A0)
	CLR.B	(A1)
	DBF	D0,CL_SND
	MOVE.B	#7,(A0)
	MOVE.B	D0,(A1)
	RTS
*-----------------------------------------------------------------------------
DO_PLAY
***** DRIVE A LED OFF *****
	MOVE.W	#$2500,SR
	SUBQ.W	#1,NOTE_COUNT-MUSIC(A6)	MOET ER EEN NIEUWE NOOT GEPAKT WORDEN?
	BNE	DO_FX_ALL			ALS NIET ZO -> SPRING OVER NOOT ROUTINE HEEN

***** VOER PATTERN REGEL UIT *****
	MOVE.W	SPEED-MUSIC(A6),NOTE_COUNT-MUSIC(A6)	HERSTEL VOORDELER

***** LEES NOTEN *****
READ_NOTES_ALL
	MOVE.L	PAT_PTR-MUSIC(A6),A1		HAAL POINTER IN PATTERN WEER TERUG
	LEA	ADATA(PC),A0		HAAL ADRES CHANNEL A DATA-FIELD
	BSR	GETNOTE			LEES NOOT
	LEA	BDATA(PC),A0		HAAL ADRES CHANNEL B DATA-FIELD
	BSR	GETNOTE			LEES NOOT
	LEA	CDATA(PC),A0		HAAL ADRES CHANNEL C DATA-FIELD
	BSR	GETNOTE			LEES NOOT
	MOVE.L	A1,PAT_PTR-MUSIC(A6)
	ADDQ.W	#1,PAT_LIN-MUSIC(A6)
	CMP.W	#PAT_LEN,PAT_LIN-MUSIC(A6)
	BMI.S	SUITE
	BSR	LOAD_POS
SUITE
	MOVE.B	#%11111111,D0		STANDAARD MASKER VOOR REG #7

***** REG 7 : KANAAL C *****
	BTST.B	#0,SOUND_MODE(A0)		TOON OP KANAAL C?
	BEQ.S	NO_TONE_C			NEE -> NIKS DOEN
	BCLR	#2,D0			JA -> WIS BIJHORENDE BIT
NO_TONE_C
	BTST.B	#1,SOUND_MODE(A0)		RUIS OP KANAAL C?
	BEQ.S	NO_NOIS_C			NEE -> NIKS DOEN
	BCLR	#5,D0			JA -> WIS BIJHORENDE BIT
NO_NOIS_C

***** REG 7 : KANAAL B *****
	BTST.B	#0,BDATA+SOUND_MODE-MUSIC(A6)	TOON OP KANAAL B?
	BEQ.S	NO_TONE_B			NEE -> NIKS DOEN
	BCLR	#1,D0			JA -> WIS BIJHORENDE BIT
NO_TONE_B
	BTST.B	#1,BDATA+SOUND_MODE-MUSIC(A6)	RUIS OP KANAAL B?
	BEQ.S	NO_NOIS_B			NEE -> NIKS DOEN
	BCLR	#4,D0			JA -> WIS BIJHEORENDE BIT
NO_NOIS_B

***** REG 7 : KANAAL A *****
	BTST.B	#1,ADATA+SILENT-MUSIC(A6)	WORDT ER EEN SAMPLE GESPEELD?
	BNE.S	NO_NOIS_A			JA -> GEEN TOON EN GEEN RUIS OP KANAAL A
	BTST.B	#0,ADATA+SOUND_MODE-MUSIC(A6)	TOON OP KANAAL A?
	BEQ.S	NO_TONE_A			NEE -> NIKS DOEN
	BCLR	#0,D0			JA -> WIS BIJHORENDE BIT
NO_TONE_A
	BTST.B	#1,ADATA+SOUND_MODE-MUSIC(A6)	RUIS OP KANAAL A?
	BEQ.S	NO_NOIS_A			NEE -> NIKS DOEN
	BCLR	#3,D0			JA -> WIS BIJHEORENDE BIT
NO_NOIS_A
	MOVE.W	#$2700,SR			MFP INTERRUPTS UIT
	MOVE.B	#7,(PSGREG).W		REGISTER 7
	MOVE.B	D0,(PSGWRITE).W		SCHRIJF WAARDE WEG
	MOVE.W	#$2500,SR			MFP INTERRUPTS WEER AAN

***** GEEN NOOT, ENKEL EFFECTEN *****
DO_FX_ALL
	LEA	CDATA(PC),A0		HAAL ADRES CHANNEL C DATA-FIELD
	BSR	DO_FX			DOE ENVELOPE, TREMOLO ETC.
	LEA	BDATA(PC),A0		HAAL ADRES CHANNEL B DATA-FIELD
	BSR	DO_FX			DOE ENVELOPE, TREMOLO ETC.
	LEA	ADATA(PC),A0		HAAL ADRES CHANNEL A DATA-FIELD
	BSR	DO_FX			DOE ENVELOPE, TREMOLO ETC.

***** SCHRIJF FREQUENTIE EN VOLUME *****
	LEA	(PSGREG).W,A1		ADRES PSG REGISTER SELECT
	LEA	(PSGWRITE).W,A2		ADRES PSG WRITE DATA
	MOVE.W	#$2700,SR			MFP INTERRUPTS UIT

***** KANAAL A *****
* ADRES VARIABELEN GEBIED KANAAL A STAAT NOG IN A0
	BTST.B	#1,SILENT(A0)		WORDT ER EEN SAMPLE GESPEELD?
	BNE.S	DO_NOUT_A			JA -> DOE NIKS MET KANAAL A REGISTERS
	MOVE.W	PSGFREQ(A0),D0		HAAL FREQUENCY BOTH BYTES
	MOVE.B	PSGFREQ(A0),D1		HAAL FREQUENCY HI-BYTE
	CLR.B	(A1)			TONE FREQ REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#1,(A1)
	MOVE.B	D1,(A2)			SCHRIJF HI-BYTE FREQUENCY

	TST.B	SILENT(A0)			STAAT DIT KANAAL AAN?
	BNE.S	NO_HARDW_AUTO_A		NEE -> LAAT HARDWARE FREQUENCY DAN -> VOORKOMT INTERFERENTIE MET ANDERE KANALEN
	BTST.B	#2,SOUND_MODE(A0)		STAAT ER UBERHAUPT HARDWARE OP DIT KANAAL?
	BEQ.S	NO_HARDW_AUTO_A
	BTST.B	#3,SOUND_MODE(A0)		STAAT HARDWARE FREQUENCY OP AUTO?
	BEQ.S	NO_HARDW_AUTO_A
	LSR.W	#4,D0			DEEL FREQUENCY DOOR 16, VOOR HARDWARE FREQUENCY
	MOVE.B	#11,(A1)			HARDWARE FREQUENCY REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#12,(A1)
	CLR.B	(A2)			HI-BYTE FREQUENCY = 0
NO_HARDW_AUTO_A
	MOVE.B	#8,(A1)			VOLUME KANAAL A
	MOVE.B	PSGVOL(A0),(A2)
DO_NOUT_A

***** KANAAL B *****
	LEA	BDATA(PC),A0		ADRES VARIABELEN GEBIED KANAAL B
	MOVE.W	PSGFREQ(A0),D0		HAAL FREQUENCY BOTH BYTES
	MOVE.B	PSGFREQ(A0),D1		HAAL FREQUENCY HI-BYTE
	MOVE.B	#2,(A1)			TONE FREQ REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#3,(A1)
	MOVE.B	D1,(A2)			SCHRIJF HI-BYTE FREQUENCY
	TST.B	SILENT(A0)			STAAT DIT KANAAL AAN?
	BNE.S	NO_HARDW_AUTO_B		NEE -> LAAT HARDWARE FREQUENCY DAN -> VOORKOMT INTERFERENTIE MET ANDERE KANALEN
	BTST.B	#2,SOUND_MODE(A0)		STAAT ER UBERHAUPT HARDWARE OP DIT KANAAL?
	BEQ.S	NO_HARDW_AUTO_B
	BTST.B	#3,SOUND_MODE(A0)		STAAT HARDWARE FREQUENCY OP AUTO?
	BEQ.S	NO_HARDW_AUTO_B
	LSR.W	#4,D0			DEEL FREQUENCY DOOR 16, VOOR HARDWARE FREQUENCY
	MOVE.B	#11,(A1)			HARDWARE FREQUENCY REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#12,(A1)
	CLR.B	(A2)			HI-BYTE FREQUENCY = 0
NO_HARDW_AUTO_B
	MOVE.B	#9,(A1)			VOLUME KANAAL B
	MOVE.B	PSGVOL(A0),(A2)

***** KANAAL C *****
	LEA	CDATA(PC),A0		ADRES VARIABELEN GEBIED KANAAL C
	MOVE.W	PSGFREQ(A0),D0		HAAL FREQUENCY BOTH BYTES
	MOVE.B	PSGFREQ(A0),D1		HAAL FREQUENCY HI-BYTE
	MOVE.B	#4,(A1)			TONE FREQ REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#5,(A1)
	MOVE.B	D1,(A2)			SCHRIJF HI-BYTE FREQUENCY
	TST.B	SILENT(A0)			STAAT DIT KANAAL AAN?
	BNE.S	NO_HARDW_AUTO_C		NEE -> LAAT HARDWARE FREQUENCY DAN -> VOORKOMT INTERFERENTIE MET ANDERE KANALEN
	BTST.B	#2,SOUND_MODE(A0)		STAAT ER UBERHAUPT HARDWARE OP DIT KANAAL?
	BEQ.S	NO_HARDW_AUTO_C
	BTST.B	#3,SOUND_MODE(A0)		STAAT HARDWARE FREQUENCY OP AUTO?
	BEQ.S	NO_HARDW_AUTO_C
	LSR.W	#4,D0			DEEL FREQUENCY DOOR 16, VOOR HARDWARE FREQUENCY
	MOVE.B	#11,(A1)			HARDWARE FREQUENCY REGISTER
	MOVE.B	D0,(A2)			SCHRIJF LO-BYTE FREQUENCY
	MOVE.B	#12,(A1)
	CLR.B	(A2)			HI-BYTE FREQUENCY = 0
NO_HARDW_AUTO_C
	MOVE.B	#10,(A1)			VOLUME KANAAL C
	MOVE.B	PSGVOL(A0),(A2)
	MOVE.W	#$2500,SR			MFP INTERRUPTS WEER AAN
	RTS				KOM TERUG VAN ROUTINE

***** EFFECTEN *****
DO_FX	
	TST.B	SILENT(A0)			KIJK OF DIT KANAAL STIL MOET ZIJN
	BNE	DO_SILENT			JA -> CLEAR PSG VOLUME

***** EFFECTEN : ENVELOPE *****
* VOLUME VARIATIE
	BTST.B	#2,SOUND_MODE(A0)		KIJK OF HARDWARE ENVELOPE AAN STAAT
	BEQ.S	NO_HE			NEE -> DOE NIKS
	MOVE.B	#$10,PSGVOL(A0)		ZET VOLUME OP HARDWARE ENVELOPE
	BRA.S	TO_TIE			SPRING OVER REST HEEN
NO_HE
	MOVE.W	ENV_OFFS(A0),D0		HAAL ENVELOPE OFFSET
	MOVE.L	ENV_PTR(A0),A2		HAAL POINTER NAAR ENVELOPE
	MOVE.B	0(A2,D0.W),D1		HAAL LOKAAL VOLUME
	MOVE.B	G_VOL(A0),D2		HAAL GLOBAAL VOLUME
	ASL.B	#4,D2			VERMENIGVULDIG MET 16 VOOR OFFSET NAAR GOEDE TABEL
	ADD.B	D1,D2			TEL LOKAAL VOLUME BIJ GLOBAAL VOLUME
	ANDI.W	#$FF,D2			MAAK WORD VAN VOLUME
	LEA	VOLS(PC),A2		HAAL ADRES VOLUME TABELLEN
	MOVE.B	0(A2,D2.W),PSGVOL(A0)	BEREKEN VOLUME DAT UITEINDELIJK IN PSG MOET
* BEREKEN VOLGENDE OFFSET
	ADDQ.W	#1,D0			VERHOOG OFFSET
	CMP.W	ENV_SUS(A0),D0		ZIJN WE AAN HET BEGIN VAN DE RELEASE?
	BNE.S	NO_SUS_REP			NEE -> NIET SUSTAIN HERHALEN
	MOVE.W	ENV_ATT(A0),D0		JA -> ZET OFFSET WEER OP SUSTAIN
NO_SUS_REP
	CMP.W	ENV_REL(A0),D0		ZIJN WE AL (VOOR)BIJ HET EINDE?
	BLO.S	NO_REL			NEE -> VOLUME NIET 0 MAKEN
	BSET.B	#0,SILENT(A0)		ZET SILENT BIT VAN DIT KANAAL ZODAT DIT KANAAL ZODIREKT STIL IS
NO_REL
	MOVE.W	D0,ENV_OFFS(A0)		SLA OFFSET OP

***** EFFECTEN : TIE ***** 
* MOOIE OVERGANG TUSSEN TWEE VERSCHILLENDE FREQUENTIES
TO_TIE
	MOVE.W	TIE_STP(A0),D0		HAAL STAP VOOR TIE
	BEQ.S	NO_TIE			ALS TIE=0 -> GEEN TIE
	BMI.S	TIE_LO			BIJ NEGATIEVE STAP IS TARGET LAGER DAN HUIDIGE FREQ
	ADD.W	P_FREQ(A0),D0		VERHOOG FREQUENTIE MET STAP
	CMP.W	G_FREQ(A0),D0		IS DE FREQUENTIE OP GOEDE HOOGTE?
	BLT.S	NO_REACH_TIE_HI		ALS WERKELIJKE FREQUENTIE LAGER IS DAN ECHTE, ZIJN WE ER NOG NIET
	CLR.W	TIE_STP(A0)		WIS TIE STAP
	MOVE.W	G_FREQ(A0),D0		HAAL ECHTE FREQUENTIE -> SOMS WIJKT DE GEMAAKTE AF DOOR SCHEVE OFFSETS
NO_REACH_TIE_HI
	MOVE.W	D0,P_FREQ(A0)		ZET FREQUENTIE WEG
	BRA.S	NO_TIE			SLA TIE LO OVER
TIE_LO	ADD.W	P_FREQ(A0),D0		VERLAAG FREQUENTIE MET STAP
	CMP.W	G_FREQ(A0),D0		IS DE FREQUENTIE OP GOEDE HOOGTE?
	BGT.S	NO_REACH_TIE_LO		ALS WERKELIJKE FREQUENTIE HOGER IS DAN ECHTE, ZIJN WE ER NOG NIET
	CLR.W	TIE_STP(A0)		WIS TIE STAP
	MOVE.W	G_FREQ(A0),D0		HAAL ECHTE FREQUENTIE -> SOMS WIJKT DE GEMAAKTE AF DOOR SCHEVE OFFSETS
NO_REACH_TIE_LO
	MOVE.W	D0,P_FREQ(A0)		SLA FREQUENTIE OP
NO_TIE

***** EFFECTEN : VIBRATO *****
* FREQUENTIE VARIATIE
	MOVE.W	TREM_OFFS(A0),D1		HAAL OFFSET DAARIN
	ADD.W	VIBR_SPEED(A0),D1		VERHOOG OFFSET IN TREMOLO TABEL
	CMPI.W	#59,D1			ZIJN WE AL VOORBIJ HET EINDE
	BLS.S	NO_RE_TREM			NEE -> GA DOOR
	CLR.W	D1			BEGIN OPNIEUW AAN TABEL
NO_RE_TREM
	MOVE.W	D1,TREM_OFFS(A0)		SLA OFFSET WEER OP
	ASL.W	#1,D1			VERMENIG VULDIG MET 2 VOOR WORD TABEL
	LEA	TREM_TAB(PC),A2		HAAL POINTER NAAR TREMOLO TABEL
	MOVE.W	0(A2,D1.W),D1		PAK VARIATIE VAN FREQUENTIE
	MOVE.W	VIBR_DEPTH(A0),D2		HAAL DIEPTE VAN TREMOLO
	ASR.W	D2,D1			MAAK GOEDE DIEPTE TREMOLO AAN	
	ADD.W	P_FREQ(A0),D1		TEL ECHTE FREQUENTIE BIJ VARIATIE OP

***** EFFECTEN : INTERVALLEN *****
	MOVE.B	INT_NOW(A0),D0		BIJ WELKE INTERVAL ZIJN WE NU?
	BEQ.S	INTR_0			0=NORMALE FREQUENTIE
	CMPI.B	#1,D0			1=INTERVAL #1
	BEQ.S	INTR_1
	ADD.W	INT_FREQ2(A0),D1		TEL INTERVAL #2 BIJ HUIDIGE FREQUENTIE
	CLR.B	INT_NOW(A0)		VOLGENDE KEER 0
	BRA.S	INTR_2
INTR_1
	ADD.W	INT_FREQ1(A0),D1		TEL INTERVAL #1 BIJ HUIDIGE FREQUENTIE
INTR_0
	ADDI.B	#1,INT_NOW(A0)		VERHOOG INTERVAL COUNT
INTR_2
* LAAT FREQUENTIE IN D1

***** EFFECTEN : PITCH ENVELOPE *****
	TST.B	PIT_MODE(A0)		STAAT PITCH AAN (VERGELIJKBAAR MET SILENT BIT#0 VOOR AMPLITUDE ENVELOPE)
	BEQ.S	NO_PITCH			PITCH UIT -> TEL ER GEEN FREQUENTIE BIJ OP
	MOVE.W	PIT_OFFS(A0),D0		HAAL PITCH ENVELOPE OFFSET
	MOVE.L	PIT_PTR(A0),A2		HAAL POINTER NAAR ENVELOPE
	MOVE.B	0(A2,D0.W),D2		HAAL RELATIEVE FREQUENTIE
	EXT.W	D2			SIGN-EXTEND BYTE TOT WORD
	ADD.W	D2,D1			TEL RELATIEVE FREQUENTIE BIJ HUIDIGE FREQUENTIE	
* BEREKEN VOLGENDE OFFSET
	ADDQ.W	#1,D0			VERHOOG OFFSET
	CMP.W	PIT_SUS(A0),D0		ZIJN WE AAN HET BEGIN VAN DE RELEASE?
	BNE.S	NO_PIT_SUS_REP		NEE -> NIET SUSTAIN HERHALEN
	MOVE.W	PIT_ATT(A0),D0		JA -> ZET OFFSET WEER OP SUSTAIN
NO_PIT_SUS_REP
	CMP.W	PIT_REL(A0),D0		ZIJN WE AL (VOOR)BIJ HET EINDE?
	BLO.S	NO_PIT_REL			NEE -> VOLUME NIET 0 MAKEN
	CLR.B	PIT_MODE(A0)		PITCH AFGELOPEN -> ZET PITCH AFHANDELING UIT	
NO_PIT_REL
	MOVE.W	D0,PIT_OFFS(A0)		SLA OFFSET OP
NO_PITCH
	MOVE.W	D1,PSGFREQ(A0)		SLA FREQUENTIE OP
	RTS
DO_SILENT
	CLR.B	PSGVOL(A0)	WIS PSG VOLUME
	RTS
***** EINDE FX *****

***** LEES NOOT *****
GETNOTE
	TST.B	(A1)			BEKIJK NOOT/OCTAAF
	BEQ	TEST_ENV			ALS OCTAAF/NOOT = 0 -> GEEN VERANDERING, MAAR BEKIJK ENVELOPE
	BMI	SAM_NOTE			ALS OCTAAF/NOOT < 0 -> LEES SAMPLE

***** NOOT : INSTRUMENT ******
	MOVE.B	2(A1),D1			HAAL INSTRUMENT NUMMER
	CMP.B	INSTR_NO(A0),D1		HEBBEN WE DIT INSTRUMENT AL?
	BEQ	SAME_INSTR	J		A -> GA DOOR
	CMP.B	#$3F,D1			VERGELIJK YMS# MET MAXIMUM ($3F=63)
	BHI	SAME_INSTR			ALS D0>MAXIMUM -> VERKEERD NUMMER EN NEGEER DIT INSTRUMENT DUS
	MOVE.B	D1,INSTR_NO(A0)		SLA INSTRUMENT NUMMER OP VOOR VERGELIJKING
	ANDI.W	#$3F,D1			MAAK WORD VAN YM SOUND
	LEA	YM_SOUNDS(PC),A2		HAAL ADRES BEGIN YM SOUNDS
	ASL.W	#8,D1			MAAL 256(=LENGTE 1 YM SOUND)
	ADD.W	D1,A2			TEL DIE OFFSET OP BIJ START ADRES
	MOVE.W	I_NOISE_FREQ(A2),D0		HAAL FREQUENTIE RUIS
	MOVE.W	D0,NOISE_FREQ(A0)		SLA OP
	BTST.B	#1,I_SOUND_MODE(A2)		HEEFT DIT INSTRUMENT NOISE AAN?
	BEQ.S	NO_INSTR_NOISE		NEE -> ZET FREQUENTIE DAN NIET IN PSG
	MOVE.W	#$2700,SR			DISABLE MFP INTERRUPTS
	MOVE.B	#6,(PSGREG).W		REGISTER #6 : NOISE FREQ
	MOVE.B	D0,(PSGWRITE).W
	MOVE.W	#$2500,SR			RE-ENABLE MFP INTERRUPTS
NO_INSTR_NOISE
	MOVE.B	I_SOUND_MODE(A2),SOUND_MODE(A0)	HAAL SOUND MODE
	MOVE.W	I_ENV_FREQ(A2),H_ENV_FREQ(A0)	HAAL FREQUENTIE HARDWARE ENVELOPE
	MOVE.B	I_ENV_TYPE(A2),H_ENV_TYPE(A0)	HAAL TYPE HARDWARE ENVELOPE
	MOVE.W	I_VIBR_SPEED(A2),VIBR_SPEED(A0)	HAAL SNELHEID VAN VIBRATO
	MOVE.W	I_VIBR_DEPTH(A2),VIBR_DEPTH(A0)	HAAL DIEPTE VAN VIBRATO
	MOVE.W	I_INTERVAL1(A2),INTERVAL1(A0)	HAAL INTERVAL #1
	MOVE.W	I_INTERVAL2(A2),INTERVAL2(A0)	HAAL INTERVAL #2
	CLR.W	ENV_OFFS(A0)		CLEAR ENVELOPE OFFSET
	MOVE.W	I_ENV_ATTACK(A2),ENV_ATT(A0)	HAAL ATTACK EINDE
	MOVE.W	I_ENV_SUSTAIN(A2),ENV_SUS(A0)	HAAL SUSTAIN EINDE
	MOVE.W	I_ENV_RELEASE(A2),ENV_REL(A0)	HAAL RELEASE EINDE
	LEA	I_ENV_START(A2),A3		HAAL START ENVELOPE TABEL
	MOVE.L	A3,ENV_PTR(A0)			
	CLR.W	PIT_OFFS(A0)		CLEAR PITCH ENVELOPE OFFSET
	MOVE.W	I_PIT_ATTACK(A2),PIT_ATT(A0)	HAAL PITCH ATTACK EINDE
	MOVE.W	I_PIT_SUSTAIN(A2),PIT_SUS(A0)	HAAL PITCH SUSTAIN EINDE
	MOVE.W	I_PIT_RELEASE(A2),PIT_REL(A0)	HAAL PITCH RELEASE EINDE
	LEA	I_PIT_START(A2),A3		HAAL START PITCH ENVELOPE TABEL
	MOVE.L	A3,PIT_PTR(A0)			
	ST.B	PIT_MODE(A0)		ZET PITCH AAN
SAME_INSTR

***** NOOT : OCTAAF & NOOT *****
	MOVEQ	#0,D0			MAAK D0 LEEG ZODAT WE HET ZODIREKT ALS WORD KUNNEN BEHANDELEN
	MOVE.B	(A1),D0			HAAL OCTAAF(0-7) & NOOT (0-24 IN STAPPEN VAN 2)
	MOVE.W	D0,D1			MAAK BACKUP VAN OCTAAF
	LSR.W	#4,D1			HAAL OCTAAF# NAAR GOEDE PLAATS
	LEA	NOTE_2_FREQ(PC),A2		HAAL POINTER NAAR NOOT->FREQ OMREKEN TABEL
	ANDI.W	#$F,D0			MASKEER NOOT
	MOVE.W	D0,D2			BEWAAR NOOT EN GEBRUIK D2
	ASL.W	#1,D2			MAAL 2 VOOR OFFSET IN WORD TABEL
	MOVE.W	0(A2,D2.W),D2		HAAL BIJHORENDE FREQUENTIE IN OCTAAF 1 (IS HIER OCTAAF 0)
	LSR.W	D1,D2			VERDUBBEL FREQUENTIE ZOVAAK ALS OCTAAF NUMMER-1
	MOVE.W	D2,G_FREQ(A0)		SLA VERKREGEN FREQUENTIE OP
	MOVE.W	D0,D3			BEWAAR NOOT EN GEBRUIK D3
	ADD.W	INTERVAL1(A0),D3		TEL INTERVAL BIJ NOOT# OP
	ASL.W	#1,D3			MAAL 2 VOOR OFFSET IN WORD TABEL
	MOVE.W	0(A2,D3.W),D3		HAAL BIJHORENDE FREQUENTIE IN OCTAAF 1 (IS HIER OCTAAF 0)
	LSR.W	D1,D3			VERDUBBEL FREQUENTIE ZOVAAK ALS OCTAAF NUMMER-1
	SUB.W	D2,D3			HAAL VAN NIEUWE FREQUENTIE OORSPRONKELIJKE FREQUENTIE AF, VOOR RELATIVE FREQUENTIE
	MOVE.W	D3,INT_FREQ1(A0)		SLA INTERVAL FREQUENCY OP
	ADD.W	INTERVAL2(A0),D0		TEL INTERVAL BIJ NOOT# OP
	ASL.W	#1,D0			MAAL 2 VOOR OFFSET IN WORD TABEL
	MOVE.W	0(A2,D0.W),D0		HAAL BIJHORENDE FREQUENTIE IN OCTAAF 1 (IS HIER OCTAAF 0)
	LSR.W	D1,D0			VERDUBBEL FREQUENTIE ZOVAAK ALS OCTAAF NUMMER-1
	SUB.W	D2,D0			HAAL VAN NIEUWE FREQUENTIE OORSPRONKELIJKE FREQUENTIE AF, VOOR RELATIVE FREQUENTIE
	MOVE.W	D0,INT_FREQ2(A0)		SLA INTERVAL FREQUENCY OP

***** NOOT : TIE *****
	MOVE.B	1(A1),D1			HAAL TIE WAARDE
	BEQ.S	NO_CALC_TIE		ALS TIE VALUE=0 DAN IS ER GEEN TIE
CALC_TIE
*IN D2 ZIT HUIDIGE FREQUENTIE NOG
	SUB.W	P_FREQ(A0),D2		TREK HUIDIGE FREQUENTIE VAN TARGET FREQ AF VOOR STEP
	EXT.L	D2			MAAK LONG VAN STEP VOOR DELEN
	ANDI.L	#$FF,D1			MAAK LONG VAN AANTAL TE 'TIE'EN NOTEN
	MULS.W	SPEED-MUSIC(A6),D1		VERMENIGVULDIG " MET SPEED
	DIVS.W	D1,D2			DEEL D2 DOOR SNELHEID*NOTEN VOOR TIE STAP
	BEQ.S	NO_CALC_TIE		ALS TIE STAP=0 ZET FREQ METEEN GOED
	MOVE.W	D2,TIE_STP(A0)		SLA TIE STAP OP
	BRA.S	YES_CALC_TIE
NO_CALC_TIE
	MOVE.W	G_FREQ(A0),P_FREQ(A0)		ZET GLOBALE FREQUENTIE METEEN ALS HUIDIGE FREQUENTIE
	CLR.W	TIE_STP(A0)		CLEAR TIE STAP
YES_CALC_TIE

***** NOOT : VOLUME ******
	MOVE.B	3(A1),D0			HAAL ENVELOPE/VOLUME
	ANDI.W	#$1F,D0			MASKEER VOLUME EN VERWIJDER ENVELOPE EN MAAK ER TEGELIKERTIJD EEN WORD VAN
	MOVE.B	D0,G_VOL(A0)		SLA VOLUME OP

***** NOOT : ENVELOPE *****
TEST_ENV
	ADDQ.L	#3,A1
	MOVE.B	(A1)+,D1			HAAL ENVELOPE VALUE(& VOLUME)
	LSR.B	#6,D1			VERSCHUIF HEM NAAR DE ONDERSTE BITS EN VERWIJDER VOLUME
	TST.B	D1		
	BEQ.S	SAME_ENV			ALS ENVELOPE VALUE=0 (NO_CHANGE), DAN NIKS VERANDEREN
	BTST.B	#2,SOUND_MODE(A0)		WORDT HARDWARE ENVELOPE OP DIT KANAAL GESPEELD?
	BNE.S	HE_ADSR			JA -> VOER DAT SOORT ENVELOPE UIT
	CMPI.B	#1,D1			IS ENVELOPE VALUE DAN 1?
	BEQ.S	ATTACK_ENV			JA -> DOE ATTACK DEEL VAN ENVELOPE
	CMPI.B	#2,D1			IS ENVELOPE VALUE DAN 2?
	BEQ.S	SUSTAIN_ENV		JA -> BEGIN ENVELOPE BIJ SUSTAIN
* DAN MAAR RELEASE DOEN :
	MOVE.W	ENV_SUS(A0),ENV_OFFS(A0)	ZET OFFSET OP BEGIN RELEASE
	MOVE.W	PIT_SUS(A0),PIT_OFFS(A0)	ZET PITCH OFFSET OP BEGIN RELEASE
	BCLR.B	#0,SILENT(A0)		CLEAR SILENT BIT
	ST.B	PIT_MODE(A0)		ZET PITCH AAN
	RTS
SUSTAIN_ENV
	MOVE.W	ENV_ATT(A0),ENV_OFFS(A0)	ZET OFFSET OP BEGIN SUSTAIN
	MOVE.W	PIT_ATT(A0),PIT_OFFS(A0)	ZET PITCH OFFSET OP BEGIN SUSTAIN
	BCLR.B	#0,SILENT(A0)		CLEAR SILENT BIT
	ST.B	PIT_MODE(A0)		ZET PITCH AAN
	RTS
ATTACK_ENV
	CLR.W	ENV_OFFS(A0)		DOE ATTACK DEEL VAN ENVELOPE -> ZET OFFSET OP 0
	CLR.W	PIT_OFFS(A0)		ZET PITCH ENVELOPE GOED
	CLR.W	TREM_OFFS(A0)		ZET TREMOLO OFFSET OP BEGIN ZODAT IEDERE NOOT HETZELFDE KLINKT
	BCLR.B	#0,SILENT(A0)		CLEAR SILENT BIT
	ST.B	PIT_MODE(A0)		ZET PITCH AAN
	MOVE.W	#$2700,SR			INTERRUPTS UIT
	BCLR.B	#1,SILENT(A0)		CLEAR SAMPLE BIT
	BEQ.S	DONT_STOP_SAM		ALS ER GEEN SAMPLE OP DIT KANAAL GESPEELD WERD -> DOE NIKS
	BCLR.B	#TA_BN,(IERA).W		WEL SAMPLE HIER -> ZET TIMER A UIT
DONT_STOP_SAM
	MOVE.W	#$2500,SR			INTERRUPTS WEER AAN
SAME_ENV
	RTS				KOM TERUG VAN SUBROUTINE
***** EINDE NOOT *****

***** HARDWARE ENVELOPE ADSR *****
HE_ADSR	TST.B	D1			IS ENVELOPE VALUE DAN 0?
	BEQ.S	CONT_HE			JA -> LAAT ENVELOPE ALS HIJ IS
	CMPI.B	#2,D1			IS ENVELOPE VALUE DAN 2?
	BEQ.S	SUSTAIN_HE			JA -> BEGIN ENVELOPE BIJ SUSTAIN
	CMPI.B	#3,D1			IS ENVELOPE VALUE DAN 3?
	BEQ	RELEASE_HE			JA -> BEGIN ENVELOPE BIJ RELEASE
* ATTACK:
	MOVE.W	#$2700,SR			GEEN ODERBREKING GRAAG
	BTST.B	#3,SOUND_MODE(A0)		STAAT HARDWARE AUTOMATIC FREQUENCY AAN?
	BNE.S	ATTACK_HARDW_AUTO		JA -> ZET FREQUENCY NIET; DAT DOET PSGFREQ LATER
	MOVE.B	#11,(PSGREG).W		HARDWARE ENVELOPE FREQUENCY
	MOVE.B	H_ENV_FREQ+1(A0),(PSGWRITE).W
	MOVE.B	#12,(PSGREG).W		
	MOVE.B	H_ENV_FREQ(A0),(PSGWRITE).W
ATTACK_HARDW_AUTO
	MOVE.B	#13,(PSGREG).W		SELECTEER HARDWARE ENVELOPE TYPE REGISTER
	BTST.B	#0,H_ENV_TYPE(A0)		IS DIT EEN ENKELVOUDIGE ENVELOPE(NIET CONTINIOUS)
	BNE.S	YES_HARDW_TYPE		JA -> ZET HARDWARE TYPE IN PSG OM WEER AAN HET BEGIN TE BEGINNEN
	MOVE.B	(PSGREG).W,D0		NEE -> ZET HARDWARE FREQUENTIE ALLEEN NEER ALS DIE ER NIET AL STAAT -> ZET HARDWARE FREQ ZO MIN MOGELIJK IN PSG, OM KRAKEN TEGEN TE GAAN
	CMP.B	H_ENV_TYPE(A0),D0		STAAT GOEDE HARDWARE TYPE AL IN PSG?
	BEQ.S	NO_HARDW_TYPE		JA -> LAAT HET MAAR
YES_HARDW_TYPE
	MOVE.B	H_ENV_TYPE(A0),(PSGWRITE).W	ZET HARDWARE ENVELOPE TYPE IN PSG
NO_HARDW_TYPE
	CLR.W	TREM_OFFS(A0)		ZET TREMOLO OFFSET OP BEGIN ZODAT IEDERE NOOT HETZELFDE KLINKT
	CLR.W	PIT_OFFS(A0)		ZET PITCH OFFSET OP BEGIN ATTACK
	ST.B	PIT_MODE(A0)		ZET PITCH ENVELOPE AAN
	BCLR.B	#0,SILENT(A0)		CLEAR SILENT BIT
	BCLR.B	#1,SILENT(A0)		CLEAR SAMPLE BIT
	BEQ.S	SAME_HE			ALS ER GEEN SAMPLE OP DIT KANAAL GESPEELD WERD -> DOE NIKS
	BCLR.B	#TA_BN,(IERA).W		WEL SAMPLE HIER -> ZET TIMER A UIT
SAME_HE
	MOVE.W	#$2500,SR
CONT_HE
	RTS
* SUSTAIN:
SUSTAIN_HE
	MOVE.W	#$2700,SR			GEEN ODERBREKING GRAAG
	BTST.B	#3,SOUND_MODE(A0)		STAAT HARDWARE AUTOMATIC FREQUENCY AAN?
	BNE.S	SUSTAIN_HARDW_AUTO		JA -> ZET FREQUENCY NIET; DAT DOET PSGFREQ LATER
	MOVE.B	#11,(PSGREG).W		HARDWARE ENVELOPE FREQUENCY
	MOVE.B	H_ENV_FREQ+1(A0),(PSGWRITE).W
	MOVE.B	#12,(PSGREG).W		
	MOVE.B	H_ENV_FREQ(A0),(PSGWRITE).W
SUSTAIN_HARDW_AUTO
	MOVE.B	#13,(PSGREG).W		SELECTEER HARDWARE ENVELOPE TYPE REGISTER
	BTST.B	#0,H_ENV_TYPE(A0)		IS DIT EEN ENKELVOUDIGE ENVELOPE(NIET CONTINIOUS)
	BNE.S	YES_SUS_HTYPE		JA -> ZET HARDWARE TYPE IN PSG OM WEER AAN HET BEGIN TE BEGINNEN
	MOVE.B	(PSGREG).W,D0		NEE -> ZET HARDWARE FREQUENTIE ALLEEN NEER ALS DIE ER NIET AL STAAT -> ZET HARDWARE FREQ ZO MIN MOGELIJK IN PSG, OM KRAKEN TEGEN TE GAAN
	CMP.B	H_ENV_TYPE(A0),D0		STAAT GOEDE HARDWARE TYPE AL IN PSG?
	BEQ.S	NO_SUS_HTYPE		JA -> LAAT HET MAAR
YES_SUS_HTYPE
	MOVE.B	H_ENV_TYPE(A0),(PSGWRITE).W	ZET HARDWARE ENVELOPE TYPE IN PSG
NO_SUS_HTYPE
	CLR.W	TREM_OFFS(A0)		ZET TREMOLO OFFSET OP BEGIN ZODAT IEDERE NOOT HETZELFDE KLINKT
	MOVE.W	PIT_ATT(A0),PIT_OFFS(A0)	ZET PITCH OFFSET OP BEGIN SUSTAIN(=EINDE ATTACK)
	ST.B	PIT_MODE(A0)		ZET PITCH ENVELOPE AAN
	BCLR.B	#0,SILENT(A0)		CLEAR SILENT BIT
	BCLR.B	#1,SILENT(A0)		CLEAR SAMPLE BIT
	BEQ.S	SAME_SUS_HE		ALS ER GEEN SAMPLE OP DIT KANAAL GESPEELD WERD -> DOE NIKS
	BCLR.B	#TA_BN,(IERA).W		WEL SAMPLE HIER -> ZET TIMER A UIT
SAME_SUS_HE
	MOVE.W	#$2500,SR
	RTS
* RELEASE:
RELEASE_HE
	BSET.B	#0,SILENT(A0)		ZET SILENT BIT
	RTS

***** LEES SAM NOOT *****
SAM_NOTE
	BTST.B	#2,SILENT(A0)		MOETEN WE MUTEN?
	BNE.S	NO_NEW_SAM			ALS MUTE BIT=1 -> KANAAL WORDT GEMUTE
	MOVE.B	2(A1),D0			HAAL SAMPLE NUMMER
	ANDI.W	#$F,D0			NEEM ALLEEN LAAGSTE NIBBLE EN MAAK ER EEN WORD VAN
	LEA	SAM_TAB(PC),A2		HAAL ADRES SAMPLE TABEL
	ASL.W	#2,D0			VOOR OFFSET IN TABEL MET LONGS
	MOVE.W	#$2700,SR			MFP INTERRUPTS UIT
* PUT DIGIT ADR
	MOVE.L	0(A2,D0.W),A2
	LEA.L	SAM_ADR+2(PC),A3
	SUB.L	A3,A2
	MOVE.W	A2,SAM_ADR+2-MUSIC(A6)
	MOVE.B	1(A1),D0			HAAL HERTZ
	ANDI.W	#$F,D0			NEEM ALLEEN LAAGSTE NIBBLE EN MAAK ER EEN WORD VAN
	LEA	HERTZ(PC),A2		START OF HERTZ -> SPEED CONVERSION TABLE
	MOVE.B	0(A2,D0.W),(TADR).W		CONVERT HERTZ INTO TIMER A DATA
	MOVE.B	#%010,SILENT(A0)		ZODAT DE REG 7 ROUTINE WEET DAT ER EEN SAMPLE GESPEELD WORDT EN TOON EN RUIS DUS UIT MOETEN
	BSET.B	#TA_BN,(IERA).W		TIMER A WEER AAN
	MOVE.W	#$2500,SR			MFP INTERRUPTS WEER AAN
NO_NEW_SAM
	ADDQ.L	#4,A1			SCHUIF POINTER IN PATTERN REGEL OP
	RTS				EINDE	

***** SAMPLE INTERRUPT ROUTINE *****
* TIMER A INTERRUPT ROUTINE : SPEELT SAMPLE AF
TIMER_A
	MOVE.B	#8,$FFFF8800.W		PSG REGISTER 8 = VOLUME KANAAL A
SAM_ADR
	MOVE.B	SAM_ADR(PC),$FFFF8802.W	ZET VOLUME
	BMI.S	NEXTSAM			IF VOLUME<0 -> SAMPLE FINISHED -> CLEAR INTERRUPT
ADD_ADR
	ADDQ.W	#1,$12345678
	RTE				RETURN FROM EXCEPTION
NEXTSAM	
	CLR.B	(PSGWRITE).W
REST_ADR
	MOVE.B	#%001,$12345678
	BCLR.B	#TA_BN,(IERA).W		ZET TIMER A UIT
	RTE				RETURN FROM EXCEPTION
***** EINDE SAMPLE INTERRUPT ROUTINE *****

VOICE_SET	
	INCBIN	"F:\INSIGNIA\SONGS\INSIGNIA.TVS"
FIN_VSET	EQU	*
	EVEN
	IFGT	((FIN_VSET-(SAM_ADR+2))-32768)
	FAIL	* VOICE SET TROP GRANDE *
	ENDC
*-----------------------------------------------------------------------------
YM_NAMES	EQU	VOICE_SET+4
YM_SOUNDS	EQU	VOICE_SET+64*8+4
SAM_NAMES	EQU	VOICE_SET+64*8+64*I_TOTAL_LEN+4
SAM_LEN	EQU	VOICE_SET+64*8+64*I_TOTAL_LEN+16*8+4
SAM_RATES	EQU	VOICE_SET+64*8+64*I_TOTAL_LEN+16*8+32*4+4
SAM_FIRST	EQU	VOICE_SET+64*8+64*I_TOTAL_LEN+16*8+32*4+16+4

SAV_USP
	DS.L	1
SAV_134
	DS.L	1
SAV_VECTOR	
	DS.L	1

*-----------------------------------------------------------------------------
BSS_SECTION			* A EFFACER !!!
; CHANNEL B DATA-FIELD
BDATA	
PSGFREQ	EQU	*-BDATA
	DS.W	1		FREQUENTIE DIE UITEINDELIJK IN PSG MOET
G_FREQ	EQU	*-BDATA
	DS.W	1		GLOBALE (NOOT-) FREQUENTIE (WAAROM LONG? -UPPER WORD GAAT NAAR PSG, LOWER WORD IS ACHTER DE KOMMA)
P_FREQ	EQU	*-BDATA
	DS.W	1		HUIDIGE FREQUENTIE ZONDER TREMOLO(BIJ TIE BELANGRIJK)
TIE_STP	EQU	*-BDATA
	DS.W	1		STAP VAN TIE
TREM_OFFS	EQU	*-BDATA
	DS.W	1		OFFSET IN TREMOLO TABEL
VIBR_SPEED	EQU	*-BDATA
	DS.W	1		SNELHEID VAN TREMOLO
VIBR_DEPTH	EQU	*-BDATA
	DS.W	1		DIEPTE VAN TREMOLO
PSGVOL	EQU	*-BDATA
	DS.B	1		VOLUME DAT UITEINDELIJK IN PSG MOET
G_VOL	EQU	*-BDATA
	DS.B	1		GLOBAAL VOLUME
	EVEN
ENV_PTR	EQU	*-BDATA
	DS.L	1		POINTER NAAR ENVELOPE TABEL
ENV_OFFS	EQU	*-BDATA
	DS.W	1		OFFSET IN DIE TABEL
ENV_ATT	EQU	*-BDATA
	DS.W	1		OFFSET EINDE ATTACK
ENV_SUS	EQU	*-BDATA
	DS.W	1		OFFSET EINDE SUSTAIN
ENV_REL	EQU	*-BDATA
	DS.W	1		OFFSET EINDE RELEASE
	EVEN
PIT_PTR	EQU	*-BDATA
	DS.L	1		POINTER NAAR PITCH ENVELOPE TABEL
PIT_OFFS	EQU	*-BDATA
	DS.W	1		OFFSET IN PITCH ENVELOPE TABEL
PIT_ATT	EQU	*-BDATA
	DS.W	1		OFFSET EINDE PITCH ATTACK
PIT_SUS	EQU	*-BDATA
	DS.W	1		OFFSET EINDE PITCH SUSTAIN
PIT_REL	EQU	*-BDATA
	DS.W	1		OFFSET EINDE PITCH RELEASE
PIT_MODE	EQU	*-BDATA
	DS.B	1		<>0 : PITCH STAAT AAN
	EVEN
NOISE_FREQ	EQU	*-BDATA
	DS.W	1		FREQUENTIE RUIS VOOR PSG
SOUND_MODE	EQU	*-BDATA
	DS.B	1		MASKER VOOR REG #7
H_ENV_TYPE	EQU	*-BDATA
	DS.B	1		TYPE HARDWARE ENVELOPE
	EVEN
H_ENV_FREQ	EQU	*-BDATA
	DS.W	1		FREQUENTIE HARDWARE ENVELOPE
INTERVAL1	EQU	*-BDATA
	DS.W	1		INTERVAL #1 IN AANTAL NOTEN
INTERVAL2	EQU	*-BDATA
	DS.W	1		INTERVAL #2 IN AANTAL NOTEN
INT_FREQ1	EQU	*-BDATA
	DS.W	1		INTERVAL #1 IN RELATIEVE FREQUENCY
INT_FREQ2	EQU	*-BDATA
	DS.W	1		INTERVAL #2 IN RELATIEVE FREQUENCY
INT_NOW	EQU	*-BDATA
	DS.B	1		WELKE INTERVAL ZIJN WE? (0=NORMAAL, 1=INTERVAL #1, 2=INTERVAL #2)
INSTR_NO	EQU	*-BDATA		NUMMER HUIDIGE INSTRUMENT (OM TE VERGELIJKEN)
	DS.B	1
SILENT	EQU	*-BDATA		ALS BYTE<>0 MOETEN WE SIL ZIJN
	DS.B	1
V_S_S_LEN	EQU	*-BDATA		LENGTE HELE TABEL OM ZO IN 1 KEER VOICE STATUS STRUCTURE VOOR CHANNEL C TE DEFINIEREN
	EVEN
CDATA	
	DS.B	V_S_S_LEN		ZELFDE TABEL ALS BOVEN VOOR KANAAL C
	EVEN
ADATA	
	DS.B	V_S_S_LEN		EN NOG EEN KEER VOOR KANAAL A
***** VOOR REC & PLAY ROUTINES : *****
		EVEN

NOTE_COUNT
	DS.W	1		VOORDELER VOOR NOOT-SNELHEID (ALTIJD BEGINNEN MET 1)
POS_NOW	
	DS.W	1		HUIDIGE POSITION
PAT_NOW
	DS.W	1		HUIDIGE PATTERN
PAT_TAB	
	DS.L	120		TABEL MET POINTERS NAAR PATTERNS
PAT_BASE	
	DS.L	1		POINTER NAAR BEGIN HUIDIGE PATTERN
PAT_LIN	
	DS.W	1		PATTERN REGEL
PAT_PTR
	DS.L	1		POINTER NAAR HUIDIGE PLAATS IN PATTER(=PAT_BASE+14*

ENV_0	
	DS.B	10		10 LEGE BYTES ALS VALSE ENVELOPE
***** ALGEMENE VARIABELEN *****
	EVEN
SAM_TAB	
	DS.L	32	POINTERS NAAR SAMPLES (LAATSTE 16 ZIJN LOZE POINTERS)
SAM_TOT	
	DS.L	1	TOTALE LENGTE SAMPLES
END_BSS
	EVEN
*-----------------------------------------------------------------------------
VOLS
	DC.B	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	DC.B	0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
	DC.B	0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2
	DC.B	0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3
	DC.B	0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4
	DC.B	0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5
	DC.B	0,0,1,1,2,2,2,3,3,4,4,4,5,5,6,6
	DC.B	0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7
	DC.B	0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8
	DC.B	0,1,1,2,2,3,4,4,5,5,6,7,7,8,8,9
	DC.B	0,1,1,2,3,3,4,5,5,6,7,7,8,8,9,10
	DC.B	0,1,1,2,3,4,4,5,6,7,7,8,9,10,10,11
	DC.B	0,1,2,2,3,4,5,6,6,7,8,9,10,10,11,12
	DC.B	0,1,2,3,3,4,5,6,7,8,9,10,10,11,12,13
	DC.B	0,1,2,3,4,5,6,7,7,8,9,10,11,12,13,14
	DC.B	0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
	EVEN
NOTE_2_FREQ
	DS.W	1	LEGE RUIMTE WANT ALS NOOT=0 -> GEEN VERANDERING
;		C    C#   D    D#   E    F
	DC.W	3822,3607,3405,3214,3033,2863
	DC.W	2702,2551,2407,2272,2145,2024
;		F#   G    G#   A    A#   B
;			ZELFDE NOTEN IN VOLGENDE OCTAAF VOOR INTERVALLEN
	DC.W	1991,1804,1703,1607,1517,1432
	DC.W	1351,1276,1204,1136,1073,1012
;
	EVEN
* TABLE CONVERSION FREQUENCE KHZ(0...15)->TIMER A DATA REGISTER
HERTZ	
	DC.B	110,110,110,110
	DC.B	110,110,94,82
	DC.B	73,66,60,55
	DC.B	51,47,44,41
	EVEN
TREM_TAB
	DC.W	0, 428, 852,1266,1666,2048,2408,2741,3044,3314
	DC.W	3547,3742,3896,4006,4074,4096,4074,4006,3896,3742
	DC.W	3547,3314,3044,2741,2408,2048,1666,1266,0852,0428
	DC.W	0, -428, -852,-1266,-1666,-2048,-2408,-2741,-3044,-3314
	DC.W	-3547,-3742,-3896,-4006,-4074,-4096,-4074,-4006,-3896,-3742
	DC.W	-3547,-3314,-3044,-2741,-2408,-2048,-1666,-1266, -852, -428
	EVEN
***** YM SOUND DATA & SAMPLES *****
		EVEN
***** SONG DATA *****
	EVEN
SONG
	INCBIN	"F:\INSIGNIA\SONGS\ROLLING.TRI"
FIN_SONG	EQU	*
SPEED	EQU	SONG+4
RESTART	EQU	SONG+6
LAST_POS	EQU	SONG+8
LAST_PAT	EQU	SONG+10
POS_TAB	EQU	SONG+12
PATTERNS	EQU	SONG+132
PAT_LAST
	DC.B	" -END OF FILE-",0
MUSIC_FIN
	END

