Refactor CPU instruction set and cleanup unused code

Removed unused instructions (CopyHN16A, CopyHCA, etc.), simplified PC increment logic, and cleaned up test and execution code. Updated dictionaries and Cargo.lock to reflect recent changes in project structure and dependencies.
This commit is contained in:
2025-05-14 08:59:12 +01:00
parent e9a40bd9f7
commit 11f0bb06d6
3 changed files with 16 additions and 100 deletions

View File

@@ -288,12 +288,8 @@ enum LoadTarget{
CopyR8HL(TargetRegister),
CopyR16A(TargetU16Register),
CopyN16A(u16),
CopyHN16A(u16),
CopyHCA,
CopyAR16(TargetU16Register),
CopyAN16(u16),
CopyHAN16(u16),
CopyHAC,
CopyHLIA,
CopyHLDA,
CopyAHLD,
@@ -1044,9 +1040,12 @@ impl CPU {
}
}
fn execute_next_instruction(&mut self) {
// if self.pc >= 0x100 {
// println!("Boot Complete");
// }
if self.pc == 0xC {
println!("clear vram Complete");
}
if self.pc == 0x34 {
println!("decompress finish");
}
let inst = self.next_instruction();
println!("{:x} {:?} {:?}", self.pc, inst, self.registers.f);
@@ -1200,10 +1199,7 @@ impl CPU {
self.registers.f.subtract = true;
let (_, half_carry) = (value & 0xF).overflowing_sub(1);
self.registers.f.half_carry = half_carry;
self.pc = match target {
Target::Immediate(_) => {self.pc.wrapping_add(2)}
_ => {self.pc.wrapping_add(1)}
};
self.pc = self.pc.wrapping_add(1);
}
Instruction::DECU16(register) => {
let value = self.get_u16_reg_value(register);
@@ -1318,17 +1314,6 @@ impl CPU {
_ => {self.pc.wrapping_add(1)}
};
}
LoadTarget::CopyHN16A(address) => {
if address >= 0xFF00 {
self.bus.write_byte(address, self.registers.a)
}
self.pc += 2;
}
LoadTarget::CopyHCA => {
let address = 0xFF00 + self.registers.c as u16;
self.bus.write_byte(address, self.registers.a);
self.pc += 1;
}
LoadTarget::CopyAR16(source_register) => {
let address = self.get_u16_reg_value(source_register);
self.registers.a = self.bus.read_byte(address);
@@ -1338,16 +1323,6 @@ impl CPU {
self.registers.a = self.bus.read_byte(address);
self.pc += 3;
}
LoadTarget::CopyHAN16(address) => {
if address >= 0xFF00 {
self.registers.a = self.bus.read_byte(address);
}
self.pc += 2;
}
LoadTarget::CopyHAC => {
self.registers.a = self.bus.read_byte(0xFF00+self.registers.c as u16);
self.pc += 1;
}
LoadTarget::CopyHLIA => {
let address = self.registers.get_hl();
self.bus.write_byte(address, self.registers.a);
@@ -1619,82 +1594,22 @@ impl CPU {
fn main() {
/*
{
"name": "0A 0000",
"initial": {
"pc": 16826,
"sp": 9383,
"a": 64,
"b": 95,
"c": 205,
"d": 147,
"e": 168,
"f": 64,
"h": 98,
"l": 251,
"ime": 0,
"ie": 0,
"ram": [
[
16826,
10
],
[
24525,
204
]
]
},
"final": {
"a": 204,
"b": 95,
"c": 205,
"d": 147,
"e": 168,
"f": 64,
"h": 98,
"l": 251,
"pc": 16827,
"sp": 9383,
"ime": 0,
"ram": [
[
16826,
10
],
[
24525,
204
]
]
},
"cycles": [
[
16826,
10,
"r-m"
],
[
24525,
204,
"r-m"
]
]
// run_instruction_tests()
run_gameboy()
}
*/
fn run_instruction_tests() {
for entry in glob("sm83/v1/*.json").unwrap() {
println!("{:?}", entry);
let json_file = std::fs::read(entry.unwrap()).unwrap();
let tests: Value = serde_json::from_slice(json_file.as_slice()).unwrap();
for test in tests.as_array().unwrap() {
println!("{}", test["name"]);
// println!("{}", test["name"]);
let mut gameboy = CPU::load_test(&test["initial"]);
gameboy.execute_next_instruction();
gameboy.compare_state(&test["final"]);
}
}
}
fn run_gameboy() {
let boot_rom = std::fs::read("boot/dmg.bin").unwrap();
@@ -1718,7 +1633,7 @@ fn run_gameboy() {
let mut count =0;
loop {
count += 1;
if count % 1000 == 0 {
if count % 1_000_000 == 0 {
println!("PC: {:04X}, {count}", gameboy.pc);
}
gameboy.execute_next_instruction()