From 8c8b97cea468268d0cb59559e1205a25dec3a63c Mon Sep 17 00:00:00 2001 From: "Guillermo J. Rozas" Date: Mon, 25 May 1992 16:20:10 +0000 Subject: [PATCH] Add a primitive to disable/change translations by the interrupt handler. --- v7/src/microcode/doskbd.c | 62 ++++++++++++++++++++++++++++++++++++- v7/src/microcode/prdosenv.c | 20 +++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/v7/src/microcode/doskbd.c b/v7/src/microcode/doskbd.c index fcdfa33f5..76ad37eee 100644 --- a/v7/src/microcode/doskbd.c +++ b/v7/src/microcode/doskbd.c @@ -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); } + +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); +} diff --git a/v7/src/microcode/prdosenv.c b/v7/src/microcode/prdosenv.c index c420cc6d0..e922cfb6c 100644 --- a/v7/src/microcode/prdosenv.c +++ b/v7/src/microcode/prdosenv.c @@ -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)); +} -- 2.25.1