Modularized CallFrom/To16 routines.  Adapted dependent routines,
16-bit snoop/relay debugging, and make rules.

diff --git a/include/builtin16.h b/include/builtin16.h
new file mode 100644
index 0000000..f905bea
--- /dev/null
+++ b/include/builtin16.h
@@ -0,0 +1,63 @@
+/*
+ * Win16 built-in DLLs definitions
+ *
+ * Copyright 1999 Ulrich Weigand
+ */
+
+#ifndef __WINE_BUILTIN16_H
+#define __WINE_BUILTIN16_H
+
+#include "windef.h"
+
+#include "pshpack1.h"
+
+typedef struct
+{
+    WORD   pushw_bp;               /* pushw %bp */
+    BYTE   pushl;                  /* pushl $target */      
+    DWORD  target;
+    BYTE   lcall;                  /* lcall __FLATCS__:relay */
+    DWORD  relay;
+    WORD   flatcs;
+} STD_ENTRYPOINT16;
+
+typedef struct
+{
+    WORD   movw_ax;                /* movw $<ax>, %ax */
+    WORD   ax;
+    WORD   movw_dx;                /* movw $<dx>, %dx */
+    WORD   dx;
+    WORD   lret;                   /* lret $<args> */
+    WORD   args;
+    WORD   nopnop;                 /* nop; nop */
+} RET_ENTRYPOINT16;
+
+typedef union
+{
+    STD_ENTRYPOINT16  std;
+    RET_ENTRYPOINT16  ret;
+} ENTRYPOINT16;
+
+#define EP_STD( target, relay ) \
+    { std: { 0x5566, 0x68, (DWORD)(target), 0x9a, (DWORD)(relay), __FLATCS__ } }
+
+#define EP_RET( retval, nargs ) \
+    { ret: { 0xb866, LOWORD(retval), 0xba66, HIWORD(retval), \
+             (nargs)? 0xca66 : 0xcb66, (nargs)? (nargs) : 0x9090, 0x9090 } }
+
+#include "poppack.h"
+
+typedef struct
+{
+    const char *name;              /* DLL name */
+    void       *module_start;      /* 32-bit address of the module data */
+    int         module_size;       /* Size of the module data */
+    const BYTE *code_start;        /* 32-bit address of DLL code */
+    const BYTE *data_start;        /* 32-bit address of DLL data */
+} WIN16_DESCRIPTOR;
+
+
+extern void RELAY_Unimplemented16(void);
+
+
+#endif /* __WINE_BUILTIN16_H */
diff --git a/include/callback.h b/include/callback.h
index bb3dae3..34e03b8 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -20,53 +20,53 @@
 
 typedef struct
 {
-    LONG (CALLBACK *CallRegisterShortProc)( CONTEXT86 *, INT );
-    LONG (CALLBACK *CallRegisterLongProc)( CONTEXT86 *, INT );
-    VOID (CALLBACK *CallFrom16WndProc)(void);
-    LRESULT (CALLBACK *CallWndProc)( WNDPROC16, HWND16, UINT16,
+    LONG (*CallRegisterShortProc)( CONTEXT86 *, INT );
+    LONG (*CallRegisterLongProc)( CONTEXT86 *, INT );
+    VOID (*CallFrom16WndProc)(void);
+    LRESULT (*CallWndProc)( WNDPROC16, HWND16, UINT16,
                                      WPARAM16, LPARAM );
-    LRESULT (CALLBACK *CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16,
+    LRESULT (*CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16,
                                         UINT16, LPARAM, LPARAM );
-    LRESULT (CALLBACK *CallDriverCallback)( FARPROC16, HANDLE16, UINT16,
+    LRESULT (*CallDriverCallback)( FARPROC16, HANDLE16, UINT16,
                                             DWORD, LPARAM, LPARAM );
-    LRESULT (CALLBACK *CallTimeFuncProc)( FARPROC16, WORD, UINT16,
+    LRESULT (*CallTimeFuncProc)( FARPROC16, WORD, UINT16,
                                           DWORD, LPARAM, LPARAM );
-    INT16 (CALLBACK *CallWindowsExitProc)( FARPROC16, INT16 );
-    INT16 (CALLBACK *CallWordBreakProc)( EDITWORDBREAKPROC16, SEGPTR, INT16,
+    INT16 (*CallWindowsExitProc)( FARPROC16, INT16 );
+    INT16 (*CallWordBreakProc)( EDITWORDBREAKPROC16, SEGPTR, INT16,
                                          INT16, INT16 );
-    VOID (CALLBACK *CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
-    WORD (CALLBACK *CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
-    WORD (CALLBACK *CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD );
-    HGLOBAL16 (CALLBACK *CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
-    DWORD (CALLBACK *CallWOWCallbackProc)( FARPROC16, DWORD );
-    BOOL (CALLBACK *CallWOWCallback16Ex)( FARPROC16, DWORD, DWORD, LPVOID, 
+    VOID (*CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
+    WORD (*CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
+    WORD (*CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD );
+    HGLOBAL16 (*CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
+    DWORD (*CallWOWCallbackProc)( FARPROC16, DWORD );
+    BOOL (*CallWOWCallback16Ex)( FARPROC16, DWORD, DWORD, LPVOID, 
                                             LPDWORD );
-    DWORD (CALLBACK *CallUTProc)( FARPROC16, DWORD, DWORD );
-    LRESULT (CALLBACK *CallASPIPostProc)( FARPROC16, SEGPTR );
+    DWORD (*CallUTProc)( FARPROC16, DWORD, DWORD );
+    LRESULT (*CallASPIPostProc)( FARPROC16, SEGPTR );
     /* Following are the graphics driver callbacks */
-    WORD (CALLBACK *CallDrvControlProc)( FARPROC16, SEGPTR, WORD,
+    WORD (*CallDrvControlProc)( FARPROC16, SEGPTR, WORD,
                                          SEGPTR, SEGPTR );
-    WORD (CALLBACK *CallDrvEnableProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
+    WORD (*CallDrvEnableProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
                                         SEGPTR, SEGPTR );
-    WORD (CALLBACK *CallDrvEnumDFontsProc)( FARPROC16, SEGPTR, SEGPTR,
+    WORD (*CallDrvEnumDFontsProc)( FARPROC16, SEGPTR, SEGPTR,
                                             FARPROC16, SEGPTR );
-    WORD (CALLBACK *CallDrvEnumObjProc)( FARPROC16, SEGPTR, WORD, FARPROC16,
+    WORD (*CallDrvEnumObjProc)( FARPROC16, SEGPTR, WORD, FARPROC16,
                                          SEGPTR );
-    WORD (CALLBACK *CallDrvOutputProc)( FARPROC16, SEGPTR, WORD, WORD, SEGPTR,
+    WORD (*CallDrvOutputProc)( FARPROC16, SEGPTR, WORD, WORD, SEGPTR,
                                         SEGPTR, SEGPTR, SEGPTR, SEGPTR );
-    DWORD (CALLBACK *CallDrvRealizeProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
+    DWORD (*CallDrvRealizeProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
                                           SEGPTR, SEGPTR );
-    WORD (CALLBACK *CallDrvStretchBltProc)( FARPROC16, SEGPTR, WORD, WORD,
+    WORD (*CallDrvStretchBltProc)( FARPROC16, SEGPTR, WORD, WORD,
                                             WORD, WORD, SEGPTR, WORD, WORD,
                                             WORD, WORD, DWORD, SEGPTR, SEGPTR,
                                             SEGPTR );
-    DWORD (CALLBACK *CallDrvExtTextOutProc)( FARPROC16, SEGPTR, WORD, WORD,
+    DWORD (*CallDrvExtTextOutProc)( FARPROC16, SEGPTR, WORD, WORD,
                                              SEGPTR, SEGPTR, INT16, SEGPTR,
                                              SEGPTR, SEGPTR, SEGPTR, SEGPTR,
                                              WORD );
-    WORD (CALLBACK *CallDrvGetCharWidthProc)( FARPROC16, SEGPTR, SEGPTR, WORD,
+    WORD (*CallDrvGetCharWidthProc)( FARPROC16, SEGPTR, SEGPTR, WORD,
 					      WORD, SEGPTR, SEGPTR, SEGPTR );
-    BOOL16 (CALLBACK *CallDrvAbortProc)( FARPROC16, HDC16, INT16 );
+    BOOL16 (*CallDrvAbortProc)( FARPROC16, HDC16, INT16 );
 } CALLBACKS_TABLE;
 
 extern const CALLBACKS_TABLE *Callbacks;
diff --git a/include/module.h b/include/module.h
index 10e302e..fdd1c55 100644
--- a/include/module.h
+++ b/include/module.h
@@ -235,7 +235,7 @@
 /* if1632/builtin.c */
 extern BOOL BUILTIN_Init(void);
 extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force );
-extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
+extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, LPSTR name, WORD *pOrd );
 
 /* relay32/builtin.c */
 extern HMODULE BUILTIN32_LoadImage(LPCSTR name, OFSTRUCT *ofs);
diff --git a/include/stackframe.h b/include/stackframe.h
index 1a08630..a7b9f0b 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -32,17 +32,20 @@
 typedef struct
 {
     STACK32FRAME *frame32;        /* 00 32-bit frame from last CallTo16() */
-    DWORD         ebp;            /* 04 full 32-bit content of ebp */
-    WORD          mutex_count;    /* 08 Win16Mutex recursion count */
-    WORD          fs;             /* 0a fs */
-    WORD          entry_ip;       /* 0c ip of entry point */
-    WORD          ds;             /* 0e ds */
-    WORD          entry_cs;       /* 10 cs of entry point */
-    WORD          es;             /* 12 es */
-    DWORD         entry_point;    /* 14 32-bit entry point to call */
-    WORD          bp;             /* 18 16-bit bp */
-    WORD          ip;             /* 1a return address */
-    WORD          cs;             /* 1c */
+    DWORD         edx;            /* 04 saved registers */
+    DWORD         ecx;            /* 08 */
+    DWORD         ebp;            /* 0c */
+    WORD          ds;             /* 10 */
+    WORD          es;             /* 12 */
+    WORD          fs;             /* 14 */
+    WORD          gs;             /* 16 */
+    DWORD         relay;          /* 18 address of argument relay stub */
+    DWORD         entry_ip;       /* 1c ip of entry point */
+    DWORD         entry_cs;       /* 20 cs of entry point */
+    DWORD         entry_point;    /* 24 API entry point to call, reused as mutex count */
+    WORD          bp;             /* 28 16-bit stack frame chain */
+    WORD          ip;             /* 2a return address */
+    WORD          cs;             /* 2c */
 } STACK16FRAME;
 
 #include "poppack.h"