diff options
Diffstat (limited to 'v4.0/src/CMD/KEYB/KEYBI2F.ASM')
| -rw-r--r-- | v4.0/src/CMD/KEYB/KEYBI2F.ASM | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/KEYBI2F.ASM b/v4.0/src/CMD/KEYB/KEYBI2F.ASM new file mode 100644 index 0000000..30dce7e --- /dev/null +++ b/v4.0/src/CMD/KEYB/KEYBI2F.ASM | |||
| @@ -0,0 +1,225 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | TITLE DOS - KEYB Command - Interrupt 2F Handler | ||
| 4 | |||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ;; DOS - NLS Support - KEYB Command | ||
| 7 | ;; (C) Copyright 1988 Microsoft | ||
| 8 | ;; | ||
| 9 | ;; File Name: KEYBI2F.ASM | ||
| 10 | ;; ---------- | ||
| 11 | ;; | ||
| 12 | ;; Description: | ||
| 13 | ;; ------------ | ||
| 14 | ;; Contains Interrupt 2F handler. | ||
| 15 | ;; | ||
| 16 | ;; Documentation Reference: | ||
| 17 | ;; ------------------------ | ||
| 18 | ;; PC DOS 3.3 Detailed Design Document - May ?? 1986 | ||
| 19 | ;; | ||
| 20 | ;; Procedures Contained in This File: | ||
| 21 | ;; ---------------------------------- | ||
| 22 | ;; KEYB_INT_2F - Interupt 2F handler | ||
| 23 | ;; | ||
| 24 | ;; Include Files Required: | ||
| 25 | ;; ----------------------- | ||
| 26 | ;; INCLUDE KEYBEQU.INC | ||
| 27 | ;; INCLUDE KEYBSHAR.INC | ||
| 28 | ;; INCLUDE KEYBMAC.INC | ||
| 29 | ;; INCLUDE KEYBCMD.INC | ||
| 30 | ;; INCLUDE KEYBCPSD.INC | ||
| 31 | ;; INCLUDE KEYBI9C.INC | ||
| 32 | ;; | ||
| 33 | ;; External Procedure References: | ||
| 34 | ;; ------------------------------ | ||
| 35 | ;; FROM FILE ????????.ASM: | ||
| 36 | ;; procedure - description???????????????????????????????? | ||
| 37 | ;; | ||
| 38 | ;; Linkage Information: Refer to file KEYB.ASM | ||
| 39 | ;; -------------------- | ||
| 40 | ;; | ||
| 41 | ;; Change History: | ||
| 42 | ;; --------------- | ||
| 43 | ;; | ||
| 44 | ;; | ||
| 45 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 46 | ;; | ||
| 47 | INCLUDE KEYBEQU.INC ;; | ||
| 48 | INCLUDE KEYBSHAR.INC ;; | ||
| 49 | INCLUDE KEYBMAC.INC ;; | ||
| 50 | INCLUDE KEYBCMD.INC ;; | ||
| 51 | INCLUDE KEYBCPSD.INC ;; | ||
| 52 | INCLUDE KEYBI9C.INC ;; | ||
| 53 | ;; | ||
| 54 | PUBLIC KEYB_INT_2F ;; | ||
| 55 | ;; | ||
| 56 | EXTRN ERROR_BEEP:NEAR ;; | ||
| 57 | ;; | ||
| 58 | CODE SEGMENT PUBLIC 'CODE' ;; | ||
| 59 | ;; | ||
| 60 | ASSUME CS:CODE,DS:CODE ;; | ||
| 61 | ;; | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | ;; Module: KEYB_INT_2F | ||
| 65 | ;; | ||
| 66 | ;; Description: | ||
| 67 | ;; | ||
| 68 | ;; Input Registers: | ||
| 69 | ;; AH = 0ADH | ||
| 70 | ;; AL = 80,81,82 | ||
| 71 | ;; | ||
| 72 | ;; Output Registers: | ||
| 73 | ;; N/A | ||
| 74 | ;; | ||
| 75 | ;; Logic: | ||
| 76 | ;; IF AH = 0ADh THEN (this call is for us) | ||
| 77 | ;; Set carry flag to 0 | ||
| 78 | ;; IF AL = 80 THEN | ||
| 79 | ;; Get major and minor | ||
| 80 | ;; Get SEG:OFFSET of SHARED_DATA_AREA | ||
| 81 | ;; | ||
| 82 | ;; IF AL = 81 THEN | ||
| 83 | ;; Get FIRST_XLAT_PTR | ||
| 84 | ;; FOR each table | ||
| 85 | ;; IF code page requested = code page value at pointer THEN | ||
| 86 | ;; Set INVOKED_CODE_PAGE | ||
| 87 | ;; Set ACTIVE_XLAT_PTR | ||
| 88 | ;; EXIT | ||
| 89 | ;; ELSE | ||
| 90 | ;; Get NEXT_SECT_PTR | ||
| 91 | ;; NEXT table | ||
| 92 | ;; IF no corresponding code page found THEN | ||
| 93 | ;; Set carry flag | ||
| 94 | ;; | ||
| 95 | ;; IF AL = 82 THEN | ||
| 96 | ;; IF BL = 00 THEN | ||
| 97 | ;; Set COUNTRY_FLAG = 00 | ||
| 98 | ;; ELSE IF BL = 0FFH THEN | ||
| 99 | ;; Set COUNTRY_FLAG = 0FFH | ||
| 100 | ;; ELSE | ||
| 101 | ;; Set carry flag | ||
| 102 | ;; IRET or JMP to another INT 2FH handler (if installed) | ||
| 103 | ;; | ||
| 104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 105 | ;; | ||
| 106 | CP_QUERY EQU 80H ;; | ||
| 107 | CP_INVOKE EQU 81H ;; | ||
| 108 | CP_LANGUAGE EQU 82H ;; | ||
| 109 | ;; | ||
| 110 | VERSION_MAJOR EQU 01H ;; | ||
| 111 | VERSION_MINOR EQU 00H ;; | ||
| 112 | ;; | ||
| 113 | CARRY_FLAG EQU 01H ;; | ||
| 114 | RESTORE_BP DW ? ;; | ||
| 115 | ;; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ;; | ||
| 118 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 119 | ;; | ||
| 120 | KEYB_INT_2F PROC ;; | ||
| 121 | ;; | ||
| 122 | PUSH DS ;; | ||
| 123 | PUSH BX ;; | ||
| 124 | PUSH CX ;; | ||
| 125 | PUSH SI ;; | ||
| 126 | ;; | ||
| 127 | PUSH CS ;; | ||
| 128 | POP DS ;; Set DATA SEGMENT register | ||
| 129 | ;; | ||
| 130 | CMP AH,INT_2F_SUB_FUNC ;; Q..is this call for us? | ||
| 131 | JE CHECK_REQUEST_CODE ;; Y..check request code | ||
| 132 | JMP INT_2F_DONE ;; N..get out | ||
| 133 | ;; | ||
| 134 | CHECK_REQUEST_CODE: ;; Y..check request code | ||
| 135 | MOV RESTORE_BP,BP ;;;;;;;;;;; | ||
| 136 | MOV BP,SP ;; Clear CARRY flag | ||
| 137 | AND WORD PTR [BP]+12,NOT CARRY_FLAG ;; | ||
| 138 | MOV BP,RESTORE_BP ;; | ||
| 139 | ;;;;;;;;;;; | ||
| 140 | ;; | ||
| 141 | INT_2F_CP_QUERY: ;; | ||
| 142 | CMP AL,CP_QUERY ;; Q..query CP? | ||
| 143 | JNE INT_2F_CP_INVOKE ;; N..next | ||
| 144 | MOV AX,-1 ;; Y..process query | ||
| 145 | MOV BH,VERSION_MAJOR ;; | ||
| 146 | MOV BL,VERSION_MINOR ;; | ||
| 147 | MOV DI,OFFSET SD ;; | ||
| 148 | PUSH CS ;; | ||
| 149 | POP ES ;; | ||
| 150 | JMP INT_2F_DONE ;; | ||
| 151 | ;; | ||
| 152 | INT_2F_CP_INVOKE: ;; | ||
| 153 | CMP AL,CP_INVOKE ;; Q..invoke CP? | ||
| 154 | JNE INT_2F_CP_LANGUAGE ;; N..next | ||
| 155 | ;; | ||
| 156 | MOV SI,SD.FIRST_XLAT_PTR ;; Get FIRST_XLAT_PTR | ||
| 157 | ;; | ||
| 158 | INT_2F_NEXT_SECTION: ;; | ||
| 159 | CMP SI,-1 ;; | ||
| 160 | JE INT_2F_ERROR_FLAG ;; | ||
| 161 | MOV CX,[SI].XS_CP_ID ;; Read in the code page value | ||
| 162 | CMP CX,BX ;; Is this the table to make active? | ||
| 163 | JNE INT_2F_CP_INVOKE_CONT1 ;; | ||
| 164 | MOV SD.ACTIVE_XLAT_PTR,SI ;; IF Yes, Set the ACTIVE_XLAT_PTR | ||
| 165 | MOV SD.INVOKED_CP_TABLE,BX ;; record new code page | ||
| 166 | JMP INT_2F_DONE ;; | ||
| 167 | ;; | ||
| 168 | INT_2F_CP_INVOKE_CONT1: ;; Else | ||
| 169 | MOV DI,[SI].XS_NEXT_SECT_PTR ;; IF No, | ||
| 170 | MOV SI,DI ;; Get NEXT_SECT_PTR | ||
| 171 | JMP INT_2F_NEXT_SECTION ;; NEXT_SECTION | ||
| 172 | ;; | ||
| 173 | INT_2F_ERROR_FLAG: ;; | ||
| 174 | MOV AX,1 ;; | ||
| 175 | MOV RESTORE_BP,BP ;;;;;; | ||
| 176 | MOV BP,SP ;; | ||
| 177 | OR WORD PTR [BP]+12,CARRY_FLAG ;; Set carry flag | ||
| 178 | MOV BP,RESTORE_BP ;; | ||
| 179 | ;;;;;; | ||
| 180 | JMP INT_2F_DONE ;; | ||
| 181 | ;; | ||
| 182 | INT_2F_CP_LANGUAGE: ;; | ||
| 183 | CMP AL,CP_LANGUAGE ;; Q..Set default language?? | ||
| 184 | JNE INT_2F_DONE ;; N..next | ||
| 185 | ;; | ||
| 186 | CMP BL,0 ;; Y..Check if Language is to be US437 | ||
| 187 | JNE INT_2F_CONTINUE1 ;; IF yes THEN, | ||
| 188 | MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to 0 | ||
| 189 | JMP INT_2F_DONE ;; | ||
| 190 | ;; | ||
| 191 | INT_2F_CONTINUE1: ;; ELSE | ||
| 192 | CMP BL,-1 ;; Check if language is to be national | ||
| 193 | JNE INT_2F_LANG_ERROR_FLAG ;; IF yes THEN, | ||
| 194 | MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to -1 (0FFH) | ||
| 195 | JMP INT_2F_DONE ;; | ||
| 196 | ;; | ||
| 197 | INT_2F_LANG_ERROR_FLAG: ;; ELSE | ||
| 198 | MOV RESTORE_BP,BP ;;;;;; Set CARRY flag | ||
| 199 | MOV BP,SP ;; | ||
| 200 | OR WORD PTR [BP]+12,CARRY_FLAG ;; | ||
| 201 | MOV BP,RESTORE_BP ;; | ||
| 202 | ;;;;;; | ||
| 203 | JMP INT_2F_DONE ;; | ||
| 204 | ;; | ||
| 205 | INT_2F_DONE: ;; | ||
| 206 | POP SI ;; | ||
| 207 | POP CX ;; | ||
| 208 | POP BX ;;;;;;; | ||
| 209 | POP DS ;; | ||
| 210 | CMP WORD PTR CS:SD.OLD_INT_2F,0 ;; Q..are we the last in the chain? | ||
| 211 | JNE INT_2F_JMP ;; N..call next in chain | ||
| 212 | CMP WORD PTR CS:SD.OLD_INT_2F+2,0 ;; Q..are we the last in the chain? | ||
| 213 | JNE INT_2F_JMP ;; N..call next in chain | ||
| 214 | ;;;;;;; | ||
| 215 | IRET ;; Y..return to caller | ||
| 216 | ;; | ||
| 217 | INT_2F_JMP: ;; | ||
| 218 | ;; | ||
| 219 | JMP CS:SD.OLD_INT_2F ;; | ||
| 220 | ;; | ||
| 221 | KEYB_INT_2F ENDP ;; | ||
| 222 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 223 | |||
| 224 | CODE ENDS | ||
| 225 | END | ||