⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.s

📁 使用8880实现DTMF通信及拨号的程序.
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module shell.c
	.area text(rom, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
_InnerCmd::
	.blkw 1
	.area idata
	.word L1
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L2
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_help
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L3
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L4
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_call
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L5
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L6
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_cancel
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L7
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L8
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_echo
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L9
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L10
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_read
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L11
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word L12
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkw 1
	.area idata
	.word PL_autoanswer
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.dbstruct 0 6 tagCMDSTRUCT
	.dbfield 0 cmd pc
	.dbfield 2 help pc
	.dbfield 4 proc pfI
	.dbend
	.dbsym e InnerCmd _InnerCmd A[42:7]S[tagCMDSTRUCT]
	.area text(rom, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\shell.c
	.dbfunc e read _read fI
;              x -> R10,R11
;            buf -> y+0
;           argv -> R22,R23
;           argc -> R20
	.even
_read::
	rcall push_xgsetF00C
	movw R22,R18
	mov R20,R16
	sbiw R28,63
	sbiw R28,37  ; offset = 100
	.dbline -1
	.dbline 24
; #include "serial.h"
; #include "string.h"
; #include "8880.h"
; #include <iom8v.h>
; #include "main.h"
; #include "shell.h"
; typedef int (*cmdproc)(char argc,char *argv[]);
; typedef struct tagCMDSTRUCT{
; 	   char *cmd;
; 	   char *help;
; 	   cmdproc proc;
; }CMD_STRUCT,*PCMD_STRUCT;
; signed char GetCmdMatch(char * cmd);
; CMD_STRUCT InnerCmd[]={
; 		   {"help","Desplay this information.\n",help},
; 		   {"call","call a telphon number,uses:call 110\n",call},
; 		   {"cancel","cancel a call process.\n", cancel},
; 		   {"echo","enable or disenable echo.\n",echo},
; 		   {"read","read a number from remote.\n",read},
; 		   {"autoanswer","auto answer the remote call.\n",autoanswer}, 
; 		   {0,0}
; };
; int read(char argc,char*argv[])
; {
	.dbline 26
;  	char buf[100];
; 	int x=atoi(argv[1]);
	movw R30,R22
	ldd R16,z+2
	ldd R17,z+3
	rcall _atoi
	movw R10,R16
	.dbline 27
; 	if ((argc<2)||(!sysoption.calling)) {
	cpi R20,2
	brlo L17
X0:
	lds R2,_sysoption+1
	tst R2
	brne L14
X1:
L17:
	.dbline 27
	.dbline 28
; 	   serial_send(c_error);
	lds R16,_c_error
	lds R17,_c_error+1
	rcall _serial_send
	.dbline 29
; 	   return 0;
	clr R16
	clr R17
	rjmp L13
L14:
	.dbline 31
; 	}
;  	M8880_Recv(buf,x);
	mov R18,R10
	movw R16,R28
	rcall _M8880_Recv
	.dbline 32
; 	serial_send(buf);
	movw R16,R28
	rcall _serial_send
	.dbline -2
L13:
	.dbline 0 ; func end
	adiw R28,63
	adiw R28,37  ; offset = 100
	rjmp pop_xgsetF00C
	.dbsym r x 10 I
	.dbsym l buf 0 A[100:100]c
	.dbsym r argv 22 ppc
	.dbsym r argc 20 c
	.dbend
	.dbfunc e autoanswer _autoanswer fI
;           argv -> R20,R21
;           argc -> R22
	.even
_autoanswer::
	rcall push_xgsetF000
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 35
; }
; int autoanswer(char argc,char*argv[])
; {
	.dbline 36
;  	if (argc<2){
	cpi R22,2
	brsh L19
X2:
	.dbline 36
	.dbline 37
; 	   serial_send(c_error);
	lds R16,_c_error
	lds R17,_c_error+1
	rcall _serial_send
	.dbline 38
; 	   return 0;
	clr R16
	clr R17
	rjmp L18
L19:
	.dbline 40
; 	}
; 	if (strcmp(argv[1],"on")==0)
	ldi R18,<L23
	ldi R19,>L23
	movw R30,R20
	ldd R16,z+2
	ldd R17,z+3
	rcall _strcmp
	cpi R16,0
	cpc R16,R17
	brne L21
X3:
	.dbline 41
; 	   sysoption.autoanswer=-1;
	ldi R24,255
	sts _sysoption+4,R24
	rjmp L22
L21:
	.dbline 43
; 	else
; 	   sysoption.autoanswer=0;
	clr R2
	sts _sysoption+4,R2
L22:
	.dbline 44
; 	serial_send(c_ok); 
	lds R16,_c_ok
	lds R17,_c_ok+1
	rcall _serial_send
	.dbline 45
; 	return 0;
	clr R16
	clr R17
	.dbline -2
L18:
	.dbline 0 ; func end
	rjmp pop_xgsetF000
	.dbsym r argv 20 ppc
	.dbsym r argc 22 c
	.dbend
	.dbfunc e echo _echo fI
;           argv -> R20,R21
;           argc -> R22
	.even
_echo::
	rcall push_xgsetF000
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 48
; }
; int echo(char argc,char*argv[])
; {
	.dbline 49
;  	if (argc<2){
	cpi R22,2
	brsh L27
X4:
	.dbline 49
	.dbline 50
; 	   serial_send(c_error);
	lds R16,_c_error
	lds R17,_c_error+1
	rcall _serial_send
	.dbline 51
; 	   return 0;
	clr R16
	clr R17
	rjmp L26
L27:
	.dbline 53
; 	}
; 	if (strcmp(argv[1],"on")==0)
	ldi R18,<L23
	ldi R19,>L23
	movw R30,R20
	ldd R16,z+2
	ldd R17,z+3
	rcall _strcmp
	cpi R16,0
	cpc R16,R17
	brne L29
X5:
	.dbline 54
; 	   sysoption.echo=-1;
	ldi R24,255
	sts _sysoption,R24
	rjmp L30
L29:
	.dbline 56
; 	else
; 	   sysoption.echo=0;
	clr R2
	sts _sysoption,R2
L30:
	.dbline 57
; 	serial_send(c_ok);
	lds R16,_c_ok
	lds R17,_c_ok+1
	rcall _serial_send
	.dbline 58
; 	return 0;
	clr R16
	clr R17
	.dbline -2
L26:
	.dbline 0 ; func end
	rjmp pop_xgsetF000
	.dbsym r argv 20 ppc
	.dbsym r argc 22 c
	.dbend
	.dbfunc e call _call fI
;              i -> R22
;              c -> R22,R23
;           argv -> R20,R21
;           argc -> R22
	.even
_call::
	rcall push_xgsetF000
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 61
; }
; int call(char argc,char*argv[])
; {
	.dbline 64
;  	char i;
; 	char *c;
; 	if (sysoption.calling){
	lds R2,_sysoption+1
	tst R2
	breq L32
X6:
	.dbline 64
	.dbline 65
; 	   serial_send(c_busying);
	lds R16,_c_busying
	lds R17,_c_busying+1
	rcall _serial_send
	.dbline 66
; 	   return 0;
	clr R16
	clr R17
	rjmp L31
L32:
	.dbline 67
; 	};
	.dbline 68
; 	if (argc<2){
	cpi R22,2
	brsh L35
X7:
	.dbline 68
	.dbline 69
; 	   serial_send(c_error);
	lds R16,_c_error
	lds R17,_c_error+1
	rcall _serial_send
	.dbline 70
; 	   return 0;
	clr R16
	clr R17
	rjmp L31
L35:
	.dbline 72
; 	}
; 	c=argv[1];
	movw R30,R20
	ldd R22,z+2
	ldd R23,z+3
	rjmp L38
L37:
	.dbline 73
; 	while(*c){
	.dbline 74
; 		if ((*c<'0')||(*c>'9')) {
	movw R30,R22
	ldd R2,z+0
	clr R3
	mov R24,R2
	cpi R24,48
	brlo L42
X8:
	ldi R24,57
	cp R24,R2
	brsh L40
X9:
L42:
	.dbline 74
	.dbline 75
; 		   serial_send(c_error);
	lds R16,_c_error
	lds R17,_c_error+1
	rcall _serial_send
	.dbline 76
; 		   return 0;
	clr R16
	clr R17
	rjmp L31
L40:
	.dbline 78
; 		}
; 		c++;
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 79
; 	}
L38:
	.dbline 73
	movw R30,R22
	ldd R2,z+0
	tst R2
	brne L37
X10:
	.dbline 80
;  	M8880_Handup;
	sbi 0x15,5
	.dbline 80
	.dbline 81
; 	for (i=0;i<10;i++)
	clr R22
	rjmp L46
L43:
	.dbline 82
; 	delay(0xffff);
	ldi R16,65535
	ldi R17,255
	rcall _delay
L44:
	.dbline 81
	inc R22
L46:
	.dbline 81
	cpi R22,10
	brlo L43
X11:
	.dbline 83
;  	M8880_CPDial(argv[1]); 
	movw R30,R20
	ldd R16,z+2
	ldd R17,z+3
	rcall _M8880_CPDial
	.dbline 84
; 	sysoption.calling=1;
	ldi R24,1
	sts _sysoption+1,R24
	.dbline 85
; 	sysoption.timer=0;
	clr R2
	sts _sysoption+3,R2
	.dbline 86
; 	TCCR1B=0x05;
	ldi R24,5
	out 0x2e,R24
	.dbline 87
; 	serial_send(calling);
	lds R16,_calling
	lds R17,_calling+1
	rcall _serial_send
	.dbline 88
; 	return 0;
	clr R16
	clr R17
	.dbline -2
L31:
	.dbline 0 ; func end
	rjmp pop_xgsetF000
	.dbsym r i 22 c
	.dbsym r c 22 pc
	.dbsym r argv 20 ppc
	.dbsym r argc 22 c
	.dbend
	.dbfunc e cancel _cancel fI
;              i -> R20
;           argv -> <dead>
;           argc -> <dead>
	.even
_cancel::
	rcall push_arg4
	st -y,R20
	.dbline -1
	.dbline 91
; }
; int cancel(char argc,char*argv[])
; {
	.dbline 93
;  	char i;
;  	M8880_Handdown;
	cbi 0x15,5
	.dbline 94
; 	for (i=0;i<10;i++) delay(0xffff);
	clr R20
	rjmp L53
L50:
	.dbline 94
	ldi R16,65535
	ldi R17,255
	rcall _delay
L51:
	.dbline 94
	inc R20
L53:
	.dbline 94
	cpi R20,10
	brlo L50
X12:
	.dbline 95
; 	sysoption.calling=0;
	clr R2
	sts _sysoption+1,R2
	.dbline 96
;  	MCUCR&=~0xc;
	in R24,0x35
	andi R24,243
	out 0x35,R24
	.dbline 97
; 	MCUCR|=0x8;
	in R24,0x35
	ori R24,8
	out 0x35,R24
	.dbline 98
; 	serial_send(c_ok);
	lds R16,_c_ok
	lds R17,_c_ok+1
	rcall _serial_send
	.dbline 99
;  	return 0;
	clr R16
	clr R17
	.dbline -2
L49:
	.dbline 0 ; func end
	ld R20,y+
	adiw R28,4
	ret
	.dbsym r i 20 c
	.dbsym l argv 3 ppc
	.dbsym l argc 1 c
	.dbend
	.dbfunc e help _help fI
;              i -> R20
;           argv -> R22,R23
;           argc -> R10
	.even
_help::
	rcall push_xgsetF00C
	movw R22,R18
	mov R10,R16
	.dbline -1
	.dbline 102
; }
; int help(char argc,char* argv[])
; {
	.dbline 103
;  	signed char i=0;
	clr R20
	.dbline 104
; 	if (argc==1){
	mov R24,R10
	cpi R24,1
	brne L56
X13:
	.dbline 104
	rjmp L59
L58:
	.dbline 105
; 	   while(InnerCmd[i].cmd){
	.dbline 106
; 		serial_send(InnerCmd[i].cmd);
	ldi R16,6
	mov R17,R20
	muls R16,R17
	movw R30,R0
	ldi R24,<_InnerCmd
	ldi R25,>_InnerCmd
	add R30,R24
	adc R31,R25
	ldd R16,z+0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -