/*****************************************************************
** test isa interrupter on dos system for icop SBC
** author: Dyqiang
** company: icop
** date: 2008.07.30
*****************************************************************/
#include <conio.h>
#include <bios.h>
#include <dos.h>
#include "stdio.h"
#include "stdlib.h"
long count = 0;
/* Define the IRQ interrupt addresses and masks */
struct
{
unsigned char int_id;
unsigned char PIC1_mask;
unsigned char PIC2_mask;
unsigned char old_PIC1_mask;
unsigned char old_PIC2_mask;
} IRQ[16] = { { 0x08, 0xFE, 0xFF, 0, 0}, /* IRQ00 tick counter */
{ 0x09, 0xFD, 0xFF, 0, 0}, /* IRQ01 Keyboard */
{ 0x0A, 0xFB, 0xFF, 0, 0}, /* IRQ02 PIC2 */
{ 0x0B, 0xF7, 0xFF, 0, 0}, /* IRQ03 COM2 */
{ 0x0C, 0xEF, 0xFF, 0, 0}, /* IRQ04 COM1 */
{ 0x0D, 0xDF, 0xFF, 0, 0}, /* IRQ05 Mouse */
{ 0x0E, 0xBF, 0xFF, 0, 0}, /* IRQ06 Floppy Drive */
{ 0x0F, 0x7F, 0xFF, 0, 0}, /* IRQ07 Printer */
{ 0x70, 0xFB, 0xFE, 0, 0}, /* IRQ08 Clock */
{ 0x71, 0xFB, 0xFD, 0, 0}, /* IRQ09 Redirect IRQ2*/
{ 0x72, 0xFB, 0xFB, 0, 0}, /* IRQ10 COM3 */
{ 0x73, 0xFB, 0xF7, 0, 0}, /* IRQ11 COM4 */
{ 0x74, 0xFB, 0xEF, 0, 0}, /* IRQ12 COM5 */
{ 0x75, 0xFB, 0xDF, 0, 0}, /* IRQ13 System Int */
{ 0x76, 0xFB, 0xBF, 0, 0}, /* IRQ14 Fixed Disk */
{ 0x77, 0xFB, 0x7F, 0, 0}}; /* IRQ15 COM6 */
/* Define port addresses for the 8259 interrupt controller */
#define PICCMD1 0x20 /* Primary Controller */
#define PICMSK1 0x21
#define PICCMD2 0xA0 /* Secondary Controller */
#define PICMSK2 0xA1
#define PICEOI 0x20 /* End of interrupt */
/* Store the pointers to the interrupt address */
void interrupt (*Com)(void);
/* Async Interrupt routine */
//void interrupt Asynch_COM(int irq_id)
void Asynch_IRQ(int irq_id)
{
// count++;
putch('8');
if (irq_id > 7)
outportb(PICCMD2, PICEOI);
outportb(PICCMD1,PICEOI);
} /* end of the interrupt at this point and return */
/* Pass the correct interrupt to the Async_COM(interrupt id) */
void interrupt IRQ0_Interrupt() { Asynch_IRQ(0); }
void interrupt IRQ1_Interrupt() { Asynch_IRQ(1); }
void interrupt IRQ2_Interrupt() { Asynch_IRQ(2); }
void interrupt IRQ3_Interrupt() { Asynch_IRQ(3); }
void interrupt IRQ4_Interrupt() { Asynch_IRQ(4); }
void interrupt IRQ5_Interrupt() { Asynch_IRQ(5); }
void interrupt IRQ6_Interrupt() { Asynch_IRQ(6); }
void interrupt IRQ7_Interrupt() { Asynch_IRQ(7); }
void interrupt IRQ8_Interrupt() { Asynch_IRQ(8); }
void interrupt IRQ9_Interrupt() { Asynch_IRQ(9); }
void interrupt IRQ10_Interrupt() { Asynch_IRQ(10); }
void interrupt IRQ11_Interrupt() { Asynch_IRQ(11); }
void interrupt IRQ12_Interrupt() { Asynch_IRQ(12); }
void interrupt IRQ13_Interrupt() { Asynch_IRQ(13); }
void interrupt IRQ14_Interrupt() { Asynch_IRQ(14); }
void interrupt IRQ15_Interrupt() { Asynch_IRQ(15); }
/*-------- Open the IRQ --------------------- */
void OpenIRQ(int irq_id)
{
int interrupt_id;
int interrupt_no;
disable();
interrupt_no = irq_id;
interrupt_id = IRQ[interrupt_no].int_id;
Com = getvect(interrupt_id);
switch (interrupt_no)
{
case 0: setvect(interrupt_id,IRQ0_Interrupt); break;
case 1: setvect(interrupt_id,IRQ1_Interrupt); break;
case 2: setvect(interrupt_id,IRQ2_Interrupt); break;
case 3: setvect(interrupt_id,IRQ3_Interrupt); break;
case 4: setvect(interrupt_id,IRQ4_Interrupt); break;
case 5: setvect(interrupt_id,IRQ5_Interrupt); break;
case 6: setvect(interrupt_id,IRQ6_Interrupt); break;
case 7: setvect(interrupt_id,IRQ7_Interrupt); break;
case 8: setvect(interrupt_id,IRQ8_Interrupt); break;
case 9: setvect(interrupt_id,IRQ9_Interrupt); break;
case 10: setvect(interrupt_id,IRQ10_Interrupt); break;
case 11: setvect(interrupt_id,IRQ11_Interrupt); break;
case 12: setvect(interrupt_id,IRQ12_Interrupt); break;
case 13: setvect(interrupt_id,IRQ13_Interrupt); break;
case 14: setvect(interrupt_id,IRQ14_Interrupt); break;
case 15: setvect(interrupt_id,IRQ15_Interrupt); break;
}
IRQ[interrupt_no].old_PIC1_mask = inportb(PICMSK1);
outportb(PICMSK1, (IRQ[interrupt_no].old_PIC1_mask & IRQ[interrupt_no].PIC1_mask));
IRQ[interrupt_no].old_PIC2_mask = inportb(PICMSK2);
outportb(PICMSK2, (IRQ[interrupt_no].old_PIC2_mask & IRQ[interrupt_no].PIC2_mask));
enable();
}
/*------------ Close the IRQ -----------------------*/
void CloseIRQ(int irq_id)
{
int interrupt_no, interrupt_id;
interrupt_no = irq_id;
interrupt_id = IRQ[interrupt_no].int_id;
IRQ[interrupt_no].old_PIC1_mask = inportb(PICMSK1);
outportb(PICMSK1, (IRQ[interrupt_no].old_PIC1_mask | ~IRQ[interrupt_no].PIC1_mask));
IRQ[interrupt_no].old_PIC2_mask = inportb(PICMSK2);
outportb(PICMSK2, (IRQ[interrupt_no].old_PIC2_mask | ~IRQ[interrupt_no].PIC2_mask));
setvect(interrupt_id,Com);
}
/* ----------------------------- MAIN PROGRAM ------------------ */
int main(int argc, char* argv[])
{
int irq_id;
char ch = 0;
clrscr();
printf("\nDM&P ICOP IRQ test Program %s %s.\n\n",__DATE__,__TIME__);
printf(" press ESC, quit test programm.\n");
if(argc != 2)
{
printf("A parameter needed only.\n");
return 1;
}
irq_id = atoi(argv[1]);
if(irq_id>15 || irq_id<0)
{
printf("Interrupt id is 0~15.\n");
return 1;
}
OpenIRQ(irq_id);
while(!kbhit())
{
}
CloseIRQ(irq_id);
return 0;
}
int_numb.rar_isa dos_numb
版权申诉
52 浏览量
2022-09-24
03:24:24
上传
评论
收藏 1KB RAR 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