blob: 8bb7a6e115547ab42247bafdffd55a46e8e6f3cb (
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
58
59
60
61
62
63
64
65
66
|
@opt stack_pointer RF
@opt csr_scratch RH
@use ext_std:*
; jump over data segment
jpi program
; data segment
@label ram_offset
0x8000
@label program
; set up stack pointer to point to beginning of RAM
ldi ram_offset RA
ldr RA RF
; call fibo subroutine with parameter 10
ldi 10 RA
csi fibo
hlt
@label fibo
; function fibo
; parameters:
; RA n : u16
; return value:
; RA fibo(n) : u16
; 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
|