Add a primitive to disable/change translations by the interrupt
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Mon, 25 May 1992 16:20:10 +0000 (16:20 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Mon, 25 May 1992 16:20:10 +0000 (16:20 +0000)
handler.

v7/src/microcode/doskbd.c
v7/src/microcode/prdosenv.c

index fcdfa33f5009c8b34bb3bd6ef360b7cad72e460f..76ad37eeeb933ada1e9fb7fdf3167dd021dba98e 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/doskbd.c,v 1.4 1992/05/13 16:49:24 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/doskbd.c,v 1.5 1992/05/25 16:19:34 jinx Exp $
 
 Copyright (c) 1992 Massachusetts Institute of Technology
 
@@ -1303,3 +1303,63 @@ dos_set_kbd_modifier_mask (unsigned char new_mask)
 
   return (old_mask);
 }
+\f
+extern int EXFUN (dos_set_kbd_translation,
+                 (unsigned, unsigned, unsigned char));
+
+#ifndef PADDED_PATTERN_SIZE
+#  define PADDED_PATTERN_SIZE 0
+#endif
+
+#ifndef RM_ISR_TABLE_SIZE
+#  define RM_ISR_TABLE_SIZE 0
+#endif
+
+int
+dos_set_kbd_translation (unsigned shift_p,
+                        unsigned scan_code,
+                        unsigned char new)
+{
+  unsigned char old;
+  unsigned char * table;
+  unsigned offset;
+
+  if (scan_code >= (sizeof (shifted_scan_code_to_ascii)))
+    return (-1);
+
+  if (shift_p != 0)
+  {
+    table = &shifted_scan_code_to_ascii[0];
+    offset = PADDED_PATTERN_SIZE;
+  }
+  else
+  {
+    table = &unshifted_scan_code_to_ascii[0];
+    offset = (PADDED_PATTERN_SIZE + RM_ISR_TABLE_SIZE);
+  }
+  old = table[scan_code];
+  table[scan_code] = new;
+                              
+
+#ifdef DPMI_RM_HANDLER_REAL
+
+  if (DPMI_RM_selector != 0)
+    farcpy ((offset + scan_code),
+           DPMI_RM_selector,
+           ((unsigned) (& table[scan_code])),
+           (getDS ()),
+           1);
+
+#endif /* DPMI_RM_HANDLER_REAL */
+
+#ifdef DOSX_RM_HANDLER_REAL
+
+  if (DOSX_RM_segment != 0)
+    (* ((unsigned char *)
+       ((((unsigned long) DOSX_RM_segment) << 4) + offset)))
+      = new;
+
+#endif /* DOSX_RM_HANDLER_REAL */
+
+  return (old);
+}
index c420cc6d0260022ee3ff94247bc03df4a5c580f7..e922cfb6c792681994f244d7814973f30e340888 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/prdosenv.c,v 1.2 1992/05/13 16:50:13 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/prdosenv.c,v 1.3 1992/05/25 16:20:10 jinx Exp $
 
 Copyright (c) 1992 Massachusetts Institute of Technology
 
@@ -142,3 +142,21 @@ DEFINE_PRIMITIVE ("DOS-SET-KEYBOARD-MODIFIER-MASK!", Prim_dos_set_kbd_mod_mask,
                     (dos_set_kbd_modifier_mask ((unsigned char)
                                                 (arg_integer (1))))));
 }
+
+DEFINE_PRIMITIVE ("DOS-SET-KEYBOARD-TRANSLATION!",
+                 Prim_dos_set_keyboard_translation,
+                 3, 3, 0)
+{
+  int result;
+  extern int EXFUN (dos_set_kbd_translation,
+                   (unsigned, unsigned, unsigned char));
+  PRIMITIVE_HEADER (3);
+  
+  result = (dos_set_kbd_translation (((unsigned) (arg_integer (1))),
+                                    ((unsigned) (arg_integer (2))),
+                                    ((unsigned char) (arg_integer (3)))));
+  if (result < 0)
+    error_bad_range_arg (2);
+
+  PRIMITIVE_RETURN (long_to_integer ((long) result));
+}