示例#1
0
        public static void StoreBCD(VirtualMachine vm, Real10 src)
        {
            long value = 0;

            unsafe
            {
                byte *bcd = (byte *)&src;

                long power = 1;

                for (int i = 0; i < 9; i++)
                {
                    int b = bcd[i];
                    value += (b & 0xF) * power;

                    power *= 10;
                    value += (b >> 4) * power;

                    power *= 10;
                }

                if (bcd[9] == 0x80)
                {
                    value *= -1;
                }
            }

            vm.Processor.FPU.Push(value);
        }
示例#2
0
        public static void StoreBCD(VirtualMachine vm, out Real10 value)
        {
            var    fpu         = vm.Processor.FPU;
            double st0         = fpu.Round(fpu.ST0);
            long   sourceValue = Math.Abs((long)st0);

            unsafe
            {
                byte *buffer = stackalloc byte[10];
                long  power  = 1;

                for (int i = 0; i < 9; i++)
                {
                    int digit = (int)((sourceValue / power) % 10);
                    buffer[i] = (byte)digit;

                    power     *= 10;
                    digit      = (int)((sourceValue / power) % 10);
                    buffer[i] |= (byte)(digit << 4);

                    power *= 10;
                }

                if (st0 < 0)
                {
                    buffer[9] = 0x80;
                }
                else
                {
                    buffer[9] = 0;
                }

                value = *(Real10 *)buffer;
            }

            fpu.Pop();
        }
示例#3
0
文件: Fld.cs 项目: gregdivis/Aeon
 public static void LoadReal80(Processor p, Real10 value)
 {
     p.FPU.Push((double)value);
 }
示例#4
0
 public static void StoreRealPop80(Processor p, out Real10 value)
 {
     value = p.FPU.ST0_Ref;
     p.FPU.Pop();
 }