Вопрос знатокам обработки IRQ в DOS
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Не знал, да еще забыл 19 мая 2003 г. 11:53

Не могу понять почему не работает следующий код. По идее после передачи первого символа должно быть прерывание, которое установит i в еденичку, тем самым разрешив передачу следующего символа, след. IRQ и так далее. Но не работает. Компилятор Borland++ C 3.1.
P.S. Под Win2k почему-то работает.
#include
#include
#include
#include
#include
#include "port.h"

//#pragma check_stack(on)
//#pragma check_pointer(on)
//void interrupt far get_out(); /* interrupt prototype */
void interrupt far (*oldvect)();

#define IRQ3 0xb
#define IRQ4 0xc
int i=1,BASE;
long d;
//char isr,a[10],b[10];
long timeout;
void interrupt far get_out()
{
_asm cli;
i=1;
outportb(0x20,0x20);
outportb(0xa0,0x20);
_asm sti;

}


int main(void)
{
clrscr();
_asm cli;
outportb(0x3f9,0);
oldvect=_dos_getvect(IRQ4);
_dos_setvect(IRQ4,get_out);

isr=inportb(0x21);
BASE=COM1;
outportb(CONTROL,DIVISOR);
outportb(LOW_DIV,B_300);
outportb(HIGH_DIV,B_300>>8);
outportb(CONTROL,BIT_8+STOP_1+NO_PARITY);

outportb(0x3f9,0x02);
outportb(0x21,0);
_asm sti;
for(;;)
{

if(i==1)
{
i=0;
printf("IRQ3 set... \n");
BASE=COM1;
timeout=clock();
do
{
if((clock()-timeout)==3) printf("Timeout... \n");
}
while((inportb( STATUS)&TRH_EMPTY)==0);
outportb(OUT_REG,0x35);
}

if(kbhit())
{
_asm cli;
setvect(IRQ4,oldvect);
outportb(0x21,isr);
_asm sti;
exit(0);
}
}
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru