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