diff --git a/src/state.rs b/src/state.rs index bcfac638761d4933c70a08cfe360203edbb981f4..cf481005035dcb1ac2a4e09efdc3e14ca20eaa54 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());