RL instruction fix; Nintendo logo correct
This commit is contained in:
parent
b52347d5c7
commit
f10744b2a6
52
src/cpu.rs
52
src/cpu.rs
@ -106,15 +106,15 @@ impl CPU {
|
|||||||
let carry = self.flags & FLAG_C > 0;
|
let carry = self.flags & FLAG_C > 0;
|
||||||
if !carry {
|
if !carry {
|
||||||
// No carry before, now we got a carry => set it
|
// No carry before, now we got a carry => set it
|
||||||
if self.regs[REG_A] & 0x80 == 0x80 {
|
if val & 0x80 == 0x80 {
|
||||||
self.set_flag(FLAG_C);
|
self.set_flag(FLAG_C);
|
||||||
}
|
}
|
||||||
self.regs[REG_A] = val << 1;
|
self.set_8bit_reg(reg_id, val << 1);
|
||||||
} else {
|
} else {
|
||||||
if self.regs[REG_A] & 0x80 == 0 {
|
if val & 0x80 == 0 {
|
||||||
self.clear_flag(FLAG_C);
|
self.clear_flag(FLAG_C);
|
||||||
}
|
}
|
||||||
self.regs[REG_A] = val << 1 | 1;
|
self.set_8bit_reg(reg_id, val << 1 | 1);
|
||||||
}
|
}
|
||||||
self.clear_flag(FLAG_Z);
|
self.clear_flag(FLAG_Z);
|
||||||
self.clear_flag(FLAG_N);
|
self.clear_flag(FLAG_N);
|
||||||
@ -231,13 +231,12 @@ impl CPU {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_pair_value(&self, a: usize, b: usize) -> u16 {
|
fn get_pair_value(&self, a: usize, b: usize) -> u16 {
|
||||||
// TODO: use get_8bit_value / set_8bit_value
|
(self.get_8bit_reg(a) as u16) << 8 | self.get_8bit_reg(b) as u16
|
||||||
(self.regs[a] as u16) << 8 | (self.regs[b] as u16)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_pair_value(&mut self, a: usize, b: usize, value: u16) {
|
fn set_pair_value(&mut self, a: usize, b: usize, value: u16) {
|
||||||
self.regs[a] = (value >> 8) as u8;
|
self.set_8bit_reg(a, (value >> 8) as u8);
|
||||||
self.regs[b] = value as u8;
|
self.set_8bit_reg(b, value as u8);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dump_stack(&self) {
|
fn dump_stack(&self) {
|
||||||
@ -352,6 +351,16 @@ impl CPU {
|
|||||||
4
|
4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ld_dref_rr_a(&mut self, r1: usize, r2: usize) -> u8 {
|
||||||
|
if self.debug {
|
||||||
|
println!("LD ({}{}), A", REG_NAMES[r1], REG_NAMES[r2]);
|
||||||
|
}
|
||||||
|
let dst: u16 = self.get_pair_value(r1, r2);
|
||||||
|
let val: u8 = self.get_8bit_reg(REG_N_A);
|
||||||
|
self.interconnect.write_byte(dst, val);
|
||||||
|
8
|
||||||
|
}
|
||||||
|
|
||||||
fn set_flag(&mut self, flag: u8) {
|
fn set_flag(&mut self, flag: u8) {
|
||||||
self.flags |= flag;
|
self.flags |= flag;
|
||||||
}
|
}
|
||||||
@ -387,15 +396,7 @@ impl CPU {
|
|||||||
4
|
4
|
||||||
},
|
},
|
||||||
0x01 => self.ld_rr_vv(REG_N_B, REG_N_C),
|
0x01 => self.ld_rr_vv(REG_N_B, REG_N_C),
|
||||||
0x02 => {
|
0x02 => self.ld_dref_rr_a(REG_N_B, REG_N_C),
|
||||||
if self.debug {
|
|
||||||
println!("LD (BC),A");
|
|
||||||
}
|
|
||||||
let addr: u16 = self.get_pair_value(REG_B, REG_C);
|
|
||||||
let val: u8 = self.regs[REG_A];
|
|
||||||
self.interconnect.write_byte(addr, val);
|
|
||||||
8
|
|
||||||
},
|
|
||||||
0x04 => self.reg_inc(REG_N_B),
|
0x04 => self.reg_inc(REG_N_B),
|
||||||
0x05 => self.reg_dec(REG_N_B),
|
0x05 => self.reg_dec(REG_N_B),
|
||||||
0x06 => self.ld_r_v(REG_N_B),
|
0x06 => self.ld_r_v(REG_N_B),
|
||||||
@ -404,15 +405,7 @@ impl CPU {
|
|||||||
0x0D => self.reg_dec(REG_N_C),
|
0x0D => self.reg_dec(REG_N_C),
|
||||||
0x0E => self.ld_r_v(REG_N_C),
|
0x0E => self.ld_r_v(REG_N_C),
|
||||||
0x11 => self.ld_rr_vv(REG_N_D, REG_N_E),
|
0x11 => self.ld_rr_vv(REG_N_D, REG_N_E),
|
||||||
0x12 => {
|
0x12 => self.ld_dref_rr_a(REG_D, REG_E),
|
||||||
if self.debug {
|
|
||||||
println!("LD (DE),A");
|
|
||||||
}
|
|
||||||
let addr: u16 = self.get_pair_value(REG_D, REG_E);
|
|
||||||
let val: u8 = self.regs[REG_A];
|
|
||||||
self.interconnect.write_byte(addr, val);
|
|
||||||
12
|
|
||||||
},
|
|
||||||
0x13 => self.inc_rr(REG_D, REG_E),
|
0x13 => self.inc_rr(REG_D, REG_E),
|
||||||
0x14 => self.reg_inc(REG_N_D),
|
0x14 => self.reg_inc(REG_N_D),
|
||||||
0x15 => self.reg_dec(REG_N_D),
|
0x15 => self.reg_dec(REG_N_D),
|
||||||
@ -562,6 +555,13 @@ impl CPU {
|
|||||||
0x3C => self.reg_inc(REG_N_A),
|
0x3C => self.reg_inc(REG_N_A),
|
||||||
0x3D => self.reg_dec(REG_N_A),
|
0x3D => self.reg_dec(REG_N_A),
|
||||||
0x3E => self.ld_r_v(REG_N_A),
|
0x3E => self.ld_r_v(REG_N_A),
|
||||||
|
0x3F => {
|
||||||
|
if self.debug {
|
||||||
|
println!("CCF");
|
||||||
|
}
|
||||||
|
self.flags ^= FLAG_C;
|
||||||
|
4
|
||||||
|
}
|
||||||
|
|
||||||
// LDs
|
// LDs
|
||||||
0x40 ... 0x47 => self.ld_r_r(REG_N_B, (instruction - 0x40) as usize),
|
0x40 ... 0x47 => self.ld_r_r(REG_N_B, (instruction - 0x40) as usize),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user