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