9d39a80e |
1 | #include "common.h" |
2 | |
3 | void spin(int loops); |
71b41fdd |
4 | u16 read_frt(void); |
9d39a80e |
5 | |
6 | void main_c(u32 is_slave) |
7 | { |
8 | u16 v, *r = (u16 *)0x20004000; |
9 | |
10 | for (;;) |
11 | { |
71b41fdd |
12 | u16 cmd, cmdr; |
9d39a80e |
13 | |
14 | mem_barrier(); |
15 | cmd = read16(&r[0x20/2]); |
71b41fdd |
16 | mem_barrier(); |
17 | cmdr = read16(&r[0x20/2]); |
18 | if (cmd != cmdr // documented as "normal" case |
19 | || ((cmd & 0x8000) ^ (is_slave << 15))) { |
9d39a80e |
20 | spin(64); |
21 | continue; |
22 | } |
23 | cmd &= 0x7fff; |
24 | switch (cmd) |
25 | { |
26 | case 0: |
27 | case 0x4d5f: // 'M_' from BIOS |
9d39a80e |
28 | spin(64); |
29 | continue; |
30 | case CMD_ECHO: |
31 | v = read16(&r[0x22/2]) ^ (is_slave << 15); |
32 | write16(&r[0x24/2], v); |
33 | break; |
71b41fdd |
34 | case CMD_READ_FRT: |
35 | v = read_frt(); |
36 | write16(&r[0x24/2], v); |
37 | break; |
9d39a80e |
38 | } |
39 | write16(&r[0x20/2], 0); |
40 | } |
41 | } |
42 | |
43 | // vim:ts=4:sw=4:expandtab |