📄 xmodem.s
字号:
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 + -