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