gb-emu/src/processor/instructions/instructions.rs

96 lines
2.7 KiB
Rust
Raw Normal View History

2023-02-01 20:04:05 +11:00
use crate::processor::{get_bit, Direction, Flags, Reg8, SplitRegister, CPU};
2023-01-31 10:05:36 +11:00
impl CPU {
2023-02-01 17:18:08 +11:00
pub(crate) fn add(&mut self, first: u8, second: u8) -> u8 {
self.add_u8s(first, second)
}
pub(crate) fn adc(&mut self, first: u8, second: u8) -> u8 {
2023-02-01 20:04:05 +11:00
let val = second + self.get_flag(Flags::Carry);
2023-02-01 17:18:08 +11:00
self.add_u8s(first, val)
}
pub(crate) fn sub(&mut self, first: u8, second: u8) -> u8 {
self.sub_u8s(first, second)
}
pub(crate) fn sbc(&mut self, first: u8, second: u8) -> u8 {
2023-02-01 20:04:05 +11:00
let val = second + self.get_flag(Flags::Carry);
2023-02-01 17:18:08 +11:00
self.sub_u8s(first, val)
}
2023-02-01 20:04:05 +11:00
pub(crate) fn inc(&mut self, reg: Reg8) {
let result = self.reg.get_8(reg).wrapping_add(0x1);
self.clear_flag(Flags::NSubtract);
self.set_or_clear_flag(Flags::Zero, result == 0x0);
self.set_or_clear_flag(
Flags::HalfCarry,
(((self.reg.get_8(reg) & 0xF).wrapping_add(0x1 & 0xF)) & 0x10) == 0x10,
);
self.reg.set_8(reg, result);
2023-02-01 17:18:08 +11:00
}
2023-02-01 20:04:05 +11:00
pub(crate) fn dec(&mut self, reg: Reg8) {
let result = self.reg.get_8(reg).wrapping_sub(0x1);
self.set_flag(Flags::NSubtract);
self.set_or_clear_flag(Flags::Zero, result == 0x0);
self.set_or_clear_flag(
Flags::HalfCarry,
(((self.reg.get_8(reg) & 0xF).wrapping_sub(0x1 & 0xF)) & 0x10) == 0x10,
);
self.reg.set_8(reg, result);
}
pub(crate) fn inc_pair(&mut self, val: u16) -> u16 {
val.wrapping_add(0x1)
}
pub(crate) fn dec_pair(&mut self, val: u16) -> u16 {
val.wrapping_sub(0x1)
2023-02-01 17:18:08 +11:00
}
2023-01-31 10:05:36 +11:00
pub(crate) fn rlc(&mut self, byte: u8) -> u8 {
2023-02-01 20:04:05 +11:00
self.rotate_with_carry(byte, Direction::Left)
2023-01-31 10:05:36 +11:00
}
pub(crate) fn rrc(&mut self, byte: u8) -> u8 {
2023-02-01 20:04:05 +11:00
self.rotate_with_carry(byte, Direction::Right)
2023-01-31 10:05:36 +11:00
}
pub(crate) fn rl(&mut self, byte: u8) -> u8 {
self.rotate(byte, Direction::Left)
}
pub(crate) fn rr(&mut self, byte: u8) -> u8 {
self.rotate(byte, Direction::Right)
}
pub(crate) fn sla(&mut self, byte: u8) -> u8 {
self.shift(byte, Direction::Left)
}
pub(crate) fn sra(&mut self, byte: u8) -> u8 {
let b = get_bit(byte, 7);
let val = self.shift(byte, Direction::Right);
if b {
val + 0b10000000
} else {
val
}
}
pub(crate) fn srl(&mut self, byte: u8) -> u8 {
self.shift(byte, Direction::Right)
}
2023-02-01 17:18:08 +11:00
pub(crate) fn rst(&mut self, address: u8) {
self.push(self.reg.pc);
self.reg.pc.set_high(0x0);
self.reg.pc.set_low(address);
2023-01-31 10:05:36 +11:00
}
2023-02-01 20:04:05 +11:00
pub(crate) fn jr(&mut self, jump: i8) {
self.reg.pc = self.reg.pc.wrapping_add_signed(jump.into());
}
2023-01-31 10:05:36 +11:00
}