]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/MODE/MODEVID.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / MODE / MODEVID.ASM
1 PAGE ,132 ;\ f
2 TITLE MODEVID.SAL
3
4 .XLIST
5 INCLUDE STRUC.INC ;macro library for 'struc'
6 .LIST
7
8 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
9 ;º º ;AN000;
10 ;AN000;
11 ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the
12 ; USA.MSG file because it looked like a common message. Now
13 ; I use a different (better) message. It was "Invalid paramters",
14 ; is now "Function not supported - ????".
15
16 ;º º ;AN000;
17 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
18 ;AN000;
19 SIGNITURE SEGMENT AT 0C000H
20 ORG 0
21 SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
22 SIGNITURE ENDS
23
24
25 LOW_MEM SEGMENT AT 0
26 ORG 410H
27 EQUIP_FLAG EQU THIS WORD
28 LOW_MEM ENDS
29
30
31 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32 ;º º
33
34
35 DISPLAY MACRO MSG
36 MOV DX,OFFSET MSG
37 CALL PRINTF
38 ENDM
39
40
41 ;-------------------------------------------------------------------------------
42
43
44 find_number MACRO num, list
45
46 ;Purpose: See if num is in the list of numbers.
47
48 ;Input: num - number to be checked
49 ; list - label of list to scan
50 ; list_len - length of the list to scan. This name is built from the
51 ; label 'list' that is input.
52
53 ;Output: zero flag set if the number is found in 'list'
54
55 ;Assumption: A label of the name list_len exists and is in segment addressed by
56 ; DS, where 'list' is the label passed in. ES and DS are the same.
57
58 ;Side effects: The direction flag is cleared.
59
60 PUSH DI
61 PUSH CX
62
63 MOV AL,num
64 MOV DI,OFFSET list
65 CLD ;want to increment DI
66 MOV CX,list&_len ;CX=number of nums in the list
67 REPNE SCASB
68
69 POP CX
70 POP DI
71
72 ENDM
73
74 ;-------------------------------------------------------------------------------
75
76
77 SET_CURSOR_POS MACRO
78 MOV AH,2 ;SET CURSOR
79 MOV DX,0 ;ROW=0,COL=0
80 MOV BH,0 ;SELECT SCREEN 0
81 INT 10H
82
83 ENDM
84
85 MODE_VIDEO MACRO OPTION
86 MOV AH,0 ;SET MODE
87 MOV AL,OPTION
88 INT 10H
89
90 ENDM
91
92 SET_CURSOR_TYPE MACRO
93 MOV AH,1 ;SET CURSOR TYPE
94 MOV CX,CURSOR_TYPE ;ROW=0,COL=0
95 INT 10H
96
97 ENDM
98
99 ;º º
100 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
101
102
103 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
104 ;º º
105
106 B EQU 0 ;POSITION OF "B" IN PARM1 FOR BW?0
107 W EQU 1 ;POSITION OF "W" IN PARM1 FOR BW?0
108 C EQU 0 ;POSITION OF "C" IN PARM1 FOR CO?0
109 O EQU 1 ;POSITION OF "O" IN PARM1 FOR CO?0
110 M EQU 0 ;POSITION OF "M" IN PARM1 FOR MONO
111 N EQU 2 ;POSITION OF "N" IN PARM1 FOR MONO
112 OH EQU 3 ;POSITION OF SECOND "O" IN PARM1 FOR MONO
113
114 all EQU 0FEH ;descreet value representing adapter/monitor that can be in mono and color
115 ALT_SELECT EQU 12H ;ALTERNATE SELECT FUNCTION OF INT10
116 AMOAMA EQU 01 ;map to check 'all modes on all monitors active' bit of misc state info byte
117 bw7 EQU 7 ;another mono (emulation) mode (VGA with analog monochrome)
118 bw0B EQU 0BH ;analog black and white on a PALACE
119 cga EQU 02 ;plain color card
120 COLOR_CURSOR_TYPE EQU 0607H ;CURSOR TYPE FOR ALL COLOR AND BW MODES
121 color6 EQU 6 ;another color supporting combination (PGA with color display)
122 color8 EQU 8 ;another color supporting combination
123 colorA EQU 0AH ;yet another color combo (color display or ehnanced color display on PALACE)
124 colorC EQU 0CH ;even another color combo (PALACE with analog color)
125 ega_color EQU 4 ;value for color support of EGA
126 EGA_INFO EQU 10H ;RETURN EGA INFORMATION OPTION OF ALT. SELECT FUNCTION OF INT10
127 EGA_MONO EQU 05H
128 EGA_SIG EQU 0AA55H ;SIGNITURE FOR EGA CARD
129 EMPTY EQU 0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 0
130 FALSE EQU 0
131 get_sys_stat EQU 43H ;get system status function of INT 15H
132 LCD_attached EQU 00000000B ;bit 0=0 if the LCD is attached
133 LCD_bit EQU 00000001B ;mask to check the LCD attached bit of status byte
134 LOWERCASE EQU 20H ;OR THIS TO UPPER/LOWER CASE TO ASSURE LOWERCASE
135 mono_card EQU 1 ;BIOS INT 10 AH=1B representation of plain mono card
136 MONO_CURSOR_TYPE EQU 0B0CH
137 MONO_ON_IT EQU 1 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF MONO IN EFFECT
138 OPTION_BW4025 EQU 0 ;40 X 25 BW
139 OPTION_CO4025 EQU 1 ;40 X 25 COLOR
140 OPTION_BW8025 EQU 2 ;80 X 25 BW
141 OPTION_CO8025 EQU 3 ;80 X 25 COLOR
142 OPTION_MONO EQU 7 ;monochrome
143 parm_list EQU [BP] ;addressing for array of parsed parameters in form "parm_list_entry"
144
145 COLOR_ON_IT EQU 0 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF COLOR IN EFFECT
146 BITBW40 EQU 10H ;40X25 BW USING COLOR CARD
147 BITBW80 EQU 20H ;80X25 BW USING COLOR CARD
148 BITMONO EQU 30H ;80X25 BW CARD
149 video_info_DI EQU [DI]
150
151 ;º º
152 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
153
154
155
156
157 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
158 ;º º
159
160 PUBLIC ALT_SELECT
161 PUBLIC BW40
162 PUBLIC BW80
163 PUBLIC CHECK_BUFF
164 PUBLIC CO40
165 PUBLIC CO80
166 PUBLIC COLOR_ON_IT
167 PUBLIC EGA_INFO
168 PUBLIC GET_VIDEO_INFO
169 PUBLIC MONO
170
171 ;º º
172 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
173
174
175
176 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
177 ;º º
178
179 INCLUDE common.stc ;definition of the following struc
180
181 ;parm_list_entry STRUC ;used by parse_parameters and invoke
182 ;
183 ;parm_type DB bogus
184 ;item_tag DB 0FFH
185 ;value1 DW bogus ;used only for filespecs and code page numbers
186 ;value2 DW bogus ;used only for filespecs and code page numbers
187 ;keyword_switch_ptr DW 0
188 ;
189 ;parm_list_entry ENDS
190
191
192 info_block STRUC ;layout of info returned by INT 10 AH=1B
193 who_cares1 DB 025H DUP ("V")
194 active_display DB "V"
195 alternate_display DB "V"
196 who_cares2 DB 6 DUP ("V")
197 misc_state_info DB "V"
198 who_cares3 DB 12H DUP ("V")
199 info_block ENDS
200
201
202 ;º º
203 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
204
205
206
207
208 ;THE FOLLOWING 'RECORD' STATEMENT DEFINES THE BITS BITS OF THE EQUIPMENT FLAG:
209 ;BIT 15,14 = NUMBER OF PRINTERS ATTACHED
210 ;BIT 13 = NOT USED
211 ;BIT 12 = GAME I/O ATTACHED
212 ;BIT 11-9 = NUMBER OF RS232 CARDS ATTACHED
213 ;BIT 8 = UNUSED
214 ;BIT 7,6 = NUMBER OF DISKETTE DRIVES
215 ;BIT 5,4 = INITIAL VIDEO MODE:
216 ; 00-UNUSED
217 ; 01-40X25 BW USING COLOR CARD
218 ; 10-80X25 BW USING COLOR CARD
219 ; 11-80X25 BW USING BW CARD
220 ;BIT 3,2 = PLANAR RAM SIZE (00=16K, 01=32K, 10=48K, 11=64K)
221 ;BIT 1 = NOT USED
222 ;BIT 0 = IPL FROM DISKETTE
223 FLAG RECORD PR:2,NA1:1,GAME:1,COMN:3,NA2:1,DISKD:2,VIDEO:2,RAM:2,NA3:1,IPL:1
224 ;DEFINITION OF ABOVE VIDEO BITS:
225
226
227
228 PAGE
229 PRINTF_CODE SEGMENT PUBLIC
230 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE
231
232
233 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
234 ;º º
235
236 color_combos label byte ;list of adapter/display combinations supporting color modes
237 DB bw0B
238 DB color6
239 DB color8
240 DB colorA
241 DB colorC
242 DB cga
243 DB ega_color
244 color_combos_len EQU $ - color_combos
245
246 CURSOR_TYPE DW 0607H ;HOLDER OF APPROPRIATE CURSOR TYPE
247 information_block info_block <> ;area to hold info returned from INT 10 AH=1B
248
249 mono_combos label byte
250 DB mono_card
251 DB ega_mono
252 DB bw7
253 mono_combos_len EQU $ - mono_combos
254
255 ;º º
256 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
257
258
259 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
260 ;º º
261
262 EXTRN Function_not_supported:WORD ;'INVALID PARAMETERS'
263 EXTRN NOERROR:BYTE ;INDICATE THAT NO ERROR MESSAGES HAVE BEEN ISSUED YET
264 EXTRN not_supported_ptr:WORD ;pointer to the screen mode that the configuration can't do.
265 EXTRN machine_type:BYTE ;holder of model byte
266 EXTRN parm_lst:BYTE ;the array of the structure parm_list_entry max_pos_parms DUP (<>)
267 EXTRN PRINTF:NEAR ;"C" LIKE FORMATTED SCREEN OUTPUT ROUTINE
268 EXTRN PARM1:BYTE ;PARAMETER HOLDING AREA, SEE "RESCODE"
269 EXTRN P14_model_byte:ABS
270
271 ;º º
272 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
273
274
275
276 ;***********************************************************
277 ;SET VIDEO TO 40 X 25, BLACK AND WHITE
278 BW40 PROC NEAR
279
280 CALL get_video_info
281 .IF <video_info_DI.active_display EQ all> OR
282 find_number <video_info_DI.active_display>,color_combos
283 .IF Z OR
284 find_number <video_info_DI.alternate_display>,color_combos
285 .IF Z THEN
286
287 MOV DL,BITBW40 ;SET FOR BW 40 X 80
288 MOV DH,OPTION_BW4025
289 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
290 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
291 ;DH HAS BYTE OF VIDEO OPTION
292 CALL setup
293
294 .ELSE
295
296 MOV DI,0 ;the screen mode is always the first parm ;AC000;
297 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
298 MOV CX,parm_list[DI].value1 ;AC000;
299 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
300 DISPLAY Function_not_supported ;'Function not supported - BW40"
301 MOV NOERROR,FALSE
302
303 .ENDIF
304
305 RET ;RETURN TO MAIN ROUTINE
306 BW40 ENDP
307 ;******************************************************
308 ;SET VIDEO TO 80 X 25, BLACK AND WHITE
309 BW80 PROC NEAR
310
311 CALL get_video_info
312 .IF <video_info_DI.active_display EQ all> OR
313 find_number <video_info_DI.active_display>,color_combos
314 .IF Z OR
315 find_number <video_info_DI.alternate_display>,color_combos
316 .IF Z THEN
317
318 MOV DL,BITBW80 ;80 X 25 BW USING GRAPHICS CARD
319 MOV DH,OPTION_BW8025
320 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
321 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
322 ;DH HAS BYTE OF VIDEO OPTION
323 CALL setup
324
325 .ELSE
326
327 MOV DI,0 ;the screen mode is always the first parm ;AC000;
328 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
329 MOV CX,parm_list[DI].value1 ;AC000;
330 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
331 DISPLAY Function_not_supported ;'Function not supported - BW80"
332 MOV NOERROR,FALSE
333
334 .ENDIF
335
336 RET
337 BW80 ENDP
338 ;******************************************************
339 ;SET VIDEO TO 80 X 25, MONOCHROME
340 MONO PROC NEAR
341
342 CALL get_video_info
343 .IF <video_info_DI.active_display EQ all> OR
344 find_number <video_info_DI.active_display>,mono_combos
345 .IF Z OR
346 find_number <video_info_DI.alternate_display>,mono_combos
347 .IF Z THEN
348
349 MOV DL,BITMONO ;EQUIP FLAG INDICATING 80 X 25 BW USING MONO CARD
350 MOV DH,OPTION_MONO ;MONOCHROME MODE
351 MOV CURSOR_TYPE,MONO_CURSOR_TYPE
352
353 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
354 ;DH HAS BYTE OF VIDEO OPTION
355 CALL SETUP
356
357 .ELSE
358
359 MOV DI,0 ;the screen mode is always the first parm ;AC000;
360 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
361 MOV CX,parm_list[DI].value1 ;AC000;
362 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
363 DISPLAY Function_not_supported ;'Function not supported - MONO"
364 MOV NOERROR,FALSE
365
366 .ENDIF
367
368 RET ;RETURN TO MAIN ROUTINE
369 MONO ENDP
370 ;*******************************************************
371 CO40 PROC NEAR
372
373 CALL get_video_info
374 .IF <video_info_DI.active_display EQ all> OR
375 find_number <video_info_DI.active_display>,color_combos
376 .IF Z OR
377 find_number <video_info_DI.alternate_display>,color_combos
378 .IF Z THEN
379
380 MOV DL,BITBW40 ;40 X 25 USING COLOR CARD
381 MOV DH,OPTION_CO4025 ; REQUEST COLOR
382 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
383 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
384 ;DH HAS BYTE OF VIDEO OPTION
385 CALL setup
386
387 .ELSE
388
389 MOV DI,0 ;the screen mode is always the first parm ;AC000;
390 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
391 MOV CX,parm_list[DI].value1 ;AC000;
392 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
393 DISPLAY Function_not_supported ;'Function not supported - CO40"
394 MOV NOERROR,FALSE
395
396 .ENDIF
397
398 RET ;RETURN TO MAIN ROUTINE
399 CO40 ENDP
400 ;******************************************************
401 CO80 PROC NEAR
402
403 CALL get_video_info
404 .IF <video_info_DI.active_display EQ all> OR
405 find_number <video_info_DI.active_display>,color_combos
406 .IF Z OR
407 find_number <video_info_DI.alternate_display>,color_combos
408 .IF Z THEN
409
410 MOV DL,BITBW80 ;80 X 25 USING COLOR CARD
411 MOV DH,OPTION_CO8025 ; REQUEST COLOR
412 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
413
414 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
415 ;DH HAS BYTE OF VIDEO OPTION
416 CALL setup
417
418 .ELSE
419
420 MOV DI,0 ;the screen mode is always the first parm ;AC000;
421 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
422 MOV CX,parm_list[DI].value1 ;AC000;
423 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
424 DISPLAY Function_not_supported ;'Function not supported - CO80"
425 MOV NOERROR,FALSE
426
427 .ENDIF
428
429 RET ;RETURN TO MAIN ROUTINE
430 CO80 ENDP
431 ;******************************************************
432 SETUP PROC NEAR
433 ;INPUT: DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
434 ; DH HAS BYTE OF VIDEO OPTION
435
436 XOR AX,AX ;ZERO A REG
437 MOV ES,AX ;POINT TO SEGMENT AT ZERO
438 MOV AX,ES:EQUIP_FLAG ;GET CURRENT STATUS FLAG BYTE
439 AND AL,0FFH-MASK VIDEO ;CLEAR VIDEO DEFINITION BITS
440 OR AL,DL ;TURN ON REQUESTED VIDEO BITS
441 MOV ES:EQUIP_FLAG,AX ;RESTORE UPDATED FLAG BYTE
442
443 MODE_VIDEO DH ;SET MODE TO DESIRED OPTION
444
445 SET_CURSOR_POS ;TO ROW=0, COL=0
446
447 SET_CURSOR_TYPE ;TO 6,7 FOR COLOR MODES, B,C FOR MONO
448
449 RET ;RETURN TO CALLER
450 SETUP ENDP
451 ;******************************************************
452 GET_VIDEO_INFO PROC NEAR
453
454 ;Determine what display adapters are in the machine.
455
456
457 ;Assumption:
458 ;
459 ;
460
461 ;Notes: I assume that if an EGA is present then it is the active display. This
462 ; is not always the case, but the routines that call for that kind of
463 ; information do not care which is active, or already know.
464
465 ;Conventions: 'video_info_DI'([DI]) is used to address the info table returned
466 ; by INT 10 AH=1B as defined by the structure 'info_block' and
467 ; stored in 'information_block'. If the INT 10 AH=1A was
468 ; successfull then the result is stored here.
469
470
471
472
473
474
475
476
477 PUSH ES
478
479 XOR AX,AX ;ZAP previous contents
480 MOV AH,01BH ;functionality/state information
481 PUSH CS
482 POP ES
483 MOV DI,OFFSET information_block ;initialize 'video_info_DI'
484 MOV BX,0 ;parm to allow for future expansion
485 INT 010H
486 .IF <AL EQ 01BH> THEN NEAR ;IF the call is supported THEN
487 ;ES:DI=>info returned from BIOS
488 .IF <video_info_DI.alternate_display EQ 0> THEN NEAR ;only 1 display, so see if it can handle all modes
489
490 TEST video_info_DI.misc_state_info,AMOAMA ;check the 'all modes on all monitors active' bit
491 .IF NZ ;IF all modes are supported THEN
492 MOV video_info_DI.active_display,all ;return the active display type as everything
493 .ENDIF
494
495 .ENDIF
496
497 .ELSE ;display code call not supported, look for EGA
498 ;SINCE the display type call was not supported SEE IF IN AN EGA ADVANCED MODE
499
500 MOV AX,SIGNITURE
501 MOV ES,AX ;PUT SEGMENT OF SIGNITURE OF EGA IN ES
502 .IF <ES:SIGWORD EQ EGA_SIG> AND ;IF maybe an EGA IN THE MACHINE THEN
503 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
504 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
505 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
506 .IF <BL NE 010H> THEN ;EGA support available
507 .IF <BH EQ COLOR_ON_IT> THEN ;IF COLOR HOOKED TO EGA THEN
508 MOV video_info_DI.active_display,ega_color
509
510 MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER
511 CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT
512 .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN
513 MOV video_info_DI.alternate_display,mono_card
514 .ENDIF
515
516 .ELSE
517 MOV video_info_DI.active_display,ega_mono
518
519 MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER
520 CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH
521 .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT
522 MOV video_info_DI.alternate_display,cga
523 .ENDIF
524 .ENDIF
525 .ELSE ;no display type call, no EGA
526 ;check for convertible
527 .IF <machine_type EQ P14_model_byte> AND
528 MOV AH,get_sys_stat
529 INT 15H ;AL=system status
530 AND AL,LCD_bit ;check bit 0
531 .IF <AL EQ LCD_attached> THEN
532 MOV video_info_DI.active_display,all ;LCD supports mono and color
533 .ELSE ;no analog displays, no EGA, no LCD
534
535 MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER
536 CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT
537 .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN
538 MOV video_info_DI.active_display,mono_card
539 .ENDIF
540
541 MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER
542 CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH
543 .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT
544 MOV video_info_DI.alternate_display,cga
545 .ENDIF
546
547 .ENDIF
548
549 .ENDIF
550
551 .ENDIF
552
553 POP ES
554
555 RET ;RETURN TO CALLER
556
557
558 GET_VIDEO_INFO ENDP
559 ;******************************************************
560 ;VMONO PROC NEAR
561 ;;VERIFY THAT A MONOCHROME CARD EXISTS OR LCD IS ATTACHED
562 ;;Input: - AX=base of monochrome screen buffer
563 ;;Output: - AH=AL if have monochrome card or LCD attached
564 ;; AH<>AL if don't have mono card and LCD is not attached
565 ;
566 ;;One way to have a valid MONO setting on a P1X is to have the LCD attached. Another is
567 ;;to have the LCD detached and have a MONO card attached.
568 ;;The logic is as follows:
569 ;;
570 ;;BEGIN
571 ;; ok_to_put_in_MONO_mode:=false
572 ;; IF on a P1X AND LCD is attached THEN
573 ;; ok_to_put_in_MONO_mode:=true
574 ;; ELSE
575 ;; verify_the_buffer_exists
576 ;; ENDIF
577 ;;END
578 ;
579 ; PUSH AX
580 ; CMP machine_type,P14_model_byte
581 ; $IF E,AND
582 ; MOV AH,get_sys_stat
583 ; INT 15H ;AL=system status
584 ; AND AL,LCD_bit ;check bit 0
585 ; CMP AL,LCD_attached
586 ; $IF E ;IF on a P1X AND LCD is attached THEN
587 ; POP AX ; clean the stack
588 ; MOV AX,0000H ; AH=ALðOK to put in MONO mode
589 ; $ELSE ;ELSE
590 ; POP AX ; AX=mono buffer base
591 ; CALL check_buff ; see if the MONO card exists
592 ; $ENDIF ;ENDIF
593 ;RET ;RETURN TO MAIN ROUTINE
594 ;VMONO ENDP
595 ;******************************************************
596 CHECK_BUFF PROC NEAR
597 ;SEE IF MEMORY EXISTS AT THE SEGMENT PASSED IN AX
598
599 PUSH DS ;SAVE DATA SEGMENT REGISTER
600 ; MOVE SEG ID OF VIDEO BUFFER
601 MOV DS,AX ; TO THE DATA SEGMENT REG
602 MOV CH,DS:0 ;GET A BYTE FROM THAT BUFFER
603 MOV AL,55H ;GET A SAMPLE DATA BYTE
604 MOV DS:0,AL ; TO THE SCREEN BUFFER, IF THERE
605 PUSH BX ;TERMINATE THE BUS SO WE DON'T GET THE SAME THING
606 POP BX ;BACK BECAUSE IT WAS STILL ON THE BUS
607 MOV AH,DS:0 ;FETCH IT BACK
608 MOV DS:0,CH ;REPAIR THE DAMAGE IN THE BUFFER
609 POP DS ;RESTORE DATA SEGMENT REGISTER
610 RET
611 CHECK_BUFF ENDP
612 ;********************************************************
613 PRINTF_CODE ENDS
614 END