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
.idea/dictionaries/project.xml
generated
1
.idea/dictionaries/project.xml
generated
@@ -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>
|
||||
|
||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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"
|
||||
|
||||
113
src/main.rs
113
src/main.rs
@@ -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