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