summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI/ANSIINIT.ASM
blob: 352150e42b0e97cd96753f681296297905df9079 (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
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
PAGE	,132
TITLE	ANSI Console device CON$INIT routine

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  MODULE_NAME: CON$INIT
;
;  FUNCTION:
;    THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES
;  FOR ANSI.SYS.
;
;  THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE
;  FOR RELEASE 4.00 OF DOS.  ALL CHANGED LINES HAVE BEEN MARKED WITH
;  WGR. NEW PROCS HAVE BEEN MARKED AS SUCH.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;AN001; P1767 VIDEO_MODE_TABLE not initialized correctly	   10/16/87 J.K.
;AN002; P2617 Order dependecy problem with Display.sys		   11/23/87 J.K.
;AN003; D479  An option to disable the extended keyboard functions 02/12/88 J.K.
;AN004; D493 New INIT request structure for error message	   02/25/88 J.K.
;-------------------------------------------------------------------------------

INCLUDE    ANSI.INC		   ; WGR equates and strucs				 ;AN000;
.XLIST
INCLUDE    STRUC.INC		   ; WGR structured macros				 ;AN000;
.LIST

PUBLIC	   CON$INIT		   ; WGR						 ;AN000;


CODE	SEGMENT  PUBLIC  BYTE
	ASSUME	CS:CODE,DS:CODE

EXTRN	VIDEO_MODE_TABLE:BYTE	       ; WGR						 ;AN000;
EXTRN	FUNC_INFO:BYTE		       ; WGR						 ;AN000;
EXTRN	HDWR_FLAG:WORD		       ; WGR						 ;AN000;
EXTRN	VIDEO_TABLE_MAX:ABS	       ; WGR						 ;AN000;
EXTRN	SCAN_LINES:BYTE 	       ; WGR						 ;AN000;
EXTRN	PTRSAV:DWORD		       ; WGR						 ;AN000;
EXTRN	PARSE_PARM:NEAR 	       ; WGR						 ;AN000;
EXTRN	ERR2:NEAR		       ; WGR						 ;AN000;
EXTRN	EXT_16:BYTE		       ; WGR						 ;AN000;
EXTRN	BRKADR:ABS		       ; WGR						 ;AN000;
EXTRN	BRKKY:NEAR		       ; WGR						 ;AN000;
EXTRN	COUT:NEAR		       ; WGR						 ;AN000;
EXTRN	BASE:WORD		       ; WGR						 ;AN000;
EXTRN	MODE:BYTE		       ; WGR						 ;AN000;
EXTRN	MAXCOL:BYTE		       ; WGR						 ;AN000;
EXTRN	TRANS:ABS		       ; WGR						 ;AN000;
EXTRN	STATUS:ABS		       ; WGR						 ;AN000;
EXTRN	EXIT:NEAR		       ; WGR						 ;AN000;
EXTRN	MAX_SCANS:BYTE		       ; WGR						 ;AN000;
EXTRN	ROM_INT10:WORD		       ; WGR						 ;AN000;
EXTRN	INT10_COM:NEAR		       ; WGR						 ;AN000;
EXTRN	ROM_INT2F:WORD		       ; WGR						 ;AN000;
EXTRN	INT2F_COM:NEAR		       ; WGR						 ;AN000;
EXTRN	ABORT:BYTE		       ; WGR						 ;AN000;
extrn	Display_Loaded_Before_me:byte  ;AN002;Defined in IOCTL.ASM
extrn	Switch_K:Byte		       ;AN003;

INCLUDE   ANSIVID.INC		       ; WGR video tables data				 ;AN000;

CON$INIT:
	LDS	BX,CS:[PTRSAV]	       ; WGR establish addressability to request header  ;AC000;
	LDS	SI,[BX].ARG_PTR        ; WGR DS:SI now points to rest of DEVICE=statement;AN000;
	CALL	PARSE_PARM	       ; WGR parse DEVICE= command line 		 ;AN000;
	JNC	CONT_INIT	       ; WGR no error in parse...continue install	 ;AN000;
	LDS	BX,CS:[PTRSAV]	       ; WGR prepare to abort install			 ;AC000;
	XOR	AX,AX		       ; WGR						 ;AC000;
	MOV	[BX].NUM_UNITS,AL      ; WGR set number of units to zero		 ;AC000;
	MOV	[BX].END_ADDRESS_O,AX  ; WGR set ending address offset to 0		 ;AC000;
	MOV	[BX].END_ADDRESS_S,CS  ; WGR set ending address segment to CS		 ;AC000;
	mov	word ptr [bx].CONFIG_ERRMSG, -1 ;AN004; Let IBMBIO display "Error in CONFIG.SYS..".
	MOV	AX,UNKNOWN_CMD	       ; WGR set error in status			 ;AC000;
	MOV	WORD PTR [BX].STATUS,AX ; WGR set error status				 ;AC000;
	JMP	ERR2		       ; WGR prepare to exit				 ;AN000;

CONT_INIT:			       ; WGR						 ;AN000;
	PUSH	CS		       ; WGR						 ;AN000;
	POP	DS		       ; WGR restore DS to ANSI segment 		 ;AN000;
	MOV	AX,ROM_BIOS	       ; WGR						 ;AN000;
	MOV	ES,AX		       ; WGR DS now points to BIOS data area		 ;AN000;
	MOV	AH,ES:[KBD_FLAG_3]     ; WGR load AH with KBD_FLAG_3			 ;AN000;
	.IF  <BIT AH AND EXT16_FLAG> AND   ; WGR see if extended INT16 is loaded	       ;AN000;
	.IF  <Switch_K EQ OFF>	       ;The user does not want to disable the extended INT 16h ;AN003;
	  MOV	  EXT_16,ON	       ; WGR extended INT16 available, set flag 	 ;AN000;
	.ENDIF			       ; WGR						 ;AN000;
	CALL	DET_HDWR	       ; WGR procedure to determine video hardware status;AN000;
	.IF <HDWR_FLAG GE MCGA_ACTIVE> ; WGR if we have EGA or better then..		 ;AN000;
	  MOV	  AH,ALT_SELECT        ; WGR issue select alternate print..		 ;AN000;
	  MOV	  BL,ALT_PRT_SC        ; WGR screen routine call..			 ;AN000;
	  INT	  10H		       ; WGR						 ;AN000;
	.ENDIF
	CALL	LOAD_INT10	       ; WGR load interrupt 10h handler 		 ;AN000;
	CALL	LOAD_INT2F	       ; WGR load interrupt 2Fh handler 		 ;AN000;
	int	11h
	and	al,00110000b
	cmp	al,00110000b
	jnz	iscolor
	mov	[base],0b000h		;look for bw card
iscolor:
	cmp	al,00010000b		;look for 40 col mode
	ja	setbrk
	mov	[mode],0
	mov	[maxcol],39

setbrk:
	XOR	BX,BX
	MOV	DS,BX
	MOV	BX,BRKADR
	MOV	WORD PTR [BX],OFFSET BRKKY
	MOV	WORD PTR [BX+2],CS

	MOV	BX,29H*4
	MOV	WORD PTR [BX],OFFSET COUT
	MOV	WORD PTR [BX+2],CS

	LDS	BX,CS:[PTRSAV]
	MOV	WORD PTR [BX].TRANS,OFFSET CON$INIT	;SET BREAK ADDRESS
	MOV	[BX].TRANS+2,CS
	JMP	EXIT


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  PROCEDURE_NAME: DET_HDWR
;
;  FUNCTION:
;  THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE.  THIS INFORMATION
;  IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE
;  GENERIC IOCTL.
;
;  AT ENTRY:
;
;  AT EXIT:
;     NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE
;	      TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE
;	      WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE
;	      INSTALLED ADAPTER.
;	      VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING
;	      APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS.
;
;     ERROR:  N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DET_HDWR  PROC	  NEAR									 ;AN000;
	  MOV	 AH,GET_SYS_ID		     ; see if this is a Convertible		 ;AN000;
	  INT	 15H			     ;						 ;AN000;
	  .IF <ES:[BX].MODEL_BYTE EQ LCD_MODEL> AND ; yes...check for LCD attached?	 ;AN000;
	  MOV	 AH,GET_STATUS		     ; system status will tell us		 ;AN000;
	  INT	 15H			     ;						 ;AN000;
	  .IF <BIT AL NAND ON>		     ; if bit 0 = 0 then LCD..			 ;AN000;
	     OR     HDWR_FLAG,LCD_ACTIVE     ; so ...set hdwr flag and...		 ;AN000;
	     LEA    SI,COLOR_TABLE	     ;						 ;AN000;
	     MOV    CX,COLOR_NUM	     ; load color table (for LCD)		 ;AN000;
	     CALL   LOAD_TABLE		     ;						 ;AN000;
	     LEA    SI,MONO_TABLE	     ; and mono table				 ;AN000;
	     MOV    CX,MONO_NUM 	     ;						 ;AN000;
	     CALL   LOAD_TABLE		     ;						 ;AN000;
	  .ELSE 			     ; not LCD...check for CGA and mono 	 ;AN000;
	    MOV   AX,MONO_ADDRESS	     ; write to mono buffer to see if present	 ;AN000;
	    CALL  CHECK_BUF		     ;						 ;AN000;
	    .IF <AH EQ AL>		     ; if present then...			 ;AN000;
	      OR     HDWR_FLAG,MONO_ACTIVE   ; set hdwr flag and..			 ;AN000;
	      LEA    SI,MONO_TABLE	     ;						 ;AN000;
	      MOV    CX,MONO_NUM	     ; load mono table				 ;AN000;
	      CALL   LOAD_TABLE 	     ;						 ;AN000;
	    .ENDIF			     ;						 ;AN000;
	    MOV   AX,COLOR_ADDRESS	     ; write to CGA buffer to see if present	 ;AN000;
	    CALL  CHECK_BUF		     ;						 ;AN000;
	    .IF <AH EQ AL>		     ; if present then..			 ;AN000;
	      OR     HDWR_FLAG,CGA_ACTIVE    ; set hdwr flag and...			 ;AN000;
	      LEA    SI,COLOR_TABLE	     ;						 ;AN000;
	      MOV    CX,COLOR_NUM	     ; load color table 			 ;AN000;
	      CALL   LOAD_TABLE 	     ;						 ;AN000;
	    .ENDIF			     ;						 ;AN000;
	  .ENDIF			     ;						 ;AN000;
	  PUSH	  CS			     ; setup addressiblity for			 ;AN000;
	  POP	  ES			     ;	functionality call			 ;AN000;
	  XOR	  AX,AX 		     ;						 ;AN000;
	  MOV	  AH,FUNC_CALL		     ; functionality call			 ;AN000;
	  XOR	  BX,BX 		     ; implementation type 0			 ;AN000;
	  LEA	  DI,FUNC_INFO		     ; block to hold data			 ;AN000;
	  INT	  10H			     ;						 ;AN000;
	  .IF <AL EQ FUNC_CALL> 	     ; if call supported then.. 		 ;AN000;
	    .IF <BIT [DI].MISC_INFO AND ON>  ; test bit to see if VGA			 ;AN000;
	      OR     HDWR_FLAG,VGA_ACTIVE    ; yes ....so				 ;AN000;
	      LEA    SI,COLOR_TABLE	     ; set hdwr flag and...			 ;AN000;
	      MOV    CX,COLOR_NUM	     ; load color table +..			 ;AN000;
	      CALL   LOAD_TABLE 	     ;						 ;AN000;
	      LEA    SI,VGA_TABLE	     ; load VGA table				 ;AN000;
	      MOV    CX,VGA_NUM 	     ;						 ;AN000;
	      CALL   LOAD_TABLE 	     ;						 ;AN000;
	    .ELSE			     ; not VGA...then must be MCGA		 ;AN000;
	      .IF <[DI].ACTIVE_DISPLAY EQ MOD30_MONO> OR				 ;AN000;
	      .IF <[DI].ACTIVE_DISPLAY EQ MOD30_COLOR> OR				 ;AN000;
	      .IF <[DI].ALT_DISPLAY EQ MOD30_MONO> OR					 ;AN000;
	      .IF <[DI].ALT_DISPLAY EQ MOD30_COLOR>					 ;AN000;
		OR     HDWR_FLAG,MCGA_ACTIVE ; so...set hdwr flag and...		 ;AN000;
		LEA    SI,COLOR_TABLE	     ;						 ;AN000;
		MOV    CX,COLOR_NUM	     ; load color table +..			 ;AN000;
		CALL   LOAD_TABLE	     ;						 ;AN000;
		LEA    SI,MCGA_TABLE	     ; load MCGA table				 ;AN000;
		MOV    CX,MCGA_NUM	     ;						 ;AN000;
		CALL   LOAD_TABLE	     ;						 ;AN000;
	      .ENDIF			     ;						 ;AN000;
	    .ENDIF			     ;						 ;AN000;
	    MOV    AL,[DI].CURRENT_SCANS     ; copy current scan line setting.. 	 ;AN000;
	    MOV    MAX_SCANS,AL 	     ; as maximum text mode scan setting.	 ;AN000;
	    LES    DI,[DI].STATIC_ADDRESS    ; point to static functionality table	 ;AN000;
	    MOV    AL,ES:[DI].SCAN_TEXT      ; load available scan line flag byte..	 ;AN000;
	    MOV    SCAN_LINES,AL	     ; and store it in resident data.		 ;AN000;
	  .ELSE 			     ; call not supported..try EGA		 ;AN000;
	    MOV    AH,ALT_SELECT	     ; alternate select call			 ;AN000;
	    MOV    BL,EGA_INFO		     ; get EGA information subcall		 ;AN000;
	    INT    10H			     ;						 ;AN000;
	    .IF <BL NE EGA_INFO>	     ; check if call was valid			 ;AN000;
	      .IF <BH EQ MONOCHROME>	     ; yes...check for monochrome		 ;AN000;
		OR    HDWR_FLAG,E5151_ACTIVE ; ..5151 found so set hdwr flag and..	 ;AN000;
		LEA   SI,EGA_5151_TABLE      ;						 ;AN000;
		MOV   CX,EGA_5151_NUM	     ; load 5151 table. 			 ;AN000;
		CALL  LOAD_TABLE	     ;						 ;AN000;
	      .ELSE			     ;						 ;AN000;
		AND   CL,0FH		     ; clear upper nibble of switch setting byte ;AN000;
		.IF <CL EQ NINE> OR	     ; test for switch settings of 5154 	 ;AN000;
		.IF <CL EQ THREE>	     ; ..5154 found..				 ;AN000;
		  OR	 HDWR_FLAG,E5154_ACTIVE ; so..set hdwr flag and...		 ;AN000;
		  LEA	 SI,COLOR_TABLE      ;						 ;AN000;
		  MOV	 CX,COLOR_NUM	     ; load color table +..			 ;AN000;
		  CALL	 LOAD_TABLE	     ;						 ;AN000;
		  LEA	 SI,EGA_5154_TABLE   ; load 5154 table				 ;AN000;
		  MOV	 CX,EGA_5154_NUM     ;						 ;AN000;
		  CALL	 LOAD_TABLE	     ;						 ;AN000;
		.ELSE			     ; 5154 not found...must be 5153... 	 ;AN000;
		  OR	 HDWR_FLAG,E5153_ACTIVE ; so..set hdwr flag and...		 ;AN000;
		  LEA	 SI,COLOR_TABLE      ;						 ;AN000;
		  MOV	 CX,COLOR_NUM	     ; load color table +..			 ;AN000;
		  CALL	 LOAD_TABLE	     ;						 ;AN000;
		  LEA	 SI,EGA_5153_TABLE   ; load 5153 table				 ;AN000;
		  MOV	 CX,EGA_5153_NUM     ;						 ;AN000;
		  CALL	 LOAD_TABLE	     ;						 ;AN000;
		.ENDIF			     ;						 ;AN000;
	      .ENDIF			     ;						 ;AN000;
	    .ENDIF			     ;						 ;AN000;
	  .ENDIF			     ;						 ;AN000;
	  RET
DET_HDWR  ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: CHECK_BUF
;
; FUNCTION:
; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK
; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD.
;
; AT ENTRY:
;
; AT EXIT:
;    NORMAL: AH EQ AL IF BUFFER PRESENT
;	     AH NE AL IF NO BUFFER
;
;    ERROR: N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CHECK_BUF PROC	 NEAR		    ; write to video buffer to see if it is present	 ;AN000;
	  PUSH	 DS		    ;							 ;AN000;
	  MOV	 DS,AX		    ; load DS with address of buffer			 ;AN000;
	  MOV	 CH,DS:0	    ; save buffer information (if present)		 ;AN000;
	  MOV	 AL,55H 	    ; prepare to write sample data			 ;AN000;
	  MOV	 DS:0,AL	    ; write to buffer					 ;AN000;
	  PUSH	 BX		    ; terminate the bus so that lines.. 		 ;AN000;
	  POP	 BX		    ; are reset 					 ;AN000;
	  MOV	 AH,DS:0	    ; bring sample data back... 			 ;AN000;
	  MOV	 DS:0,CH	    ; repair damage to buffer				 ;AN000;
	  POP	 DS		    ;							 ;AN000;
	  RET										 ;AN000;
CHECK_BUF ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: LOAD_TABLE
;
; FUNCTION:
; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA.
; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE.
; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN
; IN LOAD ORDERING.
;
; AT ENTRY:
;   SI: POINTS TO TOP OF TABLE TO COPY
;   CX: NUMBER OF RECORDS TO COPY
;
; AT EXIT:
;    NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA
;
;    ERROR: N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOAD_TABLE PROC   NEAR									 ;AN000;
	   PUSH   DI			  ; save DI					 ;AN000;
	   PUSH   ES			  ; and ES					 ;AN000;
	   PUSH   CS			  ; setup ES to code segment			 ;AN000;
	   POP	  ES			  ;						 ;AN000;
	   LEA	  DI,VIDEO_MODE_TABLE	  ; point DI to resident video table		 ;AN000;
	   .WHILE <CX NE 0> AND 	  ; do for as many records as there are 	 ;AN000;
	   .WHILE <DI LT VIDEO_TABLE_MAX> ; check to ensure other data not overwritten	 ;AN000;
	     MOV    AL,[DI].V_MODE	  ; prepare to check resident table		 ;AN000;
	     .IF <AL NE UNOCCUPIED> AND   ; if this spot is occupied...and		 ;AN000;
	     .IF <AL NE [SI].V_MODE>	  ; ...is not the same mode then...		 ;AN000;
	       ADD    DI,TYPE MODE_TABLE  ; do not touch...go to next mode		 ;AN000;
	     .ELSE			  ; can write at this location			 ;AN000;
	       PUSH   CX		  ; save record count				 ;AN000;
	       MOV    CX,TYPE MODE_TABLE  ; load record length				 ;AN000;
	       REP    MOVSB		  ; copy record to resident data		 ;AN000;
	       lea    DI,VIDEO_MODE_TABLE ;AN001; Set DI to the top of the target again.
	       POP    CX		  ; restore record count and..			 ;AN000;
	       DEC    CX		  ; decrement					 ;AN000;
	     .ENDIF			  ;						 ;AN000;
	   .ENDWHILE			  ;						 ;AN000;
	   POP	  ES			  ; restore..					 ;AN000;
	   POP	  DI			  ; registers					 ;AN000;
	   RET				  ;						 ;AN000;
LOAD_TABLE ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: LOAD_INT10
;
; FUNCTION:
; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H
;
; AT ENTRY:
;
; AT EXIT:
;    NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H
;	     VECTOR STORED.
;
;    ERROR:  N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOAD_INT10 PROC   NEAR									 ;AN000;
	   PUSH   ES									 ;AN000;
	   XOR	  AX,AX 			   ; point ES to low..			 ;AN000;
	   MOV	  ES,AX 			   ; memory.				 ;AN000;
	   MOV	  CX,ES:WORD PTR INT10_LOW	   ; store original..			 ;AN000;
	   MOV	  CS:ROM_INT10,CX		   ; interrupt 10h..			 ;AN000;
	   MOV	  CX,ES:WORD PTR INT10_HI	   ; location.. 			 ;AN000;
	   MOV	  CS:ROM_INT10+2,CX		   ;					 ;AN000;
	   CLI					   ;					 ;AN000;
	   MOV	  ES:WORD PTR INT10_LOW,OFFSET INT10_COM ; replace vector..		 ;AN000;
	   MOV	  ES:WORD PTR INT10_HI,CS	   ; with our own..			 ;AN000;
	   STI					   ;					 ;AN000;
	   mov	  ax, DISPLAY_CHECK		   ;AN002;DISPLAY.SYS already loaded?
	   int	  2fh				   ;AN002;
	   cmp	  al, INSTALLED 		   ;AN002;
	   jne	  L_INT10_Ret			   ;AN002;
	   mov	  cs:Display_Loaded_Before_Me,1    ;AN002;
L_INT10_Ret:					   ;AN002;
	   POP	  ES				   ;					 ;AN000;
	   RET					   ;					 ;AN000;
LOAD_INT10 ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: LOAD_INT2F
;
; FUNCTION:
; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
;
; AT ENTRY:
;
; AT EXIT:
;    NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
;	     VECTOR STORED.
;
;    ERROR:  N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOAD_INT2F PROC   NEAR									 ;AN000;
	   PUSH   ES									 ;AN000;
	   XOR	  AX,AX 			   ; point ES to low..			 ;AN000;
	   MOV	  ES,AX 			   ; memory.				 ;AN000;
	   MOV	  AX,ES:WORD PTR INT2F_LOW	   ; store original..			 ;AN000;
	   MOV	  CS:ROM_INT2F,AX		   ; interrupt 2Fh..			 ;AN000;
	   MOV	  CX,ES:WORD PTR INT2F_HI	   ; location.. 			 ;AN000;
	   MOV	  CS:ROM_INT2F+2,CX		   ;					 ;AN000;
	   OR	  AX,CX 			   ; check if old int2F..		 ;AN000;
	   .IF Z				   ; is 0.				 ;AN000;
	     MOV    AX,OFFSET ABORT		   ; yes....point to..			 ;AN000;
	     MOV    CS:ROM_INT2F,AX		   ; IRET.				 ;AN000;
	     MOV    AX,CS			   ;					 ;AN000;
	     MOV    CS:ROM_INT2F+2,AX		   ;					 ;AN000;
	   .ENDIF				   ;					 ;AN000;
	   CLI					   ;					 ;AN000;
	   MOV	  ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector..		 ;AN000;
	   MOV	  ES:WORD PTR INT2F_HI,CS	   ; with our own..			 ;AN000;
	   STI					   ;					 ;AN000;
	   POP	  ES				   ;					 ;AN000;
	   RET					   ;					 ;AN000;
LOAD_INT2F ENDP 									 ;AN000;


CODE	ENDS
	END