]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/ANSI/ANSIINIT.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / ANSI / ANSIINIT.ASM
1 PAGE ,132
2 TITLE ANSI Console device CON$INIT routine
3
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 ;
6 ; MODULE_NAME: CON$INIT
7 ;
8 ; FUNCTION:
9 ; THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES
10 ; FOR ANSI.SYS.
11 ;
12 ; THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE
13 ; FOR RELEASE 4.00 OF DOS. ALL CHANGED LINES HAVE BEEN MARKED WITH
14 ; WGR. NEW PROCS HAVE BEEN MARKED AS SUCH.
15 ;
16 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ;AN001; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
18 ;AN002; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
19 ;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
20 ;AN004; D493 New INIT request structure for error message 02/25/88 J.K.
21 ;-------------------------------------------------------------------------------
22
23 INCLUDE ANSI.INC ; WGR equates and strucs ;AN000;
24 .XLIST
25 INCLUDE STRUC.INC ; WGR structured macros ;AN000;
26 .LIST
27
28 PUBLIC CON$INIT ; WGR ;AN000;
29
30
31 CODE SEGMENT PUBLIC BYTE
32 ASSUME CS:CODE,DS:CODE
33
34 EXTRN VIDEO_MODE_TABLE:BYTE ; WGR ;AN000;
35 EXTRN FUNC_INFO:BYTE ; WGR ;AN000;
36 EXTRN HDWR_FLAG:WORD ; WGR ;AN000;
37 EXTRN VIDEO_TABLE_MAX:ABS ; WGR ;AN000;
38 EXTRN SCAN_LINES:BYTE ; WGR ;AN000;
39 EXTRN PTRSAV:DWORD ; WGR ;AN000;
40 EXTRN PARSE_PARM:NEAR ; WGR ;AN000;
41 EXTRN ERR2:NEAR ; WGR ;AN000;
42 EXTRN EXT_16:BYTE ; WGR ;AN000;
43 EXTRN BRKADR:ABS ; WGR ;AN000;
44 EXTRN BRKKY:NEAR ; WGR ;AN000;
45 EXTRN COUT:NEAR ; WGR ;AN000;
46 EXTRN BASE:WORD ; WGR ;AN000;
47 EXTRN MODE:BYTE ; WGR ;AN000;
48 EXTRN MAXCOL:BYTE ; WGR ;AN000;
49 EXTRN TRANS:ABS ; WGR ;AN000;
50 EXTRN STATUS:ABS ; WGR ;AN000;
51 EXTRN EXIT:NEAR ; WGR ;AN000;
52 EXTRN MAX_SCANS:BYTE ; WGR ;AN000;
53 EXTRN ROM_INT10:WORD ; WGR ;AN000;
54 EXTRN INT10_COM:NEAR ; WGR ;AN000;
55 EXTRN ROM_INT2F:WORD ; WGR ;AN000;
56 EXTRN INT2F_COM:NEAR ; WGR ;AN000;
57 EXTRN ABORT:BYTE ; WGR ;AN000;
58 extrn Display_Loaded_Before_me:byte ;AN002;Defined in IOCTL.ASM
59 extrn Switch_K:Byte ;AN003;
60
61 INCLUDE ANSIVID.INC ; WGR video tables data ;AN000;
62
63 CON$INIT:
64 LDS BX,CS:[PTRSAV] ; WGR establish addressability to request header ;AC000;
65 LDS SI,[BX].ARG_PTR ; WGR DS:SI now points to rest of DEVICE=statement;AN000;
66 CALL PARSE_PARM ; WGR parse DEVICE= command line ;AN000;
67 JNC CONT_INIT ; WGR no error in parse...continue install ;AN000;
68 LDS BX,CS:[PTRSAV] ; WGR prepare to abort install ;AC000;
69 XOR AX,AX ; WGR ;AC000;
70 MOV [BX].NUM_UNITS,AL ; WGR set number of units to zero ;AC000;
71 MOV [BX].END_ADDRESS_O,AX ; WGR set ending address offset to 0 ;AC000;
72 MOV [BX].END_ADDRESS_S,CS ; WGR set ending address segment to CS ;AC000;
73 mov word ptr [bx].CONFIG_ERRMSG, -1 ;AN004; Let IBMBIO display "Error in CONFIG.SYS..".
74 MOV AX,UNKNOWN_CMD ; WGR set error in status ;AC000;
75 MOV WORD PTR [BX].STATUS,AX ; WGR set error status ;AC000;
76 JMP ERR2 ; WGR prepare to exit ;AN000;
77
78 CONT_INIT: ; WGR ;AN000;
79 PUSH CS ; WGR ;AN000;
80 POP DS ; WGR restore DS to ANSI segment ;AN000;
81 MOV AX,ROM_BIOS ; WGR ;AN000;
82 MOV ES,AX ; WGR DS now points to BIOS data area ;AN000;
83 MOV AH,ES:[KBD_FLAG_3] ; WGR load AH with KBD_FLAG_3 ;AN000;
84 .IF <BIT AH AND EXT16_FLAG> AND ; WGR see if extended INT16 is loaded ;AN000;
85 .IF <Switch_K EQ OFF> ;The user does not want to disable the extended INT 16h ;AN003;
86 MOV EXT_16,ON ; WGR extended INT16 available, set flag ;AN000;
87 .ENDIF ; WGR ;AN000;
88 CALL DET_HDWR ; WGR procedure to determine video hardware status;AN000;
89 .IF <HDWR_FLAG GE MCGA_ACTIVE> ; WGR if we have EGA or better then.. ;AN000;
90 MOV AH,ALT_SELECT ; WGR issue select alternate print.. ;AN000;
91 MOV BL,ALT_PRT_SC ; WGR screen routine call.. ;AN000;
92 INT 10H ; WGR ;AN000;
93 .ENDIF
94 CALL LOAD_INT10 ; WGR load interrupt 10h handler ;AN000;
95 CALL LOAD_INT2F ; WGR load interrupt 2Fh handler ;AN000;
96 int 11h
97 and al,00110000b
98 cmp al,00110000b
99 jnz iscolor
100 mov [base],0b000h ;look for bw card
101 iscolor:
102 cmp al,00010000b ;look for 40 col mode
103 ja setbrk
104 mov [mode],0
105 mov [maxcol],39
106
107 setbrk:
108 XOR BX,BX
109 MOV DS,BX
110 MOV BX,BRKADR
111 MOV WORD PTR [BX],OFFSET BRKKY
112 MOV WORD PTR [BX+2],CS
113
114 MOV BX,29H*4
115 MOV WORD PTR [BX],OFFSET COUT
116 MOV WORD PTR [BX+2],CS
117
118 LDS BX,CS:[PTRSAV]
119 MOV WORD PTR [BX].TRANS,OFFSET CON$INIT ;SET BREAK ADDRESS
120 MOV [BX].TRANS+2,CS
121 JMP EXIT
122
123
124 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125 ;
126 ; PROCEDURE_NAME: DET_HDWR
127 ;
128 ; FUNCTION:
129 ; THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE. THIS INFORMATION
130 ; IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE
131 ; GENERIC IOCTL.
132 ;
133 ; AT ENTRY:
134 ;
135 ; AT EXIT:
136 ; NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE
137 ; TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE
138 ; WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE
139 ; INSTALLED ADAPTER.
140 ; VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING
141 ; APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS.
142 ;
143 ; ERROR: N/A
144 ;
145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146
147 DET_HDWR PROC NEAR ;AN000;
148 MOV AH,GET_SYS_ID ; see if this is a Convertible ;AN000;
149 INT 15H ; ;AN000;
150 .IF <ES:[BX].MODEL_BYTE EQ LCD_MODEL> AND ; yes...check for LCD attached? ;AN000;
151 MOV AH,GET_STATUS ; system status will tell us ;AN000;
152 INT 15H ; ;AN000;
153 .IF <BIT AL NAND ON> ; if bit 0 = 0 then LCD.. ;AN000;
154 OR HDWR_FLAG,LCD_ACTIVE ; so ...set hdwr flag and... ;AN000;
155 LEA SI,COLOR_TABLE ; ;AN000;
156 MOV CX,COLOR_NUM ; load color table (for LCD) ;AN000;
157 CALL LOAD_TABLE ; ;AN000;
158 LEA SI,MONO_TABLE ; and mono table ;AN000;
159 MOV CX,MONO_NUM ; ;AN000;
160 CALL LOAD_TABLE ; ;AN000;
161 .ELSE ; not LCD...check for CGA and mono ;AN000;
162 MOV AX,MONO_ADDRESS ; write to mono buffer to see if present ;AN000;
163 CALL CHECK_BUF ; ;AN000;
164 .IF <AH EQ AL> ; if present then... ;AN000;
165 OR HDWR_FLAG,MONO_ACTIVE ; set hdwr flag and.. ;AN000;
166 LEA SI,MONO_TABLE ; ;AN000;
167 MOV CX,MONO_NUM ; load mono table ;AN000;
168 CALL LOAD_TABLE ; ;AN000;
169 .ENDIF ; ;AN000;
170 MOV AX,COLOR_ADDRESS ; write to CGA buffer to see if present ;AN000;
171 CALL CHECK_BUF ; ;AN000;
172 .IF <AH EQ AL> ; if present then.. ;AN000;
173 OR HDWR_FLAG,CGA_ACTIVE ; set hdwr flag and... ;AN000;
174 LEA SI,COLOR_TABLE ; ;AN000;
175 MOV CX,COLOR_NUM ; load color table ;AN000;
176 CALL LOAD_TABLE ; ;AN000;
177 .ENDIF ; ;AN000;
178 .ENDIF ; ;AN000;
179 PUSH CS ; setup addressiblity for ;AN000;
180 POP ES ; functionality call ;AN000;
181 XOR AX,AX ; ;AN000;
182 MOV AH,FUNC_CALL ; functionality call ;AN000;
183 XOR BX,BX ; implementation type 0 ;AN000;
184 LEA DI,FUNC_INFO ; block to hold data ;AN000;
185 INT 10H ; ;AN000;
186 .IF <AL EQ FUNC_CALL> ; if call supported then.. ;AN000;
187 .IF <BIT [DI].MISC_INFO AND ON> ; test bit to see if VGA ;AN000;
188 OR HDWR_FLAG,VGA_ACTIVE ; yes ....so ;AN000;
189 LEA SI,COLOR_TABLE ; set hdwr flag and... ;AN000;
190 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
191 CALL LOAD_TABLE ; ;AN000;
192 LEA SI,VGA_TABLE ; load VGA table ;AN000;
193 MOV CX,VGA_NUM ; ;AN000;
194 CALL LOAD_TABLE ; ;AN000;
195 .ELSE ; not VGA...then must be MCGA ;AN000;
196 .IF <[DI].ACTIVE_DISPLAY EQ MOD30_MONO> OR ;AN000;
197 .IF <[DI].ACTIVE_DISPLAY EQ MOD30_COLOR> OR ;AN000;
198 .IF <[DI].ALT_DISPLAY EQ MOD30_MONO> OR ;AN000;
199 .IF <[DI].ALT_DISPLAY EQ MOD30_COLOR> ;AN000;
200 OR HDWR_FLAG,MCGA_ACTIVE ; so...set hdwr flag and... ;AN000;
201 LEA SI,COLOR_TABLE ; ;AN000;
202 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
203 CALL LOAD_TABLE ; ;AN000;
204 LEA SI,MCGA_TABLE ; load MCGA table ;AN000;
205 MOV CX,MCGA_NUM ; ;AN000;
206 CALL LOAD_TABLE ; ;AN000;
207 .ENDIF ; ;AN000;
208 .ENDIF ; ;AN000;
209 MOV AL,[DI].CURRENT_SCANS ; copy current scan line setting.. ;AN000;
210 MOV MAX_SCANS,AL ; as maximum text mode scan setting. ;AN000;
211 LES DI,[DI].STATIC_ADDRESS ; point to static functionality table ;AN000;
212 MOV AL,ES:[DI].SCAN_TEXT ; load available scan line flag byte.. ;AN000;
213 MOV SCAN_LINES,AL ; and store it in resident data. ;AN000;
214 .ELSE ; call not supported..try EGA ;AN000;
215 MOV AH,ALT_SELECT ; alternate select call ;AN000;
216 MOV BL,EGA_INFO ; get EGA information subcall ;AN000;
217 INT 10H ; ;AN000;
218 .IF <BL NE EGA_INFO> ; check if call was valid ;AN000;
219 .IF <BH EQ MONOCHROME> ; yes...check for monochrome ;AN000;
220 OR HDWR_FLAG,E5151_ACTIVE ; ..5151 found so set hdwr flag and.. ;AN000;
221 LEA SI,EGA_5151_TABLE ; ;AN000;
222 MOV CX,EGA_5151_NUM ; load 5151 table. ;AN000;
223 CALL LOAD_TABLE ; ;AN000;
224 .ELSE ; ;AN000;
225 AND CL,0FH ; clear upper nibble of switch setting byte ;AN000;
226 .IF <CL EQ NINE> OR ; test for switch settings of 5154 ;AN000;
227 .IF <CL EQ THREE> ; ..5154 found.. ;AN000;
228 OR HDWR_FLAG,E5154_ACTIVE ; so..set hdwr flag and... ;AN000;
229 LEA SI,COLOR_TABLE ; ;AN000;
230 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
231 CALL LOAD_TABLE ; ;AN000;
232 LEA SI,EGA_5154_TABLE ; load 5154 table ;AN000;
233 MOV CX,EGA_5154_NUM ; ;AN000;
234 CALL LOAD_TABLE ; ;AN000;
235 .ELSE ; 5154 not found...must be 5153... ;AN000;
236 OR HDWR_FLAG,E5153_ACTIVE ; so..set hdwr flag and... ;AN000;
237 LEA SI,COLOR_TABLE ; ;AN000;
238 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
239 CALL LOAD_TABLE ; ;AN000;
240 LEA SI,EGA_5153_TABLE ; load 5153 table ;AN000;
241 MOV CX,EGA_5153_NUM ; ;AN000;
242 CALL LOAD_TABLE ; ;AN000;
243 .ENDIF ; ;AN000;
244 .ENDIF ; ;AN000;
245 .ENDIF ; ;AN000;
246 .ENDIF ; ;AN000;
247 RET
248 DET_HDWR ENDP
249
250
251 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
252 ;
253 ; PROCEDURE_NAME: CHECK_BUF
254 ;
255 ; FUNCTION:
256 ; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK
257 ; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD.
258 ;
259 ; AT ENTRY:
260 ;
261 ; AT EXIT:
262 ; NORMAL: AH EQ AL IF BUFFER PRESENT
263 ; AH NE AL IF NO BUFFER
264 ;
265 ; ERROR: N/A
266 ;
267 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
268
269 CHECK_BUF PROC NEAR ; write to video buffer to see if it is present ;AN000;
270 PUSH DS ; ;AN000;
271 MOV DS,AX ; load DS with address of buffer ;AN000;
272 MOV CH,DS:0 ; save buffer information (if present) ;AN000;
273 MOV AL,55H ; prepare to write sample data ;AN000;
274 MOV DS:0,AL ; write to buffer ;AN000;
275 PUSH BX ; terminate the bus so that lines.. ;AN000;
276 POP BX ; are reset ;AN000;
277 MOV AH,DS:0 ; bring sample data back... ;AN000;
278 MOV DS:0,CH ; repair damage to buffer ;AN000;
279 POP DS ; ;AN000;
280 RET ;AN000;
281 CHECK_BUF ENDP
282
283 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
284 ;
285 ; PROCEDURE_NAME: LOAD_TABLE
286 ;
287 ; FUNCTION:
288 ; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA.
289 ; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE.
290 ; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN
291 ; IN LOAD ORDERING.
292 ;
293 ; AT ENTRY:
294 ; SI: POINTS TO TOP OF TABLE TO COPY
295 ; CX: NUMBER OF RECORDS TO COPY
296 ;
297 ; AT EXIT:
298 ; NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA
299 ;
300 ; ERROR: N/A
301 ;
302 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
303
304 LOAD_TABLE PROC NEAR ;AN000;
305 PUSH DI ; save DI ;AN000;
306 PUSH ES ; and ES ;AN000;
307 PUSH CS ; setup ES to code segment ;AN000;
308 POP ES ; ;AN000;
309 LEA DI,VIDEO_MODE_TABLE ; point DI to resident video table ;AN000;
310 .WHILE <CX NE 0> AND ; do for as many records as there are ;AN000;
311 .WHILE <DI LT VIDEO_TABLE_MAX> ; check to ensure other data not overwritten ;AN000;
312 MOV AL,[DI].V_MODE ; prepare to check resident table ;AN000;
313 .IF <AL NE UNOCCUPIED> AND ; if this spot is occupied...and ;AN000;
314 .IF <AL NE [SI].V_MODE> ; ...is not the same mode then... ;AN000;
315 ADD DI,TYPE MODE_TABLE ; do not touch...go to next mode ;AN000;
316 .ELSE ; can write at this location ;AN000;
317 PUSH CX ; save record count ;AN000;
318 MOV CX,TYPE MODE_TABLE ; load record length ;AN000;
319 REP MOVSB ; copy record to resident data ;AN000;
320 lea DI,VIDEO_MODE_TABLE ;AN001; Set DI to the top of the target again.
321 POP CX ; restore record count and.. ;AN000;
322 DEC CX ; decrement ;AN000;
323 .ENDIF ; ;AN000;
324 .ENDWHILE ; ;AN000;
325 POP ES ; restore.. ;AN000;
326 POP DI ; registers ;AN000;
327 RET ; ;AN000;
328 LOAD_TABLE ENDP
329
330
331 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
332 ;
333 ; PROCEDURE_NAME: LOAD_INT10
334 ;
335 ; FUNCTION:
336 ; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H
337 ;
338 ; AT ENTRY:
339 ;
340 ; AT EXIT:
341 ; NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H
342 ; VECTOR STORED.
343 ;
344 ; ERROR: N/A
345 ;
346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
347
348 LOAD_INT10 PROC NEAR ;AN000;
349 PUSH ES ;AN000;
350 XOR AX,AX ; point ES to low.. ;AN000;
351 MOV ES,AX ; memory. ;AN000;
352 MOV CX,ES:WORD PTR INT10_LOW ; store original.. ;AN000;
353 MOV CS:ROM_INT10,CX ; interrupt 10h.. ;AN000;
354 MOV CX,ES:WORD PTR INT10_HI ; location.. ;AN000;
355 MOV CS:ROM_INT10+2,CX ; ;AN000;
356 CLI ; ;AN000;
357 MOV ES:WORD PTR INT10_LOW,OFFSET INT10_COM ; replace vector.. ;AN000;
358 MOV ES:WORD PTR INT10_HI,CS ; with our own.. ;AN000;
359 STI ; ;AN000;
360 mov ax, DISPLAY_CHECK ;AN002;DISPLAY.SYS already loaded?
361 int 2fh ;AN002;
362 cmp al, INSTALLED ;AN002;
363 jne L_INT10_Ret ;AN002;
364 mov cs:Display_Loaded_Before_Me,1 ;AN002;
365 L_INT10_Ret: ;AN002;
366 POP ES ; ;AN000;
367 RET ; ;AN000;
368 LOAD_INT10 ENDP
369
370
371 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
372 ;
373 ; PROCEDURE_NAME: LOAD_INT2F
374 ;
375 ; FUNCTION:
376 ; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
377 ;
378 ; AT ENTRY:
379 ;
380 ; AT EXIT:
381 ; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
382 ; VECTOR STORED.
383 ;
384 ; ERROR: N/A
385 ;
386 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
387
388 LOAD_INT2F PROC NEAR ;AN000;
389 PUSH ES ;AN000;
390 XOR AX,AX ; point ES to low.. ;AN000;
391 MOV ES,AX ; memory. ;AN000;
392 MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000;
393 MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000;
394 MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000;
395 MOV CS:ROM_INT2F+2,CX ; ;AN000;
396 OR AX,CX ; check if old int2F.. ;AN000;
397 .IF Z ; is 0. ;AN000;
398 MOV AX,OFFSET ABORT ; yes....point to.. ;AN000;
399 MOV CS:ROM_INT2F,AX ; IRET. ;AN000;
400 MOV AX,CS ; ;AN000;
401 MOV CS:ROM_INT2F+2,AX ; ;AN000;
402 .ENDIF ; ;AN000;
403 CLI ; ;AN000;
404 MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000;
405 MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000;
406 STI ; ;AN000;
407 POP ES ; ;AN000;
408 RET ; ;AN000;
409 LOAD_INT2F ENDP ;AN000;
410
411
412 CODE ENDS
413 END