From 11f0bb06d6574c1d4a14cf56ee51c9f994552401 Mon Sep 17 00:00:00 2001 From: Ajurna Date: Wed, 14 May 2025 08:59:12 +0100 Subject: [PATCH] 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. --- .idea/dictionaries/project.xml | 1 + Cargo.lock | 2 +- src/main.rs | 113 ++++----------------------------- 3 files changed, 16 insertions(+), 100 deletions(-) diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml index 0b5b1a9..1f4b5cc 100644 --- a/.idea/dictionaries/project.xml +++ b/.idea/dictionaries/project.xml @@ -6,6 +6,7 @@ addhl addsp dechl + gameboy inchl incu instrs diff --git a/Cargo.lock b/Cargo.lock index 336c839..2a2a698 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/src/main.rs b/src/main.rs index 01c96a7..74c69c1 100644 --- a/src/main.rs +++ b/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()