//**********************************************************
//定义新的时钟中断处理函数
void interrupt newtimer(void)
{
//调用原来的例程
(*oldtimer)();
//全局计数器变量加1
TimerCounter++;
}

//********************************************************
//设置新的时钟中断处理
void SetTimer(void interrupt (*IntProc)(void))
{
//获取中断号为TIMER的中断处理函数的入口地址
oldtimer=getvect(TIMER);
//设置新的时钟中断处理过程时,禁止所有中断
disable();
//将中断号为TIMER的中断处理函数入口地址改为IntProc()函数的入口地址
setvect(TIMER,IntProc);
//开启中断
enable();
}

//*********************************************************
//恢复原有的时钟中断处理过程
void KillTimer()
{
disable();
setvect(TIMER,oldtimer);
enable();
}

//********************************************************

 

dos操作系统中,在内存地址从0x0000开始存有一个中断向量表,   
0x1c ( 即TIMER)处放着时钟中断的入口地址,它指向时钟中断服务程序。   
 

//********************************************************

以上的中断服务程序,将要用来代替原来的中断服务程序   
    使用getvect(0x1c),就得到了原来的中断服务程序的地址,把它保存在oldtimer指针中;  
    用setvect(TIMER,IntProc),使编写的服务程序挂接上去,当发生中断时,运行我们的中断服务程序,调用原来的中断处理程序完成正常的操作,然后使TimerCounter加1  ,这个正常的中断程序返回到while循环中,判断中断发生的次数,当TimerCounter>(20-speed*2)时将TimerCounter置零。该中断大概每秒18.2次,所以利用TimerCounter>(20-speed*2)控制时钟中断次数,由此来控制游戏方块自由下落的时间,不同等级所需的时间不同,然后把原来的中断服务程序挂接回去,以免影响系统的正常功能。