home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / etc / et4000clock.c next >
C/C++ Source or Header  |  1999-09-03  |  3KB  |  135 lines

  1. /*
  2.  * $XFree86: xc/programs/Xserver/hw/xfree86/etc/et4000clock.c,v 3.5.2.1 1999/05/07 00:52:05 dawes Exp $
  3.  *
  4.  * This is a sample clock setting program.  It will not work with all
  5.  * ET4000 cards.  To work correctly the clocks line in XF86Config must
  6.  * have the values in the correct order.
  7.  *
  8.  * usage: et4000clock freq index
  9.  *
  10.  * This program ignores 'freq' and relies entirely on 'index'
  11.  *
  12.  * David Dawes  <dawes@xfree86.org>
  13.  * 19 December 1992
  14.  */
  15. /* $XConsortium: et4000clock.c /main/7 1996/10/25 11:37:41 kaleb $ */
  16.  
  17. #include <stdio.h>
  18.  
  19. /* The following inlines are from compiler.h in the XFree86 source dist */
  20.  
  21. #if defined(CSRG_BASED) || defined(MACH) || defined(MACH386) || defined(linux)
  22. #define GCCUSESGAS
  23. #endif
  24.  
  25. #ifdef __GNUC__
  26. #ifdef GCCUSESGAS
  27.  
  28. static __inline__ void
  29. outb(port, val)
  30. short port;
  31. char val;
  32. {
  33.    __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
  34. }
  35.  
  36. static __inline__ void
  37. outw(port, val)
  38. short port;
  39. short val;
  40. {
  41.    __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
  42. }
  43.  
  44. static __inline__ unsigned int
  45. inb(port)
  46. short port;
  47. {
  48.    unsigned char ret;
  49.    __asm__ __volatile__("inb %1,%0" :
  50.        "=a" (ret) :
  51.        "d" (port));
  52.    return ret;
  53. }
  54.  
  55. #else /* !GCCUSESGAS */
  56.  
  57. static __inline__ void
  58. outb(port, val)
  59.      short port;
  60.      char val;
  61. {
  62.   __asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port));
  63. }
  64.  
  65. static __inline__ void
  66. outw(port, val)
  67.      short port;
  68.      short val;
  69. {
  70.   __asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port));
  71. }
  72.  
  73. static __inline__ unsigned int
  74. inb(port)
  75.      short port;
  76. {
  77.   unsigned int ret;
  78.   __asm__ __volatile__("in%B0 (%1)" :
  79.                    "=a" (ret) :
  80.                    "d" (port));
  81.   return ret;
  82. }
  83.  
  84. #endif /* GCCUSESGAS */
  85. #else /* !__GNUC__ */
  86.  
  87. #if defined(__STDC__) && (__STDC__ == 1)
  88. #define asm __asm
  89. #endif
  90.  
  91. #ifdef SVR4
  92. #include <sys/types.h>
  93. #ifndef __USLC__
  94. #define __USLC__
  95. #endif
  96. #endif
  97.  
  98. #ifndef SCO325
  99. # include <sys/inline.h>
  100. #else
  101. # include "../common/scoasm.h"
  102. #endif
  103. #endif /* __GNUC__ */
  104.  
  105.  
  106. /* Now, the actual program */
  107.  
  108. main(argc, argv)
  109.  
  110. int argc;
  111. char *argv[];
  112.  
  113. {
  114.   int            index, vgaIOBase;
  115.   unsigned char  tmp; 
  116.  
  117.   if (argc < 3)
  118.   {
  119.     fprintf(stderr, "usage: %s freq index\n", argv[0]);
  120.     exit(1);
  121.   }
  122.   index = atoi(argv[2]);
  123.   if (index < 0 || index > 7)
  124.   {
  125.     fprintf(stderr, "%s: Index %d out of range\n", argv[0], index);
  126.     exit(2);
  127.   }
  128.   tmp = inb(0x3CC);
  129.   vgaIOBase = (tmp & 0x01) ? 0x3D0 : 0x3B0;
  130.   outb(0x3C2, (tmp & 0xF3) | ((index & 0x03) << 2));
  131.   outw(vgaIOBase + 4, 0x34 | ((index & 0x04) << 7));
  132.   fprintf(stderr, "%s: clock set to number %d\n", argv[0], index);
  133.   exit(0);
  134. }
  135.