1 ;* bootROM, a very small bootloader for $NAME
4 ;* abbrv: H = Host, CPU = C
6 ;* value/cmd | direction | comment
7 ;* ------------------------------------------------------------
8 ;* 'H' | H -> C | enter bootROM ("HI")
9 ;* 'O' | C -> H | ack bootROM entry ("OH HAI")
11 ;* 'W'0xZZZZZZZZ0xYYYYYYYY| H -> C | write instr (0xYY...Y) to
12 ;* | address (0xZZ...Z)
13 ;* 'D' | C -> H | instr write done
15 ;* 'R'0xZZZZZZZZ | H -> C | read instr from address (0xZZ..Z)
16 ;* 'F'0xYYYYYYYY | C -> H | instr read done and return instr
18 ;* 'Q'0xZZZZZZZZ0xYYYYYYYY| H -> C | write data (0xYY...Y) to
19 ;* | address (0xZZ...Z)
20 ;* 'A' | C -> H | data write done
22 ;* 'T'0xZZZZZZZZ | H -> C | read data from address (0xZZ..Z)
23 ;* 'G'0xYYYYYYYY | C -> H | read done and return data
25 ;* 'J'0xZZZZZZZZ | H -> C | jump to address (0xZZ...Z)
30 .define UART_BASE, 0x2000
31 .define UART_STATUS, 0x0
32 .define UART_RECV, 0xc
33 .define UART_TRANS, 0x8
35 .define UART_TRANS_EMPTY, 0x1
36 .define UART_RECV_NEW, 0x2
50 ldih r10, UART_BASE@hi
55 ; we received the enter bootrom sign
63 ldw r3, UART_STATUS(r10)
64 andx r3, UART_TRANS_EMPTY
65 brnz+ send_byte ; branch if not zero
66 stw r1, UART_TRANS(r10)
83 ldw r3, UART_STATUS(r10)
84 andx r3, UART_RECV_NEW
85 brzs+ recv_byte; branch if zero
87 ldw r0, UART_RECV(r10)
131 ; cmpi r0, 0x48 ; 'H'
143 call recv_word ; receive addr
145 call recv_word ; receive instr
151 ;bt_R: ;lesen von IRAM wird nicht unterstuetzt
152 ;call recv_word ; receive addr
163 call recv_word ; receive addr
165 call recv_word ; receive data
172 call recv_word ; receive addr