📄 avrsms_com.lst
字号:
\ 00000012 930A ST -Y, R16
\ 00000014 B74F IN R20, 0x3F
\ 00000016 B75B IN R21, 0x3B
133 unsigned char data; //Local variable
134
135 data = UDR0; //Always read something
\ 00000018 B12C IN R18, 0x0C
136
137 rx_buffer[ rx_wr_i++ ] = data; //Store new data
\ 0000001A .... LDI R30, LOW(??rx_wr_i)
\ 0000001C .... LDI R31, (??rx_wr_i) >> 8
\ 0000001E 8100 LD R16, Z
\ 00000020 8111 LDD R17, Z+1
\ 00000022 01F8 MOVW R31:R30, R17:R16
\ 00000024 .... SUBI R30, LOW((-(??rx_buffer) & 0xFFFF))
\ 00000026 .... SBCI R31, (-(??rx_buffer) & 0xFFFF) >> 8
\ 00000028 8320 ST Z, R18
\ 0000002A .... LDI R30, LOW(??rx_wr_i)
\ 0000002C .... LDI R31, (??rx_wr_i) >> 8
\ 0000002E 8100 LD R16, Z
\ 00000030 8111 LDD R17, Z+1
\ 00000032 5F0F SUBI R16, 255
\ 00000034 4F1F SBCI R17, 255
\ 00000036 8300 ST Z, R16
\ 00000038 8311 STD Z+1, R17
138 //rx_buffer[ rx_wr_i ] = '\0'; //Always terminate string!
139
140 if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
\ 0000003A .... LDI R30, LOW(??rx_wr_i)
\ 0000003C .... LDI R31, (??rx_wr_i) >> 8
\ 0000003E 8100 LD R16, Z
\ 00000040 8111 LDD R17, Z+1
\ 00000042 3F0F CPI R16, 255
\ 00000044 E030 LDI R19, 0
\ 00000046 0713 CPC R17, R19
\ 00000048 F06C BRLT ??USART0_RX_interrupt_0
141 {
142 rx_wr_i = 0; //Reset write index
\ 0000004A E000 LDI R16, 0
\ 0000004C E010 LDI R17, 0
\ 0000004E .... LDI R30, LOW(??rx_wr_i)
\ 00000050 .... LDI R31, (??rx_wr_i) >> 8
\ 00000052 8300 ST Z, R16
\ 00000054 8311 STD Z+1, R17
143 rx_overflow = 1; //Set flag high
\ 00000056 E001 LDI R16, 1
\ 00000058 E010 LDI R17, 0
\ 0000005A .... LDI R30, LOW(rx_overflow)
\ 0000005C .... LDI R31, (rx_overflow) >> 8
\ 0000005E 8300 ST Z, R16
\ 00000060 8311 STD Z+1, R17
144 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
\ 00000062 9857 CBI 0x0A, 0x07
145 }
146
147 if( searchFor[rx_i] == data ) //Test response match
\ ??USART0_RX_interrupt_0:
\ 00000064 .... LDI R26, LOW(searchFor)
\ 00000066 .... LDI R27, (searchFor) >> 8
\ 00000068 91ED LD R30, X+
\ 0000006A 91FC LD R31, X
\ 0000006C .... LDI R26, LOW(??rx_i)
\ 0000006E .... LDI R27, (??rx_i) >> 8
\ 00000070 910D LD R16, X+
\ 00000072 911C LD R17, X
\ 00000074 0FE0 ADD R30, R16
\ 00000076 1FF1 ADC R31, R17
\ 00000078 9104 LPM R16, Z
\ 0000007A 1702 CP R16, R18
\ 0000007C F599 BRNE ??USART0_RX_interrupt_1
148 {
149 rx_i++;
\ 0000007E .... LDI R30, LOW(??rx_i)
\ 00000080 .... LDI R31, (??rx_i) >> 8
\ 00000082 8100 LD R16, Z
\ 00000084 8111 LDD R17, Z+1
\ 00000086 5F0F SUBI R16, 255
\ 00000088 4F1F SBCI R17, 255
\ 0000008A 8300 ST Z, R16
\ 0000008C 8311 STD Z+1, R17
150
151 if( !searchFor[rx_i] ) //End of new_message string...received new message!
\ 0000008E .... LDI R26, LOW(searchFor)
\ 00000090 .... LDI R27, (searchFor) >> 8
\ 00000092 91ED LD R30, X+
\ 00000094 91FC LD R31, X
\ 00000096 .... LDI R26, LOW(??rx_i)
\ 00000098 .... LDI R27, (??rx_i) >> 8
\ 0000009A 910D LD R16, X+
\ 0000009C 911C LD R17, X
\ 0000009E 0FE0 ADD R30, R16
\ 000000A0 1FF1 ADC R31, R17
\ 000000A2 9104 LPM R16, Z
\ 000000A4 2300 TST R16
\ 000000A6 F521 BRNE ??USART0_RX_interrupt_2
152 {
153 rx_i = 0;
\ 000000A8 E000 LDI R16, 0
\ 000000AA E010 LDI R17, 0
\ 000000AC .... LDI R30, LOW(??rx_i)
\ 000000AE .... LDI R31, (??rx_i) >> 8
\ 000000B0 8300 ST Z, R16
\ 000000B2 8311 STD Z+1, R17
154
155 if( searchStr == 1 ) //+CMTI:
\ 000000B4 9100.... LDS R16, ??searchStr
\ 000000B8 3001 CPI R16, 1
\ 000000BA F461 BRNE ??USART0_RX_interrupt_3
156 {
157 searchFor = searchStrings[3]; //Wait for
\ 000000BC .... LDI R30, LOW(searchStrings)
\ 000000BE .... LDI R31, (searchStrings) >> 8
\ 000000C0 8106 LDD R16, Z+6
\ 000000C2 8117 LDD R17, Z+7
\ 000000C4 .... LDI R30, LOW(searchFor)
\ 000000C6 .... LDI R31, (searchFor) >> 8
\ 000000C8 8300 ST Z, R16
\ 000000CA 8311 STD Z+1, R17
158 searchStr = 3;
\ 000000CC E003 LDI R16, 3
\ 000000CE 9300.... STS ??searchStr, R16
\ 000000D2 C00E RJMP ??USART0_RX_interrupt_2
159 }
160
161 else //Normal acknowledgement
162 {
163 rx_ack = 1; //Set new message flag
\ ??USART0_RX_interrupt_3:
\ 000000D4 E001 LDI R16, 1
\ 000000D6 E010 LDI R17, 0
\ 000000D8 .... LDI R30, LOW(rx_ack)
\ 000000DA .... LDI R31, (rx_ack) >> 8
\ 000000DC 8300 ST Z, R16
\ 000000DE 8311 STD Z+1, R17
164 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
\ 000000E0 9857 CBI 0x0A, 0x07
\ 000000E2 C006 RJMP ??USART0_RX_interrupt_2
165 }
166 }
167 }
168 else
169 {
170 rx_i = 0; //Not valid search pattern...start again.
\ ??USART0_RX_interrupt_1:
\ 000000E4 E000 LDI R16, 0
\ 000000E6 E010 LDI R17, 0
\ 000000E8 .... LDI R30, LOW(??rx_i)
\ 000000EA .... LDI R31, (??rx_i) >> 8
\ 000000EC 8300 ST Z, R16
\ 000000EE 8311 STD Z+1, R17
171 }
172 }//end rx-isr
\ ??USART0_RX_interrupt_2:
\ 000000F0 BF5B OUT 0x3B, R21
\ 000000F2 BF4F OUT 0x3F, R20
\ 000000F4 9109 LD R16, Y+
\ 000000F6 9119 LD R17, Y+
\ 000000F8 9129 LD R18, Y+
\ 000000FA 9139 LD R19, Y+
\ 000000FC 9149 LD R20, Y+
\ 000000FE 9159 LD R21, Y+
\ 00000100 91E9 LD R30, Y+
\ 00000102 91F9 LD R31, Y+
\ 00000104 91A9 LD R26, Y+
\ 00000106 91B9 LD R27, Y+
\ 00000108 9518 RETI
173
174
175 /*! \brief Adapted putchar method...we dont need interrup driven tx-isr.
176 *
177 * Adpation of normal ansi c putchar() method
178 *
179 * \param input Character data we wish to send
180 *
181 * \retval void
182 *
183 */
\ In segment CODE, align 2, keep-with-next
184 int COM_putchar( unsigned char data )
\ COM_putchar:
185 {
186 static unsigned int i;
187
188 for( i = 0; !( UCSR0A & ( 1 << UDRE0 ) ); i++ ) // Wait for empty transmit buffer
\ 00000000 E020 LDI R18, 0
\ 00000002 E030 LDI R19, 0
\ 00000004 .... LDI R30, LOW(??i)
\ 00000006 .... LDI R31, (??i) >> 8
\ 00000008 8320 ST Z, R18
\ 0000000A 8331 STD Z+1, R19
\ 0000000C C008 RJMP ??COM_putchar_0
\ ??COM_putchar_1:
\ 0000000E .... LDI R30, LOW(??i)
\ 00000010 .... LDI R31, (??i) >> 8
\ 00000012 8120 LD R18, Z
\ 00000014 8131 LDD R19, Z+1
\ 00000016 5F2F SUBI R18, 255
\ 00000018 4F3F SBCI R19, 255
\ 0000001A 8320 ST Z, R18
\ 0000001C 8331 STD Z+1, R19
\ ??COM_putchar_0:
\ 0000001E 995D SBIC 0x0B, 0x05
\ 00000020 C00B RJMP ??COM_putchar_2
189 {
190 if( i > RX_WAIT ) //How long one should wait
\ 00000022 .... LDI R30, LOW(??i)
\ 00000024 .... LDI R31, (??i) >> 8
\ 00000026 8120 LD R18, Z
\ 00000028 8131 LDD R19, Z+1
\ 0000002A 3E29 CPI R18, 233
\ 0000002C EF1D LDI R17, 253
\ 0000002E 0731 CPC R19, R17
\ 00000030 F370 BRCS ??COM_putchar_1
191 {
192 return -1; //Give feedback to function caller
\ 00000032 EF0F LDI R16, 255
\ 00000034 EF1F LDI R17, 255
\ 00000036 9508 RET
193 }
194 }
195
196 UDR0 = data; // Start transmittion
\ ??COM_putchar_2:
\ 00000038 B90C OUT 0x0C, R16
197
198 return (int)data;
\ 0000003A E010 LDI R17, 0
\ 0000003C 9508 RET
199 }//end COM_putchar
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
\ ??i:
\ 00000000 DS 2
200
201
202
\ In segment CODE, align 2, keep-with-next
203 void COM_put_integer( int i )
\ COM_put_integer:
204 {
\ 00000000 ........ CALL ?PROLOGUE4_L09
\ 00000004 9725 SBIW R29:R28, 5
\ 00000006 01D8 MOVW R27:R26, R17:R16
205
206 int ii;
207 unsigned char int_buf[5];
208
209 if (i < 0) //Integer is negative
\ 00000008 23BB TST R27
\ 0000000A F42A BRPL ??COM_put_integer_0
210 {
211 i = -i; //Convert to positive Integer
\ 0000000C 95B1 NEG R27
\ 0000000E 95A1 NEG R26
\ 00000010 40B0 SBCI R27, 0
212 COM_putchar('-'); //Print - sign
\ 00000012 E20D LDI R16, 45
\ 00000014 .... RCALL COM_putchar
213 }
214
215 for (ii=0; ii < 5; ) //Convert Integer to char array
\ ??COM_put_integer_0:
\ 00000016 E080 LDI R24, 0
\ 00000018 E090 LDI R25, 0
\ 0000001A C011 RJMP ??COM_put_integer_1
216 {
217 int_buf[ii++] = '0'+ i % 10; //Find carry using modulo operation
\ ??COM_put_integer_2:
\ 0000001C 018D MOVW R17:R16, R27:R26
\ 0000001E E04A LDI R20, 10
\ 00000020 E050 LDI R21, 0
\ 00000022 ........ CALL ?SS_DIVMOD_L02
\ 00000026 5D40 SUBI R20, 208
\ 00000028 01FE MOVW R31:R30, R29:R28
\ 0000002A 0FE8 ADD R30, R24
\ 0000002C 1FF9 ADC R31, R25
\ 0000002E 8340 ST Z, R20
\ 00000030 9601 ADIW R25:R24, 1
218 i = i / 10; //Move towards MSB
\ 00000032 018D MOVW R17:R16, R27:R26
\ 00000034 E04A LDI R20, 10
\ 00000036 E050 LDI R21, 0
\ 00000038 ........ CALL ?SS_DIVMOD_L02
\ 0000003C 01D8 MOVW R27:R26, R17:R16
219 }
\ ??COM_put_integer_1:
\ 0000003E 3085 CPI R24, 5
\ 00000040 E000 LDI R16, 0
\ 00000042 0790 CPC R25, R16
\ 00000044 F35C BRLT ??COM_put_integer_2
220 do{ ii--; }while( (int_buf[ii] == '0') && (ii != 0) ); //Remove leading 0's
\ ??COM_put_integer_3:
\ 00000046 9701 SBIW R25:R24, 1
\ 00000048 01FE MOVW R31:R30, R29:R28
\ 0000004A 0FE8 ADD R30, R24
\ 0000004C 1FF9 ADC R31, R25
\ 0000004E 8100 LD R16, Z
\ 00000050 3300 CPI R16, 48
\ 00000052 F419 BRNE ??COM_put_integer_4
\ 00000054 2F08 MOV R16, R24
\ 00000056 2B09 OR R16, R25
\ 00000058 F7B1 BRNE ??COM_put_integer_3
221 do{ COM_putchar( int_buf[ii--] ); }while (ii >= 0); //Print int->char array convertion
\ ??COM_put_integer_4:
\ 0000005A 01FE MOVW R31:R30, R29:R28
\ 0000005C 0FE8 ADD R30, R24
\ 0000005E 1FF9 ADC R31, R25
\ 00000060 8100 LD R16, Z
\ 00000062 .... RCALL COM_putchar
\ 00000064 9701 SBIW R25:R24, 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -