summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Perrouault <samuel.perrouault@gmail.com>2025-03-26 20:11:19 +0100
committerSamuel Perrouault <samuel.perrouault@gmail.com>2025-03-26 20:11:19 +0100
commitaaa7b07dd0add847a59fa9f0fd86b068cd7ccb91 (patch)
treee611fbd07ba2793be6b19f2f7b58e42f9f18aa6b
parent91db12c114e627a29114d967fcab20ec4d463ece (diff)
implement RND Vx, nn
-rw-r--r--src/chip8.rs27
1 files changed, 27 insertions, 0 deletions
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::Item> {
+ 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;