isa/examples: adapted sum and bootrom
[calu.git] / 2_isa / src / bootrom.s
1         .data
2
3         .text
4         ; TODO: will the assembler be able to evaluate these expressions?
5         UART_BASE=0x1000
6         UART_STATUS=(UART_BASE+0x4)
7         UART_RECV=(UART_BASE+0x8)
8         UART_TRANS=(UART_BASE+0xC)
9         UART_BAUD=(UART_BAUD+0x10)
10
11         UART_TRANS_EMPTY=0
12         UART_RECV_NEW=1
13
14         TIMEOUT_START=0x13371337
15         DEFAULT_PROG_START=0x200
16         STACKSTART=0x500 ; FIXME
17 ;-----
18 main:
19         ; setup stackframe
20         ldil r15, STACKSTART@lo
21         ldih r15, STACKSTART@hi
22         movst r15
23
24         ldil r3, TIMEOUT_START@lo
25         ldih r3, TIMEOUT_START@hi
26
27 timeout_loop:
28         ldil r3, UART_STATUS@lo
29         ldih r3, UART_STATUS@hi
30         ldw r3, 0(r3)
31         andi r3, r3, 1 << UART_RECV_NEW
32         jumpzs+ next; jump if zero
33
34         branch recv_byte
35         ; we received the enter bootrom sign
36         cmp r0, 0x48 ; 'H'
37         jumpeq- bt_H
38
39 next:
40         subi r3, r3, 1
41         jumpnz+ timeout_loop
42
43         ; branch to default entry point
44         ldil r0, DEFAULT_PROG_START@lo
45         ldih r0, DEFAULT_PROG_START@hi
46         jumpreg r0
47
48 ;-----
49 send_byte:
50         ldil r3, UART_STATUS@lo 
51         ldih r3, UART_STATUS@hi
52         ldw r3, 0(r3)
53         andi r3, r3, 1 << UART_TRANS_EMPTY
54         jumpzs+ send_byte ; jump if zero
55         ldil r3, UART_TRANS@lo  
56         ldih r3, UART_TRANS@hi
57         stb r1, 0(r3)
58         ret
59
60 ;-----
61 send_word:
62         ; TODO: loop? (less codesize...)
63         lrs r0, r1, 0
64         branch send_byte
65         lrs r0, r1, 8
66         branch send_byte
67         lrs r0, r1, 16
68         branch send_byte
69         lrs r0, r1, 24
70         branch send_byte
71         ret
72
73 ;-----
74 recv_byte:
75         ldil r3, UART_STATUS@lo 
76         ldih r3, UART_STATUS@hi
77         ldw r3, 0(r3)
78         andi r3, r3, 1 << UART_RECV_NEW
79         jumpzs+ send_byte ; jump if zero
80         ldil r3, UART_RECV@lo   
81         ldih r3, UART_RECV@hi
82         lwb r0, 0(r3)
83         ret
84
85 ;-----
86 recv_word:
87         ldisl r0, 0x0
88         branch recv_byte
89         or r0, r0, r1
90
91         branch recv_byte
92         sll r1, r1, 8
93         or r0, r0, r1
94
95         branch recv_byte
96         sll r1, r1, 16
97         or r0, r0, r1
98
99         branch recv_byte
100         sll r1, r1, 24
101         or r0, r0, r1
102
103         ret
104
105
106 ;-----
107 bootrom:
108         branch recv_byte
109
110         cmpi r0, 0x57 ; 'W'
111         jumpeq- bt_W
112
113         cmpi r0, 0x52 ; 'R'
114         jumpeq- bt_R
115
116         cmpi r0, 0x51 ; 'Q'
117         jumpeq- bt_Q
118
119         cmpi r0, 0x54 ; 'T'
120         jumpeq- bt_T
121
122         cmpi r0, 0x4a ; 'J'
123         jumpeq- bt_J
124
125         ; cmpi r0, 0x48 ; 'H'
126         ; jumpeq bt_H
127         ; FALL THROUGH ;)
128
129 bt_H:
130         ldisl r1, 0x4f ; 'O'
131         branch send_byte
132         jump bootrom
133
134 bt_W:
135         branch recv_word ; receive addr
136         mov r6, r0
137         branch recv_word ; receive instr
138         stx r0, 0(r6)
139         ldisl r1, 0x44 ; 'D'
140         branch send_byte
141         jump bootrom
142
143 bt_R:
144         branch recv_word ; receive addr
145         mov r2, r0
146         ldisl r1, 0x46 ; 'F'
147         branch send_byte
148         ldx r1, 0(r2)
149         branch send_word
150         jump bootrom
151
152 bt_Q:
153         branch recv_word ; receive addr
154         mov r6, r0
155         branch recv_word ; receive data
156         stw r0, 0(r6)
157         ldisl r1, 0x41 ; 'A'
158         branch send_byte
159         jump bootrom
160
161 bt_T:
162         branch recv_word ; receive addr
163         mov r2, r0
164         ldisl r1, 0x47 ; 'G'
165         branch send_byte
166         ldw r1, 0(r2)
167         branch send_word
168         jump bootrom
169
170 bt_J:
171         branch recv_word
172         jumpreg r0
173
174 ; 102 instr. please update after modification