diff options
Diffstat (limited to 'src/chip8.rs')
| -rw-r--r-- | src/chip8.rs | 27 |
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; |
