Removed some of the XXX_reg macros now that we are using the standard
CONTEXT86 structure everywhere.

diff --git a/debugger/registers.c b/debugger/registers.c
index d5a2747..ea953ca 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -138,12 +138,12 @@
 
     cs = __get_cs();
     ds = __get_ds();
-    if (CS_reg(DEBUG_context) != cs) CHECK_SEG(CS_reg(DEBUG_context), "CS");
-    if (SS_reg(DEBUG_context) != ds) CHECK_SEG(SS_reg(DEBUG_context), "SS");
-    if (DS_reg(DEBUG_context) != ds) CHECK_SEG(DS_reg(DEBUG_context), "DS");
-    if (ES_reg(DEBUG_context) != ds) CHECK_SEG(ES_reg(DEBUG_context), "ES");
-    if (FS_reg(DEBUG_context) != ds) CHECK_SEG(FS_reg(DEBUG_context), "FS");
-    if (GS_reg(DEBUG_context) != ds) CHECK_SEG(GS_reg(DEBUG_context), "GS");
+    if (DEBUG_context.SegCs != cs) CHECK_SEG(DEBUG_context.SegCs, "CS");
+    if (DEBUG_context.SegSs != ds) CHECK_SEG(DEBUG_context.SegSs, "SS");
+    if (DEBUG_context.SegDs != ds) CHECK_SEG(DEBUG_context.SegDs, "DS");
+    if (DEBUG_context.SegEs != ds) CHECK_SEG(DEBUG_context.SegEs, "ES");
+    if (DEBUG_context.SegFs != ds) CHECK_SEG(DEBUG_context.SegFs, "FS");
+    if (DEBUG_context.SegGs != ds) CHECK_SEG(DEBUG_context.SegGs, "GS");
 #endif
 
     /* Check that CS and SS are not NULL */
diff --git a/dlls/kernel/thunk.c b/dlls/kernel/thunk.c
index 3f70638..8805a02 100644
--- a/dlls/kernel/thunk.c
+++ b/dlls/kernel/thunk.c
@@ -294,22 +294,22 @@
 
     memcpy(&context16,context,sizeof(context16));
 
-    CS_reg(&context16)  = HIWORD(EDX_reg(context));
-    EIP_reg(&context16) = LOWORD(EDX_reg(context));
-    EBP_reg(&context16) = OFFSETOF( NtCurrentTeb()->cur_stack )
+    context16.SegCs = HIWORD(context->Edx);
+    context16.Eip   = LOWORD(context->Edx);
+    context16.Ebp   = OFFSETOF( NtCurrentTeb()->cur_stack )
                            + (WORD)&((STACK16FRAME*)0)->bp;
 
-    argsize = EBP_reg(context)-ESP_reg(context)-0x40;
+    argsize = context->Ebp-context->Esp-0x40;
 
     memcpy( (LPBYTE)CURRENT_STACK16 - argsize,
-            (LPBYTE)ESP_reg(context), argsize );
+            (LPBYTE)context->Esp, argsize );
 
     CallTo16RegisterShort( &context16, argsize );
-    EAX_reg(context) = EAX_reg(&context16);
-    EDX_reg(context) = EDX_reg(&context16);
-    ECX_reg(context) = ECX_reg(&context16);
+    context->Eax = context16.Eax;
+    context->Edx = context16.Edx;
+    context->Ecx = context16.Ecx;
 
-    ESP_reg(context) +=   LOWORD(ESP_reg(&context16)) -
+    context->Esp +=   LOWORD(context16.Esp) -
                         ( OFFSETOF( NtCurrentTeb()->cur_stack ) - argsize );
 }
 
@@ -361,22 +361,22 @@
 void WINAPI FT_Prolog( CONTEXT86 *context )
 {
     /* Build stack frame */
-    stack32_push(context, EBP_reg(context));
-    EBP_reg(context) = ESP_reg(context);
+    stack32_push(context, context->Ebp);
+    context->Ebp = context->Esp;
 
     /* Allocate 64-byte Thunk Buffer */
-    ESP_reg(context) -= 64;
-    memset((char *)ESP_reg(context), '\0', 64);
+    context->Esp -= 64;
+    memset((char *)context->Esp, '\0', 64);
 
     /* Store Flags (ECX) and Target Address (EDX) */
     /* Save other registers to be restored later */
-    *(DWORD *)(EBP_reg(context) -  4) = EBX_reg(context);
-    *(DWORD *)(EBP_reg(context) -  8) = ESI_reg(context);
-    *(DWORD *)(EBP_reg(context) - 12) = EDI_reg(context);
-    *(DWORD *)(EBP_reg(context) - 16) = ECX_reg(context);
+    *(DWORD *)(context->Ebp -  4) = context->Ebx;
+    *(DWORD *)(context->Ebp -  8) = context->Esi;
+    *(DWORD *)(context->Ebp - 12) = context->Edi;
+    *(DWORD *)(context->Ebp - 16) = context->Ecx;
 
-    *(DWORD *)(EBP_reg(context) - 48) = EAX_reg(context);
-    *(DWORD *)(EBP_reg(context) - 52) = EDX_reg(context);
+    *(DWORD *)(context->Ebp - 48) = context->Eax;
+    *(DWORD *)(context->Ebp - 52) = context->Edx;
 }
 
 /**********************************************************************
@@ -402,8 +402,8 @@
 
 void WINAPI FT_Thunk( CONTEXT86 *context )
 {
-    DWORD mapESPrelative = *(DWORD *)(EBP_reg(context) - 20);
-    DWORD callTarget     = *(DWORD *)(EBP_reg(context) - 52);
+    DWORD mapESPrelative = *(DWORD *)(context->Ebp - 20);
+    DWORD callTarget     = *(DWORD *)(context->Ebp - 52);
 
     CONTEXT86 context16;
     DWORD i, argsize;
@@ -411,14 +411,14 @@
 
     memcpy(&context16,context,sizeof(context16));
 
-    CS_reg(&context16)  = HIWORD(callTarget);
-    EIP_reg(&context16) = LOWORD(callTarget);
-    EBP_reg(&context16) = OFFSETOF( NtCurrentTeb()->cur_stack )
+    context16.SegCs = HIWORD(callTarget);
+    context16.Eip   = LOWORD(callTarget);
+    context16.Ebp   = OFFSETOF( NtCurrentTeb()->cur_stack )
                            + (WORD)&((STACK16FRAME*)0)->bp;
 
-    argsize  = EBP_reg(context)-ESP_reg(context)-0x40;
+    argsize  = context->Ebp-context->Esp-0x40;
     newstack = (LPBYTE)CURRENT_STACK16 - argsize;
-    oldstack = (LPBYTE)ESP_reg(context);
+    oldstack = (LPBYTE)context->Esp;
 
     memcpy( newstack, oldstack, argsize );
 
@@ -432,11 +432,11 @@
 	}
 
     CallTo16RegisterShort( &context16, argsize );
-    EAX_reg(context) = EAX_reg(&context16);
-    EDX_reg(context) = EDX_reg(&context16);
-    ECX_reg(context) = ECX_reg(&context16);
+    context->Eax = context16.Eax;
+    context->Edx = context16.Edx;
+    context->Ecx = context16.Ecx;
 
-    ESP_reg(context) +=   LOWORD(ESP_reg(&context16)) -
+    context->Esp +=   LOWORD(context16.Esp) -
                         ( OFFSETOF( NtCurrentTeb()->cur_stack ) - argsize );
 
     /* Copy modified buffers back to 32-bit stack */
@@ -458,21 +458,21 @@
 static void FT_Exit(CONTEXT86 *context, int nPopArgs)
 {
     /* Return value is in EBX */
-    EAX_reg(context) = EBX_reg(context);
+    context->Eax = context->Ebx;
 
     /* Restore EBX, ESI, and EDI registers */
-    EBX_reg(context) = *(DWORD *)(EBP_reg(context) -  4);
-    ESI_reg(context) = *(DWORD *)(EBP_reg(context) -  8);
-    EDI_reg(context) = *(DWORD *)(EBP_reg(context) - 12);
+    context->Ebx = *(DWORD *)(context->Ebp -  4);
+    context->Esi = *(DWORD *)(context->Ebp -  8);
+    context->Edi = *(DWORD *)(context->Ebp - 12);
 
     /* Clean up stack frame */
-    ESP_reg(context) = EBP_reg(context);
-    EBP_reg(context) = stack32_pop(context);
+    context->Esp = context->Ebp;
+    context->Ebp = stack32_pop(context);
 
     /* Pop return address to CALLER of thunk code */
-    EIP_reg(context) = stack32_pop(context);
+    context->Eip = stack32_pop(context);
     /* Remove arguments */
-    ESP_reg(context) += nPopArgs;
+    context->Esp += nPopArgs;
 }
 
 /***********************************************************************
@@ -623,26 +623,26 @@
 
     memcpy(&context16,context,sizeof(context16));
 
-    DI_reg(&context16)  = CX_reg(context);
-    CS_reg(&context16)  = HIWORD(EAX_reg(context));
-    EIP_reg(&context16) = LOWORD(EAX_reg(context));
-    EBP_reg(&context16) = OFFSETOF( NtCurrentTeb()->cur_stack )
+    context16.Edi   = LOWORD(context->Ecx);
+    context16.SegCs = HIWORD(context->Eax);
+    context16.Eip   = LOWORD(context->Eax);
+    context16.Ebp   = OFFSETOF( NtCurrentTeb()->cur_stack )
                            + (WORD)&((STACK16FRAME*)0)->bp;
 
-    argsize = HIWORD(EDX_reg(context)) * 4;
+    argsize = HIWORD(context->Edx) * 4;
 
     /* FIXME: hack for stupid USER32 CallbackGlueLS routine */
-    if (EDX_reg(context) == EIP_reg(context))
+    if (context->Edx == context->Eip)
         argsize = 6 * 4;
 
     memcpy( (LPBYTE)CURRENT_STACK16 - argsize,
-            (LPBYTE)ESP_reg(context), argsize );
+            (LPBYTE)context->Esp, argsize );
 
     CallTo16RegisterLong(&context16, argsize + 32);
-    EAX_reg(context) = EAX_reg(&context16);
+    context->Eax = context16.Eax;
 
     /* Clean up caller's stack frame */
-    ESP_reg(context) += BL_reg(&context16);
+    context->Esp += BL_reg(&context16);
 }
 
 /***********************************************************************
@@ -679,25 +679,25 @@
 
     memcpy(&context16,context,sizeof(context16));
 
-    CS_reg(&context16)  = HIWORD(EDX_reg(context));
-    EIP_reg(&context16) = LOWORD(EDX_reg(context));
-    EBP_reg(&context16) = OFFSETOF( NtCurrentTeb()->cur_stack )
+    context16.SegCs = HIWORD(context->Edx);
+    context16.Eip   = LOWORD(context->Edx);
+    context16.Ebp   = OFFSETOF( NtCurrentTeb()->cur_stack )
                            + (WORD)&((STACK16FRAME*)0)->bp;
 
-    argsize = 2 * *(WORD *)ESP_reg(context) + 2;
+    argsize = 2 * *(WORD *)context->Esp + 2;
 
     memcpy( (LPBYTE)CURRENT_STACK16 - argsize,
-            (LPBYTE)ESP_reg(context), argsize );
+            (LPBYTE)context->Esp, argsize );
 
     CallTo16RegisterShort(&context16, argsize);
-    EAX_reg(context) = EAX_reg(&context16);
-    EDX_reg(context) = EDX_reg(&context16);
+    context->Eax = context16.Eax;
+    context->Edx = context16.Edx;
 
     /* Copy modified buffers back to 32-bit stack */
-    memcpy( (LPBYTE)ESP_reg(context), 
+    memcpy( (LPBYTE)context->Esp, 
             (LPBYTE)CURRENT_STACK16 - argsize, argsize );
 
-    ESP_reg(context) +=   LOWORD(ESP_reg(&context16)) -
+    context->Esp +=   LOWORD(context16.Esp) -
                         ( OFFSETOF( NtCurrentTeb()->cur_stack ) - argsize );
 }
 
@@ -790,7 +790,7 @@
 
     /* Compensate for the fact that the Wine register relay code thought
        we were being called, although we were in fact jumped to */
-    ESP_reg(context) -= 4;
+    context->Esp -= 4;
 
     /* Write FT_Prolog call stub */
     targetTableOffset = stack32_pop(context);
@@ -798,7 +798,7 @@
     _write_ftprolog( relayCode, *(DWORD **)(relayCode+targetTableOffset) );
 
     /* Jump to the call stub just created */
-    EIP_reg(context) = (DWORD)relayCode;
+    context->Eip = (DWORD)relayCode;
 }
 
 /***********************************************************************
@@ -819,15 +819,15 @@
 
     /* Compensate for the fact that the Wine register relay code thought
        we were being called, although we were in fact jumped to */
-    ESP_reg(context) -= 4;
+    context->Esp -= 4;
 
     /* Write QT_Thunk call stub */
-    targetTableOffset = EDX_reg(context);
-    relayCode = (LPBYTE)EAX_reg(context);
+    targetTableOffset = context->Edx;
+    relayCode = (LPBYTE)context->Eax;
     _write_qtthunk( relayCode, *(DWORD **)(relayCode+targetTableOffset) );
 
     /* Jump to the call stub just created */
-    EIP_reg(context) = (DWORD)relayCode;
+    context->Eip = (DWORD)relayCode;
 }
 
 /***********************************************************************
@@ -955,13 +955,13 @@
  */
 void WINAPI W32S_BackTo32( CONTEXT86 *context )
 {
-    LPDWORD stack = (LPDWORD)ESP_reg( context );
-    FARPROC proc = (FARPROC)EIP_reg(context);
+    LPDWORD stack = (LPDWORD)context->Esp;
+    FARPROC proc = (FARPROC)context->Eip;
 
-    EAX_reg( context ) = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
+    context->Eax = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
                                stack[6], stack[7], stack[8], stack[9], stack[10] );
 
-    EIP_reg( context ) = stack32_pop(context);
+    context->Eip = stack32_pop(context);
 }
 
 /**********************************************************************
@@ -1083,7 +1083,7 @@
  */
 void WINAPI K32Thk1632Prolog( CONTEXT86 *context )
 {
-   LPBYTE code = (LPBYTE)EIP_reg(context) - 5;
+   LPBYTE code = (LPBYTE)context->Eip - 5;
 
    /* Arrrgh! SYSTHUNK.DLL just has to re-implement another method
       of 16->32 thunks instead of using one of the standard methods!
@@ -1112,26 +1112,26 @@
       WORD  stackSel  = NtCurrentTeb()->stack_sel;
       DWORD stackBase = GetSelectorBase(stackSel);
 
-      DWORD argSize = EBP_reg(context) - ESP_reg(context);
-      char *stack16 = (char *)ESP_reg(context) - 4;
+      DWORD argSize = context->Ebp - context->Esp;
+      char *stack16 = (char *)context->Esp - 4;
       char *stack32 = (char *)NtCurrentTeb()->cur_stack - argSize;
       STACK16FRAME *frame16 = (STACK16FRAME *)stack16 - 1;
 
       TRACE("before SYSTHUNK hack: EBP: %08lx ESP: %08lx cur_stack: %08lx\n",
-                   EBP_reg(context), ESP_reg(context), NtCurrentTeb()->cur_stack);
+                   context->Ebp, context->Esp, NtCurrentTeb()->cur_stack);
 
       memset(frame16, '\0', sizeof(STACK16FRAME));
       frame16->frame32 = (STACK32FRAME *)NtCurrentTeb()->cur_stack;
-      frame16->ebp = EBP_reg(context);
+      frame16->ebp = context->Ebp;
 
       memcpy(stack32, stack16, argSize);
       NtCurrentTeb()->cur_stack = PTR_SEG_OFF_TO_SEGPTR(stackSel, (DWORD)frame16 - stackBase);
 
-      ESP_reg(context) = (DWORD)stack32 + 4;
-      EBP_reg(context) = ESP_reg(context) + argSize;
+      context->Esp = (DWORD)stack32 + 4;
+      context->Ebp = context->Esp + argSize;
 
       TRACE("after  SYSTHUNK hack: EBP: %08lx ESP: %08lx cur_stack: %08lx\n",
-                   EBP_reg(context), ESP_reg(context), NtCurrentTeb()->cur_stack);
+                   context->Ebp, context->Esp, NtCurrentTeb()->cur_stack);
    }
 
    SYSLEVEL_ReleaseWin16Lock();
@@ -1142,7 +1142,7 @@
  */
 void WINAPI K32Thk1632Epilog( CONTEXT86 *context )
 {
-   LPBYTE code = (LPBYTE)EIP_reg(context) - 13;
+   LPBYTE code = (LPBYTE)context->Eip - 13;
 
    SYSLEVEL_RestoreWin16Lock();
 
@@ -1156,18 +1156,18 @@
       DWORD argSize = frame16->ebp - (DWORD)stack16;
       char *stack32 = (char *)frame16->frame32 - argSize;
 
-      DWORD nArgsPopped = ESP_reg(context) - (DWORD)stack32;
+      DWORD nArgsPopped = context->Esp - (DWORD)stack32;
 
       TRACE("before SYSTHUNK hack: EBP: %08lx ESP: %08lx cur_stack: %08lx\n",
-                   EBP_reg(context), ESP_reg(context), NtCurrentTeb()->cur_stack);
+                   context->Ebp, context->Esp, NtCurrentTeb()->cur_stack);
 
       NtCurrentTeb()->cur_stack = (DWORD)frame16->frame32;
 
-      ESP_reg(context) = (DWORD)stack16 + nArgsPopped;
-      EBP_reg(context) = frame16->ebp;
+      context->Esp = (DWORD)stack16 + nArgsPopped;
+      context->Ebp = frame16->ebp;
 
       TRACE("after  SYSTHUNK hack: EBP: %08lx ESP: %08lx cur_stack: %08lx\n",
-                   EBP_reg(context), ESP_reg(context), NtCurrentTeb()->cur_stack);
+                   context->Ebp, context->Esp, NtCurrentTeb()->cur_stack);
    }
 }
 
@@ -1288,7 +1288,7 @@
 
 void WINAPI C16ThkSL(CONTEXT86 *context)
 {
-    LPBYTE stub = PTR_SEG_TO_LIN(EAX_reg(context)), x = stub;
+    LPBYTE stub = PTR_SEG_TO_LIN(context->Eax), x = stub;
     WORD cs = __get_cs();
     WORD ds = __get_ds();
 
@@ -1309,7 +1309,7 @@
     *x++ = 0x8E; *x++ = 0xC0;
     *x++ = 0x66; *x++ = 0x0F; *x++ = 0xB7; *x++ = 0xC9;
     *x++ = 0x67; *x++ = 0x66; *x++ = 0x26; *x++ = 0x8B;
-                 *x++ = 0x91; *((DWORD *)x)++ = EDX_reg(context);
+                 *x++ = 0x91; *((DWORD *)x)++ = context->Edx;
 
     *x++ = 0x55;
     *x++ = 0x66; *x++ = 0x52;
@@ -1319,12 +1319,12 @@
                               *((WORD *)x)++ = cs;
 
     /* Jump to the stub code just created */
-    EIP_reg(context) = LOWORD(EAX_reg(context));
-    CS_reg(context)  = HIWORD(EAX_reg(context));
+    context->Eip = LOWORD(context->Eax);
+    context->SegCs  = HIWORD(context->Eax);
 
     /* Since C16ThkSL got called by a jmp, we need to leave the
        original return address on the stack */
-    ESP_reg(context) -= 4;
+    context->Esp -= 4;
 }
 
 /***********************************************************************
@@ -1333,11 +1333,11 @@
 
 void WINAPI C16ThkSL01(CONTEXT86 *context)
 {
-    LPBYTE stub = PTR_SEG_TO_LIN(EAX_reg(context)), x = stub;
+    LPBYTE stub = PTR_SEG_TO_LIN(context->Eax), x = stub;
 
     if (stub)
     {
-        struct ThunkDataSL16 *SL16 = PTR_SEG_TO_LIN(EDX_reg(context));
+        struct ThunkDataSL16 *SL16 = PTR_SEG_TO_LIN(context->Edx);
         struct ThunkDataSL *td = SL16->fpData;
 
         DWORD procAddress = (DWORD)GetProcAddress16(GetModuleHandle16("KERNEL"), 631);
@@ -1376,16 +1376,16 @@
                                   *((WORD *)x)++ = cs;
 
         /* Jump to the stub code just created */
-        EIP_reg(context) = LOWORD(EAX_reg(context));
-        CS_reg(context)  = HIWORD(EAX_reg(context));
+        context->Eip = LOWORD(context->Eax);
+        context->SegCs  = HIWORD(context->Eax);
 
         /* Since C16ThkSL01 got called by a jmp, we need to leave the
            orginal return address on the stack */
-        ESP_reg(context) -= 4;
+        context->Esp -= 4;
     }
     else
     {
-        struct ThunkDataSL *td = (struct ThunkDataSL *)EDX_reg(context);
+        struct ThunkDataSL *td = (struct ThunkDataSL *)context->Edx;
         DWORD targetNr = CX_reg(context) / 4;
         struct SLTargetDB *tdb;
 
@@ -1408,18 +1408,18 @@
 
         if (tdb)
         {
-            EDX_reg(context) = tdb->targetTable[targetNr];
+            context->Edx = tdb->targetTable[targetNr];
 
-            TRACE("Call target is %08lx\n", EDX_reg(context));
+            TRACE("Call target is %08lx\n", context->Edx);
         }
         else
         {
-            WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), LOWORD(ESP_reg(context)));
+            WORD *stack = PTR_SEG_OFF_TO_LIN(context->SegSs, LOWORD(context->Esp));
             DX_reg(context) = HIWORD(td->apiDB[targetNr].errorReturnValue);
             AX_reg(context) = LOWORD(td->apiDB[targetNr].errorReturnValue);
-            EIP_reg(context) = stack[2];
-            CS_reg(context)  = stack[3];
-            ESP_reg(context) += td->apiDB[targetNr].nrArgBytes + 4;
+            context->Eip = stack[2];
+            context->SegCs  = stack[3];
+            context->Esp += td->apiDB[targetNr].nrArgBytes + 4;
 
             ERR("Process %08lx did not ThunkConnect32 %s to %s\n",
                 GetCurrentProcessId(), td->pszDll32, td->pszDll16);
@@ -1798,17 +1798,17 @@
     stackLin[3] = BP_reg( context );
     stackLin[2] = SI_reg( context );
     stackLin[1] = DI_reg( context );
-    stackLin[0] = DS_reg( context );
+    stackLin[0] = context->SegDs;
 
-    EBP_reg( context ) = OFFSETOF( stackSeg ) + 6;
-    ESP_reg( context ) = OFFSETOF( stackSeg ) - 4;
-    GS_reg( context ) = 0;
+    context->Ebp = OFFSETOF( stackSeg ) + 6;
+    context->Esp = OFFSETOF( stackSeg ) - 4;
+    context->SegGs = 0;
 
     /* Jump to 16-bit relay code */
     glueTab = PTR_SEG_TO_LIN( CBClientRelay16[ stackLin[5] ] );
     glue = glueTab[ stackLin[4] ];
-    CS_reg ( context ) = SELECTOROF( glue );
-    EIP_reg( context ) = OFFSETOF  ( glue );
+    context->SegCs = SELECTOROF( glue );
+    context->Eip   = OFFSETOF  ( glue );
 }
 
 /***********************************************************************
@@ -1819,10 +1819,10 @@
 {
     /* Call 32-bit relay code */
 
-    LPWORD args = PTR_SEG_OFF_TO_LIN( SS_reg( context ), BP_reg( context ) );
+    LPWORD args = PTR_SEG_OFF_TO_LIN( context->SegSs, BP_reg( context ) );
     FARPROC proc = CBClientRelay32[ args[2] ][ args[1] ];
 
-    EAX_reg(context) = CALL32_CBClient( proc, args, &ESI_reg( context ) );
+    context->Eax = CALL32_CBClient( proc, args, &context->Esi );
 }
 
 /***********************************************************************
@@ -1833,24 +1833,24 @@
 {
     /* Call 32-bit relay code */
 
-    LPWORD args = PTR_SEG_OFF_TO_LIN( SS_reg( context ), BP_reg( context ) );
+    LPWORD args = PTR_SEG_OFF_TO_LIN( context->SegSs, BP_reg( context ) );
     FARPROC proc = CBClientRelay32[ args[2] ][ args[1] ];
     INT nArgs;
     LPWORD stackLin;
 
-    EAX_reg(context) = CALL32_CBClientEx( proc, args, &ESI_reg( context ), &nArgs );
+    context->Eax = CALL32_CBClientEx( proc, args, &context->Esi, &nArgs );
 
     /* Restore registers saved by CBClientGlueSL */
     stackLin = (LPWORD)((LPBYTE)CURRENT_STACK16 + sizeof(STACK16FRAME) - 4);
     BP_reg( context ) = stackLin[3];
     SI_reg( context ) = stackLin[2];
     DI_reg( context ) = stackLin[1];
-    DS_reg( context ) = stackLin[0];
-    ESP_reg( context ) += 16+nArgs;
+    context->SegDs = stackLin[0];
+    context->Esp += 16+nArgs;
 
     /* Return to caller of CBClient thunklet */
-    CS_reg ( context ) = stackLin[9];
-    EIP_reg( context ) = stackLin[8];
+    context->SegCs = stackLin[9];
+    context->Eip   = stackLin[8];
 }
 
 
@@ -1905,19 +1905,19 @@
  */
 void WINAPI CommonUnimpStub( CONTEXT86 *context )
 {
-    if (EAX_reg(context))
-        MESSAGE( "*** Unimplemented Win32 API: %s\n", (LPSTR)EAX_reg(context) );
+    if (context->Eax)
+        MESSAGE( "*** Unimplemented Win32 API: %s\n", (LPSTR)context->Eax );
 
-    switch ((ECX_reg(context) >> 4) & 0x0f)
+    switch ((context->Ecx >> 4) & 0x0f)
     {
-    case 15:  EAX_reg(context) = -1;   break;
-    case 14:  EAX_reg(context) = 0x78; break;
-    case 13:  EAX_reg(context) = 0x32; break;
-    case 1:   EAX_reg(context) = 1;    break;
-    default:  EAX_reg(context) = 0;    break;
+    case 15:  context->Eax = -1;   break;
+    case 14:  context->Eax = 0x78; break;
+    case 13:  context->Eax = 0x32; break;
+    case 1:   context->Eax = 1;    break;
+    default:  context->Eax = 0;    break;
     }
 
-    ESP_reg(context) += (ECX_reg(context) & 0x0f) * 4;
+    context->Esp += (context->Ecx & 0x0f) * 4;
 }
 
 /**********************************************************************
@@ -1972,16 +1972,16 @@
      * lpbuf[8] = ss
      */
 
-    lpbuf[0] = LOWORD(EIP_reg(context));
-    lpbuf[1] = CS_reg(context);
+    lpbuf[0] = LOWORD(context->Eip);
+    lpbuf[1] = context->SegCs;
     /* Windows pushes 4 more words before saving sp */
-    lpbuf[2] = LOWORD(ESP_reg(context)) - 4 * sizeof(WORD);
-    lpbuf[3] = LOWORD(EBP_reg(context));
-    lpbuf[4] = LOWORD(ESI_reg(context));
-    lpbuf[5] = LOWORD(EDI_reg(context));
-    lpbuf[6] = DS_reg(context);
+    lpbuf[2] = LOWORD(context->Esp) - 4 * sizeof(WORD);
+    lpbuf[3] = LOWORD(context->Ebp);
+    lpbuf[4] = LOWORD(context->Esi);
+    lpbuf[5] = LOWORD(context->Edi);
+    lpbuf[6] = context->SegDs;
     lpbuf[7] = 0;
-    lpbuf[8] = SS_reg(context);
+    lpbuf[8] = context->SegSs;
     AX_reg(context) = 0;  /* Return 0 */
 }
 
@@ -2016,14 +2016,14 @@
         frame32 = ((STACK16FRAME *)PTR_SEG_TO_LIN(frame32->frame16))->frame32;
     }
 
-    EIP_reg(context) = lpbuf[0];
-    CS_reg(context)  = lpbuf[1];
-    ESP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/;
-    EBP_reg(context) = lpbuf[3];
-    ESI_reg(context) = lpbuf[4];
-    EDI_reg(context) = lpbuf[5];
-    DS_reg(context)  = lpbuf[6];
+    context->Eip = lpbuf[0];
+    context->SegCs  = lpbuf[1];
+    context->Esp = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/;
+    context->Ebp = lpbuf[3];
+    context->Esi = lpbuf[4];
+    context->Edi = lpbuf[5];
+    context->SegDs  = lpbuf[6];
 
-    if (lpbuf[8] != SS_reg(context))
+    if (lpbuf[8] != context->SegSs)
         ERR("Switching stack segment with Throw() not supported; expect crash now\n" );
 }
diff --git a/dlls/kernel/win87em.c b/dlls/kernel/win87em.c
index ca8b8a8..fa32bc5 100644
--- a/dlls/kernel/win87em.c
+++ b/dlls/kernel/win87em.c
@@ -84,8 +84,8 @@
 void WINAPI WIN87_fpmath( CONTEXT86 *context )
 {
     TRACE("(cs:eip=%x:%lx es=%x bx=%04x ax=%04x dx==%04x)\n",
-                 (WORD)CS_reg(context), EIP_reg(context),
-                 (WORD)ES_reg(context), BX_reg(context),
+                 (WORD)context->SegCs, context->Eip,
+                 (WORD)context->SegEs, BX_reg(context),
                  AX_reg(context), DX_reg(context) );
 
     switch(BX_reg(context))
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index 053d690..79c4fe0 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -363,11 +363,11 @@
  */
 void WINAPI NTDLL_chkstk( CONTEXT86 *context )
 {
-    ESP_reg(context) -= EAX_reg(context);
+    context->Esp -= context->Eax;
 }
 void WINAPI NTDLL_alloca_probe( CONTEXT86 *context )
 {
-    ESP_reg(context) -= EAX_reg(context);
+    context->Esp -= context->Eax;
 }
 
 /******************************************************************************
diff --git a/dlls/user/mouse.c b/dlls/user/mouse.c
index 1d8371d..a3e3b03 100644
--- a/dlls/user/mouse.c
+++ b/dlls/user/mouse.c
@@ -73,14 +73,14 @@
     CONTEXT86 context;
 
     memset( &context, 0, sizeof(context) );
-    CS_reg(&context)  = SELECTOROF( proc );
-    EIP_reg(&context) = OFFSETOF( proc );
-    AX_reg(&context)  = (WORD)dwFlags;
-    BX_reg(&context)  = (WORD)dx;
-    CX_reg(&context)  = (WORD)dy;
-    DX_reg(&context)  = (WORD)cButtons;
-    SI_reg(&context)  = LOWORD( dwExtraInfo );
-    DI_reg(&context)  = HIWORD( dwExtraInfo );
+    context.SegCs = SELECTOROF( proc );
+    context.Eip   = OFFSETOF( proc );
+    context.Eax   = (WORD)dwFlags;
+    context.Ebx   = (WORD)dx;
+    context.Ecx   = (WORD)dy;
+    context.Edx   = (WORD)cButtons;
+    context.Esi   = LOWORD( dwExtraInfo );
+    context.Edi   = HIWORD( dwExtraInfo );
 
     CallTo16RegisterShort( &context, 0 );
 }
diff --git a/if1632/relay.c b/if1632/relay.c
index 38df3ab..e10754a 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -212,7 +212,7 @@
         DPRINTF("     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
-                (WORD)ES_reg(context), EFL_reg(context) );
+                (WORD)context->SegEs, context->EFlags );
 
     SYSLEVEL_CheckNotLevel( 2 );
 }
@@ -249,11 +249,11 @@
               || memcmp( args+2, "intr_", 5 ) == 0 )
     {
         DPRINTF("retval=none ret=%04x:%04x ds=%04x\n",
-                (WORD)CS_reg(context), LOWORD(EIP_reg(context)), (WORD)DS_reg(context));
+                (WORD)context->SegCs, LOWORD(context->Eip), (WORD)context->SegDs);
         DPRINTF("     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
-                (WORD)ES_reg(context), EFL_reg(context) );
+                (WORD)context->SegEs, context->EFlags );
     }
 
     SYSLEVEL_CheckNotLevel( 2 );
@@ -302,14 +302,14 @@
         CONTEXT86 *context = (CONTEXT86 *)target;
 
         DPRINTF("CallTo16(func=%04lx:%04x,ds=%04lx",
-                CS_reg(context), LOWORD(EIP_reg(context)), DS_reg(context) );
+                context->SegCs, LOWORD(context->Eip), context->SegDs );
         while (nb_args--) DPRINTF( ",0x%04x", *--stack16 );
         DPRINTF(") ss:sp=%04x:%04x\n", SELECTOROF(teb->cur_stack),
                 OFFSETOF(teb->cur_stack) );
         DPRINTF("     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x BP=%04x ES=%04x FS=%04x\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
-                BP_reg(context), (WORD)ES_reg(context), (WORD)FS_reg(context) );
+                BP_reg(context), (WORD)context->SegEs, (WORD)context->SegFs );
     }
     else
     {
@@ -346,7 +346,7 @@
                 OFFSETOF(NtCurrentTeb()->cur_stack));
         DPRINTF("     AX=%04x BX=%04x CX=%04x DX=%04x BP=%04x SP=%04x\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
-                DX_reg(context), BP_reg(context), LOWORD(ESP_reg(context)));
+                DX_reg(context), BP_reg(context), LOWORD(context->Esp));
     }
 
     SYSLEVEL_CheckNotLevel( 2 );
diff --git a/if1632/snoop.c b/if1632/snoop.c
index 94b1d37..aa7ad6b 100644
--- a/if1632/snoop.c
+++ b/if1632/snoop.c
@@ -207,11 +207,11 @@
 	return (FARPROC16)(SEGPTR)MAKELONG(((char*)fun-(char*)dll->funs),dll->funhandle);
 }
 
-#define CALLER1REF (*(DWORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),LOWORD(ESP_reg(context))+4)))
+#define CALLER1REF (*(DWORD*)(PTR_SEG_OFF_TO_LIN(context->SegSs,LOWORD(context->Esp)+4)))
 void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT86 *context) {
 	DWORD		ordinal=0;
-	DWORD		entry=(DWORD)PTR_SEG_OFF_TO_LIN(CS_reg(context),LOWORD(EIP_reg(context)))-5;
-	WORD		xcs = CS_reg(context);
+	DWORD		entry=(DWORD)PTR_SEG_OFF_TO_LIN(context->SegCs,LOWORD(context->Eip))-5;
+	WORD		xcs = context->SegCs;
 	SNOOP16_DLL	*dll = firstdll;
 	SNOOP16_FUN	*fun = NULL;
 	SNOOP16_RETURNENTRIES	**rets = &firstrets;
@@ -253,10 +253,10 @@
 	ret->dll	= dll;
 	ret->args	= NULL;
 	ret->ordinal	= ordinal;
-	ret->origSP	= LOWORD(ESP_reg(context));
+	ret->origSP	= LOWORD(context->Esp);
 
-	EIP_reg(context)= LOWORD(fun->origfun);
-	CS_reg(context) = HIWORD(fun->origfun);
+	context->Eip= LOWORD(fun->origfun);
+	context->SegCs = HIWORD(fun->origfun);
 
 
 	DPRINTF("CALL %s.%ld: %s(",dll->name,ordinal,fun->name);
@@ -264,19 +264,19 @@
 		max = fun->nrofargs;
 		if (max>16) max=16;
 		for (i=max;i--;)
-			DPRINTF("%04x%s",*(WORD*)((char *) PTR_SEG_OFF_TO_LIN(SS_reg(context),LOWORD(ESP_reg(context)))+8+sizeof(WORD)*i),i?",":"");
+			DPRINTF("%04x%s",*(WORD*)((char *) PTR_SEG_OFF_TO_LIN(context->SegSs,LOWORD(context->Esp))+8+sizeof(WORD)*i),i?",":"");
 		if (max!=fun->nrofargs)
 			DPRINTF(" ...");
 	} else if (fun->nrofargs<0) {
 		DPRINTF("<unknown, check return>");
 		ret->args = HeapAlloc(GetProcessHeap(),0,16*sizeof(WORD));
-		memcpy(ret->args,(LPBYTE)((char *) PTR_SEG_OFF_TO_LIN(SS_reg(context),LOWORD(ESP_reg(context)))+8),sizeof(WORD)*16);
+		memcpy(ret->args,(LPBYTE)((char *) PTR_SEG_OFF_TO_LIN(context->SegSs,LOWORD(context->Esp))+8),sizeof(WORD)*16);
 	}
 	DPRINTF(") ret=%04x:%04x\n",HIWORD(ret->origreturn),LOWORD(ret->origreturn));
 }
 
 void WINAPI SNOOP16_Return(FARPROC proc, LPBYTE args, CONTEXT86 *context) {
-	SNOOP16_RETURNENTRY	*ret = (SNOOP16_RETURNENTRY*)((char *) PTR_SEG_OFF_TO_LIN(CS_reg(context),LOWORD(EIP_reg(context)))-5);
+	SNOOP16_RETURNENTRY	*ret = (SNOOP16_RETURNENTRY*)((char *) PTR_SEG_OFF_TO_LIN(context->SegCs,LOWORD(context->Eip))-5);
 
 	/* We haven't found out the nrofargs yet. If we called a cdecl
 	 * function it is too late anyway and we can just set '0' (which 
@@ -284,10 +284,10 @@
 	 * If pascal -> everything ok.
 	 */
 	if (ret->dll->funs[ret->ordinal].nrofargs<0) {
-		ret->dll->funs[ret->ordinal].nrofargs=(LOWORD(ESP_reg(context))-ret->origSP-4)/2;
+		ret->dll->funs[ret->ordinal].nrofargs=(LOWORD(context->Esp)-ret->origSP-4)/2;
 	}
-	EIP_reg(context) = LOWORD(ret->origreturn);
-	CS_reg(context)  = HIWORD(ret->origreturn);
+	context->Eip = LOWORD(ret->origreturn);
+	context->SegCs  = HIWORD(ret->origreturn);
 	if (ret->args) {
 		int	i,max;
 
diff --git a/include/miscemu.h b/include/miscemu.h
index 32fed3c..0be911c 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -268,8 +268,8 @@
     ERR( "int%x: unknown/not implemented parameters:\n" \
                      "int%x: AX %04x, BX %04x, CX %04x, DX %04x, " \
                      "SI %04x, DI %04x, DS %04x, ES %04x\n", \
-             (num), (num), AX_reg(context), BX_reg(context), CX_reg(context), \
-             DX_reg(context), SI_reg(context), DI_reg(context), \
-             (WORD)DS_reg(context), (WORD)ES_reg(context) )
+             (num), (num), LOWORD((context)->Eax), LOWORD((context)->Ebx), \
+             LOWORD((context)->Ecx), LOWORD((context)->Edx), LOWORD((context)->Esi), \
+             LOWORD((context)->Edi), (WORD)(context)->SegDs, (WORD)(context)->SegEs )
 
 #endif /* __WINE_MISCEMU_H */
diff --git a/include/winnt.h b/include/winnt.h
index b175a22..aead055 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -688,48 +688,28 @@
 
 /* Macros for easier access to i386 context registers */
 
-#define EAX_reg(context)     ((context)->Eax)
-#define EBX_reg(context)     ((context)->Ebx)
-#define ECX_reg(context)     ((context)->Ecx)
-#define EDX_reg(context)     ((context)->Edx)
-#define ESI_reg(context)     ((context)->Esi)
-#define EDI_reg(context)     ((context)->Edi)
-#define EBP_reg(context)     ((context)->Ebp)
+#define AX_reg(context)      (*(WORD*)&(context)->Eax)
+#define BX_reg(context)      (*(WORD*)&(context)->Ebx)
+#define CX_reg(context)      (*(WORD*)&(context)->Ecx)
+#define DX_reg(context)      (*(WORD*)&(context)->Edx)
+#define SI_reg(context)      (*(WORD*)&(context)->Esi)
+#define DI_reg(context)      (*(WORD*)&(context)->Edi)
+#define BP_reg(context)      (*(WORD*)&(context)->Ebp)
 
-#define CS_reg(context)      ((context)->SegCs)
-#define DS_reg(context)      ((context)->SegDs)
-#define ES_reg(context)      ((context)->SegEs)
-#define FS_reg(context)      ((context)->SegFs)
-#define GS_reg(context)      ((context)->SegGs)
-#define SS_reg(context)      ((context)->SegSs)
+#define AL_reg(context)      (*(BYTE*)&(context)->Eax)
+#define AH_reg(context)      (*((BYTE*)&(context)->Eax + 1))
+#define BL_reg(context)      (*(BYTE*)&(context)->Ebx)
+#define BH_reg(context)      (*((BYTE*)&(context)->Ebx + 1))
+#define CL_reg(context)      (*(BYTE*)&(context)->Ecx)
+#define CH_reg(context)      (*((BYTE*)&(context)->Ecx + 1))
+#define DL_reg(context)      (*(BYTE*)&(context)->Edx)
+#define DH_reg(context)      (*((BYTE*)&(context)->Edx + 1))
 
-#define EFL_reg(context)     ((context)->EFlags)
-#define EIP_reg(context)     ((context)->Eip)
-#define ESP_reg(context)     ((context)->Esp)
-
-#define AX_reg(context)      (*(WORD*)&EAX_reg(context))
-#define BX_reg(context)      (*(WORD*)&EBX_reg(context))
-#define CX_reg(context)      (*(WORD*)&ECX_reg(context))
-#define DX_reg(context)      (*(WORD*)&EDX_reg(context))
-#define SI_reg(context)      (*(WORD*)&ESI_reg(context))
-#define DI_reg(context)      (*(WORD*)&EDI_reg(context))
-#define BP_reg(context)      (*(WORD*)&EBP_reg(context))
-
-#define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
-#define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
-#define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
-#define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
-#define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
-#define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
-#define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
-#define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
-                            
-#define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
-#define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
-#define SET_ZFLAG(context)   (EFL_reg(context) |= 0x0040)
-#define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040)
-
-#define ISV86(context)       (EFL_reg(context) & 0x00020000)
+#define SET_CFLAG(context)   ((context)->EFlags |= 0x0001)
+#define RESET_CFLAG(context) ((context)->EFlags &= ~0x0001)
+#define SET_ZFLAG(context)   ((context)->EFlags |= 0x0040)
+#define RESET_ZFLAG(context) ((context)->EFlags &= ~0x0040)
+#define ISV86(context)       ((context)->EFlags & 0x00020000)
 
 
 /* Macros to retrieve the current context */
diff --git a/loader/dos/dosvm.c b/loader/dos/dosvm.c
index 241f669..4f0fbcf 100644
--- a/loader/dos/dosvm.c
+++ b/loader/dos/dosvm.c
@@ -50,11 +50,11 @@
 # include <sys/mman.h>
 #endif
 
-#define IF_CLR(ctx) EFL_reg(ctx) &= ~VIF_MASK
-#define IF_ENABLED(ctx) (EFL_reg(ctx) & VIF_MASK)
-#define SET_PEND(ctx) EFL_reg(ctx) |= VIP_MASK
-#define CLR_PEND(ctx) EFL_reg(ctx) &= ~VIP_MASK
-#define IS_PEND(ctx) (EFL_reg(ctx) & VIP_MASK)
+#define IF_CLR(ctx)     ((ctx)->EFlags &= ~VIF_MASK)
+#define IF_ENABLED(ctx) ((ctx)->EFlags & VIF_MASK)
+#define SET_PEND(ctx)   ((ctx)->EFlags |= VIP_MASK)
+#define CLR_PEND(ctx)   ((ctx)->EFlags &= ~VIP_MASK)
+#define IS_PEND(ctx)    ((ctx)->EFlags & VIP_MASK)
 
 #undef TRY_PICRETURN
 
@@ -87,7 +87,7 @@
         rec.ExceptionFlags = EH_NONCONTINUABLE;
     }
     rec.ExceptionRecord  = NULL;
-    rec.ExceptionAddress = (LPVOID)EIP_reg(context);
+    rec.ExceptionAddress = (LPVOID)context->Eip;
     rec.NumberParameters = 0;
     EXC_RtlRaiseException( &rec, context );
 }
@@ -129,7 +129,7 @@
 static int DOSVM_Int( int vect, CONTEXT86 *context )
 {
  if (vect==0x31) {
-  if (CS_reg(context)==DOSMEM_wrap_seg) {
+  if (context->SegCs==DOSMEM_wrap_seg) {
    /* exit from real-mode wrapper */
    return -1;
   }
@@ -148,17 +148,17 @@
     INT_RealModeInterrupt(vect,context);
   } else {
     WORD*stack= PTR_REAL_TO_LIN( context->SegSs, context->Esp );
-    WORD flag=LOWORD(EFL_reg(context));
+    WORD flag=LOWORD(context->EFlags);
 
     if (IF_ENABLED(context)) flag|=IF_MASK;
     else flag&=~IF_MASK;
 
     *(--stack)=flag;
-    *(--stack)=CS_reg(context);
-    *(--stack)=LOWORD(EIP_reg(context));
-    ESP_reg(context)-=6;
-    CS_reg(context)=SELECTOROF(handler);
-    EIP_reg(context)=OFFSETOF(handler);
+    *(--stack)=context->SegCs;
+    *(--stack)=LOWORD(context->Eip);
+    context->Esp-=6;
+    context->SegCs=SELECTOROF(handler);
+    context->Eip=OFFSETOF(handler);
     IF_CLR(context);
   }
 }
@@ -250,23 +250,23 @@
   }
 }
 
-#define CV CP(eax,EAX); CP(ecx,ECX); CP(edx,EDX); CP(ebx,EBX); \
-           CP(esi,ESI); CP(edi,EDI); CP(esp,ESP); CP(ebp,EBP); \
-           CP(cs,CS); CP(ds,DS); CP(es,ES); \
-           CP(ss,SS); CP(fs,FS); CP(gs,GS); \
-           CP(eip,EIP); CP(eflags,EFL)
+#define CV do { CP(eax,Eax); CP(ecx,Ecx); CP(edx,Edx); CP(ebx,Ebx); \
+           CP(esi,Esi); CP(edi,Edi); CP(esp,Esp); CP(ebp,Ebp); \
+           CP(cs,SegCs); CP(ds,SegDs); CP(es,SegEs); \
+           CP(ss,SegSs); CP(fs,SegFs); CP(gs,SegGs); \
+           CP(eip,Eip); CP(eflags,EFlags); } while(0)
 
 static int DOSVM_Process( int fn, int sig, struct vm86plus_struct*VM86 )
 {
  CONTEXT86 context;
  int ret=0;
 
-#define CP(x,y) y##_reg(&context) = VM86->regs.x
+#define CP(x,y) context.y = VM86->regs.x
   CV;
 #undef CP
  if (VM86_TYPE(fn)==VM86_UNKNOWN) {
   ret=INSTR_EmulateInstruction(&context);
-#define CP(x,y) VM86->regs.x = y##_reg(&context)
+#define CP(x,y) VM86->regs.x = context.y
   CV;
 #undef CP
   if (ret) return 0;
@@ -333,7 +333,7 @@
    ret=-1;
  }
 
-#define CP(x,y) VM86->regs.x = y##_reg(&context)
+#define CP(x,y) VM86->regs.x = context.y
  CV;
 #undef CP
 #ifdef TRY_PICRETURN
@@ -456,7 +456,7 @@
  struct vm86plus_struct VM86;
  int stat,len,sig;
 
-#define CP(x,y) VM86.regs.x = y##_reg(context)
+#define CP(x,y) VM86.regs.x = context->y
   CV;
 #undef CP
   if (VM86.regs.eflags & IF_MASK)
@@ -517,11 +517,9 @@
  } while (DOSVM_Process(stat,sig,&VM86)>=0);
  entered--;
 
- if (context) {
-#define CP(x,y) y##_reg(context) = VM86.regs.x
+#define CP(x,y) context->y = VM86.regs.x
   CV;
 #undef CP
- }
  return 0;
 }
 
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 5bbceb5..96ea71e 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -1177,24 +1177,24 @@
          * sp   top of the stack
          */
         memset( &context, 0, sizeof(context) );
-        CS_reg(&context)  = GlobalHandleToSel16(pSegTable[pModule->cs - 1].hSeg);
-        DS_reg(&context)  = GlobalHandleToSel16(pTask->hInstance);
-        ES_reg(&context)  = pTask->hPDB;
-        EIP_reg(&context) = pModule->ip;
-        EBX_reg(&context) = pModule->stack_size;
-        ECX_reg(&context) = pModule->heap_size;
-        EDI_reg(&context) = pTask->hInstance;
-        ESI_reg(&context) = pTask->hPrevInstance;
+        context.SegCs  = GlobalHandleToSel16(pSegTable[pModule->cs - 1].hSeg);
+        context.SegDs  = GlobalHandleToSel16(pTask->hInstance);
+        context.SegEs  = pTask->hPDB;
+        context.Eip    = pModule->ip;
+        context.Ebx    = pModule->stack_size;
+        context.Ecx    = pModule->heap_size;
+        context.Edi    = pTask->hInstance;
+        context.Esi    = pTask->hPrevInstance;
 
         /* Now call 16-bit entry point */
 
         TRACE("Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x\n",
-              CS_reg(&context), EIP_reg(&context), DS_reg(&context),
+              context.SegCs, context.Eip, context.SegDs,
               SELECTOROF(pTask->teb->cur_stack),
               OFFSETOF(pTask->teb->cur_stack) );
 
         CallTo16RegisterShort( &context, 0 );
-        ExitThread( AX_reg( &context ) );
+        ExitThread( LOWORD(context.Eax) );
     }
 
     SYSLEVEL_LeaveWin16Lock();
@@ -1473,13 +1473,13 @@
         if (pModule->flags & NE_FFLAGS_WIN32) continue;
 
         name_table = (BYTE *)pModule + pModule->name_table;
-	/* FIXME: the lstrncmpiA is WRONG. It should not be case insensitive,
+	/* FIXME: the strncasecmp is WRONG. It should not be case insensitive,
 	 * but case sensitive! (Unfortunately Winword 6 and subdlls have
 	 * lowercased module names, but try to load uppercase DLLs, so this
 	 * 'i' compare is just a quickfix until the loader handles that
 	 * correctly. -MM 990705
 	 */
-        if ((*name_table == len) && !lstrncmpiA(tmpstr, name_table+1, len))
+        if ((*name_table == len) && !strncasecmp(tmpstr, name_table+1, len))
             return hModule;
     }
 
@@ -1611,7 +1611,7 @@
         if (pModule->flags & NE_FFLAGS_WIN32) continue;
 
         name_table = (BYTE *)pModule + pModule->name_table;
-        if ((*name_table == len) && !lstrncmpiA(s, name_table+1, len))
+        if ((*name_table == len) && !strncasecmp(s, name_table+1, len))
             return hModule;
     }
 
@@ -1729,7 +1729,7 @@
  */
 void WINAPI MapHInstLS( CONTEXT86 *context )
 {
-	EAX_reg(context) = MapHModuleLS(EAX_reg(context));
+    context->Eax = MapHModuleLS(context->Eax);
 }
 
 /***************************************************************************
@@ -1737,7 +1737,7 @@
  */
 void WINAPI MapHInstSL( CONTEXT86 *context )
 {
-	EAX_reg(context) = MapHModuleSL(EAX_reg(context));
+    context->Eax = MapHModuleSL(context->Eax);
 }
 
 /***************************************************************************
@@ -1745,8 +1745,7 @@
  */
 void WINAPI MapHInstLS_PN( CONTEXT86 *context )
 {
-	if (EAX_reg(context))
-	    EAX_reg(context) = MapHModuleLS(EAX_reg(context));
+    if (context->Eax) context->Eax = MapHModuleLS(context->Eax);
 }
 
 /***************************************************************************
@@ -1754,7 +1753,6 @@
  */
 void WINAPI MapHInstSL_PN( CONTEXT86 *context )
 {
-	if (EAX_reg(context))
-	    EAX_reg(context) = MapHModuleSL(EAX_reg(context));
+    if (context->Eax) context->Eax = MapHModuleSL(context->Eax);
 }
 
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index 1c65265..d3f6aa0 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -613,20 +613,20 @@
 
     NE_GetDLLInitParams( pModule, &hInst, &ds, &heap );
 
-    ECX_reg(&context) = heap;
-    EDI_reg(&context) = hInst;
-    DS_reg(&context)  = ds;
-    ES_reg(&context)  = ds;   /* who knows ... */
+    context.Ecx = heap;
+    context.Edi = hInst;
+    context.SegDs  = ds;
+    context.SegEs  = ds;   /* who knows ... */
 
-    CS_reg(&context)  = SEL(pSegTable[pModule->cs-1].hSeg);
-    EIP_reg(&context) = pModule->ip;
-    EBP_reg(&context) = OFFSETOF(NtCurrentTeb()->cur_stack) + (WORD)&((STACK16FRAME*)0)->bp;
+    context.SegCs  = SEL(pSegTable[pModule->cs-1].hSeg);
+    context.Eip = pModule->ip;
+    context.Ebp = OFFSETOF(NtCurrentTeb()->cur_stack) + (WORD)&((STACK16FRAME*)0)->bp;
 
 
     pModule->cs = 0;  /* Don't initialize it twice */
     TRACE_(dll)("Calling LibMain, cs:ip=%04lx:%04lx ds=%04lx di=%04x cx=%04x\n", 
-                 CS_reg(&context), EIP_reg(&context), DS_reg(&context),
-                 DI_reg(&context), CX_reg(&context) );
+                 context.SegCs, context.Eip, context.SegDs,
+                 LOWORD(context.Edi), LOWORD(context.Ecx) );
     CallTo16RegisterShort( &context, 0 );
     return TRUE;
 }
@@ -697,12 +697,12 @@
         CONTEXT86 context;
 
         memset( &context, 0, sizeof(context) );
-        DS_reg(&context) = ds;
-        ES_reg(&context) = ds;   /* who knows ... */
+        context.SegDs = ds;
+        context.SegEs = ds;   /* who knows ... */
 
-        CS_reg(&context) = HIWORD(entryPoint);
-        EIP_reg(&context) = LOWORD(entryPoint);
-        EBP_reg(&context) =  OFFSETOF( NtCurrentTeb()->cur_stack )
+        context.SegCs = HIWORD(entryPoint);
+        context.Eip = LOWORD(entryPoint);
+        context.Ebp =  OFFSETOF( NtCurrentTeb()->cur_stack )
                              + (WORD)&((STACK16FRAME*)0)->bp;
 
         *(DWORD *)(stack -  4) = dwReason;      /* dwReason */
diff --git a/loader/task.c b/loader/task.c
index 6b29425..34ab004 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -631,7 +631,7 @@
     INSTANCEDATA *pinstance;
     SEGPTR ptr;
 
-    EAX_reg(context) = 0;
+    context->Eax = 0;
     if (!(pTask = (TDB *)GlobalLock16( GetCurrentTask() ))) return;
 
     /* Note: we need to trust that BX/CX contain the stack/heap sizes, 
@@ -642,12 +642,12 @@
     pinstance = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN(CURRENT_DS, 0);
     pinstance->stackmin    = OFFSETOF( pTask->teb->cur_stack ) + sizeof( STACK16FRAME );
     pinstance->stackbottom = pinstance->stackmin; /* yup, that's right. Confused me too. */
-    pinstance->stacktop    = ( pinstance->stackmin > BX_reg(context)? 
-                               pinstance->stackmin - BX_reg(context) : 0 ) + 150; 
+    pinstance->stacktop    = ( pinstance->stackmin > LOWORD(context->Ebx) ?
+                               pinstance->stackmin - LOWORD(context->Ebx) : 0 ) + 150;
 
     /* Initialize the local heap */
-    if ( CX_reg(context) )
-        LocalInit16( GlobalHandleToSel16(pTask->hInstance), 0, CX_reg(context) );
+    if (LOWORD(context->Ecx))
+        LocalInit16( GlobalHandleToSel16(pTask->hInstance), 0, LOWORD(context->Ecx) );
 
     /* Initialize implicitly loaded DLLs */
     NE_InitializeDLLs( pTask->hModule );
@@ -665,22 +665,22 @@
      */
     ptr = stack16_push( sizeof(WORD) );
     *(WORD *)PTR_SEG_TO_LIN(ptr) = 0;
-    ESP_reg(context) -= 2;
+    context->Esp -= 2;
 
-    EAX_reg(context) = 1;
-        
-    if (!pTask->pdb.cmdLine[0]) EBX_reg(context) = 0x80;
+    context->Eax = 1;
+
+    if (!pTask->pdb.cmdLine[0]) context->Ebx = 0x80;
     else
     {
         LPBYTE p = &pTask->pdb.cmdLine[1];
         while ((*p == ' ') || (*p == '\t')) p++;
-        EBX_reg(context) = 0x80 + (p - pTask->pdb.cmdLine);
+        context->Ebx = 0x80 + (p - pTask->pdb.cmdLine);
     }
-    ECX_reg(context) = pinstance->stacktop;
-    EDX_reg(context) = pTask->nCmdShow;
-    ESI_reg(context) = (DWORD)pTask->hPrevInstance;
-    EDI_reg(context) = (DWORD)pTask->hInstance;
-    ES_reg (context) = (WORD)pTask->hPDB;
+    context->Ecx   = pinstance->stacktop;
+    context->Edx   = pTask->nCmdShow;
+    context->Esi   = (DWORD)pTask->hPrevInstance;
+    context->Edi   = (DWORD)pTask->hInstance;
+    context->SegEs = (WORD)pTask->hPDB;
 }
 
 
@@ -1229,8 +1229,8 @@
     /* Switch back to the old stack */
 
     NtCurrentTeb()->cur_stack = pData->old_ss_sp - sizeof(STACK16FRAME);
-    SS_reg(context)  = SELECTOROF(pData->old_ss_sp);
-    ESP_reg(context) = OFFSETOF(pData->old_ss_sp) - sizeof(DWORD); /*ret addr*/
+    context->SegSs = SELECTOROF(pData->old_ss_sp);
+    context->Esp   = OFFSETOF(pData->old_ss_sp) - sizeof(DWORD); /*ret addr*/
     pData->old_ss_sp = 0;
 
     /* Build a stack frame for the return */
diff --git a/memory/instr.c b/memory/instr.c
index 34fbda8..d222a6f 100644
--- a/memory/instr.c
+++ b/memory/instr.c
@@ -61,9 +61,9 @@
 {
     extern char Call16_Start, Call16_End;
 
-    if (IS_SELECTOR_SYSTEM(CS_reg(context)))
-        if (    (char *)EIP_reg(context) >= &Call16_Start 
-             && (char *)EIP_reg(context) <  &Call16_End   )
+    if (IS_SELECTOR_SYSTEM(context->SegCs))
+        if (    (char *)context->Eip >= &Call16_Start 
+             && (char *)context->Eip <  &Call16_End   )
         {
             /* Saved selector may have become invalid when the relay code */
             /* tries to restore it. We simply clear it. */
@@ -107,14 +107,14 @@
     {
         switch(rm)
         {
-        case 0: return (BYTE *)&EAX_reg(context);
-        case 1: return (BYTE *)&ECX_reg(context);
-        case 2: return (BYTE *)&EDX_reg(context);
-        case 3: return (BYTE *)&EBX_reg(context);
-        case 4: return (BYTE *)&ESP_reg(context);
-        case 5: return (BYTE *)&EBP_reg(context);
-        case 6: return (BYTE *)&ESI_reg(context);
-        case 7: return (BYTE *)&EDI_reg(context);
+        case 0: return (BYTE *)&context->Eax;
+        case 1: return (BYTE *)&context->Ecx;
+        case 2: return (BYTE *)&context->Edx;
+        case 3: return (BYTE *)&context->Ebx;
+        case 4: return (BYTE *)&context->Esp;
+        case 5: return (BYTE *)&context->Ebp;
+        case 6: return (BYTE *)&context->Esi;
+        case 7: return (BYTE *)&context->Edi;
         }
     }
 
@@ -128,27 +128,27 @@
             ss = sib >> 6;
             switch(sib >> 3)
             {
-            case 0: index = EAX_reg(context); break;
-            case 1: index = ECX_reg(context); break;
-            case 2: index = EDX_reg(context); break;
-            case 3: index = EBX_reg(context); break;
+            case 0: index = context->Eax; break;
+            case 1: index = context->Ecx; break;
+            case 2: index = context->Edx; break;
+            case 3: index = context->Ebx; break;
             case 4: index = 0; break;
-            case 5: index = EBP_reg(context); break;
-            case 6: index = ESI_reg(context); break;
-            case 7: index = EDI_reg(context); break;
+            case 5: index = context->Ebp; break;
+            case 6: index = context->Esi; break;
+            case 7: index = context->Edi; break;
             }
         }
 
         switch(rm)
         {
-        case 0: base = EAX_reg(context); seg = DS_reg(context); break;
-        case 1: base = ECX_reg(context); seg = DS_reg(context); break;
-        case 2: base = EDX_reg(context); seg = DS_reg(context); break;
-        case 3: base = EBX_reg(context); seg = DS_reg(context); break;
-        case 4: base = ESP_reg(context); seg = SS_reg(context); break;
-        case 5: base = EBP_reg(context); seg = SS_reg(context); break;
-        case 6: base = ESI_reg(context); seg = DS_reg(context); break;
-        case 7: base = EDI_reg(context); seg = DS_reg(context); break;
+        case 0: base = context->Eax; seg = context->SegDs; break;
+        case 1: base = context->Ecx; seg = context->SegDs; break;
+        case 2: base = context->Edx; seg = context->SegDs; break;
+        case 3: base = context->Ebx; seg = context->SegDs; break;
+        case 4: base = context->Esp; seg = context->SegSs; break;
+        case 5: base = context->Ebp; seg = context->SegSs; break;
+        case 6: base = context->Esi; seg = context->SegDs; break;
+        case 7: base = context->Edi; seg = context->SegDs; break;
         }
         switch (mod)
         {
@@ -156,7 +156,7 @@
             if (rm == 5)  /* special case: ds:(disp32) */
             {
                 GET_VAL( &base, DWORD );
-                seg = DS_reg(context);
+                seg = context->SegDs;
             }
             break;
 
@@ -176,36 +176,36 @@
         switch(rm)
         {
         case 0:  /* ds:(bx,si) */
-            base = LOWORD(EBX_reg(context)) + LOWORD(ESI_reg(context));
-            seg  = DS_reg(context);
+            base = LOWORD(context->Ebx) + LOWORD(context->Esi);
+            seg  = context->SegDs;
             break;
         case 1:  /* ds:(bx,di) */
-            base = LOWORD(EBX_reg(context)) + LOWORD(EDI_reg(context));
-            seg  = DS_reg(context);
+            base = LOWORD(context->Ebx) + LOWORD(context->Edi);
+            seg  = context->SegDs;
             break;
         case 2:  /* ss:(bp,si) */
-            base = LOWORD(EBP_reg(context)) + LOWORD(ESI_reg(context));
-            seg  = SS_reg(context);
+            base = LOWORD(context->Ebp) + LOWORD(context->Esi);
+            seg  = context->SegSs;
             break;
         case 3:  /* ss:(bp,di) */
-            base = LOWORD(EBP_reg(context)) + LOWORD(EDI_reg(context));
-            seg  = SS_reg(context);
+            base = LOWORD(context->Ebp) + LOWORD(context->Edi);
+            seg  = context->SegSs;
             break;
         case 4:  /* ds:(si) */
-            base = LOWORD(ESI_reg(context));
-            seg  = DS_reg(context);
+            base = LOWORD(context->Esi);
+            seg  = context->SegDs;
             break;
         case 5:  /* ds:(di) */
-            base = LOWORD(EDI_reg(context));
-            seg  = DS_reg(context);
+            base = LOWORD(context->Edi);
+            seg  = context->SegDs;
             break;
         case 6:  /* ss:(bp) */
-            base = LOWORD(EBP_reg(context));
-            seg  = SS_reg(context);
+            base = LOWORD(context->Ebp);
+            seg  = context->SegSs;
             break;
         case 7:  /* ds:(bx) */
-            base = LOWORD(EBX_reg(context));
-            seg  = DS_reg(context);
+            base = LOWORD(context->Ebx);
+            seg  = context->SegDs;
             break;
         }
 
@@ -215,7 +215,7 @@
             if (rm == 6)  /* special case: ds:(disp16) */
             {
                 GET_VAL( &base, WORD );
-                seg  = DS_reg(context);
+                seg  = context->SegDs;
             }
             break;
 
@@ -266,36 +266,36 @@
     switch((*regmodrm >> 3) & 7)
     {
     case 0:
-        if (long_op) EAX_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(EAX_reg(context),*(WORD *)addr);
+        if (long_op) context->Eax = *(DWORD *)addr;
+        else SET_LOWORD(context->Eax,*(WORD *)addr);
         break;
     case 1:
-        if (long_op) ECX_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(ECX_reg(context),*(WORD *)addr);
+        if (long_op) context->Ecx = *(DWORD *)addr;
+        else SET_LOWORD(context->Ecx,*(WORD *)addr);
         break;
     case 2:
-        if (long_op) EDX_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(EDX_reg(context),*(WORD *)addr);
+        if (long_op) context->Edx = *(DWORD *)addr;
+        else SET_LOWORD(context->Edx,*(WORD *)addr);
         break;
     case 3:
-        if (long_op) EBX_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(EBX_reg(context),*(WORD *)addr);
+        if (long_op) context->Ebx = *(DWORD *)addr;
+        else SET_LOWORD(context->Ebx,*(WORD *)addr);
         break;
     case 4:
-        if (long_op) ESP_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(ESP_reg(context),*(WORD *)addr);
+        if (long_op) context->Esp = *(DWORD *)addr;
+        else SET_LOWORD(context->Esp,*(WORD *)addr);
         break;
     case 5:
-        if (long_op) EBP_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(EBP_reg(context),*(WORD *)addr);
+        if (long_op) context->Ebp = *(DWORD *)addr;
+        else SET_LOWORD(context->Ebp,*(WORD *)addr);
         break;
     case 6:
-        if (long_op) ESI_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(ESI_reg(context),*(WORD *)addr);
+        if (long_op) context->Esi = *(DWORD *)addr;
+        else SET_LOWORD(context->Esi,*(WORD *)addr);
         break;
     case 7:
-        if (long_op) EDI_reg(context) = *(DWORD *)addr;
-        else SET_LOWORD(EDI_reg(context),*(WORD *)addr);
+        if (long_op) context->Edi = *(DWORD *)addr;
+        else SET_LOWORD(context->Edi,*(WORD *)addr);
         break;
     }
 
@@ -303,13 +303,13 @@
 
     switch(*instr)
     {
-    case 0xc4: ES_reg(context) = seg; break;  /* les */
-    case 0xc5: DS_reg(context) = seg; break;  /* lds */
+    case 0xc4: context->SegEs = seg; break;  /* les */
+    case 0xc5: context->SegDs = seg; break;  /* lds */
     case 0x0f: switch(instr[1])
                {
-               case 0xb2: SS_reg(context) = seg; break;  /* lss */
-               case 0xb4: FS_reg(context) = seg; break;  /* lfs */
-               case 0xb5: GS_reg(context) = seg; break;  /* lgs */
+               case 0xb2: context->SegSs = seg; break;  /* lss */
+               case 0xb4: context->SegFs = seg; break;  /* lfs */
+               case 0xb5: context->SegGs = seg; break;  /* lgs */
                }
                break;
     }
@@ -334,15 +334,15 @@
         {
         case 1:
             DPRINTF( "0x%x < %02x @ %04x:%04x\n", port, LOBYTE(res),
-                     (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                     (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         case 2:
             DPRINTF( "0x%x < %04x @ %04x:%04x\n", port, LOWORD(res),
-                     (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                     (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         case 4:
             DPRINTF( "0x%x < %08lx @ %04x:%04x\n", port, res,
-                     (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                     (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         }
     }
@@ -364,15 +364,15 @@
         {
         case 1:
             DPRINTF("0x%x > %02x @ %04x:%04x\n", port, LOBYTE(val),
-                    (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                    (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         case 2:
             DPRINTF("0x%x > %04x @ %04x:%04x\n", port, LOWORD(val),
-                    (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                    (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         case 4:
             DPRINTF("0x%x > %08lx @ %04x:%04x\n", port, val,
-                    (WORD)CS_reg(context), LOWORD(EIP_reg(context)));
+                    (WORD)context->SegCs, LOWORD(context->Eip));
             break;
         }
     }
@@ -405,22 +405,22 @@
         switch(*instr)
         {
         case 0x2e:
-            segprefix = CS_reg(context);
+            segprefix = context->SegCs;
             break;
         case 0x36:
-            segprefix = SS_reg(context);
+            segprefix = context->SegSs;
             break;
         case 0x3e:
-            segprefix = DS_reg(context);
+            segprefix = context->SegDs;
             break;
         case 0x26:
-            segprefix = ES_reg(context);
+            segprefix = context->SegEs;
             break;
         case 0x64:
-            segprefix = FS_reg(context);
+            segprefix = context->SegFs;
             break;
         case 0x65:
-            segprefix = GS_reg(context);
+            segprefix = context->SegGs;
             break;
         case 0x66:
             long_op = !long_op;  /* opcode size prefix */
@@ -460,12 +460,12 @@
                 {
                     switch(*instr)
                     {
-                    case 0x07: ES_reg(context) = seg; break;
-                    case 0x17: SS_reg(context) = seg; break;
-                    case 0x1f: DS_reg(context) = seg; break;
+                    case 0x07: context->SegEs = seg; break;
+                    case 0x17: context->SegSs = seg; break;
+                    case 0x1f: context->SegDs = seg; break;
                     }
                     add_stack(context, long_op ? 4 : 2);
-                    EIP_reg(context) += prefixlen + 1;
+                    context->Eip += prefixlen + 1;
                     return TRUE;
                 }
             }
@@ -478,8 +478,8 @@
 	    	switch (instr[2]) {
 		case 0xc0:
 			ERR("mov eax,cr0 at 0x%08lx, EAX=0x%08lx\n",
-                            EIP_reg(context),EAX_reg(context) );
-			EIP_reg(context) += prefixlen+3;
+                            context->Eip,context->Eax );
+                        context->Eip += prefixlen+3;
 			return TRUE;
 		default:
 			break; /*fallthrough to bad instruction handling */
@@ -499,14 +499,14 @@
 		     * bit 7: PGE   Enable global pages
 		     * bit 8: PCE	Enable performance counters at IPL3
 		     */
-		    ERR("mov cr4,eax at 0x%08lx\n",EIP_reg(context));
-		    EAX_reg(context) = 0;
-		    EIP_reg(context) += prefixlen+3;
+                    ERR("mov cr4,eax at 0x%08lx\n",context->Eip);
+                    context->Eax = 0;
+                    context->Eip += prefixlen+3;
 		    return TRUE;
 		case 0xc0: /* mov cr0, eax */
-		    ERR("mov cr0,eax at 0x%08lx\n",EIP_reg(context));
-		    EAX_reg(context) = 0x10; /* FIXME: set more bits ? */
-		    EIP_reg(context) += prefixlen+3;
+                    ERR("mov cr0,eax at 0x%08lx\n",context->Eip);
+                    context->Eax = 0x10; /* FIXME: set more bits ? */
+                    context->Eip += prefixlen+3;
 		    return TRUE;
 		default: /* fallthrough to illegal instruction */
 		    break;
@@ -518,9 +518,9 @@
                     WORD seg = *(WORD *)get_stack( context );
                     if (INSTR_ReplaceSelector( context, &seg ))
                     {
-                        FS_reg(context) = seg;
+                        context->SegFs = seg;
                         add_stack(context, long_op ? 4 : 2);
-                        EIP_reg(context) += prefixlen + 2;
+                        context->Eip += prefixlen + 2;
                         return TRUE;
                     }
                 }
@@ -530,9 +530,9 @@
                     WORD seg = *(WORD *)get_stack( context );
                     if (INSTR_ReplaceSelector( context, &seg ))
                     {
-                        GS_reg(context) = seg;
+                        context->SegGs = seg;
                         add_stack(context, long_op ? 4 : 2);
-                        EIP_reg(context) += prefixlen + 2;
+                        context->Eip += prefixlen + 2;
                         return TRUE;
                     }
                 }
@@ -543,7 +543,7 @@
                 if (INSTR_EmulateLDS( context, instr, long_op,
                                       long_addr, segprefix, &len ))
                 {
-                    EIP_reg(context) += prefixlen + len;
+                    context->Eip += prefixlen + len;
                     return TRUE;
                 }
                 break;
@@ -558,10 +558,10 @@
 	      int typ = *instr;  /* Just in case it's overwritten.  */
 	      int outp = (typ >= 0x6e);
 	      unsigned long count = repX ?
-                          (long_addr ? ECX_reg(context) : LOWORD(ECX_reg(context))) : 1;
+                          (long_addr ? context->Ecx : LOWORD(context->Ecx)) : 1;
 	      int opsize = (typ & 1) ? (long_op ? 4 : 2) : 1;
-	      int step = (EFL_reg(context) & 0x400) ? -opsize : +opsize;
-	      int seg = outp ? DS_reg(context) : ES_reg(context);  /* FIXME: is this right? */
+	      int step = (context->EFlags & 0x400) ? -opsize : +opsize;
+	      int seg = outp ? context->SegDs : context->SegEs;  /* FIXME: is this right? */
 
 	      if (outp)
 		/* FIXME: Check segment readable.  */
@@ -572,25 +572,25 @@
 
 	      if (repX)
               {
-		if (long_addr) ECX_reg(context) = 0;
-		else SET_LOWORD(ECX_reg(context),0);
+		if (long_addr) context->Ecx = 0;
+		else SET_LOWORD(context->Ecx,0);
               }
 
 	      while (count-- > 0)
 		{
 		  void *data;
-                  WORD dx = LOWORD(EDX_reg(context));
+                  WORD dx = LOWORD(context->Edx);
 		  if (outp)
                   {
-		      data = make_ptr( context, seg, context->Esi, long_addr );
-		      if (long_addr) ESI_reg(context) += step;
-		      else ADD_LOWORD(ESI_reg(context),step);
+                      data = make_ptr( context, seg, context->Esi, long_addr );
+                      if (long_addr) context->Esi += step;
+                      else ADD_LOWORD(context->Esi,step);
                   }
 		  else
                   {
-		      data = make_ptr( context, seg, context->Edi, long_addr );
-		      if (long_addr) EDI_reg(context) += step;
-		      else ADD_LOWORD(EDI_reg(context),step);
+                      data = make_ptr( context, seg, context->Edi, long_addr );
+                      if (long_addr) context->Edi += step;
+                      else ADD_LOWORD(context->Edi,step);
                   }
                   
 		  switch (typ)
@@ -615,7 +615,7 @@
                         break;
 		    }
 		}
-              EIP_reg(context) += prefixlen + 1;
+              context->Eip += prefixlen + 1;
 	    }
             return TRUE;
 
@@ -633,26 +633,26 @@
                 switch((instr[1] >> 3) & 7)
                 {
                 case 0:
-                    ES_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    context->SegEs = seg;
+                    context->Eip += prefixlen + len + 1;
                     return TRUE;
                 case 1:  /* cs */
                     break;
                 case 2:
-                    SS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    context->SegSs = seg;
+                    context->Eip += prefixlen + len + 1;
                     return TRUE;
                 case 3:
-                    DS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    context->SegDs = seg;
+                    context->Eip += prefixlen + len + 1;
                     return TRUE;
                 case 4:
-                    FS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    context->SegFs = seg;
+                    context->Eip += prefixlen + len + 1;
                     return TRUE;
                 case 5:
-                    GS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    context->SegGs = seg;
+                    context->Eip += prefixlen + len + 1;
                     return TRUE;
                 case 6:  /* unused */
                 case 7:  /* unused */
@@ -666,7 +666,7 @@
             if (INSTR_EmulateLDS( context, instr, long_op,
                                   long_addr, segprefix, &len ))
             {
-                EIP_reg(context) += prefixlen + len;
+                context->Eip += prefixlen + len;
                 return TRUE;
             }
             break;  /* Unable to emulate it */
@@ -684,17 +684,17 @@
                 if (!addr)
                 {
                     FIXME("no handler for interrupt %02x, ignoring it\n", instr[1]);
-                    EIP_reg(context) += prefixlen + 2;
+                    context->Eip += prefixlen + 2;
                     return TRUE;
                 }
                 /* Push the flags and return address on the stack */
-                *(--stack) = LOWORD(EFL_reg(context));
-                *(--stack) = CS_reg(context);
-                *(--stack) = LOWORD(EIP_reg(context)) + prefixlen + 2;
+                *(--stack) = LOWORD(context->EFlags);
+                *(--stack) = context->SegCs;
+                *(--stack) = LOWORD(context->Eip) + prefixlen + 2;
                 add_stack(context, -3 * sizeof(WORD));
                 /* Jump to the interrupt handler */
-                CS_reg(context)  = HIWORD(addr);
-                EIP_reg(context) = LOWORD(addr);
+                context->SegCs  = HIWORD(addr);
+                context->Eip = LOWORD(addr);
             }
             return TRUE;
 
@@ -702,95 +702,94 @@
             if (long_op)
             {
                 DWORD *stack = get_stack( context );
-                EIP_reg(context) = *stack++;
-                CS_reg(context)  = *stack++;
-                EFL_reg(context) = *stack;
+                context->Eip = *stack++;
+                context->SegCs  = *stack++;
+                context->EFlags = *stack;
                 add_stack(context, 3*sizeof(DWORD));  /* Pop the return address and flags */
             }
             else
             {
                 WORD *stack = get_stack( context );
-                EIP_reg(context) = *stack++;
-                CS_reg(context)  = *stack++;
-                SET_LOWORD(EFL_reg(context),*stack);
+                context->Eip = *stack++;
+                context->SegCs  = *stack++;
+                SET_LOWORD(context->EFlags,*stack);
                 add_stack(context, 3*sizeof(WORD));  /* Pop the return address and flags */
             }
             return TRUE;
 
         case 0xe4: /* inb al,XX */
-            SET_LOBYTE(EAX_reg(context),INSTR_inport( instr[1], 1, context ));
-	    EIP_reg(context) += prefixlen + 2;
+            SET_LOBYTE(context->Eax,INSTR_inport( instr[1], 1, context ));
+            context->Eip += prefixlen + 2;
             return TRUE;
 
         case 0xe5: /* in (e)ax,XX */
             if (long_op)
-                EAX_reg(context) = INSTR_inport( instr[1], 4, context );
+                context->Eax = INSTR_inport( instr[1], 4, context );
             else
-                SET_LOWORD(EAX_reg(context), INSTR_inport( instr[1], 2, context ));
-	    EIP_reg(context) += prefixlen + 2;
+                SET_LOWORD(context->Eax, INSTR_inport( instr[1], 2, context ));
+            context->Eip += prefixlen + 2;
             return TRUE;
 
         case 0xe6: /* outb XX,al */
-            INSTR_outport( instr[1], 1, LOBYTE(EAX_reg(context)), context );
-	    EIP_reg(context) += prefixlen + 2;
+            INSTR_outport( instr[1], 1, LOBYTE(context->Eax), context );
+            context->Eip += prefixlen + 2;
             return TRUE;
 
         case 0xe7: /* out XX,(e)ax */
             if (long_op)
-                INSTR_outport( instr[1], 4, EAX_reg(context), context );
+                INSTR_outport( instr[1], 4, context->Eax, context );
             else
-                INSTR_outport( instr[1], 2, LOWORD(EAX_reg(context)), context );
-  	    EIP_reg(context) += prefixlen + 2;
+                INSTR_outport( instr[1], 2, LOWORD(context->Eax), context );
+            context->Eip += prefixlen + 2;
             return TRUE;
 
         case 0xec: /* inb al,dx */
-            SET_LOBYTE(EAX_reg(context), INSTR_inport( LOWORD(EDX_reg(context)), 1, context ) );
-  	    EIP_reg(context) += prefixlen + 1;
+            SET_LOBYTE(context->Eax, INSTR_inport( LOWORD(context->Edx), 1, context ) );
+            context->Eip += prefixlen + 1;
             return TRUE;
 
         case 0xed: /* in (e)ax,dx */
             if (long_op)
-                EAX_reg(context) = INSTR_inport( LOWORD(EDX_reg(context)), 4, context );
+                context->Eax = INSTR_inport( LOWORD(context->Edx), 4, context );
             else
-                SET_LOWORD(EAX_reg(context), INSTR_inport( LOWORD(EDX_reg(context)), 2, context ));
-  	    EIP_reg(context) += prefixlen + 1;
+                SET_LOWORD(context->Eax, INSTR_inport( LOWORD(context->Edx), 2, context ));
+            context->Eip += prefixlen + 1;
             return TRUE;
 
         case 0xee: /* outb dx,al */
-            INSTR_outport( LOWORD(EDX_reg(context)), 1, LOBYTE(EAX_reg(context)), context );
-  	    EIP_reg(context) += prefixlen + 1;
+            INSTR_outport( LOWORD(context->Edx), 1, LOBYTE(context->Eax), context );
+            context->Eip += prefixlen + 1;
             return TRUE;
-      
+
         case 0xef: /* out dx,(e)ax */
             if (long_op)
-                INSTR_outport( LOWORD(EDX_reg(context)), 4, EAX_reg(context), context );
+                INSTR_outport( LOWORD(context->Edx), 4, context->Eax, context );
             else
-                INSTR_outport( LOWORD(EDX_reg(context)), 2, LOWORD(EAX_reg(context)), context );
-  	    EIP_reg(context) += prefixlen + 1;
+                INSTR_outport( LOWORD(context->Edx), 2, LOWORD(context->Eax), context );
+            context->Eip += prefixlen + 1;
             return TRUE;
 
         case 0xfa: /* cli, ignored */
-  	    EIP_reg(context) += prefixlen + 1;
+            context->Eip += prefixlen + 1;
             return TRUE;
 
         case 0xfb: /* sti, ignored */
-  	    EIP_reg(context) += prefixlen + 1;
+            context->Eip += prefixlen + 1;
             return TRUE;
     }
 
 
     /* Check for Win16 __GP handler */
-    gpHandler = HasGPHandler16( PTR_SEG_OFF_TO_SEGPTR( CS_reg(context),
-                                                       EIP_reg(context) ) );
+    gpHandler = HasGPHandler16( PTR_SEG_OFF_TO_SEGPTR( context->SegCs, context->Eip ) );
     if (gpHandler)
     {
         WORD *stack = get_stack( context );
-        *--stack = CS_reg(context);
-        *--stack = EIP_reg(context);
+        *--stack = context->SegCs;
+        *--stack = context->Eip;
         add_stack(context, -2*sizeof(WORD));
 
-        CS_reg(context) = SELECTOROF( gpHandler );
-        EIP_reg(context) = OFFSETOF( gpHandler );
+        context->SegCs = SELECTOROF( gpHandler );
+        context->Eip   = OFFSETOF( gpHandler );
         return TRUE;
     }
     return FALSE;  /* Unable to emulate it */
diff --git a/memory/selector.c b/memory/selector.c
index 392de3e..2f3a90f 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -690,15 +690,15 @@
 x_SMapLS_IP_EBP_x(CONTEXT86 *context,int argoff) {
     DWORD	val,ptr; 
 
-    val =*(DWORD*)(EBP_reg(context)+argoff);
+    val =*(DWORD*)(context->Ebp + argoff);
     if (val<0x10000) {
 	ptr=val;
-	*(DWORD*)(EBP_reg(context)+argoff) = 0;
+        *(DWORD*)(context->Ebp + argoff) = 0;
     } else {
     	ptr = MapLS((LPVOID)val);
-	*(DWORD*)(EBP_reg(context)+argoff) = ptr;
+        *(DWORD*)(context->Ebp + argoff) = ptr;
     }
-    EAX_reg(context) = ptr;
+    context->Eax = ptr;
 }
 
 /***********************************************************************
@@ -751,11 +751,12 @@
  */
 void WINAPI SMapLS( CONTEXT86 *context )
 {
-    if (EAX_reg(context)>=0x10000) {
-	EAX_reg(context) = MapLS((LPVOID)EAX_reg(context));
-	EDX_reg(context) = EAX_reg(context);
+    if (HIWORD(context->Eax))
+    {
+        context->Eax = MapLS( (LPVOID)context->Eax );
+        context->Edx = context->Eax;
     } else {
-	EDX_reg(context) = 0;
+        context->Edx = 0;
     }
 }
 
@@ -765,15 +766,17 @@
 
 void WINAPI SUnMapLS( CONTEXT86 *context )
 {
-    if (EAX_reg(context)>=0x10000)
-	UnMapLS((SEGPTR)EAX_reg(context));
+    if (HIWORD(context->Eax)) UnMapLS( (SEGPTR)context->Eax );
 }
 
-static void
-x_SUnMapLS_IP_EBP_x(CONTEXT86 *context,int argoff) {
-	if (*(DWORD*)(EBP_reg(context)+argoff))
-		UnMapLS(*(DWORD*)(EBP_reg(context)+argoff));
-	*(DWORD*)(EBP_reg(context)+argoff)=0;
+inline static void x_SUnMapLS_IP_EBP_x(CONTEXT86 *context,int argoff)
+{
+    SEGPTR *ptr = (SEGPTR *)(context->Ebp + argoff);
+    if (*ptr)
+    {
+        UnMapLS( *ptr );
+        *ptr = 0;
+    }
 }
 
 /***********************************************************************
@@ -842,7 +845,7 @@
 
 void WINAPI AllocMappedBuffer( CONTEXT86 *context )
 {
-    HGLOBAL handle = GlobalAlloc(0, EDI_reg(context) + 8);
+    HGLOBAL handle = GlobalAlloc(0, context->Edi + 8);
     DWORD *buffer = (DWORD *)GlobalLock(handle);
     SEGPTR ptr = 0;
 
@@ -854,14 +857,14 @@
         }
 
     if (!ptr)
-        EAX_reg(context) = EDI_reg(context) = 0;
+        context->Eax = context->Edi = 0;
     else
     {
         buffer[0] = handle;
         buffer[1] = ptr;
 
-        EAX_reg(context) = (DWORD) ptr;
-        EDI_reg(context) = (DWORD)(buffer + 2);
+        context->Eax = (DWORD) ptr;
+        context->Edi = (DWORD)(buffer + 2);
     }
 }
 
@@ -875,9 +878,9 @@
 
 void WINAPI FreeMappedBuffer( CONTEXT86 *context )
 {
-    if (EDI_reg(context))
+    if (context->Edi)
     {
-        DWORD *buffer = (DWORD *)EDI_reg(context) - 2;
+        DWORD *buffer = (DWORD *)context->Edi - 2;
 
         UnMapLS(buffer[1]);
 
diff --git a/misc/error.c b/misc/error.c
index 00e71f5..216417d 100644
--- a/misc/error.c
+++ b/misc/error.c
@@ -162,11 +162,9 @@
 */
 void WINAPI HandleParamError( CONTEXT86 *context )
 {
-	UINT16 uErr = BX_reg( context );
-        FARPROC16 lpfn = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( CS_reg(context),
-                                                           EIP_reg(context) );
-        LPVOID lpvParam = (LPVOID)MAKELONG( AX_reg( context ), 
-                                            CX_reg( context ) );
+	UINT16 uErr = LOWORD(context->Ebx);
+        FARPROC16 lpfn = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( context->SegCs, context->Eip );
+        LPVOID lpvParam = (LPVOID)MAKELONG( LOWORD(context->Eax), LOWORD(context->Ecx) );
 	
 	LogParamError16( uErr, lpfn, lpvParam );
 
@@ -175,15 +173,14 @@
 		/* Abort current procedure: Unwind stack frame and jump
 		   to error handler (location at [bp-2]) */
 
-		WORD *stack = PTR_SEG_OFF_TO_LIN( SS_reg( context ), 
-						  LOWORD(EBP_reg( context )) );
-		ESP_reg( context ) = LOWORD(EBP_reg( context )) - 2;
-		EBP_reg( context ) = stack[0] & 0xfffe;
+		WORD *stack = PTR_SEG_OFF_TO_LIN( context->SegSs, LOWORD(context->Ebp) );
+		context->Esp = LOWORD(context->Ebp) - 2;
+		context->Ebp = stack[0] & 0xfffe;
 
-		EIP_reg( context ) = stack[-1];
+		context->Eip = stack[-1];
 
-		EAX_reg( context ) = ECX_reg( context ) = EDX_reg( context ) = 0;
-		ES_reg( context) = 0;
+		context->Eax = context->Ecx = context->Edx = 0;
+		context->SegEs = 0;
 	}
 }
 
diff --git a/misc/system.c b/misc/system.c
index ad5c849..3bac228 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -129,9 +129,9 @@
     CONTEXT86 context;
     memset( &context, '\0', sizeof(context) );
 
-    CS_reg( &context )  = SELECTOROF( proc );
-    EIP_reg( &context ) = OFFSETOF( proc );
-    EBP_reg( &context ) = OFFSETOF( NtCurrentTeb()->cur_stack )
+    context.SegCs = SELECTOROF( proc );
+    context.Eip   = OFFSETOF( proc );
+    context.Ebp   = OFFSETOF( NtCurrentTeb()->cur_stack )
                           + (WORD)&((STACK16FRAME*)0)->bp;
 
     AX_reg( &context ) = timer;
diff --git a/msdos/devices.c b/msdos/devices.c
index 3fcccba..57146ed 100644
--- a/msdos/devices.c
+++ b/msdos/devices.c
@@ -141,16 +141,16 @@
 /* the device implementations */
 static void do_lret(CONTEXT86*ctx)
 {
-  WORD *stack = CTX_SEG_OFF_TO_LIN(ctx, SS_reg(ctx), ESP_reg(ctx));
+  WORD *stack = CTX_SEG_OFF_TO_LIN(ctx, ctx->SegSs, ctx->Esp);
 
-  EIP_reg(ctx) = *(stack++);
-  CS_reg(ctx)  = *(stack++);
-  ESP_reg(ctx) += 2*sizeof(WORD);
+  ctx->Eip   = *(stack++);
+  ctx->SegCs = *(stack++);
+  ctx->Esp  += 2*sizeof(WORD);
 }
 
 static void do_strategy(CONTEXT86*ctx, int id, int extra)
 {
-  REQUEST_HEADER *hdr = CTX_SEG_OFF_TO_LIN(ctx, ES_reg(ctx), EBX_reg(ctx));
+  REQUEST_HEADER *hdr = CTX_SEG_OFF_TO_LIN(ctx, ctx->SegEs, ctx->Ebx);
   void **hdr_ptr = strategy_data[id];
 
   if (!hdr_ptr) {
@@ -527,17 +527,17 @@
   memset(&ctx, 0, sizeof(ctx));
 
   /* ES:BX points to request for strategy routine */
-  ES_reg(&ctx)  = HIWORD(DOS_LOLSeg);
-  EBX_reg(&ctx) = DOS_DATASEG_OFF(req);
+  ctx.SegEs = HIWORD(DOS_LOLSeg);
+  ctx.Ebx   = DOS_DATASEG_OFF(req);
 
   /* call strategy routine */
-  CS_reg(&ctx) = SELECTOROF(dev);
-  EIP_reg(&ctx) = dhdr->strategy;
+  ctx.SegCs = SELECTOROF(dev);
+  ctx.Eip   = dhdr->strategy;
   DPMI_CallRMProc(&ctx, 0, 0, 0);
 
   /* call interrupt routine */
-  CS_reg(&ctx) = SELECTOROF(dev);
-  EIP_reg(&ctx) = dhdr->interrupt;
+  ctx.SegCs = SELECTOROF(dev);
+  ctx.Eip   = dhdr->interrupt;
   DPMI_CallRMProc(&ctx, 0, 0, 0);
 
   /* completed, copy request back */
diff --git a/msdos/dosaspi.c b/msdos/dosaspi.c
index 5e950e2..13f5a99 100644
--- a/msdos/dosaspi.c
+++ b/msdos/dosaspi.c
@@ -66,8 +66,8 @@
 		/* Zero everything */
 		memset(&ctx, 0, sizeof(ctx));
 		/* CS:IP is routine to call */
-		CS_reg(&ctx) = SELECTOROF(lpSRB16->cmd.SRB_PostProc);
-		EIP_reg(&ctx) = OFFSETOF(lpSRB16->cmd.SRB_PostProc);
+		ctx.SegCs = SELECTOROF(lpSRB16->cmd.SRB_PostProc);
+		ctx.Eip   = OFFSETOF(lpSRB16->cmd.SRB_PostProc);
 		/* DPMI_CallRMProc will push the pointer to the stack
 		 * it is given (in this case &ptrSRB) with length
 		 * 2*sizeof(WORD), that is, it copies the the contents
@@ -156,22 +156,22 @@
 
 void WINAPI ASPI_DOS_func(CONTEXT86 *context)
 {
-	WORD *stack = CTX_SEG_OFF_TO_LIN(context, SS_reg(context), ESP_reg(context));
+	WORD *stack = CTX_SEG_OFF_TO_LIN(context, context->SegSs, context->Esp);
 	DWORD ptrSRB = *(DWORD *)&stack[2];
 
 	ASPI_SendASPIDOSCommand(ptrSRB);
 
 	/* simulate a normal RETF sequence as required by DPMI CallRMProcFar */
-	EIP_reg(context) = *(stack++);
-	CS_reg(context)  = *(stack++);
-	ESP_reg(context) += 2*sizeof(WORD);
+	context->Eip = *(stack++);
+	context->SegCs  = *(stack++);
+	context->Esp += 2*sizeof(WORD);
 }
 
 
 /* returns the address of a real mode callback to ASPI_DOS_func() */
 void ASPI_DOS_HandleInt(CONTEXT86 *context)
 {
-	FARPROC16 *p = (FARPROC16 *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+	FARPROC16 *p = (FARPROC16 *)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
 	TRACE("DOS ASPI opening\n");
 	if ((CX_reg(context) == 4) || (CX_reg(context) == 5))
 	{
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index d116467..62f2a68 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -139,22 +139,22 @@
  */
 static void INT_GetRealModeContext( REALMODECALL *call, CONTEXT86 *context )
 {
-    EAX_reg(context) = call->eax;
-    EBX_reg(context) = call->ebx;
-    ECX_reg(context) = call->ecx;
-    EDX_reg(context) = call->edx;
-    ESI_reg(context) = call->esi;
-    EDI_reg(context) = call->edi;
-    EBP_reg(context) = call->ebp;
-    EFL_reg(context) = call->fl | V86_FLAG;
-    EIP_reg(context) = call->ip;
-    ESP_reg(context) = call->sp;
-    CS_reg(context)  = call->cs;
-    DS_reg(context)  = call->ds;
-    ES_reg(context)  = call->es;
-    FS_reg(context)  = call->fs;
-    GS_reg(context)  = call->gs;
-    SS_reg(context)  = call->ss;
+    context->Eax    = call->eax;
+    context->Ebx    = call->ebx;
+    context->Ecx    = call->ecx;
+    context->Edx    = call->edx;
+    context->Esi    = call->esi;
+    context->Edi    = call->edi;
+    context->Ebp    = call->ebp;
+    context->EFlags = call->fl | V86_FLAG;
+    context->Eip    = call->ip;
+    context->Esp    = call->sp;
+    context->SegCs  = call->cs;
+    context->SegDs  = call->ds;
+    context->SegEs  = call->es;
+    context->SegFs  = call->fs;
+    context->SegGs  = call->gs;
+    context->SegSs  = call->ss;
 }
 
 
@@ -163,22 +163,22 @@
  */
 static void INT_SetRealModeContext( REALMODECALL *call, CONTEXT86 *context )
 {
-    call->eax = EAX_reg(context);
-    call->ebx = EBX_reg(context);
-    call->ecx = ECX_reg(context);
-    call->edx = EDX_reg(context);
-    call->esi = ESI_reg(context);
-    call->edi = EDI_reg(context);
-    call->ebp = EBP_reg(context);
-    call->fl  = LOWORD(EFL_reg(context));
-    call->ip  = LOWORD(EIP_reg(context));
-    call->sp  = LOWORD(ESP_reg(context));
-    call->cs  = CS_reg(context);
-    call->ds  = DS_reg(context);
-    call->es  = ES_reg(context);
-    call->fs  = FS_reg(context);
-    call->gs  = GS_reg(context);
-    call->ss  = SS_reg(context);
+    call->eax = context->Eax;
+    call->ebx = context->Ebx;
+    call->ecx = context->Ecx;
+    call->edx = context->Edx;
+    call->esi = context->Esi;
+    call->edi = context->Edi;
+    call->ebp = context->Ebp;
+    call->fl  = LOWORD(context->EFlags);
+    call->ip  = LOWORD(context->Eip);
+    call->sp  = LOWORD(context->Esp);
+    call->cs  = context->SegCs;
+    call->ds  = context->SegDs;
+    call->es  = context->SegEs;
+    call->fs  = context->SegFs;
+    call->gs  = context->SegGs;
+    call->ss  = context->SegSs;
 }
 
 #ifdef __i386__
@@ -260,8 +260,8 @@
         DWORD esp,edi;
 
         INT_SetRealModeContext((REALMODECALL *)PTR_SEG_OFF_TO_LIN( rmcb->regs_sel, rmcb->regs_ofs ), context);
-        ss = SELECTOR_AllocBlock( (void *)(SS_reg(context)<<4), 0x10000, SEGMENT_DATA, FALSE, FALSE );
-        esp = ESP_reg(context);
+        ss = SELECTOR_AllocBlock( (void *)(context->SegSs<<4), 0x10000, SEGMENT_DATA, FALSE, FALSE );
+        esp = context->Esp;
 
         FIXME("untested!\n");
 
@@ -278,16 +278,16 @@
         } else {
             /* 16-bit DPMI client */
             CONTEXT86 ctx = *context;
-            CS_reg(&ctx) = rmcb->proc_sel;
-            EIP_reg(&ctx) = rmcb->proc_ofs;
-            DS_reg(&ctx) = ss;
-            ESI_reg(&ctx) = esp;
-            ES_reg(&ctx) = rmcb->regs_sel;
-            EDI_reg(&ctx) = rmcb->regs_ofs;
+            ctx.SegCs = rmcb->proc_sel;
+            ctx.Eip   = rmcb->proc_ofs;
+            ctx.SegDs = ss;
+            ctx.Esi   = esp;
+            ctx.SegEs = rmcb->regs_sel;
+            ctx.Edi   = rmcb->regs_ofs;
             /* FIXME: I'm pretty sure this isn't right - should push flags first */
             CallTo16RegisterShort(&ctx, 0);
-            es = ES_reg(&ctx);
-            edi = EDI_reg(&ctx);
+            es = ctx.SegEs;
+            edi = ctx.Edi;
         }
 	SELECTOR_FreeBlock(ss, 1);
         INT_GetRealModeContext((REALMODECALL*)PTR_SEG_OFF_TO_LIN( es, edi ), context);
@@ -315,41 +315,41 @@
     GlobalUnlock16( GetCurrentTask() );
 
     TRACE("EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
-                 EAX_reg(context), EBX_reg(context), ECX_reg(context), EDX_reg(context) );
+                 context->Eax, context->Ebx, context->Ecx, context->Edx );
     TRACE("ESI=%08lx EDI=%08lx ES=%04lx DS=%04lx CS:IP=%04lx:%04x, %d WORD arguments, %s\n",
-                 ESI_reg(context), EDI_reg(context), ES_reg(context), DS_reg(context),
-                 CS_reg(context), LOWORD(EIP_reg(context)), args, iret?"IRET":"FAR" );
+                 context->Esi, context->Edi, context->SegEs, context->SegDs,
+                 context->SegCs, LOWORD(context->Eip), args, iret?"IRET":"FAR" );
 
 callrmproc_again:
 
 /* there might be some code that just jumps to RMCBs or the like,
    in which case following the jumps here might get us to a shortcut */
-    code = CTX_SEG_OFF_TO_LIN(context, CS_reg(context), EIP_reg(context));
+    code = CTX_SEG_OFF_TO_LIN(context, context->SegCs, context->Eip);
     switch (*code) {
     case 0xe9: /* JMP NEAR */
-      EIP_reg(context) += 3 + *(WORD *)(code+1);
+      context->Eip += 3 + *(WORD *)(code+1);
       /* yeah, I know these gotos don't look good... */
       goto callrmproc_again;
     case 0xea: /* JMP FAR */
-      EIP_reg(context) = *(WORD *)(code+1);
-      CS_reg(context) = *(WORD *)(code+3);
+      context->Eip = *(WORD *)(code+1);
+      context->SegCs = *(WORD *)(code+3);
       /* ...but since the label is there anyway... */
       goto callrmproc_again;
     case 0xeb: /* JMP SHORT */
-      EIP_reg(context) += 2 + *(signed char *)(code+1);
+      context->Eip += 2 + *(signed char *)(code+1);
       /* ...because of other gotos below, so... */
       goto callrmproc_again;
     }
 
 /* shortcut for chaining to internal interrupt handlers */
-    if ((CS_reg(context) == 0xF000) && iret) {
-        return INT_RealModeInterrupt( LOWORD(EIP_reg(context))/4, context);
+    if ((context->SegCs == 0xF000) && iret) {
+        return INT_RealModeInterrupt( LOWORD(context->Eip)/4, context);
     }
 
 /* shortcut for RMCBs */
     CurrRMCB = FirstRMCB;
 
-    while (CurrRMCB && (HIWORD(CurrRMCB->address) != CS_reg(context)))
+    while (CurrRMCB && (HIWORD(CurrRMCB->address) != context->SegCs))
         CurrRMCB = CurrRMCB->next;
 
     if (!(CurrRMCB || lpDosTask)) {
@@ -361,31 +361,31 @@
         }
     }
     if (!already) {
-        if (!SS_reg(context)) {
+        if (!context->SegSs) {
             alloc = 1; /* allocate default stack */
-            stack16 = addr = DOSMEM_GetBlock( 64, (UINT16 *)&(SS_reg(context)) );
-            ESP_reg(context) = 64-2;
+            stack16 = addr = DOSMEM_GetBlock( 64, (UINT16 *)&(context->SegSs) );
+            context->Esp = 64-2;
             stack16 += 32-1;
             if (!addr) {
                 ERR("could not allocate default stack\n");
                 return 1;
             }
         } else {
-            stack16 = CTX_SEG_OFF_TO_LIN(context, SS_reg(context), ESP_reg(context));
+            stack16 = CTX_SEG_OFF_TO_LIN(context, context->SegSs, context->Esp);
         }
-        ESP_reg(context) -= (args + (iret?1:0)) * sizeof(WORD);
+        context->Esp -= (args + (iret?1:0)) * sizeof(WORD);
         stack16 -= args;
         if (args) memcpy(stack16, stack, args*sizeof(WORD) );
         /* push flags if iret */
         if (iret) {
             stack16--; args++;
-            *stack16 = LOWORD(EFL_reg(context));
+            *stack16 = LOWORD(context->EFlags);
         }
         /* push return address (return to interrupt wrapper) */
         *(--stack16) = DOSMEM_wrap_seg;
         *(--stack16) = 0;
         /* adjust stack */
-        ESP_reg(context) -= 2*sizeof(WORD);
+        context->Esp -= 2*sizeof(WORD);
         already = 1;
     }
 
@@ -393,8 +393,8 @@
         /* RMCB call, invoke protected-mode handler directly */
         DPMI_CallRMCBProc(context, CurrRMCB, lpDosTask ? lpDosTask->dpmi_flag : 0);
         /* check if we returned to where we thought we would */
-        if ((CS_reg(context) != DOSMEM_wrap_seg) ||
-            (LOWORD(EIP_reg(context)) != 0)) {
+        if ((context->SegCs != DOSMEM_wrap_seg) ||
+            (LOWORD(context->Eip) != 0)) {
             /* we need to continue at different address in real-mode space,
                so we need to set it all up for real mode again */
             goto callrmproc_again;
@@ -416,15 +416,15 @@
 {
     CONTEXT86 realmode_ctx;
     FARPROC16 rm_int = INT_GetRMHandler( BL_reg(context) );
-    REALMODECALL *call = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context),
+    REALMODECALL *call = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( context->SegEs,
                                                           DI_reg(context) );
     INT_GetRealModeContext( call, &realmode_ctx );
 
     /* we need to check if a real-mode program has hooked the interrupt */
     if (HIWORD(rm_int)!=0xF000) {
         /* yup, which means we need to switch to real mode... */
-        CS_reg(&realmode_ctx) = HIWORD(rm_int);
-        EIP_reg(&realmode_ctx) = LOWORD(rm_int);
+        realmode_ctx.SegCs = HIWORD(rm_int);
+        realmode_ctx.Eip   = LOWORD(rm_int);
         if (DPMI_CallRMProc( &realmode_ctx, NULL, 0, TRUE))
           SET_CFLAG(context);
     } else {
@@ -433,13 +433,13 @@
            decide to move interrupts around for whatever reason... */
         if (INT_RealModeInterrupt( LOWORD(rm_int)/4, &realmode_ctx ))
           SET_CFLAG(context);
-        if (EFL_reg(context)&1) {
+        if (context->EFlags & 1) {
           FIXME("%02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
-                BL_reg(context), EAX_reg(&realmode_ctx), EBX_reg(&realmode_ctx), 
-                ECX_reg(&realmode_ctx), EDX_reg(&realmode_ctx));
+                BL_reg(context), realmode_ctx.Eax, realmode_ctx.Ebx,
+                realmode_ctx.Ecx, realmode_ctx.Edx);
           FIXME("      ESI=%08lx EDI=%08lx DS=%04lx ES=%04lx\n",
-                ESI_reg(&realmode_ctx), EDI_reg(&realmode_ctx), 
-                DS_reg(&realmode_ctx), ES_reg(&realmode_ctx) );
+                realmode_ctx.Esi, realmode_ctx.Edi,
+                realmode_ctx.SegDs, realmode_ctx.SegEs );
         }
     }
     INT_SetRealModeContext( call, &realmode_ctx );
@@ -448,7 +448,7 @@
 
 static void CallRMProc( CONTEXT86 *context, int iret )
 {
-    REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
+    REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( context->SegEs, DI_reg(context) );
     CONTEXT86 context16;
 
     TRACE("RealModeCall: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
@@ -463,7 +463,7 @@
 	return;
     }
     INT_GetRealModeContext(p, &context16);
-    DPMI_CallRMProc( &context16, ((LPWORD)PTR_SEG_OFF_TO_LIN(SS_reg(context), LOWORD(ESP_reg(context))))+3,
+    DPMI_CallRMProc( &context16, ((LPWORD)PTR_SEG_OFF_TO_LIN(context->SegSs, LOWORD(context->Esp)))+3,
                      CX_reg(context), iret );
     INT_SetRealModeContext(p, &context16);
 }
@@ -497,21 +497,21 @@
 {
     RMCB *NewRMCB = DPMI_AllocRMCB();
 
-    TRACE("Function to call: %04x:%04x\n", (WORD)DS_reg(context), SI_reg(context) );
+    TRACE("Function to call: %04x:%04x\n", (WORD)context->SegDs, SI_reg(context) );
 
     if (NewRMCB)
     {
 	/* FIXME: if 32-bit DPMI client, use ESI and EDI */
-	NewRMCB->proc_ofs = SI_reg(context);
-	NewRMCB->proc_sel = DS_reg(context);
-	NewRMCB->regs_ofs = DI_reg(context);
-	NewRMCB->regs_sel = ES_reg(context);
-	SET_LOWORD( ECX_reg(context), HIWORD(NewRMCB->address) );
-	SET_LOWORD( EDX_reg(context), LOWORD(NewRMCB->address) );
+	NewRMCB->proc_ofs = LOWORD(context->Esi);
+	NewRMCB->proc_sel = context->SegDs;
+	NewRMCB->regs_ofs = LOWORD(context->Edi);
+	NewRMCB->regs_sel = context->SegEs;
+	SET_LOWORD( context->Ecx, HIWORD(NewRMCB->address) );
+	SET_LOWORD( context->Edx, LOWORD(NewRMCB->address) );
     }
     else
     {
-	SET_LOWORD( EAX_reg(context), 0x8015 ); /* callback unavailable */
+	SET_LOWORD( context->Eax, 0x8015 ); /* callback unavailable */
 	SET_CFLAG(context);
     }
 }
@@ -562,7 +562,7 @@
           CX_reg(context), DX_reg(context));
 
     if (DPMI_FreeRMCB(MAKELONG(DX_reg(context), CX_reg(context)))) {
-	SET_LOWORD( EAX_reg(context), 0x8024 ); /* invalid callback address */
+	SET_LOWORD( context->Eax, 0x8024 ); /* invalid callback address */
 	SET_CFLAG(context);
     }
 }
@@ -594,24 +594,24 @@
    can be used in 32-bit code. Otherwise, these CPUs may not set the high word of esp during a
    ring transition (from kernel code) to the 16-bit stack, and this causes trouble if executing
    32-bit code using this stack. */
-    ss = SELECTOR_AllocBlock( (void *)(SS_reg(context)<<4), 0x10000, SEGMENT_DATA, is32, FALSE );
+    ss = SELECTOR_AllocBlock( (void *)(context->SegSs<<4), 0x10000, SEGMENT_DATA, is32, FALSE );
 /* do the same for the data segments, just in case */
-    if (DS_reg(context) == SS_reg(context)) ds = ss;
-    else ds = SELECTOR_AllocBlock( (void *)(DS_reg(context)<<4), 0x10000, SEGMENT_DATA, is32, FALSE );
+    if (context->SegDs == context->SegSs) ds = ss;
+    else ds = SELECTOR_AllocBlock( (void *)(context->SegDs<<4), 0x10000, SEGMENT_DATA, is32, FALSE );
     es = SELECTOR_AllocBlock( psp, 0x100, SEGMENT_DATA, is32, FALSE );
 /* convert environment pointer, as the spec says, but we're a bit lazy about the size here... */
     psp->environment = SELECTOR_AllocBlock( (void *)(env_seg<<4),
 					    0x10000, SEGMENT_DATA, FALSE, FALSE );
 
     pm_ctx = *context;
-    CS_reg(&pm_ctx) = DOSMEM_dpmi_sel;
+    pm_ctx.SegCs = DOSMEM_dpmi_sel;
 /* our mode switch wrapper expects the new CS in DX, and the new SS in AX */
-    EAX_reg(&pm_ctx) = ss;
-    EDX_reg(&pm_ctx) = cs;
-    DS_reg(&pm_ctx) = ds;
-    ES_reg(&pm_ctx) = es;
-    FS_reg(&pm_ctx) = 0;
-    GS_reg(&pm_ctx) = 0;
+    pm_ctx.Eax   = ss;
+    pm_ctx.Edx   = cs;
+    pm_ctx.SegDs = ds;
+    pm_ctx.SegEs = es;
+    pm_ctx.SegFs = 0;
+    pm_ctx.SegGs = 0;
 
     TRACE("DOS program is now entering protected mode\n");
     CallTo16RegisterShort(&pm_ctx, 0);
@@ -644,20 +644,19 @@
   }
   /* initialize real-mode context as per spec */
   memset(&rm_ctx, 0, sizeof(rm_ctx));
-  DS_reg(&rm_ctx) = AX_sig(context);
-  ES_reg(&rm_ctx) = CX_sig(context);
-  SS_reg(&rm_ctx) = DX_sig(context);
-  ESP_reg(&rm_ctx) = EBX_sig(context);
-  CS_reg(&rm_ctx) = SI_sig(context);
-  EIP_reg(&rm_ctx) = EDI_sig(context);
-  EBP_reg(&rm_ctx) = EBP_sig(context);
-  FS_reg(&rm_ctx) = 0;
-  GS_reg(&rm_ctx) = 0;
-  EFL_reg(&rm_ctx) = EFL_sig(context); /* at least we need the IF flag */
+  rm_ctx.SegDs  = AX_sig(context);
+  rm_ctx.SegEs  = CX_sig(context);
+  rm_ctx.SegSs  = DX_sig(context);
+  rm_ctx.Esp    = EBX_sig(context);
+  rm_ctx.SegCs  = SI_sig(context);
+  rm_ctx.Eip    = EDI_sig(context);
+  rm_ctx.Ebp    = EBP_sig(context);
+  rm_ctx.SegFs  = 0;
+  rm_ctx.SegGs  = 0;
+  rm_ctx.EFlags = EFL_sig(context); /* at least we need the IF flag */
 
   /* enter real mode again */
-  TRACE("re-entering real mode at %04lx:%04lx\n",
-	CS_reg(&rm_ctx),EIP_reg(&rm_ctx));
+  TRACE("re-entering real mode at %04lx:%04lx\n",rm_ctx.SegCs,rm_ctx.Eip);
   ret = DOSVM_Enter( &rm_ctx );
   /* when the real-mode stuff call its mode switch address,
      DOSVM_Enter will return and we will continue here */
@@ -668,13 +667,13 @@
   }
 
   /* alter protected-mode context as per spec */
-  DS_sig(context) = AX_reg(&rm_ctx);
-  ES_sig(context) = CX_reg(&rm_ctx);
-  SS_sig(context) = DX_reg(&rm_ctx);
-  ESP_sig(context) = EBX_reg(&rm_ctx);
-  CS_sig(context) = SI_reg(&rm_ctx);
-  EIP_sig(context) = EDI_reg(&rm_ctx);
-  EBP_sig(context) = EBP_reg(&rm_ctx);
+  DS_sig(context)  = LOWORD(rm_ctx.Eax);
+  ES_sig(context)  = LOWORD(rm_ctx.Ecx);
+  SS_sig(context)  = LOWORD(rm_ctx.Edx);
+  ESP_sig(context) = rm_ctx.Ebx;
+  CS_sig(context)  = LOWORD(rm_ctx.Esi);
+  EIP_sig(context) = rm_ctx.Edi;
+  EBP_sig(context) = rm_ctx.Ebp;
   FS_sig(context) = 0;
   GS_sig(context) = 0;
 
@@ -708,12 +707,12 @@
     if (ISV86(context) && lpDosTask) {
         /* Called from real mode, check if it's our wrapper */
         TRACE("called from real mode\n");
-        if (CS_reg(context)==DOSMEM_dpmi_seg) {
+        if (context->SegCs==DOSMEM_dpmi_seg) {
             /* This is the protected mode switch */
             StartPM(context,lpDosTask);
             return;
         } else
-        if (CS_reg(context)==DOSMEM_xms_seg) {
+        if (context->SegCs==DOSMEM_xms_seg) {
             /* This is the XMS driver entry point */
             XMS_Handler(context);
             return;
@@ -722,7 +721,7 @@
             /* Check for RMCB */
             RMCB *CurrRMCB = FirstRMCB;
             
-            while (CurrRMCB && (HIWORD(CurrRMCB->address) != CS_reg(context)))
+            while (CurrRMCB && (HIWORD(CurrRMCB->address) != context->SegCs))
                 CurrRMCB = CurrRMCB->next;
             
             if (CurrRMCB) {
@@ -738,10 +737,10 @@
     {
     case 0x0000:  /* Allocate LDT descriptors */
     	TRACE("allocate LDT descriptors (%d)\n",CX_reg(context));
-        if (!(EAX_reg(context) = AllocSelectorArray16( CX_reg(context) )))
+        if (!(context->Eax = AllocSelectorArray16( CX_reg(context) )))
         {
     	    TRACE("failed\n");
-            EAX_reg(context) = 0x8011;  /* descriptor unavailable */
+            context->Eax = 0x8011;  /* descriptor unavailable */
             SET_CFLAG(context);
         }
 	TRACE("success, array starts at 0x%04x\n",AX_reg(context));
@@ -751,17 +750,17 @@
     	TRACE("free LDT descriptor (0x%04x)\n",BX_reg(context));
         if (FreeSelector16( BX_reg(context) ))
         {
-            EAX_reg(context) = 0x8022;  /* invalid selector */
+            context->Eax = 0x8022;  /* invalid selector */
             SET_CFLAG(context);
         }
         else
         {
             /* If a segment register contains the selector being freed, */
             /* set it to zero. */
-            if (!((DS_reg(context)^BX_reg(context)) & ~3)) DS_reg(context) = 0;
-            if (!((ES_reg(context)^BX_reg(context)) & ~3)) ES_reg(context) = 0;
-            if (!((FS_reg(context)^BX_reg(context)) & ~3)) FS_reg(context) = 0;
-            if (!((GS_reg(context)^BX_reg(context)) & ~3)) GS_reg(context) = 0;
+            if (!((context->SegDs^BX_reg(context)) & ~3)) context->SegDs = 0;
+            if (!((context->SegEs^BX_reg(context)) & ~3)) context->SegEs = 0;
+            if (!((context->SegFs^BX_reg(context)) & ~3)) context->SegFs = 0;
+            if (!((context->SegGs^BX_reg(context)) & ~3)) context->SegGs = 0;
         }
         break;
 
@@ -781,35 +780,35 @@
             case 0xe000: entryPoint = 190; break;  /* __E000H */
             case 0xf000: entryPoint = 194; break;  /* __F000H */
             default:
-	    	EAX_reg(context) = DOSMEM_AllocSelector(BX_reg(context));
+	    	context->Eax = DOSMEM_AllocSelector(BX_reg(context));
                 break;
             }
             if (entryPoint) 
-                EAX_reg(context) = LOWORD(NE_GetEntryPoint( GetModuleHandle16( "KERNEL" ),
+                context->Eax = LOWORD(NE_GetEntryPoint( GetModuleHandle16( "KERNEL" ),
                                                             entryPoint ));
         }
         break;
 
     case 0x0003:  /* Get next selector increment */
     	TRACE("get selector increment (__AHINCR)\n");
-        EAX_reg(context) = __AHINCR;
+        context->Eax = __AHINCR;
         break;
 
     case 0x0004:  /* Lock selector (not supported) */
     	FIXME("lock selector not supported\n");
-        EAX_reg(context) = 0;  /* FIXME: is this a correct return value? */
+        context->Eax = 0;  /* FIXME: is this a correct return value? */
         break;
 
     case 0x0005:  /* Unlock selector (not supported) */
     	FIXME("unlock selector not supported\n");
-        EAX_reg(context) = 0;  /* FIXME: is this a correct return value? */
+        context->Eax = 0;  /* FIXME: is this a correct return value? */
         break;
 
     case 0x0006:  /* Get selector base address */
     	TRACE("get selector base address (0x%04x)\n",BX_reg(context));
         if (!(dw = GetSelectorBase( BX_reg(context) )))
         {
-            EAX_reg(context) = 0x8022;  /* invalid selector */
+            context->Eax = 0x8022;  /* invalid selector */
             SET_CFLAG(context);
         }
         else
@@ -855,7 +854,7 @@
             entry.base = W32S_WINE2APP(entry.base, offset);
 
             /* FIXME: should use ES:EDI for 32-bit clients */
-            LDT_EntryToBytes( PTR_SEG_OFF_TO_LIN( ES_reg(context),
+            LDT_EntryToBytes( PTR_SEG_OFF_TO_LIN( context->SegEs,
                                                   DI_reg(context) ), &entry );
         }
         break;
@@ -864,7 +863,7 @@
     	TRACE("set descriptor (0x%04x)\n",BX_reg(context));
         {
             ldt_entry entry;
-            LDT_BytesToEntry( PTR_SEG_OFF_TO_LIN( ES_reg(context),
+            LDT_BytesToEntry( PTR_SEG_OFF_TO_LIN( context->SegEs,
                                                   DI_reg(context) ), &entry );
             entry.base = W32S_APP2WINE(entry.base, offset);
             LDT_SetEntry( SELECTOR_TO_ENTRY( BX_reg(context) ), &entry );
@@ -946,21 +945,21 @@
         AX_reg(context) = 0;
 	/* real mode: just point to the lret */
 	BX_reg(context) = DOSMEM_wrap_seg;
-	ECX_reg(context) = 2;
+	context->Ecx = 2;
 	/* protected mode: don't have any handler yet... */
 	FIXME("no protected-mode dummy state save/restore handler yet\n");
 	SI_reg(context) = 0;
-	EDI_reg(context) = 0;
+	context->Edi = 0;
         break;
 
     case 0x0306:  /* Get Raw Mode Switch Addresses */
         TRACE("get raw mode switch addresses\n");
         /* real mode, point to standard DPMI return wrapper */
         BX_reg(context) = DOSMEM_wrap_seg;
-        ECX_reg(context) = 0;
+        context->Ecx = 0;
         /* protected mode, point to DPMI call wrapper */
         SI_reg(context) = DOSMEM_dpmi_sel;
-        EDI_reg(context) = 8; /* offset of the INT 0x31 call */
+        context->Edi = 8; /* offset of the INT 0x31 call */
 	break;
     case 0x0400:  /* Get DPMI version */
         TRACE("get DPMI version\n");
@@ -981,7 +980,7 @@
 
             mmi.dwSize = sizeof(mmi);
             MemManInfo16(&mmi);
-            ptr = (BYTE *)PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context));
+            ptr = (BYTE *)PTR_SEG_OFF_TO_LIN(context->SegEs,DI_reg(context));
             /* the layout is just the same as MEMMANINFO, but without
              * the dwSize entry.
              */
diff --git a/msdos/int10.c b/msdos/int10.c
index 4bdb67f..93bd444 100644
--- a/msdos/int10.c
+++ b/msdos/int10.c
@@ -722,9 +722,9 @@
         {
           AL_reg(context) = 0x1b;
           if (ISV86(context)) /* real */
-            ES_reg(context) = 0xf000;
+            context->SegEs = 0xf000;
           else
-            ES_reg(context) = DOSMEM_BiosSysSeg;
+            context->SegEs = DOSMEM_BiosSysSeg;
           BX_reg(context) = 0xe000;
         }
         break;
@@ -736,7 +736,7 @@
     case 0x4f: /* Get SuperVGA INFORMATION */
         {
           BYTE *p =
-               CTX_SEG_OFF_TO_LIN(context, ES_reg(context), EDI_reg(context));
+               CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi);
           /* BOOL16 vesa20 = (*(DWORD *)p == *(DWORD *)"VBE2"); */
   
           TRACE("Get SuperVGA information\n");
diff --git a/msdos/int13.c b/msdos/int13.c
index 5574d47..d928de6 100644
--- a/msdos/int13.c
+++ b/msdos/int13.c
@@ -118,7 +118,7 @@
 				CX_reg(context) = 0x4f24;
 				break;
 			}
-			ES_reg(context) = 0x0000; /* FIXME: drive parameter table */
+			context->SegEs = 0x0000; /* FIXME: drive parameter table */
 			DI_reg(context) = 0x0000;
 #else
                 	AH_reg(context) = 0x01;
diff --git a/msdos/int15.c b/msdos/int15.c
index 6230fe1..7d72437 100644
--- a/msdos/int15.c
+++ b/msdos/int15.c
@@ -49,9 +49,9 @@
 
     case 0xc0: /* GET CONFIGURATION */
         if (ISV86(context)) /* real */
-            ES_reg(context) = 0xf000;
+            context->SegEs = 0xf000;
         else
-            ES_reg(context) = DOSMEM_BiosSysSeg;
+            context->SegEs = DOSMEM_BiosSysSeg;
         BX_reg(context) = 0xe6f5;
         AH_reg(context) = 0x0;
         RESET_CFLAG(context);
diff --git a/msdos/int21.c b/msdos/int21.c
index 5094487..aa7fa8b 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -198,7 +198,7 @@
     if (!INT21_GetFreeDiskSpace( context )) return 0;
     if (!heap && !INT21_CreateHeap()) return 0;
     heap->mediaID = 0xf0;
-    DS_reg(context) = DosHeapHandle;
+    context->SegDs = DosHeapHandle;
     BX_reg(context) = (int)&heap->mediaID - (int)heap;
     return 1;
 }
@@ -247,7 +247,7 @@
 	if (FillInDrivePB( drive ))
 	{
                 AL_reg(context) = 0x00;
-                DS_reg(context) = SELECTOROF(dpbsegptr);
+                context->SegDs = SELECTOROF(dpbsegptr);
                 BX_reg(context) = OFFSETOF(dpbsegptr);
         }
 	else
@@ -288,7 +288,7 @@
 
 static BOOL ioctlGenericBlkDevReq( CONTEXT86 *context )
 {
-	BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+	BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
 	int drive = DOS_GET_DRIVE( BL_reg(context) );
 
 	if (!DRIVE_IsValid(drive))
@@ -396,9 +396,9 @@
 static void INT21_ParseFileNameIntoFCB( CONTEXT86 *context )
 {
     char *filename =
-        CTX_SEG_OFF_TO_LIN(context, DS_reg(context), ESI_reg(context) );
+        CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Esi );
     char *fcb =
-        CTX_SEG_OFF_TO_LIN(context, ES_reg(context), EDI_reg(context) );
+        CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi );
     char *buffer, *s, *d;
 
     AL_reg(context) = 0xff; /* failed */
@@ -466,8 +466,8 @@
 }
 static BOOL INT21_CreateFile( CONTEXT86 *context )
 {
-    AX_reg(context) = _lcreat16( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                          EDX_reg(context) ), CX_reg(context) );
+    AX_reg(context) = _lcreat16( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                          context->Edx ), CX_reg(context) );
     return (AX_reg(context) == (WORD)HFILE_ERROR16);
 }
 
@@ -482,7 +482,7 @@
 
 static void OpenExistingFile( CONTEXT86 *context )
 {
-    AX_reg(context) = _lopen16( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)),
+    AX_reg(context) = _lopen16( CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx),
                                AL_reg(context) );
     if (AX_reg(context) == (WORD)HFILE_ERROR16)
     {
@@ -502,7 +502,7 @@
   /* BX,CX and DX should be preserved */
   OpenExistingFile(context);
 
-  if ((EFL_reg(context) & 0x0001) == 0) /* File exists */
+  if ((context->EFlags & 0x0001) == 0) /* File exists */
   {
       UINT16	uReturnCX = 0;
 
@@ -543,7 +543,7 @@
 		DX_reg(context) = SI_reg(context);
 		bExtendedError = INT21_CreateFile(context);
 
-		if (EFL_reg(context) & 0x0001) 	/*no file open, flags set */
+		if (context->EFlags & 0x0001) 	/*no file open, flags set */
 		{
 		    WARN("extended open/create: trunc failed\n");
 		    return bExtendedError;
@@ -572,7 +572,7 @@
         /* CX should still be the same */
         DX_reg(context) = SI_reg(context);
         bExtendedError = INT21_CreateFile(context);
-        if (EFL_reg(context) & 0x0001)  /*no file open, flags set */
+        if (context->EFlags & 0x0001)  /*no file open, flags set */
 	{
   	    WARN("extended open/create: create failed\n");
 	    return bExtendedError;
@@ -588,7 +588,7 @@
 static BOOL INT21_ChangeDir( CONTEXT86 *context )
 {
     int drive;
-    char *dirname = CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context));
+    char *dirname = CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx);
 
     TRACE("changedir %s\n", dirname);
     if (dirname[0] && (dirname[1] == ':'))
@@ -608,7 +608,7 @@
     DOS_FULL_NAME full_name;
     FINDFILE_DTA *dta = (FINDFILE_DTA *)GetCurrentDTA(context);
 
-    path = (const char *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+    path = (const char *)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
     dta->unixPath = NULL;
     if (!DOSFS_GetFullName( path, FALSE, &full_name ))
     {
@@ -681,7 +681,7 @@
 static BOOL INT21_CreateTempFile( CONTEXT86 *context )
 {
     static int counter = 0;
-    char *name = CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context) );
+    char *name = CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx );
     char *p = name + strlen(name);
 
     /* despite what Ralf Brown says, some programs seem to call without 
@@ -706,7 +706,7 @@
 static BOOL INT21_GetCurrentDirectory( CONTEXT86 *context ) 
 {
     int drive = DOS_GET_DRIVE( DL_reg(context) );
-    char *ptr = (char *)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), ESI_reg(context) );
+    char *ptr = (char *)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Esi );
 
     if (!DRIVE_IsValid(drive))
     {
@@ -723,7 +723,7 @@
 {
     if (heap || INT21_CreateHeap())
     { /* return an empty table just as DOS 4.0+ does */
-	DS_reg(context) = DosHeapHandle;
+	context->SegDs = DosHeapHandle;
 	SI_reg(context) = (int)&heap->DummyDBCSLeadTable - (int)heap;
     }
     else
@@ -736,7 +736,7 @@
 
 static int INT21_GetDiskSerialNumber( CONTEXT86 *context )
 {
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
     int drive = DOS_GET_DRIVE( BL_reg(context) );
 	
     if (!DRIVE_IsValid(drive))
@@ -755,7 +755,7 @@
 
 static int INT21_SetDiskSerialNumber( CONTEXT86 *context )
 {
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
     int drive = DOS_GET_DRIVE( BL_reg(context) );
 
     if (!DRIVE_IsValid(drive))
@@ -774,7 +774,7 @@
 
 static int INT21_FindFirstFCB( CONTEXT86 *context )
 {
-    BYTE *fcb = (BYTE *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+    BYTE *fcb = (BYTE *)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
     FINDFILE_FCB *pFCB;
     LPCSTR root, cwd;
     int drive;
@@ -798,7 +798,7 @@
 
 static int INT21_FindNextFCB( CONTEXT86 *context )
 {
-    BYTE *fcb = (BYTE *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
+    BYTE *fcb = (BYTE *)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
     FINDFILE_FCB *pFCB;
     DOS_DIRENTRY_LAYOUT *pResult = (DOS_DIRENTRY_LAYOUT *)GetCurrentDTA(context);
     WIN32_FIND_DATAA entry;
@@ -920,7 +920,7 @@
      switch (AL_reg(context)) {
      case 0x00: /* Get machine name. */
      {
-	  char *dst = CTX_SEG_OFF_TO_LIN (context,DS_reg(context),EDX_reg(context));
+	  char *dst = CTX_SEG_OFF_TO_LIN (context,context->SegDs,context->Edx);
 	  TRACE("getting machine name to %p\n", dst);
 	  if (gethostname (dst, 15))
 	  {
@@ -1091,8 +1091,8 @@
 	  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
 	  AX_reg(context), BX_reg(context), CX_reg(context), DX_reg(context),
 	  SI_reg(context), DI_reg(context),
-	  (WORD)DS_reg(context), (WORD)ES_reg(context),
-	  EFL_reg(context) );
+	  (WORD)context->SegDs, (WORD)context->SegEs,
+	  context->EFlags );
 
 
     if (AH_reg(context) == 0x59)  /* Get extended error info */
@@ -1196,9 +1196,9 @@
 
     case 0x09: /* WRITE STRING TO STANDARD OUTPUT */
         TRACE("WRITE '$'-terminated string from %04lX:%04X to stdout\n",
-	      DS_reg(context),DX_reg(context) );
+	      context->SegDs,DX_reg(context) );
         {
-            LPSTR data = CTX_SEG_OFF_TO_LIN(context,DS_reg(context),EDX_reg(context));
+            LPSTR data = CTX_SEG_OFF_TO_LIN(context,context->SegDs,context->Edx);
             LPSTR p = data;
             /* do NOT use strchr() to calculate the string length,
             as '\0' is valid string content, too !
@@ -1211,8 +1211,8 @@
 
     case 0x0a: /* BUFFERED INPUT */
       {
-	char *buffer = ((char *)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), 
-						   EDX_reg(context) ));
+	char *buffer = ((char *)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, 
+						   context->Edx ));
 	int res;
 	
 	TRACE("BUFFERED INPUT (size=%d)\n",buffer[0]);
@@ -1264,7 +1264,7 @@
 
     case 0x11: /* FIND FIRST MATCHING FILE USING FCB */
 	TRACE("FIND FIRST MATCHING FILE USING FCB %p\n", 
-	      CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)));
+	      CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
         if (!INT21_FindFirstFCB(context))
         {
             AL_reg(context) = 0xff;
@@ -1291,7 +1291,7 @@
     case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
         {
             TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
-            pTask->dta = PTR_SEG_OFF_TO_SEGPTR(DS_reg(context),DX_reg(context));
+            pTask->dta = PTR_SEG_OFF_TO_SEGPTR(context->SegDs,DX_reg(context));
             TRACE("Set DTA: %08lx\n", pTask->dta);
         }
         break;
@@ -1311,7 +1311,7 @@
 		
     case 0x25: /* SET INTERRUPT VECTOR */
         INT_CtxSetHandler( context, AL_reg(context),
-                        (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
+                        (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( context->SegDs,
                                                           DX_reg(context)));
         break;
 
@@ -1344,7 +1344,7 @@
         TRACE("GET DISK TRANSFER AREA ADDRESS\n");
         {
             TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
-            ES_reg(context) = SELECTOROF( pTask->dta );
+            context->SegEs = SELECTOROF( pTask->dta );
             BX_reg(context) = OFFSETOF( pTask->dta );
         }
         break;
@@ -1423,7 +1423,7 @@
     case 0x34: /* GET ADDRESS OF INDOS FLAG */
         TRACE("GET ADDRESS OF INDOS FLAG\n");
         if (!heap) INT21_CreateHeap();
-        ES_reg(context) = DosHeapHandle;
+        context->SegEs = DosHeapHandle;
         BX_reg(context) = (int)&heap->InDosFlag - (int)heap;
         break;
 
@@ -1431,7 +1431,7 @@
         TRACE("GET INTERRUPT VECTOR 0x%02x\n",AL_reg(context));
         {
             FARPROC16 addr = INT_CtxGetHandler( context, AL_reg(context) );
-            ES_reg(context) = SELECTOROF(addr);
+            context->SegEs = SELECTOROF(addr);
             BX_reg(context) = OFFSETOF(addr);
         }
         break;
@@ -1473,9 +1473,9 @@
 
     case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
         TRACE("MKDIR %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
-        bSetDOSExtendedError = (!CreateDirectory16( CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                           EDX_reg(context) ), NULL));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
+        bSetDOSExtendedError = (!CreateDirectory16( CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                           context->Edx ), NULL));
 	/* FIXME: CreateDirectory's LastErrors will clash with the ones
 	 * used by dos. AH=39 only returns 3 (path not found) and 5 (access
 	 * denied), while CreateDirectory return several ones. remap some of
@@ -1495,26 +1495,26 @@
 	
     case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
         TRACE("RMDIR %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
-        bSetDOSExtendedError = (!RemoveDirectory16( CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                                 EDX_reg(context) )));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
+        bSetDOSExtendedError = (!RemoveDirectory16( CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                                 context->Edx )));
         break;
 
     case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
         TRACE("CHDIR %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         bSetDOSExtendedError = !INT21_ChangeDir(context);
         break;
 	
     case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
         TRACE("CREAT flag 0x%02x %s\n",CX_reg(context),
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         bSetDOSExtendedError = INT21_CreateFile( context );
         break;
 
     case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
         TRACE("OPEN mode 0x%02x %s\n",AL_reg(context),
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         OpenExistingFile(context);
         break;
 
@@ -1525,18 +1525,18 @@
 
     case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
         TRACE("READ from %d to %04lX:%04X for %d byte\n",BX_reg(context),
-	      DS_reg(context),DX_reg(context),CX_reg(context) );
+	      context->SegDs,DX_reg(context),CX_reg(context) );
         {
             LONG result;
             if (ISV86(context))
                 result = _hread16( BX_reg(context),
-                                   CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                                               EDX_reg(context) ),
+                                   CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                                               context->Edx ),
                                    CX_reg(context) );
             else
                 result = WIN16_hread( BX_reg(context),
-                                      PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
-                                                             EDX_reg(context) ),
+                                      PTR_SEG_OFF_TO_SEGPTR( context->SegDs,
+                                                             context->Edx ),
                                       CX_reg(context) );
             if (result == -1) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = (WORD)result;
@@ -1545,11 +1545,11 @@
 
     case 0x40: /* "WRITE" - WRITE TO FILE OR DEVICE */
         TRACE("WRITE from %04lX:%04X to handle %d for %d byte\n",
-	      DS_reg(context),DX_reg(context),BX_reg(context),CX_reg(context) );
+	      context->SegDs,DX_reg(context),BX_reg(context),CX_reg(context) );
         {
             LONG result = _hwrite16( BX_reg(context),
-                                     CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                         EDX_reg(context) ),
+                                     CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                         context->Edx ),
                                      CX_reg(context) );
             if (result == -1) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = (WORD)result;
@@ -1558,9 +1558,9 @@
 
     case 0x41: /* "UNLINK" - DELETE FILE */
         TRACE("UNLINK %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
-        bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                             EDX_reg(context) )));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
+        bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                             context->Edx )));
         break;
 
     case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
@@ -1586,25 +1586,25 @@
         {
         case 0x00:
             TRACE("GET FILE ATTRIBUTES for %s\n", 
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
             AX_reg(context) = (WORD)GetFileAttributesA(
-                                          CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                                             EDX_reg(context)));
+                                          CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                                             context->Edx));
             if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
             else CX_reg(context) = AX_reg(context);
             break;
 
         case 0x01:
             TRACE("SET FILE ATTRIBUTES 0x%02x for %s\n", CX_reg(context),
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
             bSetDOSExtendedError = 
-		(!SetFileAttributesA( CTX_SEG_OFF_TO_LIN(context, DS_reg(context), 
-							   EDX_reg(context)),
+		(!SetFileAttributesA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, 
+							   context->Edx),
                                        			   CX_reg(context) ));
             break;
         case 0x02:
             FIXME("GET COMPRESSED FILE SIZE for %s stub\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         }
         break;
 	
@@ -1627,7 +1627,7 @@
             break;
        }
 	case 0x05:{	/* IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL */
-	    /*BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context));*/
+	    /*BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx);*/
 	    int	drive = DOS_GET_DRIVE(BL_reg(context));
 
 	    FIXME("program tried to write to block device control channel of drive %d:\n",drive);
@@ -1786,16 +1786,16 @@
         break;
 
     case 0x49: /* FREE MEMORY */
-        TRACE("FREE MEMORY segment %04lX\n", ES_reg(context));
+        TRACE("FREE MEMORY segment %04lX\n", context->SegEs);
         {
 	  BOOL ret;
 	  if (ISV86(context))
-	    ret= DOSMEM_FreeBlock(DOSMEM_MapDosToLinear(ES_reg(context)<<4));
+	    ret= DOSMEM_FreeBlock(DOSMEM_MapDosToLinear(context->SegEs<<4));
 	  else
 	    {
-	      ret = !GlobalDOSFree16(ES_reg(context));
+	      ret = !GlobalDOSFree16(context->SegEs);
 	      /* If we don't reset ES_reg, we will fail in the relay code */
-	      ES_reg(context)=ret;
+	      context->SegEs=ret;
 	    }
 	  if (!ret)
 	    {
@@ -1807,11 +1807,11 @@
         break;
 
     case 0x4a: /* RESIZE MEMORY BLOCK */
-        TRACE("RESIZE MEMORY segment %04lX to %d paragraphs\n", ES_reg(context), BX_reg(context));
+        TRACE("RESIZE MEMORY segment %04lX to %d paragraphs\n", context->SegEs, BX_reg(context));
 	if (!ISV86(context))
 	  FIXME("RESIZE MEMORY probably insufficient implementation. Expect crash soon\n");
 	{
-	    LPVOID *mem = DOSMEM_ResizeBlock(DOSMEM_MapDosToLinear(ES_reg(context)<<4),
+	    LPVOID *mem = DOSMEM_ResizeBlock(DOSMEM_MapDosToLinear(context->SegEs<<4),
 					     BX_reg(context)<<4,NULL);
 	    if (mem)
 		AX_reg(context) = DOSMEM_MapLinearToDos(mem)>>4;
@@ -1825,9 +1825,9 @@
 
     case 0x4b: /* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
         TRACE("EXEC %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context) ));
-        AX_reg(context) = WinExec16( CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                         EDX_reg(context) ),
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs,context->Edx ));
+        AX_reg(context) = WinExec16( CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                         context->Edx ),
                                      SW_NORMAL );
         if (AX_reg(context) < 32) SET_CFLAG(context);
         break;		
@@ -1844,7 +1844,7 @@
 
     case 0x4e: /* "FINDFIRST" - FIND FIRST MATCHING FILE */
         TRACE("FINDFIRST mask 0x%04x spec %s\n",CX_reg(context),
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         if (!INT21_FindFirst(context)) break;
         /* fall through */
 
@@ -1878,7 +1878,7 @@
     case 0x52: /* "SYSVARS" - GET LIST OF LISTS */
         TRACE("SYSVARS - GET LIST OF LISTS\n");
         {
-	    ES_reg(context) = ISV86(context) ? HIWORD(DOS_LOLSeg) : LOWORD(DOS_LOLSeg);
+	    context->SegEs = ISV86(context) ? HIWORD(DOS_LOLSeg) : LOWORD(DOS_LOLSeg);
             BX_reg(context) = FIELD_OFFSET(DOS_LISTOFLISTS, ptr_first_DPB);
         }
         break;
@@ -1890,11 +1890,11 @@
 
     case 0x56: /* "RENAME" - RENAME FILE */
         TRACE("RENAME %s to %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)),
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, ES_reg(context),EDI_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx),
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi));
         bSetDOSExtendedError = 
-		(!MoveFileA( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)),
-			       CTX_SEG_OFF_TO_LIN(context, ES_reg(context),EDI_reg(context))));
+		(!MoveFileA( CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx),
+			       CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi)));
         break;
 
     case 0x57: /* FILE DATE AND TIME */
@@ -1952,9 +1952,9 @@
 
     case 0x5b: /* CREATE NEW FILE */
         TRACE("CREATE NEW FILE 0x%02x for %s\n", CX_reg(context),
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx));
         bSetDOSExtendedError = ((AX_reg(context) = 
-               _lcreat16_uniq( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)),
+               _lcreat16_uniq( CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx),
                                CX_reg(context) )) == (WORD)HFILE_ERROR16);
         break;
 
@@ -2001,12 +2001,12 @@
 
     case 0x60: /* "TRUENAME" - CANONICALIZE FILENAME OR PATH */
         TRACE("TRUENAME %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context),ESI_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Esi));
         {
-            if (!GetFullPathNameA( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                                        ESI_reg(context)), 128,
-                                     CTX_SEG_OFF_TO_LIN(context, ES_reg(context),
-                                                        EDI_reg(context)),NULL))
+            if (!GetFullPathNameA( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                                        context->Esi), 128,
+                                     CTX_SEG_OFF_TO_LIN(context, context->SegEs,
+                                                        context->Edi),NULL))
 		bSetDOSExtendedError = TRUE;
             else AX_reg(context) = 0;
         }
@@ -2026,7 +2026,7 @@
     	break;
 
     case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */
-	BYTE    *dataptr=CTX_SEG_OFF_TO_LIN(context, ES_reg(context),EDI_reg(context));
+	BYTE    *dataptr=CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi);
 	TRACE("GET EXTENDED COUNTRY INFORMATION code page %d country %d\n",
 	      BX_reg(context), DX_reg(context));
     	switch (AL_reg(context)) {
@@ -2051,14 +2051,14 @@
         case 0x21:
             TRACE("\tconvert string to uppercase with length\n");
             {
-                char *ptr = (char *)CTX_SEG_OFF_TO_LIN(context,DS_reg(context),EDX_reg(context));
+                char *ptr = (char *)CTX_SEG_OFF_TO_LIN(context,context->SegDs,context->Edx);
                 WORD len = CX_reg(context);
                 while (len--) { *ptr = toupper(*ptr); ptr++; }
             }
             break;
         case 0x22:            
             TRACE("\tConvert ASCIIZ string to uppercase\n");
-            _strupr( (LPSTR)CTX_SEG_OFF_TO_LIN(context,DS_reg(context),EDX_reg(context)) );
+            _strupr( (LPSTR)CTX_SEG_OFF_TO_LIN(context,context->SegDs,context->Edx) );
             break;    
 	default:
 	    TRACE("\tunimplemented function %d\n",AL_reg(context));
@@ -2118,7 +2118,7 @@
     
     case 0x6C: /* Extended Open/Create*/
         TRACE("EXTENDED OPEN/CREATE %s\n",
-	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDI_reg(context)));
+	      (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edi));
         bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
         break;
 	
@@ -2133,10 +2133,10 @@
         {
         case 0x39:  /* Create directory */
 	    TRACE("LONG FILENAME - MAKE DIRECTORY %s\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs,context->Edx));
             bSetDOSExtendedError = (!CreateDirectoryA( 
-					CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                  EDX_reg(context) ), NULL));
+					CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                  context->Edx ), NULL));
 	    /* FIXME: CreateDirectory's LastErrors will clash with the ones
 	     * used by dos. AH=39 only returns 3 (path not found) and 5 (access
 	     * denied), while CreateDirectory return several ones. remap some of
@@ -2155,28 +2155,28 @@
             break;
         case 0x3a:  /* Remove directory */
 	    TRACE("LONG FILENAME - REMOVE DIRECTORY %s\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs,context->Edx));
             bSetDOSExtendedError = (!RemoveDirectoryA( 
-					CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),
-                                                        EDX_reg(context) )));
+					CTX_SEG_OFF_TO_LIN(context,  context->SegDs,
+                                                        context->Edx )));
             break;
         case 0x43:  /* Get/Set file attributes */
 	  TRACE("LONG FILENAME -EXTENDED GET/SET FILE ATTRIBUTES %s\n",
-		(LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context)));
+		(LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs,context->Edx));
         switch (BL_reg(context))
         {
         case 0x00: /* Get file attributes */
             TRACE("\tretrieve attributes\n");
             CX_reg(context) = (WORD)GetFileAttributesA(
-                                          CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                                             EDX_reg(context)));
+                                          CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                                             context->Edx));
             if (CX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
             break;
         case 0x01:
             TRACE("\tset attributes 0x%04x\n",CX_reg(context));
             bSetDOSExtendedError = (!SetFileAttributesA( 
-				  	CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-                                                           EDX_reg(context)),
+				  	CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+                                                           context->Edx),
                                         CX_reg(context)  ) );
             break;
 	default:
