Improved support for vm86 mode.
diff --git a/debugger/memory.c b/debugger/memory.c
index 6f7083c..416788d 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -15,10 +15,7 @@
#include "winbase.h"
#ifdef __i386__
-#include "wine/winbase16.h"
-
-#define DBG_V86_MODULE(seg) ((seg)>>16)
-#define IS_SELECTOR_V86(seg) DBG_V86_MODULE(seg)
+#define IS_VM86_MODE() (DEBUG_context.EFlags & V86_FLAG)
#endif
static void DEBUG_Die(const char* msg)
@@ -52,41 +49,33 @@
return res;
}
+enum dbg_mode DEBUG_GetSelectorType( WORD sel )
+{
+#ifdef __i386__
+ LDT_ENTRY le;
+
+ if (IS_VM86_MODE()) return MODE_VM86;
+ if (sel == 0) return MODE_32;
+ if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le))
+ return le.HighWord.Bits.Default_Big ? MODE_32 : MODE_16;
+ /* selector doesn't exist */
+ return MODE_INVALID;
+#else
+ return MODE_32;
+#endif
+}
#ifdef __i386__
void DEBUG_FixAddress( DBG_ADDR *addr, DWORD def)
{
if (addr->seg == 0xffffffff) addr->seg = def;
- if (!IS_SELECTOR_V86(addr->seg) && DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
-}
-
-BOOL DEBUG_FixSegment( DBG_ADDR* addr )
-{
- /* V86 mode ? */
- if (DEBUG_context.EFlags & V86_FLAG) {
- addr->seg |= (DWORD)(GetExePtr(GetCurrentTask())) << 16;
- return TRUE;
- }
- return FALSE;
-}
-
-int DEBUG_GetSelectorType( WORD sel )
-{
- LDT_ENTRY le;
-
- if (sel == 0)
- return 32;
- if (IS_SELECTOR_V86(sel))
- return 16;
- if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le))
- return le.HighWord.Bits.Default_Big ? 32 : 16;
- /* selector doesn't exist */
- return 0;
+ if (DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
}
/* Determine if sel is a system selector (i.e. not managed by Wine) */
BOOL DEBUG_IsSelectorSystem(WORD sel)
{
- return !(sel & 4) || (((sel & 0xFFFF) >> 3) < 17);
+ if (IS_VM86_MODE()) return FALSE; /* no system selectors in vm86 mode */
+ return !(sel & 4) || ((sel >> 3) < 17);
}
#endif /* __i386__ */
@@ -95,10 +84,8 @@
#ifdef __i386__
LDT_ENTRY le;
-#if 0
- if (IS_SELECTOR_V86(addr->seg))
- return (DWORD) DOSMEM_MemoryBase(DBG_V86_MODULE(addr->seg)) + (((addr->seg)&0xFFFF)<<4) + addr->off;
-#endif
+ if (IS_VM86_MODE()) return (DWORD)(LOWORD(addr->seg) << 4) + addr->off;
+
if (DEBUG_IsSelectorSystem(addr->seg))
return addr->off;
@@ -116,7 +103,7 @@
#ifdef __i386__
addr->seg = DEBUG_context.SegCs;
- if (!DEBUG_FixSegment( addr ) && DEBUG_IsSelectorSystem(addr->seg))
+ if (DEBUG_IsSelectorSystem(addr->seg))
addr->seg = 0;
addr->off = DEBUG_context.Eip;
#elif defined(__sparc__)