aboutsummaryrefslogtreecommitdiffstats
path: root/resources/asm/fibo.atk16
diff options
context:
space:
mode:
Diffstat (limited to 'resources/asm/fibo.atk16')
-rw-r--r--resources/asm/fibo.atk1657
1 files changed, 57 insertions, 0 deletions
diff --git a/resources/asm/fibo.atk16 b/resources/asm/fibo.atk16
new file mode 100644
index 0000000..34999a9
--- /dev/null
+++ b/resources/asm/fibo.atk16
@@ -0,0 +1,57 @@
+@opt stack_pointer RG
+@opt csr_scratch RH
+@use ext_std:*
+
+; bootstrap code (must be called to setup mandatory data)
+; will jump to label main
+@include bootstrap
+
+@label main
+; call fibo subroutine with parameter 10
+ ldi 10 RA
+ csi fibo
+ hlt
+
+@label fibo
+;;; subroutine fibo
+;;; param RA N
+;;; return RA Nth fibonacci number
+
+; store RB, RC on stack
+ spu RB
+ spu RC
+; if n < 2, return n
+ subi RA 2 RA
+ bri sign fibo_early
+; store also RD on stack
+ spu RD
+; a = 0
+ ldi 0 RB
+; b = 1
+ ldi 1 RC
+@label fibo_loop
+; v = a + b
+ add RB RC RD
+; a = b
+ mov RC RB
+; b = v
+ mov RD RC
+; n -= 1
+ dec RA
+; loop while n > 0
+ bri zero fibo_done
+ jpi fibo_loop
+@label fibo_early
+; restore used registers
+ spo RC
+ spo RB
+; return from subroutine
+ rsr
+@label fibo_done
+ mov RD RA
+; restore used registers
+ spo RD
+ spo RC
+ spo RB
+; return from subroutine
+ rsr