| Beta programme d'exemple.
| Calcul de la suite de Fibonnacci.
| Ce programme est calque sur celui donne pour la S-machine dans
|      le livre de reference, p. 703.
	
| 24/11/1999 : (JMF) Creation

	
.include betainstr
.include convbetainstr

	
| Ce programme suit les recommendations donnees sur la page
| http://www.montefiore.ulg.ac.be/~francois/struct/betasoftconv.html

	
FIBNUM	= 4			| Quel nombre de Fibonnacci calculer

	
start:	bcmove(stack, SP)	| Initialisation de la pile
	bcmove(FIBNUM, r(0))
	bpush(r(0))		| Calcul du FIBNUM-ieme nombre de Fibonnacci
	bbr(fib, LP)
	bdeallocate(1)		| Vide la pile de l'argument passe en 'start'
				| a la procedure 'fib'
	bbr(end, R31)		| Fin de programme

	
fib:				| Dans les commentaires ci-dessous, arg
fibprologue:			| se refere a l'argument passe a 'fib'.
	bpush(LP)
	bpush(BP)
	bmove(SP, BP)		| BP est un pointeur dans la frame
				|      courante
|	ballocate(0)		| Aucune valeur locale pour la procedure
	bpush(r(1))		| R1 est utilise pour faire des calculs
				|      intermediaires

fibprincipal:
	bld(BP, 0-12, r(0))	| <BR0> <- arg
	bcmpltc(r(0), 2, r(1))	| <R1> = 1 si argument < 2
				|      sinon <R1> = 0
	bbne(r(1), fibtinny, R31)	| Branchement si argument = 2
	
	baddc(r(0), 0-1, r(1))	| Argument pour appel recursif a fib
	bpush(r(1))
	bbr(fib, LP)		| Calcul du (arg-1)-ieme nombre de Fibonnacci
	bdeallocate(1)		| Vide la pile de l'argument (arg-1)

	bmove(r(0), r(1))	| R1 <- fib(arg-1)
	bld(BP, 0-12, r(0))	| <BR0> <- arg
	
	baddc(r(0), 0-2, r(0))	
	bpush(r(0))		| Argument du second appel a 'fib' = arg-2
	bbr(fib, LP)
	bdeallocate(1)		| Vide la pile de l'argument (arg-2)

	badd(r(0), r(1), r(0))	| R0 <- fib(arg-2) + fib(arg-1)
	
	bbr(fibepilogue, R31)

fibtinny:			| Si argument < 2 alors
				|      valeur de retour = argument
	
fibepilogue:			| fib(arg) se trouve dans R0
	bpop(r(1))		| Recupere la valeur de R1 avant l'appel
				|      a 'fib'
|	bmove(BP, SP)		| Retire l'espace alloue aux valeurs locales
				|      (ici, il n'y a pas de valeurs locales)
	bpop(BP)
	bpop(LP)
	bjmp(LP, R31)		| Retour de procedure
	
end:	bbpt()			| Le resultat se trouve dans BR0
	bbr(end, R31)

stack:				| La pile debute ici
