📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\avrisp\main.c
.dbfunc e main _main fV
; i -> y+1
; msg_size -> R22,R23
; seq_num -> y+0
; checksum -> R12
; t -> R20
; state -> R14,R15
; rec_data -> R10,R11
.even
_main::
sbiw R28,3
.dbline -1
.dbline 49
; /** \file
; <b>USBisp main</b><br>
; Autor: Matthias Wei遝r<br>
; Copyright 2005: Matthias Wei遝r<br>
; License: QPL (see license.txt)
; <hr>
; */
; /*! \mainpage USBisp STK500 v2
;
; (c)2005 by Matthias Weisser
;
; This software is distributed under the QPL
; see license.txt for more information
;
; \section Compiler
; latest WINAVR
;
; \section version history version history
; <b>v1.0</b>
; <ul>
; <li>First release</li>
; </ul>
; */
; #include "stk500.h"
;
; //States used in the receive state machine
; #define ST_START 0xF000 /*消息开始0x1B */
; #define ST_GET_SEQ_NUM 0xF001 /*消息包号 */
; #define ST_MSG_SIZE_1 0xF002 /*消息长度 */
; #define ST_MSG_SIZE_2 0xF003 /*消息长度 */
; #define ST_GET_TOKEN 0xF004 /*消息记号0x0E */
; #define ST_GET_DATA 0xF005 /*消息数据 */
; #define ST_GET_CHECK 0xF006 /*消息校验 */
; #define ST_PROCESS 0xF007 /*消息 */
;
; void chip_init(void);
; //unsigned char adc_get(char n);
; void process_command(unsigned char seq_num);
;
; //Some global variables
; unsigned char msg_buffer[300];
; unsigned char clock_speed; /*下载速度*/
; unsigned char reset_polarity;
; unsigned char param_controller_init;
; unsigned char prgmode;
;
; unsigned long address;
;
; void main(void) {
.dbline 51
;
; unsigned int i=0;
clr R0
clr R1
std y+2,R1
std y+1,R0
.dbline 53
;
; unsigned char seq_num=0;
std y+0,R0
.dbline 54
; unsigned int msg_size=0;
clr R22
clr R23
.dbline 55
; unsigned char checksum=0;
clr R12
.dbline 58
;
; /// next state
; unsigned int state=ST_START; /*应该是状态标志*/
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 63
;
; unsigned char t;
; signed int rec_data;
;
; chip_init();
rcall _chip_init
.dbline 64
; interface_init();
rcall _interface_init
.dbline 65
; spi_disable();
rcall _spi_disable
.dbline 73
;
;
; //clock_speed=eeprom_read_byte(&eeprom_sck_period);
; //clock_speed=eeprom_sck_period;
; //if (clock_speed==0xFF) {
; // clock_speed=SPI_SPEED_125KHZ;
; // }
; clock_speed = SPI_SPEED_230KHz;
ldi R24,1
sts _clock_speed,R24
.dbline 74
; spi_set_speed(clock_speed);
mov R16,R24
rcall _spi_set_speed
.dbline 76
;
; SEI();
sei
.dbline 78
;
; LED_GN_OFF;
ldi R24,-2
ldi R25,-1
in R2,0x18
and R2,R24
out 0x18,R2
.dbline 79
; LED_RT_ON;
sbi 0x18,1
.dbline 80
; wait_ms(2000);
ldi R16,2000
ldi R17,7
rcall _wait_ms
.dbline 81
; LED_GN_ON;
sbi 0x18,0
.dbline 82
; LED_RT_OFF;
ldi R24,-3
ldi R25,-1
in R2,0x18
and R2,R24
out 0x18,R2
rjmp L4
L3:
.dbline 84
;
; while(2) {
.dbline 85
; rec_data=interface_getc();
rcall _interface_getc
movw R10,R16
.dbline 87
; //if a byte has been received -> process it
; if(rec_data!=-1) {
movw R24,R10
cpi R16,255
ldi R30,255
cpc R17,R30
brne X1
rjmp L6
X1:
.dbline 87
.dbline 88
; t=rec_data&0xFF;
mov R20,R24
andi R21,0
.dbline 90
;
; if(state==ST_START) {
movw R24,R14
cpi R24,0
ldi R30,240
cpc R25,R30
brne L8
.dbline 90
.dbline 91
; if(t==MESSAGE_START) {
cpi R20,27
breq X2
rjmp L9
X2:
.dbline 91
.dbline 92
; state = ST_GET_SEQ_NUM;
ldi R24,61441
ldi R25,240
movw R14,R24
.dbline 93
; checksum = MESSAGE_START^0;
ldi R24,27
mov R12,R24
.dbline 94
; }
.dbline 95
; }
rjmp L9
L8:
.dbline 96
; else {
.dbline 97
; if(state==ST_GET_SEQ_NUM) {
movw R24,R14
cpi R24,1
ldi R30,240
cpc R25,R30
brne L12
.dbline 97
.dbline 98
; seq_num = t;
std y+0,R20
.dbline 99
; state = ST_MSG_SIZE_1;
ldi R24,61442
ldi R25,240
movw R14,R24
.dbline 100
; checksum ^= t;
eor R12,R20
.dbline 101
; }
rjmp L13
L12:
.dbline 102
; else {
.dbline 103
; if(state==ST_MSG_SIZE_1) {
movw R24,R14
cpi R24,2
ldi R30,240
cpc R25,R30
brne L14
.dbline 103
.dbline 104
; msg_size = t<<8;
mov R22,R20
clr R23
mov R23,R22
clr R22
.dbline 105
; state = ST_MSG_SIZE_2;
ldi R24,61443
ldi R25,240
movw R14,R24
.dbline 106
; checksum ^= t;
eor R12,R20
.dbline 107
; }
rjmp L15
L14:
.dbline 108
; else {
.dbline 109
; if(state==ST_MSG_SIZE_2) {
movw R24,R14
cpi R24,3
ldi R30,240
cpc R25,R30
brne L16
.dbline 109
.dbline 110
; msg_size |= t;
mov R2,R20
clr R3
or R22,R2
or R23,R3
.dbline 111
; state = ST_GET_TOKEN;
ldi R24,61444
ldi R25,240
movw R14,R24
.dbline 112
; checksum ^= t;
eor R12,R2
.dbline 113
; }
rjmp L17
L16:
.dbline 114
; else {
.dbline 115
; if(state==ST_GET_TOKEN) {
movw R24,R14
cpi R24,4
ldi R30,240
cpc R25,R30
brne L18
.dbline 115
.dbline 116
; if(t==TOKEN) {
cpi R20,14
brne L20
.dbline 116
.dbline 117
; state = ST_GET_DATA;
ldi R24,61445
ldi R25,240
movw R14,R24
.dbline 118
; checksum ^= t;
eor R12,R20
.dbline 119
; i=0;
clr R0
clr R1
std y+2,R1
std y+1,R0
.dbline 120
; }
rjmp L19
L20:
.dbline 121
; else {
.dbline 122
; state = ST_START;
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 123
; }
.dbline 124
; }
rjmp L19
L18:
.dbline 125
; else {
.dbline 126
; if(state==ST_GET_DATA) {
movw R24,R14
cpi R24,5
ldi R30,240
cpc R25,R30
brne L22
.dbline 126
.dbline 127
; msg_buffer[i++] = t;
ldd R2,y+1
ldd R3,y+2
movw R24,R2
adiw R24,1
std y+2,R25
std y+1,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R20
.dbline 128
; checksum ^= t;
eor R12,R20
.dbline 129
; if(i==msg_size) {
ldd R0,y+1
ldd R1,y+2
cp R0,R22
cpc R1,R23
brne L23
.dbline 129
.dbline 130
; state = ST_GET_CHECK;
ldi R24,61446
ldi R25,240
movw R14,R24
.dbline 131
; }
.dbline 132
; }
rjmp L23
L22:
.dbline 133
; else {
.dbline 134
; if(state==ST_GET_CHECK) {
movw R24,R14
cpi R24,6
ldi R30,240
cpc R25,R30
brne L26
.dbline 134
.dbline 135
; if(t==checksum) {
cp R20,R12
brne L28
.dbline 135
.dbline 136
; process_command(seq_num);
ldd R16,y+0
rcall _process_command
.dbline 137
; }
L28:
.dbline 138
; state = ST_START;
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 139
; }
L26:
.dbline 140
; }
L23:
.dbline 141
; }
L19:
.dbline 142
; }
L17:
.dbline 143
; }
L15:
.dbline 144
; }
L13:
.dbline 145
; }
L9:
.dbline 146
; }
L6:
.dbline 147
L4:
.dbline 84
rjmp L3
X0:
.dbline -2
L2:
adiw R28,3
.dbline 0 ; func end
ret
.dbsym l i 1 i
.dbsym r msg_size 22 i
.dbsym l seq_num 0 c
.dbsym r checksum 12 c
.dbsym r t 20 c
.dbsym r state 14 i
.dbsym r rec_data 10 I
.dbend
.dbfunc e process_command _process_command fV
; mode -> R14
; block_size -> R10,R11
; start_address -> y+6
; polling_address -> y+2
; tmp -> y+13
; cmd -> y+12
; num_bytes -> y+10
; i -> R12,R13
; seq_num -> y+24
.even
_process_command::
st -y,r17
st -y,r16
rcall push_gset5
sbiw R28,14
.dbline -1
.dbline 175
; }
; }
;
; /**
; Returns the value of the selected adc channel
;
; @param n Number of ADC channel
;
; @return Value of ADC channel
; */
; /*unsigned char adc_get(char n)
; {
; ADMUX&=0xF0;
; ADMUX|=n&0x7;
;
; while(ADCSRA&0x40);
; ADCSRA|=(1<<ADSC);
; while(ADCSRA&0x40);
;
; return ADCH;
; }*/
;
; /**
; Processes a command packet received in main loop and located in the global buffer
;
; @param seq_num The sequence number of the command packet
; */
; void process_command(unsigned char seq_num)
; {
.dbline 177
; unsigned char cmd;
; unsigned char tmp=0;
clr R0
std y+13,R0
.dbline 181
; unsigned char mode;
; unsigned int block_size;
; unsigned int i;
; unsigned int num_bytes=0;
clr R1
std y+11,R1
std y+10,R0
.dbline 182
; unsigned long polling_address=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+2,R20
std z+3,R21
std z+4,R22
std z+5,R23
.dbline 183
; unsigned long start_address = address;
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
.dbline 185
;
; cmd = msg_buffer[0];
lds R2,_msg_buffer
std y+12,R2
.dbline 190
;
; //////////////////////////////////////
; //CMD_SIGN_ON
; //////////////////////////////////////
; if(cmd==CMD_SIGN_ON)
mov R24,R2
cpi R24,1
brne L31
.dbline 191
; {
.dbline 192
; num_bytes = 11;
ldi R24,11
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 193
; msg_buffer[0] = CMD_SIGN_ON;
ldi R24,1
sts _msg_buffer,R24
.dbline 194
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 195
; msg_buffer[2] = 8;
ldi R24,8
sts _msg_buffer+2,R24
.dbline 196
; memcpy(msg_buffer+3,"AVRISP_2",8);
std y+1,R25
std y+0,R24
ldi R18,<L36
ldi R19,>L36
ldi R16,<_msg_buffer+3
ldi R17,>_msg_buffer+3
rcall _memcpy
.dbline 197
; }
rjmp L32
L31:
.dbline 201
; //////////////////////////////////////
; //CMD_SET_PARAMETER
; //////////////////////////////////////
; else if(cmd==CMD_SET_PARAMETER)
ldd R24,y+12
cpi R24,2
brne L37
.dbline 202
; {
.dbline 203
; switch(msg_buffer[1])
lds R10,_msg_buffer+1
clr R11
movw R24,R10
cpi R24,152
ldi R30,0
cpc R25,R30
breq L43
cpi R24,152
ldi R30,0
cpc R25,R30
brlt L39
L49:
movw R24,R10
cpi R24,158
ldi R30,0
cpc R25,R30
breq L45
cpi R24,159
ldi R30,0
cpc R25,R30
breq L47
rjmp L39
X3:
.dbline 204
; {
L43:
.dbline 206
; case PARAM_SCK_DURATION:
; clock_speed=msg_buffer[2];
lds R2,_msg_buffer+2
sts _clock_speed,R2
.dbline 211
; //if(eeprom_read_byte(&eeprom_sck_period)!=clock_speed) eeprom_write_byte(&eeprom_sck_period,clock_speed);
; //if (eeprom_sck_period != clock_speed) {
; // eeprom_sck_period = clock_speed;
; // }
; spi_set_speed(clock_speed);
mov R16,R2
rcall _spi_set_speed
.dbline 212
; break;
rjmp L40
L45:
.dbline 214
; case PARAM_RESET_POLARITY:
; reset_polarity = msg_buffer[2];
lds R2,_msg_buffer+2
sts _reset_polarity,R2
.dbline 215
; break;
rjmp L40
L47:
.dbline 217
; case PARAM_CONTROLLER_INIT:
; param_controller_init = msg_buffer[2];
lds R2,_msg_buffer+2
sts _param_controller_init,R2
.dbline 218
; break;
L39:
L40:
.dbline 221
; }
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 222
; msg_buffer[0] = CMD_SET_PARAMETER;
sts _msg_buffer,R24
.dbline 223
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 224
; }
rjmp L38
L37:
.dbline 228
; //////////////////////////////////////
; //CMD_GET_PARAMETER
; //////////////////////////////////////
; else if(cmd==CMD_GET_PARAMETER)
ldd R24,y+12
cpi R24,3
breq X7
rjmp L51
X7:
.dbline 229
; {
.dbline 230
; switch(msg_buffer[1])
lds R10,_msg_buffer+1
clr R11
movw R24,R10
cpi R24,144
ldi R30,0
cpc R25,R30
breq L59
cpi R24,145
ldi R30,0
cpc R25,R30
breq L60
cpi R24,146
ldi R30,0
cpc R25,R30
breq L61
ldi R24,146
cp R24,R10
cpc R25,R11
brlt L66
L65:
movw R24,R10
cpi R24,128
ldi R30,0
cpc R25,R30
breq L57
cpi R24,129
ldi R30,0
cpc R25,R30
breq L58
rjmp L53
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -