]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/KEYB/KEYBI2F.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / KEYB / KEYBI2F.ASM
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