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

📄 mfrc50~1.s

📁 该程序是医院用的CPCR记录仪的终端控制程序
💻 S
📖 第 1 页 / 共 3 页
字号:
;                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 + -