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