From d68cfcb696742e7d9b079f55f08fb0d97e121d1c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Mon, 7 Aug 2023 16:46:51 +0100
Subject: [PATCH] chore: support for the BEES model

---
 src/state.rs | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/state.rs b/src/state.rs
index bcfac638..cf481005 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -112,7 +112,7 @@ impl Serialize for BeesState {
 impl State for BeesState {
     fn from_gb(gb: &mut GameBoy) -> Self {
         Self {
-            footer: BeesFooter::default(), // @TODO: check if this makes sense
+            footer: BeesFooter::default(),
             name: BeesName::from_gb(gb),
             info: BeesInfo::from_gb(gb),
             core: BeesCore::from_gb(gb),
@@ -475,6 +475,37 @@ impl BeesCore {
         }
         Ok(())
     }
+
+    /// Obtains the BEES (GAme Boy) model string using the
+    /// provided GameBoy instance.
+    fn bees_model(gb: &GameBoy) -> String {
+        let mut buffer = [0x00_u8; 4];
+
+        if gb.is_dmg() {
+            buffer[0] = 'G' as u8;
+        } else if gb.is_cgb() {
+            buffer[0] = 'C' as u8;
+        } else if gb.is_sgb()  {
+            buffer[0] = 'S' as u8;
+        } else {
+            buffer[0] = ' ' as u8;
+        }
+
+        if gb.is_dmg() {
+            buffer[1] = 'D' as u8;
+        } else if gb.is_cgb() {
+            buffer[1] = 'C' as u8;
+        } else if gb.is_sgb()  {
+            buffer[1] = 'N' as u8;
+        } else {
+            buffer[1] = ' ' as u8;
+        }
+
+        buffer[2] = ' ' as u8;
+        buffer[3] = ' ' as u8;
+
+        String::from_utf8(Vec::from(buffer)).unwrap()
+    }
 }
 
 impl Serialize for BeesCore {
@@ -572,7 +603,7 @@ impl Serialize for BeesCore {
 impl State for BeesCore {
     fn from_gb(gb: &mut GameBoy) -> Self {
         let mut core = Self::new(
-            String::from("GD  "), // @TODO: use the proper string
+            Self::bees_model(gb),
             gb.cpu_i().pc(),
             gb.cpu_i().af(),
             gb.cpu_i().bc(),
@@ -583,6 +614,7 @@ impl State for BeesCore {
             gb.mmu_i().ie,
             0,
             // @TODO: these registers cannot be totally retrieved
+            // because of that some audio noise exists
             gb.mmu().read_many(0xff00, 128).try_into().unwrap(),
         );
         core.ram.fill_buffer(gb.mmu().ram());
-- 
GitLab