From aaa7b07dd0add847a59fa9f0fd86b068cd7ccb91 Mon Sep 17 00:00:00 2001 From: Samuel Perrouault Date: Wed, 26 Mar 2025 20:11:19 +0100 Subject: implement RND Vx, nn --- src/chip8.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/chip8.rs') diff --git a/src/chip8.rs b/src/chip8.rs index faf4c7e..5ff782d 100644 --- a/src/chip8.rs +++ b/src/chip8.rs @@ -10,6 +10,27 @@ fn unknown_opcode(opcode: u16) { std::process::exit(1); } +struct RandomGenerator { + random: u8, +} + +impl RandomGenerator { + fn new() -> Self { + Self { random: 92 } + } +} + +impl Iterator for RandomGenerator { + type Item = u8; + + fn next(&mut self) -> Option { + self.random ^= self.random << 6; + self.random ^= self.random >> 4; + self.random ^= self.random << 1; + Some(self.random) + } +} + pub struct Chip8 { v: [u8; 16], i: u16, @@ -22,6 +43,7 @@ pub struct Chip8 { sound_timer: u8, key: [u8; 16], draw: bool, + random: RandomGenerator, } impl Chip8 { @@ -38,6 +60,7 @@ impl Chip8 { sound_timer: 0, key: [0; 16], draw: false, + random: RandomGenerator::new(), } } @@ -162,6 +185,10 @@ impl Chip8 { eprintln!("LD I, {}", nnn); self.i = nnn; } + 0xC000 => { + eprintln!("RND V{}, {}", x, nn); + self.v[x] = self.random.next().unwrap_or(0) & nn; + } 0xD000 => { eprintln!("DRW V{}, V{}, {}", x, y, n); let vx = self.v[x] as u16; -- cgit v1.2.3