summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE/MODEVID.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/MODE/MODEVID.ASM')
-rw-r--r--v4.0/src/CMD/MODE/MODEVID.ASM614
1 files changed, 614 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODEVID.ASM b/v4.0/src/CMD/MODE/MODEVID.ASM
new file mode 100644
index 0000000..360a110
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEVID.ASM
@@ -0,0 +1,614 @@
1 PAGE ,132 ;
2 TITLE MODEVID.SAL
3
4.XLIST
5INCLUDE 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;
19SIGNITURE SEGMENT AT 0C000H
20 ORG 0
21SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
22SIGNITURE ENDS
23
24
25LOW_MEM SEGMENT AT 0
26 ORG 410H
27EQUIP_FLAG EQU THIS WORD
28LOW_MEM ENDS
29
30
31;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32;º º
33
34
35DISPLAY MACRO MSG
36 MOV DX,OFFSET MSG
37 CALL PRINTF
38ENDM
39
40
41;-------------------------------------------------------------------------------
42
43
44find_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
60PUSH DI
61PUSH CX
62
63MOV AL,num
64MOV DI,OFFSET list
65CLD ;want to increment DI
66MOV CX,list&_len ;CX=number of nums in the list
67REPNE SCASB
68
69POP CX
70POP DI
71
72ENDM
73
74;-------------------------------------------------------------------------------
75
76
77SET_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
85MODE_VIDEO MACRO OPTION
86 MOV AH,0 ;SET MODE
87 MOV AL,OPTION
88 INT 10H
89
90 ENDM
91
92SET_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
106B EQU 0 ;POSITION OF "B" IN PARM1 FOR BW?0
107W EQU 1 ;POSITION OF "W" IN PARM1 FOR BW?0
108C EQU 0 ;POSITION OF "C" IN PARM1 FOR CO?0
109O EQU 1 ;POSITION OF "O" IN PARM1 FOR CO?0
110M EQU 0 ;POSITION OF "M" IN PARM1 FOR MONO
111N EQU 2 ;POSITION OF "N" IN PARM1 FOR MONO
112OH EQU 3 ;POSITION OF SECOND "O" IN PARM1 FOR MONO
113
114all EQU 0FEH ;descreet value representing adapter/monitor that can be in mono and color
115ALT_SELECT EQU 12H ;ALTERNATE SELECT FUNCTION OF INT10
116AMOAMA EQU 01 ;map to check 'all modes on all monitors active' bit of misc state info byte
117bw7 EQU 7 ;another mono (emulation) mode (VGA with analog monochrome)
118bw0B EQU 0BH ;analog black and white on a PALACE
119cga EQU 02 ;plain color card
120COLOR_CURSOR_TYPE EQU 0607H ;CURSOR TYPE FOR ALL COLOR AND BW MODES
121color6 EQU 6 ;another color supporting combination (PGA with color display)
122color8 EQU 8 ;another color supporting combination
123colorA EQU 0AH ;yet another color combo (color display or ehnanced color display on PALACE)
124colorC EQU 0CH ;even another color combo (PALACE with analog color)
125ega_color EQU 4 ;value for color support of EGA
126EGA_INFO EQU 10H ;RETURN EGA INFORMATION OPTION OF ALT. SELECT FUNCTION OF INT10
127EGA_MONO EQU 05H
128EGA_SIG EQU 0AA55H ;SIGNITURE FOR EGA CARD
129EMPTY EQU 0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 0
130FALSE EQU 0
131get_sys_stat EQU 43H ;get system status function of INT 15H
132LCD_attached EQU 00000000B ;bit 0=0 if the LCD is attached
133LCD_bit EQU 00000001B ;mask to check the LCD attached bit of status byte
134LOWERCASE EQU 20H ;OR THIS TO UPPER/LOWER CASE TO ASSURE LOWERCASE
135mono_card EQU 1 ;BIOS INT 10 AH=1B representation of plain mono card
136MONO_CURSOR_TYPE EQU 0B0CH
137MONO_ON_IT EQU 1 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF MONO IN EFFECT
138OPTION_BW4025 EQU 0 ;40 X 25 BW
139OPTION_CO4025 EQU 1 ;40 X 25 COLOR
140OPTION_BW8025 EQU 2 ;80 X 25 BW
141OPTION_CO8025 EQU 3 ;80 X 25 COLOR
142OPTION_MONO EQU 7 ;monochrome
143parm_list EQU [BP] ;addressing for array of parsed parameters in form "parm_list_entry"
144
145COLOR_ON_IT EQU 0 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF COLOR IN EFFECT
146BITBW40 EQU 10H ;40X25 BW USING COLOR CARD
147BITBW80 EQU 20H ;80X25 BW USING COLOR CARD
148BITMONO EQU 30H ;80X25 BW CARD
149video_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
160PUBLIC ALT_SELECT
161PUBLIC BW40
162PUBLIC BW80
163PUBLIC CHECK_BUFF
164PUBLIC CO40
165PUBLIC CO80
166PUBLIC COLOR_ON_IT
167PUBLIC EGA_INFO
168PUBLIC GET_VIDEO_INFO
169PUBLIC 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
179INCLUDE 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
192info_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")
199info_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
223FLAG 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
229PRINTF_CODE SEGMENT PUBLIC
230 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE
231
232
233;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
234;º º
235
236color_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
244color_combos_len EQU $ - color_combos
245
246CURSOR_TYPE DW 0607H ;HOLDER OF APPROPRIATE CURSOR TYPE
247information_block info_block <> ;area to hold info returned from INT 10 AH=1B
248
249mono_combos label byte
250 DB mono_card
251 DB ega_mono
252 DB bw7
253mono_combos_len EQU $ - mono_combos
254
255;º º
256;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
257
258
259;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
260;º º
261
262EXTRN Function_not_supported:WORD ;'INVALID PARAMETERS'
263EXTRN NOERROR:BYTE ;INDICATE THAT NO ERROR MESSAGES HAVE BEEN ISSUED YET
264EXTRN not_supported_ptr:WORD ;pointer to the screen mode that the configuration can't do.
265EXTRN machine_type:BYTE ;holder of model byte
266EXTRN parm_lst:BYTE ;the array of the structure parm_list_entry max_pos_parms DUP (<>)
267EXTRN PRINTF:NEAR ;"C" LIKE FORMATTED SCREEN OUTPUT ROUTINE
268EXTRN PARM1:BYTE ;PARAMETER HOLDING AREA, SEE "RESCODE"
269EXTRN 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
278BW40 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
306BW40 ENDP
307;******************************************************
308;SET VIDEO TO 80 X 25, BLACK AND WHITE
309BW80 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
337BW80 ENDP
338;******************************************************
339;SET VIDEO TO 80 X 25, MONOCHROME
340MONO 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
369MONO ENDP
370;*******************************************************
371CO40 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
399CO40 ENDP
400;******************************************************
401CO80 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
430CO80 ENDP
431;******************************************************
432SETUP 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
450SETUP ENDP
451;******************************************************
452GET_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
477PUSH ES
478
479XOR AX,AX ;ZAP previous contents
480MOV AH,01BH ;functionality/state information
481PUSH CS
482POP ES
483MOV DI,OFFSET information_block ;initialize 'video_info_DI'
484MOV BX,0 ;parm to allow for future expansion
485INT 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
553POP ES
554
555RET ;RETURN TO CALLER
556
557
558GET_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;******************************************************
596CHECK_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
611CHECK_BUFF ENDP
612;********************************************************
613PRINTF_CODE ENDS
614 END