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