summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 4671be9..37c7914 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,6 +4,24 @@ use std::io::Write;
const WIDTH: u16 = 64;
const HEIGHT: u16 = 32;
const PIXELS: usize = (WIDTH * HEIGHT) as usize;
+const FONT: [u8; 80] = [
+ 0xF0, 0x90, 0x90, 0x90, 0xF0, //0
+ 0x20, 0x60, 0x20, 0x20, 0x70, //1
+ 0xF0, 0x10, 0xF0, 0x80, 0xF0, //2
+ 0xF0, 0x10, 0xF0, 0x10, 0xF0, //3
+ 0x90, 0x90, 0xF0, 0x10, 0x10, //4
+ 0xF0, 0x80, 0xF0, 0x10, 0xF0, //5
+ 0xF0, 0x80, 0xF0, 0x90, 0xF0, //6
+ 0xF0, 0x10, 0x20, 0x40, 0x40, //7
+ 0xF0, 0x90, 0xF0, 0x90, 0xF0, //8
+ 0xF0, 0x90, 0xF0, 0x10, 0xF0, //9
+ 0xF0, 0x90, 0xF0, 0x90, 0x90, //A
+ 0xE0, 0x90, 0xE0, 0x90, 0xE0, //B
+ 0xF0, 0x80, 0x80, 0x80, 0xF0, //C
+ 0xE0, 0x90, 0x90, 0x90, 0xE0, //D
+ 0xF0, 0x80, 0xF0, 0x80, 0xF0, //E
+ 0xF0, 0x80, 0xF0, 0x80, 0x80, //F
+];
fn unknown_opcode(opcode: u16) {
eprintln!("Unknwown opcode {:#06x}", opcode);
@@ -48,7 +66,7 @@ pub struct Chip8 {
impl Chip8 {
pub fn new() -> Self {
- Self {
+ let mut r = Self {
v: [0; 16],
i: 0,
pc: 0x200,
@@ -61,7 +79,9 @@ impl Chip8 {
key: [0; 16],
draw: false,
random: RandomGenerator::new(),
- }
+ };
+ r.memory[..80].copy_from_slice(&FONT);
+ r
}
pub fn load_rom<R: Read>(&mut self, mut reader: R) -> std::io::Result<()> {
@@ -236,6 +256,10 @@ impl Chip8 {
eprintln!("ADD, I, V{}", x);
self.i += self.v[x] as u16;
}
+ 0x0029 => {
+ eprintln!("LD F, V{}", x);
+ self.i = x as u16 * 5;
+ }
0x0033 => {
eprintln!("LD, B, V{}", x);
let i = self.i as usize;