From eec6905e0b24db65a18b925d049943b0d952267a Mon Sep 17 00:00:00 2001 From: kub Date: Sun, 5 May 2024 11:59:41 +0200 Subject: [PATCH] 32x, some reset related fixes --- pico/32x/32x.c | 39 ++++++++++++++++++++++++++------------- pico/32x/memory.c | 14 +++----------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/pico/32x/32x.c b/pico/32x/32x.c index d88b23f0..fdde9907 100644 --- a/pico/32x/32x.c +++ b/pico/32x/32x.c @@ -35,6 +35,9 @@ void p32x_update_irls(SH2 *active_sh2, unsigned int m68k_cycles) int irqs, mlvl = 0, slvl = 0; int mrun, srun; + if ((Pico32x.regs[0] & (P32XS_nRES|P32XS_ADEN)) != (P32XS_nRES|P32XS_ADEN)) + return; + if (active_sh2 != NULL) m68k_cycles = sh2_cycles_done_m68k(active_sh2); @@ -100,13 +103,21 @@ void Pico32xStartup(void) { elprintf(EL_STATUS|EL_32X, "32X startup"); - // TODO: OOM handling PicoIn.AHW |= PAHW_32X; - sh2_init(&msh2, 0, &ssh2); - msh2.irq_callback = sh2_irq_cb; - sh2_init(&ssh2, 1, &msh2); - ssh2.irq_callback = sh2_irq_cb; + // TODO: OOM handling + if (Pico32xMem == NULL) { + Pico32xMem = plat_mmap(0x06000000, sizeof(*Pico32xMem), 0, 0); + if (Pico32xMem == NULL) { + elprintf(EL_STATUS, "OOM"); + return; + } + memset(Pico32xMem, 0, sizeof(struct Pico32xMem)); + sh2_init(&msh2, 0, &ssh2); + msh2.irq_callback = sh2_irq_cb; + sh2_init(&ssh2, 1, &msh2); + ssh2.irq_callback = sh2_irq_cb; + } PicoMemSetup32x(); p32x_pwm_ctl_changed(); p32x_timers_recalc(); @@ -117,6 +128,8 @@ void Pico32xStartup(void) if (!Pico.m.pal) Pico32x.vdp_regs[0] |= P32XV_nPAL; + else + Pico32x.vdp_regs[0] &= ~P32XV_nPAL; rendstatus_old = -1; @@ -126,11 +139,8 @@ void Pico32xStartup(void) void Pico32xShutdown(void) { - sh2_finish(&msh2); - sh2_finish(&ssh2); - - Pico32x.vdp_regs[0] |= P32XS_nRES; - Pico32x.vdp_regs[6] |= P32XS_RV; + Pico32x.sh2_regs[0] &= ~P32XS2_ADEN; + Pico32x.regs[6] |= P32XS_RV; rendstatus_old = -1; @@ -212,6 +222,9 @@ void PicoUnload32x(void) if (PicoIn.AHW & PAHW_32X) Pico32xShutdown(); + sh2_finish(&msh2); + sh2_finish(&ssh2); + if (Pico32xMem != NULL) plat_munmap(Pico32xMem, sizeof(*Pico32xMem)); Pico32xMem = NULL; @@ -226,6 +239,7 @@ void PicoReset32x(void) p32x_pwm_ctl_changed(); p32x_timers_recalc(); Pico32x.vdp_regs[0] &= ~P32XV_Mx; // 32X graphics disabled + Pico32x.pending_fb = Pico32x.vdp_regs[0x0a/2] & P32XV_FS; } } @@ -264,9 +278,8 @@ static void p32x_start_blank(void) // FB swap waits until vblank if ((Pico32x.vdp_regs[0x0a/2] ^ Pico32x.pending_fb) & P32XV_FS) { - Pico32x.vdp_regs[0x0a/2] &= ~P32XV_FS; - Pico32x.vdp_regs[0x0a/2] |= Pico32x.pending_fb; - Pico32xSwapDRAM(Pico32x.pending_fb ^ 1); + Pico32x.vdp_regs[0x0a/2] ^= P32XV_FS; + Pico32xSwapDRAM(Pico32x.pending_fb ^ P32XV_FS); } p32x_trigger_irq(NULL, Pico.t.m68c_aim, P32XI_VINT); diff --git a/pico/32x/memory.c b/pico/32x/memory.c index 4b6d9b59..150d4014 100644 --- a/pico/32x/memory.c +++ b/pico/32x/memory.c @@ -695,12 +695,12 @@ static void p32x_vdp_write8(u32 a, u32 d) r[4 / 2] = d & 0xff; break; case 0x0b: - d &= 1; + d &= P32XV_FS; 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] ^= P32XV_FS; - Pico32xSwapDRAM(d ^ 1); + Pico32xSwapDRAM(d ^ P32XV_FS); elprintf(EL_32X, "VDP FS: %d", r[0x0a/2] & P32XV_FS); } break; @@ -2303,14 +2303,6 @@ void PicoMemSetup32x(void) unsigned int rs; int i; - if (Pico32xMem == NULL) - Pico32xMem = plat_mmap(0x06000000, sizeof(*Pico32xMem), 0, 0); - if (Pico32xMem == NULL) { - elprintf(EL_STATUS, "OOM"); - return; - } - memset(Pico32xMem, 0, sizeof(struct Pico32xMem)); - get_bios(); // cartridge area becomes unmapped @@ -2446,7 +2438,7 @@ void PicoMemSetup32x(void) ssh2_read32_map[0xc0/2].addr = MAP_MEMORY(ssh2.data_array); // map DRAM area, both 68k and SH2 - Pico32xSwapDRAM(1); + Pico32xSwapDRAM((Pico32x.vdp_regs[0x0a / 2] & P32XV_FS) ^ P32XV_FS); msh2.read8_map = msh2_read8_map; ssh2.read8_map = ssh2_read8_map; msh2.read16_map = msh2_read16_map; ssh2.read16_map = ssh2_read16_map; -- 2.39.2