diff options
Diffstat (limited to 'v4.0/src/CMD/KEYB/COMMSUBS.ASM')
| -rw-r--r-- | v4.0/src/CMD/KEYB/COMMSUBS.ASM | 603 |
1 files changed, 603 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 | ||