Compare commits
2 Commits
966a714fae
...
801cbc64df
Author | SHA1 | Date |
---|---|---|
Michael Kohl | 801cbc64df | |
Michael Kohl | e251e8fdbd |
|
@ -16,12 +16,33 @@ impl Screen {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pixel_set(&mut self, x: usize, y: usize) -> () {
|
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 {
|
pub fn is_pixel_set(&self, x: usize, y: usize) -> bool {
|
||||||
self.pixels[y][x]
|
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)]
|
#[cfg(test)]
|
||||||
|
@ -34,4 +55,11 @@ mod tests {
|
||||||
screen.pixel_set(5, 5);
|
screen.pixel_set(5, 5);
|
||||||
assert!(screen.is_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]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::chip8::display::Screen;
|
use crate::chip8::display::Screen;
|
||||||
use crate::chip8::keyboard::Keyboard;
|
use crate::chip8::keyboard::Keyboard;
|
||||||
use crate::chip8::memory::Memory;
|
use crate::chip8::memory::Memory;
|
||||||
use crate::chip8::registers::Registers;
|
use crate::chip8::registers::{Register, Registers};
|
||||||
use crate::chip8::stack::Stack;
|
use crate::chip8::stack::Stack;
|
||||||
|
|
||||||
pub struct Chip8 {
|
pub struct Chip8 {
|
||||||
|
@ -22,4 +22,12 @@ impl Chip8 {
|
||||||
screen: Screen::new(),
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,10 @@ impl Memory {
|
||||||
pub fn get(&self, index: usize) -> u8 {
|
pub fn get(&self, index: usize) -> u8 {
|
||||||
self.memory[index]
|
self.memory[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn read(&self, start: usize, bytes: u8) -> &[u8] {
|
||||||
|
&self.memory[start..start + bytes as usize]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -79,4 +83,12 @@ mod tests {
|
||||||
let memory = Memory::new();
|
let memory = Memory::new();
|
||||||
assert_eq!(memory.memory[0..5], [0xf0, 0x90, 0x90, 0x90, 0xf0])
|
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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,9 @@ const EMULATOR_WINDOW_TITLE: &str = "Rust CHIP-8";
|
||||||
|
|
||||||
fn main() -> Result<(), String> {
|
fn main() -> Result<(), String> {
|
||||||
let mut chip8 = Chip8::new();
|
let mut chip8 = Chip8::new();
|
||||||
chip8.screen.pixel_set(0, 0);
|
chip8.screen.draw_sprite(24, 13, chip8.memory.read(20, 5));
|
||||||
chip8.screen.pixel_set(10, 2);
|
chip8.screen.draw_sprite(29, 13, chip8.memory.read(10, 5));
|
||||||
chip8.screen.pixel_set(42, 23);
|
chip8.screen.draw_sprite(34, 13, chip8.memory.read(40, 5));
|
||||||
|
|
||||||
let sdl_context = sdl2::init()?;
|
let sdl_context = sdl2::init()?;
|
||||||
let video_subsystem = sdl_context.video()?;
|
let video_subsystem = sdl_context.video()?;
|
||||||
|
@ -85,7 +85,7 @@ fn main() -> Result<(), String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas.present();
|
canvas.present();
|
||||||
::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
|
chip8.delay_if_necessary();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Reference in New Issue