📄 timer.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 + -