From 55bf63210ae882ccacbd2888e10ec540cebc6bd0 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 9 May 2026 15:12:20 +0200 Subject: [PATCH] Don't save timestamp to GB save (#860) * use real time for GB RTC * more * more * more --- src/device/controller/gbcart.rs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/device/controller/gbcart.rs b/src/device/controller/gbcart.rs index 593fc1e..a22424c 100644 --- a/src/device/controller/gbcart.rs +++ b/src/device/controller/gbcart.rs @@ -22,8 +22,7 @@ pub struct GbCart { pub latch: bool, pub rtc_regs: [u8; MBC3_RTC_REGS_COUNT], pub rtc_regs_latch: [u8; MBC3_RTC_REGS_COUNT], - pub rtc_timestamp: i64, - pub last_time: i64, + pub last_elapsed_time: i64, } #[derive(Default, Copy, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -43,14 +42,10 @@ pub fn init(gb_cart: &mut device::controller::gbcart::GbCart, rom: &[u8], ram: & 44 => { offset = ram.len() - 44; gb_cart.ram = ram[..ram.len() - 44].to_vec(); - gb_cart.rtc_timestamp = - i32::from_le_bytes(ram[offset + 40..offset + 44].try_into().unwrap()) as i64; } 48 => { offset = ram.len() - 48; gb_cart.ram = ram[..ram.len() - 48].to_vec(); - gb_cart.rtc_timestamp = - i64::from_le_bytes(ram[offset + 40..offset + 48].try_into().unwrap()); } _ => { gb_cart.ram = ram.to_vec(); @@ -115,8 +110,8 @@ pub fn save( f.write_all(&(gb_cart.rtc_regs_latch[MBC3_RTC_DAYS_H] as u32).to_le_bytes()) .unwrap(); - let timestamp = gb_cart.rtc_timestamp.saturating_add(elapsed_time); - f.write_all(×tamp.to_le_bytes()).unwrap(); + let max = ((i32::MAX as i64) << 32) | (i32::MAX as i64); + f.write_all(&max.to_le_bytes()).unwrap(); f.flush().unwrap(); } @@ -126,8 +121,8 @@ pub fn save( } fn update_rtc_regs(cart: &mut device::controller::gbcart::GbCart, elapsed_time: i64) { - let mut diff = elapsed_time - cart.last_time; - cart.last_time = elapsed_time; + let mut diff = elapsed_time - cart.last_elapsed_time; + cart.last_elapsed_time = elapsed_time; if diff > 0 { cart.rtc_regs[MBC3_RTC_SECONDS] += (diff % 60) as u8; @@ -157,8 +152,8 @@ fn update_rtc_regs(cart: &mut device::controller::gbcart::GbCart, elapsed_time: + diff; cart.rtc_regs[MBC3_RTC_DAYS_L] = (days & 0xff) as u8; - cart.rtc_regs[MBC3_RTC_DAYS_H] = - ((cart.rtc_regs[MBC3_RTC_DAYS_H] & !0x01) as i64 | (days & 0x100)) as u8; + cart.rtc_regs[MBC3_RTC_DAYS_H] &= !0x01; + cart.rtc_regs[MBC3_RTC_DAYS_H] |= ((days >> 8) & 1) as u8; /* set carry bit if days overflow */ if days > 511 {