From 3cf9570bacd8952713106a2a2e3176852d811d18 Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 18 Sep 2009 15:18:10 +0000 Subject: [PATCH] 32x: some missed code from MAME, minor tweaks git-svn-id: file:///home/notaz/opt/svn/PicoDrive@784 be3aeb3a-fb24-0410-a615-afba39da0efa --- cpu/sh2mame/sh2pico.c | 8 +++++++- pico/32x/memory.c | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cpu/sh2mame/sh2pico.c b/cpu/sh2mame/sh2pico.c index c6f87ea..e77329c 100644 --- a/cpu/sh2mame/sh2pico.c +++ b/cpu/sh2mame/sh2pico.c @@ -69,7 +69,13 @@ int sh2_execute(SH2 *sh2_, int cycles) { UINT32 opcode; - opcode = RW(sh2->pc); + if (sh2->delay) + { + opcode = RW(sh2->delay); + sh2->pc -= 2; + } + else + opcode = RW(sh2->pc); sh2->delay = 0; sh2->pc += 2; diff --git a/pico/32x/memory.c b/pico/32x/memory.c index a897529..886799c 100644 --- a/pico/32x/memory.c +++ b/pico/32x/memory.c @@ -52,7 +52,7 @@ static int poll_undetect(struct poll_det *pd, int flag) } // SH2 faking -//#define FAKE_SH2 +#define FAKE_SH2 int p32x_csum_faked; #ifdef FAKE_SH2 static const u16 comm_fakevals[] = { @@ -84,7 +84,7 @@ static u32 p32x_reg_read16(u32 a) { a &= 0x3e; -#ifdef FAKE_SH2 +#if 0 if ((a & 0x30) == 0x20) return sh2_comm_faker(a); #else @@ -93,6 +93,11 @@ static u32 p32x_reg_read16(u32 a) SekEndRun(16); } #endif +#ifdef FAKE_SH2 + // fake only slave for now + if (a == 0x24 || a == 0x26) + return sh2_comm_faker(a); +#endif return Pico32x.regs[a / 2]; } @@ -136,9 +141,11 @@ static void p32x_reg_write16(u32 a, u32 d) return; } - if ((a & 0x30) == 0x20) { + if ((a & 0x30) == 0x20 && r[a / 2] != d) { r[a / 2] = d; - poll_undetect(&msh2_poll, P32XF_MSH2POLL); + if (poll_undetect(&msh2_poll, P32XF_MSH2POLL)) + // if SH2 is busy waiting, it needs to see the result ASAP + SekEndRun(16); return; } @@ -460,6 +467,7 @@ out_16to8: u32 pico32x_read16(u32 a) { u32 d = 0; + if (a < sizeof(Pico32xMem->sh2_rom_m)) return *(u16 *)(Pico32xMem->sh2_rom_m + a); -- 2.39.2