Refactor asl

This commit is contained in:
2022-11-21 18:45:09 -05:00
parent 7a17cb4038
commit 686069dd03
3 changed files with 16 additions and 19 deletions
+2 -2
View File
@@ -124,13 +124,13 @@ impl CPU {
}
};
if self.registers.is_16bit_mode() {
let (result, is_negative, is_zero, is_carry) = alu::asl16bit(target);
let (result, is_negative, is_zero, is_carry) = alu::asl(target);
self.registers.a = result;
self.registers.set_negative_flag(is_negative);
self.registers.set_zero_flag(is_zero);
self.registers.set_carry_flag(is_carry);
} else {
let (result, is_negative, is_zero, is_carry) = alu::asl8bit(target as u8);
let (result, is_negative, is_zero, is_carry) = alu::asl(target as u8);
self.registers.set_low_a(result);
self.registers.set_negative_flag(is_negative);
self.registers.set_zero_flag(is_zero);
+9 -17
View File
@@ -112,19 +112,11 @@ pub fn and<T: SnesNum>(target: T, value: T) -> (T, bool, bool) {
(result, is_negative, is_zero)
}
pub fn asl8bit(target: u8) -> (u8, bool, bool, bool) {
let result = target << 1;
let is_negative = (result >> 7) == 1;
let is_zero = result == 0;
let is_carry = (target >> 7) == 1;
(result, is_negative, is_zero, is_carry)
}
pub fn asl16bit(target: u16) -> (u16, bool, bool, bool) {
let result = target << 1;
let is_negative = (result >> 15) == 1;
let is_zero = result == 0;
let is_carry = (target >> 15) == 1;
pub fn asl<T: SnesNum>(target: T) -> (T, bool, bool, bool) {
let result = target.asl();
let is_negative = result.is_negative();
let is_zero = result.is_zero();
let is_carry = target.is_negative();
(result, is_negative, is_zero, is_carry)
}
@@ -388,12 +380,12 @@ mod alu_tests {
#[test]
fn test_asl8bit() {
let (result, is_negative, is_zero, is_carry) = asl8bit(0b0101_0101);
let (result, is_negative, is_zero, is_carry) = asl(0b0101_0101_u8);
assert_eq!(result, 0b1010_1010);
assert_eq!(is_negative, true);
assert_eq!(is_zero, false);
assert_eq!(is_carry, false);
let (result, is_negative, is_zero, is_carry) = asl8bit(0b1000_0000);
let (result, is_negative, is_zero, is_carry) = asl(0b1000_0000_u8);
assert_eq!(result, 0b0000_0000);
assert_eq!(is_negative, false);
assert_eq!(is_zero, true);
@@ -402,12 +394,12 @@ mod alu_tests {
#[test]
fn test_asl16bit() {
let (result, is_negative, is_zero, is_carry) = asl16bit(0b01000000_00000000);
let (result, is_negative, is_zero, is_carry) = asl(0b01000000_00000000_u16);
assert_eq!(result, 0b10000000_00000000);
assert_eq!(is_negative, true);
assert_eq!(is_zero, false);
assert_eq!(is_carry, false);
let (result, is_negative, is_zero, is_carry) = asl16bit(0b10000000_00000000);
let (result, is_negative, is_zero, is_carry) = asl(0b10000000_00000000_u16);
assert_eq!(result, 0b00000000_00000000);
assert_eq!(is_negative, false);
assert_eq!(is_zero, true);
+5
View File
@@ -4,6 +4,7 @@ pub trait SnesNum: Copy + Clone + Sized + Eq + PartialEq {
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 asl(&self) -> Self;
fn is_negative(&self) -> bool;
fn is_zero(&self) -> bool;
}
@@ -43,6 +44,10 @@ macro_rules! define_impl {
(* self) & v
}
fn asl(&self) -> $t {
(* self) << 1
}
fn is_negative(&self) -> bool {
(*self) & !(<$t>::MAX >> 1) != 0
}