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 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();
}
_ => {}
}