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) -> () {
|
||||
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]));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(())
|
||||
|
|
Loading…
Reference in New Issue