public bool Evaluate(IConsoleRam ram, EvaluatorContext context)
        {
            if (Left == null)
            {
                return(false);
            }

            if (Right == null)
            {
                return(false);
            }

            var leftValue  = Left.GetValue(ram, context);
            var rightValue = Right.GetValue(ram, context);

            if (context.AddValue.HasValue)
            {
                leftValue        = context.AddValue.Value + leftValue;
                context.AddValue = null;
            }

            return(Operation switch
            {
                ConditionCompare.Equals => leftValue == rightValue,
                ConditionCompare.Greater => leftValue > rightValue,
                ConditionCompare.GreaterEquals => leftValue >= rightValue,
                ConditionCompare.Less => leftValue < rightValue,
                ConditionCompare.LessEquals => leftValue <= rightValue,
                ConditionCompare.NotEquals => leftValue != rightValue,
                _ => false
            });
        public override int GetValue(IConsoleRam ram, EvaluatorContext context)
        {
            var current = _child.GetValue(ram, context);
            var result  = _previousValue;

            _previousValue = current;
            return(result);
        }
        public override int GetValue(IConsoleRam ram, EvaluatorContext context)
        {
            var current = _child.GetValue(ram, context);

            if (_previousValue != current)
            {
                _priorValue = _previousValue;
            }

            _previousValue = current;

            return(_priorValue);
        }
 public override int GetValue(IConsoleRam ram, EvaluatorContext context)
 {
     return(_constValue);
 }
 public abstract int GetValue(IConsoleRam ram, EvaluatorContext context);
        public override int GetValue(IConsoleRam ram, EvaluatorContext context)
        {
            var effectiveAddress = Address;

            if (context.AddAddress.HasValue)
            {
                effectiveAddress  += context.AddAddress.Value;
                context.AddAddress = null;
            }

            switch (Kind)
            {
            case MemoryAddressKind.Bit0:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 0)) >> 0);
            }

            case MemoryAddressKind.Bit1:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 1)) >> 1);
            }

            case MemoryAddressKind.Bit2:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 2)) >> 2);
            }

            case MemoryAddressKind.Bit3:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 3)) >> 3);
            }

            case MemoryAddressKind.Bit4:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 4)) >> 4);
            }

            case MemoryAddressKind.Bit5:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 5)) >> 5);
            }

            case MemoryAddressKind.Bit6:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 6)) >> 6);
            }

            case MemoryAddressKind.Bit7:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & (1 << 7)) >> 7);
            }

            case MemoryAddressKind.Lower4:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return(value & 0x0F);
            }

            case MemoryAddressKind.Upper4:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return((value & 0xF0) >> 4);
            }

            case MemoryAddressKind.Int8:
            {
                return(ram.ReadInt8(effectiveAddress));
            }

            case MemoryAddressKind.Int16:
            {
                return(ram.ReadInt16(effectiveAddress));
            }

            case MemoryAddressKind.Int24:
            {
                return((int)ram.ReadUInt24(effectiveAddress));
            }

            case MemoryAddressKind.Int32:
            {
                return((int)ram.ReadUInt32(effectiveAddress));
            }

            case MemoryAddressKind.BitCount:
            {
                var value = ram.ReadInt8(effectiveAddress);
                return(BitOperations.PopCount(value));
            }

            default:
                break;
            }

            return(0);
        }