?? port.c
字號:
in al,dx
mov is_reg,al
out dx,al
} /* 清除ISR*/
/* 判斷是何種中斷 */
if(is_reg&0x01) {
/* Mark_PRX[recvIntPointer++]=0x88;*/
/* if(recvIntPointer==0x32) recvIntPointer=0;*/
Mark_PRX1=0x88;
nic_recieved=1;
}
if(is_reg&0x02) Mark_PTX=0x88;
if(is_reg&0x04)
{
Mark_RXE=1;
}
if(is_reg&0x08) Mark_TXE=0x88;
if(is_reg&0x10)
{
Mark_OVW=1;
asm{
push ax
push dx
mov dx,ISR /*; 讀中斷識別寄存器ISR */
in al,dx
and al,0efh
mov is_reg,al
out dx,al
pop dx
pop ax
}
}
if(is_reg&0x20) Mark_CNT=0x88;
if(is_reg&0x40) Mark_RDC=0x88;
if(is_reg&0x80)
{
Mark_RST=1;
asm{
push ax
push dx
mov dx,ISR /*; 讀中斷識別寄存器ISR */
in al,dx
and al,7fh
mov is_reg,al
out dx,al
pop dx
pop ax
}
}
asm{
mov dx,IMR //;IMR renable
mov al,0ffh
out dx,al
mov al,20h
out 20h,al
out 0a0h,al
pop cx
pop es
pop si
pop di
pop bp
pop ds
pop ax
pop bx
pop dx
pop ax
}
outp(intcommand1,0x20);
outp(intcommand2,0x20);
asm{
push ax
push dx
mov dx,ISR /*; 讀中斷識別寄存器ISR */
in al,dx
mov is_reg,al
out dx,al
pop dx
pop ax
} /* 清除ISR*/
/* 判斷是何種中斷 */
if(is_reg!=0) goto net_handle;
enable();
}
/*void interrupt keyboard_interrupt(void)
{
char keycode;
keycode=inport(0x60);
switch(keycode)
{
case 0x01: //ESC
break;
case 0x26: //L
break;
case 0x2b:
break;
case 0x14: //t
break;
case 0x21: //s
break;
case 0x16:
break;
case 0x1f:
break;
case 0x32:
break;
}
outp(intcommand1,0x20);
}*/
//=========================================================================//
void async_touch_com_sending(int Tport_number)
{
int commandport;
int dataport;
int Tcom_number;
Tcom_number=Tport_number+1;
switch(Tcom_number)
{
case 1:
touch_com1_sending();
break;
case 2:
touch_com2_sending();
break;
default:
if(Tcom_number%2)
{
commandport=0x2d2+(Tcom_number-3)*2;
dataport=0x2d3+(Tcom_number-3)*2;
}
else
{
commandport=0x2d0+(Tcom_number-4)*2;
dataport=0x2d1+(Tcom_number-4)*2;
}
if((iportsendbuffW[Tport_number]!=iportsendbuffR[Tport_number])&&(sending[Tport_number]==0))
{
outp(commandport,0x00);
rr3=inp(commandport);
rr3=rr3&0x04;
if(rr3==0x04)
//if(sending34==0)
{
outp(dataport,portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
//printf(" %X",portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
//printf(" W= %d R= %d\n",iportsendbuffW[Tport_number],iportsendbuffR[Tport_number]);
iportsendbuffR[Tport_number]++;
if(iportsendbuffR[Tport_number]>=MAX_DATA)
iportsendbuffR[Tport_number]=0;
//sending[Tport_number]=1;
com_send_count[Tport_number]++;
outp(commandport,0x00);
outp(commandport,0x28);
}
}
///
}
}
void sync_touch_com_sending(int Tport_number)
{
int commandport;
int dataport;
int Tcom_number;
Tcom_number=Tport_number+1;
switch(Tcom_number)
{
case 1:
touch_com1_sending();
break;
case 2:
touch_com2_sending();
break;
default:
if((iportsendbuffW[Tport_number]!=iportsendbuffR[Tport_number])&&(sending[Tport_number]==0))
{
if(Tcom_number%2)
{
commandport=0x2d2+(Tcom_number-3)*2;
dataport=0x2d3+(Tcom_number-3)*2;
}
else
{
commandport=0x2d0+(Tcom_number-4)*2;
dataport=0x2d1+(Tcom_number-4)*2;
}
outp(commandport,0x00);
rr3=inp(commandport);
rr3=rr3&0x04;
if(rr3==0x04)
{ //delay(5);
outp(dataport,portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
iportsendbuffR[Tport_number]++;
if(iportsendbuffR[Tport_number]>=MAX_DATA)
iportsendbuffR[Tport_number]=0;
sending[Tport_number]=1;
com_send_count[Tport_number]++;
}
/*else
{
outp(commandport,0x00);
rr3=inp(commandport);
rr3=rr3&0x04;
if(rr3==0x04)
{
outp(dataport,portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
iportsendbuffR[Tport_number]++;
if(iportsendbuffR[Tport_number]>=MAX_DATA)
iportsendbuffR[Tport_number]=0;
sending[Tport_number]=1;
com_send_count[Tport_number]++;
}
else
{
delay(10);
outp(commandport,0x00);
rr3=inp(commandport);
rr3=rr3&0x04;
if(rr3==0x04)
{
outp(dataport,portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
iportsendbuffR[Tport_number]++;
if(iportsendbuffR[Tport_number]>=MAX_DATA)
iportsendbuffR[Tport_number]=0;
sending[Tport_number]=1;
com_send_count[Tport_number]++;
}
else
{
delay(10);
outp(commandport,0x00);
rr3=inp(commandport);
rr3=rr3&0x04;
if(rr3==0x04)
{
outp(dataport,portsendbuff[Tport_number][iportsendbuffR[Tport_number]]);
iportsendbuffR[Tport_number]++;
if(iportsendbuffR[Tport_number]>=MAX_DATA)
iportsendbuffR[Tport_number]=0;
sending[Tport_number]=1;
com_send_count[Tport_number]++;
};
}
}
} */
//com_send_count[Tport_number]++;
//com_send_count[Tport_number]++;
}
}
}
void touch_com1_sending(void)
{
int line_flag;
//for(;iportsendbuffW[0]!=iportsendbuffR[0];)//???
if(iportsendbuffW[0]!=iportsendbuffR[0])
{
if(sending1==0)
{
line_flag=bioscom(3,0,0);
line_flag=line_flag&0x2000;
if(line_flag!=0)
//line_flag = bioscom(3, 0, 0);
//if((line_flag & 0x100)!=0)
//if((inp(com1_lineflag)&0x20)!=0)
{
outp(com1_dataport,portsendbuff[0][iportsendbuffR[0]]);
iportsendbuffR[0]++;
if(iportsendbuffR[0]>=MAX_DATA)
iportsendbuffR[0]=0;
//sending1=1;
com_send_count[0]++;
};
};
}
}
void touch_com2_sending(void)
{
int line_flag;
if(iportsendbuffW[1]!=iportsendbuffR[1])
{
if(sending2==0)
{
line_flag=bioscom(3,0,1);
line_flag=line_flag&0x2000;
if(line_flag!=0)
//if((inportb(0x2fd)&0x20)!=0)
{
outp(com2_dataport,portsendbuff[1][iportsendbuffR[1]]);
iportsendbuffR[1]++;
if(iportsendbuffR[1]>=MAX_DATA)
iportsendbuffR[1]=0;
sending2=1;
com_send_count[1]++;
};
};
}
}
void touch_all_port(void)
{
int port_number=0;
for(port_number=0;port_number<14;port_number++)
{
if((iportsendbuffW[port_number]!=iportsendbuffR[port_number])&&sending[port_number]==0)
{
if(Port_Set[port_number][5]==1)
//sync;
{
sync_touch_com_sending(port_number);
}
else
//async;
{
async_touch_com_sending(port_number);
}
}
}
}
/*void interrupt_zi_programe(int Tcom_number)///////////////////New
{
static int writedata_flag[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int commandport1;
int dataport1;
int commandport2;
int dataport2;
int ifor1;
char recv_char;
commandport1=0x2d2+(Tcom_number-3)*2;
dataport1=0x2d3+(Tcom_number-3)*2;
commandport2=0x2d0+(Tcom_number+1-4)*2;
dataport2=0x2d1+(Tcom_number+1-4)*2;
Tcom_number=Tcom_number-1;
disable();
handle3a:
//.........................A
/////////////////////////////
if(Port_Set[Tcom_number][5]==0)
{
//------async;
}
else
{
outp(commandport1,0x03);
rr3=inp(commandport1);
rr3=rr3&0x08;
if(rr3==0x08)
{
outp(commandport1,0x01);
rr1=inp(commandport1);
if((rr1&0x80)==0x80) //EOF
if(writedata_flag[Tcom_number]==1)
{
//c1_receive_7e_count++;
sync_recevie_7e[Tcom_number]=1;
outp(commandport1,0x01);
rr1=inp(commandport1);
if((rr1&0x40)==0x40)
{
crc_check_erro[Tcom_number]=1;
if(iportreceivebuffW[Tcom_number]!=iportreceivebuffR[Tcom_number]-1)
{
portreceivebuff[Tcom_number][iportreceivebuffW[Tcom_number]]=1;
iportreceivebuffW[Tcom_number]++;
if(iportreceivebuffW[Tcom_number]>=MAX_DATA)
iportreceivebuffW[Tcom_number]=0;
}
else
{}
outp(commandport1,0x0);
outp(commandport1,0x30);// Error Reset
}
else
{
if(iportreceivebuffW[Tcom_number]!=iportreceivebuffR[Tcom_number]-1)
{
portreceivebuff[Tcom_number][iportreceivebuffW[Tcom_number]]=0;
iportreceivebuffW[Tcom_number]++;
if(iportreceivebuffW[Tcom_number]>=MAX_DATA)
iportreceivebuffW[Tcom_number]=0;
}
else
{}
}
for(ifor1=0;ifor1<4;ifor1++)
{
if(iportreceivebuffW[Tcom_number]!=iportreceivebuffR[Tcom_number]-1)
{
portreceivebuff[Tcom_number][iportreceivebuffW[Tcom_number]]=0x7e;
iportreceivebuffW[Tcom_number]++;
if(iportreceivebuffW[Tcom_number]>=MAX_DATA)
iportreceivebuffW[Tcom_number]=0;
}
else
{}
}
//goto quit_interrupt;
writedata_flag[Tcom_number]=0;
}
outp(commandport1,0x00);
rr0=inp(commandport1);
if((rr0&0x04)==0x0) // Tx Buffer Empty;
{
//outp(commandport1,0x0);
//outp(commandport1,0x28);
};
outp(commandport1,0x00);
rr0=inp(commandport1);
if((rr0&0x01)==0x0) // Rx character Available;
{
};
outp(commandport1,0x0);
outp(commandport1,0x10);
}
}
/////////////////data receive;
outp(commandport1,0x03); //com3 receive;
rr3=inp(commandport1);
rr3=rr3&0x20;
while(rr3==0x20)
{
recv_char=inp(dataport1);
com_received_num[Tcom_number]++;
if(iportreceivebuffW[Tcom_number]!=iportreceivebuffR[Tcom_number]-1)
{
portreceivebuff[Tcom_number][iportreceivebuffW[Tcom_number]]=recv_char;
iportreceivebuffW[Tcom_number]++;
if(iportreceivebuffW[Tcom_number]>=MAX_DATA)
iportreceivebuffW[Tcom_number]=0;
writedata_flag[Tcom_number]=1;
}
else
{}
outp(commandport1,0x03);
rr3=inp(commandport1);
rr3=rr3&0x20;
}
/////////////////data send;
outp(commandport1,0x03); //com3 send;
rr3=inp(commandport1);
rr3=rr3&0x10;
while(rr3==0x10)
{
com_int_count[Tcom_number]++;
if(iportsendbuffW[Tcom_number]!=iportsendbuffR[Tcom_number])
{
outp(dataport1,portsendbuff[Tcom_number][iportsendbuffR[Tcom_number]]);
iportsendbuffR[Tcom_number]++;
if(iportsendbuffR[Tcom_number]>=MAX_DATA)
iportsendbuffR[Tcom_number]=0;
sending[Tcom_number]=1;
com_send_count[Tcom_number]++;
}
else
{
if(Port_Set[Tcom_number][5]==0)
{
sending[Tcom_number]=0;
}
else
{
if(sending[Tcom_number]!=0)
{
sending[Tcom_number]++;
if(sending[Tcom_number]>=4)
sending[Tcom_number]=0;
}
}
outp(commandport1,0x28);
}
outp(commandport1,0x03);
rr3=inp(commandport1);
rr3=rr3&0x10;
}
//.......................end A;
//.........................B
//////////////////
if(Port_Set[Tcom_number+1][5]==0)
{
//------async;
}
else
{
outp(commandport1,0x03); //com4 interrupt deal;
rr3=inp(commandport1);
rr3=rr3&0x01;
if(rr3==0x01)
{
outp(commandport2,0x01);
rr1=inp(commandport2);
if((rr1&0x80)==0x80) //EOF
if(writedata_flag[Tcom_number+1]==1)
{
sync_recevie_7e[Tcom_number+1]=1;
outp(commandport2,0x01);
rr1=inp(commandport2);
if((rr1&0x40)==0x40)
{
crc_check_erro[Tcom_number+1]=1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -