fibmmem_real.s: fibmmem mit uart ausgaben
[calu.git] / 3_test / fibmmem_real.s
1 .data
2 .org 0x10
3 list:
4         .fill 0x1 ;1. element = 1 ;0x10
5         .fill 0x1 ;2. element = 1 ;0x14
6         .fill 0x10, 0x0 ;nullen..
7 int2hex:
8         ;3210
9         .fill 0x33323130 
10         ;7654
11         .fill 0x37363534
12         ;ba98
13         .fill 0x62613938
14         ;fedc
15         .fill 0x66656463
16 .text
17         .define UART_BASE, 0x2000
18         .define UART_STATUS, 0x0
19         .define UART_RECV, 0xc
20         .define UART_TRANS, 0x8
21
22         .define UART_TRANS_EMPTY, 0x1
23         .define UART_RECV_NEW, 0x2
24 start:
25         br+ main
26         br+ main
27         ret
28 main:
29         call+ uart_init
30         call+ recv_byte
31
32         ldi r1, 9;
33         ldi r10, list@lo ; global pointer
34         ldih r10, list@hi
35         call+ fibcall;
36
37         push r0
38         addi r12, r0, 0
39         call+ uart_init
40         addi r1, r12, 0
41         call debug_uint
42
43         ; stack tests:
44         ; newline
45         xor r1, r1, r1
46         ldi r1, 0x0a
47         call send_byte
48         ldi r1, 0x0d
49         call send_byte
50
51         ; wert vom stack zurueckgeben
52         xor r1, r1, r1
53         pop r1
54         call debug_uint
55
56         ; newline
57         xor r1, r1, r1
58         ldi r1, 0x0a
59         call send_byte
60         ldi r1, 0x0d
61         call send_byte
62
63         xor r1, r1, r1
64         ldi r1, 0x41
65         push r1
66         ldi r1, 0x42
67         push r1
68         ldi r1, 0x43
69         push r1
70         ldi r1, 0x44
71         push r1
72         ldi r1, 0x45
73         push r1
74
75         pop r1
76         call send_byte
77         pop r1
78         call send_byte
79         pop r1
80         call send_byte
81         pop r1
82         call send_byte
83         pop r1
84         call send_byte
85
86 hang:
87         br hang
88
89         ; fib(n) {
90         ;   if (list[n] > 0) {
91         ;       return list[n]
92         ;   }
93         ;   a = fib(n-1)
94         ;   list[n] = a + list[n-2]
95         ;   return list[n]
96         ; }
97 fibcall:
98         ;update counter for aligned access
99         lls r1, r1, 2 ; *4
100         ;calculate adress of top element
101         add r2, r10, r1
102 fibmem:
103         ;load top element
104         ldw r0, 0(r2)
105         ;compare if set
106         cmpi r0, 0
107         ;return if set
108         retnz-
109         ;decrement adress for next lopp
110         subi r2, r2, 4
111         ;iterative call for n-1 element
112         call+ fibmem
113         ;load n-2 element
114         ldw r3, 0-4(r2)
115         ;add n-1 and n-2 element
116         add r0, r3, r0
117         ;increment address for n element
118         ;is needed because after return
119         ;we need r2 to be set to the address
120         ;of element n
121         addi r2, r2, 4
122         ;store fib n
123         stw r0, 0(r2)
124         ret+
125
126 recv_byte:
127         ldw r3, UART_STATUS(r10)
128         andx r3, UART_RECV_NEW
129         brzs+ recv_byte; branch if zero
130         xor r0, r0, r0
131         ldw r0, UART_RECV(r10)
132         ret
133
134 send_byte:
135         ldw r9, UART_STATUS(r10)
136         andx r9, UART_TRANS_EMPTY
137         brnz+ send_byte ; branch if not zero
138         stb r1, UART_TRANS(r10)
139         ret
140
141 debug_uint:
142         addi r8, r1, 0
143         ;usb_sendbuffersafe ("0x", 2);
144         xor r1, r1, r1
145         ldi r1, 0x30
146         call send_byte
147         xor r1, r1, r1
148         ldi r1, 0x78
149         call send_byte
150         ;j = 0
151         xor r7, r7, r7
152         xor r6, r6, r6
153         ldi r6, int2hex@lo
154         ldih r6, int2hex@hi
155 debug_unit_loop:
156         ;for (j = 0; j < 8; ++j) {
157         cmpi r7, 8
158         reteq
159         ;usb_sendbuffersafe (&int2hex[(i >> 28) & 0xf], 1);
160         lrs r1, r8, 28
161         andx r1, 0xf
162         add r9, r6, r1
163         ldb r1, 0(r9)
164         call send_byte
165         ;i <<= 4;
166         lls r8, r8, 4
167         addi r7, r7, 1
168         br debug_unit_loop
169
170 uart_init:
171         xor r10, r10, r10
172         ldi r10, UART_BASE@lo
173         ldih r10, UART_BASE@hi
174         ret