📄 mfrc50~1.s
字号:
; MInfo.cmd = PICC_ANTICOLL1; // pass command flag to ISR
ldi R24,147
sts _MInfo,R24
.dbline 133
; WriteRC(RegBitFraming,nbits); // reset RxAlign to zero
ldd R18,y+9
ldi R16,15
xcall _WriteRC
.dbline 134
; }
.dbline 135
; }
xjmp L39
L38:
.dbline 137
; else
; {
.dbline 138
; nbytes = bcnt / 8;
ldd R2,y+24
lsr R2
lsr R2
lsr R2
std y+8,R2
.dbline 139
; }
L39:
.dbline 140
; MSndBuffer[0] = select_code;
lds R30,_MSndBuffer
lds R31,_MSndBuffer+1
ldd R0,y+22
std z+0,R0
.dbline 141
; MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
ldd R24,y+24
lsr R24
lsr R24
lsr R24
andi R24,#0x0F
swap R24
subi R24,224 ; addi 32
ldd R0,y+9
add R24,R0
std z+1,R24
.dbline 142
; for (i = 0; i < nbytes; i++) // Sende Buffer beschreiben
clr R12
xjmp L45
L42:
.dbline 143
.dbline 144
movw R24,R28
adiw R24,4
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
lds R4,_MSndBuffer
lds R5,_MSndBuffer+1
mov R30,R12
clr R31
add R30,R4
adc R31,R5
std z+2,R2
.dbline 145
L43:
.dbline 142
inc R12
L45:
.dbline 142
ldd R0,y+8
cp R12,R0
brlo L42
.dbline 146
; {
; MSndBuffer[i + 2] = snr_in[i];
; }
; MInfo.nBytesToSend = 2 + nbytes;
mov R24,R0
subi R24,254 ; addi 2
sts _MInfo+4,R24
.dbline 147
; status = PcdSingleResponseCmd(0x1e,
ldi R24,<_MInfo
ldi R25,>_MInfo
std y+3,R25
std y+2,R24
lds R2,_MRcvBuffer
lds R3,_MRcvBuffer+1
std y+1,R3
std y+0,R2
lds R18,_MSndBuffer
lds R19,_MSndBuffer+1
ldi R16,30
xcall _PcdSingleResponseCmd
mov R2,R16
clr R3
std y+11,R3
std y+10,R2
.dbline 151
; MSndBuffer,
; MRcvBuffer,
; &MInfo);
; if (nbits == 7)
ldd R24,y+9
cpi R24,7
breq X6
xjmp L47
X6:
.dbline 152
; {
.dbline 153
; dummyShift1 = 0x00;
clr R20
.dbline 154
; for (i = 0; i < MInfo.nBytesReceived; i++)
clr R12
xjmp L52
L49:
.dbline 155
.dbline 156
lds R2,_MRcvBuffer
lds R3,_MRcvBuffer+1
mov R30,R12
clr R31
add R30,R2
adc R31,R3
ldd R14,z+0
.dbline 157
mov R4,R12
clr R5
add R4,R2
adc R5,R3
ldi R17,7
sub R17,R12
movw R30,R4
ldd R16,z+0
xcall lsl8
mov R2,R16
mov R17,R12
subi R17,255 ; addi 1
mov R16,R20
xcall lsr8
mov R3,R16
or R3,R2
movw R30,R4
std z+0,R3
.dbline 158
mov R20,R14
.dbline 159
L50:
.dbline 154
inc R12
L52:
.dbline 154
lds R2,_MInfo+5
cp R12,R2
brlo L49
.dbline 160
; {
; dummyShift2 = MRcvBuffer[i];
; MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
; dummyShift1 = dummyShift2;
; }
; MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
clr R3
lds R4,_MInfo+6
lds R5,_MInfo+6+1
sub R4,R2
sbc R5,R3
sts _MInfo+6+1,R5
sts _MInfo+6,R4
.dbline 161
; if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
lds R2,_MInfo+9
tst R2
breq L56
.dbline 161
ldi R17,9
mov R16,R2
subi R16,250 ; addi 6
xcall div8u
ldi R24,7
sub R24,R16
lds R2,_MInfo+9
add R2,R24
sts _MInfo+9,R2
L56:
.dbline 162
; }
L47:
.dbline 163
; if ( status == MI_OK || status == MI_COLLERR) // no other occured
ldd R0,y+10
ldd R1,y+11
tst R0
brne X2
tst R1
breq L63
X2:
ldd R24,y+10
ldd R25,y+11
cpi R24,232
ldi R30,255
cpc R25,R30
breq X7
xjmp L61
X7:
L63:
.dbline 164
; {
.dbline 165
; if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
ldd R2,y+24
clr R3
ldi R24,40
ldi R25,0
sub R24,R2
sbc R25,R3
lds R2,_MInfo+6
lds R3,_MInfo+6+1
cp R2,R24
cpc R3,R25
breq L64
.dbline 166
; {
.dbline 167
; status = MI_BITCOUNTERR;
ldi R24,-11
ldi R25,-1
std y+11,R25
std y+10,R24
.dbline 168
; }
xjmp L65
L64:
.dbline 170
; else
; {
.dbline 171
; byteOffset = 0;
clr R22
.dbline 172
; if ( nbits != 0 ) // last byte was not complete
ldd R0,y+9
tst R0
breq L67
.dbline 173
; {
.dbline 174
; snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
movw R24,R28
adiw R24,3
ldd R30,y+8
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
lds R30,_MRcvBuffer
lds R31,_MRcvBuffer+1
ldd R3,z+0
or R2,R3
movw R24,R28
adiw R24,3
ldd R30,y+8
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 175
; byteOffset = 1;
ldi R22,1
.dbline 176
; }
L67:
.dbline 177
; for ( i =0; i < (4 - nbytes); i++)
clr R12
xjmp L74
L71:
.dbline 178
.dbline 179
mov R2,R22
clr R3
mov R30,R12
clr R31
add R30,R2
adc R31,R3
lds R2,_MRcvBuffer
lds R3,_MRcvBuffer+1
add R30,R2
adc R31,R3
ldd R2,z+0
mov R3,R12
clr R4
ldd R30,y+8
clr R31
add R30,R3
adc R31,R4
movw R24,R28
adiw R24,4
add R30,R24
adc R31,R25
std z+0,R2
.dbline 180
L72:
.dbline 177
inc R12
L74:
.dbline 177
ldi R24,4
ldd R0,y+8
sub R24,R0
cp R12,R24
brlo L71
.dbline 181
; {
; snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
; }
; if (status != MI_COLLERR ) // no error and no collision
ldd R24,y+10
ldd R25,y+11
cpi R24,232
ldi R30,255
cpc R25,R30
breq L75
.dbline 182
; {
.dbline 183
; snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
ldd R2,y+5
ldd R20,y+4
eor R20,R2
ldd R2,y+6
eor R20,R2
ldd R2,y+7
eor R20,R2
.dbline 184
; snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
lds R2,_MRcvBuffer
lds R3,_MRcvBuffer+1
lds R30,_MInfo+5
clr R31
sbiw R30,1
add R30,R2
adc R31,R3
ldd R14,z+0
.dbline 185
; if (snr_crc != snr_check)
cp R20,R14
breq L81
.dbline 186
; {
.dbline 187
; status = MI_SERNRERR;
ldi R24,-8
ldi R25,-1
std y+11,R25
std y+10,R24
.dbline 188
; }
xjmp L76
L81:
.dbline 190
; else
; {
.dbline 191
; complete = 1;
clr R10
inc R10
.dbline 192
; }
.dbline 193
; }
xjmp L76
L75:
.dbline 195
; else // collision occured
; {
.dbline 196
; bcnt = bcnt + MInfo.collPos - nbits;
lds R2,_MInfo+9
ldd R3,y+24
add R3,R2
ldd R0,y+9
sub R3,R0
std y+24,R3
.dbline 197
; status = MI_OK;
clr R0
clr R1
std y+11,R1
std y+10,R0
.dbline 198
; }
L76:
.dbline 199
; }
L65:
.dbline 200
; }
L61:
.dbline 201
L29:
.dbline 121
tst R10
brne L84
ldd R0,y+10
ldd R1,y+11
tst R0
brne X3
tst R1
brne X8
xjmp L28
X8:
X3:
L84:
.dbline 202
; }
; }
L26:
.dbline 203
; if (status == MI_OK)
ldd R0,y+10
ldd R1,y+11
tst R0
brne L85
tst R1
brne L85
X4:
.dbline 204
; {
.dbline 205
; memcpy(snr,snr_in,4);
ldi R24,4
ldi R25,0
std y+1,R25
std y+0,R24
movw R18,R28
subi R18,252 ; offset = 4
sbci R19,255
ldd R16,y+26
ldd R17,y+27
xcall _memcpy
.dbline 206
; }
L85:
.dbline 208
; else
; {
.dbline 210
; // memcpy(snr,"0000",4);
; ;
.dbline 211
; }
L86:
.dbline 212
; ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
ldi R18,32
ldi R16,26
xcall _ClearBitMask
.dbline 213
; return status;
ldd R16,y+10
ldd R17,y+11
.dbline -2
L25:
adiw R28,12
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r snr_check 14 c
.dbsym r snr_crc 20 c
.dbsym r complete 10 c
.dbsym r byteOffset 22 c
.dbsym l status 10 I
.dbsym l nbits 9 c
.dbsym r dummyShift2 14 c
.dbsym r dummyShift1 20 c
.dbsym l snr_in 4 A[4:4]c
.dbsym l nbytes 8 c
.dbsym r i 12 c
.dbsym l snr 26 pc
.dbsym l bcnt 24 c
.dbsym l select_code 22 c
.dbend
.dbfunc e Mf500PiccSelect _Mf500PiccSelect fc
; sak -> R22,R23
; snr -> R20,R21
.even
_Mf500PiccSelect::
xcall push_gset2
movw R22,R18
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 216
; }
; char Mf500PiccSelect(unsigned char *snr,unsigned char *sak)
; {
.dbline 217
; return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
std y+1,R23
std y+0,R22
movw R18,R20
ldi R16,147
xcall _Mf500PiccCascSelect
.dbline -2
L87:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r sak 22 pc
.dbsym r snr 20 pc
.dbend
.dbfunc e Mf500PiccCascSelect _Mf500PiccCascSelect fc
; status -> R20,R21
; sak -> y+10
; snr -> R22,R23
; select_code -> R10
.even
_Mf500PiccCascSelect::
xcall push_gset3
movw R22,R18
mov R10,R16
sbiw R28,4
.dbline -1
.dbline 221
; }
;
; char Mf500PiccCascSelect(unsigned char select_code,unsigned char *snr,unsigned char *sak)
; {
.dbline 222
; int status = MI_OK;
clr R20
clr R21
.dbline 223
; if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
xcall _Mf500PcdSetDefaultAttrib
mov R2,R16
clr R3
movw R20,R2
tst R16
breq X10
xjmp L89
X10:
.dbline 224
; {
.dbline 225
; PcdSetTmo(106);
ldi R16,106
ldi R17,0
xcall _PcdSetTmo
.dbline 226
; WriteRC(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
ldi R18,15
ldi R16,34
xcall _WriteRC
.dbline 227
; ClearBitMask(RegControl,0x08); // disable crypto 1 unit
ldi R18,8
ldi R16,9
xcall _ClearBitMask
.dbline 229
; //************* Cmd Sequence **********************************
; ResetInfo(MInfo);
clr R2
sts _MInfo,R2
.dbline 229
clr R3
sts _MInfo+1+1,R3
sts _MInfo+1,R2
.dbline 229
sts _MInfo+3,R2
.dbline 229
sts _MInfo+4,R2
.dbline 229
sts _MInfo+5,R2
.dbline 229
sts _MInfo+6+1,R3
sts _MInfo+6,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -