OSDN Git Service

[VM][LIBCPU_i386] Update definitions.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 3 Feb 2017 18:32:46 +0000 (03:32 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 3 Feb 2017 18:32:46 +0000 (03:32 +0900)
source/src/vm/i386.cpp
source/src/vm/i386_base.cpp
source/src/vm/libcpu_i386/i386_base_ext.cpp
source/src/vm/libcpu_i386/i386_opdef.cpp
source/src/vm/libcpu_i386/i386_opdef.h
source/src/vm/libcpu_i386/i386_real.cpp
source/src/vm/libcpu_i386/i386op16.cpp
source/src/vm/libcpu_i386/i386op16_real.cpp [new file with mode: 0644]
source/src/vm/libcpu_i386/i386ops.cpp
source/src/vm/libcpu_i386/i386priv.h

index 1dd3125..2dc2a9e 100644 (file)
@@ -2,7 +2,8 @@
 
 #include "vm.h"
 #include "../emu.h"
-#include "i386.h"
+#include "./i386.h"
+#include "./libcpu_i386/i386opdef_real.h"
 #ifdef USE_DEBUGGER
 #include "debugger.h"
 #endif
        #define CPU_MODEL pentium4
 #endif
 
-#ifndef INLINE
-#define INLINE inline
-#endif
-
-#define U64(v) UINT64(v)
-
-#define fatalerror(...) exit(1)
-#define logerror(...)
-#define popmessage(...)
-
-/*****************************************************************************/
-/* src/emu/devcpu.h */
-
-// CPU interface functions
-#define CPU_INIT_NAME(name)                    cpu_init_##name
-#define CPU_INIT(name)                         void* CPU_INIT_NAME(name)()
-#define CPU_INIT_CALL(name)                    CPU_INIT_NAME(name)()
-
-#define CPU_RESET_NAME(name)                   cpu_reset_##name
-#define CPU_RESET(name)                                void CPU_RESET_NAME(name)(i386_state *cpustate)
-#define CPU_RESET_CALL(name)                   CPU_RESET_NAME(name)(cpustate)
-
-#define CPU_EXECUTE_NAME(name)                 cpu_execute_##name
-#define CPU_EXECUTE(name)                      int CPU_EXECUTE_NAME(name)(i386_state *cpustate, int cycles)
-#define CPU_EXECUTE_CALL(name)                 CPU_EXECUTE_NAME(name)(cpustate, cycles)
-
-#define CPU_TRANSLATE_NAME(name)               cpu_translate_##name
-#define CPU_TRANSLATE(name)                    int CPU_TRANSLATE_NAME(name)(void *cpudevice, address_spacenum space, int intention, offs_t *address)
-#define CPU_TRANSLATE_CALL(name)               CPU_TRANSLATE_NAME(name)(cpudevice, space, intention, address)
-
-#define CPU_DISASSEMBLE_NAME(name)             cpu_disassemble_##name
-#define CPU_DISASSEMBLE(name)                  int CPU_DISASSEMBLE_NAME(name)(_TCHAR *buffer, offs_t eip, const UINT8 *oprom)
-#define CPU_DISASSEMBLE_CALL(name)             CPU_DISASSEMBLE_NAME(name)(buffer, eip, oprom)
-
-/*****************************************************************************/
-/* src/emu/didisasm.h */
-
-// Disassembler constants
-const UINT32 DASMFLAG_SUPPORTED     = 0x80000000;   // are disassembly flags supported?
-const UINT32 DASMFLAG_STEP_OUT      = 0x40000000;   // this instruction should be the end of a step out sequence
-const UINT32 DASMFLAG_STEP_OVER     = 0x20000000;   // this instruction should be stepped over by setting a breakpoint afterwards
-const UINT32 DASMFLAG_OVERINSTMASK  = 0x18000000;   // number of extra instructions to skip when stepping over
-const UINT32 DASMFLAG_OVERINSTSHIFT = 27;           // bits to shift after masking to get the value
-const UINT32 DASMFLAG_LENGTHMASK    = 0x0000ffff;   // the low 16-bits contain the actual length
-
-/*****************************************************************************/
-/* src/emu/diexec.h */
-
-// I/O line states
-enum line_state
-{
-       CLEAR_LINE = 0,                         // clear (a fired or held) line
-       ASSERT_LINE,                            // assert an interrupt immediately
-       HOLD_LINE,                              // hold interrupt line until acknowledged
-       PULSE_LINE                              // pulse interrupt line instantaneously (only for NMI, RESET)
-};
-
-enum
-{
-       INPUT_LINE_IRQ = 0,
-       INPUT_LINE_NMI
-};
-
-/*****************************************************************************/
-/* src/emu/dimemory.h */
-
-// Translation intentions
-const int TRANSLATE_TYPE_MASK       = 0x03;     // read write or fetch
-const int TRANSLATE_USER_MASK       = 0x04;     // user mode or fully privileged
-const int TRANSLATE_DEBUG_MASK      = 0x08;     // debug mode (no side effects)
-
-const int TRANSLATE_READ            = 0;        // translate for read
-const int TRANSLATE_WRITE           = 1;        // translate for write
-const int TRANSLATE_FETCH           = 2;        // translate for instruction fetch
-const int TRANSLATE_READ_USER       = (TRANSLATE_READ | TRANSLATE_USER_MASK);
-const int TRANSLATE_WRITE_USER      = (TRANSLATE_WRITE | TRANSLATE_USER_MASK);
-const int TRANSLATE_FETCH_USER      = (TRANSLATE_FETCH | TRANSLATE_USER_MASK);
-const int TRANSLATE_READ_DEBUG      = (TRANSLATE_READ | TRANSLATE_DEBUG_MASK);
-const int TRANSLATE_WRITE_DEBUG     = (TRANSLATE_WRITE | TRANSLATE_DEBUG_MASK);
-const int TRANSLATE_FETCH_DEBUG     = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK);
-
-/*****************************************************************************/
-/* src/emu/emucore.h */
-
-// constants for expression endianness
-enum endianness_t
-{
-       ENDIANNESS_LITTLE,
-       ENDIANNESS_BIG
-};
-
-// declare native endianness to be one or the other
-#ifdef LSB_FIRST
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_LITTLE;
-#else
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG;
-#endif
-// endian-based value: first value is if 'endian' is little-endian, second is if 'endian' is big-endian
-#define ENDIAN_VALUE_LE_BE(endian,leval,beval) (((endian) == ENDIANNESS_LITTLE) ? (leval) : (beval))
-// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian
-#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ENDIAN_VALUE_LE_BE(ENDIANNESS_NATIVE, leval, beval)
-// endian-based value: first value is if 'endian' matches native, second is if 'endian' doesn't match native
-#define ENDIAN_VALUE_NE_NNE(endian,leval,beval)        (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval))
-
-/*****************************************************************************/
-/* src/emu/memory.h */
-
-// address spaces
-enum address_spacenum
-{
-       AS_0,                           // first address space
-       AS_1,                           // second address space
-       AS_2,                           // third address space
-       AS_3,                           // fourth address space
-       ADDRESS_SPACES,                 // maximum number of address spaces
-
-       // alternate address space names for common use
-       AS_PROGRAM = AS_0,              // program address space
-       AS_DATA = AS_1,                 // data address space
-       AS_IO = AS_2                    // I/O address space
-};
-
-// offsets and addresses are 32-bit (for now...)
-typedef UINT32 offs_t;
-
-/*****************************************************************************/
-/* src/osd/osdcomm.h */
-
-/* Highly useful macro for compile-time knowledge of an array size */
-#define ARRAY_LENGTH(x)     (sizeof(x) / sizeof(x[0]))
-
-#ifdef I386_PSEUDO_BIOS
-#define BIOS_INT(num, __ret) if(cpustate->bios != NULL) { \
-       uint16_t regs[8], sregs[4]; \
-       __ret = false; \
-       regs[0] = REG16(AX); regs[1] = REG16(CX); regs[2] = REG16(DX); regs[3] = REG16(BX); \
-       regs[4] = REG16(SP); regs[5] = REG16(BP); regs[6] = REG16(SI); regs[7] = REG16(DI); \
-       sregs[0] = cpustate->sreg[ES].selector; sregs[1] = cpustate->sreg[CS].selector; \
-       sregs[2] = cpustate->sreg[SS].selector; sregs[3] = cpustate->sreg[DS].selector; \
-       int32_t ZeroFlag = cpustate->ZF, CarryFlag = cpustate->CF; \
-       printf("INT %x \n", num); \
-       if(cpustate->bios->bios_int_i86(num, regs, sregs, &ZeroFlag, &CarryFlag)) { \
-               REG16(AX) = regs[0]; REG16(CX) = regs[1]; REG16(DX) = regs[2]; REG16(BX) = regs[3]; \
-               REG16(SP) = regs[4]; REG16(BP) = regs[5]; REG16(SI) = regs[6]; REG16(DI) = regs[7]; \
-               cpustate->ZF = (UINT8)ZeroFlag; cpustate->CF = (UINT8)CarryFlag; \
-               __ret = true;                                                                                                   \
-       } \
-}
-#define BIOS_CALL(address,__ret) if(cpustate->bios != NULL) {  \
-       uint16_t regs[8], sregs[4]; \
-       __ret = false; \
-       regs[0] = REG16(AX); regs[1] = REG16(CX); regs[2] = REG16(DX); regs[3] = REG16(BX); \
-       regs[4] = REG16(SP); regs[5] = REG16(BP); regs[6] = REG16(SI); regs[7] = REG16(DI); \
-       sregs[0] = cpustate->sreg[ES].selector; sregs[1] = cpustate->sreg[CS].selector; \
-       sregs[2] = cpustate->sreg[SS].selector; sregs[3] = cpustate->sreg[DS].selector; \
-       int32_t ZeroFlag = cpustate->ZF, CarryFlag = cpustate->CF; \
-       printf("CALL %08x %0x AX=%04x %02x %02x\n", cpustate, address, regs[0], REG8(AH), REG8(AL)); \
-       if(cpustate->bios->bios_call_i86(address, regs, sregs, &ZeroFlag, &CarryFlag)) { \
-               REG16(AX) = regs[0]; REG16(CX) = regs[1]; REG16(DX) = regs[2]; REG16(BX) = regs[3]; \
-               REG16(SP) = regs[4]; REG16(BP) = regs[5]; REG16(SI) = regs[6]; REG16(DI) = regs[7]; \
-               cpustate->ZF = (UINT8)ZeroFlag; cpustate->CF = (UINT8)CarryFlag; \
-               __ret = true; \
-       } \
-}
-#endif
-
-//static CPU_TRANSLATE(i386);
-#include "mame/emu/cpu/vtlb.h"
-#include "mame/emu/cpu/i386/i386_exec.c"
-#ifdef USE_DEBUGGER
-#include "mame/emu/cpu/i386/i386dasm.c"
-#endif
 
 void I386::initialize()
 {
index 3424c20..bb54ecd 100644 (file)
 
 #include "i386_base.h"
 
-/* ----------------------------------------------------------------------------
-       MAME i386
----------------------------------------------------------------------------- */
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-#pragma warning( disable : 4018 )
-#pragma warning( disable : 4065 )
-#pragma warning( disable : 4146 )
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4996 )
-#endif
-
-#ifndef __BIG_ENDIAN__
-#define LSB_FIRST
-#endif
-
-extern "C" {
-#ifndef INLINE
-#define INLINE inline
-#endif
-
-#define U64(v) UINT64(v)
-
-#define fatalerror(...) exit(1)
-#define logerror(...)
-#define popmessage(...)
-
-/*****************************************************************************/
-/* src/emu/devcpu.h */
-
-/*****************************************************************************/
-/* src/emu/didisasm.h */
-
-// Disassembler constants
-const UINT32 DASMFLAG_SUPPORTED     = 0x80000000;   // are disassembly flags supported?
-const UINT32 DASMFLAG_STEP_OUT      = 0x40000000;   // this instruction should be the end of a step out sequence
-const UINT32 DASMFLAG_STEP_OVER     = 0x20000000;   // this instruction should be stepped over by setting a breakpoint afterwards
-const UINT32 DASMFLAG_OVERINSTMASK  = 0x18000000;   // number of extra instructions to skip when stepping over
-const UINT32 DASMFLAG_OVERINSTSHIFT = 27;           // bits to shift after masking to get the value
-const UINT32 DASMFLAG_LENGTHMASK    = 0x0000ffff;   // the low 16-bits contain the actual length
-
-/*****************************************************************************/
-/* src/emu/diexec.h */
-
-// I/O line states
-enum line_state
-{
-       CLEAR_LINE = 0,                         // clear (a fired or held) line
-       ASSERT_LINE,                            // assert an interrupt immediately
-       HOLD_LINE,                              // hold interrupt line until acknowledged
-       PULSE_LINE                              // pulse interrupt line instantaneously (only for NMI, RESET)
-};
-
-enum
-{
-       INPUT_LINE_IRQ = 0,
-       INPUT_LINE_NMI
-};
-
-/*****************************************************************************/
-/* src/emu/dimemory.h */
-
-// Translation intentions
-const int TRANSLATE_TYPE_MASK       = 0x03;     // read write or fetch
-const int TRANSLATE_USER_MASK       = 0x04;     // user mode or fully privileged
-const int TRANSLATE_DEBUG_MASK      = 0x08;     // debug mode (no side effects)
-
-const int TRANSLATE_READ            = 0;        // translate for read
-const int TRANSLATE_WRITE           = 1;        // translate for write
-const int TRANSLATE_FETCH           = 2;        // translate for instruction fetch
-const int TRANSLATE_READ_USER       = (TRANSLATE_READ | TRANSLATE_USER_MASK);
-const int TRANSLATE_WRITE_USER      = (TRANSLATE_WRITE | TRANSLATE_USER_MASK);
-const int TRANSLATE_FETCH_USER      = (TRANSLATE_FETCH | TRANSLATE_USER_MASK);
-const int TRANSLATE_READ_DEBUG      = (TRANSLATE_READ | TRANSLATE_DEBUG_MASK);
-const int TRANSLATE_WRITE_DEBUG     = (TRANSLATE_WRITE | TRANSLATE_DEBUG_MASK);
-const int TRANSLATE_FETCH_DEBUG     = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK);
-
-/*****************************************************************************/
-/* src/emu/emucore.h */
-
-// constants for expression endianness
-enum endianness_t
-{
-       ENDIANNESS_LITTLE,
-       ENDIANNESS_BIG
-};
-
-// declare native endianness to be one or the other
-#ifdef LSB_FIRST
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_LITTLE;
-#else
-const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG;
-#endif
-// endian-based value: first value is if 'endian' is little-endian, second is if 'endian' is big-endian
-#define ENDIAN_VALUE_LE_BE(endian,leval,beval) (((endian) == ENDIANNESS_LITTLE) ? (leval) : (beval))
-// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian
-#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ENDIAN_VALUE_LE_BE(ENDIANNESS_NATIVE, leval, beval)
-// endian-based value: first value is if 'endian' matches native, second is if 'endian' doesn't match native
-#define ENDIAN_VALUE_NE_NNE(endian,leval,beval)        (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval))
-
-/*****************************************************************************/
-/* src/emu/memory.h */
-
-// address spaces
-enum address_spacenum
-{
-       AS_0,                           // first address space
-       AS_1,                           // second address space
-       AS_2,                           // third address space
-       AS_3,                           // fourth address space
-       ADDRESS_SPACES,                 // maximum number of address spaces
-
-       // alternate address space names for common use
-       AS_PROGRAM = AS_0,              // program address space
-       AS_DATA = AS_1,                 // data address space
-       AS_IO = AS_2                    // I/O address space
-};
-
-// offsets and addresses are 32-bit (for now...)
-typedef UINT32 offs_t;
-
-/*****************************************************************************/
-/* src/osd/osdcomm.h */
-
-/* Highly useful macro for compile-time knowledge of an array size */
-#define ARRAY_LENGTH(x)     (sizeof(x) / sizeof(x[0]))
-
-static CPU_TRANSLATE(i386);
-}
-#include "mame/lib/softfloat/softfloat.c"
-#include "mame/emu/cpu/vtlb.c"
-#include "mame/emu/cpu/i386/i386.c"
-
-
 void I386_BASE::initialize()
 {
 //     i386_state *cpustate = (i386_state *)opaque;
index 41d6a6f..187a129 100644 (file)
@@ -1,4 +1,4 @@
-
+#include "./i386_opdef.h"
 
 int I386_OPS_BASE::i386_translate_address(int intention, offs_t *address, vtlb_entry *entry)
 {
@@ -136,7 +136,7 @@ UINT64 I386_OPS_BASE::pentium_msr_read(i386_state *cpustate, UINT32 offset,UINT8
        return -1;
 }
 
-void pentium_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
+void I386_OPS_BASE::pentium_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
 {
        switch(offset)
        {
@@ -182,7 +182,7 @@ void pentium_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *
 }
 
 // P6 (Pentium Pro, Pentium II, Pentium III) MSR handling
-UINT64 p6_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
+UINT64 I386_OPS_BASE::p6_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
 {
        switch(offset)
        {
@@ -215,7 +215,7 @@ UINT64 p6_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
        return -1;
 }
 
-void p6_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
+void I386_OPS_BASE::p6_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
 {
        switch(offset)
        {
@@ -242,7 +242,7 @@ void p6_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid
 }
 
 // PIV (Pentium 4+)
-UINT64 piv_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
+UINT64 I386_OPS_BASE::piv_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
 {
        switch(offset)
        {
@@ -254,7 +254,7 @@ UINT64 piv_msr_read(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr)
        return -1;
 }
 
-void piv_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
+void I386_OPS_BASE::piv_msr_write(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr)
 {
        switch(offset)
        {
index 0aeaa1d..1df6f4c 100644 (file)
@@ -19,7 +19,8 @@
 
 //#include "emu.h"
 //#include "debugger.h"
-#include "i386priv.h"
+//#include "i386priv.h"
+#include "./i386_opdef.h"
 //#include "i386.h"
 
 //#include "debug/debugcpu.h"
index 40d121f..d61bcd3 100644 (file)
@@ -5,6 +5,19 @@
 #include "./i386priv.h"
 #include "./i386ops.h"
 
+#ifndef INLINE
+#define INLINE inline
+#endif
+
+#define U64(v) UINT64(v)
+
+#define fatalerror(...) exit(1)
+#define logerror(...)
+#define popmessage(...)
+
+/*****************************************************************************/
+/* src/emu/devcpu.h */
+
 // CPU interface functions
 #define CPU_INIT_NAME(name)                    I386_OPS_BASE::cpu_init_##name
 #define CPU_INIT(name)                         void* CPU_INIT_NAME(name)()
 #define CPU_DISASSEMBLE_CALL_NAME(name)        cpu_disassemble_##name
 #define CPU_DISASSEMBLE_CALL(name)     CPU_DISASSEMBLE_CALL_NAME(name)(buffer, eip, oprom)
 
+/*****************************************************************************/
+/* src/emu/didisasm.h */
+
+// Disassembler constants
+const UINT32 DASMFLAG_SUPPORTED     = 0x80000000;   // are disassembly flags supported?
+const UINT32 DASMFLAG_STEP_OUT      = 0x40000000;   // this instruction should be the end of a step out sequence
+const UINT32 DASMFLAG_STEP_OVER     = 0x20000000;   // this instruction should be stepped over by setting a breakpoint afterwards
+const UINT32 DASMFLAG_OVERINSTMASK  = 0x18000000;   // number of extra instructions to skip when stepping over
+const UINT32 DASMFLAG_OVERINSTSHIFT = 27;           // bits to shift after masking to get the value
+const UINT32 DASMFLAG_LENGTHMASK    = 0x0000ffff;   // the low 16-bits contain the actual length
+
+/*****************************************************************************/
+/* src/emu/diexec.h */
+
+// I/O line states
+enum line_state
+{
+       CLEAR_LINE = 0,                         // clear (a fired or held) line
+       ASSERT_LINE,                            // assert an interrupt immediately
+       HOLD_LINE,                              // hold interrupt line until acknowledged
+       PULSE_LINE                              // pulse interrupt line instantaneously (only for NMI, RESET)
+};
+
+enum
+{
+       INPUT_LINE_IRQ = 0,
+       INPUT_LINE_NMI
+};
+
+/*****************************************************************************/
+/* src/emu/dimemory.h */
+
 
 class DEBUG;
 class I386_OPS_BASE {
@@ -43,6 +88,7 @@ protected:
        UINT8 cycle_table_rm[X86_NUM_CPUS][CYCLES_NUM_OPCODES];
        UINT8 cycle_table_pm[X86_NUM_CPUS][CYCLES_NUM_OPCODES];
 
+       UINT32 i386_escape_ea;   // hack around GCC 4.6 error because we need the side effects of GetEA()
 
 protected:
        UINT32 i386_load_protected_mode_segment( I386_SREG *seg, UINT64 *desc );
index 4b6f817..7e0eedc 100644 (file)
@@ -1,4 +1,8 @@
 
+#include "../vm.h"
+#include "../../emu.h"
+#include "./i386opdef_real.h"
+
 I386_OPS::I386_OPS(void) : I386_OPS_BASE()
 {
 }
@@ -201,3 +205,14 @@ int I386_OPS::cpu_execute_i386(int cycles)
 }
 
 
+void I386_OPS::I386OP(int)(i386_state *cpustate)               // Opcode 0xcd
+{
+       int interrupt = FETCH(cpustate);
+       CYCLES(cpustate,CYCLES_INT);
+#ifdef I386_PSEUDO_BIOS
+       BIOS_INT(interrupt)
+#endif
+       cpustate->ext = 0; // not an external interrupt
+       i386_trap(cpustate,interrupt, 1, 0);
+       cpustate->ext = 1;
+}
index a9bdf43..0c41a28 100644 (file)
@@ -486,16 +486,12 @@ void I386_OPS_BASE::I386OP(bts_rm16_r16)()      // Opcode 0x0f ab
                CYCLES(CYCLES_BTS_REG_MEM);
        }
 }
-
+// Belows are without PSEUDO_BIOS, sometimes needs to use i386op16_real.cpp .
 void I386_OPS_BASE::I386OP(call_abs16)()        // Opcode 0x9a
 {
        UINT16 offset = FETCH16();
        UINT16 ptr = FETCH16();
 
-#ifdef I386_PSEUDO_BIOS
-       BIOS_CALL(((ptr << 4) + offset) & cpustate->a20_mask)
-#endif
-
        if( PROTECTED_MODE && !V8086_MODE)
        {
                i386_protected_mode_call(ptr,offset,0,0);
@@ -517,9 +513,6 @@ void I386_OPS_BASE::I386OP(call_rel16)()        // Opcode 0xe8
 {
        INT16 disp = FETCH16();
 
-#ifdef I386_PSEUDO_BIOS
-       BIOS_CALL((cpustate->pc + disp) & cpustate->a20_mask)
-#endif
 
        PUSH16( cpustate->eip );
        if (cpustate->sreg[CS].d)
@@ -3023,9 +3016,6 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                        address = READ16(ea);
                                        CYCLES(CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
-#ifdef I386_PSEUDO_BIOS
-                               BIOS_CALL(((cpustate->sreg[CS].selector << 4) + address) & cpustate->a20_mask)
-#endif
                                PUSH16( cpustate->eip );
                                cpustate->eip = address;
                                CHANGE_PC(cpustate->eip);
@@ -3044,9 +3034,6 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                        address = READ16(ea + 0);
                                        selector = READ16(ea + 2);
                                        CYCLES(CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
-#ifdef I386_PSEUDO_BIOS
-                                       BIOS_CALL(((selector << 4) + address) & cpustate->a20_mask)
-#endif
                                        if(PROTECTED_MODE && !V8086_MODE)
                                        {
                                                i386_protected_mode_call(selector,address,1,0);
diff --git a/source/src/vm/libcpu_i386/i386op16_real.cpp b/source/src/vm/libcpu_i386/i386op16_real.cpp
new file mode 100644 (file)
index 0000000..2af4625
--- /dev/null
@@ -0,0 +1,233 @@
+
+#include "../vm.h"
+#include "../../emu.h"
+#include "./i386opdef_real.h"
+
+#ifdef I386_PSEUDO_BIOS
+#define BIOS_INT(num) if(cpustate->bios != NULL) { \
+       uint16_t regs[8], sregs[4]; \
+       regs[0] = REG16(AX); regs[1] = REG16(CX); regs[2] = REG16(DX); regs[3] = REG16(BX); \
+       regs[4] = REG16(SP); regs[5] = REG16(BP); regs[6] = REG16(SI); regs[7] = REG16(DI); \
+       sregs[0] = cpustate->sreg[ES].selector; sregs[1] = cpustate->sreg[CS].selector; \
+       sregs[2] = cpustate->sreg[SS].selector; sregs[3] = cpustate->sreg[DS].selector; \
+       int32_t ZeroFlag = cpustate->ZF, CarryFlag = cpustate->CF; \
+       printf("INT %x \n", num); \
+       if(cpustate->bios->bios_int_i86(num, regs, sregs, &ZeroFlag, &CarryFlag)) { \
+               REG16(AX) = regs[0]; REG16(CX) = regs[1]; REG16(DX) = regs[2]; REG16(BX) = regs[3]; \
+               REG16(SP) = regs[4]; REG16(BP) = regs[5]; REG16(SI) = regs[6]; REG16(DI) = regs[7]; \
+               cpustate->ZF = (UINT8)ZeroFlag; cpustate->CF = (UINT8)CarryFlag; \
+               return; \
+       } \
+}
+#define BIOS_CALL(address) if(cpustate->bios != NULL) {        \
+       uint16_t regs[8], sregs[4]; \
+       regs[0] = REG16(AX); regs[1] = REG16(CX); regs[2] = REG16(DX); regs[3] = REG16(BX); \
+       regs[4] = REG16(SP); regs[5] = REG16(BP); regs[6] = REG16(SI); regs[7] = REG16(DI); \
+       sregs[0] = cpustate->sreg[ES].selector; sregs[1] = cpustate->sreg[CS].selector; \
+       sregs[2] = cpustate->sreg[SS].selector; sregs[3] = cpustate->sreg[DS].selector; \
+       int32_t ZeroFlag = cpustate->ZF, CarryFlag = cpustate->CF; \
+       printf("CALL %08x %0x AX=%04x %02x %02x\n", cpustate, address, regs[0], REG8(AH), REG8(AL)); \
+       if(cpustate->bios->bios_call_i86(address, regs, sregs, &ZeroFlag, &CarryFlag)) { \
+               REG16(AX) = regs[0]; REG16(CX) = regs[1]; REG16(DX) = regs[2]; REG16(BX) = regs[3]; \
+               REG16(SP) = regs[4]; REG16(BP) = regs[5]; REG16(SI) = regs[6]; REG16(DI) = regs[7]; \
+               cpustate->ZF = (UINT8)ZeroFlag; cpustate->CF = (UINT8)CarryFlag; \
+               return; \
+       } \
+}
+#endif
+
+void I386_OPS::I386OP(call_abs16)()        // Opcode 0x9a
+{
+       UINT16 offset = FETCH16();
+       UINT16 ptr = FETCH16();
+
+#ifdef I386_PSEUDO_BIOS
+       BIOS_CALL(((ptr << 4) + offset) & cpustate->a20_mask)
+#endif
+
+       if( PROTECTED_MODE && !V8086_MODE)
+       {
+               i386_protected_mode_call(ptr,offset,0,0);
+       }
+       else
+       {
+               PUSH16( cpustate->sreg[CS].selector );
+               PUSH16( cpustate->eip );
+               cpustate->sreg[CS].selector = ptr;
+               cpustate->performed_intersegment_jump = 1;
+               cpustate->eip = offset;
+               i386_load_segment_descriptor(CS);
+       }
+       CYCLES(CYCLES_CALL_INTERSEG);      /* TODO: Timing = 17 + m */
+       CHANGE_PC(cpustate->eip);
+}
+
+void I386_OPS::I386OP(call_rel16)()        // Opcode 0xe8
+{
+       INT16 disp = FETCH16();
+
+#ifdef I386_PSEUDO_BIOS
+       BIOS_CALL((cpustate->pc + disp) & cpustate->a20_mask)
+#endif
+
+       PUSH16( cpustate->eip );
+       if (cpustate->sreg[CS].d)
+       {
+               cpustate->eip += disp;
+       }
+       else
+       {
+               cpustate->eip = (cpustate->eip + disp) & 0xffff;
+       }
+       CHANGE_PC(cpustate->eip);
+       CYCLES(CYCLES_CALL);       /* TODO: Timing = 7 + m */
+}
+
+void I386_OPS::I386OP(groupFF_16)()        // Opcode 0xff
+{
+       UINT8 modrm = FETCH();
+
+       switch( (modrm >> 3) & 0x7 )
+       {
+               case 0:         /* INC Rm16 */
+                       if( modrm >= 0xc0 ) {
+                               UINT16 dst = LOAD_RM16(modrm);
+                               dst = INC16(dst);
+                               STORE_RM16(modrm, dst);
+                               CYCLES(CYCLES_INC_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT16 dst = READ16(ea);
+                               dst = INC16(dst);
+                               WRITE16(ea, dst);
+                               CYCLES(CYCLES_INC_MEM);
+                       }
+                       break;
+               case 1:         /* DEC Rm16 */
+                       if( modrm >= 0xc0 ) {
+                               UINT16 dst = LOAD_RM16(modrm);
+                               dst = DEC16(dst);
+                               STORE_RM16(modrm, dst);
+                               CYCLES(CYCLES_DEC_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT16 dst = READ16(ea);
+                               dst = DEC16(dst);
+                               WRITE16(ea, dst);
+                               CYCLES(CYCLES_DEC_MEM);
+                       }
+                       break;
+               case 2:         /* CALL Rm16 */
+                       {
+                               UINT16 address;
+                               if( modrm >= 0xc0 ) {
+                                       address = LOAD_RM16(modrm);
+                                       CYCLES(CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0);
+                                       address = READ16(ea);
+                                       CYCLES(CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
+                               }
+#ifdef I386_PSEUDO_BIOS
+                               BIOS_CALL(((cpustate->sreg[CS].selector << 4) + address) & cpustate->a20_mask)
+#endif
+                               PUSH16( cpustate->eip );
+                               cpustate->eip = address;
+                               CHANGE_PC(cpustate->eip);
+                       }
+                       break;
+               case 3:         /* CALL FAR Rm16 */
+                       {
+                               UINT16 address, selector;
+                               if( modrm >= 0xc0 )
+                               {
+                                       report_invalid_modrm( "groupFF_16", modrm);
+                               }
+                               else
+                               {
+                                       UINT32 ea = GetEA(modrm,0);
+                                       address = READ16(ea + 0);
+                                       selector = READ16(ea + 2);
+                                       CYCLES(CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
+#ifdef I386_PSEUDO_BIOS
+                                       BIOS_CALL(((selector << 4) + address) & cpustate->a20_mask)
+#endif
+                                       if(PROTECTED_MODE && !V8086_MODE)
+                                       {
+                                               i386_protected_mode_call(selector,address,1,0);
+                                       }
+                                       else
+                                       {
+                                               PUSH16( cpustate->sreg[CS].selector );
+                                               PUSH16( cpustate->eip );
+                                               cpustate->sreg[CS].selector = selector;
+                                               cpustate->performed_intersegment_jump = 1;
+                                               i386_load_segment_descriptor( CS );
+                                               cpustate->eip = address;
+                                               CHANGE_PC(cpustate->eip);
+                                       }
+                               }
+                       }
+                       break;
+               case 4:         /* JMP Rm16 */
+                       {
+                               UINT16 address;
+                               if( modrm >= 0xc0 ) {
+                                       address = LOAD_RM16(modrm);
+                                       CYCLES(CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0);
+                                       address = READ16(ea);
+                                       CYCLES(CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
+                               }
+                               cpustate->eip = address;
+                               CHANGE_PC(cpustate->eip);
+                       }
+                       break;
+               case 5:         /* JMP FAR Rm16 */
+                       {
+                               UINT16 address, selector;
+
+                               if( modrm >= 0xc0 )
+                               {
+                                       report_invalid_modrm( "groupFF_16", modrm);
+                               }
+                               else
+                               {
+                                       UINT32 ea = GetEA(modrm,0);
+                                       address = READ16(ea + 0);
+                                       selector = READ16(ea + 2);
+                                       CYCLES(CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
+                                       if(PROTECTED_MODE && !V8086_MODE)
+                                       {
+                                               i386_protected_mode_jump(selector,address,1,0);
+                                       }
+                                       else
+                                       {
+                                               cpustate->sreg[CS].selector = selector;
+                                               cpustate->performed_intersegment_jump = 1;
+                                               i386_load_segment_descriptor( CS );
+                                               cpustate->eip = address;
+                                               CHANGE_PC(cpustate->eip);
+                                       }
+                               }
+                       }
+                       break;
+               case 6:         /* PUSH Rm16 */
+                       {
+                               UINT16 value;
+                               if( modrm >= 0xc0 ) {
+                                       value = LOAD_RM16(modrm);
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0);
+                                       value = READ16(ea);
+                               }
+                               PUSH16(value);
+                               CYCLES(CYCLES_PUSH_RM);
+                       }
+                       break;
+               default:
+                       report_invalid_modrm( "groupFF_16", modrm);
+                       break;
+       }
+}
index 16c9bdd..b3dd031 100644 (file)
@@ -1,12 +1,14 @@
 // license:BSD-3-Clause
 // copyright-holders:Ville Linde, Barry Rodewald, Carl, Phil Bennett
-static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 value, UINT8 shift)
+#include "./i386_opdef.h"
+
+UINT8 I386_OPS_BASE::I386OP(shift_rotate8)( UINT8 modrm, UINT32 value, UINT8 shift)
 {
        UINT32 src = value & 0xff;
        UINT8 dst = value;
 
        if( shift == 0 ) {
-               CYCLES_RM(cpustate,modrm, 3, 7);
+               CYCLES_RM(modrm, 3, 7);
        } else if( shift == 1 ) {
                switch( (modrm >> 3) & 0x7 )
                {
@@ -14,25 +16,25 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                cpustate->CF = (src & 0x80) ? 1 : 0;
                                dst = (src << 1) + cpustate->CF;
                                cpustate->OF = ((src ^ dst) & 0x80) ? 1 : 0;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 1:         /* ROR rm8, 1 */
                                cpustate->CF = (src & 0x1) ? 1 : 0;
                                dst = (cpustate->CF << 7) | (src >> 1);
                                cpustate->OF = ((src ^ dst) & 0x80) ? 1 : 0;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 2:         /* RCL rm8, 1 */
                                dst = (src << 1) + cpustate->CF;
                                cpustate->CF = (src & 0x80) ? 1 : 0;
                                cpustate->OF = ((src ^ dst) & 0x80) ? 1 : 0;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
                                break;
                        case 3:         /* RCR rm8, 1 */
                                dst = (cpustate->CF << 7) | (src >> 1);
                                cpustate->CF = src & 0x1;
                                cpustate->OF = ((src ^ dst) & 0x80) ? 1 : 0;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
                                break;
                        case 4:         /* SHL/SAL rm8, 1 */
                        case 6:
@@ -40,21 +42,21 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                cpustate->CF = (src & 0x80) ? 1 : 0;
                                cpustate->OF = (((cpustate->CF << 7) ^ dst) & 0x80) ? 1 : 0;
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 5:         /* SHR rm8, 1 */
                                dst = src >> 1;
                                cpustate->CF = src & 0x1;
                                cpustate->OF = (dst & 0x80) ? 1 : 0;
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 7:         /* SAR rm8, 1 */
                                dst = (INT8)(src) >> 1;
                                cpustate->CF = src & 0x1;
                                cpustate->OF = 0;
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                }
 
@@ -76,7 +78,7 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                                ((src & ((UINT8)0xff << (8-shift))) >> (8-shift));
                                cpustate->CF = dst & 0x1;
                                cpustate->OF = (dst & 1) ^ (dst >> 7);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 1:         /* ROR rm8, i8 */
                                if(!(shift & 7))
@@ -93,7 +95,7 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                                ((src & ((UINT8)0xff >> (8-shift))) << (8-shift));
                                cpustate->CF = (dst >> 7) & 1;
                                cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 2:         /* RCL rm8, i8 */
                                shift %= 9;
@@ -102,7 +104,7 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                                (cpustate->CF << (shift-1));
                                if(shift) cpustate->CF = (src >> (8-shift)) & 0x1;
                                cpustate->OF = cpustate->CF ^ ((dst >> 7) & 1);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
                                break;
                        case 3:         /* RCR rm8, i8 */
                                shift %= 9;
@@ -111,7 +113,7 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                                (cpustate->CF << (8-shift));
                                if(shift) cpustate->CF = (src >> (shift-1)) & 0x1;
                                cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
                                break;
                        case 4:         /* SHL/SAL rm8, i8 */
                        case 6:
@@ -119,21 +121,21 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
                                dst = src << shift;
                                cpustate->CF = (shift <= 8) && ((src >> (8 - shift)) & 1);
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 5:         /* SHR rm8, i8 */
                                shift &= 31;
                                dst = src >> shift;
                                cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                        case 7:         /* SAR rm8, i8 */
                                shift &= 31;
                                dst = (INT8)src >> shift;
                                cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
                                SetSZPF8(dst);
-                               CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
                                break;
                }
        }
@@ -143,169 +145,169 @@ static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 val
 
 
 
-static void I386OP(adc_rm8_r8)(i386_state *cpustate)        // Opcode 0x10
+void I386_OPS_BASE::I386OP(adc_rm8_r8)()        // Opcode 0x10
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = ADC8(cpustate, dst, src, cpustate->CF);
+               dst = ADC8( dst, src, cpustate->CF);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = ADC8(cpustate, dst, src, cpustate->CF);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = ADC8( dst, src, cpustate->CF);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(adc_r8_rm8)(i386_state *cpustate)        // Opcode 0x12
+void I386_OPS_BASE::I386OP(adc_r8_rm8)()        // Opcode 0x12
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = ADC8(cpustate, dst, src, cpustate->CF);
+               dst = ADC8( dst, src, cpustate->CF);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = ADC8(cpustate, dst, src, cpustate->CF);
+               dst = ADC8( dst, src, cpustate->CF);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(adc_al_i8)(i386_state *cpustate)     // Opcode 0x14
+void I386_OPS_BASE::I386OP(adc_al_i8)()     // Opcode 0x14
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = ADC8(cpustate, dst, src, cpustate->CF);
+       dst = ADC8( dst, src, cpustate->CF);
        REG8(AL) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(add_rm8_r8)(i386_state *cpustate)        // Opcode 0x00
+void I386_OPS_BASE::I386OP(add_rm8_r8)()        // Opcode 0x00
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = ADD8(cpustate,dst, src);
+               dst = ADD8(dst, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = ADD8(cpustate,dst, src);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = ADD8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(add_r8_rm8)(i386_state *cpustate)        // Opcode 0x02
+void I386_OPS_BASE::I386OP(add_r8_rm8)()        // Opcode 0x02
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = ADD8(cpustate,dst, src);
+               dst = ADD8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = ADD8(cpustate,dst, src);
+               dst = ADD8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(add_al_i8)(i386_state *cpustate)     // Opcode 0x04
+void I386_OPS_BASE::I386OP(add_al_i8)()     // Opcode 0x04
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = ADD8(cpustate,dst, src);
+       dst = ADD8(dst, src);
        REG8(AL) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(and_rm8_r8)(i386_state *cpustate)        // Opcode 0x20
+void I386_OPS_BASE::I386OP(and_rm8_r8)()        // Opcode 0x20
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = AND8(cpustate,dst, src);
+               dst = AND8(dst, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = AND8(cpustate,dst, src);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = AND8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(and_r8_rm8)(i386_state *cpustate)        // Opcode 0x22
+void I386_OPS_BASE::I386OP(and_r8_rm8)()        // Opcode 0x22
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = AND8(cpustate,dst, src);
+               dst = AND8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = AND8(cpustate,dst, src);
+               dst = AND8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(and_al_i8)(i386_state *cpustate)         // Opcode 0x24
+void I386_OPS_BASE::I386OP(and_al_i8)()         // Opcode 0x24
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = AND8(cpustate,dst, src);
+       dst = AND8(dst, src);
        REG8(AL) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(clc)(i386_state *cpustate)               // Opcode 0xf8
+void I386_OPS_BASE::I386OP(clc)()               // Opcode 0xf8
 {
        cpustate->CF = 0;
-       CYCLES(cpustate,CYCLES_CLC);
+       CYCLES(CYCLES_CLC);
 }
 
-static void I386OP(cld)(i386_state *cpustate)               // Opcode 0xfc
+void I386_OPS_BASE::I386OP(cld)()               // Opcode 0xfc
 {
        cpustate->DF = 0;
-       CYCLES(cpustate,CYCLES_CLD);
+       CYCLES(CYCLES_CLD);
 }
 
-static void I386OP(cli)(i386_state *cpustate)               // Opcode 0xfa
+void I386_OPS_BASE::I386OP(cli)()               // Opcode 0xfa
 {
        if(PROTECTED_MODE)
        {
@@ -314,359 +316,359 @@ static void I386OP(cli)(i386_state *cpustate)               // Opcode 0xfa
                        FAULT(FAULT_GP,0);
        }
        cpustate->IF = 0;
-       CYCLES(cpustate,CYCLES_CLI);
+       CYCLES(CYCLES_CLI);
 }
 
-static void I386OP(cmc)(i386_state *cpustate)               // Opcode 0xf5
+void I386_OPS_BASE::I386OP(cmc)()               // Opcode 0xf5
 {
        cpustate->CF ^= 1;
-       CYCLES(cpustate,CYCLES_CMC);
+       CYCLES(CYCLES_CMC);
 }
 
-static void I386OP(cmp_rm8_r8)(i386_state *cpustate)        // Opcode 0x38
+void I386_OPS_BASE::I386OP(cmp_rm8_r8)()        // Opcode 0x38
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               SUB8(cpustate,dst, src);
-               CYCLES(cpustate,CYCLES_CMP_REG_REG);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(modrm,0);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               SUB8(cpustate,dst, src);
-               CYCLES(cpustate,CYCLES_CMP_REG_MEM);
+               dst = READ8(ea);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_MEM);
        }
 }
 
-static void I386OP(cmp_r8_rm8)(i386_state *cpustate)        // Opcode 0x3a
+void I386_OPS_BASE::I386OP(cmp_r8_rm8)()        // Opcode 0x3a
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               SUB8(cpustate,dst, src);
-               CYCLES(cpustate,CYCLES_CMP_REG_REG);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               SUB8(cpustate,dst, src);
-               CYCLES(cpustate,CYCLES_CMP_MEM_REG);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_MEM_REG);
        }
 }
 
-static void I386OP(cmp_al_i8)(i386_state *cpustate)         // Opcode 0x3c
+void I386_OPS_BASE::I386OP(cmp_al_i8)()         // Opcode 0x3c
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       SUB8(cpustate,dst, src);
-       CYCLES(cpustate,CYCLES_CMP_IMM_ACC);
+       SUB8(dst, src);
+       CYCLES(CYCLES_CMP_IMM_ACC);
 }
 
-static void I386OP(cmpsb)(i386_state *cpustate)             // Opcode 0xa6
+void I386_OPS_BASE::I386OP(cmpsb)()             // Opcode 0xa6
 {
        UINT32 eas, ead;
        UINT8 src, dst;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
-       src = READ8(cpustate,eas);
-       dst = READ8(cpustate,ead);
-       SUB8(cpustate,src, dst);
-       BUMP_SI(cpustate,1);
-       BUMP_DI(cpustate,1);
-       CYCLES(cpustate,CYCLES_CMPS);
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       src = READ8(eas);
+       dst = READ8(ead);
+       SUB8(src, dst);
+       BUMP_SI(1);
+       BUMP_DI(1);
+       CYCLES(CYCLES_CMPS);
 }
 
-static void I386OP(in_al_i8)(i386_state *cpustate)          // Opcode 0xe4
+void I386_OPS_BASE::I386OP(in_al_i8)()          // Opcode 0xe4
 {
-       UINT16 port = FETCH(cpustate);
-       UINT8 data = READPORT8(cpustate, port);
+       UINT16 port = FETCH();
+       UINT8 data = READPORT8( port);
        REG8(AL) = data;
-       CYCLES(cpustate,CYCLES_IN_VAR);
+       CYCLES(CYCLES_IN_VAR);
 }
 
-static void I386OP(in_al_dx)(i386_state *cpustate)          // Opcode 0xec
+void I386_OPS_BASE::I386OP(in_al_dx)()          // Opcode 0xec
 {
        UINT16 port = REG16(DX);
-       UINT8 data = READPORT8(cpustate, port);
+       UINT8 data = READPORT8( port);
        REG8(AL) = data;
-       CYCLES(cpustate,CYCLES_IN);
+       CYCLES(CYCLES_IN);
 }
 
-static void I386OP(ja_rel8)(i386_state *cpustate)           // Opcode 0x77
+void I386_OPS_BASE::I386OP(ja_rel8)()           // Opcode 0x77
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->CF == 0 && cpustate->ZF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jbe_rel8)(i386_state *cpustate)          // Opcode 0x76
+void I386_OPS_BASE::I386OP(jbe_rel8)()          // Opcode 0x76
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->CF != 0 || cpustate->ZF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jc_rel8)(i386_state *cpustate)           // Opcode 0x72
+void I386_OPS_BASE::I386OP(jc_rel8)()           // Opcode 0x72
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->CF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jg_rel8)(i386_state *cpustate)           // Opcode 0x7f
+void I386_OPS_BASE::I386OP(jg_rel8)()           // Opcode 0x7f
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->ZF == 0 && (cpustate->SF == cpustate->OF) ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jge_rel8)(i386_state *cpustate)          // Opcode 0x7d
+void I386_OPS_BASE::I386OP(jge_rel8)()          // Opcode 0x7d
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if(cpustate->SF == cpustate->OF) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jl_rel8)(i386_state *cpustate)           // Opcode 0x7c
+void I386_OPS_BASE::I386OP(jl_rel8)()           // Opcode 0x7c
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( (cpustate->SF != cpustate->OF) ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jle_rel8)(i386_state *cpustate)      // Opcode 0x7e
+void I386_OPS_BASE::I386OP(jle_rel8)()      // Opcode 0x7e
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->ZF != 0 || (cpustate->SF != cpustate->OF) ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jnc_rel8)(i386_state *cpustate)          // Opcode 0x73
+void I386_OPS_BASE::I386OP(jnc_rel8)()          // Opcode 0x73
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->CF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jno_rel8)(i386_state *cpustate)          // Opcode 0x71
+void I386_OPS_BASE::I386OP(jno_rel8)()          // Opcode 0x71
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->OF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jnp_rel8)(i386_state *cpustate)          // Opcode 0x7b
+void I386_OPS_BASE::I386OP(jnp_rel8)()          // Opcode 0x7b
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->PF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jns_rel8)(i386_state *cpustate)          // Opcode 0x79
+void I386_OPS_BASE::I386OP(jns_rel8)()          // Opcode 0x79
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->SF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jnz_rel8)(i386_state *cpustate)          // Opcode 0x75
+void I386_OPS_BASE::I386OP(jnz_rel8)()          // Opcode 0x75
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->ZF == 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jo_rel8)(i386_state *cpustate)           // Opcode 0x70
+void I386_OPS_BASE::I386OP(jo_rel8)()           // Opcode 0x70
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->OF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jp_rel8)(i386_state *cpustate)           // Opcode 0x7a
+void I386_OPS_BASE::I386OP(jp_rel8)()           // Opcode 0x7a
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->PF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(js_rel8)(i386_state *cpustate)           // Opcode 0x78
+void I386_OPS_BASE::I386OP(js_rel8)()           // Opcode 0x78
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->SF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jz_rel8)(i386_state *cpustate)           // Opcode 0x74
+void I386_OPS_BASE::I386OP(jz_rel8)()           // Opcode 0x74
 {
-       INT8 disp = FETCH(cpustate);
+       INT8 disp = FETCH();
        if( cpustate->ZF != 0 ) {
-               NEAR_BRANCH(cpustate,disp);
-               CYCLES(cpustate,CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
        } else {
-               CYCLES(cpustate,CYCLES_JCC_DISP8_NOBRANCH);
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
        }
 }
 
-static void I386OP(jmp_rel8)(i386_state *cpustate)          // Opcode 0xeb
+void I386_OPS_BASE::I386OP(jmp_rel8)()          // Opcode 0xeb
 {
-       INT8 disp = FETCH(cpustate);
-       NEAR_BRANCH(cpustate,disp);
-       CYCLES(cpustate,CYCLES_JMP_SHORT);      /* TODO: Timing = 7 + m */
+       INT8 disp = FETCH();
+       NEAR_BRANCH(disp);
+       CYCLES(CYCLES_JMP_SHORT);      /* TODO: Timing = 7 + m */
 }
 
-static void I386OP(lahf)(i386_state *cpustate)              // Opcode 0x9f
+void I386_OPS_BASE::I386OP(lahf)()              // Opcode 0x9f
 {
-       REG8(AH) = get_flags(cpustate) & 0xd7;
-       CYCLES(cpustate,CYCLES_LAHF);
+       REG8(AH) = get_flags() & 0xd7;
+       CYCLES(CYCLES_LAHF);
 }
 
-static void I386OP(lodsb)(i386_state *cpustate)             // Opcode 0xac
+void I386_OPS_BASE::I386OP(lodsb)()             // Opcode 0xac
 {
        UINT32 eas;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        }
-       REG8(AL) = READ8(cpustate,eas);
-       BUMP_SI(cpustate,1);
-       CYCLES(cpustate,CYCLES_LODS);
+       REG8(AL) = READ8(eas);
+       BUMP_SI(1);
+       CYCLES(CYCLES_LODS);
 }
 
-static void I386OP(mov_rm8_r8)(i386_state *cpustate)        // Opcode 0x88
+void I386_OPS_BASE::I386OP(mov_rm8_r8)()        // Opcode 0x88
 {
        UINT8 src;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                STORE_RM8(modrm, src);
-               CYCLES(cpustate,CYCLES_MOV_REG_REG);
+               CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               WRITE8(cpustate,ea, src);
-               CYCLES(cpustate,CYCLES_MOV_REG_MEM);
+               WRITE8(ea, src);
+               CYCLES(CYCLES_MOV_REG_MEM);
        }
 }
 
-static void I386OP(mov_r8_rm8)(i386_state *cpustate)        // Opcode 0x8a
+void I386_OPS_BASE::I386OP(mov_r8_rm8)()        // Opcode 0x8a
 {
        UINT8 src;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                STORE_REG8(modrm, src);
-               CYCLES(cpustate,CYCLES_MOV_REG_REG);
+               CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                STORE_REG8(modrm, src);
-               CYCLES(cpustate,CYCLES_MOV_MEM_REG);
+               CYCLES(CYCLES_MOV_MEM_REG);
        }
 }
 
-static void I386OP(mov_rm8_i8)(i386_state *cpustate)        // Opcode 0xc6
+void I386_OPS_BASE::I386OP(mov_rm8_i8)()        // Opcode 0xc6
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
-               UINT8 value = FETCH(cpustate);
+               UINT8 value = FETCH();
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+               CYCLES(CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               UINT8 value = FETCH(cpustate);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               UINT8 value = FETCH();
+               WRITE8(ea, value);
+               CYCLES(CYCLES_MOV_IMM_MEM);
        }
 }
 
-static void I386OP(mov_r32_cr)(i386_state *cpustate)        // Opcode 0x0f 20
+void I386_OPS_BASE::I386OP(mov_r32_cr)()        // Opcode 0x0f 20
 {
        if(PROTECTED_MODE && cpustate->CPL)
                FAULT(FAULT_GP, 0);
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 cr = (modrm >> 3) & 0x7;
 
        STORE_RM32(modrm, cpustate->cr[cr]);
-       CYCLES(cpustate,CYCLES_MOV_CR_REG);
+       CYCLES(CYCLES_MOV_CR_REG);
 }
 
-static void I386OP(mov_r32_dr)(i386_state *cpustate)        // Opcode 0x0f 21
+void I386_OPS_BASE::I386OP(mov_r32_dr)()        // Opcode 0x0f 21
 {
        if(PROTECTED_MODE && cpustate->CPL)
                FAULT(FAULT_GP, 0);
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 dr = (modrm >> 3) & 0x7;
 
        STORE_RM32(modrm, cpustate->dr[dr]);
@@ -676,34 +678,34 @@ static void I386OP(mov_r32_dr)(i386_state *cpustate)        // Opcode 0x0f 21
                case 1:
                case 2:
                case 3:
-                       CYCLES(cpustate,CYCLES_MOV_REG_DR0_3);
+                       CYCLES(CYCLES_MOV_REG_DR0_3);
                        break;
                case 6:
                case 7:
-                       CYCLES(cpustate,CYCLES_MOV_REG_DR6_7);
+                       CYCLES(CYCLES_MOV_REG_DR6_7);
                        break;
        }
 }
 
-static void I386OP(mov_cr_r32)(i386_state *cpustate)        // Opcode 0x0f 22
+void I386_OPS_BASE::I386OP(mov_cr_r32)()        // Opcode 0x0f 22
 {
        if(PROTECTED_MODE && cpustate->CPL)
                FAULT(FAULT_GP, 0);
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 cr = (modrm >> 3) & 0x7;
        UINT32 data = LOAD_RM32(modrm);
        switch(cr)
        {
                case 0:
                        data &= 0xfffeffff; // wp not supported on 386
-                       CYCLES(cpustate,CYCLES_MOV_REG_CR0);
+                       CYCLES(CYCLES_MOV_REG_CR0);
                        break;
-               case 2: CYCLES(cpustate,CYCLES_MOV_REG_CR2); break;
+               case 2: CYCLES(CYCLES_MOV_REG_CR2); break;
                case 3:
-                       CYCLES(cpustate,CYCLES_MOV_REG_CR3);
+                       CYCLES(CYCLES_MOV_REG_CR3);
                        vtlb_flush_dynamic(cpustate->vtlb);
                        break;
-               case 4: CYCLES(cpustate,1); break; // TODO
+               case 4: CYCLES(1); break; // TODO
                default:
                        logerror("i386: mov_cr_r32 CR%d!\n", cr);
                        return;
@@ -711,11 +713,11 @@ static void I386OP(mov_cr_r32)(i386_state *cpustate)        // Opcode 0x0f 22
        cpustate->cr[cr] = data;
 }
 
-static void I386OP(mov_dr_r32)(i386_state *cpustate)        // Opcode 0x0f 23
+void I386_OPS_BASE::I386OP(mov_dr_r32)()        // Opcode 0x0f 23
 {
        if(PROTECTED_MODE && cpustate->CPL)
                FAULT(FAULT_GP, 0);
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 dr = (modrm >> 3) & 0x7;
 
        cpustate->dr[dr] = LOAD_RM32(modrm);
@@ -725,11 +727,11 @@ static void I386OP(mov_dr_r32)(i386_state *cpustate)        // Opcode 0x0f 23
                case 1:
                case 2:
                case 3:
-                       CYCLES(cpustate,CYCLES_MOV_DR0_3_REG);
+                       CYCLES(CYCLES_MOV_DR0_3_REG);
                        break;
                case 6:
                case 7:
-                       CYCLES(cpustate,CYCLES_MOV_DR6_7_REG);
+                       CYCLES(CYCLES_MOV_DR6_7_REG);
                        break;
                default:
                        logerror("i386: mov_dr_r32 DR%d!\n", dr);
@@ -737,45 +739,45 @@ static void I386OP(mov_dr_r32)(i386_state *cpustate)        // Opcode 0x0f 23
        }
 }
 
-static void I386OP(mov_al_m8)(i386_state *cpustate)         // Opcode 0xa0
+void I386_OPS_BASE::I386OP(mov_al_m8)()         // Opcode 0xa0
 {
        UINT32 offset, ea;
        if( cpustate->address_size ) {
-               offset = FETCH32(cpustate);
+               offset = FETCH32();
        } else {
-               offset = FETCH16(cpustate);
+               offset = FETCH16();
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 );
+               ea = i386_translate( cpustate->segment_override, offset, 0 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 0 );
+               ea = i386_translate( DS, offset, 0 );
        }
-       REG8(AL) = READ8(cpustate,ea);
-       CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
+       REG8(AL) = READ8(ea);
+       CYCLES(CYCLES_MOV_IMM_MEM);
 }
 
-static void I386OP(mov_m8_al)(i386_state *cpustate)         // Opcode 0xa2
+void I386_OPS_BASE::I386OP(mov_m8_al)()         // Opcode 0xa2
 {
        UINT32 offset, ea;
        if( cpustate->address_size ) {
-               offset = FETCH32(cpustate);
+               offset = FETCH32();
        } else {
-               offset = FETCH16(cpustate);
+               offset = FETCH16();
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 );
+               ea = i386_translate( cpustate->segment_override, offset, 1 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 1 );
+               ea = i386_translate( DS, offset, 1 );
        }
-       WRITE8(cpustate, ea, REG8(AL) );
-       CYCLES(cpustate,CYCLES_MOV_MEM_ACC);
+       WRITE8( ea, REG8(AL) );
+       CYCLES(CYCLES_MOV_MEM_ACC);
 }
 
