// Инициализация вектора и контроллера
_asm { cli
mov ax, 0
mov tes, es
mov es, ax
mov ax, word ptr es:[COM_1_INTERR*4]
mov old_ofs_com1, ax
mov ax, word ptr es:[COM_1_INTERR*4+2]
mov old_seg_com1, ax
mov word ptr es:[COM_1_INTERR*4], offset COM_1
mov word ptr es:[COM_1_INTERR*4+2], seg COM_1
}
InitCOMport (0);
_asm {
in al, 21h
and al, 11100111b
out 21h,al
////////////////
in al, 0xA1
and al, 0
out 0xA1,al
////////////////
mov al, 0x20
out 0x20, al
out 0xa0, al
mov ax, tes
mov es, ax
sti
}
------------------------------------
// Инициализация порта
#define COM_1_INTERR 0x0C
#define COM_1_BASREG 0x3f8
#define init_com1_0_del 12//12//0x06
#define init_com1_1_del 0x00
#define init_com1_1_upr 0x03
#define init_com1_3_nor 0x1B
void InitCOMport (char comPos,
unsigned char a=init_com1_0_del,
unsigned char b=init_com1_1_del,
unsigned char c=init_com1_3_nor,
unsigned char d=init_com1_1_upr,
unsigned char e=0x08) {
AdressCOM0=BasAdrCOM[comPos]; // массив с базовыми адресами портов
AdressCOM1=AdressCOM0+1; AdressCOM2=AdressCOM0+2;
AdressCOM3=AdressCOM0+3; AdressCOM4=AdressCOM0+4;
AdressCOM5=AdressCOM0+5; AdressCOM6=AdressCOM0+6;
_asm {
mov al, 0
mov dx, AdressCOM1
out dx, al
mov dx, AdressCOM4
out dx, al
mov dx, AdressCOM5
in al, dx
mov dx, AdressCOM0
in al, dx
mov dx, AdressCOM6
in al, dx
mov al, 0
mov dx, AdressCOM2
out dx, al
---------------
mov al, 0x80
mov dx, AdressCOM3
out dx, al
mov al, a
mov dx, AdressCOM0
out dx, al
mov al, b
mov dx, AdressCOM1
out dx, al
mov al, c
mov dx, AdressCOM3
out dx, al
}
_asm {
mov al, 1011b //e
mov dx, AdressCOM4
out dx, al
mov al, d // 1111b
mov dx, AdressCOM1
out dx, al
}
}
------------------------------------
// Обработчки прерывания
void interrupt COM_1 () {
COMfunction(0); // Функция обработчика
_asm {
mov al, 0x20
out 0x20, al
//out 0xa0, al
}
}
// Заточено под прием-передачу байт
void COMfunction (int e) {
unsigned char BytePrich, ByteInf, BytePhact, Cikl=100;
int AdressCOM0, AdressCOM2, AdressCOM5, AdressCOM6;
AdressCOM0=BasAdrCOM[e]; AdressCOM2=AdressCOM0+2;
AdressCOM5=AdressCOM0+5; AdressCOM6=AdressCOM0+6;
repeat: if ((--Cikl)==0) return;
_asm {
mov dx, AdressCOM2
in al, dx
and ax, 00000111b
mov BytePrich, al
and ax, 00000001b
mov BytePhact, al
mov dx, AdressCOM0
in al, dx
mov ByteInf, al
}
if (BytePhact==1) return;
if (!BytePrich) {
_asm {
mov dx, AdressCOM5
in al, dx
}
}
if (BytePrich&4) {
// Принятый байт Записывается в некоторый буфер
COM_BUF_IN[e][P_in_buf[e]]=ByteInf; if ((++P_in_buf[e])>69) P_in_buf[e]=0;
}
if (BytePrich&2) {
if (P_out_buf[e]!=0) {
ByteInf=COM_BUF_OUT[e][P_stat_buf[e]]; P_stat_buf[e]++; P_out_buf[e]--;
// Байт может быть передан
/*
if (Param2==0) {
_asm {
mov al, ByteInf
mov dx, AdressCOM0
out dx, al
}
} else
{
Param2_buf [e]=ByteInf;
Param2_IDENT[e]=TIMECOMINTERR;
}
*/
}
}
if (BytePrich&6) {
_asm {
mov dx, AdressCOM6
in al, dx
}
}
goto repeat;
}
|