]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/SELECT/CKDISP.ASM
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 INCLUDE STRUC.INC ;AN000;
10 PUBLIC MONO
, CGA
, EGA
, LCD
;AN000;
11 PUBLIC ACTIVE
, ALTERNATE
;AN000;
13 EXTRN IN_CURNOR
:WORD ;AN000;JW
15 DATA SEGMENT BYTE PUBLIC 'DATA' ;AN000;
21 READ_DISPLAY EQU 1
AH ;AN000;
22 ALT_SELECT EQU 12H
;AN000;
23 EGA_INFO EQU 10H
;AN000;
24 MONOCHROME EQU
1 ;AN000;
25 BASE_COLOR EQU
0B800H ;AN000;
26 BASE_MONO EQU
0B000H ;AN000;
27 GET_SYS_ID EQU
0C0H ;AN000;
28 LCD_MODEL EQU
0F9H ;AN000;
29 GET_STATUS EQU 43H
;AN000;
32 SYSTEM_ID
STRUC ;AN000;
34 MODEL_BYTE
DB ?
;AN000;
35 SYSTEM_ID ENDS
;AN000;
38 ALTERNATE
DB 0 ;AN000;
41 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
46 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
47 SERVICE
SEGMENT PARA
PUBLIC 'SERVICE' ;AN000;segment for far routine
48 ASSUME
CS:SERVICE
,DS:DATA ;AN000;
50 PUBLIC VIDEO_CHECK
;AN000;
51 VIDEO_CHECK PROC
FAR ;AN000;
53 PUSH BX ;AN000; save all registers
60 MOV AH,READ_DISPLAY
;AN000; check for VGA first.
62 .IF <AL EQ READ_DISPLAY
> ;AN000; VGA present?
63 .SELECT
;AN000; yes....BL contains active..
64 .WHEN
<BL EQ MONO
> ;AN000; display code.
65 MOV ACTIVE
,MONO
;AN000;
66 .WHEN
<BL EQ CGA
> ;AN000;
67 MOV ACTIVE
,CGA
;AN000;
68 .WHEN
<BL A CGA
> ;AN000;
69 MOV ACTIVE
,EGA
;AN000;
71 .SELECT
;AN000; ...and BH contains alternate..
72 .WHEN
<BH EQ MONO
> ;AN000; display code.
73 MOV ALTERNATE
,MONO
;AN000;
74 .WHEN
<BH EQ CGA
> ;AN000;
75 MOV ALTERNATE
,CGA
;AN000;
76 .WHEN
<BH A CGA
> ;AN000;
77 MOV ALTERNATE
,EGA
;AN000;
79 .ELSE ;AN000; VGA not there..check for EGA.
80 MOV AH,ALT_SELECT
;AN000;
81 MOV BL,EGA_INFO
;AN000;
83 .IF <BL NE EGA_INFO
> ;AN000; EGA present?
84 MOV ACTIVE
,EGA
;AN000; yes....set as active.
85 .IF <BH EQ MONOCHROME
> ;AN000; if monochrome attached to EGA then..
86 MOV AX,BASE_COLOR
;AN000; check if CGA is an alternate.
87 CALL CHECK_BUFF
;AN000;
88 .IF <AH EQ AL> ;AN000; CGA there?
89 MOV ALTERNATE
,CGA
;AN000; yes....alternate display.
91 .ELSE ;AN000; if color attached to EGA then...
92 MOV AX,BASE_MONO
;AN000; check if monochrome is an alternate.
93 CALL CHECK_BUFF
;AN000;
94 .IF <AH EQ AL> ;AN000; MONO there?
95 MOV ALTERNATE
,MONO
;AN000; yes....alternate display.
98 .ELSE ;AN000; EGA not present so...
99 MOV AH,GET_SYS_ID
;AN000; check for LCD.
101 .IF <ES:[BX].MODEL_BYTE
EQ LCD_MODEL
> AND ;AN000; if model byte says convertible..
102 MOV AH,GET_STATUS
;AN000; and..
104 .IF <BIT
AL NAND
ON> ;AN000; if LCD screen attached..then
105 MOV ACTIVE
,LCD
;AN000; set LCD as active display.
107 MOV AX,BASE_MONO
;AN000; not LCD...check for..
108 CALL CHECK_BUFF
;AN000; MONO....
109 .IF <AH EQ AL> ;AN000;
110 MOV ACTIVE
,MONO
;AN000; MONO found...set as active.
111 MOV IN_CURNOR
,0B0CH ;AN000;JW set mono cursor size
113 MOV AX,BASE_COLOR
;AN000; ..and check for color.
114 CALL CHECK_BUFF
;AN000;
115 .IF <AH EQ AL> ;AN000;
116 MOV ALTERNATE
,CGA
;AN000; color found...set CGA as alternate.
122 POP DI ;AN000; restore registers.
129 VIDEO_CHECK ENDP
;AN000;
130 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 CHECK_BUFF PROC
NEAR ;AN000; write to video buffer to see if it is present
138 MOV DS,AX ;AN000; load DS with address of buffer
139 MOV CH,DS:0 ;AN000; save buffer information (if present)
140 MOV AL,55H
;AN000; prepare to write sample data
141 MOV DS:0,AL ;AN000; write to buffer
142 PUSH BX ;AN000; terminate the bus so that lines..
143 POP BX ;AN000; are reset
144 MOV AH,DS:0 ;AN000; bring sample data back...
145 MOV DS:0,CH ;AN000; repair damage to buffer
148 CHECK_BUFF ENDP
;AN000;
149 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;