diff --git a/Z80/src/Z80.cpp b/Z80/src/Z80.cpp index ce61783..8cc84d6 100644 --- a/Z80/src/Z80.cpp +++ b/Z80/src/Z80.cpp @@ -436,7 +436,7 @@ void EightBit::Z80::bit(const int n, const uint8_t operand) { ASSUME(n <= 7); setFlag(F(), HC); clearFlag(F(), NF); - const auto discarded = operand & (1 << n); + const auto discarded = operand & Chip::bit(n); adjustSZ(F(), discarded); clearFlag(F(), PF, discarded); } @@ -444,13 +444,13 @@ void EightBit::Z80::bit(const int n, const uint8_t operand) { uint8_t EightBit::Z80::res(const int n, const uint8_t operand) { ASSUME(n >= 0); ASSUME(n <= 7); - return operand & ~(1 << n); + return operand & ~Chip::bit(n); } uint8_t EightBit::Z80::set(const int n, const uint8_t operand) { ASSUME(n >= 0); ASSUME(n <= 7); - return operand | (1 << n); + return operand | Chip::bit(n); } void EightBit::Z80::neg() { diff --git a/inc/Chip.h b/inc/Chip.h index 9ee250d..db4d956 100644 --- a/inc/Chip.h +++ b/inc/Chip.h @@ -45,6 +45,8 @@ namespace EightBit { Mask16 = Bit16 - 1 }; + static constexpr uint8_t bit(const int which) noexcept { return 1 << which; } + static void clearFlag(uint8_t& f, const int flag) noexcept { f &= ~flag; } static void setFlag(uint8_t& f, const int flag) noexcept { f |= flag; } diff --git a/src/Processor.cpp b/src/Processor.cpp index 362fc08..951e587 100644 --- a/src/Processor.cpp +++ b/src/Processor.cpp @@ -53,8 +53,8 @@ int EightBit::Processor::execute(const uint8_t value) { // http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend int8_t EightBit::Processor::signExtend(const int b, uint8_t x) { - const uint8_t m = 1 << (b - 1); // mask can be pre-computed if b is fixed - x = x & ((1 << b) - 1); // (Skip this if bits in x above position b are already zero.) + const uint8_t m = bit(b - 1); // mask can be pre-computed if b is fixed + x = x & (bit(b) - 1); // (Skip this if bits in x above position b are already zero.) const auto result = (x ^ m) - m; return result; }