Move more logic to functions

This commit is contained in:
Kevin Hamacher 2016-05-26 20:51:23 +02:00
parent 0fdfa9ae63
commit 31117963e5

View File

@ -229,6 +229,15 @@ impl CPU {
}
}
fn pop_rr(&mut self, r1: usize, r2: usize) -> u8 {
if self.debug {
println!("POP {}{}", REG_NAMES[r1], REG_NAMES[r2]);
}
let val: u16 = self.interconnect.read_word(self.sp);
self.sp += 2;
self.set_pair_value(r1, r2, val);
12
}
fn push_rr(&mut self, r1: usize, r2: usize) -> u8 {
if self.debug {
println!("PUSH {}{}", REG_NAMES[r1], REG_NAMES[r2]);
@ -238,6 +247,16 @@ impl CPU {
16
}
fn inc_rr(&mut self, r1: usize, r2: usize) -> u8 {
if self.debug {
println!("INC {}{}", REG_NAMES[r1], REG_NAMES[r2]);
}
let v = self.get_pair_value(r1, r2);
let v = v.wrapping_add(1);
self.set_pair_value(r1, r2, v);
8
}
fn push(&mut self, val: u16) {
self.interconnect.write_word(self.sp - 2, val);
self.sp -= 2;
@ -256,12 +275,35 @@ impl CPU {
}
}
fn ld_r_v(&mut self, r: usize) -> u8 {
let val: u8 = self.load_args(1)[0];
if self.debug {
println!("LD {}, {:02X}", REG_NAMES[r], val);
}
self.set_8bit_reg(r, val);
if r == REG_N_HL {
12
} else {
8
}
}
fn ld_rr_vv(&mut self, r1: usize, r2: usize) -> u8 {
let val: u16 = to_u16(self.load_args(2));
if self.debug {
println!("LD {}{}, {:04X}", REG_NAMES[r1], REG_NAMES[r2], val);
}
self.set_pair_value(r1, r2, val);
12
}
fn reg_inc(&mut self, reg_id: usize) -> u8 {
if self.debug {
println!("INC {}", REG_NAMES[reg_id]);
}
self.regs[reg_id] = self.regs[reg_id].wrapping_add(1);
if self.regs[reg_id] == 0 {
let val = self.get_8bit_reg(reg_id).wrapping_add(1);
self.set_8bit_reg(reg_id, val);
if val == 0 {
self.flags |= FLAG_Z;
}
self.flags &= !FLAG_N;
@ -272,8 +314,9 @@ impl CPU {
if self.debug {
println!("DEC {}", REG_NAMES[reg_id]);
}
self.regs[reg_id] = self.regs[reg_id].wrapping_sub(1);
if self.regs[reg_id] == 0 {
let val = self.get_8bit_reg(reg_id).wrapping_sub(1);
self.set_8bit_reg(reg_id, val);
if val == 0 {
self.flags |= FLAG_Z;
} else {
self.flags &= !FLAG_Z;
@ -316,15 +359,7 @@ impl CPU {
}
4
},
0x01 => {
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);
12
},
0x01 => self.ld_rr_vv(REG_N_B, REG_N_C),
0x02 => {
if self.debug {
println!("LD (BC),A");
@ -334,35 +369,13 @@ impl CPU {
self.interconnect.write_byte(addr, val);
8
},
0x04 => self.reg_inc(REG_B),
0x05 => self.reg_dec(REG_B),
0x06 => {
let args = self.load_args(1);
if self.debug {
println!("LD B, {:02x}", args[0]);
}
self.regs[REG_B] = args[0];
8
},
0x0C => self.reg_inc(REG_C),
0x0D => self.reg_dec(REG_C),
0x0E => {
let args = self.load_args(1);
if self.debug {
println!("LD C, {:02x}", args[0]);
}
self.regs[REG_C] = args[0];
8
},
0x11 => {
let args = self.load_args(2);
let val = to_u16(args);
if self.debug {
println!("LD DE, {:04x}", val);
}
self.set_pair_value(REG_D, REG_E, val);
12
},
0x04 => self.reg_inc(REG_N_B),
0x05 => self.reg_dec(REG_N_B),
0x06 => self.ld_r_v(REG_N_B),
0x0C => self.reg_inc(REG_N_C),
0x0D => self.reg_dec(REG_N_C),
0x0E => self.ld_r_v(REG_N_C),
0x11 => self.ld_rr_vv(REG_N_D, REG_N_E),
0x12 => {
if self.debug {
println!("LD (DE),A");
@ -372,24 +385,10 @@ impl CPU {
self.interconnect.write_byte(addr, val);
12
},
0x13 => {
if self.debug {
println!("INC DE");
}
let old_value = self.get_pair_value(REG_D, REG_E);
self.set_pair_value(REG_D, REG_E, old_value + 1);
8
},
0x14 => self.reg_inc(REG_D),
0x15 => self.reg_dec(REG_D),
0x16 => {
let args = self.load_args(1);
if self.debug {
println!("LD D, {:02x}", args[0]);
}
self.regs[REG_D] = args[0];
8
},
0x13 => self.inc_rr(REG_D, REG_E),
0x14 => self.reg_inc(REG_N_D),
0x15 => self.reg_dec(REG_N_D),
0x16 => self.ld_r_v(REG_N_D),
0x17 => {
if self.debug {
println!("RLA");
@ -429,16 +428,9 @@ impl CPU {
self.regs[REG_A] = self.interconnect.read_byte(self.get_pair_value(REG_D, REG_E));
8
},
0x1C => self.reg_inc(REG_E),
0x1D => self.reg_dec(REG_E),
0x1E => {
let args = self.load_args(1);
if self.debug {
println!("LD E, {:02x}", args[0]);
}
self.regs[REG_E] = args[0];
8
},
0x1C => self.reg_inc(REG_N_E),
0x1D => self.reg_dec(REG_N_E),
0x1E => self.ld_r_v(REG_N_E),
0x20 => {
let args = self.load_args(1);
if self.debug {
@ -456,14 +448,7 @@ impl CPU {
8
}
}
0x21 => {
let value = to_u16(self.load_args(2));
if self.debug {
println!("LD HL, {:04x}", value);
}
self.set_pair_value(REG_H, REG_L, value);
12
},
0x21 => self.ld_rr_vv(REG_N_H, REG_N_L),
0x22 => {
if self.debug {
println!("LD (HL+), A");
@ -473,24 +458,10 @@ impl CPU {
self.set_pair_value(REG_H, REG_L, addr + 1);
8
},
0x23 => {
if self.debug {
println!("INC HL");
}
let old_value = self.get_pair_value(REG_H, REG_L);
self.set_pair_value(REG_H, REG_L, old_value + 1);
8
},
0x24 => self.reg_inc(REG_H),
0x25 => self.reg_dec(REG_H),
0x26 => {
let args = self.load_args(1);
if self.debug {
println!("LD H, {:02x}", args[0]);
}
self.regs[REG_H] = args[0];
8
},
0x23 => self.inc_rr(REG_H, REG_L),
0x24 => self.reg_inc(REG_N_H),
0x25 => self.reg_dec(REG_N_H),
0x26 => self.ld_r_v(REG_N_H),
0x28 => {
let args = self.load_args(1);
let target;
@ -517,21 +488,14 @@ impl CPU {
self.regs[REG_A] = self.interconnect.read_byte(addr);
8
},
0x2C => self.reg_inc(REG_L),
0x2D => self.reg_dec(REG_L),
0x2E => {
let args = self.load_args(1);
if self.debug {
println!("LD L, {:02x}", args[0]);
}
self.regs[REG_L] = args[0];
8
},
0x2C => self.reg_inc(REG_N_L),
0x2D => self.reg_dec(REG_N_L),
0x2E => self.ld_r_v(REG_N_L),
0x31 => {
let args = self.load_args(2);
self.sp = to_u16(args);
if self.debug {
println!("LD SP, {:02x}", self.sp);
println!("LD SP, {:04x}", self.sp);
}
12
},
@ -555,16 +519,9 @@ impl CPU {
self.interconnect.write_byte(addr, args[0]);
12
},
0x3C => self.reg_inc(REG_A),
0x3D => self.reg_dec(REG_A),
0x3E => {
let args = self.load_args(1);
if self.debug {
println!("LD A, {:02x}", args[0]);
}
self.regs[REG_A] = args[0];
8
},
0x3C => self.reg_inc(REG_N_A),
0x3D => self.reg_dec(REG_N_A),
0x3E => self.ld_r_v(REG_N_A),
// LDs
0x40 ... 0x47 => self.ld_r_r(REG_N_B, (instruction - 0x40) as usize),
@ -677,15 +634,7 @@ impl CPU {
}
4
},
0xC1 => {
if self.debug {
println!("POP BC");
}
let val: u16 = self.interconnect.read_word(self.sp);
self.sp += 2;
self.set_pair_value(REG_B, REG_C, val);
12
},
0xC1 => self.pop_rr(REG_B, REG_C),
0xC2 => {
let addr: u16 = to_u16(self.load_args(2));
if self.debug {