1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; INTERRUPT 2F HEX COMMUNICATION ROUTINE
4 ; This routine is used to communicate between the CON driver
5 ; and the Keyboard routine. The various calls are as follows:
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 ;
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 ;
29 ROM_INT_2F DW ? ; Int 2FH vector offset
30 DW ? ; Int 2FH vector segment
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ; Communication between the KEYBOARD (KEYB.COM) and the
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41 CMP AH,0ADH ; TEST THE SUBFUNCTION CALL
42 JNE I2C_6 ; RESERVED FOR THE COM PATH!
44 CMP AL,10H ; WGR ;AN000;
45 JNE I2C_0 ; WGR ;AN000;
46 CALL CHECK_VALID ; WGR ;AN000;
48 JMP I2C_1 ; WGR ;AN000;
50 CMP AL,CON_MAX ; TEST IF IT IS ABOVE HIGH
53 PUSH SI ; FORMULATE THE JUMP POINTER
59 CALL CS:CON_REQ[SI] ; call routine to handle the command
61 PUSH AX ; SAVE AX REGISTER TO PLAY WITH STACK
63 MOV AX,SS:[SI+8] ; ACCOUNT FOR SI & AX ON STACK
68 I2C_3: MOV SS:[SI+8],AX ;
72 I2C_6: JMP DWORD PTR CS:ROM_INT_2F ;
74 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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).
88 ; no change if not....since this is not even loaded!
89 ; BX = [upper nibble][lower nibble] = MAJOR - MINOR
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
94 MOV AX,-1 ; CHANGE AX TO '0FFFFH' AND BX TO
95 MOV BX,0100H ; MAJOR - MINOR VERSION #
96 CLC ; NO ERROR TO INDICATE....
99 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
111 ; CF = 1 IF NOT FONT NOT AVAILABLE
112 ; = 0 IF FONT IS AVAILABLE.
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;
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;
137 CLC ; yes...so okay...exit with carry clear;AN000;
140 MOV DL,CS:BYTES_PER_CHAR ; save current box size.. ;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;
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;
149 POP SI ; restore ;AN000;
151 POP DX ; registers. ;AN000;
155 RET ; return. ;AN000;
156 CHECK_VALID ENDP ; ;AN000;
157 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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!!
168 ; BX = code page to activate
171 ; CY = 0 if CP was activated
172 ; 1 if an error occurred during activation
174 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
178 CMP CS:G_IOCTL_SEMA,ONE ; ARE GENERIC IOCTL ROUTINES ACTIVE???
179 JE CI_3 ; IF SO, THEN EXIT WITH ERROR...
186 MOV CPD_ACTIVE,BX ; SET THE ACTIVE CP = REQUESTED
187 CALL TEST_CP ; FIND OUT IF CP IS THERE....
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
195 CALL SIGNAL_KBD_INVK ;
197 JC CI_3 ; SET CARRY IF KEYBOARD ERROR OCCURRED.
198 CLC ; NO ERROR TO INDICATE....
207 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
211 ; RETURNS THE ACTIVE CODE PAGE VALUE....CPD_ACTIVE VALUE
212 ; CHECKED FOR INVALID.
217 ; BX = CODE PAGE ACTIVATED <-1 IF NONE ACTIVE>
218 ; CY = 1 IF CP INVALID (BX = -1)
221 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223 MOV BX,CS:CPD_ACTIVE ;
226 MOV AX,ONE ; SET ERROR CONDITION TO (non-active)
232 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
234 ; QUERY PARAMETER INFORMATION
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
241 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
242 CON_QUERY_PARAMETER PROC ;
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!
278 CQP_1: CALL GET_DESG_CP ;
291 CLC ; CLEAR ERROR CONDITION!
299 STC ; TELL CALLER THAT ERROR OCCURRED!
301 CON_QUERY_PARAMETER ENDP ;
302 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
304 ; SIGNAL KEYBOARD THAT INVOKE JUST OCCURRED!
307 ; DX = code page just invoked!
311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
312 SIGNAL_KBD_INVK PROC ;
317 CLC ; CLEAR THE CARRY IN CASE NOT THERE
322 SIGNAL_KBD_INVK ENDP ;
323 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;