dRegs.c 5.8 KB

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