This request changes the device driver resident code page for the system and updates the zero entry of the Code Page Control Block.
Note 1
The AccentFlags field of the KeyDef record has seven flags that are individually set if a corresponding entry in the accent table applies to this scan code. If the key pressed immediately before the current one was an accent key and the bit for that accent is set in the AccentFlags field for the current key, the corresponding AccentTable entry is searched for the replacement character value to use. If no replacement is found and bit 6 of the XlateFlags1 field is set, the not-an-accent beep is sounded and the accent character and current character are passed as two separate characters. Also see Note 8.
Note 2
The KeyType field of the KeyDef record currently has the following values defined. The remaining values up to 1Fh are undefined. The effect of each type of shift is defined below. Except where otherwise noted, when no shifts are active, Char1 is the translated character. (See Note 3.) Notice that any of the Alt, Alt+Char, Alt+Shift, or Alt+Gr keys (or all of them) can be present on a keyboard based on the AltGrafL and AltGrafR bits in the XTableFlags1 flag WORD in the table header.
01h
Shift
Shift
Shift
Shift
Shift
Shift
Shift
Shift
Shift
Shift
Note: Key types 0Ch - 13h set Char1 and Char2 to mask values as defined in Note 6.
0Ch
Shift
Shift
Shift
Note 3
Undefined Character Code. Any key combination that does not fall into any of the defined categories. For example, the Ctrl key pressed along with a key that has no defined control mapping is mapped to the value 0, and the key type is set in the KeyPacket record indicating undefined translation. The KeyPacket record passed to the monitors, if installed, contain the original scan code in the ScanCode field and the 0 in the Character field for this key. Notice that no character data records with an undefined character code are placed in the keyboard input buffer.
Note 4
Ctrl Key. The six possible situations that can occur when a key is pressed with only the Ctrl+shift key are shown below:
Ctrl- Mapping Code Name Ctrl- Mapping Code Name ----- ------- --------- ----- ------- --------- a 1 SOH n 14 SO b 2 STX o 15 SI c 3 ETX p 16 DLE d 4 EOT q 17 DC1 e 5 ENQ r 18 DC2 f 6 ACK s 19 DC3 g 7 BEL t 20 DC4 h 8 BS u 21 NAK i 9 HT v 22 SYN j 10 LF w 23 ETB k 11 VT x 24 CAN l 12 FF y 25 EM m 13 CR z 26 SUB
Notice that any key defined as AlphaKey uses the Char1 code value minus 96 (ASCII code for a) plus 1 to set the mapping shown above. Any scan code defined as AlphaKey must assign to Char1 one of the allowed lower case letters.
Scan US Kbd Mapped Name of Code Legend Value New Code ---- ------ ------ -------- 3 2 @ 0 Null 7 6 ^ 30 RS 12 - _ 31 US (see Note below) 26 [ { 27 Esc 27 ] } 29 GS 43 \ | 28 FS
Note: The mapping for the hyphen character (-) is the one exception. The scan code for it is ignored; only the ASCII code for hyphen (decimal 45) is looked for in Char1 when mapping the Ctrl+- combination. This is because there can be more than one occurrence of the hyphen (-) key on the keyboard. The Ctrl+- (PadKey minus) combination produces character/scan code values of 00/8Eh, respectively.
Ctrl+Enter = LF(010) Ctrl+Backspace = Del(127)
Note 5
PadKey. The pad keys have several uses that depend on various shift states. Some of them are based on their position on the keyboard. Because keyboard layouts change, the hard-coded assumed positions of the keypad keys, with the offset value that must be coded into Char1, are defined below. Any remapping must use the Char1 values shown below for the keys that correspond to the pad keys given by the Legend or Char2 values:
US Kbd Scan Char1 Char2 Legend Code Required US Kbd With Ctrl ------- ---- --------- ------- ----------- Home 7 71 Decimal 0 ASCII 7 Decimal 119 Up 8 72 " 1 " 8 " 141 PgUp 9 73 " 2 " 9 " 132 - 74 " 3 " - " 142 Left 4 75 " 4 " 4 " 115 5 76 " 5 " 5 " 143 Right 6 77 " 6 " 6 " 116 + 78 " 7 " + " 144 End 1 79 " 8 " 1 " 117 Down 2 80 " 9 " 2 " 145 PgDn 3 81 " 10 " 3 " 118 Ins 0 82 " 11 " 0 " 146 Del . 83 " 12 " . " 147
Notice that when Num Lock is off, or if Shift is active and Num Lock on, the code returned is the extended code. The code returned corresponds to the Legends above (Home, PgUp, and so forth). When Num Lock is on, or if Shift is active and Num Lock is off, the code returned is Char2. Notice that the + and - keys also return Char2 when the shift key is down.
When the Alt key is used with the PadKeys, the absolute value of the pressed key (looked up using the required Char1 value) is added to the accumulated value of any of the previous numeric keys pressed, without releasing the Alt key. Before adding the new number to the accumulated value, that accumulation is multiplied by ten, with overflow beyond 255 ignored. When Alt is released, the accumulation becomes a Character code and is passed along with a scan code of zero. Notice that if any key other than the 10 numeric keys is pressed, the accumulated value is reset to zero. When the keypad *, -, or + keys are pressed while the Alt key is down, the extended characters 55, 74, and 78 (decimal) are returned, respectively.
When AltGraphics is used with the PadKeys, the Char3 value is returned if it is nonzero, and if an AltGraf bit is set in XTableFlags1; otherwise, it is treated the same as the Alt key.
On the Enhanced keyboard, the secondary keypad keys return, as an extended character, the scan code of the key plus 80 (decimal) when pressed in conjunction with the Alt key. The secondary / key returns an extended character of 164, when pressed in conjunction with the Alt key.
Note 6
State Key. Each state key entry has Char1, Char2, and Char3 defined as follows:
The masks are shown below (numbers are in hex):
Key Char1 Char2 Char3 ----------- ----- ----- ----- Right Shift 01 00 00 Left Shift 02 00 00 Ctrl Shift 04 01 04 Alt Shift 08 02 08 Scroll Lock 10 10 10 Num Lock 20 20 20 Caps Lock 40 40 40 SysReq 00 80 80
Notice that the INS key is not treated as a state key, but as a pad key. Also, SysReq is included here because it is treated as a shift key.
Note 7
Alt Character. Most of the keys defined in a category that allows the Alt key (AlphaKey, SpecKeyA, SpecKeyCA) return a value called an extended character. This value is a character code of 00H or E0H, with a second byte (using the ScanCode field of the CharData record) defining the extended code. In most cases, this value is the scan code of the key. Since the legend on these keys can be remapped on a foreign language keyboard, the Alt-based extended code is hard to define in a general sense. The following rules are used:
Scan US Kbd Alt Scan US Kbd Alt Code Legend Value Code Legend Value ---- ------ ----- ---- ------ ----- 2 1 ! 120 15 Tab 165 3 2 @ 121 26 [ { 26 4 3 # 122 27 ] } 27 5 4 $ 123 28 Enter 28 6 5 % 124 39 ; : 39 7 6 ^ 125 40 ' " 40 8 7 & 126 41 ' ~ 41 9 8 * 127 43 \ | 43 (equals W.T.C. key number 42) 10 9 ( 128 51 , < 51 11 0 ) 129 52 . > 52 12 - _ 130 53 / ? 53 13 = + 131
The secondary / key returns an extended character of 164 when pressed while Alt is down.
When AltGraphics is used, the Char3 value is returned if it is nonzero and if an AltGraf bit is set in XTableFlags1. Otherwise, it is treated the same as the Alt key.
Note 8
Accent Key. When an accent key is pressed with Ctrl or Alt, it is treated as a regular key. The character it translates to is the one in the CtlAccent or AltAccent field of the AccentEntry pointed to by the Char5 value of the KeyDef. If the key being defined has no defined value with Ctrl or Alt, it should have zeros in the field of the undefined combination.
When an accent key is pressed by itself (or with Right Shift, Left Shift, or AltGraphics), it is not translated immediately. The Char1 (or Char2, when Left or Right Shift or AltGraphics is used) index in the KeyDef record is used with the next key received to check if the next key has an accent mapping. If that next key has no mapping for this accent (that is, if it has no bit set in its AccentFlags), or if that next key is not found in this accent's AccentEntry, then the character value in the NonAccent field of the AccentEntry is used as the character to display. It is followed by the translation of that next key after the not-an-accent beep is sounded.
Notice that if a key doesn't change when a Left or Right Shift key is pressed, it should use the same value for Char1 and Char2 so the accent applies in both the shifted and nonshifted cases. If the accent value is undefined when used with a shift key or AltGraphics, the value in Char2 or Char3 should be 0.
Any accent key that doesn't have an Alt or Ctrl mapping should put zeros in the AltAccent and CtlAccent fields of its AccentEntry. If the value in the table is between 1 and 7, then the key is considered an accent key and further accent key processing is indicated. See Note 1 for more information.
Note 9
Extended State Key. For special Country support, the keyboard device driver maintains another byte of shift status. Key types 12h and 13h are provided for manipulation of that byte. The other fields of the KeyDef are:
For example, Char1 or Char2 can define single shift status bits to set/clear/toggle. Char2 can be a set of coded bits, delineated by Char1, that are set to a numeric value when the key is pressed and cleared to zero when released (or on the next press, if toggled). The whole byte can be set to Char2 when Char1 has all bits on.
Note 10
Space Key. The key treated as the space character should have a flag set in its AccentFlags field for each possible accent (that is, for each defined AccentEntry in the AccentTable). And each AccentEntry should have the Space character defined as one of its accented characters, with the translation having the same value as the accent character itself. The reason for this is that, by definition, an Accent Key followed by the space character maps to the accent character alone. If the table is not set up as just described, a not-an-accent beep is sounded whenever the accent key followed by a space is pressed.
Notice that the space key is defined as a SpecKeyA (type 4) because its use, in conjunction with the Alt key, is allowed. In this case, and when used with the Ctrl key, it returns the ASCII space character. This works correctly, except in the case of the diaresis accent (double-dot) in code page 437. The space is treated as an invalid character and the beep result occurs, with the diaresis represented by double quotation marks. The characters displayed depend upon the language in effect when the invalid diaresis is encountered. For some languages, the character substituted is the double-quotation marks; for others, the character used is the F9h character.
Note 11
KbdType identifies the hardware-specific keyboard used by this table. The values and allowable types are the same as those specified in KBD_GETKEYBDTYPE.
Note 12
The DefaultTable flag in XtableFlags1 is used by the KEYB utility in loading code pages when changing from one language to another. It identifies the default code page to KEYB, should KEYB not find one or both CODEPAGE= defined code pages.
Note 13
The Language IDs and Subcountry IDs used are as follows:
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿³Keyboard Layout ³Keyboard Layout ³Country ³ ³Country Code ³SubCountry Code ³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ AR ³ 785 ³Arabic-speaking ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ BE ³ 120 ³Belgium ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ CF ³ 058 ³Canadian-French ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ CS ³ 243 ³Czech Republic ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ CS ³ 245 ³Czech Republic ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ DK ³ 159 ³Denmark ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ SU ³ 153 ³Finland ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ FR ³ 120 ³France ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ FR ³ 189 ³France ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ GR ³ 129 ³Germany ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ HE ³ 972 ³Hebrew-speaking ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ HU ³ 208 ³Hungary ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ IS ³ 197 ³Iceland ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ IT ³ 141 ³Italy ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ IT ³ 142 ³Italy ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ LA ³ 171 ³Latin-American ³ ³ ³ ³Spanish ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ NL ³ 143 ³Netherlands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ NO ³ 155 ³Norway ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ PL ³ 214 ³Poland ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ PO ³ 163 ³Portugal ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ SP ³ 172 ³Spain ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ SV ³ 153 ³Sweden ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ SF ³ 150F ³Swiss-French ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ SG ³ 150G ³Swiss-German ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ TR ³ 179 ³Turkey ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ UK ³ 166 ³United Kingdom ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ UK ³ 168 ³United Kingdom ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ US ³ 103 ³United States ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ YU ³ 234 ³Former Yugoslavia ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Note 14
Keytype 15. When the Alt or Alt+Shift keys are pressed, both XlatedChar and XlatedScan in the CharData record will have the same value.
Note 15
If the Charx value is in the range of 1-7, then Charx identifies an accent key. Otherwise, Charx is treated as a valid ASCII character. This does not apply to Ctrl+Charx sequences.
Note 16
If Alt+Gr, Alt+Shift, or Alt+Ctrl are pressed, and Char3 is 0, the Alt key is used to translate to a valid result.
Note 17
The * key on the keypad of the Enhanced keyboard, although producing the same scan code/character as that of the IBM Personal Computer AT* keyboard, is treated differently because a dedicated Print Screen key exists on the Enhanced keyboard. The following scan codes/characters are returned by the physical keyboard device driver for the Enhanced keyboard * key on the keypad:
Unshifted
Note 18
Size. The code page described here has the following dimensions:
Xlate Header = 40 127 KeyDefs @ 7 bytes = 889 7 AccentEntries @ 46 bytes = 322 ---- 1251 bytes
If more than 6 AccentEntries are needed, then the following format is used: In the first 6 AccentEntries, the length is set at 20, with unused elements set to zero. For each AccentEntry of 7 and greater, up to 120 element pairs may exist, and the length is dynamic.
For each AccentEntry of 7 and greater, the first byte in the record will contain the LENGTH of the AccentEntry record. The LENGTH value is defined as the total length in bytes of the AccentEntry record including the LENGTH byte.
The record is defined as follows:
AccEnt <l,a,b,c,d,e,f,c1,s1,c2,s2..c120,s120> where.... l is the total length in bytes of the AccEnt including itself. a &b are the scan code &char to use when the key following this accent is not affected by the accent so the accent itself must be used. c &d are the scan code &char to use when Ctl+[accent] is pressed. e &f do the same for Alt+[accent]. c1,s1 - c120,s120 are the char/scan code mapping for accented translation.
Adding more than 7 accents will make the standard 1251-byte table an extended variable size.