예제 #1
0
        protected uint ResolveLabel(CPUx86 cpu, SimOperand operand)
        {
            Debug.Assert(operand.IsLabel);

            uint address = (uint)cpu.GetSymbol(operand.Label).Address;

            if (operand.IsMemory)
            {
                return(Read(cpu, address, operand.Size));
            }
            else
            {
                return(address);
            }
        }
예제 #2
0
        protected void StoreFloatValue(CPUx86 cpu, SimOperand operand, FloatingValue value, int size)
        {
            Debug.Assert(!operand.IsImmediate);

            if (operand.IsRegister)
            {
                var newValue = ((operand.Register) as RegisterFloatingPoint).Value;
                switch (size)
                {
                case 128:
                    newValue = value;
                    break;

                case 64:
                    newValue.Low = value.Low;
                    break;

                case 32:
                    newValue.LowF = value.LowF;
                    break;
                }
                ((operand.Register) as RegisterFloatingPoint).Value = newValue;
            }

            if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                WriteFloat(cpu, address, value, size);
            }

            if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                WriteFloat(cpu, address, value, size);
            }
        }
예제 #3
0
        protected FloatingValue LoadFloatValue(CPUx86 cpu, SimOperand operand, int size)
        {
            if (operand.IsRegister)
            {
                return(((operand.Register) as RegisterFloatingPoint).Value);
            }

            if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                return(ReadFloat(cpu, address, size));
            }

            if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                return(ReadFloat(cpu, address, size));
            }

            throw new SimCPUException();
        }
예제 #4
0
        protected void StoreValue(CPUx86 cpu, SimOperand operand, uint value, int size)
        {
            Debug.Assert(!operand.IsImmediate);

            if (operand.IsRegister)
            {
                ((operand.Register) as Register32Bit).Value = value;
            }
            else if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                Write(cpu, address, value, size);

                return;
            }
            else if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                Write(cpu, address, value, size);
            }
        }
예제 #5
0
        protected FloatingValue LoadFloatValue(CPUx86 cpu, SimOperand operand, int size)
        {
            if (operand.IsRegister)
            {
                return ((operand.Register) as RegisterFloatingPoint).Value;
            }

            if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                return ReadFloat(cpu, address, size);
            }

            if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                return ReadFloat(cpu, address, size);
            }

            throw new SimCPUException();
        }
예제 #6
0
        protected void StoreValue(CPUx86 cpu, SimOperand operand, uint value, int size)
        {
            Debug.Assert(!operand.IsImmediate);

            if (operand.IsRegister)
            {
                ((operand.Register) as Register32Bit).Value = value;
            }
            else if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                Write(cpu, address, value, size);

                return;
            }
            else if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                Write(cpu, address, value, size);
            }
        }
예제 #7
0
        protected void StoreFloatValue(CPUx86 cpu, SimOperand operand, FloatingValue value, int size)
        {
            Debug.Assert(!operand.IsImmediate);

            if (operand.IsRegister)
            {
                var newValue = ((operand.Register) as RegisterFloatingPoint).Value;
                switch (size)
                {
                    case 128:
                        newValue = value;
                        break;

                    case 64:
                        newValue.Low = value.Low;
                        break;

                    case 32:
                        newValue.LowF = value.LowF;
                        break;
                }
                ((operand.Register) as RegisterFloatingPoint).Value = newValue;
            }

            if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                WriteFloat(cpu, address, value, size);
            }

            if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                WriteFloat(cpu, address, value, size);
            }
        }
예제 #8
0
        protected uint ResolveLabel(CPUx86 cpu, SimOperand operand)
        {
            Debug.Assert(operand.IsLabel);

            uint address = (uint)cpu.GetSymbol(operand.Label).Address;

            if (operand.IsMemory)
            {
                return Read(cpu, address, operand.Size);
            }
            else
            {
                return address;
            }
        }
예제 #9
0
        protected void StoreFloatValue(CPUx86 cpu, SimOperand operand, double value, int size)
        {
            Debug.Assert(!operand.IsImmediate);

            if (operand.IsRegister)
            {
                ((operand.Register) as RegisterFloatingPoint).Value = value;
            }

            if (operand.IsLabel)
            {
                uint address = (uint)cpu.GetSymbol(operand.Label).Address;

                WriteFloat(cpu, address, value, size);
            }

            if (operand.IsMemory)
            {
                uint address = GetAddress(cpu, operand);

                WriteFloat(cpu, address, value, size);
            }
        }