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>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
2
Cargo.lock
generated
@@ -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"
|
||||||
|
|||||||
113
src/main.rs
113
src/main.rs
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user