From 0c93aa69d4926bf372bf4674c8f998d8fa220557 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Tue, 8 Aug 2023 10:38:43 +0100
Subject: [PATCH] fix: issue with the boot flag register The wrong value was
 being store in 0xFF50.

---
 src/mmu.rs   | 10 ++++++++--
 src/state.rs | 26 +++++++++++++++++++-------
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/mmu.rs b/src/mmu.rs
index 9b02f33f..d902578d 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -327,7 +327,13 @@ impl Mmu {
                     0x4d => (false as u8) | ((self.speed as u8) << 7),
 
                     // 0xFF50 - Boot active flag
-                    0x50 => u8::from(self.boot_active),
+                    0x50 => {
+                        if self.boot_active {
+                            0x00
+                        } else {
+                            0xff
+                        }
+                    }
 
                     // 0xFF70 - SVBK: WRAM bank (CGB only)
                     0x70 => self.ram_bank & 0x07,
@@ -430,7 +436,7 @@ impl Mmu {
                     }
 
                     // 0xFF50 - Boot active flag
-                    0x50 => self.boot_active = false,
+                    0x50 => self.boot_active = value == 0x00,
 
                     // 0xFF70 - SVBK: WRAM bank (CGB only)
                     0x70 => {
diff --git a/src/state.rs b/src/state.rs
index 068219b8..f953a77e 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -610,7 +610,12 @@ impl BeesCore {
             buffer[1] = b' ';
         }
 
-        buffer[2] = b' ';
+        if gb.is_dmg() {
+            buffer[2] = b'0';
+        } else {
+            buffer[2] = b' ';
+        }
+
         buffer[3] = b' ';
 
         String::from_utf8(Vec::from(buffer)).unwrap()
@@ -877,20 +882,27 @@ impl Default for BeesMbc {
     }
 }
 
-pub fn save_state_file(file_path: &str, gb: &mut GameBoy) {
-    let mut file = File::create(file_path).unwrap();
-    let data = save_state(gb);
+pub fn save_state_file(file_path: &str, gb: &mut GameBoy) -> Result<(), String> {
+    let mut file = match File::create(file_path) {
+        Ok(file) => file,
+        Err(_) => return Err(format!("Failed to open file: {}", file_path)),
+    };
+    let data = save_state(gb)?;
     file.write_all(&data).unwrap();
+    Ok(())
 }
 
-pub fn save_state(gb: &mut GameBoy) -> Vec<u8> {
+pub fn save_state(gb: &mut GameBoy) -> Result<Vec<u8>, String> {
     let mut data: Vec<u8> = vec![];
     BeesState::from_gb(gb).save(&mut data);
-    data
+    Ok(data)
 }
 
 pub fn load_state_file(file_path: &str, gb: &mut GameBoy) -> Result<(), String> {
-    let mut file = File::open(file_path).unwrap();
+    let mut file = match File::open(file_path) {
+        Ok(file) => file,
+        Err(_) => return Err(format!("Failed to open file: {}", file_path)),
+    };
     let mut data = vec![];
     file.read_to_end(&mut data).unwrap();
     load_state(&data, gb)?;
-- 
GitLab