aboutsummaryrefslogtreecommitdiffstats
path: root/src/test_fibo.atk16
blob: 7f1abb90eacf657a7e1ffdf9b3b1b157af316fa0 (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
@opt stack_pointer RG

@label program
  ; call fibo subroutine with parameter 10
  ldi RA 10
  csr fibo
  hlt

@label fibo
  ; function fibo
  ; parameters:
  ;  RA   n : u16
  ; return value:
  ;  RA   fibo(n) : u16

  spu RB                ; prelude
  spu RC

  ldi RC 2              ; if n < 2, return n
  sub RA RC RA
  bri f_sign fibo_early

  spu RD                 ; prelude
  spu RE

  ldi RE 1               ; constant 1
  ldi RB 0               ; a = 0
  ldi RC 1               ; b = 1
@label fibo_loop
  add RB RC RD           ; v = a + b
  mov RC RB              ; a = b
  mov RD RC              ; b = v
  sub RA RE RA           ; n -= 1
  bri f_zero fibo_done   ; loop while n > 0
  jpi fibo_loop

@label fibo_early
  spo RC
  spo RB
  rsr
@label fibo_done
  ldr RD RA
  spo RE
  spo RD
  spo RC
  spo RB
  rsr