diff options
Diffstat (limited to 'v4.0/src/CMD/KEYB/KEYBCMD.ASM')
| -rw-r--r-- | v4.0/src/CMD/KEYB/KEYBCMD.ASM | 2072 |
1 files changed, 2072 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/KEYBCMD.ASM b/v4.0/src/CMD/KEYB/KEYBCMD.ASM new file mode 100644 index 0000000..57033f3 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBCMD.ASM | |||
| @@ -0,0 +1,2072 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS - KEYB Command - Transient Command Processing | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (C) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYBCMD.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Contains transient command processing modules for KEYB command. | ||
| 15 | ;; | ||
| 16 | ;; Documentation Reference: | ||
| 17 | ;; ------------------------ | ||
| 18 | ;; PC DOS 3.3 Detailed Design Document - May ?? 1986 | ||
| 19 | ;; | ||
| 20 | ;; Procedures contained in this file: | ||
| 21 | ;; ---------------------------------- | ||
| 22 | ;; KEYB_COMMAND: Main routine for command processing. | ||
| 23 | ;; PARSE_PARAMETERS: Validate syntax of parameters included | ||
| 24 | ;; on command line. | ||
| 25 | ;; BUILD_PATH: Find KEYBOARD.SYS file and validate language and/or | ||
| 26 | ;; code page. | ||
| 27 | ;; INSTALL_INT_VECTORS: Install our INT 9, INT 2F, INT48 Drivers | ||
| 28 | ;; REMOVE_INT_VECTORS: Remove our INT 9, INT 2F, INT48 Drivers | ||
| 29 | ;; NUMLK_ON: Turn on the NUM LOCK LED | ||
| 30 | ;; FIND_FIRST_CP: Determine first code page for given language in the | ||
| 31 | ;; Keyboard Definition file. | ||
| 32 | ;; | ||
| 33 | ;; Include Files Required: | ||
| 34 | ;; ----------------------- | ||
| 35 | ;; KEYBMSG.INC | ||
| 36 | ;; KEYBEQU.INC | ||
| 37 | ;; KEYBSYS.INC | ||
| 38 | ;; KEYBI9C.INC | ||
| 39 | ;; KEYBI9.INC | ||
| 40 | ;; KEYBI2F.INC | ||
| 41 | ;; KEYBI48.INC | ||
| 42 | ;; KEYBSHAR.INC | ||
| 43 | ;; KEYBDCL.INC | ||
| 44 | ;; KEYBTBBL.INC | ||
| 45 | ;; COMMSUBS.INC | ||
| 46 | ;; KEYBCPSD.INC | ||
| 47 | ;; POSTEQU.INC | ||
| 48 | ;; DSEG.INC | ||
| 49 | ;; | ||
| 50 | ;; External Procedure References: | ||
| 51 | ;; ------------------------------ | ||
| 52 | ;; FROM FILE KEYBTBBL.ASM: | ||
| 53 | ;; TABLE_BUILD - Create the shared area containing all keyboard tables. | ||
| 54 | ;; STATE_BUILD - Build all states within the table area | ||
| 55 | ;; FROM FILE KEYBMSG.ASM: | ||
| 56 | ;; KEYB_MESSAGES - All messages | ||
| 57 | ;; | ||
| 58 | ;; Change History: | ||
| 59 | ;; | ||
| 60 | ;; Revised for DOS 4.00 - NickS | ||
| 61 | ;; A000 - WilfR | ||
| 62 | ;; AN002- DCR ???? -KEYBAORD SECURITY LOCK - CNS | ||
| 63 | ;; | ||
| 64 | ;; | ||
| 65 | ;; an003 PTM 3906 - KEYB messages do not conform | ||
| 66 | ;; to spec. Error message does | ||
| 67 | ;; 3/24/88 not pass back the bogus command | ||
| 68 | ;; line argument. - CNS | ||
| 69 | ;; | ||
| 70 | ;; | ||
| 71 | ;; | ||
| 72 | ;; | ||
| 73 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 74 | ;; | ||
| 75 | PUBLIC KEYB_COMMAND ;; | ||
| 76 | ;; | ||
| 77 | ;*****************CNS******************** | ||
| 78 | PUBLIC ID_TAB_OFFSET ;AN000; | ||
| 79 | ;*****************CNS******************** | ||
| 80 | PUBLIC CP_TAB_OFFSET ;; | ||
| 81 | PUBLIC STATE_LOGIC_OFFSET ;; | ||
| 82 | PUBLIC SYS_CODE_PAGE ;; | ||
| 83 | PUBLIC KEYBCMD_LANG_ENTRY_PTR ;; | ||
| 84 | PUBLIC DESIG_CP_BUFFER ;; | ||
| 85 | PUBLIC DESIG_CP_OFFSET ;; | ||
| 86 | PUBLIC KEYBSYS_FILE_HANDLE ;; | ||
| 87 | PUBLIC NUM_DESIG_CP ;; | ||
| 88 | PUBLIC TB_RETURN_CODE ;; | ||
| 89 | PUBLIC FILE_BUFFER ;; | ||
| 90 | PUBLIC FILE_BUFFER_SIZE | ||
| 91 | PUBLIC FB ;; | ||
| 92 | ;*****************CNS******************** | ||
| 93 | PUBLIC ID_PTR_SIZE ;AN000; | ||
| 94 | PUBLIC LANG_PTR_SIZE ;AN000; | ||
| 95 | PUBLIC CP_PTR_SIZE ;AN000; | ||
| 96 | PUBLIC NUM_ID ;AN000; | ||
| 97 | PUBLIC NUM_LANG ;AN000; | ||
| 98 | PUBLIC NUM_CP ;AN000; | ||
| 99 | PUBLIC SHARED_AREA_PTR ;; | ||
| 100 | ;*****************CNS******************** | ||
| 101 | PUBLIC SD_SOURCE_PTR ;; | ||
| 102 | PUBLIC TEMP_SHARED_DATA ;; | ||
| 103 | ;; | ||
| 104 | PUBLIC FOURTH_PARM ;AN000; ;AN000 | ||
| 105 | PUBLIC ONE_PARMID ;AN000; ;AN000 | ||
| 106 | PUBLIC FTH_PARMID ;AN000; ;AN000 | ||
| 107 | PUBLIC ID_FOUND ;AN000; ;AN000 | ||
| 108 | PUBLIC BAD_ID ;AN000; ;AN000 | ||
| 109 | PUBLIC ALPHA ;AN000; ;AN000 | ||
| 110 | EXTRN PARSE_PARAMETERS:NEAR ;AN000; ;AN000 | ||
| 111 | ;***CNS | ||
| 112 | EXTRN SECURE_FL:BYTE ;an002; | ||
| 113 | EXTRN CUR_PTR:WORD ;an003; | ||
| 114 | EXTRN OLD_PTR:WORD ;an003; | ||
| 115 | EXTRN ERR_PART:WORD ;an003; | ||
| 116 | ;***CNS | ||
| 117 | .xlist | ||
| 118 | INCLUDE STRUC.INC ;AN000;;; WGR structured macros ;AN000 | ||
| 119 | INCLUDE SYSMSG.INC ;AN000;;; WGR message retriever ;AN000 | ||
| 120 | .list | ||
| 121 | ;; | ||
| 122 | MSG_UTILNAME <KEYB> ;AN000;;; WGR identify to message retriever ;AN000 | ||
| 123 | ;; | ||
| 124 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 125 | ;; | ||
| 126 | .xlist ;; | ||
| 127 | INCLUDE KEYBEQU.INC ;; | ||
| 128 | INCLUDE KEYBSYS.INC ;; | ||
| 129 | INCLUDE KEYBI9.INC ;; | ||
| 130 | INCLUDE KEYBI9C.INC ;; | ||
| 131 | INCLUDE KEYBI2F.INC ;; | ||
| 132 | INCLUDE KEYBI48.INC ;; | ||
| 133 | INCLUDE KEYBSHAR.INC ;; | ||
| 134 | INCLUDE KEYBDCL.INC ;; | ||
| 135 | INCLUDE KEYBTBBL.INC ;; | ||
| 136 | INCLUDE COMMSUBS.INC ;; | ||
| 137 | INCLUDE KEYBCPSD.INC ;; | ||
| 138 | .xlist | ||
| 139 | INCLUDE POSTEQU.INC ;; | ||
| 140 | INCLUDE DSEG.INC ;; | ||
| 141 | ;; | ||
| 142 | .list | ||
| 143 | ASSUME CS:CODE,DS:CODE ;; | ||
| 144 | ;; | ||
| 145 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 146 | ;; | ||
| 147 | ;; Module: KEYB_COMMAND | ||
| 148 | ;; | ||
| 149 | ;; Description: | ||
| 150 | ;; Main routine for transient command processing. | ||
| 151 | ;; | ||
| 152 | ;; Input Registers: | ||
| 153 | ;; DS - points to our data segment | ||
| 154 | ;; | ||
| 155 | ;; Output Registers: | ||
| 156 | ;; Upon termination, if an error has occurred in which a keyboard table | ||
| 157 | ;; was not loaded, the AL register will contain the a error flag. This | ||
| 158 | ;; flag is defined as follows: | ||
| 159 | ;; AL:= 1 - Invalid language, code page, or syntax | ||
| 160 | ;; 2 - Bad or missing Keyboard Definition File | ||
| 161 | ;; 3 - KEYB could not create a table in resident memory | ||
| 162 | ;; 4 - An error condition was received when communicating | ||
| 163 | ;; with the CON device | ||
| 164 | ;; 5 - Code page requested has not been designated | ||
| 165 | ;; 6 - The keyboard table for the requested code page cannot | ||
| 166 | ;; be found in resident keyboard table. | ||
| 167 | ;; | ||
| 168 | ;; Logic: | ||
| 169 | ;; IF KEYB has NOT been previously loaded THEN | ||
| 170 | ;; Set SHARED_AREA_PTR to TEMP_SHARED_AREA | ||
| 171 | ;; INSTALLED_KEYB := 0 | ||
| 172 | ;; Get HW_TYPE (set local variable) | ||
| 173 | ;; ELSE | ||
| 174 | ;; Set SHARED_AREA_PTR to ES:SHARED_AREA | ||
| 175 | ;; Get HW_TYPE (set local variable) | ||
| 176 | ;; Set TABLE_OK := 0 | ||
| 177 | ;; INSTALLED_KEYB := 1 | ||
| 178 | ;; | ||
| 179 | ;; IF CPS-CON has been loaded THEN | ||
| 180 | ;; INSTALLED_CON := 1 | ||
| 181 | ;; | ||
| 182 | ;;*********************************** CNS ************************************* | ||
| 183 | ;; Call PARSE_PARAMETERS := Edit ID or language, code page, | ||
| 184 | ;; and path parameters,ID on command line | ||
| 185 | ;;*********************************** CNS ************************************* | ||
| 186 | ;; Check all return codes: | ||
| 187 | ;; IF any parameters are invalid THEN | ||
| 188 | ;; Display ERROR message | ||
| 189 | ;; ELSE | ||
| 190 | ;; IF no language parm specified | ||
| 191 | ;; AND code page is not invalid | ||
| 192 | ;; AND syntax is valid THEN | ||
| 193 | ;; Process QUERY: | ||
| 194 | ;; IF KEYB is installed THEN | ||
| 195 | ;; Get and display active language from SHARED_DATA_AREA | ||
| 196 | ;; Get invoked code page from SHARED_DATA_AREA | ||
| 197 | ;; Convert to ASCII | ||
| 198 | ;; Display ASCII representation of code page, CR/LF | ||
| 199 | ;;*********************************** CNS ************************************* | ||
| 200 | ;; IF ALTERNATE FLAG SET | ||
| 201 | ;; Get and display active ID from SHARED_DATA_AREA | ||
| 202 | ;; Convert to ASCII | ||
| 203 | ;; Display ASCII representation of ID, CR/LF | ||
| 204 | ;;*********************************** CNS ************************************* | ||
| 205 | ;; IF CPS-CON is installed THEN | ||
| 206 | ;; Get selected code page info from CON | ||
| 207 | ;; Convert to ASCII | ||
| 208 | ;; Display ASCII representation of code page, CR/LF | ||
| 209 | ;; EXIT without staying resident | ||
| 210 | ;; | ||
| 211 | ;; ELSE | ||
| 212 | ;; Call BUILD_PATH := Determine location of Keyboard definition file | ||
| 213 | ;; Open the file | ||
| 214 | ;; IF error in opening file THEN | ||
| 215 | ;; Display ERROR message and EXIT | ||
| 216 | ;; ELSE | ||
| 217 | ;; Save handle | ||
| 218 | ;; Set address of buffer | ||
| 219 | ;; READ header of Keyboard definition file | ||
| 220 | ;; IF error in reading file THEN | ||
| 221 | ;; Display ERROR message and EXIT | ||
| 222 | ;; ELSE | ||
| 223 | ;; Check signature for correct file | ||
| 224 | ;; IF file signature is correct THEN | ||
| 225 | ;; READ language table | ||
| 226 | ;; IF error in reading file THEN | ||
| 227 | ;; Display ERROR message and EXIT | ||
| 228 | ;; ELSE | ||
| 229 | ;; Use table to verify language parm | ||
| 230 | ;; Set pointer values | ||
| 231 | ;; IF code page was specified | ||
| 232 | ;; READ language entry | ||
| 233 | ;; IF error in reading file THEN | ||
| 234 | ;; Display ERROR message and EXIT | ||
| 235 | ;; ELSE | ||
| 236 | ;; READ Code page table | ||
| 237 | ;; IF error in reading file THEN | ||
| 238 | ;; Display ERROR message and EXIT | ||
| 239 | ;; ELSE | ||
| 240 | ;; Use table to verify code page parm | ||
| 241 | ;; Set pointer values | ||
| 242 | ;; IF CPS-CON is not installed THEN | ||
| 243 | ;; Set number of code pages = 1 | ||
| 244 | ;; IF CODE_PAGE_PARM was specified THEN | ||
| 245 | ;; Copy CODE_PAGE_PARM into table of code pages to build | ||
| 246 | ;; ELSE | ||
| 247 | ;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file) | ||
| 248 | ;; Copy SYSTEM_CP into table of code pages to build | ||
| 249 | ;; ELSE | ||
| 250 | ;; Issue INT 2F ; 0AD03H to get table of Designated code pages | ||
| 251 | ;; Set number of designated code pages (HWCP + Desig CP) | ||
| 252 | ;; Issue INT 2F ; 0AD02H to get invoked code page | ||
| 253 | ;; IF CODE_PAGE_PARM was specified THEN | ||
| 254 | ;; Check that CODE_PAGE_PARM is in the list of designated code pages | ||
| 255 | ;; IF CODE_PAGE_PARM is in the list of designated code pages THEN | ||
| 256 | ;; Copy specified CP into table of code pages to build | ||
| 257 | ;; IF a CP has been selected AND is inconsistent with specified CP | ||
| 258 | ;; Issue WARNING message | ||
| 259 | ;; ELSE | ||
| 260 | ;; Display ERROR message | ||
| 261 | ;; ELSE | ||
| 262 | ;; IF a code page has been invoked THEN | ||
| 263 | ;; Copy invoked code page into table of code pages to build | ||
| 264 | ;; ELSE | ||
| 265 | ;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file) | ||
| 266 | ;; Copy SYSTEM_CP into table of code pages to build | ||
| 267 | ;; | ||
| 268 | ;; IF KEYB has not been previously installed THEN | ||
| 269 | ;; Call FIND_SYS_TYPE := Determine system type | ||
| 270 | ;; IF system type is PCjr THEN | ||
| 271 | ;; IF multilingual ROM is present THEN | ||
| 272 | ;; Set language code | ||
| 273 | ;; EXIT without staying resident | ||
| 274 | ;; Call INSTALL_INT_9 := Install INT 9 handler | ||
| 275 | ;; Call FIND_KEYB_TYPE := Determine the keyboard type | ||
| 276 | ;; | ||
| 277 | ;; Call TABLE_BUILD := Build the TEMP_SHARED_DATA_AREA | ||
| 278 | ;; | ||
| 279 | ;; IF return codes from TABLE_BUILD are INVALID THEN | ||
| 280 | ;; IF KEYB_INSTALLED := 0 THEN | ||
| 281 | ;; Call REMOVE_INT_9 | ||
| 282 | ;; Display corresponding ERROR message | ||
| 283 | ;; EXIT without staying resident | ||
| 284 | ;; ELSE | ||
| 285 | ;; IF any of the designated CPs were invalid in the build THEN | ||
| 286 | ;; Issue WARNING message | ||
| 287 | ;; Close the Keyboard definition file | ||
| 288 | ;; IF KEYB had NOT already been installed THEN | ||
| 289 | ;; IF keyboard is a Ferrari_G AND system is not an XT THEN | ||
| 290 | ;; Call NUMLK_ON := Turn the NUM LOCK LED on | ||
| 291 | ;; IF extended INT 16 support required THEN | ||
| 292 | ;; Install extended INT 16 support | ||
| 293 | ;; Call INSTALL_INT_9_NET := Let network know about INT 9 | ||
| 294 | ;; Call INSTALL_INT_2F_48 := Install the INT 2F and INT 48 drivers | ||
| 295 | ;; Activate language | ||
| 296 | ;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA | ||
| 297 | ;; EXIT but stay resident | ||
| 298 | ;; ELSE | ||
| 299 | ;; IF this was not a query call AND exit code was valid THEN | ||
| 300 | ;; Activate language | ||
| 301 | ;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA | ||
| 302 | ;; EXIT without staying resident | ||
| 303 | ;; END | ||
| 304 | ;; | ||
| 305 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 306 | ;; | ||
| 307 | INVALID_PARMS EQU 1 ;; EXIT return codes | ||
| 308 | BAD_KEYB_DEF_FILE EQU 2 ;; | ||
| 309 | MEMORY_OVERFLOW EQU 3 ;; | ||
| 310 | CONSOLE_ERROR EQU 4 ;; | ||
| 311 | CP_NOT_DESIGNATED EQU 5 ;; | ||
| 312 | KEYB_TABLE_NOT_LOAD EQU 6 ;; | ||
| 313 | BAD_DOS_VER EQU 7 ;AN000;;; WGR ;AN000 | ||
| 314 | ;; | ||
| 315 | EXIT_RET_CODE DB 0 ;; | ||
| 316 | ;******************** CNS *********** ;AN000;;; | ||
| 317 | ID_VALID EQU 0 ;AN000;;; | ||
| 318 | ID_INVALID EQU 1 ;AN000;;; | ||
| 319 | NO_ID EQU 2 ;AN000;;; | ||
| 320 | LANGUAGE_VALID EQU 0 ;AN000;;; | ||
| 321 | LANGUAGE_INVALID EQU 1 ;AN000;;; Return Codes | ||
| 322 | NO_LANGUAGE EQU 2 ;AN000;;; from | ||
| 323 | NO_IDLANG EQU 3 ;AN000;;; | ||
| 324 | ;******************** CNS *********** ;; | ||
| 325 | CODE_PAGE_VALID EQU 0 ;; EDIT_LANGUAGE_CODE | ||
| 326 | CODE_PAGE_INVALID EQU 1 ;; | ||
| 327 | NO_CODE_PAGE EQU 2 ;; | ||
| 328 | VALID_SYNTAX EQU 0 ;; | ||
| 329 | INVALID_SYNTAX EQU 1 ;;;;;;; | ||
| 330 | ;; | ||
| 331 | ACT_KEYB EQU 2 ;AC000;;; WGR ;AN000 | ||
| 332 | ACT_ID EQU 3 ;AC000;;; WGR ;AN000 | ||
| 333 | ACT_KEYB_CP EQU 4 ;AC000;;; WGR ;AN000 | ||
| 334 | ACT_CON_CP EQU 5 ;AC000;;; WGR ;AN000 | ||
| 335 | INV_L EQU 6 ;AC000;;; WGR message numbers... ;AN000 | ||
| 336 | INV_I EQU 7 ;AC000;;; WGR ;AN000 | ||
| 337 | INV_CP EQU 8 ;AC000;;; WGR ;AN000 | ||
| 338 | INV_S EQU 18 ;AC000;;; WGR ;AN000 | ||
| 339 | INV_FN EQU 9 ;AC000;;; WGR ;AN000 | ||
| 340 | INV_KEYB_Q EQU 10 ;AC000;;; WGR ;AN000 | ||
| 341 | INV_CON_Q EQU 11 ;AC000;;; WGR ;AN000 | ||
| 342 | NOT_DESIG EQU 12 ;AC000;;; WGR ;AN000 | ||
| 343 | NOT_SUPP EQU 13 ;AC000;;; WGR ;AN000 | ||
| 344 | NOT_VALID EQU 14 ;AC000;;; WGR ;AN000 | ||
| 345 | WARNING_1 EQU 15 ;AC000;;; WGR ;AN000 | ||
| 346 | INV_COMBO EQU 16 ;AC000;;; WGR ;AN000 | ||
| 347 | MEMORY_OVERF EQU 17 ;AC000;;; WGR ;AN000 | ||
| 348 | CR_LF DB 10,13,'$' ;; WGR ;AN000 | ||
| 349 | ;; | ||
| 350 | FOURTH_PARM DB 0 ;AN000;;; WGR switch was specified ;AN000 | ||
| 351 | ONE_PARMID DB 0 ;AN000;;; WGR id given as positional ;AN000 | ||
| 352 | FTH_PARMID DB 0 ;AN000;;; WGR id given as switch ;AN000 | ||
| 353 | ID_FOUND DB 0 ;AN000;;; WGR id was good (in k.d. file) ;AN000 | ||
| 354 | BAD_ID DB 0 ;AN000;;; WGR id was bad (from parse) ;AN000 | ||
| 355 | ALPHA DB 0 ;AN000;;; WGR first parm a language id ;AN000 | ||
| 356 | ;; | ||
| 357 | ID_DISPLAYED DB 0 ;AN000;;; WGR Indicating ID already displayed ;AN000 | ||
| 358 | ;; WGR ;AN000 | ||
| 359 | SUBLIST_NUMBER LABEL BYTE ;AN000;;; WGR sublist for numbers ;AN000 | ||
| 360 | DB 11 ;AN000;;; WGR size ;AN000 | ||
| 361 | DB 0 ;AN000;;; WGR ;AN000 | ||
| 362 | PTR_TO_NUMBER DW ? ;AN000;;; WGR offset ptr ;AN000 | ||
| 363 | SEG_OF_NUMBER DW ? ;AN000;;; WGR segment ;AN000 | ||
| 364 | DB 1 ;AN000;;; WGR ;AN000 | ||
| 365 | DB 10100001B ;AN000;;; WGR flag ;AN000 | ||
| 366 | DB 3 ;AN000;;; WGR max width ;AN000 | ||
| 367 | DB 1 ;AN000;;; WGR min width ;AN000 | ||
| 368 | DB " " ;AN000;;; WGR filler ;AN000 | ||
| 369 | ;AN000;;; WGR | ||
| 370 | ;AN000;;; WGR | ||
| 371 | SUBLIST_ASCIIZ LABEL BYTE ;AN000;;; WGR sublist for asciiz ;AN000 | ||
| 372 | DB 11 ;AN000;;; WGR size ;AN000 | ||
| 373 | DB 0 ;AN000;;; WGR ;AN000 | ||
| 374 | PTR_TO_ASCIIZ DW ? ;AN000;;; WGR offset ptr ;AN000 | ||
| 375 | SEG_OF_ASCIIZ DW ? ;AN000;;; WGR segment ;AN000 | ||
| 376 | DB 1 ;AN000;;; WGR ;AN000 | ||
| 377 | DB 00010000B ;AN000;;; WGR flag ;AN000 | ||
| 378 | DB 2 ;AN000;;; WGR max width ;AN000 | ||
| 379 | DB 2 ;AN000;;; WGR min width ;AN000 | ||
| 380 | DB " " ;AN000;;; WGR filler ;AN000 | ||
| 381 | ;AN000;;; WGR ;AN000 | ||
| 382 | NUMBER_HOLDER DW ? ;AN000;;; WGR used for message retriever ;AN000 | ||
| 383 | ;***CNS | ||
| 384 | SUBLIST_COMLIN LABEL BYTE ;an003;;; WGR sublist for asciiz ;AN000 | ||
| 385 | DB 11 ;an003;;; WGR size ;AN000 | ||
| 386 | DB 0 ;an003;;; WGR ;AN000 | ||
| 387 | PTR_TO_COMLIN DW ? ;an003;;; WGR offset ptr ;AN000 | ||
| 388 | SEG_OF_COMLIN DW ? | ||
| 389 | DB 0 ;an003;;; WGR ;AN000 | ||
| 390 | DB LEFT_ALIGN+CHAR_FIELD_ASCIIZ ;AN000;;; WGR flag ;AN000 | ||
| 391 | |||
| 392 | DB 0 ;an003;;; WGR max width ;AN000 | ||
| 393 | DB 1 ;an003;;; WGR min width ;AN000 | ||
| 394 | DB " " ;an003;;; WGR filler ;AN000 | ||
| 395 | |||
| 396 | |||
| 397 | STRING_HOLDER DB 64 DUP(0) | ||
| 398 | ;***CNS ;; | ||
| 399 | ;; | ||
| 400 | FILE_BUFFER_SIZE EQU 50*6 | ||
| 401 | FILE_BUFFER DB FILE_BUFFER_SIZE DUP(0) ;AC000;;; Buffer for Keyboard Def file | ||
| 402 | FB EQU FILE_BUFFER ;AC000;m for 32 language entries) | ||
| 403 | DESIG_CP_BUFFER DW 28 DUP(?) ;; (Room for 25 code pages) | ||
| 404 | DESIG_CP_BUF_LEN DW $-DESIG_CP_BUFFER ;; Length of code page buffer | ||
| 405 | NUM_DESIG_CP DW 0 ;; | ||
| 406 | CP_TAB_OFFSET DD ? ;; | ||
| 407 | ;****************** CNS ******************;AN000; | ||
| 408 | TOTAL_SIZE DW 0 ;AN000; | ||
| 409 | PASS_LANG DW 0 ;AN000; | ||
| 410 | ID_TAB_OFFSET DD ? ;AN000; | ||
| 411 | ;****************** CNS ******************;; | ||
| 412 | STATE_LOGIC_OFFSET DD -1 ;; | ||
| 413 | KEYBSYS_FILE_HANDLE DW ? ;;;;;;;;;;; | ||
| 414 | TB_RETURN_CODE DW 1 ;; | ||
| 415 | DESIG_CP_OFFSET DW OFFSET DESIG_CP_BUFFER ;; | ||
| 416 | SYS_CODE_PAGE DW 0 ;; | ||
| 417 | DESIG_LIST DW 0 ;; | ||
| 418 | QUERY_CALL DB 0 ;; | ||
| 419 | ;; | ||
| 420 | KB_MASK EQU 02h ;; | ||
| 421 | ;; | ||
| 422 | SIGNATURE DB 0FFh,'KEYB ' ;; | ||
| 423 | SIGNATURE_LENGTH DW 8 ;; | ||
| 424 | ;****************** CNS ***************************;AN000; | ||
| 425 | NUM_ID DW 0 ;AN000; | ||
| 426 | ERR4ID DB 0 ;AN000; | ||
| 427 | NUM_LANG DW 0 ;AN000; | ||
| 428 | NUM_CP DW 0 ;AN000; | ||
| 429 | ID_PTR_SIZE DW SIZE KEYBSYS_ID_PTRS ;AN000; | ||
| 430 | ;****************** CNS ***************************** | ||
| 431 | LANG_PTR_SIZE DW SIZE KEYBSYS_LANG_PTRS ;; | ||
| 432 | CP_PTR_SIZE DW SIZE KEYBSYS_CP_PTRS ;; | ||
| 433 | KEYBCMD_LANG_ENTRY_PTR DD ? ;; | ||
| 434 | ;; | ||
| 435 | KEYB_INSTALLED DW 0 ;; | ||
| 436 | CON_INSTALLED DW 0 ;; | ||
| 437 | SHARED_AREA_PTR DD 0 ;; | ||
| 438 | GOOD_MATCH DW 0 ;; | ||
| 439 | ;****************** CNS ***************************;; | ||
| 440 | LANGUAGE_ASCII DB '??',0 ;; WGR ;AC000 | ||
| 441 | ;; | ||
| 442 | CMD_PARM_LIST PARM_LIST <> ;; | ||
| 443 | ;; | ||
| 444 | JR_LANGUAGE_CODES DW 'FR','GR','IT','SP','UK' ;; | ||
| 445 | ;; | ||
| 446 | JR_NUM_CODES EQU 5 ;; | ||
| 447 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 448 | ;---------- TABLES FOR EXTENDED KEYBOARD SUPPORT CTRL CASE --------- RWV 11-06-85 ;; | ||
| 449 | ;; | ||
| 450 | RPL_K8 LABEL BYTE ;-------- CHARACTERS --------- ;; | ||
| 451 | DB 27,-1,00,-1,-1,-1 ; Esc, 1, 2, 3, 4, 5 ;; | ||
| 452 | DB 30,-1,-1,-1,-1,31 ; 6, 7, 8, 9, 0, - ;; | ||
| 453 | DB -1,127,148,17,23,5 ; =, Bksp, Tab, Q, W, E ;; | ||
| 454 | DB 18,20,25,21,09,15 ; R, T, Y, U, I, O ;; | ||
| 455 | DB 16,27,29,10,-1,01 ; P, [, ], Enter, Ctrl, A ;; | ||
| 456 | DB 19,04,06,07,08,10 ; S, D, F, G, H, J ;; | ||
| 457 | DB 11,12,-1,-1,-1,-1 ; K, L, ;, ', `, LShift ;; | ||
| 458 | DB 28,26,24,03,22,02 ; \, Z, X, C, V, B ;; | ||
| 459 | DB 14,13,-1,-1,-1,-1 ; N, M, ,, ., /, RShift ;; | ||
| 460 | DB 150,-1,' ',-1 ; *, Alt, Space, CL ;; | ||
| 461 | ;--------- FUNCTIONS --------- ;; | ||
| 462 | DB 94,95,96,97,98,99 ; F1 - F6 ;; | ||
| 463 | DB 100,101,102,103,-1,-1 ; F7 - F10, NL, SL ;; | ||
| 464 | DB 119,141,132,142,115,143 ; Home, Up, PgUp, -, Left, Pad5 ;; | ||
| 465 | DB 116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins ;; | ||
| 466 | DB 147,-1,-1,-1,137,138 ; Del, SysReq, Undef, WT, F11, F12 ;; | ||
| 467 | L_CTRL_TAB EQU $-RPL_K8 ;; | ||
| 468 | ;; | ||
| 469 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 470 | ;; Program Code | ||
| 471 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 472 | ;; | ||
| 473 | KEYB_COMMAND PROC NEAR ;; | ||
| 474 | ;; | ||
| 475 | CALL SYSLOADMSG ;AN000;load messages ;AN000 | ||
| 476 | JNC VERSION_OK ;AN000;if no carry then version ok ;AN000 | ||
| 477 | CALL SYSDISPMSG ;AN000;error..display version error ;AN000 | ||
| 478 | MOV AL,BAD_DOS_VER ;AN000;bad DOS version ;AN000 | ||
| 479 | MOV EXIT_RET_CODE,AL ;AN000; ;AN000 | ||
| 480 | JMP KEYB_EXIT_NOT_RESIDENT ;AN000;exit..non resident ;AN000 | ||
| 481 | VERSION_OK: ;; WGR ;AN000 | ||
| 482 | MOV SEG_OF_NUMBER,CS ;AN000;initialize.. ;AN000 | ||
| 483 | MOV SEG_OF_ASCIIZ,CS ;AN000; ..sublists ;AN000 | ||
| 484 | MOV BP,OFFSET CMD_PARM_LIST ;AN000;pointer for parm list | ||
| 485 | MOV WORD PTR SHARED_AREA_PTR,ES ;AN000; ES segment | ||
| 486 | ;; | ||
| 487 | KEYB_INSTALL_CHECK: ;; | ||
| 488 | MOV AX,0AD80H ;; KEYB install check | ||
| 489 | INT 2FH ;; | ||
| 490 | CMP AL,-1 ;; If flag is not 0FFh THEN | ||
| 491 | JE INSTALLED_KEYB ;; | ||
| 492 | MOV WORD PTR SHARED_AREA_PTR+2,OFFSET TSD ;; | ||
| 493 | JMP CON_INSTALL_CHECK ;; | ||
| 494 | ;;;;;;;;;; | ||
| 495 | INSTALLED_KEYB: ;; | ||
| 496 | MOV KEYB_INSTALLED,1 ;; Set KEYB_INSTALLED flag = YES | ||
| 497 | MOV WORD PTR SHARED_AREA_PTR,ES ;; Save segment of SHARED_DATA_AREA | ||
| 498 | MOV WORD PTR SHARED_AREA_PTR+2,DI ;; Save offset of SHARED_DATA_AREA | ||
| 499 | MOV AX,ES:[DI].KEYB_TYPE ;; | ||
| 500 | MOV HW_TYPE,AX ;; | ||
| 501 | MOV ES:[DI].TABLE_OK,0 ;; Do not allow processing | ||
| 502 | PUSH CS ;; while building table | ||
| 503 | POP ES ;; Reset ES until required | ||
| 504 | ;; | ||
| 505 | CON_INSTALL_CHECK: ;;;;;;; | ||
| 506 | MOV AX,0AD00H ;; CONSOLE install check | ||
| 507 | INT 2FH ;; | ||
| 508 | CMP AL,-1 ;; If flag is not 0FFh THEN | ||
| 509 | JE INSTALLED_CON ;; | ||
| 510 | JMP CALL_FIRST_STAGE ;; | ||
| 511 | ;; | ||
| 512 | INSTALLED_CON: ;; | ||
| 513 | MOV CON_INSTALLED,1 ;; Set CON_INSTALLED flag = YES | ||
| 514 | ;; | ||
| 515 | CALL_FIRST_STAGE: ;; | ||
| 516 | PUSH CS ;; | ||
| 517 | POP ES ;; | ||
| 518 | CALL PARSE_PARAMETERS ;; Validate parameter list | ||
| 519 | ;; | ||
| 520 | BEGIN_PARM_CHECK: ;; CHECK ALL RETURN CODES | ||
| 521 | MOV DL,[BP].RET_CODE_3 ;; | ||
| 522 | CMP DL,1 ;; Check for invalid syntax | ||
| 523 | JNE VALID1 ;; | ||
| 524 | JMP ERROR3 ;; | ||
| 525 | ;; | ||
| 526 | VALID1: ;; | ||
| 527 | MOV DL,[BP].RET_CODE_1 ;; Check for invalid language parm | ||
| 528 | CMP DL,1 ;; | ||
| 529 | JNE VALID2 ;; | ||
| 530 | JMP ERROR1 ;; | ||
| 531 | ;; | ||
| 532 | VALID2: ;; | ||
| 533 | MOV DL,[BP].RET_CODE_2 ;; Check for invalid code page parm | ||
| 534 | CMP DL,1 ;; | ||
| 535 | JNE VALID3 ;; | ||
| 536 | JMP ERROR2 ;; | ||
| 537 | ;; | ||
| 538 | VALID3: ;; | ||
| 539 | MOV DL,[BP].RET_CODE_1 ;; Check for query command | ||
| 540 | CMP DL,2 ;; | ||
| 541 | JE QUERY ;; | ||
| 542 | ;******************************* CNS **;; | ||
| 543 | MOV DL,[BP].RET_CODE_1 ;AN000;k for query command | ||
| 544 | CMP DL,3 ;AN000;;; Get a status of the codepage | ||
| 545 | JE QUERY ;AN000;;; language, and possible ID code | ||
| 546 | ;******************************* CNS **;; | ||
| 547 | JMP NOT_QUERY ;; | ||
| 548 | ;; IF QUERY is requested THEN | ||
| 549 | QUERY: ;; | ||
| 550 | MOV QUERY_CALL,DL ;; | ||
| 551 | MOV AX,KEYB_INSTALLED ;; If KEYB is installed THEN | ||
| 552 | CMP AX,0 ;; | ||
| 553 | JE QUERY_CONTINUE1 ;;;;;;;;;;;;;;;; | ||
| 554 | ;; | ||
| 555 | MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Get offset of | ||
| 556 | MOV ES,WORD PTR SHARED_AREA_PTR ;; shared area | ||
| 557 | MOV BX,WORD PTR ES:[DI].ACTIVE_LANGUAGE ;; Get active language | ||
| 558 | CMP BX,0 ;; WGR if no language.. ;AN000 | ||
| 559 | JE I_MESSAGE ;; WGR then id was specified ;AN000 | ||
| 560 | ;; | ||
| 561 | ;;;;;;;;;;;; | ||
| 562 | L_MESSAGE: ;; | ||
| 563 | MOV WORD PTR LANGUAGE_ASCII,BX ;AC000;;; Display Language | ||
| 564 | LEA SI,LANGUAGE_ASCII ;AN000;;; WGR sublist points to... ;AN000 | ||
| 565 | MOV PTR_TO_ASCIIZ,SI ;AN000;;; WGR language code asciiz string ;AN000 | ||
| 566 | MOV AX,ACT_KEYB ;AC000;;; WGR display 'Current keyboard code' ;AN000 | ||
| 567 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 568 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 569 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 570 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 571 | LEA SI,SUBLIST_ASCIIZ ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 572 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 573 | JMP KEYB_L_FINISHED ;; | ||
| 574 | ;;;;;;; | ||
| 575 | I_MESSAGE: ;; | ||
| 576 | MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000 | ||
| 577 | MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000 | ||
| 578 | LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000 | ||
| 579 | MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000 | ||
| 580 | MOV AX,ACT_ID ;AN000;;; WGR display 'Current ID: ' ;AN000 | ||
| 581 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 582 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 583 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 584 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 585 | LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 586 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 587 | MOV ID_DISPLAYED,1 ;AN000;;; WGR ID was displayed. ;AN000 | ||
| 588 | JMP KEYB_L_FINISHED ;AN000;;; WGR ;AN000 | ||
| 589 | ;;;;;;;;;;; | ||
| 590 | QUERY_CONTINUE1: ;; | ||
| 591 | MOV AX,INV_KEYB_Q ;AC000;;; WGR ;AN000 | ||
| 592 | MOV BX,STDOUT ;AN000;;; WGR Else ;AN000 | ||
| 593 | XOR CX,CX ;AC000;;; WGR Display message that KEYB ;AN000 | ||
| 594 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR has not been installed ;AN000 | ||
| 595 | XOR DL,DL ;AN000;;; WGR ;AN000 | ||
| 596 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 597 | JMP KEYB_CP_FINISHED ;AC000;;; | ||
| 598 | ;;;;;;;;;;; | ||
| 599 | KEYB_L_FINISHED: ;; | ||
| 600 | MOV BX,ES:[DI].INVOKED_CP_TABLE ;; Get invoked code page | ||
| 601 | ;; | ||
| 602 | MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000 | ||
| 603 | LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000 | ||
| 604 | MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000 | ||
| 605 | MOV AX,ACT_KEYB_CP ;AC000;;; WGR display ' code page: ' ;AN000 | ||
| 606 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 607 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 608 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 609 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 610 | LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 611 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 612 | CMP ID_DISPLAYED,1 ;AN000;;; WGR was id displayed? ;AN000 | ||
| 613 | JE KEYB_CP_FINISHED ;AN000;;; WGR yes..continue. ;AN000 | ||
| 614 | ;; | ||
| 615 | MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000 | ||
| 616 | CMP BX,0 ;AN000;;; WGR no id given.. ;AN000 | ||
| 617 | JE KEYB_CP_FINISHED ;AN000;;; WGR ;AN000 | ||
| 618 | ;; | ||
| 619 | MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000 | ||
| 620 | LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000 | ||
| 621 | MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000 | ||
| 622 | MOV AX,ACT_ID ;AC000;;; WGR display 'Current ID: ' ;AN000 | ||
| 623 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 624 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 625 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 626 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 627 | LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 628 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 629 | MOV AH,09H ;AC000;;; WGR need a CR_LF here. ;AN000 | ||
| 630 | MOV DX,OFFSET CR_LF ;AC000;;; WGR ;AN000 | ||
| 631 | INT 21H ;; WGR ;AN000 | ||
| 632 | ;;;;;;;;;;; | ||
| 633 | KEYB_CP_FINISHED: ;; | ||
| 634 | MOV AX,CON_INSTALLED ;; If CON has been installed THEN | ||
| 635 | CMP AX,0 ;; | ||
| 636 | JNE GET_ACTIVE_CP ;; | ||
| 637 | JMP CON_NOT_INSTALLED ;; | ||
| 638 | ;; | ||
| 639 | GET_ACTIVE_CP: ;; | ||
| 640 | MOV AX,0AD02H ;; Get active code page | ||
| 641 | INT 2FH ;; information from the console | ||
| 642 | JNC DISPLAY_ACTIVE_CP ;; | ||
| 643 | JMP ERROR5 ;; | ||
| 644 | ;; | ||
| 645 | DISPLAY_ACTIVE_CP: ;; | ||
| 646 | MOV NUMBER_HOLDER,BX ;AC000;;; WGR transfer number to temp loc. ;AN000 | ||
| 647 | LEA SI,NUMBER_HOLDER ;AC000;;; WGR sublist points to... ;AN000 | ||
| 648 | MOV PTR_TO_NUMBER,SI ;AC000;;; WGR code page word ;AN000 | ||
| 649 | MOV AX,ACT_CON_CP ;AN000;;; WGR display 'Current CON code page: ' ;AN000 | ||
| 650 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 651 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 652 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 653 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 654 | LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 655 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 656 | ;; | ||
| 657 | JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc | ||
| 658 | ;; | ||
| 659 | CON_NOT_INSTALLED: ;; ELSE | ||
| 660 | MOV AX,INV_CON_Q ;AC000;WGR ;AN000 | ||
| 661 | MOV BX,STDOUT ;AN000;;; WGR Else ;AN000 | ||
| 662 | XOR CX,CX ;AN000;;; WGR Display message that CON does ;AN000 | ||
| 663 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR not have active code page ;AN000 | ||
| 664 | XOR DL,DL ;AN000;;; WGR ;AN000 | ||
| 665 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 666 | JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc | ||
| 667 | ;; | ||
| 668 | NOT_QUERY: ;; IF not a query function requested | ||
| 669 | CALL BUILD_PATH ;; Determine location of KEYBOARD.SYS | ||
| 670 | ;; WGR ...and open file. ;AC000 | ||
| 671 | ;; | ||
| 672 | JNC VALID4 ;; If no error in opening file then | ||
| 673 | JMP ERROR4 ;; | ||
| 674 | ;; | ||
| 675 | VALID4: ;; | ||
| 676 | MOV KEYBSYS_FILE_HANDLE,AX ;; Save handle | ||
| 677 | MOV BP,OFFSET CMD_PARM_LIST ;; Set base pointer for structures | ||
| 678 | MOV BX,KEYBSYS_FILE_HANDLE ;; Retrieve the file handle | ||
| 679 | MOV DX,OFFSET FILE_BUFFER ;; Set address of buffer | ||
| 680 | ;************************* CNS ********;; | ||
| 681 | cmp [BP].RET_CODE_4,ID_VALID ;AN000; ;; CNS is there an ID available | ||
| 682 | je ID_TYPED ;AN000; ;; if so go find out if it is | ||
| 683 | jmp GET_LANG ;AN000; ;; a 1st or 4th parm, if not must | ||
| 684 | ;AN000; ;; must be a language | ||
| 685 | ID_TYPED: ;AN000; | ||
| 686 | |||
| 687 | call SCAN_ID ;AN000; ;; scan the table for the ID | ||
| 688 | cmp ID_FOUND,1 ;AN000; ;; if a legal ID check and see if | ||
| 689 | jne LOST_ID ;AN000; ;; it is a first or fourth parm | ||
| 690 | cmp FTH_PARMID,1 ;AN000; ;; if it is a fourth parm go | ||
| 691 | je GET_ID ;AN000; ;; check for language compatibility | ||
| 692 | jmp Language_found ;AN000; ;; otherwise it must be a first | ||
| 693 | ;; parm id value | ||
| 694 | |||
| 695 | LOST_ID: ;AN000; ;; otherwise must be a bogus match | ||
| 696 | ;; between language and ID codes | ||
| 697 | ;; or the ID code does not exist | ||
| 698 | jmp ERR1ID ;AN000; ;; in the table | ||
| 699 | ;************************* CNS ***********;; | ||
| 700 | GET_LANG: ;; Must be a language/or a 1st parm ID | ||
| 701 | ;;;;; | ||
| 702 | ;; | ||
| 703 | XOR DI,DI ;; Set number | ||
| 704 | LEA CX,[DI].KH_NUM_LANG+2 ;; bytes to read header | ||
| 705 | ;; | ||
| 706 | MOV AH,3FH ;; Read header of the Keyb Def file | ||
| 707 | INT 21H ;; | ||
| 708 | JNC VALID5 ;; If no error in opening file then | ||
| 709 | JMP ERROR4 ;; | ||
| 710 | ;;;; | ||
| 711 | VALID5: ;; | ||
| 712 | CLD ;; WGR all moves/scans forward ;AN000 | ||
| 713 | MOV CX,SIGNATURE_LENGTH ;; | ||
| 714 | MOV DI,OFFSET SIGNATURE ;; Verify matching | ||
| 715 | MOV SI,OFFSET FB.KH_SIGNATURE ;; signatures | ||
| 716 | REPE CMPSB ;; | ||
| 717 | JE LANGUAGE_SPECIFIED ;; | ||
| 718 | JMP ERROR4 ;;;; | ||
| 719 | ;; READ the language table | ||
| 720 | LANGUAGE_SPECIFIED: ;; | ||
| 721 | MOV AX,FB.KH_NUM_LANG ;; | ||
| 722 | MOV NUM_LANG,AX ;; Save the number of languages | ||
| 723 | MUL LANG_PTR_SIZE ;; Determine # of bytes to read | ||
| 724 | MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer | ||
| 725 | MOV CX,AX ;; | ||
| 726 | CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small | ||
| 727 | JBE READ_LANG_TAB ;; | ||
| 728 | JMP ERROR4 ;; | ||
| 729 | ;; | ||
| 730 | READ_LANG_TAB: ;; | ||
| 731 | MOV AH,3FH ;; Read language table from | ||
| 732 | INT 21H ;; Keyb Def file | ||
| 733 | JNC READ_VALID ;; If no error in opening file then | ||
| 734 | JMP ERROR4 ;; Else display ERROR message | ||
| 735 | ;; | ||
| 736 | READ_VALID: ;; | ||
| 737 | MOV CX,NUM_LANG ;; Number of valid codes | ||
| 738 | MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table | ||
| 739 | ;; | ||
| 740 | SCAN_LANG_TABLE: ;; FOR language parm | ||
| 741 | MOV AX,[BP].LANGUAGe_PARM ;; Get parameter | ||
| 742 | CMP [DI].KP_LANG_CODE,AX ;; Valid Code ?? | ||
| 743 | JE LANGUAGE_FOUND ;; If not found AND more entries THEN | ||
| 744 | ADD DI,LANG_PTR_SIZE ;; Check next entry | ||
| 745 | DEC CX ;; Decrement count of entries | ||
| 746 | JNE SCAN_LANG_TABLE ;; Else | ||
| 747 | JMP ERROR1 ;; Display error message | ||
| 748 | ;;;;;;;;;;;;;; | ||
| 749 | ;**************************** CNS ****;;;; | ||
| 750 | GET_ID: ;AN000;;; CNS - Must be an ID value | ||
| 751 | mov cx,1 ;AN000;;; initialize ctr value for # of ids | ||
| 752 | ;; | ||
| 753 | SEARCH_ID: ;AN000;;; minimum per country | ||
| 754 | ;.WHILE <cx ne 0> ;AN000;;; There is atleast 1 ID for each country | ||
| 755 | cmp cx,0 ;AN000;;; Check for any more IDs left to check | ||
| 756 | jne FINDID ;AN000;;; Country has more than one ID check | ||
| 757 | jmp END_IDCHK ;AN000;;; Country & ID has been found or value | ||
| 758 | ;; is zero | ||
| 759 | FINDID: ;AN000; | ||
| 760 | |||
| 761 | push di ;AN000;;; save the current language entry ptr | ||
| 762 | push cx ;AN000;;; save the minimum # of ids before | ||
| 763 | ;; reading the table data from the disk | ||
| 764 | ;**************************** CNS *****************;; | ||
| 765 | LANGUAGE_FOUND: ;; | ||
| 766 | MOV CX,WORD PTR [DI].KP_ENTRY_PTR+2 ;; Get offset of lang entry | ||
| 767 | MOV DX,WORD PTR [DI].KP_ENTRY_PTR ;; in the Keyb Def file | ||
| 768 | MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR,DX ;; Save | ||
| 769 | MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR+2,CX ;; offset | ||
| 770 | MOV AH,42H ;; Move file pointer to | ||
| 771 | MOV AL,0 ;;;;;;; location of language | ||
| 772 | INT 21H ;; entry | ||
| 773 | JNC LSEEK_VALID ;; | ||
| 774 | JMP ERROR4 ;; | ||
| 775 | ;; | ||
| 776 | LSEEK_VALID: ;; | ||
| 777 | MOV DI,AX ;; | ||
| 778 | MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number | ||
| 779 | ;; bytes to read header | ||
| 780 | MOV DX,OFFSET FILE_BUFFER ;;;;;;;;; | ||
| 781 | MOV AH,3FH ;; Read language entry in | ||
| 782 | INT 21H ;; Keyb Def file | ||
| 783 | JNC VALID6a ;; If no error in file then | ||
| 784 | JMP ERROR4 ;;;;;;;;;; | ||
| 785 | ;**************************** CNS ********************************************** | ||
| 786 | |||
| 787 | |||
| 788 | valid6a: | ||
| 789 | cmp FOURTH_PARM,1 ;AN000;;; Is the ID a 4th Parm | ||
| 790 | jne VALID6 ;AN000;;; if not get out of routine, otherwise | ||
| 791 | pop cx ;AN000;;;restore # of ids for the country | ||
| 792 | ; .IF <cx eq 1> ;AN000;;;Check to see if this is the first | ||
| 793 | ;AN000;;;time checking the primary ID | ||
| 794 | cmp cx,1 ;AN000;;;if there is just one ID check to make | ||
| 795 | jne CHK4PARM ;AN000;;;sure both flags are not set | ||
| 796 | ;AN000;;; this should not be necessary w/ new parser | ||
| 797 | cmp FTH_PARMID,1 ;AN000;;; is the ID flag for switch set | ||
| 798 | jne CHK1N4 ;AN000;;; is the flag set only for the 4th | ||
| 799 | cmp FOURTH_PARM,1 ;AN000;;; if set only for the switch proceed | ||
| 800 | jne CHK1N4 ;AN000;;; if not must be a positional | ||
| 801 | mov cl,fb.kl_num_id ;AN000;;; get the number of IDs available from the table | ||
| 802 | mov FTH_PARMID,0 ;AN000;;; turn switch flag off so the table | ||
| 803 | ;AN000;;; counter will not be reset | ||
| 804 | |||
| 805 | ;;ids available for the | ||
| 806 | CHK1N4: ;AN000; ;;country | ||
| 807 | cmp ONE_PARMID,1 ;AN000; ;; this was to be done if | ||
| 808 | jne CHK4PARM ;AN000; ;; two the positional | ||
| 809 | cmp FOURTH_PARM,0 ;AN000; ;; and switch was specified | ||
| 810 | jne CHK4PARM ;AN000; ;; this should never happen | ||
| 811 | pop di ;AN000; ;; if the parser is intact | ||
| 812 | jmp error3 ;AN000; ;; report error & exit | ||
| 813 | |||
| 814 | CHK4PARM: ;AN000; ;; check on the first ID | ||
| 815 | ; .IF <FOURTH_PARM EQ 1> ;AN000; ;;switch specified | ||
| 816 | ; call IDLANG_CHK ;AN000; ;;check the lang-id combo | ||
| 817 | ; .ELSE ;AN000; | ||
| 818 | ; xor cx,cx ;AN000; ;;clear to exit loop | ||
| 819 | ; .ENDIF ;AN000; | ||
| 820 | ; | ||
| 821 | cmp FOURTH_PARM,1 ;AN000; ;; ID was a switch | ||
| 822 | jne ABORT_LOOP ;AN000; ;; otherwise get out of routine | ||
| 823 | call IDLANG_CHK ;AN000; ;; check the ID | ||
| 824 | jmp ADVANCE_PTR ;AN000; ;; advance to the next position | ||
| 825 | |||
| 826 | ABORT_LOOP: ;AN000; | ||
| 827 | xor cx,cx ;AN000; ;; end loop | ||
| 828 | |||
| 829 | ADVANCE_PTR: ;AN000; | ||
| 830 | pop di ;AN000; ;;restore entry value | ||
| 831 | |||
| 832 | dec cx ;AN000; ;;# of ids left to check | ||
| 833 | cmp cx,0 ;AN000; ;; if at 0 don't advance to next | ||
| 834 | je NO_ADVANCE ;AN000; ;; table position | ||
| 835 | cmp GOOD_MATCH,1 ;AN000; ;; check to see if ID matched language | ||
| 836 | je NO_ADVANCE ;AN000; ;; if equal do not advance | ||
| 837 | add di,LANG_PTR_SIZE ;AN000; ;;step to the next entry | ||
| 838 | ;;in the table | ||
| 839 | |||
| 840 | NO_ADVANCE: ;AN000; | ||
| 841 | |||
| 842 | jmp SEARCH_ID ;AN000; ;;for the country | ||
| 843 | |||
| 844 | ;.ENDWHILE ;;end of ID check for country | ||
| 845 | |||
| 846 | END_IDCHK: ;AN000; | ||
| 847 | |||
| 848 | cmp FOURTH_PARM,1 ;AN000; ;; see if id was found | ||
| 849 | jne VALID6 ;AN000; | ||
| 850 | cmp GOOD_MATCH,0 ;AN000; ;; none found | ||
| 851 | jne VALID6 ;AN000; ;; report error | ||
| 852 | mov [bp].ret_code_4,1 ;AN000; ;; incompatible lang code | ||
| 853 | mov al,[bp].ret_code_4 ;AN000; ;; id combo | ||
| 854 | jmp err2id ;AN000; | ||
| 855 | |||
| 856 | ;; otherwise found it | ||
| 857 | ;; continue to build tbl | ||
| 858 | ;**************************** CNS ********************************************** | ||
| 859 | ;; | ||
| 860 | VALID6: ;; | ||
| 861 | MOV AX,WORD PTR FB.KL_LOGIC_PTR ;; Save the offset of the state | ||
| 862 | MOV WORD PTR STATE_LOGIC_OFFSET,AX ;; logic section | ||
| 863 | MOV AX,WORD PTR FB.KL_LOGIC_PTR+2 ;; Save the offset of the state | ||
| 864 | MOV WORD PTR STATE_LOGIC_OFFSET+2,AX ;; logic section | ||
| 865 | ;; | ||
| 866 | MOV DL,[BP].RET_CODE_2 ;;;;;;;;;; IF code page was specified | ||
| 867 | CMP DL,2 ;; | ||
| 868 | JNE CODE_PAGE_SPECIFIED ;; | ||
| 869 | JMP DONE ;; | ||
| 870 | ;; | ||
| 871 | CODE_PAGE_SPECIFIED: ;; Then | ||
| 872 | ;************************** CNS *********************************************** | ||
| 873 | xor ah,ah ;AN000; | ||
| 874 | MOV Al,FB.KL_NUM_CP ;AN000;;; | ||
| 875 | ;************************** CNS *********************************************** | ||
| 876 | MOV NUM_CP,AX ;; Save the number of code pages | ||
| 877 | MUL CP_PTR_SIZE ;; Determine # of bytes to read | ||
| 878 | MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer | ||
| 879 | MOV CX,AX ;; | ||
| 880 | CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small | ||
| 881 | JBE VALID7 ;; | ||
| 882 | JMP ERROR4 ;; | ||
| 883 | ;; | ||
| 884 | VALID7: ;; | ||
| 885 | MOV AH,3FH ;; Read code page table from | ||
| 886 | INT 21H ;; Keyb Def file | ||
| 887 | JNC VALID8 ;; If no error in opening file then | ||
| 888 | JMP ERROR4 ;; | ||
| 889 | ;; | ||
| 890 | VALID8: ;; | ||
| 891 | MOV CX,NUM_CP ;; Number of valid codes | ||
| 892 | MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table | ||
| 893 | ;; | ||
| 894 | SCAN_CP_TABLE: ;; FOR code page parm | ||
| 895 | MOV AX,[BP].CODE_PAGE_PARM ;; Get parameter | ||
| 896 | CMP [DI].KC_CODE_PAGE,AX ;; Valid Code ?? | ||
| 897 | JE CODE_PAGE_FOUND ;; If not found AND more entries THEN | ||
| 898 | ADD DI,CP_PTR_SIZE ;; Check next entry | ||
| 899 | DEC CX ;; Decrement count of entries | ||
| 900 | JNE SCAN_CP_TABLE ;; Else | ||
| 901 | JMP ERROR2 ;; Display error message | ||
| 902 | ;;;;;;;;; | ||
| 903 | CODE_PAGE_FOUND: ;; | ||
| 904 | MOV AX,WORD PTR [DI].KC_ENTRY_PTR ;; | ||
| 905 | MOV WORD PTR CP_TAB_OFFSET,AX ;; | ||
| 906 | MOV AX,WORD PTR [DI].KC_ENTRY_PTR+2 ;; | ||
| 907 | MOV WORD PTR CP_TAB_OFFSET+2,AX ;; | ||
| 908 | ;;;;;; | ||
| 909 | DONE: ;; | ||
| 910 | MOV SI,OFFSET DESIG_CP_BUFFER ;; | ||
| 911 | ;; | ||
| 912 | MOV AX,CON_INSTALLED ;;;;; If CON is NOT installed THEN | ||
| 913 | CMP AX,0 ;; | ||
| 914 | JE SYSTEM_CP ;; | ||
| 915 | JMP GET_DESIG_CPS ;; | ||
| 916 | ;; | ||
| 917 | SYSTEM_CP: ;; | ||
| 918 | MOV CX,1 ;; | ||
| 919 | MOV NUM_DESIG_CP,CX ;; Set number of CPs = 1 | ||
| 920 | MOV [SI].NUM_DESIGNATES,CX ;; | ||
| 921 | ;; | ||
| 922 | MOV DL,[BP].RET_CODE_2 ;; Check if code page parm | ||
| 923 | CMP DL,0 ;; was specified | ||
| 924 | JNE SET_TO_SYSTEM_CP ;; | ||
| 925 | MOV DX,[BP].CODE_PAGE_PARM ;; | ||
| 926 | MOV [SI].DESIG_CP_ENTRY,DX ;; Load specified code page into | ||
| 927 | JMP READY_TO_BUILD_TABLE ;; designated code page list | ||
| 928 | ;; | ||
| 929 | SET_TO_SYSTEM_CP: ;; | ||
| 930 | CALL FIND_FIRST_CP ;; Call routine that sets the first | ||
| 931 | CMP AX,0 ;; table found in the Keyb Def file | ||
| 932 | JE SET_TO_SYSTEM_CP2 ;; to the system code page | ||
| 933 | JMP ERROR4 ;; | ||
| 934 | ;; | ||
| 935 | SET_TO_SYSTEM_CP2: ;; | ||
| 936 | MOV SYS_CODE_PAGE,BX ;; | ||
| 937 | MOV [BP].CODE_PAGE_PARM,BX ;; | ||
| 938 | MOV [SI].DESIG_CP_ENTRY,BX ;; Move sys CP into desig list | ||
| 939 | JMP READY_TO_BUILD_TABLE ;; | ||
| 940 | ;; | ||
| 941 | GET_DESIG_CPS: ;; ELSE | ||
| 942 | MOV AX,0AD03H ;; | ||
| 943 | PUSH CS ;; Make sure ES is set | ||
| 944 | POP ES ;; | ||
| 945 | LEA DI,DESIG_CP_BUFFER ;; | ||
| 946 | MOV CX,DESIG_CP_BUF_LEN ;; | ||
| 947 | INT 2FH ;; Get all designated code pages | ||
| 948 | JNC SET_DESIG_VARIABLES ;; from console | ||
| 949 | JMP ERROR5 ;; | ||
| 950 | ;; | ||
| 951 | SET_DESIG_VARIABLES: ;; | ||
| 952 | MOV CX,[SI].NUM_DESIGNATES ;; | ||
| 953 | ADD CX,[SI].NUM_HW_CPS ;; | ||
| 954 | MOV NUM_DESIG_CP,CX ;; Set number of Designated CPs | ||
| 955 | ;; | ||
| 956 | BUFFER_CREATED: ;; | ||
| 957 | MOV AX,0AD02H ;; | ||
| 958 | INT 2FH ;; Get invoked code page | ||
| 959 | ;; | ||
| 960 | SET_TO_CP_INVOKED: ;; | ||
| 961 | MOV DL,[BP].RET_CODE_2 ;; IF code page parm was specified | ||
| 962 | CMP DL,0 ;; | ||
| 963 | JNE SET_TO_INVOKED_CP ;; | ||
| 964 | MOV CX,NUM_DESIG_CP ;; | ||
| 965 | MOV DESIG_LIST,SI ;; | ||
| 966 | JMP TEST_IF_DESIGNATED ;; | ||
| 967 | ;; | ||
| 968 | SET_TO_INVOKED_CP: ;; | ||
| 969 | CMP AX,1 ;; IF a code page has been invoked | ||
| 970 | JNE SET_TO_INVOKED_CP3 ;; | ||
| 971 | CALL FIND_FIRST_CP ;; Call the routine that sets the | ||
| 972 | CMP AX,0 ;; first code page in the Keyb Def | ||
| 973 | JE SET_TO_INVOKED_CP2 ;; file to the system code page | ||
| 974 | JMP ERROR4 ;; | ||
| 975 | ;; | ||
| 976 | SET_TO_INVOKED_CP2: ;; | ||
| 977 | MOV [BP].CODE_PAGE_PARM,BX ;; | ||
| 978 | MOV SYS_CODE_PAGE,BX ;; | ||
| 979 | ;; | ||
| 980 | JMP TEST_IF_DESIGNATED ;; | ||
| 981 | ;; | ||
| 982 | SET_TO_INVOKED_CP3: ;; | ||
| 983 | MOV [BP].CODE_PAGE_PARM,BX ;; | ||
| 984 | ;; | ||
| 985 | TEST_IF_DESIGNATED: ;; | ||
| 986 | MOV DX,[BP].CODE_PAGE_PARM ;; | ||
| 987 | CMP [SI].DESIG_CP_ENTRY,DX ;; Is Code page specified in the list | ||
| 988 | JE CODE_PAGE_DESIGNATED ;; of designated code pages ? | ||
| 989 | ;; | ||
| 990 | NEXT_DESIG_CP: ;; | ||
| 991 | ADD SI,2 ;; Check next code page | ||
| 992 | DEC CX ;; If all designated code pages have | ||
| 993 | JNZ TEST_IF_DESIGNATED ;; been checked Then ERROR | ||
| 994 | JMP ERROR6 ;; | ||
| 995 | ;; | ||
| 996 | CODE_PAGE_DESIGNATED: ;; | ||
| 997 | CMP SYS_CODE_PAGE,0 ;; | ||
| 998 | JNE READY_TO_BUILD_TABLE ;; | ||
| 999 | CMP AX,1 ;; IF a code page has been invoked | ||
| 1000 | JE READY_TO_BUILD_TABLE ;; | ||
| 1001 | CMP [BP].CODE_PAGE_PARM,BX ;; IF Invoked CP <> Specified CP | ||
| 1002 | JE READY_TO_BUILD_TABLE ;; Issue warning | ||
| 1003 | ;;*************************************************************************** | ||
| 1004 | PUSH BX ;AN000;;; WGR ;AN000 | ||
| 1005 | PUSH CX ;AN000;;; WGR ;AN000 | ||
| 1006 | MOV AX,WARNING_1 ;AN000;;; WGR ;AN000 | ||
| 1007 | MOV BX,STDOUT ;AN000;;; WGR ;AN000 | ||
| 1008 | XOR CX,CX ;AN000;;; WGR ;AN000 | ||
| 1009 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000 | ||
| 1010 | XOR DL,DL ;AN000;;; WGR ;AN000 | ||
| 1011 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 1012 | POP CX ;AN000;;; WGR ;AN000 | ||
| 1013 | POP BX ;AN000;;; WGR ;AN000 | ||
| 1014 | ;;*************************************************************************** | ||
| 1015 | ;; | ||
| 1016 | READY_TO_BUILD_TABLE: ;; | ||
| 1017 | ;; | ||
| 1018 | MOV AX,KEYB_INSTALLED ;; | ||
| 1019 | CMP AX,0 ;; Else if KEYB has not been installed | ||
| 1020 | JNE BUILD_THE_TABLE ;; | ||
| 1021 | ;; | ||
| 1022 | CALL FIND_SYS_TYPE ;; Determine system type for INT 9 use | ||
| 1023 | ;; | ||
| 1024 | TEST SD.SYSTEM_FLAG,PC_JR ;; IS THIS ROM MULTILINGUAL? (JR.) AAD | ||
| 1025 | JZ CONTINUE_INSTALL ; NO, LOAD THE NEW INT9 CODE | ||
| 1026 | ; SEE IF MULTILINGUAL OPTION IS PRESENT | ||
| 1027 | MOV AH,5 ; ADDRESS THE MULTILINGUAL SUPPORT | ||
| 1028 | MOV AL,80H ; REQUEST CURRENT LANGUAGE BE IDENTIFIED | ||
| 1029 | INT 16H ; CALL KEYBOARD TO IDENTIFY ITSELF | ||
| 1030 | |||
| 1031 | ;IF THE MULTILINGUAL OPTION IS NOT PRESENT, THE ROM DOES NOT RECOGNIZE THE | ||
| 1032 | ;OPTION 5 AND JUST RETURNS THE REGS INTACT. | ||
| 1033 | ;RESPONSE IN AL INDICATES THE CURRENT LANGUAGE: | ||
| 1034 | |||
| 1035 | CMP AL,80H ; DID I GET BACK JUST WHAT I SENT? | ||
| 1036 | JE CONTINUE_INSTALL ; SINCE RESPONSE WAS THE SAME MUST NOT BE | ||
| 1037 | ; MULTILINGUAL, RELOCATE RESIDENT KBD ROUTINE | ||
| 1038 | |||
| 1039 | ;I AM GOING TO IGNORE WHAT LANGUAGE IS CURRENTLY SET. I WILL SET THE | ||
| 1040 | ;MULTILINGUAL KEYBOARD TO BECOME MY LANGUAGE. | ||
| 1041 | |||
| 1042 | MOV AX,[BP].LANGUAGE_PARM ;; | ||
| 1043 | XCHG AH,AL ;; | ||
| 1044 | MOV DI,OFFSET JR_LANGUAGE_CODES ;; | ||
| 1045 | MOV CX,JR_NUM_CODES ;; | ||
| 1046 | PUSH CS ;; | ||
| 1047 | POP ES ;; | ||
| 1048 | REPNE SCASW ;; | ||
| 1049 | JNE CONTINUE_INSTALL ;; | ||
| 1050 | ;; | ||
| 1051 | MOV AH,5 ; ADDRESS THE MULTILINGUAL KEYBOARD | ||
| 1052 | MOV AL,JR_NUM_CODES ; SELECT MY LANGUAGE | ||
| 1053 | SUB AL,CL ;; | ||
| 1054 | INT 16H ; SET THE KEYBOARD ACCORDINGLY | ||
| 1055 | INT 20H ; JOB DONE, ROM IS MULTILINGUAL | ||
| 1056 | ; NO NEED TO STAY RESIDENT | ||
| 1057 | ;; | ||
| 1058 | ;------ LOAD IN SPECIAL INT 9 HANDLER AND SPECIAL TABLES (IF NEEDED) | ||
| 1059 | |||
| 1060 | CONTINUE_INSTALL: ;; | ||
| 1061 | CALL INSTALL_INT_9 ;; Install INT 9 | ||
| 1062 | ;; | ||
| 1063 | CALL FIND_KEYB_TYPE ;; Determine keyboard type table use | ||
| 1064 | ;; | ||
| 1065 | BUILD_THE_TABLE: ;; | ||
| 1066 | CALL TABLE_BUILD ;; Build the TEMP_SHARED_DATA_AREA | ||
| 1067 | ;; | ||
| 1068 | CHECK_ERRORS: ;; | ||
| 1069 | XOR CX,CX ;; Take appropriate action considering | ||
| 1070 | MOV CX,TB_RETURN_CODE ;; return codes from TABLE_BUILD | ||
| 1071 | CMP CX,0 ;; | ||
| 1072 | JE CHECK_FOR_INV_CP ;; If return code is not 0 | ||
| 1073 | ;; | ||
| 1074 | MOV AX,KEYB_INSTALLED ;; | ||
| 1075 | CMP AX,0 ;; If KEYB has not been installed | ||
| 1076 | JNE CHECK_ERROR_CONTINUE ;; | ||
| 1077 | CALL REMOVE_INT_9 ;; remove installed vector | ||
| 1078 | ;; | ||
| 1079 | CHECK_ERROR_CONTINUE: ;; | ||
| 1080 | CMP CX,1 ;; If return code = 1 | ||
| 1081 | JNE CHECK_ERROR2 ;; | ||
| 1082 | JMP ERROR1 ;; display error message | ||
| 1083 | ;; | ||
| 1084 | CHECK_ERROR2: ;; | ||
| 1085 | CMP CX,2 ;; If return code = 2 | ||
| 1086 | JNE CHECK_ERROR3 ;; | ||
| 1087 | JMP ERROR2 ;; | ||
| 1088 | ;; | ||
| 1089 | CHECK_ERROR3: ;; | ||
| 1090 | CMP CX,3 ;; If return code = 3 | ||
| 1091 | JNE CHECK_ERROR4 ;; | ||
| 1092 | JMP ERROR3 ;; display error message | ||
| 1093 | ;; | ||
| 1094 | CHECK_ERROR4: ;; | ||
| 1095 | CMP CX,4 ;; If return code = 4 | ||
| 1096 | JNE CHECK_ERROR5A ;; | ||
| 1097 | JMP ERROR4 ;; display error message | ||
| 1098 | ;; | ||
| 1099 | CHECK_ERROR5A: ;; | ||
| 1100 | CMP CX,5 ;; If return code = 5 | ||
| 1101 | JNE CHECK_ERROR6A ;; | ||
| 1102 | JMP ERROR5A ;; display error message | ||
| 1103 | ;; | ||
| 1104 | CHECK_ERROR6A: ;; | ||
| 1105 | JMP ERROR6A ;; If return code not 0,1,2,3,4 then | ||
| 1106 | ;; display error message | ||
| 1107 | CHECK_FOR_INV_CP: ;; | ||
| 1108 | MOV CX,CPN_INVALID ;; Check if any CPs were not loaded | ||
| 1109 | CMP CX,0 ;; | ||
| 1110 | JE TERMINATE ;; If some were invalid, issue | ||
| 1111 | ;; warning message | ||
| 1112 | ;;*************************************************************************** | ||
| 1113 | PUSH BX ;AN000;;; WGR ;AN000 | ||
| 1114 | PUSH CX ;AN000;;; WGR ;AN000 | ||
| 1115 | MOV AX,NOT_SUPP ;AN000;;; WGR ;AN000 | ||
| 1116 | MOV BX,STDOUT ;AN000;;; WGR WARNING ;AN000 | ||
| 1117 | XOR CX,CX ;AN000;;; WGR MESSAGE ;AN000 | ||
| 1118 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000 | ||
| 1119 | XOR DL,DL ;AN000;;; WGR ;AN000 | ||
| 1120 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 1121 | POP CX ;AN000;;; WGR ;AN000 | ||
| 1122 | POP BX ;AN000;;; WGR ;AN000 | ||
| 1123 | ;;*************************************************************************** | ||
| 1124 | ;; | ||
| 1125 | TERMINATE: ;; | ||
| 1126 | MOV AH,3EH ;; Close the KEYBOARD.SYS file | ||
| 1127 | MOV BX,KEYBSYS_FILE_HANDLE ;; if open | ||
| 1128 | CMP BX,0 ;; | ||
| 1129 | JE KEYB_EXIT ;; | ||
| 1130 | INT 21H ;; | ||
| 1131 | ;; | ||
| 1132 | MOV AX,KEYB_INSTALLED ;; | ||
| 1133 | CMP AX,0 ;; | ||
| 1134 | JE KEYB_EXIT ;; | ||
| 1135 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1136 | ;; | ||
| 1137 | KEYB_EXIT: ;; | ||
| 1138 | TEST SD.KEYB_TYPE,G_KB ;; Q..FERRARI G?? | ||
| 1139 | JZ NO_FERRARI_G ;; N..LEAVE NUMLK ALONE | ||
| 1140 | TEST SD.SYSTEM_FLAG,PC_XT ;; Q..PC/XT? | ||
| 1141 | JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE | ||
| 1142 | TEST SD.KEYB_TYPE,P_KB ;; Q..FERRARI P?? ***RPS | ||
| 1143 | JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE ***RPS | ||
| 1144 | ;***CNS | ||
| 1145 | CMP SECURE_FL,1 ;AN002;; IF SECURITY FLAG SET | ||
| 1146 | JNE NO_FERRARI_G ;AN002;; DON'T TURN ON NUM_LK | ||
| 1147 | |||
| 1148 | ;***CNS | ||
| 1149 | CALL NUMLK_ON ;; N..TURN NUMLK ON | ||
| 1150 | ;; | ||
| 1151 | NO_FERRARI_G: ;; | ||
| 1152 | TEST SD.SYSTEM_FLAG,EXT_16 ;; extended INT 16 support? | ||
| 1153 | JZ SKIP_CTRL_COPY ;; | ||
| 1154 | ;; Yes, load extened CTRL case table | ||
| 1155 | MOV CX,L_CTRL_TAB ;; CX = LENGTH OF EXTENDED TABLE | ||
| 1156 | MOV SI,OFFSET CS:RPL_K8 ;; POINT TO EXT. CTRL TABLES | ||
| 1157 | MOV DI,OFFSET CS:K8 ;; POINT TO REGULAR CTRL TABLE | ||
| 1158 | CLD ;; | ||
| 1159 | REP MOVSB ;; OVERLAY WITH EXT. CTRL TABLE | ||
| 1160 | ;; | ||
| 1161 | SKIP_CTRL_COPY: ;; | ||
| 1162 | CALL INSTALL_INT_9_NET ;; Let the network know about INT 9 | ||
| 1163 | ;; (if the network is installed) | ||
| 1164 | CALL INSTALL_INT_2F_48 ;; Install INT 2F and INT 48 (If PCjr) | ||
| 1165 | ;; | ||
| 1166 | MOV AX,0AD82H ;; Activate language | ||
| 1167 | MOV BL,-1 ;; | ||
| 1168 | INT 2FH ;; | ||
| 1169 | ;; | ||
| 1170 | MOV DX,ES:TSD.RESIDENT_END ;; Get resident end | ||
| 1171 | MOV CL,4 ;; Convert into paragrahs | ||
| 1172 | SHR DX,CL ;; | ||
| 1173 | INC DX ;; | ||
| 1174 | MOV AH,31H ;; Function call to terminate but stay | ||
| 1175 | XOR AL,AL ;; resident | ||
| 1176 | ;; | ||
| 1177 | MOV DI,OFFSET SD_DEST_PTR ;; Initialize destination ptr | ||
| 1178 | MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr | ||
| 1179 | XOR BP,BP ;; | ||
| 1180 | LEA BX,[BP].ACTIVE_LANGUAGE ;; | ||
| 1181 | ADD DI,BX ;; Adjust for portion not copied | ||
| 1182 | ADD SI,BX ;; Adjust for portion not copied | ||
| 1183 | ;; | ||
| 1184 | MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA | ||
| 1185 | SUB CX,BX ;; Adjust for portion not copied | ||
| 1186 | ;; | ||
| 1187 | JMP COPY_SD_AREA ;; Jump to proc that copies area in new | ||
| 1188 | ;; part of memory | ||
| 1189 | ;***************************** CNS ********************************************* | ||
| 1190 | ERR1ID: ;AN000; | ||
| 1191 | ;;*************************************************************************** | ||
| 1192 | MOV AX,INV_I ;AN000;;; WGR invalid ID message ;AN000 | ||
| 1193 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1194 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1195 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1196 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1197 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1198 | MOV AL,INVALID_PARMS ;AN000;;; | | ||
| 1199 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1200 | ;;*************************************************************************** | ||
| 1201 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1202 | ERR2ID: | ||
| 1203 | ;;*************************************************************************** | ||
| 1204 | MOV AX,INV_COMBO ;AN000;;; WGR invalid combination message ;AN000 | ||
| 1205 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1206 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1207 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1208 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1209 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1210 | MOV AL,INVALID_PARMS ;AN000;;; | | ||
| 1211 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1212 | ;;*************************************************************************** | ||
| 1213 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1214 | ;***************************** CNS ********************************************* | ||
| 1215 | ERROR1: | ||
| 1216 | ;;*************************************************************************** | ||
| 1217 | MOV AX,INV_L ;AN000;;; WGR invalid language code ;AN000 | ||
| 1218 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1219 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1220 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1221 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1222 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1223 | MOV AL,INVALID_PARMS ;AN000;;; | | ||
| 1224 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1225 | ;;*************************************************************************** | ||
| 1226 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1227 | ERROR2: | ||
| 1228 | ;;*************************************************************************** | ||
| 1229 | MOV AX,INV_CP ;AN000;;; WGR invalid code page message ;AN000 | ||
| 1230 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1231 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1232 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1233 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1234 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1235 | MOV AL,INVALID_PARMS ;AN000;;; | | ||
| 1236 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1237 | ;;*************************************************************************** | ||
| 1238 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1239 | ERROR3: | ||
| 1240 | ;;*************************************************************************** | ||
| 1241 | MOV AX,INV_S ;AN000;;; WGR invalid syntax message ;AN000 | ||
| 1242 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1243 | ;***CNS | ||
| 1244 | |||
| 1245 | LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING | ||
| 1246 | PUSH SI ;AN003;Save current SI index | ||
| 1247 | PUSH AX | ||
| 1248 | MOV AX,OLD_PTR ;AN003;Last locale of the end of a PARAM | ||
| 1249 | SUB CUR_PTR,AX ;AN003;Get the length via the PSP | ||
| 1250 | MOV SI,CUR_PTR | ||
| 1251 | MOV CX,SI ;AN003;Save it in CX to move in the chars | ||
| 1252 | POP AX ;AN003;Restore the PTR to the command line position | ||
| 1253 | |||
| 1254 | MOV SI,OLD_PTR ;AN003;Last locale of the end of a PARAM | ||
| 1255 | REP MOVSB ;AN003;Move in the chars until no more | ||
| 1256 | |||
| 1257 | LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING | ||
| 1258 | |||
| 1259 | |||
| 1260 | POP SI ;AN003;Restore the PTR to the command line position | ||
| 1261 | |||
| 1262 | MOV CX,1 ;AN003;One replacement | ||
| 1263 | MOV PTR_TO_COMLIN,DI ;AN003;;; WGR language code asciiz string ;AN000 | ||
| 1264 | |||
| 1265 | |||
| 1266 | PUSH AX ;AN003; | ||
| 1267 | MOV AX,DS ;AN003;;; WGR language code asciiz string ;AN000 | ||
| 1268 | MOV SEG_OF_COMLIN,AX ;AN003; | ||
| 1269 | POP AX ;AN003; | ||
| 1270 | ;XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1271 | |||
| 1272 | MOV AX,ERR_PART ;AN003; | ||
| 1273 | LEA SI,SUBLIST_COMLIN ;AN003; | ||
| 1274 | ; MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR parse error message ;AN000 | ||
| 1275 | MOV DH,PARSE_ERR_CLASS ;AN000;;; WGR parse error message ;AN000 | ||
| 1276 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1277 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1278 | MOV AL,INVALID_PARMS ;AN000;;; | | ||
| 1279 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1280 | ;;*************************************************************************** | ||
| 1281 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1282 | ERROR4: | ||
| 1283 | ;;*************************************************************************** | ||
| 1284 | MOV AX,INV_FN ;AN000;;; WGR bad or missing file message ;AN000 | ||
| 1285 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1286 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1287 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1288 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1289 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1290 | MOV AL,BAD_KEYB_DEF_FILE ;AN000;;; | | ||
| 1291 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1292 | ;;*************************************************************************** | ||
| 1293 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1294 | ERROR5: | ||
| 1295 | ;;*************************************************************************** | ||
| 1296 | MOV AX,INV_CON_Q ;AC000;;; WGR CON code page not available. ;AN000 | ||
| 1297 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1298 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1299 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1300 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1301 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1302 | MOV AL,CONSOLE_ERROR ;AN000;;; | | ||
| 1303 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1304 | ;;*************************************************************************** | ||
| 1305 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1306 | ERROR5A: | ||
| 1307 | ;;*************************************************************************** | ||
| 1308 | MOV AX,MEMORY_OVERF ;AC000;;; WGR not enough resident memory. ;AN000 | ||
| 1309 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1310 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1311 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1312 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1313 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1314 | MOV AL,MEMORY_OVERFLOW ;AN000;;; | | ||
| 1315 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1316 | ;;*************************************************************************** | ||
| 1317 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1318 | ERROR6: | ||
| 1319 | ;;*************************************************************************** | ||
| 1320 | MOV AX,NOT_DESIG ;AC000;;; WGR code page not prepared. ;AN000 | ||
| 1321 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1322 | XOR CX,CX ;AN000;;; WGR no substitutions ;AN000 | ||
| 1323 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1324 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1325 | CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000 | ||
| 1326 | MOV AL,CP_NOT_DESIGNATED ;AN000;;; | | ||
| 1327 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1328 | ;;*************************************************************************** | ||
| 1329 | JMP KEYB_EXIT_NOT_RESIDENT ;; | ||
| 1330 | ERROR6A: | ||
| 1331 | ;;*************************************************************************** | ||
| 1332 | MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000 | ||
| 1333 | LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000 | ||
| 1334 | MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000 | ||
| 1335 | MOV AX,NOT_VALID ;AN000;;; WGR display 'Code page requested....' ;AN000 | ||
| 1336 | MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000 | ||
| 1337 | MOV CX,1 ;AN000;;; WGR one replacement ;AN000 | ||
| 1338 | MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000 | ||
| 1339 | XOR DL,DL ;AN000;;; WGR no input ;AN000 | ||
| 1340 | LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000 | ||
| 1341 | CALL SYSDISPMSG ;AN000;;; WGR ;AN000 | ||
| 1342 | MOV AL,KEYB_TABLE_NOT_LOAD ;AN000;;; | | ||
| 1343 | MOV EXIT_RET_CODE,AL ;AN000;;; | | ||
| 1344 | ;;*************************************************************************** | ||
| 1345 | ;; | ||
| 1346 | KEYB_EXIT_NOT_RESIDENT: ;; | ||
| 1347 | MOV AH,04CH ;; | ||
| 1348 | MOV AL,QUERY_CALL ;; Check if this was a query call | ||
| 1349 | CMP AL,0 ;; | ||
| 1350 | JNE KEYB_EXIT3 ;; IF yes then EXIT | ||
| 1351 | MOV AL,EXIT_RET_CODE ;; Check if return code was valid | ||
| 1352 | CMP AL,0 ;; | ||
| 1353 | JNE KEYB_EXIT3 ;; IF not then EXIT | ||
| 1354 | ;; | ||
| 1355 | COPY_INTO_SDA: ;; | ||
| 1356 | MOV AX,0AD82H ;; Activate language | ||
| 1357 | MOV BL,-1 ;; | ||
| 1358 | INT 2FH ;; | ||
| 1359 | ;; | ||
| 1360 | MOV AH,04CH ;;;;;;;;;;; | ||
| 1361 | MOV AL,EXIT_RET_CODE ;; | ||
| 1362 | MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr | ||
| 1363 | MOV ES,WORD PTR SHARED_AREA_PTR ;; | ||
| 1364 | MOV DX,[BP].RESIDENT_END ;;;;;;;;;;; | ||
| 1365 | MOV CL,4 ;; Calculate resident end in paragraphs | ||
| 1366 | SHR DX,CL ;; | ||
| 1367 | INC DX ;; | ||
| 1368 | ;; | ||
| 1369 | MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr | ||
| 1370 | XOR BP,BP ;; | ||
| 1371 | LEA BX,[BP].ACTIVE_LANGUAGE ;; | ||
| 1372 | ADD DI,BX ;; | ||
| 1373 | ADD SI,BX ;; | ||
| 1374 | MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA | ||
| 1375 | SUB CX,BX ;; | ||
| 1376 | ;; | ||
| 1377 | JMP COPY_SD_AREA ;; Jump to proc that copies area in new | ||
| 1378 | ;; | ||
| 1379 | KEYB_EXIT3: ;;;;;;;;;;; | ||
| 1380 | MOV AL,EXIT_RET_CODE ;; | ||
| 1381 | MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr | ||
| 1382 | MOV ES,WORD PTR SHARED_AREA_PTR ;; | ||
| 1383 | MOV ES:[DI].TABLE_OK,1 ;; | ||
| 1384 | INT 21H ;;;;;;;;;;; | ||
| 1385 | ;; | ||
| 1386 | KEYB_COMMAND ENDP ;; | ||
| 1387 | ;; | ||
| 1388 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1389 | ;; | ||
| 1390 | ;; Procedure: NUMLK_ON | ||
| 1391 | ;; | ||
| 1392 | ;; Description: | ||
| 1393 | ;; Turn Num Lock On. | ||
| 1394 | ;; | ||
| 1395 | ;; Input Registers: | ||
| 1396 | ;; N/A | ||
| 1397 | ;; | ||
| 1398 | ;; Output Registers: | ||
| 1399 | ;; N/A | ||
| 1400 | ;; | ||
| 1401 | ;; Logic: | ||
| 1402 | ;; Set Num Lock bit in BIOS KB_FLAG | ||
| 1403 | ;; Issue Int 16 to update lights | ||
| 1404 | ;; | ||
| 1405 | ;; | ||
| 1406 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1407 | ;; | ||
| 1408 | NUMLK_ON PROC ;; | ||
| 1409 | ;; | ||
| 1410 | PUSH ES ;; | ||
| 1411 | PUSH AX ;; | ||
| 1412 | ;; | ||
| 1413 | MOV AX,DATA ;; | ||
| 1414 | MOV ES,AX ;; | ||
| 1415 | ;; | ||
| 1416 | OR ES:KB_FLAG,NUM_STATE ;; Num Lock state active | ||
| 1417 | MOV AH,1 ;; Issue keyboard query call to | ||
| 1418 | INT 16H ;; have BIOS update the lights | ||
| 1419 | ;; | ||
| 1420 | POP AX ;; | ||
| 1421 | POP ES ;; | ||
| 1422 | RET ;; | ||
| 1423 | ;; | ||
| 1424 | NUMLK_ON ENDP ;; | ||
| 1425 | ;; | ||
| 1426 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1427 | ;; | ||
| 1428 | ;; Module: INSTALL_INT_9 | ||
| 1429 | ;; | ||
| 1430 | ;; Description: | ||
| 1431 | ;; Install our INT 9 driver. | ||
| 1432 | ;; | ||
| 1433 | ;; Input Registers: | ||
| 1434 | ;; DS - points to our data segment | ||
| 1435 | ;; BP - points to ES to find SHARED_DATA_AREA | ||
| 1436 | ;; | ||
| 1437 | ;; Output Registers: | ||
| 1438 | ;; DS - points to our data segment | ||
| 1439 | ;; AX, BX, DX, ES Trashed | ||
| 1440 | ;; | ||
| 1441 | ;; Logic: | ||
| 1442 | ;; Get existing vector | ||
| 1443 | ;; Install our vector | ||
| 1444 | ;; Return | ||
| 1445 | ;; | ||
| 1446 | ;; Notes: | ||
| 1447 | ;; | ||
| 1448 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1449 | ;; | ||
| 1450 | REPLACE_INT_SEGMENT1 DW ? ;; | ||
| 1451 | ;; | ||
| 1452 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1453 | ;; Program Code | ||
| 1454 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1455 | ;; | ||
| 1456 | INSTALL_INT_9 PROC ;; | ||
| 1457 | ;; | ||
| 1458 | PUSH ES ;; | ||
| 1459 | ;; | ||
| 1460 | MOV AH,35H ;; Get int 9 vector | ||
| 1461 | MOV AL,9 ;; | ||
| 1462 | INT 21H ;; Vector in ES:BX | ||
| 1463 | MOV REPLACE_INT_SEGMENT1,ES ;; | ||
| 1464 | PUSH CS ;; | ||
| 1465 | POP ES ;; | ||
| 1466 | MOV WORD PTR ES:SD.OLD_INT_9,BX ;; Offset | ||
| 1467 | MOV AX,REPLACE_INT_SEGMENT1 ;; | ||
| 1468 | MOV WORD PTR ES:SD.OLD_INT_9+2,AX ;; Segment | ||
| 1469 | MOV AH,25H ;; | ||
| 1470 | MOV AL,9 ;; | ||
| 1471 | MOV DX,OFFSET KEYB_INT_9 ;; Let DOS know about our handler | ||
| 1472 | INT 21H ;; | ||
| 1473 | ;; | ||
| 1474 | POP ES ;; | ||
| 1475 | RET ;; | ||
| 1476 | ;; | ||
| 1477 | INSTALL_INT_9 ENDP ;; | ||
| 1478 | ;; | ||
| 1479 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1480 | ;; | ||
| 1481 | ;; Module: INSTALL_INT_9_NET | ||
| 1482 | ;; | ||
| 1483 | ;; Description: | ||
| 1484 | ;; | ||
| 1485 | ;; | ||
| 1486 | ;; Input Registers: | ||
| 1487 | ;; DS - points to our data segment | ||
| 1488 | ;; BP - points to ES to find SHARED_DATA_AREA | ||
| 1489 | ;; | ||
| 1490 | ;; Output Registers: | ||
| 1491 | ;; DS - points to our data segment | ||
| 1492 | ;; AX, BX, DX, ES Trashed | ||
| 1493 | ;; | ||
| 1494 | ;; Logic: | ||
| 1495 | ;; IF network is installed THEN | ||
| 1496 | ;; Let it know about our INT 9 | ||
| 1497 | ;; Return | ||
| 1498 | ;; | ||
| 1499 | ;; Notes: | ||
| 1500 | ;; | ||
| 1501 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1502 | ;; | ||
| 1503 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1504 | ;; Program Code | ||
| 1505 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1506 | ;; | ||
| 1507 | INSTALL_INT_9_NET PROC ;; | ||
| 1508 | ;; | ||
| 1509 | PUSH ES ;; | ||
| 1510 | ;; | ||
| 1511 | TEST SD.SYSTEM_FLAG,PC_NET ;; TEST FOR PC_NETWORK | ||
| 1512 | JNZ NET_HAND_SHAKE ;; JUMP IF NETWORK INSTALLED | ||
| 1513 | JMP INSTALL_9_DONE_NET ;; SKIP THE PC NETWORK HANDSHAKE | ||
| 1514 | ;; | ||
| 1515 | NET_HAND_SHAKE: ;; | ||
| 1516 | ;; ES:BX TO CONTAIN INT 9 ADDR | ||
| 1517 | MOV BX,OFFSET KEYB_INT_9 ;; | ||
| 1518 | MOV AX,0B808H ;; FUNCTION FOR PC NETWORK TO INSTALL | ||
| 1519 | ;; THIS ADDRESS FOR THEIR JUMP TABLE | ||
| 1520 | INT 02FH ;; TELL PC_NET TO USE MY ADDR TO CHAIN TO | ||
| 1521 | ;; | ||
| 1522 | INSTALL_9_DONE_NET: ;; | ||
| 1523 | POP ES ;; | ||
| 1524 | RET ;; | ||
| 1525 | ;; | ||
| 1526 | INSTALL_INT_9_NET ENDP ;; | ||
| 1527 | ;; | ||
| 1528 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1529 | ;; | ||
| 1530 | ;; Module: INSTALL_INT_2F_48 | ||
| 1531 | ;; | ||
| 1532 | ;; Description: | ||
| 1533 | ;; Install our INT 2F, INT 48 drivers. | ||
| 1534 | ;; | ||
| 1535 | ;; Input Registers: | ||
| 1536 | ;; DS - points to our data segment | ||
| 1537 | ;; BP - points to ES to find SHARED_DATA_AREA | ||
| 1538 | ;; | ||
| 1539 | ;; Output Registers: | ||
| 1540 | ;; DS - points to our data segment | ||
| 1541 | ;; AX, BX, DX, ES Trashed | ||
| 1542 | ;; | ||
| 1543 | ;; Logic: | ||
| 1544 | ;; Get existing vectors | ||
| 1545 | ;; Install our vectors | ||
| 1546 | ;; Return | ||
| 1547 | ;; | ||
| 1548 | ;; Notes: | ||
| 1549 | ;; | ||
| 1550 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1551 | ;; | ||
| 1552 | REPLACE_INT_SEGMENT2 DW ? ;; | ||
| 1553 | ;; | ||
| 1554 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1555 | ;; Program Code | ||
| 1556 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1557 | ;; | ||
| 1558 | INSTALL_INT_2F_48 PROC ;; | ||
| 1559 | ;; | ||
| 1560 | MOV AH,35H ;; Get int 2f vector | ||
| 1561 | MOV AL,2FH ;; | ||
| 1562 | INT 21H ;; Vector in ES:BX | ||
| 1563 | MOV REPLACE_INT_SEGMENT2,ES ;; | ||
| 1564 | PUSH CS ;; | ||
| 1565 | POP ES ;; | ||
| 1566 | MOV WORD PTR ES:SD.OLD_INT_2F,BX ;; Offset | ||
| 1567 | MOV AX,REPLACE_INT_SEGMENT2 ;; | ||
| 1568 | MOV WORD PTR ES:SD.OLD_INT_2F+2,AX ;; Segment | ||
| 1569 | MOV AH,25H ;; Set int 9 vector | ||
| 1570 | MOV AL,2FH ;; | ||
| 1571 | MOV DX,OFFSET KEYB_INT_2F ;; Vector in DS:DX | ||
| 1572 | INT 21H ;; | ||
| 1573 | ;; | ||
| 1574 | ARE_WE_A_PCJR: ;; | ||
| 1575 | ;; | ||
| 1576 | MOV AX,SD.SYSTEM_FLAG ;; Test if we are a PCjr | ||
| 1577 | CMP AX,PC_JR ;; | ||
| 1578 | JNE INSTALL_DONE ;; IF yes then | ||
| 1579 | MOV AH,35H ;; Get int 48 vector | ||
| 1580 | MOV AL,48H ;; | ||
| 1581 | INT 21H ;; Vector in ES:BX | ||
| 1582 | MOV REPLACE_INT_SEGMENT2,ES ;; | ||
| 1583 | PUSH CS ;; | ||
| 1584 | POP ES ;; | ||
| 1585 | MOV WORD PTR ES:SD.OLD_INT_48,BX ;; Offset | ||
| 1586 | MOV AX,REPLACE_INT_SEGMENT2 ;; | ||
| 1587 | MOV WORD PTR ES:SD.OLD_INT_48+2,AX ;; Segment | ||
| 1588 | MOV AH,25H ;; Set int 48 vector | ||
| 1589 | MOV AL,48H ;; | ||
| 1590 | MOV DX,OFFSET KEYB_INT_48 ;; Vector in DS:DX | ||
| 1591 | INT 21H ;; | ||
| 1592 | ;; | ||
| 1593 | INSTALL_DONE: ;; | ||
| 1594 | |||
| 1595 | |||
| 1596 | RET ;; | ||
| 1597 | ;; | ||
| 1598 | INSTALL_INT_2F_48 ENDP ;; | ||
| 1599 | ;; | ||
| 1600 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1601 | ;; | ||
| 1602 | ;; Module: REMOVE_INT_9 | ||
| 1603 | ;; | ||
| 1604 | ;; Description: | ||
| 1605 | ;; Remove our INT 9 driver. | ||
| 1606 | ;; | ||
| 1607 | ;; Input Registers: | ||
| 1608 | ;; DS - points to our data segment | ||
| 1609 | ;; BP - points to ES to find SHARED_DATA_AREA | ||
| 1610 | ;; | ||
| 1611 | ;; Output Registers: | ||
| 1612 | ;; DS - points to our data segment | ||
| 1613 | ;; AX, BX, DX, ES Trashed | ||
| 1614 | ;; | ||
| 1615 | ;; Logic: | ||
| 1616 | ;; Get old vector | ||
| 1617 | ;; Install old vector | ||
| 1618 | ;; Return | ||
| 1619 | ;; | ||
| 1620 | ;; Notes: | ||
| 1621 | ;; | ||
| 1622 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1623 | ;; | ||
| 1624 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1625 | ;; Program Code | ||
| 1626 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1627 | ;; | ||
| 1628 | REMOVE_INT_9 PROC ;; | ||
| 1629 | ;; | ||
| 1630 | PUSH DS ;; | ||
| 1631 | PUSH ES ;; | ||
| 1632 | MOV ES,WORD PTR SHARED_AREA_PTR ;; | ||
| 1633 | MOV AX,WORD PTR ES:SD.OLD_INT_9+2 ;; int 9 vector - segment | ||
| 1634 | MOV DS,AX ;; | ||
| 1635 | MOV DX,WORD PTR ES:SD.OLD_INT_9 ;; int 9 vector - offset | ||
| 1636 | ;; | ||
| 1637 | MOV AH,25H ;;;;;;;;; Set int 9 vector | ||
| 1638 | MOV AL,9 ;; | ||
| 1639 | INT 21H ;; | ||
| 1640 | ;; | ||
| 1641 | REMOVE_9_DONE: ;; | ||
| 1642 | POP ES ;; | ||
| 1643 | POP DS ;; | ||
| 1644 | RET ;; | ||
| 1645 | ;; | ||
| 1646 | REMOVE_INT_9 ENDP ;; | ||
| 1647 | ;; | ||
| 1648 | ;*********************** CNS **********;; | ||
| 1649 | PURPOSE: ;; | ||
| 1650 | INPUT: ;; | ||
| 1651 | OUTPUT: ;; | ||
| 1652 | ;**************************************;; | ||
| 1653 | ;AN000;;; | ||
| 1654 | ;AN000;;; | ||
| 1655 | ;AN000;;; | ||
| 1656 | IDLANG_CHK PROC NEAR ;AN000;;; | ||
| 1657 | ;AN000;;; | ||
| 1658 | mov ax,fb.kl_id_code ;AN000;;;get the id code from the table | ||
| 1659 | cmp ax,[bp].id_parm ;AN000;;;;;;;;;;;compare it to value taken | ||
| 1660 | jne end_match ;AN000; ;from the switch-- if found | ||
| 1661 | cmp ALPHA,0 ;AN000; ;a keyboard code was specified | ||
| 1662 | je a_match ;AN000; ;no lang & a match | ||
| 1663 | ;AN000; ; | ||
| 1664 | mov ax,fb.kl_lang_code ;AN000; ;compare lang codes | ||
| 1665 | cmp ax,[BP].LANGUAGE_PARM ;AN000; ;they are equal | ||
| 1666 | je a_match ;AN000; ; | ||
| 1667 | ;AN000; ; | ||
| 1668 | jmp end_match ;AN000; ;if not found go check next | ||
| 1669 | ;AN000; ;id for the same country | ||
| 1670 | ;AN000; ; | ||
| 1671 | a_match: ;AN000; ; | ||
| 1672 | ; | ||
| 1673 | mov good_match,1 ;AN000; ;report the ids match | ||
| 1674 | ; | ||
| 1675 | end_match: ;AN000; ; | ||
| 1676 | ; | ||
| 1677 | ret ;AN000; ; | ||
| 1678 | ; | ||
| 1679 | IDLANG_CHK ENDP ;AN000; ; | ||
| 1680 | ;*********************** CNS *******************; | ||
| 1681 | ;**********************************SCAN_ID***********************; | ||
| 1682 | ; New variables defined - NUM_ID,ADRSS_LANG,ID_PTR_SIZE,ID_FOUND ; | ||
| 1683 | ;****************************************************************; | ||
| 1684 | ; | ||
| 1685 | ; | ||
| 1686 | SCAN_ID PROC NEAR ; | ||
| 1687 | ; | ||
| 1688 | xor di,di ;AN000;;clear di to set at the | ||
| 1689 | ;AN000;;beginning of KEYBSYS STRUCTURE | ||
| 1690 | ;;;;;;;;;; | ||
| 1691 | ; | ||
| 1692 | lea cx,[di].kh_num_ID+4 ;AN000;; set number of bytes to read header | ||
| 1693 | ; | ||
| 1694 | mov ah,3fh ;AN000;; | ||
| 1695 | int 21h ;AN000;; | ||
| 1696 | jnc VAL5ID ;AN000;; | ||
| 1697 | jmp BAD_TAB ;AN000;;;bad table message | ||
| 1698 | ; | ||
| 1699 | VAL5ID: ;AN000; ; | ||
| 1700 | ; | ||
| 1701 | mov cx,SIGNATURE_LENGTH ;AN000; ; | ||
| 1702 | mov di,offset SIGNATURE ;AN000; ; | ||
| 1703 | mov si,offset FB.KH_SIGNATURE;AN000; ; | ||
| 1704 | repe CMPSB ;AN000; ; | ||
| 1705 | je ID_SPECIFIED ;AN000; ; | ||
| 1706 | jmp BAD_TAB ;AN000; ; | ||
| 1707 | ; | ||
| 1708 | ; | ||
| 1709 | ; | ||
| 1710 | ID_SPECIFIED: ;AN000; ; | ||
| 1711 | ; | ||
| 1712 | mov ax,FB.KH_NUM_ID ;AN000; ;;;;;;;;;;;;;;; | ||
| 1713 | mov NUM_ID,ax ;AN000; ;save # of IDs | ||
| 1714 | mul ID_PTR_SIZE ;AN000; ;determine # of bytes to read | ||
| 1715 | push ax ;AN000; ;save current # of bytes to read for | ||
| 1716 | ;AN000; ;ID values only | ||
| 1717 | mov ax,FB.KH_NUM_LANG ;AN000; ;add on lang data in table | ||
| 1718 | mul LANG_PTR_SIZE ;AN000; ;data that comes before the ID data | ||
| 1719 | mov cx,ax ;AN000; ;save that value for the size compare | ||
| 1720 | mov PASS_LANG,cx ;AN000; ; | ||
| 1721 | pop ax ;AN000; ;restore the info for # of ID bytes to read | ||
| 1722 | add cx,ax ;AN000; ;add that value to get total in CX | ||
| 1723 | mov TOTAL_SIZE,cx ;AN000; ;save the total size | ||
| 1724 | cmp cx,FILE_BUFFER_SIZE ;AN000; ; | ||
| 1725 | jbe READ_ID_TAB ;AN000; ; | ||
| 1726 | jmp BAD_TAB ;AN000; ; | ||
| 1727 | ; | ||
| 1728 | ; | ||
| 1729 | READ_ID_TAB: ;AN000; ; | ||
| 1730 | ; | ||
| 1731 | mov dx,offset FILE_BUFFER ;AN000; ; | ||
| 1732 | mov ah,3fh ;;AN000;read language table from | ||
| 1733 | int 21h ;;AN000;keyb defn file | ||
| 1734 | jnc READ_IDVAL ;;AN000; | ||
| 1735 | jmp BAD_TAB ;;AN000; | ||
| 1736 | ; | ||
| 1737 | READ_IDVAL: ;;AN000; | ||
| 1738 | ;;AN000; | ||
| 1739 | mov cx,NUM_ID ;;AN000; | ||
| 1740 | mov di,offset FILE_BUFFER ;;AN000;;;;;;;;;; | ||
| 1741 | add di,PASS_LANG ;AN000; ; | ||
| 1742 | ; | ||
| 1743 | SCAN_ID_TAB: ;AN000; ; | ||
| 1744 | ; | ||
| 1745 | mov ax,[bp].ID_PARM ;AN000; ; | ||
| 1746 | cmp [di].KP_ID_CODE,ax ;AN000; ; | ||
| 1747 | je ID_HERE ;AN000; ; | ||
| 1748 | add di,ID_PTR_SIZE ;AN000; ; | ||
| 1749 | dec cx ;AN000; ; | ||
| 1750 | jne SCAN_ID_TAB ;AN000; ; | ||
| 1751 | jmp FINALE ;AN000; ; | ||
| 1752 | ; | ||
| 1753 | BAD_TAB: ;AN000;; | ||
| 1754 | ; | ||
| 1755 | mov ERR4ID,1 ;AN000; ; | ||
| 1756 | jmp FINALE ;AN000; ; | ||
| 1757 | ; | ||
| 1758 | ; | ||
| 1759 | ; | ||
| 1760 | ID_HERE: ;AN000; ; | ||
| 1761 | ; | ||
| 1762 | mov ID_FOUND,1 ;AN000;;reset ptr for ; | ||
| 1763 | ;AN000;;current country ; | ||
| 1764 | ; | ||
| 1765 | |||
| 1766 | ; | ||
| 1767 | FINALE: ;AN000; ; | ||
| 1768 | ; | ||
| 1769 | ret ;AN000; ; | ||
| 1770 | ; | ||
| 1771 | ; | ||
| 1772 | SCAN_ID ENDP ;AN000; ; | ||
| 1773 | ; | ||
| 1774 | ;*******************************SCAN_ID END******; | ||
| 1775 | ;; | ||
| 1776 | ;; Module: BUILD_PATH | ||
| 1777 | ;; | ||
| 1778 | ;; Description: | ||
| 1779 | ;; Build the complete filename of the Keyboard Definition File | ||
| 1780 | ;;*************************************WGR********************* | ||
| 1781 | ;; and open the file. | ||
| 1782 | ;;+++++++++++++++++++++++++++++++++++++WGR+++++++++++++++++++++ | ||
| 1783 | ;; | ||
| 1784 | ;; Input Registers: | ||
| 1785 | ;; DS - points to our data segment | ||
| 1786 | ;; ES - points to our data segment | ||
| 1787 | ;; BP - offset of parmeter list | ||
| 1788 | ;; | ||
| 1789 | ;; Output Registers: | ||
| 1790 | ;;************************************WGR********************** | ||
| 1791 | ;; CARRY CLEAR | ||
| 1792 | ;; AX = HANDLE | ||
| 1793 | ;; CARRY SET (ERROR) | ||
| 1794 | ;; NONE | ||
| 1795 | ;;++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++++++ | ||
| 1796 | ;; The complete filename will be available in FILE_NAME | ||
| 1797 | ;; | ||
| 1798 | ;; Logic: | ||
| 1799 | ;; | ||
| 1800 | ;; Determine whether path parameter was specified | ||
| 1801 | ;; IF length is zero THEN | ||
| 1802 | ;;****************************************WGR****************** | ||
| 1803 | ;; Try to open file in ACTIVE directory | ||
| 1804 | ;; IF failed THEN | ||
| 1805 | ;; Try to open file in ARGV(0) directory | ||
| 1806 | ;; IF failed THEN | ||
| 1807 | ;; Try to open file in ROOT directory (for DOS 3.3 compatibility) | ||
| 1808 | ;; ENDIF | ||
| 1809 | ;; ENDIF | ||
| 1810 | ;; ENDIF | ||
| 1811 | ;; ELSE | ||
| 1812 | ;; Copy path from PSP to FILE_NAME memory area | ||
| 1813 | ;; Try to open USER SPECIFIED file | ||
| 1814 | ;;++++++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++ | ||
| 1815 | ;; | ||
| 1816 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1817 | ;; | ||
| 1818 | KEYBOARD_SYS DB '\KEYBOARD.SYS',00 ;AN000;;; | ||
| 1819 | KEYB_SYS_ACTIVE DB 'KEYBOARD.SYS',00 ;AN000;;; WGR ;AN000 | ||
| 1820 | KEYB_SYS_LENG EQU 14 ;AN000;;; | ||
| 1821 | KEYB_SYS_A_LENG EQU 13 ;AN000;;; WGR ;AN000 | ||
| 1822 | ;; | ||
| 1823 | FILE_NAME DB 128 DUP(0) ;AN000;;; | ||
| 1824 | ;; | ||
| 1825 | FILE_NOT_FOUND EQU 2 ;AN000;;; WGR ;AN000 | ||
| 1826 | PATH_NOT_FOUND EQU 3 ;AN000;;; WGR ;AN000 | ||
| 1827 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1828 | ;; Program Code | ||
| 1829 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1830 | ;; | ||
| 1831 | BUILD_PATH PROC NEAR ;; | ||
| 1832 | CLD ;AN000;;; WGR ;AN000 | ||
| 1833 | MOV DI,OFFSET FILE_NAME ;; Get the offset of the filename | ||
| 1834 | MOV CX,[BP].PATH_LENGTH ;; If path is specified then | ||
| 1835 | CMP CX,0 ;; | ||
| 1836 | JE APPEND_KEYB_SYS ;; | ||
| 1837 | MOV SI,[BP].PATH_OFFSET ;; Get the offset of the path | ||
| 1838 | ;; | ||
| 1839 | REPE MOVSB ;AC000;;; Copy each char of the specified | ||
| 1840 | MOV AX,3D00H ;AC000;;; WGR Open the KEYBOARD.SYS file ;AN000 | ||
| 1841 | MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000 | ||
| 1842 | INT 21H ;AC000;;; WGR ;AN000 | ||
| 1843 | RET ;; path into the filename location | ||
| 1844 | ;; | ||
| 1845 | APPEND_KEYB_SYS: ;;;;; | ||
| 1846 | MOV SI,OFFSET KEYB_SYS_ACTIVE ;AC000;;; WGR copy name for active directory ;AN000 | ||
| 1847 | MOV CX,KEYB_SYS_A_LENG ;AC000;;;;;; WGR to file name variable. ;AN000 | ||
| 1848 | REPE MOVSB ;AC000;;; WGR ;AN000 | ||
| 1849 | MOV AX,3D00H ;AC000;;; WGR try to open it. ;AN000 | ||
| 1850 | MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000 | ||
| 1851 | INT 21H ;AC000;;; WGR ;AN000 | ||
| 1852 | .IF C ;AC000;;; WGR error in opening...was it.. ;AN000 | ||
| 1853 | .IF <AX EQ PATH_NOT_FOUND> OR ;AN000;;; WGR path or.. ;AN000 | ||
| 1854 | .IF <AX EQ FILE_NOT_FOUND> ;AN000;;; WGR file not found?... ;AN000 | ||
| 1855 | CALL COPY_ARGV0 ;AC000;;; WGR yes....try ARGV(0) directory. ;AN000 | ||
| 1856 | MOV AX,3D00H ;AC000;;; WGR ;AN000 | ||
| 1857 | MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000 | ||
| 1858 | INT 21H ;AC000;;; WGR ;AN000 | ||
| 1859 | .IF C ;AC000;;; WGR error in opening....was it.. ;AN000 | ||
| 1860 | .IF <AX EQ PATH_NOT_FOUND> OR ;AC000;;; WGR path or.. ;AN000 | ||
| 1861 | .IF <AX EQ FILE_NOT_FOUND> ;AC000;;; WGR file not found? ;AN000 | ||
| 1862 | MOV SI,OFFSET KEYBOARD_SYS ;AC000;;; WGR try ROOT directory. ;AN000 | ||
| 1863 | MOV DI,OFFSET FILE_NAME ;AC000;;; WGR ;AN000 | ||
| 1864 | MOV CX,KEYB_SYS_LENG ;AC000;;; WGR ;AN000 | ||
| 1865 | REPE MOVSB ;AC000;;; WGR ;AN000 | ||
| 1866 | MOV AX,3D00H ;AC000;;; WGR ;AN000 | ||
| 1867 | MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000 | ||
| 1868 | INT 21H ;AC000;;; WGR ;AN000 | ||
| 1869 | .ELSE ;AC000;;; WGR if failed then carry set.. ;AN000 | ||
| 1870 | STC ;AC000;;; WGR some other error..set flag ;AN000 | ||
| 1871 | .ENDIF ;AC000;;; WGR ;AN000 | ||
| 1872 | .ENDIF ;AC000;;; WGR ;AN000 | ||
| 1873 | .ELSE ;AN000;;; WGR ;AN000 | ||
| 1874 | STC ;AN000;;; WGR some other error..set flag. ;AN000 | ||
| 1875 | .ENDIF ;AN000;;; WGR ;AN000 | ||
| 1876 | .ENDIF ;AN000;;; WGR ;AN000 | ||
| 1877 | ;; | ||
| 1878 | RET ;AN000;;; | ||
| 1879 | ;; | ||
| 1880 | BUILD_PATH ENDP ;; | ||
| 1881 | ;; | ||
| 1882 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR | ||
| 1883 | ;; WGR | ||
| 1884 | ;; Module Name: WGR | ||
| 1885 | ;; COPY_ARGV0 WGR | ||
| 1886 | ;; WGR | ||
| 1887 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR | ||
| 1888 | ;; WGR | ||
| 1889 | ;; WGR | ||
| 1890 | COPY_ARGV0 PROC ;; WGR ;AN000 | ||
| 1891 | ;; WGR ;AN000 | ||
| 1892 | PUSH ES ;AN000;;; WGR ;AN000 | ||
| 1893 | PUSH DI ;AN000;;; WGR ;AN000 | ||
| 1894 | PUSH SI ;AN000;;; WGR ;AN000 | ||
| 1895 | PUSH CX ;AN000;;; WGR ;AN000 | ||
| 1896 | ;AN000;;; WGR ;AN000 | ||
| 1897 | MOV DI,2CH ;AN000;;; WGR Locate environment string ;AN000 | ||
| 1898 | MOV ES,[DI] ;AN000;;; WGR ;AN000 | ||
| 1899 | XOR SI,SI ;AN000;;; WGR ;AN000 | ||
| 1900 | .WHILE <<WORD PTR ES:[SI]> NE 0> ;AN000;;; WGR find ARGV(0) string. ;AN000 | ||
| 1901 | INC SI ;AN000;;; WGR ;AN000 | ||
| 1902 | .ENDWHILE ;AN000;;; WGR ;AN000 | ||
| 1903 | ADD SI,4 ;AN000;;; WGR ;AN000 | ||
| 1904 | LEA DI,FILE_NAME ;AN000;;; WGR move string to work area ;AN000 | ||
| 1905 | .REPEAT ;AN000;;; WGR ;AN000 | ||
| 1906 | MOV AL,ES:[SI] ;AN000;;; WGR ;AN000 | ||
| 1907 | MOV [DI],AL ;AN000;;; WGR ;AN000 | ||
| 1908 | INC SI ;AN000;;; WGR ;AN000 | ||
| 1909 | INC DI ;AN000;;; WGR ;AN000 | ||
| 1910 | .UNTIL <<BYTE PTR ES:[SI]> EQ 0> ;AN000;;; WGR ;AN000 | ||
| 1911 | .REPEAT ;AN000;;; WGR ;AN000 | ||
| 1912 | DEC DI ;AN000;;; WGR ;AN000 | ||
| 1913 | .UNTIL <<BYTE PTR [DI]> EQ '\'> OR ;AN000;;; WGR ;AN000 | ||
| 1914 | .UNTIL <<BYTE PTR [DI]> EQ 0> ;AN000;;; WGR scan back to.. ;AN000 | ||
| 1915 | INC DI ;AN000;;; WGR first character after "\" ;AN000 | ||
| 1916 | PUSH CS ;AN000;;; WGR ;AN000 | ||
| 1917 | POP ES ;AN000;;; WGR ;AN000 | ||
| 1918 | LEA SI,KEYB_SYS_ACTIVE ;AN000;;; WGR copy in "KEYBOARD.SYS" ;AN000 | ||
| 1919 | MOV CX,KEYB_SYS_A_LENG ;AN000;;; WGR ;AN000 | ||
| 1920 | REPE MOVSB ;AN000;;; WGR ;AN000 | ||
| 1921 | ;AN000;;; WGR ;AN000 | ||
| 1922 | POP CX ;AN000;;; WGR ;AN000 | ||
| 1923 | POP SI ;AN000;;; WGR ;AN000 | ||
| 1924 | POP DI ;AN000;;; WGR ;AN000 | ||
| 1925 | POP ES ;AN000;;; WGR ;AN000 | ||
| 1926 | RET ;AN000;;; WGR ;AN000 | ||
| 1927 | ;AN000;;; WGR ;AN000 | ||
| 1928 | COPY_ARGV0 ENDP ;AN000;;; | ||
| 1929 | ;AN000;;; | ||
| 1930 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1931 | ;; | ||
| 1932 | ;; Module: FIND_FIRST_CP | ||
| 1933 | ;; | ||
| 1934 | ;; Description: | ||
| 1935 | ;; Check the keyboard definition file for the first code page | ||
| 1936 | ;; | ||
| 1937 | ;; Input Registers: | ||
| 1938 | ;; DS - points to our data segment | ||
| 1939 | ;; ES - points to our data segment | ||
| 1940 | ;; BP - offset of parmeter list | ||
| 1941 | ;; | ||
| 1942 | ;; Output Registers: | ||
| 1943 | ;; NONE | ||
| 1944 | ;; | ||
| 1945 | ;; Logic: | ||
| 1946 | ;; Open the file | ||
| 1947 | ;; IF error in opening file THEN | ||
| 1948 | ;; Display ERROR message and EXIT | ||
| 1949 | ;; ELSE | ||
| 1950 | ;; Save handle | ||
| 1951 | ;; Set address of buffer | ||
| 1952 | ;; READ header of Keyboard definition file | ||
| 1953 | ;; IF error in reading file THEN | ||
| 1954 | ;; Display ERROR message and EXIT | ||
| 1955 | ;; ELSE | ||
| 1956 | ;; Check signature for correct file | ||
| 1957 | ;; IF file signature is correct THEN | ||
| 1958 | ;; READ language table | ||
| 1959 | ;; IF error in reading file THEN | ||
| 1960 | ;; Display ERROR message and EXIT | ||
| 1961 | ;; ELSE | ||
| 1962 | ;; Use table to verify language parm | ||
| 1963 | ;; Set pointer values | ||
| 1964 | ;; IF code page was specified | ||
| 1965 | ;; READ language entry | ||
| 1966 | ;; IF error in reading file THEN | ||
| 1967 | ;; Display ERROR message and EXIT | ||
| 1968 | ;; ELSE | ||
| 1969 | ;; READ first code page | ||
| 1970 | ;; IF error in reading file THEN | ||
| 1971 | ;; Display ERROR message and EXIT | ||
| 1972 | ;; RET | ||
| 1973 | ;; | ||
| 1974 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1975 | ;; | ||
| 1976 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1977 | ;; Program Code | ||
| 1978 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1979 | ;; | ||
| 1980 | FIND_FIRST_CP PROC NEAR ;; | ||
| 1981 | ;; | ||
| 1982 | PUSH CX ;; Save everything that | ||
| 1983 | PUSH DX ;; that will be changed | ||
| 1984 | PUSH SI ;; | ||
| 1985 | PUSH DI ;; | ||
| 1986 | ;; | ||
| 1987 | MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle | ||
| 1988 | MOV DX,WORD PTR KEYBCMD_LANG_ENTRY_PTR ;; LSEEK file pointer | ||
| 1989 | MOV CX,WORD PTR KEYBCMD_LANG_ENTRY_PTR+2 ;; to top of language entry | ||
| 1990 | MOV AH,42H ;; | ||
| 1991 | MOV AL,0 ;;;;;;;;;;;;;; If no problem with | ||
| 1992 | INT 21H ;; Keyb Def file Then | ||
| 1993 | JNC FIND_FIRST_BEGIN ;; | ||
| 1994 | JMP FIND_FIRST_CP_ERROR4 ;; | ||
| 1995 | ;;;;;;;;; | ||
| 1996 | FIND_FIRST_BEGIN: ;; | ||
| 1997 | MOV DI,AX ;; | ||
| 1998 | MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number | ||
| 1999 | ;; bytes to read header | ||
| 2000 | MOV DX,OFFSET FILE_BUFFER ;;;;;;;;; | ||
| 2001 | MOV AH,3FH ;; Read language entry in | ||
| 2002 | INT 21H ;; keyboard definition file | ||
| 2003 | JNC FIND_FIRST_VALID4 ;; If no error in opening file then | ||
| 2004 | JMP FIND_FIRST_CP_ERROR4 ;; | ||
| 2005 | ;; | ||
| 2006 | FIND_FIRST_VALID4: ;; | ||
| 2007 | ;************************** CNS *******;; | ||
| 2008 | xor ah,ah ;AC000;;; | ||
| 2009 | MOV Al,FB.KL_NUM_CP ;AC000;;; | ||
| 2010 | ;************************** CNS *******;; | ||
| 2011 | MUL CP_PTR_SIZE ;; Determine # of bytes to read | ||
| 2012 | MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer | ||
| 2013 | MOV CX,AX ;; | ||
| 2014 | CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small | ||
| 2015 | JBE FIND_FIRST_VALID5 ;; | ||
| 2016 | JMP FIND_FIRST_CP_ERROR4 ;; | ||
| 2017 | ;; | ||
| 2018 | FIND_FIRST_VALID5: ;; | ||
| 2019 | MOV AH,3FH ;; Read code page table from | ||
| 2020 | INT 21H ;; keyboard definition file | ||
| 2021 | JNC FIND_FIRST_VALID6 ;; If no error in opening file then | ||
| 2022 | JMP FIND_FIRST_CP_ERROR4 ;; | ||
| 2023 | ;; | ||
| 2024 | FIND_FIRST_VALID6: ;; | ||
| 2025 | MOV CX,NUM_CP ;; Number of valid codes | ||
| 2026 | MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table | ||
| 2027 | ;; | ||
| 2028 | MOV BX,[DI].KC_CODE_PAGE ;; Get parameter | ||
| 2029 | XOR AX,AX ;; | ||
| 2030 | JMP FIND_FIRST_RETURN ;; | ||
| 2031 | ;; | ||
| 2032 | FIND_FIRST_CP_ERROR4: ;; | ||
| 2033 | MOV AX,4 ;; | ||
| 2034 | ;; | ||
| 2035 | FIND_FIRST_RETURN: ;; | ||
| 2036 | POP DI ;; | ||
| 2037 | POP SI ;; | ||
| 2038 | POP DX ;; | ||
| 2039 | POP CX ;; | ||
| 2040 | ;; | ||
| 2041 | RET ;; | ||
| 2042 | ;; | ||
| 2043 | FIND_FIRST_CP ENDP ;; | ||
| 2044 | ;;;;;;;;;;;;; | ||
| 2045 | .xlist ;; | ||
| 2046 | MSG_SERVICES <MSGDATA> ;AN000;;; WGR ;AN000 | ||
| 2047 | MSG_SERVICES <LOADmsg,DISPLAYmsg,CHARmsg,NUMmsg> ;AN000;;; WGR ;AN000 | ||
| 2048 | MSG_SERVICES <KEYB.CL1> ;AN000;;; WGR ;AN000 | ||
| 2049 | MSG_SERVICES <KEYB.CL2> ;AN000;;; WGR ;AN000 | ||
| 2050 | MSG_SERVICES <KEYB.CLA> ;AN000;;; WGR ;AN000 | ||
| 2051 | .list ;; | ||
| 2052 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2053 | ;; Temp Shared Data Area | ||
| 2054 | ;; Contains data which is required by | ||
| 2055 | ;; both the resident and transient KEYB code. | ||
| 2056 | ;; All keyboard tables are stored in this area | ||
| 2057 | ;; Structures for this area are in file KEYBSHAR.INC | ||
| 2058 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2059 | ;; | ||
| 2060 | ;; | ||
| 2061 | db 'TEMP SHARED DATA' ;; | ||
| 2062 | SD_SOURCE_PTR LABEL BYTE ;; | ||
| 2063 | TEMP_SHARED_DATA SHARED_DATA_STR <> ;; | ||
| 2064 | ;; | ||
| 2065 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2066 | |||
| 2067 | CODE ENDS | ||
| 2068 | |||
| 2069 | include msgdcl.inc | ||
| 2070 | |||
| 2071 | END | ||
| 2072 | \ No newline at end of file | ||