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