From be7c5c64c6a55660d1bdbb23cd5a2f93f4d3a3c8 Mon Sep 17 00:00:00 2001 From: Samuel Perrouault Date: Wed, 26 Mar 2025 22:44:04 +0100 Subject: implement LD F, Vx and embed a font --- src/lib.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'src') 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(&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; -- cgit v1.2.3