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