Fixed issues found with 4-flags.ch8 and 5-quirks.ch8
This commit is contained in:
parent
bb57729492
commit
3775147c84
65
src/main.rs
65
src/main.rs
|
@ -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();
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user