中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » dos下的中断驻留程序完整问题?
作者:
标题: dos下的中断驻留程序完整问题? 上一主题 | 下一主题
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『楼 主』:  dos下的中断驻留程序完整问题?

我有个irq3得中断,硬件已经初始化了,可以产生中断,但是程序感觉着还是不太完整,不知道那里需要补充?
   下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的),如果开机运行该程序的话,完全没有问题,可是只要我按下键盘,程序就停止,不知道为何?是不是在程序中的没有考虑键盘中断的影响呢?不知道该怎么接管int 13H int 28H
QQ:36014789

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <process.h>
#include <sys/timeb.h>
#include <fcntl.h> d4
#include <sys\stat.h>
#include <share.h>
#include <IO.H>

#define INTR 0X0b
#define Freq1 400
#define Freq2  10000
#define Data1_add 0x2bc
#define Data2_add 0x2bd

#define Control_add 0x2bf

#ifdef __cplusplus
  #define __CPPARGS ...
#else
  #define __CPPARGS
#endif

void interrupt ( *oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS);
void init8253();
void install_newtimer();

int main(void)
  {
        install_newtimer();//安装中断
        init8253(); //初始化
              keep(0,_SS+(_SP/16)-_psp);    //驻留
        return 0;
  }


//安装中断
void install_newtimer()
  {           int zd;
        disable();
        oldhandler = getvect(INTR);
        setvect(INTR, handler);
        zd=inportb(0x21);
        delay(1);
        outportb(0x21,zd&~(0x08));
        enable();
   }

//终端函数
void interrupt handler(__CPPARGS)
  {   
        disable();
        outportb(0x2b9,0x00);//关125
        puts("asdfdfd\n");
        outportb(0x20,0x20);
        outportb(0x2b9,0x01);//开125
        enable();
}

//初始化
void init8253()
{
        int sendhigh,sendlow;
        disable();
        sendhigh=(Freq1&0xff00)>>8;
        sendlow=Freq1&0x00ff;

        outportb(Control_add,0x36);
        delay(1);
        outportb(Data1_add,sendlow);
        delay(1);
        outportb(Data1_add,sendhigh);
        delay(1);

        sendhigh=(Freq2&0xff00)>>8;
        sendlow=Freq2&0x00ff;


        outportb(Control_add,0x76);
        delay(1);
        outportb(Data2_add,sendlow);
        delay(1);
        outportb(Data2_add,sendhigh);
        delay(1);
        outportb(0x2b9,0x01);//开125
        enable();
}

[ Last edited by xyh36014789 on 2007-11-6 at 10:54 AM ]

2007-10-31 14:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jojand
初级用户





积分 117
发帖 57
注册 2007-10-23
状态 离线
『第 2 楼』:  

呵呵,ctrl+break不能用IRET返回

2007-10-31 15:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: