Compare commits

...

2 Commits

Author SHA1 Message Date
Michael Kohl 983de3302e Add memory to Chip8 struct, run rustfmt 2021-03-28 21:56:55 +07:00
Michael Kohl 6022ddf04c Add chip8 module, restructure 2021-03-27 12:13:48 +07:00
2 changed files with 101 additions and 28 deletions

53
src/chip8.rs Normal file
View File

@ -0,0 +1,53 @@
const MEMORY_SIZE: usize = 4096;
const WIDTH: u32 = 64;
const HEIGHT: u32 = 32;
pub const SCALE_FACTOR: u32 = 10;
pub const WINDOW_WIDTH: u32 = WIDTH * SCALE_FACTOR;
pub const WINDOW_HEIGHT: u32 = HEIGHT * SCALE_FACTOR;
type Memory = [u8; MEMORY_SIZE];
pub struct Chip8 {
memory: Memory,
}
impl Chip8 {
pub fn new() -> Chip8 {
Chip8 {
memory: [0; MEMORY_SIZE],
}
}
pub fn memory_set(&mut self, index: usize, value: u8) -> () {
self.memory[index] = value;
}
pub fn memory_get(&self, index: usize) -> u8 {
self.memory[index]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_has_the_correct_size() {
assert_eq!(Chip8::new().memory.len(), MEMORY_SIZE);
}
#[test]
fn it_can_write_the_memory() {
let mut chip8 = Chip8::new();
chip8.memory_set(2, 42);
assert_eq!(chip8.memory[0..3], [0, 0, 42]);
}
#[test]
fn it_can_read_the_memory() {
let mut chip8 = Chip8::new();
chip8.memory_set(2, 42);
assert_eq!(chip8.memory_get(2), 42);
}
}

View File

@ -1,42 +1,62 @@
use sdl2::pixels::Color;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::rect::Rect;
mod chip8;
const EMULATOR_WINDOW_TITLE: &str = "Rust CHIP-8";
fn main() -> Result<(), String> {
let sdl_context = sdl2::init()?;
let video_subsystem = sdl_context.video()?;
let mut chip8 = chip8::Chip8::new();
chip8.memory_set(42, 42);
println!("{}", &chip8.memory_get(42));
let window = video_subsystem.window("Rust CHIP-8", 640, 320)
.position_centered().build()
.expect("could not initialize video subsystem");
let sdl_context = sdl2::init()?;
let video_subsystem = sdl_context.video()?;
let mut canvas = window.into_canvas().build().expect("could not make a canvas");
let window = video_subsystem
.window(
EMULATOR_WINDOW_TITLE,
chip8::WINDOW_WIDTH,
chip8::WINDOW_HEIGHT,
)
.position_centered()
.build()
.expect("Could not initialize video subsystem");
canvas.set_draw_color(Color::RGB(0, 0, 0));
canvas.clear();
let mut canvas = window
.into_canvas()
.build()
.expect("Could not make a canvas");
let mut event_pump = sdl_context.event_pump()?;
let mut i = 0;
canvas.set_draw_color(Color::RGB(0, 0, 0));
canvas.clear();
'mainloop: loop {
i = (i + 1) % 255;
canvas.set_draw_color(Color::RGB(i, 64, 255 - i));
canvas.fill_rect(Rect::new(10, 10, 620, 300))?;
let mut event_pump = sdl_context.event_pump()?;
let mut i = 0;
for event in event_pump.poll_iter() {
match event {
Event::Quit {..} |
Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
break 'mainloop;
},
_ => {}
}
'mainloop: loop {
i = (i + 1) % 255;
canvas.set_draw_color(Color::RGB(i, 64, 255 - i));
canvas.fill_rect(Rect::new(10, 10, 620, 300))?;
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => {
break 'mainloop;
}
_ => {}
}
}
canvas.present();
::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
}
canvas.present();
::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
}
Ok(())
Ok(())
}