diff --git a/ChangeLog b/ChangeLog
index 18ff63d93fcf6a5449928c423349e55181452088..086760be77c3f76541bc1b7e1026457eed6906f5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,205 @@
+Mon Nov  1 14:40:21 1993  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [if1632/user.spec]
+	Removed some duplicate entries.
+
+	* [include/dialog.h] [windows/dialog.c]
+	Implemented dialog units and fonts.
+	Added preliminary loading of dialog resources.
+	Preliminary implementation of DialogBox().
+	Implemented Get/SetDlgItem* functions.
+
+	* [windows/win.c]
+	Implemented WM_PARENTNOTIFY message.
+	Implemented CreateWindowEx() and GetWindow().
+	Completed DestroyWindow().
+
+Mon Nov  1 18:19:34 1993  Erik Bos
+
+	* [loader/signal.c]
+	Added support for int 0x11 & 0x12.
+
+        * [loader/int21.c]
+	Improved function handling.
+
+Sun Oct 31 12:38:09 1993  David Metcalfe <david@prism.demon.co.uk>
+
+	* [objects/font.c]
+	Implemented GetCharWidth().
+
+Wed Oct 27 09:56:06 1993  John Brezak <brezak@ch.hp.com>
+
+	* [Makefile]
+        Use GNU malloc.
+
+	* [include/int21.h include/wine.h]
+        Change sc_eflags to sc_efl .
+
+	* [include/wine.h]
+        Fix misplaced #endif
+        Include <signal.h> for NetBSD
+
+	* [loader/int21.c]
+        Don't include <sys/vfs.h> in NetBSD
+        Do include <sys/mount.h> in NetBSD
+        Cleanup some lint.
+
+Mon Oct 26 17:59:01 1993  Erik Bos
+
+        * [include/int21.h]
+        Added.
+
+        * [loader/int21.c]
+        Added support for many dos ints.
+
+        * [misc/file.c] [include/files.h]
+        Moved OPEN_MAX and DosDriveStruct to files.h.
+
+Sun Oct 24 13:36:50 1993  David Metcalfe <david@prism.demon.co.uk>
+
+	* [controls/button.c]
+	Implemented CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE,
+	RADIOBUTTON, AUTORADIOBUTTON, GROUPBOX controls, together with
+	a preliminary USERBUTTON control.
+
+	* [objects/text.c]
+	Corrected bugs in TEXT_NextLine() and added handling of prefix
+	character.
+
+	* [controls/button.c]
+	Disabled focus handling by commenting out SetFocus() calls until
+	serious bug can be found.
+
+Oct  20, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/listbox.c]
+	Listbox control window
+		Painting cleanup, new messages processed.
+
+	* [controls/scroll.c]
+	Scroll bar control window
+		Painting cleanup.
+
+	* [controls/combo.c]
+	Combo box control window
+		Painting cleanup.
+
+Tue Oct 12 17:50:11 1993  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [objects/color.c] [objects/palette.c] [windows/syscolor.c]
+	Better support for the private color map.
+	Using a private map is now the default.
+
+	* [windows/win.c]
+	Bug fix.
+
+	* [include/dialog.h] [windows/dialog.c]
+	Implemented CreateDialog*() and IsDialogMessage().
+
+	* [misc/xt.c] [windows/defwnd.c]
+	Moved DefWindowProc() to defwnd.c.
+	Added WM_NCCREATE, WM_NCDESTROY and WM_CTLCOLOR handling.
+
+	* [windows/defdlg.c]
+	Started the implementation of DefDlgProc().
+
+	* [windows/win.c]
+	Added WM_NCCREATE and WM_NCDESTROY messages.
+	Implemented IsChild().
+
+Tue Oct 12 17:50:20 1993  David Metcalfe <david@prism.demon.co.uk>
+
+	* [windows/focus.c]
+	Implemented GetFocus() and SetFocus().
+
+	* [windows/event.c]
+	Added processing of FocusIn and FocusOut events.
+
+	* [windows/graphics.c]
+	Added DrawFocusRect().
+
+Sat Oct  9 14:36:57 1993  Erik Bos
+
+	* [loader/int1a.c]
+	Added more function handling.
+
+Wed Oct  6 12:21:22 1993  Erik Bos
+
+	* [loader/signal.c]
+	Split signal.c into int1a.c, int21.c and signal.c.
+
+Tue Oct  5 22:12:40 1993  David Metcalfe
+
+	* [controls/static.c] [control/widgets.c]
+	Static control class.
+
+	* [objects/text.c]
+	Added processing of additional DT_ flags to DrawText().
+
+	* [windows/win.c] [misc/xt.c]
+	Added SetWindowText() and WM_SETTEXT processing.
+
+Tue Oct  5 22:12:40 1993  Martin Ayotte
+
+	* [controls/listbox.c]
+	Listbox control window
+
+	* [controls/scroll.c]
+	Scroll bar control window
+
+	* [controls/combo.c]
+	Combo box control window
+
+	* [include/combo.h]
+	Combo box definitions
+
+	* [include/listbox.h]
+	Listbox definitions
+
+	* [include/scroll.h]
+	Scroll bar definitions
+
+Sat Oct  2 09:35:54 1993  Bob Amstadt  (bob at pooh)
+
+	* [if1632/callback.c]
+	Fixed bug in MakeProcInstance().
+
+	* [debugger/info.c]
+	Changed x/w and x/b to display in hex.
+
+	* [debugger/i386-pinsn.c]
+	Added code to properly unassemble 16-bit indexing.
+
+Fri Oct  1 08:29:05 1993  Bob Amstadt  (bob at pooh)
+
+	* [loader/files.c] [misc/profile.c]
+	System initialization file is now called "wine.ini" and can
+	be located in the current directory, the user's home directory,
+	or any directories specified in the WINEPATH environment variable.
+
+	* [tools/build.c] [if1632/call.S] [include/regfunc.h]
+	Changed register function stack to match sigcontext structure.
+
+Thu Sep 30 22:30:21 1993  Bob Amstadt  (bob at pooh)
+
+	* [loader/files.c]
+	Created function to search a path for files to load.
+
+	* [loader/wine.c]
+	Modified exe and dll file loading to search through path
+	specified by the environment variable WINEPATH.
+
+Thu Sep 30 22:30:21 1993  Eric Youngdale
+
+	* [loader/signal.c]
+	Bug fix.
+
+Thu Sep 30 22:30:21 1993  John Brezak
+
+	* [debugger/dbg.y] [debugger/debug.l] [debugger/dtest.c] 
+	  [debugger/obstack.h]
+	Updates to allow debugger to function under NetBSD.
+
 Tue Sep 28 19:59:21 1993  David Metcalfe
 
 	* [windows/win.c]
diff --git a/Makefile b/Makefile
index b6d32369dae48d4f10d8d471f2f5330c93c331ad..8b508d988a377e8a457db874acb249d1fefaf849 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 ######################################################################
 # These variables are inherited by the sub-makefiles
-DEBUGOPTS=
+DEBUGOPTS=-DDEBUG_RESOURCE
 COPTS=-O2 -m486
 INCLUDE_DIR=include
 LDFLAGS=
@@ -18,7 +18,7 @@ all: $(TARGET)
 dummy:
 
 clean:
-	rm -f *~ *.o
+	rm -f *~ *.o *#
 	@for i in tools $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done
 
 $(TARGET): dummy
diff --git a/README b/README
index bdc28e2d3f722601bbe4e674122ac2c0ad1d0b9f..9e326d6270372adae4fafb1f20e57a4295c67d42 100644
--- a/README
+++ b/README
@@ -18,15 +18,42 @@ in the file "bsdmake.patch".  This release requires NetBSD-current.
 All:
 
 To build Wine, first do a "make depend" and then a "make".  The
-executable "wine" will be built.
+executable "wine" will be built.  "wine" will load and run Windows'
+executables.  You must specify the entire path to the executable,
+have the executable in the current directory, or specify a load
+path with environment variable WINEPATH.
 
-Grab a copy of Windows sol.exe (Solitaire) and run it with the command:
+For example, to run Windows' solitaire:
 
-	wine sol.exe
+	export WINEPATH=/dos/windows;/dos/windows/system
+	wine sol
 
 Have a nice game of solitaire, but be careful.  Emulation isn't perfect.
 So, occassionally it will crash.
 
+WHAT'S NEW with version 0.4.7: (see ChangeLog for details)
+	- More dialog box functions
+	- More DOS interrupts
+	- NetBSD compatibility patches
+
+WHAT'S NEW with version 0.4.5: (see ChangeLog for details)
+	- Bug fixes
+	- focus routines
+	- dialog box functions
+	- improvements to control windows
+
+WHAT'S NEW with version 0.4.4: (see ChangeLog for details)
+	- Bug fixes
+	- New static control class
+	- Preliminary listbox, combobox and scrollbar controls
+	- System initialization file is now called "wine.ini", and
+	  may be located in the user's current directory, the
+	  user's home directory or any directory specified by
+	  the WINEPATH environment variable.
+	- The loader now searches the directories specified by the
+	  WINEPATH environment variable for programs and DLLs.
+	- Internal debugger now works on 386BSD.
+
 WHAT'S NEW with version 0.4.3: (see ChangeLog for details)
 	- Bug fixes
 	- Resource loading now able to load DLL resources
diff --git a/README.DEBUGGER b/README.DEBUGGER
deleted file mode 100644
index 2f6ff99001636d9c2342198f8f62596b47024629..0000000000000000000000000000000000000000
--- a/README.DEBUGGER
+++ /dev/null
@@ -1,47 +0,0 @@
-Date: Sun, 26 Sep 93 03:18:19 EDT
-From: eric@tantalus.nrl.navy.mil (Eric Youngdale)
-Message-Id: <9309260718.AA13966@tantalus.nrl.navy.mil>
-To: bob@amscons.amscons.com
-Cc: linux-activists@Niksula.hut.fi
-In-Reply-To: Bob Amstadt's message of Sat, 25 Sep 1993 23:36:32 +0300
-    <m0oggMt-000CrhC@amscons.amscons.com>
-X-Mn-Key: WABI
-
-
-
->I may just be dreaming, but I'm beginning to like the idea of a built
->in debugger.
-
-	So do I.  I like it so much that I wrote one.  It turns out that the
-disassembly code in gdb is pretty much localized to one source file, and this
-was easy to splice into a simple program.  In addition, there are 2 variables
-that you set if you are disassembling 16 bit code, so it makes it all the
-better.
-
-	Anyway, there is a parser that understands a limited set of gdb
-commands (very limited, but the 'x' command is pretty functional as long as you
-stick to numeric rather than symbolic addresses).  The parser understands $pc
-and $sp for your convenience, and you can do things like "x/10i $pc" and "info
-regs" to see what is going on.  In principle you can do "x/x", "x/s", "x/d",
-"x/w", "x/b", "x/i" and "x/c".  I implemented an "info stack" command that
-simply dumps a number of bytes from the stack onto the screen, but it currently
-makes no attempt to actually interpret the stack frames.
-
-	This will probably not work on non-linux systems, and I have no idea
-how much work it will be to fix it.  To start with we need some simple macros
-to determine (based upon a segment selector) whether we are in a 16 bit or a 32
-bit segment, but this should be pretty easy to fix.  I shamelessly ripped off a
-bunch of files from gdb, and I obviously picked the ones for linux.  For other
-systems you may need to make adjustments to these files somehow.  It is too
-late in the evening to worry about this now.
-
-	It will probably be easy to modify the parser to allow you to change
-memory locations and/or register values and then continue execution.  Also,
-some of the hooks for using readline with the parser are in place, but it does
-not work reliably for some reason, so I left it out for now.  Adding gnu
-readline really would bloat the package a lot.  Instead I could use Rich Salz's
-editlib (the canonical test case for the DLL tools), which has a command line
-history feature that could be an acceptable substitute - this is much smaller
-than gnu readline, but I am not sure what features are present.
-
--Eric
diff --git a/bsdmake.patch b/bsdmake.patch
index 7be2893c227cce01fe135c9fbae11cd85aafc1e8..99fa57a116effe9483a5c1c3254346a91e290942 100644
--- a/bsdmake.patch
+++ b/bsdmake.patch
@@ -6,7 +6,7 @@ diff -ruN ../Backup//Makefile ./Makefile
  # These definitions are for the top level
  TARGET=wine
 -LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
-+LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm -li386
++LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm -li386 -lgnumalloc
  OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
  	memory/memory.o misc/misc.o objects/objects.o windows/windows.o
  SUBDIRS=if1632 controls loader memory misc objects windows
@@ -122,3 +122,12 @@ diff -ruN ../Backup//windows/Makefile ./windows/Makefile
 +.if exists(.depend)
 +.include ".depend"
 +.endif
+--- debugger/Makefile.orig	Thu Sep 30 07:29:39 1993
++++ debugger/Makefile	Thu Sep 30 07:27:00 1993
+@@ -37,3 +37,6 @@
+ depend: dbg.tab.c dbg.tab.h lex.yy.c
+ 	$(CC) $(CFLAGS) -M *.c > .depend
+ 
++.if exists(.depend)
++.include ".depend"
++.endif
diff --git a/controls/Makefile b/controls/Makefile
index 46a93ba7815de1b594107f324c76091f27d5b1fa..2f4c0812d01821dd695e91f4ee8a67638ad24fdd 100644
--- a/controls/Makefile
+++ b/controls/Makefile
@@ -1,7 +1,8 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
 
-OBJS=menu.o widgets.o button.o SmeMenuButto.o WinLabel.o WinCommand.o \
-     WinMenuButto.o
+OBJS=menu.o widgets.o button.o scroll.o listbox.o combo.o static.o \
+	SmeMenuButto.o WinLabel.o WinCommand.o \
+	WinMenuButto.o
 
 default: controls.o
 
@@ -9,7 +10,7 @@ controls.o: $(OBJS)
 	$(LD) -r -o controls.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/controls/button.c b/controls/button.c
index f843beb30ac0e31b8570a818a9f55e3c5fa64205..1a13b9d8223f81f872716b7db96b770a096e7ead 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -1,33 +1,53 @@
-/* File: button.c -- MS-Windows(tm) compatible "Button" replacement widget
+/* File: button.c -- Button type widgets
  *
- *                   programmed by Johannes Ruscheinski for the Linux WABI
- *                   project.
- *		     (C) 1993 by Johannes Ruscheinski
- *
- *                   Modifications by David Metcalfe
+ * Copyright (C) 1993 Johannes Ruscheinski
+ * Copyright (C) 1993 David Metcalfe
  */
 
+static char Copyright1[] = "Copyright Johannes Ruscheinski, 1993";
+static char Copyright2[] = "Copyright David Metcalfe, 1993";
+
 #include <windows.h>
 #include "win.h"
 
 LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
 
-static COLORREF color_windowframe, color_btnface, color_btnshadow,
-		color_btntext, color_btnhighlight;
+static COLORREF color_windowtext, color_windowframe, color_btnface, 
+                color_btnshadow, color_btntext, color_btnhighlight;
 
 static BOOL pressed;
 
 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
 	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
-		    GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
+		GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
 #define DIM(array)	((sizeof array)/(sizeof array[0]))
 
 static LONG PB_Paint(HWND hWnd);
 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
 static LONG PB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
 static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
+static LONG PB_KillFocus(HWND hwnd);
 static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc);
 static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc);
+static LONG CB_Paint(HWND hWnd);
+static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
+static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
+static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
+static LONG CB_KillFocus(HWND hWnd);
+static LONG CB_SetCheck(HWND hWnd, WORD wParam);
+static LONG CB_GetCheck(HWND hWnd);
+static LONG RB_Paint(HWND hWnd);
+static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
+static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
+static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
+static LONG RB_KillFocus(HWND hWnd);
+static LONG RB_SetCheck(HWND hWnd, WORD wParam);
+static LONG RB_GetCheck(HWND hWnd);
+static LONG GB_Paint(HWND hWnd);
+static LONG UB_Paint(HWND hWnd);
+static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
+static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
+static LONG UB_KillFocus(HWND hWnd);
 
 typedef struct
 {
@@ -35,9 +55,12 @@ typedef struct
     LONG (*lButtonDownfn)();
     LONG (*lButtonUpfn)();
     LONG (*lButtonDblClkfn)();
+    LONG (*killFocusfn)();
+    LONG (*setCheckfn)();
+    LONG (*getCheckfn)();
 } BTNFN;
 
-#define MAX_BTN_TYPE  2
+#define MAX_BTN_TYPE  10
 
 static BTNFN btnfn[MAX_BTN_TYPE] =
 {
@@ -45,13 +68,91 @@ static BTNFN btnfn[MAX_BTN_TYPE] =
 	(LONG(*)())PB_Paint,                       /* BS_PUSHBUTTON */
 	(LONG(*)())PB_LButtonDown,
 	(LONG(*)())PB_LButtonUp,
-	(LONG(*)())PB_LButtonDblClk
+	(LONG(*)())PB_LButtonDblClk,
+	(LONG(*)())PB_KillFocus,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
     },
     { 
 	(LONG(*)())PB_Paint,                       /* BS_DEFPUSHBUTTON */
 	(LONG(*)())PB_LButtonDown,
 	(LONG(*)())PB_LButtonUp,
-	(LONG(*)())PB_LButtonDblClk
+	(LONG(*)())PB_LButtonDblClk,
+	(LONG(*)())PB_KillFocus,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
+    },
+    {
+	(LONG(*)())CB_Paint,                       /* BS_CHECKBOX */
+	(LONG(*)())CB_LButtonDown,
+	(LONG(*)())CB_LButtonUp,
+	(LONG(*)())CB_LButtonDblClk,
+	(LONG(*)())CB_KillFocus,
+	(LONG(*)())CB_SetCheck,
+	(LONG(*)())CB_GetCheck
+    },
+    {
+	(LONG(*)())CB_Paint,                       /* BS_AUTOCHECKBOX */
+	(LONG(*)())CB_LButtonDown,
+	(LONG(*)())CB_LButtonUp,
+	(LONG(*)())CB_LButtonDblClk,
+	(LONG(*)())CB_KillFocus,
+	(LONG(*)())CB_SetCheck,
+	(LONG(*)())CB_GetCheck
+    },
+    {
+	(LONG(*)())RB_Paint,                       /* BS_RADIOBUTTON */
+	(LONG(*)())RB_LButtonDown,
+	(LONG(*)())RB_LButtonUp,
+	(LONG(*)())RB_LButtonDblClk,
+	(LONG(*)())RB_KillFocus,
+	(LONG(*)())RB_SetCheck,
+	(LONG(*)())RB_GetCheck
+    },
+    {
+	(LONG(*)())CB_Paint,                       /* BS_3STATE */
+	(LONG(*)())CB_LButtonDown,
+	(LONG(*)())CB_LButtonUp,
+	(LONG(*)())CB_LButtonDblClk,
+	(LONG(*)())CB_KillFocus,
+	(LONG(*)())CB_SetCheck,
+	(LONG(*)())CB_GetCheck
+    },
+    {
+	(LONG(*)())CB_Paint,                       /* BS_AUTO3STATE */
+	(LONG(*)())CB_LButtonDown,
+	(LONG(*)())CB_LButtonUp,
+	(LONG(*)())CB_LButtonDblClk,
+	(LONG(*)())CB_KillFocus,
+	(LONG(*)())CB_SetCheck,
+	(LONG(*)())CB_GetCheck
+    },
+    {
+	(LONG(*)())GB_Paint,                       /* BS_GROUPBOX */
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
+    },
+    {
+	(LONG(*)())UB_Paint,                       /* BS_USERBUTTON */
+	(LONG(*)())UB_LButtonDown,
+	(LONG(*)())UB_LButtonUp,
+	(LONG(*)())NULL,
+	(LONG(*)())UB_KillFocus,
+	(LONG(*)())NULL,
+	(LONG(*)())NULL
+    },
+    {
+	(LONG(*)())RB_Paint,                       /* BS_AUTORADIOBUTTON */
+	(LONG(*)())RB_LButtonDown,
+	(LONG(*)())RB_LButtonUp,
+	(LONG(*)())RB_LButtonDblClk,
+	(LONG(*)())RB_KillFocus,
+	(LONG(*)())RB_SetCheck,
+	(LONG(*)())RB_GetCheck
     }
 };
 
@@ -80,42 +181,49 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
 		else
 		{
 		    /* initialise colours used for button rendering: */
+		    color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
 		    color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
 		    color_btnface      = GetSysColor(COLOR_BTNFACE);
 		    color_btnshadow    = GetSysColor(COLOR_BTNSHADOW);
 		    color_btntext      = GetSysColor(COLOR_BTNTEXT);
 		    color_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT);
 
+		    (WORD)(*(wndPtr->wExtra)) = 0;
 		    pressed = FALSE;
 		    lResult = 0L;
 		}
 		break;
 
 	case WM_PAINT:
-		(btnfn[style].paintfn)(hWnd);
+		if (btnfn[style].paintfn)
+		    (btnfn[style].paintfn)(hWnd);
 		break;
 
 	case WM_LBUTTONDOWN:
-		(btnfn[style].lButtonDownfn)(hWnd, wParam, lParam);
+		if (btnfn[style].lButtonDownfn)
+		    (btnfn[style].lButtonDownfn)(hWnd, wParam, lParam);
 		break;
 
 	case WM_LBUTTONUP:
-		(btnfn[style].lButtonUpfn)(hWnd, wParam, lParam);
+		if (btnfn[style].lButtonUpfn)
+		    (btnfn[style].lButtonUpfn)(hWnd, wParam, lParam);
 		break;
 
 	case WM_LBUTTONDBLCLK:
-		(btnfn[style].lButtonDblClkfn)(hWnd, wParam, lParam);
+		if (btnfn[style].lButtonDblClkfn)
+		    (btnfn[style].lButtonDblClkfn)(hWnd, wParam, lParam);
 		break;
 
 	case WM_SETFOCUS:
 		break;
 
 	case WM_KILLFOCUS:
-		InvalidateRect(hWnd, NULL, FALSE);
-		UpdateWindow(hWnd);
+		if (btnfn[style].killFocusfn)
+		    (btnfn[style].killFocusfn)(hWnd);
 		break;
 
 	case WM_SYSCOLORCHANGE:
+		color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
 		color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
 		color_btnface      = GetSysColor(COLOR_BTNFACE);
 		color_btnshadow    = GetSysColor(COLOR_BTNSHADOW);
@@ -124,6 +232,16 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
 		InvalidateRect(hWnd, NULL, TRUE);
 		break;
 
+	case BM_SETCHECK:
+		if (btnfn[style].setCheckfn)
+		    (btnfn[style].setCheckfn)(hWnd, wParam);
+		break;
+
+	case BM_GETCHECK:
+		if (btnfn[style].getCheckfn)
+		    (btnfn[style].getCheckfn)(hWnd);
+		break;
+
 	default:
 		lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
 		break;
@@ -155,7 +273,7 @@ static LONG PB_Paint(HWND hWnd)
 
 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
-/*  SetFocus(hWnd);   */
+/*    SetFocus(hWnd); */
     SetCapture(hWnd);
     pressed = TRUE;
     InvalidateRect(hWnd, NULL, FALSE);
@@ -184,6 +302,13 @@ static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
 	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
 }
 
+static LONG PB_KillFocus(HWND hWnd)
+{
+    pressed = FALSE;
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
 static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc)
 {
 	HPEN hOldPen, hFramePen;
@@ -255,19 +380,16 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc)
 	CombineRgn(rgn, rgn1, rgn2, RGN_AND);
 	FillRgn(hDC, rgn2, hShadowBrush);
 
-#if 0
 	/* do we have the focus? */
 	if (len >= 1 && GetFocus() == hButton) {
 		dwTextSize = GetTextExtent(hDC, text, len);
-		delta = ((rc.right - rc.left) - LOWORD(dwTextSize) + 1) >> 1;
+		delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1;
 		rc.left += delta;	rc.right -= delta;
 		GetTextMetrics(hDC, &tm);
-		delta = ((rc.bottom - rc.top) -
-			 tm.tmHeight + tm.tmInternalLeading) >> 1;
+		delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1;
 		rc.top += delta; 	rc.bottom -= delta;
 		DrawFocusRect(hDC, &rc);
 	}
-#endif
 
 	SelectObject(hDC, (HANDLE)hOldPen);
 	SelectObject(hDC, (HANDLE)hOldBrush);
@@ -275,10 +397,8 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc)
 	DeleteObject((HANDLE)hShadowBrush);
 	DeleteObject((HANDLE)hBackgrndBrush);
 	DeleteObject((HANDLE)rgn1);
-#if 0
 	DeleteObject((HANDLE)rgn2);
 	DeleteObject((HANDLE)rgn);
-#endif
 }
 
 
@@ -320,19 +440,16 @@ static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc)
 			 DT_SINGLELINE | DT_CENTER| DT_VCENTER);
 	}
 
-#if 0
 	/* do we have the focus? */
 	if (len >= 1 && GetFocus() == hButton) {
 		dwTextSize = GetTextExtent(hDC, text, len);
-		delta = ((rc.right - rc.left) - LOWORD(dwTextSize)) >> 1;
+		delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1;
 		rc.left += delta;	rc.right -= delta;
 		GetTextMetrics(hDC, &tm);
-		delta = ((rc.bottom - rc.top) -
-			 tm.tmHeight + tm.tmInternalLeading) >> 1;
+		delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1;
 		rc.top += delta; 	rc.bottom -= delta;
 		DrawFocusRect(hDC, &rc);
 	}
-#endif
 
 	SelectObject(hDC, (HANDLE)hOldPen);
 	SelectObject(hDC, (HANDLE)hOldBrush);
@@ -342,10 +459,498 @@ static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc)
 }
 
 
+/**********************************************************************
+ *       Check Box Functions
+ */
+
+static LONG CB_Paint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc, rc3;
+    HDC hDC;
+    HPEN hPen, hOldPen;
+    HBRUSH hBrush, hGrayBrush;
+    int textlen, delta;
+    char *text;
+    HANDLE hText;
+    TEXTMETRIC tm;
+    SIZE size;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    hDC = BeginPaint(hWnd, &ps);
+    GetClientRect(hWnd, &rc);
+
+    hPen = CreatePen(PS_SOLID, 1, color_windowtext);
+    hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen);
+    hGrayBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
+
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+    FillRect(hDC, &rc, hBrush);
+
+    textlen = GetWindowTextLength(hWnd);
+    hText = LocalAlloc(LMEM_MOVEABLE, textlen+1);
+    text = LocalLock(hText);
+    GetWindowText(hWnd, text, textlen+1);
+    GetTextMetrics(hDC, &tm);
+
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    Rectangle(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
+    if (pressed)
+	Rectangle(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1, 
+		                              tm.tmHeight + delta - 1);
+
+    switch ((WORD)(*(wndPtr->wExtra)))
+    {
+    case 1:
+	MoveTo(hDC, 0, rc.top + delta);
+	LineTo(hDC, tm.tmHeight - 1, tm.tmHeight + delta - 1);
+	MoveTo(hDC, 0, tm.tmHeight + delta - 1);
+	LineTo(hDC, tm.tmHeight - 1, rc.top + delta);
+	break;
+
+    case 2:
+	rc3.left = 1;
+	rc3.top = rc.top + delta + 1;
+	rc3.right = tm.tmHeight - 1;
+	rc3.bottom = tm.tmHeight + delta - 1;
+	FillRect(hDC, &rc3, hGrayBrush);
+	break;
+    }
+
+    rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
+    DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
+
+    /* do we have the focus? */
+    if (GetFocus() == hWnd)
+    {
+	GetTextExtentPoint(hDC, text, textlen, &size);
+	rc.top += delta - 1;
+	rc.bottom -= delta + 1;
+	rc.left--;
+	rc.right = rc.left + size.cx + 2;
+	DrawFocusRect(hDC, &rc);
+    }
+
+    LocalUnlock(hText);
+    LocalFree(hText);
+    GlobalUnlock(hWnd);
+    EndPaint(hWnd, &ps);
+}
+
+static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+    {
+/*	SetFocus(hWnd); */
+	SetCapture(hWnd);
+	pressed = TRUE;
+	InvalidateRect(hWnd, NULL, FALSE);
+	UpdateWindow(hWnd);
+    }
+}
+
+static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+    LONG style;
+
+    pressed = FALSE;
+    ReleaseCapture();
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+    {
+	style = wndPtr->dwStyle & 0x0000000F;
+	if (style == BS_AUTOCHECKBOX)
+	{
+	    switch ((WORD)(*(wndPtr->wExtra)))
+	    {
+	    case 0:
+		(WORD)(*(wndPtr->wExtra)) = 1;
+		break;
+
+	    case 1:
+		(WORD)(*(wndPtr->wExtra)) = 0;
+		break;
+	    }
+	}
+	else if (style == BS_AUTO3STATE)
+	{
+	    switch ((WORD)(*(wndPtr->wExtra)))
+	    {
+	    case 0:
+		(WORD)(*(wndPtr->wExtra)) = 1;
+		break;
+
+	    case 1:
+		(WORD)(*(wndPtr->wExtra)) = 2;
+		break;
+
+	    case 2:
+		(WORD)(*(wndPtr->wExtra)) = 0;
+		break;
+	    }
+	}
+	NOTIFY_PARENT(hWnd, BN_CLICKED);
+    }
+    GlobalUnlock(hWnd);
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+}
+
+static LONG CB_KillFocus(HWND hWnd)
+{
+    pressed = FALSE;
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG CB_SetCheck(HWND hWnd, WORD wParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    if ((WORD)(*(wndPtr->wExtra)) != wParam)
+    {
+	(WORD)(*(wndPtr->wExtra)) = wParam;
+	InvalidateRect(hWnd, NULL, FALSE);
+	UpdateWindow(hWnd);
+    }
+    GlobalUnlock(hWnd);
+}
+
+static LONG CB_GetCheck(HWND hWnd)
+{
+    WORD wResult;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    wResult = (WORD)(*(wndPtr->wExtra));
+    GlobalUnlock(hWnd);
+    return (LONG)wResult;
+}
+
+
+/**********************************************************************
+ *       Radio Button Functions
+ */
 
+static LONG RB_Paint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc;
+    HDC hDC;
+    HPEN hPen, hOldPen;
+    HBRUSH hBrush, hOldBrush;
+    int textlen, delta;
+    char *text;
+    HANDLE hText;
+    TEXTMETRIC tm;
+    SIZE size;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
 
+    hDC = BeginPaint(hWnd, &ps);
+    GetClientRect(hWnd, &rc);
 
+    hPen = CreatePen(PS_SOLID, 1, color_windowtext);
+    hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen);
 
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+    FillRect(hDC, &rc, hBrush);
 
+    textlen = GetWindowTextLength(hWnd);
+    hText = LocalAlloc(LMEM_MOVEABLE, textlen+1);
+    text = LocalLock(hText);
+    GetWindowText(hWnd, text, textlen+1);
+    GetTextMetrics(hDC, &tm);
 
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    Ellipse(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
+    if (pressed)
+	Ellipse(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1, 
+		                              tm.tmHeight + delta - 1);
+
+    if ((WORD)(*(wndPtr->wExtra)) == 1)
+    {
+	hBrush = CreateSolidBrush(color_windowtext);
+	hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBrush);
+	Ellipse(hDC, 3, rc.top + delta + 3, tm.tmHeight - 3,
+		                            tm.tmHeight + delta -3); 
+	SelectObject(hDC, (HANDLE)hOldBrush);
+	DeleteObject((HANDLE)hBrush);
+    }
+
+    rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
+    DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
+
+    /* do we have the focus? */
+    if (GetFocus() == hWnd)
+    {
+	GetTextExtentPoint(hDC, text, textlen, &size);
+	rc.top += delta - 1;
+	rc.bottom -= delta + 1;
+	rc.left--;
+	rc.right = rc.left + size.cx + 2;
+	DrawFocusRect(hDC, &rc);
+    }
+
+    LocalUnlock(hText);
+    LocalFree(hText);
+    GlobalUnlock(hWnd);
+    EndPaint(hWnd, &ps);
+}
+
+static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+    {
+/*	SetFocus(hWnd); */
+	SetCapture(hWnd);
+	pressed = TRUE;
+	InvalidateRect(hWnd, NULL, FALSE);
+	UpdateWindow(hWnd);
+    }
+}
+
+static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+    LONG style;
+
+    pressed = FALSE;
+    ReleaseCapture();
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+    {
+	style = wndPtr->dwStyle & 0x0000000F;
+	if (style == BS_AUTORADIOBUTTON)
+	    (WORD)(*(wndPtr->wExtra)) = 1;
+	NOTIFY_PARENT(hWnd, BN_CLICKED);
+    }
+    GlobalUnlock(hWnd);
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+    HDC hDC;
+    TEXTMETRIC tm;
+    int delta;
+
+    hDC = GetDC(hWnd);
+    GetTextMetrics(hDC, &tm);
+    ReleaseDC(hWnd, hDC);
+    GetClientRect(hWnd, &rc);
+    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
+    rc.top += delta;
+    rc.bottom = tm.tmHeight + delta;
+    rc.right = tm.tmHeight;
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+}
+
+static LONG RB_KillFocus(HWND hWnd)
+{
+    pressed = FALSE;
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG RB_SetCheck(HWND hWnd, WORD wParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    if ((WORD)(*(wndPtr->wExtra)) != wParam)
+    {
+	(WORD)(*(wndPtr->wExtra)) = wParam;
+	InvalidateRect(hWnd, NULL, FALSE);
+	UpdateWindow(hWnd);
+    }
+    GlobalUnlock(hWnd);
+}
+
+static LONG RB_GetCheck(HWND hWnd)
+{
+    WORD wResult;
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    wResult = (WORD)(*(wndPtr->wExtra));
+    GlobalUnlock(hWnd);
+    return (LONG)wResult;
+}
+
+
+/**********************************************************************
+ *       Group Box Functions
+ */
+
+static LONG GB_Paint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc;
+    HDC hDC;
+    HPEN hPen, hOldPen;
+    HBRUSH hBrush;
+    int textlen;
+    char *text;
+    HANDLE hText;
+    SIZE size;
+
+    hDC = BeginPaint(hWnd, &ps);
+    GetClientRect(hWnd, &rc);
+
+    hPen = CreatePen(PS_SOLID, 1, color_windowtext);
+    hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen);
+
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+    FillRect(hDC, &rc, hBrush);
+
+    textlen = GetWindowTextLength(hWnd);
+    hText = LocalAlloc(LMEM_MOVEABLE, textlen+1);
+    text = LocalLock(hText);
+    GetWindowText(hWnd, text, textlen+1);
+    GetTextExtentPoint(hDC, text, textlen, &size);
+
+    rc.top = 5;
+    Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
+    rc.left = 10;
+    rc.top = 0;
+    rc.right = rc.left + size.cx + 1;
+    rc.bottom = size.cy;
+    DrawText(hDC, text, textlen, &rc, DT_SINGLELINE);
+
+    LocalUnlock(hText);
+    LocalFree(hText);
+    EndPaint(hWnd, &ps);
+}
+
+
+/**********************************************************************
+ *       User Button Functions
+ */
+
+static LONG UB_Paint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    HDC hDC;
+    RECT rc;
+    HBRUSH hBrush;
+
+    hDC = BeginPaint(hWnd, &ps);
+    GetClientRect(hWnd, &rc);
+
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+    FillRect(hDC, &rc, hBrush);
+
+    NOTIFY_PARENT(hWnd, BN_PAINT);
+
+    /* do we have the focus? */
+    if (GetFocus() == hWnd)
+	DrawFocusRect(hDC, &rc);
+
+    EndPaint(hWnd, &ps);
+}
+
+static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+
+/*    SetFocus(hWnd); */
+    SetCapture(hWnd);
+    GetClientRect(hWnd, &rc);
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_HILITE);
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
+{
+    RECT rc;
+
+    ReleaseCapture();
+    GetClientRect(hWnd, &rc);
+    if (PtInRect(&rc, MAKEPOINT(lParam)))
+	NOTIFY_PARENT(hWnd, BN_UNHILITE);
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
+
+static LONG UB_KillFocus(HWND hWnd)
+{
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+}
 
diff --git a/controls/combo.c b/controls/combo.c
new file mode 100644
index 0000000000000000000000000000000000000000..ee90962635b73ad699ffb5baefe57a8c7c635b84
--- /dev/null
+++ b/controls/combo.c
@@ -0,0 +1,256 @@
+/*
+ * Interface code to COMBOBOX widget
+ *
+ * Copyright  Martin Ayotte, 1993
+ *
+ */
+
+/*
+#define DEBUG_COMBO
+*/
+
+static char Copyright[] = "Copyright Martin Ayotte, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include "windows.h"
+#include "combo.h"
+#include "heap.h"
+#include "win.h"
+#include "dirent.h"
+#include <sys/stat.h>
+
+LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
+int CreateComboStruct(HWND hwnd);
+
+
+void COMBOBOX_CreateComboBox(LPSTR className, LPSTR comboLabel, HWND hwnd)
+{
+    WND *wndPtr    = WIN_FindWndPtr(hwnd);
+    WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
+    DWORD style;
+    char widgetName[15];
+
+#ifdef DEBUG_COMBO
+    printf("combo: label = %s, x = %d, y = %d\n", comboLabel,
+	   wndPtr->rectClient.left, wndPtr->rectClient.top);
+    printf("        width = %d, height = %d\n",
+	   wndPtr->rectClient.right - wndPtr->rectClient.left,
+	   wndPtr->rectClient.bottom - wndPtr->rectClient.top);
+#endif
+
+    if (!wndPtr)
+	return;
+
+    style = wndPtr->dwStyle & 0x0000FFFF;
+/*
+    if ((style & LBS_NOTIFY) == LBS_NOTIFY)
+*/    
+    sprintf(widgetName, "%s%d", className, wndPtr->wIDmenu);
+    wndPtr->winWidget = XtVaCreateManagedWidget(widgetName,
+				    compositeWidgetClass,
+				    parentPtr->winWidget,
+				    XtNx, wndPtr->rectClient.left,
+				    XtNy, wndPtr->rectClient.top,
+				    XtNwidth, wndPtr->rectClient.right -
+				        wndPtr->rectClient.left,
+				    XtNheight, 16,
+				    NULL );
+    GlobalUnlock(hwnd);
+    GlobalUnlock(wndPtr->hwndParent);
+}
+
+
+/***********************************************************************
+ *           WIDGETS_ComboWndProc
+ */
+LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
+			   WORD wParam, LONG lParam )
+{    
+    WORD	wRet;
+    RECT	rect;
+    int		y;
+    int		width, height;
+    WND  	*wndPtr;
+    LPHEADCOMBO lphc;
+    char	str[128];
+    static RECT rectsel;
+    switch(message)
+    {
+    case WM_CREATE:
+	CreateComboStruct(hwnd);
+	wndPtr = WIN_FindWndPtr(hwnd);
+	width = wndPtr->rectClient.right - wndPtr->rectClient.left;
+	height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+	lphc = ComboGetStorageHeader(hwnd);
+	if (lphc == NULL) return 0;
+	lphc->hWndDrop = CreateWindow("BUTTON", "", 
+        	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+        	width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
+	lphc->hWndEdit = CreateWindow("STATIC", "", 
+        	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
+        	0, 0, width - 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
+	lphc->hWndLBox = CreateWindow("LISTBOX", "", 
+        	WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
+        	wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height, 
+        	wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
+/*
+        ShowWindow(lphc->hWndLBox, SW_HIDE);
+*/
+        InvalidateRect(lphc->hWndEdit, NULL, TRUE);
+        UpdateWindow(lphc->hWndEdit);
+        InvalidateRect(lphc->hWndDrop, NULL, TRUE);
+        UpdateWindow(lphc->hWndDrop);
+#ifdef DEBUG_COMBO
+        printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
+#endif
+	return 0;
+    case WM_DESTROY:
+	lphc = ComboGetStorageHeader(hwnd);
+	DestroyWindow(lphc->hWndDrop);
+	DestroyWindow(lphc->hWndEdit);
+	DestroyWindow(lphc->hWndLBox);
+	free(lphc);
+#ifdef DEBUG_COMBO
+        printf("Combo WM_DESTROY !\n");
+#endif
+	return 0;
+	
+    case WM_COMMAND:
+	wndPtr = WIN_FindWndPtr(hwnd);
+	lphc = ComboGetStorageHeader(hwnd);
+	if (lphc == NULL) return 0;
+        if (LOWORD(lParam) == lphc->hWndDrop) {
+	    if (HIWORD(lParam) != BN_CLICKED) return 0;
+#ifdef DEBUG_COMBO
+	    printf("CB_SHOWDROPDOWN !\n");
+#endif
+	    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
+	    if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
+		ShowWindow(lphc->hWndLBox, SW_SHOW);
+		}
+	    else {
+		ShowWindow(lphc->hWndLBox, SW_HIDE);
+		y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
+		SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+		SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		printf("combo hide\n");
+		}
+            }
+        if (LOWORD(lParam) == lphc->hWndLBox) {
+            switch(HIWORD(lParam))
+        	{
+        	case LBN_SELCHANGE:
+		    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
+		    ShowWindow(lphc->hWndLBox, SW_HIDE);
+		    y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
+		    SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+		    SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		    SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
+			        	MAKELONG(hwnd, CBN_SELCHANGE));
+        	    break;
+        	case LBN_DBLCLK:
+		    SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
+			        	MAKELONG(hwnd, CBN_DBLCLK));
+        	    break;
+        	}
+            }
+	break;
+    case WM_LBUTTONDOWN:
+        printf("Combo WM_LBUTTONDOWN wParam=%x lParam=%lX !\n", wParam, lParam);
+	break;
+    case WM_KEYDOWN:
+        printf("Combo WM_KEYDOWN wParam %X!\n", wParam);
+	break;
+    case WM_CTLCOLOR:
+    	return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
+    case WM_PAINT:
+	lphc = ComboGetStorageHeader(hwnd);
+        InvalidateRect(lphc->hWndEdit, NULL, TRUE);
+        UpdateWindow(lphc->hWndEdit);
+        InvalidateRect(lphc->hWndDrop, NULL, TRUE);
+        UpdateWindow(lphc->hWndDrop);
+        if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
+	    InvalidateRect(lphc->hWndLBox, NULL, TRUE);
+	    UpdateWindow(lphc->hWndLBox);
+	    }
+	break;
+    case WM_MOUSEMOVE:
+        if ((wParam & MK_LBUTTON) != 0) {
+            y = HIWORD(lParam);
+	    if (y < 4) {
+		lphc = ComboGetStorageHeader(hwnd);
+		}
+	    GetClientRect(hwnd, &rect);
+	    if (y > (rect.bottom - 4)) {
+		lphc = ComboGetStorageHeader(hwnd);
+		}
+	    }
+    case CB_ADDSTRING:
+#ifdef DEBUG_COMBO
+        printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
+#endif
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam));
+    case CB_GETLBTEXT:
+        printf("CB_GETLBTEXT #%u !\n", wParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
+    case CB_INSERTSTRING:
+        printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam));
+    case CB_DELETESTRING:
+        printf("CB_DELETESTRING #%u !\n", wParam);
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_DELETESTRING, wParam, 0L));
+    case CB_RESETCONTENT:
+        printf("CB_RESETCONTENT !\n");
+	lphc = ComboGetStorageHeader(hwnd);
+        return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
+    case CB_DIR:
+        printf("ComboBox CB_DIR !\n");
+        return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
+    case CB_FINDSTRING:
+        return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
+    case CB_GETCOUNT:
+        return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
+    case CB_GETCURSEL:
+        printf("ComboBox CB_GETCURSEL !\n");
+        return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
+    case CB_SETCURSEL:
+        printf("ComboBox CB_SETCURSEL wParam=%x !\n", wParam);
+        return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, wParam, 0L));
+	
+    default:
+	return DefWindowProc( hwnd, message, wParam, lParam );
+    }
+return 0;
+}
+
+
+
+LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADCOMBO lphc;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
+    return lphc;
+}
+
+
+
+int CreateComboStruct(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADCOMBO lphc;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
+    *((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
+    lphc->dwState = 0;
+    return TRUE;
+}
+
+
+
diff --git a/controls/listbox.c b/controls/listbox.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc2ae493c3846915d1936e110a71087199e3e112
--- /dev/null
+++ b/controls/listbox.c
@@ -0,0 +1,963 @@
+/*
+ * Interface code to listbox widgets
+ *
+ * Copyright  Martin Ayotte, 1993
+ *
+ */
+
+/*
+#define DEBUG_LISTBOX
+*/
+
+static char Copyright[] = "Copyright Martin Ayotte, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include "windows.h"
+#include "user.h"
+#include "heap.h"
+#include "win.h"
+#include "listbox.h"
+#include "scroll.h"
+#include "dirent.h"
+#include <sys/stat.h>
+
+#define GMEM_ZEROINIT 0x0040
+
+
+LPHEADLIST ListBoxGetWindowAndStorage(HWND hwnd, WND **wndPtr);
+LPHEADLIST ListBoxGetStorageHeader(HWND hwnd);
+void StdDrawListBox(HWND hwnd);
+void OwnerDrawListBox(HWND hwnd);
+int ListBoxFindMouse(HWND hwnd, int X, int Y);
+int CreateListBoxStruct(HWND hwnd);
+int ListBoxAddString(HWND hwnd, LPSTR newstr);
+int ListBoxInsertString(HWND hwnd, UINT uIndex, LPSTR newstr);
+int ListBoxGetText(HWND hwnd, UINT uIndex, LPSTR OutStr);
+int ListBoxDeleteString(HWND hwnd, UINT uIndex);
+int ListBoxFindString(HWND hwnd, UINT nFirst, LPSTR MatchStr);
+int ListBoxResetContent(HWND hwnd);
+int ListBoxSetCurSel(HWND hwnd, WORD wIndex);
+int ListBoxSetSel(HWND hwnd, WORD wIndex);
+int ListBoxDirectory(HWND hwnd, UINT attrib, LPSTR filespec);
+int ListBoxGetItemRect(HWND hwnd, WORD wIndex, LPRECT rect);
+int ListBoxSetItemHeight(HWND hwnd, WORD wIndex, long height);
+int ListBoxDefaultItem(HWND hwnd, WND *wndPtr, 
+	LPHEADLIST lphl, LPLISTSTRUCT lpls);
+int ListBoxFindNextMatch(HWND hwnd, WORD wChar);
+
+
+
+void LISTBOX_CreateListBox(LPSTR className, LPSTR listboxLabel, HWND hwnd)
+{
+    WND *wndPtr    = WIN_FindWndPtr(hwnd);
+    WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
+    DWORD style;
+    char widgetName[15];
+
+#ifdef DEBUG_LISTBOX
+    printf("listbox: label = %s, x = %d, y = %d\n", listboxLabel,
+	   wndPtr->rectClient.left, wndPtr->rectClient.top);
+    printf("        width = %d, height = %d\n",
+	   wndPtr->rectClient.right - wndPtr->rectClient.left,
+	   wndPtr->rectClient.bottom - wndPtr->rectClient.top);
+#endif
+
+    if (!wndPtr)
+	return;
+
+    style = wndPtr->dwStyle & 0x0000FFFF;
+/*
+    if ((style & LBS_NOTIFY) == LBS_NOTIFY)
+    if ((style & LBS_SORT) == LBS_SORT)
+*/    
+    sprintf(widgetName, "%s%d", className, wndPtr->wIDmenu);
+    wndPtr->winWidget = XtVaCreateManagedWidget(widgetName,
+				    compositeWidgetClass,
+				    parentPtr->winWidget,
+				    XtNx, wndPtr->rectClient.left,
+				    XtNy, wndPtr->rectClient.top,
+				    XtNwidth, wndPtr->rectClient.right -
+				        wndPtr->rectClient.left,
+				    XtNheight, wndPtr->rectClient.bottom -
+				        wndPtr->rectClient.top,
+				    NULL );
+    GlobalUnlock(hwnd);
+    GlobalUnlock(wndPtr->hwndParent);
+}
+
+
+
+/***********************************************************************
+ *           WIDGETS_ListBoxWndProc
+ */
+LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
+			   WORD wParam, LONG lParam )
+{    
+    WND  *wndPtr;
+    LPHEADLIST  lphl;
+    WORD	wRet;
+    RECT	rect;
+    int		y;
+    int		width, height;
+    CREATESTRUCT *createStruct;
+    static RECT rectsel;
+    switch(message)
+    {
+    case WM_CREATE:
+	CreateListBoxStruct(hwnd);
+	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+	createStruct = (CREATESTRUCT *)lParam;
+     	if (HIWORD(createStruct->lpCreateParams) != 0)
+	    lphl->hWndLogicParent = (HWND)HIWORD(createStruct->lpCreateParams);
+	else
+	    lphl->hWndLogicParent = GetParent(hwnd);
+	width = wndPtr->rectClient.right - wndPtr->rectClient.left;
+	height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+	lphl->hWndScroll = CreateWindow("SCROLLBAR", "",
+		WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBS_VERT,
+		width - 17, 0, 16, height, hwnd, 1, wndPtr->hInstance, NULL);
+    	ShowWindow(lphl->hWndScroll, SW_HIDE);
+	SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+	return 0;
+    case WM_DESTROY:
+        lphl = ListBoxGetStorageHeader(hwnd);
+	ListBoxResetContent(hwnd);
+	DestroyWindow(lphl->hWndScroll);
+	free(lphl);
+        printf("ListBox WM_DESTROY !\n");
+	return 0;
+
+    case WM_VSCROLL:
+        lphl = ListBoxGetStorageHeader(hwnd);
+        if (lphl == NULL) return 0;
+        y = lphl->FirstVisible;
+        switch(wParam) {
+            case SB_LINEUP:
+		if (lphl->FirstVisible > 1)
+		    lphl->FirstVisible--;
+		break;
+            case SB_LINEDOWN:
+		if (lphl->FirstVisible < lphl->ItemsCount)
+		    lphl->FirstVisible++;
+		break;
+	    case SB_PAGEUP:
+		if (lphl->FirstVisible > 1)  
+		    lphl->FirstVisible -= lphl->ItemsVisible;
+		break;
+	    case SB_PAGEDOWN:
+		if (lphl->FirstVisible < lphl->ItemsCount)  
+		    lphl->FirstVisible += lphl->ItemsVisible;
+		break;
+	    case SB_THUMBTRACK:
+	    	lphl->FirstVisible = LOWORD(lParam);
+		break;
+	    }
+	if (lphl->FirstVisible < 1)    lphl->FirstVisible = 1;
+	if (lphl->FirstVisible > lphl->ItemsCount)
+	    lphl->FirstVisible = lphl->ItemsCount;
+	if (y != lphl->FirstVisible) {
+	    SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+            }
+	return 0;
+	
+    case WM_LBUTTONDOWN:
+        lphl = ListBoxGetStorageHeader(hwnd);
+        if (lphl == NULL) return 0;
+	lphl->PrevSelected = lphl->ItemSelected;
+        wRet = ListBoxFindMouse(hwnd, LOWORD(lParam), HIWORD(lParam));
+	ListBoxSetCurSel(hwnd, wRet);
+	ListBoxGetItemRect(hwnd, wRet, &rectsel);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	return 0;
+    case WM_LBUTTONUP:
+	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+        if (lphl == NULL) return 0;
+	if (lphl->PrevSelected != lphl->ItemSelected)
+	    SendMessage(lphl->hWndLogicParent, WM_COMMAND, wndPtr->wIDmenu,
+		        	MAKELONG(hwnd, LBN_SELCHANGE));
+	return 0;
+    case WM_RBUTTONUP:
+    case WM_LBUTTONDBLCLK:
+	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+        if (lphl == NULL) return 0;
+        SendMessage(lphl->hWndLogicParent, WM_COMMAND, wndPtr->wIDmenu,
+		        	MAKELONG(hwnd, LBN_DBLCLK));
+        printf("ListBox Send LBN_DBLCLK !\n");
+	return 0;
+    case WM_KEYDOWN:
+        printf("ListBox WM_KEYDOWN wParam %X!\n", wParam);
+	ListBoxFindNextMatch(hwnd, wParam);
+	break;
+    case WM_PAINT:
+	wndPtr = WIN_FindWndPtr(hwnd);
+	if ((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED) {
+	    OwnerDrawListBox(hwnd);
+	    break;
+	    }
+	if ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE) {
+	    OwnerDrawListBox(hwnd);
+	    break;
+	    }
+	StdDrawListBox(hwnd);
+	break;
+    case WM_MOUSEMOVE:
+        if ((wParam & MK_LBUTTON) != 0) {
+            y = HIWORD(lParam);
+	    if (y < 4) {
+	        lphl = ListBoxGetStorageHeader(hwnd);
+		if (lphl->FirstVisible > 1) {
+		    lphl->FirstVisible--;
+		    SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+		    InvalidateRect(hwnd, NULL, TRUE);
+		    UpdateWindow(hwnd);
+		    break;
+		    }
+		}
+	    GetClientRect(hwnd, &rect);
+	    if (y > (rect.bottom - 4)) {
+	        lphl = ListBoxGetStorageHeader(hwnd);
+		if (lphl->FirstVisible < lphl->ItemsCount) {
+		    lphl->FirstVisible++;
+		    SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+		    InvalidateRect(hwnd, NULL, TRUE);
+		    UpdateWindow(hwnd);
+		    break;
+		    }
+		}
+	    if ((y > 0) && (y < (rect.bottom - 4))) {
+		if ((y < rectsel.top) || (y > rectsel.bottom)) {
+		    wRet = ListBoxFindMouse(hwnd, LOWORD(lParam), HIWORD(lParam));
+		    ListBoxSetCurSel(hwnd, wRet);
+		    ListBoxGetItemRect(hwnd, wRet, &rectsel);
+		    InvalidateRect(hwnd, NULL, TRUE);
+		    UpdateWindow(hwnd);
+		    }
+	        
+		}
+	    }
+	break;
+
+    case LB_RESETCONTENT:
+        printf("ListBox LB_RESETCONTENT !\n");
+	ListBoxResetContent(hwnd);
+	return 0;
+    case LB_DIR:
+        printf("ListBox LB_DIR !\n");
+	wRet = ListBoxDirectory(hwnd, wParam, (LPSTR)lParam);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	return wRet;
+    case LB_ADDSTRING:
+	wRet = ListBoxAddString(hwnd, (LPSTR)lParam);
+	return wRet;
+    case LB_GETTEXT:
+	wRet = ListBoxGetText(hwnd, wParam, (LPSTR)lParam);
+        printf("ListBox LB_GETTEXT #%u '%s' !\n", wParam, (LPSTR)lParam);
+	return wRet;
+    case LB_INSERTSTRING:
+	wRet = ListBoxInsertString(hwnd, wParam, (LPSTR)lParam);
+	return wRet;
+    case LB_DELETESTRING:
+        printf("ListBox LB_DELETESTRING #%u !\n", wParam);
+	wRet = ListBoxDeleteString(hwnd, wParam);
+	return wRet;
+    case LB_FINDSTRING:
+	wRet = ListBoxFindString(hwnd, wParam, (LPSTR)lParam);
+	return wRet;
+    case LB_GETCARETINDEX:
+	return wRet;
+    case LB_GETCOUNT:
+        lphl = ListBoxGetStorageHeader(hwnd);
+	return lphl->ItemsCount;
+    case LB_GETCURSEL:
+	lphl = ListBoxGetStorageHeader(hwnd);
+        printf("ListBox LB_GETCURSEL %u !\n", lphl->ItemSelected);
+	if (lphl->ItemSelected == 0) return LB_ERR;
+	return lphl->ItemSelected;
+    case LB_GETHORIZONTALEXTENT:
+	return wRet;
+    case LB_GETITEMDATA:
+	return wRet;
+    case LB_GETITEMHEIGHT:
+	return wRet;
+    case LB_GETITEMRECT:
+	return wRet;
+    case LB_GETSEL:
+	return wRet;
+    case LB_GETSELCOUNT:
+	return wRet;
+    case LB_GETSELITEMS:
+	return wRet;
+    case LB_GETTEXTLEN:
+	return wRet;
+    case LB_GETTOPINDEX:
+	return wRet;
+    case LB_SELECTSTRING:
+	return wRet;
+    case LB_SELITEMRANGE:
+	return wRet;
+    case LB_SETCARETINDEX:
+	return wRet;
+    case LB_SETCOLUMNWIDTH:
+	return wRet;
+    case LB_SETHORIZONTALEXTENT:
+	return wRet;
+    case LB_SETITEMDATA:
+	return wRet;
+    case LB_SETTABSTOPS:
+	return wRet;
+    case LB_SETCURSEL:
+#ifdef DEBUG_LISTBOX
+        printf("ListBox LB_SETCURSEL wParam=%x !\n", wParam);
+#endif
+	wRet = ListBoxSetCurSel(hwnd, wParam);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	return wRet;
+    case LB_SETSEL:
+        printf("ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam);
+	wRet = ListBoxSetSel(hwnd, wParam);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	return wRet;
+    case LB_SETTOPINDEX:
+        printf("ListBox LB_SETTOPINDEX wParam=%x !\n", wParam);
+        lphl = ListBoxGetStorageHeader(hwnd);
+	lphl->FirstVisible = wParam;
+	SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	break;
+    case LB_SETITEMHEIGHT:
+#ifdef DEBUG_LISTBOX
+        printf("ListBox LB_SETITEMHEIGHT wParam=%x lParam=%lX !\n", wParam, lParam);
+#endif
+	wRet = ListBoxSetItemHeight(hwnd, wParam, lParam);
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+	return wRet;
+	
+    default:
+	return DefWindowProc( hwnd, message, wParam, lParam );
+    }
+return 0;
+}
+
+
+LPHEADLIST ListBoxGetWindowAndStorage(HWND hwnd, WND **wndPtr)
+{
+    WND  *Ptr;
+    LPHEADLIST lphl;
+    *(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
+    lphl = *((LPHEADLIST *)&Ptr->wExtra[1]);
+    return lphl;
+}
+
+
+LPHEADLIST ListBoxGetStorageHeader(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADLIST lphl;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphl = *((LPHEADLIST *)&wndPtr->wExtra[1]);
+    return lphl;
+}
+
+
+void StdDrawListBox(HWND hwnd)
+{
+	LPHEADLIST  lphl;
+	LPLISTSTRUCT lpls;
+	PAINTSTRUCT ps;
+	HBRUSH hBrush;
+	HWND	hWndParent;
+	HDC hdc;
+	RECT rect;
+	UINT  i, h, h2;
+	char	C[128];
+	h = 0;
+	hdc = BeginPaint( hwnd, &ps );
+	GetClientRect(hwnd, &rect);
+        lphl = ListBoxGetStorageHeader(hwnd);
+	if (lphl == NULL) goto EndOfPaint;
+	hBrush = SendMessage(lphl->hWndLogicParent, WM_CTLCOLOR, (WORD)hdc,
+		    MAKELONG(hwnd, CTLCOLOR_LISTBOX));
+	if (hBrush == (HBRUSH)NULL)  hBrush = GetStockObject(WHITE_BRUSH);
+	if (lphl->ItemsCount > lphl->ItemsVisible) rect.right -= 16;
+	FillRect(hdc, &rect, hBrush);
+	if (lphl->ItemsCount == 0) goto EndOfPaint;
+	lpls = lphl->lpFirst;
+	if (lpls == NULL) goto EndOfPaint;
+	lphl->ItemsVisible = 0;
+	for(i = 1; i <= lphl->ItemsCount; i++) {
+	    if (i >= lphl->FirstVisible) {
+		h2 = lpls->dis.rcItem.bottom - lpls->dis.rcItem.top;
+		lpls->dis.rcItem.top = h;
+		lpls->dis.rcItem.bottom = h + h2;
+		lpls->dis.rcItem.right = rect.right;
+		TextOut(hdc, 5, h + 2, (char *)lpls->dis.itemData, 
+			strlen((char *)lpls->dis.itemData));
+		if (lpls->dis.itemState != 0) {
+		    InvertRect(hdc, &lpls->dis.rcItem);
+		    }
+		h += h2;
+		lphl->ItemsVisible++;
+		if (h > rect.bottom) break;
+		}
+	    if (lpls->lpNext == NULL) goto EndOfPaint;
+	    lpls = (LPLISTSTRUCT)lpls->lpNext;
+	}
+EndOfPaint:
+    EndPaint( hwnd, &ps );
+    if (lphl->ItemsCount > lphl->ItemsVisible) {
+        InvalidateRect(lphl->hWndScroll, NULL, TRUE);
+        UpdateWindow(lphl->hWndScroll);
+ 	}
+}
+
+
+
+void OwnerDrawListBox(HWND hwnd)
+{
+	LPHEADLIST  lphl;
+	LPLISTSTRUCT lpls;
+	HANDLE	hTemp;
+	PAINTSTRUCT ps;
+	HBRUSH 	hBrush;
+	HWND	hWndParent;
+	HDC hdc;
+	RECT rect;
+	UINT  i, h, h2;
+	char	C[128];
+	h = 0;
+	hdc = BeginPaint( hwnd, &ps );
+	GetClientRect(hwnd, &rect);
+        lphl = ListBoxGetStorageHeader(hwnd);
+	if (lphl == NULL) goto EndOfPaint;
+	hBrush = SendMessage(lphl->hWndLogicParent, WM_CTLCOLOR, (WORD)hdc,
+		    MAKELONG(hwnd, CTLCOLOR_LISTBOX));
+	if (hBrush == (HBRUSH)NULL)  hBrush = GetStockObject(WHITE_BRUSH);
+	if (lphl->ItemsCount > lphl->ItemsVisible) rect.right -= 16;
+	FillRect(hdc, &rect, hBrush);
+	if (lphl->ItemsCount == 0) goto EndOfPaint;
+	lpls = lphl->lpFirst;
+	if (lpls == NULL) goto EndOfPaint;
+	lphl->ItemsVisible = 0;
+	for(i = 1; i <= lphl->ItemsCount; i++) {
+	    if (i >= lphl->FirstVisible) {
+		lpls->dis.hDC = hdc;
+		lpls->dis.itemID = i;
+		h2 = lpls->dis.rcItem.bottom - lpls->dis.rcItem.top;
+		lpls->dis.rcItem.top = h;
+		lpls->dis.rcItem.bottom = h + h2;
+		lpls->dis.rcItem.right = rect.right;
+		lpls->dis.itemAction = ODA_DRAWENTIRE;
+		if (lpls->dis.itemState != 0) {
+		    lpls->dis.itemAction |= ODA_SELECT;
+		    }
+#ifdef DEBUT_LISTBOX
+		printf("LBOX WM_DRAWITEM #%d left=%d top=%d right=%d bottom=%d !\n", 
+			i, lpls->dis.rcItem.left, lpls->dis.rcItem.top, 
+			lpls->dis.rcItem.right, lpls->dis.rcItem.bottom);
+		printf("LBOX WM_DRAWITEM Parent=%X &dis=%lX CtlID=%u !\n", 
+			hWndParent, (LONG)&lpls->dis, lpls->dis.CtlID);
+#endif
+		printf("LBOX WM_DRAWITEM '%s' !\n", lpls->dis.itemData);
+		SendMessage(lphl->hWndLogicParent, WM_DRAWITEM, i, (LPARAM)&lpls->dis);
+		GlobalUnlock(hTemp);
+		GlobalFree(hTemp);
+		if (lpls->dis.itemState != 0) {
+		    InvertRect(hdc, &lpls->dis.rcItem);
+		    }
+		h += h2;
+		lphl->ItemsVisible++;
+		if (h > rect.bottom) break;
+		}
+	    if (lpls->lpNext == NULL) goto EndOfPaint;
+	    lpls = (LPLISTSTRUCT)lpls->lpNext;
+	}
+EndOfPaint:
+    EndPaint( hwnd, &ps );
+    if (lphl->ItemsCount > lphl->ItemsVisible) {
+        InvalidateRect(lphl->hWndScroll, NULL, TRUE);
+        UpdateWindow(lphl->hWndScroll);
+        }
+}
+
+
+
+int ListBoxFindMouse(HWND hwnd, int X, int Y)
+{
+LPHEADLIST 	lphl;
+LPLISTSTRUCT	lpls;
+RECT rect;
+UINT  i, h, h2;
+char	C[128];
+h = 0;
+lphl = ListBoxGetStorageHeader(hwnd);
+if (lphl == NULL) return LB_ERR;
+if (lphl->ItemsCount == 0) return LB_ERR;
+lpls = lphl->lpFirst;
+if (lpls == NULL) return LB_ERR;
+for(i = 1; i <= lphl->ItemsCount; i++) {
+    if (i >= lphl->FirstVisible) {
+	h2 = h;
+	h += lpls->dis.rcItem.bottom - lpls->dis.rcItem.top;
+	if ((Y > h2) && (Y < h)) return(i);
+	}
+    if (lpls->lpNext == NULL) return LB_ERR;
+    lpls = (LPLISTSTRUCT)lpls->lpNext;
+    }
+return(LB_ERR);
+}
+
+
+
+int CreateListBoxStruct(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADLIST lphl;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphl = (LPHEADLIST)malloc(sizeof(HEADLIST));
+    lphl->lpFirst = NULL;
+    *((LPHEADLIST *)&wndPtr->wExtra[1]) = lphl; 	/* HEAD of List */
+    lphl->ItemsCount = 0;
+    lphl->ItemsVisible = 0;
+    lphl->FirstVisible = 1;
+    lphl->StdItemHeight = 15;
+    lphl->DrawCtlType = ODT_LISTBOX;
+    return TRUE;
+}
+
+
+int ListBoxAddString(HWND hwnd, LPSTR newstr)
+{
+    WND  	*wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lplsnew;
+    HANDLE 	hTemp;
+    LPSTR 	str;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
+    lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+    lpls = lphl->lpFirst;
+    if (lpls != NULL) {
+	while(lpls->lpNext != NULL) {
+	    lpls = (LPLISTSTRUCT)lpls->lpNext;
+	    }
+	lpls->lpNext = lplsnew;
+ 	}
+    else
+	lphl->lpFirst = lplsnew;
+    lphl->ItemsCount++;
+#ifdef DEBUG_LISTBOX
+    printf("Items Count = %u\n", lphl->ItemsCount);
+#endif
+    hTemp = 0;
+    if ((wndPtr->dwStyle & LBS_HASSTRINGS) != LBS_HASSTRINGS) {
+	if (((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) != LBS_OWNERDRAWFIXED) &&
+	    ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) != LBS_OWNERDRAWVARIABLE)) {
+	    hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
+	    str = (LPSTR)USER_HEAP_ADDR(hTemp);
+	    if (str == NULL) return LB_ERRSPACE;
+	    strcpy(str, newstr);
+	    newstr = str;
+	    }
+	}
+    ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
+    lplsnew->hMem = hTemp;
+    lplsnew->lpNext = NULL;
+    lplsnew->dis.itemID = lphl->ItemsCount;
+    lplsnew->dis.itemData = (DWORD)newstr;
+    lplsnew->hData = hTemp;
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    if (lphl->FirstVisible >= (lphl->ItemsCount - lphl->ItemsVisible)) {
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+        }
+    if ((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) 
+    	ShowWindow(lphl->hWndScroll, SW_NORMAL);
+    return lphl->ItemsCount;
+}
+
+
+int ListBoxInsertString(HWND hwnd, UINT uIndex, LPSTR newstr)
+{
+    WND  	*wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lplsnew;
+    HANDLE	hTemp;
+    LPSTR	str;
+    UINT	Count;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    if (uIndex < 1 || uIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    if (uIndex > lphl->ItemsCount) return LB_ERR;
+    for(Count = 1; Count < uIndex; Count++) {
+	if (lpls->lpNext == NULL) return LB_ERR;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+    }
+    hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LISTSTRUCT));
+    lplsnew = (LPLISTSTRUCT) USER_HEAP_ADDR(hTemp);
+    ListBoxDefaultItem(hwnd, wndPtr, lphl, lplsnew);
+    lplsnew->hMem = hTemp;
+    lpls->lpNext = lplsnew;
+    lphl->ItemsCount++;
+    hTemp = 0;
+    if ((wndPtr->dwStyle & LBS_HASSTRINGS) != LBS_HASSTRINGS) {
+	if (((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) != LBS_OWNERDRAWFIXED) &&
+	    ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) != LBS_OWNERDRAWVARIABLE)) {
+	    hTemp = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(newstr) + 1);
+	    str = (LPSTR)USER_HEAP_ADDR(hTemp);
+	    if (str == NULL) return LB_ERRSPACE;
+	    strcpy(str, newstr);
+	    newstr = str;
+	    }
+	}
+    lplsnew->lpNext = NULL;
+    lplsnew->dis.itemID = lphl->ItemsCount;
+    lplsnew->dis.itemData = (DWORD)newstr;
+    lplsnew->hData = hTemp;
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    if (((lphl->ItemsCount - lphl->FirstVisible) == lphl->ItemsVisible) && 
+        (lphl->ItemsVisible != 0)) 
+    	ShowWindow(lphl->hWndScroll, SW_NORMAL);
+    if ((lphl->FirstVisible <= uIndex) &&
+        ((lphl->FirstVisible + lphl->ItemsVisible) >= uIndex)) {
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+        }
+    return lphl->ItemsCount;
+}
+
+
+int ListBoxGetText(HWND hwnd, UINT uIndex, LPSTR OutStr)
+{
+    WND  	*wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls;
+    UINT	Count;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    if (uIndex < 1 || uIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    if (uIndex > lphl->ItemsCount) return LB_ERR;
+    for(Count = 1; Count < uIndex; Count++) {
+	if (lpls->lpNext == NULL) return LB_ERR;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+    }
+    if (((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED) ||
+	    ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE)) {
+	if ((wndPtr->dwStyle & LBS_HASSTRINGS) != LBS_HASSTRINGS) { 
+	    *((long *)OutStr) = lpls->dis.itemData;
+	    return 4;
+	    }
+	}
+	
+    strcpy(OutStr, (char *)lpls->dis.itemData);
+    return strlen(OutStr);
+}
+
+
+int ListBoxDeleteString(HWND hwnd, UINT uIndex)
+{
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	Count;
+    lphl = ListBoxGetStorageHeader(hwnd);
+    if (lphl == NULL) return LB_ERR;
+    if (uIndex < 1 || uIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    if (uIndex > lphl->ItemsCount) return LB_ERR;
+    for(Count = 1; Count < uIndex; Count++) {
+	if (lpls->lpNext == NULL) return LB_ERR;
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+    }
+    lpls2->lpNext = (LPLISTSTRUCT)lpls->lpNext;
+    lphl->ItemsCount--;
+    if (lpls->hData != 0) USER_HEAP_FREE(lpls->hData);
+    if (lpls->hMem != 0) USER_HEAP_FREE(lpls->hMem);
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    if (lphl->ItemsCount < lphl->ItemsVisible) 
+    	ShowWindow(lphl->hWndScroll, SW_HIDE);
+    if ((lphl->FirstVisible <= uIndex) &&
+        ((lphl->FirstVisible + lphl->ItemsVisible) >= uIndex)) {
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+        }
+    return lphl->ItemsCount;
+}
+
+
+int ListBoxFindString(HWND hwnd, UINT nFirst, LPSTR MatchStr)
+{
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls;
+    UINT	Count;
+    lphl = ListBoxGetStorageHeader(hwnd);
+    if (lphl == NULL) return LB_ERR;
+    if (nFirst < 1 || nFirst > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    Count = 1;
+    while(lpls != NULL) {
+    	if (strcmp((char *)lpls->dis.itemData, MatchStr) == 0)
+	    return Count;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	Count++;
+        }
+    return LB_ERR;
+}
+
+
+int ListBoxResetContent(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	i;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    for(i = 0; i <= lphl->ItemsCount; i++) {
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	if (i != 0) {
+#ifdef DEBUG_LISTBOX
+	    printf("ResetContent #%u\n", i);
+#endif
+	    if (lpls2->hData != 0) USER_HEAP_FREE(lpls->hData);
+	    if (lpls2->hMem != 0) USER_HEAP_FREE(lpls->hMem);
+	    }  
+	if (lpls == NULL)  break;
+    }
+    lphl->lpFirst = NULL;
+    lphl->FirstVisible = 1;
+    lphl->ItemsCount = 0;
+    lphl->ItemSelected = 0;
+    lphl->PrevSelected = 0;
+    if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
+	SendMessage(wndPtr->hwndParent, WM_COMMAND, 
+    	    wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
+
+    SetScrollRange(lphl->hWndScroll, WM_VSCROLL, 1, lphl->ItemsCount, TRUE);
+    ShowWindow(lphl->hWndScroll, SW_HIDE);
+    InvalidateRect(hwnd, NULL, TRUE);
+    UpdateWindow(hwnd);
+    return TRUE;
+}
+
+
+int ListBoxSetCurSel(HWND hwnd, WORD wIndex)
+{
+    WND  *wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	i;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    lphl->ItemSelected = LB_ERR;
+    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    for(i = 1; i <= lphl->ItemsCount; i++) {
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	if (i == wIndex)
+	    lpls2->dis.itemState = 1;
+	else 
+	    if (lpls2->dis.itemState != 0)
+	        lpls2->dis.itemState = 0;
+	if (lpls == NULL)  break;
+    }
+    lphl->ItemSelected = wIndex;
+    if ((wndPtr->dwStyle && LBS_NOTIFY) != 0)
+	SendMessage(wndPtr->hwndParent, WM_COMMAND, 
+    	    wndPtr->wIDmenu, MAKELONG(hwnd, LBN_SELCHANGE));
+    return LB_ERR;
+}
+
+
+
+int ListBoxSetSel(HWND hwnd, WORD wIndex)
+{
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	i;
+    lphl = ListBoxGetStorageHeader(hwnd);
+    if (lphl == NULL) return LB_ERR;
+    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    for(i = 1; i <= lphl->ItemsCount; i++) {
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	if (i == wIndex) {
+	    lpls2->dis.itemState = 1;
+	    break;
+	    }  
+	if (lpls == NULL)  break;
+    }
+    return LB_ERR;
+}
+
+
+int ListBoxDirectory(HWND hwnd, UINT attrib, LPSTR filespec)
+{
+DIR           	*dirp;
+struct dirent 	*dp;
+struct stat	st;
+char		str[128];
+int		wRet;
+dirp = opendir(".");
+while ( (dp = readdir(dirp)) != NULL) 
+    {
+    stat(dp->d_name, &st);
+#ifdef DEBUG_LBDIR
+    printf("LB_DIR : st_mode=%lX / d_name='%s'\n", st.st_mode, dp->d_name);
+#endif
+    if S_ISDIR(st.st_mode) {
+	sprintf(str, "[%s]", dp->d_name);
+	}
+    else
+	strcpy(str, dp->d_name);
+    wRet = ListBoxAddString(hwnd, str);
+    if (wRet == LB_ERR) break;
+    }
+closedir(dirp);	
+return wRet;
+}
+
+
+int ListBoxGetItemRect(HWND hwnd, WORD wIndex, LPRECT lprect)
+{
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	i;
+    lphl = ListBoxGetStorageHeader(hwnd);
+    if (lphl == NULL) return LB_ERR;
+    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    for(i = 0; i <= lphl->ItemsCount; i++) {
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	if (i == wIndex) {
+	    *(lprect) = lpls2->dis.rcItem;
+	    break;
+	    }  
+	if (lpls == NULL)  break;
+    }
+    return LB_ERR;
+}
+
+
+
+int ListBoxSetItemHeight(HWND hwnd, WORD wIndex, long height)
+{
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls, lpls2;
+    UINT	i;
+    lphl = ListBoxGetStorageHeader(hwnd);
+    if (lphl == NULL) return LB_ERR;
+    if (wIndex < 1 || wIndex > lphl->ItemsCount) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    for(i = 0; i <= lphl->ItemsCount; i++) {
+	lpls2 = lpls;
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	if (i == wIndex) {
+	    lpls2->dis.rcItem.bottom = lpls2->dis.rcItem.top + (short)height;
+	    break;
+	    }  
+	if (lpls == NULL)  break;
+    }
+    return LB_ERR;
+}
+
+
+
+
+
+int ListBoxDefaultItem(HWND hwnd, WND *wndPtr, 
+	LPHEADLIST lphl, LPLISTSTRUCT lpls)
+{
+    RECT	rect;
+    GetClientRect(hwnd, &rect);
+    SetRect(&lpls->dis.rcItem, 0, 0, rect.right, lphl->StdItemHeight);
+    lpls->dis.CtlType = lphl->DrawCtlType;
+    lpls->dis.CtlID = wndPtr->wIDmenu;
+    lpls->dis.itemID = 0;
+    lpls->dis.itemAction = 0;
+    lpls->dis.itemState = 0;
+    lpls->dis.hwndItem = hwnd;
+    lpls->dis.hDC = 0;
+    lpls->dis.itemData = 0;
+}
+
+
+
+int ListBoxFindNextMatch(HWND hwnd, WORD wChar)
+{
+    WND  	*wndPtr;
+    LPHEADLIST 	lphl;
+    LPLISTSTRUCT lpls;
+    UINT	Count;
+    lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
+    if (lphl == NULL) return LB_ERR;
+    lpls = lphl->lpFirst;
+    if (lpls == NULL) return LB_ERR;
+    if (wChar < ' ') return LB_ERR;
+    if (((wndPtr->dwStyle & LBS_OWNERDRAWFIXED) == LBS_OWNERDRAWFIXED) ||
+	    ((wndPtr->dwStyle & LBS_OWNERDRAWVARIABLE) == LBS_OWNERDRAWVARIABLE)) {
+	if ((wndPtr->dwStyle & LBS_HASSTRINGS) != LBS_HASSTRINGS) { 
+	    return LB_ERR;
+	    }
+	}
+    Count = 1;
+    while(lpls != NULL) {
+        if (Count > lphl->ItemSelected) {
+	    if (*((char *)lpls->dis.itemData) == (char)wChar) {
+		lphl->FirstVisible = Count - lphl->ItemsVisible / 2;
+		if (lphl->FirstVisible < 1) lphl->FirstVisible = 1;
+		ListBoxSetCurSel(hwnd, Count);
+		SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+	        InvalidateRect(hwnd, NULL, TRUE);
+	        UpdateWindow(hwnd);
+	        return Count;
+	        }
+	    }
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	Count++;
+	}
+    Count = 1;
+    lpls = lphl->lpFirst;
+    while(lpls != NULL) {
+	if (*((char *)lpls->dis.itemData) == (char)wChar) {
+	    if (Count == lphl->ItemSelected)    return LB_ERR;
+	    lphl->FirstVisible = Count - lphl->ItemsVisible / 2;
+	    if (lphl->FirstVisible < 1) lphl->FirstVisible = 1;
+	    ListBoxSetCurSel(hwnd, Count);
+	    SetScrollPos(lphl->hWndScroll, WM_VSCROLL, lphl->FirstVisible, TRUE);
+	    InvalidateRect(hwnd, NULL, TRUE);
+	    UpdateWindow(hwnd);
+	    return Count;
+	    }
+	lpls = (LPLISTSTRUCT)lpls->lpNext;
+	Count++;
+        }
+    return LB_ERR;
+}
+
+
diff --git a/controls/scroll.c b/controls/scroll.c
new file mode 100644
index 0000000000000000000000000000000000000000..83816f5b879fc44ff6111041d2155d7d3dc4d106
--- /dev/null
+++ b/controls/scroll.c
@@ -0,0 +1,379 @@
+/*
+ * Interface code to SCROLLBAR widget
+ *
+ * Copyright  Martin Ayotte, 1993
+ *
+ */
+
+/*
+#define DEBUG_SCROLL
+*/
+
+static char Copyright[] = "Copyright Martin Ayotte, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include "windows.h"
+#include "scroll.h"
+#include "heap.h"
+#include "win.h"
+#include "dirent.h"
+#include <sys/stat.h>
+
+LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr);
+LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd);
+void StdDrawScrollBar(HWND hwnd);
+int CreateScrollBarStruct(HWND hwnd);
+
+
+void SCROLLBAR_CreateScrollBar(LPSTR className, LPSTR scrollLabel, HWND hwnd)
+{
+    WND *wndPtr    = WIN_FindWndPtr(hwnd);
+    WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
+    DWORD style;
+    char widgetName[15];
+
+#ifdef DEBUG_SCROLLBAR
+    printf("scroll: label = %s, x = %d, y = %d\n", scrollLabel,
+	   wndPtr->rectClient.left, wndPtr->rectClient.top);
+    printf("        width = %d, height = %d\n",
+	   wndPtr->rectClient.right - wndPtr->rectClient.left,
+	   wndPtr->rectClient.bottom - wndPtr->rectClient.top);
+#endif
+
+    if (!wndPtr)
+	return;
+
+    style = wndPtr->dwStyle & 0x0000FFFF;
+/*
+    if ((style & SBS_NOTIFY) == SBS_NOTIFY)
+*/    
+    sprintf(widgetName, "%s%d", className, wndPtr->wIDmenu);
+    wndPtr->winWidget = XtVaCreateManagedWidget(widgetName,
+				    compositeWidgetClass,
+				    parentPtr->winWidget,
+				    XtNx, wndPtr->rectClient.left,
+				    XtNy, wndPtr->rectClient.top,
+				    XtNwidth, wndPtr->rectClient.right -
+				        wndPtr->rectClient.left,
+				    XtNheight, wndPtr->rectClient.bottom -
+				        wndPtr->rectClient.top,
+				    NULL );
+    GlobalUnlock(hwnd);
+    GlobalUnlock(wndPtr->hwndParent);
+}
+
+
+
+/***********************************************************************
+ *           WIDGETS_ScrollBarWndProc
+ */
+LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
+			   WORD wParam, LONG lParam )
+{    
+    WORD	wRet;
+    short	x, y;
+    WND  	*wndPtr;
+    LPHEADSCROLL lphs;
+    RECT rect;
+    static RECT rectsel;
+    switch(message)
+    {
+    case WM_CREATE:
+	CreateScrollBarStruct(hwnd);
+#ifdef DEBUG_SCROLL
+        printf("ScrollBar Creation up=%X down=%X!\n", lphs->hWndUp, lphs->hWndDown);
+#endif
+	return 0;
+    case WM_DESTROY:
+	lphs = ScrollBarGetStorageHeader(hwnd);
+	DestroyWindow(lphs->hWndUp);
+	DestroyWindow(lphs->hWndDown);
+	free(lphs);
+        printf("ScrollBar WM_DESTROY !\n");
+	return 0;
+	
+    case WM_COMMAND:
+#ifdef DEBUG_SCROLL
+        printf("ScrollBar WM_COMMAND wParam=%X lParam=%lX !\n", wParam, lParam);
+#endif
+	lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+	if (HIWORD(lParam) != BN_CLICKED) return 0;
+        if (LOWORD(lParam) == lphs->hWndUp)
+            SendMessage(wndPtr->hwndParent, lphs->Direction, 
+            	SB_LINEUP, MAKELONG(0, hwnd));
+        if (LOWORD(lParam) == lphs->hWndDown)
+            SendMessage(wndPtr->hwndParent, lphs->Direction, 
+            	SB_LINEDOWN, MAKELONG(0, hwnd));
+	return 0;
+
+    case WM_LBUTTONDOWN:
+	lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+	GetClientRect(hwnd, &rect);
+	if (lphs->Direction == WM_VSCROLL) {
+	    y = HIWORD(lParam);
+#ifdef DEBUG_SCROLL
+	    printf("WM_LBUTTONDOWN y=%d cur+right=%d %d\n", 
+	    	y, lphs->CurPix + rect.right, lphs->CurPix + (rect.right << 1));
+#endif
+	    if (y < (lphs->CurPix + rect.right)) 
+	        SendMessage(wndPtr->hwndParent, lphs->Direction, 
+	        	SB_PAGEUP, MAKELONG(0, hwnd));
+	    if (y > (lphs->CurPix + (rect.right << 1))) 
+	        SendMessage(wndPtr->hwndParent, lphs->Direction, 
+	        	SB_PAGEDOWN, MAKELONG(0, hwnd));
+	    if ((y > (lphs->CurPix + rect.right)) &&
+	        (y < (lphs->CurPix + (rect.right << 1)))) {
+	        lphs->ThumbActive = TRUE;
+#ifdef DEBUG_SCROLL
+	        printf("THUMB DOWN !\n");
+#endif
+	        }
+	    }
+	else {
+	    x = LOWORD(lParam);
+#ifdef DEBUG_SCROLL
+	    printf("WM_LBUTTONDOWN x=%d Cur+bottom=%d %d\n",
+	    	 x, lphs->CurPix + rect.bottom, lphs->CurPix + (rect.bottom << 1));
+#endif
+	    if (x < (lphs->CurPix + rect.bottom))
+	        SendMessage(wndPtr->hwndParent, lphs->Direction, 
+	        	SB_PAGEUP, MAKELONG(0, hwnd));
+	    if (x > (lphs->CurPix + (rect.bottom << 1)))
+	        SendMessage(wndPtr->hwndParent, lphs->Direction, 
+	        	SB_PAGEDOWN, MAKELONG(0, hwnd));
+	    if ((x > (lphs->CurPix + rect.bottom)) &&
+		(x < (lphs->CurPix + (rect.bottom << 1)))) {
+	        lphs->ThumbActive = TRUE;
+#ifdef DEBUG_SCROLL
+	        printf("THUMB DOWN !\n");
+#endif
+		}
+	    }
+	break;
+    case WM_LBUTTONUP:
+        lphs->ThumbActive = FALSE;
+	break;
+
+    case WM_KEYDOWN:
+        printf("ScrollBar WM_KEYDOWN wParam %X!\n", wParam);
+	break;
+    case WM_PAINT:
+	StdDrawScrollBar(hwnd);
+	break;
+    case WM_MOUSEMOVE:
+        if ((wParam & MK_LBUTTON) != 0) {
+	    lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
+	    if (lphs->ThumbActive == 0) break;
+	    GetClientRect(hwnd, &rect);
+	    if (lphs->Direction == WM_VSCROLL)
+		y = HIWORD(lParam) - rect.right - (rect.right >> 1);
+	    else
+		y = LOWORD(lParam) - rect.bottom - (rect.bottom >> 1);
+	    x = (y * (lphs->MaxVal - lphs->MinVal) / 
+	    		lphs->MaxPix) + lphs->MinVal;
+#ifdef DEBUG_SCROLL
+	    printf("WM_MOUSEMOVE val=%d pix=%d\n", x, y);
+#endif
+            SendMessage(wndPtr->hwndParent, lphs->Direction, 
+            		SB_THUMBTRACK, MAKELONG(x, hwnd));
+	    }
+	break;
+    default:
+	return DefWindowProc( hwnd, message, wParam, lParam );
+    }
+return(0);
+}
+
+
+
+LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr)
+{
+    WND  *Ptr;
+    LPHEADSCROLL lphs;
+    *(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
+    lphs = *((LPHEADSCROLL *)&Ptr->wExtra[1]);
+    return lphs;
+}
+
+
+LPHEADSCROLL ScrollBarGetStorageHeader(HWND hwnd)
+{
+    WND  *wndPtr;
+    LPHEADSCROLL lphs;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphs = *((LPHEADSCROLL *)&wndPtr->wExtra[1]);
+    return lphs;
+}
+
+
+void StdDrawScrollBar(HWND hwnd)
+{
+	LPHEADSCROLL lphs;
+	PAINTSTRUCT ps;
+	HBRUSH hBrush;
+	HDC hdc;
+	RECT rect;
+	UINT  i, w, h, siz;
+	char	C[128];
+	hdc = BeginPaint( hwnd, &ps );
+	hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
+		    MAKELONG(hwnd, CTLCOLOR_SCROLLBAR));
+	if (hBrush == (HBRUSH)NULL)  hBrush = GetStockObject(LTGRAY_BRUSH);
+	lphs = ScrollBarGetStorageHeader(hwnd);
+	if (lphs == NULL) goto EndOfPaint;
+	GetClientRect(hwnd, &rect);
+	w = rect.right - rect.left;
+	h = rect.bottom - rect.top;
+	if (lphs->Direction == WM_VSCROLL) {
+	    rect.top += w;
+	    rect.bottom -= w;
+	    }
+	else {
+	    rect.left += h;
+	    rect.right -= h;
+	    }
+	FillRect(hdc, &rect, hBrush);
+	if (lphs->Direction == WM_VSCROLL)
+	    SetRect(&rect, 0, lphs->CurPix + w, 
+	    		w, lphs->CurPix + (w << 1));
+	else
+	    SetRect(&rect, lphs->CurPix + h, 
+	    		0, lphs->CurPix + (h << 1), h);
+	FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
+	InflateRect(&rect, -1, -1);
+	FillRect(hdc, &rect, GetStockObject(LTGRAY_BRUSH));
+	DrawReliefRect(hdc, rect, 2, 0);
+	InflateRect(&rect, -3, -3);
+	DrawReliefRect(hdc, rect, 1, 1);
+EndOfPaint:
+	EndPaint( hwnd, &ps );
+        InvalidateRect(lphs->hWndUp, NULL, TRUE);
+        UpdateWindow(lphs->hWndUp);
+        InvalidateRect(lphs->hWndDown, NULL, TRUE);
+        UpdateWindow(lphs->hWndDown);
+}
+
+
+
+int CreateScrollBarStruct(HWND hwnd)
+{
+    RECT	rect;
+    int		width, height;
+    WND  *wndPtr;
+    LPHEADSCROLL lphs;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
+    *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
+    lphs->ThumbActive;
+    lphs->MinVal = 0;
+    lphs->MaxVal = 100;
+    lphs->CurVal = 0;
+    lphs->CurPix = 0;
+    width = wndPtr->rectClient.right - wndPtr->rectClient.left;
+    height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) return 0;
+    if (width <= height)
+	{
+	lphs->MaxPix = height - 3 * width;
+	lphs->Direction = WM_VSCROLL;
+	lphs->hWndUp = CreateWindow("BUTTON", "", 
+        	WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+        	0, 0, width, width, hwnd, 1, wndPtr->hInstance, 0L);
+	lphs->hWndDown = CreateWindow("BUTTON", "", 
+        	WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+        	0, height - width, width, width, hwnd, 2,
+        	wndPtr->hInstance, 0L);
+	}
+    else
+	{
+	lphs->MaxPix = width - 3 * height;
+	lphs->Direction = WM_HSCROLL;
+	lphs->hWndUp = CreateWindow("BUTTON", "", 
+        	WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+        	0, 0, height, height, hwnd, 0, wndPtr->hInstance, 0L);
+	lphs->hWndDown = CreateWindow("BUTTON", "", 
+        	WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+        	width - height, 0, height, height, hwnd, 0,
+        	wndPtr->hInstance, 0L);
+	}
+    if (lphs->MaxPix < 1)  lphs->MaxPix = 1;
+    return TRUE;
+}
+
+
+
+int GetScrollPos(HWND hwnd, int nBar)
+{
+    LPHEADSCROLL lphs;
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) return;
+    return lphs->CurVal;
+}
+
+
+
+void GetScrollRange(HWND hwnd, int nBar, LPINT lpMin, LPINT lpMax)
+{
+    LPHEADSCROLL lphs;
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) return;
+    *lpMin = lphs->MinVal;
+    *lpMax = lphs->MaxVal;
+}
+
+
+
+int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
+{
+    int nRet;
+    LPHEADSCROLL lphs;
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) return;
+    nRet = lphs->CurVal;
+    lphs->CurVal = (short)nPos;
+    if (lphs->MaxVal != lphs->MinVal)
+	lphs->CurPix = lphs->MaxPix * (abs((short)nPos) - abs(lphs->MinVal)) / 
+    		(abs(lphs->MaxVal) - abs(lphs->MinVal));
+    if (lphs->CurPix > lphs->MaxPix)  lphs->CurPix = lphs->MaxPix;
+#ifdef DEBUG_SCROLL
+    printf("SetScrollPos val=%d pixval=%d pixmax%d\n",
+	    (short)nPos, lphs->CurPix, lphs->MaxPix);
+    printf("SetScrollPos min=%d max=%d\n", 
+	    lphs->MinVal, lphs->MaxVal);
+#endif
+    if (bRedraw) {
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+        }
+    return nRet;
+}
+
+
+
+void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
+{
+    LPHEADSCROLL lphs;
+    lphs = ScrollBarGetStorageHeader(hwnd);
+    if (lphs == NULL) return;
+    lphs->MinVal = (short)MinPos;
+    lphs->MaxVal = (short)MaxPos;
+    if (lphs->MaxVal != lphs->MinVal)
+	lphs->CurPix = abs(lphs->MaxVal) * 
+		(abs(lphs->CurVal) - abs(lphs->MinVal)) / 
+    		(abs(lphs->MaxVal) - abs(lphs->MinVal));
+    if (lphs->CurPix > lphs->MaxPix)  lphs->CurPix = lphs->MaxPix;
+#ifdef DEBUG_SCROLL
+    printf("SetScrollRange min=%d max=%d\n", lphs->MinVal, lphs->MaxVal);
+#endif
+    if (bRedraw) {
+        InvalidateRect(hwnd, NULL, TRUE);
+        UpdateWindow(hwnd);
+        }
+}
+
+
+
+
+
diff --git a/controls/static.c b/controls/static.c
new file mode 100644
index 0000000000000000000000000000000000000000..40e5fbb814b64f693d1a6189a772f7acf8cea022
--- /dev/null
+++ b/controls/static.c
@@ -0,0 +1,266 @@
+/*
+ * Static control
+ *
+ * Copyright  David W. Metcalfe, 1993
+ *
+ */
+
+static char Copyright[] = "Copyright  David W. Metcalfe, 1993";
+
+#include <windows.h>
+#include "win.h"
+#include "user.h"
+
+LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
+
+static LONG PaintTextfn(HWND hwnd);
+static LONG PaintRectfn(HWND hwnd);
+static LONG PaintFramefn(HWND hwnd);
+
+static COLORREF color_windowframe, color_background, color_window,
+                                                     color_windowtext;
+
+#define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
+	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
+		    GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
+#define DIM(array)	((sizeof array)/(sizeof array[0]))
+
+typedef struct
+{
+    LONG (*paintfn)();
+} STATICFN;
+
+#define MAX_STATIC_TYPE  12
+
+static STATICFN staticfn[MAX_STATIC_TYPE] =
+{
+    { (LONG(*)())PaintTextfn },                    /* SS_LEFT */
+    { (LONG(*)())PaintTextfn },                    /* SS_CENTER */
+    { (LONG(*)())PaintTextfn },                    /* SS_RIGHT */
+    { (LONG(*)())NULL        },                    /* SS_ICON */
+    { (LONG(*)())PaintRectfn },                    /* SS_BLACKRECT */
+    { (LONG(*)())PaintRectfn },                    /* SS_GRAYRECT */
+    { (LONG(*)())PaintRectfn },                    /* SS_WHITERECT */
+    { (LONG(*)())PaintFramefn },                   /* SS_BLACKFRAME */
+    { (LONG(*)())PaintFramefn },                   /* SS_GRAYFRAME */
+    { (LONG(*)())PaintFramefn },                   /* SS_WHITEFRAME */
+    { (LONG(*)())PaintTextfn },                    /* SS_SIMPLE */
+    { (LONG(*)())PaintTextfn }                     /* SS_LEFTNOWORDWRAP */
+};
+
+
+LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
+{
+	LONG lResult = 0;
+	HDC hDC;
+	RECT rc;
+	LPSTR textPtr;
+
+	WND *wndPtr = WIN_FindWndPtr(hWnd);
+	LONG style = wndPtr->dwStyle & 0x0000000F;
+
+	switch (uMsg) {
+	case WM_ENABLE:
+	    InvalidateRect(hWnd, NULL, FALSE);
+	    break;
+
+	case WM_CREATE:
+	    if (style < 0L || style >= (LONG)DIM(staticfn))
+		lResult = -1L;
+	    else
+	    {
+		/* initialise colours */
+		color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
+		color_background   = GetSysColor(COLOR_BACKGROUND);
+		color_window       = GetSysColor(COLOR_WINDOW);
+		color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
+		lResult = 0L;
+	    }
+	    break;
+
+	case WM_PAINT:
+	    if (staticfn[style].paintfn)
+		(staticfn[style].paintfn)(hWnd);
+	    break;
+
+	case WM_SYSCOLORCHANGE:
+	    color_windowframe  = GetSysColor(COLOR_WINDOWFRAME);
+	    color_background   = GetSysColor(COLOR_BACKGROUND);
+	    color_window       = GetSysColor(COLOR_WINDOW);
+	    color_windowtext   = GetSysColor(COLOR_WINDOWTEXT);
+	    InvalidateRect(hWnd, NULL, TRUE);
+	    break;
+
+	case WM_SETTEXT:
+	    if (wndPtr->hText)
+		USER_HEAP_FREE(wndPtr->hText);
+
+	    wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE, 
+					    strlen((LPSTR)lParam) + 1);
+	    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+	    strcpy(textPtr, (LPSTR)lParam);
+	    InvalidateRect(hWnd, NULL, TRUE);
+	    break;
+
+	default:
+		lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
+		break;
+	}
+
+	GlobalUnlock(hWnd);
+	return lResult;
+}
+
+
+static LONG PaintTextfn(HWND hwnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc;
+    HDC hdc;
+    HBRUSH hBrush;
+    HANDLE hText;
+    char *text;
+    int textlen;
+    WORD wFormat;
+
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    LONG style = wndPtr->dwStyle;
+
+    hdc = BeginPaint(hwnd, &ps);
+    GetClientRect(hwnd, &rc);
+
+    textlen = GetWindowTextLength(hwnd);
+    hText = LocalAlloc(LMEM_MOVEABLE, textlen+1);
+    text = LocalLock(hText);
+    GetWindowText(hwnd, text, textlen+1);
+
+    switch (style & 0x0000000F)
+    {
+    case SS_LEFT:
+	wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK;
+	break;
+
+    case SS_CENTER:
+	wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK;
+	break;
+
+    case SS_RIGHT:
+	wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK;
+	break;
+
+    case SS_SIMPLE:
+	wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
+	break;
+
+    case SS_LEFTNOWORDWRAP:
+	wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER;
+	break;
+    }
+
+    if (style & SS_NOPREFIX)
+	wFormat |= DT_NOPREFIX;
+
+    hBrush = SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
+		    MAKELONG(hwnd, CTLCOLOR_STATIC));
+    if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
+    FillRect(hdc, &rc, hBrush);
+    DrawText(hdc, text, textlen, &rc, wFormat);
+
+    LocalUnlock(hText);
+    LocalFree(hText);
+    GlobalUnlock(hwnd);
+    EndPaint(hwnd, &ps);
+}
+
+static LONG PaintRectfn(HWND hwnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc;
+    HDC hdc;
+    HPEN hOldPen, hPen;
+    HBRUSH hOldBrush, hBrush;
+
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    hdc = BeginPaint(hwnd, &ps);
+    GetClientRect(hwnd, &rc);
+    
+    switch (wndPtr->dwStyle & 0x0000000F)
+    {
+    case SS_BLACKRECT:
+	hPen = CreatePen(PS_SOLID, 1, color_windowframe);
+	hBrush = CreateSolidBrush(color_windowframe);
+	break;
+
+    case SS_GRAYRECT:
+	hPen = CreatePen(PS_SOLID, 1, color_background);
+	hBrush = CreateSolidBrush(color_background);
+	break;
+
+    case SS_WHITERECT:
+	hPen = CreatePen(PS_SOLID, 1, color_window);
+	hBrush = CreateSolidBrush(color_window);
+	break;
+    }
+
+    hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
+    hOldBrush = (HBRUSH)SelectObject(hdc, (HANDLE)hBrush);
+    Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
+
+    SelectObject(hdc, (HANDLE)hOldPen);
+    SelectObject(hdc, (HANDLE)hOldBrush);
+    DeleteObject((HANDLE)hPen);
+    DeleteObject((HANDLE)hBrush);
+
+    GlobalUnlock(hwnd);
+    EndPaint(hwnd, &ps);
+}
+
+static LONG PaintFramefn(HWND hwnd)
+{
+    PAINTSTRUCT ps;
+    RECT rc;
+    HDC hdc;
+    HPEN hOldPen, hPen;
+    HBRUSH hOldBrush, hBrush;
+
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    hdc = BeginPaint(hwnd, &ps);
+    GetClientRect(hwnd, &rc);
+    
+    switch (wndPtr->dwStyle & 0x0000000F)
+    {
+    case SS_BLACKFRAME:
+	hPen = CreatePen(PS_SOLID, 1, color_windowframe);
+	break;
+
+    case SS_GRAYFRAME:
+	hPen = CreatePen(PS_SOLID, 1, color_background);
+	break;
+
+    case SS_WHITEFRAME:
+	hPen = CreatePen(PS_SOLID, 1, color_window);
+	break;
+    }
+
+    hBrush = CreateSolidBrush(color_window);
+    hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
+    hOldBrush = (HBRUSH)SelectObject(hdc, (HANDLE)hBrush);
+    Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
+
+    SelectObject(hdc, (HANDLE)hOldPen);
+    SelectObject(hdc, (HANDLE)hOldBrush);
+    DeleteObject((HANDLE)hPen);
+    DeleteObject((HANDLE)hBrush);
+
+    GlobalUnlock(hwnd);
+    EndPaint(hwnd, &ps);
+}
+
+
+
+
+
+
+
diff --git a/controls/widgets.c b/controls/widgets.c
index 90272e506cdb32dee4ca7782071cb5a6439402dd..673348685a97924b6998e4cdb8ec3ff51d23de9a 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -8,21 +8,32 @@ static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include "windows.h"
 #include "win.h"
+#include "dialog.h"
 
 
 LONG ButtonWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG WIDGETS_StaticWndProc( HWND hwnd, WORD message,
+LONG StaticWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
+
+LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
+				   WORD wParam, LONG lParam );
+LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
+				   WORD wParam, LONG lParam );
+LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
 				   WORD wParam, LONG lParam );
 
-#define NB_BUILTIN_CLASSES  2
 
-static WNDCLASS WIDGETS_BuiltinClasses[NB_BUILTIN_CLASSES] =
+static WNDCLASS WIDGETS_BuiltinClasses[] =
 {
-    { 0, (LONG(*)())ButtonWndProc, 0, 0, 0, 0, 0, 0, NULL, "BUTTON" },
-    { 0, (LONG(*)())WIDGETS_StaticWndProc, 0, 0, 0, 0, 0, 0, NULL, "STATIC" }
+    { 0, (LONG(*)())ButtonWndProc, 0, 2, 0, 0, 0, 0, NULL, "BUTTON" },
+    { 0, (LONG(*)())StaticWndProc, 0, 0, 0, 0, 0, 0, NULL, "STATIC" },
+    { 0, (LONG(*)())SCROLLBAR_ScrollBarWndProc, 0, 8, 0, 0, 0, 0, NULL, "SCROLLBAR" },
+    { 0, (LONG(*)())LISTBOX_ListBoxWndProc, 0, 8, 0, 0, 0, 0, NULL, "LISTBOX" },
+    { 0, (LONG(*)())COMBOBOX_ComboBoxWndProc, 0, 8, 0, 0, 0, 0, NULL, "COMBOBOX" },
+    { 0, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA, 0, 0, 0, 0, NULL, DIALOG_CLASS_NAME }
 };
 
-static FARPROC WndProc32[NB_BUILTIN_CLASSES];
+#define NB_BUILTIN_CLASSES \
+         (sizeof(WIDGETS_BuiltinClasses)/sizeof(WIDGETS_BuiltinClasses[0]))
 
 
 /***********************************************************************
@@ -33,56 +44,9 @@ static FARPROC WndProc32[NB_BUILTIN_CLASSES];
 BOOL WIDGETS_Init()
 {
     int i;
-    WNDCLASS * pClass = WIDGETS_BuiltinClasses;
-        
-    for (i = 0; i < NB_BUILTIN_CLASSES; i++, pClass++)
+    for (i = 0; i < NB_BUILTIN_CLASSES; i++)
     {
-	if (!RegisterClass(pClass)) return FALSE;
+	if (!RegisterClass(&WIDGETS_BuiltinClasses[i])) return FALSE;
     }
     return TRUE;
 }
-
-
-/**********************************************************************
- *	     WIDGETS_Call32WndProc
- *
- * Call the window procedure of a built-in class.
- */
-LONG WIDGETS_Call32WndProc( FARPROC func, HWND hwnd, WORD message,
-			    WORD wParam, LONG lParam )
-{
-    unsigned int i = (unsigned int) func;
-    if (!i || (i > NB_BUILTIN_CLASSES)) return 0;    
-    return (*WndProc32[i-1])( hwnd, message, wParam, lParam );
-}
-
-
-/***********************************************************************
- *           WIDGETS_StaticWndProc
- */
-static LONG WIDGETS_StaticWndProc( HWND hwnd, WORD message,
-				   WORD wParam, LONG lParam )
-{    
-    switch(message)
-    {
-    case WM_CREATE:
-	return 0;
-	
-    case WM_PAINT:
-	{
-	    HDC hdc;
-	    PAINTSTRUCT ps;
-	    RECT rect;
-	
-	    hdc = BeginPaint( hwnd, &ps );
-	    GetClientRect( hwnd, &rect );
-	    DrawText(hdc, "Static", -1, &rect,
-		     DT_SINGLELINE | DT_CENTER | DT_VCENTER );
-	    EndPaint( hwnd, &ps );
-	    return 0;
-	}
-	
-    default:
-	return DefWindowProc( hwnd, message, wParam, lParam );
-    }
-}
diff --git a/debugger/Makefile b/debugger/Makefile
index 493297ae8e1a166ee4821538a70d15b8c773351a..78954c054e22e4a0ac35fcd715f593d30f1ae8e1 100644
--- a/debugger/Makefile
+++ b/debugger/Makefile
@@ -1,6 +1,10 @@
-CFLAGS=-g -I../include # -DUSE_READLINE
+CFLAGS=-g -I../include -DUSE_READLINE
 LIBS= readline/libedit.a
 OBJS=dbg.tab.o hash.o lex.yy.o info.o i386-pinsn.o
+#YACC=bison -v -d
+YACC=yacc -b dbg -d
+#LEX=flex
+LEX=lex
 
 debugger.o: ${OBJS} readline/libedit.a
 	(cd readline; make)
@@ -18,10 +22,10 @@ lex.yy.o: lex.yy.c
 
 
 lex.yy.c: debug.l
-	flex -I debug.l
+	${LEX} -I debug.l
 
 dbg.tab.c dbg.tab.h: dbg.y
-	bison -v -d  dbg.y
+	${YACC} dbg.y
 
 dtest: dtest.o debugger.o
 	gcc -o dtest dtest.o debugger.o
@@ -29,3 +33,7 @@ dtest: dtest.o debugger.o
 clean:
 	rm -f *.o main dbg.tab.* lex.yy.* *.output *~ *# dtest
 	(cd readline; make clean)
+
+depend: dbg.tab.c dbg.tab.h lex.yy.c
+	$(CC) $(CFLAGS) -M *.c > .depend
+
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 80e8d34fca48a0e136ab9458ee2f68d36db58b6c..a6279626248c3d9ff8f9d18d43b59744f734ef1a 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -115,7 +115,7 @@ wine_debug(int * regs)
 	yyin = stdin;
 	regval = regs;
 
-	/* This only works for linux - NetBSD will need something different here. */
+#ifdef linux        
 	if((SC_CS & 7) != 7) {
 		dbg_mask = 0xffffffff;
 		dbg_mode = 32;
@@ -123,6 +123,16 @@ wine_debug(int * regs)
 		dbg_mask = 0xffff;
 		dbg_mode = 16;
 	};
+#endif
+#ifdef __NetBSD__
+	if(SC_CS == 0x1f) {
+		dbg_mask = 0xffffffff;
+		dbg_mode = 32;
+	} else {
+		dbg_mask = 0xffff;
+		dbg_mode = 16;
+	};
+#endif
 
 	/* This is intended to read the entry points from the Windows image, and
 	   insert them in the hash table.  It does not work yet, so it is commented out. */
diff --git a/debugger/debug.l b/debugger/debug.l
index dac7d3f2a38b1507546af1302714d44d598bd756..6de63a40d891218982fa6936bf55559759efc6ee 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -24,6 +24,7 @@ extern char * readline(char *);
 static char * make_symbol(char *);
 void flush_symbols();
 static int syntax_error;
+extern int yylval;
 %}
 
 DIGIT	[0-9]
diff --git a/debugger/dtest.c b/debugger/dtest.c
index 4d70008d4ddeeba687eb737a051c013574928e68..bbad04e0cacbcad93e2aa4f107dfdfc63a8a0d6a 100644
--- a/debugger/dtest.c
+++ b/debugger/dtest.c
@@ -56,25 +56,16 @@ main(){
 	char * pnt;
 #ifdef linux
 	segv_act.sa_handler = (__sighandler_t) win_fault;
-	/* Point to the top of the stack, minus 4 just in case, and make
-	   it aligned  */
 	sigaction(SIGSEGV, &segv_act, NULL);
 #endif
 #ifdef __NetBSD__
-        struct sigstack ss;
         sigset_t sig_mask;
         
-        ss.ss_sp = (char *) (((unsigned int)(cstack + sizeof(cstack) - 4)) & ~3);
-        ss.ss_onstack = 0;
-        if (sigstack(&ss, NULL) < 0) {
-                perror("sigstack");
-                exit(1);
-        }
         sigemptyset(&sig_mask);
         segv_act.sa_handler = (__sighandler_t) win_fault;
-	segv_act.sa_flags = SA_ONSTACK;
+	segv_act.sa_flags = 0;
         segv_act.sa_mask = sig_mask;
-	if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
+	if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
                 perror("sigaction");
                 exit(1);
         }
diff --git a/debugger/i386-pinsn.c b/debugger/i386-pinsn.c
index bd22a93632d553eb4eb383acaf84681368d534f8..9a633611ef9dd7f319eb4d4874828e6173009bee 100644
--- a/debugger/i386-pinsn.c
+++ b/debugger/i386-pinsn.c
@@ -1467,6 +1467,57 @@ OP_E (bytemode)
     }
   
   append_prefix ();
+
+  if (bytemode == w_mode || (bytemode == v_mode && !dflag))
+  {
+      if (mod == 0 && rm == 6)
+      {
+	  sprintf(scratchbuf, "%04.4x", get16());
+	  oappend(scratchbuf);
+	  return 0;
+      }
+      
+      disp = 0;
+      if (mod == 1)
+	  disp = *(char *)codep++;
+      else if (mod == 2)
+	  disp = get16();
+      if (disp != 0)
+      {
+	  sprintf(scratchbuf, "0x%x", disp);
+	  oappend(scratchbuf);
+      }
+
+      switch (rm)
+      {
+	case 0:
+	  oappend("(%bx,%si)");
+	  break;
+	case 1:
+	  oappend("(%bx,%di)");
+	  break;
+	case 2:
+	  oappend("(%bp,%si)");
+	  break;
+	case 3:
+	  oappend("(%bp,%di)");
+	  break;
+	case 4:
+	  oappend("(%si)");
+	  break;
+	case 5:
+	  oappend("(%di)");
+	  break;
+	case 6:
+	  oappend("(%bp)");
+	  break;
+	case 7:
+	  oappend("(%bx)");
+	  break;
+      }	  
+      return 0;
+  }
+  
   if (rm == 4)
     {
       havesib = 1;
diff --git a/debugger/info.c b/debugger/info.c
index 96046e89a3d90689f29466d101cee8fe30383378..063447a025b36c66541528f2b766acf57aab54bc 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -140,10 +140,10 @@ void examine_memory(int addr, int count, char format){
 		wdump = (unsigned short int *) addr;
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %d", *wdump++);
+			fprintf(stderr," %x", *wdump++);
 			if ((i % 10) == 7) {
 				fprintf(stderr,"\n");
-				print_address((unsigned int) dump, stderr);
+				print_address((unsigned int) wdump, stderr);
 				fprintf(stderr,":  ");
 			};
 		}
@@ -172,10 +172,10 @@ void examine_memory(int addr, int count, char format){
 		pnt = (char *) addr;
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %d", *pnt++);
+			fprintf(stderr," %w", *pnt++);
 			if ((i % 32) == 7) {
 				fprintf(stderr,"\n");
-				print_address((unsigned int) dump, stderr);
+				print_address((unsigned int) pnt, stderr);
 				fprintf(stderr,":  ");
 			};
 		}
diff --git a/debugger/obstack.h b/debugger/obstack.h
new file mode 100644
index 0000000000000000000000000000000000000000..72832ee55051bdf8bfd988bb9d8bbd1516d5610e
--- /dev/null
+++ b/debugger/obstack.h
@@ -0,0 +1,467 @@
+/* obstack.h - object stack macros
+   Copyright (C) 1988 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects.  Each object starts life
+small, and may grow to maturity.  (Consider building a word syllable
+by syllable.)  An object can move while it is growing.  Once it has
+been "finished" it never changes address again.  So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
+by calling `obstack_chunk_free'.  You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables.  Unless you are "fascist pig with a read-only mind"
+[Gosper's immortal quote from HAKMEM item 154, out of context] you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols.  At the time you are reading a symbol you don't know
+how long it is.  One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer.  This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently.  Use one obstack for all symbol
+names.  As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it.  Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses.  When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk.  When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies.  No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk.  We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object.  This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+	We allocate large chunks.
+	We carve out one object at a time from the current chunk.
+	Once carved, an object never moves.
+	We are free to append data of any size to the currently
+	  growing object.
+	Exactly one object is growing in an obstack at any one time.
+	You can run one obstack per control block.
+	You may have as many control blocks as you dare.
+	Because of the way we do it, you can `unwind' a obstack
+	  back to a previous state. (You may remove objects much
+	  as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once.  */
+
+#ifndef __OBSTACKS__
+#define __OBSTACKS__
+
+/* We use subtraction of (char *)0 instead of casting to int
+   because on word-addressable machines a simple cast to int
+   may ignore the byte-within-word field of the pointer.  */
+
+#ifndef __PTR_TO_INT
+#define __PTR_TO_INT(P) ((P) - (char *)0)
+#endif
+
+#ifndef __INT_TO_PTR
+#define __INT_TO_PTR(P) ((P) + (char *)0)
+#endif
+
+struct _obstack_chunk		/* Lives at front of each chunk. */
+{
+  char  *limit;			/* 1 past end of this chunk */
+  struct _obstack_chunk *prev;	/* address of prior chunk or NULL */
+  char	contents[4];		/* objects begin here */
+};
+
+struct obstack		/* control current object in current chunk */
+{
+  long	chunk_size;		/* preferred size to allocate chunks in */
+  struct _obstack_chunk* chunk;	/* address of current struct obstack_chunk */
+  char	*object_base;		/* address of object we are building */
+  char	*next_free;		/* where to add next char to current object */
+  char	*chunk_limit;		/* address of char after current chunk */
+  int	temp;			/* Temporary for some macros.  */
+  int   alignment_mask;		/* Mask of alignment for each object. */
+  struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
+  void (*freefun) ();		/* User's function to free a chunk.  */
+  void	*area_id;		/* Select which region to alloc/free in */
+  int   flags;			/* Miscellaneous special purpose flags */
+};
+
+/* Declare bits for flags word. */
+
+/* Means there is a possibility the current chunk contains a zero-length
+   object.  This prevents freeing the chunk if we allocate a bigger chunk
+   to replace it.  */
+
+#define OBSTACK_MAYBE_EMPTY_OBJECT	(1 << 0)
+
+/* Means that the allocation and deallocation functions take two arguments,
+   ala the mmalloc package.  The first argument is a generic pointer that
+   is saved in the area_id member of the obstack struct. */
+
+#define OBSTACK_MMALLOC_LIKE		(1 << 1)
+
+/* Declare the external functions we use; they are in obstack.c.  */
+
+#ifdef __STDC__
+  extern void _obstack_newchunk (struct obstack *, int);
+  extern void _obstack_free (struct obstack *, void *);
+  extern void _obstack_begin (struct obstack *, int, int,
+			      void *(*) (int), void (*) (int), void *, int);
+#else
+  extern void _obstack_newchunk ();
+  extern void _obstack_free ();
+  extern void _obstack_begin ();
+#endif
+
+#ifdef __STDC__
+
+/* Do the function-declarations after the structs
+   but before defining the macros.  */
+
+void obstack_init (struct obstack *obstack);
+
+void * obstack_alloc (struct obstack *obstack, int size);
+
+void * obstack_copy (struct obstack *obstack, void *address, int size);
+void * obstack_copy0 (struct obstack *obstack, void *address, int size);
+
+void obstack_free (struct obstack *obstack, void *block);
+
+void obstack_blank (struct obstack *obstack, int size);
+
+void obstack_grow (struct obstack *obstack, void *data, int size);
+void obstack_grow0 (struct obstack *obstack, void *data, int size);
+
+void obstack_1grow (struct obstack *obstack, int data_char);
+void obstack_ptr_grow (struct obstack *obstack, void *data);
+void obstack_int_grow (struct obstack *obstack, int data);
+
+void * obstack_finish (struct obstack *obstack);
+
+int obstack_object_size (struct obstack *obstack);
+
+int obstack_room (struct obstack *obstack);
+void obstack_1grow_fast (struct obstack *obstack, int data_char);
+void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
+void obstack_int_grow_fast (struct obstack *obstack, int data);
+void obstack_blank_fast (struct obstack *obstack, int size);
+
+void * obstack_base (struct obstack *obstack);
+void * obstack_next_free (struct obstack *obstack);
+int obstack_alignment_mask (struct obstack *obstack);
+int obstack_chunk_size (struct obstack *obstack);
+
+#endif /* __STDC__ */
+
+/* Non-ANSI C cannot really support alternative functions for these macros,
+   so we do not declare them.  */
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+   Note that this might not be the final address of the object
+   because a new chunk might be needed to hold the final size.  */
+
+#define obstack_base(h) ((h)->object_base)
+
+/* Size for allocating ordinary chunks.  */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk.  */
+
+#define obstack_next_free(h)	((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object.  */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+#define obstack_init(h) \
+  _obstack_begin ((h), 0, 0, \
+		  (void *(*) ()) obstack_chunk_alloc, (void (*) ())obstack_chunk_free, (void *) 0, 0)
+
+#define obstack_begin(h, size) \
+  _obstack_begin ((h), (size), 0, \
+		  (void *(*) ()) obstack_chunk_alloc, (void (*) ())obstack_chunk_free, (void *) 0, 0)
+
+#define obstack_full_begin(h,size,alignment,chunkfun,freefun,area_id,flags) \
+  _obstack_begin ((h), (size), (alignment), \
+		  (void *(*) ()) (chunkfun), (void (*) ()) (freefun), \
+		  (area_id), (flags))
+
+#define obstack_chunkfun(h, newchunkfun) \
+  ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
+
+#define obstack_freefun(h, newfreefun) \
+  ((h) -> freefun = (void (*)()) (newfreefun))
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#if defined (__GNUC__) && defined (__STDC__)
+#if __GNUC__ < 2
+#define __extension__
+#endif
+
+/* For GNU C, if not -traditional,
+   we can define these macros to compute all args only once
+   without using a global variable.
+   Also, we can avoid using the `temp' slot, to make faster code.  */
+
+#define obstack_object_size(OBSTACK)					\
+  __extension__								\
+  ({ struct obstack *__o = (OBSTACK);					\
+     (unsigned) (__o->next_free - __o->object_base); })
+
+#define obstack_room(OBSTACK)						\
+  __extension__								\
+  ({ struct obstack *__o = (OBSTACK);					\
+     (unsigned) (__o->chunk_limit - __o->next_free); })
+
+/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
+   so that we can avoid having void expressions
+   in the arms of the conditional expression.
+   Casting the third operand to void was tried before,
+   but some compilers won't accept it.  */
+#define obstack_grow(OBSTACK,where,length)				\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   int __len = (length);						\
+   ((__o->next_free + __len > __o->chunk_limit)				\
+    ? (_obstack_newchunk (__o, __len), 0) : 0);				\
+   bcopy (where, __o->next_free, __len);				\
+   __o->next_free += __len;						\
+   (void) 0; })
+
+#define obstack_grow0(OBSTACK,where,length)				\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   int __len = (length);						\
+   ((__o->next_free + __len + 1 > __o->chunk_limit)			\
+    ? (_obstack_newchunk (__o, __len + 1), 0) : 0),			\
+   bcopy (where, __o->next_free, __len),				\
+   __o->next_free += __len,						\
+   *(__o->next_free)++ = 0;						\
+   (void) 0; })
+
+#define obstack_1grow(OBSTACK,datum)					\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   ((__o->next_free + 1 > __o->chunk_limit)				\
+    ? (_obstack_newchunk (__o, 1), 0) : 0),				\
+   *(__o->next_free)++ = (datum);					\
+   (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers or ints,
+   and that the data added so far to the current object
+   shares that much alignment.  */
+   
+#define obstack_ptr_grow(OBSTACK,datum)					\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   ((__o->next_free + sizeof (void *) > __o->chunk_limit)		\
+    ? (_obstack_newchunk (__o, sizeof (void *)), 0) : 0),		\
+   *(*(void ***)&__o->next_free)++ = ((void *)datum);			\
+   (void) 0; })
+
+#define obstack_int_grow(OBSTACK,datum)					\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   ((__o->next_free + sizeof (int) > __o->chunk_limit)			\
+    ? (_obstack_newchunk (__o, sizeof (int)), 0) : 0),			\
+   *(*(int **)&__o->next_free)++ = ((int)datum);			\
+   (void) 0; })
+
+#define obstack_ptr_grow_fast(h,aptr) (*(*(void ***)&(h)->next_free)++ = (void *)aptr)
+#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint)
+
+#define obstack_blank(OBSTACK,length)					\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   int __len = (length);						\
+   ((__o->chunk_limit - __o->next_free < __len)				\
+    ? (_obstack_newchunk (__o, __len), 0) : 0);				\
+   __o->next_free += __len;						\
+   (void) 0; })
+
+#define obstack_alloc(OBSTACK,length)					\
+__extension__								\
+({ struct obstack *__h = (OBSTACK);					\
+   obstack_blank (__h, (length));					\
+   obstack_finish (__h); })
+
+#define obstack_copy(OBSTACK,where,length)				\
+__extension__								\
+({ struct obstack *__h = (OBSTACK);					\
+   obstack_grow (__h, (where), (length));				\
+   obstack_finish (__h); })
+
+#define obstack_copy0(OBSTACK,where,length)				\
+__extension__								\
+({ struct obstack *__h = (OBSTACK);					\
+   obstack_grow0 (__h, (where), (length));				\
+   obstack_finish (__h); })
+
+/* The local variable is named __o1 to avoid a name conflict
+   when obstack_blank is called.  */
+#define obstack_finish(OBSTACK)  					\
+__extension__								\
+({ struct obstack *__o1 = (OBSTACK);					\
+   void *value = (void *) __o1->object_base;				\
+   if (__o1->next_free == value)					\
+     __o1->flags |= OBSTACK_MAYBE_EMPTY_OBJECT;				\
+   __o1->next_free							\
+     = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
+		     & ~ (__o1->alignment_mask));			\
+   ((__o1->next_free - (char *)__o1->chunk				\
+     > __o1->chunk_limit - (char *)__o1->chunk)				\
+    ? (__o1->next_free = __o1->chunk_limit) : 0);			\
+   __o1->object_base = __o1->next_free;					\
+   value; })
+
+#define obstack_free(OBSTACK, OBJ)					\
+__extension__								\
+({ struct obstack *__o = (OBSTACK);					\
+   void *__obj = (OBJ);							\
+   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
+     __o->next_free = __o->object_base = __obj;				\
+   else (obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+#define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+#define obstack_room(h)		\
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+#define obstack_grow(h,where,length)					\
+( (h)->temp = (length),							\
+  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
+   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
+  bcopy (where, (h)->next_free, (h)->temp),				\
+  (h)->next_free += (h)->temp)
+
+#define obstack_grow0(h,where,length)					\
+( (h)->temp = (length),							\
+  (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)			\
+   ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),			\
+  bcopy (where, (h)->next_free, (h)->temp),				\
+  (h)->next_free += (h)->temp,						\
+  *((h)->next_free)++ = 0)
+
+#define obstack_1grow(h,datum)						\
+( (((h)->next_free + 1 > (h)->chunk_limit)				\
+   ? (_obstack_newchunk ((h), 1), 0) : 0),				\
+  *((h)->next_free)++ = (datum))
+
+#define obstack_ptr_grow(h,datum)					\
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
+   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
+  *(*(char ***)&(h)->next_free)++ = ((char *)datum))
+
+#define obstack_int_grow(h,datum)					\
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
+   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
+  *(*(int **)&(h)->next_free)++ = ((int)datum))
+
+#define obstack_ptr_grow_fast(h,aptr) (*(*(char ***)&(h)->next_free)++ = (char *)aptr)
+#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint)
+#define obstack_blank(h,length)						\
+( (h)->temp = (length),							\
+  (((h)->chunk_limit - (h)->next_free < (h)->temp)			\
+   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
+  (h)->next_free += (h)->temp)
+
+#define obstack_alloc(h,length)						\
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+#define obstack_copy(h,where,length)					\
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+#define obstack_copy0(h,where,length)					\
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+#define obstack_finish(h)  						\
+( ((h)->next_free == (h)->object_base					\
+   ? (((h)->flags |= OBSTACK_MAYBE_EMPTY_OBJECT), 0)			\
+   : 0),								\
+  (h)->temp = __PTR_TO_INT ((h)->object_base),				\
+  (h)->next_free							\
+    = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)	\
+		    & ~ ((h)->alignment_mask)),				\
+  (((h)->next_free - (char *)(h)->chunk					\
+    > (h)->chunk_limit - (char *)(h)->chunk)				\
+   ? ((h)->next_free = (h)->chunk_limit) : 0),				\
+  (h)->object_base = (h)->next_free,					\
+  __INT_TO_PTR ((h)->temp))
+
+#ifdef __STDC__
+#define obstack_free(h,obj)						\
+( (h)->temp = (char *)(obj) - (char *) (h)->chunk,			\
+  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+   ? (int) ((h)->next_free = (h)->object_base				\
+	    = (h)->temp + (char *) (h)->chunk)				\
+   : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
+#else
+#define obstack_free(h,obj)						\
+( (h)->temp = (char *)(obj) - (char *) (h)->chunk,			\
+  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+   ? (int) ((h)->next_free = (h)->object_base				\
+	    = (h)->temp + (char *) (h)->chunk)				\
+   : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
+#endif
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+#endif /* not __OBSTACKS__ */
diff --git a/debugger/readline/Makefile b/debugger/readline/Makefile
index 77c6bfcfe2b12e538cc230b17ef36cd9701e936f..0ec3889654353ec077fabb33b53fa64a4a87d026 100644
--- a/debugger/readline/Makefile
+++ b/debugger/readline/Makefile
@@ -49,7 +49,7 @@ shar:		$(SHARFILES)
 	shar $(SHARFILES) >shar
 
 clean:
-	rm -f *.[oa] testit foo core tags lint lint.all a.out shar
+	rm -f *.[oa] testit foo core tags lint lint.all a.out shar *# *~
 
 lint:		testit
 	lint -a -b -u -x $(DEFS) $(SOURCES) testit.c >lint.all
diff --git a/debugger/regpos.h b/debugger/regpos.h
index c3d30867fa26dd6200405521a35706cc83f33e45..d3c3a4f7d35e90cedcaa250440b17280fa0e351f 100644
--- a/debugger/regpos.h
+++ b/debugger/regpos.h
@@ -25,9 +25,32 @@
 #define  RN_CR2			21
 #endif
 
+#ifdef __NetBSD__
+/* Register numbers */
+#define  RN_ESP			2
+#define  RN_EBP			3
+#define  RN_ESP_AT_SIGNAL	4
+#define  RN_EIP			5
+#define  RN_EFLAGS		6
+#define  RN_ES			7
+#define  RN_DS			8
+#define  RN_CS			9
+#define  RN_SS			10
+#define  RN_EDI  		11
+#define  RN_ESI			12
+#define  RN_EBX			13
+#define  RN_EDX			14
+#define  RN_ECX			15
+#define  RN_EAX			16
+/* NetBSD doesn't context switch gs or fs */
+#define  SC_GS			0x27
+#define  SC_FS			0x27
+#endif
 
+#ifdef linux
 #define  SC_GS			regval[RN_GS]
 #define  SC_FS			regval[RN_FS]
+#endif
 #define  SC_ES			regval[RN_ES]
 #define  SC_DS			regval[RN_DS]
 #define  SC_EDI(dbg_mask)  	(regval[RN_EDI] & dbg_mask)
diff --git a/if1632/Makefile b/if1632/Makefile
index eac92189073dec57a59b6443464c13ca32891321..0746063710de99f12b8f1b966c90937787d37f9a 100644
--- a/if1632/Makefile
+++ b/if1632/Makefile
@@ -16,7 +16,7 @@ if1632.o: $(OBJS)
 	$(LD) -r -o if1632.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 dll_kernel.S dll_kernel_tab.c: ../tools/build kernel.spec
 	../tools/build kernel.spec
diff --git a/if1632/call.S b/if1632/call.S
index e09c1f5f19fa474db8b5b343b36cb390dbf3d1fa..9da87f091af14eec3befe0750be53aff890a8f63 100644
--- a/if1632/call.S
+++ b/if1632/call.S
@@ -102,7 +102,7 @@ _CallToInit16:
 	movl	%esp,%eax
 	movl	%eax,%ebp
 #if 1
-	movw	$ UDATASEL,%ax
+	movw	$UDATASEL,%ax
 	movw	%ax,%fs
 	movw	%ax,%gs
 #endif	
@@ -124,7 +124,7 @@ _CallToInit16:
 	 * GDT usage.
 	 */
 	pushl	%eax
-	movw	$ UDATASEL,%ax
+	movw	$UDATASEL,%ax
 	movw	%ax,%ds
 	movw	%ax,%es
 	movw	%ax,%fs
@@ -204,7 +204,7 @@ _CallTo16:
 	 * GDT usage.
 	 */
 	pushl	%eax
-	movw	$ UDATASEL,%ax
+	movw	$UDATASEL,%ax
 	movw	%ax,%ds
 	movw	%ax,%es
 	movw	%ax,%fs
@@ -259,7 +259,7 @@ _CallTo32:
 	 * Restore segment registers.
 	 */
 	pushl	%eax
-	movw	$ UDATASEL,%ax
+	movw	$UDATASEL,%ax
 	movw	%ax,%ds
 	movw	%ax,%es
 	popl	%eax
@@ -359,21 +359,23 @@ _ReturnFromRegisterFunc:
 	 * the return address, the saved registers, and the return 
 	 * address again.
 	 */
-	popw	%ax	/* Throw away the number of arguments */
-	popl	%eax	/* Throw away first copy of return address */
+	add	$6,%esp		/* argument count, return address */
+	popw	%gs
+	add	$2,%esp
+	popw	%fs
+	add	$2,%esp
 	popw	%es
+	add	$2,%esp
 	popw	%ds
-	popw	%di
-	popw	%si
-	popw	%bp
-	popw	%ax	/* Throw away pushed stack pointer */
-	popw	%bx
-	popw	%dx
-	popw	%cx
-	popw	%ax
+	add	$2,%esp
+	popal
+	add	$16,%esp	/* trapno, err, eip, cs */
+	popfl
+	add	$20,%esp	/* esp, ss, i387, oldmask, cr2 */
 
 	/*
 	 * Return to original caller.
 	 */
 	.byte	0x66
 	lret
+
diff --git a/if1632/callback.c b/if1632/callback.c
index 3c35e88f5f2fab522fbcdf8dcee06e71a4d50ad5..60a9e88cdd03a59df344d4510eb1c6b9d5946e5b 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -104,6 +104,7 @@ CALLBACK_MakeProcInstance(void *func, int instance)
     tp->thunk[4] = 0xd8;
     tp->thunk[5] = 0xea;
     memcpy(&tp->thunk[6], &func, 4);
+    tp->used = 1;
 
     return tp->thunk;
 }
@@ -141,9 +142,6 @@ LONG CallWindowProc( FARPROC func, HWND hwnd, WORD message,
 	PushOn16( CALLBACK_SIZE_WORD, message );
 	PushOn16( CALLBACK_SIZE_WORD, wParam );
 	PushOn16( CALLBACK_SIZE_LONG, lParam );
-
-	printf("%8.8x(%4.4x, %4.4x, %4.4x, %8.8x)\n", func, hwnd, message, wParam, lParam);
-
 	return CallTo16((unsigned int) func, 
 			FindDataSegmentForCode((unsigned long) func));   
     }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 6af75c1f90145deeaf569c764fd085187633135b..a1fc5c598471c6697ff1d42e29d85bf2c7d3bf37 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -131,6 +131,7 @@ length	490
 346 pascal SetTextAlign(word word) SetTextAlign(1 2)
 348 pascal Chord(word s_word s_word s_word s_word s_word s_word s_word s_word)
 	   Chord(1 2 3 4 5 6 7 8 9)
+350 pascal GetCharWidth(word word word ptr) GetCharWidth(1 2 3 4)
 360 pascal CreatePalette(ptr) CreatePalette(1)
 363 pascal GetPaletteEntries(word word word ptr) GetPaletteEntries(1 2 3 4)
 364 pascal SetPaletteEntries(word word word ptr) SetPaletteEntries(1 2 3 4)
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 63eb008479ab8aa2cc96dd4683cf815699c8ff90..755f8431a0ec0355a40f38cd9a2883e0e6a5b90d 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -44,7 +44,7 @@ length	415
 86  pascal _lwrite(word ptr word) KERNEL__lwrite(1 2 3)
 88  pascal lstrcpy(ptr ptr) lstrcpy(1 2)
 89  pascal lstrcat(ptr ptr) lstrcat(1 2)
-90  pascal lstrlen(ptr) lstrcpy(1)
+90  pascal lstrlen(ptr) lstrlen(1)
 91  register InitTask(word word word word word
 		      word word word word word) 
 	     KERNEL_InitTask()
@@ -66,6 +66,7 @@ length	415
 154 return GlobalNotify 4 0
 163 pascal GlobalLRUOldest(word) ReturnArg(1)
 164 pascal GlobalLRUNewest(word) ReturnArg(1)
+166 pascal WinExec(ptr word) WinExec(1 2)
 178 equate __WINFLAGS 0x413
 184 return GlobalDOSAlloc 4 0
 185 return GlobalDOSFree 2 0
diff --git a/if1632/user.spec b/if1632/user.spec
index 4a32a6a5a285478dd5c50a01bc20d4adfffc181b..9f92bd80d5475b7404f251a1ae58e40f49128596 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -15,9 +15,13 @@ length	540
 15  pascal GetCurrentTime() GetTickCount()
 18  pascal SetCapture(word) SetCapture(1)
 19  pascal ReleaseCapture() ReleaseCapture()
+22  pascal SetFocus(word) SetFocus(1)
+23  pascal GetFocus() GetFocus()
 31  pascal IsIconic(word) IsIconic(1)
+32  pascal GetWindowRect(word ptr) GetWindowRect(1 2)
 33  pascal GetClientRect(word ptr) GetClientRect(1 2)
 36  pascal GetWindowText(word ptr word) GetWindowText(1 2 3)
+37  pascal SetWindowText(word ptr) SetWindowText(1 2)
 38  pascal GetWindowTextLength(word) GetWindowTextLength(1)
 39  pascal BeginPaint(word ptr) BeginPaint(1 2)
 40  pascal EndPaint(word ptr) EndPaint(1 2)
@@ -25,8 +29,13 @@ length	540
 	   CreateWindow(1 2 3 4 5 6 7 8 9 10 11)
 42  pascal ShowWindow(word word) ShowWindow(1 2)
 46  pascal GetParent(word) GetParent(1)
+48  pascal IsChild(word word) IsChild(1 2)
 53  pascal DestroyWindow(word) DestroyWindow(1)
+56  pascal MoveWindow(word word word word word word) 
+           MoveWindow(1 2 3 4 5 6)
 57  pascal RegisterClass(ptr) RegisterClass(1)
+62  pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
+64  pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
 66  pascal GetDC(word) GetDC(1)
 68  pascal ReleaseDC(word word) ReleaseDC(1 2)
 72  pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
@@ -42,7 +51,22 @@ length	540
 82  pascal InvertRect(word ptr) InvertRect(1 2)
 83  pascal FrameRect(word ptr word) FrameRect(1 2 3)
 85  pascal DrawText(word ptr s_word ptr word) DrawText(1 2 3 4 5)
+87  pascal DialogBox(word ptr word ptr) DialogBox(1 2 3 4)
+88  pascal EndDialog(word s_word) EndDialog(1 2)
+89  pascal CreateDialog(word ptr word ptr) CreateDialog(1 2 3 4)
+90  pascal IsDialogMessage(word ptr) IsDialogMessage(1 2)
+91  pascal GetDlgItem(word word) GetDlgItem(1 2)
+92  pascal SetDlgItemText(word ptr) SetDlgItemText(1 2)
+93  pascal GetDlgItemText(word word ptr word) GetDlgItemText(1 2 3 4)
+94  pascal SetDlgItemInt(word word word word) SetDlgItemInt(1 2 3 4)
+95  pascal GetDlgItemInt(word word ptr word) GetDlgItemInt(1 2 3 4)
+96  pascal CheckRadioButton(word word word word) CheckRadioButton(1 2 3 4)
+97  pascal CheckDlgButton(word word word) CheckDlgButton(1 2 3)
+98  pascal IsDlgButtonChecked(word word) IsDlgButtonChecked(1 2)
+101 pascal SendDlgItemMessage(word word word word long)
+	   SendDlgItemMessage(1 2 3 4 5)
 102 pascal AdjustWindowRect(ptr long word) AdjustWindowRect(1 2 3)
+103 pascal MapDialogRect(word ptr) MapDialogRect(1 2)
 104 pascal MessageBeep(word) MessageBeep(1)
 106 pascal GetKeyState(word) GetKeyState(1)
 107 pascal DefWindowProc(word word word long) DefWindowProc(1 2 3 4)
@@ -55,6 +79,7 @@ length	540
 118 pascal RegisterWindowMessage(ptr) RegisterWindowMessage(1)
 119 pascal GetMessagePos() GetMessagePos()
 120 pascal GetMessageTime() GetMessageTime()
+122 pascal CallWindowProc(ptr word word word long) CallWindowProc(1 2 3 4 5)
 124 pascal UpdateWindow(word) UpdateWindow(1)
 125 pascal InvalidateRect(word ptr word) InvalidateRect(1 2 3)
 126 pascal InvalidateRgn(word word word) InvalidateRgn(1 2 3)
@@ -73,6 +98,7 @@ length	540
 154 pascal CheckMenu(word word word) CheckMenu(1 2 3)
 157 pascal GetMenu(word) GetMenu(1)
 158 pascal SetMenu(word word) SetMenu(1 2)
+171 pascal WinHelp(word word long) WinHelp(1 2 3)
 173 pascal LoadCursor(word ptr) LoadCursor(1 2)
 174 pascal LoadIcon(word ptr) LoadIcon(1 2)
 175 pascal LoadBitmap(word ptr) LoadBitmap(1 2)
@@ -81,27 +107,25 @@ length	540
 179 pascal GetSystemMetrics(word) GetSystemMetrics(1)
 180 pascal GetSysColor(word) GetSysColor(1)
 181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
-430 pascal lstrcmp(ptr ptr) lstrcmp(1 2)
-431 pascal AnsiUpper(ptr) AnsiUpper(1)
-432 pascal AnsiLower(ptr) AnsiLower(1)
-433 pascal IsCharAlpha(byte) IsCharAlpha(1)
-434 pascal IsCharAlphanumeric(byte) IsCharAlphanumeric(1)
-435 pascal IsCharUpper(byte) IsCharUpper(1)
-436 pascal IsCharLower(byte) IsCharLower(1)
-437 pascal AnsiUpperBuff(ptr word) AnsiUpperBuff(1 2)
-438 pascal AnsiLowerBuff(ptr word) AnsiLowerBuff(1 2)
-471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
-472 pascal AnsiNext(ptr) AnsiNext(1 )
-473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
-
-
-
-
 182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
+219 pascal CreateDialogIndirect(word ptr word ptr)
+	   CreateDialogIndirect(1 2 3 4)
+227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3)
+228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3)
+229 pascal GetTopWindow(word) GetTopWindow(1)
+230 pascal GetNextWindow(word word) GetNextWindow(1 2)
+232 pascal SetWindowPos(word word word word word word word) 
+           SetWindowPos(1 2 3 4 5 6 7)
 237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
+241 pascal CreateDialogParam(word ptr word ptr long)
+	   CreateDialogParam(1 2 3 4 5)
+242 pascal CreateDialogIndirectParam(word ptr word ptr long)
+	   CreateDialogIndirectParam(1 2 3 4 5)
 244 pascal EqualRect(ptr ptr) EqualRect(1 2)
+262 pascal GetWindow(word word) GetWindow(1 2)
 266 pascal SetMessageQueue(word) SetMessageQueue(1)
+277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
 286 pascal GetDesktopWindow() GetDesktopWindow()
 288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
@@ -111,4 +135,20 @@ length	540
 373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
 403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
 411 pascal AppendMenu(word word word ptr) AppendMenu(1 2 3 4)
+420 pascal wsprintf(ptr ptr) wsprintf(1 2)
 421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
+430 pascal lstrcmp(ptr ptr) lstrcmp(1 2)
+431 pascal AnsiUpper(ptr) AnsiUpper(1)
+432 pascal AnsiLower(ptr) AnsiLower(1)
+433 pascal IsCharAlpha(byte) IsCharAlpha(1)
+434 pascal IsCharAlphanumeric(byte) IsCharAlphanumeric(1)
+435 pascal IsCharUpper(byte) IsCharUpper(1)
+436 pascal IsCharLower(byte) IsCharLower(1)
+437 pascal AnsiUpperBuff(ptr word) AnsiUpperBuff(1 2)
+438 pascal AnsiLowerBuff(ptr word) AnsiLowerBuff(1 2)
+452 pascal CreateWindowEx(long ptr ptr long s_word s_word s_word s_word 
+	                  word word word ptr) 
+	   CreateWindowEx(1 2 3 4 5 6 7 8 9 10 11 12)
+471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
+472 pascal AnsiNext(ptr) AnsiNext(1 )
+473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
diff --git a/include/combo.h b/include/combo.h
new file mode 100644
index 0000000000000000000000000000000000000000..b6ea1d8b9b5e822c6677ccbb3dd37d03fba459d4
--- /dev/null
+++ b/include/combo.h
@@ -0,0 +1,15 @@
+/*
+ * Combo box definitions
+ */
+
+
+typedef struct tagHEADCOMBO {
+    DWORD	dwStyle;
+    DWORD	dwState;
+    HWND	hWndDrop;
+    HWND	hWndEdit;
+    HWND	hWndLBox;
+} HEADCOMBO;
+typedef HEADCOMBO FAR* LPHEADCOMBO;
+
+
diff --git a/include/dialog.h b/include/dialog.h
new file mode 100644
index 0000000000000000000000000000000000000000..190c8c97ed13d478abd70ecee0a57c29b7eb07aa
--- /dev/null
+++ b/include/dialog.h
@@ -0,0 +1,79 @@
+/*
+ * Dialog definitions
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+#ifndef DIALOG_H
+#define DIALOG_H
+
+#include "windows.h"
+
+#define DIALOG_CLASS_NAME    "#32770"  /* Integer atom */
+
+
+  /* Dialog info structure.
+   * This structure is stored into the window extra bytes (cbWndExtra).
+   * sizeof(DIALOGINFO) must be <= DLGWINDOWEXTRA (=30).
+   */
+typedef struct
+{
+    LONG      msgResult;
+    FARPROC   dlgProc;
+    LONG      userInfo;
+    HWND      hwndFocus;
+    HFONT     hUserFont;
+    HMENU     hMenu;
+    WORD      xBaseUnit;
+    WORD      yBaseUnit;
+    WORD      fEnd;
+} DIALOGINFO;
+
+
+  /* Dialog template header */
+typedef struct
+{
+    DWORD     style;    
+    BYTE      nbItems __attribute__ ((packed));
+    WORD      x __attribute__ ((packed));
+    WORD      y __attribute__ ((packed));
+    WORD      cx __attribute__ ((packed));
+    WORD      cy __attribute__ ((packed));
+} DLGTEMPLATEHEADER;
+
+
+  /* Dialog control header */
+typedef struct
+{
+    WORD       x;
+    WORD       y;
+    WORD       cx;
+    WORD       cy;
+    WORD       id;
+    DWORD      style __attribute__ ((packed));
+} DLGCONTROLHEADER;
+
+
+  /* Dialog control data */
+typedef struct
+{
+    DLGCONTROLHEADER * header;
+    LPSTR              class;
+    LPSTR              text;
+} DLGCONTROL;
+
+
+  /* Dialog template */
+typedef struct
+{
+    DLGTEMPLATEHEADER * header;
+    unsigned char *     menuName;
+    LPSTR               className;
+    LPSTR               caption;
+    WORD                pointSize;
+    LPSTR               faceName;
+    DLGCONTROL *        controls;
+} DLGTEMPLATE;
+
+
+#endif  /* DIALOG_H */
diff --git a/include/files.h b/include/files.h
new file mode 100644
index 0000000000000000000000000000000000000000..1b628a23d4fa4f9709967a7bb93b96a6e05998fe
--- /dev/null
+++ b/include/files.h
@@ -0,0 +1,17 @@
+#ifndef _FILES_H
+#define _FILES_H
+
+#define OPEN_MAX 256
+
+/***************************************************************************
+ This structure stores the infomation needed for a single DOS drive
+ ***************************************************************************/
+struct DosDriveStruct
+{
+  char RootDirectory [256];    /* Unix base for this drive letter */
+  char CurrentDirectory [256]; /* Current directory for this drive */
+  char VolumeLabel [11];
+  unsigned long	serialnumber;
+};
+
+#endif /*_FILES_H*/
diff --git a/include/int21.h b/include/int21.h
new file mode 100644
index 0000000000000000000000000000000000000000..92cabc559dac14a6305f94b9fe5e961f90ac09e6
--- /dev/null
+++ b/include/int21.h
@@ -0,0 +1,93 @@
+#ifndef INT21_H
+#define INT21_H
+
+#define DosVersion 	  0x0303;
+
+#define SectorSize 	  0x200;
+#define SectorsPerCluster 0x04;
+
+#define AX context->sc_eax
+#define BX context->sc_ebx
+#define CX context->sc_ecx
+#define DX context->sc_edx
+#define ES context->sc_es
+#define DS context->sc_ds
+#define DI context->sc_edi
+#define SI context->sc_esi
+
+#define pointer(a,b) 	(((unsigned int) a << 16) | b)
+#define segment(a) 	(a >> 16)
+#define offset(a)	(a & 0xffff)
+
+#define SetCflag	(context->sc_efl |= 0x00000001L)
+#define ResetCflag	(context->sc_efl &= 0xfffffffeL)
+
+struct diskinfo {
+	WORD	infolevel;
+	DWORD	serialnumber;
+	char	label[11];
+	char	fstype[8];
+};
+
+/* extended error codes */
+
+#define NoError		0x00
+#define InvalidFunction 0x01
+#define FileNotFound	0x02
+#define PathNotFound	0x03
+#define AccessDenied	0x05
+#define InvalidHandle	0x06
+#define MCBDestroyed	0x07
+#define	OutOfMemory	0x08
+#define MCBInvalid	0x09
+#define DataInvalid	0x0d
+#define InvalidDrive	0x0f
+#define CanNotRemoveCwd	0x10
+#define	NotSameDevice	0x11
+#define NoMoreFiles	0x12
+#define WriteProtected  0x13
+#define	UnknownUnit	0x14
+#define DriveNotReady	0x15
+#define UnknownCommand	0x16
+#define CRCError	0x17
+#define	BadRqLength	0x18
+#define SeekError	0x19
+#define	UnknownMedia	0x1a
+#define	SectorNotFound	0x1b
+#define OutOfPaper	0x1c
+#define WriteFault	0x1d
+#define ReadFault	0x1e
+#define	GeneralFailure	0x1f
+#define ShareViolation	0x20
+#define LockViolation	0x21
+#define DiskFull	0x27
+#define NoNetwork	0x49
+#define FileExists	0x50
+#define CanNotMakeDir	0x52
+
+/* Error classes */
+
+#define EC_Temporary	0x02
+#define EC_AccessDenied	0x03
+#define EC_AppError	0x04
+#define EC_SystemFailure 0x06
+#define EC_NotFound	0x08
+#define	EC_MediaError	0x0b
+#define EC_Exists	0x0c
+#define	EC_Unknown	0x0d
+
+/* Suggested actions */
+
+#define	SA_Retry	0x01
+#define SA_Abort	0x04
+#define SA_Ignore	0x06
+#define SA_Ask4Retry	0x07
+
+/* Error locus */
+
+#define EL_Unknown	0x01
+#define EL_Disk		0x02
+#define EL_Network	0x03
+#define EL_Memory	0x05
+
+#endif /* INT21_H */
diff --git a/include/listbox.h b/include/listbox.h
new file mode 100644
index 0000000000000000000000000000000000000000..f44cf8ce8ee461060fb3bb9035bfa9d80089a76f
--- /dev/null
+++ b/include/listbox.h
@@ -0,0 +1,31 @@
+/*
+ *   List Box definitions
+ */
+
+
+typedef struct tagLISTSTRUCT {
+    DRAWITEMSTRUCT 	dis;
+    HANDLE		hMem;
+    HANDLE		hData;
+    void		*lpNext;
+} LISTSTRUCT;
+typedef LISTSTRUCT FAR* LPLISTSTRUCT;
+
+
+typedef struct tagHEADLIST {
+    short	FirstVisible;
+    short	ItemSelect;
+    short	ItemsCount;
+    short	ItemsVisible;
+    short	ItemSelected;
+    short	PrevSelected;
+    short 	StdItemHeight;
+    short	DrawCtlType;
+    void	*lpFirst; 
+    DWORD	dwStyle;
+    HWND	hWndScroll;
+    HWND	hWndLogicParent;
+} HEADLIST;
+typedef HEADLIST FAR* LPHEADLIST;
+
+
diff --git a/include/prototypes.h b/include/prototypes.h
index 39560dd26772445c3350638eda9fe3462b78b754..c1c7bf9f4830261c924ccd37f1f29351cee1a350 100644
--- a/include/prototypes.h
+++ b/include/prototypes.h
@@ -30,5 +30,8 @@ extern struct segment_descriptor_s *GetNextSegment(unsigned int flags,
 extern struct mz_header_s *CurrentMZHeader;
 extern struct ne_header_s *CurrentNEHeader;
 extern int CurrentNEFile;
+extern do_int1A(struct sigcontext_struct * context);
+extern do_int21(struct sigcontext_struct * context);
 
 #endif /* PROTOTYPES_H */
+
diff --git a/include/regfunc.h b/include/regfunc.h
index 263675f65c117f085fbde51857eb4cda2dd90840..e31e9aa17e9ab965d741641c9bda3347fd9c48c9 100644
--- a/include/regfunc.h
+++ b/include/regfunc.h
@@ -6,16 +6,16 @@
 
 extern unsigned short *Stack16Frame;
 
-#define _AX	Stack16Frame[21]
-#define _BX	Stack16Frame[18]
-#define _CX	Stack16Frame[20]
-#define _DX	Stack16Frame[19]
-#define _SP	Stack16Frame[17]
-#define _BP	Stack16Frame[16]
-#define _SI	Stack16Frame[15]
-#define _DI	Stack16Frame[14]
-#define _DS	Stack16Frame[13]
-#define _ES	Stack16Frame[12]
+#define _AX	Stack16Frame[34]
+#define _BX	Stack16Frame[28]
+#define _CX	Stack16Frame[32]
+#define _DX	Stack16Frame[30]
+#define _SP	Stack16Frame[26]
+#define _BP	Stack16Frame[24]
+#define _SI	Stack16Frame[22]
+#define _DI	Stack16Frame[20]
+#define _DS	Stack16Frame[18]
+#define _ES	Stack16Frame[16]
 
 extern void ReturnFromRegisterFunc(void);
 
diff --git a/include/scroll.h b/include/scroll.h
new file mode 100644
index 0000000000000000000000000000000000000000..4dd4e7dc6c63e43aa10a9fa5f0b90ee35334d1d6
--- /dev/null
+++ b/include/scroll.h
@@ -0,0 +1,20 @@
+/*
+ *   Scroll Bar definitions
+ */
+
+
+typedef struct tagHEADSSCROLL {
+    short	CurVal;
+    short	MinVal;
+    short	MaxVal;
+    short	MaxPix;
+    short	CurPix;
+    BOOL	ThumbActive;
+    WORD	Direction;
+    DWORD	dwStyle;
+    HWND	hWndUp;
+    HWND	hWndDown;
+} HEADSCROLL;
+typedef HEADSCROLL FAR* LPHEADSCROLL;
+
+
diff --git a/include/windows.h b/include/windows.h
index 9c8e0d22993e1b30244c2c5ef5437705ff551b3f..dd937c5383e95fdf73424935c3c8cf67e7185a80 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -5,6 +5,7 @@
 
 #ifndef _WINARGS
 
+typedef unsigned short UINT;
 typedef unsigned short WORD;
 typedef unsigned long DWORD;
 #ifndef _WINMAIN
@@ -12,6 +13,61 @@ typedef unsigned short BOOL;
 typedef unsigned char BYTE;
 #endif
 typedef long LONG;
+typedef UINT WPARAM;
+typedef LONG LPARAM;
+typedef LONG LRESULT;
+typedef WORD HANDLE;
+#define DECLARE_HANDLE(a) typedef HANDLE a;
+
+DECLARE_HANDLE(HTASK);
+DECLARE_HANDLE(HDRVR);
+DECLARE_HANDLE(HWND);
+DECLARE_HANDLE(HDC);
+DECLARE_HANDLE(HCLASS);
+DECLARE_HANDLE(HCURSOR);
+DECLARE_HANDLE(HFONT);
+DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HRGN);
+DECLARE_HANDLE(HPALETTE);
+DECLARE_HANDLE(HICON);
+DECLARE_HANDLE(HINSTANCE);
+DECLARE_HANDLE(HMENU);
+DECLARE_HANDLE(HBITMAP);
+DECLARE_HANDLE(HBRUSH);
+DECLARE_HANDLE(LOCALHANDLE);
+
+typedef char *LPSTR;
+typedef const char *LPCSTR;
+typedef char *NPSTR;
+typedef short *LPINT;
+typedef void *LPVOID;
+typedef long (*FARPROC)();
+typedef int CATCHBUF[9];
+typedef int *LPCATCHBUF;
+
+#define TRUE 1
+#define FALSE 0
+#define CW_USEDEFAULT ((short)0x8000)
+#define FAR
+#define NEAR
+#define PASCAL
+#define VOID                void
+#define WINAPI              PASCAL
+#define CALLBACK            PASCAL
+#ifndef NULL
+#define NULL (void *)0
+#endif
+
+#define LOBYTE(w)           ((BYTE)(w))
+#define HIBYTE(w)           ((BYTE)((UINT)(w) >> 8))
+
+#define LOWORD(l)           ((WORD)(l))
+#define HIWORD(l)           ((WORD)((DWORD)(l) >> 16))
+
+#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
+
+/*
+typedef long LONG;
 typedef WORD HANDLE;
 typedef HANDLE HWND;
 typedef HANDLE HDC;
@@ -44,6 +100,7 @@ typedef int *LPCATCHBUF;
 #ifndef NULL
 #define NULL (void *)0
 #endif
+*/
 
 #define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \
 			      (((DWORD)((WORD)(high))) << 16)))
@@ -133,6 +190,46 @@ typedef struct {
 #define DWL_DLGPROC	    4
 #define DWL_USER	    8
 
+  /* GetWindow() constants */
+#define GW_HWNDFIRST	0
+#define GW_HWNDLAST	1
+#define GW_HWNDNEXT	2
+#define GW_HWNDPREV	3
+#define GW_OWNER	4
+#define GW_CHILD	5
+
+  /* Dialogs */
+
+  /* cbWndExtra bytes for dialog class */
+#define DLGWINDOWEXTRA      30
+
+  /* Dialog styles */
+#define DS_ABSALIGN         0x001
+#define DS_SYSMODAL         0x002
+#define DS_LOCALEDIT        0x020
+#define DS_SETFONT          0x040
+#define DS_MODALFRAME       0x080
+#define DS_NOIDLEMSG        0x100
+
+  /* Dialog messages */
+#define DM_GETDEFID         (WM_USER+0)
+#define DM_SETDEFID         (WM_USER+1)
+
+#define DC_HASDEFID         0x534b
+
+  /* WM_GETDLGCODE values */
+#define DLGC_WANTARROWS      0x0001
+#define DLGC_WANTTAB         0x0002
+#define DLGC_WANTALLKEYS     0x0004
+#define DLGC_WANTMESSAGE     0x0004
+#define DLGC_HASSETSEL       0x0008
+#define DLGC_DEFPUSHBUTTON   0x0010
+#define DLGC_UNDEFPUSHBUTTON 0x0020
+#define DLGC_RADIOBUTTON     0x0040
+#define DLGC_WANTCHARS       0x0080
+#define DLGC_STATIC          0x0100
+#define DLGC_BUTTON          0x2000
+
 
 typedef struct { short x, y; } POINT;
 typedef POINT *PPOINT;
@@ -787,6 +884,11 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 	WM_DELETEITEM, WM_VKEYTOITEM,
 	WM_CHARTOITEM, WM_SETFONT, WM_GETFONT };
 
+#define WM_NCCREATE         0x0081
+#define WM_NCDESTROY        0x0082
+
+#define WM_GETDLGCODE	    0x0087
+
   /* Keyboard messages */
 #define WM_KEYDOWN          0x0100
 #define WM_KEYUP            0x0101
@@ -798,11 +900,16 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define WM_SYSDEADCHAR      0x0107
 #define WM_KEYFIRST         WM_KEYDOWN
 #define WM_KEYLAST          0x0108
- 
+
+#define WM_INITDIALOG       0x0110 
 #define WM_COMMAND          0x0111
 #define WM_TIMER	    0x0113
 #define WM_SYSTIMER	    0x0118
 
+  /* scroll messages */
+#define WM_HSCROLL          0x0114
+#define WM_VSCROLL          0x0115
+
   /* Mouse messages */
 #define WM_MOUSEMOVE	    0x0200
 #define WM_LBUTTONDOWN	    0x0201
@@ -817,6 +924,13 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define WM_MOUSEFIRST	    WM_MOUSEMOVE
 #define WM_MOUSELAST	    WM_MBUTTONDBLCLK
 
+#define WM_PARENTNOTIFY     0x0210
+
+  /* misc messages */
+#define WM_NULL             0x0000
+#define WM_USER             0x0400
+
+
   /* Key status flags for mouse events */
 #define MK_LBUTTON	    0x0001
 #define MK_RBUTTON	    0x0002
@@ -851,6 +965,30 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
 #define SIZE_MAXSHOW         3
 #define SIZE_MAXHIDE         4
 
+/* SetWindowPos() and WINDOWPOS flags */
+#define SWP_NOSIZE          0x0001
+#define SWP_NOMOVE          0x0002
+#define SWP_NOZORDER        0x0004
+#define SWP_NOREDRAW        0x0008
+#define SWP_NOACTIVATE      0x0010
+#define SWP_FRAMECHANGED    0x0020  /* The frame changed: send WM_NCCALCSIZE */
+#define SWP_SHOWWINDOW      0x0040
+#define SWP_HIDEWINDOW      0x0080
+#define SWP_NOCOPYBITS      0x0100
+#define SWP_NOOWNERZORDER   0x0200  /* Don't do owner Z ordering */
+
+#define SWP_DRAWFRAME       SWP_FRAMECHANGED
+#define SWP_NOREPOSITION    SWP_NOOWNERZORDER
+
+#define SWP_NOSENDCHANGING  0x0400
+#define SWP_DEFERERASE      0x2000
+
+/* SetWindowPos() hwndInsertAfter field values */
+#define HWND_TOP            ((HWND)0)
+#define HWND_BOTTOM         ((HWND)1)
+#define HWND_TOPMOST        ((HWND)-1)
+#define HWND_NOTOPMOST      ((HWND)-2)
+
 
 #define MF_INSERT 0
 #define MF_CHANGE 0x0080
@@ -934,6 +1072,13 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
 #define WS_CHILDWINDOW (WS_CHILD)
 #define WS_TILEDWINDOW (WS_OVERLAPPEDWINDOW)
 
+/* Window extended styles */
+#define WS_EX_DLGMODALFRAME    0x00000001L
+#define WS_EX_NOPARENTNOTIFY   0x00000004L
+#define WS_EX_TOPMOST          0x00000008L
+#define WS_EX_ACCEPTFILES      0x00000010L
+#define WS_EX_TRANSPARENT      0x00000020L
+
 /* Button control styles */
 #define BS_PUSHBUTTON          0x00000000L
 #define BS_DEFPUSHBUTTON       0x00000001L
@@ -948,16 +1093,310 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
 #define BS_OWNERDRAW           0x0000000BL
 #define BS_LEFTTEXT            0x00000020L
 
+/* Button control messages */
+#define BM_GETCHECK            (WM_USER+0)
+#define BM_SETCHECK            (WM_USER+1)
+#define BM_GETSTATE            (WM_USER+2)
+#define BM_SETSTATE            (WM_USER+3)
+#define BM_SETSTYLE            (WM_USER+4)
+
 /* Button notification codes */
 #define BN_CLICKED             0
 #define BN_PAINT               1
 #define BN_HILITE              2
-#define BN_UNLITE              3
+#define BN_UNHILITE            3
 #define BN_DISABLE             4
 #define BN_DOUBLECLICKED       5
 
+/* Static Control Styles */
+#define SS_LEFT             0x00000000L
+#define SS_CENTER           0x00000001L
+#define SS_RIGHT            0x00000002L
+#define SS_ICON             0x00000003L
+#define SS_BLACKRECT        0x00000004L
+#define SS_GRAYRECT         0x00000005L
+#define SS_WHITERECT        0x00000006L
+#define SS_BLACKFRAME       0x00000007L
+#define SS_GRAYFRAME        0x00000008L
+#define SS_WHITEFRAME       0x00000009L
+#define SS_SIMPLE           0x0000000BL
+#define SS_LEFTNOWORDWRAP   0x0000000CL
+#define SS_NOPREFIX         0x00000080L
+
+/* Static Control Mesages */
+#define STM_SETICON         (WM_USER+0)
+#define STM_GETICON         (WM_USER+1)
+
+/* WM_H/VSCROLL commands */
+#define SB_LINEUP           0
+#define SB_LINELEFT         0
+#define SB_LINEDOWN         1
+#define SB_LINERIGHT        1
+#define SB_PAGEUP           2
+#define SB_PAGELEFT         2
+#define SB_PAGEDOWN         3
+#define SB_PAGERIGHT        3
+#define SB_THUMBPOSITION    4
+#define SB_THUMBTRACK       5
+#define SB_TOP              6
+#define SB_LEFT             6
+#define SB_BOTTOM           7
+#define SB_RIGHT            7
+#define SB_ENDSCROLL        8
+
+/* Scroll bar selection constants */
+#define SB_HORZ             0
+#define SB_VERT             1
+#define SB_CTL              2
+#define SB_BOTH             3
+
+/* Scrollbar styles */
+#define SBS_HORZ                    0x0000L
+#define SBS_VERT                    0x0001L
+#define SBS_TOPALIGN                0x0002L
+#define SBS_LEFTALIGN               0x0002L
+#define SBS_BOTTOMALIGN             0x0004L
+#define SBS_RIGHTALIGN              0x0004L
+#define SBS_SIZEBOXTOPLEFTALIGN     0x0002L
+#define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L
+#define SBS_SIZEBOX                 0x0008L
+
+/* EnableScrollBar() flags */
+#define ESB_ENABLE_BOTH     0x0000
+#define ESB_DISABLE_BOTH    0x0003
+
+#define ESB_DISABLE_LEFT    0x0001
+#define ESB_DISABLE_RIGHT   0x0002
+
+#define ESB_DISABLE_UP      0x0001
+#define ESB_DISABLE_DOWN    0x0002
+
+#define ESB_DISABLE_LTUP    ESB_DISABLE_LEFT
+#define ESB_DISABLE_RTDN    ESB_DISABLE_RIGHT
+
+/* Listbox styles */
+#define LBS_NOTIFY            0x0001L
+#define LBS_SORT              0x0002L
+#define LBS_NOREDRAW          0x0004L
+#define LBS_MULTIPLESEL       0x0008L
+#define LBS_OWNERDRAWFIXED    0x0010L
+#define LBS_OWNERDRAWVARIABLE 0x0020L
+#define LBS_HASSTRINGS        0x0040L
+#define LBS_USETABSTOPS       0x0080L
+#define LBS_NOINTEGRALHEIGHT  0x0100L
+#define LBS_MULTICOLUMN       0x0200L
+#define LBS_WANTKEYBOARDINPUT 0x0400L
+#define LBS_EXTENDEDSEL       0x0800L
+#define LBS_DISABLENOSCROLL   0x1000L
+#define LBS_STANDARD          (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
+
+/* Listbox messages */
+#define LB_ADDSTRING           (WM_USER+1)
+#define LB_INSERTSTRING        (WM_USER+2)
+#define LB_DELETESTRING        (WM_USER+3)
+#define LB_RESETCONTENT        (WM_USER+5)
+#define LB_SETSEL              (WM_USER+6)
+#define LB_SETCURSEL           (WM_USER+7)
+#define LB_GETSEL              (WM_USER+8)
+#define LB_GETCURSEL           (WM_USER+9)
+#define LB_GETTEXT             (WM_USER+10)
+#define LB_GETTEXTLEN          (WM_USER+11)
+#define LB_GETCOUNT            (WM_USER+12)
+#define LB_SELECTSTRING        (WM_USER+13)
+#define LB_DIR                 (WM_USER+14)
+#define LB_GETTOPINDEX         (WM_USER+15)
+#define LB_FINDSTRING          (WM_USER+16)
+#define LB_GETSELCOUNT         (WM_USER+17)
+#define LB_GETSELITEMS         (WM_USER+18)
+#define LB_SETTABSTOPS         (WM_USER+19)
+#define LB_GETHORIZONTALEXTENT (WM_USER+20)
+#define LB_SETHORIZONTALEXTENT (WM_USER+21)
+#define LB_SETCOLUMNWIDTH      (WM_USER+22)
+#define LB_SETTOPINDEX         (WM_USER+24)
+#define LB_GETITEMRECT         (WM_USER+25)
+#define LB_GETITEMDATA         (WM_USER+26)
+#define LB_SETITEMDATA         (WM_USER+27)
+#define LB_SELITEMRANGE        (WM_USER+28)
+#define LB_SETCARETINDEX       (WM_USER+31)
+#define LB_GETCARETINDEX       (WM_USER+32)
+#define LB_SETITEMHEIGHT       (WM_USER+33)
+#define LB_GETITEMHEIGHT       (WM_USER+34)
+#define LB_FINDSTRINGEXACT     (WM_USER+35)
+
+/* Listbox notification codes */
+#define LBN_ERRSPACE        (-2)
+#define LBN_SELCHANGE       1
+#define LBN_DBLCLK          2
+#define LBN_SELCANCEL       3
+#define LBN_SETFOCUS        4
+#define LBN_KILLFOCUS       5
+
+/* Listbox notification messages */
+#define WM_VKEYTOITEM       0x002E
+#define WM_CHARTOITEM       0x002F
+
+/* Listbox message return values */
+#define LB_OKAY             0
+#define LB_ERR              (-1)
+#define LB_ERRSPACE         (-2)
+
+#define LB_CTLCODE          0L
+
+/* Combo box styles */
+#define CBS_SIMPLE            0x0001L
+#define CBS_DROPDOWN          0x0002L
+#define CBS_DROPDOWNLIST      0x0003L
+#define CBS_OWNERDRAWFIXED    0x0010L
+#define CBS_OWNERDRAWVARIABLE 0x0020L
+#define CBS_AUTOHSCROLL       0x0040L
+#define CBS_OEMCONVERT        0x0080L
+#define CBS_SORT              0x0100L
+#define CBS_HASSTRINGS        0x0200L
+#define CBS_NOINTEGRALHEIGHT  0x0400L
+#define CBS_DISABLENOSCROLL   0x0800L
+
+/* Combo box messages */
+#define CB_GETEDITSEL            (WM_USER+0)
+#define CB_LIMITTEXT             (WM_USER+1)
+#define CB_SETEDITSEL            (WM_USER+2)
+#define CB_ADDSTRING             (WM_USER+3)
+#define CB_DELETESTRING          (WM_USER+4)
+#define CB_DIR                   (WM_USER+5)
+#define CB_GETCOUNT              (WM_USER+6)
+#define CB_GETCURSEL             (WM_USER+7)
+#define CB_GETLBTEXT             (WM_USER+8)
+#define CB_GETLBTEXTLEN          (WM_USER+9)
+#define CB_INSERTSTRING          (WM_USER+10)
+#define CB_RESETCONTENT          (WM_USER+11)
+#define CB_FINDSTRING            (WM_USER+12)
+#define CB_SELECTSTRING          (WM_USER+13)
+#define CB_SETCURSEL             (WM_USER+14)
+#define CB_SHOWDROPDOWN          (WM_USER+15)
+#define CB_GETITEMDATA           (WM_USER+16)
+#define CB_SETITEMDATA           (WM_USER+17)
+#define CB_GETDROPPEDCONTROLRECT (WM_USER+18)
+#define CB_SETITEMHEIGHT         (WM_USER+19)
+#define CB_GETITEMHEIGHT         (WM_USER+20)
+#define CB_SETEXTENDEDUI         (WM_USER+21)
+#define CB_GETEXTENDEDUI         (WM_USER+22)
+#define CB_GETDROPPEDSTATE       (WM_USER+23)
+#define CB_FINDSTRINGEXACT       (WM_USER+24)
+
+/* Combo box notification codes */
+#define CBN_ERRSPACE        (-1)
+#define CBN_SELCHANGE       1
+#define CBN_DBLCLK          2
+#define CBN_SETFOCUS        3
+#define CBN_KILLFOCUS       4
+#define CBN_EDITCHANGE      5
+#define CBN_EDITUPDATE      6
+#define CBN_DROPDOWN        7
+#define CBN_CLOSEUP         8
+#define CBN_SELENDOK        9
+#define CBN_SELENDCANCEL    10
+
+/* Combo box message return values */
+#define CB_OKAY             0
+#define CB_ERR              (-1)
+#define CB_ERRSPACE         (-2)
+
+
+/* Owner draw control types */
+#define ODT_MENU        1
+#define ODT_LISTBOX     2
+#define ODT_COMBOBOX    3
+#define ODT_BUTTON      4
+
+/* Owner draw actions */
+#define ODA_DRAWENTIRE  0x0001
+#define ODA_SELECT      0x0002
+#define ODA_FOCUS       0x0004
+
+/* Owner draw state */
+#define ODS_SELECTED    0x0001
+#define ODS_GRAYED      0x0002
+#define ODS_DISABLED    0x0004
+#define ODS_CHECKED     0x0008
+#define ODS_FOCUS       0x0010
+
+#define WM_DRAWITEM         0x002B
+
+typedef struct tagDRAWITEMSTRUCT
+{
+    UINT        CtlType;
+    UINT        CtlID;
+    UINT        itemID;
+    UINT        itemAction;
+    UINT        itemState;
+    HWND        hwndItem;
+    HDC         hDC;
+    RECT        rcItem;
+    DWORD       itemData;
+} DRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT;
+typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
+
+#define WM_MEASUREITEM      0x002C
+
+typedef struct tagMEASUREITEMSTRUCT
+{
+    UINT        CtlType;
+    UINT        CtlID;
+    UINT        itemID;
+    UINT        itemWidth;
+    UINT        itemHeight;
+    DWORD       itemData;
+} MEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT NEAR* PMEASUREITEMSTRUCT;
+typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT;
+
+#define WM_DELETEITEM       0x002D
+
+typedef struct tagDELETEITEMSTRUCT
+{
+    UINT       CtlType;
+    UINT       CtlID;
+    UINT       itemID;
+    HWND       hwndItem;
+    DWORD      itemData;
+} DELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT NEAR* PDELETEITEMSTRUCT;
+typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT;
+
+#define WM_COMPAREITEM      0x0039
+
+typedef struct tagCOMPAREITEMSTRUCT
+{
+    UINT        CtlType;
+    UINT        CtlID;
+    HWND        hwndItem;
+    UINT        itemID1;
+    DWORD       itemData1;
+    UINT        itemID2;
+    DWORD       itemData2;
+} COMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
+typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
+
+  
+#define LMEM_MOVEABLE   0x0002
+
+#define GMEM_FIXED          0x0000
+#define GMEM_MOVEABLE       0x0002
+#define GMEM_NOCOMPACT      0x0010
+#define GMEM_NODISCARD      0x0020
+#define GMEM_ZEROINIT       0x0040
+#define GMEM_MODIFY         0x0080
+#define GMEM_DISCARDABLE    0x0100
+#define GMEM_NOT_BANKED     0x1000
+#define GMEM_SHARE          0x2000
+#define GMEM_DDESHARE       0x2000
+#define GMEM_NOTIFY         0x4000
+#define GMEM_LOWER          GMEM_NOT_BANKED
+
+#define GHND                (GMEM_MOVEABLE | GMEM_ZEROINIT)
+#define GPTR                (GMEM_FIXED | GMEM_ZEROINIT)
 
-#define GMEM_MOVEABLE	0x0002
 
 #define F(ret,name) ret name(void);
 #define Fa(ret,name,t1,a1) ret name(t1 a1);
@@ -991,6 +1430,7 @@ F(BOOL,CloseClipboard)
 F(BOOL,EmptyClipboard)
 F(BOOL,InSendMessage)
 F(DWORD,GetCurrentTime)
+F(DWORD,GetDialogBaseUnits)
 F(DWORD,GetTickCount)
 F(HANDLE,GetCurrentTask)
 F(HMENU,CreatePopupMenu)
@@ -1020,7 +1460,6 @@ F(int,ProfInsChk)
 F(int,StartSound)
 F(int,StopSound)
 F(int,SyncAllVoices)
-F(long,GetDialogBaseUnits)
 F(void,CloseSound)
 F(void,DebugBreak)
 F(void,DestroyCaret)
@@ -1043,7 +1482,7 @@ Fa(void,PostQuitMessage,int,a)
 Fa(BOOL,SetMessageQueue,int,a)
 Fa(int,_lclose,int,a)
 Fb(int,_lopen,LPSTR,a,int,b)
-Fa(int,lstrlen,LPSTR,a)
+Fa(int,lstrlen,LPCSTR,a)
 Fa(LONG,DispatchMessage,LPMSG,msg)
 Fa(void,UpdateWindow,HWND,a)
 Fa(ATOM,AddAtom,LPSTR,a)
@@ -1230,11 +1669,11 @@ Fb(BOOL,ExitWindows,DWORD,dwReserved,WORD,wReturnCode)
 Fb(BOOL,GetBitmapDimensionEx,HBITMAP,a,LPSIZE,b)
 Fb(BOOL,ShowWindow,HWND,a,int,b) 
 Fb(HDC,BeginPaint,HWND,a,LPPAINTSTRUCT,b) 
-Fb(LPSTR,lstrcat,LPSTR,a,LPSTR,b )
-Fb(LPSTR,lstrcpy,LPSTR,a,LPSTR,b )
+Fb(LPSTR,lstrcat,LPSTR,a,LPCSTR,b )
+Fb(LPSTR,lstrcpy,LPSTR,a,LPCSTR,b )
 Fb(int,_lcreat,LPSTR,a,int,b)
-Fb(int,lstrcmp,LPSTR,a,LPSTR,b )
-Fb(int,lstrcmpi,LPSTR,a,LPSTR,b )
+Fb(int,lstrcmp,LPCSTR,a,LPCSTR,b )
+Fb(int,lstrcmpi,LPCSTR,a,LPCSTR,b )
 Fb(void,EndPaint,HWND,a,LPPAINTSTRUCT,b)
 Fb(void,GetClientRect,HWND,a,LPRECT,b)
 Fb(void,SetDCState,HDC,a,HDC,b)
@@ -1291,7 +1730,7 @@ Fb(HMENU,GetSystemMenu,HWND,a,BOOL,b)
 Fb(HMENU,LoadMenu,HANDLE,a,LPSTR,b)
 Fb(HWND,ChildWindowFromPoint,HWND,a,POINT,b)
 Fb(HWND,FindWindow,LPSTR,a,LPSTR,b)
-Fb(HWND,GetDlgItem,HWND,a,int,b)
+Fb(HWND,GetDlgItem,HWND,a,WORD,b)
 Fb(HWND,GetNextWindow,HWND,a,WORD,b)
 Fb(HWND,GetWindow,HWND,a,WORD,b)
 Fb(BOOL,GetCurrentPositionEx,HDC,a,LPPOINT,b)
@@ -1315,7 +1754,7 @@ Fb(WORD,GetSystemDirectory,LPSTR,a,WORD,b)
 Fb(WORD,GetSystemPaletteUse,HDC,a,WORD,b)
 Fb(WORD,GetWindowWord,HWND,a,short,b)
 Fb(WORD,GetWindowsDirectory,LPSTR,a,WORD,b)
-Fb(WORD,IsDlgButtonChecked,HWND,a,int,b)
+Fb(WORD,IsDlgButtonChecked,HWND,a,WORD,b)
 Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
 Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
 Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
@@ -1349,7 +1788,7 @@ Fb(int,UngetCommChar,int,a,char,b)
 Fb(short,SetTextCharacterExtra,HDC,a,short,b)
 Fb(void,ClientToScreen,HWND,a,LPPOINT,b)
 Fb(void,DrawFocusRect,HDC,a,LPRECT,b)
-Fb(void,EndDialog,HWND,a,int,b)
+Fb(void,EndDialog,HWND,a,short,b)
 Fb(void,GetCodeInfo,FARPROC,lpProc,LPVOID,lpSegInfo)
 Fb(void,GetWindowRect,HWND,a,LPRECT,b)
 Fb(void,InvertRect,HDC,a,LPRECT,b)
@@ -1457,13 +1896,13 @@ Fc(int,wvsprintf,LPSTR,a,LPSTR,b,LPSTR,c)
 Fc(short,SetTextJustification,HDC,a,short,b,short,c)
 Fc(void,AdjustWindowRect,LPRECT,a,DWORD,b,BOOL,c)
 Fc(void,AnsiToOemBuff,LPSTR,a,LPSTR,b,int,c)
-Fc(void,CheckDlgButton,HWND,a,int,b,WORD,c)
+Fc(void,CheckDlgButton,HWND,a,WORD,b,WORD,c)
 Fc(void,InflateRect,LPRECT,a,short,b,short,c)
 Fc(void,InvalidateRect,HWND,a,LPRECT,b,BOOL,c)
 Fc(void,InvalidateRgn,HWND,a,HRGN,b,BOOL,c)
 Fc(void,OemToAnsiBuff,LPSTR,a,LPSTR,b,int,c)
 Fc(void,OffsetRect,LPRECT,a,short,b,short,c)
-Fc(void,SetDlgItemText,HWND,a,int,b,LPSTR,c)
+Fc(void,SetDlgItemText,HWND,a,WORD,b,LPSTR,c)
 Fc(void,SetSysColors,int,a,LPINT,b,COLORREF*,c)
 Fc(void,ShowScrollBar,HWND,a,WORD,b,BOOL,c)
 Fc(void,SwitchStackTo,WORD,a,WORD,b,WORD,c)
@@ -1490,12 +1929,12 @@ Fd(HDC,CreateIC,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d)
 Fd(HRGN,CreateEllipticRgn,short,a,short,b,short,c,short,d)
 Fd(HRGN,CreatePolyPolygonRgn,LPPOINT,a,LPINT,b,short,c,short,d)
 Fd(HRGN,CreateRectRgn,short,a,short,b,short,c,short,d)
-Fd(HWND,CreateDialog,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d)
-Fd(HWND,CreateDialogIndirect,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d)
+Fd(HWND,CreateDialog,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d)
+Fd(HWND,CreateDialogIndirect,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d)
 Fd(LONG,DefDlgProc,HWND,a,WORD,b,WORD,c,LONG,d)
 Fd(LONG,DefMDIChildProc,HWND,a,WORD,b,WORD,c,LONG,d)
 Fd(LONG,DefWindowProc,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(WORD,GetDlgItemInt,HWND,a,int,b,BOOL FAR*,c,BOOL,d)
+Fd(WORD,GetDlgItemInt,HWND,a,WORD,b,BOOL FAR*,c,BOOL,d)
 Fd(WORD,GetPaletteEntries,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
 Fd(WORD,GetPrivateProfileInt,LPSTR,a,LPSTR,b,short,c,LPSTR,d)
 Fd(WORD,GetSystemPaletteEntries,HDC,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
@@ -1508,11 +1947,11 @@ Fd(BOOL,SetWindowOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
 Fd(BOOL,OffsetViewportOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
 Fd(BOOL,OffsetWindowOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
 Fd(int,CombineRgn,HRGN,a,HRGN,b,HRGN,c,short,d)
-Fd(int,DialogBox,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d)
+Fd(int,DialogBox,HINSTANCE,a,LPCSTR,b,HWND,c,FARPROC,d)
 Fd(int,DialogBoxIndirect,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d)
 Fd(int,EnumFonts,HDC,a,LPSTR,b,FARPROC,c,LPSTR,d)
 Fd(int,EnumObjects,HDC,a,int,b,FARPROC,c,LPSTR,d)
-Fd(int,GetDlgItemText,HWND,a,int,b,LPSTR,c,int,d)
+Fd(int,GetDlgItemText,HWND,a,WORD,b,LPSTR,c,WORD,d)
 Fd(int,GetTempFileName,BYTE,a,LPSTR,b,WORD,c,LPSTR,d)
 Fd(int,LoadString,HANDLE,a,WORD,b,LPSTR,c,int,d)
 Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d)
@@ -1520,12 +1959,12 @@ Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d)
 Fd(int,SetVoiceNote,int,a,int,b,int,c,int,d)
 Fd(void,AdjustWindowRectEx,LPRECT,a,LONG,b,BOOL,c,DWORD,d)
 Fd(void,AnimatePalette,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
-Fd(void,CheckRadioButton,HWND,a,int,b,int,c,int,d)
+Fd(void,CheckRadioButton,HWND,a,WORD,b,WORD,c,WORD,d)
 Fd(void,CreateCaret,HWND,a,HBITMAP,b,int,c,int,d)
 Fd(void,FillWindow,HWND,a,HWND,b,HDC,c,HBRUSH,d)
 Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
 Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
-Fd(void,SetDlgItemInt,HWND,a,int,b,WORD,c,BOOL,d)
+Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
 Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
 Fe(int,DrawText,HDC,a,LPSTR,str,int,c,LPRECT,d,WORD,flag)
 Fe(BOOL,PeekMessage,LPMSG,a,HWND,b,WORD,c,WORD,d,WORD,e)
@@ -1542,10 +1981,10 @@ Fe(DWORD,GetTabbedTextExtent,HDC,a,LPSTR,b,int,c,int,d,LPINT,e)
 Fe(DWORD,ScaleViewportExt,HDC,a,short,b,short,c,short,d,short,e)
 Fe(DWORD,ScaleWindowExt,HDC,a,short,b,short,c,short,d,short,e)
 Fe(HBITMAP,CreateBitmap,short,a,short,b,BYTE,c,BYTE,d,LPSTR,e)
-Fe(HWND,CreateDialogIndirectParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e)
-Fe(HWND,CreateDialogParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e)
+Fe(HWND,CreateDialogIndirectParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LPARAM,e)
+Fe(HWND,CreateDialogParam,HANDLE,a,LPCSTR,b,HWND,c,FARPROC,d,LPARAM,e)
 Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e)
-Fe(LONG,SendDlgItemMessage,HWND,a,int,b,WORD,c,WORD,d,LONG,e)
+Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e)
 Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d,LONG,e)
 Fe(int,DialogBoxParam,HANDLE,a,LPSTR,b,HWND,c,FARPROC,d,LONG,e)
 Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
@@ -1579,7 +2018,7 @@ Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g)
 Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
 Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
 Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
-Fg(void,SetWindowPos,HWND,a,HWND,b,int,c,int,d,int,e,int,f,WORD,g)
+Fg(void,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
 Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
 Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
 Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
diff --git a/include/wine.h b/include/wine.h
index afe11d6a96499c691fa17938e791c140c91ea3de..6a602e9da406dee49a030cc3ce3449db98859e22 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -22,5 +22,40 @@ extern struct  w_files * wine_files;
 
 extern char *GetFilenameFromInstance(unsigned short instance);
 extern struct w_files *GetFileInfo(unsigned short instance);
+extern char *FindFileInPath(char *buffer, int buflen, char *rootname, 
+			    char **extensions, char *path);
+extern char *GetSystemIniFilename(void);
+#ifdef linux
+struct sigcontext_struct {
+	unsigned short sc_gs, __gsh;
+	unsigned short sc_fs, __fsh;
+	unsigned short sc_es, __esh;
+	unsigned short sc_ds, __dsh;
+	unsigned long sc_edi;
+	unsigned long sc_esi;
+	unsigned long sc_ebp;
+	unsigned long sc_esp;
+	unsigned long sc_ebx;
+	unsigned long sc_edx;
+	unsigned long sc_ecx;
+	unsigned long sc_eax;
+	unsigned long sc_trapno;
+	unsigned long sc_err;
+	unsigned long sc_eip;
+	unsigned short sc_cs, __csh;
+	unsigned long sc_efl;
+	unsigned long esp_at_signal;
+	unsigned short sc_ss, __ssh;
+	unsigned long i387;
+	unsigned long oldmask;
+	unsigned long cr2;
+};
+#endif
 
+#ifdef __NetBSD__
+#include <signal.h>
+#define sigcontext_struct sigcontext
+#define HZ 100
 #endif
+
+#endif /* WINE_H */
diff --git a/loader/Makefile b/loader/Makefile
index a48a74922b218c23c82c42d58a29f4ee8d4f3b3c..662b5975af7b941d9a089ba2ac6afa78d8dfbcb5 100644
--- a/loader/Makefile
+++ b/loader/Makefile
@@ -1,6 +1,7 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
+CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
 
-OBJS=dump.o ldt.o ldtlib.o resource.o selector.o signal.o wine.o
+OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \
+     int21.o wine.o
 
 default: loader.o
 
@@ -8,7 +9,7 @@ loader.o: $(OBJS)
 	$(LD) -r -o loader.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/loader/files.c b/loader/files.c
new file mode 100644
index 0000000000000000000000000000000000000000..8bf3fbb23b3cab315dcba9b990305484745e57ee
--- /dev/null
+++ b/loader/files.c
@@ -0,0 +1,108 @@
+static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
+static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
+
+#include <stdlib.h>
+#include <dirent.h>
+#include <string.h>
+
+/**********************************************************************
+ *					FindFileInPath
+ */
+char *
+FindFileInPath(char *buffer, int buflen, char *rootname, 
+	       char **extensions, char *path)
+{
+    char *workingpath;
+    char *dirname;
+    DIR *d;
+    struct dirent *f;
+    char **e;
+    int rootnamelen;
+    int found = 0;
+
+    if (strchr(rootname, '/') != NULL)
+    {
+	strncpy(buffer, rootname, buflen);
+	return buffer;
+    }
+
+    rootnamelen = strlen(rootname);
+    workingpath = malloc(strlen(path) + 1);
+    if (workingpath == NULL)
+	return NULL;
+    strcpy(workingpath, path);
+    
+    for(dirname = strtok(workingpath, ":;"); 
+	dirname != NULL;
+	dirname = strtok(NULL, ":;"))
+    {
+	d = opendir(dirname);
+	if (d != NULL)
+	{
+	    while ((f = readdir(d)) != NULL)
+	    {
+		if (strncasecmp(rootname, f->d_name, rootnamelen) == 0)
+		{
+		    if (extensions == NULL || 
+			strcasecmp(rootname, f->d_name) == 0)
+		    {
+			found = 1;
+		    }
+		    else if (f->d_name[rootnamelen] == '.')
+		    {
+			for (e = extensions; *e != NULL; e++)
+			{
+			    if (strcasecmp(*e, f->d_name + rootnamelen + 1) 
+				== 0)
+			    {
+				found = 1;
+				break;
+			    }
+			}
+		    }
+		    
+		    if (found)
+		    {
+			strncpy(buffer, dirname, buflen);
+			strncat(buffer, "/", buflen - strlen(buffer));
+			strncat(buffer, f->d_name, buflen - strlen(buffer));
+			return buffer;
+		    }
+		}
+	    }
+	    closedir(d);
+	}
+    }
+
+    return NULL;
+}
+
+/**********************************************************************
+ *					GetSystemIniFilename
+ */
+char *
+GetSystemIniFilename()
+{
+    static char *IniName = NULL;
+    char inipath[256];
+    
+    if (IniName)
+	return IniName;
+
+    getcwd(inipath, 256);
+    strcat(inipath, ":");
+    strcat(inipath, getenv("HOME"));
+    strcat(inipath, ":");
+    strcat(inipath, getenv("WINEPATH"));
+    
+    IniName = malloc(1024);
+    if (FindFileInPath(IniName, 1024, "wine.ini", NULL, inipath) == NULL)
+    {
+	free(IniName);
+	IniName = NULL;
+	return NULL;
+    }
+    
+    IniName = realloc(IniName, strlen(IniName) + 1);
+    return IniName;
+}
diff --git a/loader/int1a.c b/loader/int1a.c
new file mode 100644
index 0000000000000000000000000000000000000000..2441d77f52634ab1487a951f6ba764ffffa93bc2
--- /dev/null
+++ b/loader/int1a.c
@@ -0,0 +1,58 @@
+#include <time.h>
+#include <stdio.h>
+#include "wine.h"
+
+#ifdef linux
+#include <linux/sched.h> /* needed for HZ */
+#endif
+
+#define	BCD_TO_BIN(x) ((x&15) + (x>>4)*10)
+#define BIN_TO_BCD(x) ((x%10) + ((x/10)<<4))
+
+int do_int1A(struct sigcontext_struct * context){
+	time_t ltime;
+	struct tm *bdtime;
+	int ticks;
+
+	switch((context->sc_eax >> 8) & 0xff){
+	case 0:
+		ltime = time(NULL);
+		ticks = (int) (ltime * HZ);
+		context->sc_ecx = ticks >> 16;
+		context->sc_edx = ticks & 0x0000FFFF;
+		context->sc_eax = 0;  /* No midnight rollover */
+		break;
+		
+	case 2: 
+		ltime = time(NULL);
+		bdtime = localtime(&ltime);
+		
+		context->sc_ecx = (BIN_TO_BCD(bdtime->tm_hour)<<8) | BIN_TO_BCD(bdtime->tm_min);
+		context->sc_edx = (BIN_TO_BCD(bdtime->tm_sec)<<8);
+
+	case 4:
+		ltime = time(NULL);
+		bdtime = localtime(&ltime);
+		context->sc_ecx = (BIN_TO_BCD(bdtime->tm_year/100)<<8) | BIN_TO_BCD((bdtime->tm_year-1900)%100);
+		context->sc_edx = (BIN_TO_BCD(bdtime->tm_mon)<<8) | BIN_TO_BCD(bdtime->tm_mday);
+		break;
+
+		/* setting the time,date or RTC is not allow -EB */
+	case 1:
+		/* set system time */
+	case 3: 
+		/* set RTC time */
+	case 5:
+		/* set RTC date */
+	case 6:
+		/* set ALARM */
+	case 7:
+		/* cancel ALARM */
+		break;
+
+	default:
+		fprintf(stderr,"Unable to handle int 0x1A AX %x\n", context->sc_eax);
+		return 1;
+	};
+	return 1;
+}
diff --git a/loader/int21.c b/loader/int21.c
new file mode 100644
index 0000000000000000000000000000000000000000..968801b34f0b29bb5de2cf20ca5d66faabd1f525
--- /dev/null
+++ b/loader/int21.c
@@ -0,0 +1,1205 @@
+#include <time.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#ifdef linux
+#include <sys/vfs.h>
+#endif
+#ifdef __NetBSD__
+#include <sys/mount.h>
+#endif
+#include <time.h>
+#include <unistd.h>
+#include <utime.h>
+
+#include "windows.h"
+#include "wine.h"
+#include "int21.h"
+#include "files.h"
+
+#define MAX_DRIVES 26
+
+static char Copyright[] = "int21.c, copyright Erik Bos, 1993";
+
+extern struct DosDriveStruct DosDrives[];
+extern int CurrentDrive;
+extern void ParseDOSFileName();
+
+int ValidDrive(int);
+
+WORD ExtendedError, CodePage = 437;
+BYTE ErrorClass, Action, ErrorLocus;
+
+void Error(int e, int class, int el)
+{
+	ExtendedError = e;
+	ErrorClass = class;
+	Action = SA_Ask4Retry;
+	ErrorLocus = el;
+}
+
+void GetFreeDiskSpace(struct sigcontext_struct *context)
+{
+	int drive;
+	struct statfs info;
+	long size,avail;
+
+	if (!(DX & 0xff))
+		drive = CurrentDrive;
+	else
+		drive = (DX & 0xff) - 1;
+	
+	if (!ValidDrive(drive)) {
+		Error(InvalidDrive, EC_MediaError , EL_Disk);
+		AX = 0xffff;	
+		return;
+	}
+	
+	{
+		if (statfs(DosDrives[drive].RootDirectory, &info) < 0) {
+			fprintf(stderr,"cannot do statfs(%s)\n",DosDrives[drive].RootDirectory);
+			Error(GeneralFailure, EC_MediaError , EL_Disk);
+			AX = 0xffff;
+			return;
+		}
+
+		size = info.f_bsize * info.f_blocks / 1024;
+		avail = info.f_bavail * info.f_bsize / 1024;
+	
+		#ifdef DOSDEBUG
+		fprintf(stderr,"statfs: size: %8d avail: %8d\n",size,avail);
+		#endif
+
+		AX = SectorsPerCluster;	
+		CX = SectorSize;
+		
+		BX = (avail / (CX * AX));
+		DX = (size / (CX * AX));
+		Error (0,0,0);
+	}
+}
+
+void SetDefaultDrive(struct sigcontext_struct *context)
+{
+	if ((DX & 0xff) < MAX_DRIVES) {
+		CurrentDrive = DX & 0xff;
+		AX &= 0xff00;
+		AX |= MAX_DRIVES; /* # of valid drive letters */
+		Error (0,0,0);
+	} else
+		Error (InvalidDrive, EC_MediaError, EL_Disk);
+}
+
+void GetDefaultDrive(struct sigcontext_struct *context)
+{
+	AX &= 0xff00;
+	AX |= CurrentDrive;
+	Error (0,0,0);
+}
+
+void GetDriveAllocInfo(struct sigcontext_struct *context)
+{
+	int drive;
+	long size;
+	BYTE mediaID;
+	struct statfs info;
+	
+	drive = DX & 0xff;
+	
+	if (!ValidDrive(drive)) {
+		AX = SectorsPerCluster;
+		CX = SectorSize;
+		DX = 0;
+		Error (InvalidDrive, EC_MediaError, EL_Disk);
+		return;
+	}
+
+	{
+		if (statfs(DosDrives[drive].RootDirectory, &info) < 0) {
+			fprintf(stderr,"cannot do statfs(%s)\n",DosDrives[drive].RootDirectory);
+			Error(GeneralFailure, EC_MediaError , EL_Disk);
+			AX = 0xffff;
+			return;
+		}
+
+		size = info.f_bsize * info.f_blocks / 1024;
+	
+		#ifdef DOSDEBUG
+		fprintf(stderr,"statfs: size: %8d\n",size);
+		#endif
+
+		AX = SectorsPerCluster;	
+		CX = SectorSize;
+		DX = (size / (CX * AX));
+
+		mediaID = 0xf0;
+
+		DS = segment(mediaID);
+		BX = offset(mediaID);	
+		Error (0,0,0);
+	}
+}
+
+void GetDefDriveAllocInfo(struct sigcontext_struct *context)
+{
+	DX = CurrentDrive;
+	GetDriveAllocInfo(context);
+}
+
+void GetDrivePB(struct sigcontext_struct *context)
+{
+	Error (InvalidDrive, EC_MediaError, EL_Disk);
+	AX = 0xff; /* I'm sorry but I only got networked drives :-) */
+}
+
+void ReadFile(struct sigcontext_struct *context)
+{
+	char *ptr;
+	int size;
+
+	/* can't read from stdout / stderr */
+
+	if (((BX & 0xffff) == 1) ||((BX & 0xffff) == 2)) {
+		Error (InvalidHandle, EL_Unknown, EC_Unknown);
+		AX = InvalidHandle;
+		SetCflag;
+		return;
+	}
+
+	ptr = (char *) pointer (DS,DX);
+
+	if ((BX & 0xffff) == 0) {
+		*ptr = EOF;
+		Error (0,0,0);
+		AX = 1;
+		ResetCflag;
+		return;
+	} else {
+		size = read(BX, ptr, CX);
+		if (size == 0) {
+			Error (ReadFault, EC_Unknown, EL_Unknown);
+			AX = ExtendedError;
+			return;
+		}
+
+		if (size == -1) {
+			switch (errno) {
+				case EAGAIN:
+					Error (ShareViolation, EC_Temporary, EL_Unknown);
+					break;
+				case EBADF:
+					Error (InvalidHandle, EC_AppError, EL_Unknown);
+					break;
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		AX = size;
+		ResetCflag;
+	}
+}
+
+void WriteFile(struct sigcontext_struct *context)
+{
+	char *ptr;
+	int x,size;
+	
+	ptr = (char *) pointer (DS,DX);
+	
+	if ((BX & 0xffff) == 0) {
+		Error (InvalidHandle, EC_Unknown, EL_Unknown);
+		AX = InvalidHandle;
+		SetCflag;
+		return;
+	}
+
+	if ((BX & 0xffff) < 3) {
+		for (x = 0;x != CX;x++) {
+			fprintf(stderr, "%c", *ptr++);
+		}
+		fflush(stderr);
+
+		Error (0,0,0);
+		AX = CX;
+		ResetCflag;
+	} else {
+		size = write(BX, ptr , CX);
+		if (size == 0) {
+			Error (WriteFault, EC_Unknown, EL_Unknown);
+			AX = ExtendedError;
+			return;
+		}
+
+		if (size == -1) {
+			switch (errno) {
+				case EAGAIN:
+					Error (ShareViolation, EC_Temporary, EL_Unknown);
+					break;
+				case EBADF:
+					Error (InvalidHandle, EC_AppError, EL_Unknown);
+					break;
+				case ENOSPC:
+					Error (DiskFull, EC_MediaError, EL_Disk);
+					break;				
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		AX = size;
+		ResetCflag;
+	}
+}
+
+void UnlinkFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive, status;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+
+	{
+		status = unlink((char *) pointer(DS,DX));
+		if (status == -1) {
+			switch (errno) {
+				case EACCES:
+				case EPERM:
+				case EROFS:
+					Error (WriteProtected, EC_AccessDenied, EL_Unknown);
+					break;
+				case EBUSY:
+					Error (LockViolation, EC_AccessDenied, EL_Unknown);
+					break;		
+				case EAGAIN:
+					Error (ShareViolation, EC_Temporary, EL_Unknown);
+					break;
+				case ENOENT:
+					Error (FileNotFound, EC_NotFound, EL_Unknown);
+					break;				
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		ResetCflag;
+	}
+}
+
+void SeekFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive, handle, status, fileoffset;
+	
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+	
+	{
+		switch (AX & 0xff) {
+			case 1: fileoffset = SEEK_CUR;
+				break;
+			case 2: fileoffset = SEEK_END;
+				break;
+			default:
+			case 0: fileoffset = SEEK_SET;
+				break;
+		}
+		status = lseek(BX, (CX * 0x100) + DX, fileoffset);
+		if (status == -1) {
+			switch (errno) {
+				case EBADF:
+					Error (InvalidHandle, EC_AppError, EL_Unknown);
+					break;
+				case EINVAL:
+					Error (DataInvalid, EC_AppError, EL_Unknown);
+					break;
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		ResetCflag;
+	}
+}
+
+void GetFileAttributes(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive,handle;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+
+	{
+		CX = 0x0;
+		ResetCflag;
+	}
+}
+
+void SetFileAttributes(struct sigcontext_struct *context)
+{
+	ResetCflag;
+}
+
+void DosIOCTL(struct sigcontext_struct *context)
+{
+	AX = UnknownUnit;
+	SetCflag;
+}
+
+void DupeFileHandle(struct sigcontext_struct *context)
+{
+	AX = dup(BX);
+	ResetCflag;
+}
+
+void GetSystemDate(struct sigcontext_struct *context)
+{
+	struct tm *now;
+	time_t ltime;
+
+	ltime = time(NULL);
+	now = localtime(&ltime);
+
+	CX = now->tm_year + 1900;
+	DX = ((now->tm_mon + 1) << 8) | now->tm_mday;
+	AX &= 0xff00;
+	AX |= now->tm_wday;
+}
+
+void GetSystemTime(struct sigcontext_struct *context)
+{
+	struct tm *now;
+	time_t ltime;
+
+	ltime = time(NULL);
+	now = localtime(&ltime);
+	 
+	CX = (now->tm_hour << 8) | now->tm_min;
+	DX = now->tm_sec << 8;
+}
+
+void GetExtendedErrorInfo(struct sigcontext_struct *context)
+{
+	AX = ExtendedError;
+	BX = (0x100 * ErrorClass) | Action;
+	CX &= 0x00ff;
+	CX |= (0x100 * ErrorLocus);
+}
+
+void GetInDosFlag(struct sigcontext_struct *context)
+{
+	const BYTE InDosFlag = 0;
+	
+	ES = segment(InDosFlag);
+	BX = offset(InDosFlag);
+}
+
+void CreateFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive,handle;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+
+	{
+		handle = open(UnixFileName, O_CREAT | O_TRUNC);
+
+		if (handle == -1) {
+			switch (errno) {
+				case EACCES:
+				case EPERM:
+				case EROFS:
+					Error (WriteProtected, EC_AccessDenied, EL_Unknown);
+					break;
+				case EISDIR:
+					Error (CanNotMakeDir, EC_AccessDenied, EL_Unknown);
+					break;
+				case ENFILE:
+				case EMFILE:
+					Error (NoMoreFiles, EC_MediaError, EL_Unknown);
+				case EEXIST:
+					Error (FileExists, EC_Exists, EL_Disk);
+					break;				
+				case ENOSPC:
+					Error (DiskFull, EC_MediaError, EL_Disk);
+					break;				
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		BX = handle;
+		AX = NoError;
+		ResetCflag;
+	}
+}
+
+void OpenExistingFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive, handle;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+	
+	{
+		handle = open(UnixFileName, O_RDWR);
+
+		if (handle == -1) {
+			switch (errno) {
+				case EACCES:
+				case EPERM:
+				case EROFS:
+					Error (WriteProtected, EC_AccessDenied, EL_Unknown);
+					break;
+				case EISDIR:
+					Error (CanNotMakeDir, EC_AccessDenied, EL_Unknown);
+					break;
+				case ENFILE:
+				case EMFILE:
+					Error (NoMoreFiles, EC_MediaError, EL_Unknown);
+				case EEXIST:
+					Error (FileExists, EC_Exists, EL_Disk);
+					break;				
+				case ENOSPC:
+					Error (DiskFull, EC_MediaError, EL_Disk);
+					break;				
+				case ENOENT:
+					Error (FileNotFound, EC_MediaError, EL_Disk);
+					break;
+				default:
+					Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+					break;
+			}
+			AX = ExtendedError;
+			SetCflag;
+			return;
+		}		
+		Error (0,0,0);
+		BX = handle;
+		AX = NoError;
+		ResetCflag;
+	}
+}
+
+void CloseFile(struct sigcontext_struct *context)
+{
+	if (close(BX) == -1) {
+		switch (errno) {
+			case EBADF:
+				Error (InvalidHandle, EC_AppError, EL_Unknown);
+				break;
+			default:
+				Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+				break;
+		}
+		AX = ExtendedError;
+		SetCflag;
+		return;
+	}		
+	Error (0,0,0);
+	AX = NoError;
+	ResetCflag;
+}
+
+void RenameFile(struct sigcontext_struct *context)
+{
+	rename((char *) pointer(DS,DX), (char *) pointer(ES,DI));
+	ResetCflag;
+}
+
+void GetTrueFileName(struct sigcontext_struct *context)
+{ 
+	strncpy((char *) pointer(ES,DI), (char *) pointer(DS,SI), strlen((char *) pointer(DS,SI)) & 0x7f);
+	ResetCflag;
+}
+
+void MakeDir(struct sigcontext_struct *context)
+{
+	int drive;
+	char *dirname;
+	char unixname[256];
+	
+	dirname = (char *) pointer(DS,DX);
+
+	ParseDOSFileName(unixname,dirname,&drive);
+
+	{
+		if (mkdir(unixname,0) == -1) {
+			AX = CanNotMakeDir;
+			SetCflag;
+		}
+		ResetCflag;
+	}
+}
+
+void ChangeDir(struct sigcontext_struct *context)
+{
+	int drive;
+	char *dirname;
+	char unixname[256];
+	
+	dirname = (char *) pointer(DS,DX);
+
+	ParseDOSFileName(unixname,dirname,&drive);
+
+	{
+		strcpy(unixname,DosDrives[drive].CurrentDirectory);
+		ResetCflag;
+	}
+}
+
+void RemoveDir(struct sigcontext_struct *context)
+{
+	int drive;
+	char *dirname;
+	char unixname[256];
+	
+	dirname = (char *) pointer(DS,DX);
+
+	ParseDOSFileName(unixname,dirname,&drive);
+
+	{
+		if (strcmp(unixname,DosDrives[drive].CurrentDirectory)) {
+			AX = CanNotRemoveCwd;
+			SetCflag;
+		}
+	
+		#ifdef DOSDEBUG
+		fprintf(stderr,"rmdir %s\n",unixname);
+		#endif
+		
+		if (rmdir(unixname) == -1) {
+			AX = CanNotMakeDir; /* HUH ?*/
+			SetCflag;
+		} 
+		ResetCflag;
+	}
+}
+
+void AllocateMemory(struct sigcontext_struct *context)
+{
+	char *ptr;
+	
+	if ((ptr = (void *) memalign((size_t) (BX * 0x10), 0x10)) == NULL) {
+		AX = OutOfMemory;
+		BX = 0x0; /* out of memory */
+		SetCflag;
+	}
+	AX = segment((unsigned long) ptr);
+	ResetCflag;
+}
+
+void FreeMemory(struct sigcontext_struct *context)
+{
+	free((void *)(ES * 0x10));
+	ResetCflag;
+}
+
+void ResizeMemoryBlock(struct sigcontext_struct *context)
+{
+	char *ptr;
+	
+	if ((ptr = (void *) realloc((void *)(ES * 0x10), (size_t) BX * 0x10)) == NULL) {
+		AX = OutOfMemory;
+		BX = 0x0; /* out of memory */
+		SetCflag;
+	}
+	BX = segment((unsigned long) ptr);
+	ResetCflag;
+}
+
+void ExecProgram(struct sigcontext_struct *context)
+{
+	execl("wine",(char *) pointer(DS,DX));
+}
+
+void GetReturnCode(struct sigcontext_struct *context)
+{
+	AX = NoError; /* normal exit */
+}
+
+void FindFirst(struct sigcontext_struct *context)
+{
+
+}
+
+void FindNext(struct sigcontext_struct *context)
+{
+
+}
+
+void GetSysVars(struct sigcontext_struct *context)
+{
+	ES = 0x0;
+	BX = 0x0;
+}
+
+void GetFileDateTime(struct sigcontext_struct *context)
+{
+	int drive;
+	char *dirname;
+	char unixname[256];
+	struct stat filestat;
+	struct tm *now;
+
+	ParseDOSFileName(unixname, dirname, &drive);
+
+	{
+		stat(unixname, &filestat);
+	 	
+		now = localtime (&filestat.st_mtime);
+	
+		CX = (now->tm_hour * 0x2000) + (now->tm_min * 0x20) + now->tm_sec/2;
+		DX = (now->tm_year * 0x200) + (now->tm_mon * 0x20) + now->tm_mday;
+
+		ResetCflag;
+	}
+}
+
+void SetFileDateTime(struct sigcontext_struct *context)
+{
+	int drive;
+	char *dirname;
+	char unixname[256];
+	struct utimbuf filetime;
+	
+	dirname = (char *) pointer(DS,DX);
+
+	ParseDOSFileName(unixname, dirname, &drive);
+
+	{
+		filetime.actime = 0L;
+		filetime.modtime = filetime.actime;
+
+		utime(unixname,&filetime);
+		ResetCflag;
+	}
+}
+
+void CreateTempFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256],TempString[256];
+	int drive,handle;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+	
+	sprintf(TempString,"%s%s%d",UnixFileName,"eb",(int) getpid());
+
+	{
+		handle = open(TempString, O_CREAT | O_TRUNC | O_RDWR);
+
+		if (handle == -1) {
+			AX = WriteProtected;
+			SetCflag;
+			return;
+		}
+		
+		strcpy((char *) pointer(DS,DX), UnixFileName);
+	
+		AX = handle;
+		ResetCflag;
+	}
+}
+
+void CreateNewFile(struct sigcontext_struct *context)
+{
+	char UnixFileName[256];
+	int drive,handle;
+	
+	ParseDOSFileName(UnixFileName, (char *) pointer(DS,DX), &drive);
+	
+	{
+		handle = open(UnixFileName, O_CREAT | O_TRUNC | O_RDWR);
+
+		if (handle == -1) {
+			AX = WriteProtected;
+			SetCflag;
+			return;
+		}
+
+		AX = handle;
+		ResetCflag;
+	}
+}
+
+void FileLock(struct sigcontext_struct *context)
+{
+
+}
+
+void GetExtendedCountryInfo(struct sigcontext_struct *context)
+{
+	ResetCflag;
+}
+
+int ValidDrive(int d)
+{
+	return 1;
+}
+
+void GetCurrentDirectory(struct sigcontext_struct *context)
+{
+	int drive;
+	char *ptr;
+
+	if ((DX & 0xff) == 0)
+		drive = CurrentDrive;
+	else
+		drive = (DX & 0xff)-1;
+
+	if (!ValidDrive(drive)) {
+		AX = InvalidDrive;
+		SetCflag;
+		return;
+	}
+	
+	strcpy((char *) pointer(DS,SI), DosDrives[drive].CurrentDirectory);
+	ResetCflag;
+	AX = 0x0100;
+}
+
+void GetCurrentPSP(struct sigcontext_struct *context)
+{
+
+}
+
+void GetDiskSerialNumber(struct sigcontext_struct *context)
+{
+	int drive;
+	struct diskinfo *ptr;
+	
+	if ((BX & 0xff)== 0)
+		drive = CurrentDrive;
+	else
+		drive = (BX & 0xff)-1;
+
+	if (!ValidDrive(drive)) {
+		AX = InvalidDrive;
+		SetCflag;
+		return;
+	}
+
+	{
+		ptr =(struct diskinfo *) pointer(DS,SI);
+
+		ptr->infolevel = 0;
+		ptr->serialnumber = 0xEBEBEB00 | drive;
+		strcpy(ptr->label,"NO NAME    ");
+		strcpy(ptr->fstype,"FAT16   ");
+	
+		AX = NoError;
+		ResetCflag;
+	}
+}
+
+void SetDiskSerialNumber(struct sigcontext_struct *context)
+{
+	AX &= 0xff00;
+	AX |= 1;
+	ResetCflag;
+}
+
+void CommitFile(struct sigcontext_struct *context)
+{
+
+}
+
+/************************************************************************/
+
+int do_int21(struct sigcontext_struct * context){
+	int ah;
+
+	fprintf(stderr,"int21: doing AX=%4x BX=%4x CX=%4x DX=%4x\n",
+		AX & 0xffff,BX & 0xffff,CX & 0xffff,DX & 0xffff);
+
+	ah = (AX >> 8) & 0xff;
+
+	if (ah == 0x59) {
+		GetExtendedErrorInfo(context);
+		return 1;
+	} else {
+	
+	Error (0,0,0);
+	
+	switch(ah) {
+
+	case 0x00: /* TERMINATE PROGRAM */
+		exit(0);
+
+	case 0x01: /* READ CHARACTER FROM STANDARD INPUT, WITH ECHO */
+	case 0x02: /* WRITE CHARACTER TO STANDARD OUTPUT */
+	case 0x03: /* READ CHARACTER FROM STDAUX  */
+	case 0x04: /* WRITE CHARACTER TO STDAUX */
+	case 0x05: /* WRITE CHARACTER TO PRINTER */
+	case 0x06: /* DIRECT CONSOLE IN/OUTPUT */
+	case 0x07: /* DIRECT CHARACTER INPUT, WITHOUT ECHO */
+	case 0x08: /* CHARACTER INPUT WITHOUT ECHO */
+	case 0x09: /* WRITE STRING TO STANDARD OUTPUT */
+	case 0x0a: /* BUFFERED INPUT */
+	case 0x0b: /* GET STDIN STATUS */
+	case 0x0c: /* FLUSH BUFFER AND READ STANDARD INPUT */
+	case 0x0d: /* DISK BUFFER FLUSH */
+		break;
+
+	/* no FCB support for CP/M hackers */
+	
+	case 0x0f: /* OPEN FILE USING FCB */
+	case 0x10: /* CLOSE FILE USING FCB */
+	case 0x11: /* FIND FIRST MATCHING FILE USING FCB */
+	case 0x12: /* FIND NEXT MATCHING FILE USING FCB */
+	case 0x13: /* DELETE FILE USING FCB */
+	case 0x14: /* SEQUENTIAL READ FROM FCB FILE */		
+	case 0x15: /* SEQUENTIAL WRITE TO FCB FILE
+	case 0x16: /* CREATE OR TRUNCATE FILE USING FCB */
+	case 0x17: /* RENAME FILE USING FCB */
+	case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
+	case 0x21: /* READ RANDOM RECORD FROM FCB FILE */
+	case 0x22: /* WRITE RANDOM RECORD TO FCB FILE */
+	case 0x23: /* GET FILE SIZE FOR FCB */
+	case 0x24: /* SET RANDOM RECORD NUMBER FOR FCB */
+	case 0x27: /* RANDOM BLOCK READ FROM FCB FILE */
+	case 0x28: /* RANDOM BLOCK WRITE TO FCB FILE */
+	case 0x29: /* PARSE FILENAME INTO FCB */
+	case 0x2f: /* GET DISK TRANSFER AREA ADDRESS */
+
+	case 0x2e: /* SET VERIFY FLAG */
+		break;
+
+	case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY *
+	case 0x1d:
+	case 0x1e:
+	case 0x20:
+	case 0x2b: /* SET SYSTEM DATE */
+	case 0x2d: /* SET SYSTEM TIME */
+	case 0x37: /* "SWITCHAR" - GET SWITCH CHARACTER
+		      "SWITCHAR" - SET SWITCH CHARACTER
+		      "AVAILDEV" - SPECIFY \DEV\ PREFIX USE */
+	case 0x54: /* GET VERIFY FLAG */
+	case 0x61: /* UNUSED */
+	case 0x6b: /* NULL FUNCTION */
+	        AX &= 0xff00;
+		break;
+	
+	case 0x67: /* SET HANDLE COUNT */			
+		ResetCflag;
+		break;
+	
+	case 0x0e: /* SELECT DEFAULT DRIVE */
+		SetDefaultDrive(context);
+		break;
+
+	case 0x19: /* GET CURRENT DEFAULT DRIVE */
+		GetDefaultDrive(context);
+		break;
+		
+	case 0x1b: /* GET ALLOCATION INFORMATION FOR DEFAULT DRIVE */
+		GetDefDriveAllocInfo(context);
+		break;
+	
+	case 0x1c: /* GET ALLOCATION INFORMATION FOR SPECIFIC DRIVE */
+		GetDriveAllocInfo(context);
+		break;
+
+	case 0x1f: /* GET DRIVE PARAMETER BLOCK FOR DEFAULT DRIVE */
+	case 0x32: /* GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE */
+		GetDrivePB(context);
+		break;
+		
+	case 0x25: /* SET INTERRUPT VECTOR */
+		/* Ignore any attempt to set a segment vector */
+		return 1;
+
+	case 0x26: /* CREATE NEW PROGRAM SEGMENT PREFIX */
+		break;
+
+	case 0x2a: /* GET SYSTEM DATE */
+		GetSystemDate(context);
+		break;
+
+	case 0x2c: /* GET SYSTEM TIME */
+		GetSystemTime(context);
+                break;
+
+	case 0x30: /* GET DOS VERSION */
+	        AX = DosVersion; /* Hey folks, this is DOS V3.3! */
+		BX = 0x0012;     /* 0x123456 is Wine's serial # */
+		CX = 0x3456;
+		break;
+
+	case 0x31: /* TERMINATE AND STAY RESIDENT */
+		break;
+
+	case 0x33: /* MULTIPLEXED */
+		switch (AX & 0xff) {
+			case 0x00: /* GET CURRENT EXTENDED BREAK STATE */
+				if (!(AX & 0xff)) 
+					DX &= 0xff00;
+				break;
+
+			case 0x01: /* SET EXTENDED BREAK STATE */
+				break;		
+		
+			case 0x02: /* GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE */
+				DX &= 0xff00;
+				break;
+
+			case 0x05: /* GET BOOT DRIVE */
+				DX &= 0xff00;
+				DX |= 2; /* c: is Wine's bootdrive */
+				break;
+				
+			case 0x06: /* GET TRUE VERSION NUMBER */
+				BX = DosVersion;
+				DX = 0x00;
+				break;
+			default:
+				break;			
+		}
+		break;	
+
+	case 0x34: /* GET ADDRESS OF INDOS FLAG */
+		GetInDosFlag(context);
+		break;
+
+	case 0x35: /* GET INTERRUPT VECTOR */
+ 		   /* Return a NULL segment selector - this will bomb, 
+ 		              if anyone ever tries to use it */
+		ES = 0;
+		BX = 0;
+		break;
+
+	case 0x36: /* GET FREE DISK SPACE */
+		GetFreeDiskSpace(context);
+		break;
+
+	case 0x38: /* GET COUNTRY-SPECIFIC INFORMATION */
+		AX &= 0xff00;
+		AX |= 0x02; /* no country support available */
+		SetCflag;
+		break;
+		
+	case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
+		MakeDir(context);
+		break;
+	
+	case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
+		RemoveDir(context);
+		break;
+	
+	case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
+		ChangeDir(context);
+		break;
+	
+	case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
+		CreateFile(context);
+		break;
+
+	case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
+		OpenExistingFile(context);
+		break;
+	
+	case 0x3e: /* "CLOSE" - CLOSE FILE */
+	case 0x68: /* "FFLUSH" - COMMIT FILE */
+	case 0x6a: /* COMMIT FILE */
+
+		CloseFile(context);
+		break;
+	
+	case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
+		ReadFile(context);
+		break;
+	
+	case 0x40: /* "WRITE" - WRITE TO FILE OR DEVICE */
+		WriteFile(context);
+		break;
+	
+	case 0x41: /* "UNLINK" - DELETE FILE */
+		UnlinkFile(context);
+		break;
+	
+	case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
+		SeekFile(context);
+		break;
+			
+	case 0x43: /* FILE ATTRIBUTES */
+		switch (AX & 0xff) {
+			case 0x00:
+				GetFileAttributes(context);
+				break;
+			case 0x01:
+				SetFileAttributes(context);
+				break;
+		}
+		break;
+		
+	case 0x44: /* IOCTL */
+		DosIOCTL(context);
+		break;
+
+	case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */
+	case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
+		DupeFileHandle(context);
+		break;
+	
+	case 0x47: /* "CWD" - GET CURRENT DIRECTORY */	
+		GetCurrentDirectory(context);
+		AX = 0x0100; /* many Microsoft products for Windows rely
+				on this */
+		break;
+	
+	case 0x48: /* ALLOCATE MEMORY */
+		AllocateMemory(context);
+		break;
+	
+	case 0x49: /* FREE MEMORY */
+		FreeMemory(context);
+		break;
+	
+	case 0x4a: /* RESIZE MEMORY BLOCK */
+		ResizeMemoryBlock(context);
+		break;
+	
+	case 0x4b: /* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
+		ExecProgram(context);
+		break;		
+	
+	case 0x4c: /* "EXIT" - TERMINATE WITH RETURN CODE */
+		exit(AX & 0xff);
+
+	case 0x4d: /* GET RETURN CODE */
+		GetReturnCode(context);
+		break;
+
+	case 0x4e: /* "FINDFIRST" - FIND FIRST MATCHING FILE */
+		FindFirst(context);
+		break;
+
+	case 0x4f: /* "FINDNEXT" - FIND NEXT MATCHING FILE */
+		FindNext(context);
+		break;
+			
+	case 0x52: /* "SYSVARS" - GET LIST OF LISTS */
+		GetSysVars(context);
+		break;
+		
+	case 0x56: /* "RENAME" - RENAME FILE */
+		RenameFile(context);
+		break;
+	
+	case 0x57: /* FILE DATE AND TIME */
+		switch (AX & 0xff) {
+			case 0x00:
+				GetFileDateTime(context);
+				break;
+			case 0x01:
+				SetFileDateTime(context);
+				break;
+		}
+		break;
+
+	case 0x58: /* GET OR SET MEMORY/UMB ALLOCATION STRATEGY */
+		switch (AX & 0xff) {
+			case 0x00:
+				AX = 0x01;
+				break;
+			case 0x02:
+				AX &= 0xff00;
+				break;
+			case 0x01:
+			case 0x03:
+				break;
+		}
+		ResetCflag;
+		break;
+	
+	case 0x59: /* GET EXTENDED ERROR INFO */
+		GetExtendedErrorInfo(context);
+		break;
+		
+	case 0x5a: /* CREATE TEMPORARY FILE */
+		CreateTempFile(context);
+		break;
+	
+	case 0x5b: /* CREATE NEW FILE */
+		CreateNewFile(context);
+		break;
+	
+	case 0x5c: /* "FLOCK" - RECORD LOCKING */
+		FileLock(context);
+		break;	
+
+	case 0x5d: /* NETWORK */
+	case 0x5e:
+	case 0x5f:
+		AX &= 0xff00;
+		AX |= NoNetwork; /* network software not installed */
+		SetCflag;
+		break;
+
+	case 0x60: /* "TRUENAME" - CANONICALIZE FILENAME OR PATH */
+		GetTrueFileName(context);
+		break;
+
+	case 0x62: /* GET CURRENT PSP ADDRESS */
+		GetCurrentPSP(context);
+		break;
+	
+	case 0x65: /* GET EXTENDED COUNTRY INFORMATION */
+		GetExtendedCountryInfo(context);
+		break;
+	
+	case 0x66: /* GLOBAL CODE PAGE TABLE */
+		switch (AX & 0xff) {
+			case 0x01:
+				BX = CodePage;
+				DX = BX;
+				ResetCflag;
+				break;			
+			case 0x02: 
+				CodePage = BX;
+				ResetCflag;
+				break;
+		}
+		break;
+	
+	case 0x69: /* DISK SERIAL NUMBER */
+		switch (AX & 0xff) {
+			case 0x00:
+				GetDiskSerialNumber(context);
+				break;			
+			case 0x01: 
+				SetDiskSerialNumber(context);
+				break;
+		}
+		break;
+
+	default:
+		fprintf(stderr,"Unable to handle int 0x21 %x\n", context->sc_eax);
+		return 1;
+	};
+	}
+	return 1;
+}
diff --git a/loader/ldtlib.c b/loader/ldtlib.c
index 65bf92ced2de1fe9cb5f4761990d88485ae08e0d..39455372732babd8540d2d2f863fd0835f138d44 100644
--- a/loader/ldtlib.c
+++ b/loader/ldtlib.c
@@ -20,7 +20,6 @@ extern int i386_set_ldt(int, union descriptor *, int);
 struct segment_descriptor *
 make_sd(unsigned base, unsigned limit, int contents, int read_exec_only, int seg32, int inpgs)
 {
-#if 1
         static long d[2];
 
         d[0] = ((base & 0x0000ffff) << 16) |
@@ -34,24 +33,7 @@ make_sd(unsigned base, unsigned limit, int contents, int read_exec_only, int seg
                                                         (inpgs << 23) |
                                                                 0xf000;
         
-        printf("%x %x\n", d[1], d[0]);
-        
         return ((struct segment_descriptor *)d);
-#else        
-        static struct segment_descriptor d;
-
-        d.sd_lolimit = limit & 0x0000ffff;
-        d.sd_lobase  = base & 0x00ffffff;
-        d.sd_type    = contents & 0x01f;
-        d.sd_dpl     = SEL_UPL & 0x3;
-        d.sd_p       = 1;
-        d.sd_hilimit = (limit & 0x00ff0000) >> 16;
-        d.sd_xx      = 0;
-        d.sd_def32   = seg32?1:0;
-        d.sd_gran    = inpgs?1:0;
-        d.sd_hibase  = (base & 0xff000000) >> 24;
-        return ((struct segment_descriptor *)&d);
-#endif
 }
 #endif
         
@@ -88,7 +70,7 @@ set_ldt_entry(int entry, unsigned long base, unsigned int limit,
     struct segment_descriptor *sd;
     int ret;
     
-#ifdef DEBUG
+#ifdef DEBUG_LDT
     printf("set_ldt_entry: entry=%x base=%x limit=%x%s %s-bit contents=%d %s\n",
            entry, base, limit, limit_in_pages_flag?"-pages":"",
            seg_32bit_flag?"32":"16",
diff --git a/loader/resource.c b/loader/resource.c
index fcc1af3108b03a976401787261979e611cb0e485..eeafc9e86228b603d7bbcca617f4e8609ed19f49 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -211,6 +211,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
     if (read(ResourceFd, &size_shift, sizeof(size_shift)) != 
 	sizeof(size_shift))
     {
+    	printf("FindResourceByName (%s) bad block size !\n", resource_name);
 	return -1;
     }
     
@@ -223,6 +224,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
 	if (read(ResourceFd, &typeinfo, sizeof(typeinfo)) !=
 	    sizeof(typeinfo))
 	{
+	    printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
 	    return -1;
 	}
 	if (typeinfo.type_id == type_id || type_id == -1)
@@ -232,6 +234,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
 		if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) != 
 		    sizeof(nameinfo))
 		{
+		    printf("FindResourceByName (%s) bad nameinfo size !\n", resource_name);
 		    return -1;
 		}
 
@@ -245,7 +248,6 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
 		read(ResourceFd, name, nbytes);
 		lseek(ResourceFd, old_pos, SEEK_SET);
 		name[nbytes] = '\0';
-
 		if (strcasecmp(name, resource_name) == 0)
 		{
 		    memcpy(result_p, &nameinfo, sizeof(nameinfo));
@@ -254,6 +256,7 @@ FindResourceByName(struct resource_nameinfo_s *result_p,
 	    }
 	}
     }
+    printf("FindResourceByName (%s) typeinfo.type_id = 0 !\n", resource_name);
     
     return -1;
 }
@@ -373,7 +376,6 @@ RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret)
     image_size = nameinfo.length << size_shift;
     if (image_size_ret != NULL)
 	*image_size_ret = image_size;
-    
     hmem = GlobalAlloc(GMEM_MOVEABLE, image_size);
     image = GlobalLock(hmem);
     if (image == NULL || read(ResourceFd, image, image_size) != image_size)
@@ -443,6 +445,7 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name)
 {
     HBITMAP hbitmap;
     HANDLE rsc_mem;
+    GDIOBJHDR * ptr;
     HDC hdc;
     long *lp;
     int image_size;
@@ -462,7 +465,6 @@ LoadBitmap(HANDLE instance, LPSTR bmp_name)
 	GlobalFree(rsc_mem);
 	return 0;
     }
-
     if (*lp == sizeof(BITMAPCOREHEADER))
 	hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
     else if (*lp == sizeof(BITMAPINFOHEADER))
diff --git a/loader/signal.c b/loader/signal.c
index a240104c2278813711d26ff243c24df1501e4092..cc85fc751f7ff383dfa84f5c68134cc27abda850 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -10,6 +10,7 @@
 #include <linux/sched.h>
 #include <asm/system.h>
 #endif
+#include <wine.h>
  
 char * cstack[4096];
 struct sigaction segv_act;
@@ -17,6 +18,7 @@ struct sigaction segv_act;
 #ifdef linux
 extern void ___sig_restore();
 extern void ___masksig_restore();
+#endif
 
 /* Similar to the sigaction function in libc, except it leaves alone the
    restorer field */
@@ -32,123 +34,6 @@ wine_sigaction(int sig,struct sigaction * new, struct sigaction * old)
 	return -1;
 }
 
-struct sigcontext_struct {
-	unsigned short sc_gs, __gsh;
-	unsigned short sc_fs, __fsh;
-	unsigned short sc_es, __esh;
-	unsigned short sc_ds, __dsh;
-	unsigned long sc_edi;
-	unsigned long sc_esi;
-	unsigned long sc_ebp;
-	unsigned long sc_esp;
-	unsigned long sc_ebx;
-	unsigned long sc_edx;
-	unsigned long sc_ecx;
-	unsigned long sc_eax;
-	unsigned long sc_trapno;
-	unsigned long sc_err;
-	unsigned long sc_eip;
-	unsigned short sc_cs, __csh;
-	unsigned long sc_eflags;
-	unsigned long esp_at_signal;
-	unsigned short sc_ss, __ssh;
-	unsigned long i387;
-	unsigned long oldmask;
-	unsigned long cr2;
-};
-#endif
-
-#ifdef __NetBSD__
-#define sigcontext_struct sigcontext
-#define HZ 100
-#endif
-
-static void
-GetTimeDate(int time_flag, struct sigcontext_struct * context)
-{
-    struct tm *now;
-    time_t ltime;
-    
-    ltime = time(NULL);
-    now = localtime(&ltime);
-    if (time_flag)
-    {
-	 context->sc_ecx = (now->tm_hour << 8) | now->tm_min;
-	 context->sc_edx = now->tm_sec << 8;
-    }
-    else
-    {
-	context->sc_ecx = now->tm_year + 1900;
-	context->sc_edx = ((now->tm_mon + 1) << 8) | now->tm_mday;
-	context->sc_eax &= 0xff00;
-	context->sc_eax |= now->tm_wday;
-    }
-}
-
-/* We handle all int21 calls here.  There is some duplicate code from
-   misc/dos.c that I am unsure how to deal with, since the locations
-   that we store the registers are all different */
-
-static int
-do_int21(struct sigcontext_struct * context){
-	fprintf(stderr,"Doing int21 %x   ", (context->sc_eax >> 8) & 0xff);
-	switch((context->sc_eax >> 8) & 0xff){
-	case 0x30:
-		context->sc_eax = 0x0303;  /* Hey folks, this is DOS V3.3! */
-		context->sc_ebx = 0;
-		context->sc_ecx = 0;
-		break;
-	
-		/* Ignore any attempt to set a segment vector */
-	case 0x25:
-		return 1;
-
-	case 0x35:  /* Return a NULL segment selector - this will bomb
-		       if anyone ever tries to use it */
-		context->sc_es = 0;
-		context->sc_ebx = 0;
-		break;
-		
-	case 0x2a:
-		GetTimeDate(0, context);
-	/* Function does not return */
-		
-	case 0x2c:
-		GetTimeDate(1, context);
-		/* Function does not return */
-
-	case 0x4c:
-		exit(context->sc_eax & 0xff);
-		
-
-	default:
-		fprintf(stderr,"Unable to handle int 0x21 %x\n", context->sc_eax);
-		return 1;
-	};
-	return 1;
-}
-
-static int
-do_int1A(struct sigcontext_struct * context){
-	time_t ltime;
-	int ticks;
-
-	switch((context->sc_eax >> 8) & 0xff){
-	case 0:
-		ltime = time(NULL);
-		ticks = (int) (ltime * HZ);
-		context->sc_ecx = ticks >> 16;
-		context->sc_edx = ticks & 0x0000FFFF;
-		context->sc_eax = 0;  /* No midnight rollover */
-		break;
-	
-	default:
-		fprintf(stderr,"Unable to handle int 0x1A %x\n", context->sc_eax);
-		return 1;
-	};
-	return 1;
-}
-
 #ifdef linux
 static void win_fault(int signal, struct sigcontext_struct context){
         struct sigcontext_struct *scp = &context;
@@ -198,6 +83,12 @@ static void win_fault(int signal, int code, struct sigcontext *scp){
 	case 0x21:
 		if(!do_int21(scp)) goto oops;
 		break;
+        case 0x11:  
+  		scp->sc_eax = 0x00000000;  /* get equipment list: we haven't */
+         	break;                                       /* got anything */
+        case 0x12:               
+          	scp->sc_eax = 640L; /* get base mem size */                
+                break;
 	case 0x1A:
 		if(!do_int1A(scp)) goto oops;
 		break;
@@ -210,7 +101,6 @@ static void win_fault(int signal, int code, struct sigcontext *scp){
 
 	scp->sc_eip += 2;  /* Bypass the int instruction */
 	return;
-
  oops:
 	fprintf(stderr,"In win_fault %x:%x\n", scp->sc_cs, scp->sc_eip);
 #ifdef linux
@@ -236,14 +126,14 @@ init_wine_signals(){
 	/* Point to the top of the stack, minus 4 just in case, and make
 	   it aligned  */
 	segv_act.sa_restorer = 
-		(void (*)()) (((unsigned int)(cstack + sizeof(cstack) - 4)) & ~3);
+		(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
 	wine_sigaction(SIGSEGV, &segv_act, NULL);
 #endif
 #ifdef __NetBSD__
         struct sigstack ss;
         sigset_t sig_mask;
         
-        ss.ss_sp = (char *) (((unsigned int)(cstack + sizeof(cstack) - 4)) & ~3);
+        ss.ss_sp = (char *) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
         ss.ss_onstack = 0;
         if (sigstack(&ss, NULL) < 0) {
                 perror("sigstack");
diff --git a/loader/wine.c b/loader/wine.c
index 1cd77a03639e68406b5818ff9ead28fe4e801583..82928caf75a17abacc2d30deb97e52e5b4e3dc19 100644
--- a/loader/wine.c
+++ b/loader/wine.c
@@ -39,6 +39,10 @@ struct mz_header_s *CurrentMZHeader;
 struct ne_header_s *CurrentNEHeader;
 int CurrentNEFile;
 
+static char *dllExtensions[] = { "dll", "exe", NULL };
+static char *exeExtensions[] = { "exe", NULL };
+static char *WinePath = NULL;
+
 /**********************************************************************
  *					DebugPrintString
  */
@@ -215,39 +219,23 @@ LoadImage(char * filename,  char * modulename)
      */
     for(i=0; i<wpnt->ne_header->n_mod_ref_tab; i++){
       char buff[14];
-      char buff2[14];
+      char buff2[256];
       int  fd, j;
       GetModuleName(wpnt, i + 1, buff);
       
       if(FindDLLTable(buff)) continue;  /* This module already loaded */
 
-      /* The next trick is to convert the case, and add the .dll
-       * extension if required to find the actual library.  We may want
-       * to use a search path at some point as well. */
-
-      /*  First try  the straight name */
-       strcpy(buff2, buff);
-      if(fd = open(buff2, O_RDONLY)  >= 0) {
-	close(fd);
-	LoadImage(buff2, buff);
-	continue;
-      };
-
-      /* OK, that did not work,  try making it lower-case, and add the .dll
-	 extension */
-
-      for(j=0;  j<strlen(buff2);  j++)  
-	if(buff2[j] >= 'A' && buff2[j] <= 'Z')  buff2[j] |= 0x20;
-      strcat(buff2, ".dll");
-      
-      if(fd = open(buff2, O_RDONLY)  >= 0) {
-	close(fd);
-	LoadImage(buff2, buff);
-	continue;
-      };
+      if (FindFileInPath(buff2, sizeof(buff2), 
+			 buff, dllExtensions, WinePath) != NULL &&
+	  (fd = open(buff2, O_RDONLY)) >= 0)
+      {
+	  close(fd);
+	  LoadImage(buff2, buff);
+	  continue;
+      }
 
       fprintf(stderr,"Unable to load:%s\n",  buff);
-    };
+    }
 }
 
 
@@ -257,6 +245,8 @@ LoadImage(char * filename,  char * modulename)
 _WinMain(int argc, char **argv)
 {
 	int segment;
+	char *p;
+	char exe_path[256];
 #ifdef WINESTAT
 	char * cp;
 #endif
@@ -273,8 +263,21 @@ _WinMain(int argc, char **argv)
 		fprintf(stderr, "usage: %s FILENAME\n", argv[0]);
 		exit(1);
 	}
+
+	p = getenv("WINEPATH");
+	WinePath = malloc(256 + strlen(p));
+	getcwd(WinePath, 256);
+	strcat(WinePath, ";");
+	strcat(WinePath, p);
+
+	if (FindFileInPath(exe_path, 256, argv[1], exeExtensions, WinePath)
+	    == NULL)
+	{
+	    fprintf(stderr, "Could not find file '%s'\n", argv[1]);
+	    exit(1);
+	}
 	
-	LoadImage(argv[1], NULL);
+	LoadImage(exe_path, NULL);
 	
 	if(ran_out) exit(1);
 #ifdef DEBUG
diff --git a/memory/Makefile b/memory/Makefile
index 1b8c9d8d3aab12a83c46cad97633c177c231e817..b624e09fd6faab75a512744fdd5385ee67248123 100644
--- a/memory/Makefile
+++ b/memory/Makefile
@@ -8,7 +8,7 @@ memory.o: $(OBJS)
 	$(LD) -r -o memory.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/misc/Makefile b/misc/Makefile
index 0d5fa816d9f556105f22e1b16578ff3774a0af90..e5d5542df59044c9a40c9f049c6c0bed4528aeab 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -1,7 +1,7 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
 
 OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
-     keyboard.o profile.o lstr.o
+     keyboard.o profile.o lstr.o exec.o
 
 default: misc.o
 
@@ -9,7 +9,7 @@ misc.o: $(OBJS)
 	$(LD) -r -o misc.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/misc/exec.c b/misc/exec.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2e7866cf8e507861e75398c25b37e0acedc6440
--- /dev/null
+++ b/misc/exec.c
@@ -0,0 +1,103 @@
+/*
+*     Windows Exec & Help
+*
+*/
+
+#include "win.h"
+
+#define HELP_CONTEXT      0x0001
+#define HELP_QUIT         0x0002
+#define HELP_INDEX        0x0003
+#define HELP_CONTENTS     0x0003
+#define HELP_HELPONHELP   0x0004
+#define HELP_SETINDEX     0x0005
+#define HELP_SETCONTENTS  0x0005
+#define HELP_CONTEXTPOPUP 0x0008
+#define HELP_FORCEFILE    0x0009
+#define HELP_KEY          0x0101
+#define HELP_COMMAND      0x0102
+#define HELP_PARTIALKEY   0x0105
+#define HELP_MULTIKEY     0x0201
+#define HELP_SETWINPOS    0x0203
+
+
+WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow)
+{
+   int X, X2, C;
+   char *ArgV[20];
+   printf("WinExec(%s, %u)\n", lpCmdLine, nCmdShow);
+   for (X = X2 = C = 0; X < strlen(lpCmdLine) + 1; X++) {
+      if ((lpCmdLine[X] == ' ') || (lpCmdLine[X] == '\0')) {
+          ArgV[C] = (char *)malloc(X - X2 + 1);
+          strncpy(ArgV[C], &lpCmdLine[X2], X - X2);
+          ArgV[C][X - X2] = '\0';
+          C++;   X2 = X + 1;
+      }
+   }  
+   ArgV[C] = NULL;
+   for (C = 0; ; C++) {
+      if (ArgV[C] == NULL)  break;
+      printf("--> '%s' \n", ArgV[C]);
+   }  
+   switch(fork()) {
+      case -1:
+         printf("Can'k 'fork' process !\n");
+         break;
+      case 0:
+         printf("New process started !\n");
+         execvp(ArgV[0], ArgV);
+         printf("Child process died !\n");
+         exit(1);
+         break;
+      default:
+         printf("Main process stay alive !\n");
+         break;         
+      }
+   for (C = 0; ; C++) {
+      if (ArgV[C] == NULL)  break;
+      free(ArgV[C]);
+   }  
+   return(TRUE);
+}
+
+
+BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData)
+{
+   char *ArgV[6];
+   char	str[32];
+   printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData);
+   switch(fork()) {
+      case -1:
+         printf("Can'k 'fork' process !\n");
+         break;
+      case 0:
+         printf("New process started !\n");
+         ArgV[0] = "wine";
+         ArgV[1] = "/C:/windows/winhelp.exe";
+         ArgV[2] = lpHelpFile;
+         switch (wCommand) {
+	     case HELP_CONTEXT:
+	     case HELP_KEY:
+	     case HELP_SETINDEX:
+		 sprintf(str, "%lu", dwData);
+		 ArgV[3] = str;
+	     default:
+		 ArgV[3] = NULL;
+	     }
+         ArgV[4] = NULL;
+         if (wCommand == HELP_HELPONHELP)  ArgV[2] = NULL;
+/*
+         _WinMain(ArgV, 2);
+*/
+         execvp(ArgV[0], ArgV);
+         printf("Child process died !\n");
+         exit(1);
+         break;
+      default:
+         printf("Main process stay alive !\n");
+         break;         
+      }
+return(TRUE);
+}
+
+
diff --git a/misc/kernel.c b/misc/kernel.c
index cb6aa17290a5e8a6db2487a9d64f24192c844e05..ea3c3c0e14929187eed2111d7c4132241861bb3a 100644
--- a/misc/kernel.c
+++ b/misc/kernel.c
@@ -71,7 +71,7 @@ KERNEL_WaitEvent(int task)
 int
 KERNEL_GetModuleFileName(int module, char *filename, int bytes)
 {
-#ifdef RELAY_DEBUG
+#ifdef DEBUG_RELAY
     printf("GetModuleFileName: module %d, filename %x, bytes %d\n", 
 	    module, filename, bytes);
 #endif
diff --git a/misc/lstr.c b/misc/lstr.c
index 7bf2250727bb0a452ead484c8b3f423a4b44b404..77e178cadbc4062822a972b2434bfd4018ea7b9f 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -12,9 +12,6 @@ static char Copyright[] = "Copyright  Yngvi Sigurjonsson (yngvi@hafro.is), 1993"
 #include "windows.h"
 
 
-#define LPCSTR LPSTR  /* I think this should be const char **/
-typedef  unsigned short UINT;
-
   /* Funny to divide them between user and kernel. */
 
 /* KERNEL.89 */
@@ -113,7 +110,7 @@ UINT AnsiLowerBuff(LPSTR str,UINT len)
 }
 
 /* AnsiNext USER.472 */
-LPSTR AnsiNext(LPCSTR current)
+LPSTR AnsiNext(LPSTR current)
 {
   return (*current)?current+1:current;
 }
diff --git a/misc/profile.c b/misc/profile.c
index b38c6f835be9bce8c17272b9716d6a7a54810e78..ac50d862833b90f19a7dc3263f1836e015edad24 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -10,8 +10,9 @@ static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza";
 #include <stdio.h>
 #include <string.h>
 #include "windows.h"
+#include "wine.h"
 
-#define INIFILE "win.ini"
+#define INIFILE	GetSystemIniFilename()
 #define STRSIZE 255
 #define xmalloc(x) malloc(x)
 #define overflow (next == &CharBuffer [STRSIZE-1])
@@ -298,25 +299,3 @@ void sync_profiles ()
 {
     dump_profile (Base);
 }
-
-#ifdef DUMBTEST
-main ()
-{
-    char r [100], app [100], key [100], valor [100];
-    
-    while (1){
-	printf ("Dame, Aplicacion, llave\n");
-	gets (app);
-	if (!app [0]){
-	    sync_profiles ();
-	    return;
-	}
-	gets (key);
-	gets (valor);
-	GetProfileString (app, key, "1No_Encontrado", r, sizeof (r));
-	printf ("(%d)\n", GetProfileInt (app, key, 5));
-	printf ("%s\n", r);
-	WriteProfileString (app, key, valor);
-    }
-}
-#endif
diff --git a/misc/user.c b/misc/user.c
index 476d86124c481d6487f4cebf4b79ae394e8de887..58087eeaaa8db22e685c5a4fc7103d39fb77b4fe 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -50,7 +50,10 @@ USER_InitApp(int hInstance)
     DCE_Init();
     
       /* Initialize built-in window classes */
-    WIDGETS_Init();
+    if (!WIDGETS_Init()) return 0;
+
+      /* Initialize dialog manager */
+    if (!DIALOG_Init()) return 0;
     
       /* Create task message queue */
     if (!SetMessageQueue( DEFAULT_MSG_QUEUE_SIZE )) return 0;
diff --git a/misc/xt.c b/misc/xt.c
index 5756d39aaf8f7e9e2a69dc846573311cefe90f94..928d6dd38ab55967c62a36979325a70d48285599 100644
--- a/misc/xt.c
+++ b/misc/xt.c
@@ -14,12 +14,7 @@ static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 #include <X11/Core.h>
 #include <X11/Shell.h>
 
-#include "message.h"
-#include "callback.h"
-#include "win.h"
-#include "class.h"
-#include "gdi.h"
-#include "user.h"
+#include "windows.h"
 
 #ifdef __NetBSD__
 #define HZ 100
@@ -50,87 +45,6 @@ void main(int argc, char **argv)
 }
 
 
-/***********************************************************************
- *           DefWindowProc   (USER.107)
- */
-LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
-{
-    WND * wndPtr;
-    CLASS * classPtr;
-    LPSTR textPtr;
-    int len;
-    
-#ifdef DEBUG_MESSAGE
-    printf( "DefWindowProc: %d %d %d %08x\n", hwnd, msg, wParam, lParam );
-#endif
-
-    switch(msg)
-    {
-    case WM_PAINT:
-	{
-	    PAINTSTRUCT paintstruct;
-	    BeginPaint( hwnd, &paintstruct );
-	    EndPaint( hwnd, &paintstruct );
-	    return 0;
-	}
-
-    case WM_CREATE:
-	return 0;
-
-    case WM_CLOSE:
-	DestroyWindow( hwnd );
-	return 0;
-
-    case WM_ERASEBKGND:
-    case WM_ICONERASEBKGND:
-	{
-	    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 1;
-	    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
-	    if (!classPtr->wc.hbrBackground) return 1;
-	    FillWindow( wndPtr->hwndParent, hwnd, (HDC)wParam,
-		        classPtr->wc.hbrBackground );
-	    GlobalUnlock( hwnd );
-	    return 0;
-	}
-
-    case WM_GETTEXT:
-	{
-	    if (wParam)
-	    {
-		wndPtr = WIN_FindWndPtr(hwnd);
-		if (wndPtr->hText)
-		{
-		    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
-		    if ((int)wParam > (len = strlen(textPtr)))
-		    {
-			strcpy((LPSTR)lParam, textPtr);
-			GlobalUnlock(hwnd);
-			return (DWORD)len;
-		    }
-		}
-		((LPSTR)lParam)[0] = NULL;
-	    }
-	    GlobalUnlock(hwnd);
-	    return (0L);
-	}
-
-    case WM_GETTEXTLENGTH:
-	{
-	    wndPtr = WIN_FindWndPtr(hwnd);
-	    if (wndPtr->hText)
-	    {
-		textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
-		len = strlen(textPtr);
-		GlobalUnlock(hwnd);
-		return (DWORD)len;
-	    }
-	    GlobalUnlock(hwnd);
-	    return (0L);
-	}
-    }
-    return 0;
-}
-
 
 /********************************************************************
  *
@@ -194,7 +108,8 @@ BOOL IsIconic( HWND hwnd )
     return FALSE;
 }
 
-HMENU CreateMenu() { }
+HMENU CreateMenu() { return 0; }
 
-BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { }
+BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;}
 
+BOOL DestroyMenu( HMENU hmenu ) { return TRUE; }
diff --git a/objects/Makefile b/objects/Makefile
index f1dcd067ebc4ba5b5a1f9080df8064c42448eea8..cb70d89a4ee65b4f43ada6cb2f71738ef2c0ffb6 100644
--- a/objects/Makefile
+++ b/objects/Makefile
@@ -9,7 +9,7 @@ objects.o: $(OBJS)
 	$(LD) -r -o objects.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/objects/color.c b/objects/color.c
index a57b46e5d81293bef56fb715d34336a909ba8a2a..0215d47c9acd09bf799ad6afc5033f49d0632d2c 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -19,6 +19,7 @@ extern Screen * XT_screen;
  * We try to use a private color map if possible, because Windows programs
  * assume that palette(0) == Black and palette(max-1) == White.
  */
+#define USE_PRIVATE_MAP
 
 Colormap COLOR_WinColormap = 0;
 
@@ -71,11 +72,39 @@ static int COLOR_FillDefaultMap()
  *
  * Fill the private colormap.
  */
+#ifdef USE_PRIVATE_MAP
+
 static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
 {
     XColor color;
     int i;
 
+      /* Fill the whole map with a range of colors */
+
+    if ((1 << depth) > NB_SYS_COLORS)
+    {
+	int red_incr, green_incr, blue_incr;
+	int r, g, b;
+	
+	blue_incr  = 0x10000 >> (depth / 3);
+	red_incr   = 0x10000 >> ((depth + 1) / 3);
+	green_incr = 0x10000 >> ((depth + 2) / 3);
+
+	for (i = 0, r = red_incr - 1; r < 0x10000; r += red_incr)
+	    for (g = green_incr - 1; g < 0x10000; g += green_incr)
+		for (b = blue_incr - 1; b < 0x10000; b += blue_incr)
+		{
+		    if (i >= size) break;
+		    color.pixel = i++;
+		    color.red   = r;
+		    color.green = g;
+		    color.blue  = b;
+		    XStoreColor( XT_display, map, &color );
+		}
+    }
+    
+      /* Store the system palette colors */
+
     for (i = 0; i < NB_SYS_COLORS; i++)
     {
 	if (!XParseColor( XT_display, map, SysColors[i], &color ))
@@ -86,7 +115,7 @@ static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
     }
     return TRUE;
 }
-
+#endif  /* USE_PRIVATE_MAP */
 
 /***********************************************************************
  *           COLOR_Init
@@ -117,7 +146,7 @@ BOOL COLOR_Init()
       case StaticColor:
       case TrueColor:
 	COLOR_FillDefaultMap();
-	COLOR_WinColormap = CopyFromParent;
+	COLOR_WinColormap = DefaultColormapOfScreen( XT_screen );	
 	break;	
     }
     return TRUE;
diff --git a/objects/font.c b/objects/font.c
index c30fcecc90f17b1c7ba54d1db7e06124dee38f12..1299a26ac51fc7787148488d9f5e5398345ac91f 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -330,3 +330,38 @@ BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics )
     return TRUE;
 }
 
+
+/***********************************************************************
+ *           GetCharWidth    (GDI.350)
+ */
+BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
+{
+    int i, j;
+    XFontStruct *xfont;
+    XCharStruct *charPtr;
+    int default_width;
+
+    DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
+    if (!dc) return FALSE;
+    xfont = dc->u.x.font.fstruct;
+    
+    /* fixed font? */
+    if (xfont->per_char == NULL)
+    {
+	for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
+	    *(lpBuffer + j) = xfont->max_bounds.width;
+	return TRUE;
+    }
+
+    charPtr = xfont->per_char;
+    default_width = (charPtr + xfont->default_char)->width;
+	
+    for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
+    {
+	if (i < xfont->min_char_or_byte2 || i > xfont->max_char_or_byte2)
+	    *(lpBuffer + j) = default_width;
+	else
+	    *(lpBuffer + j) = charPtr->width;
+    }
+    return TRUE;
+}
diff --git a/objects/palette.c b/objects/palette.c
index ec697002a45e4caa4894614826bdfe3e59517d38..3b101b2608f8958d82615c6e875e9783d532344e 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -33,7 +33,6 @@ BOOL PALETTE_Init()
 {
     int i, size;
     XColor color;
-    Colormap map;
     HPALETTE hpalette;
     LOGPALETTE * palPtr;
 
@@ -44,13 +43,10 @@ BOOL PALETTE_Init()
     palPtr->palNumEntries = size;
     memset( palPtr->palPalEntry, 0xff, size*sizeof(PALETTEENTRY) );
 
-    if ((map = COLOR_WinColormap) == CopyFromParent)
-	map = DefaultColormapOfScreen( XT_screen );
-
     for (i = 0; i < size; i++)
     {
 	color.pixel = i;
-	XQueryColor( XT_display, map, &color );
+	XQueryColor( XT_display, COLOR_WinColormap, &color );
 	palPtr->palPalEntry[i].peRed   = color.red >> 8;
 	palPtr->palPalEntry[i].peGreen = color.green >> 8;
 	palPtr->palPalEntry[i].peBlue  = color.blue >> 8;
@@ -136,7 +132,8 @@ WORD GetNearestPaletteIndex( HPALETTE hpalette, COLORREF color )
     palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
     if (!palPtr) return 0;
 
-    if (COLOR_WinColormap && (hpalette == STOCK_DEFAULT_PALETTE))
+    if ((COLOR_WinColormap != DefaultColormapOfScreen(XT_screen)) &&
+	(hpalette == STOCK_DEFAULT_PALETTE))
     {
 	if ((color & 0xffffff) == 0) return 0;  /* Entry 0 is black */
 	if ((color & 0xffffff) == 0xffffff)     /* Max entry is white */
diff --git a/objects/text.c b/objects/text.c
index 97ff35b5b3fcac1f1de1d9b01daf414a1bef1e74..bbb2740085d7436400cf5b3725008c12d1141658 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -17,6 +17,159 @@ static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 #include "win.h"
 #include "gdi.h"
 
+#define TAB     9
+#define LF     10
+#define CR     13
+#define SPACE  32
+#define PREFIX 38
+
+static int tabstop = 8;
+static int tabwidth;
+static int spacewidth;
+static int prefix_offset;
+
+
+static char *TEXT_NextLine(HDC hdc, char *str, int *count, char *dest, 
+			   int *len, int width, WORD format)
+{
+    /* Return next line of text from a string.
+     * 
+     * hdc - handle to DC.
+     * str - string to parse into lines.
+     * count - length of str.
+     * dest - destination in which to return line.
+     * len - length of resultant line in dest in chars.
+     * width - maximum width of line in pixels.
+     * format - format type passed to DrawText.
+     *
+     * Returns pointer to next char in str after end of the line
+     * or NULL if end of str reached.
+     */
+
+    int i = 0, j = 0, k;
+    int plen = 0;
+    int numspaces;
+    SIZE size;
+    int lasttab = 0;
+    int wb_i = 0, wb_j = 0, wb_count;
+
+    while (*count)
+    {
+	switch (str[i])
+	{
+	case CR:
+	case LF:
+	    if (!(format & DT_SINGLELINE))
+	    {
+		i++;
+		if (str[i] == CR || str[i] == LF)
+		    i++;
+		*len = j;
+		return (&str[i]);
+	    }
+	    dest[j++] = str[i++];
+	    if (!(format & DT_NOCLIP) || !(format & DT_NOPREFIX))
+	    {
+		if (!GetTextExtentPoint(hdc, &dest[j-1], 1, &size))
+		    return NULL;
+		plen += size.cx;
+	    }
+	    break;
+
+	case PREFIX:
+	    if (!(format & DT_NOPREFIX))
+	    {
+		prefix_offset = j + 1;
+		i++;
+	    }
+	    else
+	    {
+		dest[j++] = str[i++];
+		if (!(format & DT_NOCLIP))
+		{
+		    if (!GetTextExtentPoint(hdc, &dest[j-1], 1, &size))
+			return NULL;
+		    plen += size.cx;
+		}
+	    }
+	    break;
+
+	case TAB:
+	    if (format & DT_EXPANDTABS)
+	    {
+		wb_i = ++i;
+		wb_j = j;
+		wb_count = *count;
+
+		if (!GetTextExtentPoint(hdc, &dest[lasttab], j - lasttab,
+					                         &size))
+		    return NULL;
+
+		numspaces = (tabwidth - size.cx) / spacewidth;
+		for (k = 0; k < numspaces; k++)
+		    dest[j++] = SPACE;
+		plen += tabwidth - size.cx;
+		lasttab = wb_j + numspaces;
+	    }
+	    else
+	    {
+		dest[j++] = str[i++];
+		if (!(format & DT_NOCLIP) || !(format & DT_NOPREFIX))
+		{
+		    if (!GetTextExtentPoint(hdc, &dest[j-1], 1, &size))
+			return NULL;
+		    plen += size.cx;
+		}
+	    }
+	    break;
+
+	case SPACE:
+	    dest[j++] = str[i++];
+	    if (!(format & DT_NOCLIP) || !(format & DT_NOPREFIX))
+	    {
+		wb_i = i;
+		wb_j = j - 1;
+		wb_count = *count;
+		if (!GetTextExtentPoint(hdc, &dest[j-1], 1, &size))
+		    return NULL;
+		plen += size.cx;
+	    }
+	    break;
+
+	default:
+	    dest[j++] = str[i++];
+	    if (!(format & DT_NOCLIP) || !(format & DT_NOPREFIX))
+	    {
+		if (!GetTextExtentPoint(hdc, &dest[j-1], 1, &size))
+		    return NULL;
+		plen += size.cx;
+	    }
+	}
+
+	(*count)--;
+	if (!(format & DT_NOCLIP) || (format & DT_WORDBREAK))
+	{
+	    if (plen > width)
+	    {
+		if (format & DT_WORDBREAK)
+		{
+		    *len = wb_j;
+		    *count = wb_count;
+		    return (&str[wb_i]);
+		}
+		else
+		{
+		    *len = j;
+		    return (&str[i]);
+		}
+	    }
+	}
+    }
+    
+    *len = j;
+    return NULL;
+}
+
 
 /***********************************************************************
  *           DrawText    (USER.85)
@@ -24,17 +177,77 @@ static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 int DrawText( HDC hdc, LPSTR str, int count, LPRECT rect, WORD flags )
 {
     SIZE size;
+    char *strPtr;
+    static char line[1024];
+    int len, lh, prefix_x, prefix_len;
+    TEXTMETRIC tm;
     int x = rect->left, y = rect->top;
+    int width = rect->right - rect->left;
+
     if (count == -1) count = strlen(str);
+    strPtr = str;
 
-    if (!GetTextExtentPoint( hdc, str, count, &size )) return 0;
-    
-    if (flags & DT_CENTER) x = (rect->left + rect->right - size.cx) / 2;
-    else if (flags & DT_RIGHT) x = rect->right - size.cx;
-    if (flags & DT_VCENTER) y = (rect->top + rect->bottom - size.cy) / 2;
-    else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
+    GetTextMetrics(hdc, &tm);
+    if (flags & DT_EXTERNALLEADING)
+	lh = tm.tmHeight + tm.tmExternalLeading;
+    else
+	lh = tm.tmHeight;
+
+    if (flags & DT_TABSTOP)
+	tabstop = flags >> 8;
+
+    if (flags & DT_EXPANDTABS)
+    {
+	GetTextExtentPoint(hdc, " ", 1, &size);
+	spacewidth = size.cx;
+	GetTextExtentPoint(hdc, "o", 1, &size);
+	tabwidth = size.cx * tabstop;
+    }
+
+    do
+    {
+	prefix_offset = -1;
+	strPtr = TEXT_NextLine(hdc, strPtr, &count, line, &len, width, flags);
+
+	if (prefix_offset != -1)
+	{
+	    GetTextExtentPoint(hdc, line, prefix_offset - 1, &size);
+	    prefix_x = size.cx;
+	    GetTextExtentPoint(hdc, line + prefix_offset, 1, &size);
+	    prefix_len = size.cx;
+	}
+
+	if (!GetTextExtentPoint(hdc, line, len, &size)) return 0;
+	if (flags & DT_CENTER) x = (rect->left + rect->right -
+				    size.cx) / 2;
+	else if (flags & DT_RIGHT) x = rect->right - size.cx;
+
+	if (flags & DT_SINGLELINE)
+	{
+	    if (flags & DT_VCENTER) y = (rect->top + rect->bottom - 
+					 size.cy) / 2;
+	    else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
+	}
+
+	if (!TextOut(hdc, x, y, line, len)) return 0;
+	if (prefix_offset != -1)
+	{
+	    MoveTo(hdc, x + prefix_x, y + size.cy);
+	    LineTo(hdc, x + prefix_x + prefix_len, y + size.cy);
+	}
+
+	if (strPtr)
+	{
+	    y += lh;
+	    if (!(flags & DT_NOCLIP))
+	    {
+		if (y > rect->bottom - lh)
+		    break;
+	    }
+	}
+    }
+    while (strPtr);
 
-    if (!TextOut( hdc, x, y, str, count )) return 0;
     return 1;
 }
 
diff --git a/test/btnlook.c b/test/btnlook.c
index d5b8dcd9fc3abb7ff765509ae8f56311de46ec6e..28f56083dd32cbce66ef54c20fd6ef3ab6ea5a80 100755
--- a/test/btnlook.c
+++ b/test/btnlook.c
@@ -7,23 +7,22 @@
 
 struct
 {
-        long    style;
-        char    *text;
+	long    style;
+	char    *text;
 }
 button[] =
 {
-        BS_PUSHBUTTON,          "PUSHBUTTON",
-        BS_DEFPUSHBUTTON,       "DEFPUSHBUTTON",
-/*        BS_CHECKBOX,            "CHECKBOX",
-        BS_AUTOCHECKBOX,        "AUTOCHECKBOX",
-        BS_RADIOBUTTON,         "RADIOBUTTON",
-        BS_3STATE,              "3STATE",
-        BS_AUTO3STATE,          "AUTO3STATE",
-        BS_GROUPBOX,            "GROUPBOX",
-        BS_USERBUTTON,          "USERBUTTON",
-        BS_AUTORADIOBUTTON,     "AUTORADIOBUTTON",
-        BS_PUSHBOX,             "PUSHBOX"
-*/};
+	BS_PUSHBUTTON,          "PUSHBUTTON",
+	BS_DEFPUSHBUTTON,       "DEFPUSHBUTTON",
+	BS_CHECKBOX,            "CHECKBOX",
+	BS_AUTOCHECKBOX,        "AUTOCHECKBOX",
+	BS_RADIOBUTTON,         "RADIOBUTTON",
+	BS_3STATE,              "3STATE",
+	BS_AUTO3STATE,          "AUTO3STATE",
+	BS_GROUPBOX,            "GROUPBOX",
+	BS_USERBUTTON,          "USERBUTTON",
+	BS_AUTORADIOBUTTON,     "AUTORADIOBUTTON"
+};
 
 #define NUM (sizeof button / sizeof button[0])
 
@@ -72,18 +71,18 @@ int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
 
 long FAR PASCAL _export WndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 {
-        static char szPrm[]    = "wParam      LOWORD(lParam)  HIWORD(lParam)",
-                    szTop[]    = "Control ID  Window Handle   Notification",
-                    szUnd[]    = "__________  _____________   ____________",
-                    szFormat[] = " %5u          %4X          %5u",
-                    szBuffer[50];
-        static HWND hwndButton[NUM];
-        static RECT rect;
-        static int  cxChar, cyChar;
+	static char szPrm[]    = "wParam      LOWORD(lParam)  HIWORD(lParam)",
+		    szTop[]    = "Control ID  Window Handle   Notification",
+		    szUnd[]    = "__________  _____________   ____________",
+		    szFormat[] = " %5u          %4X          %5u",
+		    szBuffer[50];
+	static HWND hwndButton[NUM];
+	static RECT rect;
+	static int  cxChar, cyChar;
 	HDC         hdc;
 	PAINTSTRUCT ps;
-        int         i;
-        TEXTMETRIC  tm;
+	int         i;
+	TEXTMETRIC  tm;
 
 	switch (message)
 	{
diff --git a/test/btnlook.exe b/test/btnlook.exe
index b65a5edd08e7859443bfeed25a3f8fa2c59be2ac..134c8a14d1b7184dc568d67364ad0eff694f8987 100755
Binary files a/test/btnlook.exe and b/test/btnlook.exe differ
diff --git a/test/hyperoid/blank.bmp b/test/hyperoid/blank.bmp
deleted file mode 100644
index 11840afa37bfb854a2cef67c94c279b4f54763db..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/blank.bmp and /dev/null differ
diff --git a/test/hyperoid/bomb.bmp b/test/hyperoid/bomb.bmp
deleted file mode 100644
index 5fcde4a8efc642efca56e5edc88c6622df5858bd..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/bomb.bmp and /dev/null differ
diff --git a/test/hyperoid/copying.txt b/test/hyperoid/copying.txt
deleted file mode 100644
index 2d64ec5395a7f85ab7a44cc04e1a4a43240e604d..0000000000000000000000000000000000000000
--- a/test/hyperoid/copying.txt
+++ /dev/null
@@ -1,292 +0,0 @@
- 
-                    GNU GENERAL PUBLIC LICENSE
-                     Version 1, February 1989
-
- Copyright (C) 1989 Free Software Foundation, Inc.
-                    675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The license agreements of most software companies try to keep users
-at the mercy of those companies.  By contrast, our General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  The
-General Public License applies to the Free Software Foundation's
-software and to any other program whose authors commit to using it.
-You can use it for your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Specifically, the General Public License is designed to make
-sure that you have the freedom to give away or sell copies of free
-software, that you receive source code or can get it if you want it,
-that you can change the software or use pieces of it in new free
-programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of a such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must tell them their rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any program or other work which
-contains a notice placed by the copyright holder saying it may be
-distributed under the terms of this General Public License.  The
-"Program", below, refers to any such program or work, and a "work based
-on the Program" means either the Program or any work containing the
-Program or a portion of it, either verbatim or with modifications.  Each
-licensee is addressed as "you".
-
-  1. You may copy and distribute verbatim copies of the Program's source
-code as you receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice and
-disclaimer of warranty; keep intact all the notices that refer to this
-General Public License and to the absence of any warranty; and give any
-other recipients of the Program a copy of this General Public License
-along with the Program.  You may charge a fee for the physical act of
-transferring a copy.
-
-  2. You may modify your copy or copies of the Program or any portion of
-it, and copy and distribute such modifications under the terms of Paragraph
-1 above, provided that you also do the following:
-
-    a) cause the modified files to carry prominent notices stating that
-    you changed the files and the date of any change; and
-
-    b) cause the whole of any work that you distribute or publish, that
-    in whole or in part contains the Program or any part thereof, either
-    with or without modifications, to be licensed at no charge to all
-    third parties under the terms of this General Public License (except
-    that you may choose to grant warranty protection to some or all
-    third parties, at your option).
-
-    c) If the modified program normally reads commands interactively when
-    run, you must cause it, when started running for such interactive use
-    in the simplest and most usual way, to print or display an
-    announcement including an appropriate copyright notice and a notice
-    that there is no warranty (or else, saying that you provide a
-    warranty) and that users may redistribute the program under these
-    conditions, and telling the user how to view a copy of this General
-    Public License.
-
-    d) You may charge a fee for the physical act of transferring a
-    copy, and you may at your option offer warranty protection in
-    exchange for a fee.
-
-Mere aggregation of another independent work with the Program (or its
-derivative) on a volume of a storage or distribution medium does not bring
-the other work under the scope of these terms.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  3. You may copy and distribute the Program (or a portion or derivative of
-it, under Paragraph 2) in object code or executable form under the terms of
-Paragraphs 1 and 2 above provided that you also do one of the following:
-
-    a) accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of
-    Paragraphs 1 and 2 above; or,
-
-    b) accompany it with a written offer, valid for at least three
-    years, to give any third party free (except for a nominal charge
-    for the cost of distribution) a complete machine-readable copy of the
-    corresponding source code, to be distributed under the terms of
-    Paragraphs 1 and 2 above; or,
-
-    c) accompany it with the information you received as to where the
-    corresponding source code may be obtained.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form alone.)
-
-Source code for a work means the preferred form of the work for making
-modifications to it.  For an executable file, complete source code means
-all the source code for all modules it contains; but, as a special
-exception, it need not include source code for modules which are standard
-libraries that accompany the operating system on which the executable
-file runs, or for standard header files or definitions files that
-accompany that operating system.
-
-  4. You may not copy, modify, sublicense, distribute or transfer the
-Program except as expressly provided under this General Public License.
-Any attempt otherwise to copy, modify, sublicense, distribute or transfer
-the Program is void, and will automatically terminate your rights to use
-the Program under this License.  However, parties who have received
-copies, or rights to use copies, from you under this General Public
-License will not have their licenses terminated so long as such parties
-remain in full compliance.
-
-  5. By copying, distributing or modifying the Program (or any work based
-on the Program) you indicate your acceptance of this license to do so,
-and all its terms and conditions.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these
-terms and conditions.  You may not impose any further restrictions on the
-recipients' exercise of the rights granted herein.
-
-
-
-  7. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of the license which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-the license, you may choose any version ever published by the Free Software
-Foundation.
-
-  8. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-
-
-
-        Appendix: How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to humanity, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these
-terms.
-
-  To do so, attach the following notices to the program.  It is safest to
-attach them to the start of each source file to most effectively convey
-the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) 19yy  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 1, or (at your option)
-    any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) 19xx name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the
-appropriate parts of the General Public License.  Of course, the
-commands you use may be called something other than `show w' and `show
-c'; they could even be mouse-clicks or menu items--whatever suits your
-program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  program `Gnomovision' (a program to direct compilers to make passes
-  at assemblers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-That's all there is to it!
- 
diff --git a/test/hyperoid/hyperoid.c b/test/hyperoid/hyperoid.c
deleted file mode 100644
index f396d55dbd8a10b9f650929606fbb940d321abdd..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.c
+++ /dev/null
@@ -1,1851 +0,0 @@
-//
-// HYPEROID - a neato game
-//
-// Version: 1.1  Copyright (C) 1990,91 Hutchins Software
-//      This software is licenced under the GNU General Public Licence
-//      Please read the associated legal documentation
-// Author: Edward Hutchins
-// Internet: eah1@cec1.wustl.edu
-// USNail: c/o Edward Hutchins, 63 Ridgemoor Dr., Clayton, MO, 63105
-// Revisions:
-// 10/31/91 made game better/harder - Ed.
-//
-// Music: R.E.M./The Cure/Ministry/Front 242/The Smiths/New Order/Hendrix...
-// Beers: Bass Ale, Augsberger Dark
-//
-
-#include "hyperoid.h"
-
-//
-// imports
-//
-
-IMPORT POINT        LetterPart[] FROM( roidsupp.c );
-IMPORT NPSTR        szNumberDesc[] FROM( roidsupp.c );
-IMPORT NPSTR        szLetterDesc[] FROM( roidsupp.c );
-
-//
-// globals
-//
-
-GLOBAL CHAR         szAppName[32];
-GLOBAL HANDLE       hAppInst;
-GLOBAL HWND         hAppWnd;
-GLOBAL HPALETTE     hAppPalette;
-GLOBAL INT          nDrawDelay;
-GLOBAL INT          nLevel;
-GLOBAL INT          nSafe;
-GLOBAL INT          nShield;
-GLOBAL INT          nBomb;
-GLOBAL INT          nBadGuys;
-GLOBAL LONG         lScore;
-GLOBAL LONG         lLastLife;
-GLOBAL LONG         lHighScore;
-GLOBAL BOOL         bRestart;
-GLOBAL BOOL         bPaused;
-GLOBAL BOOL         bBW;
-GLOBAL INT          vkShld;
-GLOBAL INT          vkClkw;
-GLOBAL INT          vkCtrClkw;
-GLOBAL INT          vkThrst;
-GLOBAL INT          vkRvThrst;
-GLOBAL INT          vkFire;
-GLOBAL INT          vkBomb;
-GLOBAL NPOBJ        npPlayer;
-GLOBAL LIST         FreeList;
-GLOBAL LIST         RoidList;
-GLOBAL LIST         ShotList;
-GLOBAL LIST         FlameList;
-GLOBAL LIST         SpinnerList;
-GLOBAL LIST         HunterList;
-GLOBAL LIST         HunterShotList;
-GLOBAL LIST         SwarmerList;
-GLOBAL LIST         LetterList;
-GLOBAL LIST         BonusList;
-GLOBAL INT          nCos[DEGREE_SIZE];
-GLOBAL INT          nSin[DEGREE_SIZE];
-GLOBAL HPEN         hPen[PALETTE_SIZE];
-GLOBAL OBJ          Obj[MAX_OBJS];
-GLOBAL HBITMAP      hBitmap[IDB_MAX];
-
-//
-// locals
-//
-
-LOCAL DWORD         dwSeed;
-LOCAL INT           nScoreLen;
-LOCAL CHAR          szScore[40];
-LOCAL RECT          rectScoreClip;
-LOCAL RECT          rectShotClip;
-LOCAL POINT         Player[] =
-{ {0, 0}, {160, 150}, {0, 250}, {96, 150}, {0, 0} };
-LOCAL POINT         Spinner[] =
-{ {160, 150}, {224, 100}, {96, 100}, {32, 150}, {160, 150} };
-LOCAL POINT         Swarmer[] =
-{ {0, 100}, {64, 100}, {128, 100}, {192, 100}, {0, 100} };
-LOCAL POINT         Hunter[] =
-{
-	{160, 150}, {0, 250}, {192, 30}, {64, 30},
-	{0, 250}, {96, 150}, {128, 150}, {160, 150}
-};
-LOCAL POINT         Bonus[] =
-{ {0, 150}, {102, 150}, {205, 150}, {51, 150}, {154, 150}, {0, 150} };
-
-//
-// KillBadGuy - kill off a badguy (made into a macro)
-//
-
-#define KillBadGuy() \
-((--nBadGuys <= 0)?(SetRestart( RESTART_NEXTLEVEL ),TRUE):FALSE)
-
-//
-// arand - pseudorandom number from 0 to x-1 (thanks antman!)
-//
-
-INT NEAR PASCAL arand( INT x )
-{
-	dwSeed = dwSeed * 0x343fd + 0x269ec3;
-	return( (INT)(((dwSeed >> 16) & 0x7fff) * x >> 15) );
-}
-
-//
-// AddHead - add an object to the head of a list
-//
-
-VOID NEAR PASCAL AddHead( NPLIST npList, NPNODE npNode )
-{
-	if (npList->npHead)
-	{
-		npNode->npNext = npList->npHead;
-		npNode->npPrev = NULL;
-		npList->npHead = (npList->npHead->npPrev = npNode);
-	}
-	else // add to an empty list
-	{
-		npList->npHead = npList->npTail = npNode;
-		npNode->npNext = npNode->npPrev = NULL;
-	}
-}
-
-//
-// RemHead - remove the first element in a list
-//
-
-NPNODE NEAR PASCAL RemHead( NPLIST npList )
-{
-	if (npList->npHead)
-	{
-		NPNODE npNode = npList->npHead;
-		if (npList->npTail != npNode)
-		{
-			npList->npHead = npNode->npNext;
-			npNode->npNext->npPrev = NULL;
-		}
-		else npList->npHead = npList->npTail = NULL;
-		return( npNode );
-	}
-	else return( NULL );
-}
-
-//
-// Remove - remove an arbitrary element from a list
-//
-
-VOID NEAR PASCAL Remove( NPLIST npList, NPNODE npNode )
-{
-	if (npNode->npPrev) npNode->npPrev->npNext = npNode->npNext;
-	else npList->npHead = npNode->npNext;
-	if (npNode->npNext) npNode->npNext->npPrev = npNode->npPrev;
-	else npList->npTail = npNode->npPrev;
-}
-
-//
-// DrawObject - draw a single object
-//
-
-VOID NEAR PASCAL DrawObject( HDC hDC, NPOBJ npObj )
-{
-	INT             nCnt;
-	INT             nDir = (npObj->nDir += npObj->nSpin);
-	INT             x = (npObj->Pos.x += npObj->Vel.x);
-	INT             y = (npObj->Pos.y += npObj->Vel.y);
-	POINT           Pts[MAX_PTS];
-
-	if (x < -CLIP_COORD) npObj->Pos.x = x = CLIP_COORD;
-	else if (x > CLIP_COORD) npObj->Pos.x = x = -CLIP_COORD;
-	if (y < -CLIP_COORD) npObj->Pos.y = y = CLIP_COORD;
-	else if (y > CLIP_COORD) npObj->Pos.y = y = -CLIP_COORD;
-
-	for (nCnt = npObj->byPts - 1; nCnt >= 0; --nCnt)
-	{
-		WORD wDeg = DEG( npObj->Pts[nCnt].x + nDir );
-		INT nLen = npObj->Pts[nCnt].y;
-		Pts[nCnt].x = x + MULDEG( nLen, nCos[wDeg] );
-		Pts[nCnt].y = y + MULDEG( nLen, nSin[wDeg] );
-	}
-
-	if (npObj->byPts > 1)
-	{
-		SelectObject( hDC, hPen[BLACK] );
-		Polyline( hDC, npObj->Old, npObj->byPts );
-		if (npObj->nCount > 0)
-		{
-			SelectObject( hDC, hPen[npObj->byColor] );
-			Polyline( hDC, Pts, npObj->byPts );
-			for (nCnt = npObj->byPts - 1; nCnt >= 0; --nCnt)
-				npObj->Old[nCnt] = Pts[nCnt];
-		}
-	}
-	else // just a point
-	{
-		SetPixel( hDC, npObj->Old[0].x, npObj->Old[0].y, PALETTEINDEX( BLACK ) );
-		if (npObj->nCount > 0)
-		{
-			SetPixel( hDC, Pts[0].x, Pts[0].y, PALETTEINDEX( npObj->byColor ) );
-			npObj->Old[0] = Pts[0];
-		}
-	}
-}
-
-//
-// SetRestart - set the restart timer
-//
-
-VOID NEAR PASCAL SetRestart( RESTART_MODE Restart )
-{
-	POINT           Pt;
-	CHAR            szBuff[32];
-
-	if (bRestart) return;
-	SetTimer( hAppWnd, RESTART_TIMER, RESTART_DELAY, NULL );
-	bRestart = TRUE;
-
-	Pt.x = Pt.y = 0;
-	switch (Restart)
-	{
-	case RESTART_GAME:
-		SpinLetters( "GAME OVER", Pt, Pt, RED, 400 );
-		break;
-	case RESTART_LEVEL:
-		PrintLetters( "GET READY", Pt, Pt, BLUE, 300 );
-		break;
-	case RESTART_NEXTLEVEL:
-		wsprintf( szBuff, "LEVEL %u", nLevel + 1 );
-		PrintLetters( szBuff, Pt, Pt, BLUE, 300 );
-		break;
-	}
-}
-
-//
-// PrintPlayerMessage - show the player a status message
-//
-
-VOID NEAR PASCAL PrintPlayerMessage( NPSTR npszText )
-{
-	POINT Pos, Vel;
-
-	Pos = npPlayer->Pos;
-	Pos.y -= 400;
-	Vel.x = 0;
-	Vel.y = -50;
-	PrintLetters( npszText, Pos, Vel, GREEN, 150 );
-}
-
-//
-// AddExtraLife - give the player another life
-//
-
-VOID NEAR PASCAL AddExtraLife( VOID )
-{
-	PrintPlayerMessage( "EXTRA LIFE" );
-	++npPlayer->nCount;
-	npPlayer->byColor = (BYTE)(BLACK + npPlayer->nCount);
-	if (npPlayer->byColor > WHITE) npPlayer->byColor = WHITE;
-}
-
-//
-// Hit - something hit an object, do fireworks
-//
-
-VOID NEAR PASCAL Hit( HDC hDC, NPOBJ npObj )
-{
-	INT             nCnt;
-
-	for (nCnt = 0; nCnt < 6; ++nCnt)
-	{
-		NPOBJ npFlame = RemHeadObj( &FreeList );
-		if (!npFlame) return;
-		npFlame->Pos.x = npObj->Pos.x;
-		npFlame->Pos.y = npObj->Pos.y;
-		npFlame->Vel.x = npObj->Vel.x;
-		npFlame->Vel.y = npObj->Vel.y;
-		npFlame->nDir = npObj->nDir + (nCnt * DEGREE_SIZE) / 6;
-		npFlame->nSpin = 0;
-		npFlame->nCount = 10 + arand( 8 );
-		npFlame->byColor = YELLOW;
-		npFlame->byPts = 1;
-		npFlame->Pts[0].x = npFlame->Pts[0].y = 0;
-		ACCEL( npFlame, npFlame->nDir, 50 - npFlame->nCount );
-		AddHeadObj( &FlameList, npFlame );
-	}
-}
-
-//
-// Explode - explode an object
-//
-
-VOID NEAR PASCAL Explode( HDC hDC, NPOBJ npObj )
-{
-	INT             nCnt, nSize = npObj->byPts;
-
-	DrawObject( hDC, npObj );
-	for (nCnt = 0; nCnt < nSize; ++nCnt)
-	{
-		NPOBJ npFlame;
-		if (arand( 2 )) continue;
-		if (!(npFlame = RemHeadObj( &FreeList ))) return;
-		npFlame->Pos.x = npObj->Pos.x;
-		npFlame->Pos.y = npObj->Pos.y;
-		npFlame->Vel.x = npObj->Vel.x;
-		npFlame->Vel.y = npObj->Vel.y;
-		npFlame->nDir = npObj->nDir + nCnt * DEGREE_SIZE / nSize + arand( 32 );
-		npFlame->nSpin = arand( 31 ) - 15;
-		npFlame->nCount = 25 + arand( 16 );
-		npFlame->byColor = npObj->byColor;
-		npFlame->byPts = 2;
-		npFlame->Pts[0] = npObj->Pts[nCnt];
-		if (nCnt == nSize - 1) npFlame->Pts[1] = npObj->Pts[0];
-		else npFlame->Pts[1] = npObj->Pts[nCnt + 1];
-		ACCEL( npFlame, npFlame->nDir, 60 - npFlame->nCount );
-		AddHeadObj( &FlameList, npFlame );
-	}
-	Hit( hDC, npObj );
-}
-
-//
-// HitPlayer - blow up the player
-//
-
-BOOL NEAR PASCAL HitPlayer( HDC hDC, NPOBJ npObj )
-{
-	POINT           Vel;
-	INT             nMass, nSpin;
-
-	if (nSafe || (npPlayer->nCount <= 0)) return( FALSE );
-
-	// rumble and shake both objects
-	nMass = npPlayer->nMass + npObj->nMass;
-
-	nSpin = npPlayer->nSpin + npObj->nSpin;
-	npObj->nSpin -= MulDiv( nSpin, npPlayer->nMass, nMass );
-	npPlayer->nSpin -= MulDiv( nSpin, npObj->nMass, nMass );
-
-	Vel.x = npPlayer->Vel.x - npObj->Vel.x;
-	Vel.y = npPlayer->Vel.y - npObj->Vel.y;
-	npObj->Vel.x += MulDiv( Vel.x, npPlayer->nMass, nMass );
-	npObj->Vel.y += MulDiv( Vel.y, npPlayer->nMass, nMass );
-	npPlayer->Vel.x -= MulDiv( Vel.x, npObj->nMass, nMass );
-	npPlayer->Vel.y -= MulDiv( Vel.y, npObj->nMass, nMass );
-
-	if (--npPlayer->nCount)
-	{
-		npPlayer->byColor = (BYTE)(BLACK + npPlayer->nCount);
-		if (npPlayer->byColor > WHITE) npPlayer->byColor = WHITE;
-		Hit( hDC, npPlayer );
-		return( TRUE );
-	}
-
-	// final death
-	npPlayer->byColor = WHITE;
-	Explode( hDC, npPlayer );
-	SetRestart( RESTART_GAME );
-	return( FALSE );
-}
-
-//
-// CreateLetter - make a new letter object
-//
-
-NPOBJ FAR PASCAL CreateLetter( CHAR cLetter, INT nSize )
-{
-	NPOBJ           npLtr;
-	INT             nCnt;
-	NPSTR           npDesc;
-
-	if (cLetter >= '0' && cLetter <= '9') npDesc = szNumberDesc[cLetter - '0'];
-	else if (cLetter >= 'A' && cLetter <= 'Z') npDesc = szLetterDesc[cLetter - 'A'];
-	else if (cLetter >= 'a' && cLetter <= 'z') npDesc = szLetterDesc[cLetter - 'a'];
-	else if (cLetter == '.') npDesc = "l";
-	else return( NULL );
-
-	if (npLtr = RemHeadObj( &FreeList ))
-	{
-		npLtr->nMass = 1;
-		npLtr->nDir = 0;
-		npLtr->nSpin = 0;
-		npLtr->nCount = 40;
-		npLtr->byColor = WHITE;
-		npLtr->byPts = (BYTE)(nCnt = strlen( npDesc ));
-		while (nCnt--)
-		{
-			npLtr->Pts[nCnt] = LetterPart[npDesc[nCnt] - 'a'];
-			npLtr->Pts[nCnt].y = MulDiv( npLtr->Pts[nCnt].y, nSize, LETTER_MAX );
-		}
-		AddHeadObj( &LetterList, npLtr );
-	}
-	return( npLtr );
-}
-
-//
-// DrawLetters - draw letters and such
-//
-
-VOID NEAR PASCAL DrawLetters( HDC hDC )
-{
-	NPOBJ           npLtr, npNext;
-
-	for (npLtr = HeadObj( &LetterList ); npLtr; npLtr = npNext)
-	{
-		npNext = NextObj( npLtr );
-		switch (--npLtr->nCount)
-		{
-		case 3:
-			--npLtr->byColor;
-			break;
-		case 0:
-			RemoveObj( &LetterList, npLtr );
-			AddHeadObj( &FreeList, npLtr );
-			break;
-		}
-		DrawObject( hDC, npLtr );
-	}
-}
-
-//
-// CreateBonus - make a new bonus object
-//
-
-VOID NEAR PASCAL CreateBonus( VOID )
-{
-	NPOBJ           npBonus;
-	INT             nCnt;
-
-	if (npBonus = RemHeadObj( &FreeList ))
-	{
-		npBonus->Pos.x = arand( CLIP_COORD * 2 ) - CLIP_COORD;
-		npBonus->Pos.y = -CLIP_COORD;
-		npBonus->Vel.x = npBonus->Vel.y = 0;
-		npBonus->nDir = arand( DEGREE_SIZE );
-		npBonus->nSpin = (arand( 2 ) ? 12 : -12);
-		npBonus->nCount = arand( 4 ) + 1;
-		npBonus->nDelay = 64 + arand( 128 );
-		npBonus->nMass = 1;
-		npBonus->byColor = (BYTE)(WHITE + (npBonus->nCount * 2));
-		npBonus->byPts = DIM(Bonus);
-		for (nCnt = 0; nCnt < DIM(Bonus); ++nCnt)
-			npBonus->Pts[nCnt] = Bonus[nCnt];
-		ACCEL( npBonus, npBonus->nDir, 30 + nLevel * 2 );
-		AddHeadObj( &BonusList, npBonus );
-	}
-}
-
-//
-// DrawBonuses - process and draw the bonus list
-//
-
-VOID NEAR PASCAL DrawBonuses( HDC hDC )
-{
-	NPOBJ           npBonus, npNext;
-	LOCAL INT       nNextBonus = 1000;
-
-	if (nBadGuys && (--nNextBonus < 0))
-	{
-		CreateBonus();
-		nNextBonus = 1000;
-	}
-
-	for (npBonus = HeadObj( &BonusList ); npBonus; npBonus = npNext)
-	{
-		NPOBJ           npShot;
-		INT             nDelta;
-		RECT            rect;
-
-		npNext = NextObj( npBonus );
-
-		MKRECT( &rect, npBonus->Pos, 150 );
-
-		if (PTINRECT( &rect, npPlayer->Pos ))
-		{
-			if (npPlayer->nCount > 0) switch (npBonus->nCount)
-			{
-			case 1:
-				{
-					CHAR szBuff[32];
-					LONG lBonus = 1000L * nLevel;
-					if (lBonus == 0) lBonus = 500;
-					lScore += lBonus;
-					wsprintf( szBuff, "%ld", lBonus );
-					PrintPlayerMessage( szBuff );
-				}
-				break;
-			case 2:
-				nSafe = 15;
-				++nShield;
-				npPlayer->byColor = GREEN;
-				PrintPlayerMessage( "EXTRA SHIELD" );
-				break;
-			case 3:
-				++nBomb;
-				PrintPlayerMessage( "EXTRA BOMB" );
-				break;
-			case 4:
-				AddExtraLife();
-				break;
-			}
-			npBonus->nCount = 0;
-			Explode( hDC, npBonus );
-			RemoveObj( &BonusList, npBonus );
-			AddHeadObj( &FreeList, npBonus );
-		}
-		else if (INTRECT(&rect, &rectShotClip))
-		{
-			for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			{
-				if (!PTINRECT( &rect, npShot->Pos )) continue;
-				npShot->nCount = 1;
-				npBonus->nCount = 0;
-				Explode( hDC, npBonus );
-				RemoveObj( &BonusList, npBonus );
-				AddHeadObj( &FreeList, npBonus );
-			}
-		}
-		if (npBonus->nCount && --npBonus->nDelay <= 0)
-		{
-			--npBonus->nCount;
-			npBonus->nDelay = 64 + arand( 128 );
-			npBonus->byColor = (BYTE)(WHITE + (npBonus->nCount * 2));
-			if (npBonus->nCount == 0)
-			{
-				Explode( hDC, npBonus );
-				RemoveObj( &BonusList, npBonus );
-				AddHeadObj( &FreeList, npBonus );
-			}
-		}
-		nDelta = npPlayer->Pos.x - npBonus->Pos.x;
-		while (nDelta < -16 || nDelta > 16) nDelta /= 2;
-		npBonus->Vel.x += nDelta - npBonus->Vel.x / 16;
-		nDelta = npPlayer->Pos.y - npBonus->Pos.y;
-		while (nDelta < -16 || nDelta > 16) nDelta /= 2;
-		npBonus->Vel.y += nDelta - npBonus->Vel.y / 16;
-		DrawObject( hDC, npBonus );
-	}
-}
-
-//
-// DrawHunterShots - process and draw the hunter shot list
-//
-
-VOID NEAR PASCAL DrawHunterShots( HDC hDC )
-{
-	NPOBJ           npShot, npNext;
-
-	for (npShot = HeadObj( &HunterShotList ); npShot; npShot = npNext)
-	{
-		RECT            rect;
-
-		npNext = NextObj( npShot );
-
-		MKRECT( &rect, npShot->Pos, 200 );
-
-		if (PTINRECT( &rect, npPlayer->Pos ))
-		{
-			HitPlayer( hDC, npShot );
-			npShot->nCount = 1;
-		}
-		switch (--npShot->nCount)
-		{
-		case 7:
-			npShot->byColor = DKGREEN;
-			break;
-		case 0:
-			RemoveObj( &HunterShotList, npShot );
-			AddHeadObj( &FreeList, npShot );
-			break;
-		}
-		DrawObject( hDC, npShot );
-	}
-}
-
-//
-// FireHunterShot - fire a hunter bullet
-//
-
-VOID NEAR PASCAL FireHunterShot( NPOBJ npHunt )
-{
-	NPOBJ           npShot;
-
-	if (npShot = RemHeadObj( &FreeList ))
-	{
-		npShot->Pos.x = npHunt->Pos.x;
-		npShot->Pos.y = npHunt->Pos.y;
-		npShot->Vel.x = npHunt->Vel.x;
-		npShot->Vel.y = npHunt->Vel.y;
-		npShot->nMass = 8;
-		npShot->nDir = npHunt->nDir + arand( 5 ) - 2;
-		npShot->nSpin = (arand( 2 ) ? 10 : -10);
-		npShot->nCount = 16 + arand( 8 );
-		npShot->byColor = GREEN;
-		npShot->byPts = 2;
-		npShot->Pts[0].x = 128;
-		npShot->Pts[0].y = 50;
-		npShot->Pts[1].x = 0;
-		npShot->Pts[1].y = 50;
-		ACCEL( npShot, npShot->nDir, 200 + npShot->nCount );
-		AddHeadObj( &HunterShotList, npShot );
-	}
-}
-
-//
-// CreateHunter - make a new hunter
-//
-
-VOID NEAR PASCAL CreateHunter( VOID )
-{
-	NPOBJ           npHunt;
-	INT             nCnt;
-
-	if (npHunt = RemHeadObj( &FreeList ))
-	{
-		npHunt->Pos.x = arand( CLIP_COORD * 2 ) - CLIP_COORD;
-		npHunt->Pos.y = -CLIP_COORD;
-		npHunt->Vel.x = npHunt->Vel.y = 0;
-		npHunt->nMass = 256;
-		npHunt->nDir = arand( DEGREE_SIZE );
-		npHunt->nSpin = 0;
-		npHunt->nCount = 1 + arand( nLevel );
-		npHunt->nDelay = 2 + arand( 10 );
-		npHunt->byColor = CYAN;
-		npHunt->byPts = DIM(Hunter);
-		for (nCnt = 0; nCnt < DIM(Hunter); ++nCnt)
-			npHunt->Pts[nCnt] = Hunter[nCnt];
-		ACCEL( npHunt, npHunt->nDir, 30 + nLevel * 2 );
-		AddHeadObj( &HunterList, npHunt );
-		++nBadGuys;
-	}
-}
-
-//
-// DrawHunters - process and draw the hunter list
-//
-
-VOID NEAR PASCAL DrawHunters( HDC hDC )
-{
-	NPOBJ           npHunt, npNext;
-	LOCAL INT       nNextHunter = 200;
-
-	if (nBadGuys && (--nNextHunter < 0))
-	{
-		CreateHunter();
-		nNextHunter = 1000 + arand( 1000 ) - nLevel * 8;
-	}
-
-	for (npHunt = HeadObj( &HunterList ); npHunt; npHunt = npNext)
-	{
-		NPOBJ           npShot;
-		RECT            rect;
-
-		npNext = NextObj( npHunt );
-
-		MKRECT( &rect, npHunt->Pos, 200 );
-
-		if (PTINRECT( &rect, npPlayer->Pos ))
-		{
-			HitPlayer( hDC, npHunt );
-			--npHunt->nCount;
-			if (npHunt->nCount < 1)
-			{
-				KillBadGuy();
-				npHunt->byColor = CYAN;
-				Explode( hDC, npHunt );
-				RemoveObj( &HunterList, npHunt );
-				AddHeadObj( &FreeList, npHunt );
-			}
-			else if (npHunt->nCount == 1) npHunt->byColor = DKCYAN;
-		}
-		else if (INTRECT(&rect, &rectShotClip))
-		{
-			for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			{
-				if (!PTINRECT( &rect, npShot->Pos )) continue;
-				npShot->nCount = 1;
-				lScore += npHunt->nCount * 1000;
-				if (--npHunt->nCount < 1)
-				{
-					KillBadGuy();
-					npHunt->byColor = CYAN;
-					Explode( hDC, npHunt );
-					RemoveObj( &HunterList, npHunt );
-					AddHeadObj( &FreeList, npHunt );
-				}
-				else
-				{
-					if (npHunt->nCount == 1) npHunt->byColor = DKCYAN;
-					Hit( hDC, npHunt );
-				}
-				break;
-			}
-		}
-		ACCEL( npHunt, npHunt->nDir, 8 );
-		npHunt->Vel.x -= npHunt->Vel.x / 16;
-		npHunt->Vel.y -= npHunt->Vel.y / 16;
-		if (--npHunt->nDelay <= 0)
-		{
-			npHunt->nDelay = arand( 10 );
-			npHunt->nSpin = arand( 11 ) - 5;
-			FireHunterShot( npHunt );
-		}
-		DrawObject( hDC, npHunt );
-	}
-}
-
-//
-// CreateSwarmer - make a new swarmer
-//
-
-VOID NEAR PASCAL CreateSwarmer( POINT Pos, INT nDir, INT nCount )
-{
-	NPOBJ           npSwarm;
-	INT             nCnt;
-
-	if (npSwarm = RemHeadObj( &FreeList ))
-	{
-		npSwarm->Pos = Pos;
-		npSwarm->Vel.x = npSwarm->Vel.y = 0;
-		npSwarm->nDir = nDir;
-		npSwarm->nSpin = arand( 31 ) - 15;
-		npSwarm->nCount = nCount;
-		npSwarm->nDelay = 64 + arand( 64 );
-		npSwarm->nMass = 32;
-		npSwarm->byColor = DKGREEN;
-		npSwarm->byPts = DIM(Swarmer);
-		for (nCnt = 0; nCnt < DIM(Swarmer); ++nCnt)
-		{
-			npSwarm->Pts[nCnt] = Swarmer[nCnt];
-			npSwarm->Pts[nCnt].y += nCount * 10;
-		}
-		ACCEL( npSwarm, npSwarm->nDir, 30 + nLevel * 2 );
-		AddHeadObj( &SwarmerList, npSwarm );
-		++nBadGuys;
-	}
-}
-
-//
-// DrawSwarmers - process and draw the swarmer list
-//
-
-VOID NEAR PASCAL DrawSwarmers( HDC hDC )
-{
-	NPOBJ           npSwarm, npNext;
-	LOCAL INT       nNextSwarmer = 1000;
-
-	if (nBadGuys && (--nNextSwarmer < 0))
-	{
-		POINT Pos;
-		Pos.x = arand( CLIP_COORD * 2 ) - CLIP_COORD;
-		Pos.y = -CLIP_COORD;
-		CreateSwarmer( Pos, arand( DEGREE_SIZE ), 8 + nLevel * 2 );
-		nNextSwarmer = 1000 + arand( 500 ) - nLevel * 4;
-	}
-
-	for (npSwarm = HeadObj( &SwarmerList ); npSwarm; npSwarm = npNext)
-	{
-		NPOBJ           npShot;
-		RECT            rect;
-
-		npNext = NextObj( npSwarm );
-
-		MKRECT( &rect, npSwarm->Pos, 150 + npSwarm->nCount * 10 );
-
-		if (PTINRECT( &rect, npPlayer->Pos ))
-		{
-			HitPlayer( hDC, npSwarm );
-			npSwarm->nCount = 0;
-		}
-		else if (INTRECT(&rect, &rectShotClip))
-		{
-			for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			{
-				if (!PTINRECT( &rect, npShot->Pos )) continue;
-				npShot->nCount = 1;
-				lScore += npSwarm->nCount * 25;
-				npSwarm->nCount = 0;
-				break;
-			}
-		}
-		if (npSwarm->nCount <= 0)
-		{
-			npSwarm->byColor = GREEN;
-			KillBadGuy();
-			Explode( hDC, npSwarm );
-			RemoveObj( &SwarmerList, npSwarm );
-			AddHeadObj( &FreeList, npSwarm );
-		}
-		else
-		{
-			if ((npSwarm->nCount > 1) && (--npSwarm->nDelay <= 0))
-			{
-				INT nDir = arand( DEGREE_SIZE );
-				INT nCount = npSwarm->nCount / 2;
-				CreateSwarmer( npSwarm->Pos, nDir, nCount );
-				nCount = npSwarm->nCount - nCount;
-				CreateSwarmer( npSwarm->Pos, nDir + 128, nCount );
-				npSwarm->nCount = 0;
-			}
-			DrawObject( hDC, npSwarm );
-		}
-	}
-}
-
-//
-// CreateSpinner - make a new spinner
-//
-
-VOID NEAR PASCAL CreateSpinner( VOID )
-{
-	NPOBJ           npSpin;
-	INT             nCnt;
-
-	if (npSpin = RemHeadObj( &FreeList ))
-	{
-		npSpin->Pos.x = arand( CLIP_COORD * 2 ) - CLIP_COORD;
-		npSpin->Pos.y = -CLIP_COORD;
-		npSpin->Vel.x = npSpin->Vel.y = 0;
-		npSpin->nDir = arand( DEGREE_SIZE );
-		npSpin->nSpin = -12;
-		npSpin->nCount = 1 + arand( nLevel );
-		npSpin->nMass = 64 + npSpin->nCount * 32;
-		npSpin->byColor = (BYTE)(MAGENTA - npSpin->nCount);
-		npSpin->byPts = DIM(Spinner);
-		for (nCnt = 0; nCnt < DIM(Spinner); ++nCnt)
-			npSpin->Pts[nCnt] = Spinner[nCnt];
-		ACCEL( npSpin, npSpin->nDir, 30 + nLevel * 2 );
-		AddHeadObj( &SpinnerList, npSpin );
-		++nBadGuys;
-	}
-}
-
-//
-// DrawSpinners - process and draw the spinner list
-//
-
-VOID NEAR PASCAL DrawSpinners( HDC hDC )
-{
-	NPOBJ           npSpin, npNext;
-	LOCAL INT       nNextSpinner = 1000;
-
-	if (nBadGuys && (--nNextSpinner < 0))
-	{
-		CreateSpinner();
-		nNextSpinner = 100 + arand( 900 ) - nLevel * 2;
-	}
-
-	for (npSpin = HeadObj( &SpinnerList ); npSpin; npSpin = npNext)
-	{
-		NPOBJ           npShot;
-		INT             nDelta;
-		RECT            rect;
-
-		npNext = NextObj( npSpin );
-
-		MKRECT( &rect, npSpin->Pos, 150 );
-
-		if (PTINRECT( &rect, npPlayer->Pos ))
-		{
-			HitPlayer( hDC, npSpin );
-			--npSpin->nCount;
-			npSpin->byColor = (BYTE)(MAGENTA - npSpin->nCount);
-			if (npSpin->nCount < 1)
-			{
-				KillBadGuy();
-				Explode( hDC, npSpin );
-				RemoveObj( &SpinnerList, npSpin );
-				AddHeadObj( &FreeList, npSpin );
-			}
-		}
-		else if (INTRECT(&rect, &rectShotClip))
-		{
-			for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			{
-				if (!PTINRECT( &rect, npShot->Pos )) continue;
-				npShot->nCount = 1;
-				lScore += npSpin->nCount * 500;
-				npSpin->byColor = (BYTE)(MAGENTA - (--npSpin->nCount));
-				if (npSpin->nCount < 1)
-				{
-					KillBadGuy();
-					Explode( hDC, npSpin );
-					RemoveObj( &SpinnerList, npSpin );
-					AddHeadObj( &FreeList, npSpin );
-				}
-				else Hit( hDC, npSpin );
-				break;
-			}
-		}
-		nDelta = npPlayer->Pos.x - npSpin->Pos.x;
-		while (nDelta < -16 || nDelta > 16) nDelta /= 2;
-		npSpin->Vel.x += nDelta - npSpin->Vel.x / 16;
-		nDelta = npPlayer->Pos.y - npSpin->Pos.y;
-		while (nDelta < -16 || nDelta > 16) nDelta /= 2;
-		npSpin->Vel.y += nDelta - npSpin->Vel.y / 16;
-		DrawObject( hDC, npSpin );
-	}
-}
-
-//
-// CreateRoid - make a new asteroid
-//
-
-VOID NEAR PASCAL CreateRoid( POINT Pos, POINT Vel, INT nSides, BYTE byColor,
-							 INT nDir, INT nSpeed, INT nSpin )
-{
-	NPOBJ           npRoid;
-	INT             nCnt;
-
-	if (npRoid = RemHeadObj( &FreeList ))
-	{
-		npRoid->Pos = Pos;
-		npRoid->Vel = Vel;
-		npRoid->nMass = nSides * 128;
-		npRoid->nDir = nDir;
-		npRoid->nSpin = nSpin + arand( 11 ) - 5;
-		npRoid->nCount = nSides * 100;
-		npRoid->byColor = byColor;
-		npRoid->byPts = (BYTE)(nSides + 1);
-		for (nCnt = 0; nCnt < nSides; ++nCnt)
-		{
-			npRoid->Pts[nCnt].x = nCnt * DEGREE_SIZE / nSides + arand( 30 );
-			npRoid->Pts[nCnt].y = (nSides - 1) * 100 + 20 + arand( 80 );
-		}
-		npRoid->Pts[nSides] = npRoid->Pts[0];
-		ACCEL( npRoid, nDir, nSpeed );
-		AddHeadObj( &RoidList, npRoid );
-		++nBadGuys;
-	}
-}
-
-//
-// BreakRoid - break up an asteroid
-//
-
-VOID NEAR PASCAL BreakRoid( HDC hDC, NPOBJ npRoid, NPOBJ npShot )
-{
-	INT             nCnt, nNew;
-
-	lScore += npRoid->nCount;
-	if (npShot) npShot->nCount = 1;
-	switch (npRoid->byPts)
-	{
-	case 8:
-		nNew = 2 + arand( 3 );
-		break;
-	case 7:
-		nNew = 1 + arand( 3 );
-		break;
-	case 6:
-		nNew = 1 + arand( 2 );
-		break;
-	case 5:
-		nNew = arand( 2 );
-		break;
-	default:
-		nNew = 0;
-		break;
-	}
-	if (nNew == 1) // don't explode outward
-	{
-		POINT Pt = npRoid->Pos;
-		Pt.x += arand( 301 ) - 150; Pt.y += arand( 301 ) - 150;
-		CreateRoid( Pt, npRoid->Vel, npRoid->byPts - (nNew + 1),
-					npRoid->byColor, npShot->nDir, 8, npRoid->nSpin );
-	}
-	else if (nNew > 0)
-	{
-		INT nSpeed = npRoid->nSpin * npRoid->nSpin * nNew + 16;
-		for (nCnt = 0; nCnt < nNew; ++nCnt)
-		{
-			POINT Pt = npRoid->Pos;
-			Pt.x += arand( 601 ) - 300; Pt.y += arand( 601 ) - 300;
-			CreateRoid( Pt, npRoid->Vel, npRoid->byPts - (nNew + 1),
-						npRoid->byColor,
-						npRoid->nDir + nCnt * DEGREE_SIZE / nNew + arand( 32 ),
-						nSpeed + arand( nLevel * 4 ),
-						npRoid->nSpin / 2 );
-		}
-	}
-	KillBadGuy();
-	++npRoid->byColor;
-	npRoid->nCount = 0;
-	if (nNew)
-	{
-		Hit( hDC, npRoid );
-		DrawObject( hDC, npRoid );
-	}
-	else Explode( hDC, npRoid );
-	RemoveObj( &RoidList, npRoid );
-	AddHeadObj( &FreeList, npRoid );
-}
-
-//
-// DrawRoids - process and draw the asteroid list
-//
-
-VOID NEAR PASCAL DrawRoids( HDC hDC )
-{
-	NPOBJ           npRoid, npNext;
-
-	for (npRoid = HeadObj( &RoidList ); npRoid; npRoid = npNext)
-	{
-		INT             nSize = npRoid->nCount;
-		NPOBJ           npShot;
-		RECT            rect;
-
-		npNext = NextObj( npRoid );
-
-		DrawObject( hDC, npRoid );
-
-		MKRECT( &rect, npRoid->Pos, nSize );
-
-		if (PTINRECT( &rect, npPlayer->Pos ) && HitPlayer( hDC, npRoid ))
-		{
-			npPlayer->nCount = -npPlayer->nCount;
-			npPlayer->byColor = WHITE;
-			Explode( hDC, npPlayer );
-			BreakRoid( hDC, npRoid, NULL );
-			if (nBadGuys) SetRestart( RESTART_LEVEL );
-			else SetRestart( RESTART_NEXTLEVEL );
-		}
-		else if (INTRECT(&rect, &rectShotClip))
-		{
-			for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			{
-				if (!PTINRECT( &rect, npShot->Pos )) continue;
-				BreakRoid( hDC, npRoid, npShot );
-				break;
-			}
-		}
-	}
-}
-
-//
-// DrawShots - process and draw the player shot list
-//
-
-VOID NEAR PASCAL DrawShots( HDC hDC )
-{
-	NPOBJ           npShot, npNext;
-
-	if (npShot = HeadObj( &ShotList ))
-	{
-		rectShotClip.left = rectShotClip.right = npShot->Pos.x;
-		rectShotClip.top = rectShotClip.bottom = npShot->Pos.y;
-		while (npShot)
-		{
-			npNext = NextObj( npShot );
-			switch (--npShot->nCount)
-			{
-			case 10:
-				npShot->byColor = DKCYAN;
-				break;
-			case 5:
-				npShot->byColor = DKBLUE;
-				break;
-			case 0:
-				RemoveObj( &ShotList, npShot );
-				AddHeadObj( &FreeList, npShot );
-				break;
-			}
-			DrawObject( hDC, npShot );
-			if (npShot->Pos.x < rectShotClip.left) rectShotClip.left = npShot->Pos.x;
-			else if (npShot->Pos.x > rectShotClip.right) rectShotClip.right = npShot->Pos.x;
-			if (npShot->Pos.y < rectShotClip.top) rectShotClip.top = npShot->Pos.y;
-			else if (npShot->Pos.y > rectShotClip.bottom) rectShotClip.bottom = npShot->Pos.y;
-			npShot = npNext;
-		}
-	}
-	else rectShotClip.left = rectShotClip.right = rectShotClip.top = rectShotClip.bottom = 32767;
-}
-
-//
-// DrawFlames - process and draw the flame list
-//
-
-VOID NEAR PASCAL DrawFlames( HDC hDC )
-{
-	NPOBJ           npFlame, npNext;
-
-	for (npFlame = HeadObj( &FlameList ); npFlame; npFlame = npNext)
-	{
-		npNext = NextObj( npFlame );
-		switch (--npFlame->nCount)
-		{
-		case 7:
-			npFlame->byColor = RED;
-			break;
-		case 3:
-			npFlame->byColor = DKRED;
-			break;
-		case 0:
-			RemoveObj( &FlameList, npFlame );
-			AddHeadObj( &FreeList, npFlame );
-			break;
-		}
-		DrawObject( hDC, npFlame );
-	}
-}
-
-//
-// FireShot - fire a bullet
-//
-
-VOID NEAR PASCAL FireShot( VOID )
-{
-	NPOBJ           npShot;
-
-	if (npShot = RemHeadObj( &FreeList ))
-	{
-		npShot->Pos.x = npPlayer->Pos.x;
-		npShot->Pos.y = npPlayer->Pos.y;
-		npShot->Vel.x = npPlayer->Vel.x;
-		npShot->Vel.y = npPlayer->Vel.y;
-		npShot->nMass = 8;
-		npShot->nDir = npPlayer->nDir + arand( 5 ) - 2;
-		npShot->nSpin = 0;
-		npShot->nCount = 16 + arand( 8 );
-		npShot->byColor = CYAN;
-		npShot->byPts = 2;
-		npShot->Pts[0].x = 128;
-		npShot->Pts[0].y = 50;
-		npShot->Pts[1].x = 0;
-		npShot->Pts[1].y = 50;
-		ACCEL( npShot, npShot->nDir, 200 + npShot->nCount );
-		AddHeadObj( &ShotList, npShot );
-	}
-}
-
-//
-// AccelPlayer - move the player forward
-//
-
-VOID NEAR PASCAL AccelPlayer( INT nDir, INT nAccel )
-{
-	NPOBJ           npFlame;
-
-	nDir += npPlayer->nDir;
-	if (nAccel) ACCEL( npPlayer, nDir, nAccel );
-	if (npFlame = RemHeadObj( &FreeList ))
-	{
-		npFlame->Pos.x = npPlayer->Pos.x;
-		npFlame->Pos.y = npPlayer->Pos.y;
-		npFlame->Vel.x = npPlayer->Vel.x;
-		npFlame->Vel.y = npPlayer->Vel.y;
-		npFlame->nDir = nDir + 100 + arand( 57 );
-		npFlame->nSpin = 0;
-		npFlame->nCount = nAccel + arand( 7 );
-		npFlame->byColor = YELLOW;
-		npFlame->byPts = 1;
-		npFlame->Pts[0].x = npFlame->Pts[0].y = 0;
-		ACCEL( npFlame, npFlame->nDir, 50 + arand( 10 ) );
-		AddHeadObj( &FlameList, npFlame );
-	}
-}
-
-//
-// DrawPlayer - process and draw the player
-//
-
-VOID NEAR PASCAL DrawPlayer( HDC hDC )
-{
-	LOCAL INT       nBombing = 0;
-	LOCAL INT       nShotDelay = 0;
-
-	if (npPlayer->nCount <= 0) return;
-
-	if (nSafe > 0)
-	{
-		if (--nSafe == 0)
-		{
-			npPlayer->byColor = (BYTE)(BLACK + npPlayer->nCount);
-			if (npPlayer->byColor > WHITE) npPlayer->byColor = WHITE;
-		}
-	}
-	else if (IsKeyDown( vkShld ) && nShield > 0)
-	{
-		nSafe = 15;
-		if (--nShield > 0) npPlayer->byColor = GREEN;
-		else npPlayer->byColor = DKGREEN;
-	}
-
-	if (nBombing > 0)
-	{
-		if (--nBombing == 0)
-		{
-			ExplodeBadguys( hDC, &SpinnerList );
-			ExplodeBadguys( hDC, &SwarmerList );
-			ExplodeBadguys( hDC, &HunterList );
-		}
-		else
-		{
-			HitList( hDC, &SpinnerList );
-			HitList( hDC, &SwarmerList );
-			HitList( hDC, &HunterList );
-		}
-	}
-	else if (nBomb && IsKeyDown( vkBomb )) --nBomb, nBombing = 5;
-
-	if (IsKeyDown( vkClkw )) npPlayer->nSpin += 8;
-	if (IsKeyDown( vkCtrClkw )) npPlayer->nSpin -= 8;
-	if (IsKeyDown( vkThrst )) AccelPlayer( 0, 12 );
-	if (IsKeyDown( vkRvThrst )) AccelPlayer( 128, 12 );
-	if (nShotDelay) --nShotDelay;
-	else if (IsKeyDown( vkFire )) FireShot(), nShotDelay = 2;
-	DrawObject( hDC, npPlayer );
-	npPlayer->nSpin /= 2;
-}
-
-//
-// GetHyperoidDC - get the correct DC for hyperoid rendering
-//
-
-HDC NEAR PASCAL GetHyperoidDC( HWND hWnd )
-{
-	HDC             hDC;
-	INT             cx, cy;
-	RECT            rect;
-
-	GetClientRect( hWnd, &rect );
-	cx = rect.right - rect.left;
-	cy = rect.bottom - rect.top;
-
-	hDC = GetDC( hWnd );
-
-	// set up the mapping mode
-	SetMapMode( hDC, MM_ISOTROPIC );
-	SetWindowExt( hDC, MAX_COORD, MAX_COORD );
-	SetViewportExt( hDC, cx / 2, -cy / 2 );
-	SetViewportOrg( hDC, cx / 2, cy / 2 );
-
-	// realize the palette
-	SelectPalette( hDC, hAppPalette, 0 );
-	RealizePalette( hDC );
-
-	return( hDC );
-}
-
-//
-// DrawObjects - transform and redraw everything in the system
-//
-
-VOID NEAR PASCAL DrawObjects( HWND hWnd )
-{
-	HDC             hDC = GetHyperoidDC( hWnd );
-
-	// move and draw things (I don't think the order is important...)
-	DrawPlayer( hDC );
-	DrawFlames( hDC );
-	DrawShots( hDC );
-	DrawRoids( hDC );
-	DrawSpinners( hDC );
-	DrawSwarmers( hDC );
-	DrawHunters( hDC );
-	DrawHunterShots( hDC );
-	DrawLetters( hDC );
-	DrawBonuses( hDC );
-	// (...but I'm not changing it!!! :-)
-
-	ReleaseDC( hWnd, hDC );
-}
-
-//
-// SetIndicator - set a quantity indicator
-//
-
-INT NEAR PASCAL SetIndicator( NPSTR npBuff, CHAR IDBitmap, INT nQuant )
-{
-	if (nQuant > 5)
-	{
-		*npBuff++ = IDBitmap; *npBuff++ = IDBitmap;
-		*npBuff++ = IDBitmap; *npBuff++ = IDBitmap;
-		*npBuff++ = IDB_plus;
-	}
-	else
-	{
-		INT nBlank = 5 - nQuant;
-		while (nQuant--) *npBuff++ = IDBitmap;
-		while (nBlank--) *npBuff++ = IDB_blank;
-	}
-	return( 5 );
-}
-
-//
-// CheckScore - show the score and such stuff
-//
-
-VOID NEAR PASCAL CheckScore( HWND hWnd )
-{
-	CHAR            szBuff[sizeof(szScore)];
-	NPSTR           npBuff = szBuff;
-	INT             nLives, nLen, nCnt, x, y;
-	HBITMAP         hbmOld;
-	HDC             hDC, hDCMem;
-
-	if (IsIconic( hWnd )) return;
-	if (lScore - lLastLife > EXTRA_LIFE)
-	{
-		AddExtraLife();
-		lLastLife = lScore;
-	}
-	nLives = ((npPlayer->nCount > 0) ? npPlayer->nCount : -npPlayer->nCount);
-
-	*npBuff++ = IDB_level;
-	wsprintf( npBuff, "%2.2u", nLevel );
-	while (isdigit( *npBuff ))
-		*npBuff = (CHAR)(*npBuff + IDB_num0 - '0'), ++npBuff;
-	*npBuff++ = IDB_blank; *npBuff++ = IDB_score;
-	wsprintf( npBuff, "%7.7lu", lScore );
-	while (isdigit( *npBuff ))
-		*npBuff = (CHAR)(*npBuff + IDB_num0 - '0'), ++npBuff;
-	*npBuff++ = IDB_blank;
-	npBuff += SetIndicator( npBuff, IDB_life, nLives );
-	npBuff += SetIndicator( npBuff, IDB_shield, nShield );
-	npBuff += SetIndicator( npBuff, IDB_bomb, nBomb );
-	nLen = npBuff - szBuff;
-
-	hDC = GetWindowDC( hWnd );
-	IntersectClipRect( hDC, rectScoreClip.left, rectScoreClip.top,
-							rectScoreClip.right, rectScoreClip.bottom );
-	hDCMem = CreateCompatibleDC( hDC );
-	hbmOld = SelectObject( hDCMem, hBitmap[0] );
-	x = rectScoreClip.left;
-	y = rectScoreClip.top;
-
-	for (nCnt = 0; nCnt < nLen; ++nCnt)
-	{
-		if (szBuff[nCnt] != szScore[nCnt])
-		{
-			SelectObject( hDCMem, hBitmap[szBuff[nCnt] - IDB_blank] );
-			BitBlt( hDC, x, y, CX_BITMAP, CY_BITMAP, hDCMem, 0, 0, SRCCOPY );
-			szScore[nCnt] = szBuff[nCnt];
-		}
-		x += CX_BITMAP;
-	}
-	if (nCnt < nScoreLen)
-	{
-		SelectObject( hDCMem, hBitmap[0] );
-		do {
-			if (szScore[nCnt] != IDB_blank)
-			{
-				BitBlt( hDC, x, y, CX_BITMAP, CY_BITMAP, hDCMem, 0, 0, SRCCOPY );
-				szScore[nCnt] = IDB_blank;
-			}
-			x += CX_BITMAP;
-		} while (++nCnt < nScoreLen);
-	}
-	nScoreLen = nLen;
-
-	SelectObject( hDCMem, hbmOld );
-	DeleteDC( hDCMem );
-	ReleaseDC( hWnd, hDC );
-}
-
-//
-// HitList - Hit() a list of things
-//
-
-VOID NEAR PASCAL HitList( HDC hDC, NPLIST npList )
-{
-	NPOBJ           npObj;
-
-	for (npObj = HeadObj( npList ); npObj; npObj = NextObj( npObj ))
-		if (npObj->nCount) Hit( hDC, npObj );
-}
-
-//
-// ExplodeBadguys - explode a list of badguys
-//
-
-VOID NEAR PASCAL ExplodeBadguys( HDC hDC, NPLIST npList )
-{
-	NPOBJ           npObj;
-
-	while (npObj = HeadObj( npList ))
-	{
-		KillBadGuy();
-		npObj->nCount = 0;
-		Explode( hDC, npObj );
-		RemoveObj( npList, npObj );
-		AddHeadObj( &FreeList, npObj );
-	}
-}
-
-//
-// NewGame - start a new game
-//
-
-VOID NEAR PASCAL NewGame( HWND hWnd )
-{
-	HDC             hDC = GetHyperoidDC( hWnd );
-
-	npPlayer->nCount = 0;
-	npPlayer->byColor = WHITE;
-	Explode( hDC, npPlayer );
-	SetRestart( RESTART_GAME );
-	ExplodeBadguys( hDC, &RoidList );
-	ExplodeBadguys( hDC, &SpinnerList );
-	ExplodeBadguys( hDC, &SwarmerList );
-	ExplodeBadguys( hDC, &HunterList );
-
-	ReleaseDC( hWnd, hDC );
-}
-
-//
-// RestartHyperoid - set up a game!
-//
-
-VOID NEAR PASCAL RestartHyperoid( VOID )
-{
-	if (npPlayer->nCount == 0)
-	{
-		POINT Pos, Vel;
-		Pos.x = 0;
-		Pos.y = -CLIP_COORD / 2;
-		Vel.x = 0;
-		Vel.y = 150;
-		PrintLetters( szAppName, Pos, Vel, YELLOW, 800 );
-		npPlayer->nCount = 3;
-		if (lHighScore < lScore) lHighScore = lScore;
-		lLastLife = lScore = 0;
-		nLevel = 0;
-		nShield = nBomb = 3;
-	}
-	else if (npPlayer->nCount < 0)
-	{
-		// cheesy way of restarting after a major collision
-		npPlayer->nCount = -npPlayer->nCount;
-		nShield = nBomb = 3;
-	}
-
-	npPlayer->Pos.x = npPlayer->Pos.y = 0;
-	npPlayer->Vel.x = npPlayer->Vel.y = 0;
-	npPlayer->nDir = 64;
-	npPlayer->nSpin = 0;
-	npPlayer->byColor = GREEN;
-	nSafe = 30;
-
-	if (ShotList.npHead)
-	{
-		NPOBJ npShot;
-		for (npShot = HeadObj( &ShotList ); npShot; npShot = NextObj( npShot ))
-			npShot->nCount = 1;
-	}
-
-	// reseed the asteroid field
-	if (nBadGuys == 0)
-	{
-		INT nCnt;
-		++nLevel;
-		for (nCnt = 5 + nLevel; nCnt; --nCnt)
-		{
-			POINT Pos, Vel;
-			Pos.x = arand( MAX_COORD * 2 ) - MAX_COORD;
-			Pos.y = arand( MAX_COORD * 2 ) - MAX_COORD;
-			Vel.x = Vel.y = 0;
-			CreateRoid( Pos, Vel, 6 + arand( 2 ),
-						(BYTE)(arand( 2 ) ? DKYELLOW : DKGREY),
-						arand( DEGREE_MAX ), 30 + arand( nLevel * 8 ), 0 );
-		}
-	}
-}
-
-//
-// Panic - boss key (or just pause)
-//
-
-VOID NEAR PASCAL Panic( BOOL bPanic )
-{
-	if (bPanic && !bPaused)
-	{
-		bPaused = TRUE;
-		KillTimer( hAppWnd, DRAW_TIMER );
-		SetWindowText( hAppWnd, "Program Manager Help - PROGMAN.HLP" );
-		ShowWindow( hAppWnd, SW_SHOWMINNOACTIVE );
-		InvalidateRect( hAppWnd, NULL, TRUE );
-	}
-	else if (bPaused) // double-panic == normal
-	{
-		bPaused = FALSE;
-		SetWindowText( hAppWnd, szAppName );
-		if (bPanic) ShowWindow( hAppWnd, SW_RESTORE );
-		SetTimer( hAppWnd, DRAW_TIMER, nDrawDelay, NULL );
-	}
-}
-
-//
-// PaintHyperoid - paint the hyperoid window
-//
-
-VOID NEAR PASCAL PaintHyperoid( HWND hWnd )
-{
-	PAINTSTRUCT     ps;
-
-	BeginPaint( hWnd, &ps );
-	if (bPaused) DrawIcon( ps.hdc, 2, 2, LoadIcon( hAppInst, INTRES(IDI_PANIC) ) );
-	EndPaint( hWnd, &ps );
-}
-
-//
-// EraseHyperoidBkgnd - fill in the background
-//
-
-BOOL NEAR PASCAL EraseHyperoidBkgnd( HWND hWnd, HDC hDC )
-{
-	HBRUSH          hbr;
-	RECT            rect;
-
-	GetClientRect( hWnd, &rect );
-
-	if (bPaused)
-	{
-		SetBrushOrg( hDC, 0, 0 );
-		hbr = CreateSolidBrush( GetSysColor( COLOR_BACKGROUND ) );
-	}
-	else
-	{
-		SelectPalette( hDC, hAppPalette, 0 );
-		RealizePalette( hDC );
-		hbr = CreateSolidBrush( PALETTEINDEX( BLACK ) );
-	}
-
-	FillRect( hDC, &rect, hbr );
-	DeleteObject( hbr );
-	return( TRUE );
-}
-
-//
-// DrawShadowRect - draw a shaded rectangle around an object
-//
-
-VOID NEAR PASCAL DrawShadowRect( HDC hDC, NPRECT npRect, HPEN hHi, HPEN hLo )
-{
-	SelectObject( hDC, hHi );
-	MoveTo( hDC, npRect->right, npRect->top );
-	LineTo( hDC, npRect->left, npRect->top );
-	LineTo( hDC, npRect->left, npRect->bottom );
-	SelectObject( hDC, hLo );
-	LineTo( hDC, npRect->right, npRect->bottom );
-	LineTo( hDC, npRect->right, npRect->top );
-}
-
-//
-// NCPaintHyperoid - paint a custom frame
-//
-
-VOID NEAR PASCAL NCPaintHyperoid( HWND hWnd )
-{
-	HDC             hDC, hDCMem;
-	INT             cx, cy, cyCap, h;
-	HPEN            hpenHi, hpenLo;
-	HBRUSH          hbr;
-	HBITMAP         hbm, hbmOld;
-	BITMAP          bm;
-	RECT            rect;
-
-	if (IsIconic( hWnd )) return;
-	hDC = GetWindowDC( hWnd );
-	GetWindowRect( hWnd, &rect );
-	rect.right -= rect.left, rect.left = 0;
-	rect.bottom -= rect.top, rect.top = 0;
-	cx = GetSystemMetrics( SM_CXFRAME );
-	cy = GetSystemMetrics( SM_CYFRAME );
-	cyCap = cy + GetSystemMetrics( SM_CYCAPTION ) - 1;
-	h = rect.bottom - (cyCap + cy);
-
-	SelectPalette( hDC, hAppPalette, 0 );
-	RealizePalette( hDC );
-	if (bBW)
-	{
-		hbr = SelectObject( hDC, CreateSolidBrush( PALETTEINDEX( WHITE ) ) );
-		hpenHi = hPen[BLACK];
-		hpenLo = hPen[BLACK];
-	}
-	else
-	{
-		hbr = SelectObject( hDC, CreateSolidBrush( PALETTEINDEX( GREY ) ) );
-		hpenHi = hPen[WHITE];
-		hpenLo = hPen[DKGREY];
-	}
-
-	PatBlt( hDC, 0, 0, rect.right, cyCap, PATCOPY );
-	PatBlt( hDC, 0, rect.bottom - cy, rect.right, rect.bottom, PATCOPY );
-	PatBlt( hDC, 0, cyCap, cx, h, PATCOPY );
-	PatBlt( hDC, rect.right - cx, cyCap, cx, h, PATCOPY );
-
-	--rect.bottom; --rect.right;
-	DrawShadowRect( hDC, &rect, hpenHi, hpenLo );
-	--cx; --cy;
-	rect.left += cx; rect.top += cy;
-	rect.right -= cx; rect.bottom -= cy;
-	if (!bBW) DrawShadowRect( hDC, &rect, hpenLo, hpenHi );
-
-	// get the title bar rect
-	++rect.left; ++rect.top; --rect.right;
-	rect.bottom = rect.top + cyCap - (cy + 2);
-	DrawShadowRect( hDC, &rect, hpenHi, hpenLo );
-	++rect.right; // for zoom/restore bitmap
-
-	hDCMem = CreateCompatibleDC( hDC );
-
-	hbm = LoadBitmap( NULL, INTRES(OBM_CLOSE) );
-	GetObject( hbm, sizeof(bm), (LPSTR)&bm );
-	bm.bmWidth /= 2; // they packed two images in here!
-	hbmOld = SelectObject( hDCMem, hbm );
-	BitBlt( hDC, rect.left, rect.top, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCCOPY );
-	rect.left += bm.bmWidth;
-
-	if (IsZoomed( hWnd )) hbm = LoadBitmap( NULL, INTRES(OBM_RESTORE) );
-	else hbm = LoadBitmap( NULL, INTRES(OBM_ZOOM) );
-	GetObject( hbm, sizeof(bm), (LPSTR)&bm );
-	SelectObject( hDCMem, hbm );
-	rect.right -= bm.bmWidth;
-	BitBlt( hDC, rect.right, rect.top, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCCOPY );
-
-	hbm = LoadBitmap( NULL, INTRES(OBM_REDUCE) );
-	GetObject( hbm, sizeof(bm), (LPSTR)&bm );
-	SelectObject( hDCMem, hbm );
-	rect.right -= bm.bmWidth;
-	BitBlt( hDC, rect.right, rect.top, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCCOPY );
-
-	--rect.right;
-	DrawShadowRect( hDC, &rect, hpenHi, hpenLo );
-
-	// clip the score to the free titlebar area
-	++rect.left; ++rect.top;
-	rectScoreClip = rect;
-
-	DeleteObject( SelectObject( hDCMem, hbmOld ) );
-	DeleteObject( SelectObject( hDC, hbr ) );
-	DeleteDC( hDCMem );
-	ReleaseDC( hWnd, hDC );
-
-	// make sure the score gets redrawn
-	for (cx = 0; cx < nScoreLen; ++cx) szScore[cx] = '\0';
-}
-
-//
-// HyperoidWndProc - the main window proc for Hyperoid
-//
-
-LONG FAR PASCAL EXPORT HyperoidWndProc( HWND hWnd, unsigned message,
-										WORD wParam, LONG lParam )
-{
-	switch (message)
-	{
-	case WM_CREATE:
-		RestartHyperoid();
-		SetTimer( hWnd, DRAW_TIMER, nDrawDelay, NULL );
-		NCPaintHyperoid( hWnd );
-		break;
-
-	case WM_TIMER:
-		switch (wParam)
-		{
-		case DRAW_TIMER:
-			CheckScore( hWnd );
-			DrawObjects( hWnd );
-			return( 0 );
-
-		case RESTART_TIMER:
-			KillTimer( hWnd, RESTART_TIMER );
-			bRestart = FALSE;
-			RestartHyperoid();
-			return( 0 );
-		}
-		break;
-
-	case WM_SYSCOMMAND:
-		switch (wParam)
-		{
-		case IDM_NEW:
-			NewGame( hWnd );
-			break;
-
-		case IDM_ABOUT:
-			AboutHyperoid( hWnd );
-			break;
-
-		default:
-			return( DefWindowProc( hWnd, message, wParam, lParam ) );
-		}
-		break;
-
-	case WM_QUERYOPEN:
-		Panic( FALSE );
-		return( DefWindowProc( hWnd, message, wParam, lParam ) );
-
-	case WM_CHAR:
-		if (wParam == VK_ESCAPE) Panic( TRUE );
-		break;
-
-	case WM_SYSKEYDOWN:
-	case WM_SYSKEYUP:
-	case WM_SYSCHAR:
-		if (lParam & (1L<<29)) // alt key is down
-		{
-			return( DefWindowProc( hWnd, message, wParam, lParam ) );
-		}
-		switch (wParam)
-		{
-		case VK_ESCAPE:
-			if (message == WM_SYSKEYDOWN) Panic( TRUE );
-			return( 0 );
-		case VK_SPACE:
-		case VK_TAB:
-			return( 0 );
-		default:
-			return( DefWindowProc( hWnd, message, wParam, lParam ) );
-		}
-		break;
-
-	case WM_ERASEBKGND:
-		return( EraseHyperoidBkgnd( hWnd, (HDC)wParam ) );
-
-	case WM_NCACTIVATE:
-	case WM_NCPAINT:
-		NCPaintHyperoid( hWnd );
-		return( TRUE );
-
-	case WM_PAINT:
-		PaintHyperoid( hWnd );
-		break;
-
-	case WM_QUERYNEWPALETTE:
-		{
-			HDC hDC = GetDC( hWnd );
-			SelectPalette( hDC, hAppPalette, 0 );
-			RealizePalette( hDC );
-			ReleaseDC( hWnd, hDC );
-		}
-		return( TRUE );
-
-    case WM_DESTROY:
-		KillTimer( hWnd, DRAW_TIMER );
-		KillTimer( hWnd, RESTART_TIMER );
-		SaveHyperoidWindowPos( hWnd );
-		PostQuitMessage( 0 );
-        break;
-
-	default:
-		return( DefWindowProc( hWnd, message, wParam, lParam ) );
-    }
-	return( 0 );
-}
-
-//
-// InitHyperoid - initialize everything
-//
-
-BOOL NEAR PASCAL InitHyperoid( VOID )
-{
-	DOUBLE          dRad;
-	INT             nCnt;
-
-	// allocate the logical palette
-	hAppPalette = CreateHyperoidPalette();
-	if (!hAppPalette) return( FALSE );
-	for (nCnt = 0; nCnt < PALETTE_SIZE; ++nCnt)
-	{
-		hPen[nCnt] = CreatePen( PS_SOLID, 1, PALETTEINDEX( nCnt ) );
-		if (!hPen[nCnt]) return( FALSE );
-	}
-	for (nCnt = 0; nCnt < IDB_MAX; ++nCnt)
-	{
-		hBitmap[nCnt] = LoadBitmap( hAppInst, INTRES(IDB_blank + nCnt) );
-		if (!hPen[nCnt]) return( FALSE );
-	}
-
-	// seed the randomizer
-	dwSeed = GetCurrentTime();
-
-	// create the lookup table (should use resources)
-	for (nCnt = 0; nCnt < DEGREE_SIZE; ++nCnt)
-	{
-		dRad = nCnt * 6.2831855 / DEGREE_SIZE;
-		nCos[nCnt] = (INT)(DEGREE_MAX * cos( dRad ));
-		nSin[nCnt] = (INT)(DEGREE_MAX * sin( dRad ));
-	}
-
-	// get the initialization file info
-	GetHyperoidIni();
-
-	// allocate all objects as free
-	for (nCnt = 0; nCnt < MAX_OBJS; ++nCnt)
-		AddHeadObj( &FreeList, &(Obj[nCnt]) );
-
-	// set up the player
-	npPlayer = RemHeadObj( &FreeList );
-	npPlayer->byPts = DIM(Player);
-	npPlayer->nMass = 256;
-	for (nCnt = 0; nCnt < DIM(Player); ++nCnt)
-		npPlayer->Pts[nCnt] = Player[nCnt];
-
-	return( TRUE );
-}
-
-//
-// ExitHyperoid - quit the damn game already!
-//
-
-VOID NEAR PASCAL ExitHyperoid( VOID )
-{
-	INT             nCnt;
-
-	if (hAppPalette) DeleteObject( hAppPalette );
-	for (nCnt = 0; nCnt < PALETTE_SIZE; ++nCnt)
-		if (hPen[nCnt]) DeleteObject( hPen[nCnt] );
-	for (nCnt = 0; nCnt < IDB_MAX; ++nCnt)
-		if (hBitmap[nCnt]) DeleteObject( hBitmap[nCnt] );
-}
-
-//
-// WinMain - everybody has to have one
-//
-
-INT FAR PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
-						LPSTR lpszCmdLine, INT nCmdShow )
-{
-	MSG         msg;
-
-	hAppInst = hInstance;
-	if (!hPrevInstance)
-	{
-		// create the class if we're first
-		if (!CreateHyperoidClass()) return( FALSE );
-	}
-	else
-	{
-		// Copy data from previous instance
-		GetInstanceData( hPrevInstance, (PSTR)szAppName, sizeof(szAppName) );
-	}
-	if (!InitHyperoid()) goto Abort; // I LOVE GOTOS! REALLY I DO!
-	hAppWnd = CreateHyperoidWindow( lpszCmdLine, nCmdShow );
-	if (!hAppWnd) return( FALSE );
-
-	while (GetMessage( &msg, NULL, 0, 0 ))
-	{
-		TranslateMessage( &msg );
-		DispatchMessage( &msg );
-	}
-
-Abort:
-	ExitHyperoid();
-	return( msg.wParam );
-}
diff --git a/test/hyperoid/hyperoid.def b/test/hyperoid/hyperoid.def
deleted file mode 100644
index 3309007f6cace990e7ce5d2e7753433cf4c13735..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.def
+++ /dev/null
@@ -1,15 +0,0 @@
-NAME                    Hyperoid
-DESCRIPTION             'Hyperoid Copyright (C) 1990,91 Hutchins Software'
-EXETYPE                 WINDOWS
-STUB                    'WINSTUB.EXE'
-STACKSIZE               4096
-HEAPSIZE                32768
-DATA                    MOVEABLE MULTIPLE
-CODE                    LOADONCALL MOVEABLE DISCARDABLE
-SEGMENTS
-	HYPEROID            LOADONCALL MOVEABLE DISCARDABLE
-	ROIDSUPP            LOADONCALL MOVEABLE DISCARDABLE
-
-EXPORTS
-	HyperoidWndProc     @1
-	HyperoidAboutDlg    @2
diff --git a/test/hyperoid/hyperoid.exe b/test/hyperoid/hyperoid.exe
deleted file mode 100644
index 0f34f629909622f59729d301a867316338a7b757..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/hyperoid.exe and /dev/null differ
diff --git a/test/hyperoid/hyperoid.h b/test/hyperoid/hyperoid.h
deleted file mode 100644
index e16b057712c7d6f9cdadef8ba752e8561b32c9fd..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.h
+++ /dev/null
@@ -1,241 +0,0 @@
-//
-// HYPEROID.H - hyperoid internal header information
-//
-// Version: 1.1  Copyright (C) 1990,91 Hutchins Software
-//      This software is licenced under the GNU General Public Licence
-//      Please read the associated legal documentation
-// Author: Edward Hutchins
-// Revisions:
-//
-
-#ifndef RC_INVOKED
-
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-#include <limits.h>
-#define OEMRESOURCE
-#include <winext.h>
-
-//
-// typedefs and defines
-//
-
-// color stuff
-#define PALETTE_SIZE 16
-typedef enum
-{
-	BLACK, DKGREY, GREY, WHITE,
-	DKRED, RED, DKGREEN, GREEN, DKBLUE, BLUE,
-	DKYELLOW, YELLOW, DKCYAN, CYAN, DKMAGENTA, MAGENTA
-} COLORS;
-
-// degrees scaled to integer math
-#define DEGREE_SIZE 256
-#define DEGREE_MASK 255
-#define DEGREE_MAX 0x4000
-
-// object limits
-#define MAX_PTS 8
-#define MAX_OBJS 100
-#define MAX_COORD 0x2000
-#define CLIP_COORD (MAX_COORD+300)
-
-// timer stuff
-#define DRAW_TIMER 1
-#define DRAW_DELAY 50
-#define RESTART_TIMER 2
-#define RESTART_DELAY 5000
-
-// restart modes
-typedef enum { RESTART_GAME, RESTART_LEVEL, RESTART_NEXTLEVEL } RESTART_MODE;
-
-// letter scaling
-#define LETTER_MAX 256
-
-// extra life every
-#define EXTRA_LIFE 100000
-
-// list node
-typedef struct tagNODE
-{
-	struct tagNODE  *npNext, *npPrev;
-} NODE;
-pointerdef( NODE );
-
-// list header
-typedef struct
-{
-	NPNODE          npHead, npTail;
-} LIST;
-pointerdef( LIST );
-
-// object descriptor
-typedef struct
-{
-	NODE            Link;               // for object list
-	POINT           Pos;                // position of center of object
-	POINT           Vel;                // velocity in logical units/update
-	INT             nMass;              // mass of object
-	INT             nDir;               // direction in degrees
-	INT             nSpin;              // angular momentum degrees/update
-	INT             nCount;             // used by different objects
-	INT             nDelay;             // used by different objects
-	BYTE            byColor;            // palette color
-	BYTE            byPts;              // number of points in object
-	POINT           Pts[MAX_PTS];       // points making up an object
-	POINT           Old[MAX_PTS];       // last plotted location
-} OBJ;
-pointerdef( OBJ );
-
-//
-// inline macro functions
-//
-
-// function aliases
-#define AddHeadObj(l,o) AddHead((l),((NPNODE)o))
-#define RemHeadObj(l) ((NPOBJ)RemHead(l))
-#define RemoveObj(l,o) Remove((l),((NPNODE)o))
-#define HeadObj(l) ((NPOBJ)((l)->npHead))
-#define NextObj(o) ((NPOBJ)((o)->Link.npNext))
-
-// real-time check of the keyboard
-#define IsKeyDown(x) (GetAsyncKeyState(x)<0)
-
-// I HATE typing this allatime!
-#define INTRES(x) MAKEINTRESOURCE(x)
-
-// size of an array
-#define DIM(x) (sizeof(x)/sizeof((x)[0]))
-
-// faster than MulDiv!
-#define MULDEG(x,y) ((INT)(((LONG)(x)*(y))/DEGREE_MAX))
-
-// DEG - convert an integer into a degree lookup index
-#define DEG(x) ((WORD)(x)&DEGREE_MASK)
-
-// ACCEL - accelerate an object in a given direction
-#define ACCEL(o,d,s) \
-(((o)->Vel.x += MULDEG((s),nCos[DEG(d)])), \
-((o)->Vel.y += MULDEG((s),nSin[DEG(d)])))
-
-// PTINRECT - a faster PtInRect
-#define PTINRECT(r,p) \
-(((r)->left <= (p).x) && ((r)->right > (p).x) && \
-((r)->top <= (p).y) && ((r)->bottom > (p).y))
-
-// INTRECT - a faster IntersectRect that just returns the condition
-#define INTRECT(r1,r2) \
-(((r1)->right >= (r2)->left) && \
-((r1)->left < (r2)->right) && \
-((r1)->bottom >= (r2)->top) && \
-((r1)->top < (r2)->bottom))
-
-// MKRECT - make a rect around a point
-#define MKRECT(r,p,s) \
-(((r)->left = ((p).x-(s))), ((r)->right = ((p).x+(s))), \
-((r)->top = ((p).y-(s))), ((r)->bottom = ((p).y+(s))))
-
-//
-// prototypes
-//
-
-// hyperoid.c
-INT NEAR PASCAL arand( INT x );
-VOID NEAR PASCAL AddHead( NPLIST npList, NPNODE npNode );
-NPNODE NEAR PASCAL RemHead( NPLIST npList );
-VOID NEAR PASCAL Remove( NPLIST npList, NPNODE npNode );
-VOID NEAR PASCAL DrawObject( HDC hDC, NPOBJ npObj );
-VOID NEAR PASCAL SetRestart( BOOL bGameOver );
-VOID NEAR PASCAL AddExtraLife( VOID );
-VOID NEAR PASCAL Hit( HDC hDC, NPOBJ npObj );
-VOID NEAR PASCAL Explode( HDC hDC, NPOBJ npObj );
-BOOL NEAR PASCAL HitPlayer( HDC hDC, NPOBJ npObj );
-NPOBJ FAR PASCAL CreateLetter( CHAR cLetter, INT nSize );
-VOID NEAR PASCAL DrawLetters( HDC hDC );
-VOID NEAR PASCAL DrawHunterShots( HDC hDC );
-VOID NEAR PASCAL FireHunterShot( NPOBJ npHunt );
-VOID NEAR PASCAL CreateHunter( VOID );
-VOID NEAR PASCAL DrawHunters( HDC hDC );
-VOID NEAR PASCAL CreateSpinner( VOID );
-VOID NEAR PASCAL DrawSpinners( HDC hDC );
-VOID NEAR PASCAL CreateRoid( POINT Pos, POINT Vel, INT nSides, BYTE byColor, INT nDir, INT nSpeed, INT nSpin );
-VOID NEAR PASCAL BreakRoid( HDC hDC, NPOBJ npRoid, NPOBJ npShot );
-VOID NEAR PASCAL DrawRoids( HDC hDC );
-VOID NEAR PASCAL DrawShots( HDC hDC );
-VOID NEAR PASCAL DrawFlames( HDC hDC );
-VOID NEAR PASCAL FireShot( VOID );
-VOID NEAR PASCAL AccelPlayer( INT nDir, INT nAccel );
-VOID NEAR PASCAL DrawPlayer( HDC hDC );
-VOID NEAR PASCAL DrawObjects( HWND hWnd );
-VOID NEAR PASCAL CheckScore( HWND hWnd );
-VOID NEAR PASCAL HitList( HDC hDC, NPLIST npList );
-VOID NEAR PASCAL ExplodeBadguys( HDC hDC, NPLIST npList );
-VOID NEAR PASCAL NewGame( HWND hWnd );
-VOID NEAR PASCAL RestartHyperoid( VOID );
-VOID NEAR PASCAL Panic( BOOL bPanic );
-VOID NEAR PASCAL PaintHyperoid( HWND hWnd );
-VOID NEAR PASCAL DisableHyperoidInput( HWND hWnd, BOOL bCapture );
-LONG FAR PASCAL EXPORT HyperoidWndProc( HWND hWnd, unsigned message, WORD wParam, LONG lParam );
-BOOL NEAR PASCAL InitHyperoid( VOID );
-VOID NEAR PASCAL ExitHyperoid( VOID );
-INT FAR PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, INT nCmdShow );
-
-// roidsupp.c
-VOID FAR PASCAL PrintLetters( NPSTR npszText, POINT Pos, POINT Vel, BYTE byColor, INT nSize );
-VOID FAR PASCAL SpinLetters( NPSTR npszText, POINT Pos, POINT Vel, BYTE byColor, INT nSize );
-HPALETTE FAR PASCAL CreateHyperoidPalette( VOID );
-BOOL FAR PASCAL CreateHyperoidClass( VOID );
-VOID NEAR PASCAL SetHyperoidMenu( HWND hWnd, INT nFirstID, INT nLastID );
-HWND FAR PASCAL CreateHyperoidWindow( LPSTR lpszCmd, INT nCmdShow );
-VOID FAR PASCAL SaveHyperoidWindowPos( HWND hWnd );
-VOID FAR PASCAL GetHyperoidIni( VOID );
-VOID FAR PASCAL HyperoidHelp( HWND hWnd );
-BOOL FAR PASCAL EXPORT HyperoidAboutDlg( HWND hDlg, WORD mess, WORD wParam, LONG lParam );
-VOID FAR PASCAL AboutHyperoid( HWND hWnd );
-
-#endif // RC_INVOKED //
-
-//
-// resource IDs
-//
-
-// icons and bitmaps
-#define IDI_HYPEROID    10
-#define IDI_PANIC       20
-
-// bitmaps
-#define IDB_blank       50
-#define IDB_bomb        51
-#define IDB_level       52
-#define IDB_life        53
-#define IDB_num0        54
-#define IDB_num1        55
-#define IDB_num2        56
-#define IDB_num3        57
-#define IDB_num4        58
-#define IDB_num5        59
-#define IDB_num6        60
-#define IDB_num7        61
-#define IDB_num8        62
-#define IDB_num9        63
-#define IDB_plus        64
-#define IDB_score       65
-#define IDB_shield      66
-// additional bitmap stuff
-#define IDB_MAX         17
-#define CX_BITMAP       16
-#define CY_BITMAP       16
-
-// strings
-#define IDS_NAME        100
-
-// menus
-#define IDM_NEW         200
-#define IDM_ABOUT       201
-
-// about box
-#define IDD_ABOUT       500
-#define IDD_A_HELP      501
-#define IDD_A_HISCORE   502
diff --git a/test/hyperoid/hyperoid.ico b/test/hyperoid/hyperoid.ico
deleted file mode 100644
index 6641a8319ceda6a4147cbdeda42cc1adf0a5640b..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/hyperoid.ico and /dev/null differ
diff --git a/test/hyperoid/hyperoid.mak b/test/hyperoid/hyperoid.mak
deleted file mode 100644
index c885a1b66e6c4cbcf5b7b1eb0a4467a957c918dd..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.mak
+++ /dev/null
@@ -1,35 +0,0 @@
-PROJ	=HYPEROID
-DEBUG	=1
-CC	=qcl
-CFLAGS_G	= /AM /W3 /Ze 
-CFLAGS_D	= /Zi /Od 
-CFLAGS_R	= /O /Ol /Gs /DNDEBUG 
-CFLAGS	=$(CFLAGS_G) $(CFLAGS_D)
-LFLAGS_G	= /CP:0xffff /NOI /SE:0x80 /ST:0x2000 
-LFLAGS_D	= /CO /M 
-LFLAGS_R	= 
-LFLAGS	=$(LFLAGS_G) $(LFLAGS_D)
-RUNFLAGS	=
-OBJS_EXT = 	
-LIBS_EXT = 	
-
-all:	$(PROJ).exe
-
-hyperoid.obj:	hyperoid.c
-
-roidsupp.obj:	roidsupp.c
-
-$(PROJ).exe:	hyperoid.obj roidsupp.obj $(OBJS_EXT)
-	echo >NUL @<<$(PROJ).crf
-hyperoid.obj +
-roidsupp.obj +
-$(OBJS_EXT)
-$(PROJ).exe
-
-$(LIBS_EXT);
-<<
-	ilink -a -e "link $(LFLAGS) @$(PROJ).crf" $(PROJ)
-
-run: $(PROJ).exe
-	$(PROJ) $(RUNFLAGS)
-
diff --git a/test/hyperoid/hyperoid.map b/test/hyperoid/hyperoid.map
deleted file mode 100644
index 34edf19048ce6a574e34a9a85b2b667495ad612a..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.map
+++ /dev/null
@@ -1,671 +0,0 @@
-Stack Allocation = 8192 bytes
-
- hyperoid
-
- Start     Length     Name                   Class
- 0001:0000 022D8H     HYPEROID               CODE
- 0001:22D8 006E8H     ROIDSUPP               CODE
- 0001:29C0 02834H     _TEXT                  CODE
- 0001:5200 026F0H     EMULATOR_TEXT          CODE
- 0001:78F0 00000H     C_ETEXT                ENDCODE
- 0002:0000 00170H     EMULATOR_DATA          FAR_DATA
- 0003:0000 00042H     NULL                   BEGDATA
- 0003:0042 00A00H     _DATA                  DATA
- 0003:0A42 00002H     XIQC                   DATA
- 0003:0A44 0000EH     DBDATA                 DATA
- 0003:0A52 0000EH     CDATA                  DATA
- 0003:0A60 00000H     XIFB                   DATA
- 0003:0A60 00000H     XIF                    DATA
- 0003:0A60 00000H     XIFE                   DATA
- 0003:0A60 00000H     XIB                    DATA
- 0003:0A60 0000CH     XI                     DATA
- 0003:0A6C 00000H     XIE                    DATA
- 0003:0A6C 00000H     XPB                    DATA
- 0003:0A6C 00000H     XP                     DATA
- 0003:0A6C 00000H     XPE                    DATA
- 0003:0A6C 00000H     XCB                    DATA
- 0003:0A6C 00000H     XC                     DATA
- 0003:0A6C 00000H     XCE                    DATA
- 0003:0A6C 00000H     XCFB                   DATA
- 0003:0A6C 00000H     XCF                    DATA
- 0003:0A6C 00000H     XCFE                   DATA
- 0003:0A6C 00018H     CONST                  CONST
- 0003:0A84 00008H     HDR                    MSG
- 0003:0A8C 001DDH     MSG                    MSG
- 0003:0C69 00002H     PAD                    MSG
- 0003:0C6B 00001H     EPAD                   MSG
- 0003:0C6C 0006EH     _BSS                   BSS
- 0003:0CDA 00000H     XOB                    BSS
- 0003:0CDA 00000H     XO                     BSS
- 0003:0CDA 00000H     XOE                    BSS
- 0003:0CE0 02616H     c_common               BSS
- 0003:3300 02000H     STACK                  STACK
-
- Origin   Group
- 0003:0   DGROUP
-
- Address   Export                  Alias
-
- 0001:28D9 HYPEROIDABOUTDLG        HYPEROIDABOUTDLG
- 0001:1ECA HYPEROIDWNDPROC         HYPEROIDWNDPROC
-
-  Address         Publics by Name
-
- 0001:3B44       $I10_OUTPUT
- 0001:382E       $i8_output
- 0001:3AEF       $i8_tpwr10
- 0001:296C       ABOUTHYPEROID
- 0001:029D       ACCELERATE
- 0001:18B6       ACCELPLAYER
- 0001:006B       ADDHEAD
- 0001:0000       ARAND
- 0001:13D9       BREAKROID
- 0001:1B94       CHECKSCORE
- 0001:0C8A       CREATEHUNTER
- 0001:2595       CREATEHYPEROIDCLASS
- 0001:23AC       CREATEHYPEROIDPALETTE
- 0001:268F       CREATEHYPEROIDWINDOW
- 0001:08E8       CREATELETTER
- 0001:12D3       CREATEROID
- 0001:0F98       CREATESPINNER
- 0001:1754       DRAWFLAMES
- 0001:0D5E       DRAWHUNTERS
- 0001:0AD2       DRAWHUNTERSHOTS
- 0001:0A44       DRAWLETTERS
- 0001:02F2       DRAWOBJECT
- 0001:1AB6       DRAWOBJECTS
- 0001:198E       DRAWPLAYER
- 0001:15AC       DRAWROIDS
- 0001:16C5       DRAWSHOTS
- 0001:107D       DRAWSPINNERS
- 0001:1E41       ERASEHYPEROIDBKGND
- 0001:21CC       EXITHYPEROID
- 0001:0630       EXPLODE
- 0001:3552       fFYTOX
- 0000:FE32  Abs  FIARQQ
- 0000:0E32  Abs  FICRQQ
- 0000:5C32  Abs  FIDRQQ
- 0000:1632  Abs  FIERQQ
- 0001:0BAC       FIREHUNTERSHOT
- 0001:17E3       FIRESHOT
- 0000:0632  Abs  FISRQQ
- 0000:A23D  Abs  FIWRQQ
- 0000:4000  Abs  FJARQQ
- 0000:C000  Abs  FJCRQQ
- 0000:8000  Abs  FJSRQQ
- 0001:0547       HIT
- 0001:0787       HITPLAYER
- 0001:28D9       HYPEROIDABOUTDLG
- 0001:28AA       HYPEROIDHELP
- 0001:1ECA       HYPEROIDWNDPROC
- 0001:214C       INITHYPEROID
- 0001:0195       INITOBJECTS
- 0001:1DF2       PAINTHYPEROID
- 0001:1D51       PANIC
- 0003:0CE4       PLOCALHEAP
- 0001:22D8       PRINTLETTERS
- 0001:00D0       REMHEAD
- 0001:0136       REMOVE
- 0001:1C13       RESTARTHYPEROID
- 0001:2790       SAVEHYPEROIDWINDOWPOS
- 0001:2616       SETHYPEROIDMENU
- 0001:0513       SETRESTART
- 0001:2222       WINMAIN
- 0001:317C       _atof
- 0001:3178       _atoi
- 0003:32C6       _bPaused
- 0003:32BE       _bRestart
- 0001:4AE4       _cos
- 0003:0C6C       _edata
- 0003:3300       _end
- 0003:06AF       _environ
- 0003:0688       _errno
- 0001:2B8D       _exit
- 0003:3086       _FlameList
- 0003:32C2       _FreeList
- 0003:30AE       _hAppInst
- 0003:32D2       _hAppPalette
- 0003:32C0       _hAppWnd
- 0003:308E       _hPen
- 0003:0A38       _HUGE
- 0003:30B0       _HunterList
- 0003:0CE8       _HunterShotList
- 0003:0CE0       _LetterList
- 0003:0250       _LetterPart
- 0003:30B8       _lScore
- 0001:2F34       _malloc
- 0001:4E30       _matherr
- 0001:32F4       _memmove
- 0001:333C       _memset
- 0003:32BC       _nBadGuys
- 0003:0CEE       _nCos
- 0003:32C8       _nGravity
- 0003:308C       _nLevel
- 0003:0CEC       _npPlayer
- 0003:0CE6       _nSafe
- 0003:32F4       _nShield
- 0003:30BC       _nSin
- 0003:0EEE       _Obj
- 0003:32CE       _RoidList
- 0003:32CA       _ShotList
- 0001:4ADE       _sin
- 0003:30B4       _SpinnerList
- 0001:3130       _strcmp
- 0001:30FE       _strcpy
- 0001:315C       _strlen
- 0003:32D4       _szAppName
- 0003:0298       _szLetterDesc
- 0003:0284       _szNumberDesc
- 0001:4AE9       _tan
- 0003:308A       _wTick
- 0003:09A4       __80x87
- 0003:066C       __acfinfo
- 0000:9876  Abs  __acrtmsg
- 0000:9876  Abs  __acrtused
- 0000:D6D6  Abs  __aDBdoswp
- 0003:06BE       __adbgmsg
- 0003:0650       __aexit_rtn
- 0001:4AF4       __aFCIcos
- 0001:4AEE       __aFCIsin
- 0001:4AF9       __aFCItan
- 0001:4D08       __aFftol
- 0001:3386       __aFldiv
- 0001:3420       __aFlmul
- 0001:3420       __aFulmul
- 0003:067A       __aintdiv
- 0003:06C6       __amblksiz
- 0001:2AA3       __amsg_exit
- 0003:0042       __anullsize
- 0003:0668       __aseghi
- 0003:066A       __aseglo
- 0003:0652       __asizds
- 0003:06E4       __asizeC
- 0003:06E5       __asizeD
- 0001:29D0       __astart
- 0001:51D0       __atold
- 0003:064E       __atopsp
- 0001:31C2       __catox
- 0001:2B9C       __cexit
- 0001:4A64       __cfltcvt
- 0003:06C8       __cfltcvt_tab
- 0001:474E       __cftoe
- 0001:489C       __cftof
- 0001:49B2       __cftog
- 0003:06B6       __child
- 0001:2AC8       __cinit
- 0001:2A93       __cintDIV
- 0001:4BA2       __cintrindisp1
- 0001:4B79       __cintrindisp2
- 0001:517A       __cldcvt
- 0001:4E40       __cldtoe
- 0001:4FCE       __cldtof
- 0001:510C       __cldtog
- 0003:08E2       __cosjmptab
- 0003:0912       __cotanjmptab
- 0003:07FC       __cpower
- 0001:4656       __cropzeros
- 0001:2C10       __ctermsub
- 0001:4BD7       __ctrandisp1
- 0001:4BC4       __ctrandisp2
- 0003:06E6       __ctype
- 0003:06E6       __ctype_
- 0001:2BA6       __c_exit
- 0001:2AC5       __dataseg
- 0001:32BB       __DOSCREATECSALIAS
- 0001:3286       __DOSDEVCONFIG
- 0003:0693       __doserrno
- 0001:32D1       __DOSFREESEG
- 0001:329D       __DOSGETMACHINEMODE
- 0001:32B2       __DOSSETVEC
- 0003:0690       __dosvermajor
- 0003:0691       __dosverminor
- 0001:32DA       __DOSWRITE
- 0001:5200       __EmDataSeg
- 0001:2B94       __exit
- 0003:08A0       __expjmptab
- 0003:067E       __fac
- 0001:46F2       __fassign
- 0001:36D7       __fFCOS
- 0001:355E       __fFEXP
- 0001:3686       __ffexpm1
- 0001:360B       __fFLN
- 0001:36F0       __fFSIN
- 0001:2C50       __FF_MSGBANNER
- 0001:30DD       __findlast
- 0001:4D3C       __fltin
- 0001:4D92       __fltout
- 0000:9876  Abs  __fltused
- 0001:45EE       __forcdecpt
- 0001:5A7F       __fpemulator
- 0001:5210       __fpemulatorbegin
- 0001:786F       __fpemulatorend
- 0001:54DE       __FPEXCEPTION87
- 0003:0A54       __fpinit
- 0001:787A       __FPINSTALL87
- 0001:523A       __fpmath
- 0001:4DD8       __fpsignal
- 0002:0169       __fptaskdata
- 0001:78A9       __FPTERMINATE87
- 0001:3216       __fptostr
- 0001:2C72       __fptrap
- 0001:4D08       __ftol
- 0001:3000       __growseg
- 0001:308C       __incseg
- 0003:07E8       __indefinite
- 0003:080E       __infinity
- 0001:4AFE       __Init80x87
- 0003:06B9       __intno
- 0001:40DF       __LD12MULT
- 0001:400A       __LD12MULTTENPOWER
- 0003:0888       __lnjmptab
- 0003:0818       __logemax
- 0003:0870       __logjmptab
- 0001:4264       __MANTOLD12
- 0003:0A40       __matherr_flag
- 0001:2F0E       __myalloc
- 0003:0695       __nfile
- 0001:2F3A       __nfree
- 0003:0654       __nheap_desc
- 0001:2F5B       __nmalloc
- 0001:2EAC       __NMSG_TEXT
- 0001:2ED7       __NMSG_WRITE
- 0001:2C78       __nullcheck
- 0003:0693       __oserr
- 0003:0697       __osfile
- 0003:0690       __osmajor
- 0003:0691       __osminor
- 0003:0692       __osmode
- 0003:0690       __osversion
- 0003:06B8       __ovlflag
- 0003:06BA       __ovlvec
- 0003:06B1       __pgmptr
- 0003:07F2       __piby2
- 0001:46C4       __positive
- 0003:068E       __psp
- 0003:068C       __pspadr
- 0001:351A       __rtbignan
- 0001:3549       __rtchsifneg
- 0001:3540       __rtifprojnpop
- 0001:3521       __rtifprojpop
- 0001:352B       __rtindfnpop
- 0001:3528       __rtindfpop
- 0001:366B       __rtinfnpop
- 0001:35FE       __rtinfnpopse
- 0001:3668       __rtinfpop
- 0001:35FB       __rtinfpopse
- 0001:34FD       __rtnospop
- 0001:3501       __rtnospopde
- 0001:3513       __rtonenpop
- 0001:3510       __rtonepop
- 0001:3500       __rttosnpop
- 0001:3539       __rttosnpopde
- 0001:34FA       __rttospop
- 0001:34F7       __rttospopde
- 0001:3509       __rtzeronpop
- 0001:3506       __rtzeropop
- 0001:2F84       __searchseg
- 0001:2C9C       __setargv
- 0001:2E2E       __setenvp
- 0003:06E2       __sigintoff
- 0003:06E0       __sigintseg
- 0003:08CA       __sinjmptab
- 0001:431E       __STRINGTOD
- 0001:4386       __STRINGTOLD
- 0003:08FA       __tanjmptab
- 0001:3452       __trandisp1
- 0001:3494       __trandisp2
- 0003:068A       __umaskval
- 0001:336A       __wrt2err
- 0003:0840       __ytoxjmptab
- 0003:0A4A       ___aDBexit
- 0003:0A50       ___aDBptrchk
- 0003:0A48       ___aDBrterr
- 0003:0A46       ___aDBswpchk
- 0003:0A44       ___aDBswpflg
- 0003:06AB       ___argc
- 0003:06AD       ___argv
- 0003:0A42       ___qczrinit
-
-  Address         Publics by Value
-
- 0000:0632  Abs  FISRQQ
- 0000:0E32  Abs  FICRQQ
- 0000:1632  Abs  FIERQQ
- 0000:4000  Abs  FJARQQ
- 0000:5C32  Abs  FIDRQQ
- 0000:8000  Abs  FJSRQQ
- 0000:9876  Abs  __acrtmsg
- 0000:9876  Abs  __acrtused
- 0000:9876  Abs  __fltused
- 0000:A23D  Abs  FIWRQQ
- 0000:C000  Abs  FJCRQQ
- 0000:D6D6  Abs  __aDBdoswp
- 0000:FE32  Abs  FIARQQ
- 0001:0000       ARAND
- 0001:006B       ADDHEAD
- 0001:00D0       REMHEAD
- 0001:0136       REMOVE
- 0001:0195       INITOBJECTS
- 0001:029D       ACCELERATE
- 0001:02F2       DRAWOBJECT
- 0001:0513       SETRESTART
- 0001:0547       HIT
- 0001:0630       EXPLODE
- 0001:0787       HITPLAYER
- 0001:08E8       CREATELETTER
- 0001:0A44       DRAWLETTERS
- 0001:0AD2       DRAWHUNTERSHOTS
- 0001:0BAC       FIREHUNTERSHOT
- 0001:0C8A       CREATEHUNTER
- 0001:0D5E       DRAWHUNTERS
- 0001:0F98       CREATESPINNER
- 0001:107D       DRAWSPINNERS
- 0001:12D3       CREATEROID
- 0001:13D9       BREAKROID
- 0001:15AC       DRAWROIDS
- 0001:16C5       DRAWSHOTS
- 0001:1754       DRAWFLAMES
- 0001:17E3       FIRESHOT
- 0001:18B6       ACCELPLAYER
- 0001:198E       DRAWPLAYER
- 0001:1AB6       DRAWOBJECTS
- 0001:1B94       CHECKSCORE
- 0001:1C13       RESTARTHYPEROID
- 0001:1D51       PANIC
- 0001:1DF2       PAINTHYPEROID
- 0001:1E41       ERASEHYPEROIDBKGND
- 0001:1ECA       HYPEROIDWNDPROC
- 0001:214C       INITHYPEROID
- 0001:21CC       EXITHYPEROID
- 0001:2222       WINMAIN
- 0001:22D8       PRINTLETTERS
- 0001:23AC       CREATEHYPEROIDPALETTE
- 0001:2595       CREATEHYPEROIDCLASS
- 0001:2616       SETHYPEROIDMENU
- 0001:268F       CREATEHYPEROIDWINDOW
- 0001:2790       SAVEHYPEROIDWINDOWPOS
- 0001:28AA       HYPEROIDHELP
- 0001:28D9       HYPEROIDABOUTDLG
- 0001:296C       ABOUTHYPEROID
- 0001:29D0       __astart
- 0001:2A93       __cintDIV
- 0001:2AA3       __amsg_exit
- 0001:2AC5       __dataseg
- 0001:2AC8       __cinit
- 0001:2B8D       _exit
- 0001:2B94       __exit
- 0001:2B9C       __cexit
- 0001:2BA6       __c_exit
- 0001:2C10       __ctermsub
- 0001:2C50       __FF_MSGBANNER
- 0001:2C72       __fptrap
- 0001:2C78       __nullcheck
- 0001:2C9C       __setargv
- 0001:2E2E       __setenvp
- 0001:2EAC       __NMSG_TEXT
- 0001:2ED7       __NMSG_WRITE
- 0001:2F0E       __myalloc
- 0001:2F34       _malloc
- 0001:2F3A       __nfree
- 0001:2F5B       __nmalloc
- 0001:2F84       __searchseg
- 0001:3000       __growseg
- 0001:308C       __incseg
- 0001:30DD       __findlast
- 0001:30FE       _strcpy
- 0001:3130       _strcmp
- 0001:315C       _strlen
- 0001:3178       _atoi
- 0001:317C       _atof
- 0001:31C2       __catox
- 0001:3216       __fptostr
- 0001:3286       __DOSDEVCONFIG
- 0001:329D       __DOSGETMACHINEMODE
- 0001:32B2       __DOSSETVEC
- 0001:32BB       __DOSCREATECSALIAS
- 0001:32D1       __DOSFREESEG
- 0001:32DA       __DOSWRITE
- 0001:32F4       _memmove
- 0001:333C       _memset
- 0001:336A       __wrt2err
- 0001:3386       __aFldiv
- 0001:3420       __aFulmul
- 0001:3420       __aFlmul
- 0001:3452       __trandisp1
- 0001:3494       __trandisp2
- 0001:34F7       __rttospopde
- 0001:34FA       __rttospop
- 0001:34FD       __rtnospop
- 0001:3500       __rttosnpop
- 0001:3501       __rtnospopde
- 0001:3506       __rtzeropop
- 0001:3509       __rtzeronpop
- 0001:3510       __rtonepop
- 0001:3513       __rtonenpop
- 0001:351A       __rtbignan
- 0001:3521       __rtifprojpop
- 0001:3528       __rtindfpop
- 0001:352B       __rtindfnpop
- 0001:3539       __rttosnpopde
- 0001:3540       __rtifprojnpop
- 0001:3549       __rtchsifneg
- 0001:3552       fFYTOX
- 0001:355E       __fFEXP
- 0001:35FB       __rtinfpopse
- 0001:35FE       __rtinfnpopse
- 0001:360B       __fFLN
- 0001:3668       __rtinfpop
- 0001:366B       __rtinfnpop
- 0001:3686       __ffexpm1
- 0001:36D7       __fFCOS
- 0001:36F0       __fFSIN
- 0001:382E       $i8_output
- 0001:3AEF       $i8_tpwr10
- 0001:3B44       $I10_OUTPUT
- 0001:400A       __LD12MULTTENPOWER
- 0001:40DF       __LD12MULT
- 0001:4264       __MANTOLD12
- 0001:431E       __STRINGTOD
- 0001:4386       __STRINGTOLD
- 0001:45EE       __forcdecpt
- 0001:4656       __cropzeros
- 0001:46C4       __positive
- 0001:46F2       __fassign
- 0001:474E       __cftoe
- 0001:489C       __cftof
- 0001:49B2       __cftog
- 0001:4A64       __cfltcvt
- 0001:4ADE       _sin
- 0001:4AE4       _cos
- 0001:4AE9       _tan
- 0001:4AEE       __aFCIsin
- 0001:4AF4       __aFCIcos
- 0001:4AF9       __aFCItan
- 0001:4AFE       __Init80x87
- 0001:4B79       __cintrindisp2
- 0001:4BA2       __cintrindisp1
- 0001:4BC4       __ctrandisp2
- 0001:4BD7       __ctrandisp1
- 0001:4D08       __aFftol
- 0001:4D08       __ftol
- 0001:4D3C       __fltin
- 0001:4D92       __fltout
- 0001:4DD8       __fpsignal
- 0001:4E30       _matherr
- 0001:4E40       __cldtoe
- 0001:4FCE       __cldtof
- 0001:510C       __cldtog
- 0001:517A       __cldcvt
- 0001:51D0       __atold
- 0001:5200       __EmDataSeg
- 0001:5210       __fpemulatorbegin
- 0001:523A       __fpmath
- 0001:54DE       __FPEXCEPTION87
- 0001:5A7F       __fpemulator
- 0001:786F       __fpemulatorend
- 0001:787A       __FPINSTALL87
- 0001:78A9       __FPTERMINATE87
- 0002:0169       __fptaskdata
- 0003:0042       __anullsize
- 0003:0250       _LetterPart
- 0003:0284       _szNumberDesc
- 0003:0298       _szLetterDesc
- 0003:064E       __atopsp
- 0003:0650       __aexit_rtn
- 0003:0652       __asizds
- 0003:0654       __nheap_desc
- 0003:0668       __aseghi
- 0003:066A       __aseglo
- 0003:066C       __acfinfo
- 0003:067A       __aintdiv
- 0003:067E       __fac
- 0003:0688       _errno
- 0003:068A       __umaskval
- 0003:068C       __pspadr
- 0003:068E       __psp
- 0003:0690       __osversion
- 0003:0690       __dosvermajor
- 0003:0690       __osmajor
- 0003:0691       __osminor
- 0003:0691       __dosverminor
- 0003:0692       __osmode
- 0003:0693       __oserr
- 0003:0693       __doserrno
- 0003:0695       __nfile
- 0003:0697       __osfile
- 0003:06AB       ___argc
- 0003:06AD       ___argv
- 0003:06AF       _environ
- 0003:06B1       __pgmptr
- 0003:06B6       __child
- 0003:06B8       __ovlflag
- 0003:06B9       __intno
- 0003:06BA       __ovlvec
- 0003:06BE       __adbgmsg
- 0003:06C6       __amblksiz
- 0003:06C8       __cfltcvt_tab
- 0003:06E0       __sigintseg
- 0003:06E2       __sigintoff
- 0003:06E4       __asizeC
- 0003:06E5       __asizeD
- 0003:06E6       __ctype_
- 0003:06E6       __ctype
- 0003:07E8       __indefinite
- 0003:07F2       __piby2
- 0003:07FC       __cpower
- 0003:080E       __infinity
- 0003:0818       __logemax
- 0003:0840       __ytoxjmptab
- 0003:0870       __logjmptab
- 0003:0888       __lnjmptab
- 0003:08A0       __expjmptab
- 0003:08CA       __sinjmptab
- 0003:08E2       __cosjmptab
- 0003:08FA       __tanjmptab
- 0003:0912       __cotanjmptab
- 0003:09A4       __80x87
- 0003:0A38       _HUGE
- 0003:0A40       __matherr_flag
- 0003:0A42       ___qczrinit
- 0003:0A44       ___aDBswpflg
- 0003:0A46       ___aDBswpchk
- 0003:0A48       ___aDBrterr
- 0003:0A4A       ___aDBexit
- 0003:0A50       ___aDBptrchk
- 0003:0A54       __fpinit
- 0003:0C6C       _edata
- 0003:0CE0       _LetterList
- 0003:0CE4       PLOCALHEAP
- 0003:0CE6       _nSafe
- 0003:0CE8       _HunterShotList
- 0003:0CEC       _npPlayer
- 0003:0CEE       _nCos
- 0003:0EEE       _Obj
- 0003:3086       _FlameList
- 0003:308A       _wTick
- 0003:308C       _nLevel
- 0003:308E       _hPen
- 0003:30AE       _hAppInst
- 0003:30B0       _HunterList
- 0003:30B4       _SpinnerList
- 0003:30B8       _lScore
- 0003:30BC       _nSin
- 0003:32BC       _nBadGuys
- 0003:32BE       _bRestart
- 0003:32C0       _hAppWnd
- 0003:32C2       _FreeList
- 0003:32C6       _bPaused
- 0003:32C8       _nGravity
- 0003:32CA       _ShotList
- 0003:32CE       _RoidList
- 0003:32D2       _hAppPalette
- 0003:32D4       _szAppName
- 0003:32F4       _nShield
- 0003:3300       _end
-
-Program entry point at 0001:29D0
-
- : error L2029: 'ENDDIALOG' : unresolved external
- : error L2029: 'ISZOOMED' : unresolved external
- : error L2029: '_main' : unresolved external
- : error L2029: 'GETPRIVATEPROFILEINT' : unresolved external
- : error L2029: 'SELECTPALETTE' : unresolved external
- : error L2029: 'CREATEWINDOW' : unresolved external
- : error L2029: 'SETBRUSHORG' : unresolved external
- : error L2029: 'MULDIV' : unresolved external
- : error L2029: 'MULDIV' : unresolved external
- : error L2029: '_wsprintf' : unresolved external
- : error L2029: '_wsprintf' : unresolved external
- : error L2029: 'GETPRIVATEPROFILESTRING' : unresolved external
- : error L2029: 'GETASYNCKEYSTATE' : unresolved external
- : error L2029: 'RELEASEDC' : unresolved external
- : error L2029: 'DELETEDC' : unresolved external
- : error L2029: 'POSTQUITMESSAGE' : unresolved external
- : error L2029: 'MESSAGEBOX' : unresolved external
- : error L2029: 'UPDATEWINDOW' : unresolved external
- : error L2029: 'LOADSTRING' : unresolved external
- : error L2029: 'GETDC' : unresolved external
- : error L2029: 'MAKEPROCINSTANCE' : unresolved external
- : error L2029: 'GETCURRENTTIME' : unresolved external
- : error L2029: 'FREEPROCINSTANCE' : unresolved external
- : error L2029: 'CREATEIC' : unresolved external
- : error L2029: 'SETMAPMODE' : unresolved external
- : error L2029: 'FILLRECT' : unresolved external
- : error L2029: 'LOADICON' : unresolved external
- : error L2029: 'REGISTERCLASS' : unresolved external
- : error L2029: 'LOADCURSOR' : unresolved external
- : error L2029: 'GETSYSTEMMENU' : unresolved external
- : error L2029: 'WRITEPRIVATEPROFILESTRING' : unresolved external
- : error L2029: 'DRAWICON' : unresolved external
- : error L2029: 'CREATEPEN' : unresolved external
- : error L2029: 'CREATESOLIDBRUSH' : unresolved external
- : error L2029: 'SETVIEWPORTORG' : unresolved external
- : error L2029: 'ENDPAINT' : unresolved external
- : error L2029: 'TRANSLATEMESSAGE' : unresolved external
- : error L2029: 'GETMESSAGE' : unresolved external
- : error L2029: 'SETWINDOWEXT' : unresolved external
- : error L2029: 'PTINRECT' : unresolved external
- : error L2029: 'GETDEVICECAPS' : unresolved external
- : error L2029: 'DELETEOBJECT' : unresolved external
- : error L2029: 'KILLTIMER' : unresolved external
- : error L2029: 'DISPATCHMESSAGE' : unresolved external
- : error L2029: 'SETVIEWPORTEXT' : unresolved external
- : error L2029: 'DEFWINDOWPROC' : unresolved external
- : error L2029: 'SHOWWINDOW' : unresolved external
- : error L2029: 'SHOWWINDOW' : unresolved external
- : error L2029: 'GETCLIENTRECT' : unresolved external
- : error L2029: 'INVALIDATERECT' : unresolved external
- : error L2029: 'SELECTOBJECT' : unresolved external
- : error L2029: 'GETINSTANCEDATA' : unresolved external
- : error L2029: 'SETTIMER' : unresolved external
- : error L2029: 'BEGINPAINT' : unresolved external
- : error L2029: 'CHANGEMENU' : unresolved external
- : error L2029: 'GETWINDOWRECT' : unresolved external
- : error L2029: 'CREATEPALETTE' : unresolved external
- : error L2029: 'POLYLINE' : unresolved external
- : error L2029: 'DIALOGBOX' : unresolved external
- : error L2029: 'REALIZEPALETTE' : unresolved external
- : error L2029: 'SETPIXEL' : unresolved external
- : error L2029: 'GETSYSCOLOR' : unresolved external
- : error L2029: 'SETWINDOWTEXT' : unresolved external
-
diff --git a/test/hyperoid/hyperoid.rc b/test/hyperoid/hyperoid.rc
deleted file mode 100644
index 4f8afb74a90fe7aebe35f58728d9e21dfa5f631b..0000000000000000000000000000000000000000
--- a/test/hyperoid/hyperoid.rc
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// HYPEROID.RC - orbiter resources
-//
-
-#include <windows.h>
-#include "hyperoid.h"
-
-IDI_HYPEROID ICON "hyperoid.ico"
-IDI_PANIC ICON "panic.ico"
-
-STRINGTABLE
-{
-	IDS_NAME, "Hyperoid"
-	IDM_NEW, "New Game&!"
-	IDM_ABOUT, "&About..."
-}
-
-//
-// About box
-//
-
-IDD_ABOUT DIALOG LOADONCALL MOVEABLE DISCARDABLE 30, 30, 150, 120
-CAPTION "About"
-STYLE WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME | WS_POPUP
-{
-	CTEXT           "Hyperoid",                         -1, 0, 10, 150, 8
-	CTEXT           "The classic game",                 -1, 0, 20, 150, 8
-	CTEXT           "Version 1.1",                      -1, 0, 30, 150, 8
-	CTEXT           "Copyright © 1991 Hutchins Software", -1, 0, 45, 150, 8
-	CTEXT           "This program is freeware",         -1, 0, 55, 150, 8
-	CTEXT           "Author: Edward Hutchins",          -1, 0, 65, 150, 8
-	CTEXT           "eah1@cec1.wustl.edu",              -1, 0, 75, 150, 8
-	CTEXT           "",                                 IDD_A_HISCORE, 0, 85, 150, 8
-	ICON            IDI_HYPEROID,                       -1, 10, 16, 0, 0
-	DEFPUSHBUTTON   "Ok!", IDOK,                        20, 100, 40, 12
-	CONTROL         "&Help", IDD_A_HELP,                "button", BS_PUSHBUTTON | WS_TABSTOP | WS_CHILD, 90, 100, 40, 12
-}
-
-//
-// bitmaps
-//
-
-IDB_blank   BITMAP DISCARDABLE  "blank.bmp"
-IDB_bomb    BITMAP DISCARDABLE  "bomb.bmp"
-IDB_level   BITMAP DISCARDABLE  "level.bmp"
-IDB_life    BITMAP DISCARDABLE  "life.bmp"
-IDB_num0    BITMAP DISCARDABLE  "num0.bmp"
-IDB_num1    BITMAP DISCARDABLE  "num1.bmp"
-IDB_num2    BITMAP DISCARDABLE  "num2.bmp"
-IDB_num3    BITMAP DISCARDABLE  "num3.bmp"
-IDB_num4    BITMAP DISCARDABLE  "num4.bmp"
-IDB_num5    BITMAP DISCARDABLE  "num5.bmp"
-IDB_num6    BITMAP DISCARDABLE  "num6.bmp"
-IDB_num7    BITMAP DISCARDABLE  "num7.bmp"
-IDB_num8    BITMAP DISCARDABLE  "num8.bmp"
-IDB_num9    BITMAP DISCARDABLE  "num9.bmp"
-IDB_plus    BITMAP DISCARDABLE  "plus.bmp"
-IDB_score   BITMAP DISCARDABLE  "score.bmp"
-IDB_shield  BITMAP DISCARDABLE  "shield.bmp"
diff --git a/test/hyperoid/level.bmp b/test/hyperoid/level.bmp
deleted file mode 100644
index eb1f03e4365a75e7c22e31a0fe4be2f64b25943e..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/level.bmp and /dev/null differ
diff --git a/test/hyperoid/life.bmp b/test/hyperoid/life.bmp
deleted file mode 100644
index 70fd6235a0c198461fca55e37e1bb7fd4796720f..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/life.bmp and /dev/null differ
diff --git a/test/hyperoid/list.c b/test/hyperoid/list.c
deleted file mode 100644
index e427064b17649cb67919658d514e3f4f401b2c71..0000000000000000000000000000000000000000
--- a/test/hyperoid/list.c
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// LIST - list processing functions for orbiter
-//
-// Version: 1.0  Copyright (C) 1990, Hutchins Software
-// Author: Edward Hutchins
-// Revisions:
-//
-
-#include "orbiter.h"
-
-//
-// AddHead - add an object to the head of a list
-//
-
-VOID FAR PASCAL AddHead( NPLIST npList, NPNODE npNode )
-{
-	if (npList->npHead)
-	{
-		npNode->npNext = npList->npHead;
-		npNode->npPrev = NULL;
-		npList->npHead = (npList->npHead->npPrev = npNode);
-	}
-	else // add to an empty list
-	{
-		npList->npHead = npList->npTail = npNode;
-		npNode->npNext = npNode->npPrev = NULL;
-	}
-}
-
-//
-// RemHead - remove the first element in a list
-//
-
-NPNODE FAR PASCAL RemHead( NPLIST npList )
-{
-	if (npList->npHead)
-	{
-		NPNODE npNode = npList->npHead;
-		if (npList->npTail != npNode)
-		{
-			npList->npHead = npNode->npNext;
-			npNode->npNext->npPrev = NULL;
-		}
-		else npList->npHead = npList->npTail = NULL;
-		return( npNode );
-	}
-	else return( NULL );
-}
-
-//
-// Remove - remove an arbitrary element from a list
-//
-
-VOID FAR PASCAL Remove( NPLIST npList, NPNODE npNode )
-{
-	if (npNode->npPrev) npNode->npPrev->npNext = npNode->npNext;
-	else npList->npHead = npNode->npNext;
-	if (npNode->npNext) npNode->npNext->npPrev = npNode->npPrev;
-	else npList->npTail = npNode->npPrev;
-}
-
diff --git a/test/hyperoid/makefile.mk b/test/hyperoid/makefile.mk
deleted file mode 100644
index 61c393830bfc20aa299ca070e6b3ce595722c7a7..0000000000000000000000000000000000000000
--- a/test/hyperoid/makefile.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-########################################################
-#
-#   hyperoid makefile
-#
-#   Copyright (C) 1988-1990 Lantern Corp.
-#
-########################################################
-
-# This is just a teaser to show how little you have to do to make projects
-# under Lantern Corp.'s software engineering system. To make Hyperoid on
-# your system, make sure <winext.h> is in your include path and set up your
-# makefile like you normally do for your own stuff.
-# I'll (hopefully) post the 100k of stuff you need for this makefile to
-# be usefull. I'll have to talk to my boss first...
-# P.S. The system only works for the Mircosoft C6.0 compiler, but its easy
-# enough to change.
-# P.P.S. I hate every integrated environment I've run across so far, thus
-# the system is run from a command prompt.
-
-PROJ = hyperoid
-OBJS = hyperoid.obj roidsupp.obj
-RESS = hyperoid.res
-LIBS =
-
-!include <windows.mk>
-
diff --git a/test/hyperoid/num0.bmp b/test/hyperoid/num0.bmp
deleted file mode 100644
index 9dfa846e16fe03f102de14a8763d4c372ab29b07..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num0.bmp and /dev/null differ
diff --git a/test/hyperoid/num1.bmp b/test/hyperoid/num1.bmp
deleted file mode 100644
index 302d0f9bbb316d3a8c9962cc746e44a4025a2ebf..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num1.bmp and /dev/null differ
diff --git a/test/hyperoid/num2.bmp b/test/hyperoid/num2.bmp
deleted file mode 100644
index c1b70faf0e7da6b52bd6ee31178208e34d150cb1..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num2.bmp and /dev/null differ
diff --git a/test/hyperoid/num3.bmp b/test/hyperoid/num3.bmp
deleted file mode 100644
index f8b9971d25515b542c20e11697a478311696868f..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num3.bmp and /dev/null differ
diff --git a/test/hyperoid/num4.bmp b/test/hyperoid/num4.bmp
deleted file mode 100644
index 4ce4a6c565d00835b4762e608f6c0c7f540349fd..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num4.bmp and /dev/null differ
diff --git a/test/hyperoid/num5.bmp b/test/hyperoid/num5.bmp
deleted file mode 100644
index ce2ca461f34c4c245f77570f98c666f84070c70a..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num5.bmp and /dev/null differ
diff --git a/test/hyperoid/num6.bmp b/test/hyperoid/num6.bmp
deleted file mode 100644
index af200bdd09c445c97d3271a66b565c724df92480..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num6.bmp and /dev/null differ
diff --git a/test/hyperoid/num7.bmp b/test/hyperoid/num7.bmp
deleted file mode 100644
index d5eaf6ca0ccb2614d93e524de15862824942503b..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num7.bmp and /dev/null differ
diff --git a/test/hyperoid/num8.bmp b/test/hyperoid/num8.bmp
deleted file mode 100644
index 3a9eeb027c9de0ba8ae0f95207001fbde4765bb0..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num8.bmp and /dev/null differ
diff --git a/test/hyperoid/num9.bmp b/test/hyperoid/num9.bmp
deleted file mode 100644
index d2b18d20a50106514e21af27f0ffc773bc703fdf..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/num9.bmp and /dev/null differ
diff --git a/test/hyperoid/panic.ico b/test/hyperoid/panic.ico
deleted file mode 100644
index 6be4492151794cbaf5045623bba40c054b6e9931..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/panic.ico and /dev/null differ
diff --git a/test/hyperoid/plus.bmp b/test/hyperoid/plus.bmp
deleted file mode 100644
index 4beda944c3eef84c74b596d8f96be093098d4977..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/plus.bmp and /dev/null differ
diff --git a/test/hyperoid/read.me b/test/hyperoid/read.me
deleted file mode 100644
index 65f70db951f675131274c8fd8f82e3e8a2d048bf..0000000000000000000000000000000000000000
--- a/test/hyperoid/read.me
+++ /dev/null
@@ -1,109 +0,0 @@
-****************************************************************************
-LEGAL JUNK:
-
-	Hyperoid - a game for Mircosoft Windows (tm)
-	Copyright (C) 1991 Edward Hutchins
-	internet: eah1@cec1.wustl.edu
-	usnail: c/o Edward Hutchins, 63 Ridgemoor Dr., Clayton, MO 63105
-
-	This program is free software; you can redistribute it and/or modify
-	it under the terms of the GNU General Public License as published by
-	the Free Software Foundation; either version 1, or (at your option)
-	any later version.
-
-	This program is distributed in the hope that it will be useful,
-	but WITHOUT ANY WARRANTY; without even the implied warranty of
-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	GNU General Public License for more details.
-
-	You should have received a copy of the GNU General Public License
-	along with this program; if not, write to the Free Software
-	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Note: Windows is a trademark of Microsoft Corp. (Duh)
-
-With this aside,
-****************************************************************************
-
-Hello, and Welcome to Hyperoid version 1.1!
-
-The object of the game is intuitive---shoot everything! (Well, almost
-everything, heh heh!). If the keyboard buffer overflows in all the
-excitement, ignore the beeps you hear and they'll go away.
-
-Hyperoids uses the palette manager, so if you have a palette-capable display
-(and you read the on-line help pages) you should be able to set up better
-colors than the Windows defaults. I have tested hyperoids on a monochrome
-'286, and it seems to work fine. If you want to re-map the keys, look at
-Appendix A (or the Windows SDK) for some non-ASCII virtual key codes.
-
-The source is available through the same channel that you got the executable
-through, as per the GNU general public licence. Please read the licence if
-you have any questions, or contact me at the above addresses (email
-preferred).
-
-If you make modifications/bug fixes to Hyperoid, please use me as a clearing
-house to prevent versions flooding out into the universe. (You don't have to,
-but I'd appreciate it :-). If you write the world's greatest game using some
-of my source, please send me note telling what it is and where it's available.
-
-Changes since 1.0:
-	Explosion processing a little faster
-	Swarmers (little green guys) no longer flood the system
-	Scoring is better
-	Extra lives every 100,000 points (not 50,000)
-	Firepower reduced a little (hey, the game was too darn easy)
-	Spinning Game Over (Oooooh...)
-
-Look for:
-  ls - *nix ls command with MUCHO bells&whistles (couldn't live w/out it!)
-  blitfix - util that sets the CS_BYTEALIGNCLIENT bit on all top windows
-			(speeds up my 1024x768 display by a factor of 3)
-  eyecon - xeyes clone (may have to be renamed)
-  ilbm - Amiga IFF bitmap viewer (supports HAM mode and palettes!)
-  life - 7 blit life with a few bells&whistles
-  loadmon - nifty system performance monitor
-  mbrot - mandelbrot hack that runs in the background
-  yow - Zippy the Pinhead in his very own icon, telling it like it is
-  (more games... stuff... junk...)
-Coming real soon now to a (net,BBS,Wherever this stuff ends up) near YOU!
-
-Appendix A: Virtual Key Codes
------------------------------
-
-	VK_TAB              9 = default shields
-	VK_RETURN           13
-	VK_SHIFT            16
-	VK_CONTROL          17
-	VK_CAPITAL          20 - useful for autofire!
-	VK_ESCAPE           27 = default boss key
-	VK_SPACE            32 = default fire key
-	VK_PRIOR            33
-	VK_NEXT             34
-	VK_END              35
-	VK_HOME             36
-	VK_LEFT             37 = default counter-clockwise key
-	VK_UP               38 = default reverse thrust key
-	VK_RIGHT            39 = default clockwise key
-	VK_DOWN             40 = default thrust key
-	VK_INSERT           45
-	VK_DELETE           46
-	VK_A-VK_Z           64-90, 83 = default smartbomb key (ASCII 'S')
-	VK_NUMPAD0          96
-	VK_NUMPAD1          97
-	VK_NUMPAD2          98
-	VK_NUMPAD3          99
-	VK_NUMPAD4          100
-	VK_NUMPAD5          101
-	VK_NUMPAD6          102
-	VK_NUMPAD7          103
-	VK_NUMPAD8          104
-	VK_NUMPAD9          105
-	VK_MULTIPLY         106
-	VK_ADD              107
-	VK_SEPARATOR        108
-	VK_SUBTRACT         109
-	VK_DECIMAL          110
-	VK_DIVIDE           111
-	VK_F1-VK_F16        112-127
-
diff --git a/test/hyperoid/roidsupp.c b/test/hyperoid/roidsupp.c
deleted file mode 100644
index 3da30f18e74fda02f3ff22b61e1e409f6eb2f63e..0000000000000000000000000000000000000000
--- a/test/hyperoid/roidsupp.c
+++ /dev/null
@@ -1,497 +0,0 @@
-//
-// ROIDSUPP - hyperoid support functions
-//
-// Version: 1.1  Copyright (C) 1991, Hutchins Software
-//      This software is licenced under the GNU General Public Licence
-//      Please read the associated legal documentation
-// Author: Edward Hutchins
-// Revisions:
-// 11/01/91 added GNU General Public License - Ed.
-//
-
-#include "hyperoid.h"
-
-//
-// defines
-//
-
-// you may ask, "why did he embed all these string constants instead of
-// using the resource file?". Good question. The answer is: I feel better
-// knowing this stuff is part of the executable, and not part of the resource
-// file (which can be changed by sneaky people). Or maybe I wuz lazy.
-// If you don't like it, then YOU can change it!
-
-#define NL "\x0d\x0a"
-
-#define HYPEROID_HELP \
-"The following keys control your ship:" NL NL \
-"  Left, Right Arrow .... spin left or right" NL \
-"  Down, Up Arrow ..... forward or reverse thrust" NL \
-"  Space Bar .............. fire!" NL \
-"  Tab ......................... shields" NL \
-"  S ............................. smartbomb" NL \
-"  Esc ......................... pause/boss key" NL NL \
-"Note: You have 3 lives, unlimited fuel and firepower, 3 shields and 3 " \
-"smartbombs. Your ship gets darker when you lose a life, but you keep on " \
-"playing (unless you hit an asteroid). You get an extra life every 100,000 " \
-"points. When you lose the game, you start over immediately and can finish " \
-"off the current level (which should now be 0) before starting over at " \
-"level 1 (There is no waiting around between games)."
-
-#define HYPEROID_HELP2 \
-"The HYPEROID.INI file can be created/modified to change default settings " \
-"in Hyperoid. Here are some of the items you can set:" NL \
-NL "[Hyperoid]" NL "Max=<0/1>" NL "{X,Y,W,H}=<n>" NL "Mono=<0/1>" NL \
-"DrawDelay=<ms> ;microseconds/frame" NL \
-NL "[Palette]" NL \
-"{Black,DkGrey,Grey,White," NL \
-" DkRed,Red,DkGreen,Green,DkBlue,Blue," NL \
-" DkYellow,Yellow,DkCyan,Cyan," NL \
-" DkMagenta,Magenta}=<r>,<g>,<b>" NL \
-NL "[Keys]" NL \
-"{Shield,Clockwise,CtrClockwise," NL \
-" Thrust,RevThrust,Fire,Bomb}=<virtual keycode>" NL NL \
-"Note: Virtual keycodes usually match the key's ASCII value."
-
-#define HYPEROID_HELPSTYLE (MB_OK | MB_ICONASTERISK)
-
-// this is the part I especially want in the executable image
-
-#define HYPEROID_LICENSE \
-"This program is free software; you can redistribute it and/or modify " \
-"it under the terms of the GNU General Public License as published by " \
-"the Free Software Foundation; either version 1, or (at your option) " \
-"any later version. " \
-NL NL \
-"This program is distributed in the hope that it will be useful, " \
-"but WITHOUT ANY WARRANTY; without even the implied warranty of " \
-"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " \
-"GNU General Public License for more details. " \
-NL NL \
-"You should have received a copy of the GNU General Public License " \
-"along with this program; if not, write to the Free Software " \
-"Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. "
-
-//
-// imports
-//
-
-IMPORT CHAR         szAppName[32] FROM( hyperoid.c );
-IMPORT HANDLE       hAppInst FROM( hyperoid.c );
-IMPORT BOOL         bBW FROM( hyperoid.c );
-IMPORT INT          nDrawDelay FROM( hyperoid.c );
-IMPORT INT          vkShld FROM( hyperoid.c );
-IMPORT INT          vkClkw FROM( hyperoid.c );
-IMPORT INT          vkCtrClkw FROM( hyperoid.c );
-IMPORT INT          vkThrst FROM( hyperoid.c );
-IMPORT INT          vkRvThrst FROM( hyperoid.c );
-IMPORT INT          vkFire FROM( hyperoid.c );
-IMPORT INT          vkBomb FROM( hyperoid.c );
-IMPORT LONG         lHighScore FROM( hyperoid.c );
-
-//
-// globals
-//
-
-// these parts map to "abcdefghijklm"
-GLOBAL POINT        LetterPart[] =
-{
-	{83, 572}, {64, 512}, {45, 572}, {96, 362}, {32, 362},
-	{128, 256}, {0, 0}, {0, 256},
-	{160, 362}, {224, 362}, {173, 572}, {192, 512}, {211, 572}
-};
-// here's the vector font
-GLOBAL NPSTR        szNumberDesc[] =
-{
-	"cakmck",       // 0
-	"dbl",          // 1
-	"abekm",        // 2
-	"abegjlk",      // 3
-	"mcfh",         // 4
-	"cbfgjlk",      // 5
-	"bdiljgi",      // 6
-	"acgl",         // 7
-	"bdjlieb",      // 8
-	"ljebdge"       // 9
-};
-GLOBAL NPSTR        szLetterDesc[] =
-{
-	"kdbemhf",      // A
-	"kabegjlk",     // B
-	"cbflm",        // C
-	"kabejlk",      // D
-	"cafgfkm",      // E
-	"cafgfk",       // F
-	"bdiljhg",      // G
-	"kafhcm",       // H
-	"bl",           // I
-	"cjli",         // J
-	"akcgm",        // K
-	"akm",          // L
-	"kagcm",        // M
-	"kamc",         // N
-	"bdiljeb",      // O
-	"kabegf",       // P
-	"mlidbejl",     // Q
-	"kabegfgm",     // R
-	"ebdjli",       // S
-	"lbac",         // T
-	"ailjc",        // U
-	"alc",          // V
-	"akgmc",        // W
-	"amgkc",        // X
-	"aglgc",        // Y
-	"ackm"          // Z
-};
-
-//
-// locals
-//
-
-LOCAL CHAR          szIni[] = "HYPEROID.INI";
-LOCAL CHAR          szLicense[] = "LicenseRead";
-LOCAL CHAR          szDrawDelay[] = "DrawDelay";
-LOCAL CHAR          szMax[] = "Max";
-LOCAL CHAR          szX[] = "X";
-LOCAL CHAR          szY[] = "Y";
-LOCAL CHAR          szW[] = "W";
-LOCAL CHAR          szH[] = "H";
-LOCAL CHAR          szBW[] = "Mono";
-LOCAL CHAR          szPalette[] = "Palette";
-LOCAL CHAR          szKeys[] = "Keys";
-LOCAL CHAR          szShield[] = "Shield";
-LOCAL CHAR          szClockwise[] = "Clockwise";
-LOCAL CHAR          szCtrClockwise[] = "CtrClockwise";
-LOCAL CHAR          szThrust[] = "Thrust";
-LOCAL CHAR          szRevThrust[] = "RevThrust";
-LOCAL CHAR          szFire[] = "Fire";
-LOCAL CHAR          szBomb[] = "Bomb";
-LOCAL CHAR          szHi[] = "Hi";
-LOCAL CHAR          *szColorName[] =
-{
-	"Black", "DkGrey", "Grey", "White",
-	"DkRed", "Red",  "DkGreen", "Green", "DkBlue", "Blue",
-	"DkYellow", "Yellow", "DkCyan", "Cyan", "DkMagenta", "Magenta"
-};
-LOCAL DWORD         dwColors[] =
-{
-	RGB(0,0,0), RGB(128,128,128),
-	RGB(192,192,192), RGB(255,255,255),
-	RGB(128,0,0), RGB(255,0,0),
-	RGB(0,128,0), RGB(0,255,0),
-	RGB(0,0,128), RGB(0,0,255),
-	RGB(128,128,0), RGB(255,255,0),
-	RGB(0,128,128), RGB(0,255,255),
-	RGB(128,0,128), RGB(255,0,255),
-};
-
-//
-// PrintLetters - create letter objects from a string
-//
-
-VOID FAR PASCAL PrintLetters( NPSTR npszText, POINT Pos, POINT Vel,
-							  BYTE byColor, INT nSize )
-{
-	INT             nLen = strlen( npszText );
-	INT             nCnt = nLen;
-	INT             nSpace = nSize + nSize / 2;
-	INT             nBase = (nLen - 1) * nSpace;
-	INT             nBaseStart = Pos.x + nBase / 2;
-
-	while (nCnt--)
-	{
-		NPOBJ npLtr = CreateLetter( npszText[nCnt], nSize / 2 );
-		if (npLtr)
-		{
-			npLtr->Pos.x = nBaseStart;
-			npLtr->Pos.y = Pos.y;
-			npLtr->Vel = Vel;
-			npLtr->byColor = byColor;
-		}
-		nBaseStart -= nSpace;
-	}
-}
-
-//
-// SpinLetters - spin letter objects away from center for effect
-//
-
-VOID FAR PASCAL SpinLetters( NPSTR npszText, POINT Pos, POINT Vel,
-							 BYTE byColor, INT nSize )
-{
-	INT             nLen = strlen( npszText );
-	INT             nCnt = nLen;
-	INT             nSpace = nSize + nSize / 2;
-	INT             nBase = (nLen - 1) * nSpace;
-	INT             nBaseStart = Pos.x + nBase / 2;
-
-	while (nCnt--)
-	{
-		NPOBJ npLtr = CreateLetter( npszText[nCnt], nSize / 2 );
-		if (npLtr)
-		{
-			INT nSpin = (nCnt - nLen / 2) * 2;
-			npLtr->Pos.x = nBaseStart;
-			npLtr->Pos.y = Pos.y;
-			npLtr->Vel = Vel;
-			npLtr->Vel.x += nSpin * 16;
-			npLtr->nSpin = -nSpin;
-			npLtr->byColor = byColor;
-		}
-		nBaseStart -= nSpace;
-	}
-}
-
-//
-// CreateHyperoidPalette - create a logical palette
-//
-
-HPALETTE FAR PASCAL CreateHyperoidPalette( VOID )
-{
-	HPALETTE        hPalette;
-	HDC             hIC = CreateIC( "DISPLAY", NULL, NULL, NULL );
-	INT             t;
-	PALETTEENTRY    Pal[PALETTE_SIZE + 2];
-	NPLOGPALETTE    npLogPalette = (NPLOGPALETTE)Pal;
-
-	// are we forced into using b&w?
-	bBW = FALSE;
-	if (GetDeviceCaps( hIC, NUMCOLORS ) < 8) bBW = TRUE;
-	DeleteDC( hIC );
-	if (GetPrivateProfileInt( szAppName, szBW, FALSE, szIni )) bBW = TRUE;
-
-	npLogPalette->palVersion = 0x0300;
-	npLogPalette->palNumEntries = PALETTE_SIZE;
-
-	for (t = 0; t < PALETTE_SIZE; ++t)
-	{
-		DWORD           dwColor = dwColors[t];
-		CHAR            szBuff[32];
-
-		GetPrivateProfileString( szPalette, szColorName[t], "",
-								 szBuff, sizeof(szBuff), szIni );
-		if (szBuff[0])
-		{
-			INT r, g, b;
-			NPSTR npBuff = szBuff;
-			r = g = b = 255;
-			while (*npBuff == ' ') ++npBuff;
-			r = atoi( npBuff );
-			while (*npBuff && *npBuff != ',') ++npBuff;
-			if (*npBuff == ',') g = atoi( ++npBuff );
-			while (*npBuff && *npBuff != ',') ++npBuff;
-			if (*npBuff == ',') b = atoi( ++npBuff );
-			dwColor = RGB( r, g, b );
-		}
-		if (bBW) dwColor = ((dwColor == RGB(0,0,0)) ? RGB(0,0,0) : RGB(255,255,255));
-		npLogPalette->palPalEntry[t].peRed = GetRValue( dwColor );
-		npLogPalette->palPalEntry[t].peGreen = GetGValue( dwColor );
-		npLogPalette->palPalEntry[t].peBlue = GetBValue( dwColor );
-		npLogPalette->palPalEntry[t].peFlags = 0;
-	}
-
-	hPalette = CreatePalette( npLogPalette );
-	return( hPalette );
-}
-
-//
-// CreateHyperoidClass - create the class of Hyperoid's window
-//
-
-BOOL FAR PASCAL CreateHyperoidClass( VOID )
-{
-	WNDCLASS        Class;
-
-	// load the name from the resource file
-	LoadString( hAppInst, IDS_NAME, szAppName, sizeof(szAppName) );
-
-	Class.style = CS_HREDRAW | CS_VREDRAW;
-	Class.lpfnWndProc = HyperoidWndProc;
-	Class.cbClsExtra = 0;
-	Class.cbWndExtra = 0;
-	Class.hInstance = hAppInst;
-	Class.hIcon = NULL;
-	Class.hCursor = LoadCursor( NULL, IDC_CROSS );
-	Class.hbrBackground = HNULL;
-	Class.lpszMenuName = szAppName;
-	Class.lpszClassName = szAppName;
-
-	return( RegisterClass( &Class ) );
-}
-
-//
-// SetHyperoidMenu - add Hyperoid's menu items to the system menu
-//
-
-VOID NEAR PASCAL SetHyperoidMenu( HWND hWnd, INT nFirstID, INT nLastID )
-{
-	CHAR            szMenuName[40];
-	HMENU           hMenu;
-
-	hMenu = GetSystemMenu( hWnd, TRUE );
-	if (hMenu == HNULL) hMenu = GetSystemMenu( hWnd, FALSE );
-	if (hMenu == HNULL) return;
-
-	while (nFirstID <= nLastID)
-	{
-		LoadString( hAppInst, nFirstID, szMenuName, sizeof(szMenuName) );
-		ChangeMenu( hMenu, 0, szMenuName, nFirstID, MF_APPEND );
-		++nFirstID;
-	}
-}
-
-//
-// CreateHyperoidWindow - open the Hyperoid window
-//
-
-HWND FAR PASCAL CreateHyperoidWindow( LPSTR lpszCmd, INT nCmdShow )
-{
-	HWND            hWnd;
-	INT             x, y, w, h;
-	CHAR            szBuff[32];
-
-	// get the highscore profile here for lack of a better place...
-	GetPrivateProfileString( szAppName, szHi, "0", szBuff, sizeof(szBuff), szIni );
-	lHighScore = atol( szBuff );
-
-	x = GetPrivateProfileInt( szAppName, szX, CW_USEDEFAULT, szIni );
-	y = GetPrivateProfileInt( szAppName, szY, CW_USEDEFAULT, szIni );
-	w = GetPrivateProfileInt( szAppName, szW, CW_USEDEFAULT, szIni );
-	h = GetPrivateProfileInt( szAppName, szH, CW_USEDEFAULT, szIni );
-	if (GetPrivateProfileInt( szAppName, szMax, FALSE, szIni ) &&
-		nCmdShow == SW_NORMAL) nCmdShow = SW_SHOWMAXIMIZED;
-
-	hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW,
-						 x, y, w, h, HNULL, HNULL, hAppInst, NULL );
-	if (hWnd == HNULL) return( HNULL );
-
-	ShowWindow( hWnd, nCmdShow );
-	UpdateWindow( hWnd );
-	SetHyperoidMenu( hWnd, IDM_NEW, IDM_ABOUT );
-
-	// show the license...
-	if (!GetPrivateProfileInt( szAppName, szLicense, FALSE, szIni ))
-	{
-		MessageBeep( HYPEROID_HELPSTYLE );
-		MessageBox( hWnd, HYPEROID_LICENSE, "Hyperoid License", HYPEROID_HELPSTYLE );
-		// ...and never show it again (unless they want to see it)
-		WritePrivateProfileString( szAppName, szLicense, "1", szIni );
-	}
-
-	return( hWnd );
-}
-
-//
-// SaveHyperoidWindowPos - write out the .ini information
-//
-
-VOID FAR PASCAL SaveHyperoidWindowPos( HWND hWnd )
-{
-	RECT            rect;
-	CHAR            szBuff[32];
-
-	// save the highscore profile here for lack of a better place...
-	if (lHighScore)
-	{
-		wsprintf( szBuff, "%lu", lHighScore );
-		WritePrivateProfileString( szAppName, szHi, szBuff, szIni );
-	}
-
-	if (IsIconic( hWnd )) return;
-	if (IsZoomed( hWnd ))
-	{
-		WritePrivateProfileString( szAppName, szMax, "1", szIni );
-		return;
-	}
-	else WritePrivateProfileString( szAppName, szMax, NULL, szIni );
-
-	GetWindowRect( hWnd, &rect );
-	wsprintf( szBuff, "%d", rect.left );
-	WritePrivateProfileString( szAppName, szX, szBuff, szIni );
-	wsprintf( szBuff, "%d", rect.top );
-	WritePrivateProfileString( szAppName, szY, szBuff, szIni );
-	wsprintf( szBuff, "%d", rect.right - rect.left );
-	WritePrivateProfileString( szAppName, szW, szBuff, szIni );
-	wsprintf( szBuff, "%d", rect.bottom - rect.top );
-	WritePrivateProfileString( szAppName, szH, szBuff, szIni );
-}
-
-//
-// GetHyperoidIni - load the ini file information
-//
-
-VOID FAR PASCAL GetHyperoidIni( VOID )
-{
-	nDrawDelay = GetPrivateProfileInt( szAppName, szDrawDelay, DRAW_DELAY, szIni );
-	vkShld = GetPrivateProfileInt( szKeys, szShield, VK_TAB, szIni );
-	vkClkw = GetPrivateProfileInt( szKeys, szClockwise, VK_LEFT, szIni );
-	vkCtrClkw = GetPrivateProfileInt( szKeys, szCtrClockwise, VK_RIGHT, szIni );
-	vkThrst = GetPrivateProfileInt( szKeys, szThrust, VK_DOWN, szIni );
-	vkRvThrst = GetPrivateProfileInt( szKeys, szRevThrust, VK_UP, szIni );
-	vkFire = GetPrivateProfileInt( szKeys, szFire, VK_SPACE, szIni );
-	vkBomb = GetPrivateProfileInt( szKeys, szBomb, 'S', szIni );
-}
-
-//
-// HyperoidHelp - show help
-//
-
-VOID FAR PASCAL HyperoidHelp( HWND hWnd )
-{
-	MessageBox( hWnd, HYPEROID_HELP, "Hyperoid help", HYPEROID_HELPSTYLE );
-	MessageBox( hWnd, HYPEROID_HELP2, "Hyperoid.ini help", HYPEROID_HELPSTYLE );
-}
-
-//
-// HyperoidAboutDlg - the about box proc
-//
-
-BOOL FAR PASCAL EXPORT HyperoidAboutDlg( HWND hDlg, WORD mess,
-										 WORD wParam, LONG lParam )
-{
-	switch (mess)
-	{
-	case WM_INITDIALOG:
-		if (lHighScore)
-		{
-			CHAR szBuff[40];
-			wsprintf( szBuff, "High Score: %7.7lu", lHighScore );
-			SetDlgItemText( hDlg, IDD_A_HISCORE, szBuff );
-		}
-		break;
-
-	case WM_COMMAND:
-		switch (wParam)
-		{
-		case IDD_A_HELP:
-			HyperoidHelp( hDlg );
-			// fall through...
-		case IDOK:
-			EndDialog( hDlg, 0 );
-			break;
-
-		default:
-			return( FALSE );
-		}
-		break;
-
-	case WM_CLOSE:
-		EndDialog( hDlg, FALSE );
-		break;
-
-	default:
-		return( FALSE );
-	}
-	return( TRUE );
-}
-
-//
-// AboutHyperoid - show the about box
-//
-
-VOID FAR PASCAL AboutHyperoid( HWND hWnd )
-{
-	FARPROC lpprocAbout = MakeProcInstance( HyperoidAboutDlg, hAppInst );
-	DialogBox( hAppInst, INTRES( IDD_ABOUT ), hWnd, lpprocAbout );
-	FreeProcInstance( lpprocAbout );
-}
diff --git a/test/hyperoid/score.bmp b/test/hyperoid/score.bmp
deleted file mode 100644
index 73a35f199d57dca4d756ddeb93ec6e0ed7e981b8..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/score.bmp and /dev/null differ
diff --git a/test/hyperoid/shield.bmp b/test/hyperoid/shield.bmp
deleted file mode 100644
index d61606b825a3238158e24c552b9edf889798b887..0000000000000000000000000000000000000000
Binary files a/test/hyperoid/shield.bmp and /dev/null differ
diff --git a/test/hyperoid/winext.h b/test/hyperoid/winext.h
deleted file mode 100644
index 5694920cbab8016074e7503fe10fc73fb8e36f7e..0000000000000000000000000000000000000000
--- a/test/hyperoid/winext.h
+++ /dev/null
@@ -1,109 +0,0 @@
-#if !defined(WINEXT_H)
-#define WINEXT_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif // __cplusplus
-
-//
-// WINEXT.H - additional windows definitions
-//
-// Version 1.0  03/21/89  Copyright (C) 1989,90,91 Lantern Coroporation.
-// Author: Edward Hutchins
-// Status: Freeware
-// Revisions:
-// 06/06/90 modified HUGE to LARGE to preserve compatibility with math.h
-//          also nested windows.h include to prevent modifications on the
-//          actual source file - Ed.
-// 10/01/90 added CONST and CONSTP,NP,LP,HP and a few comments - Ed.
-// 08/28/91 added EXPORT and SEGMENT - Ed.
-// 10/28/91 added DLLEXP - Ed.
-// 11/02/91 posted on Compuserve - Ed.
-//
-
-//
-// include WINDOWS.H, if needed
-//
-
-#if !defined(WINDOWS_H)
-	#if defined(NULL)
-		#undef NULL
-	#endif
-	#include <windows.h>
-	#if !defined(NULL)
-		#define NULL 0
-	#endif
-	#define WINDOWS_H
-#endif // WINDOWS_H
-
-//
-// extra data types and defines
-//
-
-#define LARGE huge
-#define CDECL cdecl
-#define CONST const
-#define HNULL (0)
-#define LPNULL (0L)
-
-typedef char        CHAR;
-typedef int         INT;
-typedef float       FLOAT;
-typedef double      DOUBLE;
-typedef long double LDOUBLE;
-
-// extend the string type
-typedef CHAR LARGE  *HPSTR;
-
-// useful macros for typedefing pointers to objects //
-#define npointerdef(o) typedef o NEAR * NP ## o
-#define lpointerdef(o) typedef o FAR * LP ## o
-#define hpointerdef(o) typedef o LARGE * HP ## o
-#define pointerdef(o) npointerdef(o); lpointerdef(o); hpointerdef(o)
-
-// define the different kinds of pointers to things //
-pointerdef( BOOL );
-npointerdef( BYTE ); hptrdef( BYTE );
-pointerdef( CHAR );
-npointerdef( INT ); hpointerdef( INT );
-npointerdef( WORD ); hpointerdef( WORD );
-npointerdef( LONG ); hpointerdef( LONG );
-npointerdef( DWORD ); hpointerdef( DWORD );
-pointerdef( FLOAT );
-pointerdef( DOUBLE );
-pointerdef( LDOUBLE );
-npointerdef( HANDLE ); hpointerdef( HANDLE );
-npointerdef( VOID ); hpointerdef( VOID );
-
-// these are here for compatibility - use NPVOID etc...
-typedef VOID NEAR *NPMEM;
-typedef VOID FAR *LPMEM;
-
-// window proc function pointer
-typedef LONG (FAR PASCAL *WNDPROC)( HWND, unsigned, WORD, LONG );
-
-//
-// scope protocol definitions
-//
-
-#define GLOBAL      // GLOBAL
-#define LOCAL       static
-#define IMPORT      extern
-#define FROM(where) // FROM where
-#define PROTO       // PROTOTYPE
-
-#define EXPORT _export
-#define SEGMENT _segment
-
-#if defined(__cplusplus)
-}
-#endif // __cplusplus
-
-// c++ class export type
-#if defined(__DLL__)
-#define DLLEXP EXPORT
-#else
-#define DLLEXP LARGE
-#endif
-
-#endif // WINEXT_H
diff --git a/test/martin_ship2/widget.c b/test/martin_ship2/widget.c
new file mode 100755
index 0000000000000000000000000000000000000000..de7e29ae80bc3d0ed33f1357317f0758d3f91fd7
--- /dev/null
+++ b/test/martin_ship2/widget.c
@@ -0,0 +1,442 @@
+/**********************************************************************
+ *               Copyright (c) 1991 by TRG ELECTRONIK                 *
+ *                                                                    *
+ *                            widget.C                               *
+ *              widget Inventory Controler   PART # 1                *
+ *                                                                    *
+ **********************************************************************/
+
+#include <WINDOWS.H>
+#include "STDIO.h"
+#include "STDLIB.h"
+#include "STDARG.h"
+#include "STRING.H"
+
+#include "widget.H"
+#include "widget.VAR"
+#include "widget.P"
+
+#define NoREF(a) a=a
+
+WORD          wPlayDiskID;
+
+HWND		hWndBut;
+HWND		hWndChk;
+HWND		hWndRadio;
+HWND		hWndLBox;
+HWND		hWndScrol;
+HWND		hWndScro2;
+HWND		hWndStat;
+HWND		hWndEdit;
+HWND		hWndCBox;
+int		x, y;
+
+/**********************************************************************/
+
+
+int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
+                   LPSTR lpszCmdLine,int nCmdShow)
+{
+WNDCLASS  wndClass;
+MSG       msg;
+HWND      hWnd;
+HDC       hDC;
+char      C[40];
+int       X;
+NoREF(lpszCmdLine);
+if ( !hPrevInstance )
+    {
+    wndClass.style           = CS_HREDRAW | CS_VREDRAW ;
+    wndClass.lpfnWndProc     = (WNDPROC)WndProc;
+    wndClass.cbClsExtra      = 0;
+    wndClass.cbWndExtra      = 0;
+    wndClass.hInstance       = hInstance;
+    wndClass.hIcon           = LoadIcon(hInstance,(LPSTR)"ICON_1");
+    wndClass.hCursor         = LoadCursor(NULL, IDC_ARROW );
+    wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH );
+    wndClass.lpszMenuName    = szAppName;
+    wndClass.lpszClassName   = szAppName;
+    if (!RegisterClass(&wndClass))
+        return FALSE;
+    }
+hWnd = CreateWindow(szAppName, "widget test program",
+                    WS_POPUP | WS_BORDER | WS_VISIBLE, 50, 50,
+                    400, 400, NULL, NULL, hInstance, NULL);
+hWndMain = hWnd;
+hInst = hInstance;
+hDCMain = GetDC(hWndMain);
+
+InitWidgets();
+
+while (GetMessage(&msg, NULL, 0, 0))
+    {
+    TranslateMessage(&msg );
+    DispatchMessage(&msg );
+    }
+ReleaseDC(hWndMain, hDC);
+return(0);
+}
+
+
+void InitWidgets()
+{
+hWndBut = CreateWindow("BUTTON", "Button #1",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, 
+            230, 40, 80, 30, hWndMain, 1001, hInst, NULL);
+hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
+				200, 140, 15, 100, hWndMain, 1004, hInst, NULL);
+hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
+				50, 140, 100, 15, hWndMain, 1005, hInst, NULL);
+x = y = 25;
+SetVertScroll(NULL, hWndScrol, 25, 0, 50);
+SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);
+SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);
+hWndLBox = CreateWindow("LISTBOX", "",
+            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
+				230, 160, 150, 100, hWndMain, 1004, hInst, NULL);
+SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");
+}
+
+
+
+long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)
+{
+int	ShiftState;
+char	C[80];
+ShiftState = GetKeyState(VK_SHIFT);
+switch(Message)
+    {
+    case WM_COMMAND:
+		  if (LOWORD(lParam) != 0)
+			   {
+		  		sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);
+		  		TextOut(hDCMain, 25, 280, C, strlen(C));
+			   }
+        break;
+
+    case WM_KEYDOWN:
+		  sprintf(C, "WM_KEYDOWN !!!");
+		  TextOut(hDCMain, 25, 40, C, strlen(C));
+		  KeyDown(hWnd, Message, wParam);
+        break;
+
+    case WM_CHAR:
+		  sprintf(C, "WM_CHAR !!!");
+		  TextOut(hDCMain, 25, 50, C, strlen(C));
+        break;
+
+    case WM_LBUTTONDOWN:
+        break;
+
+    case WM_LBUTTONUP:
+        break;
+
+    case WM_RBUTTONDOWN:
+        break;
+
+    case WM_RBUTTONUP:
+        break;
+
+    case WM_MOUSEMOVE:
+        break;
+
+    case WM_VSCROLL:
+		  sprintf(C, "WM_VSCROLL %X %X %lX !!!", Message, wParam, lParam);
+		  TextOut(hDCMain, 25, 370, C, strlen(C));
+		  Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);
+        break;
+
+    case WM_HSCROLL:
+		  sprintf(C, "WM_HSCROLL %X %X %lX !!!", Message, wParam, lParam);
+		  TextOut(hDCMain, 25, 370, C, strlen(C));
+		  Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);
+        break;
+
+    case WM_PAINT:
+        DoPaint(hWnd);
+        break;
+
+    case WM_DESTROY:
+        PostQuitMessage(0);
+        break;
+
+    default:
+        return DefWindowProc(hWnd, Message, wParam, lParam);
+    }
+return(0);
+}
+
+
+
+BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)
+{
+WORD			wRet;
+UINT			uRet;
+DWORD			dwRet;
+char			C[128];
+char			C2[64];
+NoREF(hWnd);
+NoREF(Message);
+sprintf(C, "KeyDown %x !!!", wParam);
+TextOut(hDCMain, 25, 100, C, strlen(C));
+switch (wParam)
+    {
+    case VK_HOME:            /* 'HOME' KEY         */
+        break;
+    case VK_LEFT:            /* 'LEFT' CURSOR KEY  */
+        break;
+    case VK_RIGHT:           /* 'RIGHT' CURSOR KEY */
+        break;
+    case VK_UP:              /* 'UP' CURSOR KEY    */
+        break;
+    case VK_DOWN:            /* 'DOWN' CURSOR KEY  */
+        break;
+    case VK_PRIOR:           /* 'PGUP' CURSOR KEY  */
+        break;
+    case VK_NEXT:            /* 'PGDN' CURSOR KEY  */
+        break;
+    case '1':
+        break;
+    case '2':
+        break;
+    case '3':
+        break;
+    case '4':
+        break;
+    case '5':
+        break;
+    case 'A':
+        break;
+    case 'B':
+        break;
+    case 'C':
+        break;
+    case 'D':
+        break;
+    case 'E':
+        break;
+    case 'F':
+        break;
+    case 'G':
+        break;
+    case 'H':
+		  WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);
+        break;
+    case 'J':
+		  WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);
+        break;
+    case 'K':
+        break;
+    case 'Q':
+		  hWndStat = CreateWindow("STATIC", "Static #1",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, 
+            			230, 20, 80, 20, hWndMain, 1000, hInst, NULL);
+        break;
+    case 'W':
+		  hWndChk = CreateWindow("BUTTON", "CheckBox #1",
+                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,
+						  230, 90, 120, 20, hWndMain, 1002, hInst, NULL);
+        break;
+    case 'R':
+		  hWndRadio = CreateWindow("BUTTON", "RadioBut #1",
+                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,
+						  230, 120, 120, 20, hWndMain, 1003, hInst, NULL);
+		  SendMessage(hWndRadio, BM_SETCHECK, 0, 0L);
+        break;
+    case 'T':
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");
+        break;
+    case 'Y':
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");
+		  SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);
+		  SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");
+		  wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");
+		  sprintf(C, "LB_FINDSTRING returned #%u   ", wRet);
+		  TextOut(hDCMain, 25, 300, C, strlen(C));
+		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
+		  sprintf(C, "LB_GETCURSEL returned #%u   ", wRet);
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'U':
+		  SendMessage(hWndLBox, LB_DELETESTRING, 3, 0L);
+        break;
+    case 'I':
+		  SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);
+        break;
+    case 'O':
+		  C2[0] = '\0';
+		  SendMessage(hWndLBox, LB_GETTEXT, 2, (DWORD)C2);
+		  sprintf(C, "LB_GETTEXT returned '%s'   ", C2);
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'P':
+		  SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");
+        break;
+    case 'Z':
+		  ShowWindow(hWndScrol, SW_HIDE);
+        break;
+    case 'X':
+		  ShowWindow(hWndScrol, SW_SHOW);
+        break;
+     case 'V':
+		  hWndCBox = CreateWindow("COMBOBOX", "Combo #1",
+                    WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWNLIST,
+						  230, 270, 150, 100, hWndMain, 1006, hInst, NULL);
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
+        break;
+     case 'N':
+		  hWndCBox = CreateWindow("COMBOBOX", "Combo #2",
+                    WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWN,
+						  30, 270, 150, 100, hWndMain, 1007, hInst, NULL);
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
+        break;
+
+    case VK_F10:             /* 'F10' FUNCTION KEY */
+        break;
+    case VK_F11:             /* 'F11' FUNCTION KEY */
+        break;
+    }
+return(TRUE);
+}
+
+
+
+void DoPaint(HWND hWnd)
+{
+HDC         hDC;
+RECT        rect;
+PAINTSTRUCT ps;
+char   C[80];
+GetClientRect(hWnd, &rect);
+hDC = BeginPaint(hWnd, &ps);
+FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
+InflateRect(&rect, -3, -3);
+FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+InflateRect(&rect, -10, -10);
+FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));
+sprintf(C, "Wine Testing !!!");
+TextOut(hDC, 25, 25, C, strlen(C));
+ReleaseDC(hWnd,hDC);
+EndPaint(hWnd,&ps);
+}
+
+
+/**********************************************************************/
+
+
+void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
+{
+char  C[12];
+SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);
+SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);
+itoa(VAL, C, 10);
+//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
+}
+
+
+
+void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
+{
+char  C[12];
+SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);
+SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);
+itoa(VAL, C, 10);
+//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
+}
+
+
+
+void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
+{
+char  C[12];
+int   VAL;
+int   VAL2;
+int	Step = 100;
+if (MAX < 1000)	Step = 10;
+if (MAX < 100)		Step = MAX / 10;
+VAL = *(V);
+VAL2 = VAL;
+switch (wParam)
+    {
+    case SB_LINEUP:
+			VAL++;
+			break;
+    case SB_LINEDOWN:
+			VAL--;
+			break;
+    case SB_PAGEUP:
+			VAL += Step;
+			break;
+    case SB_PAGEDOWN:
+			VAL -= Step;
+			break;
+    case SB_THUMBTRACK:
+    case SB_THUMBPOSITION:
+		   VAL = -(LOWORD(lParam));
+			break;
+	}
+if (VAL > MAX)		VAL = MAX;
+if (VAL < MIN)		VAL = MIN;
+if (VAL != VAL2)
+    {
+    SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);
+    ltoa(VAL, C, 10);
+//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
+    }
+*(V) = VAL;
+}
+
+
+void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
+{
+char  C[12];
+int   VAL;
+int   VAL2;
+int	Step = 100;
+if (MAX < 1000)	Step = 10;
+if (MAX < 100)		Step = MAX / 10;
+VAL = *(V);
+VAL2 = VAL;
+switch (wParam)
+    {
+    case SB_LINEUP:
+			VAL--;
+			break;
+    case SB_LINEDOWN:
+			VAL++;
+			break;
+    case SB_PAGEUP:
+			VAL -= Step;
+			break;
+    case SB_PAGEDOWN:
+			VAL += Step;
+			break;
+    case SB_THUMBTRACK:
+    case SB_THUMBPOSITION:
+		   VAL = (LOWORD(lParam));
+			break;
+	}
+if (VAL > MAX)		VAL = MAX;
+if (VAL < MIN)		VAL = MIN;
+if (VAL != VAL2)
+    {
+    SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);
+    ltoa(VAL, C, 10);
+//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
+    }
+*(V) = VAL;
+}
+
+
+/**********************************************************************/
+
+
+
\ No newline at end of file
diff --git a/test/martin_ship2/widget.def b/test/martin_ship2/widget.def
new file mode 100755
index 0000000000000000000000000000000000000000..9a5296b90fcdde4aee27cde7670083592d1782d2
--- /dev/null
+++ b/test/martin_ship2/widget.def
@@ -0,0 +1,23 @@
+;**********************************************************************
+;*               Copyright (c) 1991 by TRG ELECTRONIK                 *
+;**********************************************************************
+
+
+NAME         WineTest
+DESCRIPTION  'Drink Inventry Controler'
+STUB         'WINSTUB.EXE'
+CODE         PRELOAD MOVEABLE DISCARDABLE
+DATA         PRELOAD MOVEABLE MULTIPLE
+EXETYPE      WINDOWS
+SEGMENTS
+       DRINK_TEXT  PRELOAD MOVEABLE DISCARDABLE
+
+HEAPSIZE     20000
+STACKSIZE    8192
+
+EXPORTS      WndProc             @1
+             About_Proc          @3
+
+
+
+
\ No newline at end of file
diff --git a/test/martin_ship2/widget.h b/test/martin_ship2/widget.h
new file mode 100755
index 0000000000000000000000000000000000000000..a0d9f01cc9759027e69b19a30ff5bc2106a255dc
--- /dev/null
+++ b/test/martin_ship2/widget.h
@@ -0,0 +1,250 @@
+/**********************************************************************
+*               Copyright (c) 1991 by TRG ELECTRONIK                 *
+**********************************************************************/
+
+#define szAppName "widgetClass"
+
+#define IDNULL         -1
+
+#define IDSCLOSE       20
+#define IDSOKCLOSE     21
+#define IDSSAVE        22
+#define IDSOKSAVE      23
+#define IDINFO         24
+#define IDSAVE         25
+#define IDDELETE       26
+#define IDNEW          27
+
+
+#define IDBUSER        30
+#define IDBUSER1       31
+#define IDBUSER2       32
+#define IDBUSER3       33
+#define IDBUSER4       34
+#define IDBUSER5       35
+#define IDBUSER6       36
+#define IDBUSER7       37
+#define IDBUSER8       38
+#define IDBUSER9       39
+
+#define IDDJOBNAME     50
+#define IDDPRINTER     51
+
+#define IDSETUP        60
+
+
+#define IDI_MKSICON    99
+
+/******************************************/
+
+#define MID_NEW        100
+#define MID_OPEN       101
+#define MID_SAVE       102
+#define MID_SAVEAS     103
+#define MID_PRINT      104
+#define MID_PRSETUP    105
+#define MID_STATUS     106
+#define MID_QUIT       107
+
+#define MID_CUT        121
+#define MID_COPY       122
+#define MID_PASTE      123
+#define MID_CLEAR      124
+#define MID_COPYTO     125
+#define MID_PASTEFROM  126
+
+#define MID_NEWPROD    140
+#define MID_NEWBEER    141
+#define MID_USERCFG    142
+
+#define MID_POREGIE    151
+#define MID_POBIERE    152
+#define MID_DAYSTOCK   153
+#define MID_RESERVE    154
+#define MID_COCKSALE   155
+#define MID_DRYSALE    156
+#define MID_COMPILE    157
+#define MID_RECETTES   158
+#define MID_HD         159
+#define MID_TESTPRN    160
+#define MID_INFODSK    161
+#define MID_SHARP      162
+#define MID_PASSWORD   163
+
+/******************************************/
+
+#define IDDTEXT        200
+#define IDDTXT1        201
+#define IDDTXT2        202
+#define IDDTXT3        203
+#define IDDTXT4        204
+#define IDDTXT5        205
+#define IDDTXT6        206
+#define IDDTXT7        207
+#define IDDTXT8        208
+#define IDDTXT9        209
+#define IDDTXT10       210
+#define IDDTXT11       211
+#define IDDTXT12       212
+#define IDDTXT13       213
+#define IDDTXT14       214
+#define IDDTXT15       215
+#define IDDTXT16       216
+#define IDDTXT17       217
+#define IDDTXT18       218
+#define IDDTXT19       219
+
+#define IDDBUTTON1     220
+#define IDDBUTTON2     221
+#define IDDBUTTON3     222
+#define IDDBUTTON4     223
+#define IDDBUTTON5     224
+#define IDDBUTTON6     225
+#define IDDBUTTON7     226
+#define IDDBUTTON8     227
+#define IDDBUTTON9     228
+#define IDDBUTTON10    229
+
+#define IDDCHKBOX1     240
+#define IDDCHKBOX2     241
+#define IDDCHKBOX3     242
+#define IDDCHKBOX4     243
+#define IDDCHKBOX5     244
+#define IDDCHKBOX6     245
+#define IDDCHKBOX7     246
+#define IDDCHKBOX8     247
+#define IDDCHKBOX9     248
+#define IDDCHKBOX10    249
+
+#define IDDSCROLL1     250
+#define IDDSCROLL2     251
+#define IDDSCROLL3     252
+#define IDDSCROLL4     253
+#define IDDSCROLL5     254
+#define IDDSCROLL6     255
+#define IDDSCROLL7     256
+#define IDDSCROLL8     257
+
+#define IDDSTR1        2000
+#define IDDSTR2        2001
+#define IDDSTR3        2002
+#define IDDSTR4        2003
+#define IDDSTR5        2004
+#define IDDSTR6        2005
+#define IDDSTR7        2006
+#define IDDSTR8        2007
+#define IDDSTR9        2008
+#define IDDSTR10       2009
+#define IDDSTR11       2010
+#define IDDSTR12       2011
+#define IDDSTR13       2012
+#define IDDSTR14       2013
+#define IDDSTR15       2014
+#define IDDSTR16       2015
+#define IDDSTR17       2016
+#define IDDSTR18       2017
+#define IDDSTR19       2018
+#define IDDSTR20       2019
+#define IDDSTR21       2020
+#define IDDSTR22       2021
+#define IDDSTR23       2022
+#define IDDSTR24       2023
+#define IDDSTR25       2024
+#define IDDSTR26       2025
+#define IDDSTR27       2026
+#define IDDSTR28       2027
+#define IDDSTR29       2028
+#define IDDSTR30       2029
+#define IDDSTR31       2030
+#define IDDSTR32       2031
+#define IDDSTR33       2032
+#define IDDSTR34       2033
+#define IDDSTR35       2034
+#define IDDSTR36       2035
+#define IDDSTR37       2036
+#define IDDSTR38       2037
+#define IDDSTR39       2038
+#define IDDSTR40       2039
+#define IDDSTR41       2040
+#define IDDSTR42       2041
+#define IDDSTR43       2042
+#define IDDSTR44       2043
+#define IDDSTR45       2044
+#define IDDSTR46       2045
+#define IDDSTR47       2046
+#define IDDSTR48       2047
+#define IDDSTR49       2048
+#define IDDSTR50       2049
+#define IDDSTR51       2050
+#define IDDSTR52       2051
+#define IDDSTR53       2052
+#define IDDSTR54       2053
+#define IDDSTR55       2054
+#define IDDSTR56       2055
+#define IDDSTR57       2056
+#define IDDSTR58       2057
+#define IDDSTR59       2058
+#define IDDSTR60       2059
+#define IDDSTR61       2060
+#define IDDSTR62       2061
+#define IDDSTR63       2062
+#define IDDSTR64       2063
+#define IDDSTR65       2064
+#define IDDSTR66       2065
+#define IDDSTR67       2066
+#define IDDSTR68       2067
+#define IDDSTR69       2068
+#define IDDSTR70       2069
+
+
+/******************************************/
+
+#define IDDDEFAULTS    1001
+#define IDDCHECKBOX    1002
+#define IDDNULL        1003
+#define IDDRBLEFT      1004
+#define IDDRBRIGHT     1005
+#define IDDRBCENTER    1006
+#define IDDLISTBOX     1007
+#define IDDSBH         1008
+#define IDDSBV         1009
+
+/******************************************/
+
+#define ABOUT_Dlg      2001
+#define NEW_Dlg        2002
+#define OPEN_Dlg       2003
+#define SAVE_Dlg       2004
+#define SAVEAS_Dlg     2005
+#define PRINT_Dlg      2006
+#define ABORT_Dlg      2007
+#define PRSETUP_Dlg    2008
+#define QUIT_Dlg       2009
+
+#define GETOBJ_Dlg     2020
+#define NEWPROD_Dlg    2021
+#define NEWBEER_Dlg    2022
+#define USERCFG_Dlg    2023
+#define POREGIE_Dlg    2024
+#define POBIERE_Dlg    2025
+#define PASSWORD_Dlg   2026
+#define TVQ_Dlg        2027
+
+#define LTEXTOK_Dlg    2070
+
+
+/******************************************/
+
+#define RED            0x000000FF
+#define GREEN          0x0000FF00
+#define BLUE           0x00FF0000
+#define CYAN           0x00FFFF00
+#define MAGENTA        0x00FF00FF
+#define BLACK          0x00000000
+#define WHITE          0x00FFFFFF
+#define GRAY           0x00808080
+#define LTGRAY         0x00C0C0C0
+#define DKGRAY         0x00404040
+
+
+
\ No newline at end of file
diff --git a/test/martin_ship2/widget.ic2 b/test/martin_ship2/widget.ic2
new file mode 100755
index 0000000000000000000000000000000000000000..3e0e0d5743524e8b9bac63fa3dee6048d53d3900
Binary files /dev/null and b/test/martin_ship2/widget.ic2 differ
diff --git a/test/martin_ship2/widget.ic3 b/test/martin_ship2/widget.ic3
new file mode 100755
index 0000000000000000000000000000000000000000..db642dce5d7f7e3b8ae4d7df57a26f01a277b18a
Binary files /dev/null and b/test/martin_ship2/widget.ic3 differ
diff --git a/test/martin_ship2/widget.ico b/test/martin_ship2/widget.ico
new file mode 100755
index 0000000000000000000000000000000000000000..824d52d71151627636c197daf5c923a08a371f0a
Binary files /dev/null and b/test/martin_ship2/widget.ico differ
diff --git a/test/martin_ship2/widget.rc b/test/martin_ship2/widget.rc
new file mode 100755
index 0000000000000000000000000000000000000000..5a86c23dba899de9243d834e3b596f9aeecb13f5
--- /dev/null
+++ b/test/martin_ship2/widget.rc
@@ -0,0 +1,78 @@
+/**********************************************************************
+ *               Copyright (c) 1991 by TRG ELECTRONIK                 *
+ *                                                                    *
+ *                            widget.RC                               *
+ * 		          widget RESSOURCES               	      *
+ *                                                                    *
+ **********************************************************************/
+
+#include <\BC\INCLUDE\WINDOWS.H>
+#include "widget.H"
+
+#define TABGRP      WS_TABSTOP | WS_GROUP
+#define LBSTYLES    WS_VSCROLL | WS_BORDER | WS_VISIBLE | LBS_SORT | TABGRP
+#define HSCROLL     WS_VISIBLE | SBS_HORZ | SBS_TOPALIGN    | TABGRP
+#define VSCROLL     WS_VISIBLE | SBS_VERT | SBS_LEFTALIGN   | TABGRP
+#define BLACKRECT   SS_BLACKRECT  | WS_VISIBLE | WS_GROUP
+#define WHITEFRAME  SS_WHITEFRAME | WS_VISIBLE | WS_GROUP
+
+
+ICON_1  ICON widget.ICO
+ICON_2  ICON widget.IC2
+ICON_3  ICON widget.IC3
+
+MENU_1 MENU
+BEGIN
+  POPUP "&File"
+  BEGIN
+    MENUITEM "&New",           MID_NEW
+    MENUITEM "&Open",          MID_OPEN
+    MENUITEM "&Save",          MID_SAVE
+    MENUITEM "Save &As",       MID_SAVEAS
+    MENUITEM SEPARATOR
+    MENUITEM "&Quit!",         MID_QUIT
+  END
+END
+
+
+
+
+ABOUT_Dlg DIALOG 100, 100, 154,  75
+STYLE WS_POPUP | WS_DLGFRAME
+BEGIN
+  ICON  "widget"                    -1,                                                       9,  23,   0,   0
+  ICON  "DKICON2"                    -1,                                                      30,  23,   0,   0
+  ICON  "DKICON3"                    -1,                                                      50,  23,   0,   0
+  CTEXT "About widget Inventory Controler"     -1,  0, 14,154, 8
+  CTEXT "Version 0.50"                        -1, 30, 34, 94, 8
+  CTEXT "Copyright © 1991, TRG Electronik"  -1,  0, 47,154, 9
+  DEFPUSHBUTTON "Ok"                        IDOK, 61, 59, 32, 14, WS_GROUP
+END
+
+
+LTEXTOK_Dlg DIALOG 100, 100, 300, 120
+STYLE  WS_POPUP | WS_DLGFRAME
+BEGIN
+  LTEXT "",                            IDDTXT1,   20, 15,118, 12
+  LTEXT "",                            IDDTXT2,   20, 30,118, 25
+  LTEXT "",                            IDDTXT3,   20, 45,118, 35
+  LTEXT "",                            IDDTXT3,   20, 60,118, 35
+  DEFPUSHBUTTON "OK",                  IDOK,     150, 85, 40, 14, TABGRP
+END
+
+
+STRINGTABLE
+BEGIN
+IDDSTR1,    "Wine Test Program"
+IDDSTR2,    ""
+IDDSTR3,    ""
+IDDSTR4,    ""
+IDDSTR5,    ""
+IDDSTR6,    ""
+IDDSTR7,    ""
+IDDSTR8,    ""
+IDDSTR9,    ""
+IDDSTR10,   ""
+END
+
+
\ No newline at end of file
diff --git a/test/martin_ship4/widget.c b/test/martin_ship4/widget.c
new file mode 100755
index 0000000000000000000000000000000000000000..4d2dfcf4eff99b34fee80ab922261f3bee8222b8
--- /dev/null
+++ b/test/martin_ship4/widget.c
@@ -0,0 +1,649 @@
+/**********************************************************************
+ *               Copyright (c) 1991 by TRG ELECTRONIK                 *
+ *                                                                    *
+ *                             widget.C                               *
+ *              widget Inventory Controler   PART # 1                 *
+ *                                                                    *
+ **********************************************************************/
+
+#include <WINDOWS.H>
+#include "STDIO.h"
+#include "STDLIB.h"
+#include "STDARG.h"
+#include "STRING.H"
+
+#include "widget.H"
+#include "widget.VAR"
+#include "widget.P"
+
+#define NoREF(a) a=a
+
+HWND		hWndBut;
+HWND		hWndChk;
+HWND		hWndRadio;
+HWND		hWndLBox;
+HWND		hWndLBox2;
+HWND		hWndLBox3;
+HWND		hWndLBox4;
+HWND		hWndScrol;
+HWND		hWndScro2;
+HWND		hWndScro3;
+HWND		hWndStat;
+HWND		hWndEdit;
+HWND		hWndCBox;
+int		x, y;
+
+HBRUSH	hREDBrush;
+HBRUSH	hGREENBrush;
+HBRUSH	hBLUEBrush;
+HBRUSH	hGRAYBrush;
+HBITMAP  hBitMap;
+HBITMAP  hBitMap2;
+HBITMAP  hBitMap3;
+BITMAP   BitMap;
+
+/**********************************************************************/
+
+
+int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
+                   LPSTR lpszCmdLine,int nCmdShow)
+{
+WNDCLASS  wndClass;
+MSG       msg;
+HWND      hWnd;
+HDC       hDC;
+char      C[40];
+int       X;
+NoREF(lpszCmdLine);
+if ( !hPrevInstance )
+    {
+    wndClass.style           = CS_HREDRAW | CS_VREDRAW ;
+    wndClass.lpfnWndProc     = (WNDPROC)WndProc;
+    wndClass.cbClsExtra      = 0;
+    wndClass.cbWndExtra      = 0;
+    wndClass.hInstance       = hInstance;
+    wndClass.hIcon           = LoadIcon(hInstance,(LPSTR)"ICON_1");
+    wndClass.hCursor         = LoadCursor(NULL, IDC_ARROW );
+    wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH );
+    wndClass.lpszMenuName    = szAppName;
+    wndClass.lpszClassName   = szAppName;
+    if (!RegisterClass(&wndClass))
+        return FALSE;
+    }
+hWnd = CreateWindow(szAppName, "widget test program",
+         WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE, 50, 50,
+         400, 500, NULL, NULL, hInstance, NULL);
+hWndMain = hWnd;
+hInst = hInstance;
+hDCMain = GetDC(hWndMain);
+hREDBrush    = CreateSOLIDBrush(0x000000FF);
+hGREENBrush  = CreateSOLIDBrush(0x00007F00);
+hBLUEBrush   = CreateSOLIDBrush(0x00FF0000);
+hGRAYBrush   = CreateSOLIDBrush(0x00C0C0C0);
+
+InitWidgets();
+
+while (GetMessage(&msg, NULL, 0, 0))
+    {
+    TranslateMessage(&msg );
+    DispatchMessage(&msg );
+    }
+DeleteObject(hREDBrush);
+DeleteObject(hGREENBrush);
+DeleteObject(hBLUEBrush);
+DeleteObject(hGRAYBrush);
+if (hBitMap != NULL) DeleteObject(hBitMap);
+if (hBitMap2 != NULL) DeleteObject(hBitMap2);
+if (hBitMap3 != NULL) DeleteObject(hBitMap3);
+ReleaseDC(hWndMain, hDC);
+return(0);
+}
+
+
+void InitWidgets()
+{
+hWndBut = CreateWindow("BUTTON", "Button #1",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_PUSHBUTTON, 
+            230, 40, 80, 30, hWndMain, 1001, hInst, NULL);
+hWndScrol = CreateWindow("SCROLLBAR", "Scroll #1",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
+				200, 150, 15, 100, hWndMain, 1004, hInst, NULL);
+hWndScro2 = CreateWindow("SCROLLBAR", "Scroll #2",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
+				50, 150, 100, 15, hWndMain, 1005, hInst, NULL);
+hWndScro3 = CreateWindow("SCROLLBAR", "Scroll #3",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_SIZEBOX,
+				50, 180, 25, 25, hWndMain, 1006, hInst, NULL);
+x = y = 25;
+SetVertScroll(NULL, hWndScrol, 25, 0, 50);
+SetScrollRange(hWndScro2, SB_CTL, 0, 50, TRUE);
+SetScrollPos(hWndScro2, SB_CTL, 25, TRUE);
+hWndLBox = CreateWindow("LISTBOX", "",
+            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
+				230, 160, 150, 100, hWndMain, 1004, hInst, NULL);
+SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #1");
+hWndStat = CreateWindow("STATIC", "Static #1",
+            WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_LEFT, 
+            30, 120, 150, 20, hWndMain, 1011, hInst, NULL);
+SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Left Text");
+hWndCBox = CreateWindow("COMBOBOX", "Combo #1",
+		WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
+		230, 270, 150, 100, hWndMain, 1060, hInst, NULL);
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #3");
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #4");
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #5");
+SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #6");
+}
+
+
+
+long FAR PASCAL WndProc(HWND hWnd, unsigned Message, WORD wParam, LONG lParam)
+{
+int	ShiftState;
+LPDRAWITEMSTRUCT dis;
+HDC      hMemDC;
+HBRUSH	hBrush;
+char	C[128];
+ShiftState = GetKeyState(VK_SHIFT);
+switch(Message)
+    {
+    case WM_COMMAND:
+		  if (LOWORD(lParam) != 0)
+			   {
+		  		sprintf(C, "MAIN WM_COMMAND wParam=%X lParam=%lX !!!", wParam, lParam);
+		  		TextOut(hDCMain, 25, 280, C, strlen(C));
+			   }
+        break;
+
+    case WM_KEYDOWN:
+		  sprintf(C, "WM_KEYDOWN !!!");
+		  TextOut(hDCMain, 25, 40, C, strlen(C));
+		  KeyDown(hWnd, Message, wParam);
+        break;
+
+    case WM_CHAR:
+		  sprintf(C, "WM_CHAR !!!");
+		  TextOut(hDCMain, 25, 50, C, strlen(C));
+        break;
+
+    case WM_CTLCOLOR:
+		  switch(HIWORD(lParam))
+			   {
+				case CTLCOLOR_SCROLLBAR:
+                return(hBLUEBrush);
+				case CTLCOLOR_LISTBOX:
+		          SetBkColor((HDC)wParam, 0x00C0C000);
+                SetTextColor((HDC)wParam, 0x00FF0000);
+                return(hGREENBrush);
+				case CTLCOLOR_STATIC:
+		          SetBkColor((HDC)wParam, 0x00C0C0C0);
+                SetTextColor((HDC)wParam, 0x0000FFFF);
+                return(hREDBrush);
+				}
+        return((HBRUSH)NULL);
+
+    case WM_LBUTTONDOWN:
+        break;
+
+    case WM_LBUTTONUP:
+        break;
+
+    case WM_RBUTTONDOWN:
+        break;
+
+    case WM_RBUTTONUP:
+        break;
+
+    case WM_MOUSEMOVE:
+        break;
+
+    case WM_VSCROLL:
+		  sprintf(C, "WM_VSCROLL %X %lX !!!", wParam, lParam);
+		  TextOut(hDCMain, 25, 380, C, strlen(C));
+		  Do_Dlg_VertScroll(hWnd, wParam, lParam, &y, 0, 50);
+        break;
+
+    case WM_HSCROLL:
+		  sprintf(C, "WM_HSCROLL %X %lX !!!", wParam, lParam);
+		  TextOut(hDCMain, 25, 380, C, strlen(C));
+		  Do_Dlg_HorzScroll(hWnd, wParam, lParam, &x, 0, 50);
+        break;
+
+    case WM_DRAWITEM:
+		  sprintf(C, "WM_DRAWITEM %X %lX !!!", wParam, lParam);
+		  TextOut(hDCMain, 25, 380, C, strlen(C));
+		  if (lParam == 0L) break;
+		  if (wParam == 0) break;
+		  dis = (LPDRAWITEMSTRUCT)lParam;
+		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1062)) {
+				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
+				SelectObject(dis->hDC, hBrush);
+				FillRect(dis->hDC, &dis->rcItem, hBrush);
+				sprintf(C, "Item #%X", dis->itemID);
+			   if (dis->itemData == NULL) break;
+				TextOut(dis->hDC, dis->rcItem.left,
+					dis->rcItem.top, C, strlen(C));
+				}
+		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1063)) {
+				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
+				SelectObject(dis->hDC, hBrush);
+				FillRect(dis->hDC, &dis->rcItem, hBrush);
+			   if (dis->itemData == NULL) break;
+				TextOut(dis->hDC, dis->rcItem.left,	dis->rcItem.top,
+					(LPSTR)dis->itemData, lstrlen((LPSTR)dis->itemData));
+				}
+		  if ((dis->CtlType == ODT_LISTBOX) && (dis->CtlID == 1064)) {
+				hBrush = SelectObject(dis->hDC, GetStockObject(LTGRAY_BRUSH));
+				SelectObject(dis->hDC, hBrush);
+				FillRect(dis->hDC, &dis->rcItem, hBrush);
+				hMemDC = CreateCompatibleDC(dis->hDC);
+				SelectObject(hMemDC,hBitMap);
+				BitBlt(dis->hDC, dis->rcItem.left,	dis->rcItem.top,
+						BitMap.bmWidth, BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
+				DeleteDC(hMemDC);
+				sprintf(C, "Item #%X", dis->itemID);
+				TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,
+					dis->rcItem.top, C, strlen(C));
+//			   if (dis->itemData == NULL) break;
+//				TextOut(dis->hDC, dis->rcItem.left + BitMap.bmWidth,
+//						dis->rcItem.top, (LPSTR)dis->itemData,
+//						lstrlen((LPSTR)dis->itemData));
+				}
+        break;
+
+    case WM_PAINT:
+        DoPaint(hWnd);
+        break;
+
+    case WM_DESTROY:
+        PostQuitMessage(0);
+        break;
+
+    default:
+        return DefWindowProc(hWnd, Message, wParam, lParam);
+    }
+return(0);
+}
+
+
+
+BOOL KeyDown(HWND hWnd, unsigned Message, WORD wParam)
+{
+WORD			wRet;
+UINT			uRet;
+DWORD			dwRet;
+HDC      hMemDC;
+char			C[128];
+char			C2[64];
+NoREF(hWnd);
+NoREF(Message);
+sprintf(C, "KeyDown %x !!!", wParam);
+TextOut(hDCMain, 25, 100, C, strlen(C));
+switch (wParam)
+    {
+    case VK_HOME:            /* 'HOME' KEY         */
+        break;
+    case VK_LEFT:            /* 'LEFT' CURSOR KEY  */
+        break;
+    case VK_RIGHT:           /* 'RIGHT' CURSOR KEY */
+        break;
+    case VK_UP:              /* 'UP' CURSOR KEY    */
+        break;
+    case VK_DOWN:            /* 'DOWN' CURSOR KEY  */
+        break;
+    case VK_PRIOR:           /* 'PGUP' CURSOR KEY  */
+        break;
+    case VK_NEXT:            /* 'PGDN' CURSOR KEY  */
+        break;
+    case '1':
+        break;
+    case '2':
+		  hWndStat = CreateWindow("STATIC", "Static #2",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_CENTER, 
+            			30, 150, 150, 20, hWndMain, 1012, hInst, NULL);
+		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Center Text");
+        break;
+    case '3':
+		  hWndStat = CreateWindow("STATIC", "Static #3",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 
+            			30, 180, 150, 20, hWndMain, 1013, hInst, NULL);
+		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"Static Right Text");
+        break;
+    case '4':
+		  hWndStat = CreateWindow("STATIC", "Static #4",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_SIMPLE, 
+            			30, 210, 150, 20, hWndMain, 1014, hInst, NULL);
+		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_SIMPLE");
+        break;
+    case '5':
+		  hWndStat = CreateWindow("STATIC", "Static #5",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_GRAYRECT, 
+            			30, 240, 150, 20, hWndMain, 1015, hInst, NULL);
+		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_GRAYRECT");
+        break;
+    case 'A':
+		  hWndStat = CreateWindow("STATIC", "Static #6",
+            			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_BLACKRECT, 
+            			30, 240, 150, 20, hWndMain, 1016, hInst, NULL);
+		  SendMessage(hWndStat, WM_SETTEXT, 0, (LPARAM)"SS_BLACKRECT");
+        break;
+    case 'C':
+		  if (hBitMap2 == NULL) {
+		  		hBitMap2 = LoadBitmap(hInst, "LBICON");
+		  		GetObject(hBitMap2, sizeof(BITMAP), (LPSTR)&BitMap);
+				}
+		  hMemDC = CreateCompatibleDC(hDCMain);
+		  SelectObject(hMemDC, hBitMap2);
+		  BitBlt(hDCMain, 10, 10, BitMap.bmWidth,
+						BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		  DeleteDC(hMemDC);
+		  sprintf(C, "DrawBitmap");
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'D':
+		  if (hBitMap3 == NULL) {
+		  		hBitMap3 = LoadBitmap(hInst, MAKEINTRESOURCE(3333));
+		  		GetObject(hBitMap3, sizeof(BITMAP), (LPSTR)&BitMap);
+				}
+		  hMemDC = CreateCompatibleDC(hDCMain);
+		  SelectObject(hMemDC, hBitMap3);
+		  BitBlt(hDCMain, 80, 10, BitMap.bmWidth,
+						BitMap.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		  DeleteDC(hMemDC);
+		  sprintf(C, "DrawBitmap");
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'F':
+		  MoveWindow(hWnd, 10, 10, 500, 600, TRUE);
+        break;
+    case 'G':
+		  MoveWindow(hWndBut, 20, 20, 100, 20, TRUE);
+        break;
+    case 'H':
+		  WinHelp(hWndMain, "toto.hlp", HELP_INDEX, 0L);
+        break;
+    case 'J':
+		  WinExec("/D:/wine/widget.exe arg1 arg2 arg3 arg4 arg5 arg6", SW_NORMAL);
+        break;
+    case 'K':
+        break;
+    case 'Q':
+		  hWndChk = CreateWindow("BUTTON", "CheckBox #1",
+                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_CHECKBOX,
+						  30, 300, 120, 20, hWndMain, 1020, hInst, NULL);
+        break;
+    case 'W':
+		  wRet = SendMessage(hWndChk , BM_GETCHECK, 0, 0L);
+		  SendMessage(hWndChk , BM_SETCHECK, wRet, 0L);
+        break;
+    case 'E':
+        break;
+    case 'R':
+		  hWndRadio = CreateWindow("BUTTON", "RadioBut #1",
+                    WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_RADIOBUTTON,
+						  230, 120, 120, 20, hWndMain, 1003, hInst, NULL);
+		  SendMessage(hWndRadio, BM_SETCHECK, TRUE, 0L);
+        break;
+    case 'T':
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox Single item");
+        break;
+    case 'Y':
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #2");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #3");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #4");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #5");
+		  SendMessage(hWndLBox, LB_ADDSTRING, 0, (LPARAM)"ListBox item #6");
+		  SendMessage(hWndLBox, LB_SETCURSEL, 3, 0L);
+		  SendMessage(hWndLBox, LB_INSERTSTRING, 5, (LPARAM)"Item between 5 & 6");
+		  wRet = SendMessage(hWndLBox, LB_FINDSTRING, -1, (LPARAM)"Item between 5 & 6");
+		  sprintf(C, "LB_FINDSTRING returned #%u   ", wRet);
+		  TextOut(hDCMain, 25, 300, C, strlen(C));
+		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
+		  sprintf(C, "LB_GETCURSEL returned #%u   ", wRet);
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'U':
+		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
+		  SendMessage(hWndLBox, LB_DELETESTRING, wRet, 0L);
+		  SendMessage(hWndLBox, LB_SETCURSEL, wRet, 0L);
+        break;
+    case 'I':
+		  SendMessage(hWndLBox, LB_RESETCONTENT, 0, 0L);
+        break;
+    case 'O':
+		  C2[0] = '\0';
+		  wRet = SendMessage(hWndLBox, LB_GETCURSEL, 0, 0L);
+		  SendMessage(hWndLBox, LB_GETTEXT, wRet, (DWORD)C2);
+		  sprintf(C, "LB_GETTEXT #%d returned '%s'   ", wRet, C2);
+		  TextOut(hDCMain, 25, 320, C, strlen(C));
+        break;
+    case 'P':
+		  SendMessage(hWndLBox, LB_DIR, 0, (DWORD)"*.*");
+        break;
+    case 'Z':
+		  ShowWindow(hWndScrol, SW_HIDE);
+        break;
+    case 'X':
+		  ShowWindow(hWndScrol, SW_SHOW);
+        break;
+     case 'V':
+		  MoveWindow(hWndScrol, 120, 150, 15, 60, TRUE);
+        break;
+     case 'B':
+		  hWndCBox = CreateWindow("COMBOBOX", "Combo #2",
+					WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | CBS_DROPDOWN,
+					30, 270, 150, 100, hWndMain, 1061, hInst, NULL);
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #1");
+		  SendMessage(hWndCBox, CB_ADDSTRING, 0, (LPARAM)"ComboBox item #2");
+		  SendMessage(hWndCBox, CB_DIR, 0, (DWORD)"*.*");
+        break;
+     case 'N':
+		  hWndLBox2 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
+					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,
+//					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
+					30, 300, 150, 60, hWndMain, 1062, hInst, NULL);
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #1");
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #2");
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #3");
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #4");
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #5");
+		  SendMessage(hWndLBox2, LB_ADDSTRING, 0, (LPARAM)"DRAWFIXED #6");
+        break;
+     case 'M':
+		  hWndLBox3 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
+					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_NOTIFY,
+//					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
+					230, 300, 150, 60, hWndMain, 1063, hInst, NULL);
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");
+		  SendMessage(hWndLBox3, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #7");
+		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 1, 10L);
+		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 2, 20L);
+		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 3, 30L);
+		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 4, 40L);
+		  SendMessage(hWndLBox3, LB_SETITEMHEIGHT, 5, 50L);
+        break;
+     case 'L':
+		  hBitMap = LoadBitmap(hInst, MAKEINTRESOURCE(3333));
+		  GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&BitMap);
+		  hWndLBox4 = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE |
+					WS_BORDER | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOTIFY,
+					230, 380, 150, 60, hWndMain, 1064, hInst, NULL);
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #1");
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #2");
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #3");
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #4");
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #5");
+		  SendMessage(hWndLBox4, LB_ADDSTRING, 0, (LPARAM)"DRAWVARIABLE #6");
+		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 1, 10L);
+		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 2, 20L);
+		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 3, 30L);
+		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 4, 40L);
+		  SendMessage(hWndLBox4, LB_SETITEMHEIGHT, 5, 50L);
+        break;
+
+    case VK_F10:             /* 'F10' FUNCTION KEY */
+        break;
+    case VK_F11:             /* 'F11' FUNCTION KEY */
+        break;
+    }
+return(TRUE);
+}
+
+
+
+void DoPaint(HWND hWnd)
+{
+HDC         hDC;
+RECT        rect;
+PAINTSTRUCT ps;
+char   C[80];
+GetClientRect(hWnd, &rect);
+hDC = BeginPaint(hWnd, &ps);
+FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
+InflateRect(&rect, -3, -3);
+FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+InflateRect(&rect, -10, -10);
+FillRect(hDC, &rect, GetStockObject(WHITE_BRUSH));
+sprintf(C, "Wine Testing !!!");
+TextOut(hDC, 25, 25, C, strlen(C));
+ReleaseDC(hWnd,hDC);
+EndPaint(hWnd,&ps);
+}
+
+
+HBRUSH CreateLTGRAYBrush()
+{
+return(CreateSOLIDBrush(0x00C0C0C0));
+}
+
+
+
+HBRUSH CreateSOLIDBrush(COLORREF Color)
+{
+LOGBRUSH logGRAYBrush;
+logGRAYBrush.lbStyle = BS_SOLID;
+logGRAYBrush.lbColor = Color;
+logGRAYBrush.lbHatch = NULL;
+return(CreateBrushIndirect(&logGRAYBrush));
+}
+
+
+
+/**********************************************************************/
+
+
+void SetVertScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
+{
+char  C[12];
+SetScrollRange(hWndSCROLL, SB_CTL, -MAX, -MIN, FALSE);
+SetScrollPos(hWndSCROLL, SB_CTL, -VAL, TRUE);
+itoa(VAL, C, 10);
+//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
+}
+
+
+
+void SetHorzScroll(int hDlg, int hWndSCROLL, int VAL, int MIN, int MAX)
+{
+char  C[12];
+SetScrollRange(hWndSCROLL, SB_CTL, MAX, MIN, FALSE);
+SetScrollPos(hWndSCROLL, SB_CTL, VAL, TRUE);
+itoa(VAL, C, 10);
+//SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(hWndSCROLL) - IDDSCROLL1), C);
+}
+
+
+
+void Do_Dlg_VertScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
+{
+char  C[12];
+int   VAL;
+int   VAL2;
+int	Step = 100;
+if (MAX < 1000)	Step = 10;
+if (MAX < 100)		Step = MAX / 10;
+VAL = *(V);
+VAL2 = VAL;
+switch (wParam)
+    {
+    case SB_LINEUP:
+			VAL++;
+			break;
+    case SB_LINEDOWN:
+			VAL--;
+			break;
+    case SB_PAGEUP:
+			VAL += Step;
+			break;
+    case SB_PAGEDOWN:
+			VAL -= Step;
+			break;
+    case SB_THUMBTRACK:
+    case SB_THUMBPOSITION:
+		   VAL = -(LOWORD(lParam));
+			break;
+	}
+if (VAL > MAX)		VAL = MAX;
+if (VAL < MIN)		VAL = MIN;
+if (VAL != VAL2)
+    {
+    SetScrollPos(HIWORD(lParam), SB_CTL, -VAL, TRUE);
+    ltoa(VAL, C, 10);
+//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
+    }
+*(V) = VAL;
+}
+
+
+void Do_Dlg_HorzScroll(HWND hDlg, WORD wParam, DWORD lParam, int *V, int MIN, int MAX)
+{
+char  C[12];
+int   VAL;
+int   VAL2;
+int	Step = 100;
+if (MAX < 1000)	Step = 10;
+if (MAX < 100)		Step = MAX / 10;
+VAL = *(V);
+VAL2 = VAL;
+switch (wParam)
+    {
+    case SB_LINEUP:
+			VAL--;
+			break;
+    case SB_LINEDOWN:
+			VAL++;
+			break;
+    case SB_PAGEUP:
+			VAL -= Step;
+			break;
+    case SB_PAGEDOWN:
+			VAL += Step;
+			break;
+    case SB_THUMBTRACK:
+    case SB_THUMBPOSITION:
+		   VAL = (LOWORD(lParam));
+			break;
+	}
+if (VAL > MAX)		VAL = MAX;
+if (VAL < MIN)		VAL = MIN;
+if (VAL != VAL2)
+    {
+    SetScrollPos(HIWORD(lParam), SB_CTL, VAL, TRUE);
+    ltoa(VAL, C, 10);
+//    SetDlgItemText(hDlg, (IDDTXT1 + GetDlgCtrlID(HIWORD(lParam)) - IDDSCROLL1), C);
+    }
+*(V) = VAL;
+}
+
+
+/**********************************************************************/
+
+
+
\ No newline at end of file
diff --git a/test/martin_ship4/widget.exe b/test/martin_ship4/widget.exe
new file mode 100755
index 0000000000000000000000000000000000000000..91ecd00fa480713f3ea712fee33d1bed2393cbda
Binary files /dev/null and b/test/martin_ship4/widget.exe differ
diff --git a/test/widget.exe b/test/widget.exe
new file mode 100755
index 0000000000000000000000000000000000000000..89837d5a41d966569a906f6a242b83b5d9009eaf
Binary files /dev/null and b/test/widget.exe differ
diff --git a/tools/Makefile b/tools/Makefile
index 8e5766f931a29362c4b842a1a5c4e1193fe9ef51..f74628e79708e92edbaa32fd99b810f22a9b273d 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -4,7 +4,7 @@ build: build.c
 	cc $(CFLAGS) -o build build.c
 
 clean:
-	rm -f *.o *~ build
+	rm -f *.o *~ build *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/tools/build.c b/tools/build.c
index d13c71750d9fbe7234b1107c47413b1bb78ffaad..d596493847d2c39bc5d42e6eadfa80e8a986afbd 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -667,6 +667,35 @@ main(int argc, char **argv)
 		fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i);
 		fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n");
 		fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n");
+		fprintf(fp, "\tpushl\t$0\n");			/* cr2     */
+		fprintf(fp, "\tpushl\t$0\n");			/* oldmask */
+		fprintf(fp, "\tpushl\t$0\n");			/* i387    */
+		fprintf(fp, "\tpushw\t$0\n");			/* __ssh   */
+		fprintf(fp, "\tpushw\t%%ss\n");			/* ss      */
+		fprintf(fp, "\tpushl\t%%esp\n");		/* esp     */
+		fprintf(fp, "\tpushfl\n");			/* eflags  */
+		fprintf(fp, "\tpushw\t$0\n");			/* __csh   */
+		fprintf(fp, "\tpushw\t%%cs\n");			/* cs      */
+		fprintf(fp, "\tpushl\t$0\n");			/* eip     */
+		fprintf(fp, "\tpushl\t$0\n");			/* err     */
+		fprintf(fp, "\tpushl\t$0\n");			/* trapno  */
+		fprintf(fp, "\tpushal\n");			/* AX, ... */
+		fprintf(fp, "\tpushw\t$0\n");			/* __dsh   */
+		fprintf(fp, "\tpushw\t%%ds\n");			/* ds      */
+		fprintf(fp, "\tpushw\t$0\n");			/* __esh   */
+		fprintf(fp, "\tpushw\t%%es\n");			/* es      */
+		fprintf(fp, "\tpushw\t$0\n");			/* __fsh   */
+		fprintf(fp, "\tpushw\t%%fs\n");			/* fs      */
+		fprintf(fp, "\tpushw\t$0\n");			/* __gsh   */
+		fprintf(fp, "\tpushw\t%%gs\n");			/* gs      */
+		fprintf(fp, "\tmovl\t%%ebp,%%eax\n");
+		fprintf(fp, "\tmovw\t%%esp,%%ebp\n");
+		fprintf(fp, "\tpushl\t88(%%ebp)\n");
+		fprintf(fp, "\tmovl\t%%eax,%%ebp\n");
+		fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
+		fprintf(fp, "\tpushw\t$92\n");
+		fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+#if 0
 		fprintf(fp, "\tpushw\t%%ax\n");
 		fprintf(fp, "\tpushw\t%%cx\n");
 		fprintf(fp, "\tpushw\t%%dx\n");
@@ -684,6 +713,7 @@ main(int argc, char **argv)
 		fprintf(fp, "\tmovl\t$%d,%%eax\n", i);
 		fprintf(fp, "\tpushw\t$24\n");
 		fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName);
+#endif
 		break;
 
 	      case FUNCTYPE_PASCAL:
diff --git a/windows/Makefile b/windows/Makefile
index f7de172440ef0981f7ab306d785e58cd63dad820..812bd3437309d4e225c972a024f555ec5552f8c3 100644
--- a/windows/Makefile
+++ b/windows/Makefile
@@ -1,7 +1,8 @@
 CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
 
 OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
-    	clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o
+    	clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
+	defwnd.o defdlg.o dialog.o focus.o
 
 default: windows.o
 
@@ -9,7 +10,7 @@ windows.o: $(OBJS)
 	$(LD) -r -o windows.o $(OBJS)
 
 clean:
-	rm -f *.o *~ *.s dll_* *.a
+	rm -f *.o *~ *.s dll_* *.a *#
 
 depend:
 	$(CC) $(CFLAGS) -M *.c > .depend
diff --git a/windows/defdlg.c b/windows/defdlg.c
new file mode 100644
index 0000000000000000000000000000000000000000..8405dc38aafadd0219bf8688ae9fd7b920cacf0c
--- /dev/null
+++ b/windows/defdlg.c
@@ -0,0 +1,76 @@
+/*
+ * Default dialog procedure
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
+
+#include "windows.h"
+#include "dialog.h"
+#include "win.h"
+
+
+/***********************************************************************
+ *           DefDlgProc   (USER.308)
+ */
+LONG DefDlgProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+{
+    DIALOGINFO * dlgInfo;
+    BOOL result = FALSE;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    
+    if (!wndPtr) return 0;
+    dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
+
+#ifdef DEBUG_DIALOG
+    printf( "DefDlgProc: %d %04x %d %08x\n", hwnd, msg, wParam, lParam );
+#endif
+
+    dlgInfo->msgResult = 0;
+    if (dlgInfo->dlgProc)
+    {
+	  /* Call dialog procedure */
+	result = (BOOL)CallWindowProc( dlgInfo->dlgProc, hwnd, 
+				       msg, wParam, lParam );
+
+	  /* Check if window destroyed by dialog procedure */
+	wndPtr = WIN_FindWndPtr( hwnd );
+	if (!wndPtr) return result;
+    }
+    
+    if (!result) switch(msg)
+    {
+	case WM_INITDIALOG:
+	    break;
+
+        case WM_ERASEBKGND:
+	    FillWindow( hwnd, hwnd, (HDC)wParam, (HBRUSH)CTLCOLOR_DLG );
+	    return TRUE;
+
+	case WM_NCDESTROY:
+
+	      /* Delete font */
+	    if (dlgInfo->hUserFont)
+	    {
+		DeleteObject( dlgInfo->hUserFont );
+		dlgInfo->hUserFont = 0;
+	    }
+
+	      /* Delete menu */
+	    if (dlgInfo->hMenu)
+	    {		
+		DestroyMenu( dlgInfo->hMenu );
+		dlgInfo->hMenu = 0;
+	    }
+
+	      /* Window clean-up */
+	    DefWindowProc( hwnd, msg, wParam, lParam );
+	    break;
+	    
+	default:
+	    return DefWindowProc( hwnd, msg, wParam, lParam );
+    }
+        
+    return result;
+}
diff --git a/windows/defwnd.c b/windows/defwnd.c
new file mode 100644
index 0000000000000000000000000000000000000000..3d3a280cdf51a1fddb5fdb0d78963d66daeeb132
--- /dev/null
+++ b/windows/defwnd.c
@@ -0,0 +1,151 @@
+/*
+ * Default window procedure
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include "windows.h"
+#include "win.h"
+#include "class.h"
+#include "user.h"
+
+
+/***********************************************************************
+ *           DefWindowProc   (USER.107)
+ */
+LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+{
+    WND * wndPtr;
+    CLASS * classPtr;
+    LPSTR textPtr;
+    int len;
+    
+#ifdef DEBUG_MESSAGE
+    printf( "DefWindowProc: %d %d %d %08x\n", hwnd, msg, wParam, lParam );
+#endif
+
+    switch(msg)
+    {
+    case WM_NCCREATE:
+	{
+	    CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
+	    wndPtr = WIN_FindWndPtr(hwnd);
+	    if (createStruct->lpszName)
+	    {
+		  /* Allocate space for window text */
+		wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE, 
+					strlen(createStruct->lpszName) + 1);
+		textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+		strcpy(textPtr, createStruct->lpszName);
+	    }
+	    return 1;
+	}
+	
+    case WM_CREATE:
+	return 0;
+
+    case WM_NCDESTROY:
+	{
+	    wndPtr = WIN_FindWndPtr(hwnd);
+	    if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
+	    wndPtr->hText = 0;
+	    return 0;
+	}
+	
+    case WM_PAINT:
+	{
+	    PAINTSTRUCT paintstruct;
+	    BeginPaint( hwnd, &paintstruct );
+	    EndPaint( hwnd, &paintstruct );
+	    return 0;
+	}
+
+    case WM_CLOSE:
+	DestroyWindow( hwnd );
+	return 0;
+
+    case WM_ERASEBKGND:
+    case WM_ICONERASEBKGND:
+	{
+	    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 1;
+	    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
+	    if (!classPtr->wc.hbrBackground) return 1;
+	    FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
+		        classPtr->wc.hbrBackground );
+	    return 0;
+	}
+
+    case WM_GETDLGCODE:
+	return 0;
+
+    case WM_CTLCOLOR:
+	{
+	    if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
+	    {
+		SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
+		SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
+/*	        hbr = sysClrObjects.hbrScrollbar;
+		UnrealizeObject(hbr); */
+		return GetStockObject(LTGRAY_BRUSH);
+	    }
+	    else
+	    {
+		SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
+		SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
+/*	        hbr = sysClrObjects.hbrWindow; */
+		return GetStockObject(WHITE_BRUSH);
+	    }
+	}
+	
+    case WM_GETTEXT:
+	{
+	    if (wParam)
+	    {
+		wndPtr = WIN_FindWndPtr(hwnd);
+		if (wndPtr->hText)
+		{
+		    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+		    if ((int)wParam > (len = strlen(textPtr)))
+		    {
+			strcpy((char *)lParam, textPtr);
+			return (DWORD)len;
+		    }
+		}
+	        lParam = (DWORD)NULL;
+	    }
+	    return (0L);
+	}
+
+    case WM_GETTEXTLENGTH:
+	{
+	    wndPtr = WIN_FindWndPtr(hwnd);
+	    if (wndPtr->hText)
+	    {
+		textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+		return (DWORD)strlen(textPtr);
+	    }
+	    return (0L);
+	}
+
+    case WM_SETTEXT:
+	{
+	    wndPtr = WIN_FindWndPtr(hwnd);
+	    if (wndPtr->hText)
+		USER_HEAP_FREE(wndPtr->hText);
+
+	    wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE, 
+					    strlen((LPSTR)lParam) + 1);
+	    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
+	    strcpy(textPtr, (LPSTR)lParam);
+	    if (wndPtr->shellWidget)
+		XtVaSetValues( wndPtr->shellWidget, XtNtitle, textPtr, NULL );
+	    return (0L);
+	}
+    }
+    return 0;
+}
diff --git a/windows/dialog.c b/windows/dialog.c
new file mode 100644
index 0000000000000000000000000000000000000000..e60b62d84c085a31efeb256fe94396d93894d716
--- /dev/null
+++ b/windows/dialog.c
@@ -0,0 +1,639 @@
+/*
+ * Dialog functions
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
+
+#include <stdlib.h>
+
+#include "windows.h"
+#include "dialog.h"
+#include "win.h"
+
+
+  /* Dialog base units */
+static WORD xBaseUnit = 0, yBaseUnit = 0;
+
+
+/***********************************************************************
+ *           DIALOG_Init
+ *
+ * Initialisation of the dialog manager.
+ */
+BOOL DIALOG_Init()
+{
+    TEXTMETRIC tm;
+    HDC hdc;
+    
+      /* Calculate the dialog base units */
+
+    if (!(hdc = GetDC( 0 ))) return FALSE;
+    GetTextMetrics( hdc, &tm );
+    ReleaseDC( 0, hdc );
+    xBaseUnit = tm.tmAveCharWidth;
+    yBaseUnit = tm.tmHeight;
+#ifdef DEBUG_DIALOG
+    printf( "DIALOG_Init: base units = %d,%d\n", xBaseUnit, yBaseUnit );
+#endif    
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           DIALOG_GetControl
+ *
+ * Return the class and text of the control pointed to by ptr,
+ * and return a pointer to the next control.
+ */
+static DLGCONTROLHEADER * DIALOG_GetControl( DLGCONTROLHEADER * ptr,
+					     char ** class, char ** text )
+{
+    unsigned char * p = (unsigned char *)ptr;
+    p += 14;  /* size of control header */
+    if (*p & 0x80)
+    {
+	switch(*p++)
+	{
+	case 0x80: *class = "BUTTON"; break;
+	case 0x81: *class = "EDIT"; break;
+	case 0x82: *class = "STATIC"; break;
+	case 0x83: *class = "LISTBOX"; break;
+	case 0x84: *class = "SCROLLBAR"; break;
+	case 0x85: *class = "COMBOBOX"; break;
+	default:   *class = ""; break;
+	}
+    }
+    else 
+    {
+	*class = p;
+	p += strlen(p) + 1;
+    }
+    *text = p;
+    p += strlen(p) + 2;
+    return (DLGCONTROLHEADER *)p;
+}
+
+
+/***********************************************************************
+ *           DIALOG_ParseTemplate
+ *
+ * Fill a DLGTEMPLATE structure from the dialog template.
+ */
+static void DIALOG_ParseTemplate( LPCSTR template, DLGTEMPLATE * result )
+{
+    int i;
+    unsigned char * p = (unsigned char *)template;
+ 
+    result->header = (DLGTEMPLATEHEADER *)p;
+    p += 13;
+    result->menuName = p;
+    if (*p == 0xff) p += 3;
+    else p += strlen(p) + 1;
+
+    if (*p) result->className = p;
+    else result->className = DIALOG_CLASS_NAME;
+    p += strlen(p) + 1;
+
+    result->caption = p;
+    p += strlen(p) + 1;
+
+    if (result->header->style & DS_SETFONT)
+    {
+	result->pointSize = *(WORD *)p;	p += sizeof(WORD);
+	result->faceName = p;           p += strlen(p) + 1;
+    }
+    result->controls = NULL;
+    if (!result->header->nbItems) return;
+    result->controls = (DLGCONTROL *) malloc( result->header->nbItems * sizeof(DLGCONTROL) );
+    if (!result->controls) return;
+
+    for (i = 0; i < result->header->nbItems; i++)
+    {
+	result->controls[i].header = (DLGCONTROLHEADER *)p;
+	p = (char *)DIALOG_GetControl( result->controls[i].header,
+				      &result->controls[i].class,
+				      &result->controls[i].text );	
+    }
+}
+
+
+/***********************************************************************
+ *           DIALOG_DisplayTemplate
+ */
+#ifdef DEBUG_DIALOG
+static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
+{
+    int i;
+    DLGCONTROL * ctrl = result->controls;
+    
+    printf( "DIALOG %d, %d, %d, %d\n", result->header->x, result->header->y,
+	    result->header->cx, result->header->cy );
+    printf( " STYLE %08x\n", result->header->style );
+    printf( " CAPTION '%s'\n", result->caption );
+    printf( " CLASS '%s'\n", result->className );
+    if (result->menuName[0] == 0xff)
+	printf( " MENU %d\n", result->menuName[1] + 256*result->menuName[2] );
+    else printf( " MENU '%s'\n", result->menuName );
+    if (result->header->style & DS_SETFONT)
+	printf( " FONT %d,'%s'\n", result->pointSize, result->faceName );
+
+    printf( " BEGIN\n" );
+
+    for (i = 0; i < result->header->nbItems; i++, ctrl++)
+    {
+	printf( "   %s '%s' %d, %d, %d, %d, %d, %08x\n",
+	        ctrl->class, ctrl->text, ctrl->header->id,
+	        ctrl->header->x, ctrl->header->y, ctrl->header->cx,
+	        ctrl->header->cy, ctrl->header->style );
+    }
+    
+    printf( " END\n" );
+}
+#endif  /* DEBUG_DIALOG */
+
+
+/***********************************************************************
+ *           CreateDialog   (USER.89)
+ */
+HWND CreateDialog( HINSTANCE hInst, LPCSTR dlgTemplate,
+		   HWND owner, FARPROC dlgProc )
+{
+    return CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
+
+
+/***********************************************************************
+ *           CreateDialogParam   (USER.241)
+ */
+HWND CreateDialogParam( HINSTANCE hInst, LPCSTR dlgTemplate,
+		        HWND owner, FARPROC dlgProc, LPARAM param )
+{
+    HWND hwnd = 0;
+    HANDLE hres, hmem;
+    LPCSTR data;
+    int size;
+
+#ifdef DEBUG_DIALOG
+    printf( "CreateDialogParam: %d,'%s',%d,%p,%d\n",
+	    hInst, dlgTemplate, owner, dlgProc, param );
+#endif
+    
+#if 0
+    if (!(hres = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
+    if (!(hmem = LoadResource( hInst, hres ))) return 0;
+    if (!(data = LockResource( hmem ))) hwnd = 0;
+    else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
+    FreeResource( hmem );
+#else
+    hmem = RSC_LoadResource( hInst, dlgTemplate, 0x8005, &size );
+    data = (LPCSTR) GlobalLock( hmem );
+    hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param );
+    GlobalFree( hmem );
+#endif
+    return hwnd;
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirect   (USER.219)
+ */
+HWND CreateDialogIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
+			   HWND owner, FARPROC dlgProc )
+{
+    return CreateDialogIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirectParam   (USER.242)
+ */
+HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
+			        HWND owner, FARPROC dlgProc, LPARAM param )
+{
+    HMENU hMenu = 0;
+    HFONT hFont = 0;
+    HWND hwnd;
+    WND * wndPtr;
+    DLGTEMPLATE template;
+    DIALOGINFO * dlgInfo;
+    WORD xUnit = xBaseUnit;
+    WORD yUnit = yBaseUnit;
+    
+    if (!dlgTemplate) return 0;
+    DIALOG_ParseTemplate( dlgTemplate, &template );
+
+#ifdef DEBUG_DIALOG
+    DIALOG_DisplayTemplate( &template );
+#endif    
+
+      /* Load menu */
+
+    if (template.menuName[0])
+    {
+	if (template.menuName[0] != 0xff) 
+	    hMenu = LoadMenu( hInst, template.menuName );
+	else
+	    hMenu = LoadMenu( hInst, MAKEINTRESOURCE( template.menuName[1] +
+						   256*template.menuName[2] ));
+    }
+
+      /* Create custom font if needed */
+
+    if (template.header->style & DS_SETFONT)
+    {
+	hFont = CreateFont( template.pointSize, 0, 0, 0, FW_DONTCARE,
+			    FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
+			    DEFAULT_QUALITY, FF_DONTCARE, template.faceName );
+	if (hFont)
+	{
+	    TEXTMETRIC tm;
+	    HFONT oldFont;
+	    HDC hdc;
+
+	    hdc = GetDC( 0 );
+	    oldFont = SelectObject( hdc, hFont );
+	    GetTextMetrics( hdc, &tm );
+	    SelectObject( hdc, oldFont );
+	    ReleaseDC( 0, hdc );
+	    xUnit = tm.tmAveCharWidth;
+	    yUnit = tm.tmHeight;
+	}
+    }
+
+      /* Create dialog main window */
+
+    hwnd = CreateWindow( template.className, template.caption,
+			 template.header->style & ~WS_VISIBLE,
+			 template.header->x * xUnit / 4,
+			 template.header->y * yUnit / 8,
+			 template.header->cx * xUnit / 4,
+			 template.header->cy * yUnit / 8,
+			 owner, hMenu, hInst,
+			 NULL );
+    if (!hwnd)
+    {
+	if (hFont) DeleteObject( hFont );
+	if (hMenu) DestroyMenu( hMenu );
+	if (template.controls) free( template.controls );
+	return 0;
+    }
+
+      /* Create control windows */
+
+    if (hwnd && template.header->nbItems)
+    {
+	int i;
+	DLGCONTROL * ctrl = template.controls;
+	for (i = 0; i < template.header->nbItems; i++, ctrl++)
+	{
+	    CreateWindowEx( WS_EX_NOPARENTNOTIFY, 
+			    ctrl->class, ctrl->text, ctrl->header->style,
+			    ctrl->header->x * xUnit / 4,
+			    ctrl->header->y * yUnit / 8,
+			    ctrl->header->cx * xUnit / 4,
+			    ctrl->header->cy * yUnit / 8,
+			    hwnd, ctrl->header->id, hInst, NULL );
+	}
+    }
+    
+      /* Initialise dialog extra data */
+
+    wndPtr = WIN_FindWndPtr( hwnd );
+    dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
+    dlgInfo->dlgProc   = dlgProc;
+    dlgInfo->hUserFont = hFont;
+    dlgInfo->hMenu     = hMenu;
+    dlgInfo->xBaseUnit = xUnit;
+    dlgInfo->yBaseUnit = yUnit;
+    dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd,
+			    GetWindow(wndPtr->hwndChild, GW_HWNDLAST), FALSE );
+
+      /* Send initialisation messages and set focus */
+
+    if (dlgInfo->hUserFont) 
+	SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0);
+    SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param );
+    if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
+	SetFocus( dlgInfo->hwndFocus );
+
+      /* Display dialog */
+
+    if (template.header->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
+    
+    if (template.controls) free( template.controls );
+    return hwnd;
+}
+
+
+/***********************************************************************
+ *           DialogBox   (USER.87)
+ */
+int DialogBox( HINSTANCE hInst, LPCSTR dlgTemplate,
+	       HWND owner, FARPROC dlgProc )
+{
+    HWND hwnd;
+    WND * wndPtr;
+    DIALOGINFO * dlgInfo;
+    MSG msg;
+    int retval;
+
+#ifdef DEBUG_DIALOG
+    printf( "DialogBox: %d,'%s',%d,%p\n", hInst, dlgTemplate, owner, dlgProc );
+#endif
+
+    hwnd = CreateDialog( hInst, dlgTemplate, owner, dlgProc );
+    if (!hwnd) return -1;
+    wndPtr = WIN_FindWndPtr( hwnd );
+    dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
+    while (GetMessage (&msg, 0, 0, 0))
+    {
+	if (!IsDialogMessage( hwnd, &msg))
+	{
+	    TranslateMessage(&msg);
+	    DispatchMessage(&msg);
+	}
+	if (dlgInfo->fEnd) break;
+    }
+    retval = dlgInfo->msgResult;
+    DestroyWindow( hwnd );
+    return retval;
+}
+
+
+/***********************************************************************
+ *           EndDialog   (USER.88)
+ */
+void EndDialog( HWND hwnd, short retval )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
+    dlgInfo->msgResult = retval;
+    dlgInfo->fEnd = TRUE;
+#ifdef DEBUG_DIALOG
+    printf( "EndDialog: %d %d\n", hwnd, retval );
+#endif    
+}
+
+
+/***********************************************************************
+ *           IsDialogMessage   (USER.90)
+ */
+BOOL IsDialogMessage( HWND hwndDlg, LPMSG msg )
+{
+    WND * wndPtr;
+    
+    if (!(wndPtr = WIN_FindWndPtr( hwndDlg ))) return FALSE;
+    if ((hwndDlg != msg->hwnd) && !IsChild( hwndDlg, msg->hwnd )) return FALSE;
+
+    if (msg->message != WM_KEYDOWN)
+    {
+	SendMessage( msg->hwnd, msg->message, msg->wParam, msg->lParam );
+    }
+    else
+    {
+	int dlgCode = SendMessage( msg->hwnd, WM_GETDLGCODE, 0, 0 );
+	/* Process key message */
+	/* .... */
+    }
+    return TRUE;
+}
+
+
+/****************************************************************
+ *         GetDlgCtrlID           (USER.277)
+ */
+int GetDlgCtrlID( HWND hwnd )
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    if (wndPtr) return wndPtr->wIDmenu;
+    else return 0;
+}
+ 
+
+/***********************************************************************
+ *           GetDlgItem   (USER.91)
+ */
+HWND GetDlgItem( HWND hwndDlg, WORD id )
+{
+    HWND curChild;
+    WND * childPtr;
+    WND * wndPtr;
+
+    if (!(wndPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
+    curChild = wndPtr->hwndChild;
+    while(curChild)
+    {
+	childPtr = WIN_FindWndPtr( curChild );
+	if (childPtr->wIDmenu == id) return curChild;
+	curChild = childPtr->hwndNext;
+    }
+    return 0;
+}
+
+
+/*******************************************************************
+ *           SendDlgItemMessage   (USER.101)
+ */
+LONG SendDlgItemMessage(HWND hwnd, WORD id, UINT msg, WORD wParam, LONG lParam)
+{
+    HWND hwndCtrl = GetDlgItem( hwnd, id );
+    if (hwndCtrl) return SendMessage( hwndCtrl, msg, wParam, lParam );
+    else return 0;
+}
+
+
+/*******************************************************************
+ *           SetDlgItemText   (USER.92)
+ */
+void SetDlgItemText( HWND hwnd, WORD id, LPSTR lpString )
+{
+    SendDlgItemMessage( hwnd, id, WM_SETTEXT, 0, (DWORD)lpString );
+}
+
+
+/***********************************************************************
+ *           GetDlgItemText   (USER.93)
+ */
+int GetDlgItemText( HWND hwnd, WORD id, LPSTR str, WORD max )
+{
+    return (int)SendDlgItemMessage( hwnd, id, WM_GETTEXT, max, (DWORD)str );
+}
+
+
+/*******************************************************************
+ *           SetDlgItemInt   (USER.94)
+ */
+void SetDlgItemInt( HWND hwnd, WORD id, WORD value, BOOL fSigned )
+{
+    HANDLE hText = LocalAlloc( LMEM_MOVEABLE, 10 );
+    char * str = (char *) LocalLock( hText );
+
+    if (fSigned) sprintf( str, "%d", value );
+    else sprintf( str, "%u", value );
+    SendDlgItemMessage( hwnd, id, WM_SETTEXT, 0, (DWORD)str );
+    LocalUnlock( hText );
+    LocalFree( hText );
+}
+
+
+/***********************************************************************
+ *           GetDlgItemInt   (USER.95)
+ */
+WORD GetDlgItemInt( HWND hwnd, WORD id, BOOL * translated, BOOL fSigned )
+{
+    int len;
+    HANDLE hText;
+    long result;
+    char * str;
+    
+    if (translated) *translated = FALSE;
+    if (!(len = SendDlgItemMessage( hwnd, id, WM_GETTEXTLENGTH, 0, 0 )))
+	return 0;
+    if (!(hText = LocalAlloc(LMEM_MOVEABLE, len+1 )))
+	return 0;
+    str = (char *) LocalLock( hText );
+    if (SendDlgItemMessage( hwnd, id, WM_GETTEXT, len+1, (DWORD)str ))
+    {
+	char * endptr;
+	result = strtol( str, &endptr, 10 );
+	if (endptr && (endptr != str))  /* Conversion was successful */
+	{
+	    if (fSigned)
+	    {
+		if ((result < -32767) || (result > 32767)) result = 0;
+		else if (translated) *translated = TRUE;
+	    }
+	    else
+	    {
+		if ((result < 0) || (result > 65535)) result = 0;
+		else if (translated) *translated = TRUE;
+	    }
+	}
+    }
+    LocalUnlock( hText );
+    LocalFree( hText );
+    return (WORD)result;
+}
+
+
+/***********************************************************************
+ *           CheckDlgButton   (USER.97)
+ */
+void CheckDlgButton( HWND hwnd, WORD id, WORD check )
+{
+    SendDlgItemMessage( hwnd, id, BM_SETCHECK, check, 0 );
+}
+
+
+/***********************************************************************
+ *           IsDlgButtonChecked   (USER.98)
+ */
+WORD IsDlgButtonChecked( HWND hwnd, WORD id )
+{
+    return (WORD)SendDlgItemMessage( hwnd, id, BM_GETCHECK, 0, 0 );
+}
+
+
+/***********************************************************************
+ *           CheckRadioButton   (USER.96)
+ */
+void CheckRadioButton( HWND hwndDlg, WORD firstID, WORD lastID, WORD checkID )
+{
+    HWND button = GetDlgItem( hwndDlg, firstID );
+    while (button != 0)
+    {
+	WND * wndPtr = WIN_FindWndPtr( button );
+	if (!wndPtr) break;
+	SendMessage( button, BM_SETCHECK, (wndPtr->wIDmenu == checkID), 0 );
+        if (wndPtr->wIDmenu == lastID) break;
+	button = wndPtr->hwndNext;
+    }
+}
+
+
+/***********************************************************************
+ *           GetDialogBaseUnits   (USER.243)
+ */
+DWORD GetDialogBaseUnits()
+{
+    return MAKELONG( xBaseUnit, yBaseUnit );
+}
+
+
+/***********************************************************************
+ *           MapDialogRect   (USER.103)
+ */
+void MapDialogRect( HWND hwnd, LPRECT rect )
+{
+    DIALOGINFO * dlgInfo;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return;
+    dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
+    rect->left   = (rect->left * dlgInfo->xBaseUnit) / 4;
+    rect->right  = (rect->right * dlgInfo->xBaseUnit) / 4;
+    rect->top    = (rect->top * dlgInfo->yBaseUnit) / 8;
+    rect->bottom = (rect->bottom * dlgInfo->yBaseUnit) / 8;
+}
+
+
+/***********************************************************************
+ *           GetNextDlgGroupItem   (USER.227)
+ */
+HWND GetNextDlgGroupItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
+{
+    HWND hwnd, hwndLast;
+    WND * dlgPtr, * ctrlPtr, * wndPtr;
+
+    if (!(dlgPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
+    if (!(ctrlPtr = WIN_FindWndPtr( hwndCtrl ))) return 0;
+    if (ctrlPtr->hwndParent != hwndDlg) return 0;
+
+    hwndLast = hwndCtrl;
+    hwnd = ctrlPtr->hwndNext;
+    while (1)
+    {
+	if (!hwnd) hwnd = dlgPtr->hwndChild;
+	if (hwnd == hwndCtrl) break;
+	wndPtr = WIN_FindWndPtr( hwnd );
+	if (wndPtr->dwStyle & WS_TABSTOP)
+	{
+	    hwndLast = hwnd;
+	    if (!fPrevious) break;
+	}
+	hwnd = wndPtr->hwndNext;
+    }
+    return hwndLast;
+    return 0;
+}
+
+
+/***********************************************************************
+ *           GetNextDlgTabItem   (USER.228)
+ */
+HWND GetNextDlgTabItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
+{
+    HWND hwnd, hwndLast;
+    WND * dlgPtr, * ctrlPtr, * wndPtr;
+
+    if (!(dlgPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
+    if (!(ctrlPtr = WIN_FindWndPtr( hwndCtrl ))) return 0;
+    if (ctrlPtr->hwndParent != hwndDlg) return 0;
+
+    hwndLast = hwndCtrl;
+    hwnd = ctrlPtr->hwndNext;
+    while (1)
+    {
+	if (!hwnd) hwnd = dlgPtr->hwndChild;
+	if (hwnd == hwndCtrl) break;
+	wndPtr = WIN_FindWndPtr( hwnd );
+	if (wndPtr->dwStyle & WS_TABSTOP)
+	{
+	    hwndLast = hwnd;
+	    if (!fPrevious) break;
+	}
+	hwnd = wndPtr->hwndNext;
+    }
+    return hwndLast;
+}
diff --git a/windows/event.c b/windows/event.c
index 138f0579c81b06a882711a5c4002030b238ffd0c..f9c5e21f3feee95cb715c47c7b36e92a1e65b211 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -25,10 +25,13 @@ static void EVENT_key();
 static void EVENT_mouse_motion();
 static void EVENT_mouse_button();
 static void EVENT_structure();
+static void EVENT_focus_change();
 
   /* State variables */
 static HWND captureWnd = 0;
 
+extern HWND hWndFocus;
+
 /***********************************************************************
  *           EVENT_AddHandlers
  *
@@ -46,6 +49,8 @@ void EVENT_AddHandlers( Widget w, int hwnd )
 		      EVENT_mouse_button, (XtPointer)hwnd );
     XtAddEventHandler(w, StructureNotifyMask, FALSE,
 		      EVENT_structure, (XtPointer)hwnd );
+    XtAddEventHandler(w, FocusChangeMask, FALSE,
+		      EVENT_focus_change, (XtPointer)hwnd );
 }
 
 
@@ -66,6 +71,8 @@ void EVENT_RemoveHandlers( Widget w, int hwnd )
 			 EVENT_mouse_button, (XtPointer)hwnd );
     XtRemoveEventHandler(w, StructureNotifyMask, FALSE,
 			 EVENT_structure, (XtPointer)hwnd );
+    XtRemoveEventHandler(w, FocusChangeMask, FALSE,
+			 EVENT_focus_change, (XtPointer)hwnd );
 }
 
 
@@ -115,10 +122,18 @@ static void EVENT_key( Widget w, int hwnd, XKeyEvent *event,
 		       Boolean *cont_dispatch )
 {
     MSG msg;
-    
+
+    char Str[24]; 
+    XComposeStatus cs; 
+    KeySym key;
+    int count = XLookupString(event, Str, 1, &key, &cs);
+    Str[count] = '\0';
+#ifdef DEBUG_KEY
+    printf("WM_KEY??? : count=%u / %X / '%s'\n",count, Str[0], Str);
+#endif    
     msg.hwnd    = hwnd;
     msg.message = (event->type == KeyRelease) ? WM_KEYUP : WM_KEYDOWN;
-    msg.wParam  = 0;
+    msg.wParam  = Str[0];
     msg.lParam  = (event->x & 0xffff) | (event->y << 16);
     msg.time = event->time;
     msg.pt.x = event->x & 0xffff;
@@ -231,6 +246,47 @@ static void EVENT_structure( Widget w, int hwnd, XEvent *event,
     }    
 }
 
+
+/**********************************************************************
+ *              EVENT_focus_change
+ *
+ * Handle an X FocusChange event
+ */
+static void EVENT_focus_change( Widget w, int hwnd, XEvent *event, 
+			       Boolean *cont_dispatch )
+{
+    MSG msg;
+    
+    msg.hwnd = hwnd;
+    msg.time = GetTickCount();
+    msg.pt.x = 0;
+    msg.pt.y = 0;
+
+    switch(event->type)
+    {
+      case FocusIn:
+	{
+	    msg.message = WM_SETFOCUS;
+	    msg.wParam = hwnd;
+	    hWndFocus = hwnd;
+
+	}
+	break;
+	
+      case FocusOut:
+	{
+	    if (hWndFocus)
+	    {
+		msg.message = WM_KILLFOCUS;
+		msg.wParam = hwnd;
+		hWndFocus = 0;
+	    }
+	}
+    }    
+    MSG_AddMsg( &msg );
+}
+
+
 /**********************************************************************
  *		SetCapture 	(USER.18)
  */
diff --git a/windows/focus.c b/windows/focus.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce1a91a25ff49dd8c5328a53451202b471f95bf1
--- /dev/null
+++ b/windows/focus.c
@@ -0,0 +1,52 @@
+/*
+ * Focus functions
+ *
+ * Copyright 1993 David Metcalfe
+ */
+
+static char Copyright[] = "Copyright  David Metcalfe, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include "win.h"
+#include "gdi.h"
+
+HWND hWndFocus = 0;
+
+
+/*****************************************************************
+ *               SetFocus            (USER.22)
+ */
+
+HWND SetFocus(HWND hwnd)
+{
+    HWND hWndPrevFocus;
+    WND *wndPtr;
+
+    hWndPrevFocus = hWndFocus;
+
+    if (hwnd == 0)
+    {
+	XSetInputFocus(XT_display, None, RevertToPointerRoot, CurrentTime);
+    }
+    else
+    {
+	wndPtr = WIN_FindWndPtr(hwnd);
+	XSetInputFocus(XT_display, XtWindow(wndPtr->winWidget),
+		       RevertToParent, CurrentTime);
+    }
+
+    return hWndPrevFocus;
+}
+
+
+/*****************************************************************
+ *               GetFocus            (USER.23)
+ */
+
+HWND GetFocus(void)
+{
+    return hWndFocus;
+}
+
+
diff --git a/windows/graphics.c b/windows/graphics.c
index 338733af26b21dd5266c43810be173c28455614f..a2a1e3254d6f096a31e00b28d6d28dec05b3edd9 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -365,3 +365,79 @@ BOOL FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
     SelectObject( hdc, prevBrush );
     return retval;
 }
+
+
+/***********************************************************************
+ *           DrawFocusRect    (GDI.466)
+ */
+void DrawFocusRect( HDC hdc, LPRECT rc )
+{
+    HPEN hPen, hOldPen;
+    int oldDrawMode, oldBkMode;
+    int left, top, right, bottom;
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc) return;
+
+    left   = XLPTODP( dc, rc->left );
+    top    = YLPTODP( dc, rc->top );
+    right  = XLPTODP( dc, rc->right );
+    bottom = YLPTODP( dc, rc->bottom );
+    
+    hPen = CreatePen(PS_DOT, 1, GetSysColor(COLOR_WINDOWTEXT)); 
+    hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
+/*    oldDrawMode = SetROP2(hdc, R2_XORPEN);  */
+    oldBkMode = SetBkMode(hdc, TRANSPARENT);
+
+    if (DC_SetupGCForPen( dc ))
+	XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        left, top, right-left-1, bottom-top-1 );
+
+    SetBkMode(hdc, oldBkMode);
+/*    SetROP2(hdc, oldDrawMode);  */
+    SelectObject(hdc, (HANDLE)hOldPen);
+    DeleteObject((HANDLE)hPen);
+}
+
+
+/**********************************************************************
+ *          Line  (Not a MSWin Call)
+ */
+void Line(HDC hDC, int X1, int Y1, int X2, int Y2)
+{
+MoveTo(hDC, X1, Y1);
+LineTo(hDC, X2, Y2);
+}
+
+
+/**********************************************************************
+ *          DrawReliefRect  (Not a MSWin Call)
+ */
+ void DrawReliefRect(HDC hDC, RECT rect, int ThickNess, int Mode)
+{
+HPEN   hWHITEPen;
+HPEN   hDKGRAYPen;
+HPEN   hOldPen;
+int    OldColor;
+rect.right--;  rect.bottom--;
+hDKGRAYPen = CreatePen(PS_SOLID, 1, 0x00808080L);
+hWHITEPen = GetStockObject(WHITE_PEN);
+hOldPen = SelectObject(hDC, hWHITEPen);
+while(ThickNess > 0) {
+    if (Mode == 0)
+	SelectObject(hDC, hWHITEPen);
+    else
+	SelectObject(hDC, hDKGRAYPen);
+    Line(hDC, rect.left, rect.top, rect.right, rect.top);
+    Line(hDC, rect.left, rect.top, rect.left, rect.bottom + 1);
+    if (Mode == 0)
+	SelectObject(hDC, hDKGRAYPen);
+    else
+	SelectObject(hDC, hWHITEPen);
+    Line(hDC, rect.right, rect.bottom, rect.left, rect.bottom);
+    Line(hDC, rect.right, rect.bottom, rect.right, rect.top - 1);
+    InflateRect(&rect, -1, -1);
+    ThickNess--;
+    }
+SelectObject(hDC, hOldPen);
+DeleteObject(hDKGRAYPen);
+}
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 7594fd17ac6f31cb2a5b8ba91bf29b241645f480..a3ca9ace0f39584083f59ae9c79c51677bfc1751 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -48,22 +48,15 @@ extern Colormap COLOR_WinColormap;
 
 void SYSCOLOR_Init()
 {
-    Colormap map;
     XColor color;
     int i;
 
-    if ((map == COLOR_WinColormap) == CopyFromParent)
-	map = DefaultColormapOfScreen(XT_screen);
-
     for (i = 0; i < NUM_SYS_COLORS; i++)
     {
-	if (XParseColor(XT_display, map, DefSysColors[i], &color))
+	if (XParseColor(XT_display, COLOR_WinColormap, DefSysColors[i], &color))
 	{
-	    if (XAllocColor(XT_display, map, &color))
-	    {
-		SysColors[i] = RGB(color.red >> 8, color.green >> 8,
-				                    color.blue >> 8);
-	    }
+	    SysColors[i] = RGB(color.red >> 8, color.green >> 8,
+			       color.blue >> 8);
 	}
     }
 }
@@ -88,28 +81,11 @@ COLORREF GetSysColor(short nIndex)
 
 void SetSysColors(int nChanges, LPINT lpSysColor, COLORREF *lpColorValues)
 {
-    Colormap map;
-    XColor color;
-    char colorStr[8];
     int i;
 
-    if ((map == COLOR_WinColormap) == CopyFromParent)
-	map = DefaultColormapOfScreen(XT_screen);
-
     for (i = 0; i < nChanges; i++)
     {
-	sprintf(colorStr, "#%2.2x%2.2x%2.2x", GetRValue(lpColorValues[i]),
-		GetGValue(lpColorValues[i]), GetBValue(lpColorValues[i]));
-
-	if (XParseColor(XT_display, map, colorStr, &color))
-	{
-	    if (XAllocColor(XT_display, map, &color))
-	    {
-		SysColors[lpSysColor[i]] = RGB(color.red >> 8, 
-						color.green >> 8,
-						color.blue >> 8);
-	    }
-	}
+	SysColors[lpSysColor[i]] = lpColorValues[i];
     }
 
     /* Send WM_SYSCOLORCHANGE message to all windows */
diff --git a/windows/utility.c b/windows/utility.c
index 3c20d87b800f725e33b5fe66e1da479688f0eebb..ab189a097a6d2a798fd7a505f558fadc702bbd02 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -9,6 +9,7 @@
  */
 
 #include <stdio.h>
+#include <stdarg.h>
 #include <ctype.h>
 #include "windows.h"
 
@@ -270,6 +271,21 @@ char *UTILITY_convertArgs(char *format, char *winarg)
 	return result;
 };
 
+
+/**************************************************************************
+ *                wsprintf        [USER.420]
+ */
+int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
+{
+va_list  valist;
+int      ArgCnt;
+va_start(valist, lpFormat);
+ArgCnt = vsprintf(lpOutput, lpFormat, valist);
+va_end(valist);
+return (ArgCnt);
+}
+
+
 /*	wvsprintf() is an implementation of vsprintf(). This
  *	implementation converts the arguments to 32-bit integers and
  *	calls the standard library function vsprintf().
diff --git a/windows/win.c b/windows/win.c
index 4d517d38d8487d3e712d62b876da23ede2e09cbf..3e50a37fba96b98a7bad270f322df5f1a345f574 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -17,12 +17,14 @@ static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 #include "user.h"
 
 extern Display * XT_display;
+extern Screen * XT_screen;
 extern Colormap COLOR_WinColormap;
 
 static HWND firstWindow = 0;
 
-void BUTTON_CreateButton(LPSTR className, LPSTR buttonLabel, HWND hwnd);
-
+void SCROLLBAR_CreateScrollBar(LPSTR className, LPSTR Label, HWND hwnd);
+void LISTBOX_CreateListBox(LPSTR className, LPSTR Label, HWND hwnd);
+void COMBOBOX_CreateComboBox(LPSTR className, LPSTR Label, HWND hwnd);
 
 /***********************************************************************
  *           WIN_FindWndPtr
@@ -66,12 +68,44 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
 }
 
 
+/***********************************************************************
+ *           WIN_SendParentNotify
+ *
+ * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
+ * the window has the WS_EX_NOPARENTNOTIFY style.
+ */
+static void WIN_SendParentNotify( HWND hwnd, WND * wndPtr, WORD event )
+{
+    HWND current = wndPtr->hwndParent;
+
+    if (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) return;
+    while (current)
+    {
+	SendMessage( current, WM_PARENTNOTIFY, 
+		     event, MAKELONG( hwnd, wndPtr->wIDmenu ) );
+	current = GetParent( current );
+    }
+}
+
+
 /***********************************************************************
  *           CreateWindow   (USER.41)
  */
 HWND CreateWindow( LPSTR className, LPSTR windowName,
 		   DWORD style, short x, short y, short width, short height,
 		   HWND parent, HMENU menu, HANDLE instance, LPSTR data ) 
+{
+    return CreateWindowEx( 0, className, windowName, style,
+			   x, y, width, height, parent, menu, instance, data );
+}
+
+
+/***********************************************************************
+ *           CreateWindowEx   (USER.452)
+ */
+HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
+		     DWORD style, short x, short y, short width, short height,
+		     HWND parent, HMENU menu, HANDLE instance, LPSTR data ) 
 {
     HANDLE class, hwnd;
     CLASS *classPtr;
@@ -79,16 +113,17 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     CREATESTRUCT *createStruct;
     HANDLE hcreateStruct;
     int wmcreate;
-    LPSTR textPtr;
 
 #ifdef DEBUG_WIN
-    printf( "CreateWindow: %s %s %d,%d %dx%d\n", className, windowName, x, y, width, height );
+    printf( "CreateWindowEx: %s %s %d,%d %dx%d\n", className, windowName, x, y, width, height );
 #endif
 
     if (x == CW_USEDEFAULT) x = 0;
     if (y == CW_USEDEFAULT) y = 0;
     if (width == CW_USEDEFAULT) width = 600;
     if (height == CW_USEDEFAULT) height = 400;
+    if (!width) width = 1;
+    if (!height) height = 1;
 
       /* Find the parent and class */
 
@@ -127,9 +162,10 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     wndPtr->hwndLastActive    = 0;
     wndPtr->lpfnWndProc       = classPtr->wc.lpfnWndProc;
     wndPtr->dwStyle           = style;
-    wndPtr->dwExStyle         = 0;
+    wndPtr->dwExStyle         = exStyle;
     wndPtr->hmenuSystem       = 0;
     wndPtr->wIDmenu           = menu;
+    wndPtr->hText             = 0;
     wndPtr->flags             = 0;
 
     if (classPtr->wc.cbWndExtra)
@@ -139,11 +175,6 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     else wndPtr->hdc = 0;
     classPtr->cWindows++;
 
-      /* Create buffer for window text */
-    wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE, strlen(windowName) + 1);
-    textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
-    strcpy(textPtr, windowName);
-
       /* Insert the window in the linked list */
 
     if (parent)
@@ -157,6 +188,21 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
 	firstWindow = hwnd;
     }
     
+    if (!strcasecmp(className, "SCROLLBAR"))
+    {
+	SCROLLBAR_CreateScrollBar(className, windowName, hwnd);
+	goto WinCreated;
+    }
+    if (!strcasecmp(className, "LISTBOX"))
+    {
+	LISTBOX_CreateListBox(className, windowName, hwnd);
+	goto WinCreated;
+    }
+    if (!strcasecmp(className, "COMBOBOX"))
+    {
+	COMBOBOX_CreateComboBox(className, windowName, hwnd);
+	goto WinCreated;
+    }
       /* Create the widgets */
 
     if (style & WS_CHILD)
@@ -164,19 +210,23 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
 	wndPtr->shellWidget = 0;
 	if (style & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))
 	{ 
+	    int borderCol = 0;
+	    if (COLOR_WinColormap == DefaultColormapOfScreen(XT_screen))
+		borderCol = BlackPixelOfScreen(XT_screen);
 	    wndPtr->winWidget = XtVaCreateManagedWidget(className,
-						    coreWidgetClass,
+						    compositeWidgetClass,
 						    parentPtr->winWidget,
 						    XtNx, x,
 						    XtNy, y,
 						    XtNwidth, width,
 						    XtNheight, height,
+						    XtNborderColor, borderCol,
 						    NULL );
 	}
 	else
 	{
 	    wndPtr->winWidget = XtVaCreateManagedWidget(className,
-						    coreWidgetClass,
+						    compositeWidgetClass,
 						    parentPtr->winWidget,
 						    XtNx, x,
 						    XtNy, y,
@@ -188,15 +238,13 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     }
     else
     {
-	wndPtr->shellWidget = XtVaAppCreateShell(className, 
-						 windowName,
+	wndPtr->shellWidget = XtVaAppCreateShell(windowName, 
+						 className,
 						 topLevelShellWidgetClass,
 						 XT_display,
 						 XtNx, x,
 						 XtNy, y,
-#ifdef USE_PRIVATE_MAP
 						 XtNcolormap, COLOR_WinColormap,
-#endif
 						 NULL );
 	wndPtr->compositeWidget = XtVaCreateManagedWidget(className,
 						    formWidgetClass,
@@ -245,6 +293,8 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
 	}
     }
 
+WinCreated:
+
       /* Send the WM_CREATE message */
 	
     hcreateStruct = GlobalAlloc( GMEM_MOVEABLE, sizeof(CREATESTRUCT) );
@@ -262,8 +312,10 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     createStruct->lpszClass      = className;
     createStruct->dwExStyle      = 0;
 
-    wmcreate = CallWindowProc( wndPtr->lpfnWndProc, hwnd, 
-			       WM_CREATE, 0, (LONG) createStruct );
+    wmcreate = SendMessage( hwnd, WM_NCCREATE, 0, (LONG)createStruct );
+    if (!wmcreate) wmcreate = -1;
+    else wmcreate = SendMessage( hwnd, WM_CREATE, 0, (LONG)createStruct );
+
     GlobalUnlock( hcreateStruct );
     GlobalFree( hcreateStruct );
     
@@ -279,6 +331,7 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
     EVENT_AddHandlers( wndPtr->winWidget, hwnd );
 
     if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
+    WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
     return hwnd;
 }
 
@@ -287,35 +340,41 @@ HWND CreateWindow( LPSTR className, LPSTR windowName,
  */
 BOOL DestroyWindow( HWND hwnd )
 {
-    WND *wndPtr, *parentPtr;
+    WND * wndPtr;
+    HWND * curWndPtr;
     CLASS * classPtr;
     
-    wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return FALSE;
+      /* Initialisation */
+
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return FALSE;
+    WIN_SendParentNotify( hwnd, wndPtr, WM_DESTROY );
+
+      /* Send destroy messages */
 
-    if (wndPtr->hwndParent)
-    {
-	parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-	printf( "INTERNAL ERROR: DestroyWindow: Invalid window parent\n" );
-	return FALSE;
-    }
-    
-    classPtr = CLASS_FindClassPtr( wndPtr->hClass );
-    if (!classPtr)
-    {
-	printf( "INTERNAL ERROR: DestroyWindow: Invalid window class\n" );
-	return FALSE;
-    }
-    
     SendMessage( hwnd, WM_DESTROY, 0, 0 );
+    SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
     
       /* Destroy all children */
 
-    /* ........... */
+    while (wndPtr->hwndChild)  /* The child removes itself from the list */
+	DestroyWindow( wndPtr->hwndChild );
 
       /* Remove the window from the linked list */
-    
-    /* ........... */
+
+    if (wndPtr->hwndParent)
+    {
+	WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+	curWndPtr = &parentPtr->hwndChild;
+    }    
+    else curWndPtr = &firstWindow;
+
+    while (*curWndPtr != hwnd)
+    {
+	WND * curPtr = WIN_FindWndPtr( *curWndPtr );
+	curWndPtr = &curPtr->hwndNext;
+    }
+    *curWndPtr = wndPtr->hwndNext;
 
       /* Destroy the window */
 
@@ -323,12 +382,34 @@ BOOL DestroyWindow( HWND hwnd )
     else XtDestroyWidget( wndPtr->winWidget );
     if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
     classPtr->cWindows--;
-    USER_HEAP_FREE(wndPtr->hText);
     USER_HEAP_FREE( hwnd );
     return TRUE;
 }
 
 
+/***********************************************************************
+ *           GetWindowRect   (USER.32)
+ */
+void GetWindowRect( HWND hwnd, LPRECT rect ) 
+{
+    int x, y, width, height;  
+    WND * wndPtr = WIN_FindWndPtr( hwnd ); 
+
+    if (wndPtr) 
+    {
+	XtVaGetValues(wndPtr->winWidget,
+		      XtNx, &x, XtNy, &y,
+		      XtNwidth, &width,
+		      XtNheight, &height,
+		      NULL );
+	rect->left  = x & 0xffff;
+	rect->top = y & 0xffff;
+	rect->right  = width & 0xffff;
+	rect->bottom = height & 0xffff;
+    }
+}
+
+
 /***********************************************************************
  *           GetClientRect   (USER.33)
  */
@@ -368,11 +449,59 @@ BOOL ShowWindow( HWND hwnd, int cmd )
 	SendMessage( hwnd, WM_SIZE, SIZE_RESTORED, 
 		     (width & 0xffff) | (height << 16) );
 	SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
+/*
+	printf("ShowWindow(%X, %X); !\n", hwnd, cmd);
+*/
+	switch(cmd)
+	    {
+	    case SW_HIDE:
+		XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
+		break;
+	    case SW_SHOWNA:
+	    case SW_SHOWMINNOACTIVE:
+	    case SW_SHOWNOACTIVATE:
+	    case SW_MINIMIZE:
+	    case SW_MAXIMIZE:
+	    case SW_SHOWMAXIMIZED:
+	    case SW_SHOWMINIMIZED:
+	    case SW_SHOW:
+	    case SW_NORMAL:
+	    case SW_SHOWNORMAL:
+		XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
+		break;
+	    default:
+		break;
+	    }
     }
     return TRUE;
 }
 
 
+/***********************************************************************
+ *           MoveWindow   (USER.56)
+ */
+void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint)
+{    
+    WND * wndPtr = WIN_FindWndPtr( hWnd );
+    if (wndPtr) 
+    {
+	wndPtr->rectClient.left   = x;
+	wndPtr->rectClient.top    = y;
+	wndPtr->rectClient.right  = x + w;
+	wndPtr->rectClient.bottom = y + h;
+	XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y,
+		      XtNwidth, w, XtNheight, h, NULL );
+	SendMessage(hWnd, WM_MOVE, 0, MAKELONG(x, y)); 
+	printf("MoveWindow(%X, %d, %d, %d, %d, %d); !\n", 
+			hWnd, x, y, w, h, bRepaint);
+	if (bRepaint) {
+	    InvalidateRect(hWnd, NULL, TRUE);
+	    UpdateWindow(hWnd);
+	    }
+    }
+}
+
+
 /***********************************************************************
  *           UpdateWindow   (USER.124)
  */
@@ -441,6 +570,42 @@ BOOL SetMenu(HWND hwnd, HMENU hmenu)
 }
 
 
+/***********************************************************************
+ *           SetWindowPos   (USER.232)
+ */
+void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, short h, WORD wFlag)
+{    
+    WND * wndPtr = WIN_FindWndPtr( hWnd );
+    if (wndPtr) 
+    {
+	if ((wFlag & SWP_NOMOVE) == 0) {
+	    wndPtr->rectClient.left   = x;
+	    wndPtr->rectClient.top    = y;
+	    XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
+	    }
+	if ((wFlag & SWP_NOSIZE) == 0) {
+	    wndPtr->rectClient.right  = x + w;
+	    wndPtr->rectClient.bottom = y + h;
+	    XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
+	    }
+	if ((wFlag & SWP_NOREDRAW) == 0) {
+	    InvalidateRect(hWnd, NULL, TRUE);
+	    UpdateWindow(hWnd);
+	    }
+	if ((wFlag & SWP_HIDEWINDOW) == SWP_HIDEWINDOW) 
+	    ShowWindow(hWnd, SW_HIDE);
+	if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW) 
+	    ShowWindow(hWnd, SW_SHOW);
+/*
+	if ((wFlag & SWP_NOACTIVATE) == 0) 
+	    SetActiveWindow(hWnd);
+*/
+	printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n", 
+		hWnd, hWndInsertAfter, x, y, w, h, wFlag);
+    }
+}
+
+
 /**********************************************************************
  *           GetDesktopWindow        (USER.286)
  */
@@ -502,7 +667,7 @@ LONG GetWindowLong( HWND hwnd, short offset )
     {
 	case GWL_STYLE:   return wndPtr->dwStyle;
         case GWL_EXSTYLE: return wndPtr->dwExStyle;
-	case GWL_WNDPROC: return wndPtr->lpfnWndProc;
+	case GWL_WNDPROC: return (LONG)wndPtr->lpfnWndProc;
     }
     return 0;
 }
@@ -521,7 +686,7 @@ LONG SetWindowLong( HWND hwnd, short offset, LONG newval )
     {
 	case GWL_STYLE:   ptr = &wndPtr->dwStyle;
         case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle;
-	case GWL_WNDPROC: ptr = &wndPtr->lpfnWndProc;
+	case GWL_WNDPROC: ptr = (LONG *)(&wndPtr->lpfnWndProc);
 	default: return 0;
     }
     retval = *ptr;
@@ -533,32 +698,16 @@ LONG SetWindowLong( HWND hwnd, short offset, LONG newval )
 /*****************************************************************
  *         GetParent              (USER.46)
  */
-
 HWND GetParent(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    HWND hwndParent = wndPtr->hwndParent;
-    GlobalUnlock(hwnd);
-    return hwndParent;
-}
-
-/****************************************************************
- *         GetDlgCtrlID           (USER.277)
- */
-
-int GetDlgCtrlID(HWND hwnd)
-{
-    WND *wndPtr = WIN_FindWndPtr(hwnd);
-    int ctrlID = wndPtr->wIDmenu;
-    GlobalUnlock(hwnd);
-    return ctrlID;
+    return wndPtr->hwndParent;
 }
 
 
 /*******************************************************************
  *         GetWindowText          (USER.36)
  */
-
 int GetWindowText(HWND hwnd, LPSTR lpString, int nMaxCount)
 {
     return (int)SendMessage(hwnd, WM_GETTEXT, (WORD)nMaxCount, 
@@ -566,9 +715,16 @@ int GetWindowText(HWND hwnd, LPSTR lpString, int nMaxCount)
 }
 
 /*******************************************************************
- *         GetWindowTextLength    (USER.38)
+ *         SetWindowText          (USER.37)
  */
+void SetWindowText(HWND hwnd, LPSTR lpString)
+{
+    SendMessage(hwnd, WM_SETTEXT, (WORD)NULL, (DWORD)lpString);
+}
 
+/*******************************************************************
+ *         GetWindowTextLength    (USER.38)
+ */
 int GetWindowTextLength(HWND hwnd)
 {
     return (int)SendMessage(hwnd, WM_GETTEXTLENGTH, (WORD)NULL, 
@@ -576,3 +732,103 @@ int GetWindowTextLength(HWND hwnd)
 }
 
 
+/*******************************************************************
+ *         IsChild    (USER.48)
+ */
+BOOL IsChild( HWND parent, HWND child )
+{
+    HWND curChild;
+    WND * parentPtr;
+    WND * childPtr;
+
+    if (!(parentPtr = WIN_FindWndPtr( parent ))) return FALSE;
+    curChild = parentPtr->hwndChild;
+
+    while (curChild)
+    {
+	if (curChild == child) return TRUE;
+	if (IsChild( curChild, child )) return TRUE;
+	if (!(childPtr = WIN_FindWndPtr( curChild ))) return FALSE;
+	curChild = childPtr->hwndNext;
+    }    
+    return FALSE;
+}
+
+
+/*******************************************************************
+ *         GetTopWindow    (USER.229)
+ */
+HWND GetTopWindow( HWND hwnd )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (wndPtr) return wndPtr->hwndChild;
+    else return 0;
+}
+
+
+/*******************************************************************
+ *         GetWindow    (USER.262)
+ */
+HWND GetWindow( HWND hwnd, WORD rel )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return 0;
+    switch(rel)
+    {
+    case GW_HWNDFIRST:
+	if (wndPtr->hwndParent)
+	{
+	    WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+	    return parentPtr->hwndChild;
+	}
+	else return firstWindow;
+	
+    case GW_HWNDLAST:
+	while (wndPtr->hwndNext)
+	{
+	    hwnd = wndPtr->hwndNext;
+	    wndPtr = WIN_FindWndPtr( hwnd );
+	}
+	return hwnd;
+	
+    case GW_HWNDNEXT:
+	return wndPtr->hwndNext;
+	
+    case GW_HWNDPREV:	
+	{
+	    HWND hwndPrev;
+	    
+	    if (wndPtr->hwndParent)
+	    {
+		WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+		hwndPrev = parentPtr->hwndChild;
+	    }
+	    else hwndPrev = firstWindow;
+	    if (hwndPrev == hwnd) return 0;
+	    while (hwndPrev)
+	    {
+		wndPtr = WIN_FindWndPtr( hwndPrev );
+		if (wndPtr->hwndNext == hwnd) break;
+		hwndPrev = wndPtr->hwndNext;
+	    }
+	    return hwndPrev;
+	}
+	
+    case GW_OWNER:
+	return wndPtr->hwndOwner;
+
+    case GW_CHILD:
+	return wndPtr->hwndChild;
+    }
+    return 0;
+}
+
+
+/*******************************************************************
+ *         GetNextWindow    (USER.230)
+ */
+HWND GetNextWindow( HWND hwnd, WORD flag )
+{
+    if ((flag != GW_HWNDNEXT) && (flag != GW_HWNDPREV)) return 0;
+    return GetWindow( hwnd, flag );
+}