⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 port.c

📁 z85c30 DRIVER RUN ON PC104 PC AND VXWORKS SYSTERM.
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -