首先,我为Vintage计算机组编程。我写的是专门用于MS-DOS而不是Windows,因为这是人们正在运行的。我当前的程序适用于以后的系统而不是8086系列,因此计划使用IRQ 8.这允许我将中断速率设置为二进制值,从2 /秒到8192 /秒(2,4,8,16,等...)
由于某种原因,只有新旧系统(好吧,听起来很奇怪),它似乎没有用。在仿真和我可以访问的386系统中,它工作正常,但在P3系统上我(GA-6BXC MB w / P3 800 CPU),它只是不起作用。
代码
设置中断
disable();
oldrtc = getvect(0x70); //Reads the vector for IRQ 8
settvect(0x70,countdown); //Sets the vector for
outportb(0x70,0x8a);
y = inportb(0x71) & 0xf0;
outportb(0x70,0x8a);
outportb(0x71,y | _MRATE_); //Adjustable value, set for 64 interrupts per second
outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y | 0x40);
enable();
在中断结束时
outportb(0x70,0x0c);
inportb(0x71); //Reading the C register resets the interrupt
outportb(0xa0,0x20); //Resets the PIC (turns interrupts back on)
outportb(0x20,0x20); //There are 2 PICs on AT machines and later
关闭程序时
disable();
outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y & 0xbf);
setvect(0x70,oldrtc);
enable();
我在代码中看不到可能导致问题的任何内容。但它似乎没有意义。虽然我不完全信任这些信息,但MSD“确实”将IRQ 8报告为RTC计数器,并表示它存在且工作正常。以后的系统是否有可能移动向量?我发现的一切都说IRQ 8是向量0x70,但中断从不在我的Pentium III系统上触发。有没有办法找到Vector是否已被更改?
答案 0 :(得分:1)
自从我完成任何MS-DOS代码以来,这是一段很长的时间,我不认为我曾经使用过这个特定的中断(我很确定你可以只读取内存位置来获取时间,并且IRQ0也可以用来以一定的间隔触发你,所以也许这样更好。无论如何,鉴于我的生锈,原谅我有点链接倾销。
http://wiki.osdev.org/Real_Time_Clock该页面的底部有人说他们在某些机器上也有问题。 RBIL建议它可能是BIOS的事情:http://www.ctyme.com/intr/rb-7797.htm
没有DOS,我只是捕获IRQ0本身,并将它们全部重新映射到我自己的中断号,并根据需要更改时序。我最近有点做过!我认为这在DOS上是一个坏主意,这看起来更值得推荐:http://www.ctyme.com/intr/rb-2443.htm
无论如何,我认为它与BIOS有关:
“注意:许多BIOS关闭INT 70h处理程序中的周期性中断,除非在事件等待中(参见INT 15 / AH = 83h,INT 15 / AH = 86h)..可以通过设置I上的位0来屏蔽/ O端口A1h“