isa: two more directives, todos and other stuff
[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         ; TODO: loop? (less codesize...)
63         lrs r0, r1, 0
64         call send_byte
65         lrs r0, r1, 8
66         call send_byte
67         lrs r0, r1, 16
68         call send_byte
69         lrs r0, r1, 24
70         call send_byte
71         ret
72
73 ;-----
74 recv_byte:
75         ldil r3, UART_STATUS@lo 
76         ldih r3, UART_STATUS@hi
77         ldw r3, 0(r3)
78         andi r3, r3, 1 << UART_RECV_NEW
79         branchzs+ send_byte ; branch if zero
80         ldil r3, UART_RECV@lo   
81         ldih r3, UART_RECV@hi
82         lwb r0, 0(r3)
83         ret
84
85 ;-----
86 recv_word:
87         ldisl r0, 0x0
88         call recv_byte
89         or r0, r0, r1
90
91         call recv_byte
92         sll r1, r1, 8
93         or r0, r0, r1
94
95         call recv_byte
96         sll r1, r1, 16
97         or r0, r0, r1
98
99         call recv_byte
100         sll r1, r1, 24
101         or r0, r0, r1
102
103         ret
104
105
106 ;-----
107 bootrom:
108         call recv_byte
109
110         cmpi r0, 0x57 ; 'W'
111         brancheq- bt_W
112
113         cmpi r0, 0x52 ; 'R'
114         brancheq- bt_R
115
116         cmpi r0, 0x51 ; 'Q'
117         brancheq- bt_Q
118
119         cmpi r0, 0x54 ; 'T'
120         brancheq- bt_T
121
122         cmpi r0, 0x4a ; 'J'
123         brancheq- bt_J
124
125         ; cmpi r0, 0x48 ; 'H'
126         ; brancheq bt_H
127         ; FALL THROUGH ;)
128
129 bt_H:
130         ldisl r1, 0x4f ; 'O'
131         call send_byte
132         branch bootrom
133
134 bt_W:
135         call recv_word ; receive addr
136         mov r6, r0
137         call recv_word ; receive instr
138         stx r0, 0(r6)
139         ldisl r1, 0x44 ; 'D'
140         call send_byte
141         branch bootrom
142
143 bt_R:
144         call recv_word ; receive addr
145         mov r2, r0
146         ldisl r1, 0x46 ; 'F'
147         call send_byte
148         ldx r1, 0(r2)
149         call send_word
150         branch bootrom
151
152 bt_Q:
153         call recv_word ; receive addr
154         mov r6, r0
155         call recv_word ; receive data
156         stw r0, 0(r6)
157         ldisl r1, 0x41 ; 'A'
158         call send_byte
159         branch bootrom
160
161 bt_T:
162         call recv_word ; receive addr
163         mov r2, r0
164         ldisl r1, 0x47 ; 'G'
165         call send_byte
166         ldw r1, 0(r2)
167         call send_word
168         branch bootrom
169
170 bt_J:
171         call recv_word
172         branchreg r0
173
174 ; 102 instr. please update after modification