1*5485Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5485Slinton 
3*5485Slinton static char sccsid[] = "@(#)printinst.c 1.1 01/18/82";
4*5485Slinton 
5*5485Slinton /*
6*5485Slinton  * decode and print the instructions
7*5485Slinton  */
8*5485Slinton 
9*5485Slinton #include "defs.h"
10*5485Slinton #include "machine.h"
11*5485Slinton #include "process.h"
12*5485Slinton #include "pxops.h"
13*5485Slinton #include "optab.h"
14*5485Slinton #include "object.h"
15*5485Slinton 
16*5485Slinton LOCAL ADDRESS printop(), docase();
17*5485Slinton 
18*5485Slinton /*
19*5485Slinton  * print instructions within the given address range
20*5485Slinton  */
21*5485Slinton 
22*5485Slinton printinst(lowaddr, highaddr)
23*5485Slinton ADDRESS lowaddr;
24*5485Slinton ADDRESS highaddr;
25*5485Slinton {
26*5485Slinton 	register ADDRESS addr;
27*5485Slinton 
28*5485Slinton 	for (addr = lowaddr; addr <= highaddr; ) {
29*5485Slinton 		addr = printop(addr);
30*5485Slinton 	}
31*5485Slinton }
32*5485Slinton 
33*5485Slinton /*
34*5485Slinton  * print count instructions from given address
35*5485Slinton  */
36*5485Slinton 
37*5485Slinton printninst(count, addr)
38*5485Slinton int count;
39*5485Slinton ADDRESS addr;
40*5485Slinton {
41*5485Slinton 	int i;
42*5485Slinton 
43*5485Slinton 	for (i = 0; i < count; i++) {
44*5485Slinton 		addr = printop(addr);
45*5485Slinton 	}
46*5485Slinton }
47*5485Slinton 
48*5485Slinton /*
49*5485Slinton  * print the opcode at the given address, return the address
50*5485Slinton  * of the next instruction
51*5485Slinton  */
52*5485Slinton 
53*5485Slinton LOCAL ADDRESS printop(addr)
54*5485Slinton register ADDRESS addr;
55*5485Slinton {
56*5485Slinton 	int i;
57*5485Slinton 	PXOP op;
58*5485Slinton 	OPTAB *o;
59*5485Slinton 	char subop;
60*5485Slinton 	short arg;
61*5485Slinton 	long longarg;
62*5485Slinton 	union {
63*5485Slinton 		short i;
64*5485Slinton 		struct { char c1, c2; } opword;
65*5485Slinton 	} u;
66*5485Slinton 
67*5485Slinton 	iread(&u.i, addr, sizeof(u.i));
68*5485Slinton 	op = (PXOP) u.opword.c1;
69*5485Slinton 	subop = u.opword.c2;
70*5485Slinton 	o = &optab[op];
71*5485Slinton 	printf("%5d   %s", addr, o->opname);
72*5485Slinton 	addr += sizeof(u);
73*5485Slinton 	for (i = 0; o->argtype[i] != 0; i++) {
74*5485Slinton 		if (i == 0) {
75*5485Slinton 			putchar('\t');
76*5485Slinton 		} else {
77*5485Slinton 			putchar(',');
78*5485Slinton 		}
79*5485Slinton 		switch(o->argtype[i]) {
80*5485Slinton 			case ADDR4:
81*5485Slinton 			case LWORD:
82*5485Slinton 				iread(&longarg, addr, sizeof(longarg));
83*5485Slinton 				printf("%d", longarg);
84*5485Slinton 				addr += sizeof(long);
85*5485Slinton 				break;
86*5485Slinton 
87*5485Slinton 			case SUBOP:
88*5485Slinton 				printf("%d", subop);
89*5485Slinton 				break;
90*5485Slinton 
91*5485Slinton 			case ADDR2:
92*5485Slinton 			case DISP:
93*5485Slinton 			case PSUBOP:
94*5485Slinton 			case VLEN:
95*5485Slinton 			case HWORD:
96*5485Slinton 				if (i != 0 || subop == 0) {
97*5485Slinton 					iread(&arg, addr, sizeof(arg));
98*5485Slinton 					addr += sizeof(short);
99*5485Slinton 				} else {
100*5485Slinton 					arg = subop;
101*5485Slinton 				}
102*5485Slinton 				printf("%d", arg);
103*5485Slinton 				break;
104*5485Slinton 
105*5485Slinton 			case STRING: {
106*5485Slinton 				char c;
107*5485Slinton 
108*5485Slinton 				putchar('\'');
109*5485Slinton 				while (subop > 0) {
110*5485Slinton 					iread(&c, addr, sizeof(c));
111*5485Slinton 					if (c == '\0') {
112*5485Slinton 						break;
113*5485Slinton 					}
114*5485Slinton 					putchar(c);
115*5485Slinton 					subop--;
116*5485Slinton 					addr++;
117*5485Slinton 				}
118*5485Slinton 				addr++;
119*5485Slinton 				putchar('\'');
120*5485Slinton 				if ((addr&1) != 0) {
121*5485Slinton 					addr++;
122*5485Slinton 				}
123*5485Slinton 				break;
124*5485Slinton 			}
125*5485Slinton 
126*5485Slinton 			default:
127*5485Slinton 				panic("bad argtype %d", o->argtype[i]);
128*5485Slinton 				/*NOTREACHED*/
129*5485Slinton 		}
130*5485Slinton 	}
131*5485Slinton 	switch(op) {
132*5485Slinton 		case O_CASE1OP:
133*5485Slinton 			addr = docase(addr, 1, subop);
134*5485Slinton 			break;
135*5485Slinton 
136*5485Slinton 		case O_CASE2OP:
137*5485Slinton 			addr = docase(addr, 2, subop);
138*5485Slinton 			break;
139*5485Slinton 
140*5485Slinton 		case O_CASE4OP:
141*5485Slinton 			addr = docase(addr, 4, subop);
142*5485Slinton 			break;
143*5485Slinton 	}
144*5485Slinton 	putchar('\n');
145*5485Slinton 	return(addr);
146*5485Slinton }
147*5485Slinton 
148*5485Slinton /*
149*5485Slinton  * print out the destinations and cases
150*5485Slinton  */
151*5485Slinton 
152*5485Slinton LOCAL ADDRESS docase(addr, size, n)
153*5485Slinton ADDRESS addr;
154*5485Slinton int size;
155*5485Slinton int n;
156*5485Slinton {
157*5485Slinton 	register int i;
158*5485Slinton 	char c;
159*5485Slinton 	short arg;
160*5485Slinton 	long longarg;
161*5485Slinton 
162*5485Slinton 	iread(&arg, addr, sizeof(arg));
163*5485Slinton 	printf("\n\t%5d", arg);
164*5485Slinton 	addr += 2;
165*5485Slinton 	for (i = 1; i < n; i++) {
166*5485Slinton 		iread(&arg, addr, sizeof(arg));
167*5485Slinton 		printf(", %5d", arg);
168*5485Slinton 		addr += 2;
169*5485Slinton 	}
170*5485Slinton 	printf("\n\t");
171*5485Slinton 	for (i = 0; i < n; i++) {
172*5485Slinton 		switch(size) {
173*5485Slinton 			case 1:
174*5485Slinton 				iread(&c, addr, sizeof(c));
175*5485Slinton 				printf("%5d", c);
176*5485Slinton 				break;
177*5485Slinton 
178*5485Slinton 			case 2:
179*5485Slinton 				iread(&arg, addr, sizeof(arg));
180*5485Slinton 				printf("%5d", arg);
181*5485Slinton 				break;
182*5485Slinton 
183*5485Slinton 			case 4:
184*5485Slinton 				iread(&longarg, addr, sizeof(longarg));
185*5485Slinton 				printf("%5d", longarg);
186*5485Slinton 				break;
187*5485Slinton 		}
188*5485Slinton 		addr += size;
189*5485Slinton 		if (i < n - 1) {
190*5485Slinton 			printf(", ");
191*5485Slinton 		}
192*5485Slinton 	}
193*5485Slinton 	if ((addr&01) == 01) {
194*5485Slinton 		addr++;
195*5485Slinton 	}
196*5485Slinton 	return(addr);
197*5485Slinton }
198