📄 m16_xmodem.s
字号:
;
; void send_a_byte( unsigned char data )
; {
L53:
.dbline 268
; /* 等待发送缓冲器为空 */
; while ( !( UCSRA & (1<<UDRE)) )
; ;
L54:
.dbline 267
sbis 0xb,5
rjmp L53
X16:
.dbline 270
; /* 将数据放入缓冲器,发送数据 */
; UDR = data;
out 0xc,R16
.dbline -2
L52:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e send_m_byte _send_m_byte fV
; i -> R20,R21
; length -> R10,R11
; string -> R12,R13
.even
_send_m_byte::
xcall push_xgset303C
movw R10,R18
movw R12,R16
.dbline -1
.dbline 282
; }
; /*unsigned char USART_Receive( void )
; {
; //等待接收数据
; while ( !(UCSRA & (1<<RXC)) )
; ;
; // 从缓冲器中获取并返回数据
; return UDR;
; }*/
;
; void send_m_byte(uchar *string, uint length)
; {
.dbline 284
; uint i; //发送多字节
; for(i = 0; i< length; i++)
clr R20
clr R21
xjmp L60
L57:
.dbline 285
; {
.dbline 286
; send_a_byte(string[i]);
movw R30,R20
add R30,R12
adc R31,R13
ldd R16,z+0
xcall _send_a_byte
.dbline 287
; }
L58:
.dbline 284
subi R20,255 ; offset = 1
sbci R21,255
L60:
.dbline 284
cp R20,R10
cpc R21,R11
brlo L57
X17:
.dbline -2
L56:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r i 20 i
.dbsym r length 10 i
.dbsym r string 12 pc
.dbend
.dbfunc e xModemSend _xModemSend fc
; length -> R18,R19
; temp_data -> R16,R17
.even
_xModemSend::
.dbline -1
.dbline 291
; }
;
; uchar xModemSend(uchar *temp_data, uint length)
; {
.dbline 292
; *temp_data = 0;
clr R2
movw R30,R16
std z+0,R2
.dbline 293
; length = 0;
clr R18
clr R19
.dbline 294
; return 0;
clr R16
.dbline -2
L61:
.dbline 0 ; func end
ret
.dbsym r length 18 i
.dbsym r temp_data 16 pc
.dbend
.dbfunc e tx_packet _tx_packet fc
; attempt -> R22
; checksum -> R14,R15
; buffer_index -> R12
; temp_char -> R20
; packet_data_buffer -> R10,R11
; packet_number -> y+10
.even
_tx_packet::
xcall push_arg4
xcall push_xgsetF0FC
movw R10,R18
ldd R20,y+14
.dbline -1
.dbline 300
; }
;
;
; // 信息包序号 包里面的数据 收接收方反回来的信息
; uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
; {
.dbline 304
; uchar attempt;
; uint checksum;
; uchar buffer_index;
; for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
ldi R22,1
xjmp L66
L63:
.dbline 305
; {
.dbline 306
; checksum= 0; //校验和为0
clr R14
clr R15
.dbline 307
; send_a_byte(SOH); // send start of packet(sending标志中断发送)
ldi R16,1
xcall _send_a_byte
.dbline 308
; send_a_byte(packet_number); //发送信息包序号
ldd R16,y+10
xcall _send_a_byte
.dbline 309
; send_a_byte(255 - packet_number); //发送信息包序号的补码
ldd R2,y+10
clr R3
ldi R16,255
sub R16,R2
sbc R17,R3
xcall _send_a_byte
.dbline 311
; //以下为发送数据
; for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
clr R12
xjmp L70
L67:
.dbline 312
; {
.dbline 313
; send_a_byte(packet_data_buffer[buffer_index]); //发送128个字节
mov R30,R12
clr R31
add R30,R10
adc R31,R11
ldd R16,z+0
xcall _send_a_byte
.dbline 314
; if (temp_char == NAK) //接收方返回NAK则发送方要得传
cpi R20,21
brne L71
X18:
.dbline 315
; checksum += packet_data_buffer[buffer_index]; //计算校验和
mov R30,R12
clr R31
add R30,R10
adc R31,R11
ldd R2,z+0
clr R3
add R14,R2
adc R15,R3
xjmp L72
L71:
.dbline 317
; else
; checksum = update_CRC(packet_data_buffer[buffer_index], checksum); //CRC校验和
movw R18,R14
mov R30,R12
clr R31
add R30,R10
adc R31,R11
ldd R16,z+0
xcall _update_CRC
movw R14,R16
L72:
.dbline 318
; }
L68:
.dbline 311
inc R12
L70:
.dbline 311
mov R24,R12
cpi R24,128
brlo L67
X19:
.dbline 319
; if (temp_char == ASCII_C) //如果收到C
cpi R20,67
brne L73
X20:
.dbline 320
; { send_a_byte((uchar)((checksum>>8) & 0x00ff));
.dbline 320
movw R16,R14
mov R16,R17
clr R17
andi R17,0
xcall _send_a_byte
.dbline 321
; send_a_byte((uchar)(checksum & 0x00ff));
mov R16,R14
andi R17,0
xcall _send_a_byte
.dbline 322
; } // send end of packet CRC
L73:
.dbline 323
; temp_char0=0;
clr R2
sts _temp_char0,R2
L75:
.dbline 324
; while(temp_char0 == 0);
L76:
.dbline 324
lds R2,_temp_char0
tst R2
breq L75
X21:
.dbline 325
; temp_char =temp_char0; // get receiver response
mov R20,R2
.dbline 327
;
; if (temp_char == CAN)
cpi R20,24
brne L78
X22:
.dbline 328
; return 0; // reception cancelled
clr R16
xjmp L62
L78:
.dbline 329
; if (temp_char == ACK)
cpi R20,6
brne L80
X23:
.dbline 330
; return 1; // packet received okay
ldi R16,1
xjmp L62
L80:
.dbline 331
; }
L64:
.dbline 304
inc R22
L66:
.dbline 304
ldi R24,3
cp R24,R22
brlo X25
xjmp L63
X25:
X24:
.dbline 332
; return 0; // attempts exhausted
clr R16
.dbline -2
L62:
.dbline 0 ; func end
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r attempt 22 c
.dbsym r checksum 14 i
.dbsym r buffer_index 12 c
.dbsym r temp_char 20 c
.dbsym r packet_data_buffer 10 pc
.dbsym l packet_number 10 c
.dbend
.dbfunc e send_packet_data _send_packet_data fc
.dbstruct 0 131 Message
.dbfield 0 Data_Len c
.dbfield 1 Message A[128:128]c
.dbfield 129 User_Data i
.dbend
; no_more -> R10
; Xmodem_Pack22 -> y+1
; packet_number -> R20
; temp_char -> R10
; j -> y+132
; xModem -> R22,R23
; i -> R12,R13
; LEN -> y+146
; User_Data -> y+144
.even
_send_packet_data::
xcall push_arg4
xcall push_xgsetF0FC
sbiw R28,63
sbiw R28,63
sbiw R28,8 ; offset = 134
.dbline -1
.dbline 345
; }
;
; /*
; function: 以XMODEM 发送数据
; in: user_data 是数据指针
; out: 1 sucess
; o faile
; 使用全局变量? 无
;
; */
;
; uchar send_packet_data(uchar const *User_Data , uint LEN)
; {
.dbline 349
; struct Message Xmodem_Pack22;
; struct Message *xModem;
;
; uint i,j=0;
clr R0
clr R1
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
std z+1,R1
std z+0,R0
.dbline 350
; unsigned char packet_number = 1;
ldi R20,1
.dbline 351
; unsigned char no_more = 0;
clr R10
.dbline 352
; unsigned char temp_char = 0;
.dbline 353
; xModem=&Xmodem_Pack22;
movw R22,R28
subi R22,255 ; offset = 1
sbci R23,255
.dbline 354
; xModem->User_Data=0;
clr R2
clr R3
movw R30,R22
subi R30,127 ; addi 129
sbci R31,255
std z+1,R3
std z+0,R2
xjmp L84
L83:
.dbline 358
; // xModem->User_Data=User_Data;
; //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
; while((temp_char != ASCII_C) && (temp_char != NAK))
; {
.dbline 359
; temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
lds R10,_temp_char0
.dbline 360
; if(temp_char == CAN)
mov R24,R10
cpi R24,24
brne L86
X26:
.dbline 361
; return 0;
clr R16
xjmp L82
L86:
.dbline 362
; }
L84:
.dbline 357
mov R24,R10
cpi R24,67
breq L88
X27:
cpi R24,21
brne L83
X28:
L88:
.dbline 364
;
; if (LEN < PACKET_DATA_BUFFER_LENGTH) // 数据区段的长度固定为 128 字节
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
ldd R24,z+0
ldd R25,z+1
cpi R24,128
ldi R30,0
cpc R25,R30
brlo X41
xjmp L89
X41:
X29:
.dbline 365
; {
.dbline 366
; for(i=0;i<LEN;i++)
clr R12
clr R13
xjmp L94
L91:
.dbline 367
; xModem->Message[i]=(User_Data[j++]);
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
ldd R2,z+0
ldd R3,z+1
movw R24,R2
adiw R24,1
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
std z+1,R25
std z+0,R24
movw R30,R2
movw R26,R28
subi R26,112 ; addi 144
sbci R27,255
ld R0,x+
ld R1,x
add R30,R0
adc R31,R1
lpm R2,Z
movw R24,R22
adiw R24,1
movw R30,R12
add R30,R24
adc R31,R25
std z+0,R2
L92:
.dbline 366
movw R24,R12
adiw R24,1
movw R12,R24
L94:
.dbline 366
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
ldd R0,z+0
ldd R1,z+1
cp R12,R0
cpc R13,R1
brlo L91
X30:
.dbline 368
; for(i=LEN;i<128;i++)
movw R12,R0
xjmp L98
L95:
.dbline 369
; xModem->Message[i]=CTRL_Z;
movw R24,R22
adiw R24,1
movw R30,R12
add R30,R24
adc R31,R25
ldi R24,26
std z+0,R24
L96:
.dbline 368
movw R24,R12
adiw R24,1
movw R12,R24
L98:
.dbline 368
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L95
X31:
.dbline 370
; if(tx_packet(packet_number, xModem->Message, temp_char)==0)
std y+0,R10
movw R18,R22
subi R18,255 ; offset = 1
sbci R19,255
mov R16,R20
xcall _tx_packet
tst R16
breq X42
xjmp L90
X42:
X32:
.dbline 371
; return 0;
clr R16
xjmp L82
L89:
.dbline 374
; }
; else
; {
L101:
.dbline 376
; do
; {
.dbline 377
; for(i=0;i<128;i++)
clr R12
clr R13
xjmp L107
L104:
.dbline 378
; xModem->Message[i]=(User_Data[j++]);
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
ldd R14,z+0
ldd R15,z+1
movw R24,R14
adiw R24,1
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
std z+1,R25
std z+0,R24
movw R30,R14
movw R26,R28
subi R26,112 ; addi 144
sbci R27,255
ld R0,x+
ld R1,x
add R30,R0
adc R31,R1
lpm R2,Z
movw R24,R22
adiw R24,1
movw R30,R12
add R30,R24
adc R31,R25
std z+0,R2
L105:
.dbline 377
movw R24,R12
adiw R24,1
movw R12,R24
L107:
.dbline 377
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L104
X33:
.dbline 379
; if(tx_packet(packet_number, xModem->Message, temp_char)==0)
std y+0,R10
movw R18,R22
subi R18,255 ; offset = 1
sbci R19,255
mov R16,R20
xcall _tx_packet
mov R14,R16
tst R16
brne L108
X34:
.dbline 380
; return 0;
clr R16
xjmp L82
L108:
.dbline 381
; packet_number++;
inc R20
.dbline 382
; LEN=LEN-128;
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
ldd R24,z+0
ldd R25,z+1
subi R24,128
sbci R25,0
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
std z+1,R25
std z+0,R24
.dbline 383
; Delay(10);
ldi R16,10
ldi R17,0
xcall _Delay
.dbline 385
;
; }while(LEN>=128);
L102:
.dbline 385
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
ldd R24,z+0
ldd R25,z+1
cpi R24,128
ldi R30,0
cpc R25,R30
brlo X43
xjmp L101
X43:
X35:
.dbline 386
; if (LEN)
movw R0,R24
cpi R24,0
cpc R24,R25
brne X44
xjmp L110
X44:
X36:
.dbline 387
; {
.dbline 388
; for(i=0;i<LEN;i++)
clr R12
clr R13
xjmp L115
L112:
.dbline 389
; xModem->Message[i]=(User_Data[j++]);
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
ldd R14,z+0
ldd R15,z+1
movw R24,R14
adiw R24,1
movw R30,R28
subi R30,124 ; addi 132
sbci R31,255
std z+1,R25
std z+0,R24
movw R30,R14
movw R26,R28
subi R26,112 ; addi 144
sbci R27,255
ld R0,x+
ld R1,x
add R30,R0
adc R31,R1
lpm R2,Z
movw R24,R22
adiw R24,1
movw R30,R12
add R30,R24
adc R31,R25
std z+0,R2
L113:
.dbline 388
movw R24,R12
adiw R24,1
movw R12,R24
L115:
.dbline 388
movw R30,R28
subi R30,110 ; addi 146
sbci R31,255
ldd R0,z+0
ldd R1,z+1
cp R12,R0
cpc R13,R1
brlo L112
X37:
.dbline 390
; for(i=LEN;i<128;i++)
movw R12,R0
xjmp L119
L116:
.dbline 391
; xModem->Message[i]=CTRL_Z;
movw R24,R22
adiw R24,1
movw R30,R12
add R30,R24
adc R31,R25
ldi R24,26
std z+0,R24
L117:
.dbline 390
movw R24,R12
adiw R24,1
movw R12,R24
L119:
.dbline 390
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L116
X38:
.dbline 392
; if( tx_packet(packet_number, xModem->Message, temp_char)==0)
std y+0,R10
movw R18,R22
subi R18,255 ; offset = 1
sbci R19,255
mov R16,R20
xcall _tx_packet
mov R10,R16
tst R16
brne L120
X39:
.dbline 393
; return 0;
clr R16
xjmp L82
L120:
.dbline 394
; }
L110:
.dbline 395
; }
L90:
.dbline 397
;
; if (!tx_EOT()) //发送方正常结束要发EOT信号,
xcall _tx_EOT
mov R10,R16
tst R16
brne L122
X40:
.dbline 398
; return 0; // end tx data failed
clr R16
xjmp L82
L122:
.dbline 399
; return 1; //正常结束
ldi R16,1
.dbline -2
L82:
.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 402
; }
; uchar tx_EOT(void)
; {
.dbline 406
; uchar attempt;
; unsigned char temp;
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -