📄 8880.lst
字号:
__text_start:
__start:
16B E5CF LDI R28,0x5F
16C E0D4 LDI R29,4
16D BFCD OUT 0x3D,R28
16E BFDE OUT 0x3E,R29
16F 5CC8 SUBI R28,0xC8
170 40D0 SBCI R29,0
171 EA0A LDI R16,0xAA
172 8308 STD Y+0,R16
173 2400 CLR R0
174 E0E2 LDI R30,2
175 E0F2 LDI R31,2
176 E012 LDI R17,2
177 3EE3 CPI R30,0xE3
178 07F1 CPC R31,R17
179 F011 BEQ 0x017C
17A 9201 ST R0,Z+
17B CFFB RJMP 0x0177
17C 8300 STD Z+0,R16
17D E3E3 LDI R30,0x33
17E E0F1 LDI R31,1
17F E6A0 LDI R26,0x60
180 E0B0 LDI R27,0
181 E012 LDI R17,2
182 E000 LDI R16,0
183 BF0B OUT 0x3B,R16
184 3DE5 CPI R30,0xD5
185 07F1 CPC R31,R17
186 F021 BEQ 0x018B
187 95C8 LPM
188 9631 ADIW R30,1
189 920D ST R0,X+
18A CFF9 RJMP 0x0184
18B D1F2 RCALL _main
_exit:
18C CFFF RJMP _exit
_read:
x --> R10
buf --> Y,+0
argv --> R22
argc --> R20
18D D5FA RCALL push_xgsetF00C
18E 01B9 MOVW R22,R18
18F 2F40 MOV R20,R16
190 97EF SBIW R28,0x3F
191 97A5 SBIW R28,0x25
FILE: E:\Shuaihu\AVR\8880\shell.c
(0001) #include "serial.h"
(0002) #include "string.h"
(0003) #include "8880.h"
(0004) #include <iom8v.h>
(0005) #include "main.h"
(0006) #include "shell.h"
(0007) typedef int (*cmdproc)(char argc,char *argv[]);
(0008) typedef struct tagCMDSTRUCT{
(0009) char *cmd;
(0010) char *help;
(0011) cmdproc proc;
(0012) }CMD_STRUCT,*PCMD_STRUCT;
(0013) signed char GetCmdMatch(char * cmd);
(0014) CMD_STRUCT InnerCmd[]={
(0015) {"help","Desplay this information.\n",help},
(0016) {"call","call a telphon number,uses:call 110\n",call},
(0017) {"cancel","cancel a call process.\n", cancel},
(0018) {"echo","enable or disenable echo.\n",echo},
(0019) {"read","read a number from remote.\n",read},
(0020) {"autoanswer","auto answer the remote call.\n",autoanswer},
(0021) {0,0}
(0022) };
(0023) int read(char argc,char*argv[])
(0024) {
(0025) char buf[100];
(0026) int x=atoi(argv[1]);
192 01FB MOVW R30,R22
193 8102 LDD R16,Z+2
194 8113 LDD R17,Z+3
195 D63D RCALL _atoi
196 0158 MOVW R10,R16
(0027) if ((argc<2)||(!sysoption.calling)) {
197 3042 CPI R20,2
198 F020 BCS 0x019D
199 9020 0203 LDS R2,sysoption+1
19B 2022 TST R2
19C F441 BNE 0x01A5
(0028) serial_send(c_error);
19D 9100 0190 LDS R16,c_error
19F 9110 0191 LDS R17,c_error+1
1A1 D4B3 RCALL _serial_send
(0029) return 0;
1A2 2700 CLR R16
1A3 2711 CLR R17
1A4 C005 RJMP 0x01AA
(0030) }
(0031) M8880_Recv(buf,x);
1A5 2D2A MOV R18,R10
1A6 018E MOVW R16,R28
1A7 D36A RCALL _M8880_Recv
(0032) serial_send(buf);
1A8 018E MOVW R16,R28
1A9 D4AB RCALL _serial_send
1AA 96EF ADIW R28,0x3F
1AB 96A5 ADIW R28,0x25
1AC C5E2 RJMP pop_xgsetF00C
_autoanswer:
argv --> R20
argc --> R22
1AD D5D0 RCALL push_xgsetF000
1AE 01A9 MOVW R20,R18
1AF 2F60 MOV R22,R16
(0033) }
(0034) int autoanswer(char argc,char*argv[])
(0035) {
(0036) if (argc<2){
1B0 3062 CPI R22,2
1B1 F440 BCC 0x01BA
(0037) serial_send(c_error);
1B2 9100 0190 LDS R16,c_error
1B4 9110 0191 LDS R17,c_error+1
1B6 D49E RCALL _serial_send
(0038) return 0;
1B7 2700 CLR R16
1B8 2711 CLR R17
1B9 C017 RJMP 0x01D1
(0039) }
(0040) if (strcmp(argv[1],"on")==0)
1BA EB24 LDI R18,0xB4
1BB E030 LDI R19,0
1BC 01FA MOVW R30,R20
1BD 8102 LDD R16,Z+2
1BE 8113 LDD R17,Z+3
1BF D57D RCALL _strcmp
1C0 3000 CPI R16,0
1C1 0701 CPC R16,R17
1C2 F421 BNE 0x01C7
(0041) sysoption.autoanswer=-1;
1C3 EF8F LDI R24,0xFF
1C4 9380 0206 STS 0x0206,R24
1C6 C003 RJMP 0x01CA
(0042) else
(0043) sysoption.autoanswer=0;
1C7 2422 CLR R2
1C8 9220 0206 STS 0x0206,R2
(0044) serial_send(c_ok);
1CA 9100 018E LDS R16,c_ok
1CC 9110 018F LDS R17,c_ok+1
1CE D486 RCALL _serial_send
(0045) return 0;
1CF 2700 CLR R16
1D0 2711 CLR R17
1D1 C5B1 RJMP pop_xgsetF000
_echo:
argv --> R20
argc --> R22
1D2 D5AB RCALL push_xgsetF000
1D3 01A9 MOVW R20,R18
1D4 2F60 MOV R22,R16
(0046) }
(0047) int echo(char argc,char*argv[])
(0048) {
(0049) if (argc<2){
1D5 3062 CPI R22,2
1D6 F440 BCC 0x01DF
(0050) serial_send(c_error);
1D7 9100 0190 LDS R16,c_error
1D9 9110 0191 LDS R17,c_error+1
1DB D479 RCALL _serial_send
(0051) return 0;
1DC 2700 CLR R16
1DD 2711 CLR R17
1DE C017 RJMP 0x01F6
(0052) }
(0053) if (strcmp(argv[1],"on")==0)
1DF EB24 LDI R18,0xB4
1E0 E030 LDI R19,0
1E1 01FA MOVW R30,R20
1E2 8102 LDD R16,Z+2
1E3 8113 LDD R17,Z+3
1E4 D558 RCALL _strcmp
1E5 3000 CPI R16,0
1E6 0701 CPC R16,R17
1E7 F421 BNE 0x01EC
(0054) sysoption.echo=-1;
1E8 EF8F LDI R24,0xFF
1E9 9380 0202 STS sysoption,R24
1EB C003 RJMP 0x01EF
(0055) else
(0056) sysoption.echo=0;
1EC 2422 CLR R2
1ED 9220 0202 STS sysoption,R2
(0057) serial_send(c_ok);
1EF 9100 018E LDS R16,c_ok
1F1 9110 018F LDS R17,c_ok+1
1F3 D461 RCALL _serial_send
(0058) return 0;
1F4 2700 CLR R16
1F5 2711 CLR R17
1F6 C58C RJMP pop_xgsetF000
_call:
i --> R22
c --> R22
argv --> R20
argc --> R22
1F7 D586 RCALL push_xgsetF000
1F8 01A9 MOVW R20,R18
1F9 2F60 MOV R22,R16
(0059) }
(0060) int call(char argc,char*argv[])
(0061) {
(0062) char i;
(0063) char *c;
(0064) if (sysoption.calling){
1FA 9020 0203 LDS R2,sysoption+1
1FC 2022 TST R2
1FD F041 BEQ 0x0206
(0065) serial_send(c_busying);
1FE 9100 0192 LDS R16,c_busying
200 9110 0193 LDS R17,c_busying+1
202 D452 RCALL _serial_send
(0066) return 0;
203 2700 CLR R16
204 2711 CLR R17
205 C041 RJMP 0x0247
(0067) };
(0068) if (argc<2){
206 3062 CPI R22,2
207 F440 BCC 0x0210
(0069) serial_send(c_error);
208 9100 0190 LDS R16,c_error
20A 9110 0191 LDS R17,c_error+1
20C D448 RCALL _serial_send
(0070) return 0;
20D 2700 CLR R16
20E 2711 CLR R17
20F C037 RJMP 0x0247
(0071) }
(0072) c=argv[1];
210 01FA MOVW R30,R20
211 8162 LDD R22,Z+2
212 8173 LDD R23,Z+3
213 C013 RJMP 0x0227
(0073) while(*c){
(0074) if ((*c<'0')||(*c>'9')) {
214 01FB MOVW R30,R22
215 8020 LDD R2,Z+0
216 2433 CLR R3
217 2D82 MOV R24,R2
218 3380 CPI R24,0x30
219 F018 BCS 0x021D
21A E389 LDI R24,0x39
21B 1582 CP R24,R2
21C F440 BCC 0x0225
(0075) serial_send(c_error);
21D 9100 0190 LDS R16,c_error
21F 9110 0191 LDS R17,c_error+1
221 D433 RCALL _serial_send
(0076) return 0;
222 2700 CLR R16
223 2711 CLR R17
224 C022 RJMP 0x0247
(0077) }
(0078) c++;
225 5F6F SUBI R22,0xFF
226 4F7F SBCI R23,0xFF
227 01FB MOVW R30,R22
228 8020 LDD R2,Z+0
229 2022 TST R2
22A F749 BNE 0x0214
(0079) }
(0080) M8880_Handup;
22B 9AAD SBI 0x15,5
(0081) for (i=0;i<10;i++)
22C 2766 CLR R22
22D C004 RJMP 0x0232
(0082) delay(0xffff);
22E EF0F LDI R16,0xFF
22F EF1F LDI R17,0xFF
230 D12E RCALL _delay
231 9563 INC R22
232 306A CPI R22,0xA
233 F3D0 BCS 0x022E
(0083) M8880_CPDial(argv[1]);
234 01FA MOVW R30,R20
235 8102 LDD R16,Z+2
236 8113 LDD R17,Z+3
237 D315 RCALL _M8880_CPDial
(0084) sysoption.calling=1;
238 E081 LDI R24,1
239 9380 0203 STS sysoption+1,R24
(0085) sysoption.timer=0;
23B 2422 CLR R2
23C 9220 0205 STS sysoption+3,R2
(0086) TCCR1B=0x05;
23E E085 LDI R24,5
23F BD8E OUT 0x2E,R24
(0087) serial_send(calling);
240 9100 0194 LDS R16,calling
242 9110 0195 LDS R17,calling+1
244 D410 RCALL _serial_send
(0088) return 0;
245 2700 CLR R16
246 2711 CLR R17
247 C53B RJMP pop_xgsetF000
_cancel:
i --> R20
argv --> Y,+3
argc --> Y,+1
248 D516 RCALL push_arg4
249 934A ST R20,-Y
(0089) }
(0090) int cancel(char argc,char*argv[])
(0091) {
(0092) char i;
(0093) M8880_Handdown;
24A 98AD CBI 0x15,5
(0094) for (i=0;i<10;i++) delay(0xffff);
24B 2744 CLR R20
24C C004 RJMP 0x0251
24D EF0F LDI R16,0xFF
24E EF1F LDI R17,0xFF
24F D10F RCALL _delay
250 9543 INC R20
251 304A CPI R20,0xA
252 F3D0 BCS 0x024D
(0095) sysoption.calling=0;
253 2422 CLR R2
254 9220 0203 STS sysoption+1,R2
(0096) MCUCR&=~0xc;
256 B785 IN R24,0x35
257 7F83 ANDI R24,0xF3
258 BF85 OUT 0x35,R24
(0097) MCUCR|=0x8;
259 B785 IN R24,0x35
25A 6088 ORI R24,0x8
25B BF85 OUT 0x35,R24
(0098) serial_send(c_ok);
25C 9100 018E LDS R16,c_ok
25E 9110 018F LDS R17,c_ok+1
260 D3F4 RCALL _serial_send
(0099) return 0;
261 2700 CLR R16
262 2711 CLR R17
263 9149 LD R20,Y+
264 9624 ADIW R28,4
265 9508 RET
_help:
i --> R20
argv --> R22
argc --> R10
266 D521 RCALL push_xgsetF00C
267 01B9 MOVW R22,R18
268 2EA0 MOV R10,R16
(0100) }
(0101) int help(char argc,char* argv[])
(0102) {
(0103) signed char i=0;
269 2744 CLR R20
(0104) if (argc==1){
26A 2D8A MOV R24,R10
26B 3081 CPI R24,1
26C F551 BNE 0x0297
26D C01A RJMP 0x0288
(0105) while(InnerCmd[i].cmd){
(0106) serial_send(InnerCmd[i].cmd);
26E E006 LDI R16,6
26F 2F14 MOV R17,R20
270 0201 MULS R16,R17
271 01F0 MOVW R30,R0
272 E680 LDI R24,0x60
273 E090 LDI R25,0
274 0FE8 ADD R30,R24
275 1FF9 ADC R31,R25
276 8100 LDD R16,Z+0
277 8111 LDD R17,Z+1
278 D3DC RCALL _serial_send
(0107) serial_send(":\t");
279 EB01 LDI R16,0xB1
27A E010 LDI R17,0
27B D3D9 RCALL _serial_send
(0108) serial_send(InnerCmd[i].help);
27C E006 LDI R16,6
27D 2F14 MOV R17,R20
27E 0201 MULS R16,R17
27F 01F0 MOVW R30,R0
280 E682 LDI R24,0x62
281 E090 LDI R25,0
282 0FE8 ADD R30,R24
283 1FF9 ADC R31,R25
284 8100 LDD R16,Z+0
285 8111 LDD R17,Z+1
286 D3CE RCALL _serial_send
(0109) i++;
287 9543 INC R20
288 E006 LDI R16,6
289 2F14 MOV R17,R20
28A 0201 MULS R16,R17
28B 01F0 MOVW R30,R0
28C E680 LDI R24,0x60
28D E090 LDI R25,0
28E 0FE8 ADD R30,R24
28F 1FF9 ADC R31,R25
290 8020 LDD R2,Z+0
291 8031 LDD R3,Z+1
292 2022 TST R2
293 F6D1 BNE 0x026E
294 2033 TST R3
295 F6C1 BNE 0x026E
(0110) }
(0111) }else{
296 C016 RJMP 0x02AD
(0112) i=GetCmdMatch(argv[1]);
297 01FB MOVW R30,R22
298 8102 LDD R16,Z+2
299 8113 LDD R17,Z+3
29A D056 RCALL _GetCmdMatch
29B 2F40 MOV R20,R16
(0113) if (i<0)
29C 3000 CPI R16,0
29D F424 BGE 0x02A2
(0114) serial_send("Haven't this command.\n");
29E E90A LDI R16,0x9A
29F E010 LDI R17,0
2A0 D3B4 RCALL _serial_send
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -