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,23 +294,28 @@ 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 => {
let x = self.registers[opcodes[1] as usize] % 64; if !self.display_wait {
let y = self.registers[opcodes[2] as usize] % 32; let x = self.registers[opcodes[1] as usize] % 64;
self.registers[0x0f] = 0; let y = self.registers[opcodes[2] as usize] % 32;
for n in 0..opcodes[3] { self.registers[0x0f] = 0;
let spritedata = self.ram[self.index_register as usize + n as usize]; for n in 0..opcodes[3] {
let mut checkdata: u8 = 0; let spritedata = self.ram[self.index_register as usize + n as usize];
for i in 0..8 { let mut checkdata: u8 = 0;
let bit = get_bit_u8(spritedata, i); for i in 0..8 {
checkdata += (bit as u8) << (7 - i); let bit = get_bit_u8(spritedata, i);
if (x+i <= 63) && (y+n <= 31) { checkdata += (bit as u8) << (7 - i);
if (get_bit(self.display[(y+n) as usize], (x+i)) && bit) { if (x+i <= 63) && (y+n <= 31) {
self.registers[0x0f] = 1; 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); //info!("{},{}", spritedata, checkdata);
}
self.display_wait = true;
} else {
self.pc -= 2;
} }
}, },
0x0e => { 0x0e => {
@ -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();
} }
_ => {} _ => {}
} }