summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/INT2FCOM.INC
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/INT2FCOM.INC
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/INT2FCOM.INC')
-rw-r--r--v4.0/src/DEV/DISPLAY/INT2FCOM.INC323
1 files changed, 323 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/INT2FCOM.INC b/v4.0/src/DEV/DISPLAY/INT2FCOM.INC
new file mode 100644
index 0000000..c6007a6
--- /dev/null
+++ b/v4.0/src/DEV/DISPLAY/INT2FCOM.INC
@@ -0,0 +1,323 @@
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9IF1 ;
10 %OUT . ŽINT2FCOM.INC¯
11ENDIF ;
12 PUBLIC ROM_INT_2F ;
13 PUBLIC INT_2F_COM ;
14 PUBLIC ABORT ;
15 ;
16CON_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 ;
21CON_MAX EQU ($-CON_REQ)/2 ;
22 ;
23QPARM_TABLE LABEL WORD ;
24 DW OFFSET CPD_DESG_N ;
25 DW OFFSET CPD_FONTS_N ;
26 DW OFFSET CPD_HDWR_N ;
27QPARM_ENTRY EQU ($-QPARM_TABLE)/2 ;
28 ;
29ROM_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39INT_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;
49I2C_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
60I2C_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 ;
67I2C_2: OR AX,CY ;
68I2C_3: MOV SS:[SI+8],AX ;
69 POP AX ;
70 POP SI ;
71ABORT: IRET ;
72I2C_6: JMP DWORD PTR CS:ROM_INT_2F ;
73INT_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93CON_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 ;
98CON_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117CHECK_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;
122CV_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;
139CV_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;
146CV_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;
154CV_4: ; ;AN000;
155 RET ; return. ;AN000;
156CHECK_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175CON_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 ;
202CI_3: STC ;
203 POP ES ;
204 POP DS ;
205 RET ;
206CON_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
222CON_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 ;
229CQCP_0: CLC ;
230 RET ;
231CON_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
242CON_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 ;
261CQP_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 ;
278CQP_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 ;
286CQP_2: POP DI ;
287 POP CX ;
288 POP BX ;
289 POP AX ;
290 POP DS ;
291 CLC ; CLEAR ERROR CONDITION!
292 RET ;
293 ;
294CQP_3: POP DI ;
295 POP CX ;
296 POP BX ;
297 POP AX ;
298 POP DS ;
299 STC ; TELL CALLER THAT ERROR OCCURRED!
300 RET ;
301CON_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
312SIGNAL_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 ;
322SIGNAL_KBD_INVK ENDP ;
323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;