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

📄 ty514cpu.c

📁 EMV2000 LEVEL 1实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "def.h"

//======================================================================================
//card1
void trans1_t0(void) //using 0
{

	if(length <= 5) 	case3 = 0;
	else 		case3 = 1;

	if(length < 5) 	{XBYTE[4] = 0; pp3 = 0;}

	ET0 = 0;

	//send APDU header
	for(LEN = 0; LEN < 5; LEN++)
	{
		temp = XBYTE[LEN];
		CARD1sendbyte(temp);
		if (STATE_FLAG)
		{
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
               	command = IFD_ICC_TypeError;
                return;
               }
	}

	//receive sw1
	while(1)
	{
		sw1 = CARD1recvbyte();
		if(STATE_FLAG)
                {
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
                command = sw1;
                return;}
		if(sw1 != 0x60)
                break;
		sPC60();
	}

	sw2 = sw1&0xf0;
	if((sw2 == 0x60)||(sw2 == 0x90))
	{
		sw2 = CARD1recvbyte();
		if(STATE_FLAG)
		{
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
                command = IFD_ICC_TypeError;
                return;}

		XBYTE[0] = sw1;
		XBYTE[1] =sw2;
		length = 2;

		return;
	}

	//sw1 != ins
	if((sw1 != ins)&&((sw1+ins) != 0xff))
	{
//		sw2 = CARDrecvbyte();
//		if(STATE_FLAG)
//		{	command = IFD_ICC_TypeError;return;}
//		XBYTE[0] = sw1;XBYTE[1] =sw2;
//		length = 2;
/*		return;
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
		STATE_FLAG = 1;          */
		command = sw1;
                return;
	}

//sw1 == ins
//case3
	if(case3)
	{

		pointer = 5;

        	Detu();                         //方向字符为16 ETU
        	Detu();                         //方向字符为16 ETU
        	Detu();                         //增加2ETU以符合EMV规范的16ETU
                Detu();
                Detu();                         //方向字符为16 ETU

		while((sw1+ins) == 0xff)
		{
			temp = XBYTE[pointer];
			pointer ++;
			CARD1sendbyte(temp);
			if (STATE_FLAG)
			{
                        IC_RST1 = 0;
		        IC_IO1 = 0;
		        IC_PWR1 = 1;
		        CPU1_REST_FLAG = 0;
               	        command = IFD_ICC_TypeError;
                        return;
                        }

			do{
				sw1 = CARD1recvbyte();
				if (STATE_FLAG)
				{
                                IC_RST1 = 0;
		                IC_IO1 = 0;
		                IC_PWR1 = 1;
	                	CPU1_REST_FLAG = 0;
                                command = IFD_ICC_TypeError; return;}
				if(sw1 == 0x60) sPC60();
			} while( sw1 == 0x60);

			if(--pp3 == 0)
                        break;
		}

		if(sw1 == ins)
		{
			while(pp3)
			{
				temp = XBYTE[pointer];
				CARD1sendbyte(temp);
				pointer++;
				pp3--;
				if (STATE_FLAG)
				{
                                IC_RST1 = 0;
		                IC_IO1 = 0;
		                IC_PWR1 = 1;
		                CPU1_REST_FLAG = 0;
               	                command = sw1;
                                return;
                                }
			}

	  		while(1)
  			{
				sw1 = CARD1recvbyte();
				if(STATE_FLAG)
				{
                                IC_RST1 = 0;
		                IC_IO1 = 0;
		                IC_PWR1 = 1;
		                CPU1_REST_FLAG = 0;
                                command = IFD_ICC_TypeError;return;}
				if(sw1 != 0x60) break;
				sPC60();
   			}
		}

		sw2 = CARD1recvbyte();
		if(STATE_FLAG)
		{
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
                command = IFD_ICC_TypeError;
                return;}
                if(((sw1&0xf0)!=0x60)&&((sw1&0xf0)!=0x90))
                {
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
                command = IFD_ICC_TypeError;
                return;
                }
		XBYTE[0] = sw1;
		XBYTE[1] =sw2;
		length = 2;

		return;
	}

//case1,2
	//指针复位
	pointer = 0;
        if((sw1+ins) == 0xff)
        {
	while((sw1+ins) == 0xff)		// 20040720 add
	{
         Recv1:
		temp = CARD1recvbyte();
		if(STATE_FLAG)
	 	{
                IC_RST1 = 0;
		IC_IO1 = 0;
		IC_PWR1 = 1;
		CPU1_REST_FLAG = 0;
                command = temp;
                return;}
                if(temp==0x60)
                {
                 sPC60();
                 goto Recv1;
                }

		XBYTE[pointer] = temp;
		pointer++;

		while(1)				// 200407012 modify
		{
			sw1 = CARD1recvbyte();
			if(STATE_FLAG)
	               	{
                        IC_RST1 = 0;
		        IC_IO1 = 0;
		        IC_PWR1 = 1;
		        CPU1_REST_FLAG = 0;
                        command = IFD_ICC_TypeError;return;}
			if(sw1 != 0x60) break;
			sPC60();
		}

		if(--pp3 == 0)
                break;
	}
        if( sw1==ins )      //1CF.012.01
        goto Rec;
        sw2 = CARD1recvbyte();
	if(STATE_FLAG)
	{
        IC_RST1 = 0;
        IC_IO1 = 0;
	IC_PWR1 = 1;
	CPU1_REST_FLAG = 0;
        command = IFD_ICC_TypeError;
        return;
        }
        if(((sw1&0xf0)!=0x60)&&((sw1&0xf0)!=0x90))
        {
          IC_RST1 = 0;
          IC_IO1 = 0;
	  IC_PWR1 = 1;
	  CPU1_REST_FLAG = 0;
          command = IFD_ICC_TypeError;
          return;
                }
	XBYTE[pointer] = sw1;
	pointer++;
	XBYTE[pointer] = sw2;
	pointer ++;
	length = pointer;
	return;
      }
Rec:
	if(sw1 == ins)
	{
		do
		{
                Recv60:
			temp = CARD1recvbyte();
			if(STATE_FLAG)
		 	{
                         command = temp;
                         IC_RST1 = 0;
			 IC_IO1 = 0;
			 IC_PWR1 = 1;
			 CPU1_REST_FLAG = 0;
                         return;
                        }
                        if(temp==0x60)
                        {
                        sPC60();
                        goto Recv60;
                        }
			XBYTE[pointer] = temp;
			pointer++;
                        if(pp3==0)
                        break;
	                pp3--;
		}while(pp3);
	}
         while(1)				// 200407012 modify
	{
		sw1 = CARD1recvbyte();
		if(STATE_FLAG)
                {
                    IC_RST1 = 0;
	            IC_IO1 = 0;
	            IC_PWR1 = 1;
		    CPU1_REST_FLAG = 0;
                    command = IFD_ICC_TypeError;
                    return;
                 }
               if(temp==0x90&&sw1==0x0)
               {
                  XBYTE[pointer]=sw1;
                  pointer++;
                  length = pointer;
                  return;
               }
		if(sw1 != 0x60) break;
		sPC60();
	}
//	sw1 = CARDrecvbyte();
//	if(STATE_FLAG)
//   	{	command = sw1;return;}
	sw2 = CARD1recvbyte();
	if(STATE_FLAG)
	{
        IC_RST1 = 0;
        IC_IO1 = 0;
	IC_PWR1 = 1;
	CPU1_REST_FLAG = 0;
        command = IFD_ICC_TypeError;
        return;
        }
        if(((sw1&0xf0)!=0x60)&&((sw1&0xf0)!=0x90))
        {
          IC_RST1 = 0;
          IC_IO1 = 0;
	  IC_PWR1 = 1;
	  CPU1_REST_FLAG = 0;
          command = IFD_ICC_TypeError;
          return;
                }
	XBYTE[pointer] = sw1;
	pointer++;
	XBYTE[pointer] = sw2;
	pointer ++;
	length = pointer;

	return;

}
//======================================================================================
//card2
void trans2_t0(void) //using 0
{

	if(length <= 5) 	case3 = 0;
	else 		case3 = 1;

	if(length < 5) 	{XBYTE[4] = 0; pp3 = 0;}

	ET0 = 0;

	//send APDU header
	for(LEN = 0; LEN < 5; LEN++)
	{
		temp = XBYTE[LEN];
		CARD2sendbyte(temp);
		if (STATE_FLAG)
		{
                 IC_RST2 = 0;
                 IC_IO2 = 0;
	         IC_PWR2 = 1;
	         CPU2_REST_FLAG = 0;
                command = IFD_ICC_TypeError;return;}
	}

	//receive sw1
	while(1)
	{
		sw1 = CARD2recvbyte();
		if(STATE_FLAG)
                {
                 IC_RST2 = 0;
                 IC_IO2 = 0;
	         IC_PWR2 = 1;
	         CPU2_REST_FLAG = 0;
                command = sw1;return;}
		if(sw1 != 0x60) break;
		sPC60();
	}

	sw2 = sw1&0xf0;
	if((sw2 == 0x60)||(sw2 == 0x90))
	{
		sw2 = CARD2recvbyte();
		if(STATE_FLAG)
		{
                IC_RST2 = 0;
                IC_IO2 = 0;
	        IC_PWR2 = 1;
	        CPU2_REST_FLAG = 0;
                command = IFD_ICC_TypeError;return;}

		XBYTE[0] = sw1;
		XBYTE[1] =sw2;
		length = 2;

		return;
	}

	//sw1 != ins
	if((sw1 != ins)&&((sw1+ins) != 0xff))
	{
//		sw2 = CARDrecvbyte();
//		if(STATE_FLAG)
//		{	command = IFD_ICC_TypeError;return;}
//		XBYTE[0] = sw1;XBYTE[1] =sw2;
//		length = 2;
//		return;
//		STATE_FLAG = 1;  //2006.07.24
		command = IFD_ICC_TypeError;return;
	}

//sw1 == ins
//case3
	if(case3)
	{

		pointer = 5;

        	Detu();                         //方向字符为16 ETU
        	Detu();                         //方向字符为16 ETU
        	Detu();                         //方向字符为16 ETU
                Detu();                         //2006.07.24修改
                Detu();                         //2006.07.24修改
		while((sw1+ins) == 0xff)
		{
			temp = XBYTE[pointer];
			pointer ++;
			CARD2sendbyte(temp);
			if (STATE_FLAG)
			{
                        IC_RST2 = 0;
		        IC_IO2 = 0;
		        IC_PWR2 = 1;
		        CPU2_REST_FLAG = 0;
                        command = temp; return;}

			do{
				sw1 = CARD2recvbyte();
				if (STATE_FLAG)
				{
                                 IC_RST2 = 0;
		                 IC_IO2 = 0;
		                 IC_PWR2 = 1;
		                 CPU2_REST_FLAG = 0;
                                 command = IFD_ICC_TypeError; return;}
				if(sw1 == 0x60) sPC60();
			} while( sw1 == 0x60);

			if(--pp3 == 0) break;
		}

		if(sw1 == ins)
		{
			while(pp3)
			{
				temp = XBYTE[pointer];
				CARD2sendbyte(temp);
				pointer++;
				pp3--;
				if (STATE_FLAG)
				{
                                 IC_RST2 = 0;
		                 IC_IO2 = 0;
		                 IC_PWR2 = 1;
		                 CPU2_REST_FLAG = 0;
                                 command = sw1; return;}
			}

	  		while(1)
  			{
				sw1 = CARD2recvbyte();
				if(STATE_FLAG)
				{
                                 IC_RST2 = 0;
		                 IC_IO2 = 0;
		                 IC_PWR2 = 1;
		                 CPU2_REST_FLAG = 0;
                                command = IFD_ICC_TypeError;return;}
				if(sw1 != 0x60) break;
				sPC60();
   			}
		}

		sw2 = CARD2recvbyte();
		if(STATE_FLAG)
		{
                 IC_RST2 = 0;
		 IC_IO2 = 0;
		 IC_PWR2 = 1;
		 CPU2_REST_FLAG = 0;
                command = IFD_ICC_TypeError;return;}
                if(((sw1&0xf0)!=0x60)&&((sw1&0xf0)!=0x90))
                {
                 IC_RST2 = 0;
		 IC_IO2 = 0;
		 IC_PWR2 = 1;
		 CPU2_REST_FLAG = 0;
                 command = IFD_ICC_TypeError;
                 return;
                }
		XBYTE[0] = sw1;
		XBYTE[1] =sw2;
		length = 2;

		return;
	}

//case1,2
	//指针复位
	pointer = 0;
       if((sw1+ins) == 0xff)
       {
	while((sw1+ins) == 0xff)		// 20040720 add
	{
        Recv2:
		temp = CARD2recvbyte();
		if(STATE_FLAG)
	 	{
                IC_RST2 = 0;
		 IC_IO2 = 0;
		 IC_PWR2 = 1;
		 CPU2_REST_FLAG = 0;
                command = temp;return;}
                if(temp==0x60)
                {
                 sPC60();
                 goto Recv2;
                }
		XBYTE[pointer] = temp;
		pointer++;

		while(1)				// 200407012 modify
		{
			sw1 = CARD2recvbyte();
			if(STATE_FLAG)
	               {
                         IC_RST2 = 0;
		         IC_IO2 = 0;
		         IC_PWR2 = 1;
		         CPU2_REST_FLAG = 0;
                        command = IFD_ICC_TypeError;return;}
			if(sw1 != 0x60) break;
			sPC60();
		}

		if(--pp3 == 0) break;
	}
        if( sw1==ins )      //1CF.012.01
        goto Rec2;
        sw2 = CARD2recvbyte();
	if(STATE_FLAG)
	{
        IC_RST2 = 0;
        IC_IO2 = 0;
	IC_PWR2 = 1;
	CPU2_REST_FLAG = 0;
        command = IFD_ICC_TypeError;
        return;
        }
        if(((sw1&0xf0)!=0x60)&&((sw1&0xf0)!=0x90))
        {
          IC_RST2 = 0;
          IC_IO2 = 0;
	  IC_PWR2 = 1;
	  CPU2_REST_FLAG = 0;
          command = IFD_ICC_TypeError;
          return;
                }
	XBYTE[pointer] = sw1;
	pointer++;
	XBYTE[pointer] = sw2;
	pointer ++;
	length = pointer;
	return;
      }
      Rec2:
	if(sw1 == ins)
	{
		do
		{
                Recv60_1:
			temp = CARD2recvbyte();
			if(STATE_FLAG)
		 	{
                        IC_RST2 = 0;
                        IC_IO2 = 0;
	                IC_PWR2 = 1;
	                CPU2_REST_FLAG = 0;
                        command = temp;return;}
                        if(temp==0x60)
                        {
                        sPC60();
                        goto Recv60_1;
                        }
			XBYTE[pointer] = temp;
                        if(pp3==0)
                         break;
			pointer++;
	          pp3--;
		}while(pp3);
	}
//	sw1 = CARDrecvbyte();
//	if(STATE_FLAG)
//   	{	command = sw1;return;}
	while(1)				// 200407012 modify
	{
		sw1 = CARD2recvbyte();
		if(STATE_FLAG)
               {
                   IC_RST2 = 0;
                   IC_IO2 = 0;
	           IC_PWR2 = 1;
	           CPU2_REST_FLAG = 0;
                   command = IFD_ICC_TypeError;return;}
                if(temp==0x90&&sw1==0x0)
               {
                  XBYTE[pointer]=sw1;
                  pointer++;
                  length = pointer;
                  return;
               }
		if(sw1 != 0x60) break;
		sPC60();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -