2021-10-14 01:50:48 +00:00
|
|
|
use std::{thread, time};
|
|
|
|
|
2021-10-26 22:34:59 +00:00
|
|
|
use crate::cpu::{CPU, Cycles};
|
2021-10-14 00:38:37 +00:00
|
|
|
use crate::ppu::PPU;
|
|
|
|
use crate::bus::Bus;
|
|
|
|
|
2021-10-26 22:34:59 +00:00
|
|
|
pub struct Emulator {
|
2021-10-14 00:38:37 +00:00
|
|
|
cpu: CPU,
|
|
|
|
ppu: PPU,
|
|
|
|
bus: Bus,
|
|
|
|
}
|
|
|
|
|
2021-10-26 22:34:59 +00:00
|
|
|
impl Emulator {
|
2021-10-14 00:38:37 +00:00
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
cpu: CPU::new(),
|
|
|
|
ppu: PPU::new(),
|
|
|
|
bus: Bus::new(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-26 22:34:59 +00:00
|
|
|
pub fn draw(&mut self, frame: &mut [u8]) {
|
|
|
|
self.ppu.draw_background(&self.bus);
|
|
|
|
let ppu_frame = self.ppu.get_rgba_frame(&self.bus);
|
|
|
|
for (i, pixel) in frame.chunks_exact_mut(4).enumerate() {
|
|
|
|
pixel.copy_from_slice(&ppu_frame[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn run(&mut self, cpu_cycles: Cycles) {
|
|
|
|
self.cpu.reset_cycles();
|
|
|
|
while self.cpu.get_cycles().0 <= cpu_cycles.0 {
|
|
|
|
self.cpu.run(&mut self.bus);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn cpu_loop(&mut self) {
|
2021-10-14 01:50:48 +00:00
|
|
|
let mut exit = false;
|
|
|
|
while !exit {
|
|
|
|
self.cpu.run(&mut self.bus);
|
|
|
|
|
2021-10-18 15:13:23 +00:00
|
|
|
// thread::sleep(time::Duration::from_millis(100));
|
2021-10-20 02:55:35 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 1258895; // log 1
|
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 1068422; // log 3
|
2021-10-20 03:36:10 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 1262766; // log 4
|
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 1763388; // log 5
|
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 243272; // log 6
|
2021-10-20 17:29:55 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 287416; // log 7
|
2021-10-20 18:39:39 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 223892; // log 8
|
2021-10-20 18:47:59 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 4420382; // log 9
|
2021-10-20 19:33:11 +00:00
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 6714723; // log 10
|
|
|
|
// exit = self.cpu.get_exec_calls_count() >= 7429762; // log 11
|
2021-10-14 01:50:48 +00:00
|
|
|
}
|
2021-10-14 00:38:37 +00:00
|
|
|
}
|
|
|
|
}
|