-static void I386OP(mov_rm16_sreg)(i386_state *cpustate)     // Opcode 0x8c
+void I386_OPS_BASE::I386OP(mov_rm16_sreg)()     // Opcode 0x8c
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        int s = (modrm >> 3) & 0x7;
 
        if( modrm >= 0xc0 ) {
@@ -783,31 +785,31 @@ static void I386OP(mov_rm16_sreg)(i386_state *cpustate)     // Opcode 0x8c
                        STORE_RM32(modrm, cpustate->sreg[s].selector);
                else
                        STORE_RM16(modrm, cpustate->sreg[s].selector);
-               CYCLES(cpustate,CYCLES_MOV_SREG_REG);
+               CYCLES(CYCLES_MOV_SREG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE16(cpustate,ea, cpustate->sreg[s].selector);
-               CYCLES(cpustate,CYCLES_MOV_SREG_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE16(ea, cpustate->sreg[s].selector);
+               CYCLES(CYCLES_MOV_SREG_MEM);
        }
 }
 
-static void I386OP(mov_sreg_rm16)(i386_state *cpustate)     // Opcode 0x8e
+void I386_OPS_BASE::I386OP(mov_sreg_rm16)()     // Opcode 0x8e
 {
        UINT16 selector;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        bool fault;
        int s = (modrm >> 3) & 0x7;
 
        if( modrm >= 0xc0 ) {
                selector = LOAD_RM16(modrm);
-               CYCLES(cpustate,CYCLES_MOV_REG_SREG);
+               CYCLES(CYCLES_MOV_REG_SREG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               selector = READ16(cpustate,ea);
-               CYCLES(cpustate,CYCLES_MOV_MEM_SREG);
+               UINT32 ea = GetEA(modrm,0);
+               selector = READ16(ea);
+               CYCLES(CYCLES_MOV_MEM_SREG);
        }
 
-       i386_sreg_load(cpustate,selector,s,&fault);
+       i386_sreg_load(selector,s,&fault);
        if((s == SS) && !fault)
        {
                if(cpustate->IF != 0) // if external interrupts are enabled
@@ -818,142 +820,142 @@ static void I386OP(mov_sreg_rm16)(i386_state *cpustate)     // Opcode 0x8e
        }
 }
 
-static void I386OP(mov_al_i8)(i386_state *cpustate)         // Opcode 0xb0
+void I386_OPS_BASE::I386OP(mov_al_i8)()         // Opcode 0xb0
 {
-       REG8(AL) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(AL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_cl_i8)(i386_state *cpustate)         // Opcode 0xb1
+void I386_OPS_BASE::I386OP(mov_cl_i8)()         // Opcode 0xb1
 {
-       REG8(CL) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(CL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_dl_i8)(i386_state *cpustate)         // Opcode 0xb2
+void I386_OPS_BASE::I386OP(mov_dl_i8)()         // Opcode 0xb2
 {
-       REG8(DL) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(DL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_bl_i8)(i386_state *cpustate)         // Opcode 0xb3
+void I386_OPS_BASE::I386OP(mov_bl_i8)()         // Opcode 0xb3
 {
-       REG8(BL) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(BL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_ah_i8)(i386_state *cpustate)         // Opcode 0xb4
+void I386_OPS_BASE::I386OP(mov_ah_i8)()         // Opcode 0xb4
 {
-       REG8(AH) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(AH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_ch_i8)(i386_state *cpustate)         // Opcode 0xb5
+void I386_OPS_BASE::I386OP(mov_ch_i8)()         // Opcode 0xb5
 {
-       REG8(CH) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(CH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_dh_i8)(i386_state *cpustate)         // Opcode 0xb6
+void I386_OPS_BASE::I386OP(mov_dh_i8)()         // Opcode 0xb6
 {
-       REG8(DH) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(DH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(mov_bh_i8)(i386_state *cpustate)         // Opcode 0xb7
+void I386_OPS_BASE::I386OP(mov_bh_i8)()         // Opcode 0xb7
 {
-       REG8(BH) = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_MOV_IMM_REG);
+       REG8(BH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
 }
 
-static void I386OP(movsb)(i386_state *cpustate)             // Opcode 0xa4
+void I386_OPS_BASE::I386OP(movsb)()             // Opcode 0xa4
 {
        UINT32 eas, ead;
        UINT8 v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
-       v = READ8(cpustate,eas);
-       WRITE8(cpustate,ead, v);
-       BUMP_SI(cpustate,1);
-       BUMP_DI(cpustate,1);
-       CYCLES(cpustate,CYCLES_MOVS);
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       v = READ8(eas);
+       WRITE8(ead, v);
+       BUMP_SI(1);
+       BUMP_DI(1);
+       CYCLES(CYCLES_MOVS);
 }
 
-static void I386OP(or_rm8_r8)(i386_state *cpustate)         // Opcode 0x08
+void I386_OPS_BASE::I386OP(or_rm8_r8)()         // Opcode 0x08
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = OR8(cpustate,dst, src);
+               dst = OR8(dst, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = OR8(cpustate,dst, src);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = OR8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(or_r8_rm8)(i386_state *cpustate)         // Opcode 0x0a
+void I386_OPS_BASE::I386OP(or_r8_rm8)()         // Opcode 0x0a
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = OR8(cpustate,dst, src);
+               dst = OR8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = OR8(cpustate,dst, src);
+               dst = OR8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(or_al_i8)(i386_state *cpustate)          // Opcode 0x0c
+void I386_OPS_BASE::I386OP(or_al_i8)()          // Opcode 0x0c
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = OR8(cpustate,dst, src);
+       dst = OR8(dst, src);
        REG8(EAX) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(out_al_i8)(i386_state *cpustate)         // Opcode 0xe6
+void I386_OPS_BASE::I386OP(out_al_i8)()         // Opcode 0xe6
 {
-       UINT16 port = FETCH(cpustate);
+       UINT16 port = FETCH();
        UINT8 data = REG8(AL);
-       WRITEPORT8(cpustate, port, data);
-       CYCLES(cpustate,CYCLES_OUT_VAR);
+       WRITEPORT8( port, data);
+       CYCLES(CYCLES_OUT_VAR);
 }
 
-static void I386OP(out_al_dx)(i386_state *cpustate)         // Opcode 0xee
+void I386_OPS_BASE::I386OP(out_al_dx)()         // Opcode 0xee
 {
        UINT16 port = REG16(DX);
        UINT8 data = REG8(AL);
-       WRITEPORT8(cpustate, port, data);
-       CYCLES(cpustate,CYCLES_OUT);
+       WRITEPORT8( port, data);
+       CYCLES(CYCLES_OUT);
 }
 
 
-static void I386OP(arpl)(i386_state *cpustate)           // Opcode 0x63
+void I386_OPS_BASE::I386OP(arpl)()           // Opcode 0x63
 {
        UINT16 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 flag = 0;
 
        if(PROTECTED_MODE && !V8086_MODE)
@@ -967,49 +969,49 @@ static void I386OP(arpl)(i386_state *cpustate)           // Opcode 0x63
                                STORE_RM16(modrm, dst);
                        }
                } else {
-                       UINT32 ea = GetEA(cpustate, modrm,1);
+                       UINT32 ea = GetEA( modrm,1);
                        src = LOAD_REG16(modrm);
-                       dst = READ16(cpustate, ea);
+                       dst = READ16( ea);
                        if( (dst&0x3) < (src&0x3) ) {
                                dst = (dst&0xfffc) | (src&0x3);
                                flag = 1;
-                               WRITE16(cpustate, ea, dst);
+                               WRITE16( ea, dst);
                        }
                }
                SetZF(flag);
        }
        else
-               i386_trap(cpustate, 6, 0, 0);  // invalid opcode in real mode or v8086 mode
+               i386_trap( 6, 0, 0);  // invalid opcode in real mode or v8086 mode
 }
 
-static void I386OP(push_i8)(i386_state *cpustate)           // Opcode 0x6a
+void I386_OPS_BASE::I386OP(push_i8)()           // Opcode 0x6a
 {
-       UINT8 value = FETCH(cpustate);
-       PUSH8(cpustate,value);
-       CYCLES(cpustate,CYCLES_PUSH_IMM);
+       UINT8 value = FETCH();
+       PUSH8(value);
+       CYCLES(CYCLES_PUSH_IMM);
 }
 
-static void I386OP(ins_generic)(i386_state *cpustate, int size)
+void I386_OPS_BASE::I386OP(ins_generic)( int size)
 {
        UINT32 ead;
        UINT8 vb;
        UINT16 vw;
        UINT32 vd;
 
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
 
        switch(size) {
        case 1:
-               vb = READPORT8(cpustate, REG16(DX));
-               WRITE8(cpustate,ead, vb);
+               vb = READPORT8( REG16(DX));
+               WRITE8(ead, vb);
                break;
        case 2:
-               vw = READPORT16(cpustate, REG16(DX));
-               WRITE16(cpustate,ead, vw);
+               vw = READPORT16( REG16(DX));
+               WRITE16(ead, vw);
                break;
        case 4:
-               vd = READPORT32(cpustate, REG16(DX));
-               WRITE32(cpustate,ead, vd);
+               vd = READPORT32( REG16(DX));
+               WRITE32(ead, vd);
                break;
        }
 
@@ -1017,25 +1019,25 @@ static void I386OP(ins_generic)(i386_state *cpustate, int size)
                REG32(EDI) += ((cpustate->DF) ? -1 : 1) * size;
        else
                REG16(DI) += ((cpustate->DF) ? -1 : 1) * size;
-       CYCLES(cpustate,CYCLES_INS);    // TODO: Confirm this value
+       CYCLES(CYCLES_INS);    // TODO: Confirm this value
 }
 
-static void I386OP(insb)(i386_state *cpustate)              // Opcode 0x6c
+void I386_OPS_BASE::I386OP(insb)()              // Opcode 0x6c
 {
-       I386OP(ins_generic)(cpustate, 1);
+       I386_OPS_BASE::I386OP(ins_generic)( 1);
 }
 
-static void I386OP(insw)(i386_state *cpustate)              // Opcode 0x6d
+void I386_OPS_BASE::I386OP(insw)()              // Opcode 0x6d
 {
-       I386OP(ins_generic)(cpustate, 2);
+       I386_OPS_BASE::I386OP(ins_generic)( 2);
 }
 
-static void I386OP(insd)(i386_state *cpustate)              // Opcode 0x6d
+void I386_OPS_BASE::I386OP(insd)()              // Opcode 0x6d
 {
-       I386OP(ins_generic)(cpustate, 4);
+       I386_OPS_BASE::I386OP(ins_generic)( 4);
 }
 
-static void I386OP(outs_generic)(i386_state *cpustate, int size)
+void I386_OPS_BASE::I386OP(outs_generic)( int size)
 {
        UINT32 eas;
        UINT8 vb;
@@ -1043,23 +1045,23 @@ static void I386OP(outs_generic)(i386_state *cpustate, int size)
        UINT32 vd;
 
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
        }
 
        switch(size) {
        case 1:
-               vb = READ8(cpustate,eas);
-               WRITEPORT8(cpustate, REG16(DX), vb);
+               vb = READ8(eas);
+               WRITEPORT8( REG16(DX), vb);
                break;
        case 2:
-               vw = READ16(cpustate,eas);
-               WRITEPORT16(cpustate, REG16(DX), vw);
+               vw = READ16(eas);
+               WRITEPORT16( REG16(DX), vw);
                break;
        case 4:
-               vd = READ32(cpustate,eas);
-               WRITEPORT32(cpustate, REG16(DX), vd);
+               vd = READ32(eas);
+               WRITEPORT32( REG16(DX), vd);
                break;
        }
 
@@ -1067,29 +1069,29 @@ static void I386OP(outs_generic)(i386_state *cpustate, int size)
                REG32(ESI) += ((cpustate->DF) ? -1 : 1) * size;
        else
                REG16(SI) += ((cpustate->DF) ? -1 : 1) * size;
-       CYCLES(cpustate,CYCLES_OUTS);   // TODO: Confirm this value
+       CYCLES(CYCLES_OUTS);   // TODO: Confirm this value
 }
 
-static void I386OP(outsb)(i386_state *cpustate)             // Opcode 0x6e
+void I386_OPS_BASE::I386OP(outsb)()             // Opcode 0x6e
 {
-       I386OP(outs_generic)(cpustate, 1);
+       I386_OPS_BASE::I386OP(outs_generic)( 1);
 }
 
-static void I386OP(outsw)(i386_state *cpustate)             // Opcode 0x6f
+void I386_OPS_BASE::I386OP(outsw)()             // Opcode 0x6f
 {
-       I386OP(outs_generic)(cpustate, 2);
+       I386_OPS_BASE::I386OP(outs_generic)( 2);
 }
 
-static void I386OP(outsd)(i386_state *cpustate)             // Opcode 0x6f
+void I386_OPS_BASE::I386OP(outsd)()             // Opcode 0x6f
 {
-       I386OP(outs_generic)(cpustate, 4);
+       I386_OPS_BASE::I386OP(outs_generic)( 4);
 }
 
-static void I386OP(repeat)(i386_state *cpustate, int invert_flag)
+void I386_OPS_BASE::I386OP(repeat)( int invert_flag)
 {
        UINT32 repeated_eip = cpustate->eip;
        UINT32 repeated_pc = cpustate->pc;
-       UINT8 opcode; // = FETCH(cpustate);
+       UINT8 opcode; // = FETCH();
 //  UINT32 eas, ead;
        UINT32 count;
        INT32 cycle_base = 0, cycle_adjustment = 0;
@@ -1100,13 +1102,13 @@ static void I386OP(repeat)(i386_state *cpustate, int invert_flag)
        do {
        repeated_eip = cpustate->eip;
        repeated_pc = cpustate->pc;
-       opcode = FETCH(cpustate);
+       opcode = FETCH();
        switch(opcode) {
                case 0x0f:
                if (invert_flag == 0)
-                       I386OP(decode_three_bytef3)(cpustate); // sse f3 0f
+                       I386_OPS_BASE::I386OP(decode_three_bytef3)(); // sse f3 0f
                else
-                       I386OP(decode_three_bytef2)(cpustate); // sse f2 0f
+                       I386_OPS_BASE::I386OP(decode_three_bytef2)(); // sse f2 0f
                return;
                case 0x26:
                cpustate->segment_override=ES;
@@ -1147,12 +1149,12 @@ static void I386OP(repeat)(i386_state *cpustate, int invert_flag)
 
        if( cpustate->segment_prefix ) {
                // FIXME: the following does not work if both address override and segment override are used
-               i386_translate(cpustate, cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI), -1 );
+               i386_translate( cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI), -1 );
        } else {
                //eas =
-               i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1 );
+               i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1 );
        }
-       i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1 );
+       i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1 );
 
        switch(opcode)
        {
@@ -1215,7 +1217,7 @@ static void I386OP(repeat)(i386_state *cpustate, int invert_flag)
                        break;
 
                case 0x90:
-                       CYCLES(cpustate,CYCLES_NOP);
+                       CYCLES(CYCLES_NOP);
                        return;
 
                case 0xc2: // sigh
@@ -1244,7 +1246,7 @@ static void I386OP(repeat)(i386_state *cpustate, int invert_flag)
                cpustate->pc = repeated_pc;
                try
                {
-                       I386OP(decode_opcode)(cpustate);
+                       I386_OPS_BASE::I386OP(decode_opcode)();
                }
                catch (UINT64 e)
                {
@@ -1271,383 +1273,383 @@ outofcycles:
        if(flag && (invert_flag ? *flag : !*flag))
                return;
        cpustate->eip = cpustate->prev_eip;
-       CHANGE_PC(cpustate,cpustate->eip);
+       CHANGE_PC(cpustate->eip);
        CYCLES_NUM(-cycle_base);
 }
 
-static void I386OP(rep)(i386_state *cpustate)               // Opcode 0xf3
+void I386_OPS_BASE::I386OP(rep)()               // Opcode 0xf3
 {
-       I386OP(repeat)(cpustate, 0);
+       I386_OPS_BASE::I386OP(repeat)( 0);
 }
 
-static void I386OP(repne)(i386_state *cpustate)             // Opcode 0xf2
+void I386_OPS_BASE::I386OP(repne)()             // Opcode 0xf2
 {
-       I386OP(repeat)(cpustate, 1);
+       I386_OPS_BASE::I386OP(repeat)( 1);
 }
 
-static void I386OP(sahf)(i386_state *cpustate)              // Opcode 0x9e
+void I386_OPS_BASE::I386OP(sahf)()              // Opcode 0x9e
 {
-       set_flags(cpustate, (get_flags(cpustate) & 0xffffff00) | (REG8(AH) & 0xd7) );
-       CYCLES(cpustate,CYCLES_SAHF);
+       set_flags( (get_flags() & 0xffffff00) | (REG8(AH) & 0xd7) );
+       CYCLES(CYCLES_SAHF);
 }
 
-static void I386OP(sbb_rm8_r8)(i386_state *cpustate)        // Opcode 0x18
+void I386_OPS_BASE::I386OP(sbb_rm8_r8)()        // Opcode 0x18
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = SBB8(cpustate, dst, src, cpustate->CF);
+               dst = SBB8( dst, src, cpustate->CF);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = SBB8(cpustate, dst, src, cpustate->CF);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = SBB8( dst, src, cpustate->CF);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(sbb_r8_rm8)(i386_state *cpustate)        // Opcode 0x1a
+void I386_OPS_BASE::I386OP(sbb_r8_rm8)()        // Opcode 0x1a
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = SBB8(cpustate, dst, src, cpustate->CF);
+               dst = SBB8( dst, src, cpustate->CF);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = SBB8(cpustate, dst, src, cpustate->CF);
+               dst = SBB8( dst, src, cpustate->CF);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(sbb_al_i8)(i386_state *cpustate)         // Opcode 0x1c
+void I386_OPS_BASE::I386OP(sbb_al_i8)()         // Opcode 0x1c
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = SBB8(cpustate, dst, src, cpustate->CF);
+       dst = SBB8( dst, src, cpustate->CF);
        REG8(EAX) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(scasb)(i386_state *cpustate)             // Opcode 0xae
+void I386_OPS_BASE::I386OP(scasb)()             // Opcode 0xae
 {
        UINT32 eas;
        UINT8 src, dst;
-       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
-       src = READ8(cpustate,eas);
+       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       src = READ8(eas);
        dst = REG8(AL);
-       SUB8(cpustate,dst, src);
-       BUMP_DI(cpustate,1);
-       CYCLES(cpustate,CYCLES_SCAS);
+       SUB8(dst, src);
+       BUMP_DI(1);
+       CYCLES(CYCLES_SCAS);
 }
 
-static void I386OP(setalc)(i386_state *cpustate)            // Opcode 0xd6 (undocumented)
+void I386_OPS_BASE::I386OP(setalc)()            // Opcode 0xd6 (undocumented)
 {
        if( cpustate->CF ) {
                REG8(AL) = 0xff;
        } else {
                REG8(AL) = 0;
        }
-       CYCLES(cpustate,3);
+       CYCLES(3);
 }
 
-static void I386OP(seta_rm8)(i386_state *cpustate)          // Opcode 0x0f 97
+void I386_OPS_BASE::I386OP(seta_rm8)()          // Opcode 0x0f 97
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->CF == 0 && cpustate->ZF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setbe_rm8)(i386_state *cpustate)         // Opcode 0x0f 96
+void I386_OPS_BASE::I386OP(setbe_rm8)()         // Opcode 0x0f 96
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->CF != 0 || cpustate->ZF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setc_rm8)(i386_state *cpustate)          // Opcode 0x0f 92
+void I386_OPS_BASE::I386OP(setc_rm8)()          // Opcode 0x0f 92
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->CF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setg_rm8)(i386_state *cpustate)          // Opcode 0x0f 9f
+void I386_OPS_BASE::I386OP(setg_rm8)()          // Opcode 0x0f 9f
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->ZF == 0 && (cpustate->SF == cpustate->OF) ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setge_rm8)(i386_state *cpustate)         // Opcode 0x0f 9d
+void I386_OPS_BASE::I386OP(setge_rm8)()         // Opcode 0x0f 9d
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if(cpustate->SF == cpustate->OF) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setl_rm8)(i386_state *cpustate)          // Opcode 0x0f 9c
+void I386_OPS_BASE::I386OP(setl_rm8)()          // Opcode 0x0f 9c
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->SF != cpustate->OF ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setle_rm8)(i386_state *cpustate)         // Opcode 0x0f 9e
+void I386_OPS_BASE::I386OP(setle_rm8)()         // Opcode 0x0f 9e
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->ZF != 0 || (cpustate->SF != cpustate->OF) ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setnc_rm8)(i386_state *cpustate)         // Opcode 0x0f 93
+void I386_OPS_BASE::I386OP(setnc_rm8)()         // Opcode 0x0f 93
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->CF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setno_rm8)(i386_state *cpustate)         // Opcode 0x0f 91
+void I386_OPS_BASE::I386OP(setno_rm8)()         // Opcode 0x0f 91
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->OF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setnp_rm8)(i386_state *cpustate)         // Opcode 0x0f 9b
+void I386_OPS_BASE::I386OP(setnp_rm8)()         // Opcode 0x0f 9b
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->PF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setns_rm8)(i386_state *cpustate)         // Opcode 0x0f 99
+void I386_OPS_BASE::I386OP(setns_rm8)()         // Opcode 0x0f 99
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->SF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setnz_rm8)(i386_state *cpustate)         // Opcode 0x0f 95
+void I386_OPS_BASE::I386OP(setnz_rm8)()         // Opcode 0x0f 95
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->ZF == 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(seto_rm8)(i386_state *cpustate)          // Opcode 0x0f 90
+void I386_OPS_BASE::I386OP(seto_rm8)()          // Opcode 0x0f 90
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->OF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setp_rm8)(i386_state *cpustate)          // Opcode 0x0f 9a
+void I386_OPS_BASE::I386OP(setp_rm8)()          // Opcode 0x0f 9a
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->PF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(sets_rm8)(i386_state *cpustate)          // Opcode 0x0f 98
+void I386_OPS_BASE::I386OP(sets_rm8)()          // Opcode 0x0f 98
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->SF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(setz_rm8)(i386_state *cpustate)          // Opcode 0x0f 94
+void I386_OPS_BASE::I386OP(setz_rm8)()          // Opcode 0x0f 94
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 value = 0;
        if( cpustate->ZF != 0 ) {
                value = 1;
        }
        if( modrm >= 0xc0 ) {
                STORE_RM8(modrm, value);
-               CYCLES(cpustate,CYCLES_SETCC_REG);
+               CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               WRITE8(cpustate,ea, value);
-               CYCLES(cpustate,CYCLES_SETCC_MEM);
+               UINT32 ea = GetEA(modrm,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
        }
 }
 
-static void I386OP(stc)(i386_state *cpustate)               // Opcode 0xf9
+void I386_OPS_BASE::I386OP(stc)()               // Opcode 0xf9
 {
        cpustate->CF = 1;
-       CYCLES(cpustate,CYCLES_STC);
+       CYCLES(CYCLES_STC);
 }
 
-static void I386OP(std)(i386_state *cpustate)               // Opcode 0xfd
+void I386_OPS_BASE::I386OP(std)()               // Opcode 0xfd
 {
        cpustate->DF = 1;
-       CYCLES(cpustate,CYCLES_STD);
+       CYCLES(CYCLES_STD);
 }
 
-static void I386OP(sti)(i386_state *cpustate)               // Opcode 0xfb
+void I386_OPS_BASE::I386OP(sti)()               // Opcode 0xfb
 {
        if(PROTECTED_MODE)
        {
@@ -1656,83 +1658,83 @@ static void I386OP(sti)(i386_state *cpustate)               // Opcode 0xfb
                        FAULT(FAULT_GP,0);
        }
        cpustate->delayed_interrupt_enable = 1;  // IF is set after the next instruction.
-       CYCLES(cpustate,CYCLES_STI);
+       CYCLES(CYCLES_STI);
 }
 
-static void I386OP(stosb)(i386_state *cpustate)             // Opcode 0xaa
+void I386_OPS_BASE::I386OP(stosb)()             // Opcode 0xaa
 {
        UINT32 ead;
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
-       WRITE8(cpustate,ead, REG8(AL));
-       BUMP_DI(cpustate,1);
-       CYCLES(cpustate,CYCLES_STOS);
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       WRITE8(ead, REG8(AL));
+       BUMP_DI(1);
+       CYCLES(CYCLES_STOS);
 }
 
-static void I386OP(sub_rm8_r8)(i386_state *cpustate)        // Opcode 0x28
+void I386_OPS_BASE::I386OP(sub_rm8_r8)()        // Opcode 0x28
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = SUB8(cpustate,dst, src);
+               dst = SUB8(dst, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = SUB8(cpustate,dst, src);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = SUB8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(sub_r8_rm8)(i386_state *cpustate)        // Opcode 0x2a
+void I386_OPS_BASE::I386OP(sub_r8_rm8)()        // Opcode 0x2a
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = SUB8(cpustate,dst, src);
+               dst = SUB8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = SUB8(cpustate,dst, src);
+               dst = SUB8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(sub_al_i8)(i386_state *cpustate)         // Opcode 0x2c
+void I386_OPS_BASE::I386OP(sub_al_i8)()         // Opcode 0x2c
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(EAX);
-       dst = SUB8(cpustate,dst, src);
+       dst = SUB8(dst, src);
        REG8(EAX) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(test_al_i8)(i386_state *cpustate)        // Opcode 0xa8
+void I386_OPS_BASE::I386OP(test_al_i8)()        // Opcode 0xa8
 {
-       UINT8 src = FETCH(cpustate);
+       UINT8 src = FETCH();
        UINT8 dst = REG8(AL);
        dst = src & dst;
        SetSZPF8(dst);
        cpustate->CF = 0;
        cpustate->OF = 0;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
-static void I386OP(test_rm8_r8)(i386_state *cpustate)       // Opcode 0x84
+void I386_OPS_BASE::I386OP(test_rm8_r8)()       // Opcode 0x84
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
@@ -1740,303 +1742,303 @@ static void I386OP(test_rm8_r8)(i386_state *cpustate)       // Opcode 0x84
                SetSZPF8(dst);
                cpustate->CF = 0;
                cpustate->OF = 0;
-               CYCLES(cpustate,CYCLES_TEST_REG_REG);
+               CYCLES(CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(modrm,0);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
+               dst = READ8(ea);
                dst = src & dst;
                SetSZPF8(dst);
                cpustate->CF = 0;
                cpustate->OF = 0;
-               CYCLES(cpustate,CYCLES_TEST_REG_MEM);
+               CYCLES(CYCLES_TEST_REG_MEM);
        }
 }
 
-static void I386OP(xchg_r8_rm8)(i386_state *cpustate)       // Opcode 0x86
+void I386_OPS_BASE::I386OP(xchg_r8_rm8)()       // Opcode 0x86
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                UINT8 src = LOAD_RM8(modrm);
                UINT8 dst = LOAD_REG8(modrm);
                STORE_REG8(modrm, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_XCHG_REG_REG);
+               CYCLES(CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               UINT8 src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,1);
+               UINT8 src = READ8(ea);
                UINT8 dst = LOAD_REG8(modrm);
-               WRITE8(cpustate,ea, dst);
+               WRITE8(ea, dst);
                STORE_REG8(modrm, src);
-               CYCLES(cpustate,CYCLES_XCHG_REG_MEM);
+               CYCLES(CYCLES_XCHG_REG_MEM);
        }
 }
 
-static void I386OP(xor_rm8_r8)(i386_state *cpustate)        // Opcode 0x30
+void I386_OPS_BASE::I386OP(xor_rm8_r8)()        // Opcode 0x30
 {
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_REG8(modrm);
                dst = LOAD_RM8(modrm);
-               dst = XOR8(cpustate,dst, src);
+               dst = XOR8(dst, src);
                STORE_RM8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(modrm,1);
                src = LOAD_REG8(modrm);
-               dst = READ8(cpustate,ea);
-               dst = XOR8(cpustate,dst, src);
-               WRITE8(cpustate,ea, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+               dst = READ8(ea);
+               dst = XOR8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
        }
 }
 
-static void I386OP(xor_r8_rm8)(i386_state *cpustate)        // Opcode 0x32
+void I386_OPS_BASE::I386OP(xor_r8_rm8)()        // Opcode 0x32
 {
        UINT32 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if( modrm >= 0xc0 ) {
                src = LOAD_RM8(modrm);
                dst = LOAD_REG8(modrm);
-               dst = XOR8(cpustate,dst, src);
+               dst = XOR8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+               CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               src = READ8(cpustate,ea);
+               UINT32 ea = GetEA(modrm,0);
+               src = READ8(ea);
                dst = LOAD_REG8(modrm);
-               dst = XOR8(cpustate,dst, src);
+               dst = XOR8(dst, src);
                STORE_REG8(modrm, dst);
-               CYCLES(cpustate,CYCLES_ALU_MEM_REG);
+               CYCLES(CYCLES_ALU_MEM_REG);
        }
 }
 
-static void I386OP(xor_al_i8)(i386_state *cpustate)         // Opcode 0x34
+void I386_OPS_BASE::I386OP(xor_al_i8)()         // Opcode 0x34
 {
        UINT8 src, dst;
-       src = FETCH(cpustate);
+       src = FETCH();
        dst = REG8(AL);
-       dst = XOR8(cpustate,dst, src);
+       dst = XOR8(dst, src);
        REG8(AL) = dst;
-       CYCLES(cpustate,CYCLES_ALU_IMM_ACC);
+       CYCLES(CYCLES_ALU_IMM_ACC);
 }
 
 
 
-static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
+void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
 {
        UINT32 ea;
        UINT8 src, dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
 
        switch( (modrm >> 3) & 0x7 )
        {
                case 0:     // ADD Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = ADD8(cpustate,dst, src);
+                               src = FETCH();
+                               dst = ADD8(dst, src);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = ADD8(cpustate,dst, src);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,0);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = ADD8(dst, src);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 1:     // OR Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = OR8(cpustate,dst, src);
+                               src = FETCH();
+                               dst = OR8(dst, src);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = OR8(cpustate,dst, src);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = OR8(dst, src);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 2:     // ADC Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = ADC8(cpustate, dst, src, cpustate->CF);
+                               src = FETCH();
+                               dst = ADC8( dst, src, cpustate->CF);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = ADC8(cpustate, dst, src, cpustate->CF);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = ADC8( dst, src, cpustate->CF);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 3:     // SBB Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = SBB8(cpustate, dst, src, cpustate->CF);
+                               src = FETCH();
+                               dst = SBB8( dst, src, cpustate->CF);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = SBB8(cpustate, dst, src, cpustate->CF);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = SBB8( dst, src, cpustate->CF);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 4:     // AND Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = AND8(cpustate,dst, src);
+                               src = FETCH();
+                               dst = AND8(dst, src);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = AND8(cpustate,dst, src);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = AND8(dst, src);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 5:     // SUB Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = SUB8(cpustate,dst, src);
+                               src = FETCH();
+                               dst = SUB8(dst, src);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = SUB8(cpustate,dst, src);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = SUB8(dst, src);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 6:     // XOR Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               dst = XOR8(cpustate,dst, src);
+                               src = FETCH();
+                               dst = XOR8(dst, src);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_REG);
+                               CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               dst = XOR8(cpustate,dst, src);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_ALU_REG_MEM);
+                               ea = GetEA(modrm,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               dst = XOR8(dst, src);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_ALU_REG_MEM);
                        }
                        break;
                case 7:     // CMP Rm8, i8
                        if( modrm >= 0xc0 ) {
                                dst = LOAD_RM8(modrm);
-                               src = FETCH(cpustate);
-                               SUB8(cpustate,dst, src);
-                               CYCLES(cpustate,CYCLES_CMP_REG_REG);
+                               src = FETCH();
+                               SUB8(dst, src);
+                               CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
-                               dst = READ8(cpustate,ea);
-                               src = FETCH(cpustate);
-                               SUB8(cpustate,dst, src);
-                               CYCLES(cpustate,CYCLES_CMP_REG_MEM);
+                               ea = GetEA(modrm,0);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               SUB8(dst, src);
+                               CYCLES(CYCLES_CMP_REG_MEM);
                        }
                        break;
        }
 }
 
-static void I386OP(groupC0_8)(i386_state *cpustate)         // Opcode 0xc0
+void I386_OPS_BASE::I386OP(groupC0_8)()         // Opcode 0xc0
 {
        UINT8 dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        UINT8 shift;
 
        if( modrm >= 0xc0 ) {
                dst = LOAD_RM8(modrm);
-               shift = FETCH(cpustate) & 0x1f;
-               dst = i386_shift_rotate8(cpustate, modrm, dst, shift);
+               shift = FETCH() & 0x1f;
+               dst = i386_shift_rotate8( modrm, dst, shift);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               dst = READ8(cpustate,ea);
-               shift = FETCH(cpustate) & 0x1f;
-               dst = i386_shift_rotate8(cpustate, modrm, dst, shift);
-               WRITE8(cpustate,ea, dst);
+               UINT32 ea = GetEA(modrm,1);
+               dst = READ8(ea);
+               shift = FETCH() & 0x1f;
+               dst = i386_shift_rotate8( modrm, dst, shift);
+               WRITE8(ea, dst);
        }
 }
 
-static void I386OP(groupD0_8)(i386_state *cpustate)         // Opcode 0xd0
+void I386_OPS_BASE::I386OP(groupD0_8)()         // Opcode 0xd0
 {
        UINT8 dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
 
        if( modrm >= 0xc0 ) {
                dst = LOAD_RM8(modrm);
-               dst = i386_shift_rotate8(cpustate, modrm, dst, 1);
+               dst = i386_shift_rotate8( modrm, dst, 1);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               dst = READ8(cpustate,ea);
-               dst = i386_shift_rotate8(cpustate, modrm, dst, 1);
-               WRITE8(cpustate,ea, dst);
+               UINT32 ea = GetEA(modrm,1);
+               dst = READ8(ea);
+               dst = i386_shift_rotate8( modrm, dst, 1);
+               WRITE8(ea, dst);
        }
 }
 
-static void I386OP(groupD2_8)(i386_state *cpustate)         // Opcode 0xd2
+void I386_OPS_BASE::I386OP(groupD2_8)()         // Opcode 0xd2
 {
        UINT8 dst;
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
 
        if( modrm >= 0xc0 ) {
                dst = LOAD_RM8(modrm);
-               dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL));
+               dst = i386_shift_rotate8( modrm, dst, REG8(CL));
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
-               dst = READ8(cpustate,ea);
-               dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL));
-               WRITE8(cpustate,ea, dst);
+               UINT32 ea = GetEA(modrm,1);
+               dst = READ8(ea);
+               dst = i386_shift_rotate8( modrm, dst, REG8(CL));
+               WRITE8(ea, dst);
        }
 }
 
-static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
+void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
 
        switch( (modrm >> 3) & 0x7 )
        {
                case 0:         /* TEST Rm8, i8 */
                        if( modrm >= 0xc0 ) {
                                UINT8 dst = LOAD_RM8(modrm);
-                               UINT8 src = FETCH(cpustate);
+                               UINT8 src = FETCH();
                                dst &= src;
                                cpustate->CF = cpustate->OF = cpustate->AF = 0;
                                SetSZPF8(dst);
-                               CYCLES(cpustate,CYCLES_TEST_IMM_REG);
+                               CYCLES(CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
-                               UINT8 dst = READ8(cpustate,ea);
-                               UINT8 src = FETCH(cpustate);
+                               UINT32 ea = GetEA(modrm,0);
+                               UINT8 dst = READ8(ea);
+                               UINT8 src = FETCH();
                                dst &= src;
                                cpustate->CF = cpustate->OF = cpustate->AF = 0;
                                SetSZPF8(dst);
-                               CYCLES(cpustate,CYCLES_TEST_IMM_MEM);
+                               CYCLES(CYCLES_TEST_IMM_MEM);
                        }
                        break;
                case 2:         /* NOT Rm8 */
@@ -2044,27 +2046,27 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                UINT8 dst = LOAD_RM8(modrm);
                                dst = ~dst;
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_NOT_REG);
+                               CYCLES(CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
-                               UINT8 dst = READ8(cpustate,ea);
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT8 dst = READ8(ea);
                                dst = ~dst;
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_NOT_MEM);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_NOT_MEM);
                        }
                        break;
                case 3:         /* NEG Rm8 */
                        if( modrm >= 0xc0 ) {
                                UINT8 dst = LOAD_RM8(modrm);
-                               dst = SUB8(cpustate, 0, dst );
+                               dst = SUB8( 0, dst );
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_NEG_REG);
+                               CYCLES(CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
-                               UINT8 dst = READ8(cpustate,ea);
-                               dst = SUB8(cpustate, 0, dst );
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_NEG_MEM);
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT8 dst = READ8(ea);
+                               dst = SUB8( 0, dst );
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_NEG_MEM);
                        }
                        break;
                case 4:         /* MUL AL, Rm8 */
@@ -2073,11 +2075,11 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                UINT8 src, dst;
                                if( modrm >= 0xc0 ) {
                                        src = LOAD_RM8(modrm);
-                                       CYCLES(cpustate,CYCLES_MUL8_ACC_REG);       /* TODO: Correct multiply timing */
+                                       CYCLES(CYCLES_MUL8_ACC_REG);       /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
-                                       src = READ8(cpustate,ea);
-                                       CYCLES(cpustate,CYCLES_MUL8_ACC_MEM);       /* TODO: Correct multiply timing */
+                                       UINT32 ea = GetEA(modrm,0);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_MUL8_ACC_MEM);       /* TODO: Correct multiply timing */
                                }
 
                                dst = REG8(AL);
@@ -2093,11 +2095,11 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                INT16 src, dst;
                                if( modrm >= 0xc0 ) {
                                        src = (INT16)(INT8)LOAD_RM8(modrm);
-                                       CYCLES(cpustate,CYCLES_IMUL8_ACC_REG);      /* TODO: Correct multiply timing */
+                                       CYCLES(CYCLES_IMUL8_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
-                                       src = (INT16)(INT8)READ8(cpustate,ea);
-                                       CYCLES(cpustate,CYCLES_IMUL8_ACC_MEM);      /* TODO: Correct multiply timing */
+                                       UINT32 ea = GetEA(modrm,0);
+                                       src = (INT16)(INT8)READ8(ea);
+                                       CYCLES(CYCLES_IMUL8_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
 
                                dst = (INT16)(INT8)REG8(AL);
@@ -2114,11 +2116,11 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                UINT8 src;
                                if( modrm >= 0xc0 ) {
                                        src = LOAD_RM8(modrm);
-                                       CYCLES(cpustate,CYCLES_DIV8_ACC_REG);
+                                       CYCLES(CYCLES_DIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
-                                       src = READ8(cpustate,ea);
-                                       CYCLES(cpustate,CYCLES_DIV8_ACC_MEM);
+                                       UINT32 ea = GetEA(modrm,0);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_DIV8_ACC_MEM);
                                }
 
                                quotient = (UINT16)REG16(AX);
@@ -2136,7 +2138,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                                        cpustate->CF = 1;
                                        }
                                } else {
-                                       i386_trap(cpustate, 0, 0, 0);
+                                       i386_trap( 0, 0, 0);
                                }
                        }
                        break;
@@ -2146,11 +2148,11 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                UINT8 src;
                                if( modrm >= 0xc0 ) {
                                        src = LOAD_RM8(modrm);
-                                       CYCLES(cpustate,CYCLES_IDIV8_ACC_REG);
+                                       CYCLES(CYCLES_IDIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
-                                       src = READ8(cpustate,ea);
-                                       CYCLES(cpustate,CYCLES_IDIV8_ACC_MEM);
+                                       UINT32 ea = GetEA(modrm,0);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_IDIV8_ACC_MEM);
                                }
 
                                quotient = (INT16)REG16(AX);
@@ -2168,45 +2170,45 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                                        cpustate->CF = 1;
                                        }
                                } else {
-                                       i386_trap(cpustate, 0, 0, 0);
+                                       i386_trap( 0, 0, 0);
                                }
                        }
                        break;
        }
 }
 
-static void I386OP(groupFE_8)(i386_state *cpustate)         // Opcode 0xfe
+void I386_OPS_BASE::I386OP(groupFE_8)()         // Opcode 0xfe
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
 
        switch( (modrm >> 3) & 0x7 )
        {
                case 0:         /* INC Rm8 */
                        if( modrm >= 0xc0 ) {
                                UINT8 dst = LOAD_RM8(modrm);
-                               dst = INC8(cpustate,dst);
+                               dst = INC8(dst);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_INC_REG);
+                               CYCLES(CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
-                               UINT8 dst = READ8(cpustate,ea);
-                               dst = INC8(cpustate,dst);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_INC_MEM);
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT8 dst = READ8(ea);
+                               dst = INC8(dst);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_INC_MEM);
                        }
                        break;
                case 1:         /* DEC Rm8 */
                        if( modrm >= 0xc0 ) {
                                UINT8 dst = LOAD_RM8(modrm);
-                               dst = DEC8(cpustate,dst);
+                               dst = DEC8(dst);
                                STORE_RM8(modrm, dst);
-                               CYCLES(cpustate,CYCLES_DEC_REG);
+                               CYCLES(CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
-                               UINT8 dst = READ8(cpustate,ea);
-                               dst = DEC8(cpustate,dst);
-                               WRITE8(cpustate,ea, dst);
-                               CYCLES(cpustate,CYCLES_DEC_MEM);
+                               UINT32 ea = GetEA(modrm,1);
+                               UINT8 dst = READ8(ea);
+                               dst = DEC8(dst);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_DEC_MEM);
                        }
                        break;
                case 6:         /* PUSH Rm8*/
@@ -2215,74 +2217,74 @@ static void I386OP(groupFE_8)(i386_state *cpustate)         // Opcode 0xfe
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM8(modrm);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
-                                       value = READ8(cpustate,ea);
+                                       UINT32 ea = GetEA(modrm,0);
+                                       value = READ8(ea);
                                }
                                if( cpustate->operand_size ) {
-                                       PUSH32(cpustate,value);
+                                       PUSH32(value);
                                } else {
-                                       PUSH16(cpustate,value);
+                                       PUSH16(value);
                                }
-                               CYCLES(cpustate,CYCLES_PUSH_RM);
+                               CYCLES(CYCLES_PUSH_RM);
                        }
                        break;
                default:
-                       report_invalid_modrm(cpustate, "groupFE_8", modrm);
+                       report_invalid_modrm( "groupFE_8", modrm);
                        break;
        }
 }
 
 
 
-static void I386OP(segment_CS)(i386_state *cpustate)        // Opcode 0x2e
+void I386_OPS_BASE::I386OP(segment_CS)()        // Opcode 0x2e
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = CS;
 
