INF: How to Modify the Keyboard-Flags Byte from a C Program

ID Number: Q71832

4.00 5.00 5.10 6.00 6.00a 6.00ax 7.00

MS-DOS

Summary:

The following information, which may be used with Microsoft C and

QuickC, describes how to access the keyboard-flags byte in the ROM

BIOS data area from a C program. This procedure allows a keyboard key,

such as INS (insert) or CAPS LOCK, to be set or cleared from within a

program. Note that the methods described below can be used to access

any particular memory location (not just the keyboard flags).

More Information:

At 0000:0417H in the ROM BIOS data area there is a byte that contains

information pertaining to the status of several keyboard keys. The

following table lists each bit and its meaning when set:

Bit No. Decimal Value Meaning If Set

------- ------------- --------------

0 1 Right SHIFT key depressed

1 2 Left SHIFT key depressed

2 4 CTRL key depressed

3 8 ALT key depressed

4 16 SCROLL LOCK on

5 32 NUM LOCK on

6 64 CAPS LOCK on

7 128 INS on

The first step in reading or modifying this data from a C program is

to declare a pointer to the byte that contains the keyboard flags. For

example:

char far * flags = (char far *)0x00000417L;

Once you have a pointer to the correct address, you can determine if a

particular flag is set by doing a bitwise-and with the decimal value

of the bit that represents the flag. For example, consider the

following conditional expression:

if ( (*flags & 64) == 0 )

printf("The CAPS LOCK key is not on.\n");

If the CAPS LOCK key is on, the result of the bitwise-and is 64.

To turn off a particular flag, you must do a bitwise-and with the

one's complement of the flag's value (that is, ~flag). For example,

you can turn off the CAPS LOCK key as follows:

*flags = (char)(*flags & ~64);

To turn on a particular flag, perform a bitwise-or with the decimal

bit value of the flags you want to turn on. For instance, the

following is an example of turning on the CAPS LOCK key:

*flags = (char)(*flags | 64);

Much of this information is outlined in the Microsoft Press book

"Advanced MS-DOS Programming" by Ray Duncan.

The following sample program turns on the CAPS LOCK key and prompts

for some keyboard entry to demonstrate that CAPS LOCK is really set.

Sample Code

-----------

/* Compile options needed: none

*/

#include <stdio.h>

void main(void);

void main()

{

char far *flags = (char far *)0x00000417L;

char string[10];

*flags = (char)((*flags) | 64);

printf("\nType something, it should be in CAPS: ");

gets(string);

*flags = (char)(*flags & ~64);

}

Additional reference words: 4.0 5.0 5.1 6.00 6.00a 6.00ax 7.00 2.0

2.00 2.01 2.5 2.50 2.51