home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / SVGALIB / SVGALIB1.TAR / svgalib / support / vga.c
Encoding:
C/C++ Source or Header  |  1995-01-27  |  4.1 KB  |  150 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4.  
  5. /* January 1995, Scott Heavner (sdh@po.cwru.edu)
  6.  *
  7.  * Changes to allow anyone to compile vga.c under the go32 Linux->dos cross compiler.
  8.  * It should also work with DJGPP (the gcc port to msdos).  The cross compiler is
  9.  * available at ftp://sunsite.unc.edu/pub/Linux/devel/msdos/go32crs.tar.gz.
  10.  * 
  11.  * I compiled it with:
  12.  *
  13.  *    go32gcc vga.c -lpc
  14.  *    cat /usr/local/go32/bin/go32.exe a.out > vga.exe 
  15.  */
  16. #ifdef GO32
  17. #    include <pc.h>
  18. #endif
  19.  
  20. /* VGA index register ports */
  21. #define CRT_I   0x3D4   /* CRT Controller Index (mono: 0x3B4) */
  22. #define ATT_IW  0x3C0   /* Attribute Controller Index & Data Write Register */
  23. #define GRA_I   0x3CE   /* Graphics Controller Index */
  24. #define SEQ_I   0x3C4   /* Sequencer Index */
  25. #define PEL_IW  0x3C8   /* PEL Write Index */
  26.  
  27. /* VGA data register ports */
  28. #define CRT_D   0x3D5   /* CRT Controller Data Register (mono: 0x3B5) */
  29. #define ATT_R   0x3C1   /* Attribute Controller Data Read Register */
  30. #define GRA_D   0x3CF   /* Graphics Controller Data Register */
  31. #define SEQ_D   0x3C5   /* Sequencer Data Register */
  32. #define MIS_R   0x3CC   /* Misc Output Read Register */
  33. #define MIS_W   0x3C2   /* Misc Output Write Register */
  34. #define IS1_R   0x3DA   /* Input Status Register 1 (mono: 0x3BA) */
  35. #define PEL_D   0x3C9   /* PEL Data Register */
  36.  
  37. /* VGA indexes max counts */
  38. #define CRT_C   24      /* 24 CRT Controller Registers */
  39. #define ATT_C   21      /* 21 Attribute Controller Registers */
  40. #define GRA_C   9       /* 9  Graphics Controller Registers */
  41. #define SEQ_C   5       /* 5  Sequencer Registers */
  42. #define MIS_C   1       /* 1  Misc Output Register */
  43.  
  44. /* VGA registers saving indexes */
  45. #define CRT     0               /* CRT Controller Registers start */
  46. #define ATT     CRT+CRT_C       /* Attribute Controller Registers start */
  47. #define GRA     ATT+ATT_C       /* Graphics Controller Registers start */
  48. #define SEQ     GRA+GRA_C       /* Sequencer Registers */
  49. #define MIS     SEQ+SEQ_C       /* General Registers */
  50. #define END     MIS+MIS_C       /* last */
  51.  
  52.  
  53. unsigned char vga_regs[60];
  54.  
  55. #ifdef GO32
  56.  
  57. #    define port_out(v,p) outportb(p,v)
  58. #    define port_in(p) inportb(p)
  59.  
  60. #else
  61.  
  62. void port_out(unsigned char value, unsigned short port)
  63. {
  64.     asm {
  65.     mov dx,port
  66.     mov al,value
  67.     out dx,al
  68.     }
  69. }
  70.  
  71.  
  72. unsigned char port_in(unsigned short port)
  73. {
  74.     asm {
  75.     mov dx,port
  76.     in al,dx
  77.     }
  78.     return (_AL);
  79. }
  80.  
  81. #endif
  82.  
  83. main(int argc, char* argv[])
  84. {
  85.     union REGS cpu_regs;
  86.     int i;
  87.     unsigned char mode;
  88.  
  89.     if (argc != 2) {
  90.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  91.         exit(-1);
  92.     }
  93.     if (!sscanf(argv[1],"%x",&mode)) {
  94.         printf("Usage: getregs mode (mode must be hexadecimal)\n");
  95.         exit(-1);
  96.     }
  97.     
  98.     cpu_regs.h.ah = 0x00;
  99.     cpu_regs.h.al = mode;
  100.     int86(0x10, &cpu_regs, &cpu_regs);
  101.  
  102.     /* get VGA register values */
  103.     for (i = 0; i < CRT_C; i++) {
  104.         port_out(i, CRT_I); 
  105.         vga_regs[CRT+i] = port_in(CRT_D); 
  106.     }
  107.     for (i = 0; i < ATT_C; i++) {
  108.           port_in(IS1_R);
  109.            port_out(i, ATT_IW); 
  110.            vga_regs[ATT+i] = port_in(ATT_R); 
  111.     }
  112.     for (i = 0; i < GRA_C; i++) {
  113.            port_out(i, GRA_I); 
  114.            vga_regs[GRA+i] = port_in(GRA_D); 
  115.     }
  116.     for (i = 0; i < SEQ_C; i++) {
  117.            port_out(i, SEQ_I); 
  118.            vga_regs[SEQ+i] = port_in(SEQ_D); 
  119.     }
  120.     vga_regs[MIS] = port_in(MIS_R); 
  121.  
  122.     cpu_regs.h.ah = 0x00;
  123.     cpu_regs.h.al = 0x03;
  124.     int86(0x10, &cpu_regs, &cpu_regs);
  125.  
  126.     printf("/* BIOS mode 0x%02X */\n", mode);
  127.     printf("static char regs[60] = {\n  ");
  128.     for (i = 0; i < 12; i++) 
  129.         printf("0x%02X,",vga_regs[CRT+i]);
  130.     printf("\n  "); 
  131.     for (i = 12; i < CRT_C; i++) 
  132.         printf("0x%02X,",vga_regs[CRT+i]);
  133.     printf("\n  "); 
  134.     for (i = 0; i < 12; i++) 
  135.         printf("0x%02X,",vga_regs[ATT+i]);
  136.     printf("\n  "); 
  137.     for (i = 12; i < ATT_C; i++) 
  138.         printf("0x%02X,",vga_regs[ATT+i]);
  139.     printf("\n  "); 
  140.     for (i = 0; i < GRA_C; i++) 
  141.         printf("0x%02X,",vga_regs[GRA+i]);
  142.     printf("\n  "); 
  143.     for (i = 0; i < SEQ_C; i++) 
  144.         printf("0x%02X,",vga_regs[SEQ+i]);
  145.     printf("\n  "); 
  146.     printf("0x%02X",vga_regs[MIS]);
  147.     printf("\n};\n"); 
  148.  
  149. }
  150.