xref: /csrg-svn/old/adb/adb.tahoe/opset.c (revision 26420)
1*26420Ssam #ifndef lint
2*26420Ssam static	char sccsid[] = "@(#)opset.c	1.1 (Berkeley) 02/25/86";
3*26420Ssam #endif
4*26420Ssam /*
5*26420Ssam  *
6*26420Ssam  *	UNIX debugger
7*26420Ssam  *
8*26420Ssam  */
9*26420Ssam 
10*26420Ssam #include "defs.h"
11*26420Ssam #include "optab.h"
12*26420Ssam 
13*26420Ssam STRING		errflg;
14*26420Ssam L_INT		dot;
15*26420Ssam INT		dotinc;
16*26420Ssam L_INT		var[];
17*26420Ssam 
18*26420Ssam 
19*26420Ssam /* instruction printing */
20*26420Ssam 
21*26420Ssam POS	type, space, incp;
22*26420Ssam 
23*26420Ssam OPTAB ioptab[256]; /* index by opcode to optab */
24*26420Ssam 
25*26420Ssam mkioptab() {/* set up ioptab */
26*26420Ssam 	REG OPTAB p=optab;
27*26420Ssam 	while (p->iname){
28*26420Ssam 		ioptab[p->val&LOBYTE]=p;
29*26420Ssam 		p++;
30*26420Ssam 	}
31*26420Ssam }
32*26420Ssam 
33*26420Ssam printins(idsp,ins)
34*26420Ssam 	REG L_INT	ins;
35*26420Ssam {
36*26420Ssam 	short	argno;		/* argument index */
37*26420Ssam 	REG	mode;		/* mode */
38*26420Ssam 	REG	r;		/* register name */
39*26420Ssam 	REG	d;		/* assembled byte, word, long or float */
40*26420Ssam 	long	snarf();
41*26420Ssam 	REG char *	ap;
42*26420Ssam 	REG OPTAB	ip;
43*26420Ssam 
44*26420Ssam 	type = DSYM;
45*26420Ssam 	space = idsp;
46*26420Ssam 	ins = byte(ins);
47*26420Ssam 	if((ip=ioptab[ins]) == (OPTAB)0) {
48*26420Ssam 		printf("?%2x%8t", ins);
49*26420Ssam 		dotinc = 1;
50*26420Ssam 		return;
51*26420Ssam 	}
52*26420Ssam 	printf("%s%8t",ip->iname);
53*26420Ssam 	incp = 1;
54*26420Ssam 	ap = ip->argtype;
55*26420Ssam 	for (argno=0; argno<ip->nargs; argno++,ap++) {
56*26420Ssam 		var[argno] = 0x80000000;
57*26420Ssam 		if (argno!=0) printc(',');
58*26420Ssam 	  top:
59*26420Ssam 		if (*ap&ACCB)
60*26420Ssam 			mode = 0xAF + ((*ap&7)<<5);  /* branch displacement */
61*26420Ssam 		else{
62*26420Ssam 			mode = bchkget(inkdot(incp),idsp); ++incp;
63*26420Ssam 		}
64*26420Ssam 		r = mode&0xF;
65*26420Ssam 		mode >>= 4;
66*26420Ssam 		switch ((int)mode) {
67*26420Ssam 			case 0:
68*26420Ssam 			case 1:
69*26420Ssam 			case 2:
70*26420Ssam 			case 3:
71*26420Ssam 				/* short literal */
72*26420Ssam 				printc('$');
73*26420Ssam 				d = mode<<4|r;
74*26420Ssam 				goto immed;
75*26420Ssam 			case 4: /* [r] */
76*26420Ssam 				printf("[%s]",regname[r]);
77*26420Ssam 				goto top;
78*26420Ssam 			case 5: /* r */
79*26420Ssam 				printf("%s",regname[r]);
80*26420Ssam 				break;
81*26420Ssam 			case 6: /* (r) */
82*26420Ssam 				printf("(%s)",regname[r]);
83*26420Ssam 				break;
84*26420Ssam 			case 7: /* -(r) */
85*26420Ssam 				printf("-(%s)",regname[r]);
86*26420Ssam 				break;
87*26420Ssam 			case 9: /* *(r)+ */
88*26420Ssam 				printc('*');
89*26420Ssam 			case 8: /* (r)+ */
90*26420Ssam 				if(r==0xF || mode==8 && (r==8 || r==9)) {
91*26420Ssam 					printc('$');
92*26420Ssam 					d = snarf((r&03)+1, idsp);
93*26420Ssam 				} else {	/*it's not PC immediate or abs*/
94*26420Ssam 					printf("(%s)+",regname[r]);
95*26420Ssam 					break;
96*26420Ssam 				}
97*26420Ssam 			immed:
98*26420Ssam 				if(ins == KCALL && d>=0 && d<SYSSIZ) {
99*26420Ssam 					if(systab[d])
100*26420Ssam 						printf(systab[d]);
101*26420Ssam 					else
102*26420Ssam 						printf("%R", d);
103*26420Ssam 					break;
104*26420Ssam 				}
105*26420Ssam 				goto disp;
106*26420Ssam 			case 0xB:	/* byte displacement deferred */
107*26420Ssam 			case 0xD:	/* word displacement deferred */
108*26420Ssam 			case 0xF:	/* long displacement deferred */
109*26420Ssam 				printc('*');
110*26420Ssam 			case 0xA:	/* byte displacement */
111*26420Ssam 			case 0xC:	/* word displacement */
112*26420Ssam 			case 0xE:	/* long displacement */
113*26420Ssam 				d = snarf(1<<((mode>>1&03)-1), idsp);
114*26420Ssam 				if (r==0xF) { /* PC offset addressing */
115*26420Ssam 					d += dot+incp;
116*26420Ssam 					psymoff(d,type,"");
117*26420Ssam 					var[argno]=d;
118*26420Ssam 					break;
119*26420Ssam 				}
120*26420Ssam 			disp:
121*26420Ssam 				if(d>=0 && d<maxoff)
122*26420Ssam 					printf("%R", d);
123*26420Ssam 				else
124*26420Ssam 					psymoff(d,type,"");
125*26420Ssam 				if (mode>=0xA)
126*26420Ssam 					printf("(%s)",regname[r]);
127*26420Ssam 				var[argno]=d;
128*26420Ssam 				break;
129*26420Ssam 		} /* end of the mode switch */
130*26420Ssam 	}
131*26420Ssam 	if (ins==CASEL) {
132*26420Ssam 		if(inkdot(incp)&01)	/* align */
133*26420Ssam 			incp++;
134*26420Ssam 		for (argno=0; argno<=var[2]; ++argno) {
135*26420Ssam 			printc(EOR);
136*26420Ssam 			printf("    %R:  ",argno+var[1]);
137*26420Ssam 			d=shorten(get(inkdot(incp+argno+argno),idsp));
138*26420Ssam 			if (d&0x8000) d -= 0x10000;
139*26420Ssam 			psymoff(inkdot(incp)+d,type,"");
140*26420Ssam 		}
141*26420Ssam 		incp += var[2]+var[2]+2;
142*26420Ssam 	}
143*26420Ssam 	dotinc=incp;
144*26420Ssam }
145*26420Ssam 
146*26420Ssam long snarf (nbytes, idsp)
147*26420Ssam {
148*26420Ssam 	register long value;
149*26420Ssam 
150*26420Ssam 	value = chkget(inkdot(incp), idsp);
151*26420Ssam 	incp += nbytes;
152*26420Ssam 	return(value>>(4-nbytes)*8);
153*26420Ssam }
154