📄 icccmd.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 + -