OSDN Git Service

[GENERAL] Merge Upstream 2018-11-23. upstream_20181123
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 23 Nov 2018 19:58:02 +0000 (04:58 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 23 Nov 2018 19:58:02 +0000 (04:58 +0900)
[VM][I386] Merge Upstream 2018-11-23.
[VM][I386] Debugger: Fix get_debug_regs_info().
[VM][I386][FMR50] Fix INT xxh with pseudo-bios.

48 files changed:
source/history.txt
source/src/common.h
source/src/qt/machines/pc9801/MainWindow.cpp
source/src/res/pc9801ra.rc
source/src/res/pc98rl.rc
source/src/vm/common_vm/CMakeLists.txt
source/src/vm/libcpu_newdev/i386.cpp
source/src/vm/libcpu_newdev/libcpu_i386/cycles.h
source/src/vm/libcpu_newdev/libcpu_i386/i386.h
source/src/vm/libcpu_newdev/libcpu_i386/i386_opdef.cpp
source/src/vm/libcpu_newdev/libcpu_i386/i386_opdef.h
source/src/vm/libcpu_newdev/libcpu_i386/i386_ops_table.h
source/src/vm/libcpu_newdev/libcpu_i386/i386_real.h
source/src/vm/libcpu_newdev/libcpu_i386/i386op16.cpp
source/src/vm/libcpu_newdev/libcpu_i386/i386op16_real.cpp
source/src/vm/libcpu_newdev/libcpu_i386/i386op32.cpp
source/src/vm/libcpu_newdev/libcpu_i386/i386ops.cpp
source/src/vm/libcpu_newdev/libcpu_i386/i386ops.h
source/src/vm/libcpu_newdev/libcpu_i386/i386priv.h
source/src/vm/libcpu_newdev/libcpu_i386/i486ops.cpp
source/src/vm/libcpu_newdev/libcpu_i386/pentops.cpp
source/src/vm/libcpu_newdev/libcpu_i386/x87ops.cpp
source/src/vm/mame/emu/cpu/i386/cycles.h
source/src/vm/mame/emu/cpu/i386/i386.c
source/src/vm/mame/emu/cpu/i386/i386.h
source/src/vm/mame/emu/cpu/i386/i386op16.c
source/src/vm/mame/emu/cpu/i386/i386op32.c
source/src/vm/mame/emu/cpu/i386/i386ops.c
source/src/vm/mame/emu/cpu/i386/i386ops.h
source/src/vm/mame/emu/cpu/i386/i386priv.h
source/src/vm/mame/emu/cpu/i386/i486ops.c
source/src/vm/mame/emu/cpu/i386/pentops.c
source/src/vm/mame/emu/cpu/i386/readme_takeda.txt
source/src/vm/mame/emu/cpu/i386/x87ops.c
source/src/vm/pc6001/memory.cpp
source/src/vm/pc6001/memory.h
source/src/vm/pc6001/pc6001.cpp
source/src/vm/pc6001/pc6001.h
source/src/vm/pc6001/psub.cpp
source/src/vm/pc6001/timer.cpp
source/src/vm/pc8801/pc88.cpp
source/src/vm/pc8801/pc88.h
source/src/vm/pc9801/pc9801.cpp
source/src/vm/pc9801/pc9801.h
source/src/vm/pc9801/sasi.cpp
source/src/vm/scsi_dev.cpp
source/src/vm/scsi_host.cpp
source/src/vm/z80_base.cpp

index a357cf6..1662adc 100644 (file)
@@ -1,3 +1,14 @@
+11/23/2018
+
+[VM/I386] improve i386_limit_check to consider data size
+[VM/SCSI_DEV] improve REQ timing just after ACK is raised
+
+[PC6001/*] apply patch for timing issues (thanks Mr.Akikawa)
+[PC8801/PC88] support to change palette for each scan line
+[PC9801] support PC-9801-86 sound board for PC-9801RA and PC-98RL
+[PC9801/FMSOUND] fix process_state
+
+
 10/14/2018
 
 [COMMON/FILEIO] improve functions to load/save state file for big-endian
index 19ce321..88e5370 100644 (file)
@@ -1255,7 +1255,6 @@ inline void ConvertByteToMonochromeUint8Cond(uint8_t src, uint8_t* dst, _bit_tra
        uint16_vec8_t   tmpd;
        uint16_vec8_t*  vt = (uint16_vec8_t*)__builtin_assume_aligned(&(tbl->plane_table[0]), sizeof(uint16_vec8_t));
 
-       __DECL_ALIGNED(16) uint8_t d[16];
        tmpd = vt[src];
 __DECL_VECTORIZED_LOOP
        for(int i = 0; i < 8; i++) {
index eba9d31..dcdee0c 100644 (file)
@@ -68,13 +68,23 @@ void META_MainWindow::retranslateUi(void)
 #endif
 #ifdef USE_SOUND_TYPE
        menuSoundDevice->setTitle(QApplication::translate("MainWindow", "Sound Card", 0));
+#if defined(SUPPORT_PC98_OPNA)
+       actionSoundDevice[0]->setText(QApplication::translate("MainWindow", "PC-9801-86 (BIOS Enabled)", 0));
+       actionSoundDevice[1]->setText(QApplication::translate("MainWindow", "PC-9801-86 (BIOS Disabled)", 0));
+#else
        actionSoundDevice[0]->setText(QApplication::translate("MainWindow", "PC-9801-26 (BIOS Enabled)", 0));
        actionSoundDevice[1]->setText(QApplication::translate("MainWindow", "PC-9801-26 (BIOS Disabled)", 0));
+#endif 
        actionSoundDevice[2]->setText(QApplication::translate("MainWindow", "PC-9801-14 (BIOS Enabled)", 0));
        actionSoundDevice[3]->setText(QApplication::translate("MainWindow", "PC-9801-14 (BIOS Disabled)", 0));
        actionSoundDevice[4]->setText(QApplication::translate("MainWindow", "None", 0));
+#if defined(SUPPORT_PC98_OPNA)
+       actionSoundDevice[0]->setToolTip(QApplication::translate("MainWindow", "PC-9801-86 sound board has connected.\nThis uses YAMAHA YM-2608 OPNA synthesizer chip.\nOn board BIOS is enabled.", 0));
+       actionSoundDevice[1]->setToolTip(QApplication::translate("MainWindow", "PC-9801-86 sound board has connected.\nThis uses YAMAHA YM-2608 OPNA synthesizer chip.\nOn board BIOS is disabled.", 0));
+#else
        actionSoundDevice[0]->setToolTip(QApplication::translate("MainWindow", "PC-9801-26 sound board has connected.\nThis uses YAMAHA YM-2203 OPN synthesizer chip.\nOn board BIOS is enabled.", 0));
        actionSoundDevice[1]->setToolTip(QApplication::translate("MainWindow", "PC-9801-26 sound board has connected.\nThis uses YAMAHA YM-2203 OPN synthesizer chip.\nOn board BIOS is disabled.", 0));
+#endif
        actionSoundDevice[2]->setToolTip(QApplication::translate("MainWindow", "PC-9801-14 sound board has connected.\nThis uses TI TMS3631-RI104 synthesizer chip.\nOn board BIOS is enabled.", 0));
        actionSoundDevice[3]->setToolTip(QApplication::translate("MainWindow", "PC-9801-14 sound board has connected.\nThis uses TI TMS3631-RI104 synthesizer chip.\nOn board BIOS is disabled.", 0));
        actionSoundDevice[4]->setToolTip(QApplication::translate("MainWindow", "None sound devices has connected.", 0));
index ea5326a..62f5bc2 100644 (file)
@@ -289,7 +289,7 @@ IDI_ICON1               ICON    DISCARDABLE     "pc9801ra.ico"
 // Dialog
 //
 
-IDD_VOLUME DIALOG DISCARDABLE  0, 0, 250, 180
+IDD_VOLUME DIALOG DISCARDABLE  0, 0, 250, 240
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Volume"
 FONT 9, "MS PGothic"
@@ -309,8 +309,14 @@ BEGIN
     LTEXT           "Sound Device #5",IDC_VOLUME_CAPTION4,6,126,60,8
     CONTROL         "",IDC_VOLUME_PARAM_L4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,126,175,12
     CONTROL         "",IDC_VOLUME_PARAM_R4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,141,175,12
-    DEFPUSHBUTTON   "OK",IDOK,70,160,50,14
-    DEFPUSHBUTTON   "Reset",IDC_VOLUME_RESET,130,160,50,14
+    LTEXT           "Sound Device #6",IDC_VOLUME_CAPTION5,6,156,60,8
+    CONTROL         "",IDC_VOLUME_PARAM_L5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,156,175,12
+    CONTROL         "",IDC_VOLUME_PARAM_R5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,171,175,12
+    LTEXT           "Sound Device #7",IDC_VOLUME_CAPTION6,6,186,60,8
+    CONTROL         "",IDC_VOLUME_PARAM_L6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,186,175,12
+    CONTROL         "",IDC_VOLUME_PARAM_R6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,201,175,12
+    DEFPUSHBUTTON   "OK",IDOK,70,220,50,14
+    DEFPUSHBUTTON   "Reset",IDC_VOLUME_RESET,130,220,50,14
 END
 
 IDD_JOYSTICK DIALOG DISCARDABLE  0, 0, 175, 120
index e6e8321..f22782f 100644 (file)
@@ -289,7 +289,7 @@ IDI_ICON1               ICON    DISCARDABLE     "pc98rl.ico"
 // Dialog
 //
 
-IDD_VOLUME DIALOG DISCARDABLE  0, 0, 250, 180
+IDD_VOLUME DIALOG DISCARDABLE  0, 0, 250, 240
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Volume"
 FONT 9, "MS PGothic"
@@ -309,8 +309,14 @@ BEGIN
     LTEXT           "Sound Device #5",IDC_VOLUME_CAPTION4,6,126,60,8
     CONTROL         "",IDC_VOLUME_PARAM_L4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,126,175,12
     CONTROL         "",IDC_VOLUME_PARAM_R4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,141,175,12
-    DEFPUSHBUTTON   "OK",IDOK,70,160,50,14
-    DEFPUSHBUTTON   "Reset",IDC_VOLUME_RESET,130,160,50,14
+    LTEXT           "Sound Device #6",IDC_VOLUME_CAPTION5,6,156,60,8
+    CONTROL         "",IDC_VOLUME_PARAM_L5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,156,175,12
+    CONTROL         "",IDC_VOLUME_PARAM_R5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,171,175,12
+    LTEXT           "Sound Device #7",IDC_VOLUME_CAPTION6,6,186,60,8
+    CONTROL         "",IDC_VOLUME_PARAM_L6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,186,175,12
+    CONTROL         "",IDC_VOLUME_PARAM_R6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,201,175,12
+    DEFPUSHBUTTON   "OK",IDOK,70,220,50,14
+    DEFPUSHBUTTON   "Reset",IDC_VOLUME_RESET,130,220,50,14
 END
 
 IDD_JOYSTICK DIALOG DISCARDABLE  0, 0, 175, 120
index e372ceb..b1b57a1 100644 (file)
@@ -1,6 +1,6 @@
 message("* vm/common_vm")
 
-SET(THIS_LIB_VERSION 2.4.0)
+SET(THIS_LIB_VERSION 2.4.1)
 
 #include(cotire)
 set(s_vm_common_vm_srcs
index aab5146..2e29ada 100644 (file)
@@ -195,13 +195,15 @@ void I386::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
        i386_state *cpustate = cpucore->get_cpu_state();
 //#if defined(USE_DEBUGGER)
        my_stprintf_s(buffer, buffer_len,
-       _T("AX=%04X  BX=%04X CX=%04X DX=%04X SP=%04X  BP=%04X  SI=%04X  DI=%04X\nDS=%04X  ES=%04X SS=%04X CS=%04X IP=%04X  FLAG=[%c%c%c%c%c%c%c%c%c]\nClocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"),
-         cpustate->sreg[DS].selector, cpustate->sreg[ES].selector, cpustate->sreg[SS].selector, cpustate->sreg[CS].selector, cpustate->eip,
-         cpustate->OF ? _T('O') : _T('-'), cpustate->DF ? _T('D') : _T('-'), cpustate->IF ? _T('I') : _T('-'), cpustate->TF ? _T('T') : _T('-'),
-         cpustate->SF ? _T('S') : _T('-'), cpustate->ZF ? _T('Z') : _T('-'), cpustate->AF ? _T('A') : _T('-'), cpustate->PF ? _T('P') : _T('-'),
-       cpustate->CF ? _T('C') : _T('-'),
+                                 _T("Privilege Level=[%02x] MODE=%s V86=%s STACK_32BIT=%08x\nEAX=%08X  EBX=%08X ECX=%08X EDX=%08X \nESP=%08X EBP=%08X  ESI=%08X  EDI=%08X\nDS=%04X  ES=%04X SS=%04X CS=%04X EIP=%08X\nFLAG=[%c%c%c%c%c%c%c%c%c]\nClocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"),
+  cpustate->CPL, (PROTECTED_MODE == 0) ? _T("REAL") : _T("PROTECTED"), (V8086_MODE) ? _T("YES") : _T("NO"),
+  STACK_32BIT, 
+       REG32(EAX), REG32(EBX), REG32(ECX), REG32(EDX), REG32(ESP), REG32(EBP), REG32(ESI), REG32(EDI),
+       cpustate->sreg[DS].selector, cpustate->sreg[ES].selector, cpustate->sreg[SS].selector, cpustate->sreg[CS].selector, cpustate->eip,
+       cpustate->OF ? _T('O') : _T('-'), cpustate->DF ? _T('D') : _T('-'), cpustate->IF ? _T('I') : _T('-'), cpustate->TF ? _T('T') : _T('-'),
+       cpustate->SF ? _T('S') : _T('-'), cpustate->ZF ? _T('Z') : _T('-'), cpustate->AF ? _T('A') : _T('-'), cpustate->PF ? _T('P') : _T('-'), cpustate->CF ? _T('C') : _T('-'),
        cpustate->total_cycles, cpustate->total_cycles - cpustate->prev_total_cycles,
-       get_passed_clock_since_vline(), get_cur_vline_clocks(), get_cur_vline(), get_lines_per_frame());
+    get_passed_clock_since_vline(), get_cur_vline_clocks(), get_cur_vline(), get_lines_per_frame());
        cpustate->prev_total_cycles = cpustate->total_cycles;
 //#endif
 }
index 75974aa..a538411 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 
 #pragma once
 
index 0e007d9..64b65fc 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #pragma once
 
 #ifndef __I386INTF_H__
index 52d6405..ce8fc20 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Phil Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 /*
     Intel 386 emulator
 
@@ -374,12 +374,12 @@ UINT32 I386_OPS_BASE::GetNonTranslatedEA(UINT8 modrm,UINT8 *seg)
        return ea;
 }
 
-UINT32 I386_OPS_BASE::GetEA(UINT8 modrm, int rwn)
+UINT32 I386_OPS_BASE::GetEA(UINT8 modrm, int rwn, UINT32 size)
 {
        UINT8 segment;
        UINT32 ea;
        modrm_to_EA(modrm, &ea, &segment );
-       return i386_translate(segment, ea, rwn );
+       return i386_translate(segment, ea, rwn, size );
 }
 
 /* Check segment register for validity when changing privilege level after an RETF */
@@ -430,14 +430,14 @@ void I386_OPS_BASE::i386_check_sreg_validity(int reg)
        }
 }
 
-int I386_OPS_BASE::i386_limit_check( int seg, UINT32 offset)
+int I386_OPS_BASE::i386_limit_check( int seg, UINT32 offset, UINT32 size)
 {
        if(PROTECTED_MODE && !V8086_MODE)
        {
                if((cpustate->sreg[seg].flags & 0x0018) == 0x0010 && cpustate->sreg[seg].flags & 0x0004) // if expand-down data segment
                {
                        // compare if greater then 0xffffffff when we're passed the access size
-                       if((offset <= cpustate->sreg[seg].limit) || ((cpustate->sreg[seg].d)?0:(offset > 0xffff)))
+                       if((offset <= cpustate->sreg[seg].limit) || ((cpustate->sreg[seg].d)?0:((offset + size - 1) > 0xffff)))
                        {
                                logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x (expand-down)\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset);
                                return 1;
@@ -445,7 +445,7 @@ int I386_OPS_BASE::i386_limit_check( int seg, UINT32 offset)
                }
                else
                {
-                       if(offset > cpustate->sreg[seg].limit)
+                       if((offset + size - 1) > cpustate->sreg[seg].limit)
                        {
                                logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset);
                                return 1;
@@ -1603,7 +1603,7 @@ void I386_OPS_BASE::i386_protected_mode_call( UINT16 seg, UINT32 off, int indire
                if (operand32 != 0)  // if 32-bit
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) - 8 : (REG16(SP) - 8) & 0xffff);
-                       if(i386_limit_check(SS, offset))
+                       if(i386_limit_check(SS, offset, 8))
                        {
                                logerror("CALL (%08x): Stack has no room for return address.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)  // #SS(0)
@@ -1612,7 +1612,7 @@ void I386_OPS_BASE::i386_protected_mode_call( UINT16 seg, UINT32 off, int indire
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) - 4 : (REG16(SP) - 4) & 0xffff);
-                       if(i386_limit_check(SS, offset))
+                       if(i386_limit_check(SS, offset, 4))
                        {
                                logerror("CALL (%08x): Stack has no room for return address.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)  // #SS(0)
@@ -1863,7 +1863,7 @@ void I386_OPS_BASE::i386_protected_mode_call( UINT16 seg, UINT32 off, int indire
                                        if (operand32 != 0)  // if 32-bit
                                        {
                                                UINT32 stkoff = (STACK_32BIT ? REG32(ESP) - 8 : (REG16(SP) - 8) & 0xffff);
-                                               if(i386_limit_check(SS, stkoff))
+                                               if(i386_limit_check(SS, stkoff, 8))
                                                {
                                                        logerror("CALL: Stack has no room for return address.\n");
                                                        FAULT(FAULT_SS,0) // #SS(0)
@@ -1874,7 +1874,7 @@ void I386_OPS_BASE::i386_protected_mode_call( UINT16 seg, UINT32 off, int indire
                                        else
                                        {
                                                UINT32 stkoff = (STACK_32BIT ? REG32(ESP) - 4 : (REG16(SP) - 4) & 0xffff);
-                                               if(i386_limit_check(SS, stkoff))
+                                               if(i386_limit_check(SS, stkoff, 4))
                                                {
                                                        logerror("CALL: Stack has no room for return address.\n");
                                                        FAULT(FAULT_SS,0) // #SS(0)
@@ -1992,7 +1992,7 @@ void I386_OPS_BASE::i386_protected_mode_retf(UINT8 count, UINT8 operand32)
        I386_SREG desc;
        UINT8 CPL, RPL, DPL;
 
-       UINT32 ea = i386_translate(SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0);
+       UINT32 ea = i386_translate(SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0, (operand32!=0) ? 8 : 4);
 
        if(operand32 == 0)
        {
@@ -2076,7 +2076,7 @@ void I386_OPS_BASE::i386_protected_mode_retf(UINT8 count, UINT8 operand32)
                if(operand32 == 0)
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(SS,offset+count+3) != 0)
+                       if(i386_limit_check(SS, offset, count + 4) != 0)
                        {
                                logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)
@@ -2085,7 +2085,7 @@ void I386_OPS_BASE::i386_protected_mode_retf(UINT8 count, UINT8 operand32)
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(SS,offset+count+7) != 0)
+                       if(i386_limit_check(SS, offset, count + 8) != 0)
                        {
                                logerror("RETF: ESP is past stack segment limit.\n");
                                FAULT(FAULT_SS,0)
@@ -2103,7 +2103,7 @@ void I386_OPS_BASE::i386_protected_mode_retf(UINT8 count, UINT8 operand32)
                if(operand32 == 0)
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(SS,offset+count+7) != 0)
+                       if(i386_limit_check(SS, offset, count + 8) != 0)
                        {
                                logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)
@@ -2112,7 +2112,7 @@ void I386_OPS_BASE::i386_protected_mode_retf(UINT8 count, UINT8 operand32)
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(SS,offset+count+15) != 0)
+                       if(i386_limit_check(SS, offset, count + 16) != 0)
                        {
                                logerror("RETF: ESP is past stack segment limit.\n");
                                FAULT(FAULT_SS,0)
@@ -2267,7 +2267,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
        UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1);
 
        CPL = cpustate->CPL;
-       UINT32 ea = i386_translate(SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0);
+       UINT32 ea = i386_translate(SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0, (operand32 != 0) ? 12 : 6);
        if(operand32 == 0)
        {
                newEIP = READ16(ea) & 0xffff;
@@ -2383,7 +2383,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                        if(operand32 == 0)
                        {
                                UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                               if(i386_limit_check(SS,offset+3) != 0)
+                               if(i386_limit_check(SS, offset, 4) != 0)
                                {
                                        logerror("IRET: Data on stack is past SS limit.\n");
                                        FAULT(FAULT_SS,0)
@@ -2392,7 +2392,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                        else
                        {
                                UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                               if(i386_limit_check(SS,offset+7) != 0)
+                               if(i386_limit_check(SS, offset, 8) != 0)
                                {
                                        logerror("IRET: Data on stack is past SS limit.\n");
                                        FAULT(FAULT_SS,0)
@@ -2410,7 +2410,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                                if(operand32 == 0)
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(SS,offset+5) != 0)
+                                       if(i386_limit_check(SS, offset, 6) != 0)
                                        {
                                                logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc);
                                                FAULT(FAULT_SS,0)
@@ -2419,7 +2419,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                                else
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(SS,offset+11) != 0)
+                                       if(i386_limit_check(SS, offset, 12) != 0)
                                        {
                                                logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc);
                                                FAULT(FAULT_SS,0)
@@ -2515,7 +2515,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                                if(operand32 == 0)
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(SS,offset+9) != 0)
+                                       if(i386_limit_check(SS, offset, 10) != 0)
                                        {
                                                logerror("IRET: SP is past SS limit.\n");
                                                FAULT(FAULT_SS,0)
@@ -2524,7 +2524,7 @@ void I386_OPS_BASE::i386_protected_mode_iret(int operand32)
                                else
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(SS,offset+19) != 0)
+                                       if(i386_limit_check(SS, offset, 20) != 0)
                                        {
                                                logerror("IRET: ESP is past SS limit.\n");
                                                FAULT(FAULT_SS,0)
@@ -3041,7 +3041,7 @@ bool I386_OPS_BASE::process_state(FILEIO *state_fio, bool loading)
 
        
        process_state_GPR(&cpustate->reg, state_fio);
-       for(int i = 0; i < array_length(cpustate->sreg); i++) {
+       for(int i = 0; i < (int)array_length(cpustate->sreg); i++) {
                process_state_SREG(&cpustate->sreg[i], state_fio);
        }
        state_fio->StateValue(cpustate->eip);
index b3e63be..bfc970d 100644 (file)
@@ -578,7 +578,7 @@ public:
        virtual void i386_trap_with_error(int irq, int irq_gate, int trap_level, UINT32 error);
        void i386_set_irq_line(int irqline, int state);
        void i386_set_a20_line(int state);
-       int i386_limit_check( int seg, UINT32 offset);
+       int i386_limit_check( int seg, UINT32 offset, UINT32 size);
        void i386_vtlb_free(void);
        void i386_free_state(void);
 
@@ -667,7 +667,7 @@ protected:
        void modrm_to_EA(UINT8 mod_rm, UINT32* out_ea, UINT8* out_segment);
        
        UINT32 GetNonTranslatedEA(UINT8 modrm,UINT8 *seg);
-       UINT32 GetEA(UINT8 modrm, int rwn);
+       UINT32 GetEA(UINT8 modrm, int rwn, UINT32 size);
 
        // 
        void i386_check_sreg_validity(int reg);
@@ -1215,7 +1215,7 @@ public:
        void I386OP_D(address_size)();      // Opcode 0x67
        void I386OP_D(nop)();               // Opcode 0x90
        void I386OP_D(int3)();              // Opcode 0xcc
-       void I386OP_D(int)();               // Opcode 0xcd
+       virtual void I386OP_D(_int)();               // Opcode 0xcd
        void I386OP_D(into)();              // Opcode 0xce
        void I386OP_D(escape)();            // Opcodes 0xd8 - 0xdf
        void I386OP_D(hlt)();               // Opcode 0xf4
@@ -1759,7 +1759,7 @@ protected:
        //
        INLINE vtlb_entry get_permissions(UINT32 pte, int wp);
        INLINE int translate_address(int pl, int type, UINT32 *address, UINT32 *error);
-       INLINE UINT32 i386_translate(int segment, UINT32 ip, int rwn);
+       INLINE UINT32 i386_translate(int segment, UINT32 ip, int rwn, UINT32 size);
        
        INLINE UINT8 FETCH();
        INLINE UINT16 FETCH16();
@@ -1916,14 +1916,14 @@ INLINE void I386_OPS_BASE::CYCLES_RM(int modrm, int r, int m)
 }
 
 
-INLINE UINT32 I386_OPS_BASE::i386_translate(int segment, UINT32 ip, int rwn)
+INLINE UINT32 I386_OPS_BASE::i386_translate(int segment, UINT32 ip, int rwn, UINT32 size)
 {
        // TODO: segment limit access size, execution permission, handle exception thrown from exception handler
        if(PROTECTED_MODE && !V8086_MODE && (rwn != -1))
        {
                if(!(cpustate->sreg[segment].valid))
                        FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0);
-               if(i386_limit_check(segment, ip))
+               if(i386_limit_check(segment, ip, size))
                        FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0);
                if((rwn == 0) && ((cpustate->sreg[segment].flags & 8) && !(cpustate->sreg[segment].flags & 2)))
                        FAULT_THROW(FAULT_GP, 0);
@@ -1991,7 +1991,7 @@ INLINE int I386_OPS_BASE::translate_address(int pl, int type, UINT32 *address, U
 
 INLINE void I386_OPS_BASE::CHANGE_PC(UINT32 pc)
 {
-       cpustate->pc = i386_translate(CS, pc, -1 );
+       cpustate->pc = i386_translate(CS, pc, -1, 1 );
 }
 
 INLINE void I386_OPS_BASE::NEAR_BRANCH(INT32 offs)
@@ -2228,7 +2228,7 @@ INLINE void I386_OPS_BASE::WRITE32(UINT32 ea, UINT32 value)
                if(!translate_address(cpustate->CPL,TRANSLATE_WRITE,&address,&error))
                        PF_THROW(error);
 
-               ea &= cpustate->a20_mask;
+               address &= cpustate->a20_mask;
                cpustate->program->write_data32(address, value);
        }
 }
@@ -2250,7 +2250,7 @@ INLINE void I386_OPS_BASE::WRITE64(UINT32 ea, UINT64 value)
                if(!translate_address(cpustate->CPL,TRANSLATE_WRITE,&address,&error))
                        PF_THROW(error);
 
-               ea &= cpustate->a20_mask;
+               address &= cpustate->a20_mask;
                cpustate->program->write_data32(address+0, value & 0xffffffff);
                cpustate->program->write_data32(address+4, (value >> 32) & 0xffffffff);
        }
@@ -2449,12 +2449,12 @@ INLINE void I386_OPS_BASE::PUSH16(UINT16 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 2;
-               ea = i386_translate( SS, new_esp, 1);
+               ea = i386_translate( SS, new_esp, 1, 2);
                WRITE16( ea, value );
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 2) & 0xffff;
-               ea = i386_translate( SS, new_esp, 1);
+               ea = i386_translate( SS, new_esp, 1, 2);
                WRITE16( ea, value );
                REG16(SP) = new_esp;
        }
@@ -2464,12 +2464,12 @@ INLINE void I386_OPS_BASE::PUSH32(UINT32 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 4;
-               ea = i386_translate( SS, new_esp, 1);
+               ea = i386_translate( SS, new_esp, 1, 4);
                WRITE32( ea, value );
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 4) & 0xffff;
-               ea = i386_translate( SS, new_esp, 1);
+               ea = i386_translate( SS, new_esp, 1, 4);
                WRITE32( ea, value );
                REG16(SP) = new_esp;
        }
@@ -2480,13 +2480,23 @@ INLINE void I386_OPS_BASE::PUSH32SEG(UINT32 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 4;
-               ea = i386_translate(SS, new_esp, 1);
-               ((cpustate->cpu_version & 0xf00) == 0x300) ? WRITE16(ea, value) : WRITE32(ea, value ); // 486 also?
+               if( (cpustate->cpu_version & 0xf00) == 0x300 ) {
+                       ea = i386_translate(SS, new_esp, 1, 2);
+                       WRITE16(ea, value); // 486 also?
+               } else {
+                       ea = i386_translate(SS, new_esp, 1, 4);
+                       WRITE32(ea, value ); // 486 also?
+               }
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 4) & 0xffff;
-               ea = i386_translate(SS, new_esp, 1);
-               ((cpustate->cpu_version & 0xf00) == 0x300) ? WRITE16(ea, value) : WRITE32(ea, value );
+               if( (cpustate->cpu_version & 0xf00) == 0x300 ) {
+                       ea = i386_translate(SS, new_esp, 1, 2);
+                       WRITE16(ea, value);
+               } else {
+                       ea = i386_translate(SS, new_esp, 1, 4);
+                       WRITE32(ea, value );
+               }
                REG16(SP) = new_esp;
        }
 }
@@ -2506,12 +2516,12 @@ INLINE UINT8 I386_OPS_BASE::POP8()
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 1;
-               ea = i386_translate( SS, new_esp - 1, 0);
+               ea = i386_translate( SS, new_esp - 1, 0, 1);
                value = READ8( ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 1;
-               ea = i386_translate( SS, (new_esp - 1) & 0xffff, 0);
+               ea = i386_translate( SS, (new_esp - 1) & 0xffff, 0, 1);
                value = READ8( ea );
                REG16(SP) = new_esp;
        }
@@ -2524,12 +2534,12 @@ INLINE UINT16 I386_OPS_BASE::POP16()
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 2;
-               ea = i386_translate( SS, new_esp - 2, 0);
+               ea = i386_translate( SS, new_esp - 2, 0, 2);
                value = READ16( ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 2;
-               ea = i386_translate( SS, (new_esp - 2) & 0xffff, 0);
+               ea = i386_translate( SS, (new_esp - 2) & 0xffff, 0, 2);
                value = READ16( ea );
                REG16(SP) = new_esp;
        }
@@ -2541,12 +2551,12 @@ INLINE UINT32 I386_OPS_BASE::POP32()
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 4;
-               ea = i386_translate( SS, new_esp - 4, 0);
+               ea = i386_translate( SS, new_esp - 4, 0, 4);
                value = READ32( ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 4;
-               ea = i386_translate( SS, (new_esp - 4) & 0xffff, 0);
+               ea = i386_translate( SS, (new_esp - 4) & 0xffff, 0, 4);
                value = READ32( ea );
                REG16(SP) = new_esp;
        }
index 1c2349b..886baa5 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Phil Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 
 #ifndef __LIB_I386_OPS_TABLE_H__
 #define __LIB_I386_OPS_TABLE_H__
@@ -216,7 +216,7 @@ const X86_OPCODE x86_opcode_table[] =
        { 0xCA,     OP_I386,                    &I386_OPS_BASE::i386_retf_i16,               &I386_OPS_BASE::i386_retf_i32,           false},
        { 0xCB,     OP_I386,                    &I386_OPS_BASE::i386_retf16,                 &I386_OPS_BASE::i386_retf32,             false},
        { 0xCC,     OP_I386,                    &I386_OPS_BASE::i386_int3,                   &I386_OPS_BASE::i386_int3,               false},
-       { 0xCD,     OP_I386,                    &I386_OPS_BASE::i386_int,                    &I386_OPS_BASE::i386_int,                false},
+       { 0xCD,     OP_I386,                    &I386_OPS_BASE::i386__int,                    &I386_OPS_BASE::i386__int,                false},
        { 0xCE,     OP_I386,                    &I386_OPS_BASE::i386_into,                   &I386_OPS_BASE::i386_into,               false},
        { 0xCF,     OP_I386,                    &I386_OPS_BASE::i386_iret16,                 &I386_OPS_BASE::i386_iret32,             false},
        { 0xD0,     OP_I386,                    &I386_OPS_BASE::i386_groupD0_8,              &I386_OPS_BASE::i386_groupD0_8,          false},
index a4b55b4..b7e1c4d 100644 (file)
@@ -18,9 +18,10 @@ public:
        int cpu_execute_i386(int cycles);
        void i386_trap(int irq, int irq_gate, int trap_level);
        void i386_trap_with_error(int irq, int irq_gate, int trap_level, UINT32 error);
-       void i386_call_abs16();        // Opcode 0x9a
-       void i386_call_rel16();        // Opcode 0xe8
-       void i386_groupFF_16();        // Opcode 0xff
+       void i386__int();               // Opcode 0xcd
+       void i386_call_abs16();         // Opcode 0x9a
+       void i386_call_rel16();         // Opcode 0xe8
+       void i386_groupFF_16();         // Opcode 0xff
        void i386_decode_opcode();
        //void build_opcode_table(UINT32 features);
        i386_state *i386_common_init(int tlbsize);
index 06cbc2e..df4f2aa 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #include "./i386_opdef.h"
 
 #define FAULT(fault,error) {cpustate->ext = 1; i386_trap_with_error(fault,0,0,error); return;}
@@ -158,7 +158,7 @@ void I386_OPS_BASE::I386OP(adc_rm16_r16)()      // Opcode 0x11
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = ADC16( dst, src, cpustate->CF);
@@ -178,7 +178,7 @@ void I386_OPS_BASE::I386OP(adc_r16_rm16)()      // Opcode 0x13
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = ADC16( dst, src, cpustate->CF);
@@ -208,7 +208,7 @@ void I386_OPS_BASE::I386OP(add_rm16_r16)()      // Opcode 0x01
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = ADD16(dst, src);
@@ -228,7 +228,7 @@ void I386_OPS_BASE::I386OP(add_r16_rm16)()      // Opcode 0x03
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = ADD16(dst, src);
@@ -258,7 +258,7 @@ void I386_OPS_BASE::I386OP(and_rm16_r16)()      // Opcode 0x21
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = AND16(dst, src);
@@ -278,7 +278,7 @@ void I386_OPS_BASE::I386OP(and_r16_rm16)()      // Opcode 0x23
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = AND16(dst, src);
@@ -305,7 +305,7 @@ void I386_OPS_BASE::I386OP(bsf_r16_rm16)()      // Opcode 0x0f bc
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
        }
 
@@ -334,7 +334,7 @@ void I386_OPS_BASE::I386OP(bsr_r16_rm16)()      // Opcode 0x0f bd
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
        }
 
@@ -374,7 +374,7 @@ void I386_OPS_BASE::I386OP(bt_rm16_r16)()       // Opcode 0x0f a3
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),0);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff), 0, 2);
                bit %= 16;
                UINT16 dst = READ16(ea);
 
@@ -407,7 +407,7 @@ void I386_OPS_BASE::I386OP(btc_rm16_r16)()      // Opcode 0x0f bb
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1, 2);
                bit %= 16;
                UINT16 dst = READ16(ea);
 
@@ -442,7 +442,7 @@ void I386_OPS_BASE::I386OP(btr_rm16_r16)()      // Opcode 0x0f b3
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1, 2);
                bit %= 16;
                UINT16 dst = READ16(ea);
 
@@ -477,7 +477,7 @@ void I386_OPS_BASE::I386OP(bts_rm16_r16)()      // Opcode 0x0f ab
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1, 2);
                bit %= 16;
                UINT16 dst = READ16(ea);
 
@@ -548,7 +548,7 @@ void I386_OPS_BASE::I386OP(cmp_rm16_r16)()      // Opcode 0x39
                SUB16(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                SUB16(dst, src);
@@ -566,7 +566,7 @@ void I386_OPS_BASE::I386OP(cmp_r16_rm16)()      // Opcode 0x3b
                SUB16(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                SUB16(dst, src);
@@ -588,11 +588,11 @@ void I386_OPS_BASE::I386OP(cmpsw)()             // Opcode 0xa7
        UINT32 eas, ead;
        UINT16 src, dst;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 2 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 2 );
        src = READ16(eas);
        dst = READ16(ead);
        SUB16(src,dst);
@@ -668,7 +668,7 @@ void I386_OPS_BASE::I386OP(imul_r16_rm16)()     // Opcode 0x0f af
                src = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(CYCLES_IMUL16_REG_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = (INT32)(INT16)READ16(ea);
                CYCLES(CYCLES_IMUL16_REG_MEM);     /* TODO: Correct multiply timing */
        }
@@ -690,7 +690,7 @@ void I386_OPS_BASE::I386OP(imul_r16_rm16_i16)() // Opcode 0x69
                dst = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(CYCLES_IMUL16_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                dst = (INT32)(INT16)READ16(ea);
                CYCLES(CYCLES_IMUL16_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -712,7 +712,7 @@ void I386_OPS_BASE::I386OP(imul_r16_rm16_i8)()  // Opcode 0x6b
                dst = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(CYCLES_IMUL16_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                dst = (INT32)(INT16)READ16(ea);
                CYCLES(CYCLES_IMUL16_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -1220,9 +1220,9 @@ void I386_OPS_BASE::I386OP(lodsw)()             // Opcode 0xad
 {
        UINT32 eas;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 2 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        }
        REG16(AX) = READ16(eas);
        BUMP_SI(2);
@@ -1292,19 +1292,25 @@ void I386_OPS_BASE::I386OP(mov_rm16_r16)()      // Opcode 0x89
                STORE_RM16(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
+#if 0          
                // NEC PC-9801RA's ITF routine intentionally raise general protection fault :-(
                int segment = DS;
                if( cpustate->segment_prefix ) {
                        segment = cpustate->segment_override;
                }
-               if( i386_limit_check(segment, (ea + 1) & 0xffff) == 0 ) {
+               if( i386_limit_check(segment, (ea + 1) & 0xffff, 2) == 0 ) {
                        src = READ16(ea);
                        STORE_REG16(modrm, src);
                } else {
                        FAULT(FAULT_GP, 0)
                }
                CYCLES(CYCLES_MOV_MEM_REG);
+#else
+               src = LOAD_REG16(modrm);
+               WRITE16(ea, src);
+               CYCLES(CYCLES_MOV_REG_MEM);
+#endif         
        }
 }
 
@@ -1317,7 +1323,7 @@ void I386_OPS_BASE::I386OP(mov_r16_rm16)()      // Opcode 0x8b
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOV_MEM_REG);
@@ -1332,7 +1338,7 @@ void I386_OPS_BASE::I386OP(mov_rm16_i16)()      // Opcode 0xc7
                STORE_RM16(modrm, value);
                CYCLES(CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 value = FETCH16();
                WRITE16(ea, value);
                CYCLES(CYCLES_MOV_IMM_MEM);
@@ -1349,9 +1355,9 @@ void I386_OPS_BASE::I386OP(mov_ax_m16)()        // Opcode 0xa1
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 0 );
+               ea = i386_translate( cpustate->segment_override, offset, 0, 2);
        } else {
-               ea = i386_translate( DS, offset, 0 );
+               ea = i386_translate( DS, offset, 0, 2 );
        }
        REG16(AX) = READ16(ea);
        CYCLES(CYCLES_MOV_MEM_ACC);
@@ -1367,9 +1373,9 @@ void I386_OPS_BASE::I386OP(mov_m16_ax)()        // Opcode 0xa3
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 1 );
+               ea = i386_translate( cpustate->segment_override, offset, 1, 2);
        } else {
-               ea = i386_translate( DS, offset, 1 );
+               ea = i386_translate( DS, offset, 1, 2);
        }
        WRITE16( ea, REG16(AX) );
        CYCLES(CYCLES_MOV_ACC_MEM);
@@ -1428,11 +1434,11 @@ void I386_OPS_BASE::I386OP(movsw)()             // Opcode 0xa5
        UINT32 eas, ead;
        UINT16 v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 2);
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2);
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 2 );
        v = READ16(eas);
        WRITE16(ead, v);
        BUMP_SI(2);
@@ -1448,7 +1454,7 @@ void I386_OPS_BASE::I386OP(movsx_r16_rm8)()     // Opcode 0x0f be
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 1);
                INT16 src = (INT8)READ8(ea);
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOVSX_MEM_REG);
@@ -1463,7 +1469,7 @@ void I386_OPS_BASE::I386OP(movzx_r16_rm8)()     // Opcode 0x0f b6
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 1);
                UINT16 src = (UINT8)READ8(ea);
                STORE_REG16(modrm, src);
                CYCLES(CYCLES_MOVZX_MEM_REG);
@@ -1481,7 +1487,7 @@ void I386_OPS_BASE::I386OP(or_rm16_r16)()       // Opcode 0x09
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = OR16(dst, src);
@@ -1501,7 +1507,7 @@ void I386_OPS_BASE::I386OP(or_r16_rm16)()       // Opcode 0x0b
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = OR16(dst, src);
@@ -1539,7 +1545,7 @@ void I386_OPS_BASE::I386OP(out_ax_dx)()         // Opcode 0xef
 void I386_OPS_BASE::I386OP(pop_ax)()            // Opcode 0x58
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(AX) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1549,7 +1555,7 @@ void I386_OPS_BASE::I386OP(pop_ax)()            // Opcode 0x58
 void I386_OPS_BASE::I386OP(pop_cx)()            // Opcode 0x59
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(CX) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1559,7 +1565,7 @@ void I386_OPS_BASE::I386OP(pop_cx)()            // Opcode 0x59
 void I386_OPS_BASE::I386OP(pop_dx)()            // Opcode 0x5a
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(DX) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1569,7 +1575,7 @@ void I386_OPS_BASE::I386OP(pop_dx)()            // Opcode 0x5a
 void I386_OPS_BASE::I386OP(pop_bx)()            // Opcode 0x5b
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(BX) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1579,7 +1585,7 @@ void I386_OPS_BASE::I386OP(pop_bx)()            // Opcode 0x5b
 void I386_OPS_BASE::I386OP(pop_sp)()            // Opcode 0x5c
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(SP) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1589,7 +1595,7 @@ void I386_OPS_BASE::I386OP(pop_sp)()            // Opcode 0x5c
 void I386_OPS_BASE::I386OP(pop_bp)()            // Opcode 0x5d
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(BP) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1599,7 +1605,7 @@ void I386_OPS_BASE::I386OP(pop_bp)()            // Opcode 0x5d
 void I386_OPS_BASE::I386OP(pop_si)()            // Opcode 0x5e
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(SI) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1609,7 +1615,7 @@ void I386_OPS_BASE::I386OP(pop_si)()            // Opcode 0x5e
 void I386_OPS_BASE::I386OP(pop_di)()            // Opcode 0x5f
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset+1, 2) == 0)
                REG16(DI) = POP16();
        else
                FAULT(FAULT_SS,0)
@@ -1621,9 +1627,9 @@ bool I386_OPS_BASE::I386OP(pop_seg16)( int segment)
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
        UINT16 value;
        bool fault;
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
        {
-               ea = i386_translate( SS, offset, 0);
+               ea = i386_translate( SS, offset, 0, 2);
                value = READ16( ea);
                i386_sreg_load(value, segment, &fault);
                if(fault) return false;
@@ -1678,7 +1684,7 @@ void I386_OPS_BASE::I386OP(pop_rm16)()          // Opcode 0x8f
        UINT16 value;
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
 
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
        {
                UINT32 temp_sp = REG32(ESP);
                value = POP16();
@@ -1686,7 +1692,7 @@ void I386_OPS_BASE::I386OP(pop_rm16)()          // Opcode 0x8f
                if( modrm >= 0xc0 ) {
                        STORE_RM16(modrm, value);
                } else {
-                       ea = GetEA(modrm,1);
+                       ea = GetEA(modrm,1, 2);
                        try
                        {
                                WRITE16(ea, value);
@@ -1707,7 +1713,7 @@ void I386_OPS_BASE::I386OP(popa)()              // Opcode 0x61
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
 
-       if(i386_limit_check(SS,offset+15) == 0)
+       if(i386_limit_check(SS,offset ,16) == 0)
        {
                REG16(DI) = POP16();
                REG16(SI) = POP16();
@@ -1749,7 +1755,7 @@ void I386_OPS_BASE::I386OP(popf)()              // Opcode 0x9d
                mask &= ~0x00003000;  // IOPL cannot be changed while in V8086 mode
        }
 
-       if(i386_limit_check(SS,offset+1) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
        {
                value = POP16();
                set_flags((current & ~mask) | (value & mask));  // mask out reserved bits
@@ -1766,7 +1772,7 @@ void I386_OPS_BASE::I386OP(push_ax)()           // Opcode 0x50
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(AX) );
        else
                FAULT(FAULT_SS,0)
@@ -1780,7 +1786,7 @@ void I386_OPS_BASE::I386OP(push_cx)()           // Opcode 0x51
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(CX) );
        else
                FAULT(FAULT_SS,0)
@@ -1794,7 +1800,7 @@ void I386_OPS_BASE::I386OP(push_dx)()           // Opcode 0x52
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(DX) );
        else
                FAULT(FAULT_SS,0)
@@ -1808,7 +1814,7 @@ void I386_OPS_BASE::I386OP(push_bx)()           // Opcode 0x53
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(BX) );
        else
                FAULT(FAULT_SS,0)
@@ -1822,7 +1828,7 @@ void I386_OPS_BASE::I386OP(push_sp)()           // Opcode 0x54
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(SP) );
        else
                FAULT(FAULT_SS,0)
@@ -1836,7 +1842,7 @@ void I386_OPS_BASE::I386OP(push_bp)()           // Opcode 0x55
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(BP) );
        else
                FAULT(FAULT_SS,0)
@@ -1850,7 +1856,7 @@ void I386_OPS_BASE::I386OP(push_si)()           // Opcode 0x56
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(SI) );
        else
                FAULT(FAULT_SS,0)
@@ -1864,7 +1870,7 @@ void I386_OPS_BASE::I386OP(push_di)()           // Opcode 0x57
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( REG16(DI) );
        else
                FAULT(FAULT_SS,0)
@@ -1878,7 +1884,7 @@ void I386_OPS_BASE::I386OP(push_cs16)()         // Opcode 0x0e
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[CS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1892,7 +1898,7 @@ void I386_OPS_BASE::I386OP(push_ds16)()         // Opcode 0x1e
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[DS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1906,7 +1912,7 @@ void I386_OPS_BASE::I386OP(push_es16)()         // Opcode 0x06
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[ES].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1920,7 +1926,7 @@ void I386_OPS_BASE::I386OP(push_fs16)()         // Opcode 0x0f a0
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[FS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1934,7 +1940,7 @@ void I386_OPS_BASE::I386OP(push_gs16)()         // Opcode 0x0f a8
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[GS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1948,7 +1954,7 @@ void I386_OPS_BASE::I386OP(push_ss16)()         // Opcode 0x16
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( cpustate->sreg[SS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1963,7 +1969,7 @@ void I386_OPS_BASE::I386OP(push_i16)()          // Opcode 0x68
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16(value);
        else
                FAULT(FAULT_SS,0)
@@ -1978,7 +1984,7 @@ void I386_OPS_BASE::I386OP(pusha)()             // Opcode 0x60
                offset = REG32(ESP) - 16;
        else
                offset = (REG16(SP) - 16) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 16) == 0)
        {
                PUSH16( REG16(AX) );
                PUSH16( REG16(CX) );
@@ -2001,7 +2007,7 @@ void I386_OPS_BASE::I386OP(pushf)()             // Opcode 0x9c
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 2) == 0)
                PUSH16( get_flags() & 0xffff );
        else
                FAULT(FAULT_SS,0)
@@ -2035,7 +2041,7 @@ void I386_OPS_BASE::I386OP(sbb_rm16_r16)()      // Opcode 0x19
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = SBB16( dst, src, cpustate->CF);
@@ -2055,7 +2061,7 @@ void I386_OPS_BASE::I386OP(sbb_r16_rm16)()      // Opcode 0x1b
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = SBB16( dst, src, cpustate->CF);
@@ -2078,7 +2084,7 @@ void I386_OPS_BASE::I386OP(scasw)()             // Opcode 0xaf
 {
        UINT32 eas;
        UINT16 src, dst;
-       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 2);
        src = READ16(eas);
        dst = REG16(AX);
        SUB16(dst, src);
@@ -2110,7 +2116,7 @@ void I386_OPS_BASE::I386OP(shld16_i8)()         // Opcode 0x0f a4
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 dst = READ16(ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = FETCH();
@@ -2155,7 +2161,7 @@ void I386_OPS_BASE::I386OP(shld16_cl)()         // Opcode 0x0f a5
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 dst = READ16(ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = REG8(CL);
@@ -2200,7 +2206,7 @@ void I386_OPS_BASE::I386OP(shrd16_i8)()         // Opcode 0x0f ac
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 dst = READ16(ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = FETCH();
@@ -2245,7 +2251,7 @@ void I386_OPS_BASE::I386OP(shrd16_cl)()         // Opcode 0x0f ad
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 dst = READ16(ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = REG8(CL);
@@ -2270,7 +2276,7 @@ void I386_OPS_BASE::I386OP(shrd16_cl)()         // Opcode 0x0f ad
 void I386_OPS_BASE::I386OP(stosw)()             // Opcode 0xab
 {
        UINT32 ead;
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 2);
        WRITE16(ead, REG16(AX));
        BUMP_DI(2);
        CYCLES(CYCLES_STOS);
@@ -2287,7 +2293,7 @@ void I386_OPS_BASE::I386OP(sub_rm16_r16)()      // Opcode 0x29
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = SUB16(dst, src);
@@ -2307,7 +2313,7 @@ void I386_OPS_BASE::I386OP(sub_r16_rm16)()      // Opcode 0x2b
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = SUB16(dst, src);
@@ -2350,7 +2356,7 @@ void I386_OPS_BASE::I386OP(test_rm16_r16)()     // Opcode 0x85
                cpustate->OF = 0;
                CYCLES(CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = src & dst;
@@ -2434,7 +2440,7 @@ void I386_OPS_BASE::I386OP(xchg_r16_rm16)()     // Opcode 0x87
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                UINT16 src = READ16(ea);
                UINT16 dst = LOAD_REG16(modrm);
                STORE_REG16(modrm, src);
@@ -2454,7 +2460,7 @@ void I386_OPS_BASE::I386OP(xor_rm16_r16)()      // Opcode 0x31
                STORE_RM16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                src = LOAD_REG16(modrm);
                dst = READ16(ea);
                dst = XOR16(dst, src);
@@ -2474,7 +2480,7 @@ void I386_OPS_BASE::I386OP(xor_r16_rm16)()      // Opcode 0x33
                STORE_REG16(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                src = READ16(ea);
                dst = LOAD_REG16(modrm);
                dst = XOR16(dst, src);
@@ -2511,7 +2517,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = ADD16(dst, src);
@@ -2527,7 +2533,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = OR16(dst, src);
@@ -2543,7 +2549,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = ADC16( dst, src, cpustate->CF);
@@ -2559,7 +2565,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = SBB16( dst, src, cpustate->CF);
@@ -2575,7 +2581,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = AND16(dst, src);
@@ -2591,7 +2597,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = SUB16(dst, src);
@@ -2607,7 +2613,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                dst = XOR16(dst, src);
@@ -2622,7 +2628,7 @@ void I386_OPS_BASE::I386OP(group81_16)()        // Opcode 0x81
                                SUB16(dst, src);
                                CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0, 2);
                                dst = READ16(ea);
                                src = FETCH16();
                                SUB16(dst, src);
@@ -2648,7 +2654,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = ADD16(dst, src);
@@ -2664,7 +2670,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = OR16(dst, src);
@@ -2680,7 +2686,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = ADC16( dst, src, cpustate->CF);
@@ -2696,7 +2702,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = ((UINT16)(INT16)(INT8)FETCH());
                                dst = SBB16( dst, src, cpustate->CF);
@@ -2712,7 +2718,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = AND16(dst, src);
@@ -2728,7 +2734,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = SUB16(dst, src);
@@ -2744,7 +2750,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                dst = XOR16(dst, src);
@@ -2759,7 +2765,7 @@ void I386_OPS_BASE::I386OP(group83_16)()        // Opcode 0x83
                                SUB16(dst, src);
                                CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0, 2);
                                dst = READ16(ea);
                                src = (UINT16)(INT16)(INT8)FETCH();
                                SUB16(dst, src);
@@ -2781,7 +2787,7 @@ void I386_OPS_BASE::I386OP(groupC1_16)()        // Opcode 0xc1
                dst = i386_shift_rotate16( modrm, dst, shift);
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                dst = READ16(ea);
                shift = FETCH() & 0x1f;
                dst = i386_shift_rotate16( modrm, dst, shift);
@@ -2799,7 +2805,7 @@ void I386_OPS_BASE::I386OP(groupD1_16)()        // Opcode 0xd1
                dst = i386_shift_rotate16( modrm, dst, 1);
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                dst = READ16(ea);
                dst = i386_shift_rotate16( modrm, dst, 1);
                WRITE16(ea, dst);
@@ -2816,7 +2822,7 @@ void I386_OPS_BASE::I386OP(groupD3_16)()        // Opcode 0xd3
                dst = i386_shift_rotate16( modrm, dst, REG8(CL));
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 2);
                dst = READ16(ea);
                dst = i386_shift_rotate16( modrm, dst, REG8(CL));
                WRITE16(ea, dst);
@@ -2838,7 +2844,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                SetSZPF16(dst);
                                CYCLES(CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,0);
+                               UINT32 ea = GetEA(modrm,0, 2);
                                UINT16 dst = READ16(ea);
                                UINT16 src = FETCH16();
                                dst &= src;
@@ -2854,7 +2860,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = ~dst;
                                WRITE16(ea, dst);
@@ -2868,7 +2874,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = SUB16( 0, dst );
                                WRITE16(ea, dst);
@@ -2883,7 +2889,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_MUL16_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        src = READ16(ea);
                                        CYCLES(CYCLES_MUL16_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2904,7 +2910,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                        src = (INT32)(INT16)LOAD_RM16(modrm);
                                        CYCLES(CYCLES_IMUL16_ACC_REG);     /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        src = (INT32)(INT16)READ16(ea);
                                        CYCLES(CYCLES_IMUL16_ACC_MEM);     /* TODO: Correct multiply timing */
                                }
@@ -2926,7 +2932,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_DIV16_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        src = READ16(ea);
                                        CYCLES(CYCLES_DIV16_ACC_MEM);
                                }
@@ -2958,7 +2964,7 @@ void I386_OPS_BASE::I386OP(groupF7_16)()        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_IDIV16_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        src = READ16(ea);
                                        CYCLES(CYCLES_IDIV16_ACC_MEM);
                                }
@@ -2998,7 +3004,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = INC16(dst);
                                WRITE16(ea, dst);
@@ -3012,7 +3018,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = DEC16(dst);
                                WRITE16(ea, dst);
@@ -3026,7 +3032,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
@@ -3044,7 +3050,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 4);
                                        address = READ16(ea + 0);
                                        selector = READ16(ea + 2);
                                        CYCLES(CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
@@ -3072,7 +3078,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
                                }
@@ -3090,7 +3096,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 4);
                                        address = READ16(ea + 0);
                                        selector = READ16(ea + 2);
                                        CYCLES(CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
@@ -3115,7 +3121,7 @@ void I386_OPS_BASE::I386OP(groupFF_16)()        // Opcode 0xff
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM16(modrm);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        value = READ16(ea);
                                }
                                PUSH16(value);
@@ -3144,7 +3150,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        STORE_RM16(modrm, cpustate->ldtr.segment);
                                        CYCLES(CYCLES_SLDT_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1, 2);
                                        WRITE16( ea, cpustate->ldtr.segment);
                                        CYCLES(CYCLES_SLDT_MEM);
                                }
@@ -3161,7 +3167,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        STORE_RM16(modrm, cpustate->task.segment);
                                        CYCLES(CYCLES_STR_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1, 2);
                                        WRITE16( ea, cpustate->task.segment);
                                        CYCLES(CYCLES_STR_MEM);
                                }
@@ -3181,7 +3187,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        cpustate->ldtr.segment = address;
                                        CYCLES(CYCLES_LLDT_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 2);
                                        cpustate->ldtr.segment = READ16(ea);
                                        CYCLES(CYCLES_LLDT_MEM);
                                }
@@ -3208,7 +3214,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        cpustate->task.segment = address;
                                        CYCLES(CYCLES_LTR_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 2);
                                        cpustate->task.segment = READ16(ea);
                                        CYCLES(CYCLES_LTR_MEM);
                                }
@@ -3238,7 +3244,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_VERR_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_VERR_MEM);
                                }
@@ -3286,7 +3292,7 @@ void I386_OPS_BASE::I386OP(group0F00_16)()          // Opcode 0x0f 00
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_VERW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_VERW_MEM);
                                }
@@ -3339,9 +3345,9 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( CS, address, 1 );
+                                       ea = i386_translate( CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1, 6);
                                }
                                WRITE16(ea, cpustate->gdtr.limit);
                                WRITE32(ea + 2, cpustate->gdtr.base);
@@ -3353,11 +3359,11 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( CS, address, 1 );
+                                       ea = i386_translate( CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1, 6);
                                }
                                WRITE16(ea, cpustate->idtr.limit);
                                WRITE32(ea + 2, cpustate->idtr.base);
@@ -3370,9 +3376,9 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( CS, address, 0 );
+                                       ea = i386_translate( CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 6);
                                }
                                cpustate->gdtr.limit = READ16(ea);
                                cpustate->gdtr.base = READ32(ea + 2) & 0xffffff;
@@ -3385,9 +3391,9 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( CS, address, 0 );
+                                       ea = i386_translate( CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 6);
                                }
                                cpustate->idtr.limit = READ16(ea);
                                cpustate->idtr.base = READ32(ea + 2) & 0xffffff;
@@ -3400,7 +3406,7 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                                        STORE_RM16(modrm, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1, 2);
                                        WRITE16(ea, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_MEM);
                                }
@@ -3415,7 +3421,7 @@ void I386_OPS_BASE::I386OP(group0F01_16)()      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0, 2);
                                        CYCLES(CYCLES_LMSW_MEM);
                                b = READ16(ea);
                                }
@@ -3449,7 +3455,7 @@ void I386_OPS_BASE::I386OP(group0FBA_16)()      // Opcode 0x0f ba
 
                                CYCLES(CYCLES_BT_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,0);
+                               UINT32 ea = GetEA(modrm,0, 2);
                                UINT16 dst = READ16(ea);
                                UINT8 bit = FETCH();
 
@@ -3475,7 +3481,7 @@ void I386_OPS_BASE::I386OP(group0FBA_16)()      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_BTS_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                UINT8 bit = FETCH();
 
@@ -3503,7 +3509,7 @@ void I386_OPS_BASE::I386OP(group0FBA_16)()      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_BTR_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                UINT8 bit = FETCH();
 
@@ -3531,7 +3537,7 @@ void I386_OPS_BASE::I386OP(group0FBA_16)()      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_BTC_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                UINT8 bit = FETCH();
 
@@ -3567,7 +3573,7 @@ void I386_OPS_BASE::I386OP(lar_r16_rm16)()  // Opcode 0x0f 0x02
                }
                else
                {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm,0, 2);
                        seg.selector = READ16(ea);
                        CYCLES(CYCLES_LAR_MEM);
                }
@@ -3633,7 +3639,7 @@ void I386_OPS_BASE::I386OP(lsl_r16_rm16)()  // Opcode 0x0f 0x03
                }
                else
                {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm,0, 2);
                        seg.selector = READ16(ea);
                }
                if(seg.selector == 0)
@@ -3694,7 +3700,7 @@ void I386_OPS_BASE::I386OP(bound_r16_m16_m16)() // Opcode 0x62
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                low = READ16(ea + 0);
                high = READ16(ea + 2);
        }
@@ -3758,7 +3764,7 @@ bool I386_OPS_BASE::I386OP(load_far_pointer16)(int s)
                i386_trap(6, 0, 0);
                return false;
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                STORE_REG16(modrm, READ16(ea + 0));
                selector = READ16(ea + 2);
                i386_sreg_load(selector,s,NULL);
index 70c9aa8..acac5c1 100644 (file)
@@ -94,7 +94,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = INC16(dst);
                                WRITE16(ea, dst);
@@ -108,7 +108,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1, 2);
                                UINT16 dst = READ16(ea);
                                dst = DEC16(dst);
                                WRITE16(ea, dst);
@@ -122,7 +122,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
@@ -140,7 +140,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 4);
                                        address = READ16(ea + 0);
                                        selector = READ16(ea + 2);
                                        CYCLES(CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
@@ -171,7 +171,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
                                }
@@ -189,7 +189,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 4);
                                        address = READ16(ea + 0);
                                        selector = READ16(ea + 2);
                                        CYCLES(CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
@@ -214,7 +214,7 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM16(modrm);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0, 2);
                                        value = READ16(ea);
                                }
                                PUSH16(value);
@@ -226,3 +226,16 @@ void I386_OPS::i386_groupFF_16()        // Opcode 0xff
                        break;
        }
 }
+
+void I386_OPS::i386__int()               // Opcode 0xcd
+{
+       int interrupt = FETCH();
+       CYCLES(CYCLES_INT);
+
+#ifdef I386_PSEUDO_BIOS
+       BIOS_INT(interrupt)
+#endif
+       cpustate->ext = 0; // not an external interrupt
+       i386_trap(interrupt, 1, 0);
+       cpustate->ext = 1;
+}
index f63f6d3..2b140ab 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #include "./i386_opdef.h"
 #include "./i386ops.h"
 
@@ -138,7 +138,7 @@ void I386_OPS_BASE::I386OP(adc_rm32_r32)()      // Opcode 0x11
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = ADC32( dst, src, cpustate->CF);
@@ -158,7 +158,7 @@ void I386_OPS_BASE::I386OP(adc_r32_rm32)()      // Opcode 0x13
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = ADC32( dst, src, cpustate->CF);
@@ -188,7 +188,7 @@ void I386_OPS_BASE::I386OP(add_rm32_r32)()      // Opcode 0x01
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = ADD32(dst, src);
@@ -208,7 +208,7 @@ void I386_OPS_BASE::I386OP(add_r32_rm32)()      // Opcode 0x03
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = ADD32(dst, src);
@@ -238,7 +238,7 @@ void I386_OPS_BASE::I386OP(and_rm32_r32)()      // Opcode 0x21
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = AND32(dst, src);
@@ -258,7 +258,7 @@ void I386_OPS_BASE::I386OP(and_r32_rm32)()      // Opcode 0x23
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = AND32(dst, src);
@@ -285,7 +285,7 @@ void I386_OPS_BASE::I386OP(bsf_r32_rm32)()      // Opcode 0x0f bc
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
        }
 
@@ -314,7 +314,7 @@ void I386_OPS_BASE::I386OP(bsr_r32_rm32)()      // Opcode 0x0f bd
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
        }
 
@@ -353,7 +353,7 @@ void I386_OPS_BASE::I386OP(bt_rm32_r32)()       // Opcode 0x0f a3
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),0);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),0,4);
                bit %= 32;
                UINT32 dst = READ32(ea);
 
@@ -386,7 +386,7 @@ void I386_OPS_BASE::I386OP(btc_rm32_r32)()      // Opcode 0x0f bb
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(ea);
 
@@ -421,7 +421,7 @@ void I386_OPS_BASE::I386OP(btr_rm32_r32)()      // Opcode 0x0f b3
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(ea);
 
@@ -456,7 +456,7 @@ void I386_OPS_BASE::I386OP(bts_rm32_r32)()      // Opcode 0x0f ab
                UINT32 ea = GetNonTranslatedEA(modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(ea);
 
@@ -522,7 +522,7 @@ void I386_OPS_BASE::I386OP(cmp_rm32_r32)()      // Opcode 0x39
                SUB32(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                SUB32(dst, src);
@@ -540,7 +540,7 @@ void I386_OPS_BASE::I386OP(cmp_r32_rm32)()      // Opcode 0x3b
                SUB32(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                SUB32(dst, src);
@@ -561,11 +561,11 @@ void I386_OPS_BASE::I386OP(cmpsd)()             // Opcode 0xa7
 {
        UINT32 eas, ead, src, dst;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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,4 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0,4 );
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0,4 );
        src = READ32(eas);
        dst = READ32(ead);
        SUB32(src,dst);
@@ -637,7 +637,7 @@ void I386_OPS_BASE::I386OP(imul_r32_rm32)()     // Opcode 0x0f af
                src = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(CYCLES_IMUL32_REG_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = (INT64)(INT32)READ32(ea);
                CYCLES(CYCLES_IMUL32_REG_REG);     /* TODO: Correct multiply timing */
        }
@@ -659,7 +659,7 @@ void I386_OPS_BASE::I386OP(imul_r32_rm32_i32)() // Opcode 0x69
                dst = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(CYCLES_IMUL32_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                dst = (INT64)(INT32)READ32(ea);
                CYCLES(CYCLES_IMUL32_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -681,7 +681,7 @@ void I386_OPS_BASE::I386OP(imul_r32_rm32_i8)()  // Opcode 0x6b
                dst = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(CYCLES_IMUL32_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                dst = (INT64)(INT32)READ32(ea);
                CYCLES(CYCLES_IMUL32_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -1066,9 +1066,9 @@ void I386_OPS_BASE::I386OP(lodsd)()             // Opcode 0xad
 {
        UINT32 eas;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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,4 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0,4 );
        }
        REG32(EAX) = READ32(eas);
        BUMP_SI(4);
@@ -1117,7 +1117,7 @@ void I386_OPS_BASE::I386OP(mov_rm32_r32)()      // Opcode 0x89
                STORE_RM32(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                WRITE32(ea, src);
                CYCLES(CYCLES_MOV_REG_MEM);
@@ -1133,7 +1133,7 @@ void I386_OPS_BASE::I386OP(mov_r32_rm32)()      // Opcode 0x8b
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOV_MEM_REG);
@@ -1148,7 +1148,7 @@ void I386_OPS_BASE::I386OP(mov_rm32_i32)()      // Opcode 0xc7
                STORE_RM32(modrm, value);
                CYCLES(CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                UINT32 value = FETCH32();
                WRITE32(ea, value);
                CYCLES(CYCLES_MOV_IMM_MEM);
@@ -1164,9 +1164,9 @@ void I386_OPS_BASE::I386OP(mov_eax_m32)()       // Opcode 0xa1
                offset = FETCH16();
        }
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 0 );
+               ea = i386_translate( cpustate->segment_override, offset, 0,4 );
        } else {
-               ea = i386_translate( DS, offset, 0 );
+               ea = i386_translate( DS, offset, 0,4 );
        }
        REG32(EAX) = READ32(ea);
        CYCLES(CYCLES_MOV_MEM_ACC);
@@ -1181,9 +1181,9 @@ void I386_OPS_BASE::I386OP(mov_m32_eax)()       // Opcode 0xa3
                offset = FETCH16();
        }
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 1 );
+               ea = i386_translate( cpustate->segment_override, offset, 1, 4 );
        } else {
-               ea = i386_translate( DS, offset, 1 );
+               ea = i386_translate( DS, offset, 1, 4 );
        }
        WRITE32( ea, REG32(EAX) );
        CYCLES(CYCLES_MOV_ACC_MEM);
@@ -1241,11 +1241,11 @@ void I386_OPS_BASE::I386OP(movsd)()             // Opcode 0xa5
 {
        UINT32 eas, ead, v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 4 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 4 );
        v = READ32(eas);
        WRITE32(ead, v);
        BUMP_SI(4);
@@ -1261,7 +1261,7 @@ void I386_OPS_BASE::I386OP(movsx_r32_rm8)()     // Opcode 0x0f be
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 1);
                INT32 src = (INT8)READ8(ea);
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVSX_MEM_REG);
@@ -1276,7 +1276,7 @@ void I386_OPS_BASE::I386OP(movsx_r32_rm16)()    // Opcode 0x0f bf
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                INT32 src = (INT16)READ16(ea);
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVSX_MEM_REG);
@@ -1291,7 +1291,7 @@ void I386_OPS_BASE::I386OP(movzx_r32_rm8)()     // Opcode 0x0f b6
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 1);
                UINT32 src = (UINT8)READ8(ea);
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVZX_MEM_REG);
@@ -1306,7 +1306,7 @@ void I386_OPS_BASE::I386OP(movzx_r32_rm16)()    // Opcode 0x0f b7
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 2);
                UINT32 src = (UINT16)READ16(ea);
                STORE_REG32(modrm, src);
                CYCLES(CYCLES_MOVZX_MEM_REG);
@@ -1324,7 +1324,7 @@ void I386_OPS_BASE::I386OP(or_rm32_r32)()       // Opcode 0x09
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = OR32(dst, src);
@@ -1344,7 +1344,7 @@ void I386_OPS_BASE::I386OP(or_r32_rm32)()       // Opcode 0x0b
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = OR32(dst, src);
@@ -1382,7 +1382,7 @@ void I386_OPS_BASE::I386OP(out_eax_dx)()        // Opcode 0xef
 void I386_OPS_BASE::I386OP(pop_eax)()           // Opcode 0x58
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(EAX) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1392,7 +1392,7 @@ void I386_OPS_BASE::I386OP(pop_eax)()           // Opcode 0x58
 void I386_OPS_BASE::I386OP(pop_ecx)()           // Opcode 0x59
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(ECX) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1402,7 +1402,7 @@ void I386_OPS_BASE::I386OP(pop_ecx)()           // Opcode 0x59
 void I386_OPS_BASE::I386OP(pop_edx)()           // Opcode 0x5a
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(EDX) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1412,7 +1412,7 @@ void I386_OPS_BASE::I386OP(pop_edx)()           // Opcode 0x5a
 void I386_OPS_BASE::I386OP(pop_ebx)()           // Opcode 0x5b
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(EBX) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1422,7 +1422,7 @@ void I386_OPS_BASE::I386OP(pop_ebx)()           // Opcode 0x5b
 void I386_OPS_BASE::I386OP(pop_esp)()           // Opcode 0x5c
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(ESP) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1432,7 +1432,7 @@ void I386_OPS_BASE::I386OP(pop_esp)()           // Opcode 0x5c
 void I386_OPS_BASE::I386OP(pop_ebp)()           // Opcode 0x5d
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(EBP) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1442,7 +1442,7 @@ void I386_OPS_BASE::I386OP(pop_ebp)()           // Opcode 0x5d
 void I386_OPS_BASE::I386OP(pop_esi)()           // Opcode 0x5e
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(ESI) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1452,7 +1452,7 @@ void I386_OPS_BASE::I386OP(pop_esi)()           // Opcode 0x5e
 void I386_OPS_BASE::I386OP(pop_edi)()           // Opcode 0x5f
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                REG32(EDI) = POP32();
        else
                FAULT(FAULT_SS,0)
@@ -1464,9 +1464,9 @@ bool I386_OPS_BASE::I386OP(pop_seg32)( int segment)
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
        UINT32 value;
        bool fault;
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
        {
-               ea = i386_translate( SS, offset, 0);
+               ea = i386_translate( SS, offset, 0, 4);
                value = READ32( ea);
                i386_sreg_load(value, segment, &fault);
                if(fault) return false;
@@ -1520,7 +1520,7 @@ void I386_OPS_BASE::I386OP(pop_rm32)()          // Opcode 0x8f
        UINT8 modrm = FETCH();
        UINT32 value;
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
        {
                // be careful here, if the write references the esp register
                // it expects the post-pop value but esp must be wound back
@@ -1531,7 +1531,7 @@ void I386_OPS_BASE::I386OP(pop_rm32)()          // Opcode 0x8f
                if( modrm >= 0xc0 ) {
                        STORE_RM32(modrm, value);
                } else {
-                       ea = GetEA(modrm,1);
+                       ea = GetEA(modrm,1, 4);
                        try
                        {
                                WRITE32(ea, value);
@@ -1551,7 +1551,7 @@ void I386_OPS_BASE::I386OP(pop_rm32)()          // Opcode 0x8f
 void I386_OPS_BASE::I386OP(popad)()             // Opcode 0x61
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(SS,offset+31) == 0)
+       if(i386_limit_check(SS,offset, 32) == 0)
        {
                REG32(EDI) = POP32();
                REG32(ESI) = POP32();
@@ -1593,7 +1593,7 @@ void I386_OPS_BASE::I386OP(popfd)()             // Opcode 0x9d
                mask &= ~0x00003000;  // IOPL cannot be changed while in V8086 mode
        }
 
-       if(i386_limit_check(SS,offset+3) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
        {
                value = POP32();
                value &= ~0x00010000;  // RF will always return zero
@@ -1611,7 +1611,7 @@ void I386_OPS_BASE::I386OP(push_eax)()          // Opcode 0x50
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(EAX) );
        else
                FAULT(FAULT_SS,0)
@@ -1625,7 +1625,7 @@ void I386_OPS_BASE::I386OP(push_ecx)()          // Opcode 0x51
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(ECX) );
        else
                FAULT(FAULT_SS,0)
@@ -1639,7 +1639,7 @@ void I386_OPS_BASE::I386OP(push_edx)()          // Opcode 0x52
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(EDX) );
        else
                FAULT(FAULT_SS,0)
@@ -1653,7 +1653,7 @@ void I386_OPS_BASE::I386OP(push_ebx)()          // Opcode 0x53
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(EBX) );
        else
                FAULT(FAULT_SS,0)
@@ -1667,7 +1667,7 @@ void I386_OPS_BASE::I386OP(push_esp)()          // Opcode 0x54
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(ESP) );
        else
                FAULT(FAULT_SS,0)
@@ -1681,7 +1681,7 @@ void I386_OPS_BASE::I386OP(push_ebp)()          // Opcode 0x55
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(EBP) );
        else
                FAULT(FAULT_SS,0)
@@ -1695,7 +1695,7 @@ void I386_OPS_BASE::I386OP(push_esi)()          // Opcode 0x56
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(ESI) );
        else
                FAULT(FAULT_SS,0)
@@ -1709,7 +1709,7 @@ void I386_OPS_BASE::I386OP(push_edi)()          // Opcode 0x57
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( REG32(EDI) );
        else
                FAULT(FAULT_SS,0)
@@ -1723,7 +1723,7 @@ void I386_OPS_BASE::I386OP(push_cs32)()         // Opcode 0x0e
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32SEG( cpustate->sreg[CS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1737,7 +1737,7 @@ void I386_OPS_BASE::I386OP(push_ds32)()         // Opcode 0x1e
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32SEG( cpustate->sreg[DS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1751,7 +1751,7 @@ void I386_OPS_BASE::I386OP(push_es32)()         // Opcode 0x06
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32SEG( cpustate->sreg[ES].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1765,7 +1765,7 @@ void I386_OPS_BASE::I386OP(push_fs32)()         // Opcode 0x0f a0
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32SEG( cpustate->sreg[FS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1779,7 +1779,7 @@ void I386_OPS_BASE::I386OP(push_gs32)()         // Opcode 0x0f a8
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32SEG( cpustate->sreg[GS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1793,7 +1793,7 @@ void I386_OPS_BASE::I386OP(push_ss32)()         // Opcode 0x16
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( cpustate->sreg[SS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1808,7 +1808,7 @@ void I386_OPS_BASE::I386OP(push_i32)()          // Opcode 0x68
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32(value);
        else
                FAULT(FAULT_SS,0)
@@ -1823,7 +1823,7 @@ void I386_OPS_BASE::I386OP(pushad)()            // Opcode 0x60
                offset = REG32(ESP) - 32;
        else
                offset = (REG16(SP) - 32) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 32) == 0)
        {
                PUSH32( REG32(EAX) );
                PUSH32( REG32(ECX) );
@@ -1848,7 +1848,7 @@ void I386_OPS_BASE::I386OP(pushfd)()            // Opcode 0x9c
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(SS,offset) == 0)
+       if(i386_limit_check(SS,offset, 4) == 0)
                PUSH32( get_flags() & 0x00fcffff );
        else
                FAULT(FAULT_SS,0)
@@ -1882,7 +1882,7 @@ void I386_OPS_BASE::I386OP(sbb_rm32_r32)()      // Opcode 0x19
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = SBB32( dst, src, cpustate->CF);
@@ -1902,7 +1902,7 @@ void I386_OPS_BASE::I386OP(sbb_r32_rm32)()      // Opcode 0x1b
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0, 4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = SBB32( dst, src, cpustate->CF);
@@ -1924,7 +1924,7 @@ void I386_OPS_BASE::I386OP(sbb_eax_i32)()       // Opcode 0x1d
 void I386_OPS_BASE::I386OP(scasd)()             // Opcode 0xaf
 {
        UINT32 eas, src, dst;
-       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 4 );
        src = READ32(eas);
        dst = REG32(EAX);
        SUB32(dst, src);
@@ -1950,7 +1950,7 @@ void I386_OPS_BASE::I386OP(shld32_i8)()         // Opcode 0x0f a4
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1, 4);
                UINT32 dst = READ32(ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = FETCH();
@@ -1985,7 +1985,7 @@ void I386_OPS_BASE::I386OP(shld32_cl)()         // Opcode 0x0f a5
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                UINT32 dst = READ32(ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = REG8(CL);
@@ -2020,7 +2020,7 @@ void I386_OPS_BASE::I386OP(shrd32_i8)()         // Opcode 0x0f ac
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                UINT32 dst = READ32(ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = FETCH();
@@ -2055,7 +2055,7 @@ void I386_OPS_BASE::I386OP(shrd32_cl)()         // Opcode 0x0f ad
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                UINT32 dst = READ32(ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = REG8(CL);
@@ -2074,7 +2074,7 @@ void I386_OPS_BASE::I386OP(shrd32_cl)()         // Opcode 0x0f ad
 
 void I386_OPS_BASE::I386OP(stosd)()             // Opcode 0xab
 {
-       UINT32 eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       UINT32 eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 4 );
        WRITE32(eas, REG32(EAX));
        BUMP_DI(4);
        CYCLES(CYCLES_STOS);
@@ -2091,7 +2091,7 @@ void I386_OPS_BASE::I386OP(sub_rm32_r32)()      // Opcode 0x29
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = SUB32(dst, src);
@@ -2111,7 +2111,7 @@ void I386_OPS_BASE::I386OP(sub_r32_rm32)()      // Opcode 0x2b
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = SUB32(dst, src);
@@ -2154,7 +2154,7 @@ void I386_OPS_BASE::I386OP(test_rm32_r32)()     // Opcode 0x85
                cpustate->OF = 0;
                CYCLES(CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = src & dst;
@@ -2238,7 +2238,7 @@ void I386_OPS_BASE::I386OP(xchg_r32_rm32)()     // Opcode 0x87
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                UINT32 src = READ32(ea);
                UINT32 dst = LOAD_REG32(modrm);
                WRITE32(ea, dst);
@@ -2258,7 +2258,7 @@ void I386_OPS_BASE::I386OP(xor_rm32_r32)()      // Opcode 0x31
                STORE_RM32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(ea);
                dst = XOR32(dst, src);
@@ -2278,7 +2278,7 @@ void I386_OPS_BASE::I386OP(xor_r32_rm32)()      // Opcode 0x33
                STORE_REG32(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,4);
                src = READ32(ea);
                dst = LOAD_REG32(modrm);
                dst = XOR32(dst, src);
@@ -2315,7 +2315,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = ADD32(dst, src);
@@ -2331,7 +2331,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = OR32(dst, src);
@@ -2347,7 +2347,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = ADC32( dst, src, cpustate->CF);
@@ -2363,7 +2363,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = SBB32( dst, src, cpustate->CF);
@@ -2379,7 +2379,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = AND32(dst, src);
@@ -2395,7 +2395,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = SUB32(dst, src);
@@ -2411,7 +2411,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                dst = XOR32(dst, src);
@@ -2426,7 +2426,7 @@ void I386_OPS_BASE::I386OP(group81_32)()        // Opcode 0x81
                                SUB32(dst, src);
                                CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0,4);
                                dst = READ32(ea);
                                src = FETCH32();
                                SUB32(dst, src);
@@ -2452,7 +2452,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = ADD32(dst, src);
@@ -2468,7 +2468,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = OR32(dst, src);
@@ -2484,7 +2484,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = ADC32( dst, src, cpustate->CF);
@@ -2500,7 +2500,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = ((UINT32)(INT32)(INT8)FETCH());
                                dst = SBB32( dst, src, cpustate->CF);
@@ -2516,7 +2516,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = AND32(dst, src);
@@ -2532,7 +2532,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = SUB32(dst, src);
@@ -2548,7 +2548,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                dst = XOR32(dst, src);
@@ -2563,7 +2563,7 @@ void I386_OPS_BASE::I386OP(group83_32)()        // Opcode 0x83
                                SUB32(dst, src);
                                CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0,4);
                                dst = READ32(ea);
                                src = (UINT32)(INT32)(INT8)FETCH();
                                SUB32(dst, src);
@@ -2585,7 +2585,7 @@ void I386_OPS_BASE::I386OP(groupC1_32)()        // Opcode 0xc1
                dst = i386_shift_rotate32( modrm, dst, shift);
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                dst = READ32(ea);
                shift = FETCH() & 0x1f;
                dst = i386_shift_rotate32( modrm, dst, shift);
@@ -2603,7 +2603,7 @@ void I386_OPS_BASE::I386OP(groupD1_32)()        // Opcode 0xd1
                dst = i386_shift_rotate32( modrm, dst, 1);
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                dst = READ32(ea);
                dst = i386_shift_rotate32( modrm, dst, 1);
                WRITE32(ea, dst);
@@ -2620,7 +2620,7 @@ void I386_OPS_BASE::I386OP(groupD3_32)()        // Opcode 0xd3
                dst = i386_shift_rotate32( modrm, dst, REG8(CL));
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,4);
                dst = READ32(ea);
                dst = i386_shift_rotate32( modrm, dst, REG8(CL));
                WRITE32(ea, dst);
@@ -2642,7 +2642,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                SetSZPF32(dst);
                                CYCLES(CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,0);
+                               UINT32 ea = GetEA(modrm,0,4);
                                UINT32 dst = READ32(ea);
                                UINT32 src = FETCH32();
                                dst &= src;
@@ -2658,7 +2658,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                dst = ~dst;
                                WRITE32(ea, dst);
@@ -2672,7 +2672,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                dst = SUB32( 0, dst );
                                WRITE32(ea, dst);
@@ -2687,7 +2687,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_MUL32_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        src = READ32(ea);
                                        CYCLES(CYCLES_MUL32_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2708,7 +2708,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                        src = (INT64)(INT32)LOAD_RM32(modrm);
                                        CYCLES(CYCLES_IMUL32_ACC_REG);     /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        src = (INT64)(INT32)READ32(ea);
                                        CYCLES(CYCLES_IMUL32_ACC_MEM);     /* TODO: Correct multiply timing */
                                }
@@ -2730,7 +2730,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_DIV32_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        src = READ32(ea);
                                        CYCLES(CYCLES_DIV32_ACC_MEM);
                                }
@@ -2758,7 +2758,7 @@ void I386_OPS_BASE::I386OP(groupF7_32)()        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_IDIV32_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        src = READ32(ea);
                                        CYCLES(CYCLES_IDIV32_ACC_MEM);
                                }
@@ -2794,7 +2794,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                dst = INC32(dst);
                                WRITE32(ea, dst);
@@ -2808,7 +2808,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                dst = DEC32(dst);
                                WRITE32(ea, dst);
@@ -2822,7 +2822,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                        address = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        address = READ32(ea);
                                        CYCLES(CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
@@ -2842,7 +2842,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,6);
                                        address = READ32(ea + 0);
                                        selector = READ16(ea + 4);
                                        CYCLES(CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
@@ -2870,7 +2870,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                        address = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        address = READ32(ea);
                                        CYCLES(CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
                                }
@@ -2889,7 +2889,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,6);
                                        address = READ32(ea + 0);
                                        selector = READ16(ea + 4);
                                        CYCLES(CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
@@ -2914,7 +2914,7 @@ void I386_OPS_BASE::I386OP(groupFF_32)()        // Opcode 0xff
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM32(modrm);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,4);
                                        value = READ32(ea);
                                }
                                PUSH32(value);
@@ -2943,7 +2943,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        STORE_RM32(modrm, cpustate->ldtr.segment);
                                        CYCLES(CYCLES_SLDT_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1,2);
                                        WRITE16( ea, cpustate->ldtr.segment);
                                        CYCLES(CYCLES_SLDT_MEM);
                                }
@@ -2960,7 +2960,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        STORE_RM32(modrm, cpustate->task.segment);
                                        CYCLES(CYCLES_STR_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1,2);
                                        WRITE16( ea, cpustate->task.segment);
                                        CYCLES(CYCLES_STR_MEM);
                                }
@@ -2980,7 +2980,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        cpustate->ldtr.segment = address;
                                        CYCLES(CYCLES_LLDT_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,4);
                                        cpustate->ldtr.segment = READ32(ea);
                                        CYCLES(CYCLES_LLDT_MEM);
                                }
@@ -3007,7 +3007,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        cpustate->task.segment = address;
                                        CYCLES(CYCLES_LTR_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,4);
                                        cpustate->task.segment = READ32(ea);
                                        CYCLES(CYCLES_LTR_MEM);
                                }
@@ -3036,7 +3036,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        address = LOAD_RM32(modrm);
                                        CYCLES(CYCLES_VERR_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,4);
                                        address = READ32(ea);
                                        CYCLES(CYCLES_VERR_MEM);
                                }
@@ -3083,7 +3083,7 @@ void I386_OPS_BASE::I386OP(group0F00_32)()          // Opcode 0x0f 00
                                        address = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_VERW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,2);
                                        address = READ16(ea);
                                        CYCLES(CYCLES_VERW_MEM);
                                }
@@ -3135,9 +3135,9 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( CS, address, 1 );
+                                       ea = i386_translate( CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1,6);
                                }
                                WRITE16(ea, cpustate->gdtr.limit);
                                WRITE32(ea + 2, cpustate->gdtr.base);
@@ -3149,11 +3149,11 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( CS, address, 1 );
+                                       ea = i386_translate( CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1,6);
                                }
                                WRITE16(ea, cpustate->idtr.limit);
                                WRITE32(ea + 2, cpustate->idtr.base);
@@ -3166,9 +3166,9 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( CS, address, 0 );
+                                       ea = i386_translate( CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,6);
                                }
                                cpustate->gdtr.limit = READ16(ea);
                                cpustate->gdtr.base = READ32(ea + 2);
@@ -3181,9 +3181,9 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( CS, address, 0 );
+                                       ea = i386_translate( CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,6);
                                }
                                cpustate->idtr.limit = READ16(ea);
                                cpustate->idtr.base = READ32(ea + 2);
@@ -3198,7 +3198,7 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                                        CYCLES(CYCLES_SMSW_REG);
                                } else {
                                        /* always 16-bit memory operand */
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm,1,2);
                                        WRITE16(ea, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_MEM);
                                }
@@ -3213,7 +3213,7 @@ void I386_OPS_BASE::I386OP(group0F01_32)()      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm,0,2);
                                        CYCLES(CYCLES_LMSW_MEM);
                                b = READ16(ea);
                                }
@@ -3247,7 +3247,7 @@ void I386_OPS_BASE::I386OP(group0FBA_32)()      // Opcode 0x0f ba
 
                                CYCLES(CYCLES_BT_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,0);
+                               UINT32 ea = GetEA(modrm,0,4);
                                UINT32 dst = READ32(ea);
                                UINT8 bit = FETCH();
 
@@ -3273,7 +3273,7 @@ void I386_OPS_BASE::I386OP(group0FBA_32)()      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_BTS_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                UINT8 bit = FETCH();
 
@@ -3301,7 +3301,7 @@ void I386_OPS_BASE::I386OP(group0FBA_32)()      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_BTR_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                UINT8 bit = FETCH();
 
@@ -3329,7 +3329,7 @@ void I386_OPS_BASE::I386OP(group0FBA_32)()      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(CYCLES_BTC_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,4);
                                UINT32 dst = READ32(ea);
                                UINT8 bit = FETCH();
 
@@ -3365,7 +3365,7 @@ void I386_OPS_BASE::I386OP(lar_r32_rm32)()  // Opcode 0x0f 0x02
                }
                else
                {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm,0,4);
                        seg.selector = READ32(ea);
                        CYCLES(CYCLES_LAR_MEM);
                }
@@ -3431,7 +3431,7 @@ void I386_OPS_BASE::I386OP(lsl_r32_rm32)()  // Opcode 0x0f 0x03
                }
                else
                {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm,0,4);
                        seg.selector = READ32(ea);
                }
                if(seg.selector == 0)
@@ -3492,7 +3492,7 @@ void I386_OPS_BASE::I386OP(bound_r32_m32_m32)() // Opcode 0x62
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,8);
                low = READ32(ea + 0);
                high = READ32(ea + 4);
        }
@@ -3554,7 +3554,7 @@ void I386_OPS_BASE::I386OP(load_far_pointer32)( int s)
        if( modrm >= 0xc0 ) {
                report_invalid_modrm( "load_far_pointer32", modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,6);
                STORE_REG32(modrm, READ32(ea + 0));
                selector = READ16(ea + 4);
                i386_sreg_load(selector,s,NULL);
index 762860c..9c0d346 100644 (file)
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #include "./i386_opdef.h"
 
 #define FAULT(fault,error) {cpustate->ext = 1; i386_trap_with_error(fault,0,0,error); return;}
 #define FAULT_EXP(fault,error) {cpustate->ext = 1; i386_trap_with_error(fault,0,trap_level+1,error); return;}
 
+
+#if 1
+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(modrm, 3, 7);
+       } else if( shift == 1 ) {
+               switch( (modrm >> 3) & 0x7 )
+               {
+                       case 0:         /* ROL rm8, 1 */
+                               cpustate->CF = (src & 0x80) ? 1 : 0;
+                               dst = (src << 1) + cpustate->CF;
+                               cpustate->OF = ((src ^ dst) & 0x80) ? 1 : 0;
+                               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(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(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(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               break;
+                       case 4:         /* SHL/SAL rm8, 1 */
+                       case 6:
+                               dst = src << 1;
+                               cpustate->CF = (src & 0x80) ? 1 : 0;
+                               cpustate->OF = (((cpustate->CF << 7) ^ dst) & 0x80) ? 1 : 0;
+                               SetSZPF8(dst);
+                               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(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(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               break;
+               }
+
+       } else {
+               switch( (modrm >> 3) & 0x7 )
+               {
+                       case 0:         /* ROL rm8, i8 */
+                               if(!(shift & 7))
+                               {
+                                       if(shift & 0x18)
+                                       {
+                                               cpustate->CF = src & 1;
+                                               cpustate->OF = (src & 1) ^ ((src >> 7) & 1);
+                                       }
+                                       break;
+                               }
+                               shift &= 7;
+                               dst = ((src & ((UINT8)0xff >> shift)) << shift) |
+                                               ((src & ((UINT8)0xff << (8-shift))) >> (8-shift));
+                               cpustate->CF = dst & 0x1;
+                               cpustate->OF = (dst & 1) ^ (dst >> 7);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               break;
+                       case 1:         /* ROR rm8, i8 */
+                               if(!(shift & 7))
+                               {
+                                       if(shift & 0x18)
+                                       {
+                                               cpustate->CF = (src >> 7) & 1;
+                                               cpustate->OF = ((src >> 7) & 1) ^ ((src >> 6) & 1);
+                                       }
+                                       break;
+                               }
+                               shift &= 7;
+                               dst = ((src & ((UINT8)0xff << shift)) >> shift) |
+                                               ((src & ((UINT8)0xff >> (8-shift))) << (8-shift));
+                               cpustate->CF = (dst >> 7) & 1;
+                               cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
+                               CYCLES_RM(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               break;
+                       case 2:         /* RCL rm8, i8 */
+                               shift %= 9;
+                               dst = ((src & ((UINT8)0xff >> shift)) << shift) |
+                                               ((src & ((UINT8)0xff << (9-shift))) >> (9-shift)) |
+                                               (cpustate->CF << (shift-1));
+                               if(shift) cpustate->CF = (src >> (8-shift)) & 0x1;
+                               cpustate->OF = cpustate->CF ^ ((dst >> 7) & 1);
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               break;
+                       case 3:         /* RCR rm8, i8 */
+                               shift %= 9;
+                               dst = ((src & ((UINT8)0xff << shift)) >> shift) |
+                                               ((src & ((UINT8)0xff >> (8-shift))) << (9-shift)) |
+                                               (cpustate->CF << (8-shift));
+                               if(shift) cpustate->CF = (src >> (shift-1)) & 0x1;
+                               cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
+                               CYCLES_RM(modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
+                               break;
+                       case 4:         /* SHL/SAL rm8, i8 */
+                       case 6:
+                               shift &= 31;
+                               dst = src << shift;
+                               cpustate->CF = (shift <= 8) && ((src >> (8 - shift)) & 1);
+                               SetSZPF8(dst);
+                               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(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(modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
+                               break;
+               }
+       }
+
+       return dst;
+}
+
+
+
+void I386_OPS_BASE::I386OP(adc_rm8_r8)()        // Opcode 0x10
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = ADC8( dst, src, cpustate->CF);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = ADC8( dst, src, cpustate->CF);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(adc_r8_rm8)()        // Opcode 0x12
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = ADC8( dst, src, cpustate->CF);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = ADC8( dst, src, cpustate->CF);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(adc_al_i8)()     // Opcode 0x14
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = ADC8( dst, src, cpustate->CF);
+       REG8(AL) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(add_rm8_r8)()        // Opcode 0x00
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = ADD8(dst, src);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = ADD8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(add_r8_rm8)()        // Opcode 0x02
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = ADD8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = ADD8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(add_al_i8)()     // Opcode 0x04
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = ADD8(dst, src);
+       REG8(AL) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(and_rm8_r8)()        // Opcode 0x20
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = AND8(dst, src);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = AND8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(and_r8_rm8)()        // Opcode 0x22
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = AND8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = AND8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(and_al_i8)()         // Opcode 0x24
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = AND8(dst, src);
+       REG8(AL) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(clc)()               // Opcode 0xf8
+{
+       cpustate->CF = 0;
+       CYCLES(CYCLES_CLC);
+}
+
+void I386_OPS_BASE::I386OP(cld)()               // Opcode 0xfc
+{
+       cpustate->DF = 0;
+       CYCLES(CYCLES_CLD);
+}
+
+void I386_OPS_BASE::I386OP(cli)()               // Opcode 0xfa
+{
+       if(PROTECTED_MODE)
+       {
+               UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1);
+               if(cpustate->CPL > IOPL)
+                       FAULT(FAULT_GP,0);
+       }
+       cpustate->IF = 0;
+       CYCLES(CYCLES_CLI);
+}
+
+void I386_OPS_BASE::I386OP(cmc)()               // Opcode 0xf5
+{
+       cpustate->CF ^= 1;
+       CYCLES(CYCLES_CMC);
+}
+
+void I386_OPS_BASE::I386OP(cmp_rm8_r8)()        // Opcode 0x38
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(cmp_r8_rm8)()        // Opcode 0x3a
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               SUB8(dst, src);
+               CYCLES(CYCLES_CMP_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(cmp_al_i8)()         // Opcode 0x3c
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       SUB8(dst, src);
+       CYCLES(CYCLES_CMP_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(cmpsb)()             // Opcode 0xa6
+{
+       UINT32 eas, ead;
+       UINT8 src, dst;
+       if( cpustate->segment_prefix ) {
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       } else {
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       }
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 1 );
+       src = READ8(eas);
+       dst = READ8(ead);
+       SUB8(src, dst);
+       BUMP_SI(1);
+       BUMP_DI(1);
+       CYCLES(CYCLES_CMPS);
+}
+
+void I386_OPS_BASE::I386OP(in_al_i8)()          // Opcode 0xe4
+{
+       UINT16 port = FETCH();
+       UINT8 data = READPORT8( port);
+       REG8(AL) = data;
+       CYCLES(CYCLES_IN_VAR);
+}
+
+void I386_OPS_BASE::I386OP(in_al_dx)()          // Opcode 0xec
+{
+       UINT16 port = REG16(DX);
+       UINT8 data = READPORT8( port);
+       REG8(AL) = data;
+       CYCLES(CYCLES_IN);
+}
+
+void I386_OPS_BASE::I386OP(ja_rel8)()           // Opcode 0x77
+{
+       INT8 disp = FETCH();
+       if( cpustate->CF == 0 && cpustate->ZF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jbe_rel8)()          // Opcode 0x76
+{
+       INT8 disp = FETCH();
+       if( cpustate->CF != 0 || cpustate->ZF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jc_rel8)()           // Opcode 0x72
+{
+       INT8 disp = FETCH();
+       if( cpustate->CF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jg_rel8)()           // Opcode 0x7f
+{
+       INT8 disp = FETCH();
+       if( cpustate->ZF == 0 && (cpustate->SF == cpustate->OF) ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jge_rel8)()          // Opcode 0x7d
+{
+       INT8 disp = FETCH();
+       if(cpustate->SF == cpustate->OF) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jl_rel8)()           // Opcode 0x7c
+{
+       INT8 disp = FETCH();
+       if( (cpustate->SF != cpustate->OF) ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jle_rel8)()      // Opcode 0x7e
+{
+       INT8 disp = FETCH();
+       if( cpustate->ZF != 0 || (cpustate->SF != cpustate->OF) ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jnc_rel8)()          // Opcode 0x73
+{
+       INT8 disp = FETCH();
+       if( cpustate->CF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jno_rel8)()          // Opcode 0x71
+{
+       INT8 disp = FETCH();
+       if( cpustate->OF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jnp_rel8)()          // Opcode 0x7b
+{
+       INT8 disp = FETCH();
+       if( cpustate->PF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jns_rel8)()          // Opcode 0x79
+{
+       INT8 disp = FETCH();
+       if( cpustate->SF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jnz_rel8)()          // Opcode 0x75
+{
+       INT8 disp = FETCH();
+       if( cpustate->ZF == 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jo_rel8)()           // Opcode 0x70
+{
+       INT8 disp = FETCH();
+       if( cpustate->OF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jp_rel8)()           // Opcode 0x7a
+{
+       INT8 disp = FETCH();
+       if( cpustate->PF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(js_rel8)()           // Opcode 0x78
+{
+       INT8 disp = FETCH();
+       if( cpustate->SF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jz_rel8)()           // Opcode 0x74
+{
+       INT8 disp = FETCH();
+       if( cpustate->ZF != 0 ) {
+               NEAR_BRANCH(disp);
+               CYCLES(CYCLES_JCC_DISP8);      /* TODO: Timing = 7 + m */
+       } else {
+               CYCLES(CYCLES_JCC_DISP8_NOBRANCH);
+       }
+}
+
+void I386_OPS_BASE::I386OP(jmp_rel8)()          // Opcode 0xeb
+{
+       INT8 disp = FETCH();
+       NEAR_BRANCH(disp);
+       CYCLES(CYCLES_JMP_SHORT);      /* TODO: Timing = 7 + m */
+}
+
+void I386_OPS_BASE::I386OP(lahf)()              // Opcode 0x9f
+{
+       REG8(AH) = get_flags() & 0xd7;
+       CYCLES(CYCLES_LAHF);
+}
+
+void I386_OPS_BASE::I386OP(lodsb)()             // Opcode 0xac
+{
+       UINT32 eas;
+       if( cpustate->segment_prefix ) {
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       } else {
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       }
+       REG8(AL) = READ8(eas);
+       BUMP_SI(1);
+       CYCLES(CYCLES_LODS);
+}
+
+void I386_OPS_BASE::I386OP(mov_rm8_r8)()        // Opcode 0x88
+{
+       UINT8 src;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               STORE_RM8(modrm, src);
+               CYCLES(CYCLES_MOV_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               WRITE8(ea, src);
+               CYCLES(CYCLES_MOV_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_r8_rm8)()        // Opcode 0x8a
+{
+       UINT8 src;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               STORE_REG8(modrm, src);
+               CYCLES(CYCLES_MOV_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               STORE_REG8(modrm, src);
+               CYCLES(CYCLES_MOV_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_rm8_i8)()        // Opcode 0xc6
+{
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               UINT8 value = FETCH();
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_MOV_IMM_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               UINT8 value = FETCH();
+               WRITE8(ea, value);
+               CYCLES(CYCLES_MOV_IMM_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_r32_cr)()        // Opcode 0x0f 20
+{
+       if(PROTECTED_MODE && cpustate->CPL)
+               FAULT(FAULT_GP, 0);
+       UINT8 modrm = FETCH();
+       UINT8 cr = (modrm >> 3) & 0x7;
+
+       STORE_RM32(modrm, cpustate->cr[cr]);
+       CYCLES(CYCLES_MOV_CR_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_r32_dr)()        // Opcode 0x0f 21
+{
+       if(PROTECTED_MODE && cpustate->CPL)
+               FAULT(FAULT_GP, 0);
+       UINT8 modrm = FETCH();
+       UINT8 dr = (modrm >> 3) & 0x7;
+
+       STORE_RM32(modrm, cpustate->dr[dr]);
+       switch(dr)
+       {
+               case 0:
+               case 1:
+               case 2:
+               case 3:
+                       CYCLES(CYCLES_MOV_REG_DR0_3);
+                       break;
+               case 6:
+               case 7:
+                       CYCLES(CYCLES_MOV_REG_DR6_7);
+                       break;
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_cr_r32)()        // Opcode 0x0f 22
+{
+       if(PROTECTED_MODE && cpustate->CPL)
+               FAULT(FAULT_GP, 0);
+       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(CYCLES_MOV_REG_CR0);
+                       break;
+               case 2: CYCLES(CYCLES_MOV_REG_CR2); break;
+               case 3:
+                       CYCLES(CYCLES_MOV_REG_CR3);
+                       vtlb_flush_dynamic(cpustate->vtlb);
+                       break;
+               case 4: CYCLES(1); break; // TODO
+               default:
+                       logerror("i386: mov_cr_r32 CR%d!\n", cr);
+                       return;
+       }
+       cpustate->cr[cr] = data;
+}
+
+void I386_OPS_BASE::I386OP(mov_dr_r32)()        // Opcode 0x0f 23
+{
+       if(PROTECTED_MODE && cpustate->CPL)
+               FAULT(FAULT_GP, 0);
+       UINT8 modrm = FETCH();
+       UINT8 dr = (modrm >> 3) & 0x7;
+
+       cpustate->dr[dr] = LOAD_RM32(modrm);
+       switch(dr)
+       {
+               case 0:
+               case 1:
+               case 2:
+               case 3:
+                       CYCLES(CYCLES_MOV_DR0_3_REG);
+                       break;
+               case 6:
+               case 7:
+                       CYCLES(CYCLES_MOV_DR6_7_REG);
+                       break;
+               default:
+                       logerror("i386: mov_dr_r32 DR%d!\n", dr);
+                       return;
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_al_m8)()         // Opcode 0xa0
+{
+       UINT32 offset, ea;
+       if( cpustate->address_size ) {
+               offset = FETCH32();
+       } else {
+               offset = FETCH16();
+       }
+       /* TODO: Not sure if this is correct... */
+       if( cpustate->segment_prefix ) {
+               ea = i386_translate( cpustate->segment_override, offset, 0, 1 );
+       } else {
+               ea = i386_translate( DS, offset, 0, 1 );
+       }
+       REG8(AL) = READ8(ea);
+       CYCLES(CYCLES_MOV_IMM_MEM);
+}
+
+void I386_OPS_BASE::I386OP(mov_m8_al)()         // Opcode 0xa2
+{
+       UINT32 offset, ea;
+       if( cpustate->address_size ) {
+               offset = FETCH32();
+       } else {
+               offset = FETCH16();
+       }
+       /* TODO: Not sure if this is correct... */
+       if( cpustate->segment_prefix ) {
+               ea = i386_translate( cpustate->segment_override, offset, 1, 1 );
+       } else {
+               ea = i386_translate( DS, offset, 1, 1 );
+       }
+       WRITE8( ea, REG8(AL) );
+       CYCLES(CYCLES_MOV_MEM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(mov_rm16_sreg)()     // Opcode 0x8c
+{
+       UINT8 modrm = FETCH();
+       int s = (modrm >> 3) & 0x7;
+
+       if( modrm >= 0xc0 ) {
+               if(cpustate->operand_size)
+                       STORE_RM32(modrm, cpustate->sreg[s].selector);
+               else
+                       STORE_RM16(modrm, cpustate->sreg[s].selector);
+               CYCLES(CYCLES_MOV_SREG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,2);
+               WRITE16(ea, cpustate->sreg[s].selector);
+               CYCLES(CYCLES_MOV_SREG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_sreg_rm16)()     // Opcode 0x8e
+{
+       UINT16 selector;
+       UINT8 modrm = FETCH();
+       bool fault;
+       int s = (modrm >> 3) & 0x7;
+
+       if( modrm >= 0xc0 ) {
+               selector = LOAD_RM16(modrm);
+               CYCLES(CYCLES_MOV_REG_SREG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,2);
+               selector = READ16(ea);
+               CYCLES(CYCLES_MOV_MEM_SREG);
+       }
+
+       i386_sreg_load(selector,s,&fault);
+       if((s == SS) && !fault)
+       {
+               if(cpustate->IF != 0) // if external interrupts are enabled
+               {
+                       cpustate->IF = 0;  // reset IF for the next instruction
+                       cpustate->delayed_interrupt_enable = 1;
+               }
+       }
+}
+
+void I386_OPS_BASE::I386OP(mov_al_i8)()         // Opcode 0xb0
+{
+       REG8(AL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_cl_i8)()         // Opcode 0xb1
+{
+       REG8(CL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_dl_i8)()         // Opcode 0xb2
+{
+       REG8(DL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_bl_i8)()         // Opcode 0xb3
+{
+       REG8(BL) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_ah_i8)()         // Opcode 0xb4
+{
+       REG8(AH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_ch_i8)()         // Opcode 0xb5
+{
+       REG8(CH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_dh_i8)()         // Opcode 0xb6
+{
+       REG8(DH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(mov_bh_i8)()         // Opcode 0xb7
+{
+       REG8(BH) = FETCH();
+       CYCLES(CYCLES_MOV_IMM_REG);
+}
+
+void I386_OPS_BASE::I386OP(movsb)()             // Opcode 0xa4
+{
+       UINT32 eas, ead;
+       UINT8 v;
+       if( cpustate->segment_prefix ) {
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       } else {
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
+       }
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
+       v = READ8(eas);
+       WRITE8(ead, v);
+       BUMP_SI(1);
+       BUMP_DI(1);
+       CYCLES(CYCLES_MOVS);
+}
+
+void I386_OPS_BASE::I386OP(or_rm8_r8)()         // Opcode 0x08
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = OR8(dst, src);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = OR8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(or_r8_rm8)()         // Opcode 0x0a
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = OR8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = OR8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(or_al_i8)()          // Opcode 0x0c
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = OR8(dst, src);
+       REG8(EAX) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(out_al_i8)()         // Opcode 0xe6
+{
+       UINT16 port = FETCH();
+       UINT8 data = REG8(AL);
+       WRITEPORT8( port, data);
+       CYCLES(CYCLES_OUT_VAR);
+}
+
+void I386_OPS_BASE::I386OP(out_al_dx)()         // Opcode 0xee
+{
+       UINT16 port = REG16(DX);
+       UINT8 data = REG8(AL);
+       WRITEPORT8( port, data);
+       CYCLES(CYCLES_OUT);
+}
+
+
+void I386_OPS_BASE::I386OP(arpl)()           // Opcode 0x63
+{
+       UINT16 src, dst;
+       UINT8 modrm = FETCH();
+       UINT8 flag = 0;
+
+       if(PROTECTED_MODE && !V8086_MODE)
+       {
+                       if( modrm >= 0xc0 ) {
+                       src = LOAD_REG16(modrm);
+                       dst = LOAD_RM16(modrm);
+                       if( (dst&0x3) < (src&0x3) ) {
+                               dst = (dst&0xfffc) | (src&0x3);
+                               flag = 1;
+                               STORE_RM16(modrm, dst);
+                       }
+               } else {
+                       UINT32 ea = GetEA( modrm,1,2);
+                       src = LOAD_REG16(modrm);
+                       dst = READ16( ea);
+                       if( (dst&0x3) < (src&0x3) ) {
+                               dst = (dst&0xfffc) | (src&0x3);
+                               flag = 1;
+                               WRITE16( ea, dst);
+                       }
+               }
+               SetZF(flag);
+       }
+       else
+               i386_trap( 6, 0, 0);  // invalid opcode in real mode or v8086 mode
+}
+
+void I386_OPS_BASE::I386OP(push_i8)()           // Opcode 0x6a
+{
+       UINT8 value = FETCH();
+       PUSH8(value);
+       CYCLES(CYCLES_PUSH_IMM);
+}
+
+void I386_OPS_BASE::I386OP(ins_generic)( int size)
+{
+       UINT32 ead;
+       UINT8 vb;
+       UINT16 vw;
+       UINT32 vd;
+
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, size);
+
+       switch(size) {
+       case 1:
+               vb = READPORT8( REG16(DX));
+               WRITE8(ead, vb);
+               break;
+       case 2:
+               vw = READPORT16( REG16(DX));
+               WRITE16(ead, vw);
+               break;
+       case 4:
+               vd = READPORT32( REG16(DX));
+               WRITE32(ead, vd);
+               break;
+       }
+
+       if(cpustate->address_size)
+               REG32(EDI) += ((cpustate->DF) ? -1 : 1) * size;
+       else
+               REG16(DI) += ((cpustate->DF) ? -1 : 1) * size;
+       CYCLES(CYCLES_INS);    // TODO: Confirm this value
+}
+
+void I386_OPS_BASE::I386OP(insb)()              // Opcode 0x6c
+{
+       I386OP(ins_generic)( 1);
+}
+
+void I386_OPS_BASE::I386OP(insw)()              // Opcode 0x6d
+{
+       I386OP(ins_generic)( 2);
+}
+
+void I386_OPS_BASE::I386OP(insd)()              // Opcode 0x6d
+{
+       I386OP(ins_generic)( 4);
+}
+
+void I386_OPS_BASE::I386OP(outs_generic)( int size)
+{
+       UINT32 eas;
+       UINT8 vb;
+       UINT16 vw;
+       UINT32 vd;
+
+       if( cpustate->segment_prefix ) {
+               eas = i386_translate( cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, size );
+       } else {
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, size );
+       }
+
+       switch(size) {
+       case 1:
+               vb = READ8(eas);
+               WRITEPORT8( REG16(DX), vb);
+               break;
+       case 2:
+               vw = READ16(eas);
+               WRITEPORT16( REG16(DX), vw);
+               break;
+       case 4:
+               vd = READ32(eas);
+               WRITEPORT32( REG16(DX), vd);
+               break;
+       }
+
+       if(cpustate->address_size)
+               REG32(ESI) += ((cpustate->DF) ? -1 : 1) * size;
+       else
+               REG16(SI) += ((cpustate->DF) ? -1 : 1) * size;
+       CYCLES(CYCLES_OUTS);   // TODO: Confirm this value
+}
+
+void I386_OPS_BASE::I386OP(outsb)()             // Opcode 0x6e
+{
+       I386OP(outs_generic)( 1);
+}
+
+void I386_OPS_BASE::I386OP(outsw)()             // Opcode 0x6f
+{
+       I386OP(outs_generic)( 2);
+}
+
+void I386_OPS_BASE::I386OP(outsd)()             // Opcode 0x6f
+{
+       I386OP(outs_generic)( 4);
+}
+
+void I386_OPS_BASE::I386OP(repeat)( int invert_flag)
+{
+       UINT32 repeated_eip = cpustate->eip;
+       UINT32 repeated_pc = cpustate->pc;
+       UINT8 opcode; // = FETCH();
+//  UINT32 eas, ead;
+       UINT32 count;
+       INT32 cycle_base = 0, cycle_adjustment = 0;
+       UINT8 prefix_flag=1;
+       UINT8 *flag = NULL;
+
+
+       do {
+       repeated_eip = cpustate->eip;
+       repeated_pc = cpustate->pc;
+       opcode = FETCH();
+       switch(opcode) {
+               case 0x0f:
+               if (invert_flag == 0)
+                       I386OP(decode_three_bytef3)(); // sse f3 0f
+               else
+                       I386OP(decode_three_bytef2)(); // sse f2 0f
+               return;
+               case 0x26:
+               cpustate->segment_override=ES;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x2e:
+               cpustate->segment_override=CS;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x36:
+               cpustate->segment_override=SS;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x3e:
+               cpustate->segment_override=DS;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x64:
+               cpustate->segment_override=FS;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x65:
+               cpustate->segment_override=GS;
+               cpustate->segment_prefix=1;
+               break;
+               case 0x66:
+               cpustate->operand_size ^= 1;
+               cpustate->xmm_operand_size ^= 1;
+               break;
+               case 0x67:
+               cpustate->address_size ^= 1;
+               break;
+               default:
+               prefix_flag=0;
+       }
+       } while (prefix_flag);
+
+
+       if( cpustate->segment_prefix ) {
+               // FIXME: the following does not work if both address override and segment override are used
+               i386_translate( cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI), -1, 1 );
+       } else {
+               //eas =
+               i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1, 1 );
+       }
+       i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1, 1 );
+
+       switch(opcode)
+       {
+               case 0x6c:
+               case 0x6d:
+                       /* INSB, INSW, INSD */
+                       // TODO: cycle count
+                       cycle_base = 8;
+                       cycle_adjustment = -4;
+                       flag = NULL;
+                       break;
+
+               case 0x6e:
+               case 0x6f:
+                       /* OUTSB, OUTSW, OUTSD */
+                       // TODO: cycle count
+                       cycle_base = 8;
+                       cycle_adjustment = -4;
+                       flag = NULL;
+                       break;
+
+               case 0xa4:
+               case 0xa5:
+                       /* MOVSB, MOVSW, MOVSD */
+                       cycle_base = 8;
+                       cycle_adjustment = -4;
+                       flag = NULL;
+                       break;
+
+               case 0xa6:
+               case 0xa7:
+                       /* CMPSB, CMPSW, CMPSD */
+                       cycle_base = 5;
+                       cycle_adjustment = -1;
+                       flag = &cpustate->ZF;
+                       break;
+
+               case 0xac:
+               case 0xad:
+                       /* LODSB, LODSW, LODSD */
+                       cycle_base = 5;
+                       cycle_adjustment = 1;
+                       flag = NULL;
+                       break;
+
+               case 0xaa:
+               case 0xab:
+                       /* STOSB, STOSW, STOSD */
+                       cycle_base = 5;
+                       cycle_adjustment = 0;
+                       flag = NULL;
+                       break;
+
+               case 0xae:
+               case 0xaf:
+                       /* SCASB, SCASW, SCASD */
+                       cycle_base = 5;
+                       cycle_adjustment = 0;
+                       flag = &cpustate->ZF;
+                       break;
+
+               case 0x90:
+                       CYCLES(CYCLES_NOP);
+                       return;
+
+               case 0xc2: // sigh
+               case 0xc3:
+                       cpustate->pc--;
+                       return;
+
+               default:
+                       logerror("i386: Invalid REP/opcode %02X combination at %08x\n",opcode, cpustate->pc - 2);
+                       cpustate->pc--;
+                       break;
+       }
+
+       if( cpustate->address_size ) {
+               if( REG32(ECX) == 0 )
+                       return;
+       } else {
+               if( REG16(CX) == 0 )
+                       return;
+       }
+
+       /* now actually perform the repeat */
+       CYCLES_NUM(cycle_base);
+       do
+       {
+               cpustate->eip = repeated_eip;
+               cpustate->pc = repeated_pc;
+               try
+               {
+                       I386OP(decode_opcode)();
+               }
+               catch (UINT64 e)
+               {
+                       cpustate->eip = cpustate->prev_eip;
+                       throw e;
+               }
+
+               CYCLES_NUM(cycle_adjustment);
+
+               if (cpustate->address_size)
+                       count = --REG32(ECX);
+               else
+                       count = --REG16(CX);
+               if (cpustate->cycles <= 0)
+                       goto outofcycles;
+       }
+       while( count && (!flag || (invert_flag ? !*flag : *flag)) );
+       return;
+
+outofcycles:
+       /* if we run out of cycles to execute, and we are still in the repeat, we need
+        * to exit this instruction in such a way to go right back into it when we have
+        * time to execute cycles */
+       if(flag && (invert_flag ? *flag : !*flag))
+               return;
+       cpustate->eip = cpustate->prev_eip;
+       CHANGE_PC(cpustate->eip);
+       CYCLES_NUM(-cycle_base);
+}
+
+void I386_OPS_BASE::I386OP(rep)()               // Opcode 0xf3
+{
+       I386OP(repeat)( 0);
+}
+
+void I386_OPS_BASE::I386OP(repne)()             // Opcode 0xf2
+{
+       I386OP(repeat)( 1);
+}
+
+void I386_OPS_BASE::I386OP(sahf)()              // Opcode 0x9e
+{
+       set_flags( (get_flags() & 0xffffff00) | (REG8(AH) & 0xd7) );
+       CYCLES(CYCLES_SAHF);
+}
+
+void I386_OPS_BASE::I386OP(sbb_rm8_r8)()        // Opcode 0x18
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = SBB8( dst, src, cpustate->CF);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = SBB8( dst, src, cpustate->CF);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(sbb_r8_rm8)()        // Opcode 0x1a
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = SBB8( dst, src, cpustate->CF);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = SBB8( dst, src, cpustate->CF);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(sbb_al_i8)()         // Opcode 0x1c
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = SBB8( dst, src, cpustate->CF);
+       REG8(EAX) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(scasb)()             // Opcode 0xae
+{
+       UINT32 eas;
+       UINT8 src, dst;
+       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 1 );
+       src = READ8(eas);
+       dst = REG8(AL);
+       SUB8(dst, src);
+       BUMP_DI(1);
+       CYCLES(CYCLES_SCAS);
+}
+
+void I386_OPS_BASE::I386OP(setalc)()            // Opcode 0xd6 (undocumented)
+{
+       if( cpustate->CF ) {
+               REG8(AL) = 0xff;
+       } else {
+               REG8(AL) = 0;
+       }
+       CYCLES(3);
+}
+
+void I386_OPS_BASE::I386OP(seta_rm8)()          // Opcode 0x0f 97
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->CF == 0 && cpustate->ZF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setbe_rm8)()         // Opcode 0x0f 96
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->CF != 0 || cpustate->ZF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setc_rm8)()          // Opcode 0x0f 92
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->CF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setg_rm8)()          // Opcode 0x0f 9f
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->ZF == 0 && (cpustate->SF == cpustate->OF) ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setge_rm8)()         // Opcode 0x0f 9d
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if(cpustate->SF == cpustate->OF) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setl_rm8)()          // Opcode 0x0f 9c
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->SF != cpustate->OF ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setle_rm8)()         // Opcode 0x0f 9e
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->ZF != 0 || (cpustate->SF != cpustate->OF) ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setnc_rm8)()         // Opcode 0x0f 93
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->CF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setno_rm8)()         // Opcode 0x0f 91
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->OF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setnp_rm8)()         // Opcode 0x0f 9b
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->PF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setns_rm8)()         // Opcode 0x0f 99
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->SF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setnz_rm8)()         // Opcode 0x0f 95
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->ZF == 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(seto_rm8)()          // Opcode 0x0f 90
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->OF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setp_rm8)()          // Opcode 0x0f 9a
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->PF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(sets_rm8)()          // Opcode 0x0f 98
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->SF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(setz_rm8)()          // Opcode 0x0f 94
+{
+       UINT8 modrm = FETCH();
+       UINT8 value = 0;
+       if( cpustate->ZF != 0 ) {
+               value = 1;
+       }
+       if( modrm >= 0xc0 ) {
+               STORE_RM8(modrm, value);
+               CYCLES(CYCLES_SETCC_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               WRITE8(ea, value);
+               CYCLES(CYCLES_SETCC_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(stc)()               // Opcode 0xf9
+{
+       cpustate->CF = 1;
+       CYCLES(CYCLES_STC);
+}
+
+void I386_OPS_BASE::I386OP(std)()               // Opcode 0xfd
+{
+       cpustate->DF = 1;
+       CYCLES(CYCLES_STD);
+}
+
+void I386_OPS_BASE::I386OP(sti)()               // Opcode 0xfb
+{
+       if(PROTECTED_MODE)
+       {
+               UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1);
+               if(cpustate->CPL > IOPL)
+                       FAULT(FAULT_GP,0);
+       }
+       cpustate->delayed_interrupt_enable = 1;  // IF is set after the next instruction.
+       CYCLES(CYCLES_STI);
+}
+
+void I386_OPS_BASE::I386OP(stosb)()             // Opcode 0xaa
+{
+       UINT32 ead;
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
+       WRITE8(ead, REG8(AL));
+       BUMP_DI(1);
+       CYCLES(CYCLES_STOS);
+}
+
+void I386_OPS_BASE::I386OP(sub_rm8_r8)()        // Opcode 0x28
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = SUB8(dst, src);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = SUB8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(sub_r8_rm8)()        // Opcode 0x2a
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = SUB8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = SUB8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(sub_al_i8)()         // Opcode 0x2c
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(EAX);
+       dst = SUB8(dst, src);
+       REG8(EAX) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(test_al_i8)()        // Opcode 0xa8
+{
+       UINT8 src = FETCH();
+       UINT8 dst = REG8(AL);
+       dst = src & dst;
+       SetSZPF8(dst);
+       cpustate->CF = 0;
+       cpustate->OF = 0;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+void I386_OPS_BASE::I386OP(test_rm8_r8)()       // Opcode 0x84
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = src & dst;
+               SetSZPF8(dst);
+               cpustate->CF = 0;
+               cpustate->OF = 0;
+               CYCLES(CYCLES_TEST_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = src & dst;
+               SetSZPF8(dst);
+               cpustate->CF = 0;
+               cpustate->OF = 0;
+               CYCLES(CYCLES_TEST_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(xchg_r8_rm8)()       // Opcode 0x86
+{
+       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(CYCLES_XCHG_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               UINT8 src = READ8(ea);
+               UINT8 dst = LOAD_REG8(modrm);
+               WRITE8(ea, dst);
+               STORE_REG8(modrm, src);
+               CYCLES(CYCLES_XCHG_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(xor_rm8_r8)()        // Opcode 0x30
+{
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_REG8(modrm);
+               dst = LOAD_RM8(modrm);
+               dst = XOR8(dst, src);
+               STORE_RM8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               src = LOAD_REG8(modrm);
+               dst = READ8(ea);
+               dst = XOR8(dst, src);
+               WRITE8(ea, dst);
+               CYCLES(CYCLES_ALU_REG_MEM);
+       }
+}
+
+void I386_OPS_BASE::I386OP(xor_r8_rm8)()        // Opcode 0x32
+{
+       UINT32 src, dst;
+       UINT8 modrm = FETCH();
+       if( modrm >= 0xc0 ) {
+               src = LOAD_RM8(modrm);
+               dst = LOAD_REG8(modrm);
+               dst = XOR8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_REG_REG);
+       } else {
+               UINT32 ea = GetEA(modrm,0,1);
+               src = READ8(ea);
+               dst = LOAD_REG8(modrm);
+               dst = XOR8(dst, src);
+               STORE_REG8(modrm, dst);
+               CYCLES(CYCLES_ALU_MEM_REG);
+       }
+}
+
+void I386_OPS_BASE::I386OP(xor_al_i8)()         // Opcode 0x34
+{
+       UINT8 src, dst;
+       src = FETCH();
+       dst = REG8(AL);
+       dst = XOR8(dst, src);
+       REG8(AL) = dst;
+       CYCLES(CYCLES_ALU_IMM_ACC);
+}
+
+
+
+void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
+{
+       UINT32 ea;
+       UINT8 src, dst;
+       UINT8 modrm = FETCH();
+
+       switch( (modrm >> 3) & 0x7 )
+       {
+               case 0:     // ADD Rm8, i8
+                       if( modrm >= 0xc0 ) {
+                               dst = LOAD_RM8(modrm);
+                               src = FETCH();
+                               dst = ADD8(dst, src);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,0,1);
+                               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();
+                               dst = OR8(dst, src);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               dst = ADC8( dst, src, cpustate->CF);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               dst = SBB8( dst, src, cpustate->CF);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               dst = AND8(dst, src);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               dst = SUB8(dst, src);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               dst = XOR8(dst, src);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_ALU_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,1,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();
+                               SUB8(dst, src);
+                               CYCLES(CYCLES_CMP_REG_REG);
+                       } else {
+                               ea = GetEA(modrm,0,1);
+                               dst = READ8(ea);
+                               src = FETCH();
+                               SUB8(dst, src);
+                               CYCLES(CYCLES_CMP_REG_MEM);
+                       }
+                       break;
+       }
+}
+
+void I386_OPS_BASE::I386OP(groupC0_8)()         // Opcode 0xc0
+{
+       UINT8 dst;
+       UINT8 modrm = FETCH();
+       UINT8 shift;
+
+       if( modrm >= 0xc0 ) {
+               dst = LOAD_RM8(modrm);
+               shift = FETCH() & 0x1f;
+               dst = i386_shift_rotate8( modrm, dst, shift);
+               STORE_RM8(modrm, dst);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               dst = READ8(ea);
+               shift = FETCH() & 0x1f;
+               dst = i386_shift_rotate8( modrm, dst, shift);
+               WRITE8(ea, dst);
+       }
+}
+
+void I386_OPS_BASE::I386OP(groupD0_8)()         // Opcode 0xd0
+{
+       UINT8 dst;
+       UINT8 modrm = FETCH();
+
+       if( modrm >= 0xc0 ) {
+               dst = LOAD_RM8(modrm);
+               dst = i386_shift_rotate8( modrm, dst, 1);
+               STORE_RM8(modrm, dst);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               dst = READ8(ea);
+               dst = i386_shift_rotate8( modrm, dst, 1);
+               WRITE8(ea, dst);
+       }
+}
+
+void I386_OPS_BASE::I386OP(groupD2_8)()         // Opcode 0xd2
+{
+       UINT8 dst;
+       UINT8 modrm = FETCH();
+
+       if( modrm >= 0xc0 ) {
+               dst = LOAD_RM8(modrm);
+               dst = i386_shift_rotate8( modrm, dst, REG8(CL));
+               STORE_RM8(modrm, dst);
+       } else {
+               UINT32 ea = GetEA(modrm,1,1);
+               dst = READ8(ea);
+               dst = i386_shift_rotate8( modrm, dst, REG8(CL));
+               WRITE8(ea, dst);
+       }
+}
+
+void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
+{
+       UINT8 modrm = FETCH();
+
+       switch( (modrm >> 3) & 0x7 )
+       {
+               case 0:         /* TEST Rm8, i8 */
+                       if( modrm >= 0xc0 ) {
+                               UINT8 dst = LOAD_RM8(modrm);
+                               UINT8 src = FETCH();
+                               dst &= src;
+                               cpustate->CF = cpustate->OF = cpustate->AF = 0;
+                               SetSZPF8(dst);
+                               CYCLES(CYCLES_TEST_IMM_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,0,1);
+                               UINT8 dst = READ8(ea);
+                               UINT8 src = FETCH();
+                               dst &= src;
+                               cpustate->CF = cpustate->OF = cpustate->AF = 0;
+                               SetSZPF8(dst);
+                               CYCLES(CYCLES_TEST_IMM_MEM);
+                       }
+                       break;
+               case 2:         /* NOT Rm8 */
+                       if( modrm >= 0xc0 ) {
+                               UINT8 dst = LOAD_RM8(modrm);
+                               dst = ~dst;
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_NOT_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1,1);
+                               UINT8 dst = READ8(ea);
+                               dst = ~dst;
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_NOT_MEM);
+                       }
+                       break;
+               case 3:         /* NEG Rm8 */
+                       if( modrm >= 0xc0 ) {
+                               UINT8 dst = LOAD_RM8(modrm);
+                               dst = SUB8( 0, dst );
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_NEG_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1,1);
+                               UINT8 dst = READ8(ea);
+                               dst = SUB8( 0, dst );
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_NEG_MEM);
+                       }
+                       break;
+               case 4:         /* MUL AL, Rm8 */
+                       {
+                               UINT16 result;
+                               UINT8 src, dst;
+                               if( modrm >= 0xc0 ) {
+                                       src = LOAD_RM8(modrm);
+                                       CYCLES(CYCLES_MUL8_ACC_REG);       /* TODO: Correct multiply timing */
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0,1);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_MUL8_ACC_MEM);       /* TODO: Correct multiply timing */
+                               }
+
+                               dst = REG8(AL);
+                               result = (UINT16)src * (UINT16)dst;
+                               REG16(AX) = (UINT16)result;
+
+                               cpustate->CF = cpustate->OF = (REG16(AX) > 0xff);
+                       }
+                       break;
+               case 5:         /* IMUL AL, Rm8 */
+                       {
+                               INT16 result;
+                               INT16 src, dst;
+                               if( modrm >= 0xc0 ) {
+                                       src = (INT16)(INT8)LOAD_RM8(modrm);
+                                       CYCLES(CYCLES_IMUL8_ACC_REG);      /* TODO: Correct multiply timing */
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0,1);
+                                       src = (INT16)(INT8)READ8(ea);
+                                       CYCLES(CYCLES_IMUL8_ACC_MEM);      /* TODO: Correct multiply timing */
+                               }
+
+                               dst = (INT16)(INT8)REG8(AL);
+                               result = src * dst;
+
+                               REG16(AX) = (UINT16)result;
+
+                               cpustate->CF = cpustate->OF = !(result == (INT16)(INT8)result);
+                       }
+                       break;
+               case 6:         /* DIV AL, Rm8 */
+                       {
+                               UINT16 quotient, remainder, result;
+                               UINT8 src;
+                               if( modrm >= 0xc0 ) {
+                                       src = LOAD_RM8(modrm);
+                                       CYCLES(CYCLES_DIV8_ACC_REG);
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0,1);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_DIV8_ACC_MEM);
+                               }
+
+                               quotient = (UINT16)REG16(AX);
+                               if( src ) {
+                                       remainder = quotient % (UINT16)src;
+                                       result = quotient / (UINT16)src;
+                                       if( result > 0xff ) {
+                                               /* TODO: Divide error */
+                                       } else {
+                                               REG8(AH) = (UINT8)remainder & 0xff;
+                                               REG8(AL) = (UINT8)result & 0xff;
+
+                                               // this flag is actually undefined, enable on non-cyrix
+                                               if (cpustate->cpuid_id0 != 0x69727943)
+                                                       cpustate->CF = 1;
+                                       }
+                               } else {
+                                       i386_trap( 0, 0, 0);
+                               }
+                       }
+                       break;
+               case 7:         /* IDIV AL, Rm8 */
+                       {
+                               INT16 quotient, remainder, result;
+                               UINT8 src;
+                               if( modrm >= 0xc0 ) {
+                                       src = LOAD_RM8(modrm);
+                                       CYCLES(CYCLES_IDIV8_ACC_REG);
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0,1);
+                                       src = READ8(ea);
+                                       CYCLES(CYCLES_IDIV8_ACC_MEM);
+                               }
+
+                               quotient = (INT16)REG16(AX);
+                               if( src ) {
+                                       remainder = quotient % (INT16)(INT8)src;
+                                       result = quotient / (INT16)(INT8)src;
+                                       if( result > 0xff ) {
+                                               /* TODO: Divide error */
+                                       } else {
+                                               REG8(AH) = (UINT8)remainder & 0xff;
+                                               REG8(AL) = (UINT8)result & 0xff;
+
+                                               // this flag is actually undefined, enable on non-cyrix
+                                               if (cpustate->cpuid_id0 != 0x69727943)
+                                                       cpustate->CF = 1;
+                                       }
+                               } else {
+                                       i386_trap( 0, 0, 0);
+                               }
+                       }
+                       break;
+       }
+}
+
+void I386_OPS_BASE::I386OP(groupFE_8)()         // Opcode 0xfe
+{
+       UINT8 modrm = FETCH();
+
+       switch( (modrm >> 3) & 0x7 )
+       {
+               case 0:         /* INC Rm8 */
+                       if( modrm >= 0xc0 ) {
+                               UINT8 dst = LOAD_RM8(modrm);
+                               dst = INC8(dst);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_INC_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1,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(dst);
+                               STORE_RM8(modrm, dst);
+                               CYCLES(CYCLES_DEC_REG);
+                       } else {
+                               UINT32 ea = GetEA(modrm,1,1);
+                               UINT8 dst = READ8(ea);
+                               dst = DEC8(dst);
+                               WRITE8(ea, dst);
+                               CYCLES(CYCLES_DEC_MEM);
+                       }
+                       break;
+               case 6:         /* PUSH Rm8*/
+                       {
+                               UINT8 value;
+                               if( modrm >= 0xc0 ) {
+                                       value = LOAD_RM8(modrm);
+                               } else {
+                                       UINT32 ea = GetEA(modrm,0,1);
+                                       value = READ8(ea);
+                               }
+                               if( cpustate->operand_size ) {
+                                       PUSH32(value);
+                               } else {
+                                       PUSH16(value);
+                               }
+                               CYCLES(CYCLES_PUSH_RM);
+                       }
+                       break;
+               default:
+                       report_invalid_modrm( "groupFE_8", modrm);
+                       break;
+       }
+}
+
+
+
+void I386_OPS_BASE::I386OP(segment_CS)()        // Opcode 0x2e
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = CS;
+
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(segment_DS)()        // Opcode 0x3e
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = DS;
+       CYCLES(0); // TODO: Specify cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(segment_ES)()        // Opcode 0x26
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = ES;
+       CYCLES(0); // TODO: Specify cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(segment_FS)()        // Opcode 0x64
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = FS;
+       CYCLES(1); // TODO: Specify cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(segment_GS)()        // Opcode 0x65
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = GS;
+       CYCLES(1); // TODO: Specify cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(segment_SS)()        // Opcode 0x36
+{
+       cpustate->segment_prefix = 1;
+       cpustate->segment_override = SS;
+       CYCLES(0); // TODO: Specify cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(operand_size)()      // Opcode prefix 0x66
+{
+       if(cpustate->operand_prefix == 0)
+       {
+               cpustate->operand_size ^= 1;
+               cpustate->xmm_operand_size ^= 1;
+               cpustate->operand_prefix = 1;
+       }
+       cpustate->opcode = FETCH();
+       if (cpustate->opcode == 0x0f)
+               I386OP(decode_three_byte66)();
+       else
+       {
+               if( cpustate->operand_size )
+                       (this->*cpustate->opcode_table1_32[cpustate->opcode])();
+               else
+                       (this->*cpustate->opcode_table1_16[cpustate->opcode])();
+       }
+}
+
+void I386_OPS_BASE::I386OP(address_size)()      // Opcode 0x67
+{
+       if(cpustate->address_prefix == 0)
+       {
+               cpustate->address_size ^= 1;
+               cpustate->address_prefix = 1;
+       }
+       I386_OPS_BASE::I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(nop)()               // Opcode 0x90
+{
+       CYCLES(CYCLES_NOP);
+}
+
+void I386_OPS_BASE::I386OP(int3)()              // Opcode 0xcc
+{
+       CYCLES(CYCLES_INT3);
+       cpustate->ext = 0; // not an external interrupt
+       i386_trap(3, 1, 0);
+       cpustate->ext = 1;
+}
+
+void I386_OPS_BASE::I386OP(_int)()               // Opcode 0xcd
+{
+       int interrupt = FETCH();
+       CYCLES(CYCLES_INT);
+       // Without pseudo BIOS.
+       cpustate->ext = 0; // not an external interrupt
+       i386_trap(interrupt, 1, 0);
+       cpustate->ext = 1;
+}
+
+void I386_OPS_BASE::I386OP(into)()              // Opcode 0xce
+{
+       if( cpustate->OF ) {
+               cpustate->ext = 0;
+               i386_trap(4, 1, 0);
+               cpustate->ext = 1;
+               CYCLES(CYCLES_INTO_OF1);
+       }
+       else
+       {
+               CYCLES(CYCLES_INTO_OF0);
+       }
+}
+
+UINT32 i386_escape_ea;   // hack around GCC 4.6 error because we need the side effects of GetEA()
+void I386_OPS_BASE::I386OP(escape)()            // Opcodes 0xd8 - 0xdf
+{
+       UINT8 modrm = FETCH();
+       if(modrm < 0xc0)
+       {
+               i386_escape_ea = GetEA(modrm,0,1);
+       }
+       CYCLES(3); // TODO: confirm this
+       (void) LOAD_RM8(modrm);
+}
+
+void I386_OPS_BASE::I386OP(hlt)()               // Opcode 0xf4
+{
+       if(PROTECTED_MODE && cpustate->CPL != 0)
+               FAULT(FAULT_GP,0);
+       cpustate->halted = 1;
+       CYCLES(CYCLES_HLT);
+       if (cpustate->cycles > 0)
+               cpustate->cycles = 0;
+}
+
+void I386_OPS_BASE::I386OP(decimal_adjust)( int direction)
+{
+       UINT8 tmpAL = REG8(AL);
+       UINT8 tmpCF = cpustate->CF;
+
+       if (cpustate->AF || ((REG8(AL) & 0xf) > 9))
+       {
+               UINT16 t= (UINT16)REG8(AL) + (direction * 0x06);
+               REG8(AL) = (UINT8)t&0xff;
+               cpustate->AF = 1;
+               if (t & 0x100)
+                       cpustate->CF = 1;
+               if (direction > 0)
+                       tmpAL = REG8(AL);
+       }
+
+       if (tmpCF || (tmpAL > 0x99))
+       {
+               REG8(AL) += (direction * 0x60);
+               cpustate->CF = 1;
+       }
+
+       SetSZPF8(REG8(AL));
+}
+
+void I386_OPS_BASE::I386OP(daa)()               // Opcode 0x27
+{
+       I386OP(decimal_adjust)( +1);
+       CYCLES(CYCLES_DAA);
+}
+
+void I386_OPS_BASE::I386OP(das)()               // Opcode 0x2f
+{
+       I386OP(decimal_adjust)( -1);
+       CYCLES(CYCLES_DAS);
+}
+
+void I386_OPS_BASE::I386OP(aaa)()               // Opcode 0x37
+{
+       if( ( (REG8(AL) & 0x0f) > 9) || (cpustate->AF != 0) ) {
+               REG16(AX) = REG16(AX) + 6;
+               REG8(AH) = REG8(AH) + 1;
+               cpustate->AF = 1;
+               cpustate->CF = 1;
+       } else {
+               cpustate->AF = 0;
+               cpustate->CF = 0;
+       }
+       REG8(AL) = REG8(AL) & 0x0f;
+       CYCLES(CYCLES_AAA);
+}
+
+void I386_OPS_BASE::I386OP(aas)()               // Opcode 0x3f
+{
+       if (cpustate->AF || ((REG8(AL) & 0xf) > 9))
+       {
+               REG16(AX) -= 6;
+               REG8(AH) -= 1;
+               cpustate->AF = 1;
+               cpustate->CF = 1;
+       }
+       else
+       {
+               cpustate->AF = 0;
+               cpustate->CF = 0;
+       }
+       REG8(AL) &= 0x0f;
+       CYCLES(CYCLES_AAS);
+}
+
+void I386_OPS_BASE::I386OP(aad)()               // Opcode 0xd5
+{
+       UINT8 tempAL = REG8(AL);
+       UINT8 tempAH = REG8(AH);
+       UINT8 i = FETCH();
+
+       REG8(AL) = (tempAL + (tempAH * i)) & 0xff;
+       REG8(AH) = 0;
+       SetSZPF8( REG8(AL) );
+       CYCLES(CYCLES_AAD);
+}
+
+void I386_OPS_BASE::I386OP(aam)()               // Opcode 0xd4
+{
+       UINT8 tempAL = REG8(AL);
+       UINT8 i = FETCH();
+
+       if(!i)
+       {
+               i386_trap( 0, 0, 0);
+               return;
+       }
+       REG8(AH) = tempAL / i;
+       REG8(AL) = tempAL % i;
+       SetSZPF8( REG8(AL) );
+       CYCLES(CYCLES_AAM);
+}
+
+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(CYCLES_CLTS);
+}
+
+void I386_OPS_BASE::I386OP(wait)()              // Opcode 0x9B
+{
+       // TODO
+}
+
+void I386_OPS_BASE::I386OP(lock)()              // Opcode 0xf0
+{
+       // lock doesn't depend on iopl on 386
+       cpustate->lock = true;
+       CYCLES(CYCLES_LOCK);       // TODO: Determine correct cycle count
+       I386OP(decode_opcode)();
+}
+
+void I386_OPS_BASE::I386OP(mov_r32_tr)()        // Opcode 0x0f 24
+{
+       FETCH();
+       CYCLES(1);     // TODO: correct cycle count
+}
+
+void I386_OPS_BASE::I386OP(mov_tr_r32)()        // Opcode 0x0f 26
+{
+       FETCH();
+       CYCLES(1);     // TODO: correct cycle count
+}
+
+void I386_OPS_BASE::I386OP(loadall)()       // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented
+{
+       if(PROTECTED_MODE && (cpustate->CPL != 0))
+               FAULT(FAULT_GP,0)
+       UINT32 ea = i386_translate( ES, REG32(EDI), 0, 204);
+       cpustate->cr[0] = READ32( ea) & 0xfffeffff; // wp not supported on 386
+       set_flags( READ32( ea + 0x04));
+       cpustate->eip = READ32( ea + 0x08);
+       REG32(EDI) = READ32( ea + 0x0c);
+       REG32(ESI) = READ32( ea + 0x10);
+       REG32(EBP) = READ32( ea + 0x14);
+       REG32(ESP) = READ32( ea + 0x18);
+       REG32(EBX) = READ32( ea + 0x1c);
+       REG32(EDX) = READ32( ea + 0x20);
+       REG32(ECX) = READ32( ea + 0x24);
+       REG32(EAX) = READ32( ea + 0x28);
+       cpustate->dr[6] = READ32( ea + 0x2c);
+       cpustate->dr[7] = READ32( ea + 0x30);
+       cpustate->task.segment = READ16( ea + 0x34);
+       cpustate->ldtr.segment = READ16( ea + 0x38);
+       cpustate->sreg[GS].selector = READ16( ea + 0x3c);
+       cpustate->sreg[FS].selector = READ16( ea + 0x40);
+       cpustate->sreg[DS].selector = READ16( ea + 0x44);
+       cpustate->sreg[SS].selector = READ16( ea + 0x48);
+       cpustate->sreg[CS].selector = READ16( ea + 0x4c);
+       cpustate->sreg[ES].selector = READ16( ea + 0x50);
+       cpustate->task.flags = READ32( ea + 0x54) >> 8;
+       cpustate->task.base = READ32( ea + 0x58);
+       cpustate->task.limit = READ32( ea + 0x5c);
+       cpustate->idtr.base = READ32( ea + 0x64);
+       cpustate->idtr.limit = READ32( ea + 0x68);
+       cpustate->gdtr.base = READ32( ea + 0x70);
+       cpustate->gdtr.limit = READ32( ea + 0x74);
+       cpustate->ldtr.flags = READ32( ea + 0x78) >> 8;
+       cpustate->ldtr.base = READ32( ea + 0x7c);
+       cpustate->ldtr.limit = READ32( ea + 0x80);
+       cpustate->sreg[GS].flags = READ32( ea + 0x84) >> 8;
+       cpustate->sreg[GS].base = READ32( ea + 0x88);
+       cpustate->sreg[GS].limit = READ32( ea + 0x8c);
+       cpustate->sreg[FS].flags = READ32( ea + 0x90) >> 8;
+       cpustate->sreg[FS].base = READ32( ea + 0x94);
+       cpustate->sreg[FS].limit = READ32( ea + 0x98);
+       cpustate->sreg[DS].flags = READ32( ea + 0x9c) >> 8;
+       cpustate->sreg[DS].base = READ32( ea + 0xa0);
+       cpustate->sreg[DS].limit = READ32( ea + 0xa4);
+       cpustate->sreg[SS].flags = READ32( ea + 0xa8) >> 8;
+       cpustate->sreg[SS].base = READ32( ea + 0xac);
+       cpustate->sreg[SS].limit = READ32( ea + 0xb0);
+       cpustate->sreg[CS].flags = READ32( ea + 0xb4) >> 8;
+       cpustate->sreg[CS].base = READ32( ea + 0xb8);
+       cpustate->sreg[CS].limit = READ32( ea + 0xbc);
+       cpustate->sreg[ES].flags = READ32( ea + 0xc0) >> 8;
+       cpustate->sreg[ES].base = READ32( ea + 0xc4);
+       cpustate->sreg[ES].limit = READ32( ea + 0xc8);
+       cpustate->CPL = (cpustate->sreg[SS].flags >> 5) & 3; // cpl == dpl of ss
+
+       for(int i = 0; i <= GS; i++)
+       {
+               cpustate->sreg[i].valid = (cpustate->sreg[i].flags & 0x80) ? true : false;
+               cpustate->sreg[i].d = (cpustate->sreg[i].flags & 0x4000) ? 1 : 0;
+       }
+       CHANGE_PC( cpustate->eip);
+}
+
+void I386_OPS_BASE::I386OP(invalid)()
+{
+       report_invalid_opcode();
+       i386_trap( 6, 0, 0);
+}
+
+void I386_OPS_BASE::I386OP(xlat)()          // Opcode 0xd7
+{
+       UINT32 ea;
+       if( cpustate->segment_prefix ) {
+               if(!cpustate->address_size)
+               {
+                       ea = i386_translate( cpustate->segment_override, REG16(BX) + REG8(AL), 0, 1 );
+               }
+               else
+               {
+                       ea = i386_translate( cpustate->segment_override, REG32(EBX) + REG8(AL), 0, 1 );
+               }
+       } else {
+               if(!cpustate->address_size)
+               {
+                       ea = i386_translate( DS, REG16(BX) + REG8(AL), 0, 1 );
+               }
+               else
+               {
+                       ea = i386_translate( DS, REG32(EBX) + REG8(AL), 0, 1 );
+               }
+       }
+       REG8(AL) = READ8(ea);
+       CYCLES(CYCLES_XLAT);
+}
+
+#else
 UINT8 I386_OPS_BASE::I386OP(shift_rotate8)( UINT8 modrm, UINT32 value, UINT8 shift)
 {
        UINT32 src = value & 0xff;
@@ -159,7 +2762,7 @@ void I386_OPS_BASE::I386OP(adc_rm8_r8)()        // Opcode 0x10
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = ADC8( dst, src, cpustate->CF);
@@ -179,7 +2782,7 @@ void I386_OPS_BASE::I386OP(adc_r8_rm8)()        // Opcode 0x12
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = ADC8( dst, src, cpustate->CF);
@@ -209,7 +2812,7 @@ void I386_OPS_BASE::I386OP(add_rm8_r8)()        // Opcode 0x00
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = ADD8(dst, src);
@@ -229,7 +2832,7 @@ void I386_OPS_BASE::I386OP(add_r8_rm8)()        // Opcode 0x02
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = ADD8(dst, src);
@@ -259,7 +2862,7 @@ void I386_OPS_BASE::I386OP(and_rm8_r8)()        // Opcode 0x20
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = AND8(dst, src);
@@ -279,7 +2882,7 @@ void I386_OPS_BASE::I386OP(and_r8_rm8)()        // Opcode 0x22
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = AND8(dst, src);
@@ -338,7 +2941,7 @@ void I386_OPS_BASE::I386OP(cmp_rm8_r8)()        // Opcode 0x38
                SUB8(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                SUB8(dst, src);
@@ -356,7 +2959,7 @@ void I386_OPS_BASE::I386OP(cmp_r8_rm8)()        // Opcode 0x3a
                SUB8(dst, src);
                CYCLES(CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                SUB8(dst, src);
@@ -378,11 +2981,11 @@ void I386_OPS_BASE::I386OP(cmpsb)()             // Opcode 0xa6
        UINT32 eas, ead;
        UINT8 src, dst;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 1 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 1 );
        src = READ8(eas);
        dst = READ8(ead);
        SUB8(src, dst);
@@ -600,9 +3203,9 @@ void I386_OPS_BASE::I386OP(lodsb)()             // Opcode 0xac
 {
        UINT32 eas;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 1 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
        REG8(AL) = READ8(eas);
        BUMP_SI(1);
@@ -618,7 +3221,7 @@ void I386_OPS_BASE::I386OP(mov_rm8_r8)()        // Opcode 0x88
                STORE_RM8(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                WRITE8(ea, src);
                CYCLES(CYCLES_MOV_REG_MEM);
@@ -634,7 +3237,7 @@ void I386_OPS_BASE::I386OP(mov_r8_rm8)()        // Opcode 0x8a
                STORE_REG8(modrm, src);
                CYCLES(CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                STORE_REG8(modrm, src);
                CYCLES(CYCLES_MOV_MEM_REG);
@@ -649,7 +3252,7 @@ void I386_OPS_BASE::I386OP(mov_rm8_i8)()        // Opcode 0xc6
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                UINT8 value = FETCH();
                WRITE8(ea, value);
                CYCLES(CYCLES_MOV_IMM_MEM);
@@ -752,9 +3355,9 @@ void I386_OPS_BASE::I386OP(mov_al_m8)()         // Opcode 0xa0
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 0 );
+               ea = i386_translate( cpustate->segment_override, offset, 0, 1 );
        } else {
-               ea = i386_translate( DS, offset, 0 );
+               ea = i386_translate( DS, offset, 0, 1 );
        }
        REG8(AL) = READ8(ea);
        CYCLES(CYCLES_MOV_IMM_MEM);
@@ -770,9 +3373,9 @@ void I386_OPS_BASE::I386OP(mov_m8_al)()         // Opcode 0xa2
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate( cpustate->segment_override, offset, 1 );
+               ea = i386_translate( cpustate->segment_override, offset, 1, 1 );
        } else {
-               ea = i386_translate( DS, offset, 1 );
+               ea = i386_translate( DS, offset, 1, 1 );
        }
        WRITE8( ea, REG8(AL) );
        CYCLES(CYCLES_MOV_MEM_ACC);
@@ -790,7 +3393,7 @@ void I386_OPS_BASE::I386OP(mov_rm16_sreg)()     // Opcode 0x8c
                        STORE_RM16(modrm, cpustate->sreg[s].selector);
                CYCLES(CYCLES_MOV_SREG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,2);
                WRITE16(ea, cpustate->sreg[s].selector);
                CYCLES(CYCLES_MOV_SREG_MEM);
        }
@@ -807,7 +3410,7 @@ void I386_OPS_BASE::I386OP(mov_sreg_rm16)()     // Opcode 0x8e
                selector = LOAD_RM16(modrm);
                CYCLES(CYCLES_MOV_REG_SREG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,2);
                selector = READ16(ea);
                CYCLES(CYCLES_MOV_MEM_SREG);
        }
@@ -876,11 +3479,11 @@ void I386_OPS_BASE::I386OP(movsb)()             // Opcode 0xa4
        UINT32 eas, ead;
        UINT8 v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, 1 );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
        v = READ8(eas);
        WRITE8(ead, v);
        BUMP_SI(1);
@@ -899,7 +3502,7 @@ void I386_OPS_BASE::I386OP(or_rm8_r8)()         // Opcode 0x08
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = OR8(dst, src);
@@ -919,7 +3522,7 @@ void I386_OPS_BASE::I386OP(or_r8_rm8)()         // Opcode 0x0a
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = OR8(dst, src);
@@ -972,7 +3575,7 @@ void I386_OPS_BASE::I386OP(arpl)()           // Opcode 0x63
                                STORE_RM16(modrm, dst);
                        }
                } else {
-                       UINT32 ea = GetEA( modrm,1);
+                               UINT32 ea = GetEA( modrm,1,2);
                        src = LOAD_REG16(modrm);
                        dst = READ16( ea);
                        if( (dst&0x3) < (src&0x3) ) {
@@ -1001,7 +3604,7 @@ void I386_OPS_BASE::I386OP(ins_generic)( int size)
        UINT16 vw;
        UINT32 vd;
 
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, size );
 
        switch(size) {
        case 1:
@@ -1048,9 +3651,9 @@ void I386_OPS_BASE::I386OP(outs_generic)( int size)
        UINT32 vd;
 
        if( cpustate->segment_prefix ) {
-               eas = i386_translate( 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, size );
        } else {
-               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, size );
        }
 
        switch(size) {
@@ -1152,12 +3755,12 @@ void I386_OPS_BASE::I386OP(repeat)( 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->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, 1 );
        } else {
                //eas =
-               i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1 );
+               i386_translate( DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1, 1 );
        }
-       i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1 );
+       i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1, 1 );
 
        switch(opcode)
        {
@@ -1308,7 +3911,7 @@ void I386_OPS_BASE::I386OP(sbb_rm8_r8)()        // Opcode 0x18
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = SBB8( dst, src, cpustate->CF);
@@ -1328,7 +3931,7 @@ void I386_OPS_BASE::I386OP(sbb_r8_rm8)()        // Opcode 0x1a
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = SBB8( dst, src, cpustate->CF);
@@ -1351,7 +3954,7 @@ void I386_OPS_BASE::I386OP(scasb)()             // Opcode 0xae
 {
        UINT32 eas;
        UINT8 src, dst;
-       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 , 1);
        src = READ8(eas);
        dst = REG8(AL);
        SUB8(dst, src);
@@ -1380,7 +3983,7 @@ void I386_OPS_BASE::I386OP(seta_rm8)()          // Opcode 0x0f 97
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1397,7 +4000,7 @@ void I386_OPS_BASE::I386OP(setbe_rm8)()         // Opcode 0x0f 96
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1414,7 +4017,7 @@ void I386_OPS_BASE::I386OP(setc_rm8)()          // Opcode 0x0f 92
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1431,7 +4034,7 @@ void I386_OPS_BASE::I386OP(setg_rm8)()          // Opcode 0x0f 9f
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1448,7 +4051,7 @@ void I386_OPS_BASE::I386OP(setge_rm8)()         // Opcode 0x0f 9d
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1465,7 +4068,7 @@ void I386_OPS_BASE::I386OP(setl_rm8)()          // Opcode 0x0f 9c
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1482,7 +4085,7 @@ void I386_OPS_BASE::I386OP(setle_rm8)()         // Opcode 0x0f 9e
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1499,7 +4102,7 @@ void I386_OPS_BASE::I386OP(setnc_rm8)()         // Opcode 0x0f 93
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1516,7 +4119,7 @@ void I386_OPS_BASE::I386OP(setno_rm8)()         // Opcode 0x0f 91
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1533,7 +4136,7 @@ void I386_OPS_BASE::I386OP(setnp_rm8)()         // Opcode 0x0f 9b
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1550,7 +4153,7 @@ void I386_OPS_BASE::I386OP(setns_rm8)()         // Opcode 0x0f 99
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1567,7 +4170,7 @@ void I386_OPS_BASE::I386OP(setnz_rm8)()         // Opcode 0x0f 95
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1584,7 +4187,7 @@ void I386_OPS_BASE::I386OP(seto_rm8)()          // Opcode 0x0f 90
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1601,7 +4204,7 @@ void I386_OPS_BASE::I386OP(setp_rm8)()          // Opcode 0x0f 9a
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1618,7 +4221,7 @@ void I386_OPS_BASE::I386OP(sets_rm8)()          // Opcode 0x0f 98
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1635,7 +4238,7 @@ void I386_OPS_BASE::I386OP(setz_rm8)()          // Opcode 0x0f 94
                STORE_RM8(modrm, value);
                CYCLES(CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                WRITE8(ea, value);
                CYCLES(CYCLES_SETCC_MEM);
        }
@@ -1668,7 +4271,7 @@ void I386_OPS_BASE::I386OP(sti)()               // Opcode 0xfb
 void I386_OPS_BASE::I386OP(stosb)()             // Opcode 0xaa
 {
        UINT32 ead;
-       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate( ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
        WRITE8(ead, REG8(AL));
        BUMP_DI(1);
        CYCLES(CYCLES_STOS);
@@ -1685,7 +4288,7 @@ void I386_OPS_BASE::I386OP(sub_rm8_r8)()        // Opcode 0x28
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = SUB8(dst, src);
@@ -1705,7 +4308,7 @@ void I386_OPS_BASE::I386OP(sub_r8_rm8)()        // Opcode 0x2a
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = SUB8(dst, src);
@@ -1748,7 +4351,7 @@ void I386_OPS_BASE::I386OP(test_rm8_r8)()       // Opcode 0x84
                cpustate->OF = 0;
                CYCLES(CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = src & dst;
@@ -1769,7 +4372,7 @@ void I386_OPS_BASE::I386OP(xchg_r8_rm8)()       // Opcode 0x86
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                UINT8 src = READ8(ea);
                UINT8 dst = LOAD_REG8(modrm);
                WRITE8(ea, dst);
@@ -1789,7 +4392,7 @@ void I386_OPS_BASE::I386OP(xor_rm8_r8)()        // Opcode 0x30
                STORE_RM8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(ea);
                dst = XOR8(dst, src);
@@ -1809,7 +4412,7 @@ void I386_OPS_BASE::I386OP(xor_r8_rm8)()        // Opcode 0x32
                STORE_REG8(modrm, dst);
                CYCLES(CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm,0,1);
                src = READ8(ea);
                dst = LOAD_REG8(modrm);
                dst = XOR8(dst, src);
@@ -1846,7 +4449,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = ADD8(dst, src);
@@ -1862,7 +4465,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = OR8(dst, src);
@@ -1878,7 +4481,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = ADC8( dst, src, cpustate->CF);
@@ -1894,7 +4497,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = SBB8( dst, src, cpustate->CF);
@@ -1910,7 +4513,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = AND8(dst, src);
@@ -1926,7 +4529,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = SUB8(dst, src);
@@ -1942,7 +4545,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(modrm,1);
+                               ea = GetEA(modrm,1,1);
                                dst = READ8(ea);
                                src = FETCH();
                                dst = XOR8(dst, src);
@@ -1957,7 +4560,7 @@ void I386_OPS_BASE::I386OP(group80_8)()         // Opcode 0x80
                                SUB8(dst, src);
                                CYCLES(CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(modrm,0);
+                               ea = GetEA(modrm,0,1);
                                dst = READ8(ea);
                                src = FETCH();
                                SUB8(dst, src);
@@ -1979,7 +4582,7 @@ void I386_OPS_BASE::I386OP(groupC0_8)()         // Opcode 0xc0
                dst = i386_shift_rotate8( modrm, dst, shift);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                dst = READ8(ea);
                shift = FETCH() & 0x1f;
                dst = i386_shift_rotate8( modrm, dst, shift);
@@ -1997,7 +4600,7 @@ void I386_OPS_BASE::I386OP(groupD0_8)()         // Opcode 0xd0
                dst = i386_shift_rotate8( modrm, dst, 1);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                dst = READ8(ea);
                dst = i386_shift_rotate8( modrm, dst, 1);
                WRITE8(ea, dst);
@@ -2014,7 +4617,7 @@ void I386_OPS_BASE::I386OP(groupD2_8)()         // Opcode 0xd2
                dst = i386_shift_rotate8( modrm, dst, REG8(CL));
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm,1,1);
                dst = READ8(ea);
                dst = i386_shift_rotate8( modrm, dst, REG8(CL));
                WRITE8(ea, dst);
@@ -2036,7 +4639,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                SetSZPF8(dst);
                                CYCLES(CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,0);
+                               UINT32 ea = GetEA(modrm,0,1);
                                UINT8 dst = READ8(ea);
                                UINT8 src = FETCH();
                                dst &= src;
@@ -2052,7 +4655,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,1);
                                UINT8 dst = READ8(ea);
                                dst = ~dst;
                                WRITE8(ea, dst);
@@ -2066,7 +4669,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,1);
                                UINT8 dst = READ8(ea);
                                dst = SUB8( 0, dst );
                                WRITE8(ea, dst);
@@ -2081,7 +4684,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(CYCLES_MUL8_ACC_REG);       /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,1);
                                        src = READ8(ea);
                                        CYCLES(CYCLES_MUL8_ACC_MEM);       /* TODO: Correct multiply timing */
                                }
@@ -2101,7 +4704,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                        src = (INT16)(INT8)LOAD_RM8(modrm);
                                        CYCLES(CYCLES_IMUL8_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,1);
                                        src = (INT16)(INT8)READ8(ea);
                                        CYCLES(CYCLES_IMUL8_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2122,7 +4725,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(CYCLES_DIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,1);
                                        src = READ8(ea);
                                        CYCLES(CYCLES_DIV8_ACC_MEM);
                                }
@@ -2154,7 +4757,7 @@ void I386_OPS_BASE::I386OP(groupF6_8)()         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(CYCLES_IDIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,1);
                                        src = READ8(ea);
                                        CYCLES(CYCLES_IDIV8_ACC_MEM);
                                }
@@ -2194,7 +4797,7 @@ void I386_OPS_BASE::I386OP(groupFE_8)()         // Opcode 0xfe
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,1);
                                UINT8 dst = READ8(ea);
                                dst = INC8(dst);
                                WRITE8(ea, dst);
@@ -2208,7 +4811,7 @@ void I386_OPS_BASE::I386OP(groupFE_8)()         // Opcode 0xfe
                                STORE_RM8(modrm, dst);
                                CYCLES(CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(modrm,1);
+                               UINT32 ea = GetEA(modrm,1,1);
                                UINT8 dst = READ8(ea);
                                dst = DEC8(dst);
                                WRITE8(ea, dst);
@@ -2221,7 +4824,7 @@ void I386_OPS_BASE::I386OP(groupFE_8)()         // Opcode 0xfe
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM8(modrm);
                                } else {
-                                       UINT32 ea = GetEA(modrm,0);
+                                       UINT32 ea = GetEA(modrm,0,1);
                                        value = READ8(ea);
                                }
                                if( cpustate->operand_size ) {
@@ -2331,7 +4934,7 @@ void I386_OPS_BASE::I386OP(int3)()              // Opcode 0xcc
        cpustate->ext = 1;
 }
 
-void I386_OPS_BASE::I386_OPS_BASE::I386OP(int)()               // Opcode 0xcd
+void I386_OPS_BASE::I386OP(int)()               // Opcode 0xcd
 {
        int interrupt = FETCH();
        CYCLES(CYCLES_INT);
@@ -2360,7 +4963,7 @@ void I386_OPS_BASE::I386OP(escape)()            // Opcodes 0xd8 - 0xdf
        UINT8 modrm = FETCH();
        if(modrm < 0xc0)
        {
-               i386_escape_ea = GetEA(modrm,0);
+               i386_escape_ea = GetEA(modrm,0,1);
        }
        CYCLES(3); // TODO: confirm this
        (void) LOAD_RM8(modrm);
@@ -2512,7 +5115,7 @@ void I386_OPS_BASE::I386OP(loadall)()       // Opcode 0x0f 0x07 (0x0f 0x05 on 80
 {
        if(PROTECTED_MODE && (cpustate->CPL != 0))
                FAULT(FAULT_GP,0)
-       UINT32 ea = i386_translate(ES, REG32(EDI), 0);
+       UINT32 ea = i386_translate(ES, REG32(EDI), 0, 204);
        cpustate->cr[0] = READ32(ea) & 0xfffeffff; // wp not supported on 386
        set_flags(READ32(ea + 0x04));
        cpustate->eip = READ32( ea + 0x08);
@@ -2584,22 +5187,23 @@ void I386_OPS_BASE::I386OP(xlat)()          // Opcode 0xd7
        if( cpustate->segment_prefix ) {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate( cpustate->segment_override, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate( cpustate->segment_override, REG16(BX) + REG8(AL), 0, 1);
                }
                else
                {
-                       ea = i386_translate( cpustate->segment_override, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate( cpustate->segment_override, REG32(EBX) + REG8(AL), 0, 1);
                }
        } else {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate( DS, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate( DS, REG16(BX) + REG8(AL), 0, 1);
                }
                else
                {
-                       ea = i386_translate( DS, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate( DS, REG32(EBX) + REG8(AL), 0, 1);
                }
        }
        REG8(AL) = READ8(ea);
        CYCLES(CYCLES_XLAT);
 }
+#endif
index 1dff262..d53599f 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Phil Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #ifndef __LIB_I386_OPS_OPS_H__
 #define __LIB_I386_OPS_OPS_H__
 class I386_OPS_BASE;
index 314e109..0dc7751 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #pragma once
 
 #ifndef __LIB_I386_PRIV_H__
index c6ba671..8de0354 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 // Intel 486+ specific opcodes
 #include "./i386_opdef.h"
 
@@ -68,7 +68,7 @@ void I386_OPS_BASE::I486OP(cmpxchg_rm8_r8)()    // Opcode 0x0f b0
                }
        } else {
                // TODO: Check write if needed
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 1);
                UINT8 dst = READ8(ea);
                UINT8 src = LOAD_REG8(modrm);
 
@@ -101,7 +101,7 @@ void I386_OPS_BASE::I486OP(cmpxchg_rm16_r16)()  // Opcode 0x0f b1
                        CYCLES(CYCLES_CMPXCHG_REG_REG_F);
                }
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                UINT16 dst = READ16(ea);
                UINT16 src = LOAD_REG16(modrm);
 
@@ -134,7 +134,7 @@ void I386_OPS_BASE::I486OP(cmpxchg_rm32_r32)()  // Opcode 0x0f b1
                        CYCLES(CYCLES_CMPXCHG_REG_REG_F);
                }
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                UINT32 dst = READ32(ea);
                UINT32 src = LOAD_REG32(modrm);
 
@@ -160,7 +160,7 @@ void I386_OPS_BASE::I486OP(xadd_rm8_r8)()   // Opcode 0x0f c0
                STORE_RM8(modrm, dst + src);
                CYCLES(CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm, 1, 1);
                UINT8 dst = READ8(ea);
                UINT8 src = LOAD_REG8(modrm);
                WRITE8(ea, dst + src);
@@ -179,7 +179,7 @@ void I386_OPS_BASE::I486OP(xadd_rm16_r16)() // Opcode 0x0f c1
                STORE_RM16(modrm, dst + src);
                CYCLES(CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm, 1, 2);
                UINT16 dst = READ16(ea);
                UINT16 src = LOAD_REG16(modrm);
                WRITE16(ea, dst + src);
@@ -198,7 +198,7 @@ void I386_OPS_BASE::I486OP(xadd_rm32_r32)() // Opcode 0x0f c1
                STORE_RM32(modrm, dst + src);
                CYCLES(CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(modrm,1);
+               UINT32 ea = GetEA(modrm, 1, 4);
                UINT32 dst = READ32(ea);
                UINT32 src = LOAD_REG32(modrm);
                WRITE32(ea, dst + src);
@@ -219,9 +219,9 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(  CS, address, 1 );
+                                       ea = i386_translate(  CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 6);
                                }
                                WRITE16(ea, cpustate->gdtr.limit);
                                WRITE32(ea + 2, cpustate->gdtr.base & 0xffffff);
@@ -233,11 +233,11 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(  CS, address, 1 );
+                                       ea = i386_translate(  CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 6);
                                }
                                WRITE16(ea, cpustate->idtr.limit);
                                WRITE32(ea + 2, cpustate->idtr.base & 0xffffff);
@@ -250,9 +250,9 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(  CS, address, 0 );
+                                       ea = i386_translate(  CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 6);
                                }
                                cpustate->gdtr.limit = READ16(ea);
                                cpustate->gdtr.base = READ32(ea + 2) & 0xffffff;
@@ -265,9 +265,9 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(  CS, address, 0 );
+                                       ea = i386_translate(  CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 6);
                                }
                                cpustate->idtr.limit = READ16(ea);
                                cpustate->idtr.base = READ32(ea + 2) & 0xffffff;
@@ -280,7 +280,7 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                        STORE_RM16(modrm, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 2);
                                        WRITE16(ea, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_MEM);
                                }
@@ -295,7 +295,7 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 2);
                                        CYCLES(CYCLES_LMSW_MEM);
                                        b = READ16(ea);
                                }
@@ -314,7 +314,7 @@ void I386_OPS_BASE::I486OP(group0F01_16)()      // Opcode 0x0f 01
                                        logerror("i486: invlpg with modrm %02X\n", modrm);
                                        FAULT(FAULT_UD,0)
                                }
-                               ea = GetEA(modrm,-1);
+                               ea = GetEA(modrm, -1, 1);
                                CYCLES(25); // TODO: add to cycles.h
                                vtlb_flush_address(cpustate->vtlb, ea);
                                break;
@@ -336,9 +336,9 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(  CS, address, 1 );
+                                       ea = i386_translate(  CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 6);
                                }
                                WRITE16(ea, cpustate->gdtr.limit);
                                WRITE32(ea + 2, cpustate->gdtr.base);
@@ -350,11 +350,11 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(  CS, address, 1 );
+                                       ea = i386_translate(  CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 6);
                                }
                                WRITE16(ea, cpustate->idtr.limit);
                                WRITE32(ea + 2, cpustate->idtr.base);
@@ -367,9 +367,9 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(  CS, address, 0 );
+                                       ea = i386_translate(  CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 6);
                                }
                                cpustate->gdtr.limit = READ16(ea);
                                cpustate->gdtr.base = READ32(ea + 2);
@@ -382,9 +382,9 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( CS, address, 0 );
+                                       ea = i386_translate( CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 6);
                                }
                                cpustate->idtr.limit = READ16(ea);
                                cpustate->idtr.base = READ32(ea + 2);
@@ -398,7 +398,7 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                        CYCLES(CYCLES_SMSW_REG);
                                } else {
                                        /* always 16-bit memory operand */
-                                       ea = GetEA(modrm,1);
+                                       ea = GetEA(modrm, 1, 2);
                                        WRITE16(ea, cpustate->cr[0]);
                                        CYCLES(CYCLES_SMSW_MEM);
                                }
@@ -413,7 +413,7 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(modrm,0);
+                                       ea = GetEA(modrm, 0, 2);
                                        CYCLES(CYCLES_LMSW_MEM);
                                b = READ16(ea);
                                }
@@ -432,7 +432,7 @@ void I386_OPS_BASE::I486OP(group0F01_32)()      // Opcode 0x0f 01
                                        logerror("i486: invlpg with modrm %02X\n", modrm);
                                        FAULT(FAULT_UD,0)
                                }
-                               ea = GetEA(modrm,-1);
+                               ea = GetEA(modrm, -1, 1);
                                CYCLES(25); // TODO: add to cycles.h
                                vtlb_flush_address(cpustate->vtlb, ea);
                                break;
index fdd4b97..8d4a871 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 // Pentium+ specific opcodes
 #include "./i386_opdef.h"
 
@@ -154,7 +154,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
  void I386_OPS_BASE::PENTIUMOP(prefetch_m8)()    // Opcode 0x0f 18
 {
        UINT8 modrm = FETCH();
-       UINT32 ea = GetEA(modrm,0);
+       UINT32 ea = GetEA(modrm, 0, 1);
        CYCLES(1+(ea & 1)); // TODO: correct cycle count
 }
 
@@ -174,7 +174,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->OF == 1)
                {
                        src = READ16(ea);
@@ -200,7 +200,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->OF == 1)
                {
                        src = READ32(ea);
@@ -226,7 +226,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->OF == 0)
                {
                        src = READ16(ea);
@@ -252,7 +252,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->OF == 0)
                {
                        src = READ32(ea);
@@ -278,7 +278,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->CF == 1)
                {
                        src = READ16(ea);
@@ -304,7 +304,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->CF == 1)
                {
                        src = READ32(ea);
@@ -330,7 +330,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->CF == 0)
                {
                        src = READ16(ea);
@@ -356,7 +356,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->CF == 0)
                {
                        src = READ32(ea);
@@ -382,7 +382,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->ZF == 1)
                {
                        src = READ16(ea);
@@ -408,7 +408,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->ZF == 1)
                {
                        src = READ32(ea);
@@ -434,7 +434,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->ZF == 0)
                {
                        src = READ16(ea);
@@ -460,7 +460,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->ZF == 0)
                {
                        src = READ32(ea);
@@ -486,7 +486,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if ((cpustate->CF == 1) || (cpustate->ZF == 1))
                {
                        src = READ16(ea);
@@ -512,7 +512,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if ((cpustate->CF == 1) || (cpustate->ZF == 1))
                {
                        src = READ32(ea);
@@ -538,7 +538,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if ((cpustate->CF == 0) && (cpustate->ZF == 0))
                {
                        src = READ16(ea);
@@ -564,7 +564,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if ((cpustate->CF == 0) && (cpustate->ZF == 0))
                {
                        src = READ32(ea);
@@ -590,7 +590,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->SF == 1)
                {
                        src = READ16(ea);
@@ -616,7 +616,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->SF == 1)
                {
                        src = READ32(ea);
@@ -642,7 +642,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->SF == 0)
                {
                        src = READ16(ea);
@@ -668,7 +668,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->SF == 0)
                {
                        src = READ32(ea);
@@ -694,7 +694,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->PF == 1)
                {
                        src = READ16(ea);
@@ -720,7 +720,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->PF == 1)
                {
                        src = READ32(ea);
@@ -746,7 +746,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->PF == 0)
                {
                        src = READ16(ea);
@@ -772,7 +772,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->PF == 0)
                {
                        src = READ32(ea);
@@ -798,7 +798,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->SF != cpustate->OF)
                {
                        src = READ16(ea);
@@ -824,7 +824,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->SF != cpustate->OF)
                {
                        src = READ32(ea);
@@ -850,7 +850,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if (cpustate->SF == cpustate->OF)
                {
                        src = READ16(ea);
@@ -876,7 +876,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if (cpustate->SF == cpustate->OF)
                {
                        src = READ32(ea);
@@ -902,7 +902,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if ((cpustate->ZF == 1) || (cpustate->SF != cpustate->OF))
                {
                        src = READ16(ea);
@@ -928,7 +928,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if ((cpustate->ZF == 1) || (cpustate->SF != cpustate->OF))
                {
                        src = READ32(ea);
@@ -954,7 +954,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                if ((cpustate->ZF == 0) && (cpustate->SF == cpustate->OF))
                {
                        src = READ16(ea);
@@ -980,7 +980,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
        }
        else
        {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                if ((cpustate->ZF == 0) && (cpustate->SF == cpustate->OF))
                {
                        src = READ32(ea);
@@ -998,7 +998,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                WRITE16(ea,LOAD_RM16(modrm));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -1012,7 +1012,7 @@ void I386_OPS_BASE::PENTIUMOP(rdmsr)()          // Opcode 0x0f 32
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                WRITE32(ea,LOAD_RM32(modrm));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -1043,7 +1043,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modm >= 0xc0 ) {
                report_invalid_modrm( "cmpxchg8b_m64", modm);
        } else {
-               UINT32 ea = GetEA(modm, 0);
+               UINT32 ea = GetEA(modm, 0, 8);
                UINT64 value = READ64( ea);
                UINT64 edx_eax = (((UINT64) REG32(EDX)) << 32) | REG32(EAX);
                UINT64 ecx_ebx = (((UINT64) REG32(ECX)) << 32) | REG32(EBX);
@@ -1069,7 +1069,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // unsupported
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEMMX( ea, MMX((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -1079,7 +1079,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
 {
        int s,m,n;
        UINT8 modm = FETCH();
-       UINT32 ea = GetEA(7, 0); // ds:di/edi/rdi register
+       UINT32 ea = GetEA(7, 0, 8); // ds:di/edi/rdi register
        MMXPROLOG();
        s=(modm >> 3) & 7;
        m=modm & 7;
@@ -1092,7 +1092,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
 {
        int s,m,n;
        UINT8 modm = FETCH();
-       UINT32 ea = GetEA(7, 0); // ds:di/edi/rdi register
+       UINT32 ea = GetEA(7, 0, 16); // ds:di/edi/rdi register
        s=(modm >> 3) & 7;
        m=modm & 7;
        for (n=0;n < 16;n++)
@@ -1109,7 +1109,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                src = READ16(ea);
        }
        count=0;
@@ -1130,7 +1130,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                src = READ32(ea);
        }
        count=0;
@@ -1358,7 +1358,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).w[3]=MMX((modrm >> 3) & 0x7).w[3] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).w[0]=MMX((modrm >> 3) & 0x7).w[0] >> count;
@@ -1379,7 +1379,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).d[1]=MMX((modrm >> 3) & 0x7).d[1] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).d[0]=MMX((modrm >> 3) & 0x7).d[0] >> count;
@@ -1397,7 +1397,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q >> count;
@@ -1413,7 +1413,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q+MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q+src.q;
        }
@@ -1431,7 +1431,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).w[3]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3]) & 0xffff;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                MMX((modrm >> 3) & 0x7).w[0]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)src.s[0]) & 0xffff;
                MMX((modrm >> 3) & 0x7).w[1]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)src.s[1]) & 0xffff;
@@ -1451,7 +1451,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] < MMX(modrm & 7).b[n] ? 0 : MMX((modrm >> 3) & 0x7).b[n]-MMX(modrm & 7).b[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] < src.b[n] ? 0 : MMX((modrm >> 3) & 0x7).b[n]-src.b[n];
@@ -1469,7 +1469,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] < MMX(modrm & 7).w[n] ? 0 : MMX((modrm >> 3) & 0x7).w[n]-MMX(modrm & 7).w[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] < src.w[n] ? 0 : MMX((modrm >> 3) & 0x7).w[n]-src.w[n];
@@ -1485,7 +1485,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q & MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q & src.q;
        }
@@ -1502,7 +1502,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] > (0xff-MMX(modrm & 7).b[n]) ? 0xff : MMX((modrm >> 3) & 0x7).b[n]+MMX(modrm & 7).b[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] > (0xff-src.b[n]) ? 0xff : MMX((modrm >> 3) & 0x7).b[n]+src.b[n];
@@ -1520,7 +1520,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] > (0xffff-MMX(modrm & 7).w[n]) ? 0xffff : MMX((modrm >> 3) & 0x7).w[n]+MMX(modrm & 7).w[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] > (0xffff-src.w[n]) ? 0xffff : MMX((modrm >> 3) & 0x7).w[n]+src.w[n];
@@ -1536,7 +1536,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=(~MMX((modrm >> 3) & 0x7).q) & MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                MMX((modrm >> 3) & 0x7).q=(~MMX((modrm >> 3) & 0x7).q) & src.q;
        }
@@ -1555,7 +1555,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).s[3]=MMX((modrm >> 3) & 0x7).s[3] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).s[0]=MMX((modrm >> 3) & 0x7).s[0] >> count;
@@ -1576,7 +1576,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).i[1]=MMX((modrm >> 3) & 0x7).i[1] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).i[0]=MMX((modrm >> 3) & 0x7).i[0] >> count;
@@ -1596,7 +1596,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).w[3]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3]) >> 16;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, src);
                MMX((modrm >> 3) & 0x7).w[0]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)src.s[0]) >> 16;
                MMX((modrm >> 3) & 0x7).w[1]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)src.s[1]) >> 16;
@@ -1616,7 +1616,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] - (INT16)MMX(modrm & 7).c[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] - (INT16)s.c[n]);
@@ -1634,7 +1634,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] - (INT32)MMX(modrm & 7).s[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] - (INT32)s.s[n]);
@@ -1650,7 +1650,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q | MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q | s.q;
        }
@@ -1667,7 +1667,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] + (INT16)MMX(modrm & 7).c[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] + (INT16)s.c[n]);
@@ -1685,7 +1685,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] + (INT32)MMX(modrm & 7).s[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] + (INT32)s.s[n]);
@@ -1701,7 +1701,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q ^ MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q ^ s.q;
        }
@@ -1720,7 +1720,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).w[3]=MMX((modrm >> 3) & 0x7).w[3] << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).w[0]=MMX((modrm >> 3) & 0x7).w[0] << count;
@@ -1741,7 +1741,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).d[1]=MMX((modrm >> 3) & 0x7).d[1] << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).d[0]=MMX((modrm >> 3) & 0x7).d[0] << count;
@@ -1759,7 +1759,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q << count;
@@ -1778,7 +1778,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                                                                                (INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).i[0]=(INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)s.s[0]+
                                                                                (INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)s.s[1];
@@ -1798,7 +1798,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] - MMX(modrm & 7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] - s.b[n];
@@ -1816,7 +1816,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] - MMX(modrm & 7).w[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] - s.w[n];
@@ -1834,7 +1834,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] - MMX(modrm & 7).d[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 2;n++)
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] - s.d[n];
@@ -1852,7 +1852,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] + MMX(modrm & 7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] + s.b[n];
@@ -1870,7 +1870,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] + MMX(modrm & 7).w[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] + s.w[n];
@@ -1888,7 +1888,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] + MMX(modrm & 7).d[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 2;n++)
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] + s.d[n];
@@ -1908,7 +1908,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        UINT8 modrm = FETCH();
 
        if( modrm < 0xc0 ) {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 10);
                int index = (modrm >> 3) & 7;
                int limit;
                switch (index)
@@ -1972,7 +1972,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        UINT8 modrm = FETCH();
 
        if( modrm < 0xc0 ) {
-               UINT32 ea = GetEA(modrm,0);
+               UINT32 ea = GetEA(modrm, 0, 10);
                int index = (modrm >> 3) & 7;
                UINT16 flags;
                UINT32 base;
@@ -2041,7 +2041,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                UINT8 modrm = FETCH();
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm, 0, 10);
                        UINT32 limit = cpustate->ldtr.limit;
 
                        if (cpustate->ldtr.flags & 0x8000) //G bit
@@ -2073,7 +2073,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                UINT8 modrm = FETCH();
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm, 0, 10);
                        UINT16 flags = READ16(ea + 5);
                        UINT32 base = (READ32(ea + 2) | 0x00ffffff) | (READ8(ea + 7) << 24);
                        UINT32 limit = READ16(ea + 0) | ((flags & 3) << 16);
@@ -2106,7 +2106,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                UINT8 modrm = FETCH();
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm, 0, 10);
                        UINT32 limit = cpustate->task.limit;
 
                        if (cpustate->task.flags & 0x8000) //G bit
@@ -2137,7 +2137,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                UINT8 modrm = FETCH();
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(modrm,0);
+                       UINT32 ea = GetEA(modrm, 0, 10);
                        UINT16 flags = READ16(ea + 5);
                        UINT32 base = (READ32(ea + 2) | 0x00ffffff) | (READ8(ea + 7) << 24);
                        UINT32 limit = READ16(ea + 0) | ((flags & 3) << 16);
@@ -2166,7 +2166,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
        }
        MMX((modrm >> 3) & 0x7).d[1]=0;
@@ -2180,7 +2180,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, MMX((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -2193,7 +2193,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -2206,7 +2206,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEMMX( ea, MMX((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -2226,7 +2226,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (c=0;c <= 7;c++)
                        MMX(d).b[c]=(MMX(d).b[c] == s.b[c]) ? 0xff : 0;
@@ -2249,7 +2249,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).w[0]=(MMX(d).w[0] == s.w[0]) ? 0xffff : 0;
                MMX(d).w[1]=(MMX(d).w[1] == s.w[1]) ? 0xffff : 0;
@@ -2272,7 +2272,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).d[0]=(MMX(d).d[0] == s.d[0]) ? 0xffffffff : 0;
                MMX(d).d[1]=(MMX(d).d[1] == s.d[1]) ? 0xffffffff : 0;
@@ -2298,7 +2298,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                UINT8 imm8 = FETCH();
                READMMX( ea, s);
                MMX(d).w[0]=s.w[imm8 & 3];
@@ -2339,7 +2339,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64( ea);
                for (int n = 0; n < 8; n++) {
@@ -2368,7 +2368,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64( ea);
                for (int n = 0; n < 4; n++) {
@@ -2397,7 +2397,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64( ea);
                for (int n = 0; n < 2; n++) {
@@ -2424,7 +2424,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64( ea);
                XMM(d).q[0] = xd.q[0];
@@ -2454,7 +2454,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                UINT32 s,t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s = READ32(ea);
                t=MMX(d).d[0];
                MMX(d).b[0]=t & 0xff;
@@ -2487,7 +2487,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                UINT32 s;
                UINT16 t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s = READ32(ea);
                t=MMX(d).w[1];
                MMX(d).w[0]=MMX(d).w[0];
@@ -2511,7 +2511,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                UINT32 s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s = READ32(ea);
                MMX(d).d[0]=MMX(d).d[0];
                MMX(d).d[1]=s;
@@ -2538,7 +2538,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).c[0]=SaturatedSignedWordToSignedByte(MMX(d).s[0]);
                MMX(d).c[1]=SaturatedSignedWordToSignedByte(MMX(d).s[1]);
@@ -2566,7 +2566,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (c=0;c <= 7;c++)
                        MMX(d).b[c]=(MMX(d).c[c] > s.c[c]) ? 0xff : 0;
@@ -2588,7 +2588,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (c=0;c <= 3;c++)
                        MMX(d).w[c]=(MMX(d).s[c] > s.s[c]) ? 0xffff : 0;
@@ -2610,7 +2610,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (c=0;c <= 1;c++)
                        MMX(d).d[c]=(MMX(d).i[c] > s.i[c]) ? 0xffffffff : 0;
@@ -2640,7 +2640,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s,t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                t.q = MMX(d).q;
                MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(t.s[0]);
@@ -2674,7 +2674,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).b[0]=MMX(d).b[4];
                MMX(d).b[1]=s.b[4];
@@ -2703,7 +2703,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).w[0]=MMX(d).w[2];
                MMX(d).w[1]=s.w[2];
@@ -2726,7 +2726,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX(d).d[0]=MMX(d).d[1];
                MMX(d).d[1]=s.d[1];
@@ -2756,7 +2756,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX_REG s;
                INT32 t1, t2;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                t1 = MMX(d).i[0];
                t2 = MMX(d).i[1];
@@ -2783,11 +2783,11 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                switch ( (modm & 0x38) >> 3 )
                {
                        case 2: // ldmxcsr m32
-                               ea = GetEA(modm, 0);
+                               ea = GetEA(modm, 0, 4);
                                cpustate->mxcsr = READ32(ea);
                                break;
                        case 3: // stmxcsr m32
-                               ea = GetEA(modm, 0);
+                               ea = GetEA(modm, 0, 4);
                                WRITE32(ea, cpustate->mxcsr);
                                break;
                        case 7: // clflush m8
@@ -2811,7 +2811,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).i[3]=(INT32)XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f[1];
@@ -2828,7 +2828,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f64[0] = XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s.d[0] = READ32(ea);
                XMM((modrm >> 3) & 0x7).f64[0] = s.f[0];
        }
@@ -2843,7 +2843,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                src = (INT32)XMM(modrm & 0x7).f[0^NATIVE_ENDIAN_VALUE_LE_BE(0,1)];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                t.d[0] = READ32(ea);
                src = (INT32)t.f[0];
        }
@@ -2859,7 +2859,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                src = (INT32)XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG t;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                t.d[0] = READ32(ea);
                src = (INT32)t.f[0];
        }
@@ -2873,7 +2873,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).f[0] = (INT32)LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).f[0] = (INT32)READ32(ea);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -2888,7 +2888,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[1] = (float)MMX(modrm & 0x7).i[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.i[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.i[1];
@@ -2905,7 +2905,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -2922,7 +2922,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -2938,7 +2938,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f64[1] = (double)XMM(modrm & 0x7).f[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, r);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)r.f[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)r.f[1];
@@ -2956,7 +2956,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = (float)XMM(modrm & 0x7).i[3];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.i[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.i[1];
@@ -2974,7 +2974,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f64[1] = (double)XMM(modrm & 0x7).i[1];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)s.i[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)s.i[1];
@@ -2988,7 +2988,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).d[0] = XMM(modrm & 0x7).d[0];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).d[0] = READ32(ea);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3000,7 +3000,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7).d[0] = XMM((modrm >> 3) & 0x7).d[0];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3016,7 +3016,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).d[3] = XMM(modrm & 0x7).d[2];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = src.d[0];
                XMM((modrm >> 3) & 0x7).d[1] = src.d[0];
@@ -3036,7 +3036,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).d[3] = XMM(modrm & 0x7).d[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = src.d[1];
                XMM((modrm >> 3) & 0x7).d[1] = src.d[1];
@@ -3052,7 +3052,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3064,7 +3064,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3076,7 +3076,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3088,7 +3088,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3100,7 +3100,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3112,7 +3112,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3127,7 +3127,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // MOVLPS opcode
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3140,7 +3140,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // MOVLPS opcode
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3153,7 +3153,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                // unsupported by cpu
                CYCLES(1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3166,7 +3166,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                // unsupported by cpu
                CYCLES(1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3181,7 +3181,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // MOVHPS opcode
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_HI64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3195,7 +3195,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // MOVHPS opcode
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_HI64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3208,7 +3208,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                // unsupported by cpu
                CYCLES(1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEXMM_HI64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3221,7 +3221,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                // unsupported by cpu
                CYCLES(1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEXMM_HI64( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3235,7 +3235,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -3300,7 +3300,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3314,7 +3314,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
                XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3327,7 +3327,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).d[0] = LOAD_RM32(modrm);
        }
        else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).d[0] = READ32(ea);
        }
        XMM((modrm >> 3) & 0x7).d[1] = 0;
@@ -3343,7 +3343,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
        }
        else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3357,7 +3357,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                XMM((modrm >> 3) & 0x7).q[0] = READ64( ea);
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        }
@@ -3371,7 +3371,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
        }
        else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3385,7 +3385,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
        }
        else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -3465,7 +3465,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).d[3] = XMM((modrm >> 3) & 0x7).d[3] ^ XMM(modrm & 0x7).d[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = XMM((modrm >> 3) & 0x7).d[0] ^ src.d[0];
                XMM((modrm >> 3) & 0x7).d[1] = XMM((modrm >> 3) & 0x7).d[1] ^ src.d[1];
@@ -3483,7 +3483,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] ^ XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] ^ src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] ^ src.q[1];
@@ -3501,7 +3501,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] + XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] + src.f[1];
@@ -3521,7 +3521,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = sqrt(XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sqrt(src.f[1]);
@@ -3541,7 +3541,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = 1.0 / sqrt(XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = 1.0 / sqrt(src.f[1]);
@@ -3561,7 +3561,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = 1.0f / XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = 1.0f / src.f[1];
@@ -3579,7 +3579,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -3595,7 +3595,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -3611,7 +3611,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = ~(XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -3627,7 +3627,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = ~(XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -3643,7 +3643,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] | src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | src.q[1];
@@ -3659,7 +3659,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] | src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | src.q[1];
@@ -3677,7 +3677,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] * XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] * src.f[1];
@@ -3697,7 +3697,7 @@ void I386_OPS_BASE::I386OP(cyrix_special)()     // Opcode 0x0f 3a-3d
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] - XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] - src.f[1];
@@ -3743,7 +3743,7 @@ INLINE double sse_min_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[3] = sse_min_single(XMM((modrm >> 3) & 0x7).f[3], XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sse_min_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sse_min_single(XMM((modrm >> 3) & 0x7).f[1], src.f[1]);
@@ -3763,7 +3763,7 @@ INLINE double sse_min_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] / XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] / src.f[1];
@@ -3809,7 +3809,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[3] = sse_max_single(XMM((modrm >> 3) & 0x7).f[3], XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sse_max_single(XMM((modrm >> 3) & 0x7).f[1], src.f[1]);
@@ -3826,7 +3826,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                src.d[0]=READ32(ea);
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
        }
@@ -3840,7 +3840,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + src.f[0];
        }
@@ -3854,7 +3854,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
        }
@@ -3868,7 +3868,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * src.f[0];
        }
@@ -3882,7 +3882,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / src.f[0];
        }
@@ -3896,7 +3896,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s.d[0]=READ32(ea);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / s.f[0];
        }
@@ -3910,7 +3910,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s.d[0]=READ32(ea);
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(s.f[0]);
        }
@@ -3924,7 +3924,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s.d[0]=READ32(ea);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(s.f[0]);
        }
@@ -3938,7 +3938,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] < XMM(modrm & 0x7).f[0] ? XMM((modrm >> 3) & 0x7).f[0] : XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                s.d[0] = READ32(ea);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] < s.f[0] ? XMM((modrm >> 3) & 0x7).f[0] : s.f[0];
        }
@@ -3954,7 +3954,7 @@ INLINE double sse_max_double(double src1, double src2)
                b = XMM(modrm & 0x7).d[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                a = XMM((modrm >> 3) & 0x7).d[0];
                b = src.d[0];
@@ -3991,7 +3991,7 @@ INLINE double sse_max_double(double src1, double src2)
                b = XMM(modrm & 0x7).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                a = XMM((modrm >> 3) & 0x7).q[0];
                b = src.q[0];
@@ -4028,7 +4028,7 @@ INLINE double sse_max_double(double src1, double src2)
                b = XMM(modrm & 0x7).d[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                a = XMM((modrm >> 3) & 0x7).d[0];
                b = src.d[0];
@@ -4065,7 +4065,7 @@ INLINE double sse_max_double(double src1, double src2)
                b = XMM(modrm & 0x7).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                a = XMM((modrm >> 3) & 0x7).q[0];
                b = src.q[0];
@@ -4118,7 +4118,7 @@ INLINE double sse_max_double(double src1, double src2)
        } else {
                UINT32 t1,t2;
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                t1=XMM(d).d[m1];
                t2=XMM(d).d[m2];
@@ -4149,7 +4149,7 @@ INLINE double sse_max_double(double src1, double src2)
        } else {
                UINT64 t1;
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                t1=XMM(d).q[m1];
                XMM(d).q[0]=t1;
@@ -4176,7 +4176,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM(d).d[0]=t4;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                t2 = XMM(d).d[1];
                XMM(d).d[3]=src.d[1];
@@ -4197,7 +4197,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM(d).q[0]=XMM(d).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM(d).q[1]=src.q[0];
                XMM(d).q[0]=XMM(d).q[0];
@@ -4223,7 +4223,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM(d).d[3]=t4;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                t1 = XMM(d).d[2];
                t2 = XMM(d).d[3];
@@ -4246,7 +4246,7 @@ INLINE double sse_max_double(double src1, double src2)
                XMM(d).q[1]=XMM(s).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM(d).q[0]=XMM(d).q[1];
                XMM(d).q[1]=src.q[1];
@@ -4446,7 +4446,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                UINT8 imm8 = FETCH();
                READXMM( ea, s);
                d=(modrm >> 3) & 0x7;
@@ -4467,7 +4467,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                UINT8 imm8 = FETCH();
                READXMM( ea, s);
                d=(modrm >> 3) & 0x7;
@@ -4488,7 +4488,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                UINT8 imm8 = FETCH();
                s.d[0]=READ32(ea);
                d=(modrm >> 3) & 0x7;
@@ -4509,7 +4509,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                else
                        MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                UINT8 imm8 = FETCH();
                UINT16 v = READ16(ea);
                if (cpustate->xmm_operand_size)
@@ -4529,7 +4529,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                UINT16 v = (UINT16)LOAD_RM32(modrm);
                MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                UINT8 imm8 = FETCH();
                UINT16 v = READ16(ea);
                MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
@@ -4546,7 +4546,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
        }
        else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 2);
                UINT8 imm8 = FETCH();
                UINT16 v = READ16(ea);
                XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
@@ -4609,7 +4609,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] < MMX(modrm & 0x7).b[n] ? MMX((modrm >> 3) & 0x7).b[n] : MMX(modrm & 0x7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] < s.b[n] ? MMX((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4625,7 +4625,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] < XMM(modrm & 0x7).b[n] ? XMM((modrm >> 3) & 0x7).b[n] : XMM(modrm & 0x7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] < s.b[n] ? XMM((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4643,7 +4643,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] > MMX(modrm & 0x7).b[n] ? MMX((modrm >> 3) & 0x7).b[n] : MMX(modrm & 0x7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] > s.b[n] ? MMX((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4661,7 +4661,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).b[n] = ((UINT16)MMX((modrm >> 3) & 0x7).b[n] + (UINT16)MMX(modrm & 0x7).b[n] + 1) >> 1;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = ((UINT16)MMX((modrm >> 3) & 0x7).b[n] + (UINT16)s.b[n] + 1) >> 1;
@@ -4679,7 +4679,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).w[n] = ((UINT32)MMX((modrm >> 3) & 0x7).w[n] + (UINT32)MMX(modrm & 0x7).w[n] + 1) >> 1;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n] = ((UINT32)MMX((modrm >> 3) & 0x7).w[n] + (UINT32)s.w[n] + 1) >> 1;
@@ -4698,7 +4698,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).w[3]=((UINT32)MMX((modrm >> 3) & 0x7).w[3]*(UINT32)MMX(modrm & 7).w[3]) >> 16;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).w[0]=((UINT32)MMX((modrm >> 3) & 0x7).w[0]*(UINT32)s.w[0]) >> 16;
                MMX((modrm >> 3) & 0x7).w[1]=((UINT32)MMX((modrm >> 3) & 0x7).w[1]*(UINT32)s.w[1]) >> 16;
@@ -4718,7 +4718,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] < MMX(modrm & 0x7).s[n] ? MMX((modrm >> 3) & 0x7).s[n] : MMX(modrm & 0x7).s[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] < s.s[n] ? MMX((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -4736,7 +4736,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] > MMX(modrm & 0x7).s[n] ? MMX((modrm >> 3) & 0x7).s[n] : MMX(modrm & 0x7).s[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] > s.s[n] ? MMX((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -4752,7 +4752,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).q = (UINT64)MMX((modrm >> 3) & 0x7).d[0] * (UINT64)MMX(modrm & 0x7).d[0];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).q = (UINT64)MMX((modrm >> 3) & 0x7).d[0] * (UINT64)s.d[0];
        }
@@ -4767,7 +4767,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1] = (UINT64)XMM((modrm >> 3) & 0x7).d[2] * (UINT64)XMM(modrm & 0x7).d[2];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM((modrm >> 3) & 0x7).q[0] = (UINT64)XMM((modrm >> 3) & 0x7).d[0] * (UINT64)s.d[0];
                XMM((modrm >> 3) & 0x7).q[1] = (UINT64)XMM((modrm >> 3) & 0x7).d[2] * (UINT64)s.d[2];
@@ -4788,7 +4788,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).l=(UINT64)temp & 0xffff;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                temp=0;
                for (n=0;n < 8;n++)
@@ -4806,7 +4806,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q - MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q - s.q;
        }
@@ -4821,7 +4821,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] - XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] - s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] - s.q[1];
@@ -4847,7 +4847,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                UINT8 imm8 = FETCH();
                READXMM( ea, s);
                XMM(d).d[0]=s.d[(imm8 & 3)];
@@ -4876,7 +4876,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                UINT8 imm8 = FETCH();
                READXMM( ea, s);
                XMM(d).q[1]=s.q[1];
@@ -4906,7 +4906,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                UINT8 imm8 = FETCH();
                READXMM( ea, s);
                XMM(d).q[0]=s.q[0];
@@ -4936,7 +4936,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        else {
                XMM_REG s;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n = 0; n < 8; n++)
                        XMM(d).c[n] = SaturatedSignedWordToSignedByte(XMM(d).s[n]);
@@ -4968,7 +4968,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        else {
                XMM_REG s;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM(d).s[0] = SaturatedSignedDwordToSignedWord(XMM(d).i[0]);
                XMM(d).s[1] = SaturatedSignedDwordToSignedWord(XMM(d).i[1]);
@@ -4994,7 +4994,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 15;c++)
                        XMM(d).b[c]=(XMM(d).c[c] > s.c[c]) ? 0xff : 0;
@@ -5014,7 +5014,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 7;c++)
                        XMM(d).w[c]=(XMM(d).s[c] > s.s[c]) ? 0xffff : 0;
@@ -5034,7 +5034,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 3;c++)
                        XMM(d).d[c]=(XMM(d).i[c] > s.i[c]) ? 0xffffffff : 0;
@@ -5059,7 +5059,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n = 0; n < 8;n++)
                        XMM(d).b[n]=SaturatedSignedWordToUnsignedByte(XMM(d).s[n]);
@@ -5085,7 +5085,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n = 0; n < 16; n += 2) {
                        XMM(d).b[n]=XMM(d).b[8+(n >> 1)];
@@ -5111,7 +5111,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n = 0; n < 8; n += 2) {
                        XMM(d).w[n]=XMM(d).w[4+(n >> 1)];
@@ -5137,7 +5137,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM(d).d[0]=XMM(d).d[2];
                XMM(d).d[1]=s.d[2];
@@ -5161,7 +5161,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM(d).q[0]=XMM(d).q[1];
                XMM(d).q[1]=s.q[1];
@@ -5181,7 +5181,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 15;c++)
                        XMM(d).b[c]=(XMM(d).c[c] == s.c[c]) ? 0xff : 0;
@@ -5201,7 +5201,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 7;c++)
                        XMM(d).w[c]=(XMM(d).s[c] == s.s[c]) ? 0xffff : 0;
@@ -5221,7 +5221,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int c=0;c <= 3;c++)
                        XMM(d).d[c]=(XMM(d).i[c] == s.i[c]) ? 0xffffffff : 0;
@@ -5241,7 +5241,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM(d).q[0]=XMM(d).q[0]+src.q[0];
                XMM(d).q[1]=XMM(d).q[1]+src.q[1];
@@ -5261,7 +5261,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                d=(modrm >> 3) & 0x7;
                for (int n = 0; n < 8;n++)
@@ -5278,7 +5278,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] + XMM(modrm & 7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] + s.b[n];
@@ -5294,7 +5294,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] + XMM(modrm & 7).w[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] + s.w[n];
@@ -5310,7 +5310,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] + XMM(modrm & 7).d[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] + s.d[n];
@@ -5326,7 +5326,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] < XMM(modrm & 7).b[n] ? 0 : XMM((modrm >> 3) & 0x7).b[n]-XMM(modrm & 7).b[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] < src.b[n] ? 0 : XMM((modrm >> 3) & 0x7).b[n]-src.b[n];
@@ -5342,7 +5342,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] < XMM(modrm & 7).w[n] ? 0 : XMM((modrm >> 3) & 0x7).w[n]-XMM(modrm & 7).w[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] < src.w[n] ? 0 : XMM((modrm >> 3) & 0x7).w[n]-src.w[n];
@@ -5358,7 +5358,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -5374,7 +5374,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=(~XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).q[0]=(~XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=(~XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -5390,7 +5390,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] > (0xff-XMM(modrm & 7).b[n]) ? 0xff : XMM((modrm >> 3) & 0x7).b[n]+XMM(modrm & 7).b[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] > (0xff-src.b[n]) ? 0xff : XMM((modrm >> 3) & 0x7).b[n]+src.b[n];
@@ -5406,7 +5406,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] > (0xffff-XMM(modrm & 7).w[n]) ? 0xffff : XMM((modrm >> 3) & 0x7).w[n]+XMM(modrm & 7).w[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] > (0xffff-src.w[n]) ? 0xffff : XMM((modrm >> 3) & 0x7).w[n]+src.w[n];
@@ -5422,7 +5422,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] > XMM(modrm & 0x7).b[n] ? XMM((modrm >> 3) & 0x7).b[n] : XMM(modrm & 0x7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] > s.b[n] ? XMM((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -5438,7 +5438,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=((UINT32)XMM((modrm >> 3) & 0x7).w[n]*(UINT32)XMM(modrm & 7).w[n]) >> 16;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=((UINT32)XMM((modrm >> 3) & 0x7).w[n]*(UINT32)s.w[n]) >> 16;
@@ -5454,7 +5454,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=(UINT32)((INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)XMM(modrm & 7).s[n]) >> 16;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=(UINT32)((INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)src.s[n]) >> 16;
@@ -5470,7 +5470,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] - (INT16)XMM(modrm & 7).c[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] - (INT16)s.c[n]);
@@ -5486,7 +5486,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] - (INT32)XMM(modrm & 7).s[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] - (INT32)s.s[n]);
@@ -5502,7 +5502,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] < XMM(modrm & 0x7).s[n] ? XMM((modrm >> 3) & 0x7).s[n] : XMM(modrm & 0x7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] < s.s[n] ? XMM((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -5518,7 +5518,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] > XMM(modrm & 0x7).s[n] ? XMM((modrm >> 3) & 0x7).s[n] : XMM(modrm & 0x7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] > s.s[n] ? XMM((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -5534,7 +5534,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] + (INT16)XMM(modrm & 7).c[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] + (INT16)s.c[n]);
@@ -5550,7 +5550,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] + (INT32)XMM(modrm & 7).s[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] + (INT32)s.s[n]);
@@ -5566,7 +5566,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] | s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] | s.q[1];
@@ -5582,7 +5582,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] ^ XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] ^ s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] ^ s.q[1];
@@ -5599,7 +5599,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                                                                                (INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)XMM(modrm & 7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).i[n]=(INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)s.s[n]+
@@ -5616,7 +5616,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] - XMM(modrm & 7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] - s.b[n];
@@ -5632,7 +5632,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] - XMM(modrm & 7).w[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] - s.w[n];
@@ -5648,7 +5648,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] - XMM(modrm & 7).d[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] - s.d[n];
@@ -5671,7 +5671,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).l[1]=(UINT64)temp & 0xffff;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                temp=0;
                for (int n=0;n < 8;n++)
@@ -5693,7 +5693,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).b[n] = ((UINT16)XMM((modrm >> 3) & 0x7).b[n] + (UINT16)XMM(modrm & 0x7).b[n] + 1) >> 1;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = ((UINT16)XMM((modrm >> 3) & 0x7).b[n] + (UINT16)s.b[n] + 1) >> 1;
@@ -5709,7 +5709,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n] = ((UINT32)XMM((modrm >> 3) & 0x7).w[n] + (UINT32)XMM(modrm & 0x7).w[n] + 1) >> 1;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n] = ((UINT32)XMM((modrm >> 3) & 0x7).w[n] + (UINT32)s.w[n] + 1) >> 1;
@@ -5726,7 +5726,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                int count=(int)src.q[0];
                for (int n=0; n < 8;n++)
@@ -5746,7 +5746,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).d[3]=XMM((modrm >> 3) & 0x7).d[3] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).d[0]=XMM((modrm >> 3) & 0x7).d[0] >> count;
@@ -5766,7 +5766,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] >> count;
@@ -5784,7 +5784,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                int count=(int)s.q[0];
                for (int n=0; n < 8;n++)
@@ -5804,7 +5804,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).d[3]=XMM((modrm >> 3) & 0x7).d[3] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                int count=(int)s.q[0];
                XMM((modrm >> 3) & 0x7).d[0]=XMM((modrm >> 3) & 0x7).d[0] << count;
@@ -5824,7 +5824,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, s);
                int count=(int)s.q[0];
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] << count;
@@ -5842,7 +5842,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                        XMM((modrm >> 3) & 0x7).s[n]=XMM((modrm >> 3) & 0x7).s[n] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                int count=(int)src.q[0];
                for (int n=0; n < 8;n++)
@@ -5862,7 +5862,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).i[3]=XMM((modrm >> 3) & 0x7).i[3] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).i[0]=XMM((modrm >> 3) & 0x7).i[0] >> count;
@@ -5880,7 +5880,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                CYCLES(1);     // unsupported
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -5895,7 +5895,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f64[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f64[1];
@@ -5911,7 +5911,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM(modrm & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0];
                XMM(modrm & 0x7).q[1] = 0;
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITE64( ea, XMM((modrm >> 3) & 0x7).q[0]);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -5929,7 +5929,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]-src.f64[0];
@@ -5950,7 +5950,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]+XMM(d).f64[1];
@@ -5971,7 +5971,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]-XMM(d).f64[1];
@@ -5992,7 +5992,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                XMM(d).f64[0]=sqrt(src.f64[0]);
@@ -6010,7 +6010,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = (double)MMX(modrm & 0x7).i[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READMMX( ea, r);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)r.i[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)r.i[1];
@@ -6027,7 +6027,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                MMX((modrm >> 3) & 0x7).i[0] = r.f64[0];
                MMX((modrm >> 3) & 0x7).i[1] = r.f64[1];
@@ -6044,7 +6044,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                MMX((modrm >> 3) & 0x7).i[0] = r.f64[0];
                MMX((modrm >> 3) & 0x7).i[1] = r.f64[1];
@@ -6061,7 +6061,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.f64[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.f64[1];
@@ -6080,7 +6080,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).i[3] = XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -6098,7 +6098,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] + XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] + src.f64[1];
@@ -6114,7 +6114,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] * XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] * src.f64[1];
@@ -6130,7 +6130,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] - XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] - src.f64[1];
@@ -6146,7 +6146,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[1], XMM(modrm & 0x7).f64[1]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
                XMM((modrm >> 3) & 0x7).f64[1] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[1], src.f64[1]);
@@ -6162,7 +6162,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] / XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] / src.f64[1];
@@ -6178,7 +6178,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[1] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[1], XMM(modrm & 0x7).f64[1]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
                XMM((modrm >> 3) & 0x7).f64[1] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[1], src.f64[1]);
@@ -6194,7 +6194,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                CYCLES(1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
                CYCLES(1);     // TODO: correct cycle count
        }
@@ -6206,7 +6206,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -6218,7 +6218,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                WRITEXMM( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -6230,7 +6230,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        }
@@ -6243,7 +6243,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                WRITEXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -6256,7 +6256,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, XMM((modrm >> 3) & 0x7));
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[0];
        }
@@ -6269,7 +6269,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).f64[0] = (INT32)LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).f64[0] = (INT32)READ32(ea);
        }
        CYCLES(1);     // TODO: correct cycle count
@@ -6283,7 +6283,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                src = (INT32)XMM(modrm & 0x7).f64[0];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, t);
                src = (INT32)t.f64[0];
        }
@@ -6299,7 +6299,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                src = (INT32)XMM(modrm & 0x7).f64[0];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, t);
                src = (INT32)t.f64[0];
        }
@@ -6318,7 +6318,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                XMM(d).f64[0]=sqrt(src.f64[0]);
@@ -6333,7 +6333,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + src.f64[0];
        }
@@ -6347,7 +6347,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * src.f64[0];
        }
@@ -6361,7 +6361,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f[0] = XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                READXMM_LO64( ea, s);
                XMM((modrm >> 3) & 0x7).f[0] = s.f64[0];
        }
@@ -6375,7 +6375,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - src.f64[0];
        }
@@ -6389,7 +6389,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], XMM(modrm & 0x7).f64[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
        }
@@ -6403,7 +6403,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / src.f64[0];
        }
@@ -6417,7 +6417,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], XMM(modrm & 0x7).f64[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
        }
@@ -6444,7 +6444,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM_REG src;
                int d;
                float f1, f2;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                f1=XMM(d).f[0]+XMM(d).f[1];
@@ -6477,7 +6477,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM_REG src;
                int d;
                float f1, f2;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM( ea, src);
                f1=XMM(d).f[0]-XMM(d).f[1];
@@ -6502,7 +6502,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 8);
                UINT8 imm8 = FETCH();
                READXMM_LO64( ea, s);
                d=(modrm >> 3) & 0x7;
@@ -6521,7 +6521,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).f[3]=XMM((modrm >> 3) & 0x7).f[3] + XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).f[0]=XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
                XMM((modrm >> 3) & 0x7).f[1]=XMM((modrm >> 3) & 0x7).f[1] + src.f[1];
@@ -6553,7 +6553,7 @@ INLINE bool sse_isdoubleunordered(double op1, double op2)
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM( ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f64[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f64[1];
@@ -6569,7 +6569,7 @@ void I386_OPS_BASE::SSEOP(lddqu_r128_m128)() // Opcode f2 0f f0
                // unsupported by cpu
                CYCLES(1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(modrm, 0);
+               UINT32 ea = GetEA(modrm, 0, 16);
                READXMM(ea, XMM((modrm >> 3) & 0x7));
        }
 }
index f54688d..46e38c3 100644 (file)
@@ -328,7 +328,7 @@ void I386_OPS_BASE::x87_fadd_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -363,7 +363,7 @@ void I386_OPS_BASE::x87_fadd_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -500,7 +500,7 @@ void I386_OPS_BASE::x87_fiadd_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -535,7 +535,7 @@ void I386_OPS_BASE::x87_fiadd_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -577,7 +577,7 @@ void I386_OPS_BASE::x87_fsub_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -612,7 +612,7 @@ void I386_OPS_BASE::x87_fsub_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -749,7 +749,7 @@ void I386_OPS_BASE::x87_fisub_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -784,7 +784,7 @@ void I386_OPS_BASE::x87_fisub_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -826,7 +826,7 @@ void I386_OPS_BASE::x87_fsubr_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -861,7 +861,7 @@ void I386_OPS_BASE::x87_fsubr_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -998,7 +998,7 @@ void I386_OPS_BASE::x87_fisubr_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1033,7 +1033,7 @@ void I386_OPS_BASE::x87_fisubr_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1075,7 +1075,7 @@ void I386_OPS_BASE::x87_fdiv_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1110,7 +1110,7 @@ void I386_OPS_BASE::x87_fdiv_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1251,7 +1251,7 @@ void I386_OPS_BASE::x87_fidiv_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1286,7 +1286,7 @@ void I386_OPS_BASE::x87_fidiv_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1328,7 +1328,7 @@ void I386_OPS_BASE::x87_fdivr_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1363,7 +1363,7 @@ void I386_OPS_BASE::x87_fdivr_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1505,7 +1505,7 @@ void I386_OPS_BASE::x87_fidivr_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1540,7 +1540,7 @@ void I386_OPS_BASE::x87_fidivr_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1582,7 +1582,7 @@ void I386_OPS_BASE::x87_fmul_m32real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1616,7 +1616,7 @@ void I386_OPS_BASE::x87_fmul_m64real( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1749,7 +1749,7 @@ void I386_OPS_BASE::x87_fimul_m32int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -1783,7 +1783,7 @@ void I386_OPS_BASE::x87_fimul_m16int( UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -2432,7 +2432,7 @@ void I386_OPS_BASE::x87_fld_m32real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (x87_dec_stack())
        {
                UINT32 m32real = READ32( ea);
@@ -2462,7 +2462,7 @@ void I386_OPS_BASE::x87_fld_m64real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (x87_dec_stack())
        {
                UINT64 m64real = READ64( ea);
@@ -2492,7 +2492,7 @@ void I386_OPS_BASE::x87_fld_m80real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 10);
        if (x87_dec_stack())
        {
                cpustate->x87_sw &= ~X87_SW_C1;
@@ -2533,7 +2533,7 @@ void I386_OPS_BASE::x87_fild_m16int( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (!x87_dec_stack())
        {
                value = fx80_inan;
@@ -2556,7 +2556,7 @@ void I386_OPS_BASE::x87_fild_m32int( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (!x87_dec_stack())
        {
                value = fx80_inan;
@@ -2579,7 +2579,7 @@ void I386_OPS_BASE::x87_fild_m64int( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (!x87_dec_stack())
        {
                value = fx80_inan;
@@ -2602,7 +2602,7 @@ void I386_OPS_BASE::x87_fbld( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 10);
        if (!x87_dec_stack())
        {
                value = fx80_inan;
@@ -2647,7 +2647,7 @@ void I386_OPS_BASE::x87_fst_m32real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -2672,7 +2672,7 @@ void I386_OPS_BASE::x87_fst_m64real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -2719,7 +2719,7 @@ void I386_OPS_BASE::x87_fstp_m32real( UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -2757,7 +2757,7 @@ void I386_OPS_BASE::x87_fstp_m64real( UINT8 modrm)
        }
 
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 8);
        if (x87_check_exceptions())
        {
                UINT64 m64real = floatx80_to_float64(value);
@@ -2783,7 +2783,7 @@ void I386_OPS_BASE::x87_fstp_m80real( UINT8 modrm)
                value = ST(0);
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 10);
        if (x87_check_exceptions())
        {
                WRITE80( ea, value);
@@ -2842,7 +2842,7 @@ void I386_OPS_BASE::x87_fist_m16int( UINT8 modrm)
                        m16int = -32768;
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 2);
        if (x87_check_exceptions())
        {
                WRITE16( ea, m16int);
@@ -2875,7 +2875,7 @@ void I386_OPS_BASE::x87_fist_m32int( UINT8 modrm)
                        m32int = 0x80000000;
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 4);
        if (x87_check_exceptions())
        {
                WRITE32( ea, m32int);
@@ -2908,7 +2908,7 @@ void I386_OPS_BASE::x87_fistp_m16int( UINT8 modrm)
                        m16int = (UINT16)0x8000;
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 2);
        if (x87_check_exceptions())
        {
                WRITE16( ea, m16int);
@@ -2942,7 +2942,7 @@ void I386_OPS_BASE::x87_fistp_m32int( UINT8 modrm)
                        m32int = 0x80000000;
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 4);
        if (x87_check_exceptions())
        {
                WRITE32( ea, m32int);
@@ -2976,7 +2976,7 @@ void I386_OPS_BASE::x87_fistp_m64int( UINT8 modrm)
                        m64int = U64(0x8000000000000000);
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 8);
        if (x87_check_exceptions())
        {
                WRITE64( ea, m64int);
@@ -3011,7 +3011,7 @@ void I386_OPS_BASE::x87_fbstp( UINT8 modrm)
                result.high |= ST(0).high & 0x8000;
        }
 
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 10);
        if (x87_check_exceptions())
        {
                WRITE80( ea, result);
@@ -3485,7 +3485,7 @@ void I386_OPS_BASE::x87_fxam( UINT8 modrm)
 
 void I386_OPS_BASE::x87_ficom_m16int( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3522,7 +3522,7 @@ void I386_OPS_BASE::x87_ficom_m16int( UINT8 modrm)
 
 void I386_OPS_BASE::x87_ficom_m32int( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3559,7 +3559,7 @@ void I386_OPS_BASE::x87_ficom_m32int( UINT8 modrm)
 
 void I386_OPS_BASE::x87_ficomp_m16int( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3597,7 +3597,7 @@ void I386_OPS_BASE::x87_ficomp_m16int( UINT8 modrm)
 
 void I386_OPS_BASE::x87_ficomp_m32int( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3636,7 +3636,7 @@ void I386_OPS_BASE::x87_ficomp_m32int( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fcom_m32real( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3673,7 +3673,7 @@ void I386_OPS_BASE::x87_fcom_m32real( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fcom_m64real( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3746,7 +3746,7 @@ void I386_OPS_BASE::x87_fcom_sti( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fcomp_m32real( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -3784,7 +3784,7 @@ void I386_OPS_BASE::x87_fcomp_m32real( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fcomp_m64real( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow();
@@ -4274,7 +4274,7 @@ void I386_OPS_BASE::x87_finit( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fldcw( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
        UINT16 cw = READ16( ea);
 
        x87_write_cw( cw);
@@ -4286,7 +4286,7 @@ void I386_OPS_BASE::x87_fldcw( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fstcw( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 2);
        WRITE16( ea, cpustate->x87_cw);
 
        CYCLES( 3);
@@ -4295,7 +4295,7 @@ void I386_OPS_BASE::x87_fstcw( UINT8 modrm)
 void I386_OPS_BASE::x87_fldenv( UINT8 modrm)
 {
        // TODO: Pointers and selectors
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 2);
 
        if (cpustate->operand_size)
        {
@@ -4319,12 +4319,13 @@ void I386_OPS_BASE::x87_fldenv( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fstenv( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea;
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
        {
                case 0: // 16-bit real mode
+                       ea = GetEA( modrm, 1, 6);
                        WRITE16( ea + 0, cpustate->x87_cw);
                        WRITE16( ea + 2, cpustate->x87_sw);
                        WRITE16( ea + 4, cpustate->x87_tw);
@@ -4334,6 +4335,7 @@ void I386_OPS_BASE::x87_fstenv( UINT8 modrm)
 //          WRITE16( ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4);
                        break;
                case 1: // 16-bit protected mode
+                       ea = GetEA( modrm, 1, 6);
                        WRITE16(ea + 0, cpustate->x87_cw);
                        WRITE16(ea + 2, cpustate->x87_sw);
                        WRITE16(ea + 4, cpustate->x87_tw);
@@ -4343,6 +4345,7 @@ void I386_OPS_BASE::x87_fstenv( UINT8 modrm)
 //          WRITE16(ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4);
                        break;
                case 2: // 32-bit real mode
+                       ea = GetEA( modrm, 1, 10);
                        WRITE16( ea + 0, cpustate->x87_cw);
                        WRITE16( ea + 4, cpustate->x87_sw);
                        WRITE16( ea + 8, cpustate->x87_tw);
@@ -4353,6 +4356,7 @@ void I386_OPS_BASE::x87_fstenv( UINT8 modrm)
 //          WRITE32( ea + 24, (cpustate->fpu_data_ptr >> 16) << 12);
                        break;
                case 3: // 32-bit protected mode
+                       ea = GetEA( modrm, 1, 10);
                        WRITE16( ea + 0,  cpustate->x87_cw);
                        WRITE16( ea + 4,  cpustate->x87_sw);
                        WRITE16( ea + 8,  cpustate->x87_tw);
@@ -4369,7 +4373,7 @@ void I386_OPS_BASE::x87_fstenv( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fsave( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 80);
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
@@ -4425,7 +4429,7 @@ void I386_OPS_BASE::x87_fsave( UINT8 modrm)
 
 void I386_OPS_BASE::x87_frstor( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 0);
+       UINT32 ea = GetEA( modrm, 0, 80);
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
@@ -4540,7 +4544,7 @@ void I386_OPS_BASE::x87_fstsw_ax( UINT8 modrm)
 
 void I386_OPS_BASE::x87_fstsw_m2byte( UINT8 modrm)
 {
-       UINT32 ea = GetEA( modrm, 1);
+       UINT32 ea = GetEA( modrm, 1, 2);
 
        WRITE16( ea, cpustate->x87_sw);
 
index 598b437..a04e54d 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 
 #pragma once
 
index e72d434..d9ec646 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 /*
     Intel 386 emulator
 
@@ -390,12 +390,12 @@ static UINT32 GetNonTranslatedEA(i386_state *cpustate,UINT8 modrm,UINT8 *seg)
        return ea;
 }
 
-static UINT32 GetEA(i386_state *cpustate,UINT8 modrm, int rwn)
+static UINT32 GetEA(i386_state *cpustate,UINT8 modrm, int rwn, UINT32 size)
 {
        UINT8 segment;
        UINT32 ea;
        modrm_to_EA(cpustate, modrm, &ea, &segment );
-       return i386_translate(cpustate, segment, ea, rwn );
+       return i386_translate(cpustate, segment, ea, rwn, size );
 }
 
 /* Check segment register for validity when changing privilege level after an RETF */
@@ -446,14 +446,14 @@ static void i386_check_sreg_validity(i386_state* cpustate, int reg)
        }
 }
 
-static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset)
+static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset, UINT32 size)
 {
        if(PROTECTED_MODE && !V8086_MODE)
        {
                if((cpustate->sreg[seg].flags & 0x0018) == 0x0010 && cpustate->sreg[seg].flags & 0x0004) // if expand-down data segment
                {
                        // compare if greater then 0xffffffff when we're passed the access size
-                       if((offset <= cpustate->sreg[seg].limit) || ((cpustate->sreg[seg].d)?0:(offset > 0xffff)))
+                       if((offset <= cpustate->sreg[seg].limit) || ((cpustate->sreg[seg].d)?0:((offset + size - 1) > 0xffff)))
                        {
                                logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x (expand-down)\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset);
                                return 1;
@@ -461,7 +461,7 @@ static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset)
                }
                else
                {
-                       if(offset > cpustate->sreg[seg].limit)
+                       if((offset + size - 1) > cpustate->sreg[seg].limit)
                        {
                                logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset);
                                return 1;
@@ -1619,7 +1619,7 @@ static void i386_protected_mode_call(i386_state *cpustate, UINT16 seg, UINT32 of
                if (operand32 != 0)  // if 32-bit
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) - 8 : (REG16(SP) - 8) & 0xffff);
-                       if(i386_limit_check(cpustate, SS, offset))
+                       if(i386_limit_check(cpustate, SS, offset, 8))
                        {
                                logerror("CALL (%08x): Stack has no room for return address.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)  // #SS(0)
@@ -1628,7 +1628,7 @@ static void i386_protected_mode_call(i386_state *cpustate, UINT16 seg, UINT32 of
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) - 4 : (REG16(SP) - 4) & 0xffff);
-                       if(i386_limit_check(cpustate, SS, offset))
+                       if(i386_limit_check(cpustate, SS, offset, 4))
                        {
                                logerror("CALL (%08x): Stack has no room for return address.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)  // #SS(0)
@@ -1879,7 +1879,7 @@ static void i386_protected_mode_call(i386_state *cpustate, UINT16 seg, UINT32 of
                                        if (operand32 != 0)  // if 32-bit
                                        {
                                                UINT32 stkoff = (STACK_32BIT ? REG32(ESP) - 8 : (REG16(SP) - 8) & 0xffff);
-                                               if(i386_limit_check(cpustate, SS, stkoff))
+                                               if(i386_limit_check(cpustate, SS, stkoff, 8))
                                                {
                                                        logerror("CALL: Stack has no room for return address.\n");
                                                        FAULT(FAULT_SS,0) // #SS(0)
@@ -1890,7 +1890,7 @@ static void i386_protected_mode_call(i386_state *cpustate, UINT16 seg, UINT32 of
                                        else
                                        {
                                                UINT32 stkoff = (STACK_32BIT ? REG32(ESP) - 4 : (REG16(SP) - 4) & 0xffff);
-                                               if(i386_limit_check(cpustate, SS, stkoff))
+                                               if(i386_limit_check(cpustate, SS, stkoff, 4))
                                                {
                                                        logerror("CALL: Stack has no room for return address.\n");
                                                        FAULT(FAULT_SS,0) // #SS(0)
@@ -2008,7 +2008,7 @@ static void i386_protected_mode_retf(i386_state* cpustate, UINT8 count, UINT8 op
        I386_SREG desc;
        UINT8 CPL, RPL, DPL;
 
-       UINT32 ea = i386_translate(cpustate, SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0);
+       UINT32 ea = i386_translate(cpustate, SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0, (operand32)?8:4);
 
        if(operand32 == 0)
        {
@@ -2092,7 +2092,7 @@ static void i386_protected_mode_retf(i386_state* cpustate, UINT8 count, UINT8 op
                if(operand32 == 0)
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(cpustate,SS,offset+count+3) != 0)
+                       if(i386_limit_check(cpustate,SS,offset,count+4) != 0)
                        {
                                logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)
@@ -2101,7 +2101,7 @@ static void i386_protected_mode_retf(i386_state* cpustate, UINT8 count, UINT8 op
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(cpustate,SS,offset+count+7) != 0)
+                       if(i386_limit_check(cpustate,SS,offset,count+8) != 0)
                        {
                                logerror("RETF: ESP is past stack segment limit.\n");
                                FAULT(FAULT_SS,0)
@@ -2119,7 +2119,7 @@ static void i386_protected_mode_retf(i386_state* cpustate, UINT8 count, UINT8 op
                if(operand32 == 0)
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(cpustate,SS,offset+count+7) != 0)
+                       if(i386_limit_check(cpustate,SS,offset,count+8) != 0)
                        {
                                logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc);
                                FAULT(FAULT_SS,0)
@@ -2128,7 +2128,7 @@ static void i386_protected_mode_retf(i386_state* cpustate, UINT8 count, UINT8 op
                else
                {
                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                       if(i386_limit_check(cpustate,SS,offset+count+15) != 0)
+                       if(i386_limit_check(cpustate,SS,offset,count+16) != 0)
                        {
                                logerror("RETF: ESP is past stack segment limit.\n");
                                FAULT(FAULT_SS,0)
@@ -2283,7 +2283,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
        UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1);
 
        CPL = cpustate->CPL;
-       UINT32 ea = i386_translate(cpustate, SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0);
+       UINT32 ea = i386_translate(cpustate, SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0, (operand32)?12:6);
        if(operand32 == 0)
        {
                newEIP = READ16(cpustate, ea) & 0xffff;
@@ -2399,7 +2399,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                        if(operand32 == 0)
                        {
                                UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                               if(i386_limit_check(cpustate,SS,offset+3) != 0)
+                               if(i386_limit_check(cpustate,SS,offset,4) != 0)
                                {
                                        logerror("IRET: Data on stack is past SS limit.\n");
                                        FAULT(FAULT_SS,0)
@@ -2408,7 +2408,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                        else
                        {
                                UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                               if(i386_limit_check(cpustate,SS,offset+7) != 0)
+                               if(i386_limit_check(cpustate,SS,offset,8) != 0)
                                {
                                        logerror("IRET: Data on stack is past SS limit.\n");
                                        FAULT(FAULT_SS,0)
@@ -2426,7 +2426,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                                if(operand32 == 0)
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(cpustate,SS,offset+5) != 0)
+                                       if(i386_limit_check(cpustate,SS,offset,6) != 0)
                                        {
                                                logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc);
                                                FAULT(FAULT_SS,0)
@@ -2435,7 +2435,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                                else
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(cpustate,SS,offset+11) != 0)
+                                       if(i386_limit_check(cpustate,SS,offset,12) != 0)
                                        {
                                                logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc);
                                                FAULT(FAULT_SS,0)
@@ -2533,7 +2533,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                                if(operand32 == 0)
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(cpustate,SS,offset+9) != 0)
+                                       if(i386_limit_check(cpustate,SS,offset,10) != 0)
                                        {
                                                logerror("IRET: SP is past SS limit.\n");
                                                FAULT(FAULT_SS,0)
@@ -2542,7 +2542,7 @@ static void i386_protected_mode_iret(i386_state* cpustate, int operand32)
                                else
                                {
                                        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-                                       if(i386_limit_check(cpustate,SS,offset+19) != 0)
+                                       if(i386_limit_check(cpustate,SS,offset,20) != 0)
                                        {
                                                logerror("IRET: ESP is past SS limit.\n");
                                                FAULT(FAULT_SS,0)
index 0e007d9..64b65fc 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #pragma once
 
 #ifndef __I386INTF_H__
index 57be0cb..2bdacaa 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 static UINT16 I386OP(shift_rotate16)(i386_state *cpustate, UINT8 modrm, UINT32 value, UINT8 shift)
 {
        UINT32 src = value & 0xffff;
@@ -153,7 +153,7 @@ static void I386OP(adc_rm16_r16)(i386_state *cpustate)      // Opcode 0x11
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = ADC16(cpustate, dst, src, cpustate->CF);
@@ -173,7 +173,7 @@ static void I386OP(adc_r16_rm16)(i386_state *cpustate)      // Opcode 0x13
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = ADC16(cpustate, dst, src, cpustate->CF);
@@ -203,7 +203,7 @@ static void I386OP(add_rm16_r16)(i386_state *cpustate)      // Opcode 0x01
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = ADD16(cpustate,dst, src);
@@ -223,7 +223,7 @@ static void I386OP(add_r16_rm16)(i386_state *cpustate)      // Opcode 0x03
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = ADD16(cpustate,dst, src);
@@ -253,7 +253,7 @@ static void I386OP(and_rm16_r16)(i386_state *cpustate)      // Opcode 0x21
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = AND16(cpustate,dst, src);
@@ -273,7 +273,7 @@ static void I386OP(and_r16_rm16)(i386_state *cpustate)      // Opcode 0x23
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = AND16(cpustate,dst, src);
@@ -300,7 +300,7 @@ static void I386OP(bsf_r16_rm16)(i386_state *cpustate)      // Opcode 0x0f bc
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
        }
 
@@ -329,7 +329,7 @@ static void I386OP(bsr_r16_rm16)(i386_state *cpustate)      // Opcode 0x0f bd
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
        }
 
@@ -369,7 +369,7 @@ static void I386OP(bt_rm16_r16)(i386_state *cpustate)       // Opcode 0x0f a3
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0,2);
                bit %= 16;
                UINT16 dst = READ16(cpustate,ea);
 
@@ -402,7 +402,7 @@ static void I386OP(btc_rm16_r16)(i386_state *cpustate)      // Opcode 0x0f bb
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,2);
                bit %= 16;
                UINT16 dst = READ16(cpustate,ea);
 
@@ -437,7 +437,7 @@ static void I386OP(btr_rm16_r16)(i386_state *cpustate)      // Opcode 0x0f b3
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,2);
                bit %= 16;
                UINT16 dst = READ16(cpustate,ea);
 
@@ -472,7 +472,7 @@ static void I386OP(bts_rm16_r16)(i386_state *cpustate)      // Opcode 0x0f ab
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT16 bit = LOAD_REG16(modrm);
                ea += 2*(bit/16);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,2);
                bit %= 16;
                UINT16 dst = READ16(cpustate,ea);
 
@@ -547,7 +547,7 @@ static void I386OP(cmp_rm16_r16)(i386_state *cpustate)      // Opcode 0x39
                SUB16(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                SUB16(cpustate,dst, src);
@@ -565,7 +565,7 @@ static void I386OP(cmp_r16_rm16)(i386_state *cpustate)      // Opcode 0x3b
                SUB16(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                SUB16(cpustate,dst, src);
@@ -587,11 +587,11 @@ static void I386OP(cmpsw)(i386_state *cpustate)             // Opcode 0xa7
        UINT32 eas, ead;
        UINT16 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 2 );
        src = READ16(cpustate,eas);
        dst = READ16(cpustate,ead);
        SUB16(cpustate,src,dst);
@@ -667,7 +667,7 @@ static void I386OP(imul_r16_rm16)(i386_state *cpustate)     // Opcode 0x0f af
                src = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(cpustate,CYCLES_IMUL16_REG_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = (INT32)(INT16)READ16(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL16_REG_MEM);     /* TODO: Correct multiply timing */
        }
@@ -689,7 +689,7 @@ static void I386OP(imul_r16_rm16_i16)(i386_state *cpustate) // Opcode 0x69
                dst = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(cpustate,CYCLES_IMUL16_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                dst = (INT32)(INT16)READ16(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL16_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -711,7 +711,7 @@ static void I386OP(imul_r16_rm16_i8)(i386_state *cpustate)  // Opcode 0x6b
                dst = (INT32)(INT16)LOAD_RM16(modrm);
                CYCLES(cpustate,CYCLES_IMUL16_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                dst = (INT32)(INT16)READ16(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL16_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -1219,9 +1219,9 @@ static void I386OP(lodsw)(i386_state *cpustate)             // Opcode 0xad
 {
        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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        }
        REG16(AX) = READ16(cpustate,eas);
        BUMP_SI(cpustate,2);
@@ -1291,7 +1291,7 @@ static void I386OP(mov_rm16_r16)(i386_state *cpustate)      // Opcode 0x89
                STORE_RM16(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                WRITE16(cpustate,ea, src);
                CYCLES(cpustate,CYCLES_MOV_REG_MEM);
@@ -1307,18 +1307,9 @@ static void I386OP(mov_r16_rm16)(i386_state *cpustate)      // Opcode 0x8b
                STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
-               // NEC PC-9801RA's ITF routine intentionally raise general protection fault :-(
-               int segment = DS;
-               if( cpustate->segment_prefix ) {
-                       segment = cpustate->segment_override;
-               }
-               if( i386_limit_check(cpustate, segment, (ea + 1) & 0xffff) == 0 ) {
-                       src = READ16(cpustate,ea);
-                       STORE_REG16(modrm, src);
-               } else {
-                       FAULT(FAULT_GP, 0)
-               }
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
+               src = READ16(cpustate,ea);
+               STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_MEM_REG);
        }
 }
@@ -1331,7 +1322,7 @@ static void I386OP(mov_rm16_i16)(i386_state *cpustate)      // Opcode 0xc7
                STORE_RM16(modrm, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 value = FETCH16(cpustate);
                WRITE16(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
@@ -1348,9 +1339,9 @@ static void I386OP(mov_ax_m16)(i386_state *cpustate)        // Opcode 0xa1
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0, 2 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 0 );
+               ea = i386_translate(cpustate, DS, offset, 0, 2 );
        }
        REG16(AX) = READ16(cpustate,ea);
        CYCLES(cpustate,CYCLES_MOV_MEM_ACC);
@@ -1366,9 +1357,9 @@ static void I386OP(mov_m16_ax)(i386_state *cpustate)        // Opcode 0xa3
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1, 2 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 1 );
+               ea = i386_translate(cpustate, DS, offset, 1, 2 );
        }
        WRITE16(cpustate, ea, REG16(AX) );
        CYCLES(cpustate,CYCLES_MOV_ACC_MEM);
@@ -1427,11 +1418,11 @@ static void I386OP(movsw)(i386_state *cpustate)             // Opcode 0xa5
        UINT32 eas, ead;
        UINT16 v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 2 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 2 );
        v = READ16(cpustate,eas);
        WRITE16(cpustate,ead, v);
        BUMP_SI(cpustate,2);
@@ -1447,7 +1438,7 @@ static void I386OP(movsx_r16_rm8)(i386_state *cpustate)     // Opcode 0x0f be
                STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                INT16 src = (INT8)READ8(cpustate,ea);
                STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_MEM_REG);
@@ -1462,7 +1453,7 @@ static void I386OP(movzx_r16_rm8)(i386_state *cpustate)     // Opcode 0x0f b6
                STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                UINT16 src = (UINT8)READ8(cpustate,ea);
                STORE_REG16(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_MEM_REG);
@@ -1480,7 +1471,7 @@ static void I386OP(or_rm16_r16)(i386_state *cpustate)       // Opcode 0x09
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = OR16(cpustate,dst, src);
@@ -1500,7 +1491,7 @@ static void I386OP(or_r16_rm16)(i386_state *cpustate)       // Opcode 0x0b
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = OR16(cpustate,dst, src);
@@ -1538,7 +1529,7 @@ static void I386OP(out_ax_dx)(i386_state *cpustate)         // Opcode 0xef
 static void I386OP(pop_ax)(i386_state *cpustate)            // Opcode 0x58
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(AX) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1548,7 +1539,7 @@ static void I386OP(pop_ax)(i386_state *cpustate)            // Opcode 0x58
 static void I386OP(pop_cx)(i386_state *cpustate)            // Opcode 0x59
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(CX) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1558,7 +1549,7 @@ static void I386OP(pop_cx)(i386_state *cpustate)            // Opcode 0x59
 static void I386OP(pop_dx)(i386_state *cpustate)            // Opcode 0x5a
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(DX) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1568,7 +1559,7 @@ static void I386OP(pop_dx)(i386_state *cpustate)            // Opcode 0x5a
 static void I386OP(pop_bx)(i386_state *cpustate)            // Opcode 0x5b
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(BX) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1578,7 +1569,7 @@ static void I386OP(pop_bx)(i386_state *cpustate)            // Opcode 0x5b
 static void I386OP(pop_sp)(i386_state *cpustate)            // Opcode 0x5c
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(SP) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1588,7 +1579,7 @@ static void I386OP(pop_sp)(i386_state *cpustate)            // Opcode 0x5c
 static void I386OP(pop_bp)(i386_state *cpustate)            // Opcode 0x5d
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(BP) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1598,7 +1589,7 @@ static void I386OP(pop_bp)(i386_state *cpustate)            // Opcode 0x5d
 static void I386OP(pop_si)(i386_state *cpustate)            // Opcode 0x5e
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(SI) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1608,7 +1599,7 @@ static void I386OP(pop_si)(i386_state *cpustate)            // Opcode 0x5e
 static void I386OP(pop_di)(i386_state *cpustate)            // Opcode 0x5f
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                REG16(DI) = POP16(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1620,9 +1611,9 @@ static bool I386OP(pop_seg16)(i386_state *cpustate, int segment)
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
        UINT16 value;
        bool fault;
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
        {
-               ea = i386_translate(cpustate, SS, offset, 0);
+               ea = i386_translate(cpustate, SS, offset, 0, 2);
                value = READ16(cpustate, ea);
                i386_sreg_load(cpustate,value, segment, &fault);
                if(fault) return false;
@@ -1677,7 +1668,7 @@ static void I386OP(pop_rm16)(i386_state *cpustate)          // Opcode 0x8f
        UINT16 value;
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
 
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
        {
                UINT32 temp_sp = REG32(ESP);
                value = POP16(cpustate);
@@ -1685,7 +1676,7 @@ static void I386OP(pop_rm16)(i386_state *cpustate)          // Opcode 0x8f
                if( modrm >= 0xc0 ) {
                        STORE_RM16(modrm, value);
                } else {
-                       ea = GetEA(cpustate,modrm,1);
+                       ea = GetEA(cpustate,modrm,1,2);
                        try
                        {
                                WRITE16(cpustate,ea, value);
@@ -1706,7 +1697,7 @@ static void I386OP(popa)(i386_state *cpustate)              // Opcode 0x61
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
 
-       if(i386_limit_check(cpustate,SS,offset+15) == 0)
+       if(i386_limit_check(cpustate,SS,offset,16) == 0)
        {
                REG16(DI) = POP16(cpustate);
                REG16(SI) = POP16(cpustate);
@@ -1748,7 +1739,7 @@ static void I386OP(popf)(i386_state *cpustate)              // Opcode 0x9d
                mask &= ~0x00003000;  // IOPL cannot be changed while in V8086 mode
        }
 
-       if(i386_limit_check(cpustate,SS,offset+1) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
        {
                value = POP16(cpustate);
                set_flags(cpustate,(current & ~mask) | (value & mask));  // mask out reserved bits
@@ -1765,7 +1756,7 @@ static void I386OP(push_ax)(i386_state *cpustate)           // Opcode 0x50
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(AX) );
        else
                FAULT(FAULT_SS,0)
@@ -1779,7 +1770,7 @@ static void I386OP(push_cx)(i386_state *cpustate)           // Opcode 0x51
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(CX) );
        else
                FAULT(FAULT_SS,0)
@@ -1793,7 +1784,7 @@ static void I386OP(push_dx)(i386_state *cpustate)           // Opcode 0x52
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(DX) );
        else
                FAULT(FAULT_SS,0)
@@ -1807,7 +1798,7 @@ static void I386OP(push_bx)(i386_state *cpustate)           // Opcode 0x53
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(BX) );
        else
                FAULT(FAULT_SS,0)
@@ -1821,7 +1812,7 @@ static void I386OP(push_sp)(i386_state *cpustate)           // Opcode 0x54
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(SP) );
        else
                FAULT(FAULT_SS,0)
@@ -1835,7 +1826,7 @@ static void I386OP(push_bp)(i386_state *cpustate)           // Opcode 0x55
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(BP) );
        else
                FAULT(FAULT_SS,0)
@@ -1849,7 +1840,7 @@ static void I386OP(push_si)(i386_state *cpustate)           // Opcode 0x56
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(SI) );
        else
                FAULT(FAULT_SS,0)
@@ -1863,7 +1854,7 @@ static void I386OP(push_di)(i386_state *cpustate)           // Opcode 0x57
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, REG16(DI) );
        else
                FAULT(FAULT_SS,0)
@@ -1877,7 +1868,7 @@ static void I386OP(push_cs16)(i386_state *cpustate)         // Opcode 0x0e
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[CS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1891,7 +1882,7 @@ static void I386OP(push_ds16)(i386_state *cpustate)         // Opcode 0x1e
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[DS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1905,7 +1896,7 @@ static void I386OP(push_es16)(i386_state *cpustate)         // Opcode 0x06
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[ES].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1919,7 +1910,7 @@ static void I386OP(push_fs16)(i386_state *cpustate)         // Opcode 0x0f a0
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[FS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1933,7 +1924,7 @@ static void I386OP(push_gs16)(i386_state *cpustate)         // Opcode 0x0f a8
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[GS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1947,7 +1938,7 @@ static void I386OP(push_ss16)(i386_state *cpustate)         // Opcode 0x16
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, cpustate->sreg[SS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1962,7 +1953,7 @@ static void I386OP(push_i16)(i386_state *cpustate)          // Opcode 0x68
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate,value);
        else
                FAULT(FAULT_SS,0)
@@ -1977,7 +1968,7 @@ static void I386OP(pusha)(i386_state *cpustate)             // Opcode 0x60
                offset = REG32(ESP) - 16;
        else
                offset = (REG16(SP) - 16) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,16) == 0)
        {
                PUSH16(cpustate, REG16(AX) );
                PUSH16(cpustate, REG16(CX) );
@@ -2000,7 +1991,7 @@ static void I386OP(pushf)(i386_state *cpustate)             // Opcode 0x9c
                offset = REG32(ESP) - 2;
        else
                offset = (REG16(SP) - 2) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,2) == 0)
                PUSH16(cpustate, get_flags(cpustate) & 0xffff );
        else
                FAULT(FAULT_SS,0)
@@ -2034,7 +2025,7 @@ static void I386OP(sbb_rm16_r16)(i386_state *cpustate)      // Opcode 0x19
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = SBB16(cpustate, dst, src, cpustate->CF);
@@ -2054,7 +2045,7 @@ static void I386OP(sbb_r16_rm16)(i386_state *cpustate)      // Opcode 0x1b
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = SBB16(cpustate, dst, src, cpustate->CF);
@@ -2077,7 +2068,7 @@ static void I386OP(scasw)(i386_state *cpustate)             // Opcode 0xaf
 {
        UINT32 eas;
        UINT16 src, dst;
-       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 2 );
        src = READ16(cpustate,eas);
        dst = REG16(AX);
        SUB16(cpustate,dst, src);
@@ -2109,7 +2100,7 @@ static void I386OP(shld16_i8)(i386_state *cpustate)         // Opcode 0x0f a4
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = FETCH(cpustate);
@@ -2154,7 +2145,7 @@ static void I386OP(shld16_cl)(i386_state *cpustate)         // Opcode 0x0f a5
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = REG8(CL);
@@ -2199,7 +2190,7 @@ static void I386OP(shrd16_i8)(i386_state *cpustate)         // Opcode 0x0f ac
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = FETCH(cpustate);
@@ -2244,7 +2235,7 @@ static void I386OP(shrd16_cl)(i386_state *cpustate)         // Opcode 0x0f ad
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 upper = LOAD_REG16(modrm);
                UINT8 shift = REG8(CL);
@@ -2269,7 +2260,7 @@ static void I386OP(shrd16_cl)(i386_state *cpustate)         // Opcode 0x0f ad
 static void I386OP(stosw)(i386_state *cpustate)             // Opcode 0xab
 {
        UINT32 ead;
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 2 );
        WRITE16(cpustate,ead, REG16(AX));
        BUMP_DI(cpustate,2);
        CYCLES(cpustate,CYCLES_STOS);
@@ -2286,7 +2277,7 @@ static void I386OP(sub_rm16_r16)(i386_state *cpustate)      // Opcode 0x29
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = SUB16(cpustate,dst, src);
@@ -2306,7 +2297,7 @@ static void I386OP(sub_r16_rm16)(i386_state *cpustate)      // Opcode 0x2b
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = SUB16(cpustate,dst, src);
@@ -2349,7 +2340,7 @@ static void I386OP(test_rm16_r16)(i386_state *cpustate)     // Opcode 0x85
                cpustate->OF = 0;
                CYCLES(cpustate,CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = src & dst;
@@ -2433,7 +2424,7 @@ static void I386OP(xchg_r16_rm16)(i386_state *cpustate)     // Opcode 0x87
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 src = READ16(cpustate,ea);
                UINT16 dst = LOAD_REG16(modrm);
                STORE_REG16(modrm, src);
@@ -2453,7 +2444,7 @@ static void I386OP(xor_rm16_r16)(i386_state *cpustate)      // Opcode 0x31
                STORE_RM16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                src = LOAD_REG16(modrm);
                dst = READ16(cpustate,ea);
                dst = XOR16(cpustate,dst, src);
@@ -2473,7 +2464,7 @@ static void I386OP(xor_r16_rm16)(i386_state *cpustate)      // Opcode 0x33
                STORE_REG16(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
                dst = LOAD_REG16(modrm);
                dst = XOR16(cpustate,dst, src);
@@ -2510,7 +2501,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = ADD16(cpustate,dst, src);
@@ -2526,7 +2517,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = OR16(cpustate,dst, src);
@@ -2542,7 +2533,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = ADC16(cpustate, dst, src, cpustate->CF);
@@ -2558,7 +2549,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = SBB16(cpustate, dst, src, cpustate->CF);
@@ -2574,7 +2565,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = AND16(cpustate,dst, src);
@@ -2590,7 +2581,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = SUB16(cpustate,dst, src);
@@ -2606,7 +2597,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                dst = XOR16(cpustate,dst, src);
@@ -2621,7 +2612,7 @@ static void I386OP(group81_16)(i386_state *cpustate)        // Opcode 0x81
                                SUB16(cpustate,dst, src);
                                CYCLES(cpustate,CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,2);
                                dst = READ16(cpustate,ea);
                                src = FETCH16(cpustate);
                                SUB16(cpustate,dst, src);
@@ -2647,7 +2638,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = ADD16(cpustate,dst, src);
@@ -2663,7 +2654,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = OR16(cpustate,dst, src);
@@ -2679,7 +2670,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = ADC16(cpustate, dst, src, cpustate->CF);
@@ -2695,7 +2686,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = ((UINT16)(INT16)(INT8)FETCH(cpustate));
                                dst = SBB16(cpustate, dst, src, cpustate->CF);
@@ -2711,7 +2702,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = AND16(cpustate,dst, src);
@@ -2727,7 +2718,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = SUB16(cpustate,dst, src);
@@ -2743,7 +2734,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                dst = XOR16(cpustate,dst, src);
@@ -2758,7 +2749,7 @@ static void I386OP(group83_16)(i386_state *cpustate)        // Opcode 0x83
                                SUB16(cpustate,dst, src);
                                CYCLES(cpustate,CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,2);
                                dst = READ16(cpustate,ea);
                                src = (UINT16)(INT16)(INT8)FETCH(cpustate);
                                SUB16(cpustate,dst, src);
@@ -2780,7 +2771,7 @@ static void I386OP(groupC1_16)(i386_state *cpustate)        // Opcode 0xc1
                dst = i386_shift_rotate16(cpustate, modrm, dst, shift);
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                dst = READ16(cpustate,ea);
                shift = FETCH(cpustate) & 0x1f;
                dst = i386_shift_rotate16(cpustate, modrm, dst, shift);
@@ -2798,7 +2789,7 @@ static void I386OP(groupD1_16)(i386_state *cpustate)        // Opcode 0xd1
                dst = i386_shift_rotate16(cpustate, modrm, dst, 1);
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                dst = READ16(cpustate,ea);
                dst = i386_shift_rotate16(cpustate, modrm, dst, 1);
                WRITE16(cpustate,ea, dst);
@@ -2815,7 +2806,7 @@ static void I386OP(groupD3_16)(i386_state *cpustate)        // Opcode 0xd3
                dst = i386_shift_rotate16(cpustate, modrm, dst, REG8(CL));
                STORE_RM16(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                dst = READ16(cpustate,ea);
                dst = i386_shift_rotate16(cpustate, modrm, dst, REG8(CL));
                WRITE16(cpustate,ea, dst);
@@ -2837,7 +2828,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                SetSZPF16(dst);
                                CYCLES(cpustate,CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
+                               UINT32 ea = GetEA(cpustate,modrm,0,2);
                                UINT16 dst = READ16(cpustate,ea);
                                UINT16 src = FETCH16(cpustate);
                                dst &= src;
@@ -2853,7 +2844,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                dst = ~dst;
                                WRITE16(cpustate,ea, dst);
@@ -2867,7 +2858,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                dst = SUB16(cpustate, 0, dst );
                                WRITE16(cpustate,ea, dst);
@@ -2882,7 +2873,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_MUL16_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        src = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_MUL16_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2903,7 +2894,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                        src = (INT32)(INT16)LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_IMUL16_ACC_REG);     /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        src = (INT32)(INT16)READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IMUL16_ACC_MEM);     /* TODO: Correct multiply timing */
                                }
@@ -2925,7 +2916,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_DIV16_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        src = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_DIV16_ACC_MEM);
                                }
@@ -2957,7 +2948,7 @@ static void I386OP(groupF7_16)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_IDIV16_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        src = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IDIV16_ACC_MEM);
                                }
@@ -2997,7 +2988,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                dst = INC16(cpustate,dst);
                                WRITE16(cpustate,ea, dst);
@@ -3011,7 +3002,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                dst = DEC16(cpustate,dst);
                                WRITE16(cpustate,ea, dst);
@@ -3025,7 +3016,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        address = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
@@ -3043,7 +3034,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        address = READ16(cpustate,ea + 0);
                                        selector = READ16(cpustate,ea + 2);
                                        CYCLES(cpustate,CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
@@ -3074,7 +3065,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                        address = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        address = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
                                }
@@ -3092,7 +3083,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        address = READ16(cpustate,ea + 0);
                                        selector = READ16(cpustate,ea + 2);
                                        CYCLES(cpustate,CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
@@ -3117,7 +3108,7 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM16(modrm);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                                        value = READ16(cpustate,ea);
                                }
                                PUSH16(cpustate,value);
@@ -3146,7 +3137,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        STORE_RM16(modrm, cpustate->ldtr.segment);
                                        CYCLES(cpustate,CYCLES_SLDT_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate, ea, cpustate->ldtr.segment);
                                        CYCLES(cpustate,CYCLES_SLDT_MEM);
                                }
@@ -3163,7 +3154,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        STORE_RM16(modrm, cpustate->task.segment);
                                        CYCLES(cpustate,CYCLES_STR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate, ea, cpustate->task.segment);
                                        CYCLES(cpustate,CYCLES_STR_MEM);
                                }
@@ -3183,7 +3174,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        cpustate->ldtr.segment = address;
                                        CYCLES(cpustate,CYCLES_LLDT_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        cpustate->ldtr.segment = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_LLDT_MEM);
                                }
@@ -3210,7 +3201,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        cpustate->task.segment = address;
                                        CYCLES(cpustate,CYCLES_LTR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        cpustate->task.segment = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_LTR_MEM);
                                }
@@ -3240,7 +3231,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        address = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_VERR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        address = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_VERR_MEM);
                                }
@@ -3288,7 +3279,7 @@ static void I386OP(group0F00_16)(i386_state *cpustate)          // Opcode 0x0f 0
                                        address = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_VERW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        address = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_VERW_MEM);
                                }
@@ -3341,9 +3332,9 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 1 );
+                                       ea = i386_translate(cpustate, CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->gdtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->gdtr.base);
@@ -3355,11 +3346,11 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 1 );
+                                       ea = i386_translate(cpustate, CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->idtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->idtr.base);
@@ -3372,9 +3363,9 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 0 );
+                                       ea = i386_translate(cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->gdtr.limit = READ16(cpustate,ea);
                                cpustate->gdtr.base = READ32(cpustate,ea + 2) & 0xffffff;
@@ -3387,9 +3378,9 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 0 );
+                                       ea = i386_translate(cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->idtr.limit = READ16(cpustate,ea);
                                cpustate->idtr.base = READ32(cpustate,ea + 2) & 0xffffff;
@@ -3402,7 +3393,7 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        STORE_RM16(modrm, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate,ea, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_MEM);
                                }
@@ -3417,7 +3408,7 @@ static void I386OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        CYCLES(cpustate,CYCLES_LMSW_MEM);
                                b = READ16(cpustate,ea);
                                }
@@ -3451,7 +3442,7 @@ static void I386OP(group0FBA_16)(i386_state *cpustate)      // Opcode 0x0f ba
 
                                CYCLES(cpustate,CYCLES_BT_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
+                               UINT32 ea = GetEA(cpustate,modrm,0,2);
                                UINT16 dst = READ16(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3477,7 +3468,7 @@ static void I386OP(group0FBA_16)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTS_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3505,7 +3496,7 @@ static void I386OP(group0FBA_16)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTR_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3533,7 +3524,7 @@ static void I386OP(group0FBA_16)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM16(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTC_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,2);
                                UINT16 dst = READ16(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3569,7 +3560,7 @@ static void I386OP(lar_r16_rm16)(i386_state *cpustate)  // Opcode 0x0f 0x02
                }
                else
                {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                        seg.selector = READ16(cpustate,ea);
                        CYCLES(cpustate,CYCLES_LAR_MEM);
                }
@@ -3635,7 +3626,7 @@ static void I386OP(lsl_r16_rm16)(i386_state *cpustate)  // Opcode 0x0f 0x03
                }
                else
                {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,2);
                        seg.selector = READ16(cpustate,ea);
                }
                if(seg.selector == 0)
@@ -3696,7 +3687,7 @@ static void I386OP(bound_r16_m16_m16)(i386_state *cpustate) // Opcode 0x62
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                low = READ16(cpustate,ea + 0);
                high = READ16(cpustate,ea + 2);
        }
@@ -3760,7 +3751,7 @@ static bool I386OP(load_far_pointer16)(i386_state *cpustate, int s)
                i386_trap(cpustate,6, 0, 0);
                return false;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                STORE_REG16(modrm, READ16(cpustate,ea + 0));
                selector = READ16(cpustate,ea + 2);
                i386_sreg_load(cpustate,selector,s,NULL);
index 7f7b387..16ce7d0 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 static UINT32 I386OP(shift_rotate32)(i386_state *cpustate, UINT8 modrm, UINT32 value, UINT8 shift)
 {
        UINT32 dst, src;
@@ -131,7 +131,7 @@ static void I386OP(adc_rm32_r32)(i386_state *cpustate)      // Opcode 0x11
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = ADC32(cpustate, dst, src, cpustate->CF);
@@ -151,7 +151,7 @@ static void I386OP(adc_r32_rm32)(i386_state *cpustate)      // Opcode 0x13
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = ADC32(cpustate, dst, src, cpustate->CF);
@@ -181,7 +181,7 @@ static void I386OP(add_rm32_r32)(i386_state *cpustate)      // Opcode 0x01
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = ADD32(cpustate,dst, src);
@@ -201,7 +201,7 @@ static void I386OP(add_r32_rm32)(i386_state *cpustate)      // Opcode 0x03
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = ADD32(cpustate,dst, src);
@@ -231,7 +231,7 @@ static void I386OP(and_rm32_r32)(i386_state *cpustate)      // Opcode 0x21
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = AND32(cpustate,dst, src);
@@ -251,7 +251,7 @@ static void I386OP(and_r32_rm32)(i386_state *cpustate)      // Opcode 0x23
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = AND32(cpustate,dst, src);
@@ -278,7 +278,7 @@ static void I386OP(bsf_r32_rm32)(i386_state *cpustate)      // Opcode 0x0f bc
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
        }
 
@@ -307,7 +307,7 @@ static void I386OP(bsr_r32_rm32)(i386_state *cpustate)      // Opcode 0x0f bd
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
        }
 
@@ -346,7 +346,7 @@ static void I386OP(bt_rm32_r32)(i386_state *cpustate)       // Opcode 0x0f a3
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0,4);
                bit %= 32;
                UINT32 dst = READ32(cpustate,ea);
 
@@ -379,7 +379,7 @@ static void I386OP(btc_rm32_r32)(i386_state *cpustate)      // Opcode 0x0f bb
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(cpustate,ea);
 
@@ -414,7 +414,7 @@ static void I386OP(btr_rm32_r32)(i386_state *cpustate)      // Opcode 0x0f b3
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(cpustate,ea);
 
@@ -449,7 +449,7 @@ static void I386OP(bts_rm32_r32)(i386_state *cpustate)      // Opcode 0x0f ab
                UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
                UINT32 bit = LOAD_REG32(modrm);
                ea += 4*(bit/32);
-               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
+               ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1,4);
                bit %= 32;
                UINT32 dst = READ32(cpustate,ea);
 
@@ -515,7 +515,7 @@ static void I386OP(cmp_rm32_r32)(i386_state *cpustate)      // Opcode 0x39
                SUB32(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                SUB32(cpustate,dst, src);
@@ -533,7 +533,7 @@ static void I386OP(cmp_r32_rm32)(i386_state *cpustate)      // Opcode 0x3b
                SUB32(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                SUB32(cpustate,dst, src);
@@ -554,11 +554,11 @@ static void I386OP(cmpsd)(i386_state *cpustate)             // Opcode 0xa7
 {
        UINT32 eas, ead, 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 4 );
        src = READ32(cpustate,eas);
        dst = READ32(cpustate,ead);
        SUB32(cpustate,src,dst);
@@ -630,7 +630,7 @@ static void I386OP(imul_r32_rm32)(i386_state *cpustate)     // Opcode 0x0f af
                src = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(cpustate,CYCLES_IMUL32_REG_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = (INT64)(INT32)READ32(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL32_REG_REG);     /* TODO: Correct multiply timing */
        }
@@ -652,7 +652,7 @@ static void I386OP(imul_r32_rm32_i32)(i386_state *cpustate) // Opcode 0x69
                dst = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(cpustate,CYCLES_IMUL32_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                dst = (INT64)(INT32)READ32(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL32_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -674,7 +674,7 @@ static void I386OP(imul_r32_rm32_i8)(i386_state *cpustate)  // Opcode 0x6b
                dst = (INT64)(INT32)LOAD_RM32(modrm);
                CYCLES(cpustate,CYCLES_IMUL32_REG_IMM_REG);     /* TODO: Correct multiply timing */
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                dst = (INT64)(INT32)READ32(cpustate,ea);
                CYCLES(cpustate,CYCLES_IMUL32_MEM_IMM_REG);     /* TODO: Correct multiply timing */
        }
@@ -1059,9 +1059,9 @@ static void I386OP(lodsd)(i386_state *cpustate)             // Opcode 0xad
 {
        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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        }
        REG32(EAX) = READ32(cpustate,eas);
        BUMP_SI(cpustate,4);
@@ -1110,7 +1110,7 @@ static void I386OP(mov_rm32_r32)(i386_state *cpustate)      // Opcode 0x89
                STORE_RM32(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                WRITE32(cpustate,ea, src);
                CYCLES(cpustate,CYCLES_MOV_REG_MEM);
@@ -1126,7 +1126,7 @@ static void I386OP(mov_r32_rm32)(i386_state *cpustate)      // Opcode 0x8b
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_MEM_REG);
@@ -1141,7 +1141,7 @@ static void I386OP(mov_rm32_i32)(i386_state *cpustate)      // Opcode 0xc7
                STORE_RM32(modrm, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 value = FETCH32(cpustate);
                WRITE32(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
@@ -1157,9 +1157,9 @@ static void I386OP(mov_eax_m32)(i386_state *cpustate)       // Opcode 0xa1
                offset = FETCH16(cpustate);
        }
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0, 4 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 0 );
+               ea = i386_translate(cpustate, DS, offset, 0, 4 );
        }
        REG32(EAX) = READ32(cpustate,ea);
        CYCLES(cpustate,CYCLES_MOV_MEM_ACC);
@@ -1174,9 +1174,9 @@ static void I386OP(mov_m32_eax)(i386_state *cpustate)       // Opcode 0xa3
                offset = FETCH16(cpustate);
        }
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1, 4 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 1 );
+               ea = i386_translate(cpustate, DS, offset, 1, 4 );
        }
        WRITE32(cpustate, ea, REG32(EAX) );
        CYCLES(cpustate,CYCLES_MOV_ACC_MEM);
@@ -1234,11 +1234,11 @@ static void I386OP(movsd)(i386_state *cpustate)             // Opcode 0xa5
 {
        UINT32 eas, ead, v;
        if( cpustate->segment_prefix ) {
-               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 4 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 4 );
        v = READ32(cpustate,eas);
        WRITE32(cpustate,ead, v);
        BUMP_SI(cpustate,4);
@@ -1254,7 +1254,7 @@ static void I386OP(movsx_r32_rm8)(i386_state *cpustate)     // Opcode 0x0f be
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                INT32 src = (INT8)READ8(cpustate,ea);
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_MEM_REG);
@@ -1269,7 +1269,7 @@ static void I386OP(movsx_r32_rm16)(i386_state *cpustate)    // Opcode 0x0f bf
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                INT32 src = (INT16)READ16(cpustate,ea);
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVSX_MEM_REG);
@@ -1284,7 +1284,7 @@ static void I386OP(movzx_r32_rm8)(i386_state *cpustate)     // Opcode 0x0f b6
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                UINT32 src = (UINT8)READ8(cpustate,ea);
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_MEM_REG);
@@ -1299,7 +1299,7 @@ static void I386OP(movzx_r32_rm16)(i386_state *cpustate)    // Opcode 0x0f b7
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                UINT32 src = (UINT16)READ16(cpustate,ea);
                STORE_REG32(modrm, src);
                CYCLES(cpustate,CYCLES_MOVZX_MEM_REG);
@@ -1317,7 +1317,7 @@ static void I386OP(or_rm32_r32)(i386_state *cpustate)       // Opcode 0x09
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = OR32(cpustate,dst, src);
@@ -1337,7 +1337,7 @@ static void I386OP(or_r32_rm32)(i386_state *cpustate)       // Opcode 0x0b
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = OR32(cpustate,dst, src);
@@ -1375,7 +1375,7 @@ static void I386OP(out_eax_dx)(i386_state *cpustate)        // Opcode 0xef
 static void I386OP(pop_eax)(i386_state *cpustate)           // Opcode 0x58
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(EAX) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1385,7 +1385,7 @@ static void I386OP(pop_eax)(i386_state *cpustate)           // Opcode 0x58
 static void I386OP(pop_ecx)(i386_state *cpustate)           // Opcode 0x59
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(ECX) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1395,7 +1395,7 @@ static void I386OP(pop_ecx)(i386_state *cpustate)           // Opcode 0x59
 static void I386OP(pop_edx)(i386_state *cpustate)           // Opcode 0x5a
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(EDX) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1405,7 +1405,7 @@ static void I386OP(pop_edx)(i386_state *cpustate)           // Opcode 0x5a
 static void I386OP(pop_ebx)(i386_state *cpustate)           // Opcode 0x5b
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(EBX) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1415,7 +1415,7 @@ static void I386OP(pop_ebx)(i386_state *cpustate)           // Opcode 0x5b
 static void I386OP(pop_esp)(i386_state *cpustate)           // Opcode 0x5c
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(ESP) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1425,7 +1425,7 @@ static void I386OP(pop_esp)(i386_state *cpustate)           // Opcode 0x5c
 static void I386OP(pop_ebp)(i386_state *cpustate)           // Opcode 0x5d
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(EBP) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1435,7 +1435,7 @@ static void I386OP(pop_ebp)(i386_state *cpustate)           // Opcode 0x5d
 static void I386OP(pop_esi)(i386_state *cpustate)           // Opcode 0x5e
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(ESI) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1445,7 +1445,7 @@ static void I386OP(pop_esi)(i386_state *cpustate)           // Opcode 0x5e
 static void I386OP(pop_edi)(i386_state *cpustate)           // Opcode 0x5f
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                REG32(EDI) = POP32(cpustate);
        else
                FAULT(FAULT_SS,0)
@@ -1457,9 +1457,9 @@ static bool I386OP(pop_seg32)(i386_state *cpustate, int segment)
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
        UINT32 value;
        bool fault;
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
        {
-               ea = i386_translate(cpustate, SS, offset, 0);
+               ea = i386_translate(cpustate, SS, offset, 0, 4);
                value = READ32(cpustate, ea);
                i386_sreg_load(cpustate,value, segment, &fault);
                if(fault) return false;
@@ -1513,7 +1513,7 @@ static void I386OP(pop_rm32)(i386_state *cpustate)          // Opcode 0x8f
        UINT8 modrm = FETCH(cpustate);
        UINT32 value;
        UINT32 ea, offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
        {
                // be careful here, if the write references the esp register
                // it expects the post-pop value but esp must be wound back
@@ -1524,7 +1524,7 @@ static void I386OP(pop_rm32)(i386_state *cpustate)          // Opcode 0x8f
                if( modrm >= 0xc0 ) {
                        STORE_RM32(modrm, value);
                } else {
-                       ea = GetEA(cpustate,modrm,1);
+                       ea = GetEA(cpustate,modrm,1,4);
                        try
                        {
                                WRITE32(cpustate,ea, value);
@@ -1544,7 +1544,7 @@ static void I386OP(pop_rm32)(i386_state *cpustate)          // Opcode 0x8f
 static void I386OP(popad)(i386_state *cpustate)             // Opcode 0x61
 {
        UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
-       if(i386_limit_check(cpustate,SS,offset+31) == 0)
+       if(i386_limit_check(cpustate,SS,offset,32) == 0)
        {
                REG32(EDI) = POP32(cpustate);
                REG32(ESI) = POP32(cpustate);
@@ -1586,7 +1586,7 @@ static void I386OP(popfd)(i386_state *cpustate)             // Opcode 0x9d
                mask &= ~0x00003000;  // IOPL cannot be changed while in V8086 mode
        }
 
-       if(i386_limit_check(cpustate,SS,offset+3) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
        {
                value = POP32(cpustate);
                value &= ~0x00010000;  // RF will always return zero
@@ -1604,7 +1604,7 @@ static void I386OP(push_eax)(i386_state *cpustate)          // Opcode 0x50
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(EAX) );
        else
                FAULT(FAULT_SS,0)
@@ -1618,7 +1618,7 @@ static void I386OP(push_ecx)(i386_state *cpustate)          // Opcode 0x51
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(ECX) );
        else
                FAULT(FAULT_SS,0)
@@ -1632,7 +1632,7 @@ static void I386OP(push_edx)(i386_state *cpustate)          // Opcode 0x52
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(EDX) );
        else
                FAULT(FAULT_SS,0)
@@ -1646,7 +1646,7 @@ static void I386OP(push_ebx)(i386_state *cpustate)          // Opcode 0x53
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(EBX) );
        else
                FAULT(FAULT_SS,0)
@@ -1660,7 +1660,7 @@ static void I386OP(push_esp)(i386_state *cpustate)          // Opcode 0x54
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(ESP) );
        else
                FAULT(FAULT_SS,0)
@@ -1674,7 +1674,7 @@ static void I386OP(push_ebp)(i386_state *cpustate)          // Opcode 0x55
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(EBP) );
        else
                FAULT(FAULT_SS,0)
@@ -1688,7 +1688,7 @@ static void I386OP(push_esi)(i386_state *cpustate)          // Opcode 0x56
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(ESI) );
        else
                FAULT(FAULT_SS,0)
@@ -1702,7 +1702,7 @@ static void I386OP(push_edi)(i386_state *cpustate)          // Opcode 0x57
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, REG32(EDI) );
        else
                FAULT(FAULT_SS,0)
@@ -1716,7 +1716,7 @@ static void I386OP(push_cs32)(i386_state *cpustate)         // Opcode 0x0e
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[CS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1730,7 +1730,7 @@ static void I386OP(push_ds32)(i386_state *cpustate)         // Opcode 0x1e
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[DS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1744,7 +1744,7 @@ static void I386OP(push_es32)(i386_state *cpustate)         // Opcode 0x06
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[ES].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1758,7 +1758,7 @@ static void I386OP(push_fs32)(i386_state *cpustate)         // Opcode 0x0f a0
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[FS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1772,7 +1772,7 @@ static void I386OP(push_gs32)(i386_state *cpustate)         // Opcode 0x0f a8
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[GS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1786,7 +1786,7 @@ static void I386OP(push_ss32)(i386_state *cpustate)         // Opcode 0x16
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32SEG(cpustate, cpustate->sreg[SS].selector );
        else
                FAULT(FAULT_SS,0)
@@ -1801,7 +1801,7 @@ static void I386OP(push_i32)(i386_state *cpustate)          // Opcode 0x68
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate,value);
        else
                FAULT(FAULT_SS,0)
@@ -1816,7 +1816,7 @@ static void I386OP(pushad)(i386_state *cpustate)            // Opcode 0x60
                offset = REG32(ESP) - 32;
        else
                offset = (REG16(SP) - 32) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,32) == 0)
        {
                PUSH32(cpustate, REG32(EAX) );
                PUSH32(cpustate, REG32(ECX) );
@@ -1841,7 +1841,7 @@ static void I386OP(pushfd)(i386_state *cpustate)            // Opcode 0x9c
                offset = REG32(ESP) - 4;
        else
                offset = (REG16(SP) - 4) & 0xffff;
-       if(i386_limit_check(cpustate,SS,offset) == 0)
+       if(i386_limit_check(cpustate,SS,offset,4) == 0)
                PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff );
        else
                FAULT(FAULT_SS,0)
@@ -1875,7 +1875,7 @@ static void I386OP(sbb_rm32_r32)(i386_state *cpustate)      // Opcode 0x19
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = SBB32(cpustate, dst, src, cpustate->CF);
@@ -1895,7 +1895,7 @@ static void I386OP(sbb_r32_rm32)(i386_state *cpustate)      // Opcode 0x1b
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = SBB32(cpustate, dst, src, cpustate->CF);
@@ -1917,7 +1917,7 @@ static void I386OP(sbb_eax_i32)(i386_state *cpustate)       // Opcode 0x1d
 static void I386OP(scasd)(i386_state *cpustate)             // Opcode 0xaf
 {
        UINT32 eas, src, dst;
-       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 4 );
        src = READ32(cpustate,eas);
        dst = REG32(EAX);
        SUB32(cpustate,dst, src);
@@ -1943,7 +1943,7 @@ static void I386OP(shld32_i8)(i386_state *cpustate)         // Opcode 0x0f a4
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = FETCH(cpustate);
@@ -1978,7 +1978,7 @@ static void I386OP(shld32_cl)(i386_state *cpustate)         // Opcode 0x0f a5
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_SHLD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = REG8(CL);
@@ -2013,7 +2013,7 @@ static void I386OP(shrd32_i8)(i386_state *cpustate)         // Opcode 0x0f ac
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = FETCH(cpustate);
@@ -2048,7 +2048,7 @@ static void I386OP(shrd32_cl)(i386_state *cpustate)         // Opcode 0x0f ad
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_SHRD_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 upper = LOAD_REG32(modrm);
                UINT8 shift = REG8(CL);
@@ -2067,7 +2067,7 @@ static void I386OP(shrd32_cl)(i386_state *cpustate)         // Opcode 0x0f ad
 
 static void I386OP(stosd)(i386_state *cpustate)             // Opcode 0xab
 {
-       UINT32 eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       UINT32 eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 4 );
        WRITE32(cpustate,eas, REG32(EAX));
        BUMP_DI(cpustate,4);
        CYCLES(cpustate,CYCLES_STOS);
@@ -2084,7 +2084,7 @@ static void I386OP(sub_rm32_r32)(i386_state *cpustate)      // Opcode 0x29
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = SUB32(cpustate,dst, src);
@@ -2104,7 +2104,7 @@ static void I386OP(sub_r32_rm32)(i386_state *cpustate)      // Opcode 0x2b
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = SUB32(cpustate,dst, src);
@@ -2147,7 +2147,7 @@ static void I386OP(test_rm32_r32)(i386_state *cpustate)     // Opcode 0x85
                cpustate->OF = 0;
                CYCLES(cpustate,CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = src & dst;
@@ -2231,7 +2231,7 @@ static void I386OP(xchg_r32_rm32)(i386_state *cpustate)     // Opcode 0x87
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 src = READ32(cpustate,ea);
                UINT32 dst = LOAD_REG32(modrm);
                WRITE32(cpustate,ea, dst);
@@ -2251,7 +2251,7 @@ static void I386OP(xor_rm32_r32)(i386_state *cpustate)      // Opcode 0x31
                STORE_RM32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                src = LOAD_REG32(modrm);
                dst = READ32(cpustate,ea);
                dst = XOR32(cpustate,dst, src);
@@ -2271,7 +2271,7 @@ static void I386OP(xor_r32_rm32)(i386_state *cpustate)      // Opcode 0x33
                STORE_REG32(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
                dst = LOAD_REG32(modrm);
                dst = XOR32(cpustate,dst, src);
@@ -2308,7 +2308,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = ADD32(cpustate,dst, src);
@@ -2324,7 +2324,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = OR32(cpustate,dst, src);
@@ -2340,7 +2340,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = ADC32(cpustate, dst, src, cpustate->CF);
@@ -2356,7 +2356,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = SBB32(cpustate, dst, src, cpustate->CF);
@@ -2372,7 +2372,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = AND32(cpustate,dst, src);
@@ -2388,7 +2388,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = SUB32(cpustate,dst, src);
@@ -2404,7 +2404,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                dst = XOR32(cpustate,dst, src);
@@ -2419,7 +2419,7 @@ static void I386OP(group81_32)(i386_state *cpustate)        // Opcode 0x81
                                SUB32(cpustate,dst, src);
                                CYCLES(cpustate,CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,4);
                                dst = READ32(cpustate,ea);
                                src = FETCH32(cpustate);
                                SUB32(cpustate,dst, src);
@@ -2445,7 +2445,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = ADD32(cpustate,dst, src);
@@ -2461,7 +2461,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = OR32(cpustate,dst, src);
@@ -2477,7 +2477,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = ADC32(cpustate, dst, src, cpustate->CF);
@@ -2493,7 +2493,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = ((UINT32)(INT32)(INT8)FETCH(cpustate));
                                dst = SBB32(cpustate, dst, src, cpustate->CF);
@@ -2509,7 +2509,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = AND32(cpustate,dst, src);
@@ -2525,7 +2525,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = SUB32(cpustate,dst, src);
@@ -2541,7 +2541,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                dst = XOR32(cpustate,dst, src);
@@ -2556,7 +2556,7 @@ static void I386OP(group83_32)(i386_state *cpustate)        // Opcode 0x83
                                SUB32(cpustate,dst, src);
                                CYCLES(cpustate,CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,4);
                                dst = READ32(cpustate,ea);
                                src = (UINT32)(INT32)(INT8)FETCH(cpustate);
                                SUB32(cpustate,dst, src);
@@ -2578,7 +2578,7 @@ static void I386OP(groupC1_32)(i386_state *cpustate)        // Opcode 0xc1
                dst = i386_shift_rotate32(cpustate, modrm, dst, shift);
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                dst = READ32(cpustate,ea);
                shift = FETCH(cpustate) & 0x1f;
                dst = i386_shift_rotate32(cpustate, modrm, dst, shift);
@@ -2596,7 +2596,7 @@ static void I386OP(groupD1_32)(i386_state *cpustate)        // Opcode 0xd1
                dst = i386_shift_rotate32(cpustate, modrm, dst, 1);
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                dst = READ32(cpustate,ea);
                dst = i386_shift_rotate32(cpustate, modrm, dst, 1);
                WRITE32(cpustate,ea, dst);
@@ -2613,7 +2613,7 @@ static void I386OP(groupD3_32)(i386_state *cpustate)        // Opcode 0xd3
                dst = i386_shift_rotate32(cpustate, modrm, dst, REG8(CL));
                STORE_RM32(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                dst = READ32(cpustate,ea);
                dst = i386_shift_rotate32(cpustate, modrm, dst, REG8(CL));
                WRITE32(cpustate,ea, dst);
@@ -2635,7 +2635,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                SetSZPF32(dst);
                                CYCLES(cpustate,CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
+                               UINT32 ea = GetEA(cpustate,modrm,0,4);
                                UINT32 dst = READ32(cpustate,ea);
                                UINT32 src = FETCH32(cpustate);
                                dst &= src;
@@ -2651,7 +2651,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                dst = ~dst;
                                WRITE32(cpustate,ea, dst);
@@ -2665,7 +2665,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                dst = SUB32(cpustate, 0, dst );
                                WRITE32(cpustate,ea, dst);
@@ -2680,7 +2680,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_MUL32_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        src = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_MUL32_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2701,7 +2701,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                        src = (INT64)(INT32)LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_IMUL32_ACC_REG);     /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        src = (INT64)(INT32)READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IMUL32_ACC_MEM);     /* TODO: Correct multiply timing */
                                }
@@ -2723,7 +2723,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_DIV32_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        src = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_DIV32_ACC_MEM);
                                }
@@ -2751,7 +2751,7 @@ static void I386OP(groupF7_32)(i386_state *cpustate)        // Opcode 0xf7
                                        src = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_IDIV32_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        src = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IDIV32_ACC_MEM);
                                }
@@ -2787,7 +2787,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                dst = INC32(cpustate,dst);
                                WRITE32(cpustate,ea, dst);
@@ -2801,7 +2801,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                dst = DEC32(cpustate,dst);
                                WRITE32(cpustate,ea, dst);
@@ -2815,7 +2815,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                        address = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_CALL_REG);       /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        address = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_CALL_MEM);       /* TODO: Timing = 10 + m */
                                }
@@ -2835,7 +2835,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,6);
                                        address = READ32(cpustate,ea + 0);
                                        selector = READ16(cpustate,ea + 4);
                                        CYCLES(cpustate,CYCLES_CALL_MEM_INTERSEG);      /* TODO: Timing = 10 + m */
@@ -2863,7 +2863,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                        address = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_JMP_REG);        /* TODO: Timing = 7 + m */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        address = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_JMP_MEM);        /* TODO: Timing = 10 + m */
                                }
@@ -2882,7 +2882,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                }
                                else
                                {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,6);
                                        address = READ32(cpustate,ea + 0);
                                        selector = READ16(cpustate,ea + 4);
                                        CYCLES(cpustate,CYCLES_JMP_MEM_INTERSEG);       /* TODO: Timing = 10 + m */
@@ -2907,7 +2907,7 @@ static void I386OP(groupFF_32)(i386_state *cpustate)        // Opcode 0xff
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM32(modrm);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                                        value = READ32(cpustate,ea);
                                }
                                PUSH32(cpustate,value);
@@ -2936,7 +2936,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        STORE_RM32(modrm, cpustate->ldtr.segment);
                                        CYCLES(cpustate,CYCLES_SLDT_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate, ea, cpustate->ldtr.segment);
                                        CYCLES(cpustate,CYCLES_SLDT_MEM);
                                }
@@ -2953,7 +2953,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        STORE_RM32(modrm, cpustate->task.segment);
                                        CYCLES(cpustate,CYCLES_STR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate, ea, cpustate->task.segment);
                                        CYCLES(cpustate,CYCLES_STR_MEM);
                                }
@@ -2973,7 +2973,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        cpustate->ldtr.segment = address;
                                        CYCLES(cpustate,CYCLES_LLDT_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,4);
                                        cpustate->ldtr.segment = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_LLDT_MEM);
                                }
@@ -3000,7 +3000,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        cpustate->task.segment = address;
                                        CYCLES(cpustate,CYCLES_LTR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,4);
                                        cpustate->task.segment = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_LTR_MEM);
                                }
@@ -3029,7 +3029,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        address = LOAD_RM32(modrm);
                                        CYCLES(cpustate,CYCLES_VERR_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,4);
                                        address = READ32(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_VERR_MEM);
                                }
@@ -3076,7 +3076,7 @@ static void I386OP(group0F00_32)(i386_state *cpustate)          // Opcode 0x0f 0
                                        address = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_VERW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        address = READ16(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_VERW_MEM);
                                }
@@ -3128,9 +3128,9 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 1 );
+                                       ea = i386_translate(cpustate, CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->gdtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->gdtr.base);
@@ -3142,11 +3142,11 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 1 );
+                                       ea = i386_translate(cpustate, CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->idtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->idtr.base);
@@ -3159,9 +3159,9 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 0 );
+                                       ea = i386_translate(cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->gdtr.limit = READ16(cpustate,ea);
                                cpustate->gdtr.base = READ32(cpustate,ea + 2);
@@ -3174,9 +3174,9 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate(cpustate, CS, address, 0 );
+                                       ea = i386_translate(cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->idtr.limit = READ16(cpustate,ea);
                                cpustate->idtr.base = READ32(cpustate,ea + 2);
@@ -3191,7 +3191,7 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        CYCLES(cpustate,CYCLES_SMSW_REG);
                                } else {
                                        /* always 16-bit memory operand */
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate,ea, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_MEM);
                                }
@@ -3206,7 +3206,7 @@ static void I386OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        CYCLES(cpustate,CYCLES_LMSW_MEM);
                                b = READ16(cpustate,ea);
                                }
@@ -3240,7 +3240,7 @@ static void I386OP(group0FBA_32)(i386_state *cpustate)      // Opcode 0x0f ba
 
                                CYCLES(cpustate,CYCLES_BT_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
+                               UINT32 ea = GetEA(cpustate,modrm,0,4);
                                UINT32 dst = READ32(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3266,7 +3266,7 @@ static void I386OP(group0FBA_32)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTS_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3294,7 +3294,7 @@ static void I386OP(group0FBA_32)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTR_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3322,7 +3322,7 @@ static void I386OP(group0FBA_32)(i386_state *cpustate)      // Opcode 0x0f ba
                                STORE_RM32(modrm, dst);
                                CYCLES(cpustate,CYCLES_BTC_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,4);
                                UINT32 dst = READ32(cpustate,ea);
                                UINT8 bit = FETCH(cpustate);
 
@@ -3358,7 +3358,7 @@ static void I386OP(lar_r32_rm32)(i386_state *cpustate)  // Opcode 0x0f 0x02
                }
                else
                {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                        seg.selector = READ32(cpustate,ea);
                        CYCLES(cpustate,CYCLES_LAR_MEM);
                }
@@ -3424,7 +3424,7 @@ static void I386OP(lsl_r32_rm32)(i386_state *cpustate)  // Opcode 0x0f 0x03
                }
                else
                {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,4);
                        seg.selector = READ32(cpustate,ea);
                }
                if(seg.selector == 0)
@@ -3485,7 +3485,7 @@ static void I386OP(bound_r32_m32_m32)(i386_state *cpustate) // Opcode 0x62
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,8);
                low = READ32(cpustate,ea + 0);
                high = READ32(cpustate,ea + 4);
        }
@@ -3547,7 +3547,7 @@ static void I386OP(load_far_pointer32)(i386_state *cpustate, int s)
        if( modrm >= 0xc0 ) {
                report_invalid_modrm(cpustate, "load_far_pointer32", modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,6);
                STORE_REG32(modrm, READ32(cpustate,ea + 0));
                selector = READ16(cpustate,ea + 4);
                i386_sreg_load(cpustate,selector,s,NULL);
index 621ab6c..d1bcd5a 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 static UINT8 I386OP(shift_rotate8)(i386_state *cpustate, UINT8 modrm, UINT32 value, UINT8 shift)
 {
        UINT32 src = value & 0xff;
@@ -154,7 +154,7 @@ static void I386OP(adc_rm8_r8)(i386_state *cpustate)        // Opcode 0x10
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = ADC8(cpustate, dst, src, cpustate->CF);
@@ -174,7 +174,7 @@ static void I386OP(adc_r8_rm8)(i386_state *cpustate)        // Opcode 0x12
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = ADC8(cpustate, dst, src, cpustate->CF);
@@ -204,7 +204,7 @@ static void I386OP(add_rm8_r8)(i386_state *cpustate)        // Opcode 0x00
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = ADD8(cpustate,dst, src);
@@ -224,7 +224,7 @@ static void I386OP(add_r8_rm8)(i386_state *cpustate)        // Opcode 0x02
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = ADD8(cpustate,dst, src);
@@ -254,7 +254,7 @@ static void I386OP(and_rm8_r8)(i386_state *cpustate)        // Opcode 0x20
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = AND8(cpustate,dst, src);
@@ -274,7 +274,7 @@ static void I386OP(and_r8_rm8)(i386_state *cpustate)        // Opcode 0x22
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = AND8(cpustate,dst, src);
@@ -333,7 +333,7 @@ static void I386OP(cmp_rm8_r8)(i386_state *cpustate)        // Opcode 0x38
                SUB8(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                SUB8(cpustate,dst, src);
@@ -351,7 +351,7 @@ static void I386OP(cmp_r8_rm8)(i386_state *cpustate)        // Opcode 0x3a
                SUB8(cpustate,dst, src);
                CYCLES(cpustate,CYCLES_CMP_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                SUB8(cpustate,dst, src);
@@ -373,11 +373,11 @@ static void I386OP(cmpsb)(i386_state *cpustate)             // 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 1 );
        src = READ8(cpustate,eas);
        dst = READ8(cpustate,ead);
        SUB8(cpustate,src, dst);
@@ -595,9 +595,9 @@ static void I386OP(lodsb)(i386_state *cpustate)             // 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
        REG8(AL) = READ8(cpustate,eas);
        BUMP_SI(cpustate,1);
@@ -613,7 +613,7 @@ static void I386OP(mov_rm8_r8)(i386_state *cpustate)        // Opcode 0x88
                STORE_RM8(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                WRITE8(cpustate,ea, src);
                CYCLES(cpustate,CYCLES_MOV_REG_MEM);
@@ -629,7 +629,7 @@ static void I386OP(mov_r8_rm8)(i386_state *cpustate)        // Opcode 0x8a
                STORE_REG8(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                STORE_REG8(modrm, src);
                CYCLES(cpustate,CYCLES_MOV_MEM_REG);
@@ -644,7 +644,7 @@ static void I386OP(mov_rm8_i8)(i386_state *cpustate)        // Opcode 0xc6
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                UINT8 value = FETCH(cpustate);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
@@ -747,9 +747,9 @@ static void I386OP(mov_al_m8)(i386_state *cpustate)         // Opcode 0xa0
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 0, 1 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 0 );
+               ea = i386_translate(cpustate, DS, offset, 0, 1 );
        }
        REG8(AL) = READ8(cpustate,ea);
        CYCLES(cpustate,CYCLES_MOV_IMM_MEM);
@@ -765,9 +765,9 @@ static void I386OP(mov_m8_al)(i386_state *cpustate)         // Opcode 0xa2
        }
        /* TODO: Not sure if this is correct... */
        if( cpustate->segment_prefix ) {
-               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 );
+               ea = i386_translate(cpustate, cpustate->segment_override, offset, 1, 1 );
        } else {
-               ea = i386_translate(cpustate, DS, offset, 1 );
+               ea = i386_translate(cpustate, DS, offset, 1, 1 );
        }
        WRITE8(cpustate, ea, REG8(AL) );
        CYCLES(cpustate,CYCLES_MOV_MEM_ACC);
@@ -785,7 +785,7 @@ static void I386OP(mov_rm16_sreg)(i386_state *cpustate)     // Opcode 0x8c
                        STORE_RM16(modrm, cpustate->sreg[s].selector);
                CYCLES(cpustate,CYCLES_MOV_SREG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                WRITE16(cpustate,ea, cpustate->sreg[s].selector);
                CYCLES(cpustate,CYCLES_MOV_SREG_MEM);
        }
@@ -802,7 +802,7 @@ static void I386OP(mov_sreg_rm16)(i386_state *cpustate)     // Opcode 0x8e
                selector = LOAD_RM16(modrm);
                CYCLES(cpustate,CYCLES_MOV_REG_SREG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                selector = READ16(cpustate,ea);
                CYCLES(cpustate,CYCLES_MOV_MEM_SREG);
        }
@@ -871,11 +871,11 @@ static void I386OP(movsb)(i386_state *cpustate)             // 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, 1 );
        }
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
        v = READ8(cpustate,eas);
        WRITE8(cpustate,ead, v);
        BUMP_SI(cpustate,1);
@@ -894,7 +894,7 @@ static void I386OP(or_rm8_r8)(i386_state *cpustate)         // Opcode 0x08
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = OR8(cpustate,dst, src);
@@ -914,7 +914,7 @@ static void I386OP(or_r8_rm8)(i386_state *cpustate)         // Opcode 0x0a
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = OR8(cpustate,dst, src);
@@ -967,7 +967,7 @@ static void I386OP(arpl)(i386_state *cpustate)           // Opcode 0x63
                                STORE_RM16(modrm, dst);
                        }
                } else {
-                       UINT32 ea = GetEA(cpustate, modrm,1);
+                       UINT32 ea = GetEA(cpustate, modrm,1,2);
                        src = LOAD_REG16(modrm);
                        dst = READ16(cpustate, ea);
                        if( (dst&0x3) < (src&0x3) ) {
@@ -996,7 +996,7 @@ static void I386OP(ins_generic)(i386_state *cpustate, int size)
        UINT16 vw;
        UINT32 vd;
 
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, size);
 
        switch(size) {
        case 1:
@@ -1043,9 +1043,9 @@ 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, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, size );
        } else {
-               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 );
+               eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0, size );
        }
 
        switch(size) {
@@ -1147,12 +1147,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, cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI), -1, 1 );
        } else {
                //eas =
-               i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1 );
+               i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1, 1 );
        }
-       i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1 );
+       i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1, 1 );
 
        switch(opcode)
        {
@@ -1303,7 +1303,7 @@ static void I386OP(sbb_rm8_r8)(i386_state *cpustate)        // Opcode 0x18
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = SBB8(cpustate, dst, src, cpustate->CF);
@@ -1323,7 +1323,7 @@ static void I386OP(sbb_r8_rm8)(i386_state *cpustate)        // Opcode 0x1a
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = SBB8(cpustate, dst, src, cpustate->CF);
@@ -1346,7 +1346,7 @@ static void I386OP(scasb)(i386_state *cpustate)             // Opcode 0xae
 {
        UINT32 eas;
        UINT8 src, dst;
-       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 );
+       eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0, 1 );
        src = READ8(cpustate,eas);
        dst = REG8(AL);
        SUB8(cpustate,dst, src);
@@ -1375,7 +1375,7 @@ static void I386OP(seta_rm8)(i386_state *cpustate)          // Opcode 0x0f 97
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1392,7 +1392,7 @@ static void I386OP(setbe_rm8)(i386_state *cpustate)         // Opcode 0x0f 96
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1409,7 +1409,7 @@ static void I386OP(setc_rm8)(i386_state *cpustate)          // Opcode 0x0f 92
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1426,7 +1426,7 @@ static void I386OP(setg_rm8)(i386_state *cpustate)          // Opcode 0x0f 9f
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1443,7 +1443,7 @@ static void I386OP(setge_rm8)(i386_state *cpustate)         // Opcode 0x0f 9d
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1460,7 +1460,7 @@ static void I386OP(setl_rm8)(i386_state *cpustate)          // Opcode 0x0f 9c
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1477,7 +1477,7 @@ static void I386OP(setle_rm8)(i386_state *cpustate)         // Opcode 0x0f 9e
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1494,7 +1494,7 @@ static void I386OP(setnc_rm8)(i386_state *cpustate)         // Opcode 0x0f 93
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1511,7 +1511,7 @@ static void I386OP(setno_rm8)(i386_state *cpustate)         // Opcode 0x0f 91
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1528,7 +1528,7 @@ static void I386OP(setnp_rm8)(i386_state *cpustate)         // Opcode 0x0f 9b
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1545,7 +1545,7 @@ static void I386OP(setns_rm8)(i386_state *cpustate)         // Opcode 0x0f 99
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1562,7 +1562,7 @@ static void I386OP(setnz_rm8)(i386_state *cpustate)         // Opcode 0x0f 95
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1579,7 +1579,7 @@ static void I386OP(seto_rm8)(i386_state *cpustate)          // Opcode 0x0f 90
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1596,7 +1596,7 @@ static void I386OP(setp_rm8)(i386_state *cpustate)          // Opcode 0x0f 9a
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1613,7 +1613,7 @@ static void I386OP(sets_rm8)(i386_state *cpustate)          // Opcode 0x0f 98
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1630,7 +1630,7 @@ static void I386OP(setz_rm8)(i386_state *cpustate)          // Opcode 0x0f 94
                STORE_RM8(modrm, value);
                CYCLES(cpustate,CYCLES_SETCC_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                WRITE8(cpustate,ea, value);
                CYCLES(cpustate,CYCLES_SETCC_MEM);
        }
@@ -1663,7 +1663,7 @@ static void I386OP(sti)(i386_state *cpustate)               // Opcode 0xfb
 static void I386OP(stosb)(i386_state *cpustate)             // Opcode 0xaa
 {
        UINT32 ead;
-       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 );
+       ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1, 1 );
        WRITE8(cpustate,ead, REG8(AL));
        BUMP_DI(cpustate,1);
        CYCLES(cpustate,CYCLES_STOS);
@@ -1680,7 +1680,7 @@ static void I386OP(sub_rm8_r8)(i386_state *cpustate)        // Opcode 0x28
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = SUB8(cpustate,dst, src);
@@ -1700,7 +1700,7 @@ static void I386OP(sub_r8_rm8)(i386_state *cpustate)        // Opcode 0x2a
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = SUB8(cpustate,dst, src);
@@ -1743,7 +1743,7 @@ static void I386OP(test_rm8_r8)(i386_state *cpustate)       // Opcode 0x84
                cpustate->OF = 0;
                CYCLES(cpustate,CYCLES_TEST_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = src & dst;
@@ -1764,7 +1764,7 @@ static void I386OP(xchg_r8_rm8)(i386_state *cpustate)       // Opcode 0x86
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_XCHG_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                UINT8 src = READ8(cpustate,ea);
                UINT8 dst = LOAD_REG8(modrm);
                WRITE8(cpustate,ea, dst);
@@ -1784,7 +1784,7 @@ static void I386OP(xor_rm8_r8)(i386_state *cpustate)        // Opcode 0x30
                STORE_RM8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                src = LOAD_REG8(modrm);
                dst = READ8(cpustate,ea);
                dst = XOR8(cpustate,dst, src);
@@ -1804,7 +1804,7 @@ static void I386OP(xor_r8_rm8)(i386_state *cpustate)        // Opcode 0x32
                STORE_REG8(modrm, dst);
                CYCLES(cpustate,CYCLES_ALU_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                src = READ8(cpustate,ea);
                dst = LOAD_REG8(modrm);
                dst = XOR8(cpustate,dst, src);
@@ -1841,7 +1841,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = ADD8(cpustate,dst, src);
@@ -1857,7 +1857,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = OR8(cpustate,dst, src);
@@ -1873,7 +1873,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = ADC8(cpustate, dst, src, cpustate->CF);
@@ -1889,7 +1889,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = SBB8(cpustate, dst, src, cpustate->CF);
@@ -1905,7 +1905,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = AND8(cpustate,dst, src);
@@ -1921,7 +1921,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = SUB8(cpustate,dst, src);
@@ -1937,7 +1937,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_ALU_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,1);
+                               ea = GetEA(cpustate,modrm,1,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                dst = XOR8(cpustate,dst, src);
@@ -1952,7 +1952,7 @@ static void I386OP(group80_8)(i386_state *cpustate)         // Opcode 0x80
                                SUB8(cpustate,dst, src);
                                CYCLES(cpustate,CYCLES_CMP_REG_REG);
                        } else {
-                               ea = GetEA(cpustate,modrm,0);
+                               ea = GetEA(cpustate,modrm,0,1);
                                dst = READ8(cpustate,ea);
                                src = FETCH(cpustate);
                                SUB8(cpustate,dst, src);
@@ -1974,7 +1974,7 @@ static void I386OP(groupC0_8)(i386_state *cpustate)         // Opcode 0xc0
                dst = i386_shift_rotate8(cpustate, modrm, dst, shift);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                dst = READ8(cpustate,ea);
                shift = FETCH(cpustate) & 0x1f;
                dst = i386_shift_rotate8(cpustate, modrm, dst, shift);
@@ -1992,7 +1992,7 @@ static void I386OP(groupD0_8)(i386_state *cpustate)         // Opcode 0xd0
                dst = i386_shift_rotate8(cpustate, modrm, dst, 1);
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                dst = READ8(cpustate,ea);
                dst = i386_shift_rotate8(cpustate, modrm, dst, 1);
                WRITE8(cpustate,ea, dst);
@@ -2009,7 +2009,7 @@ static void I386OP(groupD2_8)(i386_state *cpustate)         // Opcode 0xd2
                dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL));
                STORE_RM8(modrm, dst);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                dst = READ8(cpustate,ea);
                dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL));
                WRITE8(cpustate,ea, dst);
@@ -2031,7 +2031,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                SetSZPF8(dst);
                                CYCLES(cpustate,CYCLES_TEST_IMM_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,0);
+                               UINT32 ea = GetEA(cpustate,modrm,0,1);
                                UINT8 dst = READ8(cpustate,ea);
                                UINT8 src = FETCH(cpustate);
                                dst &= src;
@@ -2047,7 +2047,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_NOT_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,1);
                                UINT8 dst = READ8(cpustate,ea);
                                dst = ~dst;
                                WRITE8(cpustate,ea, dst);
@@ -2061,7 +2061,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_NEG_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,1);
                                UINT8 dst = READ8(cpustate,ea);
                                dst = SUB8(cpustate, 0, dst );
                                WRITE8(cpustate,ea, dst);
@@ -2076,7 +2076,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(cpustate,CYCLES_MUL8_ACC_REG);       /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,1);
                                        src = READ8(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_MUL8_ACC_MEM);       /* TODO: Correct multiply timing */
                                }
@@ -2096,7 +2096,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                        src = (INT16)(INT8)LOAD_RM8(modrm);
                                        CYCLES(cpustate,CYCLES_IMUL8_ACC_REG);      /* TODO: Correct multiply timing */
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,1);
                                        src = (INT16)(INT8)READ8(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IMUL8_ACC_MEM);      /* TODO: Correct multiply timing */
                                }
@@ -2117,7 +2117,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(cpustate,CYCLES_DIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,1);
                                        src = READ8(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_DIV8_ACC_MEM);
                                }
@@ -2149,7 +2149,7 @@ static void I386OP(groupF6_8)(i386_state *cpustate)         // Opcode 0xf6
                                        src = LOAD_RM8(modrm);
                                        CYCLES(cpustate,CYCLES_IDIV8_ACC_REG);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,1);
                                        src = READ8(cpustate,ea);
                                        CYCLES(cpustate,CYCLES_IDIV8_ACC_MEM);
                                }
@@ -2189,7 +2189,7 @@ static void I386OP(groupFE_8)(i386_state *cpustate)         // Opcode 0xfe
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_INC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,1);
                                UINT8 dst = READ8(cpustate,ea);
                                dst = INC8(cpustate,dst);
                                WRITE8(cpustate,ea, dst);
@@ -2203,7 +2203,7 @@ static void I386OP(groupFE_8)(i386_state *cpustate)         // Opcode 0xfe
                                STORE_RM8(modrm, dst);
                                CYCLES(cpustate,CYCLES_DEC_REG);
                        } else {
-                               UINT32 ea = GetEA(cpustate,modrm,1);
+                               UINT32 ea = GetEA(cpustate,modrm,1,1);
                                UINT8 dst = READ8(cpustate,ea);
                                dst = DEC8(cpustate,dst);
                                WRITE8(cpustate,ea, dst);
@@ -2216,7 +2216,7 @@ static void I386OP(groupFE_8)(i386_state *cpustate)         // Opcode 0xfe
                                if( modrm >= 0xc0 ) {
                                        value = LOAD_RM8(modrm);
                                } else {
-                                       UINT32 ea = GetEA(cpustate,modrm,0);
+                                       UINT32 ea = GetEA(cpustate,modrm,0,1);
                                        value = READ8(cpustate,ea);
                                }
                                if( cpustate->operand_size ) {
@@ -2358,7 +2358,7 @@ static void I386OP(escape)(i386_state *cpustate)            // Opcodes 0xd8 - 0x
        UINT8 modrm = FETCH(cpustate);
        if(modrm < 0xc0)
        {
-               i386_escape_ea = GetEA(cpustate,modrm,0);
+               i386_escape_ea = GetEA(cpustate,modrm,0,1);
        }
        CYCLES(cpustate,3); // TODO: confirm this
        (void) LOAD_RM8(modrm);
@@ -2510,7 +2510,7 @@ static void I386OP(loadall)(i386_state *cpustate)       // Opcode 0x0f 0x07 (0x0
 {
        if(PROTECTED_MODE && (cpustate->CPL != 0))
                FAULT(FAULT_GP,0)
-       UINT32 ea = i386_translate(cpustate, ES, REG32(EDI), 0);
+       UINT32 ea = i386_translate(cpustate, ES, REG32(EDI), 0, 204);
        cpustate->cr[0] = READ32(cpustate, ea) & 0xfffeffff; // wp not supported on 386
        set_flags(cpustate, READ32(cpustate, ea + 0x04));
        cpustate->eip = READ32(cpustate, ea + 0x08);
@@ -2582,20 +2582,20 @@ static void I386OP(xlat)(i386_state *cpustate)          // Opcode 0xd7
        if( cpustate->segment_prefix ) {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate(cpustate, cpustate->segment_override, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate(cpustate, cpustate->segment_override, REG16(BX) + REG8(AL), 0, 1 );
                }
                else
                {
-                       ea = i386_translate(cpustate, cpustate->segment_override, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate(cpustate, cpustate->segment_override, REG32(EBX) + REG8(AL), 0, 1 );
                }
        } else {
                if(!cpustate->address_size)
                {
-                       ea = i386_translate(cpustate, DS, REG16(BX) + REG8(AL), 0 );
+                       ea = i386_translate(cpustate, DS, REG16(BX) + REG8(AL), 0, 1 );
                }
                else
                {
-                       ea = i386_translate(cpustate, DS, REG32(EBX) + REG8(AL), 0 );
+                       ea = i386_translate(cpustate, DS, REG32(EBX) + REG8(AL), 0, 1 );
                }
        }
        REG8(AL) = READ8(cpustate,ea);
index e675a6a..874de84 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 struct X86_OPCODE {
        UINT8 opcode;
        UINT32 flags;
index bc88a1a..f4f4d93 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 #pragma once
 
 #ifndef __I386_H__
@@ -509,7 +509,7 @@ struct i386_state
 };
 
 extern int i386_parity_table[256];
-static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset);
+static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset, UINT32 size);
 
 #define FAULT_THROW(fault,error) { throw (UINT64)(fault | (UINT64)error << 32); }
 #define PF_THROW(error) { cpustate->cr[2] = address; FAULT_THROW(FAULT_PF,error); }
@@ -583,14 +583,14 @@ extern MODRM_TABLE i386_MODRM_table[256];
 
 /***********************************************************************************/
 
-INLINE UINT32 i386_translate(i386_state *cpustate, int segment, UINT32 ip, int rwn)
+INLINE UINT32 i386_translate(i386_state *cpustate, int segment, UINT32 ip, int rwn, UINT32 size)
 {
        // TODO: segment limit access size, execution permission, handle exception thrown from exception handler
        if(PROTECTED_MODE && !V8086_MODE && (rwn != -1))
        {
                if(!(cpustate->sreg[segment].valid))
                        FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0);
-               if(i386_limit_check(cpustate, segment, ip))
+               if(i386_limit_check(cpustate, segment, ip, size))
                        FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0);
                if((rwn == 0) && ((cpustate->sreg[segment].flags & 8) && !(cpustate->sreg[segment].flags & 2)))
                        FAULT_THROW(FAULT_GP, 0);
@@ -746,7 +746,7 @@ INLINE int translate_address(i386_state *cpustate, int pl, int type, UINT32 *add
 
 INLINE void CHANGE_PC(i386_state *cpustate, UINT32 pc)
 {
-       cpustate->pc = i386_translate(cpustate, CS, pc, -1 );
+       cpustate->pc = i386_translate(cpustate, CS, pc, -1, 1 );
 }
 
 INLINE void NEAR_BRANCH(i386_state *cpustate, INT32 offs)
@@ -977,7 +977,7 @@ INLINE void WRITE32(i386_state *cpustate,UINT32 ea, UINT32 value)
                if(!translate_address(cpustate,cpustate->CPL,TRANSLATE_WRITE,&address,&error))
                        PF_THROW(error);
 
-               ea &= cpustate->a20_mask;
+               address &= cpustate->a20_mask;
                cpustate->program->write_data32(address, value);
        }
 }
@@ -999,7 +999,7 @@ INLINE void WRITE64(i386_state *cpustate,UINT32 ea, UINT64 value)
                if(!translate_address(cpustate,cpustate->CPL,TRANSLATE_WRITE,&address,&error))
                        PF_THROW(error);
 
-               ea &= cpustate->a20_mask;
+               address &= cpustate->a20_mask;
                cpustate->program->write_data32(address+0, value & 0xffffffff);
                cpustate->program->write_data32(address+4, (value >> 32) & 0xffffffff);
        }
@@ -1196,12 +1196,12 @@ INLINE void PUSH16(i386_state *cpustate,UINT16 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 2;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
+               ea = i386_translate(cpustate, SS, new_esp, 1, 2);
                WRITE16(cpustate, ea, value );
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 2) & 0xffff;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
+               ea = i386_translate(cpustate, SS, new_esp, 1, 2);
                WRITE16(cpustate, ea, value );
                REG16(SP) = new_esp;
        }
@@ -1211,12 +1211,12 @@ INLINE void PUSH32(i386_state *cpustate,UINT32 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 4;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
+               ea = i386_translate(cpustate, SS, new_esp, 1, 4);
                WRITE32(cpustate, ea, value );
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 4) & 0xffff;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
+               ea = i386_translate(cpustate, SS, new_esp, 1, 4);
                WRITE32(cpustate, ea, value );
                REG16(SP) = new_esp;
        }
@@ -1227,13 +1227,23 @@ INLINE void PUSH32SEG(i386_state *cpustate,UINT32 value)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) - 4;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
-               ((cpustate->cpu_version & 0xf00) == 0x300) ? WRITE16(cpustate, ea, value) : WRITE32(cpustate, ea, value ); // 486 also?
+               if( (cpustate->cpu_version & 0xf00) == 0x300 ) {
+                       ea = i386_translate(cpustate, SS, new_esp, 1, 2);
+                       WRITE16(cpustate, ea, value); // 486 also?
+               } else {
+                       ea = i386_translate(cpustate, SS, new_esp, 1, 4);
+                       WRITE32(cpustate, ea, value ); // 486 also?
+               }
                REG32(ESP) = new_esp;
        } else {
                new_esp = (REG16(SP) - 4) & 0xffff;
-               ea = i386_translate(cpustate, SS, new_esp, 1);
-               ((cpustate->cpu_version & 0xf00) == 0x300) ? WRITE16(cpustate, ea, value) : WRITE32(cpustate, ea, value );
+               if( (cpustate->cpu_version & 0xf00) == 0x300 ) {
+                       ea = i386_translate(cpustate, SS, new_esp, 1, 2);
+                       WRITE16(cpustate, ea, value);
+               } else {
+                       ea = i386_translate(cpustate, SS, new_esp, 1, 4);
+                       WRITE32(cpustate, ea, value );
+               }
                REG16(SP) = new_esp;
        }
 }
@@ -1253,12 +1263,12 @@ INLINE UINT8 POP8(i386_state *cpustate)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 1;
-               ea = i386_translate(cpustate, SS, new_esp - 1, 0);
+               ea = i386_translate(cpustate, SS, new_esp - 1, 0, 1);
                value = READ8(cpustate, ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 1;
-               ea = i386_translate(cpustate, SS, (new_esp - 1) & 0xffff, 0);
+               ea = i386_translate(cpustate, SS, (new_esp - 1) & 0xffff, 0, 1);
                value = READ8(cpustate, ea );
                REG16(SP) = new_esp;
        }
@@ -1270,12 +1280,12 @@ INLINE UINT16 POP16(i386_state *cpustate)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 2;
-               ea = i386_translate(cpustate, SS, new_esp - 2, 0);
+               ea = i386_translate(cpustate, SS, new_esp - 2, 0, 2);
                value = READ16(cpustate, ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 2;
-               ea = i386_translate(cpustate, SS, (new_esp - 2) & 0xffff, 0);
+               ea = i386_translate(cpustate, SS, (new_esp - 2) & 0xffff, 0, 2);
                value = READ16(cpustate, ea );
                REG16(SP) = new_esp;
        }
@@ -1287,12 +1297,12 @@ INLINE UINT32 POP32(i386_state *cpustate)
        UINT32 ea, new_esp;
        if( STACK_32BIT ) {
                new_esp = REG32(ESP) + 4;
-               ea = i386_translate(cpustate, SS, new_esp - 4, 0);
+               ea = i386_translate(cpustate, SS, new_esp - 4, 0, 4);
                value = READ32(cpustate, ea );
                REG32(ESP) = new_esp;
        } else {
                new_esp = REG16(SP) + 4;
-               ea = i386_translate(cpustate, SS, (new_esp - 4) & 0xffff, 0);
+               ea = i386_translate(cpustate, SS, (new_esp - 4) & 0xffff, 0, 4);
                value = READ32(cpustate, ea );
                REG16(SP) = new_esp;
        }
index e5bd1ab..5db54a7 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
 // Intel 486+ specific opcodes
 
 static void I486OP(cpuid)(i386_state *cpustate)             // Opcode 0x0F A2
@@ -64,7 +64,7 @@ static void I486OP(cmpxchg_rm8_r8)(i386_state *cpustate)    // Opcode 0x0f b0
                }
        } else {
                // TODO: Check write if needed
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,1);
                UINT8 dst = READ8(cpustate,ea);
                UINT8 src = LOAD_REG8(modrm);
 
@@ -97,7 +97,7 @@ static void I486OP(cmpxchg_rm16_r16)(i386_state *cpustate)  // Opcode 0x0f b1
                        CYCLES(cpustate,CYCLES_CMPXCHG_REG_REG_F);
                }
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 src = LOAD_REG16(modrm);
 
@@ -130,7 +130,7 @@ static void I486OP(cmpxchg_rm32_r32)(i386_state *cpustate)  // Opcode 0x0f b1
                        CYCLES(cpustate,CYCLES_CMPXCHG_REG_REG_F);
                }
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 src = LOAD_REG32(modrm);
 
@@ -156,7 +156,7 @@ static void I486OP(xadd_rm8_r8)(i386_state *cpustate)   // Opcode 0x0f c0
                STORE_RM8(modrm, dst + src);
                CYCLES(cpustate,CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,1);
                UINT8 dst = READ8(cpustate,ea);
                UINT8 src = LOAD_REG8(modrm);
                WRITE8(cpustate,ea, dst + src);
@@ -175,7 +175,7 @@ static void I486OP(xadd_rm16_r16)(i386_state *cpustate) // Opcode 0x0f c1
                STORE_RM16(modrm, dst + src);
                CYCLES(cpustate,CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,2);
                UINT16 dst = READ16(cpustate,ea);
                UINT16 src = LOAD_REG16(modrm);
                WRITE16(cpustate,ea, dst + src);
@@ -194,7 +194,7 @@ static void I486OP(xadd_rm32_r32)(i386_state *cpustate) // Opcode 0x0f c1
                STORE_RM32(modrm, dst + src);
                CYCLES(cpustate,CYCLES_XADD_REG_REG);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,1);
+               UINT32 ea = GetEA(cpustate,modrm,1,4);
                UINT32 dst = READ32(cpustate,ea);
                UINT32 src = LOAD_REG32(modrm);
                WRITE32(cpustate,ea, dst + src);
@@ -215,9 +215,9 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 1 );
+                                       ea = i386_translate( cpustate, CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->gdtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->gdtr.base & 0xffffff);
@@ -229,11 +229,11 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 1 );
+                                       ea = i386_translate( cpustate, CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->idtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->idtr.base & 0xffffff);
@@ -246,9 +246,9 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 0 );
+                                       ea = i386_translate( cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->gdtr.limit = READ16(cpustate,ea);
                                cpustate->gdtr.base = READ32(cpustate,ea + 2) & 0xffffff;
@@ -261,9 +261,9 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM16(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 0 );
+                                       ea = i386_translate( cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->idtr.limit = READ16(cpustate,ea);
                                cpustate->idtr.base = READ32(cpustate,ea + 2) & 0xffffff;
@@ -276,7 +276,7 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        STORE_RM16(modrm, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate,ea, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_MEM);
                                }
@@ -291,7 +291,7 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        CYCLES(cpustate,CYCLES_LMSW_MEM);
                                        b = READ16(cpustate,ea);
                                }
@@ -310,7 +310,7 @@ static void I486OP(group0F01_16)(i386_state *cpustate)      // Opcode 0x0f 01
                                        logerror("i486: invlpg with modrm %02X\n", modrm);
                                        FAULT(FAULT_UD,0)
                                }
-                               ea = GetEA(cpustate,modrm,-1);
+                               ea = GetEA(cpustate,modrm,-1,1);
                                CYCLES(cpustate,25); // TODO: add to cycles.h
                                vtlb_flush_address(cpustate->vtlb, ea);
                                break;
@@ -332,9 +332,9 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                        {
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 1 );
+                                       ea = i386_translate( cpustate, CS, address, 1, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->gdtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->gdtr.base);
@@ -346,11 +346,11 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                if (modrm >= 0xc0)
                                {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 1 );
+                                       ea = i386_translate( cpustate, CS, address, 1, 6 );
                                }
                                else
                                {
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,6);
                                }
                                WRITE16(cpustate,ea, cpustate->idtr.limit);
                                WRITE32(cpustate,ea + 2, cpustate->idtr.base);
@@ -363,9 +363,9 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 0 );
+                                       ea = i386_translate( cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->gdtr.limit = READ16(cpustate,ea);
                                cpustate->gdtr.base = READ32(cpustate,ea + 2);
@@ -378,9 +378,9 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        FAULT(FAULT_GP,0)
                                if( modrm >= 0xc0 ) {
                                        address = LOAD_RM32(modrm);
-                                       ea = i386_translate( cpustate, CS, address, 0 );
+                                       ea = i386_translate( cpustate, CS, address, 0, 6 );
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,6);
                                }
                                cpustate->idtr.limit = READ16(cpustate,ea);
                                cpustate->idtr.base = READ32(cpustate,ea + 2);
@@ -394,7 +394,7 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        CYCLES(cpustate,CYCLES_SMSW_REG);
                                } else {
                                        /* always 16-bit memory operand */
-                                       ea = GetEA(cpustate,modrm,1);
+                                       ea = GetEA(cpustate,modrm,1,2);
                                        WRITE16(cpustate,ea, cpustate->cr[0]);
                                        CYCLES(cpustate,CYCLES_SMSW_MEM);
                                }
@@ -409,7 +409,7 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        b = LOAD_RM16(modrm);
                                        CYCLES(cpustate,CYCLES_LMSW_REG);
                                } else {
-                                       ea = GetEA(cpustate,modrm,0);
+                                       ea = GetEA(cpustate,modrm,0,2);
                                        CYCLES(cpustate,CYCLES_LMSW_MEM);
                                b = READ16(cpustate,ea);
                                }
@@ -428,7 +428,7 @@ static void I486OP(group0F01_32)(i386_state *cpustate)      // Opcode 0x0f 01
                                        logerror("i486: invlpg with modrm %02X\n", modrm);
                                        FAULT(FAULT_UD,0)
                                }
-                               ea = GetEA(cpustate,modrm,-1);
+                               ea = GetEA(cpustate,modrm,-1,1);
                                CYCLES(cpustate,25); // TODO: add to cycles.h
                                vtlb_flush_address(cpustate->vtlb, ea);
                                break;
index 7af4305..8968e06 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philp Bennett
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett, Samuele Zannoli
 // Pentium+ specific opcodes
 
 extern flag float32_is_nan( float32 a ); // since its not defined in softfloat.h
@@ -198,7 +198,7 @@ static void PENTIUMOP(rsm)(i386_state* cpustate)
 static void PENTIUMOP(prefetch_m8)(i386_state* cpustate)    // Opcode 0x0f 18
 {
        UINT8 modrm = FETCH(cpustate);
-       UINT32 ea = GetEA(cpustate,modrm,0);
+       UINT32 ea = GetEA(cpustate,modrm,0,1);
        CYCLES(cpustate,1+(ea & 1)); // TODO: correct cycle count
 }
 
@@ -218,7 +218,7 @@ static void PENTIUMOP(cmovo_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 40
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->OF == 1)
                {
                        src = READ16(cpustate,ea);
@@ -244,7 +244,7 @@ static void PENTIUMOP(cmovo_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 40
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->OF == 1)
                {
                        src = READ32(cpustate,ea);
@@ -270,7 +270,7 @@ static void PENTIUMOP(cmovno_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->OF == 0)
                {
                        src = READ16(cpustate,ea);
@@ -296,7 +296,7 @@ static void PENTIUMOP(cmovno_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->OF == 0)
                {
                        src = READ32(cpustate,ea);
@@ -322,7 +322,7 @@ static void PENTIUMOP(cmovb_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 42
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->CF == 1)
                {
                        src = READ16(cpustate,ea);
@@ -348,7 +348,7 @@ static void PENTIUMOP(cmovb_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 42
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->CF == 1)
                {
                        src = READ32(cpustate,ea);
@@ -374,7 +374,7 @@ static void PENTIUMOP(cmovae_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->CF == 0)
                {
                        src = READ16(cpustate,ea);
@@ -400,7 +400,7 @@ static void PENTIUMOP(cmovae_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->CF == 0)
                {
                        src = READ32(cpustate,ea);
@@ -426,7 +426,7 @@ static void PENTIUMOP(cmove_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 44
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->ZF == 1)
                {
                        src = READ16(cpustate,ea);
@@ -452,7 +452,7 @@ static void PENTIUMOP(cmove_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 44
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->ZF == 1)
                {
                        src = READ32(cpustate,ea);
@@ -478,7 +478,7 @@ static void PENTIUMOP(cmovne_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->ZF == 0)
                {
                        src = READ16(cpustate,ea);
@@ -504,7 +504,7 @@ static void PENTIUMOP(cmovne_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->ZF == 0)
                {
                        src = READ32(cpustate,ea);
@@ -530,7 +530,7 @@ static void PENTIUMOP(cmovbe_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if ((cpustate->CF == 1) || (cpustate->ZF == 1))
                {
                        src = READ16(cpustate,ea);
@@ -556,7 +556,7 @@ static void PENTIUMOP(cmovbe_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if ((cpustate->CF == 1) || (cpustate->ZF == 1))
                {
                        src = READ32(cpustate,ea);
@@ -582,7 +582,7 @@ static void PENTIUMOP(cmova_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 47
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if ((cpustate->CF == 0) && (cpustate->ZF == 0))
                {
                        src = READ16(cpustate,ea);
@@ -608,7 +608,7 @@ static void PENTIUMOP(cmova_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 47
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if ((cpustate->CF == 0) && (cpustate->ZF == 0))
                {
                        src = READ32(cpustate,ea);
@@ -634,7 +634,7 @@ static void PENTIUMOP(cmovs_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 48
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->SF == 1)
                {
                        src = READ16(cpustate,ea);
@@ -660,7 +660,7 @@ static void PENTIUMOP(cmovs_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 48
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->SF == 1)
                {
                        src = READ32(cpustate,ea);
@@ -686,7 +686,7 @@ static void PENTIUMOP(cmovns_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->SF == 0)
                {
                        src = READ16(cpustate,ea);
@@ -712,7 +712,7 @@ static void PENTIUMOP(cmovns_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->SF == 0)
                {
                        src = READ32(cpustate,ea);
@@ -738,7 +738,7 @@ static void PENTIUMOP(cmovp_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4a
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->PF == 1)
                {
                        src = READ16(cpustate,ea);
@@ -764,7 +764,7 @@ static void PENTIUMOP(cmovp_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4a
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->PF == 1)
                {
                        src = READ32(cpustate,ea);
@@ -790,7 +790,7 @@ static void PENTIUMOP(cmovnp_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->PF == 0)
                {
                        src = READ16(cpustate,ea);
@@ -816,7 +816,7 @@ static void PENTIUMOP(cmovnp_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->PF == 0)
                {
                        src = READ32(cpustate,ea);
@@ -842,7 +842,7 @@ static void PENTIUMOP(cmovl_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4c
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->SF != cpustate->OF)
                {
                        src = READ16(cpustate,ea);
@@ -868,7 +868,7 @@ static void PENTIUMOP(cmovl_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4c
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->SF != cpustate->OF)
                {
                        src = READ32(cpustate,ea);
@@ -894,7 +894,7 @@ static void PENTIUMOP(cmovge_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if (cpustate->SF == cpustate->OF)
                {
                        src = READ16(cpustate,ea);
@@ -920,7 +920,7 @@ static void PENTIUMOP(cmovge_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if (cpustate->SF == cpustate->OF)
                {
                        src = READ32(cpustate,ea);
@@ -946,7 +946,7 @@ static void PENTIUMOP(cmovle_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if ((cpustate->ZF == 1) || (cpustate->SF != cpustate->OF))
                {
                        src = READ16(cpustate,ea);
@@ -972,7 +972,7 @@ static void PENTIUMOP(cmovle_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if ((cpustate->ZF == 1) || (cpustate->SF != cpustate->OF))
                {
                        src = READ32(cpustate,ea);
@@ -998,7 +998,7 @@ static void PENTIUMOP(cmovg_r16_rm16)(i386_state* cpustate)    // Opcode 0x0f 4f
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                if ((cpustate->ZF == 0) && (cpustate->SF == cpustate->OF))
                {
                        src = READ16(cpustate,ea);
@@ -1024,7 +1024,7 @@ static void PENTIUMOP(cmovg_r32_rm32)(i386_state* cpustate)    // Opcode 0x0f 4f
        }
        else
        {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                if ((cpustate->ZF == 0) && (cpustate->SF == cpustate->OF))
                {
                        src = READ32(cpustate,ea);
@@ -1042,7 +1042,7 @@ static void PENTIUMOP(movnti_m16_r16)(i386_state* cpustate) // Opcode 0f c3
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 2);
                WRITE16(cpustate,ea,LOAD_RM16(modrm));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -1056,7 +1056,7 @@ static void PENTIUMOP(movnti_m32_r32)(i386_state* cpustate) // Opcode 0f c3
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                WRITE32(cpustate,ea,LOAD_RM32(modrm));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -1087,7 +1087,7 @@ static void PENTIUMOP(cmpxchg8b_m64)(i386_state* cpustate)  // Opcode 0x0f c7
        if( modm >= 0xc0 ) {
                report_invalid_modrm(cpustate, "cmpxchg8b_m64", modm);
        } else {
-               UINT32 ea = GetEA(cpustate,modm, 0);
+               UINT32 ea = GetEA(cpustate,modm, 0, 8);
                UINT64 value = READ64(cpustate, ea);
                UINT64 edx_eax = (((UINT64) REG32(EDX)) << 32) | REG32(EAX);
                UINT64 ecx_ebx = (((UINT64) REG32(ECX)) << 32) | REG32(EBX);
@@ -1113,7 +1113,7 @@ static void PENTIUMOP(movntq_m64_r64)(i386_state* cpustate) // Opcode 0f e7
                CYCLES(cpustate,1);     // unsupported
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEMMX(cpustate, ea, MMX((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -1123,7 +1123,7 @@ static void PENTIUMOP(maskmovq_r64_r64)(i386_state* cpustate)  // Opcode 0f f7
 {
        int s,m,n;
        UINT8 modm = FETCH(cpustate);
-       UINT32 ea = GetEA(cpustate,7, 0); // ds:di/edi/rdi register
+       UINT32 ea = GetEA(cpustate,7, 0, 8); // ds:di/edi/rdi register
        MMXPROLOG(cpustate);
        s=(modm >> 3) & 7;
        m=modm & 7;
@@ -1136,7 +1136,7 @@ static void SSEOP(maskmovdqu_r128_r128)(i386_state* cpustate)  // Opcode 66 0f f
 {
        int s,m,n;
        UINT8 modm = FETCH(cpustate);
-       UINT32 ea = GetEA(cpustate,7, 0); // ds:di/edi/rdi register
+       UINT32 ea = GetEA(cpustate,7, 0, 16); // ds:di/edi/rdi register
        s=(modm >> 3) & 7;
        m=modm & 7;
        for (n=0;n < 16;n++)
@@ -1153,7 +1153,7 @@ static void PENTIUMOP(popcnt_r16_rm16)(i386_state* cpustate)    // Opcode f3 0f
        if( modrm >= 0xc0 ) {
                src = LOAD_RM16(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,2);
                src = READ16(cpustate,ea);
        }
        count=0;
@@ -1174,7 +1174,7 @@ static void PENTIUMOP(popcnt_r32_rm32)(i386_state* cpustate)    // Opcode f3 0f
        if( modrm >= 0xc0 ) {
                src = LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,4);
                src = READ32(cpustate,ea);
        }
        count=0;
@@ -1437,7 +1437,7 @@ static void MMXOP(psrlw_r64_rm64)(i386_state* cpustate)  // Opcode 0f d1
                MMX((modrm >> 3) & 0x7).w[3]=MMX((modrm >> 3) & 0x7).w[3] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).w[0]=MMX((modrm >> 3) & 0x7).w[0] >> count;
@@ -1458,7 +1458,7 @@ static void MMXOP(psrld_r64_rm64)(i386_state* cpustate)  // Opcode 0f d2
                MMX((modrm >> 3) & 0x7).d[1]=MMX((modrm >> 3) & 0x7).d[1] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).d[0]=MMX((modrm >> 3) & 0x7).d[0] >> count;
@@ -1476,7 +1476,7 @@ static void MMXOP(psrlq_r64_rm64)(i386_state* cpustate)  // Opcode 0f d3
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q >> count;
@@ -1492,7 +1492,7 @@ static void MMXOP(paddq_r64_rm64)(i386_state* cpustate)  // Opcode 0f d4
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q+MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q+src.q;
        }
@@ -1510,7 +1510,7 @@ static void MMXOP(pmullw_r64_rm64)(i386_state* cpustate)  // Opcode 0f d5
                MMX((modrm >> 3) & 0x7).w[3]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3]) & 0xffff;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                MMX((modrm >> 3) & 0x7).w[0]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)src.s[0]) & 0xffff;
                MMX((modrm >> 3) & 0x7).w[1]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)src.s[1]) & 0xffff;
@@ -1530,7 +1530,7 @@ static void MMXOP(psubusb_r64_rm64)(i386_state* cpustate)  // Opcode 0f d8
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] < MMX(modrm & 7).b[n] ? 0 : MMX((modrm >> 3) & 0x7).b[n]-MMX(modrm & 7).b[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] < src.b[n] ? 0 : MMX((modrm >> 3) & 0x7).b[n]-src.b[n];
@@ -1548,7 +1548,7 @@ static void MMXOP(psubusw_r64_rm64)(i386_state* cpustate)  // Opcode 0f d9
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] < MMX(modrm & 7).w[n] ? 0 : MMX((modrm >> 3) & 0x7).w[n]-MMX(modrm & 7).w[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] < src.w[n] ? 0 : MMX((modrm >> 3) & 0x7).w[n]-src.w[n];
@@ -1564,7 +1564,7 @@ static void MMXOP(pand_r64_rm64)(i386_state* cpustate)  // Opcode 0f db
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q & MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q & src.q;
        }
@@ -1581,7 +1581,7 @@ static void MMXOP(paddusb_r64_rm64)(i386_state* cpustate)  // Opcode 0f dc
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] > (0xff-MMX(modrm & 7).b[n]) ? 0xff : MMX((modrm >> 3) & 0x7).b[n]+MMX(modrm & 7).b[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] > (0xff-src.b[n]) ? 0xff : MMX((modrm >> 3) & 0x7).b[n]+src.b[n];
@@ -1599,7 +1599,7 @@ static void MMXOP(paddusw_r64_rm64)(i386_state* cpustate)  // Opcode 0f dd
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] > (0xffff-MMX(modrm & 7).w[n]) ? 0xffff : MMX((modrm >> 3) & 0x7).w[n]+MMX(modrm & 7).w[n];
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] > (0xffff-src.w[n]) ? 0xffff : MMX((modrm >> 3) & 0x7).w[n]+src.w[n];
@@ -1615,7 +1615,7 @@ static void MMXOP(pandn_r64_rm64)(i386_state* cpustate)  // Opcode 0f df
                MMX((modrm >> 3) & 0x7).q=(~MMX((modrm >> 3) & 0x7).q) & MMX(modrm & 7).q;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                MMX((modrm >> 3) & 0x7).q=(~MMX((modrm >> 3) & 0x7).q) & src.q;
        }
@@ -1634,7 +1634,7 @@ static void MMXOP(psraw_r64_rm64)(i386_state* cpustate)  // Opcode 0f e1
                MMX((modrm >> 3) & 0x7).s[3]=MMX((modrm >> 3) & 0x7).s[3] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).s[0]=MMX((modrm >> 3) & 0x7).s[0] >> count;
@@ -1655,7 +1655,7 @@ static void MMXOP(psrad_r64_rm64)(i386_state* cpustate)  // Opcode 0f e2
                MMX((modrm >> 3) & 0x7).i[1]=MMX((modrm >> 3) & 0x7).i[1] >> count;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                int count=(int)src.q;
                MMX((modrm >> 3) & 0x7).i[0]=MMX((modrm >> 3) & 0x7).i[0] >> count;
@@ -1675,7 +1675,7 @@ static void MMXOP(pmulhw_r64_rm64)(i386_state* cpustate)  // Opcode 0f e5
                MMX((modrm >> 3) & 0x7).w[3]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3]) >> 16;
        } else {
                MMX_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, src);
                MMX((modrm >> 3) & 0x7).w[0]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)src.s[0]) >> 16;
                MMX((modrm >> 3) & 0x7).w[1]=(UINT32)((INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)src.s[1]) >> 16;
@@ -1695,7 +1695,7 @@ static void MMXOP(psubsb_r64_rm64)(i386_state* cpustate)  // Opcode 0f e8
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] - (INT16)MMX(modrm & 7).c[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] - (INT16)s.c[n]);
@@ -1713,7 +1713,7 @@ static void MMXOP(psubsw_r64_rm64)(i386_state* cpustate)  // Opcode 0f e9
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] - (INT32)MMX(modrm & 7).s[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] - (INT32)s.s[n]);
@@ -1729,7 +1729,7 @@ static void MMXOP(por_r64_rm64)(i386_state* cpustate)  // Opcode 0f eb
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q | MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q | s.q;
        }
@@ -1746,7 +1746,7 @@ static void MMXOP(paddsb_r64_rm64)(i386_state* cpustate)  // Opcode 0f ec
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] + (INT16)MMX(modrm & 7).c[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)MMX((modrm >> 3) & 0x7).c[n] + (INT16)s.c[n]);
@@ -1764,7 +1764,7 @@ static void MMXOP(paddsw_r64_rm64)(i386_state* cpustate)  // Opcode 0f ed
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] + (INT32)MMX(modrm & 7).s[n]);
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)MMX((modrm >> 3) & 0x7).s[n] + (INT32)s.s[n]);
@@ -1780,7 +1780,7 @@ static void MMXOP(pxor_r64_rm64)(i386_state* cpustate)  // Opcode 0f ef
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q ^ MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q ^ s.q;
        }
@@ -1799,7 +1799,7 @@ static void MMXOP(psllw_r64_rm64)(i386_state* cpustate)  // Opcode 0f f1
                MMX((modrm >> 3) & 0x7).w[3]=MMX((modrm >> 3) & 0x7).w[3] << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).w[0]=MMX((modrm >> 3) & 0x7).w[0] << count;
@@ -1820,7 +1820,7 @@ static void MMXOP(pslld_r64_rm64)(i386_state* cpustate)  // Opcode 0f f2
                MMX((modrm >> 3) & 0x7).d[1]=MMX((modrm >> 3) & 0x7).d[1] << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).d[0]=MMX((modrm >> 3) & 0x7).d[0] << count;
@@ -1838,7 +1838,7 @@ static void MMXOP(psllq_r64_rm64)(i386_state* cpustate)  // Opcode 0f f3
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q << count;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                int count=(int)s.q;
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q << count;
@@ -1857,7 +1857,7 @@ static void MMXOP(pmaddwd_r64_rm64)(i386_state* cpustate)  // Opcode 0f f5
                                                                                (INT32)MMX((modrm >> 3) & 0x7).s[3]*(INT32)MMX(modrm & 7).s[3];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).i[0]=(INT32)MMX((modrm >> 3) & 0x7).s[0]*(INT32)s.s[0]+
                                                                                (INT32)MMX((modrm >> 3) & 0x7).s[1]*(INT32)s.s[1];
@@ -1877,7 +1877,7 @@ static void MMXOP(psubb_r64_rm64)(i386_state* cpustate)  // Opcode 0f f8
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] - MMX(modrm & 7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] - s.b[n];
@@ -1895,7 +1895,7 @@ static void MMXOP(psubw_r64_rm64)(i386_state* cpustate)  // Opcode 0f f9
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] - MMX(modrm & 7).w[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] - s.w[n];
@@ -1913,7 +1913,7 @@ static void MMXOP(psubd_r64_rm64)(i386_state* cpustate)  // Opcode 0f fa
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] - MMX(modrm & 7).d[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 2;n++)
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] - s.d[n];
@@ -1931,7 +1931,7 @@ static void MMXOP(paddb_r64_rm64)(i386_state* cpustate)  // Opcode 0f fc
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] + MMX(modrm & 7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n]=MMX((modrm >> 3) & 0x7).b[n] + s.b[n];
@@ -1949,7 +1949,7 @@ static void MMXOP(paddw_r64_rm64)(i386_state* cpustate)  // Opcode 0f fd
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] + MMX(modrm & 7).w[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n]=MMX((modrm >> 3) & 0x7).w[n] + s.w[n];
@@ -1967,7 +1967,7 @@ static void MMXOP(paddd_r64_rm64)(i386_state* cpustate)  // Opcode 0f fe
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] + MMX(modrm & 7).d[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 2;n++)
                        MMX((modrm >> 3) & 0x7).d[n]=MMX((modrm >> 3) & 0x7).d[n] + s.d[n];
@@ -1987,7 +1987,7 @@ static void I386OP(cyrix_svdc)(i386_state* cpustate) // Opcode 0f 78
        UINT8 modrm = FETCH(cpustate);
 
        if( modrm < 0xc0 ) {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,10);
                int index = (modrm >> 3) & 7;
                int limit;
                switch (index)
@@ -2051,7 +2051,7 @@ static void I386OP(cyrix_rsdc)(i386_state* cpustate) // Opcode 0f 79
        UINT8 modrm = FETCH(cpustate);
 
        if( modrm < 0xc0 ) {
-               UINT32 ea = GetEA(cpustate,modrm,0);
+               UINT32 ea = GetEA(cpustate,modrm,0,10);
                int index = (modrm >> 3) & 7;
                UINT16 flags;
                UINT32 base;
@@ -2120,7 +2120,7 @@ static void I386OP(cyrix_svldt)(i386_state* cpustate) // Opcode 0f 7a
                UINT8 modrm = FETCH(cpustate);
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,10);
                        UINT32 limit = cpustate->ldtr.limit;
 
                        if (cpustate->ldtr.flags & 0x8000) //G bit
@@ -2152,7 +2152,7 @@ static void I386OP(cyrix_rsldt)(i386_state* cpustate) // Opcode 0f 7b
                UINT8 modrm = FETCH(cpustate);
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,10);
                        UINT16 flags = READ16(cpustate,ea + 5);
                        UINT32 base = (READ32(cpustate,ea + 2) | 0x00ffffff) | (READ8(cpustate,ea + 7) << 24);
                        UINT32 limit = READ16(cpustate,ea + 0) | ((flags & 3) << 16);
@@ -2185,7 +2185,7 @@ static void I386OP(cyrix_svts)(i386_state* cpustate) // Opcode 0f 7c
                UINT8 modrm = FETCH(cpustate);
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,10);
                        UINT32 limit = cpustate->task.limit;
 
                        if (cpustate->task.flags & 0x8000) //G bit
@@ -2216,7 +2216,7 @@ static void I386OP(cyrix_rsts)(i386_state* cpustate) // Opcode 0f 7d
                UINT8 modrm = FETCH(cpustate);
 
                if( !(modrm & 0xf8) ) {
-                       UINT32 ea = GetEA(cpustate,modrm,0);
+                       UINT32 ea = GetEA(cpustate,modrm,0,10);
                        UINT16 flags = READ16(cpustate,ea + 5);
                        UINT32 base = (READ32(cpustate,ea + 2) | 0x00ffffff) | (READ8(cpustate,ea + 7) << 24);
                        UINT32 limit = READ16(cpustate,ea + 0) | ((flags & 3) << 16);
@@ -2245,7 +2245,7 @@ static void MMXOP(movd_r64_rm32)(i386_state* cpustate) // Opcode 0f 6e
        if( modrm >= 0xc0 ) {
                MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                MMX((modrm >> 3) & 0x7).d[0]=READ32(cpustate,ea);
        }
        MMX((modrm >> 3) & 0x7).d[1]=0;
@@ -2259,7 +2259,7 @@ static void MMXOP(movq_r64_rm64)(i386_state* cpustate) // Opcode 0f 6f
        if( modrm >= 0xc0 ) {
                MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, MMX((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -2272,7 +2272,7 @@ static void MMXOP(movd_rm32_r64)(i386_state* cpustate) // Opcode 0f 7e
        if( modrm >= 0xc0 ) {
                STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                WRITE32(cpustate,ea, MMX((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -2285,7 +2285,7 @@ static void MMXOP(movq_rm64_r64)(i386_state* cpustate) // Opcode 0f 7f
        if( modrm >= 0xc0 ) {
                MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEMMX(cpustate, ea, MMX((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -2305,7 +2305,7 @@ static void MMXOP(pcmpeqb_r64_rm64)(i386_state* cpustate) // Opcode 0f 74
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (c=0;c <= 7;c++)
                        MMX(d).b[c]=(MMX(d).b[c] == s.b[c]) ? 0xff : 0;
@@ -2328,7 +2328,7 @@ static void MMXOP(pcmpeqw_r64_rm64)(i386_state* cpustate) // Opcode 0f 75
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).w[0]=(MMX(d).w[0] == s.w[0]) ? 0xffff : 0;
                MMX(d).w[1]=(MMX(d).w[1] == s.w[1]) ? 0xffff : 0;
@@ -2351,7 +2351,7 @@ static void MMXOP(pcmpeqd_r64_rm64)(i386_state* cpustate) // Opcode 0f 76
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).d[0]=(MMX(d).d[0] == s.d[0]) ? 0xffffffff : 0;
                MMX(d).d[1]=(MMX(d).d[1] == s.d[1]) ? 0xffffffff : 0;
@@ -2377,7 +2377,7 @@ static void MMXOP(pshufw_r64_rm64_i8)(i386_state* cpustate) // Opcode 0f 70
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                UINT8 imm8 = FETCH(cpustate);
                READMMX(cpustate, ea, s);
                MMX(d).w[0]=s.w[imm8 & 3];
@@ -2418,7 +2418,7 @@ static void SSEOP(punpcklbw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 60
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64(cpustate, ea);
                for (int n = 0; n < 8; n++) {
@@ -2447,7 +2447,7 @@ static void SSEOP(punpcklwd_r128_rm128)(i386_state* cpustate)
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64(cpustate, ea);
                for (int n = 0; n < 4; n++) {
@@ -2476,7 +2476,7 @@ static void SSEOP(punpckldq_r128_rm128)(i386_state* cpustate)
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64(cpustate, ea);
                for (int n = 0; n < 2; n++) {
@@ -2503,7 +2503,7 @@ static void SSEOP(punpcklqdq_r128_rm128)(i386_state* cpustate)
        else {
                XMM_REG xd, xs;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                xd.l[0] = XMM(d).l[0];
                xs.q[0] = READ64(cpustate, ea);
                XMM(d).q[0] = xd.q[0];
@@ -2533,7 +2533,7 @@ static void MMXOP(punpcklbw_r64_r64m32)(i386_state* cpustate) // Opcode 0f 60
        } else {
                UINT32 s,t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s = READ32(cpustate,ea);
                t=MMX(d).d[0];
                MMX(d).b[0]=t & 0xff;
@@ -2566,7 +2566,7 @@ static void MMXOP(punpcklwd_r64_r64m32)(i386_state* cpustate) // Opcode 0f 61
                UINT32 s;
                UINT16 t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s = READ32(cpustate,ea);
                t=MMX(d).w[1];
                MMX(d).w[0]=MMX(d).w[0];
@@ -2590,7 +2590,7 @@ static void MMXOP(punpckldq_r64_r64m32)(i386_state* cpustate) // Opcode 0f 62
        } else {
                UINT32 s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s = READ32(cpustate,ea);
                MMX(d).d[0]=MMX(d).d[0];
                MMX(d).d[1]=s;
@@ -2617,7 +2617,7 @@ static void MMXOP(packsswb_r64_rm64)(i386_state* cpustate) // Opcode 0f 63
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).c[0]=SaturatedSignedWordToSignedByte(MMX(d).s[0]);
                MMX(d).c[1]=SaturatedSignedWordToSignedByte(MMX(d).s[1]);
@@ -2645,7 +2645,7 @@ static void MMXOP(pcmpgtb_r64_rm64)(i386_state* cpustate) // Opcode 0f 64
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (c=0;c <= 7;c++)
                        MMX(d).b[c]=(MMX(d).c[c] > s.c[c]) ? 0xff : 0;
@@ -2667,7 +2667,7 @@ static void MMXOP(pcmpgtw_r64_rm64)(i386_state* cpustate) // Opcode 0f 65
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (c=0;c <= 3;c++)
                        MMX(d).w[c]=(MMX(d).s[c] > s.s[c]) ? 0xffff : 0;
@@ -2689,7 +2689,7 @@ static void MMXOP(pcmpgtd_r64_rm64)(i386_state* cpustate) // Opcode 0f 66
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (c=0;c <= 1;c++)
                        MMX(d).d[c]=(MMX(d).i[c] > s.i[c]) ? 0xffffffff : 0;
@@ -2719,7 +2719,7 @@ static void MMXOP(packuswb_r64_rm64)(i386_state* cpustate) // Opcode 0f 67
        } else {
                MMX_REG s,t;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                t.q = MMX(d).q;
                MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(t.s[0]);
@@ -2753,7 +2753,7 @@ static void MMXOP(punpckhbw_r64_rm64)(i386_state* cpustate) // Opcode 0f 68
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).b[0]=MMX(d).b[4];
                MMX(d).b[1]=s.b[4];
@@ -2782,7 +2782,7 @@ static void MMXOP(punpckhwd_r64_rm64)(i386_state* cpustate) // Opcode 0f 69
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).w[0]=MMX(d).w[2];
                MMX(d).w[1]=s.w[2];
@@ -2805,7 +2805,7 @@ static void MMXOP(punpckhdq_r64_rm64)(i386_state* cpustate) // Opcode 0f 6a
        } else {
                MMX_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX(d).d[0]=MMX(d).d[1];
                MMX(d).d[1]=s.d[1];
@@ -2835,7 +2835,7 @@ static void MMXOP(packssdw_r64_rm64)(i386_state* cpustate) // Opcode 0f 6b
                MMX_REG s;
                INT32 t1, t2;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                t1 = MMX(d).i[0];
                t2 = MMX(d).i[1];
@@ -2862,11 +2862,11 @@ static void SSEOP(group_0fae)(i386_state* cpustate)  // Opcode 0f ae
                switch ( (modm & 0x38) >> 3 )
                {
                        case 2: // ldmxcsr m32
-                               ea = GetEA(cpustate,modm, 0);
+                               ea = GetEA(cpustate,modm, 0, 4);
                                cpustate->mxcsr = READ32(cpustate,ea);
                                break;
                        case 3: // stmxcsr m32
-                               ea = GetEA(cpustate,modm, 0);
+                               ea = GetEA(cpustate,modm, 0, 4);
                                WRITE32(cpustate,ea, cpustate->mxcsr);
                                break;
                        case 7: // clflush m8
@@ -2890,7 +2890,7 @@ static void SSEOP(cvttps2dq_r128_rm128)(i386_state* cpustate) // Opcode f3 0f 5b
                XMM((modrm >> 3) & 0x7).i[3]=(INT32)XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f[1];
@@ -2907,7 +2907,7 @@ static void SSEOP(cvtss2sd_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 5
                XMM((modrm >> 3) & 0x7).f64[0] = XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s.d[0] = READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f64[0] = s.f[0];
        }
@@ -2922,7 +2922,7 @@ static void SSEOP(cvttss2si_r32_r128m32)(i386_state* cpustate) // Opcode f3 0f 2
                src = (INT32)XMM(modrm & 0x7).f[0^NATIVE_ENDIAN_VALUE_LE_BE(0,1)];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                t.d[0] = READ32(cpustate,ea);
                src = (INT32)t.f[0];
        }
@@ -2938,7 +2938,7 @@ static void SSEOP(cvtss2si_r32_r128m32)(i386_state* cpustate) // Opcode f3 0f 2d
                src = (INT32)XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG t;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                t.d[0] = READ32(cpustate,ea);
                src = (INT32)t.f[0];
        }
@@ -2952,7 +2952,7 @@ static void SSEOP(cvtsi2ss_r128_rm32)(i386_state* cpustate) // Opcode f3 0f 2a
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).f[0] = (INT32)LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).f[0] = (INT32)READ32(cpustate,ea);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -2967,7 +2967,7 @@ static void SSEOP(cvtpi2ps_r128_rm64)(i386_state* cpustate) // Opcode 0f 2a
                XMM((modrm >> 3) & 0x7).f[1] = (float)MMX(modrm & 0x7).i[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.i[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.i[1];
@@ -2984,7 +2984,7 @@ static void SSEOP(cvttps2pi_r64_r128m64)(i386_state* cpustate) // Opcode 0f 2c
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -3001,7 +3001,7 @@ static void SSEOP(cvtps2pi_r64_r128m64)(i386_state* cpustate) // Opcode 0f 2d
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -3017,7 +3017,7 @@ static void SSEOP(cvtps2pd_r128_r128m64)(i386_state* cpustate) // Opcode 0f 5a
                XMM((modrm >> 3) & 0x7).f64[1] = (double)XMM(modrm & 0x7).f[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)r.f[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)r.f[1];
@@ -3035,7 +3035,7 @@ static void SSEOP(cvtdq2ps_r128_rm128)(i386_state* cpustate) // Opcode 0f 5b
                XMM((modrm >> 3) & 0x7).f[3] = (float)XMM(modrm & 0x7).i[3];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.i[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.i[1];
@@ -3053,7 +3053,7 @@ static void SSEOP(cvtdq2pd_r128_r128m64)(i386_state* cpustate) // Opcode f3 0f e
                XMM((modrm >> 3) & 0x7).f64[1] = (double)XMM(modrm & 0x7).i[1];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)s.i[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)s.i[1];
@@ -3067,7 +3067,7 @@ static void SSEOP(movss_r128_rm128)(i386_state* cpustate) // Opcode f3 0f 10
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).d[0] = XMM(modrm & 0x7).d[0];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).d[0] = READ32(cpustate,ea);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3079,7 +3079,7 @@ static void SSEOP(movss_rm128_r128)(i386_state* cpustate) // Opcode f3 0f 11
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7).d[0] = XMM((modrm >> 3) & 0x7).d[0];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                WRITE32(cpustate,ea, XMM((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3095,7 +3095,7 @@ static void SSEOP(movsldup_r128_rm128)(i386_state* cpustate) // Opcode f3 0f 12
                XMM((modrm >> 3) & 0x7).d[3] = XMM(modrm & 0x7).d[2];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = src.d[0];
                XMM((modrm >> 3) & 0x7).d[1] = src.d[0];
@@ -3115,7 +3115,7 @@ static void SSEOP(movshdup_r128_rm128)(i386_state* cpustate) // Opcode f3 0f 16
                XMM((modrm >> 3) & 0x7).d[3] = XMM(modrm & 0x7).d[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = src.d[1];
                XMM((modrm >> 3) & 0x7).d[1] = src.d[1];
@@ -3131,7 +3131,7 @@ static void SSEOP(movaps_r128_rm128)(i386_state* cpustate) // Opcode 0f 28
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3143,7 +3143,7 @@ static void SSEOP(movaps_rm128_r128)(i386_state* cpustate) // Opcode 0f 29
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3155,7 +3155,7 @@ static void SSEOP(movups_r128_rm128)(i386_state* cpustate) // Opcode 0f 10
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3167,7 +3167,7 @@ static void SSEOP(movupd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 10
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3179,7 +3179,7 @@ static void SSEOP(movups_rm128_r128)(i386_state* cpustate) // Opcode 0f 11
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3191,7 +3191,7 @@ static void SSEOP(movupd_rm128_r128)(i386_state* cpustate) // Opcode 66 0f 11
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7)); // address does not need to be 16-byte aligned
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3206,7 +3206,7 @@ static void SSEOP(movlps_r128_m64)(i386_state* cpustate) // Opcode 0f 12
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // MOVLPS opcode
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3219,7 +3219,7 @@ static void SSEOP(movlpd_r128_m64)(i386_state* cpustate) // Opcode 66 0f 12
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // MOVLPS opcode
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3232,7 +3232,7 @@ static void SSEOP(movlps_m64_r128)(i386_state* cpustate) // Opcode 0f 13
                // unsupported by cpu
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3245,7 +3245,7 @@ static void SSEOP(movlpd_m64_r128)(i386_state* cpustate) // Opcode 66 0f 13
                // unsupported by cpu
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3260,7 +3260,7 @@ static void SSEOP(movhps_r128_m64)(i386_state* cpustate) // Opcode 0f 16
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // MOVHPS opcode
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_HI64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3274,7 +3274,7 @@ static void SSEOP(movhpd_r128_m64)(i386_state* cpustate) // Opcode 66 0f 16
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // MOVHPS opcode
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_HI64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3287,7 +3287,7 @@ static void SSEOP(movhps_m64_r128)(i386_state* cpustate) // Opcode 0f 17
                // unsupported by cpu
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEXMM_HI64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3300,7 +3300,7 @@ static void SSEOP(movhpd_m64_r128)(i386_state* cpustate) // Opcode 66 0f 17
                // unsupported by cpu
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEXMM_HI64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3314,7 +3314,7 @@ static void SSEOP(movntps_m128_r128)(i386_state* cpustate) // Opcode 0f 2b
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -3379,7 +3379,7 @@ static void SSEOP(movdqu_r128_rm128)(i386_state* cpustate) // Opcode f3 0f 6f
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3393,7 +3393,7 @@ static void SSEOP(movdqu_rm128_r128)(i386_state* cpustate) // Opcode f3 0f 7f
                XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
                XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3406,7 +3406,7 @@ static void SSEOP(movd_m128_rm32)(i386_state* cpustate) // Opcode 66 0f 6e
                XMM((modrm >> 3) & 0x7).d[0] = LOAD_RM32(modrm);
        }
        else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).d[0] = READ32(cpustate,ea);
        }
        XMM((modrm >> 3) & 0x7).d[1] = 0;
@@ -3422,7 +3422,7 @@ static void SSEOP(movdqa_m128_rm128)(i386_state* cpustate) // Opcode 66 0f 6f
                XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
        }
        else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3436,7 +3436,7 @@ static void SSEOP(movq_r128_r128m64)(i386_state* cpustate) // Opcode f3 0f 7e
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                XMM((modrm >> 3) & 0x7).q[0] = READ64(cpustate, ea);
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        }
@@ -3450,7 +3450,7 @@ static void SSEOP(movd_rm32_r128)(i386_state* cpustate) // Opcode 66 0f 7e
                STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
        }
        else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                WRITE32(cpustate,ea, XMM((modrm >> 3) & 0x7).d[0]);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3464,7 +3464,7 @@ static void SSEOP(movdqa_rm128_r128)(i386_state* cpustate) // Opcode 66 0f 7f
                XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
        }
        else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -3544,7 +3544,7 @@ static void SSEOP(xorps)(i386_state* cpustate) // Opcode 0f 57
                XMM((modrm >> 3) & 0x7).d[3] = XMM((modrm >> 3) & 0x7).d[3] ^ XMM(modrm & 0x7).d[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).d[0] = XMM((modrm >> 3) & 0x7).d[0] ^ src.d[0];
                XMM((modrm >> 3) & 0x7).d[1] = XMM((modrm >> 3) & 0x7).d[1] ^ src.d[1];
@@ -3562,7 +3562,7 @@ static void SSEOP(xorpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 57
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] ^ XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] ^ src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] ^ src.q[1];
@@ -3580,7 +3580,7 @@ static void SSEOP(addps)(i386_state* cpustate) // Opcode 0f 58
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] + XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] + src.f[1];
@@ -3600,7 +3600,7 @@ static void SSEOP(sqrtps_r128_rm128)(i386_state* cpustate) // Opcode 0f 51
                XMM((modrm >> 3) & 0x7).f[3] = sqrt(XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sqrt(src.f[1]);
@@ -3620,7 +3620,7 @@ static void SSEOP(rsqrtps_r128_rm128)(i386_state* cpustate) // Opcode 0f 52
                XMM((modrm >> 3) & 0x7).f[3] = 1.0 / sqrt(XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = 1.0 / sqrt(src.f[1]);
@@ -3640,7 +3640,7 @@ static void SSEOP(rcpps_r128_rm128)(i386_state* cpustate) // Opcode 0f 53
                XMM((modrm >> 3) & 0x7).f[3] = 1.0f / XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = 1.0f / src.f[1];
@@ -3658,7 +3658,7 @@ static void SSEOP(andps_r128_rm128)(i386_state* cpustate) // Opcode 0f 54
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -3674,7 +3674,7 @@ static void SSEOP(andpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 54
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -3690,7 +3690,7 @@ static void SSEOP(andnps_r128_rm128)(i386_state* cpustate) // Opcode 0f 55
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = ~(XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -3706,7 +3706,7 @@ static void SSEOP(andnpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 55
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = ~(XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = ~(XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -3722,7 +3722,7 @@ static void SSEOP(orps_r128_rm128)(i386_state* cpustate) // Opcode 0f 56
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] | src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | src.q[1];
@@ -3738,7 +3738,7 @@ static void SSEOP(orpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 56
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 0x7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0] | src.q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1] | src.q[1];
@@ -3756,7 +3756,7 @@ static void SSEOP(mulps)(i386_state* cpustate) // Opcode 0f 59 ????
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] * XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] * src.f[1];
@@ -3776,7 +3776,7 @@ static void SSEOP(subps)(i386_state* cpustate) // Opcode 0f 5c
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] - XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] - src.f[1];
@@ -3822,7 +3822,7 @@ static void SSEOP(minps)(i386_state* cpustate) // Opcode 0f 5d
                XMM((modrm >> 3) & 0x7).f[3] = sse_min_single(XMM((modrm >> 3) & 0x7).f[3], XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sse_min_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sse_min_single(XMM((modrm >> 3) & 0x7).f[1], src.f[1]);
@@ -3842,7 +3842,7 @@ static void SSEOP(divps)(i386_state* cpustate) // Opcode 0f 5e
                XMM((modrm >> 3) & 0x7).f[3] = XMM((modrm >> 3) & 0x7).f[3] / XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / src.f[0];
                XMM((modrm >> 3) & 0x7).f[1] = XMM((modrm >> 3) & 0x7).f[1] / src.f[1];
@@ -3888,7 +3888,7 @@ static void SSEOP(maxps)(i386_state* cpustate) // Opcode 0f 5f
                XMM((modrm >> 3) & 0x7).f[3] = sse_max_single(XMM((modrm >> 3) & 0x7).f[3], XMM(modrm & 0x7).f[3]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
                XMM((modrm >> 3) & 0x7).f[1] = sse_max_single(XMM((modrm >> 3) & 0x7).f[1], src.f[1]);
@@ -3905,7 +3905,7 @@ static void SSEOP(maxss_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 5f
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                src.d[0]=READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f[0] = sse_max_single(XMM((modrm >> 3) & 0x7).f[0], src.f[0]);
        }
@@ -3919,7 +3919,7 @@ static void SSEOP(addss)(i386_state* cpustate) // Opcode f3 0f 58
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] + src.f[0];
        }
@@ -3933,7 +3933,7 @@ static void SSEOP(subss)(i386_state* cpustate) // Opcode f3 0f 5c
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
        }
@@ -3947,7 +3947,7 @@ static void SSEOP(mulss)(i386_state* cpustate) // Opcode f3 0f 5e
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] * src.f[0];
        }
@@ -3961,7 +3961,7 @@ static void SSEOP(divss)(i386_state* cpustate) // Opcode 0f 59
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] / src.f[0];
        }
@@ -3975,7 +3975,7 @@ static void SSEOP(rcpss_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 53
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s.d[0]=READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0f / s.f[0];
        }
@@ -3989,7 +3989,7 @@ static void SSEOP(sqrtss_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 51
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s.d[0]=READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f[0] = sqrt(s.f[0]);
        }
@@ -4003,7 +4003,7 @@ static void SSEOP(rsqrtss_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 52
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(XMM(modrm & 0x7).f[0]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s.d[0]=READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f[0] = 1.0 / sqrt(s.f[0]);
        }
@@ -4017,7 +4017,7 @@ static void SSEOP(minss_r128_r128m32)(i386_state* cpustate) // Opcode f3 0f 5d
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] < XMM(modrm & 0x7).f[0] ? XMM((modrm >> 3) & 0x7).f[0] : XMM(modrm & 0x7).f[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                s.d[0] = READ32(cpustate,ea);
                XMM((modrm >> 3) & 0x7).f[0] = XMM((modrm >> 3) & 0x7).f[0] < s.f[0] ? XMM((modrm >> 3) & 0x7).f[0] : s.f[0];
        }
@@ -4033,7 +4033,7 @@ static void SSEOP(comiss_r128_r128m32)(i386_state* cpustate) // Opcode 0f 2f
                b = XMM(modrm & 0x7).d[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                a = XMM((modrm >> 3) & 0x7).d[0];
                b = src.d[0];
@@ -4070,7 +4070,7 @@ static void SSEOP(comisd_r128_r128m64)(i386_state* cpustate) // Opcode 66 0f 2f
                b = XMM(modrm & 0x7).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                a = XMM((modrm >> 3) & 0x7).q[0];
                b = src.q[0];
@@ -4107,7 +4107,7 @@ static void SSEOP(ucomiss_r128_r128m32)(i386_state* cpustate) // Opcode 0f 2e
                b = XMM(modrm & 0x7).d[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                a = XMM((modrm >> 3) & 0x7).d[0];
                b = src.d[0];
@@ -4144,7 +4144,7 @@ static void SSEOP(ucomisd_r128_r128m64)(i386_state* cpustate) // Opcode 66 0f 2e
                b = XMM(modrm & 0x7).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                a = XMM((modrm >> 3) & 0x7).q[0];
                b = src.q[0];
@@ -4197,7 +4197,7 @@ static void SSEOP(shufps)(i386_state* cpustate) // Opcode 0f c6
        } else {
                UINT32 t1,t2;
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                t1=XMM(d).d[m1];
                t2=XMM(d).d[m2];
@@ -4228,7 +4228,7 @@ static void SSEOP(shufpd_r128_rm128_i8)(i386_state* cpustate) // Opcode 66 0f c6
        } else {
                UINT64 t1;
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                t1=XMM(d).q[m1];
                XMM(d).q[0]=t1;
@@ -4255,7 +4255,7 @@ static void SSEOP(unpcklps_r128_rm128)(i386_state* cpustate) // Opcode 0f 14
                XMM(d).d[0]=t4;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                t2 = XMM(d).d[1];
                XMM(d).d[3]=src.d[1];
@@ -4276,7 +4276,7 @@ static void SSEOP(unpcklpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 14
                XMM(d).q[0]=XMM(d).q[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM(d).q[1]=src.q[0];
                XMM(d).q[0]=XMM(d).q[0];
@@ -4302,7 +4302,7 @@ static void SSEOP(unpckhps_r128_rm128)(i386_state* cpustate) // Opcode 0f 15
                XMM(d).d[3]=t4;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                t1 = XMM(d).d[2];
                t2 = XMM(d).d[3];
@@ -4325,7 +4325,7 @@ static void SSEOP(unpckhpd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 15
                XMM(d).q[1]=XMM(s).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM(d).q[0]=XMM(d).q[1];
                XMM(d).q[1]=src.q[1];
@@ -4525,7 +4525,7 @@ static void SSEOP(cmpps_r128_rm128_i8)(i386_state* cpustate) // Opcode 0f c2
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                UINT8 imm8 = FETCH(cpustate);
                READXMM(cpustate, ea, s);
                d=(modrm >> 3) & 0x7;
@@ -4546,7 +4546,7 @@ static void SSEOP(cmppd_r128_rm128_i8)(i386_state* cpustate) // Opcode 66 0f c2
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                UINT8 imm8 = FETCH(cpustate);
                READXMM(cpustate, ea, s);
                d=(modrm >> 3) & 0x7;
@@ -4567,7 +4567,7 @@ static void SSEOP(cmpss_r128_r128m32_i8)(i386_state* cpustate) // Opcode f3 0f c
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                UINT8 imm8 = FETCH(cpustate);
                s.d[0]=READ32(cpustate,ea);
                d=(modrm >> 3) & 0x7;
@@ -4588,7 +4588,7 @@ static void SSEOP(pinsrw_r64_r16m16_i8)(i386_state* cpustate) // Opcode 0f c4, 1
                else
                        MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 2);
                UINT8 imm8 = FETCH(cpustate);
                UINT16 v = READ16(cpustate,ea);
                if (cpustate->xmm_operand_size)
@@ -4608,7 +4608,7 @@ static void SSEOP(pinsrw_r64_r32m16_i8)(i386_state* cpustate) // Opcode 0f c4, 3
                UINT16 v = (UINT16)LOAD_RM32(modrm);
                MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 2);
                UINT8 imm8 = FETCH(cpustate);
                UINT16 v = READ16(cpustate,ea);
                MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
@@ -4625,7 +4625,7 @@ static void SSEOP(pinsrw_r128_r32m16_i8)(i386_state* cpustate) // Opcode 66 0f c
                XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
        }
        else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 2);
                UINT8 imm8 = FETCH(cpustate);
                UINT16 v = READ16(cpustate,ea);
                XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
@@ -4688,7 +4688,7 @@ static void SSEOP(pminub_r64_rm64)(i386_state* cpustate) // Opcode 0f da
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] < MMX(modrm & 0x7).b[n] ? MMX((modrm >> 3) & 0x7).b[n] : MMX(modrm & 0x7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] < s.b[n] ? MMX((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4704,7 +4704,7 @@ static void SSEOP(pminub_r128_rm128)(i386_state* cpustate) // Opcode 66 0f da
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] < XMM(modrm & 0x7).b[n] ? XMM((modrm >> 3) & 0x7).b[n] : XMM(modrm & 0x7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] < s.b[n] ? XMM((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4722,7 +4722,7 @@ static void SSEOP(pmaxub_r64_rm64)(i386_state* cpustate) // Opcode 0f de
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] > MMX(modrm & 0x7).b[n] ? MMX((modrm >> 3) & 0x7).b[n] : MMX(modrm & 0x7).b[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = MMX((modrm >> 3) & 0x7).b[n] > s.b[n] ? MMX((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -4740,7 +4740,7 @@ static void SSEOP(pavgb_r64_rm64)(i386_state* cpustate) // Opcode 0f e0
                        MMX((modrm >> 3) & 0x7).b[n] = ((UINT16)MMX((modrm >> 3) & 0x7).b[n] + (UINT16)MMX(modrm & 0x7).b[n] + 1) >> 1;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 8;n++)
                        MMX((modrm >> 3) & 0x7).b[n] = ((UINT16)MMX((modrm >> 3) & 0x7).b[n] + (UINT16)s.b[n] + 1) >> 1;
@@ -4758,7 +4758,7 @@ static void SSEOP(pavgw_r64_rm64)(i386_state* cpustate) // Opcode 0f e3
                        MMX((modrm >> 3) & 0x7).w[n] = ((UINT32)MMX((modrm >> 3) & 0x7).w[n] + (UINT32)MMX(modrm & 0x7).w[n] + 1) >> 1;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).w[n] = ((UINT32)MMX((modrm >> 3) & 0x7).w[n] + (UINT32)s.w[n] + 1) >> 1;
@@ -4777,7 +4777,7 @@ static void SSEOP(pmulhuw_r64_rm64)(i386_state* cpustate)  // Opcode 0f e4
                MMX((modrm >> 3) & 0x7).w[3]=((UINT32)MMX((modrm >> 3) & 0x7).w[3]*(UINT32)MMX(modrm & 7).w[3]) >> 16;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).w[0]=((UINT32)MMX((modrm >> 3) & 0x7).w[0]*(UINT32)s.w[0]) >> 16;
                MMX((modrm >> 3) & 0x7).w[1]=((UINT32)MMX((modrm >> 3) & 0x7).w[1]*(UINT32)s.w[1]) >> 16;
@@ -4797,7 +4797,7 @@ static void SSEOP(pminsw_r64_rm64)(i386_state* cpustate) // Opcode 0f ea
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] < MMX(modrm & 0x7).s[n] ? MMX((modrm >> 3) & 0x7).s[n] : MMX(modrm & 0x7).s[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] < s.s[n] ? MMX((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -4815,7 +4815,7 @@ static void SSEOP(pmaxsw_r64_rm64)(i386_state* cpustate) // Opcode 0f ee
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] > MMX(modrm & 0x7).s[n] ? MMX((modrm >> 3) & 0x7).s[n] : MMX(modrm & 0x7).s[n];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                for (n=0;n < 4;n++)
                        MMX((modrm >> 3) & 0x7).s[n] = MMX((modrm >> 3) & 0x7).s[n] > s.s[n] ? MMX((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -4831,7 +4831,7 @@ static void SSEOP(pmuludq_r64_rm64)(i386_state* cpustate) // Opcode 0f f4
                MMX((modrm >> 3) & 0x7).q = (UINT64)MMX((modrm >> 3) & 0x7).d[0] * (UINT64)MMX(modrm & 0x7).d[0];
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).q = (UINT64)MMX((modrm >> 3) & 0x7).d[0] * (UINT64)s.d[0];
        }
@@ -4846,7 +4846,7 @@ static void SSEOP(pmuludq_r128_rm128)(i386_state* cpustate) // Opcode 66 0f f4
                XMM((modrm >> 3) & 0x7).q[1] = (UINT64)XMM((modrm >> 3) & 0x7).d[2] * (UINT64)XMM(modrm & 0x7).d[2];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).q[0] = (UINT64)XMM((modrm >> 3) & 0x7).d[0] * (UINT64)s.d[0];
                XMM((modrm >> 3) & 0x7).q[1] = (UINT64)XMM((modrm >> 3) & 0x7).d[2] * (UINT64)s.d[2];
@@ -4867,7 +4867,7 @@ static void SSEOP(psadbw_r64_rm64)(i386_state* cpustate) // Opcode 0f f6
                MMX((modrm >> 3) & 0x7).l=(UINT64)temp & 0xffff;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                temp=0;
                for (n=0;n < 8;n++)
@@ -4885,7 +4885,7 @@ static void SSEOP(psubq_r64_rm64)(i386_state* cpustate)  // Opcode 0f fb
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q - MMX(modrm & 7).q;
        } else {
                MMX_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, s);
                MMX((modrm >> 3) & 0x7).q=MMX((modrm >> 3) & 0x7).q - s.q;
        }
@@ -4900,7 +4900,7 @@ static void SSEOP(psubq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f fb
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] - XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] - s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] - s.q[1];
@@ -4926,7 +4926,7 @@ static void SSEOP(pshufd_r128_rm128_i8)(i386_state* cpustate) // Opcode 66 0f 70
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                UINT8 imm8 = FETCH(cpustate);
                READXMM(cpustate, ea, s);
                XMM(d).d[0]=s.d[(imm8 & 3)];
@@ -4955,7 +4955,7 @@ static void SSEOP(pshuflw_r128_rm128_i8)(i386_state* cpustate) // Opcode f2 0f 7
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                UINT8 imm8 = FETCH(cpustate);
                READXMM(cpustate, ea, s);
                XMM(d).q[1]=s.q[1];
@@ -4985,7 +4985,7 @@ static void SSEOP(pshufhw_r128_rm128_i8)(i386_state* cpustate) // Opcode f3 0f 7
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                UINT8 imm8 = FETCH(cpustate);
                READXMM(cpustate, ea, s);
                XMM(d).q[0]=s.q[0];
@@ -5015,7 +5015,7 @@ static void SSEOP(packsswb_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 63
        else {
                XMM_REG s;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n = 0; n < 8; n++)
                        XMM(d).c[n] = SaturatedSignedWordToSignedByte(XMM(d).s[n]);
@@ -5047,7 +5047,7 @@ static void SSEOP(packssdw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 6b
        else {
                XMM_REG s;
                int d = (modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM(d).s[0] = SaturatedSignedDwordToSignedWord(XMM(d).i[0]);
                XMM(d).s[1] = SaturatedSignedDwordToSignedWord(XMM(d).i[1]);
@@ -5073,7 +5073,7 @@ static void SSEOP(pcmpgtb_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 64
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 15;c++)
                        XMM(d).b[c]=(XMM(d).c[c] > s.c[c]) ? 0xff : 0;
@@ -5093,7 +5093,7 @@ static void SSEOP(pcmpgtw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 65
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 7;c++)
                        XMM(d).w[c]=(XMM(d).s[c] > s.s[c]) ? 0xffff : 0;
@@ -5113,7 +5113,7 @@ static void SSEOP(pcmpgtd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 66
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 3;c++)
                        XMM(d).d[c]=(XMM(d).i[c] > s.i[c]) ? 0xffffffff : 0;
@@ -5138,7 +5138,7 @@ static void SSEOP(packuswb_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 67
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n = 0; n < 8;n++)
                        XMM(d).b[n]=SaturatedSignedWordToUnsignedByte(XMM(d).s[n]);
@@ -5164,7 +5164,7 @@ static void SSEOP(punpckhbw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 68
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n = 0; n < 16; n += 2) {
                        XMM(d).b[n]=XMM(d).b[8+(n >> 1)];
@@ -5190,7 +5190,7 @@ static void SSEOP(punpckhwd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 69
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n = 0; n < 8; n += 2) {
                        XMM(d).w[n]=XMM(d).w[4+(n >> 1)];
@@ -5216,7 +5216,7 @@ static void SSEOP(unpckhdq_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 6a
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM(d).d[0]=XMM(d).d[2];
                XMM(d).d[1]=s.d[2];
@@ -5240,7 +5240,7 @@ static void SSEOP(punpckhqdq_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 6
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM(d).q[0]=XMM(d).q[1];
                XMM(d).q[1]=s.q[1];
@@ -5260,7 +5260,7 @@ static void SSEOP(pcmpeqb_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 74
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 15;c++)
                        XMM(d).b[c]=(XMM(d).c[c] == s.c[c]) ? 0xff : 0;
@@ -5280,7 +5280,7 @@ static void SSEOP(pcmpeqw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 75
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 7;c++)
                        XMM(d).w[c]=(XMM(d).s[c] == s.s[c]) ? 0xffff : 0;
@@ -5300,7 +5300,7 @@ static void SSEOP(pcmpeqd_r128_rm128)(i386_state* cpustate) // Opcode 66 0f 76
        } else {
                XMM_REG s;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int c=0;c <= 3;c++)
                        XMM(d).d[c]=(XMM(d).i[c] == s.i[c]) ? 0xffffffff : 0;
@@ -5320,7 +5320,7 @@ static void SSEOP(paddq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d4
        } else {
                XMM_REG src;
                int d=(modrm >> 3) & 0x7;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM(d).q[0]=XMM(d).q[0]+src.q[0];
                XMM(d).q[1]=XMM(d).q[1]+src.q[1];
@@ -5340,7 +5340,7 @@ static void SSEOP(pmullw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d5
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                d=(modrm >> 3) & 0x7;
                for (int n = 0; n < 8;n++)
@@ -5357,7 +5357,7 @@ static void SSEOP(paddb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f fc
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] + XMM(modrm & 7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] + s.b[n];
@@ -5373,7 +5373,7 @@ static void SSEOP(paddw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f fd
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] + XMM(modrm & 7).w[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] + s.w[n];
@@ -5389,7 +5389,7 @@ static void SSEOP(paddd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f fe
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] + XMM(modrm & 7).d[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] + s.d[n];
@@ -5405,7 +5405,7 @@ static void SSEOP(psubusb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d8
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] < XMM(modrm & 7).b[n] ? 0 : XMM((modrm >> 3) & 0x7).b[n]-XMM(modrm & 7).b[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] < src.b[n] ? 0 : XMM((modrm >> 3) & 0x7).b[n]-src.b[n];
@@ -5421,7 +5421,7 @@ static void SSEOP(psubusw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d9
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] < XMM(modrm & 7).w[n] ? 0 : XMM((modrm >> 3) & 0x7).w[n]-XMM(modrm & 7).w[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] < src.w[n] ? 0 : XMM((modrm >> 3) & 0x7).w[n]-src.w[n];
@@ -5437,7 +5437,7 @@ static void SSEOP(pand_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f db
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] & XMM(modrm & 7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] & src.q[1];
@@ -5453,7 +5453,7 @@ static void SSEOP(pandn_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f df
                XMM((modrm >> 3) & 0x7).q[1]=(~XMM((modrm >> 3) & 0x7).q[1]) & XMM(modrm & 7).q[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).q[0]=(~XMM((modrm >> 3) & 0x7).q[0]) & src.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=(~XMM((modrm >> 3) & 0x7).q[1]) & src.q[1];
@@ -5469,7 +5469,7 @@ static void SSEOP(paddusb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f dc
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] > (0xff-XMM(modrm & 7).b[n]) ? 0xff : XMM((modrm >> 3) & 0x7).b[n]+XMM(modrm & 7).b[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] > (0xff-src.b[n]) ? 0xff : XMM((modrm >> 3) & 0x7).b[n]+src.b[n];
@@ -5485,7 +5485,7 @@ static void SSEOP(paddusw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f dd
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] > (0xffff-XMM(modrm & 7).w[n]) ? 0xffff : XMM((modrm >> 3) & 0x7).w[n]+XMM(modrm & 7).w[n];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] > (0xffff-src.w[n]) ? 0xffff : XMM((modrm >> 3) & 0x7).w[n]+src.w[n];
@@ -5501,7 +5501,7 @@ static void SSEOP(pmaxub_r128_rm128)(i386_state* cpustate) // Opcode 66 0f de
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] > XMM(modrm & 0x7).b[n] ? XMM((modrm >> 3) & 0x7).b[n] : XMM(modrm & 0x7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = XMM((modrm >> 3) & 0x7).b[n] > s.b[n] ? XMM((modrm >> 3) & 0x7).b[n] : s.b[n];
@@ -5517,7 +5517,7 @@ static void SSEOP(pmulhuw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e4
                        XMM((modrm >> 3) & 0x7).w[n]=((UINT32)XMM((modrm >> 3) & 0x7).w[n]*(UINT32)XMM(modrm & 7).w[n]) >> 16;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=((UINT32)XMM((modrm >> 3) & 0x7).w[n]*(UINT32)s.w[n]) >> 16;
@@ -5533,7 +5533,7 @@ static void SSEOP(pmulhw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e5
                        XMM((modrm >> 3) & 0x7).w[n]=(UINT32)((INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)XMM(modrm & 7).s[n]) >> 16;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=(UINT32)((INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)src.s[n]) >> 16;
@@ -5549,7 +5549,7 @@ static void SSEOP(psubsb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e8
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] - (INT16)XMM(modrm & 7).c[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] - (INT16)s.c[n]);
@@ -5565,7 +5565,7 @@ static void SSEOP(psubsw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e9
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] - (INT32)XMM(modrm & 7).s[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] - (INT32)s.s[n]);
@@ -5581,7 +5581,7 @@ static void SSEOP(pminsw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f ea
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] < XMM(modrm & 0x7).s[n] ? XMM((modrm >> 3) & 0x7).s[n] : XMM(modrm & 0x7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] < s.s[n] ? XMM((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -5597,7 +5597,7 @@ static void SSEOP(pmaxsw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f ee
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] > XMM(modrm & 0x7).s[n] ? XMM((modrm >> 3) & 0x7).s[n] : XMM(modrm & 0x7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n] = XMM((modrm >> 3) & 0x7).s[n] > s.s[n] ? XMM((modrm >> 3) & 0x7).s[n] : s.s[n];
@@ -5613,7 +5613,7 @@ static void SSEOP(paddsb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f ec
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] + (INT16)XMM(modrm & 7).c[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).c[n]=SaturatedSignedWordToSignedByte((INT16)XMM((modrm >> 3) & 0x7).c[n] + (INT16)s.c[n]);
@@ -5629,7 +5629,7 @@ static void SSEOP(paddsw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f ed
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] + (INT32)XMM(modrm & 7).s[n]);
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).s[n]=SaturatedSignedDwordToSignedWord((INT32)XMM((modrm >> 3) & 0x7).s[n] + (INT32)s.s[n]);
@@ -5645,7 +5645,7 @@ static void SSEOP(por_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f eb
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] | XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] | s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] | s.q[1];
@@ -5661,7 +5661,7 @@ static void SSEOP(pxor_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f ef
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] ^ XMM(modrm & 7).q[1];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] ^ s.q[0];
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] ^ s.q[1];
@@ -5678,7 +5678,7 @@ static void SSEOP(pmaddwd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f5
                                                                                (INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)XMM(modrm & 7).s[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).i[n]=(INT32)XMM((modrm >> 3) & 0x7).s[n]*(INT32)s.s[n]+
@@ -5695,7 +5695,7 @@ static void SSEOP(psubb_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f8
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] - XMM(modrm & 7).b[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n]=XMM((modrm >> 3) & 0x7).b[n] - s.b[n];
@@ -5711,7 +5711,7 @@ static void SSEOP(psubw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f9
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] - XMM(modrm & 7).w[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] - s.w[n];
@@ -5727,7 +5727,7 @@ static void SSEOP(psubd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f fa
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] - XMM(modrm & 7).d[n];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 4;n++)
                        XMM((modrm >> 3) & 0x7).d[n]=XMM((modrm >> 3) & 0x7).d[n] - s.d[n];
@@ -5750,7 +5750,7 @@ static void SSEOP(psadbw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f f6
                XMM((modrm >> 3) & 0x7).l[1]=(UINT64)temp & 0xffff;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                temp=0;
                for (int n=0;n < 8;n++)
@@ -5772,7 +5772,7 @@ static void SSEOP(pavgb_r128_rm128)(i386_state* cpustate) // Opcode 66 0f e0
                        XMM((modrm >> 3) & 0x7).b[n] = ((UINT16)XMM((modrm >> 3) & 0x7).b[n] + (UINT16)XMM(modrm & 0x7).b[n] + 1) >> 1;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 16;n++)
                        XMM((modrm >> 3) & 0x7).b[n] = ((UINT16)XMM((modrm >> 3) & 0x7).b[n] + (UINT16)s.b[n] + 1) >> 1;
@@ -5788,7 +5788,7 @@ static void SSEOP(pavgw_r128_rm128)(i386_state* cpustate) // Opcode 66 0f e3
                        XMM((modrm >> 3) & 0x7).w[n] = ((UINT32)XMM((modrm >> 3) & 0x7).w[n] + (UINT32)XMM(modrm & 0x7).w[n] + 1) >> 1;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                for (int n=0;n < 8;n++)
                        XMM((modrm >> 3) & 0x7).w[n] = ((UINT32)XMM((modrm >> 3) & 0x7).w[n] + (UINT32)s.w[n] + 1) >> 1;
@@ -5805,7 +5805,7 @@ static void SSEOP(psrlw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d1
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                int count=(int)src.q[0];
                for (int n=0; n < 8;n++)
@@ -5825,7 +5825,7 @@ static void SSEOP(psrld_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d2
                XMM((modrm >> 3) & 0x7).d[3]=XMM((modrm >> 3) & 0x7).d[3] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).d[0]=XMM((modrm >> 3) & 0x7).d[0] >> count;
@@ -5845,7 +5845,7 @@ static void SSEOP(psrlq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d3
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] >> count;
@@ -5863,7 +5863,7 @@ static void SSEOP(psllw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f1
                        XMM((modrm >> 3) & 0x7).w[n]=XMM((modrm >> 3) & 0x7).w[n] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                int count=(int)s.q[0];
                for (int n=0; n < 8;n++)
@@ -5883,7 +5883,7 @@ static void SSEOP(pslld_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f2
                XMM((modrm >> 3) & 0x7).d[3]=XMM((modrm >> 3) & 0x7).d[3] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                int count=(int)s.q[0];
                XMM((modrm >> 3) & 0x7).d[0]=XMM((modrm >> 3) & 0x7).d[0] << count;
@@ -5903,7 +5903,7 @@ static void SSEOP(psllq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f f3
                XMM((modrm >> 3) & 0x7).q[1]=XMM((modrm >> 3) & 0x7).q[1] << count;
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, s);
                int count=(int)s.q[0];
                XMM((modrm >> 3) & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0] << count;
@@ -5921,7 +5921,7 @@ static void SSEOP(psraw_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e1
                        XMM((modrm >> 3) & 0x7).s[n]=XMM((modrm >> 3) & 0x7).s[n] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                int count=(int)src.q[0];
                for (int n=0; n < 8;n++)
@@ -5941,7 +5941,7 @@ static void SSEOP(psrad_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e2
                XMM((modrm >> 3) & 0x7).i[3]=XMM((modrm >> 3) & 0x7).i[3] >> count;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                int count=(int)src.q[0];
                XMM((modrm >> 3) & 0x7).i[0]=XMM((modrm >> 3) & 0x7).i[0] >> count;
@@ -5959,7 +5959,7 @@ static void SSEOP(movntdq_m128_r128)(i386_state* cpustate)  // Opcode 66 0f e7
                CYCLES(cpustate,1);     // unsupported
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -5974,7 +5974,7 @@ static void SSEOP(cvttpd2dq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f e
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f64[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f64[1];
@@ -5990,7 +5990,7 @@ static void SSEOP(movq_r128m64_r128)(i386_state* cpustate)  // Opcode 66 0f d6
                XMM(modrm & 0x7).q[0]=XMM((modrm >> 3) & 0x7).q[0];
                XMM(modrm & 0x7).q[1] = 0;
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITE64(cpustate, ea, XMM((modrm >> 3) & 0x7).q[0]);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -6008,7 +6008,7 @@ static void SSEOP(addsubpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f d0
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]-src.f64[0];
@@ -6029,7 +6029,7 @@ static void SSEOP(haddpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 7c
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]+XMM(d).f64[1];
@@ -6050,7 +6050,7 @@ static void SSEOP(hsubpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 7d
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                XMM(d).f64[0]=XMM(d).f64[0]-XMM(d).f64[1];
@@ -6071,7 +6071,7 @@ static void SSEOP(sqrtpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 51
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                XMM(d).f64[0]=sqrt(src.f64[0]);
@@ -6089,7 +6089,7 @@ static void SSEOP(cvtpi2pd_r128_rm64)(i386_state* cpustate)  // Opcode 66 0f 2a
                XMM((modrm >> 3) & 0x7).f64[1] = (double)MMX(modrm & 0x7).i[1];
        } else {
                MMX_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READMMX(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).f64[0] = (double)r.i[0];
                XMM((modrm >> 3) & 0x7).f64[1] = (double)r.i[1];
@@ -6106,7 +6106,7 @@ static void SSEOP(cvttpd2pi_r64_rm128)(i386_state* cpustate)  // Opcode 66 0f 2c
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                MMX((modrm >> 3) & 0x7).i[0] = r.f64[0];
                MMX((modrm >> 3) & 0x7).i[1] = r.f64[1];
@@ -6123,7 +6123,7 @@ static void SSEOP(cvtpd2pi_r64_rm128)(i386_state* cpustate)  // Opcode 66 0f 2d
                MMX((modrm >> 3) & 0x7).i[1] = XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                MMX((modrm >> 3) & 0x7).i[0] = r.f64[0];
                MMX((modrm >> 3) & 0x7).i[1] = r.f64[1];
@@ -6140,7 +6140,7 @@ static void SSEOP(cvtpd2ps_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5a
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).f[0] = (float)r.f64[0];
                XMM((modrm >> 3) & 0x7).f[1] = (float)r.f64[1];
@@ -6159,7 +6159,7 @@ static void SSEOP(cvtps2dq_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5b
                XMM((modrm >> 3) & 0x7).i[3] = XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG r;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, r);
                XMM((modrm >> 3) & 0x7).i[0] = r.f[0];
                XMM((modrm >> 3) & 0x7).i[1] = r.f[1];
@@ -6177,7 +6177,7 @@ static void SSEOP(addpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 58
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] + XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] + src.f64[1];
@@ -6193,7 +6193,7 @@ static void SSEOP(mulpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 59
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] * XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] * src.f64[1];
@@ -6209,7 +6209,7 @@ static void SSEOP(subpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5c
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] - XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] - src.f64[1];
@@ -6225,7 +6225,7 @@ static void SSEOP(minpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5d
                XMM((modrm >> 3) & 0x7).f64[1] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[1], XMM(modrm & 0x7).f64[1]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
                XMM((modrm >> 3) & 0x7).f64[1] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[1], src.f64[1]);
@@ -6241,7 +6241,7 @@ static void SSEOP(divpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5e
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] / XMM(modrm & 0x7).f64[1];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / src.f64[0];
                XMM((modrm >> 3) & 0x7).f64[1] = XMM((modrm >> 3) & 0x7).f64[1] / src.f64[1];
@@ -6257,7 +6257,7 @@ static void SSEOP(maxpd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 5f
                XMM((modrm >> 3) & 0x7).f64[1] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[1], XMM(modrm & 0x7).f64[1]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
                XMM((modrm >> 3) & 0x7).f64[1] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[1], src.f64[1]);
@@ -6273,7 +6273,7 @@ static void SSEOP(movntpd_m128_r128)(i386_state* cpustate)  // Opcode 66 0f 2b
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
                // since cache is not implemented
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
                CYCLES(cpustate,1);     // TODO: correct cycle count
        }
@@ -6285,7 +6285,7 @@ static void SSEOP(movapd_r128_rm128)(i386_state* cpustate)  // Opcode 66 0f 28
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7) = XMM(modrm & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -6297,7 +6297,7 @@ static void SSEOP(movapd_rm128_r128)(i386_state* cpustate)  // Opcode 66 0f 29
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7) = XMM((modrm >> 3) & 0x7);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                WRITEXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -6309,7 +6309,7 @@ static void SSEOP(movsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 10
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        }
@@ -6322,7 +6322,7 @@ static void SSEOP(movsd_r128m64_r128)(i386_state* cpustate) // Opcode f2 0f 11
        if( modrm >= 0xc0 ) {
                XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                WRITEXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -6335,7 +6335,7 @@ static void SSEOP(movddup_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 12
                XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[0];
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, XMM((modrm >> 3) & 0x7));
                XMM((modrm >> 3) & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[0];
        }
@@ -6348,7 +6348,7 @@ static void SSEOP(cvtsi2sd_r128_rm32)(i386_state* cpustate) // Opcode f2 0f 2a
        if( modrm >= 0xc0 ) {
                XMM((modrm >> 3) & 0x7).f64[0] = (INT32)LOAD_RM32(modrm);
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 4);
                XMM((modrm >> 3) & 0x7).f64[0] = (INT32)READ32(cpustate,ea);
        }
        CYCLES(cpustate,1);     // TODO: correct cycle count
@@ -6362,7 +6362,7 @@ static void SSEOP(cvttsd2si_r32_r128m64)(i386_state* cpustate) // Opcode f2 0f 2
                src = (INT32)XMM(modrm & 0x7).f64[0];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, t);
                src = (INT32)t.f64[0];
        }
@@ -6378,7 +6378,7 @@ static void SSEOP(cvtsd2si_r32_r128m64)(i386_state* cpustate) // Opcode f2 0f 2d
                src = (INT32)XMM(modrm & 0x7).f64[0];
        } else { // otherwise is a memory address
                XMM_REG t;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, t);
                src = (INT32)t.f64[0];
        }
@@ -6397,7 +6397,7 @@ static void SSEOP(sqrtsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 51
        } else {
                XMM_REG src;
                int d;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                XMM(d).f64[0]=sqrt(src.f64[0]);
@@ -6412,7 +6412,7 @@ static void SSEOP(addsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 58
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] + src.f64[0];
        }
@@ -6426,7 +6426,7 @@ static void SSEOP(mulsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 59
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] * src.f64[0];
        }
@@ -6440,7 +6440,7 @@ static void SSEOP(cvtsd2ss_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 5
                XMM((modrm >> 3) & 0x7).f[0] = XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                READXMM_LO64(cpustate, ea, s);
                XMM((modrm >> 3) & 0x7).f[0] = s.f64[0];
        }
@@ -6454,7 +6454,7 @@ static void SSEOP(subsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 5c
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] - src.f64[0];
        }
@@ -6468,7 +6468,7 @@ static void SSEOP(minsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 5d
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], XMM(modrm & 0x7).f64[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_min_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
        }
@@ -6482,7 +6482,7 @@ static void SSEOP(divsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 5e
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / XMM(modrm & 0x7).f64[0];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = XMM((modrm >> 3) & 0x7).f64[0] / src.f64[0];
        }
@@ -6496,7 +6496,7 @@ static void SSEOP(maxsd_r128_r128m64)(i386_state* cpustate) // Opcode f2 0f 5f
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], XMM(modrm & 0x7).f64[0]);
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f64[0] = sse_max_double(XMM((modrm >> 3) & 0x7).f64[0], src.f64[0]);
        }
@@ -6523,7 +6523,7 @@ static void SSEOP(haddps_r128_rm128)(i386_state* cpustate) // Opcode f2 0f 7c
                XMM_REG src;
                int d;
                float f1, f2;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                f1=XMM(d).f[0]+XMM(d).f[1];
@@ -6556,7 +6556,7 @@ static void SSEOP(hsubps_r128_rm128)(i386_state* cpustate) // Opcode f2 0f 7d
                XMM_REG src;
                int d;
                float f1, f2;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                d=(modrm >> 3) & 0x7;
                READXMM(cpustate, ea, src);
                f1=XMM(d).f[0]-XMM(d).f[1];
@@ -6581,7 +6581,7 @@ static void SSEOP(cmpsd_r128_r128m64_i8)(i386_state* cpustate) // Opcode f2 0f c
        } else {
                int d;
                XMM_REG s;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 8);
                UINT8 imm8 = FETCH(cpustate);
                READXMM_LO64(cpustate, ea, s);
                d=(modrm >> 3) & 0x7;
@@ -6600,7 +6600,7 @@ static void SSEOP(addsubps_r128_rm128)(i386_state* cpustate) // Opcode f2 0f d0
                XMM((modrm >> 3) & 0x7).f[3]=XMM((modrm >> 3) & 0x7).f[3] + XMM(modrm & 0x7).f[3];
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).f[0]=XMM((modrm >> 3) & 0x7).f[0] - src.f[0];
                XMM((modrm >> 3) & 0x7).f[1]=XMM((modrm >> 3) & 0x7).f[1] + src.f[1];
@@ -6632,7 +6632,7 @@ static void SSEOP(cvtpd2dq_r128_rm128)(i386_state* cpustate) // Opcode f2 0f e6
                XMM((modrm >> 3) & 0x7).q[1] = 0;
        } else {
                XMM_REG src;
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, src);
                XMM((modrm >> 3) & 0x7).i[0]=(INT32)src.f64[0];
                XMM((modrm >> 3) & 0x7).i[1]=(INT32)src.f64[1];
@@ -6648,7 +6648,7 @@ static void SSEOP(lddqu_r128_m128)(i386_state* cpustate) // Opcode f2 0f f0
                // unsupported by cpu
                CYCLES(cpustate,1);     // TODO: correct cycle count
        } else {
-               UINT32 ea = GetEA(cpustate,modrm, 0);
+               UINT32 ea = GetEA(cpustate,modrm, 0, 16);
                READXMM(cpustate, ea, XMM((modrm >> 3) & 0x7));
        }
 }
index 6a65674..1e1b6a2 100644 (file)
@@ -2,5 +2,7 @@ Based on MAME 0.152.
 Fixes in MAME 0.154 to 0.197 are applied.
 
 cycle_table_rm/pm are changed from dynamic array to static array.
+
 convert char to _TCHAR in disassembler.
-mov_r16_rm16 is modified to check limit for NEC PC-9801RA's ITF routine.
+
+i386_limit_check is improved to consider data size.
index d75c6e8..e6ffa0c 100644 (file)
@@ -1,5 +1,5 @@
 // license:BSD-3-Clause
-// copyright-holders:Philp Bennett
+// copyright-holders:Philip Bennett
 /***************************************************************************
 
     x87 FPU emulation
@@ -496,7 +496,7 @@ void x87_fadd_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -531,7 +531,7 @@ void x87_fadd_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -668,7 +668,7 @@ void x87_fiadd_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -703,7 +703,7 @@ void x87_fiadd_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -745,7 +745,7 @@ void x87_fsub_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -780,7 +780,7 @@ void x87_fsub_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -917,7 +917,7 @@ void x87_fisub_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -952,7 +952,7 @@ void x87_fisub_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -994,7 +994,7 @@ void x87_fsubr_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1029,7 +1029,7 @@ void x87_fsubr_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1166,7 +1166,7 @@ void x87_fisubr_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1201,7 +1201,7 @@ void x87_fisubr_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1243,7 +1243,7 @@ void x87_fdiv_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1278,7 +1278,7 @@ void x87_fdiv_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1419,7 +1419,7 @@ void x87_fidiv_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1454,7 +1454,7 @@ void x87_fidiv_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1462,7 +1462,7 @@ void x87_fidiv_m16int(i386_state *cpustate, UINT8 modrm)
        }
        else
        {
-               INT16 m16int = READ32(cpustate, ea);
+               INT16 m16int = READ16(cpustate, ea);
 
                floatx80 a = ST(0);
                floatx80 b = int32_to_floatx80(m16int);
@@ -1496,7 +1496,7 @@ void x87_fdivr_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1531,7 +1531,7 @@ void x87_fdivr_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1673,7 +1673,7 @@ void x87_fidivr_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1708,7 +1708,7 @@ void x87_fidivr_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1716,7 +1716,7 @@ void x87_fidivr_m16int(i386_state *cpustate, UINT8 modrm)
        }
        else
        {
-               INT16 m16int = READ32(cpustate, ea);
+               INT16 m16int = READ16(cpustate, ea);
 
                floatx80 a = int32_to_floatx80(m16int);
                floatx80 b = ST(0);
@@ -1750,7 +1750,7 @@ void x87_fmul_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1784,7 +1784,7 @@ void x87_fmul_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1917,7 +1917,7 @@ void x87_fimul_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -1951,7 +1951,7 @@ void x87_fimul_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 result;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -2592,7 +2592,7 @@ void x87_fld_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (x87_dec_stack(cpustate))
        {
                UINT32 m32real = READ32(cpustate, ea);
@@ -2622,7 +2622,7 @@ void x87_fld_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (x87_dec_stack(cpustate))
        {
                UINT64 m64real = READ64(cpustate, ea);
@@ -2652,7 +2652,7 @@ void x87_fld_m80real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 10);
        if (x87_dec_stack(cpustate))
        {
                cpustate->x87_sw &= ~X87_SW_C1;
@@ -2693,7 +2693,7 @@ void x87_fild_m16int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (!x87_dec_stack(cpustate))
        {
                value = fx80_inan;
@@ -2716,7 +2716,7 @@ void x87_fild_m32int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (!x87_dec_stack(cpustate))
        {
                value = fx80_inan;
@@ -2739,7 +2739,7 @@ void x87_fild_m64int(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (!x87_dec_stack(cpustate))
        {
                value = fx80_inan;
@@ -2762,7 +2762,7 @@ void x87_fbld(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 10);
        if (!x87_dec_stack(cpustate))
        {
                value = fx80_inan;
@@ -2807,7 +2807,7 @@ void x87_fst_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -2832,7 +2832,7 @@ void x87_fst_m64real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -2879,7 +2879,7 @@ void x87_fstp_m32real(i386_state *cpustate, UINT8 modrm)
 {
        floatx80 value;
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -2917,7 +2917,7 @@ void x87_fstp_m64real(i386_state *cpustate, UINT8 modrm)
        }
 
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 8);
        if (x87_check_exceptions(cpustate))
        {
                UINT64 m64real = floatx80_to_float64(value);
@@ -2943,7 +2943,7 @@ void x87_fstp_m80real(i386_state *cpustate, UINT8 modrm)
                value = ST(0);
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 10);
        if (x87_check_exceptions(cpustate))
        {
                WRITE80(cpustate, ea, value);
@@ -3002,7 +3002,7 @@ void x87_fist_m16int(i386_state *cpustate, UINT8 modrm)
                        m16int = -32768;
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 2);
        if (x87_check_exceptions(cpustate))
        {
                WRITE16(cpustate, ea, m16int);
@@ -3035,7 +3035,7 @@ void x87_fist_m32int(i386_state *cpustate, UINT8 modrm)
                        m32int = 0x80000000;
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 4);
        if (x87_check_exceptions(cpustate))
        {
                WRITE32(cpustate, ea, m32int);
@@ -3068,7 +3068,7 @@ void x87_fistp_m16int(i386_state *cpustate, UINT8 modrm)
                        m16int = (UINT16)0x8000;
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 2);
        if (x87_check_exceptions(cpustate))
        {
                WRITE16(cpustate, ea, m16int);
@@ -3102,7 +3102,7 @@ void x87_fistp_m32int(i386_state *cpustate, UINT8 modrm)
                        m32int = 0x80000000;
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 4);
        if (x87_check_exceptions(cpustate))
        {
                WRITE32(cpustate, ea, m32int);
@@ -3136,7 +3136,7 @@ void x87_fistp_m64int(i386_state *cpustate, UINT8 modrm)
                        m64int = U64(0x8000000000000000);
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 8);
        if (x87_check_exceptions(cpustate))
        {
                WRITE64(cpustate, ea, m64int);
@@ -3171,7 +3171,7 @@ void x87_fbstp(i386_state *cpustate, UINT8 modrm)
                result.high |= ST(0).high & 0x8000;
        }
 
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 10);
        if (x87_check_exceptions(cpustate))
        {
                WRITE80(cpustate, ea, result);
@@ -3645,7 +3645,7 @@ void x87_fxam(i386_state *cpustate, UINT8 modrm)
 
 void x87_ficom_m16int(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3682,7 +3682,7 @@ void x87_ficom_m16int(i386_state *cpustate, UINT8 modrm)
 
 void x87_ficom_m32int(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3719,7 +3719,7 @@ void x87_ficom_m32int(i386_state *cpustate, UINT8 modrm)
 
 void x87_ficomp_m16int(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3757,7 +3757,7 @@ void x87_ficomp_m16int(i386_state *cpustate, UINT8 modrm)
 
 void x87_ficomp_m32int(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3796,7 +3796,7 @@ void x87_ficomp_m32int(i386_state *cpustate, UINT8 modrm)
 
 void x87_fcom_m32real(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3833,7 +3833,7 @@ void x87_fcom_m32real(i386_state *cpustate, UINT8 modrm)
 
 void x87_fcom_m64real(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3906,7 +3906,7 @@ void x87_fcom_sti(i386_state *cpustate, UINT8 modrm)
 
 void x87_fcomp_m32real(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 4);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -3944,7 +3944,7 @@ void x87_fcomp_m32real(i386_state *cpustate, UINT8 modrm)
 
 void x87_fcomp_m64real(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 8);
        if (X87_IS_ST_EMPTY(0))
        {
                x87_set_stack_underflow(cpustate);
@@ -4432,7 +4432,7 @@ void x87_finit(i386_state *cpustate, UINT8 modrm)
 
 void x87_fldcw(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 2);
        UINT16 cw = READ16(cpustate, ea);
 
        x87_write_cw(cpustate, cw);
@@ -4444,7 +4444,7 @@ void x87_fldcw(i386_state *cpustate, UINT8 modrm)
 
 void x87_fstcw(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 2);
        WRITE16(cpustate, ea, cpustate->x87_cw);
 
        CYCLES(cpustate, 3);
@@ -4453,11 +4453,10 @@ void x87_fstcw(i386_state *cpustate, UINT8 modrm)
 void x87_fldenv(i386_state *cpustate, UINT8 modrm)
 {
        // TODO: Pointers and selectors
-       UINT32 ea = GetEA(cpustate, modrm, 0);
-
        if (cpustate->operand_size)
        {
                // 32-bit real/protected mode
+               UINT32 ea = GetEA(cpustate, modrm, 0, 10);
                x87_write_cw(cpustate, READ16(cpustate, ea));
                cpustate->x87_sw = READ16(cpustate, ea + 4);
                cpustate->x87_tw = READ16(cpustate, ea + 8);
@@ -4465,6 +4464,7 @@ void x87_fldenv(i386_state *cpustate, UINT8 modrm)
        else
        {
                // 16-bit real/protected mode
+               UINT32 ea = GetEA(cpustate, modrm, 0, 6);
                x87_write_cw(cpustate, READ16(cpustate, ea));
                cpustate->x87_sw = READ16(cpustate, ea + 2);
                cpustate->x87_tw = READ16(cpustate, ea + 4);
@@ -4477,12 +4477,13 @@ void x87_fldenv(i386_state *cpustate, UINT8 modrm)
 
 void x87_fstenv(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea;
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
        {
                case 0: // 16-bit real mode
+                       ea = GetEA(cpustate, modrm, 1, 6);
                        WRITE16(cpustate, ea + 0, cpustate->x87_cw);
                        WRITE16(cpustate, ea + 2, cpustate->x87_sw);
                        WRITE16(cpustate, ea + 4, cpustate->x87_tw);
@@ -4492,7 +4493,8 @@ void x87_fstenv(i386_state *cpustate, UINT8 modrm)
 //          WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4);
                        break;
                case 1: // 16-bit protected mode
-                       WRITE16(cpustate,ea + 0, cpustate->x87_cw);
+                       ea = GetEA(cpustate, modrm, 1, 6);
+                       WRITE16(cpustate, ea + 0, cpustate->x87_cw);
                        WRITE16(cpustate,ea + 2, cpustate->x87_sw);
                        WRITE16(cpustate,ea + 4, cpustate->x87_tw);
 //          WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff);
@@ -4501,6 +4503,7 @@ void x87_fstenv(i386_state *cpustate, UINT8 modrm)
 //          WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4);
                        break;
                case 2: // 32-bit real mode
+                       ea = GetEA(cpustate, modrm, 1, 10);
                        WRITE16(cpustate, ea + 0, cpustate->x87_cw);
                        WRITE16(cpustate, ea + 4, cpustate->x87_sw);
                        WRITE16(cpustate, ea + 8, cpustate->x87_tw);
@@ -4511,7 +4514,8 @@ void x87_fstenv(i386_state *cpustate, UINT8 modrm)
 //          WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12);
                        break;
                case 3: // 32-bit protected mode
-                       WRITE16(cpustate, ea + 0,  cpustate->x87_cw);
+                       ea = GetEA(cpustate, modrm, 1, 10);
+                       WRITE16(cpustate, ea + 0, cpustate->x87_cw);
                        WRITE16(cpustate, ea + 4,  cpustate->x87_sw);
                        WRITE16(cpustate, ea + 8,  cpustate->x87_tw);
 //          WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr);
@@ -4527,7 +4531,7 @@ void x87_fstenv(i386_state *cpustate, UINT8 modrm)
 
 void x87_fsave(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 80);
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
@@ -4583,7 +4587,7 @@ void x87_fsave(i386_state *cpustate, UINT8 modrm)
 
 void x87_frstor(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 0);
+       UINT32 ea = GetEA(cpustate, modrm, 0, 80);
 
        // TODO: Pointers and selectors
        switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1)
@@ -4698,7 +4702,7 @@ void x87_fstsw_ax(i386_state *cpustate, UINT8 modrm)
 
 void x87_fstsw_m2byte(i386_state *cpustate, UINT8 modrm)
 {
-       UINT32 ea = GetEA(cpustate, modrm, 1);
+       UINT32 ea = GetEA(cpustate, modrm, 1, 2);
 
        WRITE16(cpustate, ea, cpustate->x87_sw);
 
index 4e1d806..01baecc 100644 (file)
@@ -165,8 +165,8 @@ void MEMORY::initialize()
        palette_pc[15] = RGB_COLOR(0xFF,0xFF,0xFF); // COL080                   = FFFFFF                        ;mk2\81\94\92
        
        // register event
-       register_vline_event(this);
 #endif
+       register_vline_event(this);
 }
 
 void MEMORY::reset()
@@ -253,9 +253,9 @@ void MEMORY::reset()
        portF1 = 0xdd;
        CRTMode1 = CRTMode2 = CRTMode3 = 0;
        CSS3=CSS2=CSS1=0;
-       CGSW93 = CRTKILL = 0;
        CurKANJIROM = KANJIROM;
 #endif
+       CGSW93 = CRTKILL = 0;
 }
 
 void MEMORY::write_data8(uint32_t addr, uint32_t data)
@@ -281,6 +281,68 @@ uint32_t MEMORY::read_data8(uint32_t addr)
        return(RdMem[addr >> 13][addr & 0x1FFF]);
 }
 
+void MEMORY::write_data8w(uint32_t addr, uint32_t data, int *wait)
+{
+#ifdef _PC6001
+       *wait = addr < 0x8000 ? 1 : 0;
+#else
+       bool is_rom;
+       uint32_t portF3 = d_timer->read_io8(0xf3);
+#if defined(_PC6601SR) || defined(_PC6001MK2SR)
+       if (static_cast<VM *>(vm)->sr_mode) {
+               is_rom = (port60[8 + (addr >> 13)] & 0xf0) > 0x20 ? true: false;
+       } else
+#endif
+       {
+               is_rom = EnWrite[addr >> 14] ? false : true;
+       }
+       *wait = is_rom && (portF3 & 0x40) || !is_rom && (portF3 & 0x20) ? 1 : 0;
+#endif
+       write_data8(addr, data);
+}
+
+uint32_t MEMORY::read_data8w(uint32_t addr, int *wait)
+{
+#ifdef _PC6001
+       *wait = addr < 0x8000 ? 1 : 0;
+#else
+       bool is_rom;
+       uint32_t portF3 = d_timer->read_io8(0xf3);
+#if defined(_PC6601SR) || defined(_PC6001MK2SR)
+       if (static_cast<VM *>(vm)->sr_mode) {
+               is_rom = (port60[addr >> 13] & 0xf0) > 0x20 ? true : false;
+       } else
+#endif
+       {
+               if (CGSW93 && 0x6000 <= addr && addr < 0x8000) {
+                       is_rom = true;
+               } else if (addr < 0x4000) {
+                       is_rom = (portF0 & 0x0f) == 0x0d || (portF0 & 0x0f) == 0x0e ? false : true;
+               } else if (addr < 0x8000) {
+                       is_rom = (portF0 & 0xf0) == 0xd0 || (portF0 & 0xf0) == 0xe0 ? false : true;
+               } else if (addr < 0xc000) {
+                       is_rom = (portF1 & 0x0f) == 0x0d || (portF1 & 0x0f) == 0x0e ? false : true;
+               } else {
+                       is_rom = (portF1 & 0xf0) == 0xd0 || (portF1 & 0xf0) == 0xe0 ? false : true;
+               }
+       }
+       *wait = is_rom && (portF3 & 0x40) || !is_rom && (portF3 & 0x20) ? 1 : 0;
+#endif
+       return read_data8(addr);
+}
+
+uint32_t MEMORY::fetch_op(uint32_t addr, int *wait)
+{
+#ifndef _PC6001
+       uint32_t portF3 = d_timer->read_io8(0xf3);
+       if ((portF3 & 0x80) == 0) {
+               return read_data8w(addr, wait);
+       }
+#endif
+       *wait = 1;
+       return read_data8(addr);
+}
+
 void MEMORY::write_io8(uint32_t addr, uint32_t data)
 {
        unsigned int VRAMHead[2][4] = {
@@ -603,6 +665,19 @@ uint32_t MEMORY::read_io8(uint32_t addr)
        }
        return(Value);
 }
+#endif
+
+void MEMORY::write_io8w(uint32_t addr, uint32_t data, int* wait)
+{
+       *wait = (addr & 0xf0) == 0xa0 ? 1 : 0;
+       write_io8(addr, data);
+}
+
+uint32_t MEMORY::read_io8w(uint32_t addr, int* wait)
+{
+       *wait = (addr & 0xf0) == 0xa0 ? 1 : 0;
+       return read_io8(addr);
+}
 
 #define EVENT_HBLANK   1
 
@@ -619,11 +694,18 @@ void MEMORY::event_vline(int v, int clock)
        } else
 #endif
        {
-               if(!CRTKILL) {
-                       if(v < (CRTMode1 ? 200 : 192)) {
+               if (!CRTKILL) {
+#ifdef _PC6001
+                       if (v < 192) {
+                               d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
+                               register_event_by_clock(this, EVENT_HBLANK, (double)CPU_CLOCKS / FRAMES_PER_SEC / LINES_PER_FRAME * 296 / 455, false, NULL);
+                       }
+#else
+                       if (v < (CRTMode1 ? 200 : 192)) {
                                d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
-                               register_event_by_clock(this, EVENT_HBLANK, CPU_CLOCKS /  FRAMES_PER_SEC / LINES_PER_FRAME * 368 / 456, false, NULL);
+                               register_event_by_clock(this, EVENT_HBLANK, (double)CPU_CLOCKS / FRAMES_PER_SEC / LINES_PER_FRAME * (CRTMode1 ? 368 : 304) / 456, false, NULL);
                        }
+#endif
                }
        }
 }
@@ -634,7 +716,6 @@ void MEMORY::event_callback(int event_id, int err)
                d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 0);
        }
 }
-#endif
 
 void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
 {
@@ -651,8 +732,11 @@ void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
                } else {
                        CGSW93=1; RdMem[3]=CGROM;
                }
-               CRTKILL = (data & 2) ? 0 : 1;
 #endif
+               CRTKILL = (data & 2) ? 0 : 1;
+               if (CRTKILL) {
+                       d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 0);
+               }
        }
 }
 
index ab95f02..36f618f 100644 (file)
@@ -91,8 +91,8 @@ private:
        uint8_t EnWrite[4];                     // MEMORY MAPPING WRITE ENABLE [N60/N66]
        uint8_t CGSW93;
        bool inserted;
-#ifndef _PC6001
        uint8_t CRTKILL;
+#ifndef _PC6001
 //     uint8_t VOICEROM[0x4000];
 //     uint8_t KANJIROM[0x8000];
        uint8_t *CurKANJIROM;
@@ -181,12 +181,17 @@ public:
        void reset();
        void write_data8(uint32_t addr, uint32_t data);
        uint32_t read_data8(uint32_t addr);
+       void write_data8w(uint32_t addr, uint32_t data, int *wait);
+       uint32_t read_data8w(uint32_t addr, int *wait);
+       uint32_t fetch_op(uint32_t addr, int *wait);
        void write_io8(uint32_t addr, uint32_t data);
 #ifndef _PC6001
        uint32_t read_io8(uint32_t addr);
+#endif
+       void write_io8w(uint32_t addr, uint32_t data, int* wait);
+       uint32_t read_io8w(uint32_t addr, int* wait);
        void event_vline(int v, int clock);
        void event_callback(int event_id, int err);
-#endif
        void write_signal(int id, uint32_t data, uint32_t mask);
        bool process_state(FILEIO* state_fio, bool loading);
        
index 82af8fa..098ae2f 100644 (file)
@@ -130,7 +130,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
        display->set_vram_ptr(memory->get_vram());
        display->set_context_timer(timer);
        vdp->load_font_image(create_local_path(_T("CGROM60.60")));
-       vdp->set_context_cpu(cpu);
+//     vdp->set_context_cpu(cpu);
        pio_sub->set_context_port_c(vdp, SIG_MC6847_ENABLE, 0x02, 0);   // CRTKILL
 #else
        voice = new UPD7752(this, emu);
index 3650d61..e0235ef 100644 (file)
@@ -22,6 +22,7 @@
 #define SCREEN_HEIGHT          192
 #define CPU_CLOCKS             3993600
 #define HAS_AY_3_8910
+#define TIMER_PERIOD   (8192. / CPU_CLOCKS * 1000000)
 #elif defined(_PC6001MK2)
 #define DEVICE_NAME            "NEC PC-6001mkII"
 #define CONFIG_NAME            "pc6001mk2"
@@ -29,8 +30,9 @@
 #define SCREEN_WIDTH           640
 #define SCREEN_HEIGHT          400
 #define WINDOW_HEIGHT_ASPECT   480
-#define CPU_CLOCKS             4000000
+#define CPU_CLOCKS             3993600
 #define HAS_AY_3_8910
+#define TIMER_PERIOD   (8192. / CPU_CLOCKS * 1000000)
 #elif defined(_PC6001MK2SR)
 #define DEVICE_NAME            "NEC PC-6001mkIISR"
 #define CONFIG_NAME            "pc6001mk2sr"
@@ -39,6 +41,7 @@
 #define SCREEN_HEIGHT          400
 #define WINDOW_HEIGHT_ASPECT   480
 #define CPU_CLOCKS             3580000
+#define TIMER_PERIOD   (2000/.999)
 #elif defined(_PC6601)
 #define DEVICE_NAME            "NEC PC-6601"
 #define CONFIG_NAME            "pc6601"
@@ -48,6 +51,7 @@
 #define WINDOW_HEIGHT_ASPECT   480
 #define CPU_CLOCKS             4000000
 #define HAS_AY_3_8910
+#define TIMER_PERIOD   (8192. / CPU_CLOCKS * 1000000)
 #elif defined(_PC6601SR)
 #define DEVICE_NAME            "NEC PC-6601SR"
 #define CONFIG_NAME            "pc6601sr"
 #define SCREEN_HEIGHT          400
 #define WINDOW_HEIGHT_ASPECT   480
 #define CPU_CLOCKS             3580000
+#define TIMER_PERIOD   (2000 / .999)
 #endif
 
+//memory wait
+#define Z80_MEMORY_WAIT
+#define Z80_IO_WAIT
+
 // device informations for virtual machine
 #define FRAMES_PER_SEC         60
 #define LINES_PER_FRAME                262
index 5f66602..1c516e9 100644 (file)
@@ -1003,10 +1003,9 @@ void PSUB::write_io8(uint32_t addr, uint32_t data)
                                StrigEventID = -1;
                        }
 //                     register_event(this, EVENT_STRIG, 3000, false, &StrigEventID); // 3msec
-                       register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1nsec
+                       register_event(this, EVENT_STRIG, 100, false, &StrigEventID); // 0.1msec
                }
                else if (data==0x3e || data==0x3d) { // \82P\81|\82P\81j0x3E \8eó\90M(1200baud\81j\81@\82Ü\82½\82Í\81@0x3D \8eó\90M(600baud\81j
-                       CasMode=CAS_NONE;
                        CasBaud=(data==0x3e)?1200:600;
                }
                else if (data==0x39) { ///
@@ -1016,7 +1015,6 @@ void PSUB::write_io8(uint32_t addr, uint32_t data)
                        CasMode=CAS_SAVEBYTE;
                }
                else if (data==0x1e || data==0x1d) { // \82P\81|\82P\81j0x1E \8eó\90M(1200baud\81j\81@\82Ü\82½\82Í\81@0x1D \8eó\90M(600baud\81j
-                       CasMode=CAS_NONE;
                        CasBaud=(data==0x1e)?1200:600;
                }
                else if (data==0x1a && CasMode!=CAS_NONE) { /* CMT LOAD STOP */
@@ -1024,7 +1022,7 @@ void PSUB::write_io8(uint32_t addr, uint32_t data)
                }
                /* CMT LOAD OPEN(0x1E,0x19(1200baud)/0x1D,0x19(600baud)) */
                else if (data==0x19) {
-                       if(play /*&& CasBaud == FileBaud*/) {
+                       if (play && CasMode != CAS_LOADING /*&& CasBaud == FileBaud*/) {
                                register_event(this, EVENT_CASSETTE, 1000000.0 / (CasBaud / 12), false, NULL);
                        }
                        CasRecv=0xff;
index da8ef8c..b56d39c 100644 (file)
@@ -132,14 +132,14 @@ void TIMER::event_callback(int event_id, int err)
                timer_id = -1;
                // register next event
 #ifdef _PC6001
-               register_event(this, EVENT_TIMER, 2000.0, false, &timer_id);
+               register_event(this, EVENT_TIMER, TIMER_PERIOD, false, &timer_id);
 #else
 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
                if(static_cast<VM *>(vm)->sr_mode) {
-                       register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
+                       register_event(this, EVENT_TIMER, TIMER_PERIOD * (portF6 + 1.) / 0x80, false, &timer_id);
                } else
 #endif
-               register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
+               register_event(this, EVENT_TIMER, TIMER_PERIOD * (portF6 + 1.) / 4, false, &timer_id);
 #endif
        }
 }
@@ -157,14 +157,14 @@ void TIMER::set_portB0(uint32_t data)
                if(timer_id == -1) {
 #ifdef _PC6001
                        // first period is 1msec
-                       register_event(this, EVENT_TIMER, 1000.0, false, &timer_id);
+                       register_event(this, EVENT_TIMER, TIMER_PERIOD / 2, false, &timer_id);
 #else
 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
                        if(static_cast<VM *>(vm)->sr_mode) {
-                               register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
+                               register_event(this, EVENT_TIMER, TIMER_PERIOD * (portF6 + 1.) / 0x80, false, &timer_id);
                        } else
 #endif
-                       register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
+                       register_event(this, EVENT_TIMER, TIMER_PERIOD * (portF6 + 1.) / 4, false, &timer_id);
 #endif
                }
        }
index 93e7109..8033ea6 100644 (file)
@@ -1715,6 +1715,68 @@ void PC88::event_vline(int v, int clock)
                request_intr(IRQ_VRTC, true);
                update_gvram_wait();
        }
+       // update palette
+#if !defined(_PC8001SR)
+       if(v < (disp_line <= 200 ? 200 : 400)) {
+#else
+       if(v < 200) {
+#endif
+               if(update_palette) {
+                       static const int pex[8] = {
+                               0,  36,  73, 109, 146, 182, 219, 255 // from m88
+                       };
+#if defined(_PC8001SR)
+                       if(config.boot_mode != MODE_PC80_V2) {
+                               if(Port31_V1_320x200) {
+                                       for(int i = 0; i < 3; i++) {
+                                               uint8_t b = (port[0x31] & 4) ? 7 : 0;
+                                               uint8_t r = (i          & 1) ? 7 : 0;
+                                               uint8_t g = (i          & 2) ? 7 : 0;
+                                               palette_graph_pc[i] = RGB_COLOR(pex[r], pex[g], pex[b]);
+                                       }
+                                       palette_graph_pc[3] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
+                               } else if(Port31_V1_MONO) {
+                                       palette_graph_pc[0] = 0;
+                                       palette_graph_pc[1] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
+                               } else {
+                                       for(int i = 1; i < 8; i++) {
+                                               palette_graph_pc[i] = RGB_COLOR((i & 2) ? 255 : 0, (i & 4) ? 255 : 0, (i & 1) ? 255 : 0);
+                                       }
+                                       palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
+                               }
+                               if(Port31_V1_320x200) {
+                                       palette_text_pc[0] = 0;
+                               } else {
+                                       palette_text_pc[0] = palette_graph_pc[0];
+                               }
+                       } else {
+                               for(int i = 0; i < 8; i++) {
+                                       uint8_t b = (port[0x54 + i] & 1) ? 7 : 0;
+                                       uint8_t r = (port[0x54 + i] & 2) ? 7 : 0;
+                                       uint8_t g = (port[0x54 + i] & 4) ? 7 : 0;
+                                       palette_graph_pc[i] = RGB_COLOR(pex[r], pex[g], pex[b]);
+                               }
+                               if(!Port31_HCOLOR) {
+                                       palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
+                               }
+                               palette_text_pc[0] = palette_graph_pc[0];
+                       }
+#else
+                       for(int i = 0; i < 8; i++) {
+                               palette_graph_pc[i] = RGB_COLOR(pex[palette[i].r], pex[palette[i].g], pex[palette[i].b]);
+                       }
+                       if(!Port31_HCOLOR && !Port32_PMODE) {
+                               palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
+                       }
+                       palette_text_pc[0] = palette_graph_pc[0];
+#endif
+                       update_palette = false;
+               }
+               for(int i = 0; i < 9; i++) {
+                       line_palette_text_pc[v][i] = palette_text_pc[i];
+                       line_palette_graph_pc[v][i] = palette_graph_pc[i];
+               }
+       }
 }
 
 void PC88::key_down(int code, bool repeat)
@@ -1900,67 +1962,20 @@ void PC88::draw_screen()
        }
 #endif
        
-       // update palette
-       if(update_palette) {
-               static const int pex[8] = {
-                       0,  36,  73, 109, 146, 182, 219, 255 // from m88
-               };
-#if defined(_PC8001SR)
-               if(config.boot_mode != MODE_PC80_V2) {
-                       if(Port31_V1_320x200) {
-                               for(int i = 0; i < 3; i++) {
-                                       uint8_t b = (port[0x31] & 4) ? 7 : 0;
-                                       uint8_t r = (i          & 1) ? 7 : 0;
-                                       uint8_t g = (i          & 2) ? 7 : 0;
-                                       palette_graph_pc[i] = RGB_COLOR(pex[r], pex[g], pex[b]);
-                               }
-                               palette_graph_pc[3] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
-                       } else if(Port31_V1_MONO) {
-                               palette_graph_pc[0] = 0;
-                               palette_graph_pc[1] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
-                       } else {
-                               for(int i = 1; i < 8; i++) {
-                                       palette_graph_pc[i] = RGB_COLOR((i & 2) ? 255 : 0, (i & 4) ? 255 : 0, (i & 1) ? 255 : 0);
-                               }
-                               palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
-                       }
-                       if(Port31_V1_320x200) {
-                               palette_text_pc[0] = 0;
-                       } else {
-                               palette_text_pc[0] = palette_graph_pc[0];
-                       }
-               } else {
-                       for(int i = 0; i < 8; i++) {
-                               uint8_t b = (port[0x54 + i] & 1) ? 7 : 0;
-                               uint8_t r = (port[0x54 + i] & 2) ? 7 : 0;
-                               uint8_t g = (port[0x54 + i] & 4) ? 7 : 0;
-                               palette_graph_pc[i] = RGB_COLOR(pex[r], pex[g], pex[b]);
-                       }
-                       if(!Port31_HCOLOR) {
-                               palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
-                       }
-                       palette_text_pc[0] = palette_graph_pc[0];
-               }
-#else
-               for(int i = 0; i < 8; i++) {
-                       palette_graph_pc[i] = RGB_COLOR(pex[palette[i].r], pex[palette[i].g], pex[palette[i].b]);
-               }
-               if(!Port31_HCOLOR && !Port32_PMODE) {
-                       palette_graph_pc[0] = RGB_COLOR(pex[palette[8].r], pex[palette[8].g], pex[palette[8].b]);
-               }
-               palette_text_pc[0] = palette_graph_pc[0];
-#endif
-               update_palette = false;
-       }
-       
        // set back color to black if cg screen is off in color mode
-       scrntype_t palette_text_back = palette_text_pc[0];
-       scrntype_t palette_graph_back = palette_graph_pc[0];
+#if !defined(_PC8001SR)
+       int disp_line = crtc.height * crtc.char_height;
+       int shift = (disp_line <= 200) ? 0 : 1;
        
-       if(!disp_color_graph) {
-               palette_text_pc[0] = palette_graph_pc[0] = 0;
+       for(int y = 0; y < (disp_line <= 200 ? 200 : 400); y++) {
+#else
+       for(int y = 0; y < 200; y++) {
+#endif
+               if(!disp_color_graph) {
+                       line_palette_text_pc[y][0] = line_palette_graph_pc[y][0] = 0;
+               }
+               line_palette_graph_pc[y][8] = /*line_palette_text_pc[y][8] = */line_palette_text_pc[y][0];
        }
-       palette_graph_pc[8] = /*palette_text_pc[8] = */palette_text_pc[0];
        
        // copy to screen buffer
 #if !defined(_PC8001SR)
@@ -1971,34 +1986,39 @@ void PC88::draw_screen()
                        scrntype_t* dest1 = emu->get_screen_buffer(y * 2 + 1);
                        uint8_t* src_t = text[y];
                        uint8_t* src_g = graph[y];
-                       
 #if defined(_PC8001SR)
+                       scrntype_t* pal_t = line_palette_text_pc[y];
+                       scrntype_t* pal_g = line_palette_graph_pc[y];
+                       
                        if(port[0x33] & 8) {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t g = src_g[x];
-                                       dest0[x] = g ? palette_graph_pc[g] : palette_text_pc[src_t[x]];
+                                       dest0[x] = g ? pal_g[g] : pal_t[src_t[x]];
                                }
                        } else {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest0[x] = t ? palette_text_pc[t] : palette_graph_pc[src_g[x]];
+                                       dest0[x] = t ? pal_t[t] : pal_g[src_g[x]];
                                }
                        }
 #else
+                       scrntype_t* pal_t = line_palette_text_pc[y << shift];
+                       scrntype_t* pal_g = line_palette_graph_pc[y << shift];
+                       
                        if(Port31_HCOLOR) {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest0[x] = t ? palette_text_pc[t] : palette_graph_pc[src_g[x]];
+                                       dest0[x] = t ? pal_t[t] : pal_g[src_g[x]];
                                }
                        } else if(Port32_PMODE) {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest0[x] = palette_graph_pc[t ? t : src_g[x]];
+                                       dest0[x] = pal_g[t ? t : src_g[x]];
                                }
                        } else {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest0[x] = palette_text_pc[t ? t : src_g[x]];
+                                       dest0[x] = pal_t[t ? t : src_g[x]];
                                }
                        }
 #endif
@@ -2017,32 +2037,30 @@ void PC88::draw_screen()
                        scrntype_t* dest = emu->get_screen_buffer(y);
                        uint8_t* src_t = text[y >> 1];
                        uint8_t* src_g = graph[y];
+                       scrntype_t* pal_t = line_palette_text_pc[y];
+                       scrntype_t* pal_g = line_palette_graph_pc[y];
                        
 //                     if(Port31_HCOLOR) {
 //                             for(int x = 0; x < 640; x++) {
 //                                     uint32_t t = src_t[x];
-//                                     dest[x] = t ? palette_text_pc[t] : palette_graph_pc[src_g[x]];
+//                                     dest[x] = t ? pal_t[t] : pal_g[src_g[x]];
 //                             }
 //                     } else
                        if(Port32_PMODE) {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest[x] = palette_graph_pc[t ? t : src_g[x]];
+                                       dest[x] = pal_g[t ? t : src_g[x]];
                                }
                        } else {
                                for(int x = 0; x < 640; x++) {
                                        uint32_t t = src_t[x];
-                                       dest[x] = palette_text_pc[t ? t : src_g[x]];
+                                       dest[x] = pal_t[t ? t : src_g[x]];
                                }
                        }
                }
                emu->screen_skip_line(false);
        }
 #endif
-       
-       // restore back color palette
-       palette_text_pc[0] = palette_text_back;
-       palette_graph_pc[0] = palette_graph_back;
 }
 
 /*
index 1f0e9fc..a818307 100644 (file)
@@ -190,6 +190,8 @@ private:
        uint8_t graph[400][640];
        scrntype_t palette_text_pc[9];  // 0 = back color for attrib mode, 8 = black
        scrntype_t palette_graph_pc[9];
+       scrntype_t line_palette_text_pc[400][9];
+       scrntype_t line_palette_graph_pc[400][9];
        
        void draw_text();
 #if defined(_PC8001SR)
index c091e95..c1822f4 100644 (file)
@@ -1604,7 +1604,7 @@ void VM::update_config()
        }
 }
 
-#define STATE_VERSION  13
+#define STATE_VERSION  14
 
 bool VM::process_state(FILEIO* state_fio, bool loading)
 {
index 46d2ba8..a62645f 100644 (file)
        #if !defined(SUPPORT_HIRESO)
                #define SUPPORT_BIOS_RAM
        #endif
+       // PC-9801-86
+       #define SUPPORT_PC98_OPNA
 #endif
 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
        #define MEMORY_ADDR_MAX         0x1000000       // 16MB
 #define MEMORY_BANK_SIZE               0x800
 #define IO_ADDR_MAX                    0x10000
 
-// PC-9801-86
-//#define SUPPORT_PC98_OPNA
-
 #if defined(_PC98DO) || defined(_PC98DOPLUS)
        #define MODE_PC98       0
        #define MODE_PC88_V1S   1
 #ifdef USE_SOUND_VOLUME
 static const _TCHAR *sound_device_caption[] = {
 #if defined(SUPPORT_PC98_OPNA)
-       _T("PC-9801-86 (FM)"), _T("PC-9801-86 (PSG)"), _T("PC-9801-86 (ADPCM)"), _T("PC-9801-86 (Rhythm)"),
+       _T("OPNA (FM)"), _T("OPNA (PSG)"), _T("OPNA (ADPCM)"), _T("OPNA (Rhythm)"),
 #else
-       _T("PC-9801-26 (FM)"), _T("PC-9801-26 (PSG)"),
+       _T("OPN (FM)"), _T("OPN (PSG)"),
 #endif
        _T("PC-9801-14"), _T("Beep"),
 #if defined(_PC98DO) || defined(_PC98DOPLUS)
 #if defined(SUPPORT_PC88_OPNA)
-       _T("PC-88 OPNA (FM)"), _T("PC-88 OPNA (PSG)"), _T("PC-88 OPNA (ADPCM)"), _T("PC-88 OPNA (Rhythm)"),
+       _T("PC-88 (FM)"), _T("PC-88 (PSG)"), _T("PC-88 (ADPCM)"), _T("PC-88 (Rhythm)"),
 #else
-       _T("PC-88 OPN (FM)"), _T("PC-88 OPN (PSG)"),
+       _T("PC-88 (FM)"), _T("PC-88 (PSG)"),
 #endif
-       _T("PC-88 Beep"), 
+       _T("PC-88 (Beep)"), 
 #endif
        _T("Noise (FDD)"),
 };
index 3a063d1..803fa8a 100644 (file)
@@ -175,13 +175,13 @@ void SASI::write_signal(int id, uint32_t data, uint32_t mask)
                        #else
                                d_dma->write_signal(SIG_I8237_CH0, data, mask);
                        #endif
-               } else {
-                       if(data & mask) {
-                               #ifdef _SCSI_DEBUG_LOG
-                                       this->out_debug_log(_T("[SASI] DMAE=0, change IRQ\n"));
-                               #endif
-                               write_signal(SIG_SASI_IRQ, data, mask);
-                       }
+//             } else {
+//                     if(data & mask) {
+//                             #ifdef _SCSI_DEBUG_LOG
+//                                     this->out_debug_log(_T("[SASI] DMAE=0, change IRQ\n"));
+//                             #endif
+//                             write_signal(SIG_SASI_IRQ, data, mask);
+//                     }
                }
                drq_status = ((data & mask) != 0);
                break;
index 19c9339..f7a8f52 100644 (file)
@@ -168,7 +168,7 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask)
                                        buffer->write(data_bus);
                                        break;
                                }
-                               set_req_delay(0, 1.0);
+                               set_req_delay(0, 0.1);
                        } else if(prev_status && !ack_status) {
                                // H -> L
                                if(atn_pending) {
index 131b605..8c6632d 100644 (file)
@@ -129,12 +129,12 @@ void SCSI_HOST::write_signal(int id, uint32_t data, uint32_t mask)
                        if(!prev_status && req_status) {
                                // L -> H
 //                             if(bsy_status) {
-                                       if(!cd_status && !msg_status) {
+                                       if(!cd_status) {
                                                // data phase
                                                set_drq(true);
                                                access = true;
-                                       } else if(cd_status) {
-                                               // command/status/message phase
+                                       } else if(!msg_status && io_status) {
+                                               // status phase
                                                set_irq(true);
                                        }
 //                             }
index bc6f8cb..2e292d7 100644 (file)
@@ -250,7 +250,7 @@ Z80_INLINE void Z80_BASE::OUT8(uint32_t addr, uint8_t val)
        if(cond) { \
                JR(); \
                icount -= cc_ex[opcode]; \
-       } else PC++; \
+       } else FETCH8();                         \
 } while(0)
 
 #define CALL() do { \