-       I386OP(decode_opcode)(cpustate);
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(segment_DS)(i386_state *cpustate)        // Opcode 0x3e
+void I386_OPS_BASE::I386OP(segment_DS)()        // Opcode 0x3e
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = DS;
-       CYCLES(cpustate,0); // TODO: Specify cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(0); // TODO: Specify cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(segment_ES)(i386_state *cpustate)        // Opcode 0x26
+void I386_OPS_BASE::I386OP(segment_ES)()        // Opcode 0x26
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = ES;
-       CYCLES(cpustate,0); // TODO: Specify cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(0); // TODO: Specify cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(segment_FS)(i386_state *cpustate)        // Opcode 0x64
+void I386_OPS_BASE::I386OP(segment_FS)()        // Opcode 0x64
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = FS;
-       CYCLES(cpustate,1); // TODO: Specify cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(1); // TODO: Specify cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(segment_GS)(i386_state *cpustate)        // Opcode 0x65
+void I386_OPS_BASE::I386OP(segment_GS)()        // Opcode 0x65
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = GS;
-       CYCLES(cpustate,1); // TODO: Specify cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(1); // TODO: Specify cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(segment_SS)(i386_state *cpustate)        // Opcode 0x36
+void I386_OPS_BASE::I386OP(segment_SS)()        // Opcode 0x36
 {
        cpustate->segment_prefix = 1;
        cpustate->segment_override = SS;
-       CYCLES(cpustate,0); // TODO: Specify cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(0); // TODO: Specify cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(operand_size)(i386_state *cpustate)      // Opcode prefix 0x66
+void I386_OPS_BASE::I386OP(operand_size)()      // Opcode prefix 0x66
 {
        if(cpustate->operand_prefix == 0)
        {
@@ -2290,90 +2292,87 @@ static void I386OP(operand_size)(i386_state *cpustate)      // Opcode prefix 0x6
                cpustate->xmm_operand_size ^= 1;
                cpustate->operand_prefix = 1;
        }
-       cpustate->opcode = FETCH(cpustate);
+       cpustate->opcode = FETCH();
        if (cpustate->opcode == 0x0f)
-               I386OP(decode_three_byte66)(cpustate);
+               I386_OPS_BASE::I386OP(decode_three_byte66)();
        else
        {
                if( cpustate->operand_size )
-                       cpustate->opcode_table1_32[cpustate->opcode](cpustate);
+                       cpustate->opcode_table1_32[cpustate->opcode]();
                else
-                       cpustate->opcode_table1_16[cpustate->opcode](cpustate);
+                       cpustate->opcode_table1_16[cpustate->opcode]();
        }
 }
 
-static void I386OP(address_size)(i386_state *cpustate)      // Opcode 0x67
+void I386_OPS_BASE::I386OP(address_size)()      // Opcode 0x67
 {
        if(cpustate->address_prefix == 0)
        {
                cpustate->address_size ^= 1;
                cpustate->address_prefix = 1;
        }
-       I386OP(decode_opcode)(cpustate);
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(nop)(i386_state *cpustate)               // Opcode 0x90
+void I386_OPS_BASE::I386OP(nop)()               // Opcode 0x90
 {
-       CYCLES(cpustate,CYCLES_NOP);
+       CYCLES(CYCLES_NOP);
 }
 
-static void I386OP(int3)(i386_state *cpustate)              // Opcode 0xcc
+void I386_OPS_BASE::I386OP(int3)()              // Opcode 0xcc
 {
-       CYCLES(cpustate,CYCLES_INT3);
+       CYCLES(CYCLES_INT3);
        cpustate->ext = 0; // not an external interrupt
-       i386_trap(cpustate,3, 1, 0);
+       i386_trap(3, 1, 0);
        cpustate->ext = 1;
 }
 
-static void I386OP(int)(i386_state *cpustate)               // Opcode 0xcd
+void I386_OPS_BASE::I386_OPS_BASE::I386OP(int)()               // Opcode 0xcd
 {
-       int interrupt = FETCH(cpustate);
-       CYCLES(cpustate,CYCLES_INT);
-#ifdef I386_PSEUDO_BIOS
-       BIOS_INT(interrupt)
-#endif
+       int interrupt = FETCH();
+       CYCLES(CYCLES_INT);
+       // Without pseudo BIOS.
        cpustate->ext = 0; // not an external interrupt
-       i386_trap(cpustate,interrupt, 1, 0);
+       i386_trap(interrupt, 1, 0);
        cpustate->ext = 1;
 }
 
-static void I386OP(into)(i386_state *cpustate)              // Opcode 0xce
+void I386_OPS_BASE::I386OP(into)()              // Opcode 0xce
 {
        if( cpustate->OF ) {
                cpustate->ext = 0;
-               i386_trap(cpustate,4, 1, 0);
+               i386_trap(4, 1, 0);
                cpustate->ext = 1;
-               CYCLES(cpustate,CYCLES_INTO_OF1);
+               CYCLES(CYCLES_INTO_OF1);
        }
        else
        {
-               CYCLES(cpustate,CYCLES_INTO_OF0);
+               CYCLES(CYCLES_INTO_OF0);
        }
 }
 
-static UINT32 i386_escape_ea;   // hack around GCC 4.6 error because we need the side effects of GetEA()
-static void I386OP(escape)(i386_state *cpustate)            // Opcodes 0xd8 - 0xdf
+void I386_OPS_BASE::I386OP(escape)()            // Opcodes 0xd8 - 0xdf
 {
-       UINT8 modrm = FETCH(cpustate);
+       UINT8 modrm = FETCH();
        if(modrm < 0xc0)
        {
-               i386_escape_ea = GetEA(cpustate,modrm,0);
+               i386_escape_ea = GetEA(modrm,0);
        }
-       CYCLES(cpustate,3); // TODO: confirm this
+       CYCLES(3); // TODO: confirm this
        (void) LOAD_RM8(modrm);
 }
 
-static void I386OP(hlt)(i386_state *cpustate)               // Opcode 0xf4
+void I386_OPS_BASE::I386OP(hlt)()               // Opcode 0xf4
 {
        if(PROTECTED_MODE && cpustate->CPL != 0)
                FAULT(FAULT_GP,0);
        cpustate->halted = 1;
-       CYCLES(cpustate,CYCLES_HLT);
+       CYCLES(CYCLES_HLT);
        if (cpustate->cycles > 0)
                cpustate->cycles = 0;
 }
 
-static void I386OP(decimal_adjust)(i386_state *cpustate, int direction)
+void I386_OPS_BASE::I386OP(decimal_adjust)(int direction)
 {
        UINT8 tmpAL = REG8(AL);
        UINT8 tmpCF = cpustate->CF;
@@ -2398,19 +2397,19 @@ static void I386OP(decimal_adjust)(i386_state *cpustate, int direction)
        SetSZPF8(REG8(AL));
 }
 
-static void I386OP(daa)(i386_state *cpustate)               // Opcode 0x27
+void I386_OPS_BASE::I386OP(daa)()               // Opcode 0x27
 {
-       I386OP(decimal_adjust)(cpustate, +1);
-       CYCLES(cpustate,CYCLES_DAA);
+       I386_OPS_BASE::I386OP(decimal_adjust)( +1);
+       CYCLES(CYCLES_DAA);
 }
 
-static void I386OP(das)(i386_state *cpustate)               // Opcode 0x2f
+void I386_OPS_BASE::I386OP(das)()               // Opcode 0x2f
 {
-       I386OP(decimal_adjust)(cpustate, -1);
-       CYCLES(cpustate,CYCLES_DAS);
+       I386_OPS_BASE::I386OP(decimal_adjust)( -1);
+       CYCLES(CYCLES_DAS);
 }
 
-static void I386OP(aaa)(i386_state *cpustate)               // Opcode 0x37
+void I386_OPS_BASE::I386OP(aaa)()               // Opcode 0x37
 {
        if( ( (REG8(AL) & 0x0f) > 9) || (cpustate->AF != 0) ) {
                REG16(AX) = REG16(AX) + 6;
@@ -2422,10 +2421,10 @@ static void I386OP(aaa)(i386_state *cpustate)               // Opcode 0x37
                cpustate->CF = 0;
        }
        REG8(AL) = REG8(AL) & 0x0f;
-       CYCLES(cpustate,CYCLES_AAA);
+       CYCLES(CYCLES_AAA);
 }
 
-static void I386OP(aas)(i386_state *cpustate)               // Opcode 0x3f
+void I386_OPS_BASE::I386OP(aas)()               // Opcode 0x3f
 {
        if (cpustate->AF || ((REG8(AL) & 0xf) > 9))
        {
@@ -2440,104 +2439,104 @@ static void I386OP(aas)(i386_state *cpustate)               // Opcode 0x3f
                cpustate->CF = 0;
        }
        REG8(AL) &= 0x0f;
-       CYCLES(cpustate,CYCLES_AAS);
+       CYCLES(CYCLES_AAS);
 }
 
-static void I386OP(aad)(i386_state *cpustate)               // Opcode 0xd5
+void I386_OPS_BASE::I386OP(aad)()               // Opcode 0xd5
 {
        UINT8 tempAL = REG8(AL);
        UINT8 tempAH = REG8(AH);
-       UINT8 i = FETCH(cpustate);
+       UINT8 i = FETCH();
 
        REG8(AL) = (tempAL + (tempAH * i)) & 0xff;
        REG8(AH) = 0;
        SetSZPF8( REG8(AL) );
-       CYCLES(cpustate,CYCLES_AAD);
+       CYCLES(CYCLES_AAD);
 }
 
-static void I386OP(aam)(i386_state *cpustate)               // Opcode 0xd4
+void I386_OPS_BASE::I386OP(aam)()               // Opcode 0xd4
 {
        UINT8 tempAL = REG8(AL);
-       UINT8 i = FETCH(cpustate);
+       UINT8 i = FETCH();
 
        if(!i)
        {
-               i386_trap(cpustate, 0, 0, 0);
+               i386_trap( 0, 0, 0);
                return;
        }
        REG8(AH) = tempAL / i;
        REG8(AL) = tempAL % i;
        SetSZPF8( REG8(AL) );
-       CYCLES(cpustate,CYCLES_AAM);
+       CYCLES(CYCLES_AAM);
 }
 
-static void I386OP(clts)(i386_state *cpustate)              // Opcode 0x0f 0x06
+void I386_OPS_BASE::I386OP(clts)()              // Opcode 0x0f 0x06
 {
        // Privileged instruction, CPL must be zero.  Can be used in real or v86 mode.
        if(PROTECTED_MODE && cpustate->CPL != 0)
                FAULT(FAULT_GP,0)
        cpustate->cr[0] &= ~0x08;   /* clear TS bit */
-       CYCLES(cpustate,CYCLES_CLTS);
+       CYCLES(CYCLES_CLTS);
 }
 
-static void I386OP(wait)(i386_state *cpustate)              // Opcode 0x9B
+void I386_OPS_BASE::I386OP(wait)()              // Opcode 0x9B
 {
        // TODO
 }
 
-static void I386OP(lock)(i386_state *cpustate)              // Opcode 0xf0
+void I386_OPS_BASE::I386OP(lock)()              // Opcode 0xf0
 {
        // lock doesn't depend on iopl on 386
        cpustate->lock = true;
-       CYCLES(cpustate,CYCLES_LOCK);       // TODO: Determine correct cycle count
-       I386OP(decode_opcode)(cpustate);
+       CYCLES(CYCLES_LOCK);       // TODO: Determine correct cycle count
+       I386_OPS_BASE::I386OP(decode_opcode)();
 }
 
-static void I386OP(mov_r32_tr)(i386_state *cpustate)        // Opcode 0x0f 24
+void I386_OPS_BASE::I386OP(mov_r32_tr)()        // Opcode 0x0f 24
 {
-       FETCH(cpustate);
-       CYCLES(cpustate,1);     // TODO: correct cycle count
+       FETCH();
+       CYCLES(1);     // TODO: correct cycle count
 }
 
-static void I386OP(mov_tr_r32)(i386_state *cpustate)        // Opcode 0x0f 26
+void I386_OPS_BASE::I386OP(mov_tr_r32)()        // Opcode 0x0f 26
 {
-       FETCH(cpustate);
-       CYCLES(cpustate,1);     // TODO: correct cycle count
+       FETCH();
+       CYCLES(1);     // TODO: correct cycle count
 }
 
-static void I386OP(loadall)(i386_state *cpustate)       // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented
+void I386_OPS_BASE::I386OP(loadall)()       // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented
 {
        fatalerror("i386: LOADALL unimplemented at %08X\n", cpustate->pc - 1);
 }
 
-static void I386OP(invalid)(i386_state *cpustate)
+void I386_OPS_BASE::I386OP(invalid)()
 {
-       report_invalid_opcode(cpustate);
-       i386_trap(cpustate, 6, 0, 0);
+       report_invalid_opcode();
+       i386_trap( 6, 0, 0);
 }
 
-static void I386OP(xlat)(i386_state *cpustate)          // Opcode 0xd7
+void I386_OPS_BASE::I386OP(xlat)()          // Opcode 0xd7
 {
        UINT32 ea;
        if( cpustate->segment_prefix ) {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate(cpustate, cpustate->segment_override, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate( cpustate->segment_override, REG16(BX) + REG8(AL), 0 );
                }
                else
                {
-                       ea = i386_translate(cpustate, cpustate->segment_override, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate( cpustate->segment_override, REG32(EBX) + REG8(AL), 0 );
                }
        } else {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate(cpustate, DS, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate( DS, REG16(BX) + REG8(AL), 0 );
                }
                else
                {
-                       ea = i386_translate(cpustate, DS, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate( DS, REG32(EBX) + REG8(AL), 0 );
                }
        }
-       REG8(AL) = READ8(cpustate,ea);
-       CYCLES(cpustate,CYCLES_XLAT);
+       REG8(AL) = READ8(ea);
+       CYCLES(CYCLES_XLAT);
 }
index bac3b5a..84e3700 100644 (file)
@@ -2,13 +2,73 @@
 // copyright-holders:Ville Linde, Barry Rodewald, Carl, Phil Bennett
 #pragma once
 
-#ifndef __I386_PRIV_H__
-#define __I386_PRIV_H__
+#ifndef __LIB_I386_PRIV_H__
+#define __LIB_I386_PRIV_H__
+
+// Translation intentions
+const int TRANSLATE_TYPE_MASK       = 0x03;     // read write or fetch
+const int TRANSLATE_USER_MASK       = 0x04;     // user mode or fully privileged
+const int TRANSLATE_DEBUG_MASK      = 0x08;     // debug mode (no side effects)
+
+const int TRANSLATE_READ            = 0;        // translate for read
+const int TRANSLATE_WRITE           = 1;        // translate for write
+const int TRANSLATE_FETCH           = 2;        // translate for instruction fetch
+const int TRANSLATE_READ_USER       = (TRANSLATE_READ | TRANSLATE_USER_MASK);
+const int TRANSLATE_WRITE_USER      = (TRANSLATE_WRITE | TRANSLATE_USER_MASK);
+const int TRANSLATE_FETCH_USER      = (TRANSLATE_FETCH | TRANSLATE_USER_MASK);
+const int TRANSLATE_READ_DEBUG      = (TRANSLATE_READ | TRANSLATE_DEBUG_MASK);
+const int TRANSLATE_WRITE_DEBUG     = (TRANSLATE_WRITE | TRANSLATE_DEBUG_MASK);
+const int TRANSLATE_FETCH_DEBUG     = (TRANSLATE_FETCH | TRANSLATE_DEBUG_MASK);
+
+/*****************************************************************************/
+/* src/emu/emucore.h */
+
+// constants for expression endianness
+enum endianness_t
+{
+       ENDIANNESS_LITTLE,
+       ENDIANNESS_BIG
+};
+
+// declare native endianness to be one or the other
+#ifdef LSB_FIRST
+const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_LITTLE;
+#else
+const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG;
+#endif
+// endian-based value: first value is if 'endian' is little-endian, second is if 'endian' is big-endian
+#define ENDIAN_VALUE_LE_BE(endian,leval,beval) (((endian) == ENDIANNESS_LITTLE) ? (leval) : (beval))
+// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian
+#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ENDIAN_VALUE_LE_BE(ENDIANNESS_NATIVE, leval, beval)
+// endian-based value: first value is if 'endian' matches native, second is if 'endian' doesn't match native
+#define ENDIAN_VALUE_NE_NNE(endian,leval,beval)        (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval))
+
+/*****************************************************************************/
+/* src/emu/memory.h */
+
+// address spaces
+enum address_spacenum
+{
+       AS_0,                           // first address space
+       AS_1,                           // second address space
+       AS_2,                           // third address space
+       AS_3,                           // fourth address space
+       ADDRESS_SPACES,                 // maximum number of address spaces
+
+       // alternate address space names for common use
+       AS_PROGRAM = AS_0,              // program address space
+       AS_DATA = AS_1,                 // data address space
+       AS_IO = AS_2                    // I/O address space
+};
+
+// offsets and addresses are 32-bit (for now...)
+typedef UINT32 offs_t;
+
+/*****************************************************************************/
+/* src/osd/osdcomm.h */
 
-//#include "i386.h"
-#include "../../../lib/softfloat/milieu.h"
-#include "../../../lib/softfloat/softfloat.h"
-#include "../vtlb.h"
+/* Highly useful macro for compile-time knowledge of an array size */
+#define ARRAY_LENGTH(x)     (sizeof(x) / sizeof(x[0]))
 
 #include <math.h>