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