Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 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);
     }
 }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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++;
            }
        }
Пример #9
0
        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);
        }
Пример #10
0
 private void GetBit(byte value, byte bitMask)
 {
     FH = true;
     FN = false;
     FZ = value.AND(bitMask) == 0;
 }