/* * (C) 1983 UniSoft Corp. of Berkeley CA * * UniPlus Source Code. This program is proprietary * with Unisoft Corporation and is not to be reproduced * or used in any manner except as authorized in * writing by Unisoft. *//* * memtest *	standalone memory test program */#ifdef	DEBUGint	debug = 0;#endifmain(){	extern char begin[], end[];	register char *start, *last;        int i;        char buf[50];	printf("Standalone memory test\n\n");loop:	printf("Starting location: ");	gets(buf);	if ((start = (char *) gethex(buf)) == (char *) -1) {		printf("Illegal number\n\n");		goto loop;	}	printf("Ending location:   ");	gets(buf);	if ((last = (char *) gethex(buf)) == (char *) -1) {		printf("Illegal number\n\n");		goto loop;	}	if (last <= start) {		printf("last <= start\n");		goto loop;	}	if (last >= begin && start <= end+0x8000) {		printf("that would clobber you (%x-%x)\n", begin, end+0x8000);		goto loop;	}	for (i = 0; i < 10; i++) {		printf("00 ");		test1(0x00, start, last);		printf("55 ");		test1(0x55, start, last);		printf("aa ");		test1(0xaa, start, last);		printf("ff ");		test1(0xff, start, last);		printf("checker ");		checker(start, last);		printf("interact5 ");		interact(5, start, last);		if (i != 0) {			printf("interact11 ");			interact(11, start, last);		}		run(start, last);		printf("\007End of pass %d\n", i+1);	}	printf("Done\n\n");	goto loop;}/* * test1(pat, start, last) *	test all words with a fixed pattern */test1(pat, start, last)register char pat;char *start;register char *last;{	register char *cp;	for (cp = start; cp < last; cp++)	/* load pattern */		*cp = pat;	for (cp = start; cp < last; cp++) {	/* check pattern */		if (*cp != pat)			printf("0x%x  should be 0x%x  is 0x%x\n",				cp, pat & 0377, *cp & 0377);	}}/* * checker(start, last) *	test with a checkerboard pattern */checker(start, last)register char *start, *last;{	register char *cp;	for (cp = start; cp < last; ) {	/* load pattern */		*cp++ = 0x55;		*cp++ = 0xaa;	}	for (cp = start; cp < last; ) {	/* check pattern */		if (*cp++ != 0x55)			printf("0x%x  should be 0x%x  is 0x%x\n",				cp-1, 0x55, *(cp-1) & 0377);		if (*cp++ != 0xaa)			printf("0x%x  should be 0x%x  is 0x%x\n",				cp-1, 0xaa, *(cp-1) & 0377);	}	for (cp = start; cp < last; ) {	/* load complement pattern */		*cp++ = 0xaa;		*cp++ = 0x55;	}	for (cp = start; cp < last; ) {	/* check pattern */		if (*cp++ != 0xaa)			printf("0x%x  should be 0x%x  is 0x%x\n",				cp-1, 0xaa, *(cp-1) & 0377);		if (*cp++ != 0x55)			printf("0x%x  should be 0x%x  is 0x%x\n",				cp-1, 0x55, *(cp-1) & 0377);	}}/* * interact(mod, start, last) *	test interaction between words */interact(mod, start, last)register int mod;register char *start, *last;{	register char *cp;	register int i;	int is;	for (is = 0; is < mod; is++) {		for (cp = start; cp < last; )			*cp++ = 0;		for (cp = &start[is]; cp < last; cp += mod)			*cp = 0xff;		i = 0;		for (cp = start; cp < last; cp++)			if ((i++ % mod) != is) {				if (*cp != 0)				printf("0x%x  should be 0x%x  is 0x%x\n",					cp, 0, *cp & 0377);			}			else {				if (*cp != 0xff)				printf("0x%x  should be 0x%x  is 0x%x\n",					cp, 0xff, *cp & 0377);			}		for (cp = start; cp < last; )			*cp++ = 0xff;		for (cp = &start[is]; cp < last; cp += mod)			*cp = 0;		i = 0;		for (cp = start; cp < last; cp++)			if ((i++ % mod) != is) {				if (*cp != 0xff)				printf("0x%x  should be 0x%x  is 0x%x\n",					cp, 0xff, *cp & 0377);			}			else {				if (*cp != 0)				printf("0x%x  should be 0x%x  is 0x%x\n",					cp, 0, *cp & 0377);			}	}}#define NOP	0x4E71#define RTS	0x4E75run(start, last)register short *start, *last;{	register short *p;	for (p = start; p < last; p++)		*p = NOP;	*(last-1) = RTS;	printf("starting run");	((int (*)())(char *)start)();	printf(" -- done\n");}