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