Run Sound + Delay Timers in another thread in Safe Rust
There is yet to be communication between the Parallel timers and the actual CHIP-8 Emulator
This commit is contained in:
parent
e1616caf06
commit
6954a60864
|
@ -152,6 +152,7 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||||
name = "chip8"
|
name = "chip8"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
"pixels",
|
"pixels",
|
||||||
"rand",
|
"rand",
|
||||||
"rodio",
|
"rodio",
|
||||||
|
|
|
@ -12,3 +12,4 @@ rand = "0.7.3"
|
||||||
winit = "0.22.2"
|
winit = "0.22.2"
|
||||||
winit_input_helper = "0.7.0"
|
winit_input_helper = "0.7.0"
|
||||||
rodio = "0.11.0"
|
rodio = "0.11.0"
|
||||||
|
lazy_static = "1.4.0"
|
||||||
|
|
|
@ -62,7 +62,6 @@ impl Chip8 {
|
||||||
pub fn execute_cycle(&mut self) {
|
pub fn execute_cycle(&mut self) {
|
||||||
// Reset Request Redraw
|
// Reset Request Redraw
|
||||||
self.request_redraw = false;
|
self.request_redraw = false;
|
||||||
|
|
||||||
let opcode = self.get_opcode();
|
let opcode = self.get_opcode();
|
||||||
self.pc += 2; // Immediately increment the Program Counter
|
self.pc += 2; // Immediately increment the Program Counter
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
// I used: http://devernay.free.fr/hacks/chip8/C8TECH10.HTM#00E0
|
use chip8::{emu::Chip8, periph::TimerManager};
|
||||||
// and https://en.wikipedia.org/wiki/CHIP-8#Opcode_table
|
|
||||||
// for information about how to implement a CHIP-8 Emulator
|
|
||||||
use chip8::emu::Chip8;
|
|
||||||
use pixels::{wgpu::Surface, Pixels, SurfaceTexture};
|
use pixels::{wgpu::Surface, Pixels, SurfaceTexture};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
@ -25,6 +22,8 @@ fn main() {
|
||||||
let rom_path = Path::new("./games/c8games/INVADERS");
|
let rom_path = Path::new("./games/c8games/INVADERS");
|
||||||
chip8.load_rom(rom_path).expect("Unable to load ROM");
|
chip8.load_rom(rom_path).expect("Unable to load ROM");
|
||||||
|
|
||||||
|
TimerManager::start();
|
||||||
|
|
||||||
let mut start = Instant::now();
|
let mut start = Instant::now();
|
||||||
let frametime = Duration::from_nanos(1e+9 as u64 / OPCODES_PER_SECOND);
|
let frametime = Duration::from_nanos(1e+9 as u64 / OPCODES_PER_SECOND);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
|
use lazy_static::lazy_static;
|
||||||
use rodio::{source::SineWave, Sink};
|
use rodio::{source::SineWave, Sink};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use std::thread;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref SOUND_TIMER: Mutex<Timer> = Mutex::new(Timer::default().with_beep());
|
||||||
|
static ref DELAY_TIMER: Mutex<Timer> = Mutex::new(Timer::default());
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct Display {
|
pub struct Display {
|
||||||
pub buf: [u8; Self::WIDTH as usize * Self::HEIGHT as usize],
|
pub buf: [u8; Self::WIDTH as usize * Self::HEIGHT as usize],
|
||||||
|
@ -57,6 +65,25 @@ impl Default for Display {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct TimerManager;
|
||||||
|
|
||||||
|
impl TimerManager {
|
||||||
|
pub fn start() {
|
||||||
|
thread::spawn(|| {
|
||||||
|
let duration = Duration::from_nanos(1e+9 as u64 / 60);
|
||||||
|
let mut start = Instant::now();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if Instant::now().duration_since(start) > duration {
|
||||||
|
SOUND_TIMER.lock().unwrap().tick();
|
||||||
|
DELAY_TIMER.lock().unwrap().tick();
|
||||||
|
start = Instant::now();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct Timer {
|
pub struct Timer {
|
||||||
remaining: u8,
|
remaining: u8,
|
||||||
|
|
Loading…
Reference in New Issue