X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=megadrive.git;a=blobdiff_plain;f=testpico%2Fsh2_main.c;fp=testpico%2Fsh2_main.c;h=97ecd3a895d2b58206434bccba2ba0d83494d2a8;hp=9c84b468db5a682f32b06f620185419a1d9c95a5;hb=06d7984c0110c58104633dc4359fa7a8343bac11;hpb=71b41fddd18f66c99e13f53bd78582627e6ff10b diff --git a/testpico/sh2_main.c b/testpico/sh2_main.c index 9c84b46..97ecd3a 100644 --- a/testpico/sh2_main.c +++ b/testpico/sh2_main.c @@ -3,9 +3,62 @@ 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 (;;) { @@ -15,27 +68,15 @@ void main_c(u32 is_slave) cmd = read16(&r[0x20/2]); mem_barrier(); cmdr = read16(&r[0x20/2]); - if (cmd != cmdr // documented as "normal" case - || ((cmd & 0x8000) ^ (is_slave << 15))) { + 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 - spin(64); - continue; - case CMD_ECHO: - v = read16(&r[0x22/2]) ^ (is_slave << 15); - write16(&r[0x24/2], v); - break; - case CMD_READ_FRT: - v = read_frt(); - write16(&r[0x24/2], v); - break; - } + do_cmd(cmd, &r[0x20/2], is_slave); write16(&r[0x20/2], 0); } }