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

📄 xmon.c

📁 microwindows移植到S3C44B0的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    "  l        change to long (4 byte) mode\n"    "  u        change to doubleword (8 byte) mode\n"    "  m addr   change current addr\n"    "  n        toggle no-read flag\n"    "  r        toggle byte reverse flag\n"    "  < count  back up count bytes\n"    "  > count  skip forward count bytes\n"    "  x        exit this mode\n"    "";voidmemex(){	int cmd, inc, i, nslash;	unsigned long n;	unsigned char val[16];	scanhex((void *)&adrs);	cmd = skipbl();	if (cmd == '?') {		printf(memex_help_string);		return;	} else {		termch = cmd;	}	last_cmd = "m\n";	while ((cmd = skipbl()) != '\n') {		switch( cmd ){		case 'b':	size = 1;	break;		case 'w':	size = 2;	break;		case 'l':	size = 4;	break;		case 'd':	size = 8;	break;		case 'r': 	brev = !brev;	break;		case 'n':	mnoread = 1;	break;		case '.':	mnoread = 0;	break;		}	}	if( size <= 0 )		size = 1;	else if( size > 8 )		size = 8;	for(;;){		if (!mnoread)			n = mread(adrs, val, size);		printf("%.16x%c", adrs, brev? 'r': ' ');		if (!mnoread) {			if (brev)				byterev(val, size);			putchar(' ');			for (i = 0; i < n; ++i)				printf("%.2x", val[i]);			for (; i < size; ++i)				printf("%s", fault_chars[fault_type]);		}		putchar(' ');		inc = size;		nslash = 0;		for(;;){			if( scanhex(&n) ){				for (i = 0; i < size; ++i)					val[i] = n >> (i * 8);				if (!brev)					byterev(val, size);				mwrite(adrs, val, size);				inc = size;			}			cmd = skipbl();			if (cmd == '\n')				break;			inc = 0;			switch (cmd) {			case '\'':				for(;;){					n = inchar();					if( n == '\\' )						n = bsesc();					else if( n == '\'' )						break;					for (i = 0; i < size; ++i)						val[i] = n >> (i * 8);					if (!brev)						byterev(val, size);					mwrite(adrs, val, size);					adrs += size;				}				adrs -= size;				inc = size;				break;			case ',':				adrs += size;				break;			case '.':				mnoread = 0;				break;			case ';':				break;			case 'x':			case EOF:				scannl();				return;			case 'b':			case 'v':				size = 1;				break;			case 'w':				size = 2;				break;			case 'l':				size = 4;				break;			case 'u':				size = 8;				break;			case '^':				adrs -= size;				break;				break;			case '/':				if (nslash > 0)					adrs -= 1 << nslash;				else					nslash = 0;				nslash += 4;				adrs += 1 << nslash;				break;			case '\\':				if (nslash < 0)					adrs += 1 << -nslash;				else					nslash = 0;				nslash -= 4;				adrs -= 1 << -nslash;				break;			case 'm':				scanhex((void *)&adrs);				break;			case 'n':				mnoread = 1;				break;			case 'r':				brev = !brev;				break;			case '<':				n = size;				scanhex(&n);				adrs -= n;				break;			case '>':				n = size;				scanhex(&n);				adrs += n;				break;			case '?':				printf(memex_subcmd_help_string);				break;			}		}		adrs += inc;	}}intbsesc(){	int c;	c = inchar();	switch( c ){	case 'n':	c = '\n';	break;	case 'r':	c = '\r';	break;	case 'b':	c = '\b';	break;	case 't':	c = '\t';	break;	}	return c;}#define isxdigit(c)	(('0' <= (c) && (c) <= '9') \			 || ('a' <= (c) && (c) <= 'f') \			 || ('A' <= (c) && (c) <= 'F'))voiddump(){	int c;	c = inchar();	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')		termch = c;	scanhex((void *)&adrs);	if( termch != '\n')		termch = 0;	if( c == 'i' ){		scanhex(&nidump);		if( nidump == 0 )			nidump = 16;		adrs += ppc_inst_dump(adrs, nidump);		last_cmd = "di\n";	} else {		scanhex(&ndump);		if( ndump == 0 )			ndump = 64;		prdump(adrs, ndump);		adrs += ndump;		last_cmd = "d\n";	}}voidprdump(unsigned long adrs, long ndump){	long n, m, c, r, nr;	unsigned char temp[16];	for( n = ndump; n > 0; ){		printf("%.16lx", adrs);		putchar(' ');		r = n < 16? n: 16;		nr = mread(adrs, temp, r);		adrs += nr;		for( m = 0; m < r; ++m ){		        if ((m & 7) == 0 && m > 0)			    putchar(' ');			if( m < nr )				printf("%.2x", temp[m]);			else				printf("%s", fault_chars[fault_type]);		}		for(; m < 16; ++m )			printf("   ");		printf("  |");		for( m = 0; m < r; ++m ){			if( m < nr ){				c = temp[m];				putchar(' ' <= c && c <= '~'? c: '.');			} else				putchar(' ');		}		n -= r;		for(; m < 16; ++m )			putchar(' ');		printf("|\n");		if( nr < r )			break;	}}intppc_inst_dump(unsigned long adr, long count){	int nr, dotted;	unsigned long first_adr;	unsigned long inst, last_inst;	unsigned char val[4];	dotted = 0;	for (first_adr = adr; count > 0; --count, adr += 4){		nr = mread(adr, val, 4);		if( nr == 0 ){			const char *x = fault_chars[fault_type];			printf("%.16lx  %s%s%s%s\n", adr, x, x, x, x);			break;		}		inst = GETWORD(val);		if (adr > first_adr && inst == last_inst) {			if (!dotted) {				printf(" ...\n");				dotted = 1;			}			continue;		}		dotted = 0;		last_inst = inst;		printf("%.16lx  ", adr);		printf("%.8x\t", inst);		print_insn_big_powerpc(stdout, inst, adr);	/* always returns 4 */		printf("\n");	}	return adr - first_adr;}voidprint_address(unsigned long addr){	printf("0x%lx", addr);}/* * Memory operations - move, set, print differences */static unsigned long mdest;		/* destination address */static unsigned long msrc;		/* source address */static unsigned long mval;		/* byte value to set memory to */static unsigned long mcount;		/* # bytes to affect */static unsigned long mdiffs;		/* max # differences to print */voidmemops(int cmd){	scanhex((void *)&mdest);	if( termch != '\n' )		termch = 0;	scanhex((void *)(cmd == 's'? &mval: &msrc));	if( termch != '\n' )		termch = 0;	scanhex((void *)&mcount);	switch( cmd ){	case 'm':		memmove((void *)mdest, (void *)msrc, mcount);		break;	case 's':		memset((void *)mdest, mval, mcount);		break;	case 'd':		if( termch != '\n' )			termch = 0;		scanhex((void *)&mdiffs);		memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);		break;	}}voidmemdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr){	unsigned n, prt;	prt = 0;	for( n = nb; n > 0; --n )		if( *p1++ != *p2++ )			if( ++prt <= maxpr )				printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,					p1[-1], p2 - 1, p2[-1]);	if( prt > maxpr )		printf("Total of %d differences\n", prt);}static unsigned mend;static unsigned mask;voidmemlocate(){	unsigned a, n;	unsigned char val[4];	last_cmd = "ml";	scanhex((void *)&mdest);	if (termch != '\n') {		termch = 0;		scanhex((void *)&mend);		if (termch != '\n') {			termch = 0;			scanhex((void *)&mval);			mask = ~0;			if (termch != '\n') termch = 0;			scanhex((void *)&mask);		}	}	n = 0;	for (a = mdest; a < mend; a += 4) {		if (mread(a, val, 4) == 4			&& ((GETWORD(val) ^ mval) & mask) == 0) {			printf("%.16x:  %.16x\n", a, GETWORD(val));			if (++n >= 10)				break;		}	}}static unsigned long mskip = 0x1000;static unsigned long mlim = 0xffffffff;voidmemzcan(){	unsigned char v;	unsigned a;	int ok, ook;	scanhex(&mdest);	if (termch != '\n') termch = 0;	scanhex(&mskip);	if (termch != '\n') termch = 0;	scanhex(&mlim);	ook = 0;	for (a = mdest; a < mlim; a += mskip) {		ok = mread(a, &v, 1);		if (ok && !ook) {			printf("%.8x .. ", a);			fflush(stdout);		} else if (!ok && ook)			printf("%.8x\n", a - mskip);		ook = ok;		if (a + mskip < a)			break;	}	if (ook)		printf("%.8x\n", a - mskip);}/* Input scanning routines */intskipbl(){	int c;	if( termch != 0 ){		c = termch;		termch = 0;	} else		c = inchar();	while( c == ' ' || c == '\t' )		c = inchar();	return c;}intscanhex(vp)unsigned long *vp;{	int c, d;	unsigned long v;	c = skipbl();	d = hexdigit(c);	if( d == EOF ){		termch = c;		return 0;	}	v = 0;	do {		v = (v << 4) + d;		c = inchar();		d = hexdigit(c);	} while( d != EOF );	termch = c;	*vp = v;	return 1;}voidscannl(){	int c;	c = termch;	termch = 0;	while( c != '\n' )		c = inchar();}inthexdigit(int c){	if( '0' <= c && c <= '9' )		return c - '0';	if( 'A' <= c && c <= 'F' )		return c - ('A' - 10);	if( 'a' <= c && c <= 'f' )		return c - ('a' - 10);	return EOF;}voidgetstring(char *s, int size){	int c;	c = skipbl();	do {		if( size > 1 ){			*s++ = c;			--size;		}		c = inchar();	} while( c != ' ' && c != '\t' && c != '\n' );	termch = c;	*s = 0;}static char line[256];static char *lineptr;voidflush_input(){	lineptr = NULL;}intinchar(){	if (lineptr == NULL || *lineptr == 0) {		if (fgets(line, sizeof(line), stdin) == NULL) {			lineptr = NULL;			return EOF;		}		lineptr = line;	}	return *lineptr++;}voidtake_input(str)char *str;{	lineptr = str;}/* Starting at codeaddr scan forward for a tbtable and fill in the given table.  Return non-zero if successful at doing something. */static intfind_tb_table(unsigned long codeaddr, struct tbtable *tab){	unsigned long codeaddr_max;	unsigned long tbtab_start;	int nr;	int instr;	int num_parms;	if (tab == NULL)		return 0;	memset(tab, 0, sizeof(tab));	/* Scan instructions starting at codeaddr for 128k max */	for (codeaddr_max = codeaddr + 128*1024*4;	     codeaddr < codeaddr_max;	     codeaddr += 4) {		nr = mread(codeaddr, &instr, 4);		if (nr != 4)			return 0;	/* Bad read.  Give up promptly. */		if (instr == 0) {			/* table should follow. */			int version;			unsigned long flags;			tbtab_start = codeaddr;	/* save it to compute func start addr */			codeaddr += 4;

⌨️ 快捷键说明

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