isa/examples: minor fixes at bootrom.s
[calu.git] / 2_isa / src / bootrom.s
1         .data
2
3         .text
4         ; r0 .. param0
5         ; r1 .. param1
6         ; r2 .. param2
7         ; r15 .. stackpointer
8         ; r0 .. return
9
10         ; TODO: will the assembler be able to evaluate these expressions?
11         UART_BASE=0x1000
12         UART_STATUS=(UART_BASE+0x4)
13         UART_RECV=(UART_BASE+0x8)
14         UART_TRANS=(UART_BASE+0xC)
15         UART_BAUD=(UART_BAUD+0x10)
16
17         UART_TRANS_EMPTY=0
18         UART_RECV_NEW=1
19
20         TIMEOUT_START=0x13371337
21         DEFAULT_PROG_START=0x200
22         STACKSTART=0x500 ; FIXME
23 ;-----
24 main:
25         ; setup stackframe
26         ldil r15, STACKSTART@lo
27         ldih r15, STACKSTART@hi
28
29         ldil r3, TIMEOUT_START@lo
30         ldih r3, TIMEOUT_START@hi
31
32 timeout_loop:
33         ldil r3, UART_STATUS@lo
34         ldih r3, UART_STATUS@hi
35         ldw r3, 0(r3)
36         andi r3, r3, 1 << UART_RECV_NEW
37         jumpzs+ next; jump if zero
38
39         branch recv_byte
40         ; we received the enter bootrom sign
41         cmp r0, 0x48 ; 'H'
42         jumpeq- bt_H
43
44 next:
45         subi r3, r3, 1
46         jumpnz+ timeout_loop
47
48         ; branch to default entry point
49         ldil r0, DEFAULT_PROG_START@lo
50         ldih r0, DEFAULT_PROG_START@hi
51         jumpreg r0
52
53 ;-----
54 send_byte:
55         ldil r3, UART_STATUS@lo 
56         ldih r3, UART_STATUS@hi
57         ldw r3, 0(r3)
58         andi r3, r3, 1 << UART_TRANS_EMPTY
59         jumpzs+ send_byte ; jump if zero
60         ldil r3, UART_TRANS@lo  
61         ldih r3, UART_TRANS@hi
62         stb r0, 0(r3)
63         ret
64
65 ;-----
66 send_word:
67         ; TODO: loop? (less codesize...)
68         branch send_byte
69         lrs r0, r0, 8
70         branch send_byte
71         lrs r0, r0, 8
72         branch send_byte
73         lrs r0, r0, 8
74         branch send_byte
75         ret
76
77 ;-----
78 recv_byte:
79         ldil r3, UART_STATUS@lo 
80         ldih r3, UART_STATUS@hi
81         ldw r3, 0(r3)
82         andi r3, r3, 1 << UART_RECV_NEW
83         jumpzs+ send_byte ; jump if zero
84         ldil r3, UART_RECV@lo   
85         ldih r3, UART_RECV@hi
86         lwb r0, 0(r3)
87         ret
88
89 ;-----
90 recv_word:
91         ldil r1, 0x0 
92         branch recv_byte
93         or r1, r1, r0
94
95         branch recv_byte
96         sll r0, r0, 8
97         or r1, r1, r0
98
99         branch recv_byte
100         sll r0, r0, 16
101         or r1, r1, r0
102
103         branch recv_byte
104         sll r0, r0, 24
105         or r1, r1, r0
106
107         addi r0, r1, 0x0
108         ret
109
110
111 ;-----
112 bootrom:
113         branch recv_byte
114
115         cmpi r0, 0x57 ; 'W'
116         jumpeq- bt_W
117
118         cmpi r0, 0x52 ; 'R'
119         jumpeq- bt_R
120
121         cmpi r0, 0x51 ; 'Q'
122         jumpeq- bt_Q
123
124         cmpi r0, 0x54 ; 'T'
125         jumpeq- bt_T
126
127         cmpi r0, 0x4a ; 'J'
128         jumpeq- bt_J
129
130         ; cmpi r0, 0x48 ; 'H'
131         ; jumpeq bt_H
132         ; FALL THROUGH ;)
133
134 bt_H:
135         ldisl r0, 0x4f ; 'O'
136         branch send_byte
137         jump bootrom
138
139 bt_W:
140         branch recv_word ; receive addr
141         addi r6, r0, 0x0
142         branch recv_word ; receive instr
143         stx r0, 0(r6)
144         ldisl r0, 0x44 ; 'D'
145         branch send_byte
146         jump bootrom
147
148 bt_R:
149         branch recv_word ; receive addr
150         ldx r1, 0(r0)
151         ldisl r0, 0x46 ; 'F'
152         branch send_byte
153         addi r0, r1, 0x0
154         branch send_word
155         jump bootrom
156
157 bt_Q:
158         branch recv_word ; receive addr
159         addi r6, r0, 0x0
160         branch recv_word ; receive data
161         stw r0, 0(r6)
162         ldisl r0, 0x41 ; 'A'
163         branch send_byte
164         jump bootrom
165
166 bt_T:
167         branch recv_word ; receive addr
168         ldw r1, 0(r0)
169         ldisl r0, 0x47 ; 'G'
170         branch send_byte
171         addi r0, r1, 0x0
172         branch send_word
173         jump bootrom
174
175 bt_J:
176         branch recv_word
177         jumpreg r0
178
179 ; 101 instr. please update after modification