gameboy_core/
lib.rs

1mod bit_utils;
2pub mod button;
3pub mod controller_event;
4mod cpu;
5pub mod emulator;
6mod gpu;
7mod joypad;
8mod mmu;
9pub mod rtc;
10pub mod sound;
11mod timer;
12
13pub use crate::button::Button;
14pub use crate::controller_event::ControllerEvent;
15pub use crate::emulator::step_result::StepResult;
16pub use crate::emulator::traits::{PixelMapper, RTC};
17
18use crate::emulator::Emulator;
19pub use crate::gpu::cgb_color::CGBColor;
20pub use crate::gpu::color::Color;
21pub use crate::joypad::Controller;
22pub use crate::mmu::cartridge::Cartridge;
23pub use crate::rtc::Rtc;
24pub struct Gameboy {
25    emulator: Emulator,
26    controller: Controller,
27}
28impl Gameboy {
29    /// Loads game from rom. Needs a Real Time Clock
30    pub fn from_rom(rom: Vec<u8>, rtc: Box<dyn RTC>) -> Result<Gameboy, String> {
31        let cartridge = Cartridge::from_rom(rom)?;
32        Ok(Gameboy {
33            emulator: Emulator::from_cartridge(cartridge, rtc),
34            controller: Controller::new(),
35        })
36    }
37    /// Run emulation step
38    pub fn emulate(&mut self, system: &mut impl PixelMapper) -> emulator::step_result::StepResult {
39        self.emulator.emulate(system, &mut self.controller)
40    }
41    pub fn get_audio_buffer(&self) -> &[f32] {
42        self.emulator.get_audio_buffer()
43    }
44    pub fn get_cartridge(&self) -> &Cartridge {
45        self.emulator.get_cartridge()
46    }
47    pub fn get_cartridge_mut(&mut self) -> &mut Cartridge {
48        self.emulator.get_cartridge_mut()
49    }
50    pub fn set_ram_change_callback(&mut self, f: Box<dyn FnMut(usize, u8)>) {
51        self.emulator.set_ram_change_callback(f)
52    }
53    pub fn press_button(&mut self, button: Button) {
54        self.controller.press(button)
55    }
56    pub fn release_button(&mut self, button: Button) {
57        self.controller.release(button)
58    }
59}