X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2F32x%2Fmemory.c;h=c720547faf76a00774272549262444792f73e10d;hb=4685e5a10e388a9a07f1b11c3c14cce6e4e8ef5b;hp=999a060fcc59450edf2afa830f83ae818d09d42d;hpb=b081408f66662068a3d274f696bdabba5186b68e;p=picodrive.git diff --git a/pico/32x/memory.c b/pico/32x/memory.c index 999a060..c720547 100644 --- a/pico/32x/memory.c +++ b/pico/32x/memory.c @@ -224,12 +224,12 @@ static void p32x_reg_write8(u32 a, u32 d) case 3: // irq ctl if ((d & 1) && !(Pico32x.sh2irqi[0] & P32XI_CMD)) { Pico32x.sh2irqi[0] |= P32XI_CMD; - p32x_update_irls(); + p32x_update_irls(0); SekEndRun(16); } if ((d & 2) && !(Pico32x.sh2irqi[1] & P32XI_CMD)) { Pico32x.sh2irqi[1] |= P32XI_CMD; - p32x_update_irls(); + p32x_update_irls(0); SekEndRun(16); } return; @@ -341,6 +341,9 @@ static void p32x_vdp_write8(u32 a, u32 d) Pico32x.dirty_pal = 1; r[0] = (r[0] & P32XV_nPAL) | (d & 0xff); break; + case 0x03: // shift (for pp mode) + r[2 / 2] = d & 1; + break; case 0x05: // fill len r[4 / 2] = d & 0xff; break; @@ -349,7 +352,7 @@ static void p32x_vdp_write8(u32 a, u32 d) Pico32x.pending_fb = d; // if we are blanking and FS bit is changing if (((r[0x0a/2] & P32XV_VBLK) || (r[0] & P32XV_Mx) == 0) && ((r[0x0a/2] ^ d) & P32XV_FS)) { - r[0x0a/2] ^= 1; + r[0x0a/2] ^= P32XV_FS; Pico32xSwapDRAM(d ^ 1); elprintf(EL_32X, "VDP FS: %d", r[0x0a/2] & P32XV_FS); } @@ -428,7 +431,7 @@ static void p32x_sh2reg_write8(u32 a, u32 d, int cpuid) Pico32x.sh2irq_mask[cpuid] = d & 0x8f; Pico32x.sh2_regs[0] &= ~0x80; Pico32x.sh2_regs[0] |= d & 0x80; - p32x_update_irls(); + p32x_update_irls(1); return; case 5: // H count Pico32x.sh2_regs[4 / 2] = d & 0xff; @@ -483,7 +486,7 @@ static void p32x_sh2reg_write16(u32 a, u32 d, int cpuid) return; irls: - p32x_update_irls(); + p32x_update_irls(1); } // ------------------------------------------------------------------ @@ -947,7 +950,7 @@ static u32 sh2_read8_cs0(u32 a, int id) if (id == 1 && a < sizeof(Pico32xMem->sh2_rom_s)) return Pico32xMem->sh2_rom_s[a ^ 1]; - if ((a & 0x3ff00) == 0x4200) { + if ((a & 0x3fe00) == 0x4200) { d = Pico32xMem->pal[(a & 0x1ff) / 2]; goto out_16to8; } @@ -1001,7 +1004,7 @@ static u32 sh2_read16_cs0(u32 a, int id) if (id == 1 && a < sizeof(Pico32xMem->sh2_rom_s)) return *(u16 *)(Pico32xMem->sh2_rom_s + a); - if ((a & 0x3ff00) == 0x4200) { + if ((a & 0x3fe00) == 0x4200) { d = Pico32xMem->pal[(a & 0x1ff) / 2]; goto out; } @@ -1050,8 +1053,9 @@ static int REGPARM(3) sh2_write8_cs0(u32 a, u32 d, int id) return sh2_write8_unmapped(a, d, id); } +/* quirk: in both normal and overwrite areas only nonzero values go through */ #define sh2_write8_dramN(n) \ - if (!(a & 0x20000) || d) { \ + if ((d & 0xff) != 0) { \ u8 *dram = (u8 *)Pico32xMem->dram[n]; \ dram[(a & 0x1ffff) ^ 1] = d; \ } \ @@ -1325,7 +1329,7 @@ static void get_bios(void) // M68K ROM if (p32x_bios_g != NULL) { elprintf(EL_STATUS|EL_32X, "32x: using supplied 68k BIOS"); - Byteswap(Pico32xMem->m68k_rom, p32x_bios_g, 0x100); + Byteswap(Pico32xMem->m68k_rom, p32x_bios_g, sizeof(Pico32xMem->m68k_rom)); } else { // generate 68k ROM @@ -1347,7 +1351,9 @@ static void get_bios(void) #endif } // fill remaining m68k_rom page with game ROM - memcpy(Pico32xMem->m68k_rom + 0x100, Pico.rom + 0x100, sizeof(Pico32xMem->m68k_rom) - 0x100); + memcpy(Pico32xMem->m68k_rom_bank + sizeof(Pico32xMem->m68k_rom), + Pico.rom + sizeof(Pico32xMem->m68k_rom), + sizeof(Pico32xMem->m68k_rom_bank) - sizeof(Pico32xMem->m68k_rom)); // MSH2 if (p32x_bios_m != NULL) { @@ -1435,9 +1441,9 @@ void PicoMemSetup32x(void) // m68k_map_unmap(0x000000, 0x3fffff); // MD ROM area - rs = sizeof(Pico32xMem->m68k_rom); - cpu68k_map_set(m68k_read8_map, 0x000000, rs - 1, Pico32xMem->m68k_rom, 0); - cpu68k_map_set(m68k_read16_map, 0x000000, rs - 1, Pico32xMem->m68k_rom, 0); + rs = sizeof(Pico32xMem->m68k_rom_bank); + cpu68k_map_set(m68k_read8_map, 0x000000, rs - 1, Pico32xMem->m68k_rom_bank, 0); + cpu68k_map_set(m68k_read16_map, 0x000000, rs - 1, Pico32xMem->m68k_rom_bank, 0); cpu68k_map_set(m68k_write8_map, 0x000000, rs - 1, PicoWrite8_hint, 1); // TODO verify cpu68k_map_set(m68k_write16_map, 0x000000, rs - 1, PicoWrite16_hint, 1); @@ -1517,8 +1523,8 @@ void PicoMemSetup32x(void) msh2.read8_map = ssh2.read8_map = sh2_read8_map; msh2.read16_map = ssh2.read16_map = sh2_read16_map; - msh2.write8_tab = ssh2.write8_tab = (const void **)sh2_write8_map; - msh2.write16_tab = ssh2.write16_tab = (const void **)sh2_write16_map; + msh2.write8_tab = ssh2.write8_tab = (const void **)(void *)sh2_write8_map; + msh2.write16_tab = ssh2.write16_tab = (const void **)(void *)sh2_write16_map; // setup poll detector m68k_poll.flag = P32XF_68KPOLL; @@ -1527,6 +1533,23 @@ void PicoMemSetup32x(void) sh2_poll[0].cyc_max = 21; sh2_poll[1].flag = P32XF_SSH2POLL; sh2_poll[1].cyc_max = 16; + +#ifdef DRC_SH2 + sh2_drc_mem_setup(&msh2); + sh2_drc_mem_setup(&ssh2); +#endif +} + +void Pico32xStateLoaded(void) +{ + bank_switch(Pico32x.regs[4 / 2]); + Pico32xSwapDRAM((Pico32x.vdp_regs[0x0a / 2] & P32XV_FS) ^ P32XV_FS); + p32x_poll_event(3, 0); + Pico32x.dirty_pal = 1; + memset(Pico32xMem->pwm, 0, sizeof(Pico32xMem->pwm)); +#ifdef DRC_SH2 + sh2_drc_flush_all(); +#endif } // vim:shiftwidth=2:expandtab