예제 #1
0
파일: dz80.c 프로젝트: rasky/pacman
int diz80_pointers()
{
	char bstr[MAX_LINE_LEN];

	if(t[1]==-1) {
		return diz80_bytedata();
	}

	ckrange(0, bstr);
	FP(fx, "\tdefw %s", bstr);

	if(pass == 1 && a_labels) {
		symbol_newref(t[0]+256*t[1], pc, cstdfw);
	}

	return 2;
}
예제 #2
0
int
main(int argc, char **argv)
{
	int	c, n;
	long	lvalue, uvalue, intval;
	char	*ptr = 0;

	(void) setlocale(LC_ALL, "");

#if	!defined(TEXT_DOMAIN)
#define	TEXT_DOMAIN	"SYS_TEST"
#endif
	(void) textdomain(TEXT_DOMAIN);

	prog = prog_name(argv[0]);

	while ((c = getopt(argc, argv, "l:u:b:d:p:e:h:k:s:QW:?")) != EOF) {
		/* check for invalid option */
		if ((*prog == 'v') && !strchr(vusage, c))
			usage();
		if ((*prog == 'e') && !strchr(eusage, c))
			usage();
		if ((*prog == 'h') && !strchr(husage, c))
			usage();

		switch (c) {
		case 'Q':
			ckquit = 0;
			break;

		case 'W':
			ckwidth = atoi(optarg);
			if (ckwidth < 0) {
				(void) fprintf(stderr,
		gettext("%s: ERROR: negative display width specified\n"),
					prog);
				exit(1);
			}
			break;

		case 'b':
			base = atoi(optarg);
			if ((base < 2) || (base > 36)) {
				(void) fprintf(stderr,
		gettext("%s: ERROR: base must be between 2 and 36\n"),
					prog);
				exit(1);
			}
			break;

		case 'u':
			upper = optarg;
			break;

		case 'l':
			lower = optarg;
			break;

		case 'd':
			deflt = optarg;
			break;

		case 'p':
			prompt = optarg;
			break;

		case 'e':
			error = optarg;
			break;

		case 'h':
			help = optarg;
			break;

		case 'k':
			kpid = atoi(optarg);
			break;

		case 's':
			signo = atoi(optarg);
			break;

		default:
			usage();
		}
	}

	if (signo) {
		if (kpid == BADPID)
			usage();
	} else
		signo = SIGTERM;

	if (upper) {
		uvalue = strtol(upper, &ptr, base);
		if (ptr == upper) {
			(void) fprintf(stderr,
		gettext("%s: ERROR: invalid upper value specification\n"),
				prog);
			exit(1);
		}
	} else
		uvalue = LONG_MAX;
	if (lower) {
		lvalue =  strtol(lower, &ptr, base);
		if (ptr == lower) {
			(void) fprintf(stderr,
		gettext("%s: ERROR: invalid lower value specification\n"),
				prog);
			exit(1);
		}
	} else
		lvalue = LONG_MIN;

	if (uvalue < lvalue) {
		(void) fprintf(stderr,
		gettext("%s: ERROR: upper value is less than lower value\n"),
			prog);
		exit(1);
	}

	if (*prog == 'v') {
		if (argc != (optind+1))
			usage();
		exit(ckrange_val(lvalue, uvalue, base, argv[optind]));
	}

	if (optind != argc)
		usage();

	if (*prog == 'e') {
		ckindent = 0;
		ckrange_err(lvalue, uvalue, base, error);
		exit(0);
	} else if (*prog == 'h') {
		ckindent = 0;
		ckrange_hlp(lvalue, uvalue, base, help);
		exit(0);
	}

	n = ckrange(&intval, lvalue, uvalue, (short)base,
		deflt, error, help, prompt);	/* libadm interface */
	if (n == 3) {
		if (kpid > -2)
			(void) kill(kpid, signo);
		(void) puts("q");
	} else if (n == 0)
		(void) printf("%ld", intval);
	return (n);
}
예제 #3
0
파일: dz80.c 프로젝트: rasky/pacman
/* Returns number of bytes used */
int diz80()
{
char stri[80];
char stro[80];
int a,r,i;
char bstr[MAX_LINE_LEN];
char rstr[MAX_LINE_LEN];

/* indent all instructions*/
FP(fx,"\t");

if(t[0] == 0xcb) {
	a=t[1];
	if(a==-1) {
		FP(fx,"defb 0%02xh", t[0]);
		return(1);
	}
	if(a < 8)				FP(fx,"rlc ");
	else if((a >= 0x08) && (a < 0x10))	FP(fx,"rrc ");
	else if((a >= 0x10) && (a < 0x18))	FP(fx,"rl ");
	else if((a >= 0x18) && (a < 0x20))	FP(fx,"rr ");
	else if((a >= 0x20) && (a < 0x28))	FP(fx,"sla ");
	else if((a >= 0x28) && (a < 0x30))	FP(fx,"sra ");
	/* undocumented instruction SLI (shift left with 1 insertion) */
	else if((a >= 0x30) && (a < 0x38))	FP(fx,"sli ");
	else if((a >= 0x38) && (a < 0x40))	FP(fx,"srl ");
	else if((a >= 0x40) && (a < 0x80))	FP(fx,"bit %d,",(a-0x40)/8);
	else if((a >= 0x80) && (a < 0xc0))	FP(fx,"res %d,",(a-0x80)/8);
	else if(a >= 0xc0)			FP(fx,"set %d,",(a-0xc0)/8);
	FP(fx,"%s",rarg[a%8]);
	f_z80=1;
	return(2);
} else if(t[0] == 0xed) {
	a=t[1];
	if(a==-1) {
		FP(fx,"defb 0%02xh", t[0]);
		return(1);
	}
/*
if((a>=0x40)&&(a<0x50)&&(ed40[a-0x40][0]!='0'))FP(fx,"%s",ed40[a-0x40]);
else if((a>=0x50)&&(a<0x60)&&(ed50[a-0x50][0]!='0'))FP(fx,"%s",ed50[a-0x50]);
else if((a>=0x60)&&(a<0x70)&&(ed60[a-0x60][0]!='0'))FP(fx,"%s",ed60[a-0x60]);
else if((a>=0x70)&&(a<0x80)&&(ed70[a-0x70][0]!='0'))FP(fx,"%s",ed70[a-0x70]);
else if((a>=0xa0)&&(a<0xb0)&&(eda0[a-0xa0][0]!='0'))FP(fx,"%s",eda0[a-0xa0]);
else if((a>=0xb0)&&(a<0xc0)&&(edb0[a-0xb0][0]!='0'))FP(fx,"%s",edb0[a-0xb0]);
*/
	if((a>=0x40)&&(a<0x50)&&(ed40[a-0x40][0]!='0')) i=0;
	else if((a>=0x50)&&(a<0x60)&&(ed50[a-0x50][0]!='0')) i=1;
	else if((a>=0x60)&&(a<0x70)&&(ed60[a-0x60][0]!='0')) i=2;
	else if((a>=0x70)&&(a<0x80)&&(ed70[a-0x70][0]!='0')) i=3;
	else if((a>=0xa0)&&(a<0xb0)&&(eda0[a-0xa0][0]!='0')) i=4;
	else if((a>=0xb0)&&(a<0xc0)&&(edb0[a-0xb0][0]!='0')) i=5;
	else {
		FP(fx,"defb 0edh");
		FP(fx,";next byte illegal after ed");
		return(1);
	}
	r=ckrange(2,bstr);
	if(r==-1) {
		FP(fx,"defb");
		for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
		return(i);
	}
	f_z80=1;
	switch(i) {
		case 0: FP(fx,"%s",ed40[a-0x40]);
			break;
		case 1: FP(fx,"%s",ed50[a-0x50]);
			break;
		case 2: FP(fx,"%s",ed60[a-0x60]);
			break;
		case 3: FP(fx,"%s",ed70[a-0x70]);
			break;
		case 4: FP(fx,"%s",eda0[a-0xa0]);
			break;
		case 5: FP(fx,"%s",edb0[a-0xb0]);
			break;
	}

/*if arg not in prog range it is a constant*/
	if(a == 0x43)
		{
		FP(fx,"%s),bc",bstr);
		return(4);
		}
	else if(a == 0x53)
		{
		FP(fx,"%s),de",bstr);
		return(4);
		}
	else if(a == 0x73)
		{
		FP(fx,"%s),sp",bstr);
		return(4);
		}
	else if((a == 0x4b) || (a == 0x5b) || (a == 0x7b))
		{
		FP(fx,"%s)",bstr);
		return(4);
		}
	return(2);
} else if((t[0] == 0xdd) || (t[0] == 0xfd)) {
	if(t[0]==0xfd) {
		strcpy(stri,"iy");
	} else {
		strcpy(stri,"ix");
	}
	if(t[1]==-1) {
		FP(fx,"defb 0%02xh", t[0]);
		return(1);
	}
	r=ckrange(2,bstr);
	f_z80=1;
	switch(t[1])
		{
		case 0x09:
			FP(fx,"add %s,bc",stri);
			return(2);
			break;
		case 0x19:
			FP(fx,"add %s,de",stri);
			return(2);
			break;
		case 0x21:
			if(r==-1) {
				FP(fx,"defb");
				for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
				return(i);
			}
			FP(fx,"ld %s,%s",stri,bstr);
			return(4);
			break;
		case 0x22:
			if(r==-1) {
				FP(fx,"defb");
				for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
				return(i);
			}
			FP(fx,"ld (%s),%s",bstr,stri);
			return(4);
			break;
		case 0x23:
			FP(fx,"inc %s",stri);
			return(2);
			break;
		case 0x29:
			FP(fx,"add %s,%s",stri,stri);
			return(2);
			break;
		case 0x2a:
			if(r==-1) {
				FP(fx,"defb");
				for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
				return(i);
			}
			FP(fx,"ld %s,(%s)",stri,bstr);
			return(4);
			break;
		case 0x2b:
			FP(fx,"dec %s",stri);
			return(2);
			break;
		case 0x39:
			FP(fx,"add %s,sp",stri);
			return(2);
			break;
		case 0xe1:
			FP(fx,"pop %s",stri);
			return(2);
			break;
		case 0xe3:
			FP(fx,"ex (sp),%s",stri);
			return(2);
			break;
		case 0xe5:
			FP(fx,"push %s",stri);
			return(2);
			break;
		case 0xe9:
			FP(fx,"jp (%s)",stri);
			return(2);
			break;
		case 0xf9:
			FP(fx,"ld sp,%s",stri);
			return(2);
			break;
		} /* end switch */
	/* now it must be an instruction of type (ix+dd) or (iy+dd) */

	if((t[2]==-1)||(t[3]==-1)) {
		FP(fx,"defb");
		for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
		return(i);
	}

	if(t[2] < 128) {
		sprintf(stro,"(%s+0%02xh)",stri,t[2]);
		/* stro is: (ix+dd) or (iy+dd) */
	} else {
		sprintf(stro,"(%s-0%02xh)",stri,256 - t[2]); 
	}

	if(t[1]==0xcb)
		{
		switch(t[3])
			{
			case 0x06:
				FP(fx,"rlc ");
				break;
			case 0x0e:
				FP(fx,"rrc ");
				break;
			case 0x16:
				FP(fx,"rl ");
				break;
			case 0x1e:
				FP(fx,"rr ");
				break;
			case 0x26:
				FP(fx,"sla ");
				break;
			case 0x2e:
				FP(fx,"sra ");
				break;
			case 0x3e:
				FP(fx,"srl ");
				break;
			case 0x46:
				FP(fx,"bit 0,");
				break;
			case 0x4e:
				FP(fx,"bit 1,");
				break;
			case 0x56:
				FP(fx,"bit 2,");
				break;
			case 0x5e:
				FP(fx,"bit 3,");
				break;
			case 0x66:
				FP(fx,"bit 4,");
				break;
			case 0x6e:
				FP(fx,"bit 5,");
				break;
			case 0x76:
				FP(fx,"bit 6,");
				break;
			case 0x7e:
				FP(fx,"bit 7,");
				break;
			case 0x86:
				FP(fx,"res 0,");
				break;
			case 0x8e:
				FP(fx,"res 1,");
				break;
			case 0x96:
				FP(fx,"res 2,");
				break;
			case 0x9e:
				FP(fx,"res 3,");
				break;
			case 0xa6:
				FP(fx,"res 4,");
				break;
			case 0xae:
				FP(fx,"res 5,");
				break;
			case 0xb6:
				FP(fx,"res 6,");
				break;
			case 0xbe:
				FP(fx,"res 7,");
				break;
			case 0xc6:
				FP(fx,"set 0,");
				break;
			case 0xce:
				FP(fx,"set 1,");
				break;
			case 0xd6:
				FP(fx,"set 2,");
				break;
			case 0xde:
				FP(fx,"set 3,");
				break;
			case 0xe6:
				FP(fx,"set 4,");
				break;
			case 0xee:
				FP(fx,"set 5,");
				break;
			case 0xf6:
				FP(fx,"set 6,");
				break;
			case 0xfe:
				FP(fx,"set 7,");
				break;
			default:
		FP(fx,"defb 0%02xh,0%02xh,0%02xh,0%02xh\t;illegal sequence"\
			,t[0],t[1],t[2],t[3]);
				return(4);
			}/*end switch t[3]*/
		FP(fx,"%s",stro);
		return(4);
		}/*end dd cb or fd cb*/
	else switch(t[1])
		{
		case 0x34:
			FP(fx,"inc %s",stro);
			break;
		case 0x35:
			FP(fx,"dec %s",stro);
			break;
		case 0x36:
			FP(fx,"ld %s,0%02xh",stro,t[3]);
			return(4);
			break;
		case 0x46:
			FP(fx,"ld b,%s",stro);
			break;
		case 0x4e:
			FP(fx,"ld c,%s",stro);
			break;
		case 0x56:
			FP(fx,"ld d,%s",stro);
			break;
		case 0x5e:
			FP(fx,"ld e,%s",stro);
			break;
		case 0x66:
			FP(fx,"ld h,%s",stro);
			break;
		case 0x6e:
			FP(fx,"ld l,%s",stro);
			break;
		case 0x70:
			FP(fx,"ld %s,b",stro);
			break;
		case 0x71:
			FP(fx,"ld %s,c",stro);
			break;
		case 0x72:
			FP(fx,"ld %s,d",stro);
			break;
		case 0x73:
			FP(fx,"ld %s,e",stro);
			break;
		case 0x74:
			FP(fx,"ld %s,h",stro);
			break;
		case 0x75:
			FP(fx,"ld %s,l",stro);
			break;
		case 0x77:
			FP(fx,"ld %s,a",stro);
			break;
		case 0x7e:
			FP(fx,"ld a,%s",stro);
			break;
		case 0x86:
			FP(fx,"add a,%s",stro);
			break;
		case 0x8e:
			FP(fx,"adc a,%s",stro);
			break;
		case 0x96:
			FP(fx,"sub %s",stro);
			break;
		case 0x9e:
			FP(fx,"sbc a,%s",stro);
			break;
		case 0xa6:
			FP(fx,"and %s",stro);
			break;
		case 0xae:
			FP(fx,"xor %s",stro);
			break;
		case 0xb6:
			FP(fx,"or %s",stro);
			break;
		case 0xbe:
			FP(fx,"cp %s",stro);
			break;
		default:
			FP(fx,"defb 0%02xh,0%02xh,0%02xh\t;illegal sequence"\
			,t[0],t[1],t[2]);
			return(3);
		}/*end switch t[1]*/
	return(3);
	}/*end 0xdd and 0xfd group*/
r=ckrange(1,bstr);
switch(comtab[t[0]].type)
	{
	case 0:
		FP(fx,"%s",comtab[t[0]].com1);
		FP(fx,"\t");
		break;
	case 1:
		if(t[1]==-1) {
			FP(fx,"defb 0%02xh", t[0]);
			return(1);
		}
		FP(fx,"%s",comtab[t[0]].com1);
		FP(fx,"0%02xh",t[1]);
		break;
	case 2:
		if(r==-1) {
			FP(fx,"defb");
			for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
			return(i);
		}
		FP(fx,"%s",comtab[t[0]].com1);
		FP(fx,"%s",bstr);
		break;
	case 3:
		if(t[1]==-1) {
			FP(fx,"defb 0%02xh", t[0]);
			return(1);
		}
		FP(fx,"%s",comtab[t[0]].com1);
		if(comtab[t[0]].bytes == 2) {
			/*jr and djnz instr. are 2 bytes type 3*/

			/* don't need to check return value because we checked
			 * t[1] above */
			ckrange_rel(1,pc,rstr);
			FP(fx,"%s",rstr);
			
		} else {
			FP(fx,"0%02xh",t[1]);/*not jr*/
		}
		break;
	case 11:
		if(t[1]==-1) {
			FP(fx,"defb 0%02xh", t[0]);
			return(1);
		}
		FP(fx,"%s",comtab[t[0]].com1);
		FP(fx,"0%02xh%s",t[1],comtab[t[0]].com2);
		break;
	case 12:
		if(r==-1) {
			FP(fx,"defb");
			for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]);
			return(i);
		}
		FP(fx,"%s",comtab[t[0]].com1);
		FP(fx,"%s%s",bstr,comtab[t[0]].com2);
		break;
	}
a=comtab[t[0]].bytes;
if(comtab[t[0]].proc==1) {
	f_z80=1;
}
return(a);
}