;*******************************************************************************
; C H A M E L E O N   DSP Assembler file                                       *
;*******************************************************************************
;Aleix Riera
;www.fjarre.com/~aleix
;aleix@fjarre.com
;*******************************************************************************
;
; MODULE: SAT (with interpolation)
;
;	Out[i]=In + over*sample_table - over*In
;	sample_table=smp0 + frac*smp1 - frac*smp0
;
;	NOTE: We reuse the R_X and N_X registers (due to its usage is
;		limited to pass the parameters)
;
; ARGUMENTS:
;	(X)   = InAddr		- Input Stereo buffer (L)
;	(X+1) = OutAddr 	- Output stereo DMAbuffer (L)
;	(X+2) = TableAddr	- Saturator Table address (X)
;	(X+3) = Tablelenght-1	- Table HALF Length
;	(X+4) = Overdrive	- Amount of "morph"
;
;******************************************************************************
module_sat:
	define	R_InL			'R1'
	define	R_InR			'R5'
	define	R_OutL			'R2'
	define	R_OutR			'R6'
	define	R_Table0		'R3'
	define	N_Table0		'N3'
	define	R_Table1		'R7'
	define	N_Table1		'N7'
	define	N_Tablelenhalf		'N1'
	define	N_Over			'N2'

;===============================CODE=====================================

	MOVE	X:(R_X),R_InL
	MOVE	X:(R_X)+,R_InR
	MOVE	X:(R_X),R_OutL
	MOVE	X:(R_X)+,R_OutR
	MOVE	X:(R_X)+,R_Table0
	MOVE	X:(R_X)+,Y1
	MOVE	X:(R_X),N_Over
	
	MOVE	R_Table0,R_X
	MOVE	R_Table0,R_Table1
	MOVE			X:(R_InL),X0			Y:(R_InR),Y0
	MOVE							Y1,N_Tablelenhalf
	MPY	Y1,X0,A		(R_X)+
	MPY	Y1,Y0,B		(R_Table1)+
	
	.LOOP	#BUFFER_SIZE
	;----------------------------------------------------------------
	ADD	Y1,A		(R_Table1)-
	ADD	Y1,B
	MOVE	A,N_X
	MOVE	A,N_Table0
	MOVE	B,N_Table1
	MOVE	#ZERO,A1
	MOVE	#ZERO,B1
	ASL	#<23,A,A
	ASL	#<23,B,B
	MOVE			X:(R_Table0+N_Table0),A		A,Y0
	MOVE			X:(R_Table1+N_Table1),B		B,Y1
	MOVE			X:(R_X+N_X),X1
	MAC	Y0,X1,A		A,X1
	MAC	-Y0,X1,A	(R_Table1)+
	MOVE			X:(R_Table1+N_Table1),X1
	MAC	Y1,X1,B						B,Y0
	MAC	-Y1,Y0,B					N_Over,Y1
	MOVE			X:(R_InL)+,A			A,Y0
	MOVE			B,X1				Y:(R_InR)+,B
	MAC	Y1,Y0,A		A,X0
	MAC	-Y1,X0,A	X:(R_InL),X0
	MAC	Y1,X1,B		B,X1				Y:(R_InR),Y0
	MAC	-Y1,X1,B					N_Tablelenhalf,Y1
	MPY	Y1,X0,A		A,X:(R_OutL)+
	MPY	Y1,Y0,B						B,Y:(R_OutR)+
	.ENDL

;===============================CODE=====================================

	undef	R_InL
	undef	R_InR
	undef	R_OutL
	undef	R_OutR
	undef	R_Table0
	undef	N_Table0
	undef	R_Table1
	undef	N_Table1
	
	RTS