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:
1 parent
e9a40bd9f7
commit
11f0bb06d6
3 files changed
+16
-100
No files matched your search
Generated
+1
@@ -6,6 +6,7 @@
|
||||
<w>addhl</w>
|
||||
<w>addsp</w>
|
||||
<w>dechl</w>
|
||||
<w>gameboy</w>
|
||||
<w>inchl</w>
|
||||
<w>incu</w>
|
||||
<w>instrs</w>
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
|
||||
+14
-99
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user