summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI/IOCTL.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/ANSI/IOCTL.ASM')
-rw-r--r--v4.0/src/DEV/ANSI/IOCTL.ASM1126
1 files changed, 1126 insertions, 0 deletions
diff --git a/v4.0/src/DEV/ANSI/IOCTL.ASM b/v4.0/src/DEV/ANSI/IOCTL.ASM
new file mode 100644
index 0000000..506e06c
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/IOCTL.ASM
@@ -0,0 +1,1126 @@
1PAGE ,132
2TITLE ANSI Generic IOCTL Code
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: IOCTL.ASM
7;
8; DESCRIPTIVE NAME: PERFORM THE GENERIC IOCTL CALL IN ANSI.SYS
9;
10; FUNCTION: THE GENERIC DEVICE IOCTL IS USED TO SET AND GET THE
11; MODE OF THE DISPLAY DEVICE ACCORDING TO PARAMETERS PASSED
12; IN A BUFFER. ADDITIONALLY, THE CALL CAN TOGGLE THE
13; USE OF THE INTENSITY BIT, AND CAN LOAD THE 8X8 CHARACTER
14; SET, EFFECTIVELY GIVING MORE LINES PER SCREEN. THE
15; AVAILABILITY OF THIS FUNCTION VARIES STRONGLY WITH HARDWARE
16; ATTACHED.
17;
18; ENTRY POINT: GENERIC_IOCTL
19;
20; INPUT: LOCATION OF REQUEST PACKET STORED DURING STRATEGY CALL.
21;
22; AT EXIT:
23; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
24;
25; ERROR: CARRY SET - ERROR CODE IN AX.
26; AX = 1 - INVALID FUNCTION. EXTENDED ERROR = 20
27; AX = 10 - UNSUPPORTED FUNCTION ON CURRENT HARDWARE.
28; EXTENDED ERROR = 29
29; AX = 12 - DISPLAY.SYS DOES NOT HAVE 8X8 RAM CHARACTER SET.
30; EXTENDED ERROR = 31
31;
32; INTERNAL REFERENCES:
33;
34; ROUTINES: GET_IOCTL - PERFORMS THE GET DEVICE CHARACTERISTICS
35; SET_IOCTL - PERFORMS THE SET DEVICE CHARACTERISTICS
36; TEST_LENGTH - TESTS FOR VALIDITY OF A SCREEN SIZE VALUE
37; CTL_FLAG - READS THE CURRENT USE FOR THE INT/BLINK BIT
38; SET_CTL_FLAG - SETS THE USE FOR THE INT/BLINK BIT
39; GET_SEARCH - SEARCHES THE INTERNAL VIDEO TABLE FOR THE
40; CURRENT MODE MATCH
41; SET_SEARCH - SEARCHES THE INTERNAL VIDEO TABEL FOR THE
42; CURRENT MODE MATCH
43; SET_CURSOR_EMUL - SETS THE BIT THAT CONTROLS CURSOR EMULATION
44; INT10_COM - INTERRUPT 10H HANDLER TO KEEP CURRENT SCREEN SIZE
45; INT2F_COM - INTERRUPT 2FH INTERFACE TO GENERIC IOCTL
46; MAP_DOWN - PERFORMS CURSOR TYPE MAPPING FOR EGA WITH MONOCHROME
47; SET_VIDEO_MODE - SETS THE VIDEO MODE
48; ROM_LOAD_8X8 - LOADS THE 8X8 CHARACTER SET.
49; PROCESS_NORMAL - DOES THE SET PROCESS FOR ADAPTERS OTHER THAN
50; THE VGA
51; PROCESS_VGA - DOES THE SET PROCESS FOR THE VGA ADAPTER
52; CHECK_FOR_DISPLAY - CHECKS FOR DISPLAY.SYS SUPPORT
53;
54; DATA AREAS: SCAN_LINE_TABLE - HOLDS SCAN LINE INFORMATION FOR PS/2
55; FUNC_INFO - BUFFER FOR PS/2 FUNCTIONALITY CALL.
56;
57;
58; EXTERNAL REFERENCES:
59;
60; ROUTINES: INT 10H SERVICES
61;
62; DATA AREAS: VIDEO_MODE_TABLE - INTERNAL TABLE FOR CHARACTERISTICS TO MODE
63; MATCH-UPS
64;
65; NOTES:
66;
67; REVISION HISTORY:
68;
69; Label: "DOS ANSI.SYS Device Driver"
70; "Version 4.00 (C) Copyright 1988 Microsoft"
71; "Licensed Material - Program Property of Microsoft"
72;
73;****************** END OF SPECIFICATIONS ****************************
74;Modification history *********************************************************
75;AN001; P1350 Codepage switching not working on EGA 10/10/87 J.K.
76;AN002; P1626 ANSI does not allow lines=43 with PS2,Monochrome 10/15/87 J.K.
77;AN003; p1774 Lines=43 after selecting cp 850 does not work 10/20/87 J.K.
78;AN004; p1740 MODE CON LINES command causes problem with PE2 w PS/210/24/87 J.K.
79;AN005; p2167 Does'nt say EGA in medium resol. cannot do 43 lines 10/30/87 J.K.
80;AN006; p2236 After esc [=0h, issuing INT10h,AH=fh returns mode=1. 11/3/87 J.K.
81;AN007; p2305 With ANSI loaded, loading RDTE hangs the system 11/06/87 J.K.
82;AN008; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
83;AN009; p2716 HOT key of VITTORIA does not work properly 12/03/87 J.K.
84;AN010; d398 /L option for Enforcing the number of lines 12/17/87 J.K.
85;AN011; D425 For OS2 compatibiltiy box, /L option status query 01/14/88 J.K.
86;******************************************************************************
87
88INCLUDE ANSI.INC ;AN000;
89.XLIST ;AN000;
90INCLUDE STRUC.INC ;AN000;
91.LIST ;AN000;
92 ;AN000;
93PUBLIC GENERIC_IOCTL ;AN000;
94PUBLIC FUNC_INFO ;AN000;
95PUBLIC MAX_SCANS ;AN000;
96PUBLIC INT10_COM ;AN000;
97PUBLIC ROM_INT10 ;AN000;
98PUBLIC INT2F_COM ;AN000;
99PUBLIC ROM_INT2F ;AN000;
100PUBLIC ABORT ;AN000;
101PUBLIC REQ_TXT_LENGTH ;AN000;
102PUBLIC GRAPHICS_FLAG ;AN000;
103public Display_Loaded_Before_Me ;AN008;
104 ;AN000;
105CODE SEGMENT PUBLIC BYTE ;AN000;
106 ASSUME CS:CODE,DS:CODE ;AN000;
107 ;AN000;
108EXTRN PTRSAV:DWORD ;AN000;
109EXTRN NO_OPERATION:NEAR ;AN000;
110EXTRN ERR1:NEAR ;AN000;
111EXTRN VIDEO_MODE_TABLE:BYTE ;AN000;
112extrn MAX_VIDEO_TAB_NUM:ABS
113EXTRN HDWR_FLAG:WORD ;AN000;
114EXTRN SCAN_LINES:BYTE ;AN000;
115extrn Switch_L:Byte ;AN010;Defined in ANSI.ASM
116 ;AN000;
117 ;AN000;
118SCAN_LINE_TABLE LABEL BYTE ;AN000;
119 SCAN_LINE_STR <200,000000001B,0> ; 200 scan lines ;AN000;
120 SCAN_LINE_STR <344,000000010B,1> ; 350 scan lines ;AN000;
121 SCAN_LINE_STR <400,000000100B,2> ; 400 scan lines ;AN000;
122SCANS_AVAILABLE EQU ($ - SCAN_LINE_TABLE)/TYPE SCAN_LINE_STR ;AN000;
123 ;AN000;
124;This is used when ANSI calls Get_IOCTL, Set_IOCTL by itself.
125In_Generic_IOCTL_flag db 0 ;AN004;
126I_AM_IN_NOW EQU 00000001b ;AN004;
127SET_MODE_BY_DISPLAY EQU 00000010b ;AN004;Display.sys calls Set mode INT 10h.
128CALLED_BY_INT10COM EQU 00000100b ;AN009;To prevent from calling set mode int 10h again.
129
130INT10_V_Mode db 0ffh ;AN006;Used by INT10_COM
131
132My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?> ;AN004;
133 ;AN000;
134FUNC_INFO INFO_BLOCK <> ; data block for functionality call ;AN000;
135ROM_INT10 DW ? ; segment and offset of original.. ;AN000;
136 DW ? ; interrupt 10h vector. ;AN000;
137ROM_INT2F DW ? ; segment and offset of original.. ;AN000;
138 DW ? ; interrupt 2Fh vector. ;AN000;
139INTENSITY_FLAG DW OFF ; intensity flag initially off ;AN000;
140REQ_TXT_LENGTH DW DEFAULT_LENGTH ; requested text screen length ;AN000;
141SCAN_DESIRED DB 0 ; scan lines desired ;AN000;
142MAX_SCANS DB 0 ; maximum scan line setting ;AN000;
143GRAPHICS_FLAG DB TEXT_MODE ; flag for graphics mode ;AN000;
144ERROR_FLAG DB OFF ; flag for error conditions ;AN000;
145Display_Loaded_Before_Me db 0 ;AN008;flag
146ANSI_SetMode_Call_Flag db 0 ;AN008;Ansi is issuing INT10,AH=0.
147
148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149;
150; PROCEDURE_NAME: GENERIC_IOCTL
151;
152; FUNCTION:
153; TO GET OR SET DEVICE CHARACTERISTICS ACCORDING TO THE BUFFER PASSED
154; IN THE REQUEST PACKET.
155;
156; AT ENTRY:
157;
158; AT EXIT:
159; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
160;
161; ERROR: CARRY SET - ERROR CODE IN AL. (SEE MODULE DESCRIPTION ABOVE).
162;
163; NOTE: THIS PROC IS PERFORMED AS A JMP AS WITH THE OLD ANSI CALLS.
164;
165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
166
167GENERIC_IOCTL: ; ;AN000;
168 LES BX,[PTRSAV] ; establish addressability to request header ;AN000;
169 .SELECT ; check for get or set subfunction ;AN000;
170 .WHEN <ES:[BX].MIN_FUNC EQ GET_FUNC> ; is this the get subfunction? ;AN000;
171 LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000;
172 CALL GET_IOCTL ; yes...execute routine ;AN000;
173 .WHEN <ES:[BX].MIN_FUNC EQ SET_FUNC> ; is this the set subfunction? ;AN000;
174 LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000;
175 CALL SET_IOCTL ; yes....execute routine ;AN000;
176 .OTHERWISE ; not for us....so.. ;AN000;
177 JMP NO_OPERATION ; call lower CON device ;AN000;
178 .ENDSELECT ; ;AN000;
179 .IF C ; error?.... ;AN000;
180 OR AX,CMD_ERROR ; yes...set error bit in status ;AN000;
181 .ENDIF ; ;AN000;
182 OR AX,DONE ; add done bit to status ;AN000;
183 JMP ERR1 ; return with status in AX ;AN000;
184 ;AN000;
185 ;AN000;
186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
187;
188; PROCEDURE_NAME: GET_IOCTL
189;
190; FUNCTION:
191; THIS PROCEDURE RETURNS DEVICE CHARACTERISTICS.
192;
193; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
194;
195; AT EXIT:
196; NORMAL: CARRY CLEAR - REQUEST BUFFER CONTAINS DEVICE CHARACTERISTICS
197;
198; ERROR: CARRY SET - ERROR CONDITION IN AX
199;
200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
201
202GET_IOCTL PROC NEAR ;AN000;
203 .IF <ES:[DI].INFO_LEVEL NE 0> OR ; check for valid info level ;AN000;
204 .IF <ES:[DI].DATA_LENGTH LT <TYPE MODE_TABLE+1>> ; and buffer size. ;AN000;
205 MOV AX,INVALID_FUNC ; not valid...unsupported ;AN000;
206 STC ; function..set error flag and ;AN000;
207 .ELSE ; ;AN000;
208 MOV ES:[DI].INFO_LEVEL+1,0 ; set reserved byte to 0. ;AN000;
209 MOV AH,REQ_VID_MODE ; request current video mode ;AN000;
210 INT 10H ; ;AN000;
211 AND AL,VIDEO_MASK ; ;AN000;
212 LEA SI,VIDEO_MODE_TABLE ; point to resident video table ;AN000;
213 CALL GET_SEARCH ; perform search ;AN000;
214 .IF C ; found? ;AN000;
215 MOV AX,NOT_SUPPORTED ; no....load unsupported function ;AN000;
216 .ELSE ; ;AN000;
217 push di ;AN001;AN003;Save Request Buffer pointer
218 MOV WORD PTR ES:[DI].DATA_LENGTH,(TYPE MODE_TABLE)+1 ;length of data is struc size ;AN000;
219 INC SI ; skip mode value ;AN000;
220 ADD DI,RP_FLAGS ; point to flag word ;AN000;
221 .IF <HDWR_FLAG GE MCGA_ACTIVE> ; if we have an EGA or better ;AN000;
222 CALL CTL_FLAG ; then ..process control flag ;AN000;
223 .ELSE ; else... ;AN000;
224 MOV WORD PTR ES:[DI],OFF ; we always have blink. ;AN000;
225 .ENDIF ; ;AN000;
226 INC DI ; point to next field.. ;AN000;
227 INC DI ; ..(display mode) ;AN000;
228 MOV CX,(TYPE MODE_TABLE)-1 ; load count ;AN000;
229 REP MOVSB ; transfer data from video table to request packet;AN000;
230 SUB SI,TYPE MODE_TABLE ; point back to start of mode data ;AN000;
231 .IF <[SI].D_MODE EQ TEXT_MODE> AND ; if we are in text mode and.. ;AN000;
232 .IF <[SI].SCR_ROWS NE DEFAULT_LENGTH> ; length <> 25 then we have an EGA or VGA ;AN000;
233 DEC DI ; point back to length entry in req packet ;AN000;
234 DEC DI ; ;AN000;
235 PUSH DS ; ;AN000;
236 MOV AX,ROM_BIOS ; load ROM BIOS data area segment ;AN000;
237 MOV DS,AX ; ;AN000;
238 MOV AL,BYTE PTR DS:[NUM_ROWS] ; load current number of rows ;AN000;
239 CBW ; ;AN000;
240 INC AX ; add 1 to row count ;AN000;
241 MOV WORD PTR ES:[DI],AX ; and copy to request packet ;AN000;
242 POP DS ; ;AN000;
243 .ENDIF ; ;AN000;
244 XOR AX,AX ; no errors ;AN000;
245 CLC ; clear error flag ;AN000;
246 pop di ;AN001; AN003;Restore Request Buffer pointer
247 .ENDIF ; ;AN000;
248 .ENDIF ; ;AN000;
249 RET ; return to calling module ;AN000;
250GET_IOCTL ENDP ;AN000;
251 ;AN000;
252
253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
254;
255; PROCEDURE_NAME: SET_IOCTL
256;
257; FUNCTION:
258; THIS PROCEDURE SETS THE VIDEO MODE AND CHARACTER SET ACCORDING
259; TO THE CHARACTERSTICS PROVIDED.
260;
261; AT ENTRY:
262; ES:[DI] POINTS TO REQUEST BUFFER
263;
264; AT EXIT:
265; NORMAL: CLEAR CARRY - VIDEO MODE SET
266;
267; ERROR: CARRY SET - ERROR CONDITION IN AX
268;
269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
270
271SET_IOCTL PROC NEAR ;AN000;
272 or cs:In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN004; Signal GENERIC_IOCTL request being processed
273 MOV ERROR_FLAG,OFF ; clear any errors ;AN000;
274 .IF <ES:[DI].INFO_LEVEL NE 0> OR ; check for valid info level ;AN000;
275 .IF <ES:[DI].DATA_LENGTH NE <TYPE MODE_TABLE+1>> OR ; and buffer size. ;AN000;
276 MOV AX,ES:[DI].RP_FLAGS ; test for invalid flags. ;AN000;
277 .IF <BIT AX AND INVALID_FLAGS> OR ; ;AN000;
278 .IF <BIT ES:[DI].RP_FLAGS AND ON> AND ; if intensity is requested and.. ;AN000;
279 .IF <HDWR_FLAG LT MCGA_ACTIVE> ; hardware does not support it then.. ;AN000;
280 MOV AX,INVALID_FUNC ; not valid...unsupported.. ;AN000;
281 MOV ERROR_FLAG,ON ; function..set error and.. ;AN000;
282 .ELSE ; ;AN000;
283 CALL SET_SEARCH ; search table for match ;AN000;
284 .IF C ; if match not found then.. ;AN000;
285 MOV AX,NOT_SUPPORTED ; not supported.... ;AN000;
286 MOV ERROR_FLAG,ON ; ;AN000;
287 .ELSE ; ;AN000;
288 .IF <[SI].D_MODE EQ TEXT_MODE> ; is a text mode being requested? ;AN000;
289 PUSH REQ_TXT_LENGTH ; save old value in case of error ;AN000;
290 MOV AX,ES:[DI].RP_ROWS ; save new requested value. ;AN000;
291 MOV REQ_TXT_LENGTH,AX ; ;AN000;
292; .IF <[SI].SCR_ROWS NE UNOCCUPIED> ; yes...check for VGA support.. ;AN000;
293; CALL PROCESS_NORMAL ; no..process other adapters.. ;AN000;
294; .ELSE ; VGA support available.. ;AN000;
295; CALL PROCESS_VGA ; process the VGA support code. ;AN000;
296; .ENDIF ; ;AN000;
297 .IF <[SI].SCR_ROWS E UNOCCUPIED> OR ;AN002;
298 .IF <BIT Hdwr_Flag AND VGA_ACTIVE> ;AN002;
299 call process_VGA ;AN002;
300 .ELSE ;AN002;
301 call process_Normal ;AN002;
302 .ENDIF ;AN002;
303 .IF <ERROR_FLAG EQ OFF> ; if we had no errors then.. ;AN000;
304 POP AX ; discard saved text length ;AN000;
305 call DO_ROWS ;AN004;
306 .IF <HDWR_FLAG GE E5151_ACTIVE> ; does hardware support gt 25 lines? ;AN000;
307 CALL SET_CURSOR_EMUL ; yes..ensure cursor emulation is.. ;AN000;
308 .ENDIF ; set accordingly. ;AN000;
309 .ELSE ; ;AN000;
310 POP REQ_TXT_LENGTH ; error...so restore old value. ;AN000;
311 .ENDIF ; ;AN000;
312 .ELSE ; request is for graphics mode ;AN000;
313 CALL SET_VIDEO_MODE ; so set video mode. ;AN000;
314 .ENDIF ; ;AN000;
315 .IF <ERROR_FLAG EQ OFF> AND ; no errors? then.. ;AN000;
316 .IF <HDWR_FLAG GE MCGA_ACTIVE> AND ; for the EGA and better .... ;AN000;
317 .IF <[SI].V_MODE EQ TEXT_MODE> ; and in text mode do... ;AN000;
318 CALL SET_CTL_FLAG ; set intensity bit to control value ;AN000;
319 .ENDIF ; ;AN000;
320 .ENDIF ; ;AN000;
321 .ENDIF ; ;AN000;
322 and cs:In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ;AN004; Turn the flag off
323 .IF <ERROR_FLAG EQ OFF> ; no errors? ;AN000;
324 XOR AX,AX ; clear error register ;AN000;
325 CLC ; clear error flag ;AN000;
326 .ELSE ; ;AN000;
327 STC ; ;AN000;
328 .ENDIF ; yes...set error flag ;AN000;
329 RET ; ;AN000;
330SET_IOCTL ENDP ;AN000;
331
332
333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334;
335; PROCEDURE_NAME: PROCESS_NORMAL
336;
337; FUNCTION:
338; THIS PROCEDURE PROCESSES THE SET IOCTL FOR ADAPTERS OTHER THAN
339; THE VGA.
340;
341; AT ENTRY: AX - SCREEN LENGTH DESIRED
342; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE.
343;
344; AT EXIT:
345; NORMAL: MODE SET
346;
347; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX.
348;
349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
350
351PROCESS_NORMAL PROC NEAR ;AN000;
352 .IF <AX NE DEFAULT_LENGTH> AND ; no..see if length requested.. ;AN000;
353 .IF <AX NE [SI].SCR_ROWS> ; is valid.... ;AN000;
354 MOV AX,NOT_SUPPORTED ; not valid....so ;AN000;
355 MOV ERROR_FLAG,ON ; set error flag and.. ;AN000;
356 .ELSE ; length is valid so.. ;AN000;
357 CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000;
358 .IF NC ; support...if no problems then.. ;AN000;
359 .IF <HDWR_FLAG GE E5151_ACTIVE>; yes...check for cursor emulation ;AN000;
360 CALL SET_CURSOR_EMUL ; ;AN000;
361 .ENDIF ; ;AN000;
362 CALL SET_VIDEO_MODE ; ..and set the mode. ;AN000;
363 .ELSE ; no.. ;AN000;
364 MOV AX,NOT_AVAILABLE ; font not available.. ;AN000;
365 MOV ERROR_FLAG,ON ; ;AN000;
366 .ENDIF ; ;AN000;
367 .ENDIF ; ;AN000;
368 RET
369PROCESS_NORMAL ENDP
370
371
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373;
374; PROCEDURE_NAME: PROCESS_VGA
375;
376; FUNCTION:
377; THIS PROCEDURE PROCESSES THE SET IOCTL FOR THE VGA ADAPTER
378;
379; AT ENTRY: AX - SCREEN LENGTH DESIRED
380; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE.
381;
382; AT EXIT:
383; NORMAL: MODE SET
384;
385; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX.
386;
387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
388
389PROCESS_VGA PROC NEAR ;AN000;
390 CALL TEST_LENGTH ; check to see if screen length ;AN000;
391 .IF C ; is applicable.... ;AN000;
392 MOV AX,NOT_SUPPORTED ; no..so set error condition ;AN000;
393 MOV ERROR_FLAG,ON ; ;AN000;
394 .ELSE ; ;AN000;
395 CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000;
396 .IF NC ; support.....yes so.. ;AN000;
397 .IF <REQ_TXT_LENGTH EQ DEFAULT_LENGTH> ; 25 lines requested? ;AN000;
398 MOV AL,MAX_SCANS ; desired scan setting should be.. ;AN000;
399 MOV SCAN_DESIRED,AL ; the maximum. ;AN000;
400 .ENDIF ; ;AN000;
401 MOV AH,ALT_SELECT ; set the appropriate number.. ;AN000;
402 MOV BL,SELECT_SCAN ; of scan lines.. ;AN000;
403 MOV AL,SCAN_DESIRED ; ;AN000;
404 INT 10H ; ;AN000;
405 CALL SET_VIDEO_MODE ; and set the mode. ;AN000;
406 .ELSE ; DISPLAY.SYS does not have the font. ;AN000;
407 MOV AX,NOT_AVAILABLE ; so...load error code.. ;AN000;
408 MOV ERROR_FLAG,ON ; ;AN000;
409 .ENDIF ; ;AN000;
410 .ENDIF ; ;AN000;
411 RET ;AN000;
412PROCESS_VGA ENDP ;AN000;
413
414
415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416; Procedure name: DO_ROWS
417; Function:
418; Only called for TEXT_MODE.
419; If (REQ_TXT_LENGTH <> DEFAULT_LENGTH) &
420; (DISPLAY.SYS not loaded or CODEPAGE not active)
421; then
422; LOAD ROM 8X8 charater.
423;
424;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425DO_ROWS proc near ;AN004;
426 .IF <REQ_TXT_LENGTH NE DEFAULT_LENGTH> ;AN004;
427 push ds ;AN004;
428 push es ;AN004;
429 push di ;AN004;
430 push si ;AN004;
431 mov ax, DISPLAY_CHECK ;AN004;
432 int 2fh ;AN004;
433 .IF <al NE INSTALLED> OR ;AN004;
434 mov ax, CHECK_ACTIVE ;AN004;
435 int 2fh ;AN004;
436 .IF C ;AN004;
437 call ROM_LOAD_8X8 ;AN004;
438 .ENDIF ;AN004;
439 pop si ;AN004;
440 pop di ;AN004;
441 pop es ;AN004;
442 pop ds ;AN004;
443 .ENDIF ;AN004;
444 ret ;AN004;
445DO_ROWS endp ;AN004;
446
447;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448;
449; PROCEDURE_NAME: TEST_LENGTH
450;
451; FUNCTION:
452; THIS PROCEDURE ENSURES THAT THE SCREEN LENGTH REQUESTED CAN BE
453; OBTAINED USING THE AVAILABLE SCAN LINE SETTINGS. (VGA ONLY!)
454;
455; AT ENTRY:
456;
457;
458; AT EXIT:
459; NORMAL: CARRY CLEAR - SCAN_DESIRED CONTAINS SETTING REQUIRED
460;
461; ERROR: CARRY SET
462;
463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
464
465TEST_LENGTH PROC NEAR ;AN000;
466 push bp ;AN007;
467 MOV AX,REQ_TXT_LENGTH ; load AX with length requested ;AN000;
468 MOV BP,EIGHT ; ;AN000;
469 MUL BP ; mulitply by 8 to get scan lines ;AN000;
470 LEA BX,SCAN_LINE_TABLE ; load BX with scan line table start ;AN000;
471 MOV CX,SCANS_AVAILABLE ; total number of scan lines settings ;AN000;
472 MOV BP,NOT_FOUND ; set flag ;AN000;
473 .WHILE <BP EQ NOT_FOUND> AND ; while not found and still valid.. ;AN000;
474 .WHILE <CX NE 0> ; settings left..do.. ;AN000;
475 .IF <AX EQ [BX].NUM_LINES> ; pointing at the right setting.. ;AN000;
476 MOV DL,[BX].REP_1BH ; ;AN000;
477 .IF <BIT SCAN_LINES AND DL> ; does the hardware have it?.. ;AN000;
478 MOV BP,FOUND ; yes....found!! ;AN000;
479 .ELSE ; ;AN000;
480 XOR CX,CX ; no...set CX to exit loop. ;AN000;
481 .ENDIF ; ;AN000;
482 .ELSE ; ;AN000;
483 ADD BX,TYPE SCAN_LINE_STR ; not this setting..point to next ;AN000;
484 DEC CX ; record and decrement count ;AN000;
485 .ENDIF ; ;AN000;
486 .ENDWHILE ; ;AN000;
487 .IF <BP EQ NOT_FOUND> ; was it found and available? ;AN000;
488 STC ; no....set error flag ;AN000;
489 .ELSE ; yes so..... ;AN000;
490 MOV CL,[BX].REP_12H ; store value to set it. ;AN000;
491 MOV SCAN_DESIRED,CL ; ;AN000;
492 CLC ; clear error flag ;AN000;
493 .ENDIF ; ;AN000;
494 pop bp ;AN007;
495 RET ; return to calling module ;AN000;
496TEST_LENGTH ENDP ;AN000;
497 ;AN000;
498 ;AN000;
499;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
500;
501; PROCEDURE_NAME: CTL_FLAG
502;
503; FUNCTION:
504; THIS PROCEDURE RETURNS THE CURRENT USE FOR THE INTENSITY/BLINKING
505; BIT.
506;
507; AT ENTRY:
508;
509; AT EXIT:
510; NORMAL:
511; VGA,MCGA: VALUE RETURNED FROM FUNCTIONALITY CALL
512; EGA: VALUE LAST SET THROUGH IOCTL. DEFAULT IS BLINKING.
513; CGA,MONO: BLINKING
514;
515; ERROR: N/A
516;
517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
518 ;AN000;
519CTL_FLAG PROC NEAR ;AN000;
520 .IF <BIT HDWR_FLAG AND VGA_ACTIVE> ; VGA supported? ;AN000;
521 PUSH ES ; yes...prepare for ;AN000;
522 PUSH DI ; functionality call ;AN000;
523 PUSH DS ; ;AN000;
524 POP ES ; ;AN000;
525 LEA DI,FUNC_INFO ; point to data block ;AN000;
526 MOV AH,FUNC_CALL ; load function number ;AN000;
527 XOR BX,BX ; implementation type 0 ;AN000;
528 INT 10H ; ;AN000;
529 MOV AL,ES:[DI].MISC_INFO ; load misc info byte ;AN000;
530 .IF <BIT AL AND INT_BIT> ; is blink bit set? ;AN000;
531 AND INTENSITY_FLAG,NOT ON ; yes....turn off intensity flag ;AN000;
532 .ELSE ; no... ;AN000;
533 OR INTENSITY_FLAG,ON ; ensure that intensity is set ;AN000;
534 .ENDIF ; ;AN000;
535 POP DI ; restore registers ;AN000;
536 POP ES ; ;AN000;
537 .ENDIF ; ;AN000;
538 MOV AX,INTENSITY_FLAG ; write the control flag.. ;AN000;
539 MOV ES:[DI],AX ; to the request packet ;AN000;
540 RET ; ;AN000;
541CTL_FLAG ENDP ;AN000;
542
543
544;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
545;
546; PROCEDURE_NAME: SET_CTL_FLAG
547;
548; FUNCTION:
549; THIS PROCEDURE SET THE TOGGLE/INTENSITY BIT AS SPECIFIED IN THE
550; CONTROL FLAG IOCTL SET SUBFUNCTION. THIS ROUTINE IS ONLY CALLED FOR
551; AN EGA, MCGA, OR VGA.
552;
553; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
554;
555; AT EXIT:
556; NORMAL: INTENSITY_FLAG SET APPROPRIATELY AND SYSTEM BIT SET
557;
558; ERROR: N/A
559;
560;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
561
562SET_CTL_FLAG PROC NEAR ;AN000;
563 .IF <BIT ES:[DI].RP_FLAGS AND ON> ;AN000;
564 OR INTENSITY_FLAG,ON ;AN000;
565 MOV BL,SET_INTENSIFY ;AN000;
566 .ELSE ;AN000;
567 AND INTENSITY_FLAG,NOT ON ;AN000;
568 MOV BL,SET_BLINK ;AN000;
569 .ENDIF ;AN000;
570 MOV AX,BLINK_TOGGLE ;AN000;
571 INT 10H ;AN000;
572 RET ;AN000;
573SET_CTL_FLAG ENDP
574
575
576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
577;
578; PROCEDURE_NAME: SET_SEARCH
579;
580; FUNCTION:
581; THIS PROCEDURE SEARCHES THE RESIDENT VIDEO TABLE IN ATTEMPT TO
582; FIND A MODE THAT MATHCES THE CHARACTERISTICS REQUESTED.
583;
584; AT ENTRY:
585;
586; AT EXIT:
587; NORMAL: CARRY CLEAR - SI POINTS TO APPLICABLE RECORD
588;
589; ERROR: CARRY SET
590;
591;AN006; When INT10_V_Mode <> 0FFH, then assumes that the user
592; issuing INT10h, Set mode function call. Unlike Generic IOCTL
593; set mode call, the user already has taken care of the video mode.
594; So, we also find the matching V_MODE.
595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596 ;AN000;
597SET_SEARCH PROC NEAR ;AN000;
598 push bp ;AN007;
599 LEA SI,VIDEO_MODE_TABLE ; point to video table ;AN000;
600 MOV BP,NOT_FOUND ; set flag indicating not found ;AN000;
601 MOV CX,MAX_VIDEO_TAB_NUM ; load counter, # of tables ;AN000;
602 .WHILE <BP EQ NOT_FOUND> AND ; while not found and we still.. ;AN000;
603 .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; have valid entries.. ;AN000;
604 .WHILE <CX NE 0> ; do... ;AN000;
605 mov al, cs:INT10_V_Mode ;AN006;
606 .if <AL NE 0FFh> AND ;AN006;if issued by INT10h Set Mode call,
607 .if <[SI].V_MODE NE AL> ;AN006; and V_MODE <> AL
608 add si, type MODE_TABLE ;AN006; then, this is not the correct entry.
609 dec cx ;AN006;Let's find the next entry.
610 .else ;AN006; Else, continue...
611 MOV AL,ES:[DI].RP_MODE ; load register for compare. ;AN000;
612 .IF <[SI].D_MODE EQ AL> ; match?...... ;AN000;
613 MOV AX,ES:[DI].RP_COLORS ; yes...prepare next field ;AN000;
614 .IF <[SI].COLORS EQ AX> ; match?... ;AN000;
615 .IF <ES:[DI].RESERVED2 EQ 0> ; yes...ensure reserved byte is 0 ;AN000;
616 .IF <ES:[DI].RP_MODE EQ GRAPHICS_MODE> ; for graphics mode..check the following;AN000;.
617 MOV AX,ES:[DI].RP_WIDTH ; screen width. ;AN000;
618 .IF <[SI].SCR_WIDTH EQ AX> ; ;AN000;
619 MOV AX,ES:[DI].RP_LENGTH ; screen length ;AN000;
620 .IF <[SI].SCR_LENGTH EQ AX> ; (ignore #rows and #columns ;AN000;
621 MOV BP,FOUND ; found...set flag ;AN000;
622 .ENDIF ; ;AN000;
623 .ENDIF ; ;AN000;
624 .ELSE ; and for text check the columns.. ;AN000;
625 MOV AX,ES:[DI].RP_COLS ; the rows are matched in the main routine. ;AN000;
626 .IF <[SI].SCR_COLS EQ AX> ; ;AN000;
627 MOV BP,FOUND ; found...set flag ;AN000;
628 .ENDIF ; ;AN000;
629 .ENDIF ; ;AN000;
630 .ENDIF ; ;AN000;
631 .ENDIF ; ;AN000;
632 .ENDIF ; ;AN000;
633 ADD SI,TYPE MODE_TABLE ; point to next record and.. ;AN000;
634 DEC CX ; decrement count ;AN000;
635 .endif ;AN006;
636 .ENDWHILE ; ;AN000;
637 .IF <BP EQ NOT_FOUND> ; if we never found it then.. ;AN000;
638 STC ; set error flag and.. ;AN000;
639 .ELSE ; ;AN000;
640 SUB SI,TYPE MODE_TABLE ; position us at the appropriate record ;AN000;
641 CLC ; clear error flag ;AN000;
642 .ENDIF ; ;AN000;
643 mov cs:INT10_V_Mode, 0FFh ;AN006; Done. Reset the value
644 pop bp ;AN007;
645 RET ; return to calling module ;AN000;
646SET_SEARCH ENDP ;AN000;
647
648
649;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650;
651; PROCEDURE_NAME: GET_SEARCH
652;
653; FUNCTION:
654; THIS PROCEDURE SEARCHES THE VIDEO TABLE LOOKING FOR A MATCHING
655; VIDEO MODE.
656;
657; AT ENTRY: DS:SI POINTS TO VIDEO TABLE
658; AL CONTAINS THE MODE REQUESTED
659;
660; AT EXIT:
661; NORMAL: CARRY CLEAR, DS:SI POINTS TO MATCHING RECORD
662;
663; ERROR: CARRY SET
664;
665;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
666
667GET_SEARCH PROC NEAR ;AN000;
668 MOV CX,MAX_VIDEO_TAB_NUM ; # of total tables ;AN000;
669 .WHILE <[SI].V_MODE NE AL> AND ; while we are not pointing to ;AN000;
670 .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; the right mode and we are still ;AN000;
671 .WHILE <CX NE 0> ; looking at valid data..do.. ;AN000;
672 ADD SI,TYPE MODE_TABLE ; point to the next mode ;AN000;
673 DEC CX ; decrement counter ;AN000;
674 .ENDWHILE ; ;AN000;
675 .IF <CX EQ 0> OR ; did we find the mode? ;AN000;
676 .IF <[SI].V_MODE EQ UNOCCUPIED> ; ;AN000;
677 STC ; no ...so set error flag ;AN000;
678 .ELSE ; ;AN000;
679 CLC ; yes...clear error flag ;AN000;
680 .ENDIF ; ;AN000;
681 RET ; ;AN000;
682GET_SEARCH ENDP
683
684
685;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
686;
687; PROCEDURE_NAME: SET_CURSOR_EMUL
688;
689; FUNCTION:
690; THIS PROCEDURE SETS THE CURSOR EMULATION BIT OFF IN ROM BIOS. THIS
691; IS TO PROVIDE A CURSOR ON THE EGA WITH THE 5154 LOADED WITH AN 8X8
692; CHARACTER SET.
693;
694; AT ENTRY:
695;
696; AT EXIT:
697; NORMAL: CURSOR EMULATION BIT SET FOR APPLICABLE HARDWARE
698;
699; ERROR: N/A
700;
701;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
702
703SET_CURSOR_EMUL PROC NEAR ;AN000;
704 .IF <BIT HDWR_FLAG AND E5154_ACTIVE> ; EGA with 5154?.. ;AN000;
705 PUSH SI ; ;AN000;
706 PUSH DS ; yes..so.. ;AN000;
707 MOV AX,ROM_BIOS ; check cursor emulation.. ;AN000;
708 MOV DS,AX ; ;AN000;
709 MOV SI,CURSOR_FLAG ; ;AN000;
710 MOV AL,BYTE PTR [SI] ; ;AN000;
711 .IF <CS:REQ_TXT_LENGTH EQ DEFAULT_LENGTH> gt 25 lines requested? ;AN000;
712 AND AL,TURN_OFF ; no....set it OFF ;AN000;
713 .ELSE ; ;AN000;
714 OR AL,TURN_ON ; yes...set it ON ;AN000;
715 .ENDIF ; ;AN000;
716 MOV BYTE PTR [SI],AL ; ;AN000;
717 POP DS ; ;AN000;
718 POP SI ; ;AN000;
719 .ENDIF ; ;AN000;
720 RET ; return to calling module ;AN000;
721SET_CURSOR_EMUL ENDP ;AN000;
722
723
724;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
725;
726; PROCEDURE_NAME: INT10_COM
727;
728; FUNCTION:
729; THIS IS THE INTERRUPT 10H HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
730;
731; AH=1H (SET CURSOR TYPE). CURSOR EMULATION IS PERFORMED IF WE HAVE
732; AND EGA WITH A 5151 MONITOR, AND 43 LINES IS REQUESTED.
733;
734; AH=0H (SET MODE) SCREEN LENGTH IS MAINTAINED WHEN POSSIBLE. (IE. IN
735; TEXT MODES ONLY.)
736; AN004; Capturing Set Mode call and enforcing the # of Rows based on the
737; previous Set_IOCTL request lines was a design mistake. ANSI cannot
738; covers the all the application program out there which use INT 10h
739; directly to make a full screen interface by their own way.
740; This part of logic has been taken out by the management decision.
741; Instead, for each set mdoe INT 10h function call, if it were not
742; issued by SET_IOCTL procedures itself, or by DISPLAY.SYS program,
743; then we assume that it was issued by an APPS, that usually does not
744; know the new ANSI GET_IOCTL/SET_IOCTL interfaces.
745; In this case, ANSI is going to call GET_IOCTL and SET_IOCTL function
746; call - This is not to lose the local data consistency in ANSI.
747;
748; AT ENTRY:
749;
750; AT EXIT:
751; NORMAL:
752;
753; ERROR:
754;
755;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
756
757INT10_COM PROC NEAR ;AN000;
758 STI ; restore interrupts ;AN000;
759 .IF <AH NE SET_CURSOR_CALL> AND ; ;AN000;
760 .IF <AH NE SET_MODE> ;AN000;
761 JMP DWORD PTR CS:ROM_INT10 ; no...pass it on. ;AN000;
762 .ENDIF ;AN000;
763 .IF <AH EQ SET_CURSOR_CALL> ;Set cursor call? ;AN000;
764 PUSH AX ; ;AN000;
765 .IF <BIT CS:HDWR_FLAG AND E5151_ACTIVE> AND ; yes...check if we have an ega.. ;AN000;
766 .IF <CS:REQ_TXT_LENGTH NE DEFAULT_LENGTH> AND ; ;AN000;
767 .IF <CS:GRAPHICS_FLAG EQ TEXT_MODE> AND ; with 5151..so perform cursor mapping ;AN000;
768 .IF <CL GE 8> ; ;AN000;
769 MOV AL,CH ; check for cursor.. ;AN000;
770; AND AL,06H ; off emulation.!!!!!Wrong!!! TypeO error ;AN000;
771 and al, 60h ; off emulation. J.K.
772 .IF <AL NE 020H> ; ;AN000;
773 MOV AL,CH ; start position for cursor ;AN000;
774 CALL MAP_DOWN ; ;AN000;
775 MOV CH,AL ; ;AN000;
776 MOV AL,CL ; end position for cursor ;AN000;
777 CALL MAP_DOWN ; ;AN000;
778 MOV CL,AL ; ;AN000;
779 .ENDIF ; ;AN000;
780 .ENDIF ; ;AN000;
781 POP AX ; ;AN000;
782 JMP DWORD PTR CS:ROM_INT10 ; continue interrupt processing ;AN000;
783 .ELSE NEAR ; must be set mode call.. ;AN000;
784 PUSHF ; prepare for IRET ;AN000;
785 mov cs:ANSI_SetMode_Call_Flag, 1 ;AN008; Used by INT2F_COM
786 CALL DWORD PTR CS:ROM_INT10 ; call INT10 routine ;AN000;
787 mov cs:ANSI_SetMode_Call_Flag, 0 ;AN008; Reset it
788 push bp ;AN007;
789 push es ;AN007;
790 PUSH DS ; ;AN000;
791 PUSH SI ; ;AN000;
792 PUSH DI ; ;AN000;
793 PUSH DX ; ;AN000;
794 PUSH CX ; ;AN000;
795 PUSH BX ; ;AN000;
796 PUSH AX ; ;AN000;
797 PUSH CS ; ;AN000;
798 POP DS ; ;AN000;
799 MOV AH,REQ_VID_MODE ; get current mode.. ;AN000;
800 PUSHF ; ;AN000;
801 CALL DWORD PTR CS:ROM_INT10 ; ;AN000;
802 AND AL,VIDEO_MASK ; mask bit 7 (refresh) ;AN000;
803 test In_Generic_IOCTL_Flag, (I_AM_IN_NOW + SET_MODE_BY_DISPLAY) ;AN004; Flag is on?
804 .IF Z AND ;AN010;AN004;If not (I_AM_IN_NOW or SET_MODE_BY_DISPLAY),
805 .if <Switch_L EQ 0> ;AN010;
806 push ax ;AN004;Save mode
807 push es ;AN004;
808 push cs ;AN004;
809 pop es ;AN004;
810 mov di, offset My_IOCTL_Req_Packet ;AN004;
811 mov INT10_V_Mode, al ;AN006;Save current mode for SET_SEARCH
812 call Get_IOCTL ;AN004;
813 .IF NC ;AN004;
814 mov di, offset MY_IOCTL_Req_Packet ;AN004;
815 or In_Generic_IOCTL_Flag, CALLED_BY_INT10COM ;AN009;Do not set mode INT 10h again. Already done.
816 call Set_IOCTL ;AN004;
817 and In_Generic_IOCTL_Flag, not CALLED_BY_INT10COM ;AN009;
818 .ENDIF ;AN004;
819 pop es ;AN004;
820 pop ax ;AN004;Restore mode
821 mov INT10_V_Mode, 0FFh ;AN006;
822 .ENDIF ;AN004;
823 LEA SI,VIDEO_MODE_TABLE ; ;AN000;
824 CALL GET_SEARCH ; look through table for mode selected. ;AN000;
825 .IF NC ; if found then.. ;AN000;
826 .IF <[SI].D_MODE NE TEXT_MODE> ; text mode?.... ;AN000;
827 MOV GRAPHICS_FLAG,GRAPHICS_MODE ; no...set graphics flag. ;AN000;
828 .ELSE ; ;AN000;
829 MOV GRAPHICS_FLAG,TEXT_MODE ; yes...set text flag.. ;AN000;
830 .ENDIF ; ;AN000;
831 .ENDIF ; ;AN000;
832
833 test In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN010;
834 .if z AND ;AN010;
835 .if <Graphics_Flag EQ TEXT_MODE> AND ;
836 .if <Switch_L EQ 1> ;AN010;
837 call DO_ROWS ;AN010;
838 .endif ;AN010;
839
840;AN004;The following has been taken out!
841;AN004; .IF <REQ_TXT_LENGTH NE DEFAULT_LENGTH> ; 25 lines active? ;AN000;
842;AN004; MOV AX,DISPLAY_CHECK ; is DISPLAY.SYS there? ;AN000;
843;AN004; INT 2FH ; ;AN000;
844;AN004; .IF <AL NE INSTALLED> OR ; if not installed or.. ;AN000;
845;AN004; MOV AX,CHECK_ACTIVE ; if a code page has not.. ;AN000;
846;AN004; INT 2FH ; been selected then.. ;AN000;
847;AN004; .IF C ; ;AN000;
848;AN004; .IF <GRAPHICS_FLAG EQ TEXT_MODE> ; is this a text mode? ;AN000;
849;AN004; CALL ROM_LOAD_8X8 ; yes..load ROM 8x8 character set. ;AN000;
850;AN004; .ENDIF ; ;AN000;
851;AN004; .ENDIF ; ;AN000;
852;AN004; .ENDIF ; ;AN000;
853;AN004;Instead, for each SET mode function int 10h function call, if it is not
854;AN004;issued by ANSI GET_IOCTL and SET_IOCTL procedure themselves, we assume
855;AN004;that the APPS, which usually does not know the ANSI GET_IOCTL/SET_IOCTL
856;AN004;interfaces, intend to change the screen mode. In this case, ANSI is
857;AN004;kind enough to call GET_IOCTL and SET_IOCTL function call for themselves.
858
859 POP AX ; ;AN000;
860 POP BX ; ;AN000;
861 POP CX ; ;AN000;
862 POP DX ; ;AN000;
863 POP DI ; ;AN000;
864 POP SI ; ;AN000;
865 POP DS ; ;AN000;
866 pop es ;AN007;
867 pop bp ;AN007;
868 .ENDIF ; ;AN000;
869 IRET ; ;AN000;
870INT10_COM ENDP
871
872
873;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
874;
875; PROCEDURE_NAME: INT2F_COM
876;
877; FUNCTION:
878; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
879;
880; AX=1A00H INSTALL REQUEST. ANSI WILL RETURN AL=FFH IF LOADED.
881;
882; AH=1A01H THIS IS THE INT2FH INTERFACE TO THE GENERIC IOCTL.
883; NOTE: THE GET CHARACTERISTICS FUNCTION CALL WILL RETURN
884; THE REQ_TXT_LENGTH IN THE BUFFER AS OPPOSED TO
885; THE ACTUAL HARDWARE SCREEN_LENGTH
886; Ax=1A02h This is an information passing from DISPLAY.SYS about
887; the INT 10h, SET MODE call.
888;
889; AT ENTRY:
890;
891; AT EXIT:
892; NORMAL:
893;
894; ERROR:
895;
896;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
897
898INT2F_COM PROC NEAR ;AN000;
899 STI ; ;AN000;
900 .IF <AH NE MULT_ANSI> OR ; is this for ANSI? ;AN000;
901; .IF <AL GT IOCTL_2F> ; ;AN000;
902 .IF <AL GT DA_INFO_2F> ;AN004;=2h
903 JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000;
904 .ENDIF ; ;AN000;
905 .SELECT ; ;AN000;
906 .WHEN <AL EQ INSTALL_CHECK> NEAR ; if install check then.. ;AN000;
907 MOV AL,INSTALLED ; load value to indicate installed ;AN000;
908 CLC ; clear error flag. ;AN000;
909; .WHEN <AL EQ IOCTL_2F> ; request for IOCTL? ;AN000;
910 .WHEN <AL BE DA_INFO_2F> NEAR ;AN004;IOCTL or INFO passing?
911 PUSH BP ; ;AN000;
912 PUSH AX ; s ;AN000;
913 PUSH CX ; a ;AN000;
914 PUSH DX ; v ;AN000;
915 PUSH DS ; e r ;AN000;
916 PUSH ES ; e ;AN000;
917 PUSH DI ; g ;AN000;
918 PUSH SI ; s. ;AN000;
919 PUSH BX ; ;AN000;
920 PUSH DS ; load ES with DS (for call) ;AN000;
921 POP ES ; ;AN000;
922 MOV DI,DX ; load DI with DX (for call) ;AN000;
923 PUSH CS ; setup local addressability ;AN000;
924 POP DS ; ;AN000;
925 .IF <AL EQ IOCTL_2F> ;IOCTL request
926 .IF <CL EQ GET_FUNC> ; get function requested. ;AN000;
927 CALL GET_IOCTL ; ;AN000;
928 .IF NC AND ; if no error and... ;AN000;
929 .IF <HDWR_FLAG GE E5151_ACTIVE> AND ; gt 25 lines supported and.. ;AN000;
930 .IF <[SI].D_MODE EQ TEXT_MODE> ; this is a text mode then.. ;AN000;
931 .if <cs:Switch_L EQ 1> OR ;AN010;
932 .if <cs:ANSI_SetMode_Call_Flag NE 1> OR ;AN008; if not originated by ANSI thru. AH=0, INT10,
933 .if <cs:Display_Loaded_Before_me NE 1> ;AN008; or Display.sys not loaded before ANSI,
934 MOV BX,REQ_TXT_LENGTH ; then use REQ_TXT_LENGTH instead.. ;AN000;
935 MOV ES:[DI].RP_ROWS,BX ;
936 .endif
937 CLC ; ;AN000;
938 .ENDIF ; ;AN000;
939 .ELSEIF <CL EQ SET_FUNC> ; ;AN000;
940 CALL SET_IOCTL ; set function requested. ;AN000;
941 .ELSE ; invalid function... ;AN000;
942 MOV AX,INVALID_FUNC ; load error and... ;AN000;
943 STC ; set error flag. ;AN000;
944 .ENDIF ; ;AN000;
945 .ELSE ;AN004;Info. passing
946 .IF <ES:[DI].DA_INFO_LEVEL EQ 0> ;AN004; 0 = DA_SETMODE_FLAG request.
947 .IF <ES:[DI].DA_SETMODE_FLAG EQ 1> ;AN004;
948 or cs:In_Generic_IOCTL_Flag, SET_MODE_BY_DISPLAY ;AN004;Turn the flag on
949 .ELSE ;AN004;
950 and cs:In_Generic_IOCTL_Flag, not SET_MODE_BY_DISPLAY ;AN004;Turn the flag off
951 .ENDIF ;AN004;
952 .ELSE
953 .IF <ES:[DI].DA_INFO_LEVEL EQ 1> ;AN011; 1 = DA_OPTION_L_STATE query
954 mov al, cs:[Switch_L] ;AN011;
955 mov es:[di].DA_OPTION_L_STATE, al ;AN011;
956 .ENDIF
957 .ENDIF ;AN004;
958 clc ;AN004;clear carry. There is no Error in DOS 4.00 for this call.
959 .ENDIF
960 POP BX ; restore all.. ;AN000;
961 POP SI ; ;AN000;
962 POP DI ; registers except.. ;AN000;
963 POP ES ; ;AN000;
964 POP DS ; BP. ;AN000;
965 POP DX ; ;AN000;
966 POP CX ; ;AN000;
967 PUSH AX ; save error condition ;AN000;
968 MOV BP,SP ; setup frame pointer ;AN000;
969 MOV AX,[BP+10] ; load stack flags ;AN000;
970 .IF NC ; carry set?.. ;AN000;
971 AND AX,NOT_CY ; no.. set carry off. ;AN000;
972 MOV [BP+10],AX ; put back on stack. ;AN000;
973 POP AX ; remove error flag from stack ;AN000;
974 POP AX ; no error so bring back function call ;AN000;
975 XCHG AH,AL ; exchange to show that ANSI present ;AN000;
976 .ELSE ; ;AN000;
977 OR AX,CY ; yes...set carry on. ;AN000;
978 MOV [BP+10],AX ; put back on stack. ;AN000;
979 POP AX ; restore error flag ;AN000;
980 POP BP ; pop off saved value of AX (destroyed) ;AN000;
981 .ENDIF ; ;AN000;
982 POP BP ; restore final register. ;AN000;
983 .ENDSELECT ; ;AN000;
984ABORT: IRET ; ;AN000;
985INT2F_COM ENDP ;AN000;
986
987
988;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
989;
990; PROCEDURE_NAME: MAP_DOWN
991;
992; FUNCTION:
993; THIS PROCEDURE MAPS THE CURSOR START (END) POSITION FROM A 14 PEL
994; BOX SIZE TO AN 8 PEL BOX SIZE.
995;
996; AT ENTRY: AL HAS THE CURSOR START (END) TO BE MAPPED.
997;
998; AT EXIT:
999; NORMAL: AL CONTAINS THE MAPPED POSITION FOR CURSOR START (END)
1000;
1001; ERROR: N/A
1002;
1003;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1004
1005MAP_DOWN PROC NEAR ;AN000;
1006 PUSH BX ; ;AN000;
1007 XOR AH,AH ; clear upper byte of cursor position ;AN000;
1008 MOV BL,EIGHT ; multiply by current box size. ;AN000;
1009 PUSH DX ; al x ;AN000;
1010 MUL BL ; ---- = --- ;AN000;
1011 POP DX ; 14 8 ;AN000;
1012 MOV BL,FOURTEEN ; ;AN000;
1013 DIV BL ; divide by box size expected. ;AN000;
1014 POP BX ; ;AN000;
1015 RET ; ;AN000;
1016MAP_DOWN ENDP
1017
1018
1019;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1020;
1021; PROCEDURE_NAME: SET_VIDEO_MODE
1022;
1023; FUNCTION:
1024; THIS PROCEDURE SETS THE VIDEO MODE SPECIFIED IN DS:[SI].V_MODE.
1025;
1026; AT ENTRY: DS:SI.V_MODE CONTAINS MODE NUMBER
1027;
1028; AT EXIT:
1029; NORMAL: MODE SET
1030;
1031; ERROR: N/A
1032;
1033;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1034
1035SET_VIDEO_MODE PROC NEAR ;AN000;
1036 .if <BIT cs:In_Generic_IOCTL_Flag NAND CALLED_BY_INT10COM> ;AN009;
1037 MOV AL,[SI].V_MODE ; ..issue set mode ;AN000;
1038 .IF <BIT HDWR_FLAG AND LCD_ACTIVE> OR ; is this the LCD? ;AN000;
1039 .IF <BIT HDWR_FLAG AND VGA_ACTIVE> ; or VGA (done for BRECON card) ;AN000;
1040 PUSH DS ; yes... ;AN000;
1041 MOV BL,AL ; save mode ;AN000;
1042 MOV AX,ROM_BIOS ; ;AN000;
1043 MOV DS,AX ; get equipment status flag.. ;AN000;
1044 MOV AX,DS:[EQUIP_FLAG] ; ;AN000;
1045 AND AX,INIT_VID_MASK ; clear initial video bits.. ;AN000;
1046 .IF <BL EQ MODE7> OR ; are we setting mono? ;AN000;
1047 .IF <BL EQ MODE15> ; ;AN000;
1048 OR AX,LCD_MONO_MODE ; yes...set bits as mono ;AN000;
1049 .ELSE ; ;AN000;
1050 OR AX,LCD_COLOR_MODE ; no...set bits as color ;AN000;
1051 .ENDIF ; ;AN000;
1052 MOV DS:[EQUIP_FLAG],AX ; replace updated flag. ;AN000;
1053 MOV AL,BL ; restore mode. ;AN000;
1054 POP DS ; ;AN000;
1055 .ENDIF ; ;AN000;
1056 MOV AH,SET_MODE ; set mode ;AN000;
1057 INT 10H ;AN000;
1058 .endif ;AN009;
1059 RET ;AN000;
1060SET_VIDEO_MODE ENDP ;AN000;
1061
1062
1063;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1064;
1065; PROCEDURE_NAME: ROM_LOAD_8X8
1066;
1067; FUNCTION:
1068; THIS PROCEDURE LOADS THE ROM 8X8 CHARACTER SET AND ACTIVATES BLOCK=0
1069; FONT.
1070;
1071; AT ENTRY:
1072;
1073; AT EXIT:
1074; NORMAL: 8X8 ROM CHARACTER SET LOADED
1075;
1076; ERROR: N/A
1077;
1078;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1079
1080ROM_LOAD_8X8 PROC NEAR ;AN000;
1081 MOV AX,LOAD_8X8 ; load 8x8 ROM font ;AN000;
1082 XOR BL,BL ; ;AN000;
1083 PUSHF ;AN000;
1084 CALL DWORD PTR CS:ROM_INT10 ;AN000;
1085 MOV AX,SET_BLOCK_0 ; activate block = 0 ;AN000;
1086 XOR BL,BL ;AN000;
1087 PUSHF ;AN000;
1088 CALL DWORD PTR CS:ROM_INT10 ;AN000;
1089 RET ;AN000;
1090ROM_LOAD_8X8 ENDP ;AN000;
1091 ;AN000;
1092
1093;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1094;
1095; PROCEDURE_NAME: CHECK_FOR_DISPLAY
1096;
1097; FUNCTION:
1098; THIS PROCEDURE CHECKS TO SEE IF WE DISPLAY.SYS IS THERE, AND IF
1099; IT IS..IT HAS THE REQUIRED FONT.
1100;
1101; AT ENTRY: AX - DESIRED SCREEN LENGTH
1102;
1103; AT EXIT:
1104; NORMAL: CARRY CLEAR IF ALL OKAY
1105;
1106; ERROR: CARRY SET IF FONT NOT AVAILABLE.
1107;
1108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1109
1110CHECK_FOR_DISPLAY PROC NEAR ;AN000;
1111 .IF <AX EQ DEFAULT_LENGTH> OR ; is it just 25 lines needed? ;AN000;
1112 MOV AX,DISPLAY_CHECK ; ;AN000;
1113 INT 2FH ; ;AN000;
1114 .IF <AL NE INSTALLED> OR ; or is DISPLAY.SYS not there? ;AN000;
1115 MOV AX,CHECK_FOR_FONT ; ;AN000;
1116 INT 2FH ; or if it is does it have the.. ;AN000;
1117 .IF NC ; 8X8 font then. ;AN000;
1118 CLC ; clear carry ;AN000;
1119 .ELSE ; ;AN000;
1120 STC ; no font...set carry ;AN000;
1121 .ENDIF ; ;AN000;
1122 RET ; ;AN000;
1123CHECK_FOR_DISPLAY ENDP
1124
1125CODE ENDS
1126 END