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); }
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(); }
public static void LoadReal80(Processor p, Real10 value) { p.FPU.Push((double)value); }
public static void StoreRealPop80(Processor p, out Real10 value) { value = p.FPU.ST0_Ref; p.FPU.Pop(); }