home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / v / vgalib12.tar / vgalib / support / tseng.c next >
C/C++ Source or Header  |  1993-01-21  |  4KB  |  153 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4.  
  5.  
  6. /* VGA index register ports */
  7. #define CRT_I   0x3D4   /* CRT Controller Index (mono: 0x3B4) */
  8. #define ATT_IW  0x3C0   /* Attribute Controller Index & Data Write Register */
  9. #define GRA_I   0x3CE   /* Graphics Controller Index */
  10. #define SEQ_I   0x3C4   /* Sequencer Index */
  11. #define PEL_IW  0x3C8   /* PEL Write Index */
  12.  
  13. /* VGA data register ports */
  14. #define CRT_D   0x3D5   /* CRT Controller Data Register (mono: 0x3B5) */
  15. #define ATT_R   0x3C1   /* Attribute Controller Data Read Register */
  16. #define GRA_D   0x3CF   /* Graphics Controller Data Register */
  17. #define SEQ_D   0x3C5   /* Sequencer Data Register */
  18. #define MIS_R   0x3CC   /* Misc Output Read Register */
  19. #define MIS_W   0x3C2   /* Misc Output Write Register */
  20. #define IS1_R   0x3DA   /* Input Status Register 1 (mono: 0x3BA) */
  21. #define PEL_D   0x3C9   /* PEL Data Register */
  22.  
  23. /* VGA indexes max counts */
  24. #define CRT_C   24          /* 24 CRT Controller Registers */
  25. #define ATT_C   21          /* 21 Attribute Controller Registers */
  26. #define GRA_C   9           /* 9  Graphics Controller Registers */
  27. #define SEQ_C   5           /* 5  Sequencer Registers */
  28. #define MIS_C   1           /* 1  Misc Output Register */
  29. #define EXT_C   10           /* 10 SVGA Extended Registers */
  30.  
  31. /* VGA registers saving indexes */
  32. #define CRT     0               /* CRT Controller Registers start */
  33. #define ATT     CRT+CRT_C       /* Attribute Controller Registers start */
  34. #define GRA     ATT+ATT_C       /* Graphics Controller Registers start */
  35. #define SEQ     GRA+GRA_C       /* Sequencer Registers */
  36. #define MIS     SEQ+SEQ_C       /* General Registers */
  37. #define EXT     MIS+MIS_C       /* SVGA Extended Registers */
  38.  
  39.  
  40. unsigned char vga_regs[70];
  41.  
  42.  
  43. void port_out(unsigned char value, unsigned short port)
  44. {
  45.     asm {
  46.     mov dx,port
  47.     mov al,value
  48.     out dx,al
  49.     }
  50. }
  51.  
  52.  
  53. unsigned char port_in(unsigned short port)
  54. {
  55.     asm {
  56.     mov dx,port
  57.     in al,dx
  58.     }
  59.     return (_AL);
  60. }
  61.  
  62.  
  63. main(int argc, char* argv[])
  64. {
  65.     union REGS cpu_regs;
  66.     int i;
  67.     unsigned char mode;
  68.  
  69.     if (argc != 2) {
  70.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  71.         exit(-1);
  72.     }
  73.     if (!sscanf(argv[1],"%x",&mode)) {
  74.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  75.         exit(-1);
  76.     }
  77.     
  78.     cpu_regs.h.ah = 0x00;
  79.     cpu_regs.h.al = mode;
  80.     int86(0x10, &cpu_regs, &cpu_regs);
  81.  
  82.     /* get VGA register values */
  83.     for (i = 0; i < CRT_C; i++) {
  84.         port_out(i, CRT_I); 
  85.         vga_regs[CRT+i] = port_in(CRT_D); 
  86.     }
  87.     for (i = 0; i < ATT_C; i++) {
  88.           port_in(IS1_R);
  89.            port_out(i, ATT_IW); 
  90.            vga_regs[ATT+i] = port_in(ATT_R); 
  91.     }
  92.     for (i = 0; i < GRA_C; i++) {
  93.            port_out(i, GRA_I); 
  94.            vga_regs[GRA+i] = port_in(GRA_D); 
  95.     }
  96.     for (i = 0; i < SEQ_C; i++) {
  97.            port_out(i, SEQ_I); 
  98.            vga_regs[SEQ+i] = port_in(SEQ_D); 
  99.     }
  100.     vga_regs[MIS] = port_in(MIS_R); 
  101.  
  102.     /* get extended CRT registers */
  103.     for (i = 0; i < 6; i++) {
  104.      port_out(0x32+i, CRT_I); 
  105.      vga_regs[EXT+i] = port_in(CRT_D); 
  106.     }
  107.  
  108.     /* get extended sequencer register */
  109.     port_out(7, SEQ_I); 
  110.     vga_regs[EXT+6] = port_in(SEQ_D); 
  111.  
  112.     /* get some other ET4000 specific registers */
  113.     vga_regs[EXT+7] = port_in(0x3c3); 
  114.     vga_regs[EXT+8] = port_in(0x3cd); 
  115.  
  116.     /* get extended attribute register */
  117.     port_in(IS1_R);    /* reset flip flop */
  118.     port_out(0x16, ATT_IW);
  119.     vga_regs[EXT+9] = port_in(ATT_R);
  120.  
  121.     cpu_regs.h.ah = 0x00;
  122.     cpu_regs.h.al = 0x03;
  123.     int86(0x10, &cpu_regs, &cpu_regs);
  124.  
  125.     printf("/* BIOS mode 0x%02X */\n", mode);
  126.     printf("static char regs[70] = {\n  ");
  127.     for (i = 0; i < 12; i++) 
  128.         printf("0x%02X,",vga_regs[CRT+i]);
  129.     printf("\n  "); 
  130.     for (i = 12; i < CRT_C; i++) 
  131.         printf("0x%02X,",vga_regs[CRT+i]);
  132.     printf("\n  "); 
  133.     for (i = 0; i < 12; i++) 
  134.         printf("0x%02X,",vga_regs[ATT+i]);
  135.     printf("\n  "); 
  136.     for (i = 12; i < ATT_C; i++) 
  137.         printf("0x%02X,",vga_regs[ATT+i]);
  138.     printf("\n  "); 
  139.     for (i = 0; i < GRA_C; i++) 
  140.         printf("0x%02X,",vga_regs[GRA+i]);
  141.     printf("\n  "); 
  142.     for (i = 0; i < SEQ_C; i++) 
  143.         printf("0x%02X,",vga_regs[SEQ+i]);
  144.     printf("\n  "); 
  145.     printf("0x%02X,",vga_regs[MIS]);
  146.     printf("\n  "); 
  147.     for (i = 0; i < EXT_C-1; i++) 
  148.         printf("0x%02X,",vga_regs[EXT+i]);
  149.     printf("0x%02X",vga_regs[EXT+EXT_C-1]);
  150.     printf("\n};\n"); 
  151.  
  152. }
  153.