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