]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/DISPLAY/INT2FCOM.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / DISPLAY / INT2FCOM.INC
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; INTERRUPT 2F HEX COMMUNICATION ROUTINE
3 ;
4 ; This routine is used to communicate between the CON driver
5 ; and the Keyboard routine. The various calls are as follows:
6 ;
7 ; 1) not yet defined
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 IF1 ;
10 %OUT . ®INT2FCOM.INC¯
11 ENDIF ;
12 PUBLIC ROM_INT_2F ;
13 PUBLIC INT_2F_COM ;
14 PUBLIC ABORT ;
15 ;
16 CON_REQ LABEL WORD ; THESE CALLS START AT '00H'
17 DW OFFSET CON_INSTALL ;
18 DW OFFSET CON_INVOKE ;
19 DW OFFSET CON_QUERY_CP ;
20 DW OFFSET CON_QUERY_PARAMETER ;
21 CON_MAX EQU ($-CON_REQ)/2 ;
22 ;
23 QPARM_TABLE LABEL WORD ;
24 DW OFFSET CPD_DESG_N ;
25 DW OFFSET CPD_FONTS_N ;
26 DW OFFSET CPD_HDWR_N ;
27 QPARM_ENTRY EQU ($-QPARM_TABLE)/2 ;
28 ;
29 ROM_INT_2F DW ? ; Int 2FH vector offset
30 DW ? ; Int 2FH vector segment
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 ;
33 ; INTERRUPT 2F HEX
34 ;
35 ; Communication between the KEYBOARD (KEYB.COM) and the
36 ; CON Device Driver.
37 ;
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39 INT_2F_COM PROC FAR ;
40 STI ;
41 CMP AH,0ADH ; TEST THE SUBFUNCTION CALL
42 JNE I2C_6 ; RESERVED FOR THE COM PATH!
43 ;
44 CMP AL,10H ; WGR ;AN000;
45 JNE I2C_0 ; WGR ;AN000;
46 CALL CHECK_VALID ; WGR ;AN000;
47 PUSH SI ; WGR ;AN000;
48 JMP I2C_1 ; WGR ;AN000;
49 I2C_0: ; WGR
50 CMP AL,CON_MAX ; TEST IF IT IS ABOVE HIGH
51 JAE I2C_6 ; CON CALL?
52 ;
53 PUSH SI ; FORMULATE THE JUMP POINTER
54 PUSH AX ;
55 XOR AH,AH ;
56 MOV SI,AX ;
57 POP AX ;
58 ADD SI,SI ;
59 CALL CS:CON_REQ[SI] ; call routine to handle the command
60 I2C_1: ;
61 PUSH AX ; SAVE AX REGISTER TO PLAY WITH STACK
62 MOV SI,SP ;
63 MOV AX,SS:[SI+8] ; ACCOUNT FOR SI & AX ON STACK
64 JC I2C_2 ;
65 AND AX,NOT_CY ;
66 JUMP I2C_3 ;
67 I2C_2: OR AX,CY ;
68 I2C_3: MOV SS:[SI+8],AX ;
69 POP AX ;
70 POP SI ;
71 ABORT: IRET ;
72 I2C_6: JMP DWORD PTR CS:ROM_INT_2F ;
73 INT_2F_COM ENDP ;
74 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
75 ;
76 ; CON_INSTALL
77 ;
78 ; A STRAIGHT FORWARD ROUTINE WHICH INDICATES WHETHER OR NOT
79 ; ANY PC DOS CPS-CON SUPPORT WAS LOADED DURING BOOTSTRAP.
80 ; THE INTERFACE IS AS PER 'DOS FUNCTIONAL SPEC'
81 ; (Program Interfaces).
82 ;
83 ; INPUT:
84 ; none
85 ;
86 ; OUTPUT:
87 ; AX = (-1) if loaded
88 ; no change if not....since this is not even loaded!
89 ; BX = [upper nibble][lower nibble] = MAJOR - MINOR
90 ; release number.
91 ;
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93 CON_INSTALL PROC ;
94 MOV AX,-1 ; CHANGE AX TO '0FFFFH' AND BX TO
95 MOV BX,0100H ; MAJOR - MINOR VERSION #
96 CLC ; NO ERROR TO INDICATE....
97 RET ;
98 CON_INSTALL ENDP ;
99 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
100 ;
101 ; CHECK_VALID
102 ;
103 ; THIS ROUTINE CHECKS TO SEE IF THE CURRENT CODE PAGE HAS BEEN
104 ; PREPARED FOR AN 8X8 RAM FONT. THIS IS AN INTERFACE TO ANSI.SYS
105 ; TO ENSURE THAT A REQUEST FOR > 25 LINES IS VALID.
106 ;
107 ; INPUT:
108 ; none
109 ;
110 ; OUTPUT:
111 ; CF = 1 IF NOT FONT NOT AVAILABLE
112 ; = 0 IF FONT IS AVAILABLE.
113 ;
114 ; AUTHOR: WGR
115 ;
116 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117 CHECK_VALID PROC ; ;AN000;
118 CMP CS:CPD_ACTIVE,-1 ; see if a code page has been.. ;AN000;
119 JNE CV_1 ; selected? ;AN000;
120 CLC ; no..therefore hardware code page.. ;AN000;
121 JMP CV_4 ; okay...exit with carry clear. ;AN000;
122 CV_1: ; ;AN000;
123 PUSH BX ; s ;AN000;
124 PUSH CX ; a ;AN000;
125 PUSH DX ; v ;AN000;
126 PUSH DI ; e ;AN000;
127 PUSH SI ; r ;AN000;
128 PUSH DS ; e ;AN000;
129 PUSH ES ; g ;AN000;
130 PUSH CS ; s. ;AN000;
131 POP DS ; establish addressibility to data ;AN000;
132 MOV CX,CPD_ACTIVE ; use active code page... ;AN000;
133 CALL FIND_CP ; is the code page prepared? ;AN000;
134 JC CV_3 ; no....problem..exit with carry set. ;AN000;
135 CMP CX,0 ; okay...check if hardware code page? ;AN000;
136 JNE CV_2 ; ;AN000;
137 CLC ; yes...so okay...exit with carry clear;AN000;
138 JMP CV_3 ; ;AN000;
139 CV_2: ; ;AN000;
140 MOV DL,CS:BYTES_PER_CHAR ; save current box size.. ;AN000;
141 PUSH DX ; ;AN000;
142 MOV CS:BYTES_PER_CHAR,8 ; check for 8x8 box (>25 line support) ;AN000;
143 CALL FIND_FONT ; is font size there?? ;AN000;
144 POP DX ; ;AN000;
145 MOV CS:BYTES_PER_CHAR,DL ; restore old box size...FIND_FONT... ;AN000;
146 CV_3: ; will have returned.. ;AN000;
147 POP ES ; with carry set appropriately ;AN000;
148 POP DS ; ;AN000;
149 POP SI ; restore ;AN000;
150 POP DI ; ;AN000;
151 POP DX ; registers. ;AN000;
152 POP CX ; ;AN000;
153 POP BX ; ;AN000;
154 CV_4: ; ;AN000;
155 RET ; return. ;AN000;
156 CHECK_VALID ENDP ; ;AN000;
157 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
158 ;
159 ; CON_INVOKE
160 ;
161 ; THIS ROUTINE IS A SECOND INTERFACE TO THE CPS CON DEVICE
162 ; TO ACTIVATE A PARTICULAR CODE PAGE. THIS MAKE USE OF THE
163 ; SAME ROUTINES AS THE GENERIC IOCTL CALLS (via INT 21H).
164 ; A SEMAPHORE IS PROVIDED BY THE IOCTL CALLS TO PREVENT
165 ; RE-ENTRANCY....WHICH MAY CAUSE INTERESTING RESULTS!!
166 ;
167 ; INPUT:
168 ; BX = code page to activate
169 ;
170 ; OUTPUT:
171 ; CY = 0 if CP was activated
172 ; 1 if an error occurred during activation
173 ;
174 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175 CON_INVOKE PROC ;
176 PUSH DS ;
177 PUSH ES ;
178 CMP CS:G_IOCTL_SEMA,ONE ; ARE GENERIC IOCTL ROUTINES ACTIVE???
179 JE CI_3 ; IF SO, THEN EXIT WITH ERROR...
180 ;
181 PUSH CS ;
182 POP DS ;
183 PUSH CS ;
184 POP ES ;
185 PUSH CPD_ACTIVE ;
186 MOV CPD_ACTIVE,BX ; SET THE ACTIVE CP = REQUESTED
187 CALL TEST_CP ; FIND OUT IF CP IS THERE....
188 POP CPD_ACTIVE ;
189 JC CI_3 ; IF CY=1, THEN LEAVE OLD CP ALONE!
190 CALL INVOKE_DATA ; LOAD THE DATA....
191 JC CI_3 ; IF ERROR, THEN FONT NOT AVAILABLE
192 MOV CPD_ACTIVE,BX ;
193 PUSH DX ;
194 MOV DX,BX ;
195 CALL SIGNAL_KBD_INVK ;
196 POP DX ;
197 JC CI_3 ; SET CARRY IF KEYBOARD ERROR OCCURRED.
198 CLC ; NO ERROR TO INDICATE....
199 POP ES ;
200 POP DS ;
201 RET ;
202 CI_3: STC ;
203 POP ES ;
204 POP DS ;
205 RET ;
206 CON_INVOKE ENDP ;
207 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;
209 ; CON_QUERY_CP
210 ;
211 ; RETURNS THE ACTIVE CODE PAGE VALUE....CPD_ACTIVE VALUE
212 ; CHECKED FOR INVALID.
213 ;
214 ; INPUT:
215 ; none
216 ; OUTPUT:
217 ; BX = CODE PAGE ACTIVATED <-1 IF NONE ACTIVE>
218 ; CY = 1 IF CP INVALID (BX = -1)
219 ; 0 IF CP VALID
220 ;
221 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
222 CON_QUERY_CP PROC ;
223 MOV BX,CS:CPD_ACTIVE ;
224 CMP BX,-1 ;
225 JNE CQCP_0 ;
226 MOV AX,ONE ; SET ERROR CONDITION TO (non-active)
227 STC ;
228 RET ;
229 CQCP_0: CLC ;
230 RET ;
231 CON_QUERY_CP ENDP ;
232 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
233 ;
234 ; QUERY PARAMETER INFORMATION
235 ;
236 ; ENTRY: ES:DI points to data table
237 ; CX = max size of table to fill (in bytes)
238 ; EXIT: ES:DI filled with formatted data; DW #DESG,#FONTS,#HDWR,CPx's
239 ; CY = 1 if problem with table creation
240 ;
241 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
242 CON_QUERY_PARAMETER PROC ;
243 PUSH DS ;
244 PUSH AX ;
245 PUSH BX ;
246 PUSH CX ;
247 PUSH DI ;
248 ;
249 PUSH CS ;
250 POP DS ;
251 ; PERFORM CHECK ON LGTH OF BUFFER
252 MOV BX,THREE ; MANDATORY THREE WORD-STARTER
253 ADD BX,CPD_HDWR_N ; ADD # CP's IN HARDWARE
254 ADD BX,CPD_DESG_N ; ADD # CP's IN DESIGNATION
255 SHL BX,1 ; CONVERT TO BYTES
256 CMP BX,CX ; VERIFY THAT TABLE WILL FIT...
257 JG CQP_3 ; SET ERROR CONDITION!
258 ;
259 LEA BX,QPARM_TABLE ;
260 MOV CX,QPARM_ENTRY ;
261 CQP_0: MOV SI,[BX] ;
262 MOV AX,[SI] ;
263 MOV ES:[DI],AX ;
264 INC BX ;
265 INC BX ;
266 INC DI ;
267 INC DI ;
268 LOOP CQP_0 ;
269 ;
270 CALL GET_HDWR_CP ;
271 MOV CX,[SI] ;
272 OR CX,CX ;
273 JZ CQP_1 ;
274 INC SI ;
275 INC SI ;
276 REP MOVSW ;
277 ;
278 CQP_1: CALL GET_DESG_CP ;
279 MOV CX,[SI] ;
280 OR CX,CX ;
281 JE CQP_2 ;
282 INC SI ;
283 INC SI ;
284 REP MOVSW ;
285 ;
286 CQP_2: POP DI ;
287 POP CX ;
288 POP BX ;
289 POP AX ;
290 POP DS ;
291 CLC ; CLEAR ERROR CONDITION!
292 RET ;
293 ;
294 CQP_3: POP DI ;
295 POP CX ;
296 POP BX ;
297 POP AX ;
298 POP DS ;
299 STC ; TELL CALLER THAT ERROR OCCURRED!
300 RET ;
301 CON_QUERY_PARAMETER ENDP ;
302 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
303 ;
304 ; SIGNAL KEYBOARD THAT INVOKE JUST OCCURRED!
305 ;
306 ; INPUT:
307 ; DX = code page just invoked!
308 ; OUTPUT:
309 ; none
310 ;
311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
312 SIGNAL_KBD_INVK PROC ;
313 PUSH AX ;
314 PUSH BX ;
315 MOV AX,0AD81H ;
316 MOV BX,DX ;
317 CLC ; CLEAR THE CARRY IN CASE NOT THERE
318 INT 2FH ;
319 POP BX ;
320 POP AX ;
321 RET ;
322 SIGNAL_KBD_INVK ENDP ;
323 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;