aboutsummaryrefslogtreecommitdiffstats
path: root/resources/asm/fibo.atk16
blob: 34999a92eea073ba8a9cb7752f74484f7529d46e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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