📄 xmodem.s
字号:
.word 18533
.word 30726
.word 26663
.word 6336
.word 2273
.word 14466
.word 10403
.word 52093
.word 56156
.word 60223
.word 64286
.word 35833
.word 39896
.word 43963
.word 48026
.word 19061
.word 23124
.word 27191
.word 31254
.word 2801
.word 6864
.word 10931
.word 14994
.word 64814
.word 60687
.word 56684
.word 52557
.word 48554
.word 44427
.word 40424
.word 36297
.word 31782
.word 27655
.word 23652
.word 19525
.word 15522
.word 11395
.word 7392
.word 3265
.word 61215
.word 65342
.word 53085
.word 57212
.word 44955
.word 49082
.word 36825
.word 40952
.word 28183
.word 32310
.word 20053
.word 24180
.word 11923
.word 16050
.word 3793
.word 7920
.dbsym e crc16_table _crc16_table A[512:256]ki
.area data(ram, con, rel)
.dbfile E:\GPRS资料\M16_Xmodem\pic_crc_data.h
_receive_sp::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile E:\GPRS资料\M16_Xmodem\pic_crc_data.h
.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
.dbsym e receive_sp _receive_sp I
_temp_char0::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
.dbsym e temp_char0 _temp_char0 c
.area text(rom, con, rel)
.dbfile E:\GPRS资料\M16_Xmodem\xmodem.c
.dbfunc e xModemSend _xModemSend fc
; length -> R18,R19
; temp_data -> R16,R17
.even
_xModemSend::
.dbline -1
.dbline 47
; #include "xmodem.h"
; #include "pic_crc_data.h"
;
;
; uchar sending;
; extern uchar receive_data[STRING_LENGTH];
; extern int receive_sp=0;
; uchar const *pic;
; uchar temp_char0=0;
;
; uchar xmodedata; // TH
; uint picLenth; // TH
;
;
;
;
; struct Message
; {
; uchar Data_Len; /* 消息内容长度,即Message中的内容字节数 */
; uchar Message[PACKET_DATA_BUFFER_LENGTH]; /* 消息内容, 由发送进程填写 */
; uint User_Data;
;
; };
;
; struct String
; {
; uint string_len;
; uchar string[STRING_LENGTH];
; void *string_data;
; };
;
;
; void intDelay(uint i);
; uint update_CRC(uchar inData, uint checksum);
; uchar tx_EOT(void);
; void Delay(unsigned int Delay_MS);
;
; void send_m_byte(uchar *string, uint length);
; void send_a_byte(uchar temp);
; void do_serial_data(int lenth);
; uchar send_packet_data(uchar const *User_Data , uint LEN);
; uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char );
; void sendcmd(unsigned char *by_Array);
;
;
; uchar xModemSend(uchar *temp_data, uint length)
; {
.dbline 48
; *temp_data = 0;
clr R2
movw R30,R16
std z+0,R2
.dbline 49
; length = 0;
clr R18
clr R19
.dbline 50
; return 0;
clr R16
.dbline -2
L8:
.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 56
; }
;
;
; // 信息包序号 包里面的数据 收接收方反回来的信息
; uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
; {
.dbline 60
; uchar attempt;
; uint checksum;
; uchar buffer_index;
; for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
ldi R22,1
xjmp L13
L10:
.dbline 61
; {
.dbline 62
; checksum= 0; //校验和为0
clr R14
clr R15
.dbline 63
; send_a_byte(SOH); // send start of packet(sending标志中断发送)
ldi R16,1
xcall _send_a_byte
.dbline 64
; send_a_byte(packet_number); //发送信息包序号
ldd R16,y+10
xcall _send_a_byte
.dbline 65
; 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 67
; //以下为发送数据
; for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
clr R12
xjmp L17
L14:
.dbline 68
; {
.dbline 69
; 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 70
; if (temp_char == NAK) //接收方返回NAK则发送方要得传
cpi R20,21
brne L18
X0:
.dbline 71
; 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 L19
L18:
.dbline 73
; 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
L19:
.dbline 74
; }
L15:
.dbline 67
inc R12
L17:
.dbline 67
mov R24,R12
cpi R24,128
brlo L14
X1:
.dbline 75
; if (temp_char == ASCII_C) //如果收到C
cpi R20,67
brne L20
X2:
.dbline 76
; { send_a_byte((uchar)((checksum>>8) & 0x00ff));
.dbline 76
movw R16,R14
mov R16,R17
clr R17
andi R17,0
xcall _send_a_byte
.dbline 77
; send_a_byte((uchar)(checksum & 0x00ff));
mov R16,R14
andi R17,0
xcall _send_a_byte
.dbline 78
; } // send end of packet CRC
L20:
.dbline 79
; temp_char0=0;
clr R2
sts _temp_char0,R2
L22:
.dbline 80
; while(temp_char0 == 0);
L23:
.dbline 80
lds R2,_temp_char0
tst R2
breq L22
X3:
.dbline 81
; temp_char =temp_char0; // get receiver response
mov R20,R2
.dbline 83
;
; if (temp_char == CAN)
cpi R20,24
brne L25
X4:
.dbline 84
; return 0; // reception cancelled
clr R16
xjmp L9
L25:
.dbline 85
; if (temp_char == ACK)
cpi R20,6
brne L27
X5:
.dbline 86
; return 1; // packet received okay
ldi R16,1
xjmp L9
L27:
.dbline 87
; }
L11:
.dbline 60
inc R22
L13:
.dbline 60
ldi R24,3
cp R24,R22
brlo X7
xjmp L10
X7:
X6:
.dbline 88
; return 0; // attempts exhausted
clr R16
.dbline -2
L9:
.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 101
; }
;
; /*
; function: 以XMODEM 发送数据
; in: user_data 是数据指针
; out: 1 sucess
; o faile
; 使用全局变量? 无
;
; */
;
; uchar send_packet_data(uchar const *User_Data , uint LEN)
; {
.dbline 105
; 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 106
; unsigned char packet_number = 1;
ldi R20,1
.dbline 107
; unsigned char no_more = 0;
clr R10
.dbline 108
; unsigned char temp_char = 0;
.dbline 109
; xModem=&Xmodem_Pack22;
movw R22,R28
subi R22,255 ; offset = 1
sbci R23,255
.dbline 110
; 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 L31
L30:
.dbline 114
; // xModem->User_Data=User_Data;
; //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
; while((temp_char != ASCII_C) && (temp_char != NAK))
; {
.dbline 115
; temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
lds R10,_temp_char0
.dbline 116
; if(temp_char == CAN)
mov R24,R10
cpi R24,24
brne L33
X8:
.dbline 117
; return 0;
clr R16
xjmp L29
L33:
.dbline 118
; }
L31:
.dbline 113
mov R24,R10
cpi R24,67
breq L35
X9:
cpi R24,21
brne L30
X10:
L35:
.dbline 120
;
; 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 X23
xjmp L36
X23:
X11:
.dbline 121
; {
.dbline 122
; for(i=0;i<LEN;i++)
clr R12
clr R13
xjmp L41
L38:
.dbline 123
; 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
L39:
.dbline 122
movw R24,R12
adiw R24,1
movw R12,R24
L41:
.dbline 122
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 L38
X12:
.dbline 124
; for(i=LEN;i<128;i++)
movw R12,R0
xjmp L45
L42:
.dbline 125
; 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
L43:
.dbline 124
movw R24,R12
adiw R24,1
movw R12,R24
L45:
.dbline 124
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L42
X13:
.dbline 126
; 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 X24
xjmp L37
X24:
X14:
.dbline 127
; return 0;
clr R16
xjmp L29
L36:
.dbline 130
; }
; else
; {
L48:
.dbline 132
; do
; {
.dbline 133
; for(i=0;i<128;i++)
clr R12
clr R13
xjmp L54
L51:
.dbline 134
; 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
L52:
.dbline 133
movw R24,R12
adiw R24,1
movw R12,R24
L54:
.dbline 133
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L51
X15:
.dbline 135
; 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 L55
X16:
.dbline 136
; return 0;
clr R16
xjmp L29
L55:
.dbline 137
; packet_number++;
inc R20
.dbline 138
; 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 139
; Delay(10);
ldi R16,10
ldi R17,0
xcall _Delay
.dbline 141
;
; }while(LEN>=128);
L49:
.dbline 141
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 X25
xjmp L48
X25:
X17:
.dbline 142
; if (LEN)
movw R0,R24
cpi R24,0
cpc R24,R25
brne X26
xjmp L57
X26:
X18:
.dbline 143
; {
.dbline 144
; for(i=0;i<LEN;i++)
clr R12
clr R13
xjmp L62
L59:
.dbline 145
; 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
L60:
.dbline 144
movw R24,R12
adiw R24,1
movw R12,R24
L62:
.dbline 144
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 L59
X19:
.dbline 146
; for(i=LEN;i<128;i++)
movw R12,R0
xjmp L66
L63:
.dbline 147
; 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
L64:
.dbline 146
movw R24,R12
adiw R24,1
movw R12,R24
L66:
.dbline 146
movw R24,R12
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L63
X20:
.dbline 148
; 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 L67
X21:
.dbline 149
; return 0;
clr R16
xjmp L29
L67:
.dbline 150
; }
L57:
.dbline 151
; }
L37:
.dbline 153
;
; if (!tx_EOT()) //发送方正常结束要发EOT信号,
xcall _tx_EOT
mov R10,R16
tst R16
brne L69
X22:
.dbline 154
; return 0; // end tx data failed
clr R16
xjmp L29
L69:
.dbline 155
; return 1; //正常结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -