changeset 22481:c19803db4a93

(dos_set_keyboard): Call Int 2Fh via the DPMI server, not directly. (dos_yield_time_slice): New function. (sys_select): Use it instead of __dpmi_yield.
author Eli Zaretskii <eliz@gnu.org>
date Sun, 14 Jun 1998 16:19:33 +0000
parents a85ad07a6e4b
children eb09852bfc05
files src/msdos.c
diffstat 1 files changed, 27 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/msdos.c	Sun Jun 14 15:34:02 1998 +0000
+++ b/src/msdos.c	Sun Jun 14 16:19:33 1998 +0000
@@ -1272,11 +1272,13 @@
      int always;
 {
   int i;
-  union REGS regs;
-
-  /* See if Keyb.Com is installed (for international keyboard support).  */
+  _go32_dpmi_registers regs;
+
+  /* See if Keyb.Com is installed (for international keyboard support).
+     Note: calling Int 2Fh via int86 wedges the DOS box on some versions
+     of Windows 9X!  So don't do that!  */
   regs.x.ax = 0xad80;
-  int86 (0x2f, &regs, &regs);
+  _go32_dpmi_simulate_int (0x2f, &regs);
   if (regs.h.al == 0xff)
     international_keyboard = 1;
 
@@ -3421,6 +3423,25 @@
        && (long)(time).tv_usec <= 0))
 #endif
 
+/* This yields the rest of the current time slice to the task manager.
+   It should be called by any code which knows that it has nothing
+   useful to do except idle.
+
+   I don't use __dpmi_yield here, since versions of library before 2.02
+   called Int 2Fh/AX=1680h there in a way that would wedge the DOS box
+   on some versions of Windows 9X.  */
+
+void
+dos_yield_time_slice (void)
+{
+  _go32_dpmi_registers r;
+
+  r.x.ax = 0x1680;
+  r.x.ss = r.x.sp = r.x.flags = 0;
+  _go32_dpmi_simulate_int (0x2f, &r);
+  if (r.h.al == 0x80)
+    errno = ENOSYS;
+}
 
 /* Only event queue is checked.  */
 /* We don't have to call timer_check here
@@ -3454,9 +3475,7 @@
     {
       while (!detect_input_pending ())
 	{
-#if __DJGPP__ >= 2
-	  __dpmi_yield ();
-#endif	  
+	  dos_yield_time_slice ();
 	}
     }
   else
@@ -3482,9 +3501,7 @@
 	  if (EMACS_TIME_ZERO_OR_NEG_P (*timeout))
 	    return 0;
 	  cllast = clnow;
-#if __DJGPP__ >= 2
-	  __dpmi_yield ();
-#endif	  
+	  dos_yield_time_slice ();
 	}
     }