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 / vga.c < prev    next >
C/C++ Source or Header  |  1993-01-21  |  4KB  |  129 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.  
  30. /* VGA registers saving indexes */
  31. #define CRT     0               /* CRT Controller Registers start */
  32. #define ATT     CRT+CRT_C       /* Attribute Controller Registers start */
  33. #define GRA     ATT+ATT_C       /* Graphics Controller Registers start */
  34. #define SEQ     GRA+GRA_C       /* Sequencer Registers */
  35. #define MIS     SEQ+SEQ_C       /* General Registers */
  36. #define END     MIS+MIS_C       /* last */
  37.  
  38.  
  39. unsigned char vga_regs[60];
  40.  
  41.  
  42. void port_out(unsigned char value, unsigned short port)
  43. {
  44.     asm {
  45.     mov dx,port
  46.     mov al,value
  47.     out dx,al
  48.     }
  49. }
  50.  
  51.  
  52. unsigned char port_in(unsigned short port)
  53. {
  54.     asm {
  55.     mov dx,port
  56.     in al,dx
  57.     }
  58.     return (_AL);
  59. }
  60.  
  61.  
  62. main(int argc, char* argv[])
  63. {
  64.     union REGS cpu_regs;
  65.     int i;
  66.     unsigned char mode;
  67.  
  68.     if (argc != 2) {
  69.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  70.         exit(-1);
  71.     }
  72.     if (!sscanf(argv[1],"%x",&mode)) {
  73.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  74.         exit(-1);
  75.     }
  76.     
  77.     cpu_regs.h.ah = 0x00;
  78.     cpu_regs.h.al = mode;
  79.     int86(0x10, &cpu_regs, &cpu_regs);
  80.  
  81.     /* get VGA register values */
  82.     for (i = 0; i < CRT_C; i++) {
  83.         port_out(i, CRT_I); 
  84.         vga_regs[CRT+i] = port_in(CRT_D); 
  85.     }
  86.     for (i = 0; i < ATT_C; i++) {
  87.           port_in(IS1_R);
  88.            port_out(i, ATT_IW); 
  89.            vga_regs[ATT+i] = port_in(ATT_R); 
  90.     }
  91.     for (i = 0; i < GRA_C; i++) {
  92.            port_out(i, GRA_I); 
  93.            vga_regs[GRA+i] = port_in(GRA_D); 
  94.     }
  95.     for (i = 0; i < SEQ_C; i++) {
  96.            port_out(i, SEQ_I); 
  97.            vga_regs[SEQ+i] = port_in(SEQ_D); 
  98.     }
  99.     vga_regs[MIS] = port_in(MIS_R); 
  100.  
  101.     cpu_regs.h.ah = 0x00;
  102.     cpu_regs.h.al = 0x03;
  103.     int86(0x10, &cpu_regs, &cpu_regs);
  104.  
  105.     printf("/* BIOS mode 0x%02X */\n", mode);
  106.     printf("static char regs[60] = {\n  ");
  107.     for (i = 0; i < 12; i++) 
  108.         printf("0x%02X,",vga_regs[CRT+i]);
  109.     printf("\n  "); 
  110.     for (i = 12; i < CRT_C; i++) 
  111.         printf("0x%02X,",vga_regs[CRT+i]);
  112.     printf("\n  "); 
  113.     for (i = 0; i < 12; i++) 
  114.         printf("0x%02X,",vga_regs[ATT+i]);
  115.     printf("\n  "); 
  116.     for (i = 12; i < ATT_C; i++) 
  117.         printf("0x%02X,",vga_regs[ATT+i]);
  118.     printf("\n  "); 
  119.     for (i = 0; i < GRA_C; i++) 
  120.         printf("0x%02X,",vga_regs[GRA+i]);
  121.     printf("\n  "); 
  122.     for (i = 0; i < SEQ_C; i++) 
  123.         printf("0x%02X,",vga_regs[SEQ+i]);
  124.     printf("\n  "); 
  125.     printf("0x%02X",vga_regs[MIS]);
  126.     printf("\n};\n"); 
  127.  
  128. }
  129.