📄 isr.cpp
字号:
#include <dos.h>
#include "isr.h"
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define IRQ2MaskBit 0x04
#define IRQ7MaskBit 0x80
#define IRQ9MaskBit 0x02
#define IRQ11MaskBit 0x08
unsigned int IRQ7cnt;
unsigned int IRQ9cnt;
unsigned int IRQ11cnt;
void interrupt ( *oldIRQ7handler)(__CPPARGS);
void interrupt ( *oldIRQ9handler)(__CPPARGS);
void interrupt ( *oldIRQ11handler)(__CPPARGS);
void interrupt IRQ7_ISR(__CPPARGS);
void interrupt IRQ9_ISR(__CPPARGS);
void interrupt IRQ11_ISR(__CPPARGS);
void interrupt IRQ7_ISR(__CPPARGS)
{
enable( );
// put your code here
IRQ7cnt++;
//send EOI
outportb( 0x20, 0x67 ); // specific EOI command
}
void interrupt IRQ9_ISR(__CPPARGS)
{
enable( );
// put your code here
IRQ9cnt++;
//send EOI
outportb( 0xa0, 0x61 );
outportb( 0x20, 0x62 );
}
void interrupt IRQ11_ISR(__CPPARGS)
{
enable( );
// put your code here
IRQ11cnt++;
//send EOI
outportb( 0xa0, 0x63 );
outportb( 0x20, 0x62 );
}
/*///////////////////////////////////////////////
INPUT: intno => interrupt number in software
ISA NAME intno
------------------------------
IRQ7 | 0x0f
IRQ9 | 0x71
IRQ11 | 0x73
///////////////////////////////////////////////*/
int InstallISR( int intno )
{
unsigned char MaskBit;
switch( intno )
{
case 0x0f:
MaskBit = IRQ7MaskBit;
outportb( 0x21, inportb(0x21)|MaskBit ); // mask irq7
oldIRQ7handler = getvect( intno );
setvect( intno, IRQ7_ISR );
MaskBit = ~MaskBit;
outportb( 0x21, inportb(0x21)&MaskBit ); // unmask irq7
break;
case 0x71:
MaskBit = IRQ9MaskBit;
outportb( 0xa1, inportb(0xa1)|MaskBit ); // mask irq9
oldIRQ9handler = getvect( intno );
setvect( intno, IRQ9_ISR );
MaskBit = ~MaskBit;
outportb( 0xa1, inportb(0xa1)&MaskBit ); // unmask irq9
MaskBit = ~IRQ2MaskBit;
outportb( 0x21, inportb(0x21)&MaskBit ); // unmask irq2
break;
case 0x73:
MaskBit = IRQ11MaskBit;
outportb( 0xa1, inportb(0xa1)|MaskBit ); // mask irq11
oldIRQ11handler = getvect( intno );
setvect( intno, IRQ11_ISR );
MaskBit = ~MaskBit;
outportb( 0xa1, inportb(0xa1)&MaskBit ); // unmask irq11
MaskBit = ~IRQ2MaskBit;
outportb( 0x21, inportb(0x21)&MaskBit ); // unmask irq2
break;
default:
return -1;
}
return 0;
}
int UninstallISR( int intno )
{
unsigned char MaskBit;
switch( intno )
{
case 0x0f:
MaskBit = IRQ7MaskBit;
outportb( 0x21, inportb(0x21)|MaskBit ); // mask irq7
setvect( intno, oldIRQ7handler );
break;
case 0x71:
MaskBit = IRQ9MaskBit;
outportb( 0xa1, inportb(0xa1)|MaskBit ); // mask irq9
setvect( intno, oldIRQ9handler );
break;
case 0x73:
MaskBit = IRQ11MaskBit;
outportb( 0xa1, inportb(0xa1)|MaskBit ); // mask irq11
setvect( intno, oldIRQ11handler );
break;
default:
return -1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -