X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=testpico%2Fsh2_main.c;h=97ecd3a895d2b58206434bccba2ba0d83494d2a8;hb=3d80f9400569f545d9e651a68aa0382f7ca6db40;hp=eaa69a97f43b52074ecf708d3139b502ed128b8a;hpb=9d39a80ebef085f0d65b49e0bd6a07c4de723de9;p=megadrive.git diff --git a/testpico/sh2_main.c b/testpico/sh2_main.c index eaa69a9..97ecd3a 100644 --- a/testpico/sh2_main.c +++ b/testpico/sh2_main.c @@ -1,34 +1,82 @@ #include "common.h" void spin(int loops); +u16 read_frt(void); + +static void do_cmd(u16 cmd, u16 r[6], u32 is_slave) +{ + u32 *rl = (u32 *)r; + u32 a, d; + u16 v; + + switch (cmd) + { + case CMD_ECHO: + v = read16(&r[4/2]) ^ (is_slave << 15); + write16(&r[6/2], v); + break; + case CMD_READ_FRT: + v = read_frt(); + write16(&r[4/2], v); + break; + case CMD_READ8: + a = read32(&rl[4/4]); + d = read8(a); + write32(&rl[4/4], d); + break; + case CMD_READ16: + a = read32(&rl[4/4]); + d = read16(a); + write32(&rl[4/4], d); + break; + case CMD_READ32: + a = read32(&rl[4/4]); + d = read32(a); + write32(&rl[4/4], d); + break; + case CMD_WRITE8: + a = read32(&rl[4/4]); + d = read32(&rl[8/4]); + write8(a, d); + break; + case CMD_WRITE16: + a = read32(&rl[4/4]); + d = read32(&rl[8/4]); + write16(a, d); + break; + case CMD_WRITE32: + a = read32(&rl[4/4]); + d = read32(&rl[8/4]); + write32(a, d); + break; + default: + r[2/2]++; // error + mem_barrier(); + break; + } +} void main_c(u32 is_slave) { - u16 v, *r = (u16 *)0x20004000; + u16 *r = (u16 *)0x20004000; for (;;) { - u16 cmd; + u16 cmd, cmdr; mem_barrier(); cmd = read16(&r[0x20/2]); - if ((cmd & 0x8000) ^ (is_slave << 15)) { + mem_barrier(); + cmdr = read16(&r[0x20/2]); + if (cmd == 0 + || cmd != cmdr // documented as "normal" case + || ((cmd & 0x8000) ^ (is_slave << 15)) + || cmd == 0x4d5f) { // 'M_' from BIOS spin(64); continue; } cmd &= 0x7fff; - switch (cmd) - { - case 0: - case 0x4d5f: // 'M_' from BIOS - case 0x535f: // 'S_' from BIOS - spin(64); - continue; - case CMD_ECHO: - v = read16(&r[0x22/2]) ^ (is_slave << 15); - write16(&r[0x24/2], v); - break; - } + do_cmd(cmd, &r[0x20/2], is_slave); write16(&r[0x20/2], 0); } }