1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <conio.h>
#include <stdio.h>
#include <dos.h>
/* Interrupt management */
#define DISABLE() asm { CLI }
#define ENABLE() asm { STI }
#define OUTB(p,v) outp(p,v)
#define OUTW(p,v) outpw(p,v)
#define INB(p) inp(p)
#define INW(p) inpw(p)
#define LONGTOPOINTEUR(l) MK_FP((int)(0xFFFF&(l>>4)), (int)(0xF&l))
#define POINTEURTOLONG(p) (((long)FP_SEG(p))<<4) + FP_OFF(p)
#define _clearir1(irno) OUTB(0x20, 0x60+irno)
#define _clearir2(irno) OUTB(0xa0, 0x58+irno), OUTB(0x20, 0x62)
#define CLEARIR(irno) irno < 8 ? _clearir1(irno) : _clearir2(irno)
#define SETVECT(v,r) setvect(v,r)
#define GETVECT(v) getvect(v)
#define ENABLEIR(irno) \
DISABLE(); \
if ( irno >= 8 ) { \
OUTB(0x21, INB(0x21) & ~(1<<2)); \
OUTB(0xa1, INB(0xa1) & ~(1<<(irno&7))); \
} else { \
OUTB(0x21, INB(0x21) & ~(1<<(irno&7))); \
} \
ENABLE(); \
#define DISABLEIR(irno) \
DISABLE(); \
if ( irno >= 8 ) { \
OUTB(0xa1, INB(0xa1) | (1<<(irno&7))); \
} else { \
OUTB(0x21, INB(0x21) | (1<<(irno&7))); \
} \
ENABLE();
#define IT_CAN 0x7
int cpt;
void interrupt can(void)
{
DISABLEIR(IT_CAN);
cpt++;
ENABLEIR(IT_CAN);
CLEARIR(IT_CAN);
};
main()
{
char far *ptr;
int i;
cpt=0;
setvect(IT_CAN+8,can);
ENABLEIR(IT_CAN);
CLEARIR(IT_CAN);
while(kbhit()==0)
{
gotoxy(0,20);
printf("cpt %i\n",cpt);
}
return 0;
} |
Partager