summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/INT2FCOM.INC
blob: c6007a6440fe2c3e02e1476786da5419fccd03a9 (plain) (blame)
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			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;