diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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; |
