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