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

📄 dis_sh.c

📁 umon bootloader source code, support mips cpu.
💻 C
字号:
/* dissh2.c:
 *
 *	General notice:
 *	This code is part of a boot-monitor package developed as a generic base
 *	platform for embedded system designs.  As such, it is likely to be
 *	distributed to various projects beyond the control of the original
 *	author.  Please notify the author of any enhancements made or bugs found
 *	so that all may benefit from the changes.  In addition, notification back
 *	to the author will allow the new user to pick up changes that may have
 *	been made by other users after this version of the code was distributed.
 *
 *	Note1: the majority of this code was edited with 4-space tabs.
 *	Note2: as more and more contributions are accepted, the term "author"
 *		   is becoming a mis-representation of credit.
 *
 *	Original author:	Ed Sutter
 *	Email:				esutter@lucent.com
 *	Phone:				908-582-2351
 */
#include "config.h"
#if INCLUDE_DISASSEMBLER
#include "genlib.h"

typedef unsigned long ulong;
typedef unsigned short ushort;
typedef unsigned char uchar;

extern	getreg();

int	inst0000(), inst0001(), inst0010(), inst0011();
int	inst0100(), inst0101(), inst0110(), inst0111();
int	inst1000(), inst1001(), inst1010(), inst1011();
int	inst1100(), inst1101(), inst1110(), inst1111();

int	(*functbl[])() = {
	inst0000,	inst0001,	inst0010,	inst0011,
	inst0100,	inst0101,	inst0110,	inst0111,
	inst1000,	inst1001,	inst1010,	inst1011,
	inst1100,	inst1101,	inst1110,	inst1111,
};

char *DisHelp[] = {
	"Disassemble memory",
	"-[m] {address | .} [lines]",
	" -m  interactive (-more-)",
	0,
};

static	ushort *loc;

int
Dis(argc,argv)
int	argc;
char	*argv[];
{
	void	disass(ushort *,int,int);
	int lines, opt, more;
	ushort	*at;

	more = 0;
	while ((opt=getopt(argc,argv,"m")) != -1) {
		switch(opt) {
		case 'm':
			more = 1;
			break;
		default:
			return(0);
		}
	}

	if (*argv[optind] == '.')
		getreg("PC",&at);
	else
		at = (ushort *)strtoul(argv[optind],0,0);

	if (argc == (optind+2))
		lines = strtoul(argv[optind+1],0,0);
	else
		lines = 8;

	while(1) {
		disass((ushort *)at,lines,0);
		if (more && More())
			at = loc;
		else
			break;
	}
	return(0);
}

void
disass(ushort *inst, int lines, int next)
{
	while (lines) {
		if (next)
			printf("Nxt inst: %04x ",*inst); 
		else
			printf("%08lx: %04x ",(ulong)inst,*inst);
		if (functbl[(*inst & 0xf000) >> 12](inst) == -1)
			printf("???\n");
		lines--;
		inst++;
	}
	loc = inst;
}

