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()