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

📄 icccmd.lst

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 LST
字号:
C51 COMPILER V8.00   ICCCMD                                                                04/23/2009 15:56:16 PAGE 1   


C51 COMPILER V8.00, COMPILATION OF MODULE ICCCMD
OBJECT MODULE PLACED IN .\out_sst89e564\icccmd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\icccmd.c LARGE BROWSE ORDER NOAREGS DEBUG OBJECTEXTEND PRINT(.\icccm
                    -d.lst) OBJECT(.\out_sst89e564\icccmd.obj)

line level    source

   1                  /************************
   2           *    iccapp.c          *
   3           * Designe by 刘俐训    *
   4           * ic Card application  *
   5           * update: 2004.07.08   *
   6           ************************/
   7          #include <icc.h>
   8          #include <string.h>
   9          #include <icccmd.h>
  10          #include <uart.h>
  11          
  12          // #define DEBUGICCCMD
  13          
  14          int IccSendCmd(unsigned char *cmd, int len, unsigned char *rsp)
  15          {
  16   1          int i, j, k;
  17   1          unsigned char proc_char;
  18   1          unsigned char LC, LE;
  19   1          unsigned char tmp, tmp1, tmp2;   // 用于比较INS和过程字节的高7位
  20   1          unsigned char cmdstr[5];
  21   1      
  22   1          IccClear();           //清缓冲区。
  23   1          
  24   1          if(len < 4)
  25   1              return -1;
  26   1          else if(len == 4)
  27   1          {
  28   2              LC = 0;
  29   2              LE = 0;
  30   2          }
  31   1          else if(len == 5)
  32   1          {
  33   2              LC = 0;
  34   2              LE = cmd[4];
  35   2          }
  36   1          else // if(len > 5)
  37   1          {
  38   2              LC = cmd[4];
  39   2              if(len - LC == 5)
  40   2                  LE = 0;
  41   2              else // if(len - LC == 6)
  42   2                  LE = cmd[5+LC];
  43   2          }
  44   1          
  45   1          memcpy(cmdstr, cmd, 5);
  46   1      
  47   1      
  48   1      Startsend:
  49   1          j = 0;
  50   1          k = 0;
  51   1          tmp1 = cmdstr[1] & 0xfe;    // mask the lsb
  52   1          tmp2 = tmp1 | 0x01;
  53   1          i = IccWrite(cmdstr, 5);              /* send command head 5 bytes */
  54   1          if(i < 5)
C51 COMPILER V8.00   ICCCMD                                                                04/23/2009 15:56:16 PAGE 2   

  55   1              {
  56   2              #ifdef DEBUGICCCMD
                      ComWrite("\xff", 1);
                      #endif
  59   2      
  60   2              return -2;
  61   2              }
  62   1      
  63   1          
  64   1      Proc:
  65   1          i = IccRead(&proc_char, 1);             /* procedure byte */
  66   1          if(i < 1)
  67   1              {
  68   2              #ifdef DEBUGICCCMD
                      ComWrite("\xee", 1);
                      #endif
  71   2      
  72   2              return -2;
  73   2              }
  74   1              
  75   1          tmp = proc_char & 0xfe;     // mask the lsb
  76   1          if(tmp1 == tmp)             // tmp1: lsb = 0, INS = proc_char
  77   1          {
  78   2              // trans all left chars
  79   2              if(LC > 0)
  80   2              {
  81   3                  /* send lc */
  82   3                  i = IccWrite(cmd+5+j, LC);
  83   3                  if(i < LC)
  84   3                              {
  85   4                      #ifdef DEBUGICCCMD
                              ComWrite("\xdd", 1);
                              #endif
  88   4      
  89   4                              return -2;
  90   4                              }
  91   3                              
  92   3                              j += LC;
  93   3                              LC = 0;
  94   3                              goto Proc;
  95   3                      }
  96   2              
  97   2              if(LE > 0)
  98   2              {
  99   3                  i = IccRead(rsp+k, LE);          // get response.data
 100   3                  if(i < LE)
 101   3                      {
 102   4                      #ifdef DEBUGICCCMD
                              ComWrite("\xbb", 1);
                              #endif
 105   4          
 106   4                      return -2;
 107   4                      }
 108   3                      
 109   3                      k += LE;
 110   3              }
 111   2              
 112   2              goto Proc;
 113   2          }
 114   1          else if(tmp2 == ~tmp)       // tmp2: lsb = 1, INS = ~proc_char
 115   1          {
 116   2              // trans next char
C51 COMPILER V8.00   ICCCMD                                                                04/23/2009 15:56:16 PAGE 3   

 117   2              if(LC > 0)
 118   2              {
 119   3                  /* send lc */
 120   3                  i = IccWrite(cmd+5+j, 1);  
 121   3                  if(i < 1)
 122   3                              {
 123   4                      #ifdef DEBUGICCCMD
                              ComWrite("\xdc", 1);
                              #endif
 126   4      
 127   4                              return -2;
 128   4                              }
 129   3                              j ++;
 130   3                              LC --;
 131   3                              goto Proc;
 132   3                      }
 133   2                      
 134   2              
 135   2              if(LE > 0)
 136   2              {
 137   3                  i = IccRead(rsp+k, 1);          // get response.data
 138   3                  if(i < 1)
 139   3                      {
 140   4                      #ifdef DEBUGICCCMD
                              ComWrite("\xba", 1);
                              #endif
 143   4          
 144   4                      return -2;
 145   4                      }
 146   3                      
 147   3                      k ++;
 148   3                      LE --;
 149   3              }
 150   2                      
 151   2                      goto Proc;
 152   2          }
 153   1          else if(proc_char == 0x6c)                        /* incorect lenght P3 */
 154   1          {
 155   2              i = IccRead(&proc_char, 1);
 156   2              if(i < 1)
 157   2                      {
 158   3                  #ifdef DEBUGICCCMD
                          ComWrite("\x99", 1);
                          #endif
 161   3      
 162   3                      return -2;
 163   3                      }
 164   2              else
 165   2              {
 166   3                  cmdstr[4] = proc_char;
 167   3                  LE = proc_char;
 168   3                  goto Startsend;                 /* send again*/
 169   3              }
 170   2          }
 171   1          else if(proc_char == 0x60)
 172   1          {
 173   2              goto Proc;                          /* wait another proc byte */
 174   2          }
 175   1          else                                    /* sw1 and sw2 */
 176   1          {
 177   2              rsp[k++] = proc_char;
 178   2              i = IccRead(rsp+k, 1);
C51 COMPILER V8.00   ICCCMD                                                                04/23/2009 15:56:16 PAGE 4   

 179   2              if(i < 1)
 180   2                      {
 181   3                  #ifdef DEBUGICCCMD
                          ComWrite("\x88", 1);
                          #endif
 184   3      
 185   3                      return -2;
 186   3                      }
 187   2      
 188   2              if(proc_char == 0x61)
 189   2              {
 190   3                  cmdstr[0] = 0x00;               /* get response CLA */
 191   3                  cmdstr[1] = 0xc0;               /* get response INS */
 192   3                  cmdstr[2] = 0x00;               /* P1 */
 193   3                  cmdstr[3] = 0x00;               /* P2 */
 194   3                  LE = cmdstr[4] = rsp[k];        /* Le */
 195   3                  LC = 0;
 196   3                  
 197   3                  goto Startsend;                 /* get response */
 198   3              }
 199   2          }
 200   1      
 201   1          return k+1;                               /* command success */
 202   1      }
 203          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    816    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      23
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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