bootromfun: testprogramm angepasst -> bytes empfangen im 'stream' geht nicht ordentlich
[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         xor r1, r1, r1
89
90         cmpi r0, 0x57 ; 'W'
91         breq- bt_W
92
93         cmpi r0, 0x52 ; 'R'
94         breq- bt_R
95
96         cmpi r0, 0x51 ; 'Q'
97         breq- bt_Q
98
99         cmpi r0, 0x54 ; 'T'
100         breq- bt_T
101
102         cmpi r0, 0x4a ; 'J'
103         breq- bt_J
104
105         ; cmpi r0, 0x48 ; 'H'
106         ; breq bt_H
107         ; FALL THROUGH ;)
108
109 bt_H:
110         ldi r1, 0x4f ; 'O'
111         call send_byte
112         br bootrom
113
114 bt_W:
115         ; call recv_word ; receive addr
116         ; stw r0, PADDR(r11)
117         ; call recv_word ; receive instr
118         ; stw r0, PDATA(r11)
119         ; ldi r1, 0x44 ; 'D'
120         ; call send_byte
121         br bootrom
122
123 bt_R:
124         ;call recv_word ; receive addr
125         ;mov r2, r0
126         ;ldi r1, 0x46 ; 'F'
127         ;call send_byte
128         ;ldx r1, 0(r2)
129         ;call send_word
130         ;br bootrom
131         br tehend
132
133 bt_Q:
134         call recv_word ; receive addr
135         mov r6, r0
136         call recv_word ; receive data
137         stw r0, 0(r6)
138         ldi r1, 0x41 ; 'A'
139         call send_byte
140         br bootrom
141
142 bt_T:
143         call recv_word ; receive addr
144         mov r2, r0
145         ldi r1, 0x47 ; 'G'
146         call send_byte
147         ldw r1, 0(r2)
148         call send_word
149         br bootrom
150
151 bt_J:
152         call recv_word
153         brr r0
154
155 tehend:
156         xor r1, r1, r1
157         ldi r1, 0x41 ; 'A'
158         call send_byte
159         xor r1, r1, r1
160         ldi r1, 0x42 ; 'B'
161         call send_byte
162         xor r1, r1, r1
163         ldi r1, 0x43 ; 'C'
164         call send_byte