1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 
5 #include "iopl.h"
6 
main(void)7 int main(void)
8 {
9     int i, HTotal, HDisplay, HSyncStart, HSyncEnd,
10     VTotal, VDisplay, VSyncStart, VSyncEnd;
11     unsigned char storeReg, bpp, shift, IOSS = 0, MSS = 0, again = 0;
12     unsigned short port;
13     int isHiQV = 0;
14     int is69030 = 0;
15 
16     SET_IOPL();
17 
18     printf("0x3C6\t0x%X\n",inw(0x3C6));
19 
20 /* Check to see if the Chip is HiQV */
21     outb(0x3D6,0x02);
22     storeReg = inb(0x3D7);
23     if (storeReg == 0xE0	/* CT65550 */
24 	|| storeReg == 0xE4	/* CT65554 */
25 	|| storeReg == 0xE5	/* CT65555 */
26 	|| storeReg == 0xF4	/* CT68554 */
27 	|| storeReg == 0xC0)	/* CT69000 */
28     {
29 	isHiQV = 1;
30     } else if (storeReg == 0x30) {
31       outb(0x3D6,0x03);
32       storeReg = inb(0x3D7);
33       if (storeReg == 0xC) {
34 	isHiQV = 1;
35 	is69030 = 1;
36 	IOSS=inb(0x3CD);
37 	MSS=inb(0x3CB);
38 	outb(0x3CD,((IOSS&0xE0)| 0x11));  /* Select Channel 0 */
39 	outb(0x3CB,((MSS&0xF0)| 0x8));
40 	again = 1;
41 	printf("Pipeline A:\n");
42       }
43     }
44 
45  again:
46     printf("port 0x3D6 (C&T)\n");
47     storeReg = inb(0x3D6);
48     shift = 3;
49     if (isHiQV==1) {
50 	outw(0x102,1);	/*global enable, VGA awake*/
51 	printf("0x%2.2X\n",inb(0x3C3)&0xFF);
52 	outb(0x3C3,0);	/*disable VGA*/
53 	outb(0x3C3,1);	/*enable VGA*/
54 	for(i = 0;i < 0xFF;i++){
55 	    outb(0x3D6,i);
56 	    printf("XR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D7)&0xFF);
57 	}
58 	outb(0x3D6,0xE2);
59 	bpp = inb(0x3D7)&0xF0;
60     } else {
61 	outb(0x3D6, 0x70);
62 	outw(0x3D6, (inw(0x3D6) | 0x8070));
63 	outw(0x46E8,0x0016);	/*setup mode*/
64 	outw(0x102,1);	/*global enable, VGA awake*/
65 	outw(0x46E8,0x000E);	/*exit from setup mode*/
66 	printf("0x%2.2X\n",inb(0x3C3)&0xFF);
67 	outb(0x3C3,0);	/*disable VGA*/
68 	outw(0x46E8,0x0000);	/*exit from setup mode*/
69 	outw(0x46E8,0x000E);	/*exit from setup mode*/
70 	outb(0x3C3,1);	/*enable VGA*/
71 	outw(0x46E8,0x0000);	/*exit from setup mode*/
72 	for(i = 0;i < 0x80;i++){
73 	    outb(0x3D6,i);
74 	    printf("XR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D7)&0xFF);
75 	}
76 	outb(0x3D6,0x2B);
77 	bpp = inb(0x3D7)&0xF0;
78     }
79 
80     switch(bpp){
81       case 0x20:
82 	bpp = 4;
83 	break;
84       case 0x30:
85 	bpp = 8;
86 	break;
87       case 0x40:
88 	bpp = 16;
89 	shift = 2;
90 	break;
91       case 0x50:
92 	bpp = 24;
93 	break;
94       default:
95 	bpp = 0;
96     }
97     outb(0x3D6,storeReg);
98 
99     printf("\nport 0x3D4 (CRTC)\n");
100     storeReg = inb(0x3D4);
101     if (isHiQV==1) {
102 	for(i = 0;i < 0x7F;i++){
103 	    outb(0x3D4,i);
104 	    printf("CR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D5)&0xFF);
105 	}
106 	outb(0x3D4,storeReg);
107 	printf("\nport 0x3D0 (Flat Panel)\n");
108 	storeReg = inb(0x3D0);
109 	for(i = 0;i < 0x7F;i++){
110 	    outb(0x3D0,i);
111 	    printf("FR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D1)&0xFF);
112 	}
113 	outb(0x3D1,storeReg);
114 	printf("\nport 0x3D2 (Multimedia)\n");
115 	storeReg = inb(0x3D2);
116 	for(i = 0;i < 0x7F;i++){
117 	    outb(0x3D2,i);
118 	    printf("MR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D3)&0xFF);
119 	}
120 	outb(0x3D3,storeReg);
121     } else {
122 	for(i = 0;i < 0x40;i++){
123 	    outb(0x3D4,i);
124 	    printf("CR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D5)&0xFF);
125 	}
126 	outb(0x3D4,storeReg);
127     }
128 
129 
130     printf("port 0x3CE (GC)\n");
131     storeReg = inb(0x3CE);
132     for(i = 0;i < 0x10;i++){
133 	outb(0x3CE,i);
134 	printf("GC 0x%2.2X\t0x%2.2X\n",i,inb(0x3CF)&0xFF);
135     }
136     outb(0x3CE,storeReg);
137     printf("port 0x3C4 (Sequencer)\n");
138     storeReg = inb(0x3C4);
139     for(i = 0;i < 0x10;i++){
140 	outb(0x3C4,i);
141 	printf("SQ 0x%2.2X\t0x%X2.2\n",i,inb(0x3C5)&0xFF);
142     }
143     outb(0x3C4,storeReg);
144 
145 
146     printf("port 0x3C0 (Attribute)\n");
147     inb(0x3DA);
148     storeReg = inb(0x3C0);
149     for(i = 0;i < 0xFF;i++){
150 	inb(0x3DA);
151 	outb(0x3C0,i);
152 	printf("AT 0x%2.2X\t0x%2.2X\n",i,inb(0x3C1)&0xFF);
153     }
154     inb(0x3DA);
155     outb(0x3C0,storeReg);
156 
157     printf("0x3CC\t0x%X\n",inb(0x3CC)&0xFF);
158     printf("0x3C2\t0x%X\n",inb(0x3C2)&0xFF);
159     printf("0x3C3\t0x%X\n",inb(0x3C2)&0xFF);
160     printf("0x3CA\t0x%X\n",inb(0x3CA)&0xFF);
161     printf("0x3DA\t0x%X\n",inb(0x3DA)&0xFF);
162 
163     printf("\nRAMDAC\nport\tvalue\n");
164     for(port = 0x83C6; port < 0x83CA;port++){
165       printf("0x%4X\t0x%4X\n",port,inw(port));
166     }
167 
168     if (isHiQV!=1) {
169 	printf("\nBitBLT\nport\tvalue\n");
170 	for(port = 0x83D0; port <= 0x9FD0;port+=0x400){
171 	    printf("0x%4.4X\t0x%4X\n",port,inw(port));
172 	}
173 
174 	printf("\nH/W cursor\nport\tvalue\n");
175 	for(port = 0xA3D0; port <= 0xB3D0;port+=0x400){
176 	    printf("0x%4.4X\t0x%4X\n",port,inw(port));
177 	}
178 
179 
180 	outb(0x3D6, 0x70);
181 	outw(0x3D6, (inw(0x3D6) | 0x8070));
182 
183 	printf("0x46E8\t0x%8X\n",inl(0x46E8));
184 	printf("0x4AE8\t0x%8X\n",inl(0x4AE8));
185 	printf("0x102\t0x%8X\n",inl(0x102));
186 	printf("0x103\t0x%8X\n",inl(0x103));
187 
188     }
189 
190     storeReg = inb(0x3D4);
191     {
192 	outb(0x3D4,0);
193 	HTotal = ((inb(0x3D5)&0xFF) + 5) << shift;
194 	outb(0x3D4,1);
195 	HDisplay = ((inb(0x3D5)&0xFF) + 1) << shift;
196 	outb(0x3D4,4);
197 	HSyncStart = ((inb(0x3D5)&0xFF) + 1) << shift;
198 	outb(0x3D4,5);
199 	HSyncEnd = inb(0x3D5)&0x1F;
200 	outb(0x3D4,5);
201 	HSyncEnd += HSyncStart >> shift;
202 	HSyncEnd <<= shift;
203 
204 	outb(0x3D4,6);
205 	VTotal = inb(0x3D5)&0xFF;
206 	outb(0x3D4,7);
207 	VTotal |= (inb(0x3D5)&0x1) << 8;
208 	VTotal |= (inb(0x3D5)&0x20) << 4;
209 	VTotal += 2;
210 	VDisplay = (inb(0x3D5)&0x2) << 7;
211 	VDisplay |= (inb(0x3D5)&0x40) << 3;
212 	VSyncStart = (inb(0x3D5)&0x4) << 6;
213 	VSyncStart |= (inb(0x3D5)&0x80) << 2;
214 	outb(0x3D4,0x12);
215 	    VDisplay |= inb(0x3D5)&0xFF;
216 	VDisplay += 1;
217 	outb(0x3D4,0x10);
218 	VSyncStart |= inb(0x3D5)&0xFF;
219 
220 	outb(0x3D4,0x11);
221 	VSyncEnd = inb(0x3D5)&0xF;
222 	VSyncEnd += VSyncStart;
223 
224     }
225     outb(0x3D4,storeReg);
226 
227     printf("\nModeLine with port 0x3D4 (CRTC) %d %d %d %d %d %d %d %d\n",
228 	   HDisplay, HSyncStart, HSyncEnd, HTotal,
229 	   VDisplay, VSyncStart, VSyncEnd, VTotal);
230 
231 
232     if (is69030==1) {
233       if (again==1) {
234 	again=0;
235 	printf("\n\nPipeline B:\n");
236 	outb(0x3CD,((IOSS&0xE0)| 0x1F));  /* Select Channel 1 */
237 	outb(0x3CB,((MSS&0xF0)| 0xF));
238 	goto again;
239       } else {
240 	outb(0x3CD,IOSS);
241 	outb(0x3CB,MSS);
242 	printf("\n\n0x3CB\t0x%X  (MSS)\n",inb(0x3CB)&0xFF);
243 	printf("0x3CD\t0x%X  (IOSS)\n",inb(0x3CD)&0xFF);
244       }
245     }
246     RESET_IOPL();
247     return 0;
248 }
249