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

📄 xmodem.s

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 S
📖 第 1 页 / 共 4 页
字号:
	ldi R16,1
	.dbline -2
L29:
	.dbline 0 ; func end
	adiw R28,63
	adiw R28,63
	adiw R28,8  ; offset = 134
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r no_more 10 c
	.dbsym l Xmodem_Pack22 1 S[Message]
	.dbsym r packet_number 20 c
	.dbsym r temp_char 10 c
	.dbsym l j 132 i
	.dbsym r xModem 22 pS[Message]
	.dbsym r i 12 i
	.dbsym l LEN 146 i
	.dbsym l User_Data 144 pkc
	.dbend
	.dbfunc e tx_EOT _tx_EOT fc
;           temp -> R22
;        attempt -> R20
	.even
_tx_EOT::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 158
; }
; uchar tx_EOT(void)
; {
	.dbline 162
;     uchar attempt;
; 	unsigned char temp;
; 
;     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
	ldi R20,1
	xjmp L75
L72:
	.dbline 163
;     {
	.dbline 164
;         send_a_byte(EOT);
	ldi R16,4
	xcall _send_a_byte
	.dbline 166
; 		// send file end
; 		Delay(1);
	ldi R16,1
	ldi R17,0
	xcall _Delay
	.dbline 167
; 		temp=temp_char0;
	lds R22,_temp_char0
	.dbline 168
;         if(temp == ACK)
	cpi R22,6
	brne L76
X27:
	.dbline 169
;            return 1;       // file end acknowledged  接收方返因ACK信号
	ldi R16,1
	xjmp L71
L76:
	.dbline 170
;     }
L73:
	.dbline 162
	inc R20
L75:
	.dbline 162
	ldi R24,3
	cp R24,R20
	brsh L72
X28:
	.dbline 171
;     return 0;               // file tx failed
	clr R16
	.dbline -2
L71:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r temp 22 c
	.dbsym r attempt 20 c
	.dbend
	.dbfunc e update_CRC _update_CRC fi
;       checksum -> R18,R19
;         inData -> R16
	.even
_update_CRC::
	.dbline -1
	.dbline 175
; }
; 
; uint update_CRC(uchar inData, uint checksum)
; {
	.dbline 176
;     return  ((checksum << 8) ^ crc16_table[ (checksum >> 8) ^ inData ]);
	mov R2,R16
	clr R3
	movw R30,R18
	mov R30,R31
	clr R31
	eor R30,R2
	eor R31,R3
	lsl R30
	rol R31
	ldi R24,<_crc16_table
	ldi R25,>_crc16_table
	add R30,R24
	adc R31,R25
	lpm R2,Z+
	lpm R3,Z
	movw R16,R18
	mov R17,R16
	clr R16
	eor R16,R2
	eor R17,R3
	.dbline -2
L78:
	.dbline 0 ; func end
	ret
	.dbsym r checksum 18 i
	.dbsym r inData 16 c
	.dbend
	.dbfunc e memcmp_self _memcmp_self fc
;              i -> R10
;          lenth -> y+1
;        string2 -> R18,R19
;        string1 -> R16,R17
	.even
_memcmp_self::
	st -y,R10
	.dbline -1
	.dbline 180
; }
; 
; char memcmp_self(char const *string1, char const *string2 ,unsigned int lenth)
; {
	.dbline 182
;     uchar i;
;     for(i = 0; i<lenth; i++)
	clr R10
	xjmp L83
L80:
	.dbline 183
;     {
	.dbline 184
;          if(*string1 != *string2)
	movw R30,R18
	lpm R2,Z
	movw R30,R16
	lpm R3,Z
	cp R3,R2
	breq L84
X29:
	.dbline 185
;              return 0;
	clr R16
	xjmp L79
L84:
	.dbline 186
;          string1++;
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 187
;          string2++;
	subi R18,255  ; offset = 1
	sbci R19,255
	.dbline 188
;     }
L81:
	.dbline 182
	inc R10
L83:
	.dbline 182
	mov R2,R10
	clr R3
	ldd R0,y+1
	ldd R1,y+2
	cp R2,R0
	cpc R3,R1
	brlo L80
X30:
	.dbline 189
;     return 1;
	ldi R16,1
	.dbline -2
L79:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym l lenth 1 i
	.dbsym r string2 18 pkc
	.dbsym r string1 16 pkc
	.dbend
	.dbfunc e do_serial_data _do_serial_data fV
;          lenth -> R20,R21
	.even
_do_serial_data::
	xcall push_xgset300C
	movw R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 193
; }
; 
; void do_serial_data(int lenth)
; {
	.dbline 194
; 	switch (lenth)
	cpi R20,0
	cpc R20,R21
	brne X46
	xjmp L88
X46:
X31:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	brne X47
	xjmp L88
X47:
X32:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	brne X48
	xjmp L88
X48:
X33:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L92
X34:
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brne X49
	xjmp L88
X49:
X35:
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L96
X36:
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brne X50
	xjmp L88
X50:
X37:
	cpi R20,7
	ldi R30,0
	cpc R21,R30
	brne X51
	xjmp L88
X51:
X38:
	cpi R20,8
	ldi R30,0
	cpc R21,R30
	brne X52
	xjmp L88
X52:
X39:
	cpi R20,12
	ldi R30,0
	cpc R21,R30
	breq L102
X40:
	cpi R20,19
	ldi R30,0
	cpc R21,R30
	breq L105
X41:
	xjmp L88
L92:
	.dbline 204
; 	{
; 		case 0:
; 				break;
; 		case 1:
; 				break;
; 		case 2:
; 				
; 				break;
; 		case 3:
; 			 if(memcmp_self(receive_data, DATA_OK,2)==0 )                //检测是否收到 OK
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	lds R18,_DATA_OK
	lds R19,_DATA_OK+1
	ldi R16,<_receive_data
	ldi R17,>_receive_data
	xcall _memcmp_self
	tst R16
	brne L88
X42:
	.dbline 205
; 					receive_OK = 1;
	ldi R24,1
	sts _receive_OK,R24
	.dbline 206
; 				break;
	xjmp L88
L96:
	.dbline 210
; 		case 4:
; 				break;
; 		case 5:
;                 if(memcmp_self(receive_data, DATA_ERROR, 5))             //检测是否收到 ERROR
	ldi R24,5
	ldi R25,0
	std y+1,R25
	std y+0,R24
	lds R18,_DATA_ERROR
	lds R19,_DATA_ERROR+1
	ldi R16,<_receive_data
	ldi R17,>_receive_data
	xcall _memcmp_self
	tst R16
	breq L88
X43:
	.dbline 211
;                     receive_ERROR = 1;
	ldi R24,1
	sts _receive_ERROR,R24
	.dbline 212
; 				break;
	xjmp L88
L102:
	.dbline 220
; 		case 6:
; 				break;
; 		case 7:
; 				break;
; 		case 8:
; 				break;
; 		case 12:
; 				if(memcmp_self(receive_data,DATA_DOWNFINEOK,12))                 //检测是否收到 Ok_Info_FileUploadStarted
	ldi R24,12
	ldi R25,0
	std y+1,R25
	std y+0,R24
	lds R18,_DATA_DOWNFINEOK
	lds R19,_DATA_DOWNFINEOK+1
	ldi R16,<_receive_data
	ldi R17,>_receive_data
	xcall _memcmp_self
	mov R10,R16
	tst R16
	breq L88
X44:
	.dbline 221
;                      receive_DOWNFINEOK = 1;
	ldi R24,1
	sts _receive_DOWNFINEOK,R24
	.dbline 222
; 				break;		
	xjmp L88
L105:
	.dbline 224
; 		case 19:
;                if(memcmp_self(receive_data,DATA_DOWNFINE,19))                 //检测是否收到 Ok_Info_FileUploadStarted
	ldi R24,19
	ldi R25,0
	std y+1,R25
	std y+0,R24
	lds R18,_DATA_DOWNFINE
	lds R19,_DATA_DOWNFINE+1
	ldi R16,<_receive_data
	ldi R17,>_receive_data
	xcall _memcmp_self
	mov R10,R16
	tst R16
	breq L88
X45:
	.dbline 225
;                      receive_DOWNFINE = 1;
	ldi R24,1
	sts _receive_DOWNFINE,R24
	.dbline 226
; 				break;
	.dbline 228
; 		default:
; 				break;
L88:
	.dbline -2
L86:
	.dbline 0 ; func end
	adiw R28,2
	xjmp pop_xgset300C
	.dbsym r lenth 20 I
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R20
;       Delay_MS -> R16,R17
	.even
_Delay::
	st -y,R20
	.dbline -1
	.dbline 233
; 	}
; }
; 
; void Delay(unsigned int Delay_MS)
; {
	xjmp L110
L109:
	.dbline 236
;         unsigned char i;
; 	while(Delay_MS--)
; 	{
	.dbline 237
; 	   for(i=0;i<111;i++);
	clr R20
	xjmp L115
L112:
	.dbline 237
L113:
	.dbline 237
	inc R20
L115:
	.dbline 237
	cpi R20,111
	brlo L112
X53:
	.dbline 238
; 	}
L110:
	.dbline 235
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L109
	tst R3
	brne L109
X54:
	.dbline -2
L108:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbsym r Delay_MS 16 i
	.dbend
	.dbfunc e Xmodem _Xmodem fV
;           temp -> R20
;              i -> R20,R21
	.even
_Xmodem::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 242
; }
; 
; void Xmodem(void)
; {	 int i;
	.dbline 244
; 	 uchar temp;
; 	pic = test_pic1;
	ldi R24,<_test_pic1
	ldi R25,>_test_pic1
	sts _pic+1,R25
	sts _pic,R24
	.dbline 245
; 	for (i = 1; i < 65530; i++)
	ldi R20,1
	ldi R21,0
	xjmp L120
L117:
	.dbline 246
; 	{
	.dbline 247
; 		if((*(pic-1) == 0xff) &&((*pic) == 0xd9))
	lds R2,_pic
	lds R3,_pic+1
	movw R30,R2
	sbiw R30,1
	lpm R24,Z
	cpi R24,255
	brne L121
X55:
	movw R30,R2
	lpm R24,Z
	cpi R24,217
	brne L121
X56:
	.dbline 248
; 		{
	.dbline 249
; 			break;
	xjmp L119
L121:
	.dbline 251
; 		}
;         	pic++;
	lds R24,_pic
	lds R25,_pic+1
	adiw R24,1
	sts _pic+1,R25
	sts _pic,R24
	.dbline 252
; 	}
L118:
	.dbline 245
	subi R20,255  ; offset = 1
	sbci R21,255
L120:
	.dbline 245
	ldi R24,250
	ldi R25,255
	ldi R26,0
	ldi R27,0
	movw R2,R20
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brlt L117
X57:
L119:
	.dbline 253
;     picLenth = i;
	sts _picLenth+1,R21
	sts _picLenth,R20
	.dbline 254
; 	temp = 1;
	ldi R20,1
	xjmp L124
L123:
	.dbline 256
; 	while(1)
; 	{
	.dbline 257
; 	    if(temp == 1)
	cpi R20,1
	breq X65
	xjmp L126
X65:
X58:
	.dbline 258
; 		{
	.dbline 259
; 			temp = 0;
	clr R20
	.dbline 260
;             receive_OK = 0;
	clr R2
	sts _receive_OK,R2
	.dbline 261
;             receive_ERROR = 0;  //删除旧图片
	sts _receive_ERROR,R2
	.dbline 262
;             send_m_byte("at$fdel=\"*\"\r\n",13);
	ldi R18,13
	ldi R19,0
	ldi R16,<L128
	ldi R17,>L128
	xcall _send_m_byte
L129:
	.dbline 263
;             while((receive_OK == 0) && (receive_ERROR == 0)) ;
L130:
	.dbline 263
	lds R2,_receive_OK
	tst R2
	brne L132
X59:
	lds R2,_receive_ERROR
	tst R2
	breq L129
X60:
L132:
	.dbline 264
; 			Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 265
;             receive_ERROR  = 0;
	clr R2
	sts _receive_ERROR,R2
	.dbline 266
;             receive_DOWNFINE = 0;
	sts _receive_DOWNFINE,R2
	.dbline 267
; 			send_m_byte("at$fupl=\"test.jpg\"\r\n",21);        //下载图片
	ldi R18,21
	ldi R19,0
	ldi R16,<L133
	ldi R17,>L133
	xcall _send_m_byte
	xjmp L135
L134:
	.dbline 269
;             while (1)
;             {
	.dbline 270
;                 if(receive_DOWNFINE == 1)              //测试是否收到  Ok_Info_FileUploadStarted
	lds R24,_receive_DOWNFINE
	cpi R24,1
	brne L137
X61:
	.dbline 271
;                 {
	.dbline 272
;                     ;
	.dbline 273
;                     break;
	xjmp L136
L137:
	.dbline 275
;                 }
;                 if(receive_ERROR == 1)                 //测试是否收到  ERROR
	lds R24,_receive_ERROR
	cpi R24,1
	brne L139
X62:
	.dbline 276
;                 {
	.dbline 277
;                     ;
	.dbline 278
;                     break;
	xjmp L136
L139:
	.dbline 280
;                 }
;             }
L135:
	.dbline 268
	xjmp L134
L136:
	.dbline 281
;             receive_C = 0;  
	clr R2
	sts _receive_C,R2
L141:
	.dbline 283
; 			                           //测试是否收到  C
;             while (receive_C == 0);			
L142:
	.dbline 283
	lds R2,_receive_C
	tst R2
	breq L141
X63:
	.dbline 284
; 		    xmodedata = send_packet_data(test_pic1,picLenth);
	lds R18,_picLenth
	lds R19,_picLenth+1
	ldi R16,<_test_pic1
	ldi R17,>_test_pic1
	xcall _send_packet_data
	sts _xmodedata,R16
	.dbline 285
; 		}
L126:
	.dbline 286
; 	}
L124:
	.dbline 255
	xjmp L123
X64:
	.dbline -2
L116:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r temp 20 c
	.dbsym r i 20 I
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
_picLenth::
	.blkb 2
	.dbsym e picLenth _picLenth i
_xmodedata::
	.blkb 1
	.dbsym e xmodedata _xmodedata c
_pic::
	.blkb 2
	.dbsym e pic _pic pkc
_sending::
	.blkb 1
	.dbsym e sending _sending c
_receive_RING::
	.blkb 1
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
	.dbsym e receive_RING _receive_RING c
_receive_MMSTRACE::
	.blkb 1
	.dbsym e receive_MMSTRACE _receive_MMSTRACE c
_receive_ERROR::
	.blkb 1
	.dbsym e receive_ERROR _receive_ERROR c
_receive_DOWNFINEOK::
	.blkb 1
	.dbsym e receive_DOWNFINEOK _receive_DOWNFINEOK c
_receive_DOWNFINE::
	.blkb 1
	.dbsym e receive_DOWNFINE _receive_DOWNFINE c
_receive_DAYUHAO::
	.blkb 1
	.dbsym e receive_DAYUHAO _receive_DAYUHAO c
_receive_C::
	.blkb 1
	.dbsym e receive_C _receive_C c
_receive_other::
	.blkb 1
	.dbsym e receive_other _receive_other c
_receive_OK::
	.blkb 1
	.dbsym e receive_OK _receive_OK c
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L133:
	.blkb 21
	.area idata
	.byte 'a,'t,36,'f,'u,'p,'l,61,34,'t,'e,'s,'t,46,'j,'p
	.byte 'g,34,13,10,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L128:
	.blkb 14
	.area idata
	.byte 'a,'t,36,'f,'d,'e,'l,61,34,42,34,13,10,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L7:
	.blkb 5
	.area idata
	.byte 'R,'I,'N,'G,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L6:
	.blkb 13
	.area idata
	.byte 36,'M,'M,'S,'T,'R,'A,'C,'E,58,32,49,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L5:
	.blkb 18
	.area idata
	.byte 'O,'k,95,'I,'n,'f,'o,95,'F,'i,'l,'e,'C,'l,'o,'s
	.byte 'e,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L4:
	.blkb 6
	.area idata
	.byte 'E,'R,'R,'O,'R,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L3:
	.blkb 26
	.area idata
	.byte 'O,'k,95,'I,'n,'f,'o,95,'F,'i,'l,'e,'U,'p,'l,'o
	.byte 'a,'d,'S,'t,'a,'r,'t,'e,'d,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L2:
	.blkb 3
	.area idata
	.byte 'O,'K,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
L1:
	.blkb 4
	.area idata
	.byte 'a,'t,36,0
	.area data(ram, con, rel)
	.dbfile E:\GPRS资料\M16_Xmodem\xmodem.h
; 
; }

⌨️ 快捷键说明

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