private byte ShiftRightMsb(byte value) { var lo = value.AND(1); var hi = value.AND(128); var r = value.RS().OR(hi); // Keep MSB FC = lo == 1; FH = false; FN = false; FZ = r == 0; return(r); }
private byte Swap(byte value) { var hi = value.AND(_u4).LS(4); var lo = value.AND(240).RS(4); var r = hi.OR(lo); FC = false; FH = false; FN = false; FZ = r == 0; return(r); }
public override void Write(ushort address, byte value) { if (address <= 0x1FFF) { _enabled = value.AND(0x0A) == 0x0A; } else if (address >= 0x6000 && address <= 0x7FFF) { _ramEnabled = value == 0; } else if (_ramEnabled && address >= 0x4000 && address <= 0x5FFF) { _ramBankIndex = value.AND(0x03); } else { base.Read(address); } }
private byte ShiftLeft(byte value) { var hi = value.AND(128).RS(7); var r = value.LS(); FC = hi == 1; FH = false; FN = false; FZ = r == 0; return(r); }
private byte ShiftRight(byte value) { var lo = value.AND(1); var r = value.RS(); // Zero out MSB FC = lo == 1; FH = false; FN = false; FZ = r == 0; return(r); }
private byte RotateLeft(byte value, bool resetZ = false) { var hi = value.AND(128).RS(7); var r = value.LS().OR(FC); FC = hi == 1; FH = false; FN = false; FZ = resetZ ? false : r == 0; return(r); }
private byte RotateRight(byte value, bool resetZ = false) { var lo = value.AND(1); var r = value.RS().OR(FC.LS(7)); FC = lo == 1; FH = false; FN = false; FZ = resetZ ? false : r == 0; return(r); }
public override void Write(ushort address, byte value) { if (address >= 0x2000 && address <= 0x3FFF) { byte lowerFiveBits = value.AND(0x1F); _romBankIndex = _romBankIndex.AND(0xE0).OR(lowerFiveBits); } else if (address >= 0x4000 && address <= 0x5FFF) { byte upperTwoBits = value.AND(0x03); _romBankIndex = _romBankIndex.AND(0x1F).OR(upperTwoBits.LS(5)); } // Invalid bank indexes jump to the next index if (_romBankIndex == 0x00 || _romBankIndex == 0x20 || _romBankIndex == 0x40 || _romBankIndex == 0x60) { _romBankIndex++; } }
private byte RotateLeftC(byte value, bool resetFz = false) { var hi = value.AND(128).RS(7); var r = value.LS().OR(hi); FC = hi == 1; FH = false; FN = false; // Some instructions unconditionally reset FZ even if the result is 0 // This differs from the official docs, but several ref impl's confirm this behavior FZ = resetFz ? false : r == 0; return(r); }
private void GetBit(byte value, byte bitMask) { FH = true; FN = false; FZ = value.AND(bitMask) == 0; }