Compare commits

...

2 Commits

Author SHA1 Message Date
Michael Kohl 801cbc64df Add delay timer 2021-04-04 23:16:27 +07:00
Michael Kohl e251e8fdbd Add sprite drawing 2021-04-04 22:58:13 +07:00
4 changed files with 54 additions and 6 deletions

View File

@ -16,12 +16,33 @@ impl Screen {
}
pub fn pixel_set(&mut self, x: usize, y: usize) -> () {
self.pixels[y][x] = true;
self.pixels[y][x] ^= true;
}
pub fn is_pixel_set(&self, x: usize, y: usize) -> bool {
self.pixels[y][x]
}
pub fn draw_sprite(&mut self, x: usize, y: usize, sprite: &[u8]) -> bool {
let mut pixel_collission = false;
for ly in 0..sprite.len() {
let b = sprite[ly];
for lx in 0..8 {
if b & 0b10000000 >> lx > 0 {
let dx = (x + lx) % WIDTH;
let dy = (y + ly) % HEIGHT;
if !pixel_collission && self.is_pixel_set(dx, dy) {
pixel_collission = true;
}
self.pixel_set(dx, dy);
}
}
}
pixel_collission
}
}
#[cfg(test)]
@ -34,4 +55,11 @@ mod tests {
screen.pixel_set(5, 5);
assert!(screen.is_pixel_set(5, 5));
}
#[test]
fn it_returns_true_when_overwriting() {
let mut screen = Screen::new();
assert!(!screen.draw_sprite(0, 0, &[0xff]));
assert!(screen.draw_sprite(0, 0, &[0xff]));
}
}

View File

@ -1,7 +1,7 @@
use crate::chip8::display::Screen;
use crate::chip8::keyboard::Keyboard;
use crate::chip8::memory::Memory;
use crate::chip8::registers::Registers;
use crate::chip8::registers::{Register, Registers};
use crate::chip8::stack::Stack;
pub struct Chip8 {
@ -22,4 +22,12 @@ impl Chip8 {
screen: Screen::new(),
}
}
pub fn delay_if_necessary(&mut self) -> () {
let delay_timer = self.registers.get(Register::DT);
if delay_timer > 0 {
::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
self.registers.set(Register::DT, delay_timer - 1);
}
}
}

View File

@ -49,6 +49,10 @@ impl Memory {
pub fn get(&self, index: usize) -> u8 {
self.memory[index]
}
pub fn read(&self, start: usize, bytes: u8) -> &[u8] {
&self.memory[start..start + bytes as usize]
}
}
#[cfg(test)]
@ -79,4 +83,12 @@ mod tests {
let memory = Memory::new();
assert_eq!(memory.memory[0..5], [0xf0, 0x90, 0x90, 0x90, 0xf0])
}
#[test]
fn it_returns_a_slice_of_memory() {
let memory = Memory::new();
let slice = memory.read(0, 5);
assert_eq!(slice.len(), 5);
assert_eq!(slice, [0xf0, 0x90, 0x90, 0x90, 0xf0]);
}
}

View File

@ -12,9 +12,9 @@ const EMULATOR_WINDOW_TITLE: &str = "Rust CHIP-8";
fn main() -> Result<(), String> {
let mut chip8 = Chip8::new();
chip8.screen.pixel_set(0, 0);
chip8.screen.pixel_set(10, 2);
chip8.screen.pixel_set(42, 23);
chip8.screen.draw_sprite(24, 13, chip8.memory.read(20, 5));
chip8.screen.draw_sprite(29, 13, chip8.memory.read(10, 5));
chip8.screen.draw_sprite(34, 13, chip8.memory.read(40, 5));
let sdl_context = sdl2::init()?;
let video_subsystem = sdl_context.video()?;
@ -85,7 +85,7 @@ fn main() -> Result<(), String> {
}
canvas.present();
::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
chip8.delay_if_necessary();
}
Ok(())