Release 0.3.0

Fri Sep  3 11:52:18 1993  Bob Amstadt

	* [windows/timer.c]
	Changed to use CallWindowProc() rather directly calling callback.

	* [windows/event.c]
	Implemented SetCapture() and ReleaseCapture()

	* [windows/keyboard.c]
	Created stub for GetKeyState()

	* [objects/linedda.c]
	Created stub for LineDDA()

	* [if1632/callback.c]
	Created callback handler for LineDDA callback procedure.

	* [if1632/callback.c]
	Created FreeProcInstance()

Fri Sep  3 08:36:52 1993  David Metcalfe

	* [loader/signal.c]
	Patch to and code for INT 1A

Thu Sep  2 00:31:54 1993  Alexandre Julliard

	* [objects/font.c] [objects/text.c]
	More text support: implemented justification and underlining.

	* [windows/clipping.c] [objects/clipping.c]
	Moved low-level clipping functions to objects/clipping.c.

	* [windows/clipping.c] [windows/event.c] [windows/message.c]
	Implemented window update regions.

	* [windows/dc.c] [objects/dcvalues.c]
	Moved some device-independent DC functions to objects/dcvalues.c.

	* [windows/graphics.c]
	Implemented InvertRect() and GetPixel().

Sat Aug 28 08:40:23 1993  Eric Youngdale

	* [include/neexe.h] [loader/wine.c]
	Added code to handle relocation type 4.

	* [loader/signal.h] [loader/wine.c] [loader/selector.c]
	Added support for dos interrupts.

Thu 26 Aug 19:15:00 1993  Eric Youngdale

	* [loader/selector.c]
	Fixed bug dealing with loading DLLs.

Thu Aug 26 19:22:40 1993  Alexandre Julliard

        * [include/gdi.h] [objects/font.c] [windows/dc.c]
        Beginning of real font support.

        * [windows/graphics.c]
        Implemented PatBlt().

        * [memory/global.c]
        Corrected a bug with linked list handling in GlobalAlloc().

        * [objects/bitmap.c]
        Corrected a bug in BITMAP_SelectObject().

Tue Aug 24 19:22:40 1993  David Metcalfe

        * [controls/Command*] [controls/Label*] [controls[MenuButto*]
	  [controls/SmeMenuButt*]
	Change code to support & as a special character in menu item text.

Tue Aug 24 19:22:40 1993  Alexandre Julliard

	* [include/gdi.h] [windows/dc.c]
	Heavily modified the DC structure for better device-independence.

	* [objects/bitmap.c]
	Implemented bitmap dimensions.

	* [windows/dc.c] [windows/dce.c]
	Implemented DC state saving and restoring.

	* [windows/dc.c]
	Implemented ROP mode.

	* [windows/graphics.c]
	Implemented FillRect().

Mon Aug 23 22:08:34 1993  Bob Amstadt  (bob at pooh)

	* [misc/xt.c]
	Fixed bug in InvalidateRect().  Solitaire attempted to
	clear window before it was realized.

	* [loader/resource.c]
	Began rewrite of LoadBitmap().

	* [loader/wine.c]
	Fixed code which set Argv and Argc global variables.

	* [loader/selector.c]
	Added code to set up command line arguments.

	* [include/neexe.h]
	Fixed error in PSP structure.

Tue Aug 17 20:41:12 1993  Alexandre Julliard

	* [include/gdi.h] [windows/dc.c]
	Implemented device capabilities.

	* [objects/region.c]
	Implemented EqualRgn() and CombineRgn().

	* [windows/clipping.c]
	Implemented Save/RestoreVisRgn().

	* [windows/graphics.c]
	Implemented PaintRgn() and FillRgn().

	* [windows/mapping.c]
	Implemented mapping modes.

Tue Aug 10 14:07:38 1993  Alexandre Julliard

	* [if1632/user.spec] [misc/rect.c]
	Implemented rectangle API functions.

	* [if1632/gdi.spec] [include/gdi.h] [objects/region.c]
	Implemented regions.

	* [windows/class.c]
	Corrected a typo in UnregisterClass().

	* [windows/clipping.c] [windows/dc.c]
	Implemented DC clipping and visible region.

Tue Aug 10 20:57:56 1993  Bob Amstadt  (bob at pooh)

	* [controls/menu.c] [windows/win.c]
	SetMenu(), GetMenu(), CheckMenuItem() implemented

Thu Aug  5 22:33:22 1993  Bob Amstadt  (bob at pooh)

	* [controls/menu.c] [windows/win.c]
	Many improvements menus.  LoadMenu() should work.

Wed Aug  4 14:55:36 1993  Alexandre Julliard

        * [objects/dib.c]
        Started the implementation of device-independent bitmaps.

        * [objects/bitmap.c]
        Added support for multiple bitmap depths.

        * [objects/brush.c]
        Implemented pattern brushes.

        * [windows/dc.c] [windows/graphics.c]
        Implemented some GDI graphics primitives.

Tue Aug  3 21:16:47 1993  Bob Amstadt  (bob at pooh)

	* [controls/menu.c] [windows/win.c] [include/menu.h]
	Code to load class menus from executable file.

	* [if1632/user.spec]
	Fixed specification of SendMessage() and PostMessage.

Mon Jul 26 21:53:24 1993  Alexandre Julliard

	* [if1632/call.S]
	Corrected a bug in KERNEL_InitTask().

	* [include/windows.h]
	Added a lot of constants.

	* [loader/selector.c]
	Corrected a bug in segment allocation in CreateSelectors().

	* [objects/bitmap.c]
	Implemented SelectObject() for bitmaps.

	* [objects/brush.c]
	Implemented hatched brushes and SelectObject().

	* [objects/gdiobj.c]
	Removed linked list (not needed).

	* [objects/palette.c]
	Implemented system palette creation and misc. palette API functions.

	* [windows/timer.c]
	Implemented timers.

	* [windows/dc.c]
	Implemented memory device contexts.

Tue Jul 20 10:38:59 1993  Bob Amstadt  (bob at pooh)

        * [dos.c]
	Split DOS3Call() out of kernel.c.  Added support for get date
	and time functions.

	* [call.S]
	Added function ReturnFromRegisterFunc() to allow DOS calls
	to return values in registers.

	* [regfunc.h]
	Macros to access registers saved on stack.

Tue Jul 20 10:38:59 1993  Alexandre Julliard

        * [win.c]
        Corrected allocation of the WM_CREATE data structure.

        * [dce.c] [dce.h]
        Implemented DCE handling.

        * [bitmap.c] [brush.c] [dc.c] [font.c] [gdi.h] [gdi.spec] 
          [gdiobj.c] [palette.c] [pen.c]
        Implemented the GDI objects data structures and allocation.

        * [windows.h]
        Added several structures and constants for GDI objects.

Mon Jul 19 12:51:10 1993  Bob Amstadt  (bob at pooh)

	* [ldtlib.c]
	Modified system calls to match Linus' new interface for
	the LDT modification.

	* [win.c]
	Fixed bug with WM_CREATE message.

	* [heap.c] [kernel.spec]
	Completed local heap allocation functions.

	* [global.c]
	Created function GlobalQuickAlloc() for easy allocation from DLLs
diff --git a/loader/signal.c b/loader/signal.c
new file mode 100644
index 0000000..39f4080
--- /dev/null
+++ b/loader/signal.c
@@ -0,0 +1,216 @@
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include <syscall.h>
+#include <signal.h>
+#include <errno.h>
+#include <linux/sched.h>
+#include <asm/system.h>
+ 
+extern void ___sig_restore();
+extern void ___masksig_restore();
+
+/* Similar to the sigaction function in libc, except it leaves alone the
+   restorer field */
+
+static int
+wine_sigaction(int sig,struct sigaction * new, struct sigaction * old)
+{
+	__asm__("int $0x80":"=a" (sig)
+		:"0" (SYS_sigaction),"b" (sig),"c" (new),"d" (old));
+	if (sig>=0)
+		return 0;
+	errno = -sig;
+	return -1;
+}
+
+char * cstack[4096];
+struct sigaction segv_act;
+
+struct sigcontext_struct {
+	unsigned short gs, __gsh;
+	unsigned short fs, __fsh;
+	unsigned short es, __esh;
+	unsigned short ds, __dsh;
+	unsigned long edi;
+	unsigned long esi;
+	unsigned long ebp;
+	unsigned long esp;
+	unsigned long ebx;
+	unsigned long edx;
+	unsigned long ecx;
+	unsigned long eax;
+	unsigned long trapno;
+	unsigned long err;
+	unsigned long eip;
+	unsigned short cs, __csh;
+	unsigned long eflags;
+	unsigned long esp_at_signal;
+	unsigned short ss, __ssh;
+	unsigned long i387;
+	unsigned long oldmask;
+	unsigned long cr2;
+};
+
+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->ecx = (now->tm_hour << 8) | now->tm_min;
+	 context->edx = now->tm_sec << 8;
+    }
+    else
+    {
+	context->ecx = now->tm_year + 1900;
+	context->edx = ((now->tm_mon + 1) << 8) | now->tm_mday;
+	context->eax &= 0xff00;
+	context->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->eax >> 8) & 0xff);
+	switch((context->eax >> 8) & 0xff){
+	case 0x30:
+		context->eax = 0x0303;  /* Hey folks, this is DOS V3.3! */
+		context->ebx = 0;
+		context->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->es = 0;
+		context->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->eax & 0xff);
+		
+
+	default:
+		fprintf(stderr,"Unable to handle int 0x21 %x\n", context->eax);
+		return 1;
+	};
+	return 1;
+}
+
+static int
+do_int1A(struct sigcontext_struct * context){
+	time_t ltime;
+	int ticks;
+
+	switch((context->eax >> 8) & 0xff){
+	case 0:
+		ltime = time(NULL);
+		ticks = (int) (ltime * HZ);
+		context->ecx = ticks >> 16;
+		context->edx = ticks & 0x0000FFFF;
+		context->eax = 0;  /* No midnight rollover */
+		break;
+	
+	default:
+		fprintf(stderr,"Unable to handle int 0x1A %x\n", context->eax);
+		return 1;
+	};
+	return 1;
+}
+
+static void win_segfault(int signal, struct sigcontext_struct context){
+	unsigned char * instr;
+	unsigned char intno;
+	unsigned int * dump;
+	int i;
+
+	/* First take care of a few preliminaries */
+	if(signal != SIGSEGV) exit(1);
+	if((context.cs & 7) != 7){
+		fprintf(stderr,
+			"Segmentation fault in Wine program (%x:%x)."
+			"  Please debug\n",
+			context.cs, context.eip);
+		goto oops;
+	};
+
+	/*  Now take a look at the actual instruction where the program
+	    bombed */
+	instr = (char *) ((context.cs << 16) | (context.eip & 0xffff));
+
+	if(*instr != 0xcd) {
+		fprintf(stderr,
+			"Unexpected Windows program segfault"
+			" - opcode = %x\n", *instr);
+#if 0
+		return;
+#else
+		goto oops;
+#endif
+	};
+
+	instr++;
+	intno = *instr;
+	switch(intno){
+	case 0x21:
+		if(!do_int21(&context)) goto oops;
+		break;
+	case 0x1A:
+		if(!do_int1A(&context)) goto oops;
+		break;
+	default:
+		fprintf(stderr,"Unexpected Windows interrupt %x\n", intno);
+		goto oops;
+	};
+
+	/* OK, done handling the interrupt */
+
+	context.eip += 2;  /* Bypass the int instruction */
+	return;
+
+ oops:
+	fprintf(stderr,"In win_segfault %x:%x\n", context.cs, context.eip);
+	fprintf(stderr,"Stack: %x:%x\n", context.ss, context.esp_at_signal);
+	dump = (int*) &context;
+	for(i=0; i<22; i++) 
+	{
+	    fprintf(stderr," %8.8x", *dump++);
+	    if ((i % 8) == 7)
+		fprintf(stderr,"\n");
+	}
+	fprintf(stderr,"\n");
+	exit(1);
+}
+
+int
+init_wine_signals(){
+	segv_act.sa_handler = (__sighandler_t) win_segfault;
+	/* 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);
+	wine_sigaction(SIGSEGV, &segv_act, NULL);
+}
+