;; fac

;; fac(n)
;;   if n == 0 return 1
;;   else return n * fac(n-1)

;; main
;;   fac(4)

;; let n=r1,t=r2
;; let retval=r29, link=r30, sp=r31

;; let fac_n

.s
	fac_n 1000
.a 0
.c
	ld r31 #2000
:main	ld r1 #4
	st fac_n r1
	jal r30 fac
	trap print r29
	trap stop r0

:fac	st @1 r31 r1
	st @2 r31 r2
	st @3 r31 r30
	add r31 r31 #3	;; push r1 r2 link
	ld r1 fac_n	;; pass n
	sub r2 r1 r0	;; n == 0
	jmp neq else
	ld r29 #1	;; ret 1
	jmp always ret
:else	sub r2 r1 #1
	st fac_n r2	;; n-1
	jal r30 fac
	mul r29 r1 r29	;; n*fac(n-1)
:ret	ld r30 @0 r31
	ld r2 @-1 r31
	ld r1 @-2 r31
	sub r31 r31 #3	;; pop link r2 r1
	jr r30 
.e

	