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