//TSR 驻留程序设计框架
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>
//一些数据的定义
#define STACK_SIZE 8192 //栈的大小
#define KEYBOARD 0x60 //键盘数据端口
#define PSP_TERMINATE 0x0A //PSP中的结束地址
#define PSP_PARENT_PSP 0x16 //PSP中的父进程的PSP
#define PSP_ENV_PSP 0x2C //PSP中的环境块的地址
#define SCANCODE 52 //点键的代码
#define KEYMASK 8 //ALT键的代码
#define PARAGRAPHS(x) ((FP_OFF(x)+15)>>4)
//变量的定义
char far* indos_ptr = 0; //指向DOS安全标志的指针
char far* crit_err_ptr = 0; //指向致命错误标志的指针
char far* stack_ptr; //TSR栈的指针
char far* dta1; //前台进程的磁盘传输区地址
char far* dta2; //
unsigned ss_save; //用于保存堆栈段寄存器
unsigned sp_save; //用于保存堆栈指针寄存器
static int active = 0; //TSR激活标志
static int popup_dosbusy = 0;//该标志为1,表明DOS繁忙时热键被按
static int int28_active = 0; //该标志为1,表明INT28处于活动状态
static int int13_active = 0;//该标志为1,表明INT13处于活动状态
static unsigned foreground_psp;//前台进程的PSP
static unsigned long terminateaddr; //删除TSR时使用
static int key;// 读键盘端口时使用
extern int sign;//删除TSR程序时,汇编子程序使用的返回标志
static union REGS r;
static struct SREGS s;
static struct DPSERRPR doserr;
typedef struct{
unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
}INTERRUPT_REGS;
//保存原中断的函数指针
void interrupt(*old_int8)();//时钟中断
void interrupt(*old_int9)();//键盘中断
void interrupt(*old_int1b)();//CTRL_BREAK中断
void interrupt(*old_int23)();//CTRL_C中断
void interrupt(*old_int24)();//严重错误中断
void interrupt(*old_int28)();//DOS 空闲中断
void interrupt(*old_int62)();//通讯中断
void interrupt(*old_int13)();//磁盘读写中断
//函数原型声明
void interrupt far new_int8(void);
void interrupt far new_int9(void);
void interrupt far new_int1b(void);
void interrupt far new_int23(void);
void interrupt far new_int24(INTERRUPT_REGS p);
void interrupt far new_int28(void);
void interrupt far communicate(INTERRUPT_REGS p);
void interrupt far new_int13(INTERRUPT_REGS p);
void help_message(void);<