diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/KEYB | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/KEYB')
28 files changed, 8500 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/COMMSUBS.ASM b/v4.0/src/CMD/KEYB/COMMSUBS.ASM new file mode 100644 index 0000000..3810ed2 --- /dev/null +++ b/v4.0/src/CMD/KEYB/COMMSUBS.ASM | |||
| @@ -0,0 +1,603 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE DOS - KEYB Command - Transient Command Processing | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; DOS - NLS Support - KEYB Command | ||
| 6 | ;; (C) Copyright 1988 Microsoft | ||
| 7 | ;; | ||
| 8 | ;; File Name: COMMSUBS.ASM | ||
| 9 | ;; ---------- | ||
| 10 | ;; | ||
| 11 | ;; Description: | ||
| 12 | ;; ------------ | ||
| 13 | ;; Common subroutines used by NLS support | ||
| 14 | ;; | ||
| 15 | ;; Documentation Reference: | ||
| 16 | ;; ------------------------ | ||
| 17 | ;; None | ||
| 18 | ;; | ||
| 19 | ;; Procedures Contained in This File: | ||
| 20 | ;; ---------------------------------- | ||
| 21 | ;; | ||
| 22 | ;; FIND_HW_TYPE - Determine the keyboard and system unit types and | ||
| 23 | ;; set the corresponding flags. | ||
| 24 | ;; | ||
| 25 | ;; Include Files Required: | ||
| 26 | ;; ----------------------- | ||
| 27 | ;; None | ||
| 28 | ;; | ||
| 29 | ;; External Procedure References: | ||
| 30 | ;; ------------------------------ | ||
| 31 | ;; FROM FILE ????????.ASM: | ||
| 32 | ;; ????????? - ???????????????????????????????????????????? | ||
| 33 | ;; | ||
| 34 | ;; Change History: | ||
| 35 | ;; --------------- | ||
| 36 | ;; | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | ;; | ||
| 40 | PUBLIC FIND_SYS_TYPE ;; | ||
| 41 | PUBLIC FIND_KEYB_TYPE ;; | ||
| 42 | PUBLIC HW_TYPE ;; | ||
| 43 | PUBLIC SECURE_FL ;; | ||
| 44 | |||
| 45 | ;; | ||
| 46 | INCLUDE KEYBEQU.INC ;; | ||
| 47 | INCLUDE KEYBCPSD.INC ;; | ||
| 48 | INCLUDE KEYBSHAR.INC ;; | ||
| 49 | INCLUDE KEYBCMD.INC ;; | ||
| 50 | INCLUDE DSEG.INC ;; | ||
| 51 | INCLUDE POSTEQU.INC ;; | ||
| 52 | ;; | ||
| 53 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 54 | ;; | ||
| 55 | ASSUME CS:CODE,DS:CODE ;; | ||
| 56 | ;; | ||
| 57 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 58 | ;; | ||
| 59 | ;; Module: FIND_SYS_TYPE | ||
| 60 | ;; | ||
| 61 | ;; Description: | ||
| 62 | ;; Determine the type of system we are running on. | ||
| 63 | ;; SYSTEM_FLAG (in active SHARED_DATA) are set to | ||
| 64 | ;; indicate the system type. | ||
| 65 | ;; This routine is only called the first time KEYB is being installed. | ||
| 66 | ;; | ||
| 67 | ;; | ||
| 68 | ;; Input Registers: | ||
| 69 | ;; DS - points to our data segment | ||
| 70 | ;; | ||
| 71 | ;; Output Registers: | ||
| 72 | ;; NONE | ||
| 73 | ;; | ||
| 74 | ;; Logic: | ||
| 75 | ;; | ||
| 76 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 77 | ;; | ||
| 78 | ROM SEGMENT AT 0F000H ;; | ||
| 79 | ORG 0FFFEH ;; | ||
| 80 | ROMID DB ? ;; | ||
| 81 | ;; SEGMENT F000. (F000:FFFE) | ||
| 82 | ;; | ||
| 83 | ROMPC1 EQU 0FFH ;; ID OF PC1 hardware | ||
| 84 | ROMXT EQU 0FEH ;; ID OF PC-XT/PORTABLE hardware | ||
| 85 | ROMJR EQU 0FDH ;; ID OF PCjr & Optional ROM | ||
| 86 | ROMAT EQU 0FCH ;; ID OF PCAT | ||
| 87 | ROMXT_ENHAN EQU 0FBH ;; ID OF ENHANCED PCXT | ||
| 88 | ROMPAL EQU 0FAH ;; ID FOR PALACE | ||
| 89 | ROMLAP EQU 0F9H ;; ID FOR PC LAP (P-14) | ||
| 90 | ROM_RU_386 EQU 0F8H ;; ID FOR ROUNDUP-386 | ||
| 91 | ;; | ||
| 92 | ROM ENDS ;; | ||
| 93 | ;; | ||
| 94 | ;; ******** CNS | ||
| 95 | ROMEXT SEGMENT AT 00000H ;; ADDRESS SHOULD NOT BE FIXED AT | ||
| 96 | ORG 0003BH ;;AT 09FC0H -- This is just a ;; | ||
| 97 | KEYBID1 DB ? ;;a dummy value of 000H INT 15H call | ||
| 98 | ;; will load dynamically depending | ||
| 99 | ;; upon system mem size- 9FC0 was only for 640K system | ||
| 100 | ;; *** UNTRUE SEGMENT 9FC0. (9FC0:003B) | ||
| 101 | ROMEXT ENDS ;; | ||
| 102 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 103 | ;***CNS | ||
| 104 | |||
| 105 | |||
| 106 | |||
| 107 | |||
| 108 | |||
| 109 | |||
| 110 | |||
| 111 | |||
| 112 | ;; Program Code | ||
| 113 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 114 | ;; | ||
| 115 | FIND_SYS_TYPE PROC NEAR ;; | ||
| 116 | ;; | ||
| 117 | MOV AX,ROM ;; Set segmant to look at ROM | ||
| 118 | MOV DS,AX ;; using the data segment | ||
| 119 | ASSUME DS:ROM ;; | ||
| 120 | ;; | ||
| 121 | MOV AL,ROMID ;; Get hardware ID | ||
| 122 | PUSH AX ;; save it | ||
| 123 | ;; | ||
| 124 | PUSH CS ;; Set data seg back to code | ||
| 125 | POP DS ;; | ||
| 126 | ASSUME DS:CODE ;; | ||
| 127 | ;; | ||
| 128 | MOV AH,92H ;; SET INVALID CALL FOR INT16 | ||
| 129 | INT 16H ;; CALL BIOS | ||
| 130 | CMP AH,80H ;; IS EXTENDED INTERFACE THERE? | ||
| 131 | JA CHECK_PC_NET ;; NO, SKIP FLAG | ||
| 132 | OR SD.SYSTEM_FLAG,EXT_16 ;; default is extended INT 16 support | ||
| 133 | ;; | ||
| 134 | CHECK_PC_NET: ;; | ||
| 135 | MOV AH,30H ;; GET DOS VERSION NUMBER | ||
| 136 | INT 21H ;; MAJOR # IN AL, MINOR # IN AH | ||
| 137 | CMP AX,0A03H ;; SENSITIVE TO 3.10 OR > | ||
| 138 | JB CHECK_SYSTEM ;; EARLIER VERSION OF DOS NOTHING | ||
| 139 | ;; WAS ESTABLISHED FOR THIS SITUATION | ||
| 140 | PUSH ES ;; Save ES just in case | ||
| 141 | MOV AX,3509H ;; GET INT VECTOR 9 CONTENTS | ||
| 142 | INT 21H ;; ES:BX WILL = CURRENT INT9 VECTOR | ||
| 143 | ;; WE WANT TO SEE IF WE ARE THE 1ST ONES LOADED | ||
| 144 | MOV CX,ES ;; INTO THE INT VECTOR 9. WITH DOS 3.1 WE CAN | ||
| 145 | POP ES ;; | ||
| 146 | CMP CX,0F000H ;; HANDSHAKE WITH THE PC NETWORK BUT NO ONE ELSE | ||
| 147 | JE CHECK_SYSTEM ;; INT VECTOR 9 POINTS TO ROM, OK | ||
| 148 | MOV AX,0B800H ;; ASK IF PC NETWORK IS INSTALLED | ||
| 149 | INT 2FH ;; | ||
| 150 | CMP AL,0 ;; NOT INSTALLED IF AL=0 | ||
| 151 | JE CHECK_SYSTEM ;; SOMEBODY ELSE HAS LINKED INTO THE INT VECTOR | ||
| 152 | ;; 9 & I'M GOING TO DROP RIGHT IN AS USUAL | ||
| 153 | OR SD.SYSTEM_FLAG,PC_NET ;; INDICATE PC NET IS RUNNING | ||
| 154 | ;; | ||
| 155 | CHECK_SYSTEM: ;; | ||
| 156 | POP AX ;; get code back | ||
| 157 | ;; Is the hardware a PCjr | ||
| 158 | CMP AL,ROMJR ;; | ||
| 159 | JNE TEST_PC_XT ;; IF not then check for next type | ||
| 160 | OR SD.SYSTEM_FLAG,PC_JR ;; system type | ||
| 161 | JMP FIND_SYS_END ;; Done | ||
| 162 | ;; | ||
| 163 | TEST_PC_XT: ;; | ||
| 164 | ;; Is the hardware a PC1 or XT ? | ||
| 165 | CMP AL,ROMXT ;; | ||
| 166 | JAE ITS_AN_XT ;; IF FE OR FF THEN ITS AN XT | ||
| 167 | CMP AL,ROMXT_ENHAN ;; IF FB IT IS ALSO AN XT | ||
| 168 | JNE TEST_PC_AT ;; IF not then check for next type | ||
| 169 | ITS_AN_XT: ;; | ||
| 170 | OR SD.SYSTEM_FLAG,PC_XT ;; system type | ||
| 171 | JMP FIND_SYS_END ;; | ||
| 172 | ;; | ||
| 173 | TEST_PC_AT: ;; | ||
| 174 | ;; Is the hardware an AT ? | ||
| 175 | CMP AL,ROMAT ;; | ||
| 176 | JNE TEST_P12 ;; IF not then check for next type | ||
| 177 | ;; | ||
| 178 | OR SD.SYSTEM_FLAG,PC_AT ;; system type | ||
| 179 | ;; | ||
| 180 | JMP FIND_SYS_END ;; | ||
| 181 | ;; | ||
| 182 | TEST_P12: ;; | ||
| 183 | CMP AL,ROMLAP ;; IS this a P12? | ||
| 184 | JNE TEST_PAL ;; IF not then check for next type | ||
| 185 | OR SD.SYSTEM_FLAG,PC_LAP ;; system type | ||
| 186 | JMP FIND_SYS_END ;; | ||
| 187 | ;; | ||
| 188 | TEST_PAL: ;; | ||
| 189 | CMP AL,ROMPAL ;; IS this a PALACE? | ||
| 190 | JNE TEST_RU_386 ;; IF not then check for next type | ||
| 191 | OR SD.SYSTEM_FLAG,PC_PAL ;; system type | ||
| 192 | JMP FIND_SYS_END ;; | ||
| 193 | ;; | ||
| 194 | TEST_RU_386: ;; | ||
| 195 | CMP AL,ROM_RU_386 ;; IS this a ROUNDUP with a 386? | ||
| 196 | JNE FIND_SYS_END ;; IF not then check for next type | ||
| 197 | OR SD.SYSTEM_FLAG,PC_386 ;; system type | ||
| 198 | MOV SD.TIMING_FACTOR,2 ;; Bump scale factor to account for 386 | ||
| 199 | ;; | ||
| 200 | FIND_SYS_END: ;; | ||
| 201 | ;; | ||
| 202 | RET ;; | ||
| 203 | ;; | ||
| 204 | FIND_SYS_TYPE ENDP ;; | ||
| 205 | ;; | ||
| 206 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 207 | ;; | ||
| 208 | ;; Module: FIND_KEYB_TYPE | ||
| 209 | ;; | ||
| 210 | ;; Description: | ||
| 211 | ;; Determine the type of keyboard we are running on. | ||
| 212 | ;; KEYB_TYPE (in SHARED_DATA) is set to | ||
| 213 | ;; indicate the keyboard type. | ||
| 214 | ;; This routine is only called the first time KEYB is being installed. | ||
| 215 | ;; | ||
| 216 | ;; | ||
| 217 | ;; Input Registers: | ||
| 218 | ;; DS - points to our data segment | ||
| 219 | ;; | ||
| 220 | ;; Output Registers: | ||
| 221 | ;; NONE | ||
| 222 | ;; | ||
| 223 | ;; Logic: | ||
| 224 | ;; | ||
| 225 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 226 | ;; | ||
| 227 | HW_TYPE DW 0 ;; | ||
| 228 | ;***CNS ;; | ||
| 229 | |||
| 230 | SECURE_FL DB 0 | ||
| 231 | ;RESERVED ADDRESS 013h BITS 1 & 2 | ||
| 232 | |||
| 233 | PASS_MODE equ 00000001B ;AN000; | ||
| 234 | SERVER_MODE equ 00000010B ;AN000; | ||
| 235 | SECRET_ADD equ 13h ;AN000; | ||
| 236 | PORT_70 equ 70h ;AN000; | ||
| 237 | PORT_71 equ 71h ;AN000; | ||
| 238 | |||
| 239 | ;***CNS | ||
| 240 | G_KEYBOARD EQU 0AB41h ;;????? ;; Keyboard ID for FERRARI_G | ||
| 241 | P_KEYBOARD EQU 0AB54h ;;????? ;; Keyboard ID for FERRARI_P | ||
| 242 | ;; | ||
| 243 | P_KB_ID DB 08 ;; | ||
| 244 | ;; | ||
| 245 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 246 | ;; Program Code | ||
| 247 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 248 | ;; | ||
| 249 | FIND_KEYB_TYPE PROC NEAR ;; | ||
| 250 | ;; | ||
| 251 | PUSH ES ;; | ||
| 252 | PUSH DS ;; | ||
| 253 | ;; | ||
| 254 | MOV AX,ROM ;; Set segmant to look at ROM | ||
| 255 | MOV DS,AX ;; using the data segment | ||
| 256 | ASSUME DS:ROM ;; | ||
| 257 | ;; | ||
| 258 | MOV AX,DATA ;; | ||
| 259 | MOV ES,AX ;; ES points to BIOS data | ||
| 260 | ;; | ||
| 261 | MOV AL,ROMID ;; Get hardware ID | ||
| 262 | ;; | ||
| 263 | PUSH CS ;; Set data seg back to code | ||
| 264 | POP DS ;; | ||
| 265 | ASSUME DS:CODE ;; | ||
| 266 | ;; | ||
| 267 | ;; | ||
| 268 | MOV HW_TYPE,G_KB ;; Default keyboard is G_KB | ||
| 269 | ;; | ||
| 270 | ;; Is the hardware a PCjr | ||
| 271 | CMP AL,ROMJR ;; | ||
| 272 | JNE TEST_PC_XT_2 ;; IF not then check for next type | ||
| 273 | MOV HW_TYPE,JR_KB ;; keyboard type | ||
| 274 | JMP FIND_KEYB_END ;; Done | ||
| 275 | ;; | ||
| 276 | TEST_PC_XT_2: ;; | ||
| 277 | ;; Is the hardware a PC1 or XT ? | ||
| 278 | CMP AL,ROMXT ;; | ||
| 279 | JAE ITS_AN_XT_2 ;; IF FE OR FF THEN ITS AN XT | ||
| 280 | CMP AL,ROMXT_ENHAN ;; IF FB IT IS ALSO AN XT | ||
| 281 | JNE TEST_PC_AT_2 ;; IF not then check for next type | ||
| 282 | ITS_AN_XT_2: ;; | ||
| 283 | TEST ES:KB_FLAG_3,KBX ;; IS THE ENHANCED KEYBOARD INSTALLED? | ||
| 284 | JZ ITS_AN_XT_3 ;; | ||
| 285 | JMP FIND_KEYB_END ;; Yes, exit | ||
| 286 | ;; | ||
| 287 | ITS_AN_XT_3: ;; | ||
| 288 | MOV HW_TYPE,XT_KB ;; NO, normal XT keyboard | ||
| 289 | JMP FIND_KEYB_END ;; | ||
| 290 | ;; | ||
| 291 | TEST_PC_AT_2: ;; | ||
| 292 | ;; Is the hardware an AT ? | ||
| 293 | CMP AL,ROMAT ;; | ||
| 294 | JNE TEST_P12_2 ;; IF not then check for next type | ||
| 295 | ;; | ||
| 296 | ;; CHECK FOR ENHANCED KEYBOARD... | ||
| 297 | OR ES:KB_FLAG_2,08H ;; FROM COMNBODY.ASM - DON'T KNOW WHY | ||
| 298 | ;; | ||
| 299 | ;; READ ID COMMAND TO TEST FOR A KBX | ||
| 300 | ;; | ||
| 301 | MOV ES:KB_FLAG_3,RD_ID ;; INDICATE THAT A READ ID IS BEING | ||
| 302 | ;; DONE | ||
| 303 | MOV AL,0F2H ;; SEND THE READ ID COMMAND | ||
| 304 | CALL SND_DATA_AT ;; | ||
| 305 | ;; | ||
| 306 | MOV CX,03F00H ;; LOAD COUNT FOR ABOUT 37MS | ||
| 307 | WT_ID: TEST ES:KB_FLAG_3,KBX ;; TEST FOR KBX SET | ||
| 308 | LOOPZ WT_ID ;; WAIT OTHERWISE | ||
| 309 | ;; BE SURE FLAGS GOT RESET | ||
| 310 | ;***CNS | ||
| 311 | ;; SAVE ALL REGISTERS BEFORE ENTRY | ||
| 312 | ;; INTO CHECKING KEYBOARD SECURITY | ||
| 313 | PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT | ||
| 314 | PUSH BX ;AN000; | ||
| 315 | PUSH CX ;AN000; | ||
| 316 | PUSH DX ;AN000; | ||
| 317 | PUSH DS ;AN000; | ||
| 318 | PUSH ES ;AN000; | ||
| 319 | PUSH SI ;AN000; | ||
| 320 | PUSH DI ;AN000; | ||
| 321 | |||
| 322 | |||
| 323 | |||
| 324 | CALL KEYB_SECURE ;SEE IF THE KEYBOARD SECURITY IS | ||
| 325 | ;ACTIVATED AT THIS POINT | ||
| 326 | |||
| 327 | |||
| 328 | POP DI ;AN000; | ||
| 329 | POP SI ;AN000; | ||
| 330 | POP ES ;AN000; | ||
| 331 | POP DS ;AN000; | ||
| 332 | POP DX ;AN000; | ||
| 333 | POP CX ;AN000; | ||
| 334 | POP BX ;AN000; | ||
| 335 | POP AX ;AN000;SAVE THE CURRENT ENVIRONMENT | ||
| 336 | |||
| 337 | JNC ASSUME_AT ;AN000;SECURITY UNAVAILABLE OR AN AT KB | ||
| 338 | |||
| 339 | |||
| 340 | MOV SECURE_FL,1 ;AN000;SECURITY IS ACTIVE | ||
| 341 | JMP FIND_KEYB_END ;AN000;ASSUME IT IS A G_KB WITH | ||
| 342 | ;AN000;NUM LOCK OFF | ||
| 343 | ASSUME_AT: | ||
| 344 | ;***CNS | ||
| 345 | AND ES:KB_FLAG_3,NOT RD_ID+LC_AB | ||
| 346 | ;; | ||
| 347 | TEST ES:KB_FLAG_3,KBX ;; WAS IT A KBX? | ||
| 348 | JNZ DONE_AT_2 ;; YES, WE ARE DONE | ||
| 349 | ;; | ||
| 350 | MOV HW_TYPE,AT_KB ;; NO, AT KBD | ||
| 351 | DONE_AT_2: ;; | ||
| 352 | JMP FIND_KEYB_END ;; | ||
| 353 | ;; | ||
| 354 | TEST_P12_2: ;; | ||
| 355 | CMP AL,ROMLAP ;; IS this a P12? | ||
| 356 | JNE TEST_XT_ENH_OR_NEWER ;; IF not then check for next type | ||
| 357 | MOV HW_TYPE,P12_KB ;; IF yes then set flag | ||
| 358 | ;; | ||
| 359 | TEST_XT_ENH_OR_NEWER: ;; | ||
| 360 | CMP AL,ROMXT_ENHAN ;; | ||
| 361 | JNA GET_KEYB_ID ;; ** assume all new systems will have ext | ||
| 362 | JMP FIND_KEYB_END ;; ** ROM or else test previous to this | ||
| 363 | ;; | ||
| 364 | GET_KEYB_ID: ;; | ||
| 365 | ;***************************** CNS **************************************** | ||
| 366 | ;* This area has been Revised to allow the extended ROM support added | ||
| 367 | ;* flexibility for the PALACE or FLASHLIGHT with less than 640k; AN extended | ||
| 368 | ;* BIOS DATA call is to be made returning the segment of the extended | ||
| 369 | ;* BIOS area which should be in maximum memory - 1k area. | ||
| 370 | ;*************************************************************************** | ||
| 371 | |||
| 372 | MOV AH,0C1H ;; Make the extended bios data area | ||
| 373 | INT 15H ;; call to get the segment address for | ||
| 374 | JNC NEW_SYSTEM ;; accessing the keyboard byte area | ||
| 375 | JMP FIND_KEYB_END ;; JNC SOMEWHERE&REPORT | ||
| 376 | ;; otherwise EXTENDED BIOS DATA RETURNED | ||
| 377 | ;; in the ES | ||
| 378 | ;; save the starting seg address value | ||
| 379 | ;; needs to start at locale 0003BH | ||
| 380 | ;**************************************************************************** | ||
| 381 | NEW_SYSTEM: | ||
| 382 | ;**CNS | ||
| 383 | ;; Set segment to look at extended ROM | ||
| 384 | ;; using the data segment | ||
| 385 | PUSH ES ;; SEG value returned from INT15h -- C1 call | ||
| 386 | POP DS | ||
| 387 | ASSUME DS:ROMEXT ;; | ||
| 388 | ;; | ||
| 389 | MOV AX,DATA ;; | ||
| 390 | MOV ES,AX ;; BP points to BIOS data | ||
| 391 | |||
| 392 | ;; | ||
| 393 | MOV AL,KEYBID1 ;; Get keyboard ID ********** CNS | ||
| 394 | ;**CNS | ||
| 395 | ;***************************************************************************** | ||
| 396 | ;old MOV AX,ROMEXT ;; Set segment to look at extended ROM | ||
| 397 | ;code MOV DS,AX ;; using the data segment | ||
| 398 | ; ASSUME DS:ROMEXT ;; | ||
| 399 | ; ;; | ||
| 400 | ; MOV AX,DATA ;; | ||
| 401 | ;old MOV ES,AX ;; ES points to BIOS data | ||
| 402 | ;code ;; | ||
| 403 | ; MOV AL,KEYBID1 ;; Get keyboard ID | ||
| 404 | ;****************************************************************************** | ||
| 405 | PUSH CS ;; Set data seg back to code | ||
| 406 | POP DS ;; | ||
| 407 | ASSUME DS:CODE ;; | ||
| 408 | ;; | ||
| 409 | AND AL,0FH ;; Remove high nibble | ||
| 410 | CMP AL,P_KB_ID ;; IF keyboard is a FERRARI P THEN | ||
| 411 | JNE FIND_KEYB_END ;; | ||
| 412 | OR HW_TYPE,P_KB ;; Set the HW_TYPE flag | ||
| 413 | ;; | ||
| 414 | FIND_KEYB_END: ;; ELSE | ||
| 415 | MOV AX,HW_TYPE ;; Leave default alone | ||
| 416 | MOV SD.KEYB_TYPE,AX ;; | ||
| 417 | ;; | ||
| 418 | POP DS ;; | ||
| 419 | POP ES ;; | ||
| 420 | RET ;; | ||
| 421 | ;; | ||
| 422 | FIND_KEYB_TYPE ENDP ;; | ||
| 423 | ;; | ||
| 424 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 425 | ;; | ||
| 426 | ;; Module: SND_DATA_AT | ||
| 427 | ;; | ||
| 428 | ;; Description: | ||
| 429 | ;; THIS ROUTINE HANDLES TRANSMISSION OF PC/AT COMMAND AND DATA BYTES | ||
| 430 | ;; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO | ||
| 431 | ;; HANDLES ANY RETRIES IF REQUIRED | ||
| 432 | ;; | ||
| 433 | ;; | ||
| 434 | ;; Input Registers: | ||
| 435 | ;; DS - points to our data segment | ||
| 436 | ;; ES - points to the BIOS data segment | ||
| 437 | ;; | ||
| 438 | ;; Output Registers: | ||
| 439 | ;; | ||
| 440 | ;; Logic: | ||
| 441 | ;; | ||
| 442 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 443 | |||
| 444 | SND_DATA_AT PROC NEAR | ||
| 445 | PUSH AX ; SAVE REGISTERS | ||
| 446 | PUSH BX ; * | ||
| 447 | PUSH CX | ||
| 448 | MOV BH,AL ; SAVE TRANSMITTED BY FOR RETRIES | ||
| 449 | MOV BL,3 ; LOAD RETRY COUNT | ||
| 450 | SD0: CLI ; DISABLE INTERRUPTS | ||
| 451 | AND ES:KB_FLAG_2,NOT (KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS | ||
| 452 | |||
| 453 | ;------- WAIT FOR COMMAND TO BE ACCEPTED | ||
| 454 | |||
| 455 | SUB CX,CX | ||
| 456 | SD5: | ||
| 457 | IN AL,STATUS_PORT | ||
| 458 | TEST AL,INPT_BUF_FULL | ||
| 459 | LOOPNZ SD5 ; WAIT FOR COMMAND TO BE ACCEPTED | ||
| 460 | ; | ||
| 461 | MOV AL,BH ; REESTABLISH BYTE TO TRANSMIT | ||
| 462 | OUT PORT_A,AL ; SEND BYTE | ||
| 463 | STI ; ENABLE INTERRUPTS | ||
| 464 | MOV CX,01A00H ; LOAD COUNT FOR 10mS+ | ||
| 465 | SD1: TEST ES:KB_FLAG_2,KB_FE+KB_FA ; SEE IF EITHER BIT SET | ||
| 466 | JNZ SD3 ; IF SET, SOMETHING RECEIVED GO PROCESS | ||
| 467 | ; | ||
| 468 | LOOP SD1 ; OTHERWISE WAIT | ||
| 469 | ; | ||
| 470 | SD2: DEC BL ; DECREMENT RETRY COUNT | ||
| 471 | JNZ SD0 ; RETRY TRANSMISSION | ||
| 472 | ; | ||
| 473 | OR ES:KB_FLAG_2,KB_ERR ; TURN ON TRANSMIT ERROR FLAG | ||
| 474 | JMP SHORT SD4 ; RETRIES EXHAUSTED FORGET TRANSMISSION | ||
| 475 | ; | ||
| 476 | SD3: TEST ES:KB_FLAG_2,KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE | ||
| 477 | JZ SD2 ; IF NOT, GO RESEND | ||
| 478 | ; | ||
| 479 | ;; If this was an acknowledge, determine*RPS | ||
| 480 | ;; if keyboard is FERRARI G or P *RPS | ||
| 481 | MOV CX,1000 ;; | ||
| 482 | IO_DELAY1: ;; | ||
| 483 | LOOP IO_DELAY1 ;; | ||
| 484 | JMP SHORT $+2 ;; Allow for recovery time | ||
| 485 | IN AL,PORT_A ;; READ IN THE CHARACTER *RPS | ||
| 486 | MOV CX,1000 ;; | ||
| 487 | IO_DELAY2: ;; | ||
| 488 | LOOP IO_DELAY2 ;; | ||
| 489 | JMP SHORT $+2 ;; Allow for recovery time | ||
| 490 | MOV BH,AL ;; *RPS | ||
| 491 | ;; | ||
| 492 | IN AL,PORT_A ;; READ IN THE CHARACTER *RPS | ||
| 493 | MOV BL,AL ;; *RPS | ||
| 494 | ;; *RPS | ||
| 495 | CMP BX,P_KEYBOARD ;; Set HW_TYPE appropriately *RPS | ||
| 496 | JNE SD4 ;; *RPS | ||
| 497 | OR HW_TYPE,P_KB ;; *RPS | ||
| 498 | ;; | ||
| 499 | SD4: POP CX ; RESTORE REGISTERS | ||
| 500 | POP BX | ||
| 501 | POP AX ; * | ||
| 502 | RET ; RETURN, GOOD TRANSMISSION | ||
| 503 | SND_DATA_AT ENDP | ||
| 504 | |||
| 505 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 506 | ;************************************************************************ | ||
| 507 | ; KEYBOARD SECURITY LOGIC | ||
| 508 | ; CHECK THE CMOS RAM @ ADDRESS HEX 013H | ||
| 509 | ; CHECK TO SEE IF EITHER BITS 1 (PASSWORD) OR 2 (SERVER MODE) ARE SET ON | ||
| 510 | ; IF EITHER BIT IS SET ON THE SYSTEM IS A MOD 50 on up | ||
| 511 | ; REPORT MESSAGE KEYBOARD LOCKED UNABLE TO LOAD KEYBOARD TABLES | ||
| 512 | ; OTHERWISE AN INVALID RESPONSE OR ZERO SHOULD BE RETURNED | ||
| 513 | ; PROCEED AS WITH LOADING OF THE CORRECT TABLES | ||
| 514 | |||
| 515 | ; PROPOSED KEYBOARD SYNTAX | ||
| 516 | |||
| 517 | ; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id] | ||
| 518 | |||
| 519 | |||
| 520 | |||
| 521 | ;************************************************************************ | ||
| 522 | |||
| 523 | KEYB_SECURE PROC NEAR | ||
| 524 | |||
| 525 | |||
| 526 | |||
| 527 | ;RESERVED ADDRESS 013h BITS 1 & 2 | ||
| 528 | |||
| 529 | ; PASS_MODE equ 00000001B ;AN000; | ||
| 530 | ; SERVER_MODE equ 00000010B ;AN000; | ||
| 531 | |||
| 532 | |||
| 533 | |||
| 534 | ; SECRET_ADD equ 13h ;AN000; | ||
| 535 | ; PORT_70 equ 70h ;AN000; | ||
| 536 | ; PORT_71 equ 71h ;AN000; | ||
| 537 | |||
| 538 | ; PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT | ||
| 539 | ; PUSH BX ;AN000; | ||
| 540 | ; PUSH CX ;AN000; | ||
| 541 | ; PUSH DX ;AN000; | ||
| 542 | ; PUSH CS ;AN000; | ||
| 543 | ; PUSH DS ;AN000; | ||
| 544 | ; PUSH ES ;AN000; | ||
| 545 | ; PUSH SI ;AN000; | ||
| 546 | ; PUSH DI ;AN000; | ||
| 547 | CLI ;AN000;;DISABLE THE INTERRUPT TO AVOID | ||
| 548 | ;AN000;;THE CMOS REGISTER BEFORE | ||
| 549 | ;AN000;;THE READ & WRITE IS DONE | ||
| 550 | |||
| 551 | XOR AX,AX | ||
| 552 | MOV AL,SECRET_ADD | ||
| 553 | OUT PORT_70,AL ;AN000;;SEND THE ADDRESS CONTAINING THE | ||
| 554 | ;BITS FOR THE PASSWORD AND SERVER | ||
| 555 | ;MODE STATE TO PORT 70H | ||
| 556 | |||
| 557 | |||
| 558 | |||
| 559 | |||
| 560 | |||
| 561 | IN AL,PORT_71 ;AN000;;READ THE DATA IN TO GET THE | ||
| 562 | ;RESULTS OF THE CHECK FOR THE | ||
| 563 | ;EXISTENCE OF SECURITY. | ||
| 564 | |||
| 565 | MOV DX,AX | ||
| 566 | |||
| 567 | TEST DL,PASS_MODE+SERVER_MODE ;AN000;;CHECK & SEE IF THE BITS ARE ON | ||
| 568 | JNZ KEYB_LOCKED ;AN000;;YES THEY ARE ON SO EXIT AND REPORT | ||
| 569 | CLC ;XOR AX,AX ;ASSUME THIS IS AN AT KEYBOARD | ||
| 570 | JMP SECURE_RET | ||
| 571 | |||
| 572 | KEYB_LOCKED: | ||
| 573 | |||
| 574 | STC ; MOV AX,1 ;AN000;SET THE SECURITY FLAG | ||
| 575 | ;ON; | ||
| 576 | ;PROCEED - EITHER SYSTEM IS AN | ||
| 577 | ;AT OR THE SYSTEM IS UNLOCKED | ||
| 578 | SECURE_RET: | ||
| 579 | |||
| 580 | STI ;AN000;;ENABLE THE INTERRUPT | ||
| 581 | |||
| 582 | |||
| 583 | ; POP DI ;AN000; | ||
| 584 | ; POP SI ;AN000; | ||
| 585 | ; POP ES ;AN000; | ||
| 586 | ; POP DS ;AN000; | ||
| 587 | ; POP CS ;AN000; | ||
| 588 | ; POP DX ;AN000; | ||
| 589 | ; POP CX ;AN000; | ||
| 590 | ; POP BX ;AN000; | ||
| 591 | ; POP AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT | ||
| 592 | |||
| 593 | |||
| 594 | RET | ||
| 595 | |||
| 596 | |||
| 597 | KEYB_SECURE ENDP | ||
| 598 | |||
| 599 | |||
| 600 | |||
| 601 | |||
| 602 | CODE ENDS | ||
| 603 | END | ||
diff --git a/v4.0/src/CMD/KEYB/COMMSUBS.INC b/v4.0/src/CMD/KEYB/COMMSUBS.INC new file mode 100644 index 0000000..96bea5d --- /dev/null +++ b/v4.0/src/CMD/KEYB/COMMSUBS.INC | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: CONVERT.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYBCMD.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; External declarations for procedures in file KEYBCMD.ASM. | ||
| 16 | ;; | ||
| 17 | ;; Change History: | ||
| 18 | ;; --------------- | ||
| 19 | ;; | ||
| 20 | ;; | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | EXTRN FIND_SYS_TYPE :NEAR ;; | ||
| 24 | EXTRN FIND_KEYB_TYPE :NEAR ;; | ||
| 25 | ;; | ||
| 26 | EXTRN HW_TYPE :WORD ;; | ||
| 27 | ;; | ||
| 28 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 29 | |||
| 30 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/KBMSG.INC b/v4.0/src/CMD/KEYB/KBMSG.INC new file mode 100644 index 0000000..f7beb54 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KBMSG.INC | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | ;; | ||
| 2 | ACT_KEYB DB 'Current keyboard code: ','$' ;; | ||
| 3 | ACT_KEYB_CP DB ' code page: ','$' ;; | ||
| 4 | ACT_CON_CP DB 'Current CON code page: ','$' ;; | ||
| 5 | INV_L DB 'Invalid keyboard code specified',10,13,'$' ;; | ||
| 6 | INV_I DB 'Invalid keyboard ID specified',10,13,'$' ;; | ||
| 7 | INV_CP DB 'Invalid code page specified',10,13,'$' ;; | ||
| 8 | INV_S DB 'Invalid syntax',10,13,'$' ;; | ||
| 9 | INV_FN DB 'Bad or missing Keyboard Definition File',10,13,'$' ;; | ||
| 10 | INV_KEYB_Q DB 'KEYB has not been installed',10,13,'$' ;; | ||
| 11 | INV_CON_Q DB 'Active code page not available from CON device',10,13,'$' ;; | ||
| 12 | NOT_DESIG DB 'Code page specified has not been prepared',10,13,'$' ;; | ||
| 13 | NOT_SUPP DB 'One or more CON code pages invalid for given keyboard code',10,13,'$' ;; | ||
| 14 | NOT_VALID1 DB 'Code page requested (','$' ;; | ||
| 15 | NOT_VALID2 DB ') is not valid for given keyboard code',10,13,'$' ;; | ||
| 16 | WARNING_1 DB 'Code page specified is inconsistent with the selected code page',10,13,'$' ;; | ||
| 17 | INV_COMBO DB 'ID code specified is inconsistent with the selected keyboard code',13,'$' ;; | ||
| 18 | MEMORY_OVERF DB 'Unable to create KEYB table in resident memory',10,13,'$' ;; | ||
| 19 | CR_LF DB 10,13,'$' ;; | ||
| 20 | ;; | ||
| 21 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/KEYB/KEYB.ASM b/v4.0/src/CMD/KEYB/KEYB.ASM new file mode 100644 index 0000000..fffce04 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYB.ASM | |||
| @@ -0,0 +1,71 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS - KEYB Command - Root Module | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (c) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYB.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Contains root module for KEYB command. This module is the | ||
| 15 | ;; KEYB command entry point. KEYB is an external command included | ||
| 16 | ;; with PC DOS 3.3 to provide keyboard support for 14 languages. | ||
| 17 | ;; KEYB will jump immediately into the command processing in | ||
| 18 | ;; file KEYBCMD. All resident code is included before KEYBCMD | ||
| 19 | ;; in the linkage list. | ||
| 20 | ;; | ||
| 21 | ;; Documentation Reference: | ||
| 22 | ;; ------------------------ | ||
| 23 | ;; PC DOS 3.3 NLS Interface Specification - May ?? 1986 | ||
| 24 | ;; PC DOS 3.3 Detailed Design Document - May ?? 1986 | ||
| 25 | ;; | ||
| 26 | ;; Procedures Contained in This File: | ||
| 27 | ;; ---------------------------------- | ||
| 28 | ;; | ||
| 29 | ;; | ||
| 30 | ;; Include Files Required: | ||
| 31 | ;; ----------------------- | ||
| 32 | ;; KEYBCMD.INC - External declarations for transient command | ||
| 33 | ;; processing routines | ||
| 34 | ;; | ||
| 35 | ;; External Procedure References: | ||
| 36 | ;; ------------------------------ | ||
| 37 | ;; FROM FILE KEYCMD.ASM: | ||
| 38 | ;; KEYB_COMMAND - Main routine for transient command processing. | ||
| 39 | ;; | ||
| 40 | ;; Linkage Instructions: | ||
| 41 | ;; -------------------- | ||
| 42 | ;; Link in .COM format. Resident code/data is in files KEYB thru | ||
| 43 | ;; KEYBCPSD. | ||
| 44 | ;; | ||
| 45 | ;; LINK KEYB+KEYBI9+KEYBI9C+KEYBI2F+KEYBI48+KEYBCPSD+KEYBMSG+ | ||
| 46 | ;; COMMSUBS+KEYBTBBL+KEYBCMD; | ||
| 47 | ;; EXE2BIN KEYB.EXE KEYB.COM | ||
| 48 | ;; | ||
| 49 | ;; Change History: | ||
| 50 | ;; --------------- | ||
| 51 | ;; | ||
| 52 | ;; | ||
| 53 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 54 | ;; | ||
| 55 | ;; | ||
| 56 | CODE SEGMENT PUBLIC 'CODE' BYTE ;; | ||
| 57 | ;; | ||
| 58 | INCLUDE KEYBCMD.INC ;; Bring in external declarations | ||
| 59 | ;; for transient command processing | ||
| 60 | ASSUME CS:CODE,DS:CODE ;; | ||
| 61 | ORG 100H ;; required for .COM | ||
| 62 | ;; | ||
| 63 | ;; | ||
| 64 | START: ;; | ||
| 65 | ;; | ||
| 66 | JMP KEYB_COMMAND ;; | ||
| 67 | ;; | ||
| 68 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 69 | |||
| 70 | CODE ENDS | ||
| 71 | END START | ||
diff --git a/v4.0/src/CMD/KEYB/KEYB.LNK b/v4.0/src/CMD/KEYB/KEYB.LNK new file mode 100644 index 0000000..4ef13e5 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYB.LNK | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | Keyb+keybi9+KEYBI9C+keybi2f+keybi48+ | ||
| 2 | keybcpsd+commsubs+keybtbbl+parser+KEYBCMD; | ||
| 3 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/KEYB/KEYB.SKL b/v4.0/src/CMD/KEYB/KEYB.SKL new file mode 100644 index 0000000..7bb2b5c --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYB.SKL | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; | ||
| 3 | ; Message Skeleton file for KEYB.COM | ||
| 4 | ; | ||
| 5 | ; Author: WGR | ||
| 6 | ; | ||
| 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 8 | |||
| 9 | :util KEYB ;AN000;ty name | ||
| 10 | :class 2 | ||
| 11 | :use PARSE1 ;AN000; | ||
| 12 | :use PARSE2 ;AN000; | ||
| 13 | :use PARSE3 ;AN000; | ||
| 14 | :use PARSE4 ;AN000; | ||
| 15 | :use PARSE6 ;AN000; | ||
| 16 | :use PARSE7 ;AN000; | ||
| 17 | :use PARSE10 ;AN003; | ||
| 18 | :class A | ||
| 19 | :use 1 COMMON1 ;AN000;rrect DOS version' | ||
| 20 | :def 2 "Current keyboard code: %1" ;AN000; | ||
| 21 | :def 3 "Current keyboard ID: %1" ;AN000; | ||
| 22 | :def 4 " code page: %1",CR,LF ;AN000; | ||
| 23 | :def 5 "Current CON code page: %1",CR,LF ;AN000; | ||
| 24 | :def 6 "Invalid keyboard code specified",CR,LF ;AN000; | ||
| 25 | :def 7 "Invalid keyboard ID specified",CR,LF ;AN000; | ||
| 26 | :def 8 "Invalid code page specified",CR,LF ;AN000; | ||
| 27 | :def 9 "Bad or missing Keyboard Definition File",CR,LF ;AN000; | ||
| 28 | :def 10 "KEYB has not been installed",CR,LF ;AN000; | ||
| 29 | :def 11 "Active code page not available from CON device",CR,LF ;AN000; | ||
| 30 | :def 12 "Code page specified has not been prepared",CR,LF ;AN000; | ||
| 31 | :def 13 "One or more CON code pages invalid for given keyboard code",CR,LF ;AN000; | ||
| 32 | :def 14 "Code page requested (%1) is not valid for given keyboard code",CR,LF ;AN000; | ||
| 33 | :def 15 "Code page specified is inconsistent with the selected code page",CR,LF ;AN000; | ||
| 34 | :def 16 "ID code specified is inconsistent with the selected keyboard code",CR,LF ;AN000; | ||
| 35 | :def 17 "Unable to create KEYB table in resident memory",CR,LF ;AN000; | ||
| 36 | :use 18 PARSE8 ; 'Parameter format not correct' ;AN000; | ||
| 37 | :end ;AN000; | ||
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 | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBCMD.INC b/v4.0/src/CMD/KEYB/KEYBCMD.INC new file mode 100644 index 0000000..ac40fe5 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBCMD.INC | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBCMD.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYB.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; External declarations for procedures in file KEYCMD.ASM. | ||
| 16 | ;; | ||
| 17 | ;; Change History: | ||
| 18 | ;; --------------- | ||
| 19 | ;; | ||
| 20 | ;; | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | EXTRN KEYB_COMMAND :NEAR ;; | ||
| 24 | ;; | ||
| 25 | EXTRN KEYBSYS_FILE_HANDLE:WORD ;; | ||
| 26 | EXTRN CP_TAB_OFFSET:DWORD ;; | ||
| 27 | EXTRN STATE_LOGIC_OFFSET:DWORD ;; | ||
| 28 | EXTRN SYS_CODE_PAGE:WORD ;; | ||
| 29 | EXTRN KEYBCMD_LANG_ENTRY_PTR:DWORD ;; | ||
| 30 | EXTRN DESIG_CP_BUFFER:WORD ;; | ||
| 31 | EXTRN DESIG_CP_OFFSET:WORD ;; | ||
| 32 | EXTRN NUM_DESIG_CP:WORD ;; | ||
| 33 | EXTRN TB_RETURN_CODE:WORD ;; | ||
| 34 | EXTRN FILE_BUFFER_SIZE:ABS | ||
| 35 | EXTRN FILE_BUFFER:WORD ;; | ||
| 36 | ;****************CNS**************************** | ||
| 37 | EXTRN ID_PTR_SIZE:WORD ;; | ||
| 38 | ;****************CNS**************************** | ||
| 39 | EXTRN LANG_PTR_SIZE:WORD ;; | ||
| 40 | EXTRN CP_PTR_SIZE:WORD ;; | ||
| 41 | ;****************CNS**************************** | ||
| 42 | EXTRN NUM_ID:WORD ;; | ||
| 43 | ;****************CNS**************************** | ||
| 44 | EXTRN NUM_LANG:WORD ;; | ||
| 45 | EXTRN NUM_CP:WORD ;; | ||
| 46 | EXTRN SHARED_AREA_PTR:DWORD ;; | ||
| 47 | EXTRN SD_SOURCE_PTR:BYTE ;; | ||
| 48 | EXTRN TEMP_SHARED_DATA:BYTE ;; | ||
| 49 | ;; | ||
| 50 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 51 | .LIST | ||
| 52 | |||
| 53 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBCPSD.ASM b/v4.0/src/CMD/KEYB/KEYBCPSD.ASM new file mode 100644 index 0000000..2cae9fe --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBCPSD.ASM | |||
| @@ -0,0 +1,128 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE DOS - KEYB Command - Copy Shared_Data_Area | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; DOS - NLS Support - KEYB Command | ||
| 6 | ;; (C) Copyright 1988 Microsoft | ||
| 7 | ;; | ||
| 8 | ;; File Name: KEYBCPSD.ASM | ||
| 9 | ;; ---------- | ||
| 10 | ;; | ||
| 11 | ;; Description: | ||
| 12 | ;; ------------ | ||
| 13 | ;; Copies the SHARED_DATA_AREA into a part of memory that | ||
| 14 | ;; can be left resident. All relative pointers must already | ||
| 15 | ;; be recalculated to this new position. | ||
| 16 | ;; THIS FILE MUST BE THE LAST OF THE RESIDENT FILES WHEN KEYB IS LINKED. | ||
| 17 | ;; | ||
| 18 | ;; Documentation Reference: | ||
| 19 | ;; ------------------------ | ||
| 20 | ;; PC DOS 3.3 Detailed Design Document - May ?? 1986 | ||
| 21 | ;; | ||
| 22 | ;; Procedures Contained in This File: | ||
| 23 | ;; ---------------------------------- | ||
| 24 | ;; | ||
| 25 | ;; Include Files Required: | ||
| 26 | ;; ----------------------- | ||
| 27 | ;; INCLUDE KEYBSHAR.INC | ||
| 28 | ;; INCLUDE KEYBCMD.INC | ||
| 29 | ;; INCLUDE KEYBTBBL.INC | ||
| 30 | ;; | ||
| 31 | ;; External Procedure References: | ||
| 32 | ;; ------------------------------ | ||
| 33 | ;; FROM FILE ????????.ASM: | ||
| 34 | ;; procedure - description???????????????????????????????? | ||
| 35 | ;; | ||
| 36 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 37 | ;; -------------------- | ||
| 38 | ;; | ||
| 39 | ;; Change History: | ||
| 40 | ;; --------------- | ||
| 41 | ;; PTMP3955 ;AN004;KEYB component to free environment and close handles 0 - 4 | ||
| 42 | ;; 3/24/88 | ||
| 43 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 44 | ;; | ||
| 45 | PUBLIC SD_DEST_PTR ;; | ||
| 46 | PUBLIC COPY_SD_AREA ;; | ||
| 47 | PUBLIC SHARED_DATA ;; | ||
| 48 | ;; | ||
| 49 | INCLUDE STRUC.INC | ||
| 50 | INCLUDE KEYBSHAR.INC ;; | ||
| 51 | INCLUDE KEYBCMD.INC ;; | ||
| 52 | INCLUDE KEYBTBBL.INC ;; | ||
| 53 | ;; | ||
| 54 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 55 | ;; | ||
| 56 | ASSUME CS:CODE,DS:CODE ;; | ||
| 57 | ;; | ||
| 58 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 59 | ;; | ||
| 60 | ;; Module: COPY_SD_AREA | ||
| 61 | ;; | ||
| 62 | ;; Description: | ||
| 63 | ;; | ||
| 64 | ;; Input Registers: | ||
| 65 | ;; | ||
| 66 | ;; Output Registers: | ||
| 67 | ;; N/A | ||
| 68 | ;; | ||
| 69 | ;; Logic: | ||
| 70 | ;; | ||
| 71 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 72 | ;; | ||
| 73 | SD EQU SHARED_DATA ;; | ||
| 74 | TSD EQU TEMP_SHARED_DATA ;; | ||
| 75 | ;; | ||
| 76 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 77 | ;; | ||
| 78 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 79 | ;; | ||
| 80 | COPY_SD_AREA PROC NEAR ;; | ||
| 81 | ;; | ||
| 82 | REP MOVS ES:BYTE PTR [DI],DS:[SI] ;; Copy SHARED_DATA_AREA to | ||
| 83 | |||
| 84 | push ax ;AN004;save existing values | ||
| 85 | push es ;AN004;; | ||
| 86 | xor ax,ax ;AN004;clear out ax | ||
| 87 | mov ax,cs:[2ch] ;AN004;check offset for address containin environ. | ||
| 88 | cmp ax,0 ;AN004; | ||
| 89 | je NO_FREEDOM ;AN004; | ||
| 90 | mov es,ax ;AN004; | ||
| 91 | mov ax,4900H ;AN004;make the free allocate mem func | ||
| 92 | int 21h ;AN004;; | ||
| 93 | |||
| 94 | |||
| 95 | NO_FREEDOM: | ||
| 96 | pop es ;AN004;restore existing values | ||
| 97 | pop ax ;AN004;; | ||
| 98 | |||
| 99 | push ax ;AN004; | ||
| 100 | push bx ;AN004; | ||
| 101 | |||
| 102 | ;AN004; ;Terminate and stay resident | ||
| 103 | mov bx,4 ;AN004; ;1st close file handles | ||
| 104 | .REPEAT ;AN004; ;STDIN,STDOUT,STDERR | ||
| 105 | mov ah,3eh ;AN004; ; | ||
| 106 | int 21h ;AN004; ; | ||
| 107 | dec bx ;AN004; ; | ||
| 108 | .UNTIL <BX eq 0> ;AN004; ; | ||
| 109 | |||
| 110 | pop bx ;AN004; | ||
| 111 | pop ax ;AN004; | ||
| 112 | ;AN004; new part of memory | ||
| 113 | MOV BYTE PTR ES:SD.TABLE_OK,1 ;; Activate processing flag | ||
| 114 | INT 21H ;; Exit | ||
| 115 | ;; | ||
| 116 | ;; | ||
| 117 | COPY_SD_AREA ENDP ;; | ||
| 118 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 119 | ;; | ||
| 120 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 121 | ;; | ||
| 122 | db 'SHARED DATA' ;; | ||
| 123 | SD_DEST_PTR LABEL BYTE ;; | ||
| 124 | ;; | ||
| 125 | SHARED_DATA SHARED_DATA_STR <> ;; | ||
| 126 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 127 | CODE ENDS | ||
| 128 | END | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBCPSD.INC b/v4.0/src/CMD/KEYB/KEYBCPSD.INC new file mode 100644 index 0000000..bb4f036 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBCPSD.INC | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBCPSD.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Description: | ||
| 11 | ;; ------------ | ||
| 12 | ;; External declarations and equates for procedures in file | ||
| 13 | ;; KEYBCPSD.ASM | ||
| 14 | ;; | ||
| 15 | ;; Change History: | ||
| 16 | ;; --------------- | ||
| 17 | ;; | ||
| 18 | ;; | ||
| 19 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 20 | ;; | ||
| 21 | EXTRN COPY_SD_AREA:NEAR ;; | ||
| 22 | ;; | ||
| 23 | EXTRN SD_DEST_PTR :BYTE ;; | ||
| 24 | EXTRN SHARED_DATA :BYTE ;; | ||
| 25 | ;; | ||
| 26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 27 | |||
| 28 | .LIST | ||
| 29 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBDCL.INC b/v4.0/src/CMD/KEYB/KEYBDCL.INC new file mode 100644 index 0000000..43b40a4 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBDCL.INC | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | |||
| 2 | .XLIST | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; DOS - NLS Support - KEYB Command | ||
| 6 | ;; (C) Copyright 1988 Microsoft | ||
| 7 | ;; | ||
| 8 | ;; File Name: KEYBDCL.INC | ||
| 9 | ;; ---------- | ||
| 10 | ;; | ||
| 11 | ;; Root File Name: KEYB.ASM | ||
| 12 | ;; --------------- | ||
| 13 | ;; | ||
| 14 | ;; Description: | ||
| 15 | ;; ------------ | ||
| 16 | ;; Common declarations for structures in procedures for KEYB.COM | ||
| 17 | ;; | ||
| 18 | ;; Change History: | ||
| 19 | ;; --------------- | ||
| 20 | ;; | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | PARM_LIST STRUC ;; | ||
| 24 | ;*******************CNS****************** | ||
| 25 | ;*******************CNS****************** | ||
| 26 | RET_CODE_1 DB 0 ;; \ | ||
| 27 | RET_CODE_2 DB 0 ;; | | ||
| 28 | RET_CODE_3 DB 0 ;; | | ||
| 29 | ;*******************CNS****************** | ||
| 30 | RET_CODE_4 DB 0 ;; |;AN000; | ||
| 31 | ;*******************CNS****************** | ||
| 32 | LANGUAGE_PARM DW ? ;; } PARAMETER | ||
| 33 | CODE_PAGE_PARM DW ? ;; | LIST | ||
| 34 | PATH_OFFSET DW ? ;; | | ||
| 35 | PATH_LENGTH DW 0 ;; / | ||
| 36 | ;*******************CNS****************** | ||
| 37 | ID_PARM DW ? ;AN000; | ||
| 38 | ;*******************CNS****************** | ||
| 39 | PARM_LIST ENDS ;; | ||
| 40 | ;; | ||
| 41 | DESIG_CP_STRUC STRUC ;; | ||
| 42 | NUM_DESIGNATES DW ? ;; | ||
| 43 | NUM_FONTS DW ? ;; | ||
| 44 | NUM_HW_CPS DW ? ;; | ||
| 45 | DESIG_CP_ENTRY DW ? ;; | ||
| 46 | DESIG_CP_STRUC ENDS ;; | ||
| 47 | ;; | ||
| 48 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 49 | .LIST | ||
| 50 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBEQU.INC b/v4.0/src/CMD/KEYB/KEYBEQU.INC new file mode 100644 index 0000000..f12f7f3 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBEQU.INC | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBEQU.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYB.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; Include file containing equates used by all KEYB modules. | ||
| 16 | ;; | ||
| 17 | ;; Change History: | ||
| 18 | ;; --------------- | ||
| 19 | ;; | ||
| 20 | ;; | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | YES EQU 1 ;; | ||
| 24 | NO EQU 0 ;; | ||
| 25 | ;; | ||
| 26 | INT_2F_SUB_FUNC EQU 0ADH ;; our subfunction code for int 2f | ||
| 27 | SD EQU SHARED_DATA ;; | ||
| 28 | TSD EQU TEMP_SHARED_DATA ;; | ||
| 29 | ;; | ||
| 30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 31 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBI2F.ASM b/v4.0/src/CMD/KEYB/KEYBI2F.ASM new file mode 100644 index 0000000..30dce7e --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI2F.ASM | |||
| @@ -0,0 +1,225 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS - KEYB Command - Interrupt 2F Handler | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (C) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYBI2F.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Contains Interrupt 2F handler. | ||
| 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_INT_2F - Interupt 2F handler | ||
| 23 | ;; | ||
| 24 | ;; Include Files Required: | ||
| 25 | ;; ----------------------- | ||
| 26 | ;; INCLUDE KEYBEQU.INC | ||
| 27 | ;; INCLUDE KEYBSHAR.INC | ||
| 28 | ;; INCLUDE KEYBMAC.INC | ||
| 29 | ;; INCLUDE KEYBCMD.INC | ||
| 30 | ;; INCLUDE KEYBCPSD.INC | ||
| 31 | ;; INCLUDE KEYBI9C.INC | ||
| 32 | ;; | ||
| 33 | ;; External Procedure References: | ||
| 34 | ;; ------------------------------ | ||
| 35 | ;; FROM FILE ????????.ASM: | ||
| 36 | ;; procedure - description???????????????????????????????? | ||
| 37 | ;; | ||
| 38 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 39 | ;; -------------------- | ||
| 40 | ;; | ||
| 41 | ;; Change History: | ||
| 42 | ;; --------------- | ||
| 43 | ;; | ||
| 44 | ;; | ||
| 45 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 46 | ;; | ||
| 47 | INCLUDE KEYBEQU.INC ;; | ||
| 48 | INCLUDE KEYBSHAR.INC ;; | ||
| 49 | INCLUDE KEYBMAC.INC ;; | ||
| 50 | INCLUDE KEYBCMD.INC ;; | ||
| 51 | INCLUDE KEYBCPSD.INC ;; | ||
| 52 | INCLUDE KEYBI9C.INC ;; | ||
| 53 | ;; | ||
| 54 | PUBLIC KEYB_INT_2F ;; | ||
| 55 | ;; | ||
| 56 | EXTRN ERROR_BEEP:NEAR ;; | ||
| 57 | ;; | ||
| 58 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 59 | ;; | ||
| 60 | ASSUME CS:CODE,DS:CODE ;; | ||
| 61 | ;; | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | ;; Module: KEYB_INT_2F | ||
| 65 | ;; | ||
| 66 | ;; Description: | ||
| 67 | ;; | ||
| 68 | ;; Input Registers: | ||
| 69 | ;; AH = 0ADH | ||
| 70 | ;; AL = 80,81,82 | ||
| 71 | ;; | ||
| 72 | ;; Output Registers: | ||
| 73 | ;; N/A | ||
| 74 | ;; | ||
| 75 | ;; Logic: | ||
| 76 | ;; IF AH = 0ADh THEN (this call is for us) | ||
| 77 | ;; Set carry flag to 0 | ||
| 78 | ;; IF AL = 80 THEN | ||
| 79 | ;; Get major and minor | ||
| 80 | ;; Get SEG:OFFSET of SHARED_DATA_AREA | ||
| 81 | ;; | ||
| 82 | ;; IF AL = 81 THEN | ||
| 83 | ;; Get FIRST_XLAT_PTR | ||
| 84 | ;; FOR each table | ||
| 85 | ;; IF code page requested = code page value at pointer THEN | ||
| 86 | ;; Set INVOKED_CODE_PAGE | ||
| 87 | ;; Set ACTIVE_XLAT_PTR | ||
| 88 | ;; EXIT | ||
| 89 | ;; ELSE | ||
| 90 | ;; Get NEXT_SECT_PTR | ||
| 91 | ;; NEXT table | ||
| 92 | ;; IF no corresponding code page found THEN | ||
| 93 | ;; Set carry flag | ||
| 94 | ;; | ||
| 95 | ;; IF AL = 82 THEN | ||
| 96 | ;; IF BL = 00 THEN | ||
| 97 | ;; Set COUNTRY_FLAG = 00 | ||
| 98 | ;; ELSE IF BL = 0FFH THEN | ||
| 99 | ;; Set COUNTRY_FLAG = 0FFH | ||
| 100 | ;; ELSE | ||
| 101 | ;; Set carry flag | ||
| 102 | ;; IRET or JMP to another INT 2FH handler (if installed) | ||
| 103 | ;; | ||
| 104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 105 | ;; | ||
| 106 | CP_QUERY EQU 80H ;; | ||
| 107 | CP_INVOKE EQU 81H ;; | ||
| 108 | CP_LANGUAGE EQU 82H ;; | ||
| 109 | ;; | ||
| 110 | VERSION_MAJOR EQU 01H ;; | ||
| 111 | VERSION_MINOR EQU 00H ;; | ||
| 112 | ;; | ||
| 113 | CARRY_FLAG EQU 01H ;; | ||
| 114 | RESTORE_BP DW ? ;; | ||
| 115 | ;; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ;; | ||
| 118 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 119 | ;; | ||
| 120 | KEYB_INT_2F PROC ;; | ||
| 121 | ;; | ||
| 122 | PUSH DS ;; | ||
| 123 | PUSH BX ;; | ||
| 124 | PUSH CX ;; | ||
| 125 | PUSH SI ;; | ||
| 126 | ;; | ||
| 127 | PUSH CS ;; | ||
| 128 | POP DS ;; Set DATA SEGMENT register | ||
| 129 | ;; | ||
| 130 | CMP AH,INT_2F_SUB_FUNC ;; Q..is this call for us? | ||
| 131 | JE CHECK_REQUEST_CODE ;; Y..check request code | ||
| 132 | JMP INT_2F_DONE ;; N..get out | ||
| 133 | ;; | ||
| 134 | CHECK_REQUEST_CODE: ;; Y..check request code | ||
| 135 | MOV RESTORE_BP,BP ;;;;;;;;;;; | ||
| 136 | MOV BP,SP ;; Clear CARRY flag | ||
| 137 | AND WORD PTR [BP]+12,NOT CARRY_FLAG ;; | ||
| 138 | MOV BP,RESTORE_BP ;; | ||
| 139 | ;;;;;;;;;;; | ||
| 140 | ;; | ||
| 141 | INT_2F_CP_QUERY: ;; | ||
| 142 | CMP AL,CP_QUERY ;; Q..query CP? | ||
| 143 | JNE INT_2F_CP_INVOKE ;; N..next | ||
| 144 | MOV AX,-1 ;; Y..process query | ||
| 145 | MOV BH,VERSION_MAJOR ;; | ||
| 146 | MOV BL,VERSION_MINOR ;; | ||
| 147 | MOV DI,OFFSET SD ;; | ||
| 148 | PUSH CS ;; | ||
| 149 | POP ES ;; | ||
| 150 | JMP INT_2F_DONE ;; | ||
| 151 | ;; | ||
| 152 | INT_2F_CP_INVOKE: ;; | ||
| 153 | CMP AL,CP_INVOKE ;; Q..invoke CP? | ||
| 154 | JNE INT_2F_CP_LANGUAGE ;; N..next | ||
| 155 | ;; | ||
| 156 | MOV SI,SD.FIRST_XLAT_PTR ;; Get FIRST_XLAT_PTR | ||
| 157 | ;; | ||
| 158 | INT_2F_NEXT_SECTION: ;; | ||
| 159 | CMP SI,-1 ;; | ||
| 160 | JE INT_2F_ERROR_FLAG ;; | ||
| 161 | MOV CX,[SI].XS_CP_ID ;; Read in the code page value | ||
| 162 | CMP CX,BX ;; Is this the table to make active? | ||
| 163 | JNE INT_2F_CP_INVOKE_CONT1 ;; | ||
| 164 | MOV SD.ACTIVE_XLAT_PTR,SI ;; IF Yes, Set the ACTIVE_XLAT_PTR | ||
| 165 | MOV SD.INVOKED_CP_TABLE,BX ;; record new code page | ||
| 166 | JMP INT_2F_DONE ;; | ||
| 167 | ;; | ||
| 168 | INT_2F_CP_INVOKE_CONT1: ;; Else | ||
| 169 | MOV DI,[SI].XS_NEXT_SECT_PTR ;; IF No, | ||
| 170 | MOV SI,DI ;; Get NEXT_SECT_PTR | ||
| 171 | JMP INT_2F_NEXT_SECTION ;; NEXT_SECTION | ||
| 172 | ;; | ||
| 173 | INT_2F_ERROR_FLAG: ;; | ||
| 174 | MOV AX,1 ;; | ||
| 175 | MOV RESTORE_BP,BP ;;;;;; | ||
| 176 | MOV BP,SP ;; | ||
| 177 | OR WORD PTR [BP]+12,CARRY_FLAG ;; Set carry flag | ||
| 178 | MOV BP,RESTORE_BP ;; | ||
| 179 | ;;;;;; | ||
| 180 | JMP INT_2F_DONE ;; | ||
| 181 | ;; | ||
| 182 | INT_2F_CP_LANGUAGE: ;; | ||
| 183 | CMP AL,CP_LANGUAGE ;; Q..Set default language?? | ||
| 184 | JNE INT_2F_DONE ;; N..next | ||
| 185 | ;; | ||
| 186 | CMP BL,0 ;; Y..Check if Language is to be US437 | ||
| 187 | JNE INT_2F_CONTINUE1 ;; IF yes THEN, | ||
| 188 | MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to 0 | ||
| 189 | JMP INT_2F_DONE ;; | ||
| 190 | ;; | ||
| 191 | INT_2F_CONTINUE1: ;; ELSE | ||
| 192 | CMP BL,-1 ;; Check if language is to be national | ||
| 193 | JNE INT_2F_LANG_ERROR_FLAG ;; IF yes THEN, | ||
| 194 | MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to -1 (0FFH) | ||
| 195 | JMP INT_2F_DONE ;; | ||
| 196 | ;; | ||
| 197 | INT_2F_LANG_ERROR_FLAG: ;; ELSE | ||
| 198 | MOV RESTORE_BP,BP ;;;;;; Set CARRY flag | ||
| 199 | MOV BP,SP ;; | ||
| 200 | OR WORD PTR [BP]+12,CARRY_FLAG ;; | ||
| 201 | MOV BP,RESTORE_BP ;; | ||
| 202 | ;;;;;; | ||
| 203 | JMP INT_2F_DONE ;; | ||
| 204 | ;; | ||
| 205 | INT_2F_DONE: ;; | ||
| 206 | POP SI ;; | ||
| 207 | POP CX ;; | ||
| 208 | POP BX ;;;;;;; | ||
| 209 | POP DS ;; | ||
| 210 | CMP WORD PTR CS:SD.OLD_INT_2F,0 ;; Q..are we the last in the chain? | ||
| 211 | JNE INT_2F_JMP ;; N..call next in chain | ||
| 212 | CMP WORD PTR CS:SD.OLD_INT_2F+2,0 ;; Q..are we the last in the chain? | ||
| 213 | JNE INT_2F_JMP ;; N..call next in chain | ||
| 214 | ;;;;;;; | ||
| 215 | IRET ;; Y..return to caller | ||
| 216 | ;; | ||
| 217 | INT_2F_JMP: ;; | ||
| 218 | ;; | ||
| 219 | JMP CS:SD.OLD_INT_2F ;; | ||
| 220 | ;; | ||
| 221 | KEYB_INT_2F ENDP ;; | ||
| 222 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 223 | |||
| 224 | CODE ENDS | ||
| 225 | END | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBI2F.INC b/v4.0/src/CMD/KEYB/KEYBI2F.INC new file mode 100644 index 0000000..57067f4 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI2F.INC | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBI2F.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Description: | ||
| 11 | ;; ------------ | ||
| 12 | ;; External declarations and equates for procedures in file | ||
| 13 | ;; KEYBI2F.ASM | ||
| 14 | ;; | ||
| 15 | ;; Change History: | ||
| 16 | ;; --------------- | ||
| 17 | ;; | ||
| 18 | ;; | ||
| 19 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 20 | ;; | ||
| 21 | EXTRN KEYB_INT_2F:NEAR ;; | ||
| 22 | ;; | ||
| 23 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 24 | |||
| 25 | .LIST | ||
| 26 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBI48.ASM b/v4.0/src/CMD/KEYB/KEYBI48.ASM new file mode 100644 index 0000000..05ed786 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI48.ASM | |||
| @@ -0,0 +1,174 @@ | |||
| 1 | |||
| 2 | |||
| 3 | PAGE ,132 | ||
| 4 | TITLE DOS - KEYB Command - Interrupt 48H Handler | ||
| 5 | |||
| 6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 7 | ;; DOS - NLS Support - KEYB Command | ||
| 8 | ;; (C) Copyright 1988 Microsoft | ||
| 9 | ;; | ||
| 10 | ;; File Name: KEYBI48.ASM | ||
| 11 | ;; ---------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; Contains Interrupt 48H handler. | ||
| 16 | ;; | ||
| 17 | ;; Documentation Reference: | ||
| 18 | ;; ------------------------ | ||
| 19 | ;; PC DOS 3.3 Detailed Design Document - May ?? 1986 | ||
| 20 | ;; | ||
| 21 | ;; Procedures Contained in This File: | ||
| 22 | ;; ---------------------------------- | ||
| 23 | ;; | ||
| 24 | ;; Include Files Required: | ||
| 25 | ;; ----------------------- | ||
| 26 | ;; INCLUDE KEYBEQU.INC | ||
| 27 | ;; INCLUDE KEYBSHAR.INC | ||
| 28 | ;; INCLUDE KEYBMAC.INC | ||
| 29 | ;; INCLUDE KEYBCMD.INC | ||
| 30 | ;; INCLUDE KEYBCPSD.INC | ||
| 31 | ;; INCLUDE POSTEQU.inc | ||
| 32 | ;; INCLUDE DSEG.inc | ||
| 33 | ;; | ||
| 34 | ;; External Procedure References: | ||
| 35 | ;; ------------------------------ | ||
| 36 | ;; FROM FILE ????????.ASM: | ||
| 37 | ;; procedure - description???????????????????????????????? | ||
| 38 | ;; | ||
| 39 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 40 | ;; -------------------- | ||
| 41 | ;; | ||
| 42 | ;; Change History: | ||
| 43 | ;; --------------- | ||
| 44 | ;; | ||
| 45 | ;; | ||
| 46 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 47 | ;; | ||
| 48 | INCLUDE KEYBEQU.INC ;; | ||
| 49 | INCLUDE KEYBSHAR.INC ;; | ||
| 50 | INCLUDE KEYBMAC.INC ;; | ||
| 51 | INCLUDE KEYBCMD.INC ;; | ||
| 52 | INCLUDE KEYBCPSD.INC ;; | ||
| 53 | INCLUDE POSTEQU.inc ;; | ||
| 54 | INCLUDE DSEG.inc ;; | ||
| 55 | ;; | ||
| 56 | PUBLIC KEYB_INT_48 ;; | ||
| 57 | ;; | ||
| 58 | EXTRN ERROR_BEEP:NEAR ;; | ||
| 59 | ;; | ||
| 60 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 61 | ;; | ||
| 62 | ASSUME CS:CODE,DS:CODE,ES:DATA;; | ||
| 63 | ;; | ||
| 64 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 65 | ;; | ||
| 66 | ;; Module: KEYB_INT_48 | ||
| 67 | ;; | ||
| 68 | ;; Description: | ||
| 69 | ;; | ||
| 70 | ;; Input Registers: | ||
| 71 | ;; AL := Scan Code | ||
| 72 | ;; | ||
| 73 | ;; Output Registers: | ||
| 74 | ;; N/A | ||
| 75 | ;; | ||
| 76 | ;; Logic: | ||
| 77 | ;; IF scan code is not a break code THEN | ||
| 78 | ;; IF CNTL was not entered THEN | ||
| 79 | ;; IF ALT+SHIFT was pressed THEN | ||
| 80 | ;; Set JB_KB_FLAG in SHARED_DATA_AREA | ||
| 81 | ;; Clear ALT and SHIFT states in KB_FLAG | ||
| 82 | ;; IRET or JMP to a chained INT48 routine | ||
| 83 | ;; | ||
| 84 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 85 | ;; | ||
| 86 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 87 | ;; Program Code | ||
| 88 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 89 | ;; | ||
| 90 | KEYB_INT_48 PROC ;; | ||
| 91 | ;; | ||
| 92 | STI ;; allow NON-KB interrupts | ||
| 93 | PUSH BX ;; | ||
| 94 | PUSH BP ;; | ||
| 95 | PUSH CX ;; | ||
| 96 | PUSH DX ;; | ||
| 97 | PUSH DI ;; | ||
| 98 | PUSH SI ;; | ||
| 99 | PUSH DS ;; | ||
| 100 | PUSH ES ;; | ||
| 101 | PUSH AX ;; | ||
| 102 | ;; | ||
| 103 | MOV SD.JR_KB_FLAG,0 ;; Clear the flag | ||
| 104 | ;; | ||
| 105 | CMP AL,80H ;; Test for break code | ||
| 106 | JA INT48_EXIT ;; IF not a break code THEN | ||
| 107 | ;; | ||
| 108 | PUSH DS ;; Save segment registers | ||
| 109 | PUSH ES ;; | ||
| 110 | ;; | ||
| 111 | PUSH CS ;; Set up addressing | ||
| 112 | POP DS ;; for DATA SEGMENT (=CODE SEGMENT) | ||
| 113 | MOV BX,DATA ;; Set up addressing | ||
| 114 | MOV ES,BX ;; for EXTRA SEGMENT (=BIOS RAM AREA) | ||
| 115 | ;; | ||
| 116 | MOV AH,KB_FLAG ;; Get the flag status | ||
| 117 | AND AH,0FH ;; Clear all shift states | ||
| 118 | ;; | ||
| 119 | TEST AH,CTL_SHIFT ;; Test if CNTL was entered? | ||
| 120 | JNE INT48_PASS ;;;;;;;;;;;;;;;; IF yes THEN | ||
| 121 | ;; pass to ROM INT48 | ||
| 122 | AND AH,ALT_SHIFT+RIGHT_SHIFT+LEFT_SHIFT ;; Test if both ALT and | ||
| 123 | CMP AH,ALT_SHIFT ;; SHIFT were pressed | ||
| 124 | JBE INT48_PASS ;; IF no THEN | ||
| 125 | ;; pass to ROM INT48 | ||
| 126 | MOV BH,KB_FLAG ;;;;;;;;;;;; IF yes then | ||
| 127 | MOV SD.JR_KB_FLAG,BH ;; Setup JR flag | ||
| 128 | AND SD.JR_KB_FLAG,ALT_SHIFT+RIGHT_SHIFT+LEFT_SHIFT ;; Pass flags | ||
| 129 | ;; (ALT and | ||
| 130 | ;;;;;;;;;;;;;;;;;;;;;;;;;; EITHER/BOTH SHIFT) | ||
| 131 | XOR KB_FLAG,AH ;; Clear the ALT state and SHIFT state | ||
| 132 | ;; Reset the KB_FLAG to permit | ||
| 133 | ;; third shifts to go through | ||
| 134 | INT48_PASS: ;; | ||
| 135 | POP ES ;; | ||
| 136 | POP DS ;; | ||
| 137 | ;;;;;;; | ||
| 138 | INT48_EXIT: ;; | ||
| 139 | CMP WORD PTR CS:SD.OLD_INT_48,0 ;; Q..are we the last in the chain? | ||
| 140 | JNE INT_48_JMP ;; N..call next in chain | ||
| 141 | CMP WORD PTR CS:SD.OLD_INT_48+2,0 ;; Q..are we the last in the chain? | ||
| 142 | JNE INT_48_JMP ;; N..call next in chain | ||
| 143 | ;;;;;;; | ||
| 144 | POP AX ;; restore regs | ||
| 145 | POP ES ;; | ||
| 146 | POP DS ;; | ||
| 147 | POP SI ;; | ||
| 148 | POP DI ;; | ||
| 149 | POP DX ;; | ||
| 150 | POP CX ;; | ||
| 151 | POP BP ;; | ||
| 152 | POP BX ;; | ||
| 153 | ;; | ||
| 154 | IRET ;; Y..return to caller | ||
| 155 | ;; | ||
| 156 | INT_48_JMP: ;; | ||
| 157 | ;; | ||
| 158 | POP AX ;; restore regs | ||
| 159 | POP ES ;; | ||
| 160 | POP DS ;; | ||
| 161 | POP SI ;; | ||
| 162 | POP DI ;; | ||
| 163 | POP DX ;; | ||
| 164 | POP CX ;; | ||
| 165 | POP BP ;; | ||
| 166 | POP BX ;; | ||
| 167 | ;; | ||
| 168 | JMP CS:SD.OLD_INT_48 ;; | ||
| 169 | ;; | ||
| 170 | KEYB_INT_48 ENDP ;; | ||
| 171 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 172 | |||
| 173 | CODE ENDS | ||
| 174 | END | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBI48.INC b/v4.0/src/CMD/KEYB/KEYBI48.INC new file mode 100644 index 0000000..592223c --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI48.INC | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | |||
| 2 | .XLIST | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; DOS - NLS Support - KEYB Command | ||
| 6 | ;; (C) Copyright 1988 Microsoft | ||
| 7 | ;; | ||
| 8 | ;; File Name: KEYBI48.INC | ||
| 9 | ;; ---------- | ||
| 10 | ;; | ||
| 11 | ;; Description: | ||
| 12 | ;; ------------ | ||
| 13 | ;; External declarations and equates for procedures in file | ||
| 14 | ;; KEYBI48.ASM | ||
| 15 | ;; | ||
| 16 | ;; Change History: | ||
| 17 | ;; --------------- | ||
| 18 | ;; | ||
| 19 | ;; | ||
| 20 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 21 | ;; | ||
| 22 | EXTRN KEYB_INT_48:NEAR ;; | ||
| 23 | ;; | ||
| 24 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 25 | |||
| 26 | .LIST | ||
| 27 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBI9.ASM b/v4.0/src/CMD/KEYB/KEYBI9.ASM new file mode 100644 index 0000000..d32b096 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI9.ASM | |||
| @@ -0,0 +1,672 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS KEYB Command - Interrupt 9 Non-US Support | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (C) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYBI9.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Converts scan codes to ASCII for non-US keyboards. | ||
| 15 | ;; This orutine uses the tables loaded into the SHARED_DATA_AREA | ||
| 16 | ;; from KEYBOARD.SYS by the KEYB_COMMAND module. | ||
| 17 | ;; | ||
| 18 | ;; Documentation Reference: | ||
| 19 | ;; ------------------------ | ||
| 20 | ;; PC DOS 3.3 Detailed Design Document - May 1986 | ||
| 21 | ;; | ||
| 22 | ;; Procedures Contained in This File: | ||
| 23 | ;; ---------------------------------- | ||
| 24 | ;; KEYB_STATE_PROCESSOR - Scan to ASCII translator. | ||
| 25 | ;; | ||
| 26 | ;; External Procedure References: | ||
| 27 | ;; ------------------------------ | ||
| 28 | ;; None. | ||
| 29 | ;; | ||
| 30 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 31 | ;; -------------------- | ||
| 32 | ;; | ||
| 33 | ;; Change History: | ||
| 34 | ;; --------------- | ||
| 35 | ;; | ||
| 36 | ;; | ||
| 37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 38 | ;; | ||
| 39 | ;**** | ||
| 40 | INCLUDE KEYBEQU.INC ;; | ||
| 41 | INCLUDE DSEG.inc ;; System data segments | ||
| 42 | INCLUDE POSTEQU.inc ;; System equates | ||
| 43 | INCLUDE KEYBSHAR.INC ;; | ||
| 44 | INCLUDE KEYBI2F.INC ;; | ||
| 45 | INCLUDE KEYBI9C.INC ;; | ||
| 46 | INCLUDE KEYBCPSD.INC ;; | ||
| 47 | INCLUDE KEYBCMD.INC ;; | ||
| 48 | ;; | ||
| 49 | PUBLIC KEYB_STATE_PROCESSOR ;; | ||
| 50 | ;; | ||
| 51 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 52 | ;; | ||
| 53 | ASSUME CS:CODE,DS:CODE ;; | ||
| 54 | ;; | ||
| 55 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 56 | ;; | ||
| 57 | ;; Procedure: KEYB_STATE_PROCESSOR | ||
| 58 | ;; | ||
| 59 | ;; Description: | ||
| 60 | ;; Convert scan to ASCII using the tables loaded into the | ||
| 61 | ;; SHARED_DATA_AREA. Conversion is directed by the STATE LOGIC | ||
| 62 | ;; commands contained in the SHARED_DATA_AREA. This routine | ||
| 63 | ;; interprets those commands. | ||
| 64 | ;; | ||
| 65 | ;; Input Registers: | ||
| 66 | ;; N/A | ||
| 67 | ;; | ||
| 68 | ;; Output Registers: | ||
| 69 | ;; N/A | ||
| 70 | ;; | ||
| 71 | ;; Logic: | ||
| 72 | ;; Enable interrupts | ||
| 73 | ;; Save registers | ||
| 74 | ;; | ||
| 75 | ;; | ||
| 76 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 77 | ;; | ||
| 78 | BREAK_CODE EQU 80H ;; | ||
| 79 | ;; | ||
| 80 | HOT_KEY_ACTIVE DB 0 ;; 1 if hot key is active | ||
| 81 | ;; | ||
| 82 | ;; | ||
| 83 | ;; These are copies of the BIOS FLAGS | ||
| 84 | FLAGS_TO_TEST LABEL BYTE ;; KB_FLAG, KB_FLAG_1,2,3 | ||
| 85 | KB_SHADOW_FLAGS DB NUM_BIOS_FLAGS DUP(0) ;; | ||
| 86 | EXT_KB_FLAG DB 0 ;; Extended KB Flag for shift states | ||
| 87 | NLS_FLAG_1 DB 0 ;; NLS Flags for dead key etc | ||
| 88 | NLS_FLAG_2 DB 0 ;; . | ||
| 89 | ;; | ||
| 90 | SAVED_NLS_FLAGS DB 0,0 ;; Saved copy of the NLS flags | ||
| 91 | ;; | ||
| 92 | OPTION_BYTE DB 0 ;; Set by OPTION command | ||
| 93 | ;; | ||
| 94 | KB_FLAG_PTRS DW OFFSET KB_FLAG ;; These are pointers to the BIOS flags | ||
| 95 | DW OFFSET KB_FLAG_1 ;; we must test | ||
| 96 | DW OFFSET KB_FLAG_2 ;; | ||
| 97 | DW OFFSET KB_FLAG_3 ;; | ||
| 98 | ;; | ||
| 99 | XLAT_TAB_PTR DW 0 ;; pointer to xlat tables for cur state | ||
| 100 | ;; | ||
| 101 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 102 | |||
| 103 | |||
| 104 | NEST_LEVEL DB 0 ;; | ||
| 105 | PROCESS_LEVEL DB 0 ;; | ||
| 106 | TAKE_ELSE DB 0 ;; | ||
| 107 | BUSY_FLAG DB 0 ;; Flag to prevent re-entry | ||
| 108 | ;; | ||
| 109 | CMD_JUMP_TABLE LABEL WORD ;; | ||
| 110 | DW OFFSET IFF_PROC ;; CODE 0 | ||
| 111 | DW OFFSET ANDF_PROC ;; 1 | ||
| 112 | DW OFFSET ELSEF_PROC ;; 2 | ||
| 113 | DW OFFSET ENDIFF_PROC ;; 3 | ||
| 114 | DW OFFSET XLATT_PROC ;; 4 | ||
| 115 | DW OFFSET OPTION_PROC ;; 5 | ||
| 116 | DW OFFSET SET_FLAG_PROC ;; 6 | ||
| 117 | DW OFFSET PUT_ERROR_PROC ;; 7 | ||
| 118 | DW OFFSET IFKBD_PROC ;; 8 | ||
| 119 | DW OFFSET GOTO_PROC ;; 9 | ||
| 120 | DW OFFSET BEEP_PROC ;; A | ||
| 121 | DW OFFSET RESET_NLS_PROC ;; B | ||
| 122 | DW OFFSET UNKNOWN_COMMAND ;; C | ||
| 123 | DW OFFSET UNKNOWN_COMMAND ;; D | ||
| 124 | DW OFFSET UNKNOWN_COMMAND ;; E | ||
| 125 | DW OFFSET UNKNOWN_COMMAND ;; F | ||
| 126 | ;; | ||
| 127 | ;; | ||
| 128 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 129 | ;; | ||
| 130 | KEYB_STATE_PROCESSOR PROC NEAR ;; | ||
| 131 | ;; | ||
| 132 | TEST CS:SD.TABLE_OK,1 ;; | ||
| 133 | JNZ WE_HAVE_A_TABLE ;; | ||
| 134 | CLC ;; BACK TO US INT 9 | ||
| 135 | RET ;; | ||
| 136 | |||
| 137 | EVEN | ||
| 138 | |||
| 139 | WE_HAVE_A_TABLE: ;; | ||
| 140 | |||
| 141 | PUSH DS ;; save DS | ||
| 142 | PUSH ES ;; save ES | ||
| 143 | PUSH AX ;; save scan code for caller | ||
| 144 | PUSH BX ;; save shift states for caller | ||
| 145 | |||
| 146 | PUSH CS ;; | ||
| 147 | POP DS ;; DS = our seg | ||
| 148 | MOV BX,DATA ;; | ||
| 149 | MOV ES,BX ;; addressability to BIOS data | ||
| 150 | ;; | ||
| 151 | ;; | ||
| 152 | CMP COUNTRY_FLAG,0FFH ;; Q..country mode? | ||
| 153 | JE INIT_STATE_PROCESSING ;; Y..continue | ||
| 154 | JMP GOTO_BIOS ;; N..exit | ||
| 155 | ;; | ||
| 156 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 157 | ;; -------STATE SECTION PROCESSING------- | ||
| 158 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 159 | ;; | ||
| 160 | INIT_STATE_PROCESSING: ;; | ||
| 161 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 162 | ;; Set NLS shift flags EITHER_SHIFT, EITHER_ALT, EITHER_CTRL | ||
| 163 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 164 | ;; | ||
| 165 | ;; Q..in shift state? | ||
| 166 | TEST ES:KB_FLAG,RIGHT_SHIFT+LEFT_SHIFT | ||
| 167 | JNZ IN_SHIFT_STATE ;; Y..go set bit | ||
| 168 | AND EXT_KB_FLAG,NOT EITHER_SHIFT ;; N..clear bit | ||
| 169 | JMP SHORT TEST_CTL ;; | ||
| 170 | IN_SHIFT_STATE: ;; | ||
| 171 | OR EXT_KB_FLAG,EITHER_SHIFT ;; | ||
| 172 | TEST_CTL: ;; | ||
| 173 | TEST ES:KB_FLAG,CTL_SHIFT ;; Q..in control state? | ||
| 174 | JNZ IN_CTL_STATE ;; Y..go set bit | ||
| 175 | TEST ES:KB_FLAG_3,R_CTL_SHIFT ;; Q..how bout the right ctl? | ||
| 176 | JNZ IN_CTL_STATE ;; Y..go set the bit | ||
| 177 | AND EXT_KB_FLAG,NOT EITHER_CTL ;; N..clear the bit | ||
| 178 | JMP SHORT TEST_ALT ;; | ||
| 179 | IN_CTL_STATE: ;; | ||
| 180 | OR EXT_KB_FLAG,EITHER_CTL ;; | ||
| 181 | TEST_ALT: ;; | ||
| 182 | TEST ES:KB_FLAG,ALT_SHIFT ;; Q..in alt state? | ||
| 183 | JNZ IN_ALT_STATE ;; Y..go set bit | ||
| 184 | TEST ES:KB_FLAG_3,R_ALT_SHIFT ;; Q..how bout the right alt? | ||
| 185 | JNZ IN_ALT_STATE ;; Y..go set the bit | ||
| 186 | AND EXT_KB_FLAG,NOT EITHER_ALT ;; N..clear the bit | ||
| 187 | JMP SHORT COPY_FLAGS ;; | ||
| 188 | IN_ALT_STATE: ;; | ||
| 189 | OR EXT_KB_FLAG,EITHER_ALT ;; | ||
| 190 | ;; | ||
| 191 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 192 | ;; Copy BIOS KB flags from BIOS data seg into the | ||
| 193 | ;; FLAGS_TO_TEST structure. | ||
| 194 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 195 | ;; | ||
| 196 | COPY_FLAGS: ;; | ||
| 197 | MOV CX,NUM_BIOS_FLAGS ;; | ||
| 198 | MOV SI,0 ;; pointers to the BIOS flags | ||
| 199 | MOV DI,0 ;; create shadow copies | ||
| 200 | MOVE_NEXT_FLAG: ;; | ||
| 201 | MOV BX,KB_FLAG_PTRS[SI] ;; pointer to next flag | ||
| 202 | MOV AL,ES:[BX] ;; flag in AL | ||
| 203 | MOV KB_SHADOW_FLAGS[DI],AL ;; save it in the shadow table | ||
| 204 | INC DI ;; | ||
| 205 | INC SI ;; | ||
| 206 | INC SI ;; | ||
| 207 | LOOP MOVE_NEXT_FLAG ;; | ||
| 208 | ;; | ||
| 209 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 210 | ;; Interpret State Logic Commands | ||
| 211 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 212 | ;; | ||
| 213 | PROCESS_STATES: ;; | ||
| 214 | MOV OPTION_BYTE,0 ;; clear options | ||
| 215 | MOV SI,SD.LOGIC_PTR ;; | ||
| 216 | LEA SI,[SI].SL_LOGIC_CMDS ;; | ||
| 217 | NEXT_COMMAND: ;; | ||
| 218 | MOV BL,[SI] ;; command byte in BL | ||
| 219 | SHR BL,1 ;; | ||
| 220 | SHR BL,1 ;; | ||
| 221 | SHR BL,1 ;; | ||
| 222 | SHR BL,1 ;; ISOLATE COMMAND CODE | ||
| 223 | SHL BL,1 ;; command code * 2 | ||
| 224 | JMP CMD_JUMP_TABLE[BX] ;; go process command | ||
| 225 | UNKNOWN_COMMAND: ;; | ||
| 226 | JMP FATAL_ERROR ;; bad news | ||
| 227 | ;; | ||
| 228 | ;; | ||
| 229 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 230 | IFKBD_PROC: ;; | ||
| 231 | MOV AL,NEST_LEVEL ;; | ||
| 232 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 233 | JNE IFKBD_DONE ;; N..don't process | ||
| 234 | |||
| 235 | MOV AX,[SI+1] ;; Keyboard Type Flag | ||
| 236 | ;; | ||
| 237 | TEST SD.KEYB_TYPE,AX ;; Q..are we the right system? | ||
| 238 | JNZ IFKBD_TEST_OK ;; Y.. | ||
| 239 | IFKBD_TEST_FAILED: ;; | ||
| 240 | MOV TAKE_ELSE,YES ;; test failed - take ELSE | ||
| 241 | JMP SHORT IFKBD_DONE ;; | ||
| 242 | IFKBD_TEST_OK: ;; | ||
| 243 | INC PROCESS_LEVEL ;; process commands within IF | ||
| 244 | MOV TAKE_ELSE,NO ;; | ||
| 245 | IFKBD_DONE: ;; | ||
| 246 | INC NEST_LEVEL ;; IFKBD increments nest level | ||
| 247 | INC SI ;; bump past IFKBD | ||
| 248 | INC SI ;; | ||
| 249 | INC SI ;; | ||
| 250 | JMP NEXT_COMMAND ;; | ||
| 251 | ;; | ||
| 252 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 253 | ;; | ||
| 254 | PUT_ERROR_PROC: ;; | ||
| 255 | MOV AL,NEST_LEVEL ;; | ||
| 256 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 257 | JNE PUT_ERROR_DONE ;; N..don't process | ||
| 258 | MOV DI,SD.ACTIVE_XLAT_PTR ;; pointer to active Xlat Section | ||
| 259 | MOV AL,[SI+1] ;; state id in AL | ||
| 260 | CALL PUT_ERROR ;; check active section | ||
| 261 | JC PUT_ERROR_DONE ;; carry set if translation found | ||
| 262 | MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section | ||
| 263 | MOV AL,[SI+1] ;; state id for XLATT in AL | ||
| 264 | CALL PUT_ERROR ;; | ||
| 265 | ;; | ||
| 266 | PUT_ERROR_DONE: ;; | ||
| 267 | INC SI ;; | ||
| 268 | INC SI ;; | ||
| 269 | JMP NEXT_COMMAND ;; | ||
| 270 | ;; | ||
| 271 | PUT_ERROR PROC ;; | ||
| 272 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 273 | ;; Search for a state whose ID matches the ID | ||
| 274 | ;; on the PUT_ERROR command | ||
| 275 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 276 | ;; | ||
| 277 | CLC ;; | ||
| 278 | LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section | ||
| 279 | PE_NEXT_STATE: ;; | ||
| 280 | CMP [DI].XS_STATE_LEN,0 ;; Q..out of states? | ||
| 281 | JE PE_EXIT ;; Y..exit | ||
| 282 | CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state? | ||
| 283 | JE PE_STATE_MATCH ;; | ||
| 284 | ADD DI,[DI].XS_STATE_LEN ;; N..check next state | ||
| 285 | JMP SHORT PE_NEXT_STATE ;; | ||
| 286 | ;; | ||
| 287 | PE_STATE_MATCH: ;; | ||
| 288 | MOV AX,[DI].XS_ERROR_CHAR ;; get error char in AX | ||
| 289 | CALL BUFFER_FILL ;; | ||
| 290 | STC ;; indicate that we found the state | ||
| 291 | PE_EXIT: ;; | ||
| 292 | RET ;; | ||
| 293 | ;; | ||
| 294 | PUT_ERROR ENDP ;; | ||
| 295 | ;; | ||
| 296 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 297 | ;; | ||
| 298 | GOTO_BIOS: ;; | ||
| 299 | CLC ;; clear carry flag indicating | ||
| 300 | POP BX ;; we should continue INT 9 | ||
| 301 | POP AX ;; processing | ||
| 302 | POP ES ;; | ||
| 303 | POP DS ;; | ||
| 304 | RET ;; | ||
| 305 | ;; | ||
| 306 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 307 | ;; | ||
| 308 | IFF_PROC: ;; | ||
| 309 | MOV AL,NEST_LEVEL ;; | ||
| 310 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 311 | JNE IFF_DONE ;; N..don't process IFF | ||
| 312 | MOV BL,[SI] ;; command byte | ||
| 313 | AND BL,FLAG_ID_BITS ;; isolate flag id | ||
| 314 | XOR BH,BH ;; | ||
| 315 | MOV AL,FLAGS_TO_TEST[BX] ;; flag in AL | ||
| 316 | TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT test? | ||
| 317 | JNZ ITS_A_NOT ;; | ||
| 318 | TEST AL,[SI]+1 ;; Y..check for bit set | ||
| 319 | JNZ IFF_MATCH ;; | ||
| 320 | JZ IFF_NO_MATCH ;; | ||
| 321 | ITS_A_NOT: ;; | ||
| 322 | TEST AL,[SI]+1 ;; Y..check for bit clear | ||
| 323 | JZ IFF_MATCH ;; | ||
| 324 | IFF_NO_MATCH: ;; | ||
| 325 | MOV TAKE_ELSE,YES ;; flag test failed - take ELSE | ||
| 326 | JMP SHORT IFF_DONE ;; | ||
| 327 | IFF_MATCH: ;; | ||
| 328 | INC PROCESS_LEVEL ;; process commands within IF | ||
| 329 | MOV TAKE_ELSE,NO ;; | ||
| 330 | ;; | ||
| 331 | IFF_DONE: ;; | ||
| 332 | INC NEST_LEVEL ;; IFF increments nest level | ||
| 333 | INC SI ;; bump past IFF | ||
| 334 | INC SI ;; | ||
| 335 | JMP NEXT_COMMAND ;; | ||
| 336 | ;; | ||
| 337 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 338 | ;; | ||
| 339 | ELSEF_PROC: ;; | ||
| 340 | MOV AL,PROCESS_LEVEL ;; | ||
| 341 | CMP AL,NEST_LEVEL ;; Q..nest level = process level? | ||
| 342 | JNE CHECK_TAKE_ELSEF ;; N..check for take_else | ||
| 343 | DEC PROCESS_LEVEL ;; Y..we just finished the "IF" block | ||
| 344 | JMP ELSEF_DONE ;; so we are finished with IFF/ELSEF | ||
| 345 | CHECK_TAKE_ELSEF: ;; | ||
| 346 | CMP TAKE_ELSE,YES ;; Q..are we scanning for ELSE? | ||
| 347 | JNE ELSEF_DONE ;; N..done | ||
| 348 | DEC NEST_LEVEL ;; ELSEF itself is back a level | ||
| 349 | CMP AL,NEST_LEVEL ;; Q..nest level = process level? | ||
| 350 | JNE NOT_THIS_ELSEF ;; N..this else is not the one | ||
| 351 | INC PROCESS_LEVEL ;; Y..process ELSEF block | ||
| 352 | MOV TAKE_ELSE,NO ;; reset | ||
| 353 | NOT_THIS_ELSEF: ;; | ||
| 354 | INC NEST_LEVEL ;; stuff within the ELSEF is up a level | ||
| 355 | ;; | ||
| 356 | ELSEF_DONE: ;; | ||
| 357 | INC SI ;; bump past ELSEF | ||
| 358 | JMP NEXT_COMMAND ;; | ||
| 359 | ;; | ||
| 360 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 361 | ENDIFF_PROC: ;; | ||
| 362 | MOV AL,PROCESS_LEVEL ;; | ||
| 363 | CMP AL,NEST_LEVEL ;; Q..nest level = process level? | ||
| 364 | JNE ENDIFF_DONE ;; N..don't adjust process level | ||
| 365 | DEC PROCESS_LEVEL ;; Y..we just finished the IF/ELSE | ||
| 366 | ENDIFF_DONE: ;; | ||
| 367 | DEC NEST_LEVEL ;; ENDIF decrements nest level | ||
| 368 | INC SI ;; bump past ENDIF | ||
| 369 | JMP NEXT_COMMAND ;; | ||
| 370 | ;; | ||
| 371 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 372 | ;; Translations may be in the Common or Specific | ||
| 373 | ;; Sections. Search the Specific section first | ||
| 374 | ;; then the common section. | ||
| 375 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 376 | XLATT_PROC: ;; | ||
| 377 | MOV AL,PROCESS_LEVEL ;; | ||
| 378 | CMP AL,NEST_LEVEL ;; Q..nest level = process level? | ||
| 379 | JNE XLATT_DONE ;; N..next command | ||
| 380 | MOV DI,SD.ACTIVE_XLAT_PTR ;; pointer to active Xlat Section | ||
| 381 | MOV AL,[SI+1] ;; state id for XLATT in AL | ||
| 382 | CALL TRANSLATE ;; check active section | ||
| 383 | JC XLATT_FOUND ;; carry set if translation found | ||
| 384 | MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section | ||
| 385 | MOV AL,[SI+1] ;; state id for XLATT in AL | ||
| 386 | CALL TRANSLATE ;; | ||
| 387 | JNC XLATT_DONE ;; | ||
| 388 | XLATT_FOUND: ;; | ||
| 389 | OR EXT_KB_FLAG,SCAN_MATCH ;; set flag indicating scan matched | ||
| 390 | TEST OPTION_BYTE,EXIT_IF_FOUND ;; Q..exit | ||
| 391 | JZ XLATT_DONE ;; | ||
| 392 | JMP EXIT ;; Y..BYE | ||
| 393 | ;; | ||
| 394 | XLATT_DONE: ;; | ||
| 395 | INC SI ;; | ||
| 396 | INC SI ;; | ||
| 397 | JMP NEXT_COMMAND ;; | ||
| 398 | ;; | ||
| 399 | TRANSLATE PROC ;; | ||
| 400 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 401 | ;; Search for a state whose ID matches the ID | ||
| 402 | ;; on the XLATT command | ||
| 403 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 404 | ;; | ||
| 405 | CLC ;; | ||
| 406 | LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section | ||
| 407 | TP_NEXT_STATE: ;; | ||
| 408 | CMP [DI].XS_STATE_LEN,0 ;; Q..out of states? | ||
| 409 | JE TP_EXIT ;; Y..exit | ||
| 410 | CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state? | ||
| 411 | JE TP_STATE_MATCH ;; | ||
| 412 | ADD DI,[DI].XS_STATE_LEN ;; N..check next state | ||
| 413 | JMP SHORT TP_NEXT_STATE ;; | ||
| 414 | ;; | ||
| 415 | TP_STATE_MATCH: ;; | ||
| 416 | AND EXT_KB_FLAG,NOT SCAN_MATCH ;; reset flag before search | ||
| 417 | PUSH SI ;; save pointer to next command | ||
| 418 | LEA SI,[DI].XS_FIRST_TAB ;; point to first xlat table | ||
| 419 | MOV XLAT_TAB_PTR,SI ;; start of XLAT tables | ||
| 420 | MOV AL,SCAN_CODE ;; restore incoming scan code | ||
| 421 | JMP SHORT NEXT_XLAT_TAB ;; | ||
| 422 | TP_DONE: ;; return here from XLAT | ||
| 423 | POP SI ;; | ||
| 424 | TP_EXIT: ;; | ||
| 425 | RET ;; | ||
| 426 | ;; | ||
| 427 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 428 | ;; Check xlate tables for matching scan code | ||
| 429 | ;; The xlate table can be in one of two forms: | ||
| 430 | ;; Type 1 = Table contains buffer entries only. | ||
| 431 | ;; Scan code is used as an index into xlat table | ||
| 432 | ;; Type 2 = Table contains pairs of SCAN/BUFFER_ENTRY. | ||
| 433 | ;; Table must be searched for matching scan. | ||
| 434 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 435 | ;; | ||
| 436 | NEXT_XLAT_TAB: ;; | ||
| 437 | MOV SI,XLAT_TAB_PTR ;; pointer to xlat tables | ||
| 438 | CMP [SI].XLAT_TAB_SIZE,0 ;; Q..any more xlat tables? | ||
| 439 | JNE PROCESS_XLAT_TAB ;; Y..check um | ||
| 440 | JMP TP_DONE ;; N..done | ||
| 441 | PROCESS_XLAT_TAB: ;; | ||
| 442 | MOV DL,[SI].XLAT_OPTIONS ;; save translate options IN DL | ||
| 443 | MOV BX,[SI].XLAT_TAB_SIZE ;; Y..calc pointer to next xlat tab | ||
| 444 | ADD BX,SI ;; | ||
| 445 | MOV XLAT_TAB_PTR,BX ;; pointer to next xlat tab | ||
| 446 | TEST DL,TYPE_2_TAB ;; Q..is this a type 2 table? | ||
| 447 | JZ TYPE_1_LOOKUP ;; N..go do table lookup | ||
| 448 | TYPE_2_SEARCH: ;; Y..search table | ||
| 449 | XOR CH,CH ;; | ||
| 450 | MOV CL,[SI].XLAT_NUM ;; number of xlat entries | ||
| 451 | MOV BX,DEFAULT_TAB_2_ENT_SZ ;; default entry size | ||
| 452 | TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..are buffer entries ASCII only? | ||
| 453 | JZ NEXT_TAB_2_ENTRY ;; N..continue | ||
| 454 | MOV BX,ASC_ONLY_TAB_2_ENT_SZ ;; Y..set size in BX | ||
| 455 | NEXT_TAB_2_ENTRY: ;; entry size is in BX | ||
| 456 | CMP CX,0 ;; Q..last entry? | ||
| 457 | JE NEXT_XLAT_TAB ;; y..go to next table | ||
| 458 | CMP AL,[SI].XLAT_SCAN ;; Q..scan match? | ||
| 459 | JE FOUND_TAB_2_ENTRY ;; Y..go create buffer entry | ||
| 460 | ADD SI,BX ;; point to next entry | ||
| 461 | LOOP NEXT_TAB_2_ENTRY ;; | ||
| 462 | JMP SHORT NEXT_XLAT_TAB ;; | ||
| 463 | FOUND_TAB_2_ENTRY: ;; Q..set scan code to 0? | ||
| 464 | MOV AH,AL ;; default scan code in AH | ||
| 465 | MOV AL,[SI].XLAT_2_BUF_ENTRY ;; ASCII code from table in AL | ||
| 466 | TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..are buffer entries ASCII only? | ||
| 467 | JNZ BUFFER_ENTRY_READY ;; Y..buffer entry is ready | ||
| 468 | MOV AH,[SI].XLAT_2_BUF_ENTRY+1 ;; N..scan code from table as well | ||
| 469 | JMP SHORT BUFFER_ENTRY_READY ;; go put entry in buffer | ||
| 470 | ;; | ||
| 471 | TYPE_1_LOOKUP: ;; | ||
| 472 | CMP AL,[SI].XLAT_SCAN_LO ;; Q..is scan in range of this table? | ||
| 473 | JB NEXT_XLAT_TAB ;; N..next table | ||
| 474 | CMP AL,[SI].XLAT_SCAN_HI ;; Q..is scan in range of this table? | ||
| 475 | JA NEXT_XLAT_TAB ;; N..next table | ||
| 476 | SUB AL,[SI].XLAT_SCAN_LO ;; convert scan code to xlat index | ||
| 477 | TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..ASCII only in xlat ? | ||
| 478 | JZ TWO_BYTE_LOOKUP ;; N..go do 2-byte lookup | ||
| 479 | LEA BX,[SI].XLAT_1_BUF_ENTRY ;; Y..do 1-byte lookup | ||
| 480 | XLAT [SI].XLAT_1_BUF_ENTRY ;; ASCII code in AL | ||
| 481 | MOV AH,SCAN_CODE ;; SCAN in AH | ||
| 482 | JMP SHORT BUFFER_ENTRY_READY ;; go put entry in buffer | ||
| 483 | TWO_BYTE_LOOKUP: ;; | ||
| 484 | MOV BL,2 ;; multiply scan index | ||
| 485 | MUL BL ;; by two | ||
| 486 | MOV BX,AX ;; real index in BX | ||
| 487 | MOV AX,WORD PTR [SI].XLAT_1_BUF_ENTRY[BX] ;; get 2-byte buffer entry | ||
| 488 | ;; AL=ASCII AH=SCAN | ||
| 489 | BUFFER_ENTRY_READY: ;; | ||
| 490 | TEST DL,ZERO_SCAN ;; Q..set scan part to zero? | ||
| 491 | JZ NO_ZERO_SCAN ;; N.. | ||
| 492 | XOR AH,AH ;; scan = 0 | ||
| 493 | NO_ZERO_SCAN: ;; | ||
| 494 | CALL BUFFER_FILL ;; go put entry in buffer | ||
| 495 | STC ;; indicate translation found | ||
| 496 | JMP TP_DONE ;; | ||
| 497 | ;; | ||
| 498 | TRANSLATE ENDP ;; | ||
| 499 | ;; | ||
| 500 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 501 | OPTION_PROC: ;; | ||
| 502 | MOV AL,PROCESS_LEVEL ;; | ||
| 503 | CMP AL,NEST_LEVEL ;; Q..nest level = process level? | ||
| 504 | JNE DONE_OPTION ;; N..done | ||
| 505 | MOV AL,[SI]+1 ;; mask in AL | ||
| 506 | TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT? | ||
| 507 | JNZ AND_MASK ;; | ||
| 508 | OR OPTION_BYTE,AL ;; N..OR in the mask bits | ||
| 509 | JMP DONE_OPTION ;; | ||
| 510 | AND_MASK: ;; | ||
| 511 | NOT AL ;; | ||
| 512 | AND OPTION_BYTE,AL ;; Y..AND out the mask bits | ||
| 513 | DONE_OPTION: ;; | ||
| 514 | INC SI ;; | ||
| 515 | INC SI ;; | ||
| 516 | JMP NEXT_COMMAND ;; | ||
| 517 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 518 | RESET_NLS_PROC: ;; | ||
| 519 | MOV AL,NEST_LEVEL ;; | ||
| 520 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 521 | JNE RN_DONE ;; N..don't process | ||
| 522 | MOV NLS_FLAG_1,0 ;; | ||
| 523 | MOV NLS_FLAG_2,0 ;; | ||
| 524 | RN_DONE: ;; | ||
| 525 | INC SI ;; | ||
| 526 | JMP NEXT_COMMAND ;; | ||
| 527 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 528 | BEEP_PROC: ;; | ||
| 529 | MOV AL,NEST_LEVEL ;; | ||
| 530 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 531 | JNE BP_DONE ;; N..don't process | ||
| 532 | MOV BEEP_PENDING,YES ;; set beep pending flag. the beep | ||
| 533 | ;; will be done just before iret | ||
| 534 | BP_DONE: ;; | ||
| 535 | INC SI ;; | ||
| 536 | JMP NEXT_COMMAND ;; | ||
| 537 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 538 | GOTO_PROC: ;; | ||
| 539 | MOV AL,NEST_LEVEL ;; | ||
| 540 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 541 | JNE GOTO_DONE ;; N..don't process | ||
| 542 | MOV BL,[SI] ;; command byte in BL | ||
| 543 | AND BL,NOT COMMAND_BITS ;; remove command code | ||
| 544 | OR BL,BL ;; Q..goto label? | ||
| 545 | JZ GOTO_LABEL ;; Y..go jump | ||
| 546 | CMP BL,EXIT_INT_9_FLAG ;; Q..SPECIAL - Exit Int 9? | ||
| 547 | JNE NOT_EXIT_INT_9 ;; N.. | ||
| 548 | JMP EXIT ;; Y..bye bye | ||
| 549 | NOT_EXIT_INT_9: ;; | ||
| 550 | CMP BL,EXIT_STATE_LOGIC_FLAG ;; Q..SPECIAL - Exit State Logic? | ||
| 551 | JNE NOT_EXIT_S_L ;; N.. | ||
| 552 | JMP GOTO_BIOS ;; Y..goto bios | ||
| 553 | NOT_EXIT_S_L: ;; | ||
| 554 | JMP FATAL_ERROR ;; garbage in that command | ||
| 555 | GOTO_LABEL: ;; | ||
| 556 | ADD SI,[SI]+1 ;; bump by relative offset | ||
| 557 | MOV PROCESS_LEVEL,0 ;; reset process and nest level | ||
| 558 | MOV NEST_LEVEL,0 ;; | ||
| 559 | GOTO_DONE: ;; | ||
| 560 | ADD SI,3 ;; bump to next command | ||
| 561 | JMP NEXT_COMMAND ;; | ||
| 562 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 563 | ;; | ||
| 564 | ANDF_PROC: ;; | ||
| 565 | MOV AL,NEST_LEVEL ;; | ||
| 566 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 567 | JNE ANDF_DONE ;; N..don't process ANDF | ||
| 568 | MOV BL,[SI] ;; command byte | ||
| 569 | AND BL,FLAG_ID_BITS ;; isolate flag id | ||
| 570 | XOR BH,BH ;; | ||
| 571 | MOV AL,FLAGS_TO_TEST[BX] ;; flag in AL | ||
| 572 | TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT test? | ||
| 573 | JNZ ANDF_NOT ;; | ||
| 574 | TEST AL,[SI]+1 ;; Y..check for bit set | ||
| 575 | JNZ ANDF_DONE ;; if set then remain in IFF | ||
| 576 | JZ ANDF_NO_MATCH ;; | ||
| 577 | ANDF_NOT: ;; | ||
| 578 | TEST AL,[SI]+1 ;; Y..check for bit clear | ||
| 579 | JZ ANDF_DONE ;; if clear then remain in IFF | ||
| 580 | ANDF_NO_MATCH: ;; | ||
| 581 | MOV TAKE_ELSE,YES ;; flag test failed - take ELSE | ||
| 582 | DEC PROCESS_LEVEL ;; IFF would have inc'd - so dec | ||
| 583 | ANDF_DONE: ;; | ||
| 584 | INC SI ;; bump past ANDF | ||
| 585 | INC SI ;; | ||
| 586 | JMP NEXT_COMMAND ;; | ||
| 587 | ;; | ||
| 588 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 589 | ;; SET_FLAG Command. | ||
| 590 | ;; Flag Table must be in the Common Section | ||
| 591 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 592 | ;; | ||
| 593 | SET_FLAG_PROC: ;; | ||
| 594 | MOV AL,NEST_LEVEL ;; | ||
| 595 | CMP AL,PROCESS_LEVEL ;; Q..nest level = process level? | ||
| 596 | JNE SF_DONE ;; N..don't process | ||
| 597 | ;; | ||
| 598 | MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section | ||
| 599 | MOV AL,[SI+1] ;; state id in AL | ||
| 600 | LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section | ||
| 601 | SF_NEXT_STATE: ;; | ||
| 602 | CMP [DI].XS_STATE_LEN,0 ;; Q..out of states? | ||
| 603 | JE SF_DONE ;; Y..exit | ||
| 604 | CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state? | ||
| 605 | JE SF_STATE_MATCH ;; | ||
| 606 | ADD DI,[DI].XS_STATE_LEN ;; N..check next state | ||
| 607 | JMP SHORT SF_NEXT_STATE ;; | ||
| 608 | ;; | ||
| 609 | SF_STATE_MATCH: ;; | ||
| 610 | AND EXT_KB_FLAG,NOT SCAN_MATCH ;; reset flag before search | ||
| 611 | PUSH SI ;; save pointer to next command | ||
| 612 | LEA SI,[DI].XS_FIRST_TAB ;; point to table | ||
| 613 | MOV AL,SCAN_CODE ;; restore incoming scan code | ||
| 614 | MOV CX,[SI] ;; number of entries | ||
| 615 | CMP CX,0 ;; Q..any entries? | ||
| 616 | JE SF_RESTORE ;; N..done | ||
| 617 | INC SI ;; Y..Bump to first entry | ||
| 618 | INC SI ;; | ||
| 619 | NEXT_SF_ENTRY: ;; | ||
| 620 | CMP AL,[SI] ;; Q..scan match? | ||
| 621 | JE FOUND_SF_ENTRY ;; Y..go set flag | ||
| 622 | ADD SI,3 ;; point to next entry | ||
| 623 | LOOP NEXT_SF_ENTRY ;; | ||
| 624 | JMP SHORT SF_RESTORE ;; no match found | ||
| 625 | FOUND_SF_ENTRY: ;; | ||
| 626 | MOV NLS_FLAG_1,0 ;; clear all NLS bits | ||
| 627 | MOV NLS_FLAG_2,0 ;; | ||
| 628 | MOV BL,[SI]+1 ;; flag id in BX | ||
| 629 | XOR BH,BH ;; | ||
| 630 | MOV AL,[SI]+2 ;; mask in AL | ||
| 631 | OR FLAGS_TO_TEST[BX],AL ;; set the bit | ||
| 632 | OR EXT_KB_FLAG,SCAN_MATCH ;; set flag indicating scan matched | ||
| 633 | TEST OPTION_BYTE,EXIT_IF_FOUND ;; Q..exit | ||
| 634 | JZ SF_RESTORE ;; | ||
| 635 | POP SI ;; | ||
| 636 | JMP EXIT ;; | ||
| 637 | SF_RESTORE: ;; | ||
| 638 | POP SI ;; | ||
| 639 | SF_DONE: ;; | ||
| 640 | INC SI ;; bump past command | ||
| 641 | INC SI ;; | ||
| 642 | JMP NEXT_COMMAND ;; | ||
| 643 | ;; | ||
| 644 | ;; | ||
| 645 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 646 | ;; Fatal Error routine. Come here when | ||
| 647 | ;; we have a critical error such as an | ||
| 648 | ;; invalid State Logic Command. | ||
| 649 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 650 | ;; | ||
| 651 | FATAL_ERROR: ;; | ||
| 652 | JMP SHORT EXIT ;; end the int 9 processing | ||
| 653 | ;; | ||
| 654 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 655 | ;; Exit point. | ||
| 656 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 657 | ;; | ||
| 658 | EXIT: ;; | ||
| 659 | MOV BUSY_FLAG,NO ;; | ||
| 660 | STC ;; indicate we should end INT 9 | ||
| 661 | POP BX ;; processing | ||
| 662 | POP AX ;; | ||
| 663 | POP ES ;; | ||
| 664 | POP DS ;; | ||
| 665 | RET ;; | ||
| 666 | ;; | ||
| 667 | KEYB_STATE_PROCESSOR ENDP ;; | ||
| 668 | ;; | ||
| 669 | ;; | ||
| 670 | |||
| 671 | CODE ENDS | ||
| 672 | END | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBI9.INC b/v4.0/src/CMD/KEYB/KEYBI9.INC new file mode 100644 index 0000000..0541cb9 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI9.INC | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Micrsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBI9.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYB.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; External declarations and equates for procedures in file | ||
| 16 | ;; KEYBI9.ASM | ||
| 17 | ;; | ||
| 18 | ;; Change History: | ||
| 19 | ;; --------------- | ||
| 20 | ;; | ||
| 21 | ;; | ||
| 22 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 23 | ;; | ||
| 24 | EXTRN KEYB_STATE_PROCESSOR:NEAR | ||
| 25 | ;; | ||
| 26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 27 | |||
| 28 | .LIST | ||
| 29 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBI9C.ASM b/v4.0/src/CMD/KEYB/KEYBI9C.ASM new file mode 100644 index 0000000..9cf8f5d --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI9C.ASM | |||
| @@ -0,0 +1,1894 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS KEYB Command - Interrupt 9 (US support) | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (C) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYBI9C.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Interrupt 9 mainline. | ||
| 15 | ;; This routine handles all US keyboard support for the following | ||
| 16 | ;; system units: PCjr, PC, PCXT, PCAT, PALACE, ROUNDUP, PC Convertible | ||
| 17 | ;; KEYB_STATE_PROCESSOR is called for non-US keyboard support. | ||
| 18 | ;; | ||
| 19 | ;; | ||
| 20 | ;; Documentation Reference: | ||
| 21 | ;; ------------------------ | ||
| 22 | ;; PC DOS 3.3 Detailed Design Document - May 1986 | ||
| 23 | ;; | ||
| 24 | ;; Procedures Contained in This File: | ||
| 25 | ;; ---------------------------------- | ||
| 26 | ;; KEYB_INT_9 - Interrupt 9 | ||
| 27 | ;; | ||
| 28 | ;; External Procedure References: | ||
| 29 | ;; ------------------------------ | ||
| 30 | ;; FROM FILE KEYBI9.ASM: | ||
| 31 | ;; KEYB_STATE_PROCESSOR - Non US keyboard support. | ||
| 32 | ;; | ||
| 33 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 34 | ;; -------------------- | ||
| 35 | ;; | ||
| 36 | ;; Change History: | ||
| 37 | ;; --------------- | ||
| 38 | ;; ;AN001; - DCR 478 - KEYBOARD INT SPLICING NickS | ||
| 39 | ;; ;AN002; - PTM 3090 ENABLING RIGHT CTL FOR RE-BOOTING | ||
| 40 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 41 | ;; | ||
| 42 | INCLUDE KEYBEQU.INC ;; | ||
| 43 | INCLUDE DSEG.inc ;; System data segments | ||
| 44 | INCLUDE POSTEQU.inc ;; System equates | ||
| 45 | INCLUDE KEYBSHAR.INC ;; | ||
| 46 | INCLUDE KEYBI2F.INC ;; | ||
| 47 | INCLUDE KEYBI9.INC ;; | ||
| 48 | INCLUDE KEYBCPSD.INC ;; | ||
| 49 | INCLUDE KEYBCMD.INC ;; | ||
| 50 | ;; | ||
| 51 | PUBLIC KEYB_INT_9 ;; | ||
| 52 | PUBLIC K8 ;; CTRL case tables | ||
| 53 | PUBLIC BUFFER_FILL ;; | ||
| 54 | PUBLIC COUNTRY_FLAG ;; | ||
| 55 | PUBLIC BEEP_PENDING ;; | ||
| 56 | PUBLIC SCAN_CODE ;; | ||
| 57 | PUBLIC ERROR_BEEP ;; | ||
| 58 | PUBLIC TEMP_HEAD ;; | ||
| 59 | PUBLIC TEMP_TAIL ;; | ||
| 60 | PUBLIC BUSY_TFLAG ;; | ||
| 61 | PUBLIC MYBUFF ;; | ||
| 62 | PUBLIC ENABLE_FL ;; | ||
| 63 | PUBLIC NEW_BUFF_CTR ;; | ||
| 64 | |||
| 65 | |||
| 66 | ROM_SEG EQU 0F000H ;; BIOS ROM SEGMENT | ||
| 67 | PC1DATE_ID EQU 03138H ;; YEAR ROM WAS RELEASED IN ASCII | ||
| 68 | SYSROM_DATE EQU 0FFFBH ;; OFFSET OF ROM YEAR DIGIT | ||
| 69 | ;; | ||
| 70 | DIAGS SEGMENT AT 0FFFFH ;; | ||
| 71 | ORG 0 ;; | ||
| 72 | RESET LABEL FAR ;; | ||
| 73 | DIAGS ENDS ;; | ||
| 74 | ;; | ||
| 75 | ;; | ||
| 76 | ;; | ||
| 77 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 78 | ASSUME CS:CODE,DS:DATA ;; | ||
| 79 | ;; | ||
| 80 | |||
| 81 | ;CNS*** | ||
| 82 | END_OF_BUFF EQU 16 ;AN000;END OF TEMP BUFF VALUE | ||
| 83 | ACTIVE_ON EQU -1 ;AN000; | ||
| 84 | ACTIVE_OFF EQU 0 ;AN000; | ||
| 85 | TEMP_HEAD DW 0 ;AN000; | ||
| 86 | TEMP_TAIL DW 0 ;AN000; | ||
| 87 | BUSY_TFLAG DB ACTIVE_OFF ;AN000;FLAG TO CHECK BUFFER ACTIVITY | ||
| 88 | MYBUFF DB 16 DUP(0) ;AN000; | ||
| 89 | ENABLE_FL DB 0 ;NEW BUFFER TO BE USED | ||
| 90 | NEW_BUFF_CTR DB 0 ;ON THE FRONT END OF THE | ||
| 91 | ;CNS*** | ||
| 92 | |||
| 93 | |||
| 94 | BEEP_PENDING DB 0 ;; | ||
| 95 | BUFFER_ENTRY_OK DB 0 ;; | ||
| 96 | SCAN_CODE DB 0 ;; | ||
| 97 | ;; | ||
| 98 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 99 | ;; | ||
| 100 | ;; TABLE OF SHIFT KEYS AND MASK VALUES | ||
| 101 | ;; | ||
| 102 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 103 | ;; | ||
| 104 | ;------ KEY_TABLE ;; | ||
| 105 | K6 LABEL BYTE ;; | ||
| 106 | DB INS_KEY ;; INSERT KEY | ||
| 107 | DB CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY | ||
| 108 | DB LEFT_KEY,RIGHT_KEY ;; | ||
| 109 | K6L EQU $-K6 ;; | ||
| 110 | ;; | ||
| 111 | ;------ MASK_TABLE ;; | ||
| 112 | K7 LABEL BYTE ;; | ||
| 113 | DB INS_SHIFT ;; INSERT MODE SHIFT | ||
| 114 | DB CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT | ||
| 115 | DB LEFT_SHIFT,RIGHT_SHIFT ;; | ||
| 116 | ;; | ||
| 117 | ;---------- TABLES FOR ALT CASE -----;; | ||
| 118 | ;------ ALT-INPUT-TABLE ;; | ||
| 119 | K30 LABEL BYTE ;; | ||
| 120 | DB 82,79,80,81,75 ;; | ||
| 121 | DB 76,77,71,72,73 ;; 10 NUMBERS ON KEYPAD | ||
| 122 | ;------ SUPER-SHIFT-TABLE ;; | ||
| 123 | DB 16,17,18,19,20,21 ;; A-Z TYPEWRITER CHARS | ||
| 124 | DB 22,23,24,25,30,31 ;; | ||
| 125 | DB 32,33,34,35,36,37 ;; | ||
| 126 | DB 38 ;; | ||
| 127 | DB 44,45,46,47,48,49 ;; | ||
| 128 | DB 50 ;; | ||
| 129 | K30_LEN EQU $-K30-10 ;; | ||
| 130 | ;; | ||
| 131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 132 | ;; K8 is overlaid by K8_RPL (from module KEYB_COMMAND) | ||
| 133 | ;; if extended INT 16 support is available | ||
| 134 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 135 | ;; | ||
| 136 | K8 LABEL BYTE ;;-------- CHARACTERS --------- | ||
| 137 | DB 27,-1,00,-1,-1,-1 ;; Esc, 1, 2, 3, 4, 5 | ||
| 138 | DB 30,-1,-1,-1,-1,31 ;; 6, 7, 8, 9, 0, - | ||
| 139 | DB -1,127,-1,17,23,5 ;; =, Bksp, Tab, Q, W, E | ||
| 140 | DB 18,20,25,21,09,15 ;; R, T, Y, U, I, O | ||
| 141 | DB 16,27,29,10,-1,01 ;; P, [, ], Enter, Ctrl, A | ||
| 142 | DB 19,04,06,07,08,10 ;; S, D, F, G, H, J | ||
| 143 | DB 11,12,-1,-1,-1,-1 ;; K, L, ;, ', `, LShift | ||
| 144 | DB 28,26,24,03,22,02 ;; \, Z, X, C, V, B | ||
| 145 | DB 14,13,-1,-1,-1,-1 ;; N, M, ,, ., /, RShift | ||
| 146 | DB '*',-1,' ',-1 ;; *, Alt, Space, CL | ||
| 147 | ;;--------- FUNCTIONS --------- | ||
| 148 | DB 94,95,96,97,98,99 ;; F1 - F6 | ||
| 149 | DB 100,101,102,103,-1,-1 ;; F7 - F10, NL, SL | ||
| 150 | DB 119,-1,132,-1,115,-1 ;; Home, Up, PgUp, -, Left, Pad5 | ||
| 151 | DB 116,-1,117,-1,118,-1 ;; Right, +, End, Down, PgDn, Ins | ||
| 152 | DB -1,-1,-1,-1,137,138 ;; Del, SysReq, Undef, WT, F11, F12 | ||
| 153 | PAGE ;; | ||
| 154 | ;----- TABLES FOR LOWER CASE (USA) --;; | ||
| 155 | ;; | ||
| 156 | K10 LABEL BYTE ;; | ||
| 157 | DB 27,'12345' ;; | ||
| 158 | DB '67890-' ;; | ||
| 159 | DB '=',08,09,'qwe' ;; | ||
| 160 | DB 'rtyuio' ;; | ||
| 161 | DB 'p[]',0DH,-1,'a' ;; LETTERS, Return, Ctrl | ||
| 162 | DB 'sdfghj' ;; | ||
| 163 | DB "kl;'`",-1 ;; LETTERS, L Shift | ||
| 164 | DB '\zxcvb' ;; | ||
| 165 | DB 'nm,./' ;; | ||
| 166 | DB -1,'*',-1,' \' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY) | ||
| 167 | ;; | ||
| 168 | ;------ LC TABLE SCAN ;; | ||
| 169 | DB 59,60,61,62,63 ;; BASE STATE OF F1 - F10 | ||
| 170 | DB 64,65,66,67,68 ;; | ||
| 171 | DB -1,-1 ;; NL, SL | ||
| 172 | ;; | ||
| 173 | ;------ KEYPAD TABLE ;; | ||
| 174 | K15 LABEL BYTE ;; | ||
| 175 | DB 71,72,73,-1,75,-1 ;; BASE STATE OF KEYPAD KEYS | ||
| 176 | DB 77,-1,79,80,81,82 ;; | ||
| 177 | DB 83 ;; | ||
| 178 | DB -1,-1,'\',133,134 ;; SysRq, Undef, WT, F11, F12 | ||
| 179 | ;; | ||
| 180 | ;------- TABLES FOR UPPER CASE (USA) ;; | ||
| 181 | ;; | ||
| 182 | K11 LABEL BYTE ;; | ||
| 183 | DB 27,'!@#$%' ;; | ||
| 184 | DB '^&*()_' ;; | ||
| 185 | DB '+',08,00,'QWE' ;; | ||
| 186 | DB 'RTYUIO' ;; | ||
| 187 | DB 'P{}',0DH,-1,'A' ;; LETTERS, Return, Ctrl | ||
| 188 | DB 'SDFGHJ' ;; | ||
| 189 | DB 'KL:"~',-1 ;; LETTERS, L Shift | ||
| 190 | DB '|ZXCVB' ;; | ||
| 191 | DB 'NM<>?' ;; | ||
| 192 | DB -1,'*',-1,' |' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY) | ||
| 193 | ;; | ||
| 194 | ;------ UC TABLE SCAN ;; | ||
| 195 | K12 LABEL BYTE ;; | ||
| 196 | DB 84,85,86,87,88 ;; SHIFTED STATE OF F1 - F10 | ||
| 197 | DB 89,90,91,92,93 ;; | ||
| 198 | DB -1,-1 ;; NL, SL | ||
| 199 | ;; | ||
| 200 | ;------ NUM STATE TABLE ;; | ||
| 201 | K14 LABEL BYTE ;; | ||
| 202 | DB '789-456+1230.' ;; NUMLOCK STATE OF KEYPAD KEYS | ||
| 203 | DB -1,-1,'|',135,136 ;; SysRq, Undef, WT, F11, F12 | ||
| 204 | ;; | ||
| 205 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 206 | ;; | ||
| 207 | ;; Procedure: KEYB_INT_9 | ||
| 208 | ;; | ||
| 209 | ;; Description: | ||
| 210 | ;; Entry point for interrupt 9 processing. | ||
| 211 | ;; | ||
| 212 | ;; Input Registers: | ||
| 213 | ;; None | ||
| 214 | ;; | ||
| 215 | ;; Output Registers: | ||
| 216 | ;; None | ||
| 217 | ;; | ||
| 218 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 219 | ;; | ||
| 220 | KEYB_INT_9 PROC NEAR ;; | ||
| 221 | JMP KB_INT_1 ; THIS JUMP AND ENSUING BYTE MUST BE HERE TO BE | ||
| 222 | COUNTRY_FLAG DB -1 ; COMPATIBLE WITH APL. APL WILL FORCE THIS | ||
| 223 | ; BYTE TO BE ZERO, ONLY BECAUSE IT'S 3 BYTES | ||
| 224 | KB_INT_1: ; AWAY FROM WHERE THE INT9 VECTOR POINTS | ||
| 225 | |||
| 226 | ; PUSH DS ;ICE | ||
| 227 | ; push bx ;ICE | ||
| 228 | ; push ax ;ICE | ||
| 229 | ; mov bx,0140H ;ICE | ||
| 230 | ; xor ax,ax ;ICE | ||
| 231 | ; mov ds,ax ;ICE | ||
| 232 | ; mov ax,word ptr ds:[bx] ;ICE | ||
| 233 | ; mov word ptr ds:[bx],ax ;ICE | ||
| 234 | ; POP ax ;ICE | ||
| 235 | ; pop bx ;ICE | ||
| 236 | ; pop ds ;ICE | ||
| 237 | |||
| 238 | PUSH BP | ||
| 239 | PUSH AX | ||
| 240 | PUSH BX | ||
| 241 | PUSH CX | ||
| 242 | PUSH DX | ||
| 243 | PUSH SI | ||
| 244 | PUSH DI | ||
| 245 | PUSH DS | ||
| 246 | PUSH ES | ||
| 247 | STI ; ENABLE INTERRUPTS | ||
| 248 | CLD ; FORWARD DIRECTION | ||
| 249 | |||
| 250 | MOV BX,DATA ; SET UP ADDRESSING | ||
| 251 | MOV DS,BX ;; DS POINTS AT THE | ||
| 252 | MOV CS:BEEP_PENDING,NO ;; ROM DATA AREA | ||
| 253 | MOV CS:BUFFER_ENTRY_OK,NO ;; INITIALIZE ALL FLAGS | ||
| 254 | ;***CNS ;; FOR LOADING AND UNLOADING THE | ||
| 255 | CMP CS:BUSY_TFLAG,ACTIVE_ON | ||
| 256 | JE NO_INIT | ||
| 257 | |||
| 258 | MOV DI,OFFSET CS:MYBUFF | ||
| 259 | MOV CS:TEMP_HEAD,DI | ||
| 260 | MOV CS:TEMP_TAIL,DI | ||
| 261 | MOV CS:ENABLE_FL,0 | ||
| 262 | ; MOV CS:NEW_BUFF_CTR,0 ;;CLEAR OUT NEW BUFFER CTR | ||
| 263 | ;***CNS | ||
| 264 | ;; BUFFER | ||
| 265 | NO_INIT: | ||
| 266 | ;------- TEST SYSTEM TYPE ;CHECK TO SEE IF THE SYSTEM IS | ||
| 267 | ;NEW ****** | ||
| 268 | |||
| 269 | |||
| 270 | |||
| 271 | TEST CS:SD.SYSTEM_FLAG,PC_AT+PC_386 ; IF THE SYSTEM WE'RE RUNNING ON IS A | ||
| 272 | JNZ KB_INT_00 ; PC3, THEN DO PC3 CODE | ||
| 273 | |||
| 274 | ;------ PC1, XT, HOME COMPUTER POST CODE | ||
| 275 | |||
| 276 | TEST CS:SD.SYSTEM_FLAG,PC_JR ;; Q..PCjr? | ||
| 277 | JZ READ_CHAR_PORT ;; N..go read port | ||
| 278 | MOV BL,CS:SD.JR_KB_FLAG ;; Its a JR so incorporate flag bits | ||
| 279 | OR KB_FLAG,BL ;; from INT 48 preprocessor | ||
| 280 | MOV CS:SD.JR_KB_FLAG,0 ;; Clear JR KB_Flag | ||
| 281 | JMP UP1MORE;UP1 ;; Skip to key processing | ||
| 282 | EVEN ;; | ||
| 283 | READ_CHAR_PORT: ;; | ||
| 284 | IN AL,KB_DATA ;; READ IN THE CHARACTER | ||
| 285 | ;; FOR PC, XT, P12: RESET THE KEYBOARD | ||
| 286 | TEST CS:SD.SYSTEM_FLAG,PC_XT+PC_LAP | ||
| 287 | JZ SYSTEM_HOOK ;; | ||
| 288 | PUSH AX ; SAVE IT | ||
| 289 | IN AL,KB_CTL ; GET THE CONTROL PORT | ||
| 290 | MOV AH,AL ; SAVE VALUE | ||
| 291 | OR AL,80H ; RESET BIT FOR KEYBOARD | ||
| 292 | OUT KB_CTL,AL | ||
| 293 | XCHG AH,AL ; GET BACK ORIGINAL CONTROL | ||
| 294 | OUT KB_CTL,AL ; KB HAS BEEN RESET | ||
| 295 | POP AX ; GET SCAN CODE BACK RWV 11-06-85 | ||
| 296 | |||
| 297 | ;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H) | ||
| 298 | |||
| 299 | SYSTEM_HOOK: ;; | ||
| 300 | MOV AH,04FH ; SYSTEM INTERCEPT - KEY CODE FUNCTION | ||
| 301 | STC ; SET CY= 1 (IN CASE OF IRET) | ||
| 302 | INT 15H ; CASSETTE CALL (AL)= KEY SCAN CODE | ||
| 303 | ; RETURNS CY= 1 FOR INVALID FUNCTION | ||
| 304 | STI ; MAKE SURE INT'S STAY ENABLED RWV 11-11-85 | ||
| 305 | JC UP1MORE ; CONTINUE IF CARRY FLAG SET ((AL)=CODE) | ||
| 306 | JMP PREP_EXIT ; EXIT IF SYSTEM HANDLED SCAN CODE | ||
| 307 | ; EXIT HANDLES HARDWARE EOI AND ENABLE | ||
| 308 | |||
| 309 | UP1MORE: | ||
| 310 | |||
| 311 | |||
| 312 | CALL DUMBJMP | ||
| 313 | JMP EXIT_CHK | ||
| 314 | |||
| 315 | |||
| 316 | |||
| 317 | ;------ PCAT POST CODE | ||
| 318 | |||
| 319 | ;------ WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED | ||
| 320 | KB_INT_00: | ||
| 321 | MOV AL,DIS_KBD ; DISABLE THE KEYBOARD COMMAND | ||
| 322 | CALL SHIP_IT ; EXECUTE DISABLE | ||
| 323 | CLI ; DISABLE INTERRUPTS | ||
| 324 | ; SUB CX,CX ; SET MAXIMUM TIMEOUT | ||
| 325 | ;KB_INT_01: | ||
| 326 | ; IN AL,STATUS_PORT ; READ ADAPTER STATUS | ||
| 327 | ; TEST AL,INPT_BUF_FULL ; CHECK INPUT BUFFER FULL STATUS BIT | ||
| 328 | ; LOOPNZ KB_INT_01 ; WAIT FOR COMMAND TO BE ACCEPTED | ||
| 329 | ;; | ||
| 330 | CALL WAIT_ON_STATUS_PORT ;; | ||
| 331 | |||
| 332 | ;----- READ CHARACTER FROM KEYBOARD INTERFACE | ||
| 333 | |||
| 334 | |||
| 335 | |||
| 336 | IN AL,PORT_A ;;AN000;GET SCAN CODE VALUE FROM PORT 60H | ||
| 337 | |||
| 338 | ; PUSH DS ;ICE | ||
| 339 | ; push bx ;ICE | ||
| 340 | ; push ax ;ICE | ||
| 341 | ; mov bx,0140H ;ICE | ||
| 342 | ; xor ax,ax ;ICE | ||
| 343 | ; mov ds,ax ;ICE | ||
| 344 | ; mov ax,word ptr ds:[bx] ;ICE | ||
| 345 | ; mov word ptr ds:[bx],ax ;ICE | ||
| 346 | ; POP ax ;ICE | ||
| 347 | ; pop bx ;ICE | ||
| 348 | ; pop ds ;ICE | ||
| 349 | |||
| 350 | ;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H) | ||
| 351 | |||
| 352 | MOV AH,04FH ; SYSTEM INTERCEPT - KEY CODE FUNCTION | ||
| 353 | STC ; SET CY= 1 (IN CASE OF IRET) | ||
| 354 | INT 15H ; CASSETTE CALL (AL)= KEY SCAN CODE | ||
| 355 | ; RETURNS CY= 1 FOR INVALID FUNCTION | ||
| 356 | JC LOAD_TBUFF ; CONTINUE IF CARRY FLAG SET ((AL)=CODE) | ||
| 357 | JMP PREP_EXIT ; EXIT IF SYSTEM HANDLED SCAN CODE | ||
| 358 | ; EXIT HANDLES HARDWARE EOI AND ENABLE | ||
| 359 | |||
| 360 | |||
| 361 | |||
| 362 | LOAD_TBUFF: | ||
| 363 | |||
| 364 | CMP CS:NEW_BUFF_CTR,END_OF_BUFF+1 ;;AN000;CHECK TO SEE IF THE SECONDARY BUFFER IS FULL | ||
| 365 | JB LOAD_CHAR | ||
| 366 | |||
| 367 | ;***CNS | ||
| 368 | PUSH DI ;; | ||
| 369 | PUSH AX ;; | ||
| 370 | CALL CLEAR_BUFFER ;;CLEAR OUT NEW BUFFER | ||
| 371 | POP AX ;; | ||
| 372 | POP DI ;; | ||
| 373 | MOV CS:TEMP_HEAD,DI ;;AN000;RESET POINTER BACK TO THE BEGINNING | ||
| 374 | MOV CS:TEMP_TAIL,DI ;;AN000;RESET POINTER BACK TO THE BEGINNING | ||
| 375 | MOV CS:BUSY_TFLAG,ACTIVE_OFF ;;AN000; | ||
| 376 | MOV CS:NEW_BUFF_CTR,0 ;;CLEAR OUT NEW BUFFER CTR | ||
| 377 | ;***CNS | ||
| 378 | |||
| 379 | LOAD_CHAR: | ||
| 380 | |||
| 381 | MOV DI,CS:TEMP_TAIL ;;AN003;MOVE PTR TO LATEST INSERT POSITION | ||
| 382 | MOV BYTE PTR CS:[DI],AL ;;AN000;LOAD CHARACTER INTO MY BUFFER | ||
| 383 | INC CS:NEW_BUFF_CTR ;;AN000; | ||
| 384 | INC DI ;;AN000;TAIL POINTER NEEDS TO BE ADVANCED | ||
| 385 | MOV CS:TEMP_TAIL,DI ;;AN000;ADD ONE TO TAIL POINTER | ||
| 386 | ;;AN000;GET ANOTHER CHAR. IF AVAILABLE | ||
| 387 | TEST CS:BUSY_TFLAG,ACTIVE_ON ;;AN000;CHECK TO SEE IF WE ARE IN A BUSY STATE | ||
| 388 | JZ KEEP_BUSY ;;AN000;IF YES ROUTINE TO UNLOAD TEMP BUFFER | ||
| 389 | CLI ; TURN OFF INTERRUPTS | ||
| 390 | ;***CNS | ||
| 391 | JMP SHORT $+2 | ||
| 392 | ;***CNS | ||
| 393 | MOV AL,EOI ; END OF INTERRUPT COMMAND | ||
| 394 | OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 395 | ;***CNS | ||
| 396 | JMP SHORT $+2 | ||
| 397 | ;***CNS | ||
| 398 | ; PUSH DS ;ICE | ||
| 399 | ; push bx ;ICE | ||
| 400 | ; push ax ;ICE | ||
| 401 | ; mov bx,0140H ;ICE | ||
| 402 | ; xor ax,ax ;ICE | ||
| 403 | ; mov ds,ax ;ICE | ||
| 404 | ; mov ax,word ptr ds:[bx] ;ICE | ||
| 405 | ; mov word ptr ds:[bx],ax ;ICE | ||
| 406 | ; POP ax ;ICE | ||
| 407 | ; pop bx ;ICE | ||
| 408 | ; pop ds ;ICE | ||
| 409 | ;;AN000;OTHERWISE FREE UP THE PROCESSOR | ||
| 410 | MOV CS:BUSY_TFLAG,ACTIVE_OFF ;;AN000; | ||
| 411 | JMP KEY_EXIT ; KEY_EXIT | ||
| 412 | |||
| 413 | EXIT_CHK: | ||
| 414 | |||
| 415 | CMP CS:ENABLE_FL,1 | ||
| 416 | JE ENABLE_CHK | ||
| 417 | |||
| 418 | CMP CS:ENABLE_FL,2 | ||
| 419 | JE KEY_EXIT | ||
| 420 | |||
| 421 | CMP CS:ENABLE_FL,-1 | ||
| 422 | JE CHK_BEEPER | ||
| 423 | |||
| 424 | |||
| 425 | PREP_EXIT: | ||
| 426 | |||
| 427 | AND KB_FLAG_3,NOT LC_E0+LC_E1 ; RESET LAST CHAR H.C. FLAG RWV 7-23-85 | ||
| 428 | |||
| 429 | |||
| 430 | CHK_BEEPER: ; INTERRUPT-RETURN | ||
| 431 | |||
| 432 | CMP CS:BEEP_PENDING,YES ;; Q..SHOULD WE BEEP? | ||
| 433 | JNE JR_EXIT ;; | ||
| 434 | MOV CS:BEEP_PENDING,NO ;; | ||
| 435 | CALL ERROR_BEEP ;; | ||
| 436 | |||
| 437 | JR_EXIT: ;; | ||
| 438 | TEST CS:SD.SYSTEM_FLAG,PC_JR ;; | ||
| 439 | JNZ KEY_EXIT ;K27A ;; | ||
| 440 | CLI ; TURN OFF INTERRUPTS | ||
| 441 | MOV AL,EOI ; END OF INTERRUPT COMMAND | ||
| 442 | OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 443 | |||
| 444 | ENABLE_CHK: ; INTERRUPT-RETURN-NO-EOI | ||
| 445 | |||
| 446 | MOV AL,ENA_KBD ; ENSURE KEYBOARD IS ENABLED (AT ONLY) | ||
| 447 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 448 | CMP CS:BUFFER_ENTRY_OK,YES ;; ENTRY IN BUFFER? | ||
| 449 | JNE GOOD_ENTRY ;K271 ;; NO, SKIP POST | ||
| 450 | MOV AX,09102H ; MOVE IN POST CODE & TYPE | ||
| 451 | INT 15H ; PERFORM OTHER FUNCTION | ||
| 452 | |||
| 453 | GOOD_ENTRY: ;; | ||
| 454 | |||
| 455 | KEY_EXIT: | ||
| 456 | |||
| 457 | |||
| 458 | CLI ; DISABLE INTERRUPTS | ||
| 459 | POP ES ; RESTORE REGISTERS | ||
| 460 | POP DS ; * | ||
| 461 | POP DI ; * | ||
| 462 | POP SI ; * | ||
| 463 | POP DX ; * | ||
| 464 | POP CX ; * | ||
| 465 | POP BX ; * | ||
| 466 | POP AX ; * | ||
| 467 | POP BP | ||
| 468 | IRET ; RETURN, INTERRUPTS BACK ON WITH FLAG CHANGE | ||
| 469 | ;;AND RETURN INT OFF OF THE STACK | ||
| 470 | |||
| 471 | |||
| 472 | |||
| 473 | KEEP_BUSY: | ||
| 474 | |||
| 475 | CALL CLEAR_BUFFER ;;UNLOAD THE TEMPORARY BUFFER | ||
| 476 | |||
| 477 | TBUFF_EMPTY: | ||
| 478 | JMP EXIT_CHK | ||
| 479 | |||
| 480 | ; RET | ||
| 481 | |||
| 482 | ;(*EQUIVALENT TO PREP_EXIT*) | ||
| 483 | ;; Procedure: CLEAR_BUFFER | ||
| 484 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 485 | ;; | ||
| 486 | ;; | ||
| 487 | CLEAR_BUFFER: ;; | ||
| 488 | ;; | ||
| 489 | ;; | ||
| 490 | MOV DI,CS:TEMP_HEAD ;;AN000;RESET POINTER BACK TO THE BEGINNING | ||
| 491 | MOV CS:BUSY_TFLAG,ACTIVE_ON ;;AN000; | ||
| 492 | ;; | ||
| 493 | ;***CNS | ||
| 494 | JMP SHORT $+2 | ||
| 495 | ;***CNS | ||
| 496 | MOV AL,EOI ;;AN000; END OF INTERRUPT COMMAND | ||
| 497 | OUT 020H,AL ;;AN000; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 498 | ;***CNS | ||
| 499 | JMP SHORT $+2 | ||
| 500 | ;***CNS | ||
| 501 | ;; | ||
| 502 | ;; | ||
| 503 | ;;AN000; INTERRUPT-RETURN-NO-EOI | ||
| 504 | GET_KB: ;;AN000;AN000; | ||
| 505 | XOR BX,BX ;;AN000; | ||
| 506 | CLI ;;AN000;DO NOT PROCESS UNTIL UNLOADED | ||
| 507 | ;;AN000; | ||
| 508 | MOV AL,BYTE PTR CS:[DI] ;;AN000;TEMPORARY BUFFER | ||
| 509 | STI ;;AN000;ENABLE SO I CAN KEEP PROCESSING | ||
| 510 | PUSH AX | ||
| 511 | PUSH BX | ||
| 512 | PUSH CX | ||
| 513 | PUSH DX | ||
| 514 | PUSH DS | ||
| 515 | PUSH ES | ||
| 516 | PUSH SI | ||
| 517 | PUSH DI ;;AN000;SAVE THE POINTER | ||
| 518 | PUSH CS:TEMP_TAIL | ||
| 519 | CALL OLD_METHOD ;;AN000;LOAD USING EXISTING METHOD | ||
| 520 | POP CS:TEMP_TAIL | ||
| 521 | POP DI ;;AN000;RESTORE THE POINTER | ||
| 522 | POP SI | ||
| 523 | POP ES | ||
| 524 | POP DS | ||
| 525 | POP DX | ||
| 526 | POP CX | ||
| 527 | POP BX | ||
| 528 | POP AX | ||
| 529 | |||
| 530 | CHK_BUFF_EMPTY: | ||
| 531 | |||
| 532 | INC DI ;;AN000;INCREMENT POINTER | ||
| 533 | CMP DI,CS:TEMP_TAIL ;;AN000;IS THE BUFFER EMPTY YET? | ||
| 534 | JE EMPTY_BUFF ;;AN000;YES - MARK INACTIVE & RETURN | ||
| 535 | ;;AN000; | ||
| 536 | ;;AN000; | ||
| 537 | ;;AN000; | ||
| 538 | JMP GET_KB ;;AN000;NO - GET ANOTHER CHARACTER | ||
| 539 | |||
| 540 | |||
| 541 | |||
| 542 | EMPTY_BUFF: | ||
| 543 | |||
| 544 | CLI ;;AN000;OTHERWISE DISABLE INTERRUPTS | ||
| 545 | MOV CS:BUSY_TFLAG,ACTIVE_OFF ;;AN000;LET SYSTEM KNOW NOT BUSY ANYMORE | ||
| 546 | MOV CS:NEW_BUFF_CTR,0 ;;CLEAR OUT NEW BUFFER CTR | ||
| 547 | |||
| 548 | |||
| 549 | |||
| 550 | RET ;;AN000; | ||
| 551 | |||
| 552 | |||
| 553 | OLD_METHOD: | ||
| 554 | |||
| 555 | |||
| 556 | KB_INT_02: ; (AL)= SCAN CODE | ||
| 557 | STI ; ENABLE INTERRUPTS AGAIN | ||
| 558 | CMP AL,KB_RESEND ; IS THE INPUT A RESEND | ||
| 559 | JE KB_INT_4 ; GO IF RESEND | ||
| 560 | |||
| 561 | ;------ CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD | ||
| 562 | |||
| 563 | CMP AL,KB_ACK ; IS THE INPUT AN ACKNOWLEDGE | ||
| 564 | JNZ KB_INT_2 ; GO IF NOT | ||
| 565 | |||
| 566 | ;------ A COMMAND TO THE KEYBOARD WAS ISSUED | ||
| 567 | |||
| 568 | CLI ; DISABLE INTERRUPTS | ||
| 569 | OR KB_FLAG_2,KB_FA ; INDICATE ACK RECEIVED | ||
| 570 | RET | ||
| 571 | ; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA) | ||
| 572 | |||
| 573 | ;------ RESEND THE LAST BYTE | ||
| 574 | |||
| 575 | KB_INT_4: | ||
| 576 | CLI ; DISABLE INTERRUPTS | ||
| 577 | OR KB_FLAG_2,KB_FE ; INDICATE RESEND RECEIVED | ||
| 578 | RET | ||
| 579 | ; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA) | ||
| 580 | |||
| 581 | |||
| 582 | ;------ UPDATE MODE INDICATORS IF CHANGE IN STATE | ||
| 583 | |||
| 584 | KB_INT_2: | ||
| 585 | PUSH AX ; SAVE DATA IN | ||
| 586 | CALL MAKE_LED ; GO GET MODE INDICATOR DATA BYTE | ||
| 587 | MOV BL,KB_FLAG_2 ; GET PREVIOUS BITS | ||
| 588 | XOR BL,AL ; SEE IF ANY DIFFERENT | ||
| 589 | AND BL,07H ; ISOLATE INDICATOR BITS | ||
| 590 | JZ UP0 ; IF NO CHANGE BYPASS UPDATE | ||
| 591 | CALL SND_LED ; GO TURN ON MODE INDICATORS | ||
| 592 | |||
| 593 | ;------ PROCESSING COMES BACK TOGETHER HERE | ||
| 594 | |||
| 595 | UP0: POP AX ; RESTORE DATA IN | ||
| 596 | PAGE | ||
| 597 | ;--------------------------------------------------------------------- | ||
| 598 | ; START OF KEY PROCESSING - | ||
| 599 | ;--------------------------------------------------------------------- | ||
| 600 | |||
| 601 | UP1: MOV AH,AL ; SAVE SCAN CODE IN AH ALSO | ||
| 602 | MOV CS:SCAN_CODE,AL ;; SAVE SCAN CODE | ||
| 603 | |||
| 604 | ;------ TEST FOR OVERRUN SCAN CODE FROM KEYBOARD | ||
| 605 | |||
| 606 | CMP AL,0FFH ; IS THIS AN OVERRUN CHAR? | ||
| 607 | JNZ K16 ; NO, TEST FOR SHIFT KEY | ||
| 608 | MOV CS:BEEP_PENDING,YES ;; | ||
| 609 | TEST CS:SD.SYSTEM_FLAG,PC_JR ;; ON JR WE HAVE TO CLEAR SOME FLAGS | ||
| 610 | JZ OVERRUN ;; | ||
| 611 | AND KB_FLAG,0F0H ;; CLEAR SHIFTS | ||
| 612 | AND KB_FLAG_1,0FH ;; | ||
| 613 | AND KB_FLAG_2,1FH ;; CLEAR FUNCTION STATES | ||
| 614 | OVERRUN: ;; | ||
| 615 | RET | ||
| 616 | ; JMP PREP_EXIT ; BUFFER_FULL_BEEP | ||
| 617 | |||
| 618 | K16: PUSH CS | ||
| 619 | POP ES ; ESTABLISH ADDRESS OF TABLES | ||
| 620 | MOV BH,KB_FLAG_3 ; LOAD FLAGS FOR TESTING RWV 10-08-85 | ||
| 621 | |||
| 622 | ;------ TEST TO SEE IF A READ_ID IS IN PROGRESS | ||
| 623 | |||
| 624 | TEST BH,RD_ID+LC_AB ; ARE WE DOING A READ ID? RWV 10-08-85 | ||
| 625 | JZ NOT_ID ; CONTINUE IF NOT | ||
| 626 | JNS TST_ID_2 ; IS THE RD_ID FLAG ON? | ||
| 627 | CMP AL,ID_1 ; IS THIS THE 1ST ID CHARACTER? | ||
| 628 | JNE RST_RD_ID | ||
| 629 | OR KB_FLAG_3,LC_AB ; INDICATE 1ST ID WAS OK | ||
| 630 | RST_RD_ID: | ||
| 631 | AND KB_FLAG_3,NOT RD_ID ; RESET THE READ ID FLAG | ||
| 632 | JMP SHORT ID_EX ; AND EXIT RWV 8-02-85 | ||
| 633 | |||
| 634 | TST_ID_2: | ||
| 635 | AND KB_FLAG_3,NOT LC_AB ; RESET FLAG | ||
| 636 | CMP AL,ID_2A ; IS THIS THE 2ND ID CHARACTER? | ||
| 637 | JE KX_BIT ; JUMP IF SO | ||
| 638 | CMP AL,ID_2 ; IS THIS THE 2ND ID CHARACTER? | ||
| 639 | JNE ID_EX ; LEAVE IF NOT | ||
| 640 | |||
| 641 | ;------ A READ ID SAID THAT IT WAS ENHANCED KEYBOARD | ||
| 642 | |||
| 643 | TEST BH,SET_NUM_LK ; SHOULD WE SET NUM LOCK? RWV 10-08-85 | ||
| 644 | JZ KX_BIT ; EXIT IF NOT | ||
| 645 | OR KB_FLAG,NUM_STATE ; FORCE NUM LOCK ON | ||
| 646 | CALL SND_LED ; GO SET THE NUM LOCK INDICATOR | ||
| 647 | KX_BIT: OR KB_FLAG_3,KBX ; INDICATE ENHANCED KEYBOARD WAS FOUND | ||
| 648 | ID_EX: ;JMP PREP_EXIT ; EXIT | ||
| 649 | RET | ||
| 650 | PAGE | ||
| 651 | NOT_ID: | ||
| 652 | CMP AL,MC_E0 ; IS THIS THE GENERAL MARKER CODE? RWV 7-19-85 | ||
| 653 | JNE TEST_E1 ; RWV 7-19-85 | ||
| 654 | OR KB_FLAG_3,LC_E0+KBX ; SET FLAG BIT, SET KBX, AND RWV 7-19-85 | ||
| 655 | JMP SHORT EXIT ; THROW AWAY THIS CODE RWV 7-19-85 | ||
| 656 | |||
| 657 | TEST_E1: | ||
| 658 | CMP AL,MC_E1 ; IS THIS THE PAUSE KEY? RWV 7-19-85 | ||
| 659 | JNE NOT_HC ; RWV 7-19-85 | ||
| 660 | OR KB_FLAG_3,LC_E1+KBX ; SET FLAG, PAUSE KEY MARKER CODE RWV 7-19-85 | ||
| 661 | EXIT: | ||
| 662 | ;***CNS | ||
| 663 | MOV CS:ENABLE_FL,-1 | ||
| 664 | RET;JMP CHK_BEEPER ; THROW AWAY THIS CODE RWV 7-19-85 | ||
| 665 | ;***CNS | ||
| 666 | NOT_HC: | ||
| 667 | AND AL,07FH ; TURN OFF THE BREAK BIT RWV 7-28-85 | ||
| 668 | TEST BH,LC_E0 ; LAST CODE THE E0 MARKER CODE? RWV 10-08-85 | ||
| 669 | JZ NOT_LC_E0 ; JUMP IF NOT RWV | ||
| 670 | |||
| 671 | MOV CX,2 ; LENGTH OF SEARCH RWV | ||
| 672 | MOV DI,OFFSET K6+6 ; IS THIS A SHIFT KEY? RWV | ||
| 673 | REPNE SCASB ; CHECK IT RWV | ||
| 674 | JNE K16A ; NO, CONTINUE KEY PROCESSING RWV | ||
| 675 | JMP SHORT K16B ; YES, THROW AWAY & RESET FLAG RWV | ||
| 676 | |||
| 677 | NOT_LC_E0: | ||
| 678 | TEST BH,LC_E1 ; LAST CODE THE E1 MARKER CODE? RWV 10-08-85 | ||
| 679 | JZ T_SYS_KEY ; JUMP IF NOT RWV | ||
| 680 | |||
| 681 | MOV CX,4 ; LENGTH OF SEARCH RWV | ||
| 682 | MOV DI,OFFSET K6+4 ; IS THIS AN ALT, CTL, OR SHIFT? RWV | ||
| 683 | REPNE SCASB ; CHECK IT RWV | ||
| 684 | JE EXIT ; THROW AWAY IF SO RWV | ||
| 685 | |||
| 686 | CMP AL,NUM_KEY ; IS IT THE PAUSE KEY? RWV | ||
| 687 | JNE K16B ; NO, THROW AWAY & RESET FLAG RWV | ||
| 688 | TEST AH,80H ; YES, IS IT THE BREAK OF THE KEY? RWV | ||
| 689 | JNZ K16B ; YES, THROW THIS AWAY, TOO RWV | ||
| 690 | TEST KB_FLAG_1,HOLD_STATE ; NO, ARE WE PAUSED ALREADY? PED 6-25-86 | ||
| 691 | JNZ K16B ; YES, THROW AWAY PED 6-25-86 | ||
| 692 | JMP K39P ; NO, THIS IS THE REAL PAUSE STATE RWV | ||
| 693 | PAGE | ||
| 694 | ;------ TEST FOR SYSTEM KEY | ||
| 695 | |||
| 696 | T_SYS_KEY: | ||
| 697 | CMP AL,SYS_KEY ; IS IT THE SYSTEM KEY? | ||
| 698 | JNE K16A ; CONTINUE IF NOT | ||
| 699 | |||
| 700 | ;;;;;; TEST cs:SD.SYSTEM_FLAG,PC_AT+PC_386 ; LET ALL SYSTEMS ISSUE INT15 RWV 8-02-85 | ||
| 701 | ;;;;;; JZ K16A ; IGNORE SYSTEM KEY IF NOT PC3 | ||
| 702 | |||
| 703 | TEST AH,080H ; CHECK IF THIS A BREAK CODE | ||
| 704 | JNZ K16C ; DON'T TOUCH SYSTEM INDICATOR IF TRUE | ||
| 705 | |||
| 706 | TEST KB_FLAG_1,SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN | ||
| 707 | JNZ K16B ; IF YES, DON'T PROCESS SYSTEM INDICATOR | ||
| 708 | |||
| 709 | OR KB_FLAG_1,SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED | ||
| 710 | ;***CNS | ||
| 711 | JMP SHORT $+2 | ||
| 712 | ;***CNS | ||
| 713 | MOV AL,EOI ; END OF INTERRUPT COMMAND | ||
| 714 | OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 715 | ;***CNS | ||
| 716 | JMP SHORT $+2 | ||
| 717 | ;***CNS | ||
| 718 | ; INTERRUPT-RETURN-NO-EOI | ||
| 719 | ;; | ||
| 720 | MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED | ||
| 721 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 722 | |||
| 723 | MOV AX,08500H ; FUNCTION VALUE FOR MAKE OF SYSTEM KEY | ||
| 724 | STI ; MAKE SURE INTERRUPTS ENABLED | ||
| 725 | INT 15H ; USER INTERRUPT | ||
| 726 | ;***CNS | ||
| 727 | MOV CS:ENABLE_FL,2 | ||
| 728 | RET;JMP KEY_EXIT ; END PROCESSING | ||
| 729 | ;***CNS | ||
| 730 | K16B: ;JMP PREP_EXIT ; IGNORE SYSTEM KEY | ||
| 731 | RET | ||
| 732 | K16C: AND KB_FLAG_1,NOT SYS_SHIFT ; TURN OFF SHIFT KEY HELD DOWN | ||
| 733 | ;***CNS | ||
| 734 | JMP SHORT $+2 | ||
| 735 | ;***CNS | ||
| 736 | MOV AL,EOI ; END OF INTERRUPT COMMAND | ||
| 737 | OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 738 | ;***CNS | ||
| 739 | JMP SHORT $+2 | ||
| 740 | ;***CNS | ||
| 741 | ; INTERRUPT-RETURN-NO-EOI | ||
| 742 | MOV AL,ENA_KBD ; ENSURE KEYBOARD IS ENABLED | ||
| 743 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 744 | |||
| 745 | MOV AX,08501H ; FUNCTION VALUE FOR BREAK OF SYSTEM KEY | ||
| 746 | STI ; MAKE SURE INTERRUPTS ENABLED | ||
| 747 | INT 15H ; USER INTERRUPT | ||
| 748 | ;***CNS | ||
| 749 | MOV CS:ENABLE_FL,2 | ||
| 750 | RET;JMP KEY_EXIT ; IGNORE SYSTEM KEY | ||
| 751 | ;***CNS | ||
| 752 | PAGE | ||
| 753 | ;------ TEST FOR SHIFT KEYS | ||
| 754 | ; | ||
| 755 | ; HERE IS WHERE KBFLAGS ARE SET. WHAT HAPPENS IS, THE SYSTEM SEARCHES TABLE | ||
| 756 | ; 'K6' FOR THE KEY. IF FOUND, IT GETS THE APPROPRIATE BIT FROM TABLE 'K7' | ||
| 757 | ; AND SETS IT ON. (TABLES ARE ALL AT THE END OF THIS ROUTINE) FLAGS FOR THE | ||
| 758 | ; SECOND ALT AND CTRL ARE SET IN KB_FLAG_3 AND HAVE THE SAME BIT POSITIONS AS | ||
| 759 | ; THEIR ORIGINAL COUNTERPARTS IN KB_FLAG | ||
| 760 | |||
| 761 | K16A: MOV BL,KB_FLAG ; PUT STATE FLAGS IN BL RWV 8-28-85 | ||
| 762 | MOV DI,OFFSET K6 ; SHIFT KEY TABLE | ||
| 763 | MOV CX,K6L ; LENGTH | ||
| 764 | REPNE SCASB ; LOOK THROUGH THE TABLE FOR A MATCH | ||
| 765 | MOV AL,AH ; RECOVER SCAN CODE | ||
| 766 | JE K17 ; JUMP IF MATCH FOUND | ||
| 767 | JMP K25 ; IF NO MATCH, THEN SHIFT NOT FOUND | ||
| 768 | |||
| 769 | ;------ SHIFT KEY FOUND | ||
| 770 | |||
| 771 | K17: SUB DI,OFFSET K6+1 ; ADJUST PTR TO SCAN CODE MTCH | ||
| 772 | MOV AH,CS:K7[DI] ; GET MASK INTO AH | ||
| 773 | MOV CL,2 ; SET UP COUNT FOR FLAG SHIFTS RWV 9-11-85 | ||
| 774 | TEST AL,80H ; TEST FOR BREAK KEY | ||
| 775 | JZ K17C | ||
| 776 | JMP K23 ; JUMP IF BREAK RWV 8-14-85 | ||
| 777 | |||
| 778 | ;------ SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE | ||
| 779 | |||
| 780 | K17C: CMP AH,SCROLL_SHIFT | ||
| 781 | JAE K18 ; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY | ||
| 782 | |||
| 783 | ;------ PLAIN SHIFT KEY, SET SHIFT ON | ||
| 784 | |||
| 785 | CMP COUNTRY_FLAG,0FFh ; ARE WE IN FOREIGN LANG MODE? RWV 8-29-85 | ||
| 786 | JNE K17C1 ; NO, US MODE, JUMP RWV 8-29-85 | ||
| 787 | CMP AL,ALT_KEY ; IS THIS THE ALT KEY? RWV 8-29-85 | ||
| 788 | JNE K17C1 ; NO, NORMAL KEY RWV 8-29-85 | ||
| 789 | ;**CNS | ||
| 790 | ;;AD000TEST KB_FLAG_3,LC_E0 ; IS IT THE ALT_GR KEY? RWV 8-29-85 | ||
| 791 | ;;AD000JNZ K17C2 ; YES, DON'T SET KB_FLAG RWV 8-29-85 | ||
| 792 | |||
| 793 | |||
| 794 | K17C1: OR KB_FLAG,AH ; TURN ON SHIFT BIT RWV 8-28-85 | ||
| 795 | K17C2: TEST AH,CTL_SHIFT+ALT_SHIFT ; IS IT ALT OR CTRL? RWV 8-28-85 | ||
| 796 | JZ K17F ; NO, JUMP RWV 8-28-85 | ||
| 797 | K17D: TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85 | ||
| 798 | JZ K17E ; NO, JUMP RWV 7-22-85 | ||
| 799 | OR KB_FLAG_3,AH ; SET BITS FOR RIGHT CTRL, ALT RWV 7-22-85 | ||
| 800 | RET | ||
| 801 | ; JMP PREP_EXIT ; INTERRUPT_RETURN RWV 7-22-85 | ||
| 802 | K17E: SHR AH,CL ; MOVE FLAG BITS TWO POSITIONS RWV 8-28-85 | ||
| 803 | OR KB_FLAG_1,AH ; SET BITS FOR LEFT CTRL, ALT RWV 7-22-85 | ||
| 804 | RET | ||
| 805 | ; JMP PREP_EXIT ;; | ||
| 806 | ;; Q..typewriter caps locks | ||
| 807 | K17F: ;; | ||
| 808 | TEST CS:SD.SPECIAL_FEATURES,TYPEWRITER_CAPS_LK | ||
| 809 | JZ K17G ;; N..all done | ||
| 810 | CMP COUNTRY_FLAG,0FFh ; ARE WE IN LANG MODE? RWV 8-28-85 | ||
| 811 | JNE K17G ; NO, ALL DONE WITH SHIFT KEY RWV 8-28-85 | ||
| 812 | |||
| 813 | ;; If keyboard is P12 then we still need to release caps_lk ***RPS 10-3-86 | ||
| 814 | |||
| 815 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ;; IS THIS A P12 KEYBOARD? ***RPS 10-3-86 | ||
| 816 | JNZ REMOVE_CAPS_SHIFT ;; ***RPS 10-3-86 | ||
| 817 | |||
| 818 | TEST BH,KBX ; THIS THE ENHANCED KEYBOARD? RWV 11-06-85 | ||
| 819 | JZ K17G ; NO, ALL DONE WITH SHIFT KEY RWV 8-13-85 | ||
| 820 | REMOVE_CAPS_SHIFT: ;; ***RPS 10-3-86 | ||
| 821 | AND KB_FLAG,NOT CAPS_SHIFT ; YES, TAKE KB OUT OF C_L STATE RWV 8-13-85 | ||
| 822 | TEST CS:SD.SYSTEM_FLAG,PC_AT+PC_386 ; IF THIS IS A PC1 OR XT, RWV 9-18-85 | ||
| 823 | JZ K17G ; THEN SKIP THE LEDs RWV 9-18-85 | ||
| 824 | CALL SND_LED ; AND UPDATE THE INDICATOR RWV 8-13-85 | ||
| 825 | K17G: RET;JMP PREP_EXIT | ||
| 826 | |||
| 827 | ;------ TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT | ||
| 828 | |||
| 829 | K18: ; SHIFT-TOGGLE | ||
| 830 | TEST BL,CTL_SHIFT ; CHECK CTL SHIFT STATE RWV 7-30-85 | ||
| 831 | JZ K18A ; JUMP IF NOT CTL STATE | ||
| 832 | JMP K25 ; JUMP IF CTL STATE | ||
| 833 | K18A: CMP AL,INS_KEY ; CHECK FOR INSERT KEY | ||
| 834 | JNE K22 ; JUMP IF NOT INSERT KEY | ||
| 835 | TEST BL,ALT_SHIFT ; CHECK FOR ALTERNATE SHIFT RWV 7-30-85 | ||
| 836 | JZ K18B ; JUMP IF NOT ALTERNATE SHIFT RWV 7-30-85 | ||
| 837 | JMP K25 ; JUMP IF ALTERNATE SHIFT | ||
| 838 | K18B: TEST BH,LC_E0 ; IS THIS THE NEW INSERT KEY? RWV 10-08-85 | ||
| 839 | JNZ K22 ; YES, THIS ONE'S NEVER A "0" RWV 7-23-85 | ||
| 840 | K19: TEST BL,NUM_STATE ; CHECK FOR BASE STATE RWV 7-30-85 | ||
| 841 | JNZ K21 ; JUMP IF NUM LOCK IS ON | ||
| 842 | TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; TEST FOR SHIFT STATE RWV 7-30-85 | ||
| 843 | JZ K22 ; JUMP IF BASE STATE | ||
| 844 | K20: MOV AH,AL ; PUT SCAN CODE BACK IN AH RWV 11-07-85 | ||
| 845 | JMP K25 ; NUMERAL "0", STNDRD. PROCESSING RWV 7-22-85 | ||
| 846 | |||
| 847 | K21: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; MIGHT BE NUMERIC RWV 7-30-85 | ||
| 848 | JZ K20 ; IS NUMERIC, STD. PROC. RWV 7-23-85 | ||
| 849 | |||
| 850 | K22: ; SHIFT TOGGLE KEY HIT; PROCESS IT | ||
| 851 | TEST AH,KB_FLAG_1 ; IS KEY ALREADY DEPRESSED? | ||
| 852 | JZ K22A | ||
| 853 | RET;JMP PREP_EXIT ; JUMP IF KEY ALREADY DEPRESSED | ||
| 854 | K22A: OR KB_FLAG_1,AH ; INDICATE THAT THE KEY IS DEPRESSED | ||
| 855 | XOR KB_FLAG,AH ; TOGGLE THE SHIFT STATE | ||
| 856 | |||
| 857 | TEST CS:SD.SPECIAL_FEATURES,TYPEWRITER_CAPS_LK | ||
| 858 | JZ K22C ;; N..all done | ||
| 859 | |||
| 860 | ;; If keyboard is P12 then we do not toggle ***RPS 10-3-86 | ||
| 861 | |||
| 862 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ;; IS THIS A P12 KEYBOARD? ***RPS 10-3-86 | ||
| 863 | JNZ LAP_SO_DONT_TOGGLE ;; ***RPS 10-3-86 | ||
| 864 | |||
| 865 | TEST BH,KBX ; THIS THE ENHANCED KEYBOARD? RWV 11-06-85 | ||
| 866 | JZ K22C ; NO, ALL DONE WITH TOGGLE KEYS RWV 8-13-85 | ||
| 867 | |||
| 868 | LAP_SO_DONT_TOGGLE: ;; ***RPS 10-3-86 | ||
| 869 | CMP CS:COUNTRY_FLAG,0FFh ; ARE WE IN FOREIGN LANG MODE? RWV 9-11-85 | ||
| 870 | JNE K22C ; NO, NO SPECIAL STUFF FOR U.S. RWV 9-11-85 | ||
| 871 | TEST AH,CAPS_SHIFT ; IS IT THE CAPS_LOCK KEY? RWV 8-13-85 | ||
| 872 | JZ K22C ; NO, NOTHING ELSE TO DO RWV 8-13-85 | ||
| 873 | OR KB_FLAG,AH ; YES, SET CAPS_LOCK (NOT TOGGLE) RWV 8-13-85 | ||
| 874 | |||
| 875 | ;------- TEST SYSTEM TYPE | ||
| 876 | |||
| 877 | K22C: TEST CS:SD.SYSTEM_FLAG,PC_AT+PC_386 ; IF THE SYSTEM WE'RE RUNNING ON IS | ||
| 878 | JZ K22B ; A PC1 OR XT, THEN SKIP THE LEDs | ||
| 879 | |||
| 880 | ;------ TOGGLE LED IF CAPS, NUM, OR SCROLL KEY DEPRESSED | ||
| 881 | |||
| 882 | TEST AH,CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE? | ||
| 883 | JZ K22B ; GO IF NOT | ||
| 884 | PUSH AX ; SAVE SCAN CODE AND SHIFT MASK | ||
| 885 | CALL SND_LED ; GO TURN MODE INDICATORS ON | ||
| 886 | POP AX ; RESTORE SCAN CODE | ||
| 887 | |||
| 888 | K22B: CMP AL,INS_KEY ; TEST FOR 1ST MAKE OF INSERT KEY | ||
| 889 | ;**CNS | ||
| 890 | JE INS_CHK ; JUMP IF NOT INSERT KEY | ||
| 891 | RET;JMP PREP_EXIT | ||
| 892 | |||
| 893 | |||
| 894 | ;**CNS | ||
| 895 | INS_CHK: | ||
| 896 | |||
| 897 | MOV AH,AL ; SCAN CODE IN BOTH HALVES OF AX RWV 7-24-85 | ||
| 898 | JMP K28 ; FLAGS UPDATED, PROC. FOR BUFFER RWV 7-23-85 | ||
| 899 | |||
| 900 | ;------ BREAK SHIFT FOUND | ||
| 901 | |||
| 902 | K23: ; BREAK-SHIFT-FOUND | ||
| 903 | CMP AH,SCROLL_SHIFT ; IS THIS A TOGGLE KEY? | ||
| 904 | NOT AH ; INVERT MASK | ||
| 905 | JAE K24 ; YES, HANDLE BREAK TOGGLE | ||
| 906 | AND KB_FLAG,AH ; TURN OFF SHIFT BIT | ||
| 907 | CMP AH,NOT CTL_SHIFT ; IS THIS ALT OR CTL? RWV 8-29-85 | ||
| 908 | JA K23D ; NO, ALL DONE RWV 8-29-85 | ||
| 909 | |||
| 910 | |||
| 911 | |||
| 912 | TEST BH,LC_E0 ; 2ND ALT OR CTL? RWV 10-08-85 | ||
| 913 | JZ K23A ; NO, HANDLE NORMALLY RWV 7-22-85 | ||
| 914 | AND KB_FLAG_3,AH ; RESET BIT FOR RIGHT ALT OR CTL RWV 7-22-85 | ||
| 915 | JMP SHORT K23B ; CONTINUE RWV 7-22-85 | ||
| 916 | K23A: SAR AH,CL ; MOVE THE MASK BIT TWO POSITIONS RWV 8-28-85 | ||
| 917 | AND KB_FLAG_1,AH ; RESET BIT FOR LEFT ALT OR CTL RWV 8-28-85 | ||
| 918 | K23B: MOV AH,AL ; SAVE SCAN CODE RWV 8-28-85 | ||
| 919 | MOV AL,KB_FLAG_3 ; GET RIGHT ALT & CTRL FLAGS RWV 8-28-85 | ||
| 920 | CMP COUNTRY_FLAG,0FFH ; ARE WE IN LANGUAGE MODE? RWV 8-28-85 | ||
| 921 | JNE K23C ; NO, LEAVE RIGHT FLAGS AS IS RWV 8-28-85 | ||
| 922 | ;**CNS | ||
| 923 | AND AL,NOT GRAPH_ON ; YES, FILTER OUT THE ALT_GR KEY RWV 8-28-85 | ||
| 924 | ;**CNS | ||
| 925 | K23C: SHR AL,CL ; MOVE TO BITS 1 & 0 RWV 8-28-85 | ||
| 926 | OR AL,KB_FLAG_1 ; PUT IN LEFT ALT & CTL FLAGS RWV 8-28-85 | ||
| 927 | SHL AL,CL ; MOVE BACK TO BITS 3 & 2 RWV 8-28-85 | ||
| 928 | AND AL,ALT_SHIFT+CTL_SHIFT ; FILTER OUT OTHER GARBAGE RWV 8-28-85 | ||
| 929 | OR KB_FLAG,AL ; PUT RESULT IN THE REAL FLAGS RWV 8-28-85 | ||
| 930 | MOV AL,AH ; RECOVER SAVED SCAN CODE RWV 8-28-85 | ||
| 931 | |||
| 932 | K23D: CMP AL,ALT_KEY+80H ; IS THIS ALTERNATE SHIFT RELEASE | ||
| 933 | JE ALT_SHFT ; INTERRUPT_RETURN | ||
| 934 | RET;JMP PREP_EXIT | ||
| 935 | |||
| 936 | ;------ ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER | ||
| 937 | |||
| 938 | ALT_SHFT: | ||
| 939 | |||
| 940 | MOV AL,ALT_INPUT | ||
| 941 | MOV AH,0 ; SCAN CODE OF 0 | ||
| 942 | MOV ALT_INPUT,AH ; ZERO OUT THE FIELD | ||
| 943 | CMP AL,0 ; WAS THE INPUT = 0? | ||
| 944 | JNE GOOD_ALTCHAR ; INTERRUPT_RETURN | ||
| 945 | RET;JMP PREP_EXIT | ||
| 946 | |||
| 947 | GOOD_ALTCHAR: | ||
| 948 | |||
| 949 | CALL BUFFER_FILL_ANY_CHAR ;; Put in buffer, but use this | ||
| 950 | ;; entry point to avoid trashing | ||
| 951 | ;; an ASCII code of 255 | ||
| 952 | RET;JMP PREP_EXIT ; INTERRUPT_RETURN | ||
| 953 | |||
| 954 | K24: ; BREAK-TOGGLE | ||
| 955 | AND KB_FLAG_1,AH ; INDICATE NO LONGER DEPRESSED | ||
| 956 | RET;JMP PREP_EXIT ; INTERRUPT_RETURN | ||
| 957 | |||
| 958 | ;------ TEST FOR HOLD STATE | ||
| 959 | ; AL, AH = SCAN CODE | ||
| 960 | K25: ; NO-SHIFT-FOUND | ||
| 961 | CMP AL,80H ; TEST FOR BREAK KEY | ||
| 962 | JB NO_BREAK ; NOTHING FOR BREAK CHARS FROM HERE ON | ||
| 963 | RET;JMP PREP_EXIT | ||
| 964 | |||
| 965 | NO_BREAK: | ||
| 966 | |||
| 967 | TEST KB_FLAG_1,HOLD_STATE ; ARE WE IN HOLD STATE | ||
| 968 | JZ K28 ; BRANCH AROUND TEST IF NOT | ||
| 969 | CMP AL,NUM_KEY | ||
| 970 | JNE HOLD_OFF ; CAN'T END HOLD ON NUM_LOCK | ||
| 971 | RET;JMP PREP_EXIT | ||
| 972 | |||
| 973 | HOLD_OFF: | ||
| 974 | |||
| 975 | AND KB_FLAG_1,NOT HOLD_STATE ; TURN OFF THE HOLD STATE BIT | ||
| 976 | |||
| 977 | ;------ EXIT POINT ;; | ||
| 978 | |||
| 979 | RET;JMP PREP_EXIT | ||
| 980 | |||
| 981 | PAGE | ||
| 982 | ;------ NOT IN HOLD STATE | ||
| 983 | ; AL, AH = SCAN CODE (ALL MAKES) | ||
| 984 | K28: ; NO-HOLD-STATE | ||
| 985 | CMP AL,88 ; TEST FOR OUT-OF-RANGE SCAN CODES RWV 8-01-85 | ||
| 986 | JBE SCAN_INRANGE ; IGNORE IF OUT-OF-RANGE RWV 8-01-85 | ||
| 987 | RET;JMP PREP_EXIT | ||
| 988 | |||
| 989 | |||
| 990 | SCAN_INRANGE: | ||
| 991 | |||
| 992 | TEST BL,ALT_SHIFT ; ARE WE IN ALTERNATE SHIFT? RWV 7-30-85 | ||
| 993 | JZ K28A ; JUMP IF NOT ALTERNATE RWV 7-26-85 | ||
| 994 | |||
| 995 | TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85 | ||
| 996 | JZ K29 ; NO, ALT STATE IS REAL RWV 7-24-85 | ||
| 997 | |||
| 998 | TEST KB_FLAG_1,SYS_SHIFT ; YES, IS SYSREQ KEY DOWN? RWV 7-24-85 | ||
| 999 | JZ K29 ; NO, ALT STATE IS REAL RWV 7-24-85 | ||
| 1000 | ;**CNS | ||
| 1001 | |||
| 1002 | TEST AH,LC_E0 ; IS IT THE ALT_GR KEY? RWV 8-29-85 | ||
| 1003 | JZ K28A ; YES, DON'T SET KB_FLAG RWV 8-29-85 | ||
| 1004 | |||
| 1005 | TEST AL,R_ALT_SHIFT ; TURN ON SHIFT BIT RWV 8-28-85 | ||
| 1006 | JNZ K29 ; TURN ON SHIFT BIT RWV 8-28-85 | ||
| 1007 | |||
| 1008 | ;**CNS | ||
| 1009 | |||
| 1010 | K28A: JMP K38 ; YES, THIS IS PHONY ALT STATE RWV 7-24-85 | ||
| 1011 | ; DUE TO PRESSING SYSREQ RWV 7-24-85 | ||
| 1012 | |||
| 1013 | ;------ TEST FOR RESET KEY SEQUENCE (CTL ALT DEL) | ||
| 1014 | |||
| 1015 | K29: ; TEST-RESET | ||
| 1016 | TEST BL,CTL_SHIFT ; ARE WE IN CONTROL SHIFT ALSO? RWV 7-30-85 | ||
| 1017 | JZ K31 ; NO_RESET | ||
| 1018 | CMP AL,DEL_KEY ; SHIFT STATE IS THERE, TEST KEY | ||
| 1019 | JNE K31A ; NO_RESET, TRANSLATE TABLE SWAP | ||
| 1020 | |||
| 1021 | ;------ CTL-ALT-DEL HAS BEEN FOUND, DO I/O CLEANUP | ||
| 1022 | |||
| 1023 | MOV RESET_FLAG,1234H ; SET FLAG FOR RESET FUNCTION | ||
| 1024 | AND WORD PTR KB_FLAG_3,KBX ; CLEAR ALL FLAG BITS EXCEPT KBX PED 6-25-86 | ||
| 1025 | JMP RESET ; JUMP TO POWER ON DIAGNOSTICS | ||
| 1026 | |||
| 1027 | ;------ IN ALTERNATE SHIFT, RESET NOT FOUND | ||
| 1028 | |||
| 1029 | K31: ; NO-RESET | ||
| 1030 | CALL KEYB_STATE_PROCESSOR ;; | ||
| 1031 | JNC K3105 ;; NO TRANSLATIONS FOUND - CONTINUE | ||
| 1032 | RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT | ||
| 1033 | K3105: ;; | ||
| 1034 | ;; | ||
| 1035 | CMP AL,57 ; TEST FOR SPACE KEY | ||
| 1036 | JNE K311 ; NOT THERE | ||
| 1037 | MOV AL,' ' ; SET SPACE CHAR | ||
| 1038 | JMP K57 ; BUFFER_FILL | ||
| 1039 | K311: | ||
| 1040 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS EXTENDED INT 16 LOADED? RWV 11-06-85 | ||
| 1041 | JZ K32 ; NO, SKIP THIS EXTENDED STUFF RWV 11-06-85 | ||
| 1042 | CMP AL,15 ; TEST FOR TAB KEY RWV 10-04-85 | ||
| 1043 | JNE K312 ; NOT THERE RWV 10-04-85 | ||
| 1044 | MOV AX,0A500h ; SET SPECIAL CODE FOR ALT-TAB RWV 10-04-85 | ||
| 1045 | JMP K57 ; BUFFER_FILL RWV 10-04-85 | ||
| 1046 | K312: | ||
| 1047 | CMP AL,74 ; TEST FOR KEYPAD - RWV 10-04-85 | ||
| 1048 | JE K312A ; GO PROCESS RWV 10-04-85 | ||
| 1049 | CMP AL,78 ; TEST FOR KEYPAD + RWV 10-04-85 | ||
| 1050 | JNE K32 ; SKIP TEST FOR LANG SWAP & CONT. RWV 11-06-85 | ||
| 1051 | K312A: JMP K37B ; GO PROCESS RWV 10-04-85 | ||
| 1052 | |||
| 1053 | ;------ SET COUNTRY FLAG TO INDICATE WHICH TABLE WE'RE USING, FOREIGN OR DOMESTIC | ||
| 1054 | |||
| 1055 | K31A: CMP AL,CS:SD.HOT_KEY_ON_SCAN ; TEST FOR HOT KEY TO US | ||
| 1056 | JNE K31B ; | ||
| 1057 | MOV CS:COUNTRY_FLAG,00 ; SET FLAG FOR DOMESTIC KEY'S | ||
| 1058 | RET;JMP PREP_EXIT ; INTERRUPT RETURN | ||
| 1059 | |||
| 1060 | K31B: CMP AL,CS:SD.HOT_KEY_OFF_SCAN ; TEST FOR HOT KEY TO FOREIGN | ||
| 1061 | JNE K31C ; IF NOT TEST FOR FRONT ENGRAV | ||
| 1062 | MOV CS:COUNTRY_FLAG,0FFH ; SET FLAGS FOR FOREIGN KEY'S | ||
| 1063 | RET;JMP PREP_EXIT ; INTERRUPT RETURN | ||
| 1064 | |||
| 1065 | |||
| 1066 | ;------ ALT, CTRL DOWN ; NO HOT KEY | ||
| 1067 | |||
| 1068 | K31C: CMP CS:COUNTRY_FLAG,0FFH | ||
| 1069 | JNE K32 ; TRY ALT_KEY_PAD | ||
| 1070 | CALL KEYB_STATE_PROCESSOR ;; | ||
| 1071 | JNC K32 ;; NO TRANSLATIONS FOUND - CONTINUE | ||
| 1072 | RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT | ||
| 1073 | |||
| 1074 | |||
| 1075 | ;------ LOOK FOR KEY PAD ENTRY | ||
| 1076 | |||
| 1077 | K32: ; ALT-KEY-PAD | ||
| 1078 | MOV DI,OFFSET K30 ; ALT-INPUT-TABLE | ||
| 1079 | MOV CX,10 ; LOOK FOR ENTRY USING KEYPAD | ||
| 1080 | REPNE SCASB ; LOOK FOR MATCH | ||
| 1081 | JNE K33 ; NO_ALT_KEYPAD | ||
| 1082 | TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85 | ||
| 1083 | JZ K321 ; NO, PROCESS AS ALT-NUMPAD RWV 11-06-85 | ||
| 1084 | JMP K37C ; YES, JUMP, NOT NUMPAD KEY RWV 7-24-85 | ||
| 1085 | K321: SUB DI,OFFSET K30+1 ; DI NOW HAS ENTRY VALUE | ||
| 1086 | MOV AL,ALT_INPUT ; GET THE CURRENT BYTE | ||
| 1087 | MOV AH,10 ; MULTIPLY BY 10 | ||
| 1088 | MUL AH | ||
| 1089 | ADD AX,DI ; ADD IN THE LATEST ENTRY | ||
| 1090 | MOV ALT_INPUT,AL ; STORE IT AWAY | ||
| 1091 | K32A: RET;JMP PREP_EXIT ; THROW AWAY THAT KEYSTROKE | ||
| 1092 | |||
| 1093 | ;------ LOOK FOR SUPERSHIFT ENTRY | ||
| 1094 | |||
| 1095 | K33: ; NO-ALT-KEYPAD | ||
| 1096 | MOV ALT_INPUT,0 ; ZERO ANY PREVIOUS ENTRY INTO INPUT | ||
| 1097 | ; DI,ES ALREADY POINTING | ||
| 1098 | MOV CX, K30_LEN ; NORMALLY 26, BUT 27 FOR FR, DUE RWV 8-06-85 | ||
| 1099 | ; TO THE ";" KEY BEING "M" RWV 8-06-85 | ||
| 1100 | REPNE SCASB ; LOOK FOR MATCH IN ALPHABET | ||
| 1101 | JNE K34 ; NOT FOUND, FUNCTION KEY OR OTHER | ||
| 1102 | JMP SHORT K37A ; PUT IT IN THE BUFFER RWV 8-06-85 | ||
| 1103 | |||
| 1104 | ;------ LOOK FOR TOP ROW OF ALTERNATE SHIFT | ||
| 1105 | |||
| 1106 | K34: ; ALT-TOP-ROW | ||
| 1107 | CMP AL,2 ; KEY WITH '1' ON IT | ||
| 1108 | JB K37B ; MUST BE ESCAPE RWV 10-04-85 | ||
| 1109 | CMP AL,13 ; IS IT IN THE REGION | ||
| 1110 | JA K35 ; NO, ALT-SOMETHING ELSE | ||
| 1111 | ADD AH,118 ; CONVERT PSEUDO SCAN CODE TO RANGE | ||
| 1112 | JMP SHORT K37A ; GO FILL THE BUFFER RWV 8-06-85 | ||
| 1113 | |||
| 1114 | ;------ TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES | ||
| 1115 | |||
| 1116 | K35: ; ALT-FUNCTION | ||
| 1117 | CMP AL,F11_M ; IS IT F11? RWV 7-24-85 | ||
| 1118 | JB K35A ; NO, BRANCH RWV 7-24-85 | ||
| 1119 | CMP AL,F12_M ; IS IT F12? RWV 7-24-85 | ||
| 1120 | JA K35A ; NO, BRANCH RWV 7-24-85 | ||
| 1121 | ADD AH,52 ; CONVERT TO PSEUDO SCAN CODE RWV 7-24-85 | ||
| 1122 | JMP SHORT K37A ; GO FILL THE BUFFER RWV 8-06-85 | ||
| 1123 | |||
| 1124 | K35A: TEST BH,LC_E0 ; DO WE HAVE ONE OF THE NEW KEYS? RWV 10-08-85 | ||
| 1125 | JZ K37 ; NO, JUMP RWV 10-04-85 | ||
| 1126 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85 | ||
| 1127 | JZ K37 ; NO, DO COMPATIBLE OUTPUT RWV 11-06-85 | ||
| 1128 | CMP AL,28 ; TEST FOR KEYPAD ENTER RWV 10-04-85 | ||
| 1129 | JNE K35B ; NOT THERE RWV 10-04-85 | ||
| 1130 | MOV AX,0A600h ; SPECIAL CODE RWV 10-04-85 | ||
| 1131 | JMP K57 ; BUFFER FILL RWV 10-04-85 | ||
| 1132 | K35B: CMP AL,83 ; TEST FOR DELETE KEY RWV 10-04-85 | ||
| 1133 | JE K37C ; HANDLE WITH OTHER EDIT KEYS RWV 10-04-85 | ||
| 1134 | CMP AL,53 ; TEST FOR KEYPAD / RWV 10-04-85 | ||
| 1135 | JNE K32A ; NOT THERE, NO OTHER E0 SPECIALS RWV 10-04-85 | ||
| 1136 | MOV AX,0A400h ; SPECIAL CODE RWV 10-04-85 | ||
| 1137 | JMP K57 ; BUFFER FILL RWV 10-04-85 | ||
| 1138 | |||
| 1139 | K37: CMP AL,59 ; TEST FOR FUNCTION KEYS (F1) RWV 10-04-85 | ||
| 1140 | JB K37B ; NO FN, HANDLE W/OTHER EXTENDED RWV 10-04-85 | ||
| 1141 | CMP AL,68 ; IN KEYPAD REGION? RWV 7-26-85 | ||
| 1142 | ; OR NUMLOCK, SCROLLOCK? RWV 7-26-85 | ||
| 1143 | JA K32A ; IF SO, IGNORE | ||
| 1144 | ADD AH,45 ; CONVERT TO PSEUDO SCAN CODE RWV 8-06-85 | ||
| 1145 | |||
| 1146 | K37A: MOV AL,0 ; ASCII CODE OF ZERO RWV 8-06-85 | ||
| 1147 | JMP K57 ; PUT IT IN THE BUFFER RWV 8-06-85 | ||
| 1148 | |||
| 1149 | K37B: | ||
| 1150 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85 | ||
| 1151 | JNZ K37B1 ; YES, TRANSLATE AS EXTENDED RWV 11-06-85 | ||
| 1152 | RET;JMP PREP_EXIT ; NO, INGORE THIS ONE RWV 11-06-85 | ||
| 1153 | K37B1: MOV AL,0F0h ; USE SPECIAL ASCII CODE RWV 10-04-85 | ||
| 1154 | JMP K57 ; PUT IT IN THE BUFFER RWV 10-04-85 | ||
| 1155 | |||
| 1156 | K37C: | ||
| 1157 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85 | ||
| 1158 | JZ K37A ; NO, DO COMPATIBLE OUTPUT RWV 11-06-85 | ||
| 1159 | ADD AL,80 ; CONVERT SCAN CODE (EDIT KEYS) RWV 10-07-85 | ||
| 1160 | MOV AH,AL ; (SCAN CODE NOT IN AH FOR INSERT) RWV 10-07-85 | ||
| 1161 | JMP K37A ; PUT IT IN THE BUFFER RWV 10-07-85 | ||
| 1162 | PAGE | ||
| 1163 | ;------ NOT IN ALTERNATE SHIFT | ||
| 1164 | |||
| 1165 | K38: ; NOT-ALT-SHIFT | ||
| 1166 | ; BL STILL HAS SHIFT FLAGS RWV 7-26-85 | ||
| 1167 | TEST BL,CTL_SHIFT ; ARE WE IN CONTROL SHIFT? RWV 7-26-85 | ||
| 1168 | JNZ K38A ; YES, START PROCESSING RWV 8-01-85 | ||
| 1169 | JMP K44 ; NOT-CTL-SHIFT | ||
| 1170 | |||
| 1171 | ;------ CONTROL SHIFT, TEST SPECIAL CHARACTERS | ||
| 1172 | |||
| 1173 | ;------ TEST FOR BREAK | ||
| 1174 | |||
| 1175 | K38A: CMP AL,SCROLL_KEY ; TEST FOR BREAK | ||
| 1176 | JNE K39 ; JUMP, NO-BREAK | ||
| 1177 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ; IS THIS THE LAP COMPUTER? RWV 12-02-85 | ||
| 1178 | JNZ K38B ; YES, THIS IS CTRL-BREAK RWV 12-02-85 | ||
| 1179 | TEST BH,KBX ; NO, IS THIS THE ENHANCED KBD? RWV 10-08-85 | ||
| 1180 | JZ K38B ; NO, BREAK IS VALID RWV 7-26-85 | ||
| 1181 | TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0? RWV 10-08-85 | ||
| 1182 | JZ K39 ; NO-BREAK, TEST FOR PAUSE RWV 7-26-85 | ||
| 1183 | |||
| 1184 | K38B: MOV BX,BUFFER_HEAD ; RESET BUFFER TO EMPTY RWV 10-23-85 | ||
| 1185 | MOV BUFFER_TAIL,BX ; | ||
| 1186 | MOV BIOS_BREAK,80H ; TURN ON BIOS_BREAK BIT | ||
| 1187 | |||
| 1188 | ;-------- ENABLE KEYBOARD | ||
| 1189 | |||
| 1190 | MOV AL,ENA_KBD ; ENABLE KEYBOARD | ||
| 1191 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 1192 | INT 1BH ; BREAK INTERRUPT VECTOR | ||
| 1193 | SUB AX,AX ; PUT OUT DUMMY CHARACTER | ||
| 1194 | JMP K57 ; BUFFER_FILL | ||
| 1195 | |||
| 1196 | ;-------- TEST FOR PAUSE | ||
| 1197 | |||
| 1198 | K39: ; NO-BREAK | ||
| 1199 | CMP AL,NUM_KEY ; LOOK FOR PAUSE KEY | ||
| 1200 | JNE K41 ; NO-PAUSE | ||
| 1201 | TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85 | ||
| 1202 | JZ K39P ; NO, THIS IS A VALID PAUSE RWV 9-26-85 | ||
| 1203 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ; IS THIS THE LAP COMPUTER? RWV 9-26-85 | ||
| 1204 | JZ K41 ; NO, IT'S NOT PAUSE THIS TIME RWV 9-26-85 | ||
| 1205 | K39P: OR KB_FLAG_1,HOLD_STATE ; TURN ON THE HOLD FLAG | ||
| 1206 | MOV BUSY_TFLAG,ACTIVE_OFF ;TURN THE BUSY FLAG OFF - THIS IS | ||
| 1207 | ;A SPECIAL CASE FOR THE SPLICER | ||
| 1208 | DEC CS:TEMP_TAIL ;DELETE THE PAUSE KEY FROM THE BUFFER | ||
| 1209 | ;IN CASE A INTERRUPT COMES IN | ||
| 1210 | ;SO IT IS NOT DONE REPEATEDLY | ||
| 1211 | ;-------- ENABLE KEYBOARD | ||
| 1212 | |||
| 1213 | MOV AL,ENA_KBD ; ENABLE KEYBOARD | ||
| 1214 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 1215 | K39A: | ||
| 1216 | ;***CNS | ||
| 1217 | JMP SHORT $+2 | ||
| 1218 | ;***CNS | ||
| 1219 | MOV AL,EOI ; END OF INTERRUPT TO CONTROL PORT | ||
| 1220 | OUT 020H,AL ; ALLOW FURTHER KEYSTROKE INTS | ||
| 1221 | ;***CNS | ||
| 1222 | JMP SHORT $+2 | ||
| 1223 | ;***CNS | ||
| 1224 | |||
| 1225 | ;------ DURING PAUSE INTERVAL, TURN CRT BACK ON | ||
| 1226 | |||
| 1227 | CMP CRT_MODE,7 ; IS THIS BLACK AND WHITE CARD | ||
| 1228 | JE K40 ; YES, NOTHING TO DO | ||
| 1229 | MOV DX,03D8H ; PORT FOR COLOR CARD | ||
| 1230 | MOV AL,CRT_MODE_SET ; GET THE VALUE OF THE CURRENT MODE | ||
| 1231 | OUT DX,AL ; SET THE CRT MODE, SO THAT CRT IS ON | ||
| 1232 | K40: ; PAUSE-LOOP | ||
| 1233 | |||
| 1234 | ; PUSH DS ;ICE | ||
| 1235 | ; push bx ;ICE | ||
| 1236 | ; push ax ;ICE | ||
| 1237 | ; mov bx,0140H ;ICE | ||
| 1238 | ; xor ax,ax ;ICE | ||
| 1239 | ; mov ds,ax ;ICE | ||
| 1240 | ; mov ax,word ptr ds:[bx] ;ICE | ||
| 1241 | ; mov word ptr ds:[bx],ax ;ICE | ||
| 1242 | ; POP ax ;ICE | ||
| 1243 | ; pop bx ;ICE | ||
| 1244 | ; pop ds ;ICE | ||
| 1245 | |||
| 1246 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ; IS THIS THE LAP COMPUTER? RWV 9-26-85 | ||
| 1247 | JZ K40A ; NO, SKIP THE BATTERY LIFE STUFF RWV 9-26-85 | ||
| 1248 | MOV AX,4104H ; FUNCTION 41, AL=04=RETURN IF 0 RWV from AAD | ||
| 1249 | MOV BX,HOLD_STATE*100H ; BH=HOLD_STATE, BL=0=NO TIME OUT RWV from AAD | ||
| 1250 | PUSH DS ; MAKE ES:DI POINT TO KB_FLAG_1 RWV from AAD | ||
| 1251 | POP ES ; RWV from AAD | ||
| 1252 | MOV DI,OFFSET KB_FLAG_1 ; RWV from AAD | ||
| 1253 | INT 15H ; SLEEP UNTIL OUT OF HOLD RWV from AAD | ||
| 1254 | K40A: | ||
| 1255 | |||
| 1256 | |||
| 1257 | TEST KB_FLAG_1,HOLD_STATE | ||
| 1258 | JNZ K40 ; LOOP UNTIL FLAG TURNED OFF | ||
| 1259 | ;***CNS | ||
| 1260 | MOV CS:ENABLE_FL,1 | ||
| 1261 | RET;JMP ENABLE_CHK ; INTERRUPT_RETURN_NO_EOI | ||
| 1262 | ;***CNS | ||
| 1263 | ;------ TEST SPECIAL CASE KEY 55 | ||
| 1264 | |||
| 1265 | K41: ; NO-PAUSE | ||
| 1266 | CMP AL,55 ; TEST FOR */PRTSC KEY | ||
| 1267 | JNE K42 ; NOT-KEY-55 | ||
| 1268 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ; IS THIS THE LAP COMPUTER? RWV 9-23-85 | ||
| 1269 | JZ K41B ; NO, JUMP RWV 9-23-85 | ||
| 1270 | TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0? RWV 10-24-85 | ||
| 1271 | JZ K41A ; NO, THIS IS THE PRTSC KEY RWV 9-23-85 | ||
| 1272 | JMP SHORT K42B ; YES, E0 MEANS THE "*" KEY RWV 9-23-85 | ||
| 1273 | |||
| 1274 | K41B: TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85 | ||
| 1275 | JZ K41A ; NO, CTL-PRTSC IS VALID RWV 8-01-85 | ||
| 1276 | TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0? RWV 10-08-85 | ||
| 1277 | JZ K42B ; NO, TRANSLATE TO A FUNCTION RWV 10-04-85 | ||
| 1278 | K41A: MOV AX,114*256 ; START/STOP PRINTING SWITCH | ||
| 1279 | JMP K57 ; BUFFER_FILL | ||
| 1280 | |||
| 1281 | ;------ SET UP TO TRANSLATE CONTROL SHIFT | ||
| 1282 | |||
| 1283 | K42: | ||
| 1284 | CALL KEYB_STATE_PROCESSOR ;; | ||
| 1285 | JNC K421 ;; NO TRANSLATIONS FOUND - CONTINUE | ||
| 1286 | RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT | ||
| 1287 | |||
| 1288 | K421: ; NOT-KEY-55 | ||
| 1289 | CMP AL,15 ; IS IT THE TAB KEY? RWV 10-04-85 | ||
| 1290 | JE K42B ; YES, XLATE TO FUNCTION CODE RWV 10-04-85 | ||
| 1291 | CMP AL,53 ; IS IT THE / KEY? RWV 10-04-85 | ||
| 1292 | JNE K42A ; NO, NO MORE SPECIAL CASES RWV 10-04-85 | ||
| 1293 | TEST BH,LC_E0 ; YES, IS IT FROM THE KEYPAD? RWV 10-08-85 | ||
| 1294 | JZ K42A ; NO, JUST TRANSLATE RWV 10-04-85 | ||
| 1295 | MOV AX,9500h ; YES, SPECIAL CODE FOR THIS ONE RWV 10-04-85 | ||
| 1296 | JMP K57 ; BUFFER FILL RWV 10-04-85 | ||
| 1297 | |||
| 1298 | K42A: MOV BX,OFFSET K8 ; SET UP TO TRANSLATE CTL | ||
| 1299 | CMP AL,59 ; IS IT IN CHARACTER TABLE? | ||
| 1300 | JAE K42B ; NO, CTL-TABLE-TRANSLATE-SCAN RWV 11-06-85 | ||
| 1301 | JMP K56 ; GO TRANSLATE CHAR | ||
| 1302 | K42B: MOV BX,OFFSET K8 ; SET UP TO TRANSLATE CTL RWV 10-07-85 | ||
| 1303 | JMP K64 ; GO TRANSLATE_SCAN RWV 8-06-85 | ||
| 1304 | PAGE | ||
| 1305 | ;------ NOT IN CONTROL SHIFT | ||
| 1306 | |||
| 1307 | K44: | ||
| 1308 | CALL KEYB_STATE_PROCESSOR ;; | ||
| 1309 | JNC K4401 ;; NO TRANSLATIONS FOUND - CONTINUE | ||
| 1310 | RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT | ||
| 1311 | K4401: | ||
| 1312 | CMP AL,55 ; PRINT SCREEN KEY? | ||
| 1313 | JNE K45 ; NOT-PRINT-SCREEN | ||
| 1314 | TEST CS:SD.SYSTEM_FLAG,PC_LAP ; IS THIS THE LAP COMPUTER? RWV 9-12-85 | ||
| 1315 | JZ K441 ; NO, JUMP RWV 9-12-85 | ||
| 1316 | TEST BH,LC_E0 ; YES, WAS LAST CODE THE MARKER? RWV 10-08-85 | ||
| 1317 | JZ K44A ; NO, TEST THE SHIFT STATE RWV 9-12-85 | ||
| 1318 | JMP K45C ; YES, XLATE TO "*" CHAR RWV 9-12-85 | ||
| 1319 | K441: TEST BH,KBX ; IS THIS ENHANCED KEYBOARD? RWV 10-08-85 | ||
| 1320 | JZ K44A ; NO, TEST FOR SHIFT STATE RWV 7-30-85 | ||
| 1321 | TEST BH,LC_E0 ; YES, LAST CODE A MARKER? RWV 10-08-85 | ||
| 1322 | JNZ K44B ; YES, IS PRINT SCREEN RWV 7-30-85 | ||
| 1323 | JMP SHORT K45C ; NO, XLATE TO "*" CHARACTER RWV 7-31-85 | ||
| 1324 | K44A: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;NOT 101 KBD, SHIFT KEY DOWN? RWV 7-30-85 | ||
| 1325 | JZ K45C ; NO, XLATE TO "*" CHARACTER RWV 7-30-85 | ||
| 1326 | |||
| 1327 | ;------ ISSUE INTERRUPT TO PERFORM PRINT SCREEN FUNCTION | ||
| 1328 | K44B: MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED | ||
| 1329 | CALL SHIP_IT ; EXECUTE ENABLE | ||
| 1330 | ;***CNS | ||
| 1331 | JMP SHORT $+2 | ||
| 1332 | ;***CNS | ||
| 1333 | MOV AL,EOI ; END OF CURRENT INTERRUPT | ||
| 1334 | OUT 020H,AL ; SO FURTHER THINGS CAN HAPPEN | ||
| 1335 | ;***CNS | ||
| 1336 | JMP SHORT $+2 | ||
| 1337 | ;***CNS | ||
| 1338 | PUSH BP ; SAVE POINTER | ||
| 1339 | INT 5H ; ISSUE PRINT SCREEN INTERRUPT | ||
| 1340 | POP BP ; RESTORE POINTER | ||
| 1341 | AND KB_FLAG_3,NOT LC_E0+LC_E1 ;ZERO OUT THESE FLAGS RWV 8-13-85 | ||
| 1342 | ;***CNS | ||
| 1343 | MOV CS:ENABLE_FL,1 | ||
| 1344 | RET;JMP ENABLE_CHK ; GO BACK WITHOUT EOI OCCURRING | ||
| 1345 | ;***CNS | ||
| 1346 | |||
| 1347 | |||
| 1348 | ;------ HANDLE THE IN-CORE KEYS | ||
| 1349 | K45: ; NOT-PRINT-SCREEN | ||
| 1350 | CMP AL,58 ; TEST FOR IN-CORE AREA RWV 7-30-85 | ||
| 1351 | JA K46 ; JUMP IF NOT RWV 8-13-85 | ||
| 1352 | |||
| 1353 | K450: TEST BH,GRAPH_ON ; IS ALT GRAPHICS ON? AEV | ||
| 1354 | JZ K456 ; GO ON IF NOT AEV | ||
| 1355 | RET;JMP PREP_EXIT ;; YES, TRASH KEYSTROKE | ||
| 1356 | |||
| 1357 | K456: CMP AL,53 ; IS THIS THE "/" KEY? RWV 8-01-85 | ||
| 1358 | JNE K45A ; NO, JUMP RWV 8-01-85 | ||
| 1359 | TEST BH,LC_E0 ; WAS LAST CODE THE MARKER? RWV 10-08-85 | ||
| 1360 | JNZ K45C1 ; YES, TRANSLATE TO US CHARACTER RWV 8-01-85 | ||
| 1361 | |||
| 1362 | K45A: | ||
| 1363 | |||
| 1364 | K45A1: MOV CX,K30_LEN ; LENGTH OF SEARCH RWV 7-30-85 | ||
| 1365 | MOV DI,OFFSET K30+10 ; POINT TO TABLE OF A-Z CHARS RWV 7-30-85 | ||
| 1366 | REPNE SCASB ; IS THIS A LETTER KEY? RWV 7-30-85 | ||
| 1367 | JNE K45B ; NO, SYMBOL KEY RWV 7-30-85 | ||
| 1368 | |||
| 1369 | K45A2: TEST BL,CAPS_STATE ; ARE WE IN CAPS_LOCK? RWV 7-30-85 | ||
| 1370 | JNZ K45D ; TEST FOR SURE RWV 7-30-85 | ||
| 1371 | K45B: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE? RWV 7-30-85 | ||
| 1372 | JNZ K45E ; YES, UPPERCASE RWV 7-30-85 | ||
| 1373 | ; NO, LOWERCASE RWV 7-30-85 | ||
| 1374 | K45C: ;; | ||
| 1375 | K45C1: MOV BX,OFFSET K10 ; XLATE TO LOWERCASE US LETTERS RWV 8-06-85 | ||
| 1376 | JMP SHORT K45E2 | ||
| 1377 | K45D: ; ALMOST-CAPS-STATE RWV 7-30-85 | ||
| 1378 | TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; CL ON. IS SHIFT ON, TOO? RWV 7-30-85 | ||
| 1379 | JNZ K45C1 ; SHIFTED TEMP OUT OF CAPS STATE RWV 7-30-85 | ||
| 1380 | K45E: | ||
| 1381 | K45E1: MOV BX,OFFSET K11 ; XLATE TO UPPERCASE US LETTERS RWV 8-06-85 | ||
| 1382 | K45E2: JMP SHORT K56 ; GO TRANSLATE RWV 8-06-85 | ||
| 1383 | |||
| 1384 | |||
| 1385 | ;------ TEST FOR KEYS F1 - F10 | ||
| 1386 | K46: ; NOT IN-CORE AREA RWV 7-30-85 | ||
| 1387 | CMP AL,68 ; TEST FOR F1 - F10 RWV 7-30-85 | ||
| 1388 | JA K47 ; JUMP IF NOT RWV 7-30-85 | ||
| 1389 | JMP SHORT K53A ; YES, GO DO FN KEY PROCESS RWV 7-30-85 | ||
| 1390 | |||
| 1391 | |||
| 1392 | ;------ HANDLE THE NUMERIC PAD KEYS | ||
| 1393 | |||
| 1394 | K47: ; NOT F1 - F10 RWV 7-30-85 | ||
| 1395 | CMP AL,83 ; TEST FOR NUMPAD KEYS RWV 7-30-85 | ||
| 1396 | JA K52 ; JUMP IF NOT RWV 7-30-85 | ||
| 1397 | |||
| 1398 | ;------ KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION | ||
| 1399 | K48: CMP AL,74 ; SPECIAL CASE FOR MINUS | ||
| 1400 | JE K45E1 ; GO TRANSLATE (US & WT ARE SAME) RWV 8-06-85 | ||
| 1401 | CMP AL,78 ; SPECIAL CASE FOR PLUS | ||
| 1402 | JE K45E1 ; GO TRANSLATE (US & WT ARE SAME) RWV 8-06-85 | ||
| 1403 | TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85 | ||
| 1404 | JNZ K49 ; YES, TRANSLATE TO BASE STATE RWV 8-06-85 | ||
| 1405 | |||
| 1406 | TEST BL,NUM_STATE ; ARE WE IN NUM_LOCK? RWV 7-30-85 | ||
| 1407 | JNZ K50 ; TEST FOR SURE | ||
| 1408 | TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE? RWV 7-30-85 | ||
| 1409 | JNZ K51 ; IF SHIFTED, REALLY NUM STATE | ||
| 1410 | |||
| 1411 | ;------ BASE CASE FOR KEYPAD | ||
| 1412 | K49: CMP AL,76 ; SPECIAL CASE FOR BASE STATE 5 RWV 10-04-85 | ||
| 1413 | JNE K49A ; CONTINUE IF NOT KEYPAD 5 RWV 10-04-85 | ||
| 1414 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85 | ||
| 1415 | JNZ K491 ; YES, TRANSLATE AS EXTENDED RWV 11-06-85 | ||
| 1416 | RET;JMP PREP_EXIT ; NO, INGORE RWV 11-06-85 | ||
| 1417 | |||
| 1418 | K491: MOV AL,0F0h ; SPECIAL ASCII CODE RWV 10-04-85 | ||
| 1419 | JMP K57 ; BUFFER FILL RWV 10-04-85 | ||
| 1420 | K49A: MOV BX,OFFSET K10 ; BASE CASE TABLE RWV 7-30-85 | ||
| 1421 | JMP SHORT K64 ; CONVERT TO PSEUDO SCAN | ||
| 1422 | |||
| 1423 | ;------ MIGHT BE NUM LOCK, TEST SHIFT STATUS | ||
| 1424 | K50: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;ALMOST-NUM-STATE RWV 7-30-85 | ||
| 1425 | JNZ K49 ; SHIFTED TEMP OUT OF NUM STATE | ||
| 1426 | K51: ; REALLY_NUM_STATE RWV 8-06-85 | ||
| 1427 | JMP SHORT K45E1 ; (US & WT ARE SAME) RWV 8-06-85 | ||
| 1428 | |||
| 1429 | ;------ TEST FOR THE NEW KEY ON WT KEYBOARDS | ||
| 1430 | |||
| 1431 | K52: ; NOT A NUMPAD KEY RWV 7-30-85 | ||
| 1432 | CMP AL,86 ; IS IT THE NEW WT KEY? RWV 7-30-85 | ||
| 1433 | JNE K53 ; JUMP IF NOT RWV 7-30-85 | ||
| 1434 | MOV AL,58 ; WE'RE GOING TO PULL A SNEAKY RWV 8-06-85 | ||
| 1435 | JMP K45 ; TRICK HERE. WT TABLES ARE TOO SHORT TO | ||
| 1436 | ; XLATE 86, SO WE'LL CHANGE IT TO CAPS_LOCK | ||
| 1437 | ; AND PUT THE CHAR IN THE TABLES IN THE C_L | ||
| 1438 | ; POSITION, SINCE C_L SCAN CODES NEVER GET | ||
| 1439 | ; HERE ANYWAY. RWV 8-06-85 | ||
| 1440 | |||
| 1441 | ;------ MUST BE F11 OR F12 | ||
| 1442 | |||
| 1443 | K53: TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 THERE? RWV 11-06-85 | ||
| 1444 | ;*** CNS | ||
| 1445 | JZ K59 ; NO, INGORE F11 & F12 (NEAR RET) RWV 11-06-85 | ||
| 1446 | ; F1 - F10 COME HERE, TOO RWV 7-30-85 | ||
| 1447 | K53A: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;TEST SHIFT STATE RWV 7-30-85 | ||
| 1448 | JZ K49 ; JUMP, LOWERCASE PSEUDO SC'S RWV 7-30-85 | ||
| 1449 | |||
| 1450 | MOV BX,OFFSET K11 ; UPPER CASE PSEUDO SCAN CODES | ||
| 1451 | JMP SHORT K64 ; TRANSLATE_SCAN | ||
| 1452 | PAGE | ||
| 1453 | ;------ TRANSLATE THE CHARACTER | ||
| 1454 | |||
| 1455 | K56: ; TRANSLATE-CHAR | ||
| 1456 | DEC AL ; CONVERT ORIGIN | ||
| 1457 | XLAT CS:K11 ; CONVERT THE SCAN CODE TO ASCII | ||
| 1458 | K56C: TEST KB_FLAG_3,LC_E0 ; IS THIS A NEW KEY? RWV 10-08-85 | ||
| 1459 | JZ K57 ; NO, GO FILL BUFFER RWV 10-04-85 | ||
| 1460 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 THERE? RWV 11-06-85 | ||
| 1461 | JZ K57 ; NO, DO COMPATIBLE OUTPUT RWV 11-06-85 | ||
| 1462 | MOV AH,MC_E0 ; YES, PUT SPECIAL MARKER IN AH RWV 10-04-85 | ||
| 1463 | JMP SHORT K57 ; PUT IT INTO THE BUFFER | ||
| 1464 | |||
| 1465 | ;------ TRANSLATE SCAN FOR PSEUDO SCAN CODES | ||
| 1466 | |||
| 1467 | K64: ; TRANSLATE-SCAN-ORGD | ||
| 1468 | DEC AL ; CONVERT ORIGIN RWV 8-06-85 | ||
| 1469 | XLAT CS:K8 ; CTL TABLE SCAN | ||
| 1470 | MOV AH,AL ; PUT VALUE INTO AH | ||
| 1471 | MOV AL,0 ; ZERO ASCII CODE | ||
| 1472 | TEST KB_FLAG_3,LC_E0 ; IS THIS A NEW KEY? RWV 10-08-85 | ||
| 1473 | JZ K57 ; NO, GO FILL BUFFER RWV 10-04-85 | ||
| 1474 | TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 THERE? RWV 11-06-85 | ||
| 1475 | JZ K57 ; NO, DO COMPATIBLE OUTPUT RWV 11-06-85 | ||
| 1476 | MOV AL,MC_E0 ; YES, PUT SPECIAL MARKER IN AL RWV 10-04-85 | ||
| 1477 | |||
| 1478 | ;------ PUT CHARACTER INTO BUFFER | ||
| 1479 | |||
| 1480 | K57: ; BUFFER-FILL | ||
| 1481 | CALL BUFFER_FILL ;; | ||
| 1482 | K59: ;; | ||
| 1483 | RET ;; return to unload the buffer | ||
| 1484 | ;OLDK59: | ||
| 1485 | ; JMP PREP_EXIT ;; THAT'S ALL FOLKS | ||
| 1486 | |||
| 1487 | ;; | ||
| 1488 | ;; | ||
| 1489 | KEYB_INT_9 ENDP ;; | ||
| 1490 | ;; | ||
| 1491 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1492 | ;; | ||
| 1493 | ;; Procedure: BUFFER_FILL | ||
| 1494 | ;; | ||
| 1495 | ;; Description: | ||
| 1496 | ;; Generate keyboard buffer entry | ||
| 1497 | ;; | ||
| 1498 | ;; Input Registers: | ||
| 1499 | ;; AX - the buffer entry | ||
| 1500 | ;; DS - BIOS data segment | ||
| 1501 | ;; | ||
| 1502 | ;; Output Registers: | ||
| 1503 | ;; None | ||
| 1504 | ;; | ||
| 1505 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1506 | ;; | ||
| 1507 | BUFFER_FILL PROC NEAR ;; | ||
| 1508 | ;; | ||
| 1509 | CMP AL,-1 ;; IS THIS AN IGNORE CHAR | ||
| 1510 | JE K61B ;; YES, EXIT | ||
| 1511 | CMP AH,-1 ;; LOOK FOR -1 PSEUDO SCAN | ||
| 1512 | JE K61B ;; EXIT | ||
| 1513 | ;; | ||
| 1514 | ;; BUFFER_FILL_ANY_CHAR is an alternate entry point to this PROC. | ||
| 1515 | ;; Entry at this point will avoid trashing ASCII values of 255. | ||
| 1516 | ;; | ||
| 1517 | BUFFER_FILL_ANY_CHAR LABEL NEAR ;; | ||
| 1518 | ;; | ||
| 1519 | PUSH SI ;; | ||
| 1520 | PUSH BX ;; | ||
| 1521 | PUSH DS ;; This routine may be called | ||
| 1522 | PUSH AX ;; externally so make sure DS points | ||
| 1523 | MOV AX,DATA ;; to BIOS data | ||
| 1524 | MOV DS,AX ;; | ||
| 1525 | POP AX ;; | ||
| 1526 | ;; | ||
| 1527 | CLC ;; | ||
| 1528 | |||
| 1529 | MOV BX,BUFFER_TAIL ; GET THE END POINTER TO THE BUFFER | ||
| 1530 | MOV SI,BX ; SAVE THE VALUE | ||
| 1531 | INC BX ;; MOVE TO NEXT WORD IN LIST | ||
| 1532 | INC BX ;; | ||
| 1533 | ;; | ||
| 1534 | ;; VERIFY IF THE CURRENT ROM LEVEL IN THE SYSTEM IS FOR THE ORIGINAL PC1 | ||
| 1535 | ;; | ||
| 1536 | PUSH AX ;; SAVE AX,DS | ||
| 1537 | PUSH DS ;; | ||
| 1538 | MOV AX,ROM_SEG ;; SET DS TO POINT AT BIOS ROM SEGMENT | ||
| 1539 | MOV DS,AX ;; TEST FOR PC1 ROM INSTALLED | ||
| 1540 | CMP WORD PTR DS:SYSROM_DATE,PC1DATE_ID | ||
| 1541 | POP DS ;; RESTORE DS,AX | ||
| 1542 | POP AX ;; | ||
| 1543 | JNE NOT_PC1 ;; IF IT'S A LATER ROM RELEASE, BRANCH | ||
| 1544 | ;; | ||
| 1545 | CMP BX,OFFSET KB_BUFFER_END ; AT END OF BUFFER? | ||
| 1546 | JNE K5 ;; NO, CONTINUE | ||
| 1547 | MOV BX,OFFSET KB_BUFFER ;; YES, RESET TO BUFFER BEGINNING | ||
| 1548 | JMP K5 ;; | ||
| 1549 | NOT_PC1: ;; | ||
| 1550 | CMP BX,BUFFER_END ;; AT END OF BUFFER? | ||
| 1551 | JNE K5 ;; NO, CONTINUE | ||
| 1552 | MOV BX,BUFFER_START ;; YES, RESET TO BUFFER BEGINNING | ||
| 1553 | K5: ;; | ||
| 1554 | CMP BX,BUFFER_HEAD ;; HAS THE BUFFER WRAPPED AROUND | ||
| 1555 | JE K62 ;; BUFFER_FULL_BEEP | ||
| 1556 | MOV [SI],AX ;; STORE THE VALUE | ||
| 1557 | MOV BUFFER_TAIL,BX ;; MOVE THE POINTER UP | ||
| 1558 | MOV CS:BUFFER_ENTRY_OK,YES ;; INDICATE WE PUT SOMETHING IN BUFFER | ||
| 1559 | JMP SHORT K61A | ||
| 1560 | K62: | ||
| 1561 | MOV CS:BEEP_PENDING,YES ;; INDICATE WE NEED A BEEP | ||
| 1562 | TEST CS:SD.SYSTEM_FLAG,PC_JR ;; ON JR WE HAVE TO CLEAR SOME FLAGS | ||
| 1563 | JZ K61A ;; | ||
| 1564 | AND KB_FLAG,0F0H ;; CLEAR SHIFTS | ||
| 1565 | AND KB_FLAG_1,0FH ;; | ||
| 1566 | AND KB_FLAG_2,1FH ;; CLEAR FUNCTION STATES | ||
| 1567 | K61A: ;; | ||
| 1568 | POP DS ;; | ||
| 1569 | POP BX ;; | ||
| 1570 | POP SI ;; | ||
| 1571 | K61B: ;; | ||
| 1572 | RET ;; | ||
| 1573 | BUFFER_FILL ENDP ;; | ||
| 1574 | PAGE ;; | ||
| 1575 | ;; | ||
| 1576 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1577 | ;; | ||
| 1578 | ;; Procedure: KB_NOISE | ||
| 1579 | ;; | ||
| 1580 | ;; Description: | ||
| 1581 | ;; General routine to generate beep tones | ||
| 1582 | ;; | ||
| 1583 | ;; Input Registers: | ||
| 1584 | ;; BX - length of tone | ||
| 1585 | ;; CX - tone frequency (larger CX = lower pitch) | ||
| 1586 | ;; | ||
| 1587 | ;; Output Registers: | ||
| 1588 | ;; AX,BX,CX trashed | ||
| 1589 | ;; | ||
| 1590 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1591 | ;; | ||
| 1592 | BEEPING DB 0 ;; 1 if beep already in progress | ||
| 1593 | ;; | ||
| 1594 | KB_NOISE PROC ;; | ||
| 1595 | CMP CS:BEEPING,0 ;; ARE WE BEEPING? | ||
| 1596 | JE NOT_BEEPING_YET ;; | ||
| 1597 | RET ;; YES - RETURN | ||
| 1598 | NOT_BEEPING_YET: ;; | ||
| 1599 | MOV CS:BEEPING,1 ;; beep in progress | ||
| 1600 | ;; | ||
| 1601 | STI ;; | ||
| 1602 | ;; | ||
| 1603 | IN AL,061H ;; Get control info | ||
| 1604 | PUSH AX ;; | ||
| 1605 | LOOP01: ;; | ||
| 1606 | AND AL,0FCH ;; Turn off timer gate and speaker | ||
| 1607 | OUT 061H,AL ;; output to control | ||
| 1608 | PUSH CX ;; half cycle time for tone | ||
| 1609 | LOOP02: ;; | ||
| 1610 | LOOP LOOP02 ;; speaker off | ||
| 1611 | OR AL,2 ;; turn on speaker | ||
| 1612 | OUT 061H,AL ;; output to control | ||
| 1613 | POP CX ;; | ||
| 1614 | PUSH CX ;; | ||
| 1615 | LOOP03: ;; | ||
| 1616 | LOOP LOOP03 ;; another half cycle | ||
| 1617 | DEC BX ;; time count | ||
| 1618 | POP CX ;; another cycle | ||
| 1619 | JNZ LOOP01 ;; | ||
| 1620 | POP AX ;; | ||
| 1621 | OUT 061H,AL ;; restore control | ||
| 1622 | ;; | ||
| 1623 | ;; | ||
| 1624 | MOV CS:BEEPING,0 ;; indicate beep over | ||
| 1625 | RET ;; | ||
| 1626 | KB_NOISE ENDP ;; | ||
| 1627 | ;; | ||
| 1628 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1629 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1630 | ;; | ||
| 1631 | ;; Procedure: DUMBJMP | ||
| 1632 | ;; | ||
| 1633 | ;; Description: | ||
| 1634 | ;; Dummy JUMP used to allow smooth exit | ||
| 1635 | ;; for XT & older machines | ||
| 1636 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1637 | ;; | ||
| 1638 | DUMBJMP PROC ;; | ||
| 1639 | JMP UP1 ;; ARE WE BEEPING? | ||
| 1640 | DUMBJMP ENDP ;; | ||
| 1641 | ;; | ||
| 1642 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1643 | ;; | ||
| 1644 | ;; Procedure: ERROR_BEEP | ||
| 1645 | ;; | ||
| 1646 | ;; Description: | ||
| 1647 | ;; Call KB_NOISE to generate a beep. | ||
| 1648 | ;; | ||
| 1649 | ;; Input Registers: | ||
| 1650 | ;; None | ||
| 1651 | ;; | ||
| 1652 | ;; Output Registers: | ||
| 1653 | ;; None | ||
| 1654 | ;; | ||
| 1655 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1656 | ;; | ||
| 1657 | ;; | ||
| 1658 | ERROR_BEEP PROC NEAR ;; | ||
| 1659 | ;; | ||
| 1660 | PUSH AX ;; SAVE REGS | ||
| 1661 | PUSH BX ;; | ||
| 1662 | PUSH CX ;; | ||
| 1663 | ;; | ||
| 1664 | ;***CNS | ||
| 1665 | JMP SHORT $+2 | ||
| 1666 | ;***CNS | ||
| 1667 | MOV AL,EOI ;; ENABLE INTR. CTL. CHIP | ||
| 1668 | OUT INTA00,AL ;; | ||
| 1669 | ;***CNS | ||
| 1670 | JMP SHORT $+2 | ||
| 1671 | ;***CNS | ||
| 1672 | ;; | ||
| 1673 | TEST CS:SD.SYSTEM_FLAG,PC_JR | ||
| 1674 | JZ EB_TEST_1 ;; The JR | ||
| 1675 | MOV BX,80H ;; NUMBER OF CYCLES FOR 1/8 SECOND TONE | ||
| 1676 | MOV CX,021H ;; FREQUENCY | ||
| 1677 | JMP SHORT BEEP_IT ;; | ||
| 1678 | EB_TEST_1: ;; | ||
| 1679 | TEST CS:SD.SYSTEM_FLAG,PC_XT+PC_PAL+PC_LAP | ||
| 1680 | JZ EB_TEST_2 ;; 8088/8886 MACHINE | ||
| 1681 | MOV BX,80H ;; NUMBER OF CYCLES FOR 1/8 SECOND TONE | ||
| 1682 | MOV CX,048H ;; FREQUENCY | ||
| 1683 | JMP SHORT BEEP_IT ;; | ||
| 1684 | EB_TEST_2: ;; | ||
| 1685 | TEST CS:SD.SYSTEM_FLAG,PC_386 | ||
| 1686 | JZ EB_TEST_3 ;; 386 MACHINE | ||
| 1687 | MOV BX,80H ;; | ||
| 1688 | MOV CX,19CH ;; FREQUENCY | ||
| 1689 | JMP SHORT BEEP_IT ;; | ||
| 1690 | EB_TEST_3: ;; | ||
| 1691 | MOV BX,80H ;; DEFAULT TO 286 MACHINE | ||
| 1692 | MOV CX,0CEH ;; FREQUENCY | ||
| 1693 | BEEP_IT: ;; | ||
| 1694 | CALL KB_NOISE ;; | ||
| 1695 | ;; | ||
| 1696 | POP CX ;; RESTORE REGS | ||
| 1697 | POP BX ;; | ||
| 1698 | POP AX ;; | ||
| 1699 | RET ;; RETURN | ||
| 1700 | ERROR_BEEP ENDP ;; | ||
| 1701 | ;; | ||
| 1702 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1703 | ;; | ||
| 1704 | ;; SHIP_IT | ||
| 1705 | ;; | ||
| 1706 | ;; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES | ||
| 1707 | ;; TO THE KEYBOARD CONTROLLER. | ||
| 1708 | ;; | ||
| 1709 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1710 | ;; | ||
| 1711 | SHIP_IT PROC NEAR ;; | ||
| 1712 | ;; | ||
| 1713 | ;------- TEST SYSTEM TYPE ;; | ||
| 1714 | ;; | ||
| 1715 | TEST CS:SD.SYSTEM_FLAG,PC_AT+PC_386 ; IF THE SYSTEM WE'RE RUNNING ON IS A | ||
| 1716 | JNZ SI1 ;; PCAT, EXECUTE THIS ROUTINE, | ||
| 1717 | RET ;; ELSE RET | ||
| 1718 | ;; | ||
| 1719 | ;; | ||
| 1720 | SI1: PUSH AX ;; SAVE DATA TO SEND | ||
| 1721 | ;; | ||
| 1722 | ;;;-- WAIT FOR COMMAND TO BE ACCEPTED ;; | ||
| 1723 | CLI ;; DISABLE INTERRUPTS | ||
| 1724 | ;; | ||
| 1725 | CALL WAIT_ON_STATUS_PORT ;; | ||
| 1726 | ;; | ||
| 1727 | POP AX ;; GET DATA TO SEND | ||
| 1728 | OUT STATUS_PORT,AL ;; SEND TO KEYBOARD CONTROLLER | ||
| 1729 | STI ;; ENABLE INTERRUPTS AGAIN | ||
| 1730 | RET ;; RETURN TO CALLER | ||
| 1731 | SHIP_IT ENDP ;; | ||
| 1732 | ;; | ||
| 1733 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1734 | ;; | ||
| 1735 | ;; Procedure: WAIT_ON_STATUS_PORT | ||
| 1736 | ;; | ||
| 1737 | ;; Description: | ||
| 1738 | ;; Waits for a keyboard command to be accepted | ||
| 1739 | ;; | ||
| 1740 | ;; Input Registers: | ||
| 1741 | ;; None | ||
| 1742 | ;; | ||
| 1743 | ;; Output Registers: | ||
| 1744 | ;; None | ||
| 1745 | ;; | ||
| 1746 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1747 | ;; | ||
| 1748 | WAIT_ON_STATUS_PORT PROC NEAR ;; | ||
| 1749 | ;; | ||
| 1750 | ;---- WAIT FOR COMMAND TO BE ACCEPTED ;; | ||
| 1751 | ;; | ||
| 1752 | MOV CX,CS:SD.TIMING_FACTOR ;; PROCESSOR SCALE FACTOR; PCAT = 1 | ||
| 1753 | W01: ;; | ||
| 1754 | PUSH CX ;; | ||
| 1755 | SUB CX,CX ;; | ||
| 1756 | W02: ;; | ||
| 1757 | IN AL,STATUS_PORT ;; | ||
| 1758 | TEST AL,INPT_BUF_FULL ;; | ||
| 1759 | LOOPNZ W02 ;; WAIT FOR COMMAND TO BE ACCEPTED | ||
| 1760 | POP CX ;; | ||
| 1761 | LOOPNZ W01 ;; | ||
| 1762 | ;; | ||
| 1763 | RET ;; | ||
| 1764 | ;; | ||
| 1765 | WAIT_ON_STATUS_PORT ENDP ;; | ||
| 1766 | ;; | ||
| 1767 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1768 | ;; | ||
| 1769 | ;; SND_DATA | ||
| 1770 | ;; | ||
| 1771 | ;; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES | ||
| 1772 | ;; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO | ||
| 1773 | ;; HANDLES ANY RETRIES IF REQUIRED | ||
| 1774 | ;; | ||
| 1775 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1776 | ;; | ||
| 1777 | SND_DATA PROC NEAR ;; | ||
| 1778 | PUSH AX ;; SAVE REGISTERS | ||
| 1779 | PUSH BX ;; * | ||
| 1780 | PUSH CX ;; | ||
| 1781 | MOV BH,AL ;; SAVE TRANSMITTED BY FOR RETRIES | ||
| 1782 | MOV BL,3 ;; LOAD RETRY COUNT | ||
| 1783 | SD0: CLI ;; DISABLE INTERRUPTS | ||
| 1784 | AND KB_FLAG_2,NOT (KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS | ||
| 1785 | ;; | ||
| 1786 | CALL WAIT_ON_STATUS_PORT ;; | ||
| 1787 | ;; | ||
| 1788 | MOV AL,BH ;; REESTABLISH BYTE TO TRANSMIT | ||
| 1789 | OUT PORT_A,AL ;; SEND BYTE | ||
| 1790 | STI ;; ENABLE INTERRUPTS | ||
| 1791 | MOV AX,01A00H ;; LOAD COUNT FOR 10mS+ | ||
| 1792 | MUL CS:SD.TIMING_FACTOR ;; ACCOUNT FOR PROCESSOR SPEED | ||
| 1793 | MOV CX,AX ;; | ||
| 1794 | SD1: TEST KB_FLAG_2,KB_FE+KB_FA ;; SEE IF EITHER BIT SET | ||
| 1795 | JNZ SD3 ;; IF SET, SOMETHING RECEIVED GO PROCESS | ||
| 1796 | ;; | ||
| 1797 | LOOP SD1 ;; OTHERWISE WAIT | ||
| 1798 | ;; | ||
| 1799 | SD2: DEC BL ;; DECREMENT RETRY COUNT | ||
| 1800 | JNZ SD0 ;; RETRY TRANSMISSION | ||
| 1801 | ;; | ||
| 1802 | OR KB_FLAG_2,KB_ERR ;; TURN ON TRANSMIT ERROR FLAG | ||
| 1803 | JMP SHORT SD4 ;; RETRIES EXHAUSTED FORGET TRANSMISSION | ||
| 1804 | ;; | ||
| 1805 | SD3: TEST KB_FLAG_2,KB_FA ;; SEE IF THIS IS AN ACKNOWLEDGE | ||
| 1806 | JZ SD2 ;; IF NOT, GO RESEND | ||
| 1807 | ;; | ||
| 1808 | SD4: POP CX ;; RESTORE REGISTERS | ||
| 1809 | POP BX ;; | ||
| 1810 | POP AX ;; * | ||
| 1811 | RET ;; RETURN, GOOD TRANSMISSION | ||
| 1812 | SND_DATA ENDP ;; | ||
| 1813 | ;; | ||
| 1814 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1815 | ;; | ||
| 1816 | ;; SND_LED | ||
| 1817 | ;; | ||
| 1818 | ;; THIS ROUTINE TURNS ON THE MODE INDICATORS. | ||
| 1819 | ;; | ||
| 1820 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1821 | ;; | ||
| 1822 | SND_LED PROC NEAR ;; | ||
| 1823 | CLI ;; TURN OFF INTERRUPTS | ||
| 1824 | TEST KB_FLAG_2,KB_PR_LED ;; CHECK FOR MODE INDICATOR UPDATE | ||
| 1825 | JNZ SL1 ;; DONT UPDATE AGAIN IF UPDATE UNDERWAY | ||
| 1826 | ;; | ||
| 1827 | OR KB_FLAG_2,KB_PR_LED ;; TURN ON UPDATE IN PROCESS | ||
| 1828 | ;***CNS | ||
| 1829 | JMP SHORT $+2 | ||
| 1830 | ;***CNS | ||
| 1831 | MOV AL,EOI ;; END OF INTERRUPT COMMAND | ||
| 1832 | OUT 020H,AL ;; SEND COMMAND TO INTERRUPT CONTROL PORT | ||
| 1833 | ;***CNS | ||
| 1834 | JMP SHORT $+2 | ||
| 1835 | ;***CNS | ||
| 1836 | JMP SHORT SL0 ;; GO SEND MODE INDICATOR COMMAND | ||
| 1837 | ;; | ||
| 1838 | SND_LED1: ;; | ||
| 1839 | CLI ;; TURN OFF INTERRUPTS | ||
| 1840 | TEST KB_FLAG_2,KB_PR_LED ;; CHECK FOR MODE INDICATOR UPDATE | ||
| 1841 | JNZ SL1 ;; DONT UPDATE AGAIN IF UPDATE UNDERWAY | ||
| 1842 | ;; | ||
| 1843 | OR KB_FLAG_2,KB_PR_LED ;; TURN ON UPDATE IN PROCESS | ||
| 1844 | SL0: MOV AL,LED_CMD ;; LED CMD BYTE | ||
| 1845 | CALL SND_DATA ;; SEND DATA TO KEYBOARD | ||
| 1846 | CLI ;; | ||
| 1847 | CALL MAKE_LED ;; GO FORM INDICATOR DATA BYTE | ||
| 1848 | AND KB_FLAG_2,0F8H ;; CLEAR MODE INDICATOR BITS | ||
| 1849 | OR KB_FLAG_2,AL ;; SAVE PRESENT INDICATORS STATES FOR NEXT TIME | ||
| 1850 | TEST KB_FLAG_2,KB_ERR ;; TRANSMIT ERROR DETECTED | ||
| 1851 | JNZ SL2 ;; IF YES, BYPASS SECOND BYTE TRANSMISSION | ||
| 1852 | ;; | ||
| 1853 | CALL SND_DATA ;; SEND DATA TO KEYBOARD | ||
| 1854 | CLI ;; TURN OFF INTERRUPTS | ||
| 1855 | TEST KB_FLAG_2,KB_ERR ;; TRANSMIT ERROR DETECTED | ||
| 1856 | JZ SL3 ;; IF NOT, DONT SEND AN ENABLE COMMAND | ||
| 1857 | ;; | ||
| 1858 | SL2: MOV AL,KB_ENABLE ;; GET KEYBOARD CSA ENABLE COMMAND | ||
| 1859 | CALL SND_DATA ;; SEND DATA TO KEYBOARD | ||
| 1860 | CLI ;; TURN OFF INTERRUPTS | ||
| 1861 | SL3: AND KB_FLAG_2,NOT(KB_PR_LED+KB_ERR) ; TURN OFF MODE INDICATOR | ||
| 1862 | ;; UPDATE AND TRANSMIT ERROR FLAG | ||
| 1863 | SL1: STI ;; ENABLE INTERRUPTS | ||
| 1864 | RET ;; RETURN TO CALLER | ||
| 1865 | SND_LED ENDP ;; | ||
| 1866 | PAGE ;; | ||
| 1867 | ;; | ||
| 1868 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1869 | ;; | ||
| 1870 | ;; MAKE_LED | ||
| 1871 | ;; | ||
| 1872 | ;; THIS ROUTINE FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF | ||
| 1873 | ;; THE MODE INDICATORS | ||
| 1874 | ;; | ||
| 1875 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1876 | ;; | ||
| 1877 | MAKE_LED PROC NEAR ;; | ||
| 1878 | PUSH CX ;; SAVE CX | ||
| 1879 | MOV AL,KB_FLAG ;; GET CAPS & NUM LOCK INDICATORS | ||
| 1880 | AND AL,CAPS_STATE+NUM_STATE+SCROLL_STATE ; ISOLATE INDICATORS | ||
| 1881 | MOV CL,4 ;; SHIFT COUNT | ||
| 1882 | ROL AL,CL ;; SHIFT BITS OVER TO TURN ON INDICATORS | ||
| 1883 | AND AL,07H ;; MAKE SURE ONLY MODE BITS ON | ||
| 1884 | POP CX ;; | ||
| 1885 | RET ;; RETURN TO CALLER | ||
| 1886 | MAKE_LED ENDP ;; | ||
| 1887 | ;; | ||
| 1888 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1889 | |||
| 1890 | |||
| 1891 | ;CNS*** | ||
| 1892 | |||
| 1893 | CODE ENDS | ||
| 1894 | END | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBI9C.INC b/v4.0/src/CMD/KEYB/KEYBI9C.INC new file mode 100644 index 0000000..7848a1b --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI9C.INC | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBI9C.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYB.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; External declarations and equates for procedures in file | ||
| 16 | ;; KEYBI9C.ASM | ||
| 17 | ;; | ||
| 18 | ;; Change History: | ||
| 19 | ;; --------------- | ||
| 20 | ;; | ||
| 21 | ;; | ||
| 22 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 23 | ;; | ||
| 24 | EXTRN KEYB_INT_9:NEAR ;; | ||
| 25 | EXTRN BUFFER_FILL:NEAR ;; | ||
| 26 | EXTRN ERROR_BEEP :NEAR ;; | ||
| 27 | EXTRN COUNTRY_FLAG:BYTE ;; | ||
| 28 | EXTRN BEEP_PENDING:BYTE ;; | ||
| 29 | EXTRN SCAN_CODE:BYTE ;; | ||
| 30 | EXTRN K8:BYTE ;; | ||
| 31 | EXTRN TEMP_HEAD:WORD ;; | ||
| 32 | EXTRN TEMP_TAIL:WORD ;; | ||
| 33 | EXTRN BUSY_TFLAG:BYTE ;; | ||
| 34 | EXTRN MYBUFF:BYTE ;; | ||
| 35 | EXTRN ENABLE_FL:BYTE ;; | ||
| 36 | EXTRN NEW_BUFF_CTR :BYTE ;; | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | |||
| 40 | .LIST | ||
| 41 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBMAC.INC b/v4.0/src/CMD/KEYB/KEYBMAC.INC new file mode 100644 index 0000000..5666666 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBMAC.INC | |||
| @@ -0,0 +1,319 @@ | |||
| 1 | .XLIST | ||
| 2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3 | ;; DOS - NLS Support - Keyboard Definition File | ||
| 4 | ;; (C) Copyright 1988 Microsoft | ||
| 5 | ;; | ||
| 6 | ;; File Name: KEYBMAC.INC | ||
| 7 | ;; ---------- | ||
| 8 | ;; | ||
| 9 | ;; Description: | ||
| 10 | ;; ------------ | ||
| 11 | ;; Include file containing macros for the Keyboard Definition File. | ||
| 12 | ;; | ||
| 13 | ;; Change History: | ||
| 14 | ;; --------------- | ||
| 15 | ;; | ||
| 16 | ;; | ||
| 17 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 18 | ;; | ||
| 19 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 20 | ;; Dead key flags | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | ACUTE EQU 80H ;; NLS_FLAG_1 | ||
| 24 | GRAVE EQU 40H ;; | ||
| 25 | DIARESIS EQU 20H ;; | ||
| 26 | CIRCUMFLEX EQU 10H ;; | ||
| 27 | CEDILLA EQU 08H ;; | ||
| 28 | TILDE EQU 04H ;; | ||
| 29 | ;; NLS_FLAG_2 : nothing defined yet | ||
| 30 | ;; | ||
| 31 | ;; | ||
| 32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 33 | ;; State IDs | ||
| 34 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 35 | ;; | ||
| 36 | DEAD_LOWER EQU 1 ;; dead keys on lower shift | ||
| 37 | DEAD_UPPER EQU 2 ;; | ||
| 38 | ALPHA_LOWER EQU 3 ;; | ||
| 39 | ALPHA_UPPER EQU 4 ;; | ||
| 40 | NON_ALPHA_LOWER EQU 5 ;; | ||
| 41 | NON_ALPHA_UPPER EQU 6 ;; | ||
| 42 | THIRD_SHIFT EQU 7 ;; | ||
| 43 | ACUTE_LOWER EQU 8 ;; | ||
| 44 | ACUTE_UPPER EQU 9 ;; | ||
| 45 | ACUTE_SPACE EQU 10 ;; | ||
| 46 | GRAVE_LOWER EQU 11 ;; | ||
| 47 | GRAVE_UPPER EQU 12 ;; | ||
| 48 | GRAVE_SPACE EQU 13 ;; | ||
| 49 | DIARESIS_LOWER EQU 14 ;; | ||
| 50 | DIARESIS_UPPER EQU 15 ;; | ||
| 51 | DIARESIS_SPACE EQU 16 ;; | ||
| 52 | CIRCUMFLEX_LOWER EQU 17 ;; | ||
| 53 | CIRCUMFLEX_UPPER EQU 18 ;; | ||
| 54 | CIRCUMFLEX_SPACE EQU 19 ;; | ||
| 55 | CEDILLA_LOWER EQU 20 ;; | ||
| 56 | CEDILLA_UPPER EQU 21 ;; | ||
| 57 | CEDILLA_SPACE EQU 22 ;; | ||
| 58 | CEDILLA_CEDILLA EQU 23 ;; | ||
| 59 | DEAD_THIRD EQU 24 ;; | ||
| 60 | ACUTE_ACUTE EQU 25 ;; | ||
| 61 | GRAVE_GRAVE EQU 26 ;; | ||
| 62 | DIARESIS_DIARESIS EQU 27 ;; | ||
| 63 | CIRCUMFLEX_CIRCUMFLEX EQU 28 ;; | ||
| 64 | FOURTH_SHIFT EQU 29 ;; | ||
| 65 | DEAD_FOURTH EQU 30 ;; | ||
| 66 | TILDE_LOWER EQU 31 ;; | ||
| 67 | TILDE_UPPER EQU 32 ;; | ||
| 68 | TILDE_SPACE EQU 33 ;; | ||
| 69 | ALT_CASE EQU 34 ;; | ||
| 70 | CTRL_CASE EQU 35 ;; | ||
| 71 | NUMERIC_PAD EQU 36 ;; | ||
| 72 | DIVIDE_SIGN EQU 37 ;; | ||
| 73 | ;; | ||
| 74 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 75 | ;; Logic Macros | ||
| 76 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 77 | ;; | ||
| 78 | |||
| 79 | UNKNOWN = 255 | ||
| 80 | |||
| 81 | FIND_FLAG MACRO FLAG_MASK | ||
| 82 | IFIDN <FLAG_MASK>,<SCAN_MATCH> | ||
| 83 | FLAG_ID = EXT_KB_FLAG_ID | ||
| 84 | ELSE | ||
| 85 | IFIDN <FLAG_MASK>,<EITHER_SHIFT> | ||
| 86 | FLAG_ID = EXT_KB_FLAG_ID | ||
| 87 | ELSE | ||
| 88 | IFIDN <FLAG_MASK>,<CAPS_STATE> | ||
| 89 | FLAG_ID = KB_FLAG_ID | ||
| 90 | ELSE | ||
| 91 | IFIDN <FLAG_MASK>,<NUM_STATE> | ||
| 92 | FLAG_ID = KB_FLAG_ID | ||
| 93 | ELSE | ||
| 94 | IFIDN <FLAG_MASK>,<EITHER_CTL> | ||
| 95 | FLAG_ID = EXT_KB_FLAG_ID | ||
| 96 | ELSE | ||
| 97 | IFIDN <FLAG_MASK>,<EITHER_ALT> | ||
| 98 | FLAG_ID = EXT_KB_FLAG_ID | ||
| 99 | ELSE | ||
| 100 | IFIDN <FLAG_MASK>,<LEFT_SHIFT> | ||
| 101 | FLAG_ID = KB_FLAG_ID | ||
| 102 | ELSE | ||
| 103 | IFIDN <FLAG_MASK>,<RIGHT_SHIFT> | ||
| 104 | FLAG_ID = KB_FLAG_ID | ||
| 105 | ELSE | ||
| 106 | IFIDN <FLAG_MASK>,<ALT_SHIFT> | ||
| 107 | FLAG_ID = KB_FLAG_ID | ||
| 108 | ELSE | ||
| 109 | IFIDN <FLAG_MASK>,<CTL_SHIFT> | ||
| 110 | FLAG_ID = KB_FLAG_ID | ||
| 111 | ELSE | ||
| 112 | IFIDN <FLAG_MASK>,<R_ALT_SHIFT> | ||
| 113 | FLAG_ID = KB_FLAG_3_ID | ||
| 114 | ELSE | ||
| 115 | IFIDN <FLAG_MASK>,<R_CTL_SHIFT> | ||
| 116 | FLAG_ID = KB_FLAG_3_ID | ||
| 117 | ELSE | ||
| 118 | IFIDN <FLAG_MASK>,<TILDE> | ||
| 119 | FLAG_ID = NLS_FLAG_1_ID | ||
| 120 | ELSE | ||
| 121 | IFIDN <FLAG_MASK>,<ACUTE> | ||
| 122 | FLAG_ID = NLS_FLAG_1_ID | ||
| 123 | ELSE | ||
| 124 | IFIDN <FLAG_MASK>,<GRAVE> | ||
| 125 | FLAG_ID = NLS_FLAG_1_ID | ||
| 126 | ELSE | ||
| 127 | IFIDN <FLAG_MASK>,<DIARESIS> | ||
| 128 | FLAG_ID = NLS_FLAG_1_ID | ||
| 129 | ELSE | ||
| 130 | IFIDN <FLAG_MASK>,<CEDILLA> | ||
| 131 | FLAG_ID = NLS_FLAG_1_ID | ||
| 132 | ELSE | ||
| 133 | IFIDN <FLAG_MASK>,<CIRCUMFLEX> | ||
| 134 | FLAG_ID = NLS_FLAG_1_ID | ||
| 135 | ELSE | ||
| 136 | IFIDN <FLAG_MASK>,<LC_E0> | ||
| 137 | FLAG_ID = KB_FLAG_3_ID | ||
| 138 | ELSE | ||
| 139 | FLAG_ID = UNKNOWN | ||
| 140 | ENDIF | ||
| 141 | ENDIF | ||
| 142 | ENDIF | ||
| 143 | ENDIF | ||
| 144 | ENDIF | ||
| 145 | ENDIF | ||
| 146 | ENDIF | ||
| 147 | ENDIF | ||
| 148 | ENDIF | ||
| 149 | ENDIF | ||
| 150 | ENDIF | ||
| 151 | ENDIF | ||
| 152 | ENDIF | ||
| 153 | ENDIF | ||
| 154 | ENDIF | ||
| 155 | ENDIF | ||
| 156 | ENDIF | ||
| 157 | ENDIF | ||
| 158 | ENDIF | ||
| 159 | ENDM | ||
| 160 | |||
| 161 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 162 | FLAG MACRO FLAG_MASK | ||
| 163 | FIND_FLAG FLAG_MASK | ||
| 164 | IF (FLAG_ID EQ UNKNOWN) | ||
| 165 | IF2 | ||
| 166 | %OUT Unknown parameter FLAG_MASK on FLAG MACRO | ||
| 167 | ENDIF | ||
| 168 | ELSE | ||
| 169 | DB FLAG_ID | ||
| 170 | DB FLAG_MASK | ||
| 171 | ENDIF | ||
| 172 | ENDM | ||
| 173 | |||
| 174 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 175 | IFF MACRO FLAG_MASK,MASK_TYPE | ||
| 176 | MAC_OK = 1 | ||
| 177 | IFB <MASK_TYPE> | ||
| 178 | NOT_BIT = 00000000B | ||
| 179 | ELSE | ||
| 180 | IFIDN <MASK_TYPE>,<NOT> | ||
| 181 | NOT_BIT = 00001000B | ||
| 182 | ELSE | ||
| 183 | MAC_OK = 0 | ||
| 184 | IF2 | ||
| 185 | %OUT Unknown parameter MASK_TYPE on IFF MACRO | ||
| 186 | ENDIF | ||
| 187 | ENDIF | ||
| 188 | ENDIF | ||
| 189 | IF MAC_OK | ||
| 190 | FIND_FLAG FLAG_MASK | ||
| 191 | IF (FLAG_ID EQ UNKNOWN) | ||
| 192 | IF2 | ||
| 193 | %OUT Unknown parameter FLAG_MASK on IFF MACRO | ||
| 194 | ENDIF | ||
| 195 | ELSE | ||
| 196 | DB IFF_COMMAND+NOT_BIT+FLAG_ID | ||
| 197 | DB FLAG_MASK | ||
| 198 | ENDIF | ||
| 199 | ENDIF | ||
| 200 | ENDM | ||
| 201 | |||
| 202 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 203 | IFKBD MACRO SYS | ||
| 204 | DB IFKBD_COMMAND | ||
| 205 | DW SYS | ||
| 206 | ENDM | ||
| 207 | |||
| 208 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 209 | ANDF MACRO FLAG_MASK,MASK_TYPE | ||
| 210 | MAC_OK = 1 | ||
| 211 | IFB <MASK_TYPE> | ||
| 212 | NOT_BIT = 00000000B | ||
| 213 | ELSE | ||
| 214 | IFIDN <MASK_TYPE>,<NOT> | ||
| 215 | NOT_BIT = 00001000B | ||
| 216 | ELSE | ||
| 217 | MAC_OK = 0 | ||
| 218 | IF2 | ||
| 219 | %OUT Unknown parameter MASK_TYPE on ANDF MACRO | ||
| 220 | ENDIF | ||
| 221 | ENDIF | ||
| 222 | ENDIF | ||
| 223 | IF MAC_OK | ||
| 224 | FIND_FLAG FLAG_MASK | ||
| 225 | IF (FLAG_ID EQ UNKNOWN) | ||
| 226 | IF2 | ||
| 227 | %OUT Unknown parameter FLAG_MASK on ANDF MACRO | ||
| 228 | ENDIF | ||
| 229 | ELSE | ||
| 230 | DB ANDF_COMMAND+NOT_BIT+FLAG_ID | ||
| 231 | DB FLAG_MASK | ||
| 232 | ENDIF | ||
| 233 | ENDIF | ||
| 234 | ENDM | ||
| 235 | |||
| 236 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 237 | ELSEF MACRO | ||
| 238 | DB ELSEF_COMMAND | ||
| 239 | ENDM | ||
| 240 | |||
| 241 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 242 | ENDIFF MACRO | ||
| 243 | DB ENDIFF_COMMAND | ||
| 244 | ENDM | ||
| 245 | |||
| 246 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 247 | XLATT MACRO STATE | ||
| 248 | DB XLATT_COMMAND | ||
| 249 | DB STATE | ||
| 250 | ENDM | ||
| 251 | |||
| 252 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 253 | PUT_ERROR_CHAR MACRO STATE | ||
| 254 | DB PUT_ERROR_COMMAND | ||
| 255 | DB STATE | ||
| 256 | ENDM | ||
| 257 | |||
| 258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 259 | OPTION MACRO MASK,MASK_TYPE | ||
| 260 | MAC_OK = 1 | ||
| 261 | IFB <MASK_TYPE> | ||
| 262 | NOT_BIT = 00000000B | ||
| 263 | ELSE | ||
| 264 | IFIDN <MASK_TYPE>,<NOT> | ||
| 265 | NOT_BIT = 00001000B | ||
| 266 | ELSE | ||
| 267 | MAC_OK = 0 | ||
| 268 | IF2 | ||
| 269 | %OUT Unknown parameter MASK_TYPE on OPTION MACRO | ||
| 270 | ENDIF | ||
| 271 | ENDIF | ||
| 272 | ENDIF | ||
| 273 | IF MAC_OK | ||
| 274 | DB OPTION_COMMAND+NOT_BIT | ||
| 275 | DB MASK | ||
| 276 | ENDIF | ||
| 277 | ENDM | ||
| 278 | |||
| 279 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 280 | SET_FLAG MACRO STATE | ||
| 281 | DB SET_FLAG_COMMAND | ||
| 282 | DB STATE | ||
| 283 | ENDM | ||
| 284 | |||
| 285 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 286 | RESET_NLS MACRO | ||
| 287 | DB RESET_NLS_COMMAND | ||
| 288 | ENDM | ||
| 289 | |||
| 290 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 291 | BEEP MACRO | ||
| 292 | DB BEEP_COMMAND | ||
| 293 | ENDM | ||
| 294 | |||
| 295 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 296 | GOTO MACRO GOTO_OFFSET | ||
| 297 | DB GOTO_COMMAND | ||
| 298 | DW GOTO_OFFSET-$-2 | ||
| 299 | ENDM | ||
| 300 | |||
| 301 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 302 | EXIT_INT_9 MACRO | ||
| 303 | DB GOTO_COMMAND+EXIT_INT_9_FLAG | ||
| 304 | DW 0 | ||
| 305 | ENDM | ||
| 306 | |||
| 307 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 308 | EXIT_STATE_LOGIC MACRO | ||
| 309 | DB GOTO_COMMAND+EXIT_STATE_LOGIC_FLAG | ||
| 310 | DW 0 | ||
| 311 | ENDM | ||
| 312 | |||
| 313 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 314 | CHECK_FOR_CORE_KEY MACRO | ||
| 315 | DB CHECK_CORE_COMMAND | ||
| 316 | ENDM | ||
| 317 | |||
| 318 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 319 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBMSG.INC b/v4.0/src/CMD/KEYB/KEYBMSG.INC new file mode 100644 index 0000000..3bcb061 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBMSG.INC | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBMSG.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYBCMD.ASM (KEYB.ASM) | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; External declarations for procedures in file KEYBCMD.ASM. | ||
| 16 | ;; | ||
| 17 | ;; Change History: | ||
| 18 | ;; --------------- | ||
| 19 | ;; | ||
| 20 | ;; | ||
| 21 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 22 | ;; | ||
| 23 | EXTRN ACT_KEYB_CP :BYTE ;; | ||
| 24 | EXTRN ACT_CON_CP :BYTE ;; | ||
| 25 | EXTRN ACT_KEYB :BYTE ;; | ||
| 26 | EXTRN INV_L :BYTE ;; | ||
| 27 | EXTRN INV_I :BYTE ;; | ||
| 28 | EXTRN INV_CP :BYTE ;; | ||
| 29 | EXTRN INV_S :BYTE ;; | ||
| 30 | EXTRN INV_FN :BYTE ;; | ||
| 31 | EXTRN INV_KEYB_Q :BYTE ;; | ||
| 32 | EXTRN INV_CON_Q :BYTE ;; | ||
| 33 | EXTRN NOT_DESIG :BYTE ;; | ||
| 34 | EXTRN NOT_SUPP :BYTE ;; | ||
| 35 | EXTRN NOT_VALID1 :BYTE ;; | ||
| 36 | EXTRN NOT_VALID2 :BYTE ;; | ||
| 37 | EXTRN WARNING_1 :BYTE ;; | ||
| 38 | EXTRN INV_COMBO :BYTE ;; | ||
| 39 | EXTRN CR_LF :BYTE ;; | ||
| 40 | EXTRN MEMORY_OVERF :BYTE ;; | ||
| 41 | ;; | ||
| 42 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 43 | |||
| 44 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBSHAR.INC b/v4.0/src/CMD/KEYB/KEYBSHAR.INC new file mode 100644 index 0000000..75bbc13 --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBSHAR.INC | |||
| @@ -0,0 +1,307 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBSHAR.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Description: | ||
| 11 | ;; ------------ | ||
| 12 | ;; Include file containing structure definitions Shared Data Area | ||
| 13 | ;; for the Shared Data Area. | ||
| 14 | ;; The Shared Data Area contains data which is required by | ||
| 15 | ;; both the resident and transient KEYB code. The Shared | ||
| 16 | ;; Data Area is allocated in the KEYBI2F file and will be | ||
| 17 | ;; resident following initial installation. | ||
| 18 | ;; | ||
| 19 | ;; Change History: | ||
| 20 | ;; --------------- | ||
| 21 | ;; | ||
| 22 | ;; | ||
| 23 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 24 | ;; | ||
| 25 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 26 | ;; SHARED_DATA_STR defines the initial fixed length portion of the | ||
| 27 | ;; Shared Data Area. | ||
| 28 | ;; Tables are loaded beginning at TABLE_AREA in the following order: | ||
| 29 | ;; State Logic | ||
| 30 | ;; Common Translate Section | ||
| 31 | ;; Specific Translate Sections for | ||
| 32 | ;; each code page | ||
| 33 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 34 | ;; SPECIAL_FEATURES equates: | ||
| 35 | TYPEWRITER_CAPS_LK EQU 8000H ;; typewriter style caps lock | ||
| 36 | JR_HOT_KEY_1_2 EQU 4000H ;; on PCjr use 1/2 as the hot keys | ||
| 37 | ;; instead of F1/F2 | ||
| 38 | ;; | ||
| 39 | ;; Some useful scan codes: | ||
| 40 | F1_SCAN EQU 59 ;; F1 | ||
| 41 | F2_SCAN EQU 60 ;; F2 | ||
| 42 | ONE_SCAN EQU 2 ;; "1" | ||
| 43 | TWO_SCAN EQU 3 ;; "2" | ||
| 44 | ;; | ||
| 45 | ;; SYSTEM_FLAG equates: | ||
| 46 | EXT_16 EQU 8000H ;; extended int16 support is there | ||
| 47 | PC_AT EQU 4000H ;; code for pcat | ||
| 48 | PC_LAP EQU 2000H ;; code for pc lap computer (p-12) | ||
| 49 | PC_XT EQU 1000H ;; code for PC, PC/XT, PORTABLE | ||
| 50 | PC_JR EQU 0800H ;; code for PCjr | ||
| 51 | PC_PAL EQU 0400H ;; code for PALACE | ||
| 52 | PC_386 EQU 0200H ;; code for WRANGLER | ||
| 53 | PC_NET EQU 0100H ;; PC Net is installed | ||
| 54 | ;; | ||
| 55 | ;; HOT_KEY_FLAG EQUATES: | ||
| 56 | US_MODE EQU 0 ;; hot key is active => US | ||
| 57 | LANG_MODE EQU 0FFH ;; hot key is inactive | ||
| 58 | ;; | ||
| 59 | ;; ----------------------------------- | ||
| 60 | SHARED_DATA_STR STRUC ;; SHARED DATA AREA | ||
| 61 | ;; | ||
| 62 | OLD_INT_9 DD 0 ;; saved int 9 vector | ||
| 63 | OLD_INT_2F DD 0 ;; saved int 2F vector | ||
| 64 | OLD_INT_48 DD 0 ;; saved int 48 vector (if PCjr) | ||
| 65 | KEYB_TYPE DW 0 ;; type of keyboard | ||
| 66 | SYSTEM_FLAG DW 0 ;; system configuration flags | ||
| 67 | TABLE_OK DB 0 ;; flag to INT 9 that table is built | ||
| 68 | JR_KB_FLAG DB 0 ;; flag for special PCjr processing | ||
| 69 | TIMING_FACTOR DW 1 ;; Scale factor for INT 9 timing loops | ||
| 70 | ;; PC_AT = 1 | ||
| 71 | DB 2 DUP(0) ;; reserved | ||
| 72 | ;; | ||
| 73 | ;; Table copy begins here: | ||
| 74 | ACTIVE_LANGUAGE DB 'US' ;; language code | ||
| 75 | INVOKED_CP_TABLE DW 437 ;; ptr to table for invoked code page | ||
| 76 | INVOKED_KBD_ID DW 0 ;; WGR invoked keyboard id. ;AN000 | ||
| 77 | ACTIVE_XLAT_PTR DW -1 ;; ptr to active Specific Translate Sect | ||
| 78 | FIRST_XLAT_PTR DW -1 ;; ptr to first Specific Translate Sect | ||
| 79 | RESIDENT_END DW 0ffffh ;; offset of last byte in resident mem | ||
| 80 | LOGIC_PTR DW -1 ;; ptr to State Logic | ||
| 81 | COMMON_XLAT_PTR DW -1 ;; ptr to Common Translate Section | ||
| 82 | SPECIAL_FEATURES DW ? ;; special Features | ||
| 83 | TABLE_OVERFLOW DB 0 ;; overflow flag for table rebuild | ||
| 84 | HOT_KEY_ON_SCAN DB ? ;; scan codes to use with ALT+CTRL | ||
| 85 | HOT_KEY_OFF_SCAN DB ? ;; to turn hot key on and off | ||
| 86 | DB 4 DUP(0) ;; reserved | ||
| 87 | TABLE_AREA DB ? ;; tables loaded here: | ||
| 88 | ;; State Logic | ||
| 89 | ;; Common Translate Section | ||
| 90 | ;; Specific Translate Sections for | ||
| 91 | ;; each code page | ||
| 92 | SHARED_DATA_STR ENDS ;; | ||
| 93 | ;; | ||
| 94 | ;; | ||
| 95 | ;; | ||
| 96 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 97 | ;; State Logic equates. | ||
| 98 | ;; Contains equates for our NLS Flags and for the State Logic | ||
| 99 | ;; commands. | ||
| 100 | ;; State Logic command macros are defined in KEYBMAC.INC | ||
| 101 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 102 | ;; | ||
| 103 | STATE_LOGIC_STR STRUC ;; | ||
| 104 | ;; | ||
| 105 | SL_LOGIC_LEN DW ? ;; length of state logic | ||
| 106 | SL_SPECIAL_FEATURES DW ? ;; | ||
| 107 | SL_LOGIC_CMDS DB 0 ;; state logic commands begin here | ||
| 108 | ;; | ||
| 109 | STATE_LOGIC_STR ENDS ;; | ||
| 110 | ;; | ||
| 111 | ;; | ||
| 112 | NUM_BIOS_FLAGS EQU 4 ;; | ||
| 113 | NUM_NLS_FLAGS EQU 2 ;; '+1' below is the EXT_KB_FLAG | ||
| 114 | NUM_FLAGS EQU NUM_BIOS_FLAGS+NUM_NLS_FLAGS+1 | ||
| 115 | ;; | ||
| 116 | ;; | ||
| 117 | EITHER_SHIFT EQU 80H ;; EXT_KB_FLAG : our own shift state | ||
| 118 | EITHER_CTL EQU 40H ;; flags | ||
| 119 | EITHER_ALT EQU 20H ;; | ||
| 120 | SCAN_MATCH EQU 08H ;; set if scan code found in XLATT | ||
| 121 | ;; or SET_FLAG searches | ||
| 122 | ;; | ||
| 123 | ;; | ||
| 124 | KB_FLAG_ID EQU 0 ;; Flag ID's as coded in IFF and ANDF | ||
| 125 | KB_FLAG_1_ID EQU 1 ;; commands | ||
| 126 | KB_FLAG_2_ID EQU 2 ;; | ||
| 127 | KB_FLAG_3_ID EQU 3 ;; | ||
| 128 | EXT_KB_FLAG_ID EQU 4 ;; | ||
| 129 | NLS_FLAG_1_ID EQU 5 ;; | ||
| 130 | NLS_FLAG_2_ID EQU 6 ;; | ||
| 131 | ;; | ||
| 132 | COMMAND_BITS EQU 0F0H ;; Mask to isolate command code | ||
| 133 | SUB_CMD_BITS EQU 0FH ;; mask to isolate sub command code | ||
| 134 | NOT_TEST EQU 08H ;; NOT bit in IFF, ANDF | ||
| 135 | COMMAND_SHIFT EQU 4 ;; shift amount for command code | ||
| 136 | FLAG_ID_BITS EQU 07H ;; mask to isolate flag id in IFF, ANDF | ||
| 137 | NUM_COMMANDS EQU 0CH ;; number of commands | ||
| 138 | ;; | ||
| 139 | IFF_COMMAND EQU 00H ;; | ||
| 140 | ANDF_COMMAND EQU 10H ;; | ||
| 141 | ELSEF_COMMAND EQU 20H ;; | ||
| 142 | ENDIFF_COMMAND EQU 30H ;; | ||
| 143 | XLATT_COMMAND EQU 40H ;; | ||
| 144 | OPTION_COMMAND EQU 50H ;; | ||
| 145 | SET_FLAG_COMMAND EQU 60H ;; | ||
| 146 | PUT_ERROR_COMMAND EQU 70H ;; | ||
| 147 | IFKBD_COMMAND EQU 80H ;; | ||
| 148 | GOTO_COMMAND EQU 90H ;; | ||
| 149 | BEEP_COMMAND EQU 0A0H ;; | ||
| 150 | RESET_NLS_COMMAND EQU 0B0H ;; | ||
| 151 | CHECK_CORE_COMMAND EQU 0C0H ;; | ||
| 152 | ;; | ||
| 153 | ;; | ||
| 154 | EXIT_INT_9_FLAG EQU 01H ;; Special forms of GOTO. These | ||
| 155 | EXIT_STATE_LOGIC_FLAG EQU 02H ;; values are in the right nibble | ||
| 156 | ;; of the GOTO command. | ||
| 157 | ;; | ||
| 158 | ;; PROCESSING OPTIONS: | ||
| 159 | EXIT_IF_FOUND EQU 80H ;; exit INT 9 if a translation | ||
| 160 | ;; match is found | ||
| 161 | ;; | ||
| 162 | ANY_KB EQU 0FFFFH ;; | ||
| 163 | JR_KB EQU 8000H ;; Keyboard types | ||
| 164 | XT_KB EQU 4000H ;; | ||
| 165 | AT_KB EQU 2000H ;; | ||
| 166 | G_KB EQU 1000H ;; | ||
| 167 | P_KB EQU 0800H ;; | ||
| 168 | P12_KB EQU 0400H ;; | ||
| 169 | ;; | ||
| 170 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 171 | ;; Translate Table Sections. Both the Specific and Common | ||
| 172 | ;; Translate Sections are formatted as follows. | ||
| 173 | ;; | ||
| 174 | ;; The Specific Translate Sections are chained together using the | ||
| 175 | ;; XS_NEXT_SECT_PTR field (-1 if last section). | ||
| 176 | ;; Translate Sections contains multiple States. | ||
| 177 | ;; A State contains the translate tables for a single | ||
| 178 | ;; shift state (IE lower case, upper case ....) | ||
| 179 | ;; Each State may contain multiple translate tables. | ||
| 180 | ;; | ||
| 181 | ;; The Translate Section layout is defined using several STRUCs. | ||
| 182 | ;; These STRUCs are allocated in the Shared Data Area as follows: | ||
| 183 | ;; | ||
| 184 | ;; XLAT_SECT_STR ; header info for the section | ||
| 185 | ;; STATE_STR ; header for state #1 | ||
| 186 | ;; XLAT_STR ; first translate tab for state #1 | ||
| 187 | ;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR | ||
| 188 | ;; XLAT_STR ; second translate tab | ||
| 189 | ;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR | ||
| 190 | ;; ... | ||
| 191 | ;; STATE_STR ; header for state #2 | ||
| 192 | ;; XLAT_STR | ||
| 193 | ;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR | ||
| 194 | ;; ... | ||
| 195 | ;; ... | ||
| 196 | ;; | ||
| 197 | ;; A State may contain a "Set_Flag" table instead of translate tables. | ||
| 198 | ;; These tables are used to set the NLS flags instead of generating | ||
| 199 | ;; ASCII codes (for example: to remember dead key states). | ||
| 200 | ;; There can be only on Set_Flag table per state. | ||
| 201 | ;; The Set_Flag table layout is defined in the SET_FLAG_STR STRUC. | ||
| 202 | ;; | ||
| 203 | ;; So some states will contain translate tables (to generate ASCII codes) | ||
| 204 | ;; and some states will contain a Set_Flag table (to record dead key | ||
| 205 | ;; status). | ||
| 206 | ;; | ||
| 207 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 208 | ;; | ||
| 209 | XLAT_SECT_STR STRUC ;; | ||
| 210 | ;; | ||
| 211 | XS_NEXT_SECT_PTR DW ? ;; Pointer to next Specific Translate | ||
| 212 | ;; Section | ||
| 213 | XS_CP_ID DW ? ;; code page id | ||
| 214 | XS_FIRST_STATE DB ? ;; | ||
| 215 | ;; | ||
| 216 | XLAT_SECT_STR ENDS ;; | ||
| 217 | ;; | ||
| 218 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 219 | ;; State structure. | ||
| 220 | ;; The last State is a null State containing only the | ||
| 221 | ;; XS_STATE_LEN field with a value of 0. | ||
| 222 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 223 | ;; | ||
| 224 | STATE_STR STRUC ;; | ||
| 225 | ;; | ||
| 226 | XS_STATE_LEN DW ? ;; length of state section | ||
| 227 | XS_STATE_ID DB ? ;; State ID | ||
| 228 | XS_KBD_TYPE DW ? ;; Keyboard Type | ||
| 229 | XS_ERROR_CHAR DW ? ;; Buffer entry for error character | ||
| 230 | XS_FIRST_TAB DB ? ;; | ||
| 231 | ;; | ||
| 232 | STATE_STR ENDS ;; | ||
| 233 | ;; | ||
| 234 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 235 | ;; Translate Table structures. | ||
| 236 | ;; There may be many translate tables in a State. The last | ||
| 237 | ;; table is a null table containing only the XLAT_TAB_SIZE field with | ||
| 238 | ;; a value of 0. | ||
| 239 | ;; The xlate table can be in one of two forms: | ||
| 240 | ;; Type 1 = Table contains buffer entries only. | ||
| 241 | ;; Scan code is used as an index into xlat table | ||
| 242 | ;; Type 2 = Table contains pairs of SCAN/BUFFER_ENTRY. | ||
| 243 | ;; Table must be searched for matching scan. | ||
| 244 | ;; Type 1 is the default. Type 2 tables should be identified by setting | ||
| 245 | ;; the TYPE_2_TAB bit in XLAT_OPTIONS. | ||
| 246 | ;; Buffer entries default to 2-bytes per entry. | ||
| 247 | ;; Optionally the table may contain ASCII codes only | ||
| 248 | ;; (1-byte entries). This is specified by setting the ASCII_ONLY bit | ||
| 249 | ;; in XLAT_OPTIONS. 2-byte buffer entries are coded ASCII,SCAN. | ||
| 250 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 251 | ;; | ||
| 252 | ;; Translate options: | ||
| 253 | ASCII_ONLY EQU 80H ;; Only ASCII codes listed - use | ||
| 254 | ;; incoming scan for buffer entry | ||
| 255 | TYPE_2_TAB EQU 40H ;; search xlat table for matching scan | ||
| 256 | ZERO_SCAN EQU 20H ;; set the scan half of the buffer | ||
| 257 | ;; entry to 0 | ||
| 258 | ;; | ||
| 259 | NULL_ASCII_CODE EQU -1 ;; | ||
| 260 | ;; | ||
| 261 | DEFAULT_TAB_2_ENT_SZ EQU 3 ;; | ||
| 262 | ASC_ONLY_TAB_2_ENT_SZ EQU 2 ;; | ||
| 263 | ;; | ||
| 264 | ;; | ||
| 265 | XLAT_STR STRUC ;; | ||
| 266 | ;; | ||
| 267 | XLAT_TAB_SIZE DW ? ;; Size in bytes of this table - | ||
| 268 | ;; includes this field, options etc. | ||
| 269 | XLAT_OPTIONS DB ? ;; xlat options | ||
| 270 | ;; XLAT TABLE IS HERE | ||
| 271 | XLAT_STR ENDS ;; | ||
| 272 | ;; | ||
| 273 | XLAT_TYPE_1_STR STRUC ;; use scan code as index into table | ||
| 274 | DB TYPE XLAT_STR DUP(?) ;; filler | ||
| 275 | XLAT_SCAN_LO DB ? ;; Scan code | ||
| 276 | XLAT_SCAN_HI DB ? ;; range | ||
| 277 | XLAT_1_BUF_ENTRY DB ? ;; The table itself | ||
| 278 | XLAT_TYPE_1_STR ENDS ;; | ||
| 279 | ;; | ||
| 280 | XLAT_TYPE_2_STR STRUC ;; search table for scan | ||
| 281 | DB TYPE XLAT_STR DUP(?) ;; filler | ||
| 282 | XLAT_NUM DB ? ;; number of scans | ||
| 283 | XLAT_SCAN DB ? ;; Scan code | ||
| 284 | XLAT_2_BUF_ENTRY DB ? ;; The table itself | ||
| 285 | XLAT_TYPE_2_STR ENDS ;; | ||
| 286 | ;; | ||
| 287 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 288 | ;; Set_Flag Tables. | ||
| 289 | ;; State Sections immediately following the LAST_ENTRYs. | ||
| 290 | ;; Dead key definitions. If the scan matches then | ||
| 291 | ;; set the bit in NLS_FLAGs indicated in DK_MASK | ||
| 292 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 293 | ;; | ||
| 294 | SF_ENT_SZ EQU 3 ;; size of entry | ||
| 295 | ;; | ||
| 296 | SET_FLAG_STR STRUC ;; | ||
| 297 | ;; | ||
| 298 | SF_NUM DB 0 ;; Number of entries | ||
| 299 | SF_SCAN_CODE DB 0 ;; scan code | ||
| 300 | SF_FLAG_ID DB 0 ;; flag id | ||
| 301 | SF_FLAG_MASK DB 0 ;; flag mask | ||
| 302 | ;; | ||
| 303 | SET_FLAG_STR ENDS ;; | ||
| 304 | ;; | ||
| 305 | ;; | ||
| 306 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 307 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBSYS.INC b/v4.0/src/CMD/KEYB/KEYBSYS.INC new file mode 100644 index 0000000..4b42fbe --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBSYS.INC | |||
| @@ -0,0 +1,137 @@ | |||
| 1 | .XLIST | ||
| 2 | |||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; DOS - NLS Support - KEYB Command | ||
| 5 | ;; (C) Copyright 1988 Microsoft | ||
| 6 | ;; | ||
| 7 | ;; File Name: KEYBSYS.INC | ||
| 8 | ;; ---------- | ||
| 9 | ;; | ||
| 10 | ;; Root File Name: KEYB.ASM | ||
| 11 | ;; --------------- | ||
| 12 | ;; | ||
| 13 | ;; Description: | ||
| 14 | ;; ------------ | ||
| 15 | ;; Include file containing structure definitions and equates | ||
| 16 | ;; for the KEYBOARD.SYS file. | ||
| 17 | ;; | ||
| 18 | ;; Change History: | ||
| 19 | ;; --------------- | ||
| 20 | ;; | ||
| 21 | ;; | ||
| 22 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 23 | ;; | ||
| 24 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 25 | ;; File header - contains pointers to keyboard tables for each language | ||
| 26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 27 | ;; | ||
| 28 | KEYBSYS_HEADER STRUC ;; | ||
| 29 | ;; | ||
| 30 | KH_SIGNATURE DB 0FFh,'KEYB ' ;; signature | ||
| 31 | KH_RESV_1 DB 8 DUP(0) ;; reserved | ||
| 32 | KH_MAX_COM_SZ DW 0 ;AN000;**chg ;; maximum size of Common Xlat Sect | ||
| 33 | KH_MAX_SPEC_SZ DW 0 ;AN000;;**chg ;; max size of Specific Xlat Sect | ||
| 34 | KH_MAX_LOGIC_SZ DW 0 ;AN000;;**chg ;; max size of State Logic | ||
| 35 | KH_RESV_2 Dw 0 ;AN000;;**chg ;; reserved CNS | ||
| 36 | KH_NUM_ID Dw 0 ;AN000;;; ************* CNS | ||
| 37 | KH_NUM_LANG DW 0 ;; number of languages | ||
| 38 | KH_LANG_PTRS DB 0 ;; language pointers start here | ||
| 39 | ;********************* CNS ********************** | ||
| 40 | ;KH_NUM_ID DW 0 ;; number of languages | ||
| 41 | ;KH_ID_PTRS DB 0 ;; id pointers start here | ||
| 42 | ;********************* CNS ********************** | ||
| 43 | KEYBSYS_HEADER ENDS ;; | ||
| 44 | ;******************CNS******************* | ||
| 45 | KEYBSYS_ID_PTRS STRUC | ||
| 46 | |||
| 47 | KP_ID_CODE DW 0 ;AN000; | ||
| 48 | KP_LANG_PTR DD 0 ;AN000; | ||
| 49 | |||
| 50 | KEYBSYS_ID_PTRS ENDS | ||
| 51 | ;; | ||
| 52 | ;*****************CNS******************** | ||
| 53 | KEYBSYS_LANG_PTRS STRUC ;; | ||
| 54 | ;; Next two entries repeat: | ||
| 55 | KP_LANG_CODE DW 0 ;; language code | ||
| 56 | KP_ENTRY_PTR DD 0 ;; language entry pointer | ||
| 57 | ;; | ||
| 58 | KEYBSYS_LANG_PTRS ENDS ;; | ||
| 59 | ;; | ||
| 60 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 61 | ;; Language Entry - pointed to by KH_ENTRY_PTR in KEYBSYS_HEADER | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | KEYBSYS_LANG_ENTRY STRUC ;; | ||
| 65 | ;; | ||
| 66 | KL_LANG_CODE DW 'XX' ;; language code | ||
| 67 | KL_ID_CODE DW 0 ;; reserved (ID CODE) | ||
| 68 | KL_LOGIC_PTR DD 0 ;AC000;;**chg ;; State Logic pointer | ||
| 69 | KL_NUM_ID DB 0 ;AN000;;CNS ;; number of valid IDs for this lang | ||
| 70 | KL_NUM_CP DB 0 ;; number of valid CPs for this lang | ||
| 71 | KL_CP_PTRS DB 0 ;; CP table pointers start here | ||
| 72 | ;; | ||
| 73 | KEYBSYS_LANG_ENTRY ENDS ;; | ||
| 74 | ;; | ||
| 75 | KEYBSYS_CP_PTRS STRUC ;; | ||
| 76 | ;; Next two entries repeat: | ||
| 77 | KC_CODE_PAGE DW 0 ;; code page | ||
| 78 | KC_ENTRY_PTR DD 0 ;; ptr to Specific Translate Section | ||
| 79 | ;; | ||
| 80 | KEYBSYS_CP_PTRS ENDS ;; | ||
| 81 | ;; | ||
| 82 | ;; | ||
| 83 | ;; Everything from here down is new | ||
| 84 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 85 | ;; State Logic - pointed to by KL_LOGIC_PTR in KEYBSYS_LANG_ENTRY | ||
| 86 | ;; Common Translate Section follows immediately after the State Logic. | ||
| 87 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 88 | ;; | ||
| 89 | KEYBSYS_STATE_LOGIC STRUC ;; | ||
| 90 | ;; | ||
| 91 | KT_LOGIC_LEN DW ? ;; length of state logic | ||
| 92 | KT_SPECIAL_FEATURES DW ? ;; Special Features (see KEYBSHAR.INC) | ||
| 93 | KT_LOGIC_CMDS DB 0 ;; state logic commands begin here | ||
| 94 | ;; | ||
| 95 | KEYBSYS_STATE_LOGIC ENDS ;; | ||
| 96 | ;; | ||
| 97 | ;; | ||
| 98 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 99 | ;; Translate Section - Common and Specific Translate Sections | ||
| 100 | ;; are both in this form. | ||
| 101 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 102 | ;; | ||
| 103 | KEYBSYS_XLAT_SECT STRUC ;; | ||
| 104 | ;; | ||
| 105 | KX_SECTION_LEN DW ? ;; Length of this section | ||
| 106 | KX_CP_ID DW ? ;; code page id | ||
| 107 | KX_FIRST_STATE DB ? ;; | ||
| 108 | ;; | ||
| 109 | KEYBSYS_XLAT_SECT ENDS ;; | ||
| 110 | ;; | ||
| 111 | ;; | ||
| 112 | KEYBSYS_STATE STRUC ;; | ||
| 113 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 114 | ;; Translate Sections contains multiple States. | ||
| 115 | ;; A State contains the translate tables for a single | ||
| 116 | ;; shift state (IE lower case, upper case ....) | ||
| 117 | ;; The last State is a null State containing only the | ||
| 118 | ;; KX_STATE_LEN field with a value of 0. | ||
| 119 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 120 | KX_STATE_LEN DW ? ;; length of state section | ||
| 121 | KX_STATE_ID DB ? ;; State ID | ||
| 122 | KX_KBD_TYPE DW ? ;; Keyboard Type | ||
| 123 | KX_ERROR_CHAR DW ? ;; Buffer entry for error character | ||
| 124 | KX_FIRST_XLAT DB ? ;; XLAT tables begin here | ||
| 125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 126 | ;; Each State consists of multiple translate tables. | ||
| 127 | ;; The last translate table within a state is a null | ||
| 128 | ;; table containing only the | ||
| 129 | ;; KX_XLAT_LEN field with a value of 0. | ||
| 130 | ;; Refer to KEYBSHAR.INC for translate table format. | ||
| 131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 132 | ;; | ||
| 133 | KEYBSYS_STATE ENDS ;; | ||
| 134 | ;; | ||
| 135 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 136 | .LIST | ||
| 137 | |||
diff --git a/v4.0/src/CMD/KEYB/KEYBTBBL.ASM b/v4.0/src/CMD/KEYB/KEYBTBBL.ASM new file mode 100644 index 0000000..b28f08c --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBTBBL.ASM | |||
| @@ -0,0 +1,855 @@ | |||
| 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: KEYBTBBL.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Build SHARED_DATA_AREA with parameters specified | ||
| 15 | ;; in KEYBCMD.ASM | ||
| 16 | ;; | ||
| 17 | ;; Documentation Reference: | ||
| 18 | ;; ------------------------ | ||
| 19 | ;; None | ||
| 20 | ;; | ||
| 21 | ;; Procedures Contained in This File: | ||
| 22 | ;; ---------------------------------- | ||
| 23 | ;; TABLE_BUILD: Build the header sections of the SHARED_DATA_AREA | ||
| 24 | ;; STATE_BUILD: Build the state sections in the table area | ||
| 25 | ;; FIND_CP_TABLE: Given the language and code page parm, determine the | ||
| 26 | ;; offset of the code page table in KEYBOARD.SYS | ||
| 27 | ;; | ||
| 28 | ;; Include Files Required: | ||
| 29 | ;; ----------------------- | ||
| 30 | ;; KEYBSHAR.INC | ||
| 31 | ;; KEYBSYS.INC | ||
| 32 | ;; KEYBDCL.INC | ||
| 33 | ;; KEYBI2F.INC | ||
| 34 | ;; | ||
| 35 | ;; External Procedure References: | ||
| 36 | ;; ------------------------------ | ||
| 37 | ;; None | ||
| 38 | ;; | ||
| 39 | ;; Change History: | ||
| 40 | ;; --------------- | ||
| 41 | ;; | ||
| 42 | ;; | ||
| 43 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 44 | ;; | ||
| 45 | PUBLIC TABLE_BUILD ;; | ||
| 46 | PUBLIC FIND_CP_TABLE ;; | ||
| 47 | PUBLIC CPN_INVALID ;; | ||
| 48 | PUBLIC SD_LENGTH ;; | ||
| 49 | ;; | ||
| 50 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 51 | ;; | ||
| 52 | INCLUDE KEYBEQU.INC ;; | ||
| 53 | INCLUDE KEYBSHAR.INC ;; | ||
| 54 | INCLUDE KEYBSYS.INC ;; | ||
| 55 | INCLUDE KEYBCMD.INC ;; | ||
| 56 | INCLUDE KEYBDCL.INC ;; | ||
| 57 | INCLUDE COMMSUBS.INC ;; | ||
| 58 | INCLUDE KEYBCPSD.INC ;; | ||
| 59 | ;; | ||
| 60 | ASSUME CS:CODE,DS:CODE ;; | ||
| 61 | ;; | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | ;; Module: TABLE_BUILD | ||
| 65 | ;; | ||
| 66 | ;; Description: | ||
| 67 | ;; Create the table area within the shared data structure. Each | ||
| 68 | ;; table is made up of a descriptor plus the state sections. | ||
| 69 | ;; Translate tables are found in the Keyboard definition file and are | ||
| 70 | ;; copied into the shared data area by means of the STATE_BUILD | ||
| 71 | ;; routine. | ||
| 72 | ;; | ||
| 73 | ;; Input Registers: | ||
| 74 | ;; DS - points to our data segment | ||
| 75 | ;; ES - points to our data segment | ||
| 76 | ;; BP - points at beginning of CMD_PARM_LIST | ||
| 77 | ;; | ||
| 78 | ;; SHARED_DATA_STR must be allocated in memory | ||
| 79 | ;; | ||
| 80 | ;; The following variables must also be passed from KEYB_COMMAND | ||
| 81 | ;; KEYBSYS_FILE_HANDLE is set to file handle after opening file | ||
| 82 | ;; CP_TAB_OFFSET is the offset of the CP table in the SHARED_DATA_AREA | ||
| 83 | ;; STATE_LOGIC_OFFSET is the offset of the state section in the SHARED_DATA_AREA | ||
| 84 | ;; SYS_CODE_PAGE is the binary representation of the system CP | ||
| 85 | ;; KEYBCMD_LANG_ENTRY_PTR is a pointer to the lang entry in KEY DEF file | ||
| 86 | ;; DESIG_CP_BUFFER is the buffer which holds a list of designated CPs | ||
| 87 | ;; DESIG_CP_OFFSET:WORD is the offset of that list | ||
| 88 | ;; NUM_DESIG_CP is the number of CPs designated | ||
| 89 | ;; FILE_BUFFER is the buffer to read in the KEY DEF file | ||
| 90 | ;**********CNS *************************************** | ||
| 91 | ;; ID_PTR_SIZE is the size of the ID ptr structure | ||
| 92 | ;**********CNS *************************************** | ||
| 93 | ;; LANG_PTR_SIZE is the size of the lang ptr structure | ||
| 94 | ;; CP_PTR_SIZE is the size of the CP ptr structure | ||
| 95 | ;; NUM_CP is the number of CPs in the KEYB DEF file for that lang | ||
| 96 | ;; SHARED_AREA_PTR segment and offset of the SHARED_DATA_AREA | ||
| 97 | ;; | ||
| 98 | ;; | ||
| 99 | ;; Output Registers: | ||
| 100 | ;; CX - RETURN_CODE := 0 - Table build successful | ||
| 101 | ;; 1 - Table build unsuccessful - ERROR 1 | ||
| 102 | ;; (Invalid language parm) | ||
| 103 | ;; 2 - Table build unsuccessful - ERROR 2 | ||
| 104 | ;; (Invalid Code Page parm) | ||
| 105 | ;; 3 - Table build unsuccessful - ERROR 3 | ||
| 106 | ;; (Machine type unavaliable) | ||
| 107 | ;; 4 - Table build unsuccessful - ERROR 4 | ||
| 108 | ;; (Bad or missing keyboard def file) | ||
| 109 | ;; 5 - Table build unsuccessful - ERROR 5 | ||
| 110 | ;; (Memory overflow occurred) | ||
| 111 | ;; Logic: | ||
| 112 | ;; Calculate Offset difference between TEMP and SHARED_DATA_AREAs | ||
| 113 | ;; Get LANGUAGE_PARM and CODE_PAGE_PARM from parm list | ||
| 114 | ;; Call FIND_CP_TABLE := Determine whether CP is valid for given language | ||
| 115 | ;; IF CP is valid THEN | ||
| 116 | ;; Store them in the SHARED_DATA_AREA | ||
| 117 | ;; Prepare to read Keyboard definition file by LSEEKing to the top | ||
| 118 | ;; READ the header | ||
| 119 | ;; Store maximum table values for calculation of RES_END | ||
| 120 | ;; Set DI to point at TABLE_AREA within SHARED_DATA_AREA | ||
| 121 | ;; FOR the state logic section of the specified language: | ||
| 122 | ;; IF STATE_LOGIC_PTR is not -1 THEN | ||
| 123 | ;; LSEEK to state logic section in keyboard definition file | ||
| 124 | ;; READ the state logic section into the TABLE_AREA | ||
| 125 | ;; Set the hot keyb scan codes | ||
| 126 | ;; Set the LOGIC_PTR in the header | ||
| 127 | ;; FOR the common translate section: | ||
| 128 | ;; IF Length parameter is not 0 THEN | ||
| 129 | ;; Build state | ||
| 130 | ;; Set the COMMON_XLAT_PTR in the header | ||
| 131 | ;; FOR the specific translate sections: | ||
| 132 | ;; Establish addressibility to list of designated code pages | ||
| 133 | ;; FOR each code page | ||
| 134 | ;; IF CP_ENTRY_PTR is not -1 THEN | ||
| 135 | ;; Determine offset of CP table in Keyb Def file | ||
| 136 | ;; IF CP table not avaliable THEN | ||
| 137 | ;; Set CPN_INVALID flag | ||
| 138 | ;; ELSE | ||
| 139 | ;; LSEEK to CPn state section in keyboard definition file | ||
| 140 | ;; IF this is the invoked code page THEN | ||
| 141 | ;; Set ACTIVE_XLAT_PTR in SHARED_DATA_AREA | ||
| 142 | ;; Update RESIDENT_END ptr | ||
| 143 | ;; Build state | ||
| 144 | ;; Update RESIDENT_END ptr | ||
| 145 | ;; End | ||
| 146 | ;; | ||
| 147 | ;; | ||
| 148 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 149 | ;; | ||
| 150 | FB EQU FILE_BUFFER ;; | ||
| 151 | KB_MASK EQU 02H ;; | ||
| 152 | ;; | ||
| 153 | FIRST_XLAT_TAB DW 0 ;; | ||
| 154 | NEXT_SECT_PTR DW -1 ;; | ||
| 155 | ;; | ||
| 156 | MAX_COM_SIZE DW ? ;; | ||
| 157 | MAX_SPEC_SIZE DW ? ;; | ||
| 158 | MAX_LOGIC_SIZE DW ? ;; | ||
| 159 | ;; | ||
| 160 | RESIDENT_END_ACC DW 0 ;; | ||
| 161 | SA_HEADER_SIZE DW SIZE SHARED_DATA_STR;; | ||
| 162 | PARM_LIST_OFFSET DW ? ;; | ||
| 163 | ;********************CNS************************* | ||
| 164 | TB_ID_PARM DW 0 | ||
| 165 | ;********************CNS************************* | ||
| 166 | TB_LANGUAGE_PARM DW 0 ;; | ||
| 167 | TB_CODE_PAGE_PARM DW 0 ;; | ||
| 168 | ;; | ||
| 169 | CPN_INVALID DW 0 ;; | ||
| 170 | ;; | ||
| 171 | KEYB_INSTALLED DW 0 ;; | ||
| 172 | SD_AREA_DIFFERENCE DW 0 ;; | ||
| 173 | SD_LENGTH DW 2000 ;; | ||
| 174 | ;; | ||
| 175 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 176 | ;; Program Code | ||
| 177 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 178 | ;; | ||
| 179 | TABLE_BUILD PROC NEAR ;; | ||
| 180 | ;; | ||
| 181 | MOV AX,OFFSET SD_SOURCE_PTR ;; Setup the difference | ||
| 182 | SUB AX,OFFSET SD_DEST_PTR ;; value used to calculate | ||
| 183 | MOV SD_AREA_DIFFERENCE,AX ;; new ptr values for | ||
| 184 | ;; SHARED_DATA_AREA | ||
| 185 | MOV AX,[BP].ID_PARM ;; WGR Get id parameter ;AN000 | ||
| 186 | MOV TB_ID_PARM,AX ;; WGR ;AN000 | ||
| 187 | MOV AX,[BP].LANGUAGE_PARM ;; Get language parameter | ||
| 188 | MOV TB_LANGUAGE_PARM,AX ;; | ||
| 189 | MOV BX,[BP].CODE_PAGE_PARM ;; Get code page parameter | ||
| 190 | MOV TB_CODE_PAGE_PARM,BX ;; | ||
| 191 | ;; Make sure code page is | ||
| 192 | CALL FIND_CP_TABLE ;; valid for the language | ||
| 193 | CMP CX,0 ;; Test return codes | ||
| 194 | JE TB_CHECK_CONTINUE1 ;; IF code page is found | ||
| 195 | JMP TB_ERROR6 ;; for language THEN | ||
| 196 | ;; | ||
| 197 | TB_CHECK_CONTINUE1: ;;;;;;;; | ||
| 198 | MOV BP,OFFSET SD_SOURCE_PTR ;; Put language parm and ;AN000 | ||
| 199 | MOV AX,TB_ID_PARM ;; WGR id parm and.. ;AN000 | ||
| 200 | MOV ES:[BP].INVOKED_KBD_ID,AX ;; WGR | ||
| 201 | MOV BX,TB_CODE_PAGE_PARM ;; | ||
| 202 | MOV ES:[BP].INVOKED_CP_TABLE,BX ;;;;;; code page parm into the | ||
| 203 | MOV AX,TB_LANGUAGE_PARM ;; SHARED_DATA_AREA | ||
| 204 | MOV WORD PTR ES:[BP].ACTIVE_LANGUAGE,AX ;; | ||
| 205 | ;; | ||
| 206 | MOV BX,KEYBSYS_FILE_HANDLE ;;;;;;;;;;;;;;; Get handle | ||
| 207 | XOR DX,DX ;; LSEEK file pointer | ||
| 208 | XOR CX,CX ;; back to top of file | ||
| 209 | MOV AH,42H ;; | ||
| 210 | MOV AL,0 ;; If no problem with | ||
| 211 | INT 21H ;; Keyboard Def file THEN | ||
| 212 | JNC TB_START ;; | ||
| 213 | JMP TB_ERROR4 ;; | ||
| 214 | ;; | ||
| 215 | TB_START: ;; Else | ||
| 216 | XOR DI,DI ;; Set number | ||
| 217 | LEA CX,[DI].KH_MAX_LOGIC_SZ+2;; bytes to read header | ||
| 218 | MOV DX,OFFSET FILE_BUFFER ;; Move contents into file buffer | ||
| 219 | MOV AH,3FH ;; READ | ||
| 220 | PUSH CS ;; | ||
| 221 | POP DS ;; | ||
| 222 | INT 21H ;; File | ||
| 223 | JNC TB_CONTINUE1 ;; | ||
| 224 | JMP TB_ERROR4 ;; | ||
| 225 | ;; | ||
| 226 | TB_CONTINUE1: ;; | ||
| 227 | CMP CX,AX ;; | ||
| 228 | JE TB_ERROR_CHECK1 ;; | ||
| 229 | MOV CX,4 ;; | ||
| 230 | JMP TB_CPN_INVALID ;; | ||
| 231 | ;; | ||
| 232 | TB_ERROR_CHECK1: ;; | ||
| 233 | MOV CX,FB.KH_MAX_COM_SZ ;; Save values for RESIDENT_END | ||
| 234 | MOV MAX_COM_SIZE,CX ;; calculation | ||
| 235 | MOV CX,FB.KH_MAX_SPEC_SZ ;; | ||
| 236 | MOV MAX_SPEC_SIZE,CX ;; | ||
| 237 | MOV CX,FB.KH_MAX_LOGIC_SZ ;; | ||
| 238 | MOV MAX_LOGIC_SIZE,CX ;; | ||
| 239 | ;; | ||
| 240 | LEA DI,[BP].TABLE_AREA ;; Point at beginning of table area | ||
| 241 | ;; DI ---> TABLE_AREA | ||
| 242 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 243 | ;; ** FOR STATE LOGIC SECTION FOR LANG ** | ||
| 244 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 245 | ;; | ||
| 246 | TB_STATE_BEGIN: ;; | ||
| 247 | MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle | ||
| 248 | MOV CX,WORD PTR STATE_LOGIC_OFFSET+2 ;; | ||
| 249 | MOV DX,WORD PTR STATE_LOGIC_OFFSET ;; Get LSEEK file pointer | ||
| 250 | ;; | ||
| 251 | CMP DX,-1 ;;;;;;;;;; If no language table then | ||
| 252 | JNE TB_STATE_CONTINUE1 ;; jump to code page begin | ||
| 253 | JMP TB_CP_BEGIN ;; | ||
| 254 | ;; | ||
| 255 | TB_STATE_CONTINUE1: ;; Else | ||
| 256 | MOV AH,42H ;; LSEEK to beginning of state logic sect | ||
| 257 | MOV AL,0 ;; If no problem with | ||
| 258 | INT 21H ;; Keyboard Def file THEN | ||
| 259 | JNC TB_STATE_CONTINUE2 ;; | ||
| 260 | JMP TB_ERROR4 ;; | ||
| 261 | ;;;;;;;;;; | ||
| 262 | TB_STATE_CONTINUE2: ;; | ||
| 263 | MOV DX,AX ;; | ||
| 264 | MOV WORD PTR SB_STATE_OFFSET+2,CX ;; Save the offset of the | ||
| 265 | MOV WORD PTR SB_STATE_OFFSET,DX ;; states in Keyb Def file | ||
| 266 | ;; | ||
| 267 | SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 268 | MOV ES:[BP].LOGIC_PTR,DI ;;;;;;;;;; Set because this is state | ||
| 269 | ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 270 | ;; | ||
| 271 | MOV CX,4 ;; Set number bytes to read length and | ||
| 272 | ;; special features | ||
| 273 | MOV DX,OFFSET FILE_BUFFER ;; Set the buffer address | ||
| 274 | MOV AH,3FH ;; Read from the Keyb Def file | ||
| 275 | INT 21H ;; | ||
| 276 | JNC TB_STATE_CONTINUE3 ;; | ||
| 277 | JMP TB_ERROR4 ;; | ||
| 278 | ;; | ||
| 279 | TB_STATE_CONTINUE3: ;; | ||
| 280 | CMP CX,AX ;; | ||
| 281 | JE TB_ERROR_CHECK2 ;; | ||
| 282 | MOV CX,4 ;; | ||
| 283 | JMP TB_CPN_INVALID ;; | ||
| 284 | ;;;;; | ||
| 285 | TB_ERROR_CHECK2: ;; | ||
| 286 | MOV AX,FB.KT_SPECIAL_FEATURES ;; Save the special features in the | ||
| 287 | MOV ES:[BP].SPECIAL_FEATURES,AX ;; SHARED_DATA_AREA | ||
| 288 | ;; | ||
| 289 | CMP HW_TYPE,JR_KB ;;;;;;;; | ||
| 290 | JNE USE_F1_F2 ;; | ||
| 291 | TEST AX,JR_HOT_KEY_1_2 ;; | ||
| 292 | JZ USE_F1_F2 ;; | ||
| 293 | MOV ES:[BP].HOT_KEY_ON_SCAN,ONE_SCAN ;; | ||
| 294 | MOV ES:[BP].HOT_KEY_OFF_SCAN,TWO_SCAN ;; | ||
| 295 | JMP HOT_KEY_SET ;; | ||
| 296 | ;; | ||
| 297 | USE_F1_F2: ;; | ||
| 298 | MOV ES:[BP].HOT_KEY_ON_SCAN,F1_SCAN ;; | ||
| 299 | MOV ES:[BP].HOT_KEY_OFF_SCAN,F2_SCAN ;; | ||
| 300 | ;; | ||
| 301 | HOT_KEY_SET: ;;;;;;;; | ||
| 302 | MOV CX,FB.KT_LOGIC_LEN ;; Set length of section to read | ||
| 303 | CMP CX,0 ;; | ||
| 304 | JNE TB_STATE_CONTINUE4 ;; | ||
| 305 | MOV CX,-1 ;;;;; | ||
| 306 | MOV ES:[BP].LOGIC_PTR,CX ;; | ||
| 307 | JMP SB_COMM_BEGIN ;; | ||
| 308 | ;; | ||
| 309 | TB_STATE_CONTINUE4: ;; | ||
| 310 | MOV ES:[DI],CX ;; Store length parameter in | ||
| 311 | ADD DI,2 ;; SHARED_DATA_AREA | ||
| 312 | MOV CX,FB.KT_SPECIAL_FEATURES;; Save the special features | ||
| 313 | MOV ES:[DI],CX ;; | ||
| 314 | ADD DI,2 ;; | ||
| 315 | MOV CX,FB.KT_LOGIC_LEN ;; Set length of section to read | ||
| 316 | SUB CX,4 ;; Adjust for what we have already read | ||
| 317 | MOV DX,DI ;; Set the address of SHARED_DATA_AREA | ||
| 318 | PUSH ES ;; | ||
| 319 | POP DS ;; | ||
| 320 | MOV AH,3FH ;; Read logic section from the | ||
| 321 | INT 21H ;; Keyb Def file | ||
| 322 | PUSH CS ;; | ||
| 323 | POP DS ;; | ||
| 324 | JNC TB_STATE_CONTINUE5 ;; | ||
| 325 | JMP TB_ERROR4 ;; | ||
| 326 | ;; | ||
| 327 | TB_STATE_CONTINUE5: ;; | ||
| 328 | CMP CX,AX ;; | ||
| 329 | JE TB_ERROR_CHECK3 ;; | ||
| 330 | MOV CX,4 ;; | ||
| 331 | JMP TB_CPN_INVALID ;; | ||
| 332 | ;; | ||
| 333 | TB_ERROR_CHECK3: ;; | ||
| 334 | ADD DI,CX ;; Set DI at new beginning of area | ||
| 335 | ;; TABLE_AREA | ||
| 336 | ;; STATE_LOGIC | ||
| 337 | MOV CX,RESIDENT_END_ACC ;; DI ---> | ||
| 338 | ADD CX,SA_HEADER_SIZE ;; | ||
| 339 | ADD CX,MAX_LOGIC_SIZE ;; | ||
| 340 | MOV RESIDENT_END_ACC,CX ;; Refresh resident end size | ||
| 341 | ;; | ||
| 342 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 343 | ;; ** FOR COMMON TRANSLATE SECTION FOR LANG ** | ||
| 344 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 345 | ;; | ||
| 346 | SB_COMM_BEGIN: ;; | ||
| 347 | MOV CX,SIZE KEYBSYS_XLAT_SECT-1 ;; Set number bytes to read header | ||
| 348 | MOV DX,DI ;; Set the SHARED_DATA_AREA address | ||
| 349 | PUSH ES ;; | ||
| 350 | POP DS ;; | ||
| 351 | MOV AH,3FH ;; Read from the Keyb Def file | ||
| 352 | INT 21H ;; | ||
| 353 | PUSH CS ;; | ||
| 354 | POP DS ;; | ||
| 355 | JNC TB_STATE_CONTINUE6 ;; | ||
| 356 | JMP TB_ERROR4 ;; | ||
| 357 | ;; | ||
| 358 | TB_STATE_CONTINUE6: ;; | ||
| 359 | MOV CX,ES:[DI].KX_SECTION_LEN;; Set length of section to read | ||
| 360 | CMP CX,0 ;; | ||
| 361 | JNE TB_STATE_CONTINUE7 ;; | ||
| 362 | JMP TB_CP_BEGIN ;; | ||
| 363 | ;;;;;;; | ||
| 364 | TB_STATE_CONTINUE7: ;; | ||
| 365 | MOV CX,WORD PTR SB_STATE_OFFSET ;; Save the offset of the | ||
| 366 | ADD CX,FB.KT_LOGIC_LEN ;; | ||
| 367 | MOV WORD PTR SB_STATE_OFFSET,CX ;; Save the offset of the | ||
| 368 | SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 369 | MOV ES:[BP].COMMON_XLAT_PTR,DI ;; | ||
| 370 | ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 371 | ;;;;;;; | ||
| 372 | CALL STATE_BUILD ;; | ||
| 373 | ;; DI set at new beginning of area | ||
| 374 | ;; TABLE_AREA | ||
| 375 | ;; STATE_LOGIC | ||
| 376 | ;; COMMON_XLAT_SECTION | ||
| 377 | MOV CX,RESIDENT_END_ACC ;; | ||
| 378 | ADD CX,MAX_COM_SIZE ;; | ||
| 379 | MOV RESIDENT_END_ACC,CX ;; Refresh resident end size | ||
| 380 | ;; | ||
| 381 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 382 | ;; FOR ALL DESIGNATED OR INVOKED CODE PAGES | ||
| 383 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 384 | ;; | ||
| 385 | TB_CP_BEGIN: ;; Get the offset to | ||
| 386 | MOV CX,OFFSET DESIG_CP_BUFFER.DESIG_CP_ENTRY ;; the beginning of the | ||
| 387 | MOV DESIG_CP_OFFSET,CX ;; table of designated | ||
| 388 | ;;;;;; code pages | ||
| 389 | TB_CPN_BEGIN: ;; | ||
| 390 | MOV AX,WORD PTR ES:[BP].ACTIVE_LANGUAGE ;; Get the active language | ||
| 391 | MOV CX,NUM_DESIG_CP ;;;;;;;;;;;;;; Get the number of CPs | ||
| 392 | CMP CX,0 ;; IF we have done all requested CPs | ||
| 393 | JNE TB_CPN_VALID1 ;; | ||
| 394 | JMP TB_DONE ;; Then done | ||
| 395 | ;; | ||
| 396 | TB_CPN_VALID1: ;; | ||
| 397 | MOV SI,[DESIG_CP_OFFSET] ;; | ||
| 398 | MOV BX,[SI] ;; Get the CP | ||
| 399 | CMP BX,-1 ;; | ||
| 400 | JNE TB_CPN_CONTINUE1 ;; | ||
| 401 | JMP TB_CPN_REPEAT ;; | ||
| 402 | ;; | ||
| 403 | TB_CPN_CONTINUE1: ;; ELSE | ||
| 404 | PUSH DI ;; | ||
| 405 | CALL FIND_CP_TABLE ;; Find offset of code page table | ||
| 406 | POP DI ;; | ||
| 407 | ;; | ||
| 408 | CMP CX,0 ;; Test return codes | ||
| 409 | JE TB_CPN_VALID ;; IF code page is not found for language | ||
| 410 | MOV CPN_INVALID,CX ;; Set flag and go to next CP | ||
| 411 | JMP TB_CPN_REPEAT ;; Else | ||
| 412 | ;; | ||
| 413 | TB_CPN_VALID: ;;;;;; | ||
| 414 | MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle | ||
| 415 | MOV CX,WORD PTR CP_TAB_OFFSET+2 ;; Get offset of the code page | ||
| 416 | MOV DX,WORD PTR CP_TAB_OFFSET ;; in the Keyb Def file | ||
| 417 | ;; | ||
| 418 | CMP DX,-1 ;;;;;; Test if code page is blank | ||
| 419 | JNE TB_CPN_CONTINUE2 ;; | ||
| 420 | JMP TB_CPN_REPEAT ;; If it is then go get next CP | ||
| 421 | ;; | ||
| 422 | TB_CPN_CONTINUE2: ;; | ||
| 423 | MOV AH,42H ;; LSEEK to table in Keyb Def file | ||
| 424 | MOV AL,0 ;; If no problem with | ||
| 425 | INT 21H ;; Keyb Def file Then | ||
| 426 | JNC TB_CPN_CONTINUE3 ;; | ||
| 427 | JMP TB_ERROR4 ;; | ||
| 428 | ;;;;;;;;;; | ||
| 429 | TB_CPN_CONTINUE3: ;; | ||
| 430 | MOV DX,AX ;; | ||
| 431 | MOV WORD PTR SB_STATE_OFFSET+2,CX ;; Save the offset of the | ||
| 432 | MOV WORD PTR SB_STATE_OFFSET,DX ;; states in Keyb Def file | ||
| 433 | ;; | ||
| 434 | MOV CX,TB_CODE_PAGE_PARM ;;;;; If this code page is the | ||
| 435 | MOV SI,[DESIG_CP_OFFSET] ;; invoked code page | ||
| 436 | CMP CX,[SI] ;; | ||
| 437 | JNE TB_CPN_CONTINUE4 ;; Then | ||
| 438 | ;; | ||
| 439 | SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 440 | MOV ES:[BP].ACTIVE_XLAT_PTR,DI ;; Set active xlat section | ||
| 441 | ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 442 | ;;;;;;; | ||
| 443 | TB_CPN_CONTINUE4: ;; | ||
| 444 | SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 445 | MOV ES:[BP].FIRST_XLAT_PTR,DI;; Set flag | ||
| 446 | ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 447 | ;; | ||
| 448 | TB_CPN_CONTINUE5: ;; | ||
| 449 | CALL STATE_BUILD ;; Build state | ||
| 450 | ;; TABLE_AREA | ||
| 451 | CMP CX,0 ;; COMMON_XLAT_SECTION | ||
| 452 | JE TB_CPN_REPEAT ;; SPECIFIC_XLAT_SECTION(S) | ||
| 453 | JMP TB_ERROR4 ;; DI ---> | ||
| 454 | ;; | ||
| 455 | TB_CPN_REPEAT: ;; | ||
| 456 | MOV CX,RESIDENT_END_ACC ;; | ||
| 457 | ADD CX,MAX_SPEC_SIZE ;; Refresh resident end size | ||
| 458 | MOV RESIDENT_END_ACC,CX ;; | ||
| 459 | ;; | ||
| 460 | MOV CX,DESIG_CP_OFFSET ;; | ||
| 461 | ADD CX,2 ;; Adjust offset to find next code page | ||
| 462 | MOV DESIG_CP_OFFSET,CX ;; | ||
| 463 | ;; | ||
| 464 | MOV CX,NUM_DESIG_CP ;; Adjust the number of code pages left | ||
| 465 | DEC CX ;; | ||
| 466 | MOV NUM_DESIG_CP,CX ;; | ||
| 467 | ;; | ||
| 468 | JMP TB_CPN_BEGIN ;; | ||
| 469 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 470 | ;; | ||
| 471 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 472 | ;; | ||
| 473 | TB_DONE: ;; | ||
| 474 | MOV CX,RESIDENT_END_ACC ;; Set final calculated value | ||
| 475 | ADD CX,BP ;;;;;;;;;;; | ||
| 476 | SUB CX,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 477 | MOV ES,WORD PTR SHARED_AREA_PTR ;; Set segment | ||
| 478 | MOV BP,WORD PTR SHARED_AREA_PTR+2 ;; | ||
| 479 | CMP CX,ES:[BP].RESIDENT_END ;; | ||
| 480 | JNA TB_DONE_CONTINUE1 ;;;;;;;;;;; | ||
| 481 | JMP TB_ERROR5 ;; | ||
| 482 | ;; | ||
| 483 | TB_DONE_CONTINUE1: ;; | ||
| 484 | CMP ES:[BP].RESIDENT_END,-1 ;; | ||
| 485 | JNE DONT_REPLACE ;; | ||
| 486 | PUSH CS ;; | ||
| 487 | POP ES ;; | ||
| 488 | MOV BP,OFFSET SD_SOURCE_PTR ;; | ||
| 489 | MOV ES:[BP].RESIDENT_END,CX ;; Save resident end | ||
| 490 | JMP CONTINUE_2_END ;; | ||
| 491 | ;; | ||
| 492 | DONT_REPLACE: ;; | ||
| 493 | PUSH CS ;; | ||
| 494 | POP ES ;; | ||
| 495 | MOV BP,OFFSET SD_SOURCE_PTR ;; | ||
| 496 | ;; | ||
| 497 | CONTINUE_2_END: ;; | ||
| 498 | SUB CX,OFFSET SD_DEST_PTR ;; Calculate # of bytes to copy | ||
| 499 | MOV SD_LENGTH,CX ;; | ||
| 500 | ;; | ||
| 501 | XOR CX,CX ;; Set valid completion return code | ||
| 502 | MOV TB_RETURN_CODE,CX ;; | ||
| 503 | RET ;; | ||
| 504 | ;; | ||
| 505 | TB_CPN_INVALID: ;; | ||
| 506 | CMP CX,1 ;; Set error 1 return code | ||
| 507 | JNE TB_ERROR2 ;; | ||
| 508 | MOV TB_RETURN_CODE,CX ;; | ||
| 509 | RET ;; | ||
| 510 | ;; | ||
| 511 | TB_ERROR2: ;; | ||
| 512 | CMP CX,2 ;; Set error 2 return code | ||
| 513 | JNE TB_ERROR3 ;; | ||
| 514 | MOV TB_RETURN_CODE,CX ;; | ||
| 515 | RET ;; | ||
| 516 | ;; | ||
| 517 | TB_ERROR3: ;; | ||
| 518 | CMP CX,3 ;; Set error 3 return code | ||
| 519 | JNE TB_ERROR4 ;; | ||
| 520 | MOV TB_RETURN_CODE,CX ;; | ||
| 521 | RET ;; | ||
| 522 | ;; | ||
| 523 | TB_ERROR4: ;; | ||
| 524 | CMP CX,4 ;; Set error 4 return code | ||
| 525 | JNE TB_ERROR5 ;; | ||
| 526 | MOV TB_RETURN_CODE,CX ;; | ||
| 527 | RET ;; | ||
| 528 | ;; | ||
| 529 | TB_ERROR5: ;; | ||
| 530 | MOV CX,5 ;; Set error 5 return code | ||
| 531 | MOV TB_RETURN_CODE,CX ;; | ||
| 532 | RET ;; | ||
| 533 | ;; | ||
| 534 | TB_ERROR6: ;; | ||
| 535 | MOV BX,TB_CODE_PAGE_PARM ;; | ||
| 536 | MOV CX,6 ;; | ||
| 537 | MOV TB_RETURN_CODE,CX ;; Set error 6 return code | ||
| 538 | RET ;; | ||
| 539 | ;; | ||
| 540 | TABLE_BUILD ENDP ;; | ||
| 541 | ;; | ||
| 542 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 543 | ;; | ||
| 544 | ;; Module: STATE_BUILD | ||
| 545 | ;; | ||
| 546 | ;; Description: | ||
| 547 | ;; Create the state/xlat section within the specific translate section. | ||
| 548 | ;; | ||
| 549 | ;; Input Registers: | ||
| 550 | ;; DS - points to our data segment | ||
| 551 | ;; ES - points to our data segment | ||
| 552 | ;; SB_STATE_OFFSET - offset to the beginning of the info in Keyb Def SYS | ||
| 553 | ;; DI - offset of the beginning of the area used to build states | ||
| 554 | ;; | ||
| 555 | ;; KEYBSYS_FILE_HANDLE - handle of the KEYBOARD.SYS file | ||
| 556 | ;; | ||
| 557 | ;; Output Registers: | ||
| 558 | ;; DI - offset of the end of the area used by STATE_BUILD | ||
| 559 | ;; | ||
| 560 | ;; CX - Return Code := 0 - State build successful | ||
| 561 | ;; 4 - State build unsuccessful | ||
| 562 | ;; (Bad or missing Keyboard Def file) | ||
| 563 | ;; | ||
| 564 | ;; Logic: | ||
| 565 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 566 | ;; | ||
| 567 | END_OF_AREA_PTR DW 0 ;; | ||
| 568 | SB_FIRST_STATE DW 0 ;; | ||
| 569 | SB_STATE_LENGTH DW 0 ;; | ||
| 570 | SB_STATE_OFFSET DD 0 ;; | ||
| 571 | STATE_LENGTH DW 0 ;; | ||
| 572 | RESTORE_BP DW ? ;; | ||
| 573 | ;; | ||
| 574 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 575 | ;; Program Code | ||
| 576 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 577 | ;; | ||
| 578 | STATE_BUILD PROC NEAR ;; | ||
| 579 | ;; | ||
| 580 | MOV SI,DI ;; Get the tally pointer | ||
| 581 | MOV END_OF_AREA_PTR,DI ;; Save pointer | ||
| 582 | ;; | ||
| 583 | MOV RESTORE_BP,BP ;; Save the base pointer | ||
| 584 | ;;;;;;;;; | ||
| 585 | MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle | ||
| 586 | MOV DX,WORD PTR SB_STATE_OFFSET ;; LSEEK file pointer | ||
| 587 | MOV CX,WORD PTR SB_STATE_OFFSET+2 ;; back to top of XLAT table | ||
| 588 | MOV AH,42H ;; | ||
| 589 | MOV AL,0 ;;;;;;;;; If no problem with | ||
| 590 | INT 21H ;; Keyboard Def file THEN | ||
| 591 | JNC SB_FIRST_HEADER ;; | ||
| 592 | JMP SB_ERROR4 ;; | ||
| 593 | ;; | ||
| 594 | SB_FIRST_HEADER: ;; | ||
| 595 | XOR BP,BP ;; | ||
| 596 | LEA CX,[BP].KX_FIRST_STATE ;; Set number of bytes to read header | ||
| 597 | MOV DX,DI ;; | ||
| 598 | PUSH ES ;; | ||
| 599 | POP DS ;; | ||
| 600 | MOV AH,3FH ;; read in the header | ||
| 601 | INT 21H ;; | ||
| 602 | PUSH CS ;; | ||
| 603 | POP DS ;; | ||
| 604 | JNC SB_HEAD_CONTINUE1 ;; | ||
| 605 | JMP SB_ERROR4 ;; | ||
| 606 | ;; | ||
| 607 | SB_HEAD_CONTINUE1: ;; | ||
| 608 | MOV DX,NEXT_SECT_PTR ;; | ||
| 609 | CMP DX,-1 ;; | ||
| 610 | JE SB_HEAD_CONTINUE2 ;; | ||
| 611 | SUB DX,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 612 | ;;;;; | ||
| 613 | SB_HEAD_CONTINUE2: ;; | ||
| 614 | MOV ES:[DI].XS_NEXT_SECT_PTR,DX ;; | ||
| 615 | CMP DX,-1 ;; | ||
| 616 | JE SB_HEAD_CONTINUE3 ;;;;; | ||
| 617 | ADD DX,SD_AREA_DIFFERENCE ;; Adjust for relocation | ||
| 618 | ;; | ||
| 619 | SB_HEAD_CONTINUE3: ;; | ||
| 620 | ADD DI,CX ;; Update the DI pointer | ||
| 621 | ;; | ||
| 622 | SB_NEXT_STATE: ;; | ||
| 623 | XOR BP,BP ;; Set number | ||
| 624 | LEA CX,[BP].KX_STATE_ID ;; bytes to read state length | ||
| 625 | MOV DX,DI ;; Read the header into the | ||
| 626 | MOV BX,KEYBSYS_FILE_HANDLE ;; SHARED_DATA_AREA | ||
| 627 | PUSH ES ;; | ||
| 628 | POP DS ;; | ||
| 629 | MOV AH,3FH ;; | ||
| 630 | INT 21H ;; | ||
| 631 | ;; | ||
| 632 | SB_CONTINUE1: ;; | ||
| 633 | PUSH CS ;; Reset the data segment | ||
| 634 | POP DS ;; | ||
| 635 | MOV CX,ES:[DI].KX_STATE_LEN ;; If the length of the state section | ||
| 636 | MOV STATE_LENGTH,CX ;; | ||
| 637 | ADD DI,2 ;; is zero then done | ||
| 638 | CMP CX,0 ;; | ||
| 639 | JE SB_DONE ;; | ||
| 640 | XOR BP,BP ;; Set number | ||
| 641 | LEA CX,[BP].KX_FIRST_XLAT-2 ;; bytes to read state length | ||
| 642 | MOV DX,DI ;; Read the header into the | ||
| 643 | MOV BX,KEYBSYS_FILE_HANDLE ;; SHARED_DATA_AREA | ||
| 644 | PUSH ES ;; | ||
| 645 | POP DS ;; | ||
| 646 | MOV AH,3FH ;; | ||
| 647 | INT 21H ;; | ||
| 648 | ;; | ||
| 649 | SB_CONTINUE1A: ;; | ||
| 650 | PUSH CS ;; Reset the data segment | ||
| 651 | POP DS ;; | ||
| 652 | SUB DI,2 ;; | ||
| 653 | MOV AX,ES:[DI].XS_KBD_TYPE ;; Get the keyboard type def | ||
| 654 | TEST AX,HW_TYPE ;; Does it match our hardware? | ||
| 655 | JNZ SB_CONTINUE2 ;; | ||
| 656 | MOV DX,ES:[DI].XS_STATE_LEN ;; No, then | ||
| 657 | LEA CX,[BP].KX_FIRST_XLAT ;; | ||
| 658 | SUB DX,CX ;; | ||
| 659 | XOR CX,CX ;; | ||
| 660 | MOV AH,42H ;; LSEEK past this state | ||
| 661 | MOV AL,01H ;; | ||
| 662 | INT 21H ;; | ||
| 663 | JMP SB_NEXT_STATE ;; | ||
| 664 | ;; | ||
| 665 | SB_CONTINUE2: ;; Yes, then | ||
| 666 | MOV AX,SIZE STATE_STR-1 ;; | ||
| 667 | ADD DI,AX ;; Set PTR and end of header | ||
| 668 | ;; | ||
| 669 | SB_XLAT_TAB_BEGIN: ;; Begin getting xlat tables | ||
| 670 | MOV BX,KEYBSYS_FILE_HANDLE ;; | ||
| 671 | LEA DX,[BP].KX_FIRST_XLAT ;; Adjust for what we have already read | ||
| 672 | MOV CX,STATE_LENGTH ;; | ||
| 673 | SUB CX,DX ;; | ||
| 674 | MOV DX,DI ;; | ||
| 675 | PUSH ES ;; | ||
| 676 | POP DS ;; | ||
| 677 | MOV AH,3FH ;; Read in the xlat tables | ||
| 678 | INT 21H ;; | ||
| 679 | PUSH CS ;; | ||
| 680 | POP DS ;; | ||
| 681 | JNC SB_CONTINUE4 ;; | ||
| 682 | JMP SB_ERROR4 ;; | ||
| 683 | ;; | ||
| 684 | SB_CONTINUE4: ;; | ||
| 685 | CMP CX,AX ;; | ||
| 686 | JE SB_ERROR_CHECK1 ;; | ||
| 687 | JMP SB_ERROR4 ;; | ||
| 688 | ;; | ||
| 689 | SB_ERROR_CHECK1: ;; | ||
| 690 | ADD DI,CX ;; Update the end of area ptr | ||
| 691 | ;; | ||
| 692 | MOV SI,DI ;; | ||
| 693 | JMP SB_NEXT_STATE ;; | ||
| 694 | ;; | ||
| 695 | SB_DONE: ;; | ||
| 696 | MOV AX,-1 ;; | ||
| 697 | MOV SI,END_OF_AREA_PTR ;; | ||
| 698 | MOV NEXT_SECT_PTR,SI ;; | ||
| 699 | ;; | ||
| 700 | MOV BP,RESTORE_BP ;; | ||
| 701 | RET ;; | ||
| 702 | ;; | ||
| 703 | SB_ERROR1: ;; | ||
| 704 | MOV CX,1 ;; | ||
| 705 | RET ;; | ||
| 706 | ;; | ||
| 707 | SB_ERROR2: ;; | ||
| 708 | MOV CX,2 ;; | ||
| 709 | RET ;; | ||
| 710 | ;; | ||
| 711 | SB_ERROR3: ;; | ||
| 712 | MOV CX,3 ;; | ||
| 713 | RET ;; | ||
| 714 | ;; | ||
| 715 | SB_ERROR4: ;; | ||
| 716 | MOV CX,4 ;; | ||
| 717 | RET ;; | ||
| 718 | ;; | ||
| 719 | ;; | ||
| 720 | STATE_BUILD ENDP ;; | ||
| 721 | ;; | ||
| 722 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 723 | ;; | ||
| 724 | ;; Module: FIND_CP_TABLE | ||
| 725 | ;; | ||
| 726 | ;; Description: | ||
| 727 | ;; Determine the offset of the specified code page table in KEYBOARD.SYS | ||
| 728 | ;; | ||
| 729 | ;; Input Registers: | ||
| 730 | ;; DS - points to our data segment | ||
| 731 | ;; ES - points to our data segment | ||
| 732 | ;; AX - ASCII representation of the language parm | ||
| 733 | ;; BX - binary representation of the code page | ||
| 734 | ;; | ||
| 735 | ;; KEYBSYS_FILE_HANDLE - handle of the KEYBOARD.SYS file | ||
| 736 | ;; | ||
| 737 | ;; Output Registers: | ||
| 738 | ;; CP_TAB_OFFSET - offset of the CP table in KEYBOARD.SYS | ||
| 739 | ;; | ||
| 740 | ;; CX - Return Code := 0 - State build successful | ||
| 741 | ;; 2 - Invalid Code page for language | ||
| 742 | ;; 4 - Bad or missing Keyboard Def file | ||
| 743 | ;; Logic: | ||
| 744 | ;; | ||
| 745 | ;; READ language table | ||
| 746 | ;; IF error in reading file THEN | ||
| 747 | ;; Display ERROR message and EXIT | ||
| 748 | ;; ELSE | ||
| 749 | ;; Use table to verify language parm | ||
| 750 | ;; Set pointer values | ||
| 751 | ;; IF code page was specified | ||
| 752 | ;; READ language entry | ||
| 753 | ;; IF error in reading file THEN | ||
| 754 | ;; Display ERROR message and EXIT | ||
| 755 | ;; ELSE | ||
| 756 | ;; READ Code page table | ||
| 757 | ;; IF error in reading file THEN | ||
| 758 | ;; Display ERROR message and EXIT | ||
| 759 | ;; ELSE | ||
| 760 | ;; Use table to get the offset of the code page parm | ||
| 761 | ;; RET | ||
| 762 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 763 | ;; | ||
| 764 | FIND_CP_PARM DW ? ;; | ||
| 765 | ;; | ||
| 766 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 767 | ;; Program Code | ||
| 768 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 769 | ;; | ||
| 770 | FIND_CP_TABLE PROC NEAR ;; | ||
| 771 | ;; | ||
| 772 | ;; | ||
| 773 | MOV FIND_CP_PARM,BX ;; Save Code page | ||
| 774 | ;;;;;;;;;;;;;; | ||
| 775 | MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle | ||
| 776 | MOV DX,WORD PTR KEYBCMD_LANG_ENTRY_PTR ;; LSEEK file pointer | ||
| 777 | MOV CX,WORD PTR KEYBCMD_LANG_ENTRY_PTR+2 ;; to top of language entry | ||
| 778 | MOV AH,42H ;; | ||
| 779 | MOV AL,0 ;;;;;;;;;;;;;; If no problem with | ||
| 780 | INT 21H ;; Keyb Def file Then | ||
| 781 | JNC FIND_BEGIN ;; | ||
| 782 | JMP FIND_CP_ERROR4 ;; | ||
| 783 | ;;;;;;;;; | ||
| 784 | FIND_BEGIN: ;; | ||
| 785 | MOV DI,AX ;; | ||
| 786 | MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number | ||
| 787 | ;; bytes to read header | ||
| 788 | MOV DX,OFFSET FILE_BUFFER ;;;;;;;;; | ||
| 789 | MOV AH,3FH ;; Read language entry in | ||
| 790 | INT 21H ;; KEYBOARD.SYS file | ||
| 791 | JNC FIND_VALID4 ;; If no error in opening file then | ||
| 792 | JMP FIND_CP_ERROR4 ;; | ||
| 793 | ;; | ||
| 794 | FIND_VALID4: ;; | ||
| 795 | ;****************************** CNS ******************************************* | ||
| 796 | xor ah,ah | ||
| 797 | mov al,FB.KL_NUM_CP | ||
| 798 | ;****************************** CNS ******************************************* | ||
| 799 | MOV NUM_CP,AX ;; Save the number of code pages | ||
| 800 | MUL CP_PTR_SIZE ;; Determine # of bytes to read | ||
| 801 | MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer | ||
| 802 | MOV CX,AX ;; | ||
| 803 | CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small | ||
| 804 | JBE FIND_VALID5 ;; | ||
| 805 | JMP FIND_CP_ERROR4 ;; | ||
| 806 | ;; | ||
| 807 | FIND_VALID5: ;; | ||
| 808 | MOV AH,3FH ;; Read code page table from | ||
| 809 | INT 21H ;; KEYBOARD.SYS file | ||
| 810 | JNC FIND_VALID6 ;; If no error in opening file then | ||
| 811 | JMP FIND_CP_ERROR4 ;; | ||
| 812 | ;; | ||
| 813 | FIND_VALID6: ;; | ||
| 814 | MOV CX,NUM_CP ;; Number of valid codes | ||
| 815 | MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table | ||
| 816 | ;; | ||
| 817 | F_SCAN_CP_TABLE: ;; FOR code page parm | ||
| 818 | MOV AX,FIND_CP_PARM ;; Get parameter | ||
| 819 | CMP [DI].KC_CODE_PAGE,AX ;; Valid Code ?? | ||
| 820 | JE F_CODE_PAGE_FOUND ;; If not found AND more entries THEN | ||
| 821 | ADD DI,LANG_PTR_SIZE ;; Check next entry | ||
| 822 | DEC CX ;; Decrement count of entries | ||
| 823 | JNE F_SCAN_CP_TABLE ;; Else | ||
| 824 | JMP FIND_CP_ERROR2 ;; Display error message | ||
| 825 | ;;;;;;;;;; | ||
| 826 | F_CODE_PAGE_FOUND: ;; | ||
| 827 | MOV AX,WORD PTR [DI].KC_ENTRY_PTR ;; | ||
| 828 | MOV WORD PTR CP_TAB_OFFSET,AX ;; | ||
| 829 | MOV AX,WORD PTR [DI].KC_ENTRY_PTR+2 ;; | ||
| 830 | MOV WORD PTR CP_TAB_OFFSET+2,AX ;; | ||
| 831 | ;; | ||
| 832 | XOR CX,CX ;;;;;;;;;; | ||
| 833 | RET ;; | ||
| 834 | ;; | ||
| 835 | FIND_CP_ERROR1: ;; | ||
| 836 | MOV CX,1 ;; | ||
| 837 | RET ;; | ||
| 838 | ;; | ||
| 839 | FIND_CP_ERROR2: ;; | ||
| 840 | MOV CX,2 ;; | ||
| 841 | RET ;; | ||
| 842 | ;; | ||
| 843 | FIND_CP_ERROR3: ;; | ||
| 844 | MOV CX,3 ;; | ||
| 845 | RET ;; | ||
| 846 | ;; | ||
| 847 | FIND_CP_ERROR4: ;; | ||
| 848 | MOV CX,4 ;; | ||
| 849 | RET ;; | ||
| 850 | ;; | ||
| 851 | FIND_CP_TABLE ENDP ;; | ||
| 852 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 853 | CODE ENDS | ||
| 854 | END TABLE_BUILD | ||
| 855 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/KEYB/KEYBTBBL.INC b/v4.0/src/CMD/KEYB/KEYBTBBL.INC new file mode 100644 index 0000000..c5ea73a --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBTBBL.INC | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | |||
| 2 | .XLIST | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; DOS - NLS Support - KEYB Command | ||
| 6 | ;; (C) Copyright 1988 Microsoft | ||
| 7 | ;; | ||
| 8 | ;; File Name: KEYBTBBL.INC | ||
| 9 | ;; ---------- | ||
| 10 | ;; | ||
| 11 | ;; Description: | ||
| 12 | ;; ------------ | ||
| 13 | ;; Include file containing structure definitions Shared Data Area | ||
| 14 | ;; for the Shared Data Area. | ||
| 15 | ;; The Shared Data Area contains data which is required by | ||
| 16 | ;; both the resident and transient KEYB code. The Shared | ||
| 17 | ;; Data Area is allocated in the KEYBI2F file and will be | ||
| 18 | ;; resident following initial installation. | ||
| 19 | ;; | ||
| 20 | ;; Change History: | ||
| 21 | ;; --------------- | ||
| 22 | ;; | ||
| 23 | ;; | ||
| 24 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 25 | ;; | ||
| 26 | EXTRN TABLE_BUILD :NEAR ;; | ||
| 27 | EXTRN FIND_CP_TABLE :NEAR ;; | ||
| 28 | ;; | ||
| 29 | EXTRN CPN_INVALID :WORD ;; | ||
| 30 | EXTRN SD_LENGTH :WORD ;; | ||
| 31 | ;; | ||
| 32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 33 | .LIST | ||
diff --git a/v4.0/src/CMD/KEYB/MAKEFILE b/v4.0/src/CMD/KEYB/MAKEFILE new file mode 100644 index 0000000..509b679 --- /dev/null +++ b/v4.0/src/CMD/KEYB/MAKEFILE | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | #************************* Makefile for KEYB ************************* | ||
| 2 | |||
| 3 | inc =..\..\inc | ||
| 4 | msg =..\..\messages | ||
| 5 | dos =..\..\dos | ||
| 6 | hinc =..\..\h | ||
| 7 | |||
| 8 | # | ||
| 9 | ###################### Dependencies begin here. ###################### | ||
| 10 | # | ||
| 11 | |||
| 12 | all: keyb.com | ||
| 13 | |||
| 14 | keyb.ctl: keyb.skl $(msg)\$(COUNTRY).msg | ||
| 15 | |||
| 16 | keybcmd.obj: keybcmd.asm \ | ||
| 17 | $(inc)\struc.inc \ | ||
| 18 | $(inc)\sysmsg.inc \ | ||
| 19 | $(inc)\versiona.inc \ | ||
| 20 | keybequ.inc \ | ||
| 21 | keybsys.inc \ | ||
| 22 | keybi9.inc \ | ||
| 23 | keybi9c.inc \ | ||
| 24 | keybi2f.inc \ | ||
| 25 | keybi48.inc \ | ||
| 26 | keybshar.inc \ | ||
| 27 | keyb.ctl \ | ||
| 28 | keyb.cl1 \ | ||
| 29 | keyb.cl2 \ | ||
| 30 | keyb.cla \ | ||
| 31 | keybdcl.inc \ | ||
| 32 | keybtbbl.inc \ | ||
| 33 | commsubs.inc \ | ||
| 34 | keybcpsd.inc \ | ||
| 35 | $(inc)\postequ.inc \ | ||
| 36 | $(inc)\dseg.inc | ||
| 37 | |||
| 38 | keybtbbl.obj: keybtbbl.asm | ||
| 39 | |||
| 40 | commsubs.obj: commsubs.asm | ||
| 41 | |||
| 42 | keybi2f.obj: keybi2f.asm | ||
| 43 | |||
| 44 | keybi48.obj: keybi48.asm | ||
| 45 | |||
| 46 | keyb.obj: keyb.asm | ||
| 47 | |||
| 48 | keybcpsd.obj: keybcpsd.asm | ||
| 49 | |||
| 50 | keybi9.obj: keybi9.asm | ||
| 51 | |||
| 52 | keybi9c.obj: keybi9c.asm | ||
| 53 | |||
| 54 | parser.obj: parser.asm \ | ||
| 55 | $(inc)\parse.asm \ | ||
| 56 | $(inc)\struc.inc \ | ||
| 57 | keybdcl.inc \ | ||
| 58 | makefile | ||
| 59 | |||
| 60 | keyb.com: keyb.obj \ | ||
| 61 | parser.obj \ | ||
| 62 | keybcmd.obj \ | ||
| 63 | keybtbbl.obj \ | ||
| 64 | commsubs.obj \ | ||
| 65 | keybi2f.obj \ | ||
| 66 | keybi48.obj \ | ||
| 67 | keybcpsd.obj \ | ||
| 68 | keybi9.obj \ | ||
| 69 | keybi9c.obj | ||
| 70 | link @keyb.lnk | ||
| 71 | exe2bin keyb.exe keyb.com | ||
| 72 | del keyb.exe | ||
diff --git a/v4.0/src/CMD/KEYB/PARSER.ASM b/v4.0/src/CMD/KEYB/PARSER.ASM new file mode 100644 index 0000000..808f37a --- /dev/null +++ b/v4.0/src/CMD/KEYB/PARSER.ASM | |||
| @@ -0,0 +1,517 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE PARSE CODE AND CONTROL BLOCKS FOR KEYB.COM | ||
| 3 | |||
| 4 | ;****************** START OF SPECIFICATIONS ************************** | ||
| 5 | ; | ||
| 6 | ; MODULE NAME: PARSER.ASM | ||
| 7 | ; | ||
| 8 | ; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM | ||
| 9 | ; | ||
| 10 | ; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS. | ||
| 11 | ; | ||
| 12 | ; ENTRY POINT: PARSE_PARAMETERS | ||
| 13 | ; | ||
| 14 | ; INPUT: BP POINTS TO PARAMETER LIST | ||
| 15 | ; DS & ES POINT TO PSP | ||
| 16 | ; | ||
| 17 | ; AT EXIT: | ||
| 18 | ; PARAMETER LIST FILLED IN AS REQUIRED. | ||
| 19 | ; | ||
| 20 | ; INTERNAL REFERENCES: | ||
| 21 | ; | ||
| 22 | ; ROUTINES: SYSPARSE - PARSING CODE | ||
| 23 | ; | ||
| 24 | ; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE | ||
| 25 | ; | ||
| 26 | ; EXTERNAL REFERENCES: | ||
| 27 | ; | ||
| 28 | ; ROUTINES: N/A | ||
| 29 | ; | ||
| 30 | ; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED. | ||
| 31 | ; | ||
| 32 | ; NOTES: | ||
| 33 | ; | ||
| 34 | ; REVISION HISTORY: | ||
| 35 | ; A000 - DOS Version 4.00 | ||
| 36 | ; 3/24/88 AN003 - P3906 PARSER changes to return "bogus" parameter on the | ||
| 37 | ; "Parameter value not allowed " message - CNS | ||
| 38 | ; 5/12/88 AN004 - P4867 /ID:NON-Numeric hangs the sytem as a 1st positional | ||
| 39 | ; | ||
| 40 | ; COPYRIGHT: "The KEYB.COM Keyboard Driver" | ||
| 41 | ; "Version 4.00 (C) Copyright 1988 Microsoft" | ||
| 42 | ; "Licensed Material - Program Property of Microsoft" | ||
| 43 | ; | ||
| 44 | ; PROGRAM AUTHOR: WGR | ||
| 45 | ; | ||
| 46 | ;****************** END OF SPECIFICATIONS **************************** | ||
| 47 | |||
| 48 | INCLUDE KEYBDCL.INC ;AN000 | ||
| 49 | |||
| 50 | ID_VALID EQU 0 ;AN000; ;AN000 | ||
| 51 | ID_INVALID EQU 1 ;AN000; ;AN000 | ||
| 52 | NO_ID EQU 2 ;AN000; ;AN000 | ||
| 53 | |||
| 54 | LANGUAGE_VALID EQU 0 ;AN000; ;AN000 | ||
| 55 | LANGUAGE_INVALID EQU 1 ;AN000; ;AN000 | ||
| 56 | NO_LANGUAGE EQU 2 ;AN000; ;AN000 | ||
| 57 | |||
| 58 | NO_IDLANG EQU 3 ;AN000; ;AN000 | ||
| 59 | |||
| 60 | CODE_PAGE_VALID EQU 0 ;AN000; ;AN000 | ||
| 61 | CODE_PAGE_INVALID EQU 1 ;AN000; ;AN000 | ||
| 62 | NO_CODE_PAGE EQU 2 ;AN000; ;AN000 | ||
| 63 | VALID_SYNTAX EQU 0 ;AN000; ;AN000 | ||
| 64 | INVALID_SYNTAX EQU 1 ;AN000; ;AN000 | ||
| 65 | |||
| 66 | COMMAND_LINE_START EQU 81H ;AN000; ;AN000 | ||
| 67 | RC_EOL EQU -1 ;AN000; ;AN000 | ||
| 68 | RC_NO_ERROR EQU 0 ;AN000; ;AN000 | ||
| 69 | RC_OP_MISSING EQU 2 ;AN000; ;AN000 | ||
| 70 | RC_NOT_IN_SW EQU 3 ;AN000; ;AN000 | ||
| 71 | ;***CNS P4867 1st CHECK for /ID:ALPHA | ||
| 72 | RC_SW_FIRST EQU 9 ;AN004; ;AN000 | ||
| 73 | ;***CNS P4867 1st CHECK for /ID:ALPHA | ||
| 74 | ERROR_COND EQU -1 ;AN000; ;AN000 | ||
| 75 | NUMBER EQU 1 ;AN000; ;AN000 | ||
| 76 | STRING EQU 3 ;AN000; ;AN000 | ||
| 77 | FILE_SPEC EQU 5 ;AN000; ;AN000 | ||
| 78 | MAX_ID EQU 999 ;AN000; ;AN000 | ||
| 79 | LANG_LENGTH EQU 2 ;AN000; ;AN000 | ||
| 80 | |||
| 81 | INVALID_SWITCH EQU 3 | ||
| 82 | TOO_MANY EQU 1 | ||
| 83 | INVALID_PARAM EQU 10 | ||
| 84 | VALUE_DISALLOW EQU 8 | ||
| 85 | |||
| 86 | .XLIST | ||
| 87 | INCLUDE STRUC.INC ; Structured macros ;AN000 | ||
| 88 | .LIST | ||
| 89 | |||
| 90 | PUBLIC PARSE_PARAMETERS ;AN003;; near procedure for parsing command line ;AN000 | ||
| 91 | PUBLIC CUR_PTR ;AN003;; near procedure for parsing command line ;AN000 | ||
| 92 | PUBLIC OLD_PTR ;AN003;; near procedure for parsing command line ;AN000 | ||
| 93 | PUBLIC ERR_PART;AN003;; near procedure for parsing command line ;AN000 | ||
| 94 | EXTRN BAD_ID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 95 | EXTRN FOURTH_PARM:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 96 | EXTRN ONE_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 97 | EXTRN FTH_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 98 | EXTRN ALPHA:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 99 | |||
| 100 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 101 | ; | ||
| 102 | ; Set assemble switches for parse code that is not required!! | ||
| 103 | ; | ||
| 104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 105 | |||
| 106 | DateSW EQU 0 ;AN000; ;AN000 | ||
| 107 | TimeSW EQU 0 ;AN000; ;AN000 | ||
| 108 | CmpxSW EQU 0 ;AN000; ;AN000 | ||
| 109 | DrvSW EQU 0 ;AN000; ;AN000 | ||
| 110 | QusSW EQU 0 ;AN000; ;AN000 | ||
| 111 | KeySW EQU 0 ;AN000; ;AN000 | ||
| 112 | Val1SW EQU 0 ;AN000; ;AN000 | ||
| 113 | Val2SW EQU 0 ;AN000; ;AN000 | ||
| 114 | Val3SW EQU 0 ;AN000; ;AN000 | ||
| 115 | |||
| 116 | |||
| 117 | CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000 | ||
| 118 | ASSUME CS:CODE,DS:CODE ;AN000; ;AN000 | ||
| 119 | |||
| 120 | .XLIST | ||
| 121 | INCLUDE PARSE.ASM ; Parsing code ;AN000 | ||
| 122 | .LIST | ||
| 123 | |||
| 124 | |||
| 125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 126 | ; PARM control blocks for KEYB | ||
| 127 | ; Parsing command line as follows: | ||
| 128 | ; | ||
| 129 | ; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id] | ||
| 130 | ; | ||
| 131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 132 | |||
| 133 | PARMS LABEL WORD ;AN000; ;AN000 | ||
| 134 | DW PARMSX ;AN000; ;AN000 | ||
| 135 | DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000 | ||
| 136 | |||
| 137 | PARMSX LABEL BYTE ;AN000; ;AN000 | ||
| 138 | DB 0,3 ;AN000;; min,max positional operands ;AN000 | ||
| 139 | DW LANG ;AN000;; pointer to control block ;AN000 | ||
| 140 | DW CP ;AN000;; pointer to control block ;AN000 | ||
| 141 | DW FILE_NAME ;AN000;; pointer to control block ;AN000 | ||
| 142 | DB 1 ;AN000;; 1 switch ;AN000 | ||
| 143 | DW ID_VALUE ;AN000;; pointer to control block ;AN000 | ||
| 144 | DB 0 ;AN000;; no keywords ;AN000 | ||
| 145 | |||
| 146 | LANG LABEL WORD ;AN000; ;AN000 | ||
| 147 | DW 0A001H ;AN000;; sstring or numeric value (optional) ;AN000 | ||
| 148 | DW 0002H ;AN000;; cap result by char table (sstring) ;AN000 | ||
| 149 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 150 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 151 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 152 | |||
| 153 | CP LABEL WORD ;AN000; ;AN000 | ||
| 154 | DW 8001H ;AN000;; numeric ;AN000 | ||
| 155 | DW 0 ;AN000;; no functions ;AN000 | ||
| 156 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 157 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 158 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 159 | |||
| 160 | FILE_NAME LABEL WORD ;AN000; ;AN000 | ||
| 161 | DW 0201H ;AN000;; file spec ;AN000 | ||
| 162 | DW 0001H ;AN000;; cap by file table ;AN000 | ||
| 163 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 164 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 165 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 166 | |||
| 167 | ID_VALUE LABEL WORD ;AN000; ;AN000 | ||
| 168 | DW 8010H ;AN000;; numeric ;AN000 | ||
| 169 | DW 0 ;AN000;; no functions ;AN000 | ||
| 170 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 171 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 172 | DB 1 ;AN000;; 1 switch synonym ;AN000 | ||
| 173 | DB "/ID",0 ;AN000;; ID switch ;AN000 | ||
| 174 | |||
| 175 | NOVALS LABEL BYTE ;AN000; ;AN000 | ||
| 176 | DB 0 ;AN000;; no value checking done ;AN000 | ||
| 177 | |||
| 178 | RESULT_BUF LABEL BYTE ;AN000; ;AN000 | ||
| 179 | RESULT_TYPE DB 0 ;AN000;; type returned (number, string, etc.) ;AN000 | ||
| 180 | DB ? ;AN000;; matched item tag (if applicable) ;AN000 | ||
| 181 | RESULT_SYN_PTR DW ? ;AN000;; synonym ptr (if applicable) ;AN000 | ||
| 182 | RESULT_VAL DD ? ;AN000;; value ;AN000 | ||
| 183 | |||
| 184 | LOOP_COUNT DB 0 ;AN000;; keeps track of parameter position ;AN000 | ||
| 185 | ;***CNS | ||
| 186 | CUR_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 187 | OLD_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 188 | ERR_PART DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 189 | ;***CNS | ||
| 190 | ;AN000;; ..and reports an error condition ;AN000 | ||
| 191 | TEMP_FILE_NAME DB 128 DUP(0) ;AN000;; place for file name ;AN000 | ||
| 192 | |||
| 193 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 194 | ; | ||
| 195 | ; PROCEDURE_NAME: PARSE_PARAMETERS | ||
| 196 | ; | ||
| 197 | ; FUNCTION: | ||
| 198 | ; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR | ||
| 199 | ; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY. | ||
| 200 | ; | ||
| 201 | ; AT ENTRY: AS ABOVE. | ||
| 202 | ; | ||
| 203 | ; AT EXIT: | ||
| 204 | ; AS ABOVE. | ||
| 205 | ; | ||
| 206 | ; AUTHOR: WGR | ||
| 207 | ; | ||
| 208 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 209 | |||
| 210 | PARSE_PARAMETERS PROC NEAR ;AN000 | ||
| 211 | XOR AX,AX ;AN000;; setup default parameters. ;AN000 | ||
| 212 | MOV [BP].RET_CODE_1,NO_IDLANG ;AN000;; ;AN000 | ||
| 213 | MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; ;AN000 | ||
| 214 | MOV [BP].RET_CODE_3,VALID_SYNTAX ;AN000;; ;AN000 | ||
| 215 | MOV [BP].RET_CODE_4,NO_ID ;AN000;; ;AN000 | ||
| 216 | MOV [BP].PATH_LENGTH,AX ;AN000;; ;AN000 | ||
| 217 | LEA DI,PARMS ;AN000;; setup parse blocks ;AN000 | ||
| 218 | MOV SI,COMMAND_LINE_START ;AN000;; ;AN000 | ||
| 219 | ;***CNS | ||
| 220 | |||
| 221 | PUSH AX ;AN003;Save environment | ||
| 222 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 223 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 224 | MOV CUR_PTR,SI ;AN003; | ||
| 225 | POP AX ;AN003;Restore the environment | ||
| 226 | |||
| 227 | ;***CNS | ||
| 228 | XOR CX,CX ;AN000;; ;AN000 | ||
| 229 | XOR DX,DX ;AN000;; ;AN000 | ||
| 230 | CALL SYSPARSE ;AN000;; ;AN000 | ||
| 231 | .WHILE <AX NE RC_EOL> near AND ;AN000;; while not end of line and.. ;AN000 | ||
| 232 | .WHILE <LOOP_COUNT NE ERROR_COND> near ;AN000;; parameters valid do. ;AN000 | ||
| 233 | .IF <AX EQ RC_NOT_IN_SW> near OR ;AN000;; invalid switch? ;AN000 | ||
| 234 | .IF <AX EQ RC_SW_FIRST> near ;AN000;; invalid switch? ;AN000 | ||
| 235 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; set invalid syntax flag. ;AN000 | ||
| 236 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000 | ||
| 237 | ;***CNS | ||
| 238 | MOV ERR_PART,INVALID_SWITCH | ||
| 239 | PUSH AX ;AN003;Save environment | ||
| 240 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 241 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 242 | MOV CUR_PTR,SI ;AN003; | ||
| 243 | POP AX ;AN003;Restore the environment | ||
| 244 | |||
| 245 | ;***CNS | ||
| 246 | .ELSE ;AN000;; ;AN000 | ||
| 247 | .IF <RESULT_SYN_PTR NE 0> ;AN000;; was the switch found? ;AN000 | ||
| 248 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; is it valid? ;AN000 | ||
| 249 | OR AX,AX ;AN000;; ;AN000 | ||
| 250 | .IF NZ OR ;AN000;; ;AN000 | ||
| 251 | MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000 | ||
| 252 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 253 | MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000 | ||
| 254 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 255 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 256 | mov bad_id,1 ;AN000;; ;AN000 | ||
| 257 | ;***CNS | ||
| 258 | |||
| 259 | PUSH AX ;AN003;Save environment | ||
| 260 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 261 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 262 | MOV CUR_PTR,SI ;AN003; | ||
| 263 | POP AX ;AN003;Restore the environment | ||
| 264 | |||
| 265 | ;***CNS | ||
| 266 | .ELSE ;AN000;; ;AN000 | ||
| 267 | MOV [BP].RET_CODE_4,ID_VALID ;AN000;; yes...set return code 4. ;AN000 | ||
| 268 | MOV [BP].ID_PARM,AX ;AN000;; ;AN000 | ||
| 269 | mov fourth_parm,1 ;AN000;; ;AN000 | ||
| 270 | mov fth_parmid,1 ;AN000;; ;AN000 | ||
| 271 | .ENDIF ;AN000;; ;AN000 | ||
| 272 | .ELSE ;AN000;; ;AN000 | ||
| 273 | INC LOOP_COUNT ;AN000;; positional encountered... ;AN000 | ||
| 274 | .SELECT ;AN000;; ;AN000 | ||
| 275 | .WHEN <LOOP_COUNT EQ 1> ;AN000;; check for language ;AN000 | ||
| 276 | CALL PROCESS_1ST_PARM ;AN000;; ;AN000 | ||
| 277 | |||
| 278 | ;***CNS | ||
| 279 | |||
| 280 | PUSH AX ;AN003;Save environment | ||
| 281 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 282 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 283 | MOV CUR_PTR,SI ;AN003; | ||
| 284 | POP AX ;AN003;Restore the environment | ||
| 285 | ;***CNS | ||
| 286 | |||
| 287 | |||
| 288 | .WHEN <LOOP_COUNT EQ 2> ;AN000;; check for code page ;AN000 | ||
| 289 | CALL PROCESS_2ND_PARM ;AN000;; ;AN000 | ||
| 290 | ;***CNS | ||
| 291 | |||
| 292 | PUSH AX ;AN003;Save environment | ||
| 293 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 294 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 295 | MOV CUR_PTR,SI ;AN003; | ||
| 296 | POP AX ;AN003;Restore the environment | ||
| 297 | ;***CNS | ||
| 298 | .WHEN <LOOP_COUNT EQ 3> ;AN000;; check for file name ;AN000 | ||
| 299 | CALL PROCESS_3RD_PARM ;AN000;; ;AN000 | ||
| 300 | ;***CNS | ||
| 301 | |||
| 302 | PUSH AX ;AN003;Save environment | ||
| 303 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 304 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 305 | MOV CUR_PTR,SI ;AN003; | ||
| 306 | POP AX ;AN003;Restore the environment | ||
| 307 | ;***CNS | ||
| 308 | .OTHERWISE ;AN000;; ;AN000 | ||
| 309 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; too many parms ;AN000 | ||
| 310 | ;***CNS | ||
| 311 | |||
| 312 | PUSH AX ;AN003;Save environment | ||
| 313 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 314 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 315 | MOV CUR_PTR,SI ;AN003; | ||
| 316 | POP AX ;AN003;Restore the environment | ||
| 317 | ;***CNS | ||
| 318 | MOV ERR_PART,TOO_MANY | ||
| 319 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000 | ||
| 320 | .ENDSELECT ;AN000;; ;AN000 | ||
| 321 | .ENDIF ;AN000;; ;AN000 | ||
| 322 | MOV RESULT_TYPE,0 ;AN000;; reset result block. ;AN000 | ||
| 323 | CALL SYSPARSE ;AN000;; parse next parameter. ;AN000 | ||
| 324 | .ENDIF ;AN000;; ;AN000 | ||
| 325 | .ENDWHILE ;AN000;; ;AN000 | ||
| 326 | .IF <[BP].RET_CODE_4 EQ ID_VALID> AND ;AN000;; ensure that if the switch ;AN000 | ||
| 327 | .IF <[BP].RET_CODE_1 NE LANGUAGE_VALID> ;AN000;; was used..that a valid keyboard ;AN000 | ||
| 328 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; code was used.. ;AN000 | ||
| 329 | ;***CNS | ||
| 330 | |||
| 331 | PUSH AX ;AN003;Save environment | ||
| 332 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 333 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 334 | MOV CUR_PTR,SI ;AN003; | ||
| 335 | POP AX ;AN003;Restore the environment | ||
| 336 | MOV ERR_PART,VALUE_DISALLOW | ||
| 337 | ;***CNS | ||
| 338 | .ENDIF ;AN000;; ;AN000 | ||
| 339 | RET ;AN000;; ;AN000 | ||
| 340 | PARSE_PARAMETERS ENDP ;AN000; ;AN000 | ||
| 341 | |||
| 342 | |||
| 343 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 344 | ; | ||
| 345 | ; PROCEDURE_NAME: PROCESS_1ST_PARM | ||
| 346 | ; | ||
| 347 | ; FUNCTION: | ||
| 348 | ; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD | ||
| 349 | ; BE THE LANGUAGE ID OR THE KEYBOARD ID. | ||
| 350 | ; | ||
| 351 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 352 | ; | ||
| 353 | ; AT EXIT: | ||
| 354 | ; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID. | ||
| 355 | ; | ||
| 356 | ; AUTHOR: WGR | ||
| 357 | ; | ||
| 358 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 359 | |||
| 360 | PROCESS_1ST_PARM PROC NEAR ;AN000 | ||
| 361 | .IF <AX GT RC_NO_ERROR> ;AN000;; error on parse? ;AN000 | ||
| 362 | MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; yes...set invalid language ;AN000 | ||
| 363 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; and syntax error.. ;AN000 | ||
| 364 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000 | ||
| 365 | MOV ERR_PART,AX ;AN003;; | ||
| 366 | .ELSE near ;AN000;; ;AN000 | ||
| 367 | |||
| 368 | .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was this a number (id)? ;AN000 | ||
| 369 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes...check to see if ;AN000 | ||
| 370 | OR AX,AX ;AN000;; within range. ;AN000 | ||
| 371 | .IF NZ OR ;AN000;; ;AN000 | ||
| 372 | MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000 | ||
| 373 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 374 | MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000 | ||
| 375 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 376 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 377 | mov bad_id,1 ;AN000;; ;AN000 | ||
| 378 | .ELSE ;AN000;; ;AN000 | ||
| 379 | MOV [BP].RET_CODE_1,ID_VALID ;AN000;; valid id...set ;AN000 | ||
| 380 | MOV [BP].RET_CODE_4,ID_VALID ;AN000;; valid id...set ;AN000 | ||
| 381 | MOV [BP].ID_PARM,AX ;AN000;; and value moved into block ;AN000 | ||
| 382 | MOV LOOP_COUNT,4 ;AN000;; there should be no more parms ;AN000 | ||
| 383 | mov one_parmid,1 ;AN000;; ;AN000 | ||
| 384 | .ENDIF ;AN000;; ;AN000 | ||
| 385 | .ELSEIF <RESULT_TYPE EQ STRING> ;AN000;; must be a string then.. ;AN000 | ||
| 386 | PUSH SI ;AN000;; ;AN000 | ||
| 387 | PUSH DI ;AN000;; ;AN000 | ||
| 388 | PUSH CX ;AN000;; ;AN000 | ||
| 389 | PUSH DS ;AN000;; ;AN000 | ||
| 390 | LDS SI,RESULT_VAL ;AN000;; get ptr to string ;AN000 | ||
| 391 | MOV DI,BP ;AN000;; ;AN000 | ||
| 392 | ADD DI,LANGUAGE_PARM ;AN000;; point to block for copy. ;AN000 | ||
| 393 | MOV CX,LANG_LENGTH ;AN000;; maximum length = 2 ;AN000 | ||
| 394 | LODSB ;AN000;; load AL with 1st char.. ;AN000 | ||
| 395 | .WHILE <CX NE 0> AND ;AN000;; do twice....unless ;AN000 | ||
| 396 | .WHILE <AL NE 0> ;AN000;; there is only 1 character. ;AN000 | ||
| 397 | STOSB ;AN000;; store ;AN000 | ||
| 398 | DEC CX ;AN000;; dec count ;AN000 | ||
| 399 | LODSB ;AN000;; load ;AN000 | ||
| 400 | .ENDWHILE ;AN000;; ;AN000 | ||
| 401 | .IF <CX NE 0> OR ;AN000;; if there was less than 2 or.. ;AN000 | ||
| 402 | .IF <AL NE 0> ;AN000;; greater than 2 characters then.. ;AN000 | ||
| 403 | MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; invalid. ;AN000 | ||
| 404 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 405 | MOV ERR_PART,INVALID_PARAM | ||
| 406 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000 | ||
| 407 | .ELSE ;AN000;; ;AN000 | ||
| 408 | MOV [BP].RET_CODE_1,LANGUAGE_VALID ;AN000;; valid language has been copied ;AN000 | ||
| 409 | MOV ALPHA,1 ;AN000;; language found ;AN000 | ||
| 410 | .ENDIF ;AN000;; ;AN000 | ||
| 411 | POP DS ;AN000;; ;AN000 | ||
| 412 | POP CX ;AN000;; ;AN000 | ||
| 413 | POP DI ;AN000;; ;AN000 | ||
| 414 | POP SI ;AN000;; ;AN000 | ||
| 415 | .ELSE ;AN000;; ommited parameter... ;AN000 | ||
| 416 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; invalid since further parameters.;AN000 | ||
| 417 | .ENDIF ;AN000;; ;AN000 | ||
| 418 | .ENDIF ;AN000;; ;AN000 | ||
| 419 | RET ;AN000;; ;AN000 | ||
| 420 | PROCESS_1ST_PARM ENDP ;AN000; ;AN000 | ||
| 421 | |||
| 422 | |||
| 423 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 424 | ; | ||
| 425 | ; PROCEDURE_NAME: PROCESS_2ND_PARM | ||
| 426 | ; | ||
| 427 | ; FUNCTION: | ||
| 428 | ; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD | ||
| 429 | ; BE THE CODE PAGE, IF REQUESTED. | ||
| 430 | ; | ||
| 431 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 432 | ; | ||
| 433 | ; AT EXIT: | ||
| 434 | ; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE. | ||
| 435 | ; | ||
| 436 | ; AUTHOR: WGR | ||
| 437 | ; | ||
| 438 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 439 | |||
| 440 | PROCESS_2ND_PARM PROC NEAR ;AN000 | ||
| 441 | .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error.. ;AN000 | ||
| 442 | MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000 | ||
| 443 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 444 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 445 | MOV ERR_PART,AX ;AN003;; | ||
| 446 | .ELSE ;AN000;; ;AN000 | ||
| 447 | .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was parameter specified? ;AN000 | ||
| 448 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes..if code page not.. ;AN000 | ||
| 449 | OR AX,AX ;AN000;; ;AN000 | ||
| 450 | .IF NZ OR ;AN000;; ;AN000 | ||
| 451 | MOV AX,WORD PTR RESULT_VAL ;AN000;; valid..then ;AN000 | ||
| 452 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 453 | MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000 | ||
| 454 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 455 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 456 | .ELSE ;AN000;; ;AN000 | ||
| 457 | MOV [BP].RET_CODE_2,CODE_PAGE_VALID;AN000;; else...valid code page ;AN000 | ||
| 458 | MOV [BP].CODE_PAGE_PARM,AX ;AN000;; move into parm ;AN000 | ||
| 459 | .ENDIF ;AN000;; ;AN000 | ||
| 460 | .ELSE ;AN000;; ;AN000 | ||
| 461 | MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; mark as not specified. ;AN000 | ||
| 462 | .ENDIF ;AN000;; ;AN000 | ||
| 463 | .ENDIF ;AN000;; ;AN000 | ||
| 464 | RET ;AN000;; ;AN000 | ||
| 465 | PROCESS_2ND_PARM ENDP ;AN000; ;AN000 | ||
| 466 | |||
| 467 | |||
| 468 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 469 | ; | ||
| 470 | ; PROCEDURE_NAME: PROCESS_3RD_PARM | ||
| 471 | ; | ||
| 472 | ; FUNCTION: | ||
| 473 | ; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD | ||
| 474 | ; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED. | ||
| 475 | ; | ||
| 476 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 477 | ; | ||
| 478 | ; AT EXIT: | ||
| 479 | ; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME. | ||
| 480 | ; | ||
| 481 | ; AUTHOR: WGR | ||
| 482 | ; | ||
| 483 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 484 | |||
| 485 | PROCESS_3RD_PARM PROC NEAR ;AN000; ;AN000 | ||
| 486 | .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error then.. ;AN000 | ||
| 487 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 488 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 489 | MOV ERR_PART,AX ;AN003;; | ||
| 490 | .ELSE ;AN000;; ;AN000 | ||
| 491 | .IF <RESULT_TYPE EQ FILE_SPEC> ;AN000;; ;AN000 | ||
| 492 | PUSH DS ;AN000;; ;AN000 | ||
| 493 | PUSH SI ;AN000;; ;AN000 | ||
| 494 | PUSH DI ;AN000;; ;AN000 | ||
| 495 | PUSH CX ;AN000;; ;AN000 | ||
| 496 | LDS SI,RESULT_VAL ;AN000;; load offset of file name ;AN000 | ||
| 497 | LEA DI,TEMP_FILE_NAME ;AN000;; ;AN000 | ||
| 498 | MOV [BP].PATH_OFFSET,DI ;AN000;; copy to parameter block ;AN000 | ||
| 499 | XOR CX,CX ;AN000;; ;AN000 | ||
| 500 | LODSB ;AN000;; count the length of the path. ;AN000 | ||
| 501 | .WHILE <AL NE 0> ;AN000;; ;AN000 | ||
| 502 | STOSB ;AN000;; ;AN000 | ||
| 503 | LODSB ;AN000;; ;AN000 | ||
| 504 | INC CX ;AN000;; ;AN000 | ||
| 505 | .ENDWHILE ;AN000;; ;AN000 | ||
| 506 | MOV [BP].PATH_LENGTH,CX ;AN000;; copy to parameter block ;AN000 | ||
| 507 | POP CX ;AN000;; ;AN000 | ||
| 508 | POP DI ;AN000;; ;AN000 | ||
| 509 | POP SI ;AN000;; ;AN000 | ||
| 510 | POP DS ;AN000;; ;AN000 | ||
| 511 | .ENDIF ;AN000;; ;AN000 | ||
| 512 | .ENDIF ;AN000;; ;AN000 | ||
| 513 | RET ;AN000;; ;AN000 | ||
| 514 | PROCESS_3RD_PARM ENDP ;AN000; ;AN000 | ||
| 515 | ;AN000; | ||
| 516 | CODE ENDS ;AN000; | ||
| 517 | END ;AN000; | ||