⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.h

📁 这个版本修正了已知的Bug,同时添加了部分函数
💻 H
字号:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>

#ifndef _TIMER_H_INCLUDED
#define _TIMER_H_INCLUDED
#if !defined(_ENABLE_AUTODEPEND)
  #pragma read_only_file;
#endif
#ifdef __cplusplus

extern "C" {
#endif

#define MAX_TIMERS      30

void   timer_init();
void   timer_uninstall();

  long tinstall=0,autoexit=0,Timer_Delay=65536L;
  long clock0=0, clock1=0;
  short  Intr=0x08;

struct {                           /* list of active callbacks */
   void ((*proc)());
   int speed;
   int counter;
} my_int_queue[MAX_TIMERS+1];

#define TIMERS_PER_SECOND     1193181L
#define SECS_TO_TIMER(x)      ((int)(x) * TIMERS_PER_SECOND)
#define MSEC_TO_TIMER(x)      ((int)(x) * (TIMERS_PER_SECOND / 1000))
#define BPS_TO_TIMER(x)       (TIMERS_PER_SECOND / (int)(x))
#define BPM_TO_TIMER(x)       ((60 * TIMERS_PER_SECOND) / (int)(x))
#define LOVE_TIME_SPEED       BPS_TO_TIMER(200)

 void interrupt MyInt8();
 void interrupt far (*OldInt8)();
 void SetTimerRate(unsigned v);
 short  FindProc(void (*proc)(void));
 void UpdateRate();

#pragma intrinsic(FineProc);

short  FindProc(void (*proc)(void))
{ short i;
  for (i=0;i<MAX_TIMERS;i++) if (proc==my_int_queue[i].proc) return i;
  i=0; while (my_int_queue[i].proc&&i<MAX_TIMERS) i++; // Find a new space
  my_int_queue[i].speed=my_int_queue[i].counter=0;
  return i;
}

 void remove_int(void (*proc)(void))
{ short i=FindProc(proc);
  my_int_queue[i].proc=NULL; 
  my_int_queue[i].speed=my_int_queue[i].counter=0;
//  UpdateRate();
}

 char install_int_ex(void (*proc)(void), int speed)
{ short i=FindProc(proc); 
  my_int_queue[i].proc=proc; 
  my_int_queue[i].counter-=my_int_queue[i].speed;
  my_int_queue[i].counter+=speed; my_int_queue[i].speed=speed;
//  UpdateRate();
  if (i<MAX_TIMERS) return 1;
  return 0;
}

void UpdateRate()
{ short i; int new_speed=65536L;
  for (i=0;i<MAX_TIMERS;i++)
      if (my_int_queue[i].proc&&my_int_queue[i].speed<new_speed)
         new_speed=my_int_queue[i].speed;
  if (new_speed!=Timer_Delay)
   { Timer_Delay=new_speed;
     if (Timer_Delay>65536L) Timer_Delay=65536L;
     SetTimerRate(Timer_Delay);
   }
}

 char install_int(void (*proc)(void),int speed)
{ return install_int_ex(proc,MSEC_TO_TIMER(speed));
}

long getclock(char swit)
{ if (!tinstall) timer_init();
  if (swit==0) return clock0;
  return clock1;
}

 void interrupt MyInt8()
{ short i; 
  static int  old_delay=65536L, old_counter=65536L;
  static short callback[MAX_TIMERS];

  clock0+=Timer_Delay; clock1++; // add clock
_disable();
  for (i=0;i<MAX_TIMERS;i++) {
   callback[i]=0;
   if ((my_int_queue[i].proc) && (my_int_queue[i].speed>0))
    { my_int_queue[i].counter-=Timer_Delay; 
      while (my_int_queue[i].counter<=0) 
       { my_int_queue[i].counter+=my_int_queue[i].speed;
         callback[i]++;
       }
    }
  }
  for (i=0;i<MAX_TIMERS;i++)
   { while(callback[i]>0) 
      { if (my_int_queue[i].proc) (*my_int_queue[i].proc)();
        callback[i]--;
      }
   }

  old_counter-=Timer_Delay;
  if (old_counter<=0) { 
     old_counter+=old_delay; 
     if (Intr==0x08){
     if(++bmp_Count>18)
     {
     bmp_FPS++;
     bmp_Count=0;
     }
     _chain_intr(OldInt8); }
  }

  _enable();
  if (Intr==0x08) outp(0x20,0x20);
}

void SetTimerRate(unsigned int v)
{ if (v>65536||v==0)  v=65536;
  _disable();
  outp(0x43, 0x34);
  outp(0x40, v & 0xff);
  outp(0x40, v >> 8);  
  _enable(); Timer_Delay=v; 
}


void timer_init()
{ short i;
  if (tinstall) return;
  OldInt8=_dos_getvect(Intr);
  _disable();
  _dos_setvect(Intr,MyInt8);
  _enable();
  tinstall=1;
  SetTimerRate(LOVE_TIME_SPEED);
  for (i=0;i<MAX_TIMERS;i++) my_int_queue[i].proc=NULL;
  if (!autoexit) { atexit(timer_uninstall); autoexit=1; }
}

int report_delay() { return Timer_Delay; }

void timer_uninstall()
{ if (!tinstall) return;
  SetTimerRate(0);
  tinstall=0;
  _disable();
  _dos_setvect(Intr,OldInt8);
  _enable();
}

#ifdef __cplusplus
};
#endif
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -