+;* bootROM, a very small bootloader for $NAME
+;*
+;* protocol details:
+;* abbrv: H = Host, CPU = C
+;*
+;* value/cmd | direction | comment
+;* ------------------------------------------------------------
+;* 'H' | H -> C | enter bootROM ("HI")
+;* 'O' | C -> H | ack bootROM entry ("OH HAI")
+;*
+;* 'W'0xZZZZZZZZ0xYYYYYYYY| H -> C | write instr (0xYY...Y) to
+;* | address (0xZZ...Z)
+;* 'D' | C -> H | instr write done
+;*
+;* 'R'0xZZZZZZZZ | H -> C | read instr from address (0xZZ..Z)
+;* 'F'0xYYYYYYYY | C -> H | instr read done and return instr
+;*
+;* 'Q'0xZZZZZZZZ0xYYYYYYYY| H -> C | write data (0xYY...Y) to
+;* | address (0xZZ...Z)
+;* 'A' | C -> H | data write done
+;*
+;* 'T'0xZZZZZZZZ | H -> C | read data from address (0xZZ..Z)
+;* 'G'0xYYYYYYYY | C -> H | read done and return data
+;*
+;* 'J'0xZZZZZZZZ | H -> C | jump to address (0xZZ...Z)
+;*/
.data
.text
call recv_byte
lls r1, r1, 8
- or r1, r0, r1
+ or r0, r0, r1
+ xor r1, r1, r1
- addi r0, r1, 0
ret
;-----
bootrom:
call recv_byte
- ldi r1, 0x50 ; 'P'
- call send_byte
- br tehend
-
xor r1, r1, r1
+
cmpi r0, 0x57 ; 'W'
breq- bt_W
- cmpi r0, 0x52 ; 'R'
- breq- bt_R
+ ;cmpi r0, 0x52 ; 'R'
+ ;breq- bt_R
cmpi r0, 0x51 ; 'Q'
breq- bt_Q
bt_H:
ldi r1, 0x4f ; 'O'
call send_byte
- call send_byte
br bootrom
bt_W:
+ ldi r1, 0x57 ; 'W'
+ call send_byte
call recv_word ; receive addr
stw r0, PADDR(r11)
call recv_word ; receive instr
call send_byte
br bootrom
-bt_R:
- call recv_word ; receive addr
- mov r2, r0
- ldi r1, 0x46 ; 'F'
- call send_byte
- ldx r1, 0(r2)
- call send_word
- br bootrom
+;bt_R: ;lesen von IRAM wird nicht unterstuetzt
+ ;call recv_word ; receive addr
+ ;mov r2, r0
+ ;ldi r1, 0x46 ; 'F'
+ ;call send_byte
+ ;ldx r1, 0(r2)
+ ;call send_word
+ ;br bootrom
bt_Q:
+ ldi r1, 0x51 ; 'Q'
+ call send_byte
call recv_word ; receive addr
- mov r6, r0
+ addi r6, r0, 0
call recv_word ; receive data
stw r0, 0(r6)
ldi r1, 0x41 ; 'A'
br bootrom
bt_J:
- call recv_word
- brr r0
-
tehend:
+ xor r1, r1, r1
+ ldi r1, 0x41 ; 'A'
+ call send_byte
+ xor r1, r1, r1
+ ldi r1, 0x42 ; 'B'
+ call send_byte
+ xor r1, r1, r1
+ ldi r1, 0x43 ; 'C'
+ call send_byte