From 399b5d65e50b48c74534526848969a31af7e3896 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 30 May 2026 09:43:22 +0200 Subject: [PATCH] Fix MBC3 latch (#987) * Fix MBC3 latch * more --- src/device/controller/gbcart.rs | 27 +++++++-------------------- src/device/controller/transferpak.rs | 1 - 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/device/controller/gbcart.rs b/src/device/controller/gbcart.rs index 318b460..2fc9871 100644 --- a/src/device/controller/gbcart.rs +++ b/src/device/controller/gbcart.rs @@ -19,7 +19,6 @@ pub struct GbCart { pub mbc1_mode: bool, pub ram_bank: u16, pub rom_bank: u32, - pub latch: bool, pub rtc_regs: [u8; MBC3_RTC_REGS_COUNT], pub rtc_regs_latch: [u8; MBC3_RTC_REGS_COUNT], pub last_elapsed_time: i64, @@ -255,12 +254,9 @@ fn write_mbc3( } else if address < 0x6000 { cart.ram_bank = (value & 0xf) as u16; } else if address < 0x8000 { - if cart.cart_type == CartType::MBC3RamBattRtc { - if !cart.latch && (value & 0x1) != 0 { - update_rtc_regs(cart, elapsed_time); - cart.rtc_regs_latch = cart.rtc_regs; - } - cart.latch = (value & 0x1) != 0; + if cart.cart_type == CartType::MBC3RamBattRtc && (value & 0x1) != 0 { + update_rtc_regs(cart, elapsed_time); + cart.rtc_regs_latch = cart.rtc_regs; } } else if (0xa000..0xc000).contains(&address) { if !cart.ram_enabled { @@ -284,7 +280,6 @@ fn read_mbc3( address: u16, data: usize, size: usize, - elapsed_time: i64, ) { if address < 0x4000 { let banked_address = address & 0x3FFF; @@ -309,15 +304,8 @@ fn read_mbc3( .unwrap_or(&vec![0; size]), ); } else if cart.cart_type == CartType::MBC3RamBattRtc { - if cart.latch { - for i in 0..size { - pif_ram[data + i] = cart.rtc_regs_latch[cart.ram_bank as usize - 0x8]; - } - } else { - update_rtc_regs(cart, elapsed_time); - for i in 0..size { - pif_ram[data + i] = cart.rtc_regs[cart.ram_bank as usize - 0x8]; - } + for i in 0..size { + pif_ram[data + i] = cart.rtc_regs_latch[cart.ram_bank as usize - 0x8]; } } } else { @@ -395,7 +383,6 @@ pub fn read( address: u16, data: usize, size: usize, - elapsed_time: i64, ) { if !cart.enabled { for i in 0..size { @@ -405,8 +392,8 @@ pub fn read( } match cart.cart_type { CartType::MBC1RamBatt => read_mbc1(pif_ram, cart, address, data, size), - CartType::MBC3RamBatt => read_mbc3(pif_ram, cart, address, data, size, elapsed_time), - CartType::MBC3RamBattRtc => read_mbc3(pif_ram, cart, address, data, size, elapsed_time), + CartType::MBC3RamBatt => read_mbc3(pif_ram, cart, address, data, size), + CartType::MBC3RamBattRtc => read_mbc3(pif_ram, cart, address, data, size), CartType::MBC5RamBatt => read_mbc5(pif_ram, cart, address, data, size), _ => panic!("Unsupported cart type"), } diff --git a/src/device/controller/transferpak.rs b/src/device/controller/transferpak.rs index 2505532..ce28291 100644 --- a/src/device/controller/transferpak.rs +++ b/src/device/controller/transferpak.rs @@ -58,7 +58,6 @@ pub fn read(device: &mut device::Device, channel: usize, address: u16, data: usi 0x4000 * pak.bank + (address & 0x7fff) - 0x4000, data, size, - device.vi.elapsed_time as i64, ); } _ => {