📄 sle4442.lst
字号:
0188 7D01 +1 188 MOV R5,#01H ;卡内密码首址
018A 7854 +1 189 MOV R0,#PSWD ;参考数据首址
018C +1 190 ChkPswLoop:
018C E6 +1 191 MOV A,@R0
018D FE +1 192 MOV R6,A
018E 120227 +1 193 LCALL Verda ;开始核对密码
0191 08 +1 194 INC R0
0192 0D +1 195 INC R5
0193 DAF7 +1 196 DJNZ R2, ChkPswLoop
0195 7D00 +1 197 MOV R5,#00H
0197 7EFF +1 198 MOV R6,#0FFH
0199 12022B +1 199 LCALL Wrscm ;擦除错误计数器
019C 120251 +1 200 LCALL Rescm ;读错误计数器以检查核对是否成功
019F E550 +1 201 MOV A,EC
01A1 5407 +1 202 ANL A,#07H
01A3 B40703 +1 203 CJNE A,#07H,IS_FAIL ;错误计数器不能擦除,核对密码失败
01A6 7400 +1 204 MOV A,#00H ;错误计数器正确擦除,核对密码成功
01A8 +1 205 CheckExit:
01A8 22 +1 206 RET
+1 207
+1 208
01A9 +1 209 IS_FAIL: ;核对密码失败
01A9 7402 +1 210 MOV A,#02H
01AB 22 +1 211 RET
01AC +1 212 IsBadCard:
01AC 7403 +1 213 MOV A,#03H ;卡已报废
01AE 22 +1 214 RET
01AF +1 215 HaveOneChance:
01AF 7404 +1 216 MOV A,#04H ;只剩下一次校验机会
01B1 22 +1 217 RET
+1 218
+1 219
+1 220 ;**************************************************
+1 221 ;函数名称: SendComm
+1 222 ;功能描述: 向卡发送命令,一个命令的长度为3个字节
+1 223 ;入口参数:R4 --- 控制字
+1 224 ; R5 --- 地址字
+1 225 ; R6 --- 数据字
+1 226 ;返回参数: 无
+1 227 ;***************************************************
01B2 +1 228 SendComm:
01B2 D290 +1 229 SETB IO ;产生开始状态
01B4 1202C4 +1 230 LCALL Delay10uS
01B7 D291 +1 231 SETB CLK
01B9 1202C9 +1 232 LCALL Delay5uS
01BC C290 +1 233 CLR IO
01BE 1202C9 +1 234 LCALL Delay5uS
01C1 C291 +1 235 CLR CLK
+1 236
01C3 EC +1 237 MOV A,R4
01C4 1201DF +1 238 LCALL SendByte ;发送控制字
01C7 ED +1 239 MOV A,R5
01C8 1201DF +1 240 LCALL SendByte ;发送地址字
01CB EE +1 241 MOV A,R6
01CC 1201DF +1 242 LCALL SendByte ;发送数据字
+1 243
01CF C290 +1 244 CLR IO ;产生停止状态
01D1 1202C9 +1 245 LCALL Delay5uS
01D4 D291 +1 246 SETB CLK
01D6 1202C9 +1 247 LCALL Delay5uS
01D9 D290 +1 248 SETB IO
01DB 1202C9 +1 249 LCALL Delay5uS
01DE 22 +1 250 RET
+1 251
+1 252
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 5
+1 253 ;**************************************************
+1 254 ;函数名称: SendByte
+1 255 ;功能描述: 向卡发送一个字节
+1 256 ;入口参数:A --- 要发送的字节
+1 257 ;返回参数: 无
+1 258 ;***************************************************
01DF +1 259 SendByte: ;发送一个字节数据
01DF 7B08 +1 260 MOV R3,#8 ;一个字节有8 bits
01E1 +1 261 SendLoop:
01E1 13 +1 262 RRC A
01E2 9290 +1 263 MOV IO,C ;每个循环发送1 bit
01E4 1202C4 +1 264 LCALL Delay10uS
01E7 D291 +1 265 SETB CLK
01E9 1202C4 +1 266 LCALL Delay10uS
01EC C291 +1 267 CLR CLK
01EE DBF1 +1 268 DJNZ R3,SendLoop
01F0 22 +1 269 RET
+1 270
+1 271
+1 272 ;**************************************************
+1 273 ;函数名称: Repm 和 Remm
+1 274 ;功能描述: 从保护存储器 或 从主存储器中读数据块
+1 275 ;入口参数:R2 --- 要求读的字节数
+1 276 ; R5 --- 保护存储器的起始地址(0 - 3)
+1 277 ; 或 主存储器的起始地址(0 - 255)
+1 278 ;返回数据: 从R0所指的数据缓冲区中输出
+1 279 ;***************************************************
01F1 +1 280 Repm: ;设置读保护存储器命令
01F1 7C34 +1 281 MOV R4,#34H
01F3 8002 +1 282 SJMP RmStart
01F5 +1 283 Remm: ;设置读主存储器命令
01F5 7C30 +1 284 MOV R4,#30H
01F7 +1 285 RmStart:
01F7 1201B2 +1 286 LCALL SendComm ;发送命令
01FA +1 287 RmLoop:
01FA E4 +1 288 CLR A
01FB 7B08 +1 289 MOV R3,#8
01FD +1 290 RmByte:
01FD C291 +1 291 CLR CLK
01FF 00 +1 292 NOP
0200 00 +1 293 NOP
0201 00 +1 294 NOP
0202 00 +1 295 NOP
0203 D290 +1 296 SETB IO
0205 00 +1 297 NOP
0206 A290 +1 298 MOV C,IO ;接收1 bit
0208 13 +1 299 RRC A
0209 00 +1 300 NOP
020A 00 +1 301 NOP
020B D291 +1 302 SETB CLK
020D 1202C4 +1 303 LCALL Delay10uS
0210 DBEB +1 304 DJNZ R3, RmByte ;判断是否接收完8 bits
0212 F6 +1 305 MOV @R0,A ;接收的数据存入缓冲区中
0213 08 +1 306 INC R0
0214 DAE4 +1 307 DJNZ R2, RmLoop ;判断是否接收完指定的字节
0216 12021A +1 308 LCALL Break ;中止操作
0219 22 +1 309 RET
+1 310
021A C291 +1 311 Break: CLR CLK ;中止操作
021C 1202C9 +1 312 LCALL Delay5uS
021F D292 +1 313 SETB RST
0221 1202C9 +1 314 LCALL Delay5uS
0224 C292 +1 315 CLR RST
0226 22 +1 316 RET
+1 317
+1 318 ;**************************************************
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 6
+1 319 ;函数名称: Verda
+1 320 ;功能描述: 输出数据模式的各种命令:
+1 321 ; Verda : 比较校验数据命令
+1 322 ; Wrscm : 修改加密存储器命令
+1 323 ; Wrpm: 修改保护存储器命令
+1 324 ; Wrmm: 修改 主存储器命令
+1 325 ;入口参数:无
+1 326 ;返回数据: 无
+1 327 ;***************************************************
0227 +1 328 Verda:
0227 7C33 +1 329 MOV R4,#33H ;设置比较校验数据命令
0229 800A +1 330 SJMP WrStart
022B +1 331 Wrscm:
022B 7C39 +1 332 MOV R4,#39H ;设置修改加密存储器命令
022D 8006 +1 333 SJMP WrStart
022F +1 334 Wrpm:
022F 7C3C +1 335 MOV R4,#3CH ;设置修改保护存储器命令
0231 8002 +1 336 SJMP WrStart
0233 +1 337 Wrmm:
0233 7C38 +1 338 MOV R4,#38H ;设置修改主存储器命令
0235 +1 339 WrStart:
0235 1201B2 +1 340 LCALL SendComm
0238 +1 341 WrmOption: ;下面为一个处理过程
0238 C291 +1 342 CLR CLK
023A 00 +1 343 NOP
023B 00 +1 344 NOP
023C 00 +1 345 NOP
023D 00 +1 346 NOP
023E D290 +1 347 SETB IO
0240 00 +1 348 NOP
0241 A290 +1 349 MOV C,IO
0243 400B +1 350 JC WrmOK ;如果 I/O 返回高状态,中止处理过程
0245 00 +1 351 NOP
0246 00 +1 352 NOP
0247 00 +1 353 NOP
0248 00 +1 354 NOP
0249 D291 +1 355 SETB CLK
024B 1202C4 +1 356 LCALL Delay10uS
024E 80E8 +1 357 SJMP WrmOption
0250 +1 358 WrmOK:
0250 22 +1 359 RET
+1 360
+1 361
+1 362 ;**************************************************
+1 363 ;函数名称: Rescm
+1 364 ;功能描述: 读加密存储器的四个字节
+1 365 ;入口参数:无
+1 366 ;返回数据: 加密存储器中的内容输出到EC所指的4字节缓冲区中
+1 367 ;***************************************************
0251 7C31 +1 368 Rescm: MOV R4,#31H ;设置读加密存储器命令
0253 1201B2 +1 369 LCALL SendComm ;发送读加密存储器命令
0256 7A04 +1 370 MOV R2,#4 ;读4 个字节
0258 7850 +1 371 MOV R0,#EC ;接收缓冲区
025A +1 372 rescm2:
025A 7B08 +1 373 MOV R3,#8 ;一个字节有8 bits,要接收8次
025C C291 +1 374 rescm1: CLR CLK
025E 00 +1 375 NOP
025F 00 +1 376 NOP
0260 00 +1 377 NOP
0261 00 +1 378 NOP
0262 D290 +1 379 SETB IO
0264 00 +1 380 NOP
0265 A290 +1 381 MOV C,IO ;接收1 bit
0267 13 +1 382 RRC A
0268 00 +1 383 NOP
0269 00 +1 384 NOP
A51 MACRO ASSEMBLER SLE4442 09/17/2004 11:09:32 PAGE 7
026A D291 +1 385 SETB CLK
026C 1202C4 +1 386 LCALL Delay10uS
026F DBEB +1 387 DJNZ R3,rescm1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -