📄 8880.lst
字号:
2A1 C00B RJMP 0x02AD
(0115) else
(0116) serial_send(InnerCmd[i].help);
2A2 E006 LDI R16,6
2A3 2F14 MOV R17,R20
2A4 0201 MULS R16,R17
2A5 01F0 MOVW R30,R0
2A6 E682 LDI R24,0x62
2A7 E090 LDI R25,0
2A8 0FE8 ADD R30,R24
2A9 1FF9 ADC R31,R25
2AA 8100 LDD R16,Z+0
2AB 8111 LDD R17,Z+1
2AC D3A8 RCALL _serial_send
(0117) }
(0118) return 0;
2AD 2700 CLR R16
2AE 2711 CLR R17
2AF C4DF RJMP pop_xgsetF00C
_ParseArgs:
i --> R10
state --> R22
c --> R20
argv --> Y,+8
argc --> R12
cmdline --> R10
2B0 D4F3 RCALL push_xgsetF03C
2B1 0169 MOVW R12,R18
2B2 0158 MOVW R10,R16
(0119) }
(0120) void ParseArgs(char *cmdline,signed char *argc,char** argv)
(0121) {
(0122) #define STATE_WHITESPACE 0
(0123) #define STATE_WORD 1
(0124)
(0125) char *c;
(0126) char state = STATE_WHITESPACE;
2B3 2766 CLR R22
(0127) char i;
(0128)
(0129) *argc = 0;
2B4 2422 CLR R2
2B5 01F6 MOVW R30,R12
2B6 8220 STD Z+0,R2
(0130)
(0131) if(strlen(cmdline) == 0)
2B7 0185 MOVW R16,R10
2B8 D49A RCALL _strlen
2B9 3000 CPI R16,0
2BA 0701 CPC R16,R17
2BB F409 BNE 0x02BD
(0132) return;
2BC C033 RJMP 0x02F0
(0133)
(0134) /* convert all tabs into single spaces */
(0135) c = cmdline;
2BD 01A5 MOVW R20,R10
2BE C008 RJMP 0x02C7
(0136) while(*c != '\0')
(0137) {
(0138) if(*c == '\t')
2BF 01FA MOVW R30,R20
2C0 8180 LDD R24,Z+0
2C1 3089 CPI R24,0x9
2C2 F411 BNE 0x02C5
(0139) *c = ' ';
2C3 E280 LDI R24,0x20
2C4 8380 STD Z+0,R24
(0140) c++;
2C5 5F4F SUBI R20,0xFF
2C6 4F5F SBCI R21,0xFF
2C7 01FA MOVW R30,R20
2C8 8020 LDD R2,Z+0
2C9 2022 TST R2
2CA F7A1 BNE 0x02BF
(0141) }
(0142)
(0143) c = cmdline;
2CB 01A5 MOVW R20,R10
(0144) i = 0;
2CC 24AA CLR R10
2CD C01C RJMP 0x02EA
(0145)
(0146) /* now find all words on the command line */
(0147) while(*c != '\0')
(0148) {
(0149) if(state == STATE_WHITESPACE)
2CE 2366 TST R22
2CF F489 BNE 0x02E1
(0150) {
(0151) if(*c != ' ')
2D0 01FA MOVW R30,R20
2D1 8180 LDD R24,Z+0
2D2 3280 CPI R24,0x20
2D3 F0A1 BEQ 0x02E8
(0152) {
(0153) argv[i] = c; //将argv[i]指向c
2D4 2DEA MOV R30,R10
2D5 27FF CLR R31
2D6 0FEE LSL R30
2D7 1FFF ROL R31
2D8 8408 LDD R0,Y+8
2D9 8419 LDD R1,Y+9
2DA 0DE0 ADD R30,R0
2DB 1DF1 ADC R31,R1
2DC 8351 STD Z+1,R21
2DD 8340 STD Z+0,R20
(0154) i++;
2DE 94A3 INC R10
(0155) state = STATE_WORD;
2DF E061 LDI R22,1
(0156) }
(0157) }
2E0 C007 RJMP 0x02E8
(0158) else
(0159) { /* state == STATE_WORD */
(0160) if(*c == ' ')
2E1 01FA MOVW R30,R20
2E2 8180 LDD R24,Z+0
2E3 3280 CPI R24,0x20
2E4 F419 BNE 0x02E8
(0161) {
(0162) *c = '\0';
2E5 2422 CLR R2
2E6 8220 STD Z+0,R2
(0163) state = STATE_WHITESPACE;
2E7 2766 CLR R22
(0164) }
(0165) }
(0166) c++;
2E8 5F4F SUBI R20,0xFF
2E9 4F5F SBCI R21,0xFF
2EA 01FA MOVW R30,R20
2EB 8020 LDD R2,Z+0
2EC 2022 TST R2
2ED F701 BNE 0x02CE
(0167) }
(0168)
(0169) *argc = i;
2EE 01F6 MOVW R30,R12
2EF 82A0 STD Z+0,R10
2F0 C4BC RJMP pop_xgsetF03C
_GetCmdMatch:
i --> R10
cmd --> R12
2F1 D47D RCALL push_xgset003C
2F2 0168 MOVW R12,R16
(0170) #undef STATE_WHITESPACE
(0171) #undef STATE_WORD
(0172) }
(0173) signed char GetCmdMatch(char * cmd)
(0174) {
(0175) char i=0;
2F3 24AA CLR R10
2F4 C011 RJMP 0x0306
(0176) while(InnerCmd[i].cmd){
(0177) if (strcmp(InnerCmd[i].cmd,cmd)==0) return i;
2F5 0196 MOVW R18,R12
2F6 E086 LDI R24,6
2F7 9D8A MUL R24,R10
2F8 01F0 MOVW R30,R0
2F9 E680 LDI R24,0x60
2FA E090 LDI R25,0
2FB 0FE8 ADD R30,R24
2FC 1FF9 ADC R31,R25
2FD 8100 LDD R16,Z+0
2FE 8111 LDD R17,Z+1
2FF D43D RCALL _strcmp
300 3000 CPI R16,0
301 0701 CPC R16,R17
302 F411 BNE 0x0305
303 2D0A MOV R16,R10
304 C00F RJMP 0x0314
(0178) i++;
305 94A3 INC R10
306 E086 LDI R24,6
307 9D8A MUL R24,R10
308 01F0 MOVW R30,R0
309 E680 LDI R24,0x60
30A E090 LDI R25,0
30B 0FE8 ADD R30,R24
30C 1FF9 ADC R31,R25
30D 8020 LDD R2,Z+0
30E 8031 LDD R3,Z+1
30F 2022 TST R2
310 F721 BNE 0x02F5
311 2033 TST R3
312 F711 BNE 0x02F5
(0179) }
(0180) return -1;
313 EF0F LDI R16,0xFF
314 C44F RJMP pop_xgset003C
_ParseCmd:
argv --> Y,+3
argc --> Y,+2
Cmd_Index --> R20
cmdline --> R10
315 D45E RCALL push_xgset300C
316 0158 MOVW R10,R16
317 972D SBIW R28,0xD
(0181) }
(0182) void ParseCmd(char *cmdline)
(0183) {
(0184) signed char argc,Cmd_Index;
(0185) char *argv[5];
(0186) ParseArgs(cmdline,&argc,argv);
318 01CE MOVW R24,R28
319 9603 ADIW R24,3
31A 8399 STD Y+1,R25
31B 8388 STD Y+0,R24
31C 019E MOVW R18,R28
31D 5F2E SUBI R18,0xFE
31E 4F3F SBCI R19,0xFF
31F 0185 MOVW R16,R10
320 DF8F RCALL _ParseArgs
(0187) if (argc==0) return;
321 802A LDD R2,Y+2
322 2022 TST R2
323 F409 BNE 0x0325
324 C02C RJMP 0x0351
(0188) Cmd_Index=GetCmdMatch(argv[0]);
325 810B LDD R16,Y+3
326 811C LDD R17,Y+4
327 DFC9 RCALL _GetCmdMatch
328 2F40 MOV R20,R16
(0189) if (Cmd_Index<0){
329 3000 CPI R16,0
32A F424 BGE 0x032F
(0190) serial_send("unknow command\n");
32B E80A LDI R16,0x8A
32C E010 LDI R17,0
32D D327 RCALL _serial_send
(0191) return;
32E C022 RJMP 0x0351
(0192) }
(0193) if (InnerCmd[Cmd_Index].proc)
32F E006 LDI R16,6
330 2F14 MOV R17,R20
331 0201 MULS R16,R17
332 01F0 MOVW R30,R0
333 E684 LDI R24,0x64
334 E090 LDI R25,0
335 0FE8 ADD R30,R24
336 1FF9 ADC R31,R25
337 8020 LDD R2,Z+0
338 8031 LDD R3,Z+1
339 2022 TST R2
33A F411 BNE 0x033D
33B 2033 TST R3
33C F0A1 BEQ 0x0351
(0194) InnerCmd[Cmd_Index].proc(argc,argv);
33D 019E MOVW R18,R28
33E 5F2D SUBI R18,0xFD
33F 4F3F SBCI R19,0xFF
340 810A LDD R16,Y+2
341 E086 LDI R24,6
342 930F PUSH R16
343 931F PUSH R17
344 2F08 MOV R16,R24
345 0201 MULS R16,R17
346 01F0 MOVW R30,R0
347 911F POP R17
348 910F POP R16
349 E684 LDI R24,0x64
34A E090 LDI R25,0
34B 0FE8 ADD R30,R24
34C 1FF9 ADC R31,R25
34D 81A0 LDD R26,Z+0
34E 81B1 LDD R27,Z+1
34F 01FD MOVW R30,R26
350 D465 RCALL xicall
351 962D ADIW R28,0xD
352 C426 RJMP pop_xgset300C
_shellin:
buf --> Y,+0
353 97E3 SBIW R28,0x33
(0195) }
(0196) void shellin(void)
(0197) {
(0198) char buf[51];
(0199) if (serial_recv(buf,50)>0){
354 E322 LDI R18,0x32
355 E030 LDI R19,0
356 018E MOVW R16,R28
357 D31A RCALL _serial_recv
358 3000 CPI R16,0
359 0701 CPC R16,R17
35A F011 BEQ 0x035D
(0200) ParseCmd(buf);
35B 018E MOVW R16,R28
35C DFB8 RCALL _ParseCmd
(0201) };
35D 96E3 ADIW R28,0x33
35E 9508 RET
FILE: E:\Shuaihu\AVR\8880\main.c
(0001) //ICC-AVR application builder : 2007-10-27 10:16:42
(0002) // Target : M8
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include "8880.h"
(0008) #include "serial.h"
(0009) #include "main.h"
(0010) #include "shell.h"
(0011) #include "timer.h"
(0012) SysOption sysoption;
(0013) void delay(unsigned int x)
(0014) {
(0015) for (;x>0;x--);
_delay:
x --> R16
35F C002 RJMP 0x0362
360 5001 SUBI R16,1
361 4010 SBCI R17,0
362 3000 CPI R16,0
363 0701 CPC R16,R17
364 F7D9 BNE 0x0360
365 9508 RET
(0016)
(0017) }
(0018) void port_init(void)
(0019) {
(0020) PORTB = 0x20; //00010000
_port_init:
366 E280 LDI R24,0x20
367 BB88 OUT 0x18,R24
(0021) DDRB = 0x0F; //00001111
368 E08F LDI R24,0xF
369 BB87 OUT 0x17,R24
(0022) PORTC = 0x0F; //00001111
36A BB85 OUT 0x15,R24
(0023) DDRC = 0x2F; //00100000
36B E28F LDI R24,0x2F
36C BB84 OUT 0x14,R24
(0024) PORTD = 0x0e; //00000100
36D E08E LDI R24,0xE
36E BB82 OUT 0x12,R24
(0025) DDRD = 0x02; //00000010
36F E082 LDI R24,2
370 BB81 OUT 0x11,R24
371 9508 RET
(0026) }
(0027)
(0028) //call this routine to initialize all peripherals
(0029) void init_devices(void)
(0030) {
(0031) //stop errant interrupts until set up
(0032) CLI(); //disable all interrupts
_init_devices:
372 94F8 BCLR 7
(0033) port_init();
373 DFF2 RCALL _port_init
(0034) uart0_init();
374 D25B RCALL _uart0_init
(0035) MCUCR = 0x08;
375 E088 LDI R24,0x8
376 BF85 OUT 0x35,R24
(0036) GICR = 0x80;
377 E880 LDI R24,0x80
378 BF8B OUT 0x3B,R24
(0037) TIMSK = 0x00; //timer interrupt sources
379 2422 CLR R2
37A BE29 OUT 0x39,R2
(0038) timer1_init();
37B D341 RCALL _timer1_init
(0039) SEI(); //re-enable interrupts
37C 9478 BSET 7
37D 9508 RET
_main:
buf --> Y,+0
37E 9764 SBIW R28,0x14
(0040) //all peripherals are now initialized
(0041) }
(0042) void main(void)
(0043) {
(0044) char buf[20];
(0045) init_devices();
37F DFF2 RCALL _init_devices
(0046) M8880_Init();
380 D072 RCALL _M8880_Init
(0047) sysoption.echo=-1;
381 EF8F LDI R24,0xFF
382 9380 0202 STS sysoption,R24
(0048) sysoption.calling=0;
384 2422 CLR R2
385 9220 0203 STS sysoption+1,R2
(0049) sysoption.timer=0;
387 9220 0205 STS sysoption+3,R2
(0050) sysoption.autoanswer=0;
389 9220 0206 STS 0x0206,R2
38B C001 RJMP 0x038D
(0051) while(1)shellin();
38C DFC6 RCALL _shellin
38D CFFE RJMP 0x038C
38E 9664 ADIW R28,0x14
38F 9508 RET
FILE: E:\Shuaihu\AVR\8880\8880.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "8880.h"
(0004) #include "serial.h"
(0005) #include "main.h"
(0006) #include "timer.h"
(0007) char sendbuf[M8880_SEND_BUFSIZE];
(0008) char recvbuf[M8880_RECV_BUFSIZE];
(0009) M8880_STATE M8880_State;
(0010) char *noresponse="noresponse\n";
(0011) char *handdown="handdown\n";
(0012) char *c_ok="ok\n";
(0013) char *c_error="error\n";
(0014) char *c_busying="busying\n";
(0015) char *calling="calling\n";
(0016) char *answering="answering\n";
(0017) void M8880_WriteChar(char c)
(0018) {
(0019) M8880_DataPort&=0xf0; //CLR low 4bit
_M8880_WriteChar:
c --> R16
390 B385 IN R24,0x15
391 7F80 ANDI R24,0xF0
392 BB85 OUT 0x15,R24
(0020) M8880_CtrlPort&=~(M8880_CS|M8880_RW|M8880_RS); //CLR CS RW RS hold CLK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -