/* -*-C-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/doskbd.c,v 1.2 1992/05/10 17:52:41 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/doskbd.c,v 1.3 1992/05/12 04:16:56 mhwu Exp $
Copyright (c) 1992 Massachusetts Institute of Technology
promotional, or sales literature without prior written consent from
MIT in each case. */
+
+\f
+/* These flags determine how the code will behave. */
+
+#define DOSX_USE_INT_INTERCEPT
+#define DOSX_RM_HANDLER_UNTOUCHED
+#define DOSX_PM_HANDLER_UNTOUCHED
+/* #define DOSX_RM_HANDLER_REAL */
+#define DPMI_RM_HANDLER_REAL
+#define DPMI_PM_HANDLER_UNTOUCHED
+
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#ifndef EFAULT
# define EFAULT 2001
#endif
+
+#define Dprintf(thing) \
+ if (0) printf(thing)
+
\f
/* Tables mapping scan codes to ASCII characters.
Entries with NULL (\0) should not be mapped by the
return;
}
-/*
+static dos_boolean
+DOSX_install_kbd_hook_p()
+{
+ char *envvar = DOS_getenv("SCM_DOSX_KBD_HOOK_P");
+
+ if ( (envvar != NULL) &&
+ ((strcmp(envvar, "false") == 0) ||
+ (strcmp(envvar, "FALSE") == 0) ||
+ (strcmp(envvar, "False") == 0)) )
+ return dos_false;
+ else
+ return dos_true;
+}
+
+\f/*
We would like to use Zortech's int_intercept with the following
routine under DOSX (or Phar Lap).
a real-mode handler no matter what, although using different
mechanisms under DPMI and not DPMI.
*/
-\f
-#define DOSX_USE_INT_INTERCEPT
-#define DOSX_RM_HANDLER_UNTOUCHED
-#define DOSX_PM_HANDLER_UNTOUCHED
-/* #define DOSX_RM_HANDLER_REAL */
-#define DPMI_RM_HANDLER_REAL
-#define DPMI_PM_HANDLER_UNTOUCHED
#ifdef DOSX_USE_INT_INTERCEPT
#endif /* DPMI_RM_HANDLER_REAL */
+\f
#ifdef DOSX_RM_HANDLER_REAL
static int
static int
DOSX_install_kbd_hook (void)
{
+ if (!DOSX_install_kbd_hook_p()) return DOS_FAILURE;
+
#ifdef DOSX_USE_INT_INTERCEPT
- if (!under_QEMM_386_p ())
{
int_intercept (DOS_INTVECT_SYSTEM_SERVICES,
bios_keyboard_handler,
}
#else /* not DOSX_USE_INT_INTERCEPT */
#ifndef DOSX_PM_HANDLER_UNTOUCHED
- if (!under_QEMM_386_p ())
{
extern void DOSX_scheme_system_isr (void);
void * trampoline;
#else /* not 0 */
-#if 0
- printf ("Allocating DOS block.\n");
-#endif
+
+ Dprintf ("Allocating DOS block.\n");
if ((DOSX_allocate_DOS_block (RM_ISR_TOTAL_SIZE, &new_handler.x.seg))
!= DOS_SUCCESS)
{
int saved_errno = errno;
-#if 0
- printf ("Failed allocating DOS block.\n");
-#endif
+
+ Dprintf ("Failed allocating DOS block.\n");
+
free (RM_handler);
errno = saved_errno;
return (DOS_FAILURE);
}
new_handler.x.off = 0;
-#if 0
- printf ("Allocated DOS memory.\n");
-#endif
+ Dprintf ("Allocated DOS memory.\n");
/* This assumes that the bottom 1 Mb of memory is mapped to the DOS
memory, so it can be accessed directly.
RM_handler,
RM_ISR_TOTAL_SIZE);
-#if 0
- printf ("memcpy'd.\n");
-#endif
+ Dprintf ("memcpy'd.\n");
if ((DOSX_RM_setvector (DOS_INTVECT_SYSTEM_SERVICES, new_handler.fp))
!= DOS_SUCCESS)
{
-#if 0
- printf ("Failed to install real mode handler.\n");
-#endif
+
+ Dprintf ("Failed to install real mode handler.\n");
DOSX_free_DOS_block (new_handler.x.seg);
fflush (stdout);
}
DOSX_RM_segment = new_handler.x.seg;
-#if 0
- printf ("Installed real mode handler.\n");
-#endif
+
+ Dprintf ("Installed real mode handler.\n");
#endif /* 0 */
static int
DOSX_restore_kbd_hook (void)
{
+ if (!DOSX_install_kbd_hook_p()) return DOS_FAILURE;
+
#ifdef DOSX_USE_INT_INTERCEPT
(void) int_restore (DOS_INTVECT_SYSTEM_SERVICES);