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