> how should a KEYB scancode->keycode driver react to copdepage
> changes, and how are these communictated?

Well, first of all the keyboard driver should detect the current Code Page on 
installation and not just assume one.  And, the KEYB program should work with 
multiple code pages when it can.  If DISPLAY.SYS is installed, you can use INT 
2F.AD00 and INT 2F.AD02 to detect the current Code Page.  If DISPLAY.SYS is not 
installed, you can use INT 21.6601.  If neither of these work, you should 
assume code page 437 (which is the default on most systems).

DISPLAY.SYS calls INT 2F.AD81h when the Code Page is changed to inform KEYB so 
it can change its mapping.

> why would any other TSR need insight into KEYB installed/not
> installed state or a pointer to private tables?

Unless the tables are in a "public" format, the data contained in the tables is 
irrelevant.  E.g., MS KEYB and FreeDOS KEYB tables do not use the same format.  
I'm not sure about any of the other DOS's out there, but wouldn't necessarily 
expect them to be the same as MS.

The reason that other TSR's (at least mine) may need to know what the keyboard 
mapping looks like is because they need to do an "ASCII-to-Scancode" lookup.  
That is, the program allows the user to provide an ASCII code as an input 
parameter (since ASCII is far easier for the user to enter than a scancode), 
but the program itself uses the scancode.

My SCANCODE program, e.g., "types" scancodes automatically (it is useful for 
creating "macros"), but the user can tell SCANCODE what to "type" with ASCII 
codes.  To do this, SCANCODE needs to know what scancode(s) to type (what 
physical key(s) on the keyboard to press) to generate the ASCII code the user 
wants to see.  For example, if you tell SCANCODE to type a "Z" it will press 
the shift-key, press the "z", release the "z", then release the shift-key.  
But, it needs to know where the Z key is on the keyboard to do that, and the Z 
key is in different places (different scancodes) depending on the keyboard 
layout and, in some cases, the code page.  So, it has internal tables of a 
bunch of different keyboard layouts so it knows how to "type" the different 
ASCII characters.  It would be nice if SCANCODE could somehow "ask" the KEYB 
program what its tables look like, but that's not really feasible.  I realize 
you may think "typing" scancodes may be a "silly" thing to do, but there are 
cases where it works and ASCII codes do not (e.g., SCANCODE is able to "type" 
into older DOS-based versions of Windows, and can actually "type" things like 
PrintScreen or Pause or the multimedia keys or the Sleep/WakeUp/ShutDown keys 
that some keyboards have).

Another kind of TSR that needs to know is a TSR that has some sort of "hot-key" 
to enter into the TSR as it is running to make configuration changes.  My CLOCK 
and SERIAL programs do this.  TSR's usually (though not always) monitor scan 
codes for hot-keys rather than ASCII codes, but the user usually enters the 
hot-key as an ASCII code.  The current versions of CLOCK and SERIAL simply 
assume the keyboard is a standard US QWERTY layout, but I'm in process of 
changing them to be "keyboard-layout aware").  To do this, they need to know 
the current keyboard layout so they can do the "ASCII-to-Scancode" lookup using 
the internal tables.  If the KEYB program doesn't identify itself using INT 
2F.AD80, the TSR's don't know what the current keyboard layout is, and the user 
will get frustrated because the keys they are supposed to press on the keyboard 
are in the wrong places.

What this boils down to is making it easier on the user, trying to make things 
as "automatic" as possible, even though it can make it MUCH harder on the 
programmer.

BTW, this brings up another issue I've been trying to figure out regarding 
keyboard layouts.  There are two different parts to the keyboard layout 
identification -- there is a two-letter code (for example, US = United States), 
but most keyboards also have a code number to go along with that (for the US 
keyboard, it is 103).  But there are also cases where the there is more than 
one keyboard layout for the same two-letter code.  An example of this is 
Bulgaria (BG) which has three different layouts with three different numbers 
(103, 241, & 442) even though they are all "BG".  Unfortunately, the standard 
KEYB interface (which MKEYB doesn't use) only tells you the "BG" part and 
doesn't tell you the number part.

Does anybody know of a way to automatically/programmatically determine the 
number part of the keyboard ID from KEYB?


_______________________________________________
Freedos-user mailing list
Freedos-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-user

Reply via email to