Revert "bootromfun: stuff zum debuggen fuern stefan :/"
[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
32         call recv_byte
33         ; we received the enter bootrom sign
34         xor r1, r1, r1
35         cmpi r0, 0x48 ; 'H'
36         breq- bt_H
37         br poll ; else
38
39 ;-----
40 send_byte:
41         ldw r3, UART_STATUS(r10)
42         andx r3, UART_TRANS_EMPTY
43         brnz+ send_byte ; branch if not zero
44         stb r1, UART_TRANS(r10)
45         ret
46
47 ;-----
48 send_word:
49         lrs r0, r1, 0
50         call send_byte
51         lrs r0, r1, 8
52         call send_byte
53         lrs r0, r1, 16
54         call send_byte
55         lrs r0, r1, 24
56         call send_byte
57         ret
58
59 ;-----
60 recv_byte:
61         ldw r3, UART_STATUS(r10)
62         andx r3, UART_RECV_NEW
63         brzs+ recv_byte; branch if zero
64         xor r0, r0, r0
65         ldb r0, UART_RECV(r10)
66         ret
67
68 ;-----
69 recv_word:
70         xor r1, r1, r1
71         call recv_byte
72         or r1, r0, r1
73
74         call recv_byte
75         lls r1, r1, 8
76         or r1, r0, r1
77
78         call recv_byte
79         lls r1, r1, 8
80         or r1, r0, r1
81
82         call recv_byte
83         lls r1, r1, 8
84         or r1, r0, r1
85
86         addi r0, r1, 0
87         ret
88
89 ;-----
90 bootrom:
91         call recv_byte
92         br tehend
93
94         xor r1, r1, r1
95         cmpi r0, 0x57 ; 'W'
96         breq- bt_W
97
98         cmpi r0, 0x52 ; 'R'
99         breq- bt_R
100
101         cmpi r0, 0x51 ; 'Q'
102         breq- bt_Q
103
104         cmpi r0, 0x54 ; 'T'
105         breq- bt_T
106
107         cmpi r0, 0x4a ; 'J'
108         breq- bt_J
109
110         ; cmpi r0, 0x48 ; 'H'
111         ; breq bt_H
112         ; FALL THROUGH ;)
113
114 bt_H:
115         ldi r1, 0x4f ; 'O'
116         call send_byte
117         call send_byte
118         br bootrom
119
120 bt_W:
121         call recv_word ; receive addr
122         stw r0, PADDR(r11)
123         call recv_word ; receive instr
124         stw r0, PDATA(r11)
125         ldi r1, 0x44 ; 'D'
126         call send_byte
127         br bootrom
128
129 bt_R:
130         call recv_word ; receive addr
131         mov r2, r0
132         ldi r1, 0x46 ; 'F'
133         call send_byte
134         ldx r1, 0(r2)
135         call send_word
136         br bootrom
137
138 bt_Q:
139         call recv_word ; receive addr
140         mov r6, r0
141         call recv_word ; receive data
142         stw r0, 0(r6)
143         ldi r1, 0x41 ; 'A'
144         call send_byte
145         br bootrom
146
147 bt_T:
148         call recv_word ; receive addr
149         mov r2, r0
150         ldi r1, 0x47 ; 'G'
151         call send_byte
152         ldw r1, 0(r2)
153         call send_word
154         br bootrom
155
156 bt_J:
157         call recv_word
158         brr r0
159
160 tehend: