#if 1 'def Emu86_EnableFPU
type FpuCtl
  union
    as u16 w
    type
      bMasks    :6 as u16 'exception masks Precision,Underflow,Overflow,Zero Divide,Denormal Operand,Invalid Operation
      bZ2       :2 as u16 'unused
      bPrecision:2 as u16 'Precision control (nearest,down,up,fix)
      bRounding :2 as u16 'Rounding control
      bInfinity :1 as u16 'Infinity control
      bZ3       :3 as u16 'unused
    end type
  end union
end type
type FpuSts
  union
    as u16 w
    type
      bInvalid  :1 as u16
      bDenormal :1 as u16
      bDivZero  :1 as u16
      bOverflow :1 as u16
      bUnderflow:1 as u16
      bPrecision:1 as u16
      bStkFault :1 as u16
      bErrSumSta:1 as u16
      bCode0    :1 as u16 'C
      bCode1    :1 as u16 '1
      bCode2    :1 as u16 'P
      wTop      :3 as u16 
      bCode3    :1 as u16 'Z
      FpuBusy   :1 as u16
    end type      
  end union
end type
#endif
type OpcodeFlags
  union
    dw as ubyte
    type
      bSize16 :1 as ulong
      bAddr16 :1 as ulong
      bLock   :1 as ulong
      bRep    :1 as ulong
      bRepNE  :1 as ulong
    end type
  end union
end type
type ThreadStruct
  as long ID  
  as double dWakeTime
  as any ptr pStack
  as long iStackSz, iDoSleep
  as ulongint llCycles
  as ulong iReturnValue
end type
type FlagsStruct
  union
    dw as ulong
    type
      CF:1 as ulong 'carry flag
      _1:1 as ulong 'always 1
      PF:1 as ulong 'parity flag
      _0:1 as ulong 'always 0
      AF:1 as ulong 'auxiliar flag      
      _O:1 as ulong 'always 0
      ZF:1 as ulong 'zero flag
      SF:1 as ulong 'sign flag
      TF:1 as ulong 'trap flag
      _I:1 as ulong 'interrupt flag
      DF:1 as ulong 'direction flag
      OF:1 as ulong 'overflow flag
      _x:8 as ulong 'IOPL/NT/MD/RF/VM/AC/VIF/VIP
      ID:1 as ulong 'auble to use CPUID
    end type    
  end union
end type

#ifdef Emu86_EnableMMX
type StructMMX
  union
    as u64 q      'qword
    as s64 ll     'long long
    as u32 d(3)   'dword
    as s32 i(3)   'integer
    as u16 w(7)   'word
    as s16 s(7)   'short
    as u8  c(15)  'char
    as s8  b(15)  'byte
  end union
end type
#endif

#ifdef Emu86_AutoDebug
type Emu86Context
  as u32 rEAX,rECX,rEDX,rEBX
  as u32 rESP,rEBP,rESI,rEDI
  as FlagsStruct uFlags
end type
#endif

#define _N &hCC884422
type CpuStruct
  as u32 rEAX=_N,rECX=_N,rEDX=_N,rEBX=_N
  as u32 rESP=_N,rEBP=_N,rESI=_N,rEDI =_N
  as ubyte ptr pEIP
  'as FlagsStruct tFlags  
  as OpcodeFlags tOpFlags
  as byte   Carry , Parity , Direction , bStop
  as u32    xF_Result  '(other flags) result of last operation (lazy flags)
  as u32    xF_2ndNum  'second number for the operation
  as u32    xF_Number  '(other flags) original number of last operation (lazy flags)
  as ThreadStruct tThread
  #ifdef Emu86_EnableFPU
    as FpuCtl FpuC
    as FpuSts tSTS
  #endif
  #if defined(Emu86_EnableFPU) orelse defined(Emu86_EnableMMX)
    union
      #ifdef Emu86_EnableFPU
        as double dST(7)  
      #endif
      #ifdef Emu86_EnableMMX
        as u64 qMM(7)
        as StructMMX tMM(7)
      #endif
    end union
  #endif  
  #ifdef Emu86_AutoDebug
    tCtx as Emu86Context
  #endif
end type
#undef _N