;-------------------------------------------------------------
;  Exemple de programme DSP
; Par Major-X  et Thorin,The mighty coders,death to false code
;-------------------------------------------------------------

;-------------------------------------------------------------
; Cet exemple reoit une adresse ecran du 68030 et renvoie 
; ce dernier les points d'une jolie courbe parametre
;-------------------------------------------------------------

;-------------------------------------------------------------
; Cette courbe aura des coordonnes de forme 
; (sina*sinb,sinc*sind)a,b,c,d etant increments differemment,bien sur
;-------------------------------------------------------------

;-------------------------------------------------------------
;L'exemple utilise les instructions et modes d'adressages typiques
; du DSP,ainsi que quelques instructions paralleles
;-------------------------------------------------------------

PBC	equ	$ffe0
HSR	equ	$ffe9
HTX	equ	$ffeb
	org	p:$0
	jmp	start
	org	P:$40
	
start:	
	movep	#1,X:PBC	;On configure le port B en port HOST

	move	#-1,m0		;On met r0 en lineaire
	move	#sinus,r0	;On effectue cette boucle pour
	move	#4096,r7
	do	r7,get_sintab	;charger les 4096 sinus dans le DSP
star:	jclr	#0,X:HSR,star	;lors de l'initialisation de la
	move	X:HTX,x0	;la routine.
	move	x0,X:(r0)+	
get_sintab:
	
	move	#4096-1,m0	;On va utiliser des buffers circulaires de
	move	m0,m1		;4096 mots pour les sinus
	move	m0,m4
	move	m0,m5
	move	m0,m3
	move	#-1,m2
	move	#-1,m6		;Hey...Vous avez grill la pub...6 points!
	move	#ecran,r6

off1:	jclr	#0,X:HSR,off1	;On recupere les increments d'angle	
	move	X:HTX,n0	;envoys par le 68030,et on les met dans les 
off2:	jclr	#0,X:HSR,off2	;registres d'offset
	move	X:HTX,n4
off3:	jclr	#0,X:HSR,off3		
	move	X:HTX,n1		
off4:	jclr	#0,X:HSR,off4		
	move	X:HTX,n5		
vbl:				;Cette boucle sera effectue  chaque VBL	

	jclr	#0,X:HSR,vbl
	move	X:HTX,x0
	move	x0,Y:ecran		;On recupere l'adresse ecran en debut 
					;de VBL	
	move	#sinus,r3

gets0:	jclr	#0,X:HSR,gets0		;On a les angles a,b,c,d dans
	move	X:HTX,n3		;r0,r4,r1,r5
	nop				;
	lua	(r3)+n3,r0		;Un detail:
gets1:	jclr	#0,X:HSR,gets1		;Les NOP:On ne peut utiliser sans 
	move	X:HTX,n3		;risque un registre d'adresse/offset
	nop				;dans l'instruction suivant sa mise 
	lua	(r3)+n3,r4		;jour
gets4:	jclr	#0,X:HSR,gets4		;
	move	X:HTX,n3		
	nop				
	lua	(r3)+n3,r1		
gets5:	jclr	#0,X:HSR,gets5
	move	X:HTX,n3
	nop
	lua	(r3)+n3,r5
	
	
	
	
	move	#$0000a0,r2
	move	#$000064,r3
	move	r2,y0			;On met les largeur et hauteur
	move	r3,y1			;d'ecran (divises par deux) en y0
					;et y1
	move	X:(r0)+n0,x0	
	move	X:(r4)+n4,x1
					;on met a et b  jour apres avoir pris
					;leurs sinus
	move	#4096,r7
	do	r7,trace_courbe		;Hops,et une boucle hardware,une!!!
	
	mpyr	x0,x1,a		X:(r1)+n1,x0	
	move	X:(r5)+n5,x1			
						;On fait a1=sina*sinb
						;et on recupere sinc et sind
	mpyr	x0,x1,b		a1,x0		;On fait b1=sinc*sind
						;et x0=a1=sina*sinb
	mpyr	x0,y0,a		b1,x0		;a=x0*y0=sina*sinb*largeur
						;et x0=b1=sinc*sind
	move	y0,b				;b1=y0=larg	
	add	b,a				;a=a+b=a+larg/2
						;On a maintenant la coordonne
						;X en a
	mpyr	x0,y1,b		a1,x0		;b=sinc*sind*haut
						;x0=coordX
	move	y1,a				;a=haut
	add	a,b				;b=b+a=b+haut/2
						;On a maintenant la coordonne
						;Y en b
	move	b1,x1				;x1=coordY
	mpy	x1,y0,b		x0,a1   	;b0=coordY*larg
						;a=coordX
	move	b0,b1				;b1=b0=coordY*larg
	add	b,a				;a=a+b=coordY*larg+coordX
						;On a maintenant le numero du
						;pixel en a
	
	lsl	a		Y:(r6),b	X:(r0)+n0,x0	
						;On a plac un
						;triple!!
						;a=a*2,on a l'offset adresse du
						;pixel
						;b=scr_ptr
						;On recupere sina dans X0 pour 
						;l'iteration suivante
	add	a,b		X:(r4)+n4,x1	;b=a+b=Adresse pixel
						;X1=sinb
	
xmit	jclr	#1,X:HSR,xmit			;On envoie le resultat au
	move	b1,X:HTX			;68030,mission accomplie..

trace_courbe:			;fin de la boucle hardware
	jmp	vbl		;on recommence a chaque VBL
;-------------------------------------------------------------------------
;         Et voila,maintenant voici les data
;-------------------------------------------------------------------------	

	
	org	X:$1000		;$1000 car c'est un multiple de 4096
sinus:	ds	1024		;C'est ici qu'on va copier la table de sinus
				
	org	Y:$0
ecran:	ds	1		;on stocke ici l'adresse ecran
	end

;Alors,c'etait pas complike,hein?
;Au fait,pour ceux qui auraient pas compris la transmission de donnees par le
;port HOST,elle est decrite dans un article de How To Code,premier du nom
;
;TOULOUSE,le 11/03/94
;WOTAN lives.....