Refactor and

This commit is contained in:
2022-11-21 18:34:05 -05:00
parent 992112229e
commit 7a17cb4038
3 changed files with 23 additions and 15 deletions
+2 -2
View File
@@ -98,13 +98,13 @@ impl CPU {
let target = self.registers.a;
if self.registers.is_16bit_mode() {
let value = self.get_16bit_from_address(bus, addressing_mode);
let (result, is_negative, is_zero) = alu::and16bit(target, value);
let (result, is_negative, is_zero) = alu::and(target, value);
self.registers.a = result;
self.registers.set_negative_flag(is_negative);
self.registers.set_zero_flag(is_zero);
} else {
let value = self.get_8bit_from_address(bus, addressing_mode);
let (result, is_negative, is_zero) = alu::and8bit(target as u8, value);
let (result, is_negative, is_zero) = alu::and(target as u8, value);
self.registers.set_low_a(result);
self.registers.set_negative_flag(is_negative);
self.registers.set_zero_flag(is_zero);
+16 -13
View File
@@ -105,17 +105,10 @@ pub fn sbc16bcd(target: u16, value: u16, carry: bool) -> (u16, bool, bool, bool)
(result, is_carry, is_negative, is_zero)
}
pub fn and8bit(target: u8, value: u8) -> (u8, bool, bool) {
let result = target & value;
let is_negative = (result >> 7) == 1;
let is_zero = result == 0;
(result, is_negative, is_zero)
}
pub fn and16bit(target: u16, value: u16) -> (u16, bool, bool) {
let result = target & value;
let is_negative = (result >> 15) == 1;
let is_zero = result == 0;
pub fn and<T: SnesNum>(target: T, value: T) -> (T, bool, bool) {
let result = target.and(value);
let is_negative = result.is_negative();
let is_zero = result.is_zero();
(result, is_negative, is_zero)
}
@@ -369,18 +362,28 @@ mod alu_tests {
#[test]
fn test_and8bit() {
let (result, is_negative, is_zero) = and8bit(0b0101_0101, 0b0101_0101);
let (result, is_negative, is_zero) = and(0b0101_0101_u8, 0b0101_0101_u8);
assert_eq!(result, 0b0101_0101);
assert_eq!(is_negative, false);
assert_eq!(is_zero, false);
let (result, is_negative, is_zero) = and(0b0101_0101_u8, 0b1010_1010_u8);
assert_eq!(result, 0x00);
assert_eq!(is_negative, false);
assert_eq!(is_zero, true);
}
#[test]
fn test_and16bit() {
let (result, is_negative, is_zero) = and16bit(0b01010101_01010101, 0b01010101_01010101);
let (result, is_negative, is_zero) = and(0b01010101_01010101_u16, 0b01010101_01010101_u16);
assert_eq!(result, 0b01010101_01010101);
assert_eq!(is_negative, false);
assert_eq!(is_zero, false);
let (result, is_negative, is_zero) = and(0b01010101_01010101_u16, 0b10101010_10101010_u16);
assert_eq!(result, 0x0000);
assert_eq!(is_negative, false);
assert_eq!(is_zero, true);
}
#[test]
+5
View File
@@ -3,6 +3,7 @@ pub trait SnesNum: Copy + Clone + Sized + Eq + PartialEq {
fn sub_will_carry(&self, v: Self, carry: bool) -> bool;
fn add_snes(&self, v: Self, carry: bool) -> Self;
fn sub_snes(&self, v: Self, carry: bool) -> Self;
fn and(&self, v: Self) -> Self;
fn is_negative(&self) -> bool;
fn is_zero(&self) -> bool;
}
@@ -38,6 +39,10 @@ macro_rules! define_impl {
define_operation!($t, add_snes, wrapping_add);
define_operation!($t, sub_snes, wrapping_sub);
fn and(&self, v: $t) -> $t {
(* self) & v
}
fn is_negative(&self) -> bool {
(*self) & !(<$t>::MAX >> 1) != 0
}