From 3775147c84db17f561a614ea51eb0b855cafb47a Mon Sep 17 00:00:00 2001 From: BayThylacine Date: Sat, 22 Feb 2025 15:26:03 +1100 Subject: [PATCH] Fixed issues found with 4-flags.ch8 and 5-quirks.ch8 --- src/main.rs | 93 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5b640aa..35b2078 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,11 +17,12 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use std::sync::Arc; use rand::prelude::*; use tao::keyboard::Key; +use std::time::{Duration, Instant}; -const MODERNSHIFT: bool = true; +const MODERNSHIFT: bool = false; const OLDJUMP: bool = true; -const MODERNLOADSAVE: bool = true; +const MODERNLOADSAVE: bool = false; #[derive(Parser, Debug)] struct Args { @@ -44,6 +45,7 @@ struct Chip8 { get_key_pause: bool, keys_released: [bool; 16], keys_pressed: [bool; 16], + display_wait: bool, } impl Chip8 { @@ -62,6 +64,7 @@ impl Chip8 { get_key_pause: false, keys_released: [false; 16], keys_pressed: [false; 16], + display_wait: false, } } @@ -97,7 +100,8 @@ impl Chip8 { pixel.copy_from_slice(&rgba); } - info!("done"); + self.display_wait = false; + //info!("done"); *self } @@ -193,59 +197,72 @@ impl Chip8 { }, 0x01 => { self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] | self.registers[opcodes[2] as usize]; + self.registers[0x0f] = 0; }, 0x02 => { self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] & self.registers[opcodes[2] as usize]; + self.registers[0x0f] = 0; }, 0x03 => { self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] ^ self.registers[opcodes[2] as usize]; + self.registers[0x0f] = 0; }, 0x04 => { let added_base = (self.registers[opcodes[1] as usize] as u16) + (self.registers[opcodes[2] as usize] as u16); + self.registers[opcodes[1] as usize] = (added_base & 255) as u8; if added_base > 255 { self.registers[0x0f] = 1; } else { self.registers[0x0f] = 0; } - self.registers[opcodes[1] as usize] = (added_base & 255) as u8; }, 0x05 => { - //info!("{},{}", self.registers[opcodes[1] as usize], self.registers[opcodes[2] as usize]); - let no_underflow = (self.registers[opcodes[1] as usize] >= self.registers[opcodes[2] as usize]); - self.registers[0x0f] = no_underflow as u8; + let r1 = self.registers[opcodes[1] as usize]; + let r2 = self.registers[opcodes[2] as usize]; + info!("{},{}", r1 , r2); + let no_underflow = (r1 >= r2); if no_underflow { - self.registers[opcodes[1] as usize] -= self.registers[opcodes[2] as usize]; + info!("{}",r1 - r2); + self.registers[opcodes[1] as usize] = r1 - r2; } else { - self.registers[opcodes[1] as usize] = 255 - ((self.registers[opcodes[2] as usize] - self.registers[opcodes[1] as usize]) - 1); + self.registers[opcodes[1] as usize] = 255 - ((r2 - r1) - 1); } + self.registers[0x0f] = no_underflow as u8; }, 0x06 => { if MODERNSHIFT { - self.registers[0x0f] = ((self.registers[opcodes[1] as usize] & 1) != 0) as u8; + let t = ((self.registers[opcodes[1] as usize] & 1) != 0) as u8; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] >> 1; + self.registers[0x0f] = t; } else { self.registers[opcodes[1] as usize] = self.registers[opcodes[2] as usize]; - self.registers[0x0f] = ((self.registers[opcodes[1] as usize] & 1) != 0) as u8; + let t = ((self.registers[opcodes[1] as usize] & 1) != 0) as u8; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] >> 1; + self.registers[0x0f] = t; } }, 0x07 => { - let no_underflow = (self.registers[opcodes[2] as usize] >= self.registers[opcodes[1] as usize]); - self.registers[0x0f] = no_underflow as u8; + let r1 = self.registers[opcodes[1] as usize]; + let r2 = self.registers[opcodes[2] as usize]; + let no_underflow = (r2 >= r1); + //self.registers[0x0f] = no_underflow as u8; if no_underflow { - self.registers[opcodes[1] as usize] = self.registers[opcodes[2] as usize] - self.registers[opcodes[1] as usize]; + self.registers[opcodes[1] as usize] = r2 - r1; } else { - self.registers[opcodes[1] as usize] = 255 - ((self.registers[opcodes[1] as usize] - self.registers[opcodes[2] as usize]) - 1); + self.registers[opcodes[1] as usize] = 255 - ((r1 - r2) - 1); } + self.registers[0x0f] = no_underflow as u8; }, 0x0e => { if MODERNSHIFT { - self.registers[0x0f] = ((self.registers[opcodes[1] as usize] & 128) != 0) as u8; + let t = ((self.registers[opcodes[1] as usize] & 128) != 0) as u8; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] << 1; + self.registers[0x0f] = t; } else { self.registers[opcodes[1] as usize] = self.registers[opcodes[2] as usize]; - self.registers[0x0f] = ((self.registers[opcodes[1] as usize] & 128) != 0) as u8; + let t = ((self.registers[opcodes[1] as usize] & 128) != 0) as u8; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] << 1; + self.registers[0x0f] = t; } }, _ => {error!("unknown opcode")} @@ -277,23 +294,28 @@ impl Chip8 { self.registers[opcodes[1] as usize] = random & (opcodes[2] << 4 | opcodes[3]); }, 0x0d => { - let x = self.registers[opcodes[1] as usize] % 64; - let y = self.registers[opcodes[2] as usize] % 32; - self.registers[0x0f] = 0; - for n in 0..opcodes[3] { - let spritedata = self.ram[self.index_register as usize + n as usize]; - let mut checkdata: u8 = 0; - for i in 0..8 { - let bit = get_bit_u8(spritedata, i); - checkdata += (bit as u8) << (7 - i); - if (x+i <= 63) && (y+n <= 31) { - if (get_bit(self.display[(y+n) as usize], (x+i)) && bit) { - self.registers[0x0f] = 1; + if !self.display_wait { + let x = self.registers[opcodes[1] as usize] % 64; + let y = self.registers[opcodes[2] as usize] % 32; + self.registers[0x0f] = 0; + for n in 0..opcodes[3] { + let spritedata = self.ram[self.index_register as usize + n as usize]; + let mut checkdata: u8 = 0; + for i in 0..8 { + let bit = get_bit_u8(spritedata, i); + checkdata += (bit as u8) << (7 - i); + if (x+i <= 63) && (y+n <= 31) { + if (get_bit(self.display[(y+n) as usize], (x+i)) && bit) { + self.registers[0x0f] = 1; + } + self.display[(y + n) as usize] = self.display[(y + n) as usize] ^ ((bit as u64) << (x + i)); } - self.display[(y + n) as usize] = self.display[(y + n) as usize] ^ ((bit as u64) << (x + i)); } - } //info!("{},{}", spritedata, checkdata); + } + self.display_wait = true; + } else { + self.pc -= 2; } }, 0x0e => { @@ -414,8 +436,9 @@ impl Chip8 { } } else { for i in 0..=opcodes[1] { + //self.index_register += i as u16; self.ram[self.index_register as usize] = self.registers[i as usize]; - self.index_register += i as u16; + self.index_register += 1; } } }, @@ -431,6 +454,7 @@ impl Chip8 { } } else { for i in 0..=opcodes[1] { + //self.index_register += 1; self.registers[i as usize] = self.ram[self.index_register as usize]; self.index_register += 1; } @@ -491,7 +515,7 @@ fn main() { let test: u64 = 1; info!("{}", get_bit(test, 0)); - + let mut start = Instant::now(); event_loop.run(move |event, _, control_flow| { match event { Event::WindowEvent {event, ..} => match event { @@ -580,6 +604,9 @@ fn main() { error!("pixels.render"); *control_flow = ControlFlow::Exit; } + let duration = start.elapsed(); + info!("{:?}", duration); + start = Instant::now(); } _ => {} }