implement non-working draw instruction
This commit is contained in:
parent
89d4196ccf
commit
d63f5580be
3 changed files with 27 additions and 4 deletions
|
@ -10,6 +10,8 @@ pub trait Display {
|
|||
fn clear(&self);
|
||||
/// Renders the display data on screen.
|
||||
fn render(&mut self);
|
||||
/// Draws the pixels at x and y coordinates
|
||||
fn draw(&mut self, x: u8, y: u8, pixels: u8) -> bool;
|
||||
}
|
||||
|
||||
/// Display models the Chip8's display.
|
||||
|
@ -46,4 +48,15 @@ impl Display for TerminalDisplay {
|
|||
print!("\n")
|
||||
}
|
||||
}
|
||||
|
||||
/// Draws the pixels at x and y coordinates
|
||||
fn draw(&mut self, x: u8, y: u8, pixels: u8) -> bool {
|
||||
let row = y as usize;
|
||||
let column = x as usize;
|
||||
for pixel in 0..=pixels {
|
||||
self.display_data[row * DISPLAY_WIDTH + column + pixel as usize] = true;
|
||||
}
|
||||
self.render();
|
||||
true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ use log::{debug, info, trace, warn};
|
|||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::path::Path;
|
||||
use std::{thread, time};
|
||||
|
||||
const MEMORY_SIZE: usize = 4096;
|
||||
const NUMBER_OF_REGISTERS: usize = 16;
|
||||
|
@ -111,8 +112,10 @@ where
|
|||
|
||||
// decode & execute
|
||||
self.execute_instruction(instruction)?;
|
||||
|
||||
// insert some delay
|
||||
thread::sleep(time::Duration::from_millis(50));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn execute_instruction(&mut self, instruction: Instruction) -> Result<(), anyhow::Error> {
|
||||
|
@ -134,7 +137,11 @@ where
|
|||
self.registers[register as usize] += data
|
||||
}
|
||||
ProcessorInstruction::Draw(vx_register, vy_register, pixels) => {
|
||||
trace!("Draw vx_register={vx_register} vy_register={vy_register} pixels={pixels}")
|
||||
trace!("Draw vx_register={vx_register} vy_register={vy_register} pixels={pixels}");
|
||||
let x_coordinate = self.registers[vx_register as usize] & 63;
|
||||
let y_coordinate = self.registers[vy_register as usize] & 31;
|
||||
self.registers[0xF] = 0;
|
||||
self.display.draw(x_coordinate, y_coordinate, pixels);
|
||||
}
|
||||
ProcessorInstruction::UnknownInstruction => {
|
||||
warn!("Unknown instruction: {:04x}, skipping.", instruction);
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use log::info;
|
||||
use std::fmt;
|
||||
use std::fmt::{Display, Formatter, LowerHex};
|
||||
/*
|
||||
|
@ -80,7 +79,11 @@ impl Instruction {
|
|||
}
|
||||
0xD000..=0xDFFF => {
|
||||
// DXYN
|
||||
ProcessorInstruction::Draw(Self::grab_first_nibble(data), Self::grab_middle_nibble(data), Self::grab_last_nibble(data))
|
||||
ProcessorInstruction::Draw(
|
||||
Self::grab_first_nibble(data),
|
||||
Self::grab_middle_nibble(data),
|
||||
Self::grab_last_nibble(data),
|
||||
)
|
||||
}
|
||||
// Unknown instruction
|
||||
_ => ProcessorInstruction::UnknownInstruction,
|
||||
|
|
Loading…
Reference in a new issue