int
inst0000(ushort *inst)
{
	int	rs8, rs4;

	rs8 = (*inst & 0x0f00) >> 8;
	rs4 = (*inst & 0x00f0) >> 4;

	if (*inst == 0x0008)
		printf("clrt\n");
	else if (*inst == 0x0009)
		printf("nop\n");
	else if (*inst == 0x000b)
		printf("rts\n");
	else if (*inst == 0x0018)
		printf("sett\n");
	else if (*inst == 0x0019)
		printf("div0u\n");
	else if (*inst == 0x001b)
		printf("sleep\n");
	else if (*inst == 0x0028)
		printf("clrmac\n");
	else if (*inst == 0x002b)
		printf("rte\n");

	else if ((*inst & 0x00ff) == 0x0002)
		printf("stc\tsr,r%d\n",				rs8);
	else if ((*inst & 0x00ff) == 0x0003)
		printf("bsrf\tr%d\n",				rs8);
	else if ((*inst & 0x000f) == 0x0004)
		printf("mov.b\tr%d,@(r0,r%d)\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x0005)
		printf("mov.w\tr%d,@(r0,r%d)\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x0006)
		printf("mov.l\tr%d,@(r0,r%d)\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x0007)
		printf("mul.l\tr%d,r%d\n",			rs4,rs8);
	else if ((*inst & 0x00ff) == 0x000a)
		printf("sts\tmach,r%d\n",			rs8);
	else if ((*inst & 0x000f) == 0x000c)
		printf("mov.b\t@(r0,r%d),@r%d\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x000d)
		printf("mov.w\t@(r0,r%d),r%d\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x000e)
		printf("mov.l\t@(r0,r%d),r%d\n",	rs4,rs8);
	else if ((*inst & 0x000f) == 0x000f)
		printf("mac.l\t@r%d+,@r%d+\n",		rs4,rs8);

	else if ((*inst & 0x00ff) == 0x0012)
		printf("stc\tgbr,r%d\n",			rs8);
	else if ((*inst & 0x00ff) == 0x001a)
		printf("sts\tmacl,r%d\n",			rs8);
	else if ((*inst & 0x00ff) == 0x0022)
		printf("stc\tvbr,r%d\n",			rs8);
	else if ((*inst & 0x00ff) == 0x0023)
		printf("braf\tr%d\n",				rs8);
	else if ((*inst & 0x00ff) == 0x0029)
		printf("movt\tr%d\n",				rs8);
	else if ((*inst & 0x00ff) == 0x002a)
		printf("sts\tpr,r%d\n",				rs8);
	else
		return(-1);
	return(0);
}

int
inst0001(ushort *inst)
{
	printf("mov.l\tr%d,@(0x%x,r%d)\n",
		(*inst & 0x00f0) >> 4,(*inst & 0x00f) * 4,(*inst & 0x0f00) >> 8);
	return(0);
}

char *mnemfmt0010[] =  {
	"mov.b\tr%d,@r%d\n",
	"mov.w\tr%d,@r%d\n",
	"mov.l\tr%d,@r%d\n",
	0,
	"mov.b\tr%d,@-r%d\n",
	"mov.w\tr%d,@-r%d\n",
	"mov.l\tr%d,@-r%d\n",
	"div0s\tr%d,r%d\n",
	"tst\tr%d,r%d\n",
	"and\tr%d,r%d\n",
	"xor\tr%d,r%d\n",
	"or\tr%d,r%d\n",
	"cmp/str\tr%d,r%d\n",
	"xtrct\tr%d,r%d\n",
	"mulu.w\tr%d,r%d\n",
	"muls.w\tr%d,r%d\n",
};

int
inst0010(ushort *inst)
{
	char	*fmt;

	fmt = mnemfmt0010[*inst & 0x000f];
	if (!fmt)
		return(-1);
	printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8);
	return(0);
}

char *mnemfmt0011[] =  {
	"cmp/eq\tr%d,r%d\n",
	0,
	"cmp/hs\tr%d,r%d\n",
	"cmp/ge\tr%d,r%d\n",
	"div1\tr%d,r%d\n",
	"dmulu.l\tr%d,r%d\n",
	"cmp/hi\tr%d,r%d\n",
	"cmp/gt\tr%d,r%d\n",
	"sub\tr%d,r%d\n",
	0,
	"subc\tr%d,r%d\n",
	"subv\tr%d,r%d\n",
	"add\tr%d,r%d\n",
	"dmuls.l\tr%d,r%d\n",
	"addc\tr%d,r%d\n",
	"addv\tr%d,r%d\n",
};

int
inst0011(ushort *inst)
{
	char	*fmt;

	fmt = mnemfmt0011[*inst & 0x000f];
	if (!fmt)
		return(-1);
	printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8);
	return(0);
}

char *mnemfmt0100[] =  {
	"shll\tr%d\n",
	"shlr\tr%d\n",
	"sts.l\tmach,@-r%d\n",
	"stc.l\tsr,@-r%d\n",
	"rotl\tr%d\n",
	"rotr\tr%d\n",
	"lds\t@r%d+,mach\n",
	"ldc.l\t@r%d+,sr\n",
	"shll2\tr%d\n",
	"shlr2\tr%d\n",
	"lds\tr%d,mach\n",
	"jsr\t@r%d\n",
	0,
	0,
	"ldc\t@r%d,sr\n",
	0,
	"dt\tr%d\n",
	"cmp/pz\tr%d\n",
	"sts.l\tmacl,@-r%d\n",
	"stc.l\tgbr,@-r%d\n",
	0,
	"cmp/pl\tr%d\n",
	"lds\t@r%d+,macl\n",
	"ldc.l\t@r%d+,gbr\n",
	"shll8\tr%d\n",
	"shlr8\tr%d\n",
	"lds\tr%d,macl\n",
	"tas.b\t@r%d\n",
	0,
	0,
	"ldc\t@r%d,gbr\n",
	0,
	"shal\tr%d\n",
	"shar\tr%d\n",
	"sts.l\tpr,@-r%d\n",
	"stc.l\tvbr,@-r%d\n",
	"rotcl\tr%d\n",
	"rotcr\tr%d\n",
	"lds\t@r%d+,pr\n",
	"ldc.l\t@r%d+,vbr\n",
	"shll16\tr%d\n",
	"shlr16\tr%d\n",
	"lds\tr%d,pr\n",
	"jmp\t@r%d\n",
	0,
	0,
	"ldc\t@r%d,vbr\n",
};

int
inst0100(ushort *inst)
{
	char	*fmt;

	if ((*inst & 0x000ff) == 0x000f) {
		printf("mac.w\t@r%d+,@r%d+\n",
			(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8);
		return(0);
	}

	fmt = mnemfmt0100[*inst & 0x00ff];
	if (!fmt)
		return(-1);
	printf(fmt,(*inst & 0x0f00) >> 8);
	return(0);
}

int
inst0101(ushort *inst)
{
	printf("mov.l\t@(0x%x,r%d),r%d\n",
		((*inst & 0x000f)*4),((*inst & 0x00f0) >> 4),(*inst & 0x0f00) >> 8);
	return(0);
}

char *mnemfmt0110[] =  {
	"mov.b\t@r%d,r%d\n",
	"mov.w\t@r%d,r%d\n",
	"mov.l\t@r%d,r%d\n",
	"mov\tr%d,r%d\n",
	"mov.b\t@r%d+,r%d\n",
	"mov.w\t@r%d+,r%d\n",
	"mov.l\t@r%d+,r%d\n",
	"not\tr%d,r%d\n",
	"swap.b\tr%d,r%d\n",
	"swap.w\tr%d,r%d\n",
	"negc\tr%d,r%d\n",
	"neg\tr%d,r%d\n",
	"extu.b\tr%d,r%d\n",
	"extu.w\tr%d,r%d\n",
	"exts.b\tr%d,r%d\n",
	"exts.w\tr%d,r%d\n",
};

int
inst0110(ushort *inst)
{
	char	*fmt;

	fmt = mnemfmt0110[*inst & 0x000f];
	printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8);
	return(0);
}

int
inst0111(ushort *inst)
{
	printf("add\t#0x%02x,r%d\n",(*inst & 0x00ff),(*inst & 0x0f00) >> 8);
	return(0);
}

int
inst1000(ushort *inst)
{
	unsigned long	rs4, label, disp;

	rs4 = (*inst & 0x00f0) >> 4;
	label = (ulong)(inst + ((*inst & 0x00ff) * 2));
	disp = *inst & 0x000f;

	if ((*inst & 0x0f00) == 0x0000)
		printf("mov.b\tr0,@(0x%lx,r%ld)\n",	disp,rs4);
	else if ((*inst & 0x0f00) == 0x0100)
		printf("mov.w\tr0,@(0x%lx,r%ld)\n",	(disp * 2),rs4);
	else if ((*inst & 0x0f00) == 0x0400)
		printf("mov.b\t@(0x%lx,r%ld),r0\n",	disp,rs4);
	else if ((*inst & 0x0f00) == 0x0500)
		printf("mov.w\t@(0x%lx,r%ld),r0\n",	(disp * 2),rs4);
	else if ((*inst & 0x0f00) == 0x0800)
		printf("cmp/eq\t#0x%02x,r0\n",		(*inst & 0x00ff));
	else if ((*inst & 0x0f00) == 0x0900)
		printf("bt\t0x%08lx\n",				label);
	else if ((*inst & 0x0f00) == 0x0b00)
		printf("bf\t0x%08lx\n",				label);
	else if ((*inst & 0x0f00) == 0x0d00)
		printf("bt/s\t0x%08lx\n",			label);
	else if ((*inst & 0x0f00) == 0x0f00)
		printf("bf/s\t0x%08lx\n",			label);
	else
		return(-1);
	return(0);
}

int
inst1001(ushort *inst)
{
	int	disp, rs8;

	disp = (*inst & 0x00ff);
	rs8 = (*inst & 0x0f00) >> 8;

	printf("mov.w\t@(0x%x,pc),r%d (0x%04x -> r%d)\n",
		disp*2,rs8,*(ushort *)(inst+disp+2),rs8);
	return(0);
}

int
inst1010(ushort *inst)
{
	printf("bra\t0x%08x\n",(int)inst + ((*inst & 0x0fff) * 2) + 4);
	return(0);
}

int
inst1011(ushort *inst)
{
	printf("bsr\t0x%08x\n",(int)inst + ((*inst & 0x0fff) * 2));
	return(0);
}

int
inst1100(ushort *inst)
{
	int	disp;

	disp = *inst & 0x00ff;
	
	if ((*inst & 0x0f00) == 0x0000)
		printf("mov.b\tr0,@(0x%x,gbr)\n",	disp);
	else if ((*inst & 0x0f00) == 0x0100)
		printf("mov.w\tr0,@(0x%x,gbr)\n",	disp*2);
	else if ((*inst & 0x0f00) == 0x0200)
		printf("mov.l\tr0,@(0x%x,gbr)\n",	disp*4);
	else if ((*inst & 0x0f00) == 0x0300)
		printf("trapa\t#0x%x\n",			disp);
	else if ((*inst & 0x0f00) == 0x0400)
		printf("mov.b\t@(0x%x,gbr),r0\n",	disp);
	else if ((*inst & 0x0f00) == 0x0500)
		printf("mov.w\t@(0x%x,gbr),r0\n",	disp*2);
	else if ((*inst & 0x0f00) == 0x0600)
		printf("mov.l\t@(0x%x,gbr),r0\n",	disp*4);
	else if ((*inst & 0x0f00) == 0x0700)
		printf("mova\t@(0x%x,pc),r0\n",		disp*4);
	else if ((*inst & 0x0f00) == 0x0800)
		printf("tst\t#0x%x,r0\n",			disp);
	else if ((*inst & 0x0f00) == 0x0900)
		printf("and\t#0x%02x,r0\n",			disp);
	else if ((*inst & 0x0f00) == 0x0a00)
		printf("xor\t#0x%x,r0\n",			disp);
	else if ((*inst & 0x0f00) == 0x0b00)
		printf("or\t#0x%x,r0\n",			disp);
	else if ((*inst & 0x0f00) == 0x0c00)
		printf("tst.b\t#0x%x,@(r0,gbr)\n",	disp);
	else if ((*inst & 0x0f00) == 0x0d00)
		printf("and.b\t#0x%02x,@(r0,gbr)\n",disp);
	else if ((*inst & 0x0f00) == 0x0e00)
		printf("xor.b\t#0x%x,@(r0,gbr)\n",	disp);
	else if ((*inst & 0x0f00) == 0x0f00)
		printf("or.b\t#0x%x,@(r0,gbr)\n",	disp);
	else
		return(-1);
	return(0);
}

int
inst1101(ushort *inst)
{
	int	disp, rs8;

	disp = *inst & 0x00ff;
	rs8 = (*inst & 0x0f00) >> 8;
	printf("mov.l\t@(0x%x,pc),r%d (0x%08lx -> r%d)\n",
		disp*4,rs8,
		*(ulong *)((((int)inst&~3)+4)+(disp*4)),
		rs8);
	return(0);
}

int
ginst1101(ushort *inst)
{
	printf("mov.l\t@(0x%x,pc),r%d (0x%08lx -> r%d)\n",
		((*inst & 0x00ff)*4),(*inst & 0x0f00) >> 8,
		*(long *)(inst+((*inst & 0x00ff)*2)+2), (*inst & 0x0f00) >> 8);
	return(0);
}

int
inst1110(ushort *inst)
{
	printf("mov\t#0x%x,r%d\n",(*inst & 0x00ff),((*inst & 0x0f00) >> 8));
	return(0);
}

int
inst1111(ushort *inst)
{
	return(-1);
}
#endif

⌨️ 快捷键说明

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