summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB/KEYBI2F.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/KEYB/KEYBI2F.ASM')
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI2F.ASM225
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 ;;
58CODE 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 ;;
106CP_QUERY EQU 80H ;;
107CP_INVOKE EQU 81H ;;
108CP_LANGUAGE EQU 82H ;;
109 ;;
110VERSION_MAJOR EQU 01H ;;
111VERSION_MINOR EQU 00H ;;
112 ;;
113CARRY_FLAG EQU 01H ;;
114RESTORE_BP DW ? ;;
115 ;;
116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117;;
118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119 ;;
120KEYB_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 ;;
134CHECK_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 ;;
141INT_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 ;;
152INT_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 ;;
158INT_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 ;;
168INT_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 ;;
173INT_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 ;;
182INT_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 ;;
191INT_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 ;;
197INT_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 ;;
205INT_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 ;;
217INT_2F_JMP: ;;
218 ;;
219 JMP CS:SD.OLD_INT_2F ;;
220 ;;
221KEYB_INT_2F ENDP ;;
222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223
224CODE ENDS
225 END