home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / dos / prg / dsik205 / dsik.dat / SOURCE / TIMER.C < prev   
C/C++ Source or Header  |  1995-04-10  |  3KB  |  159 lines

  1. /****************************************************************************
  2. *
  3. *                   Digital Sound Interface Kit (DSIK)
  4. *                            Version 2.00
  5. *
  6. *                           by Carlos Hasan
  7. *
  8. * Filename:     timer.c
  9. * Version:      Revision 1.1
  10. *
  11. * Language:     WATCOM C
  12. * Environment:  IBM PC (DOS/4GW)
  13. *
  14. * Description:  Timer interrupt services.
  15. *
  16. * Revision History:
  17. * ----------------
  18. *
  19. * Revision 1.1  94/11/16  10:48:42  chv
  20. * Added VGA vertical retrace synchronization code
  21. *
  22. * Revision 1.0  94/10/28  22:45:47  chv
  23. * Initial revision
  24. *
  25. ****************************************************************************/
  26.  
  27. #include <stdlib.h>
  28. #include <conio.h>
  29. #include <dos.h>
  30. #include "timer.h"
  31.  
  32. static void (interrupt far *BiosTimer)(void) = NULL;
  33. static void (*UserTimer)(void);
  34. static long TimerCount,TimerSpeed,TimerSync;
  35.  
  36.  
  37. static void WaitVR(void)
  38. {
  39.     while (inp(0x3da) & 8) ;
  40.     while (!(inp(0x3da) & 8)) ;
  41. }
  42.  
  43. static void StartTimer2(void)
  44. {
  45.     outp(0x61,inp(0x61) | 0x01);
  46.     outp(0x43,0xb4);
  47.     outp(0x42,0x00);
  48.     outp(0x42,0x00);
  49. }
  50.  
  51. static int ReadTimer2(void)
  52. {
  53.     int n;
  54.     outp(0x43,0xb0);
  55.     n = inp(0x42);
  56.     n += inp(0x42) << 8;
  57.     return 0x10000L - n;
  58. }
  59.  
  60. static int GetSyncTicks(void)
  61. {
  62.     int n,Ticks,Delta;
  63.     for (n = 0; n < 16; n++) {
  64.         _disable();
  65.         WaitVR();
  66.         StartTimer2();
  67.         WaitVR();
  68.         Ticks = Delta = ReadTimer2();
  69.         WaitVR();
  70.         StartTimer2();
  71.         WaitVR();
  72.         Delta -= ReadTimer2();
  73.         _enable();
  74.         if (Delta >= -64 && Delta <= +64) return Ticks;
  75.     }
  76.     return TICKS(70);
  77. }
  78.  
  79. static void interrupt TimerHandler(void)
  80. {
  81.     static int TimerSem = 0;
  82.     if (TimerSem) {
  83.         outp(0x20,0x20);
  84.     }
  85.     else {
  86.         TimerSem++;
  87.         if (TimerSync) {
  88.             WaitVR();
  89.             outp(0x43,0x30);
  90.             outp(0x40,TimerSpeed & 0xff);
  91.             outp(0x40,TimerSpeed >> 8);
  92.         }
  93.         (*UserTimer)();
  94.         if ((TimerCount += TimerSpeed) >= 0x10000) {
  95.             TimerCount -= 0x10000;
  96.             (*BiosTimer)();
  97.         }
  98.         else {
  99.             outp(0x20,0x20);
  100.         }
  101.         TimerSem--;
  102.     }
  103. }
  104.  
  105. static void IdleTimer(void)
  106. {
  107. }
  108.  
  109. void dInitTimer(void)
  110. {
  111.     if (!BiosTimer) {
  112.         UserTimer = IdleTimer;
  113.         BiosTimer = _dos_getvect(0x08);
  114.         _dos_setvect(0x08,TimerHandler);
  115.         dSetTimerSpeed(0x10000);
  116.     }
  117. }
  118.  
  119. void dDoneTimer(void)
  120. {
  121.     if (BiosTimer) {
  122.         dSetTimerSpeed(0x10000);
  123.         _dos_setvect(0x08,BiosTimer);
  124.         BiosTimer = NULL;
  125.     }
  126. }
  127.  
  128. void dSetTimerSpeed(int Speed)
  129. {
  130.     if (BiosTimer) {
  131.         TimerSync = !(TimerSpeed = Speed);
  132.         if (TimerSync) {
  133.             TimerSpeed = GetSyncTicks() - 1024;
  134.             outp(0x43,0x30);
  135.         }
  136.         else {
  137.             outp(0x43,0x36);
  138.         }
  139.         outp(0x40,TimerSpeed & 0xff);
  140.         outp(0x40,TimerSpeed >> 8);
  141.     }
  142. }
  143.  
  144. void dStartTimer(TimerProc Timer, int Speed)
  145. {
  146.     if (BiosTimer) {
  147.         UserTimer = Timer;
  148.         dSetTimerSpeed(Speed);
  149.     }
  150. }
  151.  
  152. void dStopTimer(void)
  153. {
  154.     if (BiosTimer) {
  155.         UserTimer = IdleTimer;
  156.         dSetTimerSpeed(0x10000);
  157.     }
  158. }
  159.