@@ -2195,12 +2195,12 @@
 
         case 0x4e:  /* Find first file */
 	    TRACE(" LONG FILENAME - FIND FIRST MATCHING FILE for %s\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)));
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx));
             /* FIXME: use attributes in CX */
             if ((AX_reg(context) = FindFirstFile16(
-                   CTX_SEG_OFF_TO_LIN(context, DS_reg(context),EDX_reg(context)),
-                   (WIN32_FIND_DATAA *)CTX_SEG_OFF_TO_LIN(context, ES_reg(context),
-                                                            EDI_reg(context))))
+                   CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx),
+                   (WIN32_FIND_DATAA *)CTX_SEG_OFF_TO_LIN(context, context->SegEs,
+                                                            context->Edi)))
 		== INVALID_HANDLE_VALUE16)
 		bSetDOSExtendedError = TRUE;
             break;
@@ -2208,14 +2208,14 @@
 	    TRACE("LONG FILENAME - FIND NEXT MATCHING FILE for handle %d\n",
 		  BX_reg(context));
             if (!FindNextFile16( BX_reg(context),
-                    (WIN32_FIND_DATAA *)CTX_SEG_OFF_TO_LIN(context, ES_reg(context),
-                                                             EDI_reg(context))))
+                    (WIN32_FIND_DATAA *)CTX_SEG_OFF_TO_LIN(context, context->SegEs,
+                                                             context->Edi)))
 		bSetDOSExtendedError = TRUE;
             break;
 	case 0xa0:
 	    {
-		LPCSTR driveroot = (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context),EDX_reg(context));
-		LPSTR buffer = (LPSTR)CTX_SEG_OFF_TO_LIN(context,  ES_reg(context),EDI_reg(context));
+		LPCSTR driveroot = (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs,context->Edx);
+		LPSTR buffer = (LPSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegEs,context->Edi);
 		int drive;
 		UINT flags;
 
@@ -2259,19 +2259,19 @@
 	  {
 	    case 0x01:  /*Get short filename or path */
 	      if (!GetShortPathNameA
-		  ( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-				       ESI_reg(context)),
-		    CTX_SEG_OFF_TO_LIN(context, ES_reg(context),
-				       EDI_reg(context)), 67))
+		  ( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+				       context->Esi),
+		    CTX_SEG_OFF_TO_LIN(context, context->SegEs,
+				       context->Edi), 67))
 		bSetDOSExtendedError = TRUE;
 	      else AX_reg(context) = 0;
 	      break;
 	    case 0x02:  /*Get canonical long filename or path */
 	      if (!GetFullPathNameA
-		  ( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
-				       ESI_reg(context)), 128,
-		    CTX_SEG_OFF_TO_LIN(context, ES_reg(context),
-				       EDI_reg(context)),NULL))
+		  ( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
+				       context->Esi), 128,
+		    CTX_SEG_OFF_TO_LIN(context, context->SegEs,
+				       context->Edi),NULL))
 		bSetDOSExtendedError = TRUE;
 	      else AX_reg(context) = 0;
 	      break;
@@ -2285,17 +2285,17 @@
 	    break;
         case 0x6c:  /* Create or open file */
             TRACE("LONG FILENAME - CREATE OR OPEN FILE %s\n",
-		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), ESI_reg(context))); 
+		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Esi)); 
 	  /* translate Dos 7 action to Dos 6 action */
 	    bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
 	    break;
 
         case 0x3b:  /* Change directory */
             TRACE("LONG FILENAME - CHANGE DIRECTORY %s\n",
-		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context))); 
+		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx)); 
 	    if (!SetCurrentDirectoryA(CTX_SEG_OFF_TO_LIN(context, 
-	    					DS_reg(context),
-				        	EDX_reg(context)
+	    					context->SegDs,
+				        	context->Edx
 					))
 	    ) {
 		SET_CFLAG(context);
@@ -2304,10 +2304,10 @@
 	    break;
         case 0x41:  /* Delete file */
             TRACE("LONG FILENAME - DELETE FILE %s\n",
-		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context))); 
+		 (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx)); 
 	    if (!DeleteFileA(CTX_SEG_OFF_TO_LIN(context, 
-	    				DS_reg(context),
-					EDX_reg(context))
+	    				context->SegDs,
+					context->Edx)
 	    )) {
 		SET_CFLAG(context);
 		AL_reg(context) = GetLastError();
@@ -2315,8 +2315,8 @@
 	    break;
         case 0x56:  /* Move (rename) file */
             FIXME("LONG FILENAME - RENAME FILE %s to %s stub\n",
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  DS_reg(context), EDX_reg(context)),
-		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  ES_reg(context), EDI_reg(context))); 
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegDs, context->Edx),
+		  (LPCSTR)CTX_SEG_OFF_TO_LIN(context,  context->SegEs, context->Edi)); 
         default:
             FIXME("Unimplemented long file name function:\n");
             INT_BARF( context, 0x21 );
@@ -2349,15 +2349,15 @@
 			    DWORD cluster_sectors, sector_bytes, free_clusters, total_clusters;
 			    char root[] = "A:\\";
 
-				buffer = (WORD *)CTX_SEG_OFF_TO_LIN(context, ES_reg(context), EDI_reg(context));
+				buffer = (WORD *)CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi);
 
 				TRACE("Get Extended DPB: linear buffer address is %p\n", buffer);
 
 				/* validate passed-in buffer lengths */
-				if ((*buffer != 0x3d) || (ECX_reg(context) != 0x3f))
+				if ((*buffer != 0x3d) || (context->Ecx != 0x3f))
 				{
 					WARN("Get Extended DPB: buffer lengths incorrect\n");
-					WARN("CX = %lx, buffer[0] = %x\n", ECX_reg(context), *buffer);
+					WARN("CX = %lx, buffer[0] = %x\n", context->Ecx, *buffer);
 					SET_CFLAG(context);
 					AL_reg(context) = 0x18;		/* bad buffer length */
 				}
@@ -2431,15 +2431,15 @@
 	SET_CFLAG(context);
     }
 
-    if ((EFL_reg(context) & 0x0001))
+    if ((context->EFlags & 0x0001))
         TRACE("failed, error 0x%04lx\n", GetLastError() );
  
     TRACE("returning: AX=%04x BX=%04x CX=%04x DX=%04x "
                  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
                  AX_reg(context), BX_reg(context), CX_reg(context),
                  DX_reg(context), SI_reg(context), DI_reg(context),
-                 (WORD)DS_reg(context), (WORD)ES_reg(context),
-                 EFL_reg(context));
+                 (WORD)context->SegDs, (WORD)context->SegEs,
+                 context->EFlags);
 }
 
 /***********************************************************************
diff --git a/msdos/int25.c b/msdos/int25.c
index 1a628ba..1fb27d8 100644
--- a/msdos/int25.c
+++ b/msdos/int25.c
@@ -22,17 +22,17 @@
  */
 void WINAPI INT_Int25Handler( CONTEXT86 *context )
 {
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, DS_reg(context), EBX_reg(context) );
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
     DWORD begin, length;
 
-    if (!DRIVE_IsValid(AL_reg(context)))
+    if (!DRIVE_IsValid(LOBYTE(context->Eax)))
     {
         SET_CFLAG(context);
         AX_reg(context) = 0x0201;        /* unknown unit */
         return;
     }
 
-    if (CX_reg(context) == 0xffff)
+    if (LOWORD(context->Ecx) == 0xffff)
     {
         begin   = *(DWORD *)dataptr;
         length  = *(WORD *)(dataptr + 4);
@@ -41,14 +41,14 @@
     }
     else
     {
-        begin  = DX_reg(context);
-        length = CX_reg(context);
+        begin  = LOWORD(context->Edx);
+        length = LOWORD(context->Ecx);
     }
     TRACE("int25: abs diskread, drive %d, sector %ld, "
                  "count %ld, buffer %p\n",
-                 AL_reg(context), begin, length, dataptr);
+          LOBYTE(context->Eax), begin, length, dataptr);
 
-	DRIVE_RawRead(AL_reg(context), begin, length, dataptr, TRUE);
+	DRIVE_RawRead(LOBYTE(context->Eax), begin, length, dataptr, TRUE);
     RESET_CFLAG(context);
 }
 
diff --git a/msdos/int26.c b/msdos/int26.c
index df84e6a..9b207a8 100644
--- a/msdos/int26.c
+++ b/msdos/int26.c
@@ -20,17 +20,17 @@
  */
 void WINAPI INT_Int26Handler( CONTEXT86 *context )
 {
-    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, DS_reg(context), EBX_reg(context) );
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
     DWORD begin, length;
 
-    if (!DRIVE_IsValid(AL_reg(context)))
+    if (!DRIVE_IsValid(LOBYTE(context->Eax)))
     {
         SET_CFLAG(context);
         AX_reg(context) = 0x0201;        /* unknown unit */
         return;
     }
 
-    if (CX_reg(context) == 0xffff)
+    if (LOWORD(context->Ecx) == 0xffff)
     {
         begin   = *(DWORD *)dataptr;
         length  = *(WORD *)(dataptr + 4);
@@ -39,14 +39,14 @@
     }
     else
     {
-        begin  = DX_reg(context);
-        length = CX_reg(context);
+        begin  = LOWORD(context->Edx);
+        length = LOWORD(context->Ecx);
     }
 		
     TRACE("int26: abs diskwrite, drive %d, sector %ld, "
                  "count %ld, buffer %p\n",
                  AL_reg(context), begin, length, dataptr );
 
-	DRIVE_RawWrite(AL_reg(context), begin, length, dataptr, TRUE);
+	DRIVE_RawWrite(LOBYTE(context->Eax), begin, length, dataptr, TRUE);
     RESET_CFLAG(context);
 }
diff --git a/msdos/int2f.c b/msdos/int2f.c
index 43a014a..639126f 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -43,7 +43,7 @@
         break;
 
     case 0x11:  /* Network Redirector / IFSFUNC */
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
         case 0x00:  /* Install check */
             /* not installed */
@@ -58,7 +58,7 @@
         break;
 
     case 0x12:
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
         case 0x2e: /* get or set DOS error table address */
             switch (DL_reg(context))
@@ -78,7 +78,7 @@
             case 0x02:
             case 0x04:
             case 0x06: 
-                ES_reg(context) = 0x0001;
+                context->SegEs = 0x0001;
                 DI_reg(context) = 0x0000;
                 break;
             case 0x08:
@@ -107,7 +107,7 @@
 
     case 0x43:
 #if 1
-	switch (AL_reg(context))
+	switch (LOBYTE(context->Eax))
 	{
 	case 0x00:   /* XMS v2+ installation check */
 	    WARN("XMS is not fully implemented\n");
@@ -115,7 +115,7 @@
 	    break;
 	case 0x10:   /* XMS v2+ get driver address */
 	{
-            ES_reg(context) = DOSMEM_xms_seg;
+            context->SegEs = DOSMEM_xms_seg;
             BX_reg(context) = 0;
             break;
 	}
@@ -129,7 +129,7 @@
     	break;
 
     case 0x45:
-       switch (AL_reg(context)) 
+       switch (LOBYTE(context->Eax)) 
        {
        case 0x00:
        case 0x01:
@@ -148,7 +148,7 @@
        break;
 
     case 0x4a:
-        switch(AL_reg(context))
+        switch(LOBYTE(context->Eax))
         {
 	case 0x10:  /* smartdrv */
 	    break;  /* not installed */
@@ -163,7 +163,7 @@
         }
         break;
     case 0x4b:
-	switch(AL_reg(context))
+	switch(LOBYTE(context->Eax))
 	{
 	case 0x01:
 	case 0x02:
@@ -177,7 +177,7 @@
 	}
 	break;
     case 0x56:  /* INTERLNK */
-	switch(AL_reg(context))
+	switch(LOBYTE(context->Eax))
 	{
 	case 0x01:  /* check if redirected drive */
 	    AL_reg(context) = 0; /* not redirected */
@@ -187,7 +187,7 @@
 	}
 	break;
     case 0x7a:  /* NOVELL NetWare */
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
 	case 0x0:  /* Low-level Netware installation check AL=0 not installed.*/
             AL_reg(context) = 0;    
@@ -201,10 +201,10 @@
         }
         break;
     case 0xb7:  /* append */
-        AL_reg(context) = 0; /* not installed */
+        LOBYTE(context->Eax) = 0; /* not installed */
         break;
     case 0xb8:  /* network */
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
         case 0x00:  /* Install check */
             /* not installed */
@@ -218,7 +218,7 @@
         AX_reg(context) = 0xa5a5; /* pretend to have Novell IPX installed */
 	break;
     case 0xbf:  /* REDIRIFS.EXE */
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
         case 0x00:  /* Install check */
             /* not installed */
@@ -229,7 +229,7 @@
         }
         break;
     case 0xd2:
-	switch(AL_reg(context))
+	switch(LOBYTE(context->Eax))
 	{
 	case 0x01: /* Quarterdeck RPCI - QEMM/QRAM - PCL-838.EXE functions */
 	    if(BX_reg(context) == 0x5145 && CX_reg(context) == 0x4D4D 
@@ -242,7 +242,7 @@
 	}
 	break;
     case 0xd7:  /* Banyan Vines */
-        switch (AL_reg(context))
+        switch (LOBYTE(context->Eax))
         {
         case 0x01:  /* Install check - Get Int Number */
             /* not installed */
@@ -253,7 +253,7 @@
         }
         break;
     case 0xde:
-	switch(AL_reg(context))
+	switch(LOBYTE(context->Eax))
 	{
 	case 0x01:   /* Quarterdeck QDPMI.SYS - DESQview */
 	    if(BX_reg(context) == 0x4450 && CX_reg(context) == 0x4d49 
@@ -281,7 +281,7 @@
 {
     DWORD addr;
 
-    switch(AL_reg(context))
+    switch(LOBYTE(context->Eax))
     {
     case 0x00:  /* Windows enhanced mode installation check */
         AX_reg(context) = (GetWinFlags16() & WF_ENHANCED) ?
@@ -333,7 +333,7 @@
 	    ERR("Accessing unknown VxD %04x - Expect a failure now.\n",
                      BX_reg(context) );
         }
-	ES_reg(context) = SELECTOROF(addr);
+	context->SegEs = SELECTOROF(addr);
 	DI_reg(context) = OFFSETOF(addr);
 	break;
 
@@ -353,7 +353,7 @@
             CL_reg(context) = si.wProcessorLevel;
             DX_reg(context) = 0x005a; /* DPMI major/minor 0.90 */
             SI_reg(context) = 0;      /* # of para. of DOS extended private data */
-            ES_reg(context) = DOSMEM_dpmi_seg;
+            context->SegEs = DOSMEM_dpmi_seg;
             DI_reg(context) = 0;      /* ES:DI is DPMI switch entry point */
             break;
         }
@@ -429,7 +429,7 @@
     int 	drive, count;
     char*	p;
 
-    switch(AL_reg(context)) {
+    switch(LOBYTE(context->Eax)) {
     case 0x00: /* Installation check */
 	/* Count the number of contiguous CDROM drives
 	 */
@@ -455,7 +455,7 @@
 	break;
 	
     case 0x0D: /* get drive letters */
-	p = CTX_SEG_OFF_TO_LIN(context, ES_reg(context), EBX_reg(context));
+	p = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx);
 	memset(p, 0, MAX_DOS_DRIVES);
 	for (drive = 0; drive < MAX_DOS_DRIVES; drive++) {
 	    if (DRIVE_GetType(drive) == TYPE_CDROM) *p++ = drive;
@@ -477,7 +477,7 @@
 		/* FIXME - to be deleted ?? */
 		ERR("ES:BX==0 ! SEGFAULT ?\n");
 		ERR("-->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x\n",
-		    BX_reg(context), ES_reg(context), DS_reg(context), CX_reg(context));
+		    BX_reg(context), context->SegEs, context->SegDs, CX_reg(context));
 		driver_request[4] |= 0x80;
 		driver_request[3] = 5;	/* bad request length */
 		return;
@@ -800,7 +800,7 @@
 	}
 	break;
     default:
-	FIXME("Unimplemented MSCDEX function 0x%02X.\n", AL_reg(context));
+	FIXME("Unimplemented MSCDEX function 0x%02X.\n", LOBYTE(context->Eax));
 	break;
     }
 }
diff --git a/msdos/int33.c b/msdos/int33.c
index 10d2f67..a50fe37 100644
--- a/msdos/int33.c
+++ b/msdos/int33.c
@@ -27,7 +27,7 @@
  */
 void WINAPI INT_Int33Handler( CONTEXT86 *context )
 {
-  switch (AX_reg(context)) {
+  switch (LOWORD(context->Eax)) {
   case 0x00:
     TRACE("Reset mouse driver and request status\n");
     AX_reg(context) = 0xFFFF; /* installed */
@@ -64,7 +64,7 @@
   case 0x0C:
     TRACE("Define mouse interrupt subroutine\n");
     mouse_info.callmask = CX_reg(context);
-    mouse_info.callback = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR(ES_reg(context), DX_reg(context));
+    mouse_info.callback = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR(context->SegEs, LOWORD(context->Edx));
     break;
   case 0x10:
     FIXME("Define screen region for update\n");
@@ -84,14 +84,14 @@
   MCALLDATA *data = (MCALLDATA *)mdata;
   CONTEXT86 ctx = *context;
 
-  EAX_reg(&ctx) = data->mask;
-  EBX_reg(&ctx) = data->but;
-  ECX_reg(&ctx) = data->x;
-  EDX_reg(&ctx) = data->y;
-  ESI_reg(&ctx) = data->mx;
-  EDI_reg(&ctx) = data->my;
-  CS_reg(&ctx)  = SELECTOROF(data->proc);
-  EIP_reg(&ctx) = OFFSETOF(data->proc);
+  ctx.Eax   = data->mask;
+  ctx.Ebx   = data->but;
+  ctx.Ecx   = data->x;
+  ctx.Edx   = data->y;
+  ctx.Esi   = data->mx;
+  ctx.Edi   = data->my;
+  ctx.SegCs = SELECTOROF(data->proc);
+  ctx.Eip   = OFFSETOF(data->proc);
   free(data);
   DPMI_CallRMProc(&ctx, NULL, 0, 0);
 }
diff --git a/msdos/int5c.c b/msdos/int5c.c
index feb1c7c..f3e6cc0 100644
--- a/msdos/int5c.c
+++ b/msdos/int5c.c
@@ -19,7 +19,7 @@
 void WINAPI NetBIOSCall16( CONTEXT86 *context )
 {
     BYTE* ptr;
-    ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(ES_reg(context),BX_reg(context));
+    ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(context->SegEs,BX_reg(context));
     FIXME("(%p): command code %02x (ignored)\n",context, *ptr);
     AL_reg(context) = *(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
 }
diff --git a/msdos/vxd.c b/msdos/vxd.c
index d5c7546..727ec58 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -32,7 +32,7 @@
                      "SI %04x, DI %04x, DS %04x, ES %04x\n", \
              (name), (name), AX_reg(context), BX_reg(context), \
              CX_reg(context), DX_reg(context), SI_reg(context), \
-             DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
+             DI_reg(context), (WORD)context->SegDs, (WORD)context->SegEs )
 
 
 static WORD VXD_WinVersion(void)
@@ -90,7 +90,7 @@
     case 0x01: /* get swap file info */
 	TRACE("VxD PageFile: returning swap file info\n");
 	AX_reg(context) = 0x00; /* paging disabled */
-	ECX_reg(context) = 0;   /* maximum size of paging file */	
+	context->Ecx = 0;   /* maximum size of paging file */	
 	/* FIXME: do I touch DS:SI or DS:DI? */
 	RESET_CFLAG(context);
 	break;
@@ -197,16 +197,16 @@
 
     case 0x0001: /* load device */
 	FIXME("load device %04lx:%04x (%s)\n",
-	      DS_reg(context), DX_reg(context),
-	      debugstr_a(PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context))));
+	      context->SegDs, DX_reg(context),
+	      debugstr_a(PTR_SEG_OFF_TO_LIN(context->SegDs, DX_reg(context))));
 	AX_reg(context) = 0x0000;
-	ES_reg(context) = 0x0000;
+	context->SegEs = 0x0000;
 	DI_reg(context) = 0x0000;
 	RESET_CFLAG(context);
 	break;
 
     case 0x0002: /* unload device */
-	FIXME("unload device (%08lx)\n", EBX_reg(context));
+	FIXME("unload device (%08lx)\n", context->Ebx);
 	AX_reg(context) = 0x0000;
 	RESET_CFLAG(context);
 	break;
@@ -233,7 +233,7 @@
     case 0x0000:
 	TRACE("returning version\n");
         AX_reg(context) = VXD_WinVersion();
-	EBX_reg(context) = 1; /* system VM Handle */
+	context->Ebx = 1; /* system VM Handle */
 	break;
 
     case 0x0001:
@@ -300,8 +300,7 @@
 	break;
 
     case 0x0106:   /* install timeout callback */
-	TRACE("VxD Shell: ignoring shell callback (%ld sec.)\n",
-                    EBX_reg( context ) );
+	TRACE("VxD Shell: ignoring shell callback (%ld sec.)\n", context->Ebx);
 	SET_CFLAG(context);
 	break;
 
@@ -355,15 +354,15 @@
 	break;
 
     case 0x0100: /* clock tick time, in 840nsecs */
-	EAX_reg(context) = GetTickCount();
+	context->Eax = GetTickCount();
 
-	EDX_reg(context) = EAX_reg(context) >> 22;
-	EAX_reg(context) <<= 10; /* not very precise */
+	context->Edx = context->Eax >> 22;
+	context->Eax <<= 10; /* not very precise */
 	break;
 
     case 0x0101: /* current Windows time, msecs */
     case 0x0102: /* current VM time, msecs */
-	EAX_reg(context) = GetTickCount();
+	context->Eax = GetTickCount();
 	break;
 
     default:
@@ -549,11 +548,11 @@
 
         TRACE("GetVersion()\n");
         
-	EAX_reg(context) = VXD_WinVersion() | (200 << 16);
-        EBX_reg(context) = 0;
-        ECX_reg(context) = 0;
-        EDX_reg(context) = 0;
-        EDI_reg(context) = 0;
+	context->Eax = VXD_WinVersion() | (200 << 16);
+        context->Ebx = 0;
+        context->Ecx = 0;
+        context->Edx = 0;
+        context->Edi = 0;
 
         /* 
          * If this is the first time we are called for this process,
@@ -660,12 +659,12 @@
          */
 
         TRACE("[0001] EBX=%lx ECX=%lx EDX=%lx ESI=%lx EDI=%lx\n", 
-                   EBX_reg(context), ECX_reg(context), EDX_reg(context),
-                   ESI_reg(context), EDI_reg(context));
+                   context->Ebx, context->Ecx, context->Edx,
+                   context->Esi, context->Edi);
 
         /* FIXME */
 
-        EAX_reg(context) = 0;
+        context->Eax = 0;
         break;
 
 
@@ -683,11 +682,11 @@
          */
 
         TRACE("[0002] EBX=%lx ECX=%lx EDX=%lx\n", 
-                   EBX_reg(context), ECX_reg(context), EDX_reg(context));
+                   context->Ebx, context->Ecx, context->Edx);
 
         /* FIXME */
 
-        EAX_reg(context) = ECX_reg(context);
+        context->Eax = context->Ecx;
         break;
 
 
@@ -700,11 +699,11 @@
          *               Bit 1: Read-Write if set, Read-Only if clear
          */
 
-        TRACE("[0003] EDX=%lx\n", EDX_reg(context));
+        TRACE("[0003] EDX=%lx\n", context->Edx);
 
         /* FIXME */
 
-        EAX_reg(context) = 6;
+        context->Eax = 6;
         break;
 
 
@@ -717,10 +716,10 @@
          * Output:  EAX: 0 if OK
          */
 
-    if (!EDX_reg(context) || CX_reg(context) == 0xFFFF)
+    if (!context->Edx || CX_reg(context) == 0xFFFF)
     {
         TRACE("MapModule: Initialization call\n");
-        EAX_reg(context) = 0;
+        context->Eax = 0;
     }
     else
     {
@@ -747,8 +746,8 @@
          */
 
         struct Win32sModule *moduleTable = 
-                            (struct Win32sModule *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
-        struct Win32sModule *module = moduleTable + ECX_reg(context);
+                            (struct Win32sModule *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
+        struct Win32sModule *module = moduleTable + context->Ecx;
 
         IMAGE_NT_HEADERS *nt_header = PE_HEADER(module->baseAddr);
         IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(module->baseAddr);
@@ -826,7 +825,7 @@
             }
         }
 
-        EAX_reg(context) = 0;
+        context->Eax = 0;
         RESET_CFLAG(context);
     }
     break;
@@ -839,11 +838,11 @@
          * Output:  EAX: 1 if OK
          */
         
-        TRACE("UnMapModule: %lx\n", (DWORD)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET));
+        TRACE("UnMapModule: %lx\n", (DWORD)W32S_APP2WINE(context->Edx, W32S_OFFSET));
 
         /* As we didn't map anything, there's nothing to unmap ... */
 
-        EAX_reg(context) = 1;
+        context->Eax = 1;
         break;
 
 
@@ -862,7 +861,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack  = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack  = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv   = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base   = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD  size   = stack[2];
@@ -889,10 +888,10 @@
 
         if (W32S_WINE2APP(result, W32S_OFFSET))
             *retv            = W32S_WINE2APP(result, W32S_OFFSET),
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = 0,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -911,7 +910,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack  = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack  = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv   = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base   = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD  size   = stack[2];
@@ -925,10 +924,10 @@
 
         if (result)
             *retv            = TRUE,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = FALSE,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -948,7 +947,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack    = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack    = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv     = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base     = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD  size     = stack[2];
@@ -963,10 +962,10 @@
 
         if (result)
             *retv            = TRUE,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = FALSE,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -985,7 +984,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack  = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack  = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv   = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base   = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         LPMEMORY_BASIC_INFORMATION info = 
@@ -999,7 +998,7 @@
         result = VirtualQuery(base, info, len);
 
         *retv            = result;
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
@@ -1014,11 +1013,11 @@
          */
 
         TRACE("[000a] ECX=%lx EDX=%lx\n",
-                   ECX_reg(context), EDX_reg(context));
+                   context->Ecx, context->Edx);
 
         /* FIXME */
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
         break;
 
 
@@ -1029,11 +1028,11 @@
          * Output:  EAX: NtStatus
          */
 
-        TRACE("[000b] ECX=%lx\n", ECX_reg(context));
+        TRACE("[000b] ECX=%lx\n", context->Ecx);
 
         /* FIXME */
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
         break;
 
 
@@ -1044,11 +1043,11 @@
          * Output:  EDX: Previous Debug Flags
          */
 
-        FIXME("[000c] EDX=%lx\n", EDX_reg(context));
+        FIXME("[000c] EDX=%lx\n", context->Edx);
 
         /* FIXME */
 
-        EDX_reg(context) = 0;
+        context->Edx = 0;
         break;
 
 
@@ -1068,7 +1067,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack    = (DWORD *)   W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack    = (DWORD *)   W32S_APP2WINE(context->Edx, W32S_OFFSET);
         HANDLE *retv  = (HANDLE *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         DWORD  flags1   = stack[1];
         DWORD  atom     = stack[2];
@@ -1102,10 +1101,10 @@
 
         if (result != INVALID_HANDLE_VALUE)
             *retv            = result,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = result,
-            EAX_reg(context) = STATUS_NO_MEMORY;   /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;   /* FIXME */
     }
     break;
 
@@ -1121,7 +1120,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack    = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack    = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         HANDLE *retv  = (HANDLE *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         DWORD  protect  = stack[1];
         DWORD  atom     = stack[2];
@@ -1146,10 +1145,10 @@
 
         if (result != INVALID_HANDLE_VALUE)
             *retv            = result,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = result,
-            EAX_reg(context) = STATUS_NO_MEMORY;   /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;   /* FIXME */
     }
     break;
 
@@ -1164,7 +1163,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack    = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack    = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         HANDLE handle = stack[0];
         DWORD *id       = (DWORD *)W32S_APP2WINE(stack[1], W32S_OFFSET);
 
@@ -1173,7 +1172,7 @@
         CloseHandle(handle);
         if (id) *id = 0; /* FIXME */
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
@@ -1187,7 +1186,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack    = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack    = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         HANDLE handle = stack[0];
         HANDLE new_handle;
 
@@ -1196,7 +1195,7 @@
         DuplicateHandle( GetCurrentProcess(), handle,
                          GetCurrentProcess(), &new_handle,
                          0, FALSE, DUPLICATE_SAME_ACCESS );
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
@@ -1219,7 +1218,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *  stack          = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *  stack          = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         HANDLE SectionHandle  = stack[0];
         DWORD    ProcessHandle  = stack[1]; /* ignored */
         DWORD *  BaseAddress    = (DWORD *)W32S_APP2WINE(stack[2], W32S_OFFSET);
@@ -1266,10 +1265,10 @@
         if (W32S_WINE2APP(result, W32S_OFFSET))
         {
             if (BaseAddress) *BaseAddress = W32S_WINE2APP(result, W32S_OFFSET);
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         }
         else
-            EAX_reg(context) = STATUS_NO_MEMORY; /* FIXME */
+            context->Eax = STATUS_NO_MEMORY; /* FIXME */
     }
     break;
 
@@ -1284,7 +1283,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack          = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack          = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD  ProcessHandle  = stack[0]; /* ignored */
         LPBYTE BaseAddress    = (LPBYTE)W32S_APP2WINE(stack[1], W32S_OFFSET);
 
@@ -1293,7 +1292,7 @@
 
         UnmapViewOfFile(BaseAddress);
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
@@ -1310,7 +1309,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack          = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack          = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD  ProcessHandle  = stack[0]; /* ignored */
         DWORD *BaseAddress    = (DWORD *)W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD *ViewSize       = (DWORD *)W32S_APP2WINE(stack[2], W32S_OFFSET);
@@ -1327,7 +1326,7 @@
 
         FlushViewOfFile(address, size);
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
@@ -1344,7 +1343,7 @@
          */
 
         FIXME("[0014] ECX=%lx EDX=%lx\n", 
-                   ECX_reg(context), EDX_reg(context));
+                   context->Ecx, context->Edx);
 
         /* FIXME */
         break;
@@ -1357,7 +1356,7 @@
          * Output:  None
          */
 
-        TRACE("[0015] EDX=%lx\n", EDX_reg(context));
+        TRACE("[0015] EDX=%lx\n", context->Edx);
 
         /* We don't care, as we always have a coprocessor anyway */
         break;
@@ -1377,13 +1376,13 @@
          *     Output: None
          */
  
-        if (EBX_reg(context) == 0)
-            EDX_reg(context) = 0x80;
+        if (context->Ebx == 0)
+            context->Edx = 0x80;
         else
         {
             PDB16 *psp = PTR_SEG_OFF_TO_LIN(BX_reg(context), 0);
             psp->nbFiles = 32;
-            psp->fileHandlesPtr = MAKELONG(HIWORD(EBX_reg(context)), 0x5c);
+            psp->fileHandlesPtr = MAKELONG(HIWORD(context->Ebx), 0x5c);
             memset((LPBYTE)psp + 0x5c, '\xFF', 32);
         }
         break;
@@ -1398,7 +1397,7 @@
          */
 
         FIXME("[0017] EBX=%lx CX=%x\n", 
-                   EBX_reg(context), CX_reg(context));
+                   context->Ebx, CX_reg(context));
 
         /* FIXME */
         break;
@@ -1417,7 +1416,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack  = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack  = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv   = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base   = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD  size   = stack[2];
@@ -1430,10 +1429,10 @@
 
         if (result)
             *retv            = TRUE,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = FALSE,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -1451,7 +1450,7 @@
          * Output:  EAX: NtStatus
          */
     {
-        DWORD *stack  = (DWORD *)W32S_APP2WINE(EDX_reg(context), W32S_OFFSET);
+        DWORD *stack  = (DWORD *)W32S_APP2WINE(context->Edx, W32S_OFFSET);
         DWORD *retv   = (DWORD *)W32S_APP2WINE(stack[0], W32S_OFFSET);
         LPVOID base   = (LPVOID) W32S_APP2WINE(stack[1], W32S_OFFSET);
         DWORD  size   = stack[2];
@@ -1464,10 +1463,10 @@
 
         if (result)
             *retv            = TRUE,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Eax = STATUS_SUCCESS;
         else
             *retv            = FALSE,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -1491,8 +1490,8 @@
          *       FIXME: What about other OSes ?
          */
 
-        ECX_reg(context) = W32S_WINE2APP(0x00000000, W32S_OFFSET);
-        EDX_reg(context) = W32S_WINE2APP(0xbfffffff, W32S_OFFSET);
+        context->Ecx = W32S_WINE2APP(0x00000000, W32S_OFFSET);
+        context->Edx = W32S_WINE2APP(0xbfffffff, W32S_OFFSET);
         break;
 
 
@@ -1515,7 +1514,7 @@
         };
 
         struct Win32sMemoryInfo *info = 
-                       (struct Win32sMemoryInfo *)W32S_APP2WINE(ESI_reg(context), W32S_OFFSET);
+                       (struct Win32sMemoryInfo *)W32S_APP2WINE(context->Esi, W32S_OFFSET);
 
         FIXME("KGlobalMemStat(%lx)\n", (DWORD)info);
 
@@ -1531,7 +1530,7 @@
          * Output:  None
          */
 
-        TRACE("[001c] ECX=%lx\n", ECX_reg(context));
+        TRACE("[001c] ECX=%lx\n", context->Ecx);
 
         /* FIXME */
         break;
@@ -1550,8 +1549,8 @@
          *          EDX: Flat base address of allocated region
          */
     {
-        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(EDX_reg(context)), 
-                                           HIWORD(EDX_reg(context)));
+        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(context->Edx), 
+                                           HIWORD(context->Edx));
         LPVOID base   = (LPVOID)W32S_APP2WINE(stack[0], W32S_OFFSET);
         DWORD  size   = stack[1];
         DWORD  type   = stack[2];
@@ -1570,12 +1569,12 @@
         result = (DWORD)VirtualAlloc(base, size, type, prot);
 
         if (W32S_WINE2APP(result, W32S_OFFSET))
-            EDX_reg(context) = W32S_WINE2APP(result, W32S_OFFSET),
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Edx = W32S_WINE2APP(result, W32S_OFFSET),
+            context->Eax = STATUS_SUCCESS;
         else
-            EDX_reg(context) = 0,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
-	TRACE("VirtualAlloc16: returning base %lx\n", EDX_reg(context));
+            context->Edx = 0,
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
+	TRACE("VirtualAlloc16: returning base %lx\n", context->Edx);
     }
     break;
 
@@ -1592,8 +1591,8 @@
          *          EDX: TRUE if success, FALSE if failure
          */
     {
-        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(EDX_reg(context)), 
-                                           HIWORD(EDX_reg(context)));
+        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(context->Edx), 
+                                           HIWORD(context->Edx));
         LPVOID base   = (LPVOID)W32S_APP2WINE(stack[0], W32S_OFFSET);
         DWORD  size   = stack[1];
         DWORD  type   = stack[2];
@@ -1605,11 +1604,11 @@
         result = VirtualFree(base, size, type);
 
         if (result)
-            EDX_reg(context) = TRUE,
-            EAX_reg(context) = STATUS_SUCCESS;
+            context->Edx = TRUE,
+            context->Eax = STATUS_SUCCESS;
         else
-            EDX_reg(context) = FALSE,
-            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+            context->Edx = FALSE,
+            context->Eax = STATUS_NO_MEMORY;  /* FIXME */
     }
     break;
 
@@ -1624,8 +1623,8 @@
          * Output:  NtStatus
          */
     {
-        DWORD *ptr = (DWORD *)W32S_APP2WINE(ECX_reg(context), W32S_OFFSET);
-        BOOL set = EDX_reg(context);
+        DWORD *ptr = (DWORD *)W32S_APP2WINE(context->Ecx, W32S_OFFSET);
+        BOOL set = context->Edx;
         
         TRACE("FWorkingSetSize(%lx, %lx)\n", (DWORD)ptr, (DWORD)set);
 
@@ -1634,7 +1633,7 @@
         else
             *ptr = 0x100;
 
-        EAX_reg(context) = STATUS_SUCCESS;
+        context->Eax = STATUS_SUCCESS;
     }
     break;
 
diff --git a/msdos/xms.c b/msdos/xms.c
index c1dbfb7..7ed8c8d 100644
--- a/msdos/xms.c
+++ b/msdos/xms.c
@@ -76,7 +76,7 @@
     case 0x0b:   /* Move Extended Memory Block */
     {
 	MOVESTRUCT*move=CTX_SEG_OFF_TO_LIN(context,
-	    DS_reg(context),ESI_reg(context));
+	    context->SegDs,context->Esi);
         BYTE*src,*dst;
         TRACE("move extended memory block\n");
         src=XMS_Offset(&move->Source);
diff --git a/relay32/relay386.c b/relay32/relay386.c
index c410010..d764d86 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -50,8 +50,8 @@
     term += 2;
     for(; *listitem; listitem++) {
       itemlen = strlen(*listitem);
-      if((itemlen == len && !lstrncmpiA(*listitem, func, len)) ||
-         (itemlen == len2 && !lstrncmpiA(*listitem, func, len2)) ||
+      if((itemlen == len && !strncasecmp(*listitem, func, len)) ||
+         (itemlen == len2 && !strncasecmp(*listitem, func, len2)) ||
          !strcasecmp(*listitem, term)) {
         show = !show;
        break;
@@ -287,7 +287,7 @@
 /***********************************************************************
  *           RELAY_CallFrom32Regs
  *
- * Stack layout (esp is ESP_reg(context), not the current %esp):
+ * Stack layout (esp is context->Esp, not the current %esp):
  *
  * ...
  * (esp+4) first arg
@@ -306,14 +306,14 @@
     FARPROC func;
     BYTE *entry_point;
 
-    BYTE *relay_addr = *((BYTE **)ESP_reg(context) - 1);
+    BYTE *relay_addr = *((BYTE **)context->Esp - 1);
     DEBUG_ENTRY_POINT *relay = (DEBUG_ENTRY_POINT *)(relay_addr - 5);
     WORD nb_args = (relay->args & ~0x8000) / sizeof(int);
 
     /* remove extra stuff from the stack */
-    EIP_reg(context) = stack32_pop(context);
-    args = (int *)ESP_reg(context);
-    ESP_reg(context) += 4 * nb_args;
+    context->Eip = stack32_pop(context);
+    args = (int *)context->Esp;
+    context->Esp += 4 * nb_args;
 
     assert(TRACE_ON(relay));
 
@@ -325,14 +325,14 @@
 
     DPRINTF( "Call %s(", buffer );
     RELAY_PrintArgs( args, nb_args, relay->argtypes );
-    DPRINTF( ") ret=%08lx fs=%04lx\n", EIP_reg(context), FS_reg(context) );
+    DPRINTF( ") ret=%08lx fs=%04lx\n", context->Eip, context->SegFs );
 
     DPRINTF(" eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\n",
-            EAX_reg(context), EBX_reg(context), ECX_reg(context),
-            EDX_reg(context), ESI_reg(context), EDI_reg(context) );
+            context->Eax, context->Ebx, context->Ecx,
+            context->Edx, context->Esi, context->Edi );
     DPRINTF(" ebp=%08lx esp=%08lx ds=%04lx es=%04lx gs=%04lx flags=%08lx\n",
-            EBP_reg(context), ESP_reg(context), DS_reg(context),
-            ES_reg(context), GS_reg(context), EFL_reg(context) );
+            context->Ebp, context->Esp, context->SegDs,
+            context->SegEs, context->SegGs, context->EFlags );
 
     SYSLEVEL_CheckNotLevel( 2 );
 
@@ -370,13 +370,14 @@
     }
 
     DPRINTF( "Ret  %s() retval=%08lx ret=%08lx fs=%04lx\n",
-             buffer, EAX_reg(context), EIP_reg(context), FS_reg(context) );
+             buffer, context->Eax, context->Eip, context->SegFs );
+
     DPRINTF(" eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\n",
-            EAX_reg(context), EBX_reg(context), ECX_reg(context),
-            EDX_reg(context), ESI_reg(context), EDI_reg(context) );
+            context->Eax, context->Ebx, context->Ecx,
+            context->Edx, context->Esi, context->Edi );
     DPRINTF(" ebp=%08lx esp=%08lx ds=%04lx es=%04lx gs=%04lx flags=%08lx\n",
-            EBP_reg(context), ESP_reg(context), DS_reg(context),
-            ES_reg(context), GS_reg(context), EFL_reg(context) );
+            context->Ebp, context->Esp, context->SegDs,
+            context->SegEs, context->SegGs, context->EFlags );
 
     SYSLEVEL_CheckNotLevel( 2 );
 }
diff --git a/relay32/snoop.c b/relay32/snoop.c
index 490d2e1..d87ae07 100644
--- a/relay32/snoop.c
+++ b/relay32/snoop.c
@@ -254,13 +254,13 @@
 	return buf;
 }
 
-#define CALLER1REF (*(DWORD*)ESP_reg(context))
+#define CALLER1REF (*(DWORD*)context->Esp)
 
 void WINAPI SNOOP_DoEntry( CONTEXT86 *context );
 DEFINE_REGS_ENTRYPOINT_0( SNOOP_Entry, SNOOP_DoEntry );
 void WINAPI SNOOP_DoEntry( CONTEXT86 *context )
 {
-	DWORD		ordinal=0,entry = EIP_reg(context)-5;
+	DWORD		ordinal=0,entry = context->Eip - 5;
 	SNOOP_DLL	*dll = firstdll;
 	SNOOP_FUN	*fun = NULL;
 	SNOOP_RETURNENTRIES	**rets = &firstrets;
@@ -319,30 +319,30 @@
 	ret->dll	= dll;
 	ret->args	= NULL;
 	ret->ordinal	= ordinal;
-	ret->origESP	= ESP_reg(context);
+	ret->origESP	= context->Esp;
 
-	EIP_reg(context)= (DWORD)fun->origfun;
+	context->Eip = (DWORD)fun->origfun;
 
 	DPRINTF("CALL %s.%ld: %s(",dll->name,ordinal,fun->name);
 	if (fun->nrofargs>0) {
 		max = fun->nrofargs; if (max>16) max=16;
 		for (i=0;i<max;i++)
-			DPRINTF("%s%s",SNOOP_PrintArg(*(DWORD*)(ESP_reg(context)+4+sizeof(DWORD)*i)),(i<fun->nrofargs-1)?",":"");
+			DPRINTF("%s%s",SNOOP_PrintArg(*(DWORD*)(context->Esp + 4 + sizeof(DWORD)*i)),(i<fun->nrofargs-1)?",":"");
 		if (max!=fun->nrofargs)
 			DPRINTF(" ...");
 	} else if (fun->nrofargs<0) {
 		DPRINTF("<unknown, check return>");
 		ret->args = HeapAlloc(GetProcessHeap(),0,16*sizeof(DWORD));
-		memcpy(ret->args,(LPBYTE)(ESP_reg(context)+4),sizeof(DWORD)*16);
+		memcpy(ret->args,(LPBYTE)(context->Esp + 4),sizeof(DWORD)*16);
 	}
-	DPRINTF(") ret=%08lx fs=%04lx\n",(DWORD)ret->origreturn,FS_reg(context));
+	DPRINTF(") ret=%08lx fs=%04lx\n",(DWORD)ret->origreturn,context->SegFs);
 }
 
 void WINAPI SNOOP_DoReturn( CONTEXT86 *context );
 DEFINE_REGS_ENTRYPOINT_0( SNOOP_Return, SNOOP_DoReturn );
 void WINAPI SNOOP_DoReturn( CONTEXT86 *context )
 {
-	SNOOP_RETURNENTRY	*ret = (SNOOP_RETURNENTRY*)(EIP_reg(context)-5);
+	SNOOP_RETURNENTRY	*ret = (SNOOP_RETURNENTRY*)(context->Eip - 5);
 
 	/* We haven't found out the nrofargs yet. If we called a cdecl
 	 * function it is too late anyway and we can just set '0' (which
@@ -350,8 +350,8 @@
 	 * If stdcall -> everything ok.
 	 */
 	if (ret->dll->funs[ret->ordinal].nrofargs<0)
-		ret->dll->funs[ret->ordinal].nrofargs=(ESP_reg(context)-ret->origESP-4)/4;
-	EIP_reg(context) = (DWORD)ret->origreturn;
+		ret->dll->funs[ret->ordinal].nrofargs=(context->Esp - ret->origESP-4)/4;
+	context->Eip = (DWORD)ret->origreturn;
 	if (ret->args) {
 		int	i,max;
 
@@ -362,15 +362,13 @@
 		for (i=0;i<max;i++)
 			DPRINTF("%s%s",SNOOP_PrintArg(ret->args[i]),(i<max-1)?",":"");
 		DPRINTF(") retval = %08lx ret=%08lx fs=%04lx\n",
-			EAX_reg(context),(DWORD)ret->origreturn,FS_reg(context)
-		);
+			context->Eax,(DWORD)ret->origreturn,context->SegFs );
 		HeapFree(GetProcessHeap(),0,ret->args);
 		ret->args = NULL;
 	} else
 		DPRINTF("RET  %s.%ld: %s() retval = %08lx ret=%08lx fs=%04lx\n",
 			ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name,
-			EAX_reg(context),(DWORD)ret->origreturn,FS_reg(context)
-		);
+			context->Eax,(DWORD)ret->origreturn,context->SegFs );
 	ret->origreturn = NULL; /* mark as empty */
 }
 #else	/* !__i386__ */
diff --git a/win32/device.c b/win32/device.c
index b95ec82..0193400 100644
--- a/win32/device.c
+++ b/win32/device.c
@@ -496,7 +496,7 @@
     else
         ret = VxDList[i].vxdcall( service, context );
 
-    EAX_reg( context ) = ret;
+    context->Eax = ret;
 }
 
 
@@ -811,7 +811,7 @@
 	      (DWORD )hmem, flags );
 
 	ret = VirtualFree ( hmem, 0, MEM_RELEASE );
-	EAX_reg( context ) = ret;
+	context->Eax = ret;
 	FIXME("Returning: %d\n", ret );
 
 	return 0;
@@ -1022,7 +1022,7 @@
         CX_reg(context) = parm;  
 	INT_Int31Handler(context);
 
-	return(AX_reg(context));
+	return LOWORD(context->Eax);
     }
     break;
 
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 83e0dd4..ca22da5 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -77,14 +77,12 @@
     CONTEXT86 context;
 
     memset( &context, 0, sizeof(context) );
-    CS_reg(&context)  = SELECTOROF( proc );
-    EIP_reg(&context) = OFFSETOF( proc );
-    AH_reg(&context)  = (dwFlags & KEYEVENTF_KEYUP)? 0x80 : 0;
-    AL_reg(&context)  = bVk;
-    BH_reg(&context)  = (dwFlags & KEYEVENTF_EXTENDEDKEY)? 1 : 0;
-    BL_reg(&context)  = bScan;
-    SI_reg(&context)  = LOWORD( dwExtraInfo );
-    DI_reg(&context)  = HIWORD( dwExtraInfo );
+    context.SegCs = SELECTOROF( proc );
+    context.Eip   = OFFSETOF( proc );
+    context.Eax   = bVk | ((dwFlags & KEYEVENTF_KEYUP)? 0x8000 : 0);
+    context.Ebx   = bScan | ((dwFlags & KEYEVENTF_EXTENDEDKEY) ? 0x100 : 0);
+    context.Esi   = LOWORD( dwExtraInfo );
+    context.Edi   = HIWORD( dwExtraInfo );
 
     CallTo16RegisterShort( &context, 0 );
 }
diff --git a/windows/winproc.c b/windows/winproc.c
index 8717237..666cc18 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -10,6 +10,7 @@
 #include "wingdi.h"
 #include "wine/winbase16.h"
 #include "wine/winuser16.h"
+#include "wine/winestring.h"
 #include "stackframe.h"
 #include "builtin16.h"
 #include "heap.h"
@@ -193,12 +194,11 @@
     /* Window procedures want ax = hInstance, ds = es = ss */
 
     memset(&context, '\0', sizeof(context));
-    DS_reg(&context)  = SELECTOROF(teb->cur_stack);
-    ES_reg(&context)  = DS_reg(&context);
-    EAX_reg(&context) = wndPtr ? wndPtr->hInstance : DS_reg(&context);
-    CS_reg(&context)  = SELECTOROF(proc);
-    EIP_reg(&context) = OFFSETOF(proc);
-    EBP_reg(&context) = OFFSETOF(teb->cur_stack)
+    context.SegDs = context.SegEs = SELECTOROF(teb->cur_stack);
+    context.Eax   = wndPtr ? wndPtr->hInstance : context.SegDs;
+    context.SegCs = SELECTOROF(proc);
+    context.Eip   = OFFSETOF(proc);
+    context.Ebp   = OFFSETOF(teb->cur_stack)
                         + (WORD)&((STACK16FRAME*)0)->bp;
 
     WIN_ReleaseWndPtr(wndPtr);
@@ -239,7 +239,7 @@
     args[4] = hwnd;
 
     CallTo16RegisterShort( &context, 5 * sizeof(WORD) );
-    ret = MAKELONG( AX_reg(&context), DX_reg(&context) );
+    ret = MAKELONG( LOWORD(context.Eax), LOWORD(context.Edx) );
     if (offset) stack16_pop( offset );
 
     WIN_RestoreWndsLock(iWndsLocks);