RL instruction fix; Nintendo logo correct

This commit is contained in:
Kevin Hamacher 2016-05-28 10:18:12 +02:00
parent b52347d5c7
commit f10744b2a6

View File

@ -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),