progs: added timer for fibmmem
[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         call t_stop
24         ldis r1, 0
25         call t_valset
26         call t_start
27
28         ; fib start
29         ldi r1, 9;
30         ldi r10, list@lo ; global pointer
31         ldih r10, list@hi
32         call+ fibcall;
33         ; fib ende
34
35         push r0
36         call+ t_init
37         call+ t_stop
38         call+ t_valget
39         subi r0, r0, 0xd ; offset abziehen
40         pop r3
41         push r0
42         push r3
43
44         call u_init ; weil r10 ueberschrieben wird
45         ldis r1, str@lo
46         ldih r1, str@hi
47         ldis r2, 19
48         call u_send_string
49         
50         pop r1
51         call+ u_send_uint
52         call u_send_newline
53         pop r1
54         call+ u_send_uint
55         call u_send_newline
56
57 hang:
58         br hang
59
60         ; fib(n) {
61         ;   if (list[n] > 0) {
62         ;       return list[n]
63         ;   }
64         ;   a = fib(n-1)
65         ;   list[n] = a + list[n-2]
66         ;   return list[n]
67         ; }
68 fibcall:
69         ;update counter for aligned access
70         lls r1, r1, 2 ; *4
71         ;calculate adress of top element
72         add r2, r10, r1
73 fibmem:
74         ;load top element
75         ldw r0, 0(r2)
76         ;compare if set
77         cmpi r0, 0
78         ;return if set
79         retnz-
80         ;decrement adress for next lopp
81         subi r2, r2, 4
82         ;iterative call for n-1 element
83         call+ fibmem
84         ;load n-2 element
85         ldw r3, -4(r2)
86         ;add n-1 and n-2 element
87         add r0, r3, r0
88         ;increment address for n element
89         ;is needed because after return
90         ;we need r2 to be set to the address
91         ;of element n
92         addi r2, r2, 4
93         ;store fib n
94         stw r0, 0(r2)
95         ret+