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

@@ -6,6 +6,7 @@
<w>addhl</w> <w>addhl</w>
<w>addsp</w> <w>addsp</w>
<w>dechl</w> <w>dechl</w>
<w>gameboy</w>
<w>inchl</w> <w>inchl</w>
<w>incu</w> <w>incu</w>
<w>instrs</w> <w>instrs</w>

2
Cargo.lock generated
View File

@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "glob" name = "glob"

View File

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