Fixed issues found with 4-flags.ch8 and 5-quirks.ch8

This commit is contained in:
BayThylacine 2025-02-22 15:26:03 +11:00
parent bb57729492
commit 3775147c84

View File

@ -17,11 +17,12 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use std::sync::Arc; use std::sync::Arc;
use rand::prelude::*; use rand::prelude::*;
use tao::keyboard::Key; use tao::keyboard::Key;
use std::time::{Duration, Instant};
const MODERNSHIFT: bool = true; const MODERNSHIFT: bool = false;
const OLDJUMP: bool = true; const OLDJUMP: bool = true;
const MODERNLOADSAVE: bool = true; const MODERNLOADSAVE: bool = false;
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
struct Args { struct Args {
@ -44,6 +45,7 @@ struct Chip8 {
get_key_pause: bool, get_key_pause: bool,
keys_released: [bool; 16], keys_released: [bool; 16],
keys_pressed: [bool; 16], keys_pressed: [bool; 16],
display_wait: bool,
} }
impl Chip8 { impl Chip8 {
@ -62,6 +64,7 @@ impl Chip8 {
get_key_pause: false, get_key_pause: false,
keys_released: [false; 16], keys_released: [false; 16],
keys_pressed: [false; 16], keys_pressed: [false; 16],
display_wait: false,
} }
} }
@ -97,7 +100,8 @@ impl Chip8 {
pixel.copy_from_slice(&rgba); pixel.copy_from_slice(&rgba);
} }
info!("done"); self.display_wait = false;
//info!("done");
*self *self
} }
@ -193,59 +197,72 @@ impl Chip8 {
}, },
0x01 => { 0x01 => {
self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] | self.registers[opcodes[2] as usize]; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] | self.registers[opcodes[2] as usize];
self.registers[0x0f] = 0;
}, },
0x02 => { 0x02 => {
self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] & self.registers[opcodes[2] as usize]; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] & self.registers[opcodes[2] as usize];
self.registers[0x0f] = 0;
}, },
0x03 => { 0x03 => {
self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] ^ self.registers[opcodes[2] as usize]; self.registers[opcodes[1] as usize] = self.registers[opcodes[1] as usize] ^ self.registers[opcodes[2] as usize];
self.registers[0x0f] = 0;
}, },
0x04 => { 0x04 => {
let added_base = (self.registers[opcodes[1] as usize] as u16) + (self.registers[opcodes[2] as usize] as u16); 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 { if added_base > 255 {
self.registers[0x0f] = 1; self.registers[0x0f] = 1;
} else { } else {
self.registers[0x0f] = 0; self.registers[0x0f] = 0;
} }
self.registers[opcodes[1] as usize] = (added_base & 255) as u8;
}, },
0x05 => { 0x05 => {
//info!("{},{}", self.registers[opcodes[1] as usize], self.registers[opcodes[2] as usize]); let r1 = self.registers[opcodes[1] as usize];
let no_underflow = (self.registers[opcodes[1] as usize] >= self.registers[opcodes[2] as usize]); let r2 = self.registers[opcodes[2] as usize];
self.registers[0x0f] = no_underflow as u8; info!("{},{}", r1 , r2);
let no_underflow = (r1 >= r2);
if no_underflow { 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 { } 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 => { 0x06 => {
if MODERNSHIFT { 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[opcodes[1] as usize] = self.registers[opcodes[1] as usize] >> 1;
self.registers[0x0f] = t;
} else { } else {
self.registers[opcodes[1] as usize] = self.registers[opcodes[2] as usize]; 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[opcodes[1] as usize] = self.registers[opcodes[1] as usize] >> 1;
self.registers[0x0f] = t;
} }
}, },
0x07 => { 0x07 => {
let no_underflow = (self.registers[opcodes[2] as usize] >= self.registers[opcodes[1] as usize]); let r1 = self.registers[opcodes[1] as usize];
self.registers[0x0f] = no_underflow as u8; let r2 = self.registers[opcodes[2] as usize];
let no_underflow = (r2 >= r1);
//self.registers[0x0f] = no_underflow as u8;
if no_underflow { 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 { } 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 => { 0x0e => {
if MODERNSHIFT { 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[opcodes[1] as usize] = self.registers[opcodes[1] as usize] << 1;
self.registers[0x0f] = t;
} else { } else {
self.registers[opcodes[1] as usize] = self.registers[opcodes[2] as usize]; 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[opcodes[1] as usize] = self.registers[opcodes[1] as usize] << 1;
self.registers[0x0f] = t;
} }
}, },
_ => {error!("unknown opcode")} _ => {error!("unknown opcode")}
@ -277,6 +294,7 @@ impl Chip8 {
self.registers[opcodes[1] as usize] = random & (opcodes[2] << 4 | opcodes[3]); self.registers[opcodes[1] as usize] = random & (opcodes[2] << 4 | opcodes[3]);
}, },
0x0d => { 0x0d => {
if !self.display_wait {
let x = self.registers[opcodes[1] as usize] % 64; let x = self.registers[opcodes[1] as usize] % 64;
let y = self.registers[opcodes[2] as usize] % 32; let y = self.registers[opcodes[2] as usize] % 32;
self.registers[0x0f] = 0; self.registers[0x0f] = 0;
@ -295,6 +313,10 @@ impl Chip8 {
} }
//info!("{},{}", spritedata, checkdata); //info!("{},{}", spritedata, checkdata);
} }
self.display_wait = true;
} else {
self.pc -= 2;
}
}, },
0x0e => { 0x0e => {
match opcodes[2] { match opcodes[2] {
@ -414,8 +436,9 @@ impl Chip8 {
} }
} else { } else {
for i in 0..=opcodes[1] { 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.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 { } else {
for i in 0..=opcodes[1] { for i in 0..=opcodes[1] {
//self.index_register += 1;
self.registers[i as usize] = self.ram[self.index_register as usize]; self.registers[i as usize] = self.ram[self.index_register as usize];
self.index_register += 1; self.index_register += 1;
} }
@ -491,7 +515,7 @@ fn main() {
let test: u64 = 1; let test: u64 = 1;
info!("{}", get_bit(test, 0)); info!("{}", get_bit(test, 0));
let mut start = Instant::now();
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
match event { match event {
Event::WindowEvent {event, ..} => match event { Event::WindowEvent {event, ..} => match event {
@ -580,6 +604,9 @@ fn main() {
error!("pixels.render"); error!("pixels.render");
*control_flow = ControlFlow::Exit; *control_flow = ControlFlow::Exit;
} }
let duration = start.elapsed();
info!("{:?}", duration);
start = Instant::now();
} }
_ => {} _ => {}
} }