827c8da43aa3586dd6bd86d0021db9ec7207f064
[calu.git] / progs / fibmmem.s
1 #include "dt_inc.s"
2
3 .data
4 .org 0x0
5 list:
6         .fill 0x1 ;1. element = 1 ;0x10
7         .fill 0x1 ;2. element = 1 ;0x14
8         .fill 0x10, 0x0 ;nullen..
9 str:
10         .ascii "hier das ergebnis: "
11 .text
12 .org 0x0
13 start:
14         br+ main
15         br+ main
16         ret
17 main:
18         call+ u_init
19         call+ u_recv_byte
20         call u_send_newline
21
22         call t_init
23         ldis r1, 0
24         call t_valset
25         call t_start
26
27         ldi r1, 9;
28         ldi r10, list@lo ; global pointer
29         ldih r10, list@hi
30         call+ fibcall;
31
32         push r0
33         call t_init
34         call t_stop
35         call t_valget
36         pop r3
37         push r0
38         push r3
39
40         call u_init ; weil r10 ueberschrieben wird
41         ldis r1, str@lo
42         ldih r1, str@hi
43         ldis r2, 19
44         call u_send_string
45         
46         pop r1
47         call+ u_send_uint
48         call u_send_newline
49         pop r1
50         call+ u_send_uint
51         call u_send_newline
52
53 hang:
54         br hang
55
56         ; fib(n) {
57         ;   if (list[n] > 0) {
58         ;       return list[n]
59         ;   }
60         ;   a = fib(n-1)
61         ;   list[n] = a + list[n-2]
62         ;   return list[n]
63         ; }
64 fibcall:
65         ;update counter for aligned access
66         lls r1, r1, 2 ; *4
67         ;calculate adress of top element
68         add r2, r10, r1
69 fibmem:
70         ;load top element
71         ldw r0, 0(r2)
72         ;compare if set
73         cmpi r0, 0
74         ;return if set
75         retnz-
76         ;decrement adress for next lopp
77         subi r2, r2, 4
78         ;iterative call for n-1 element
79         call+ fibmem
80         ;load n-2 element
81         ldw r3, -4(r2)
82         ;add n-1 and n-2 element
83         add r0, r3, r0
84         ;increment address for n element
85         ;is needed because after return
86         ;we need r2 to be set to the address
87         ;of element n
88         addi r2, r2, 4
89         ;store fib n
90         stw r0, 0(r2)
91         ret+