122367Sdist /*
222367Sdist  * Copyright (c) 1980 Regents of the University of California.
322367Sdist  * All rights reserved.  The Berkeley software License Agreement
422367Sdist  * specifies the terms and conditions for redistribution.
522367Sdist  */
65485Slinton 
722367Sdist #ifndef lint
8*30845Smckusick static char sccsid[] = "@(#)printinst.c	5.2 (Berkeley) 04/07/87";
922367Sdist #endif not lint
105485Slinton /*
115485Slinton  * decode and print the instructions
125485Slinton  */
135485Slinton 
145485Slinton #include "defs.h"
155485Slinton #include "machine.h"
165485Slinton #include "process.h"
175485Slinton #include "pxops.h"
185485Slinton #include "optab.h"
195485Slinton #include "object.h"
20*30845Smckusick #include "process/process.rep"
21*30845Smckusick #include "process/pxinfo.h"
225485Slinton 
235485Slinton LOCAL ADDRESS printop(), docase();
245485Slinton 
255485Slinton /*
265485Slinton  * print instructions within the given address range
275485Slinton  */
285485Slinton 
295485Slinton printinst(lowaddr, highaddr)
305485Slinton ADDRESS lowaddr;
315485Slinton ADDRESS highaddr;
325485Slinton {
335743Slinton     register ADDRESS addr;
345485Slinton 
355743Slinton     for (addr = lowaddr; addr <= highaddr; ) {
365743Slinton 	addr = printop(addr);
375743Slinton     }
385485Slinton }
395485Slinton 
405485Slinton /*
415485Slinton  * print the opcode at the given address, return the address
425485Slinton  * of the next instruction
435485Slinton  */
445485Slinton 
455485Slinton LOCAL ADDRESS printop(addr)
465485Slinton register ADDRESS addr;
475485Slinton {
485743Slinton     int i;
495743Slinton     PXOP op;
505743Slinton     OPTAB *o;
515743Slinton     char subop;
525743Slinton     short arg;
535743Slinton     long longarg;
545743Slinton     union {
555743Slinton 	short i;
565743Slinton 	struct { char c1, c2; } opword;
575743Slinton     } u;
585485Slinton 
595743Slinton     iread(&u.i, addr, sizeof(u.i));
605743Slinton     op = (PXOP) u.opword.c1;
615743Slinton     subop = u.opword.c2;
625743Slinton     o = &optab[op];
635743Slinton     printf("%5d   %s", addr, o->opname);
645743Slinton     addr += sizeof(u);
655743Slinton     for (i = 0; o->argtype[i] != 0; i++) {
665743Slinton 	if (i == 0) {
675743Slinton 	    putchar('\t');
685743Slinton 	} else {
695743Slinton 	    putchar(',');
705743Slinton 	}
715743Slinton 	switch(o->argtype[i]) {
725743Slinton 	    case ADDR4:
735743Slinton 	    case LWORD:
74*30845Smckusick #ifdef tahoe
75*30845Smckusick 		addr = (ADDRESS)(((int)addr + 3) & ~3);
76*30845Smckusick #endif
775743Slinton 		iread(&longarg, addr, sizeof(longarg));
785743Slinton 		printf("%d", longarg);
795743Slinton 		addr += sizeof(long);
805743Slinton 		break;
815743Slinton 
825743Slinton 	    case SUBOP:
835743Slinton 		printf("%d", subop);
845743Slinton 		break;
855743Slinton 
865743Slinton 	    case ADDR2:
875743Slinton 	    case DISP:
885743Slinton 	    case PSUBOP:
895743Slinton 	    case VLEN:
905743Slinton 	    case HWORD:
915743Slinton 		if (i != 0 || subop == 0) {
925743Slinton 		    iread(&arg, addr, sizeof(arg));
935743Slinton 		    addr += sizeof(short);
945485Slinton 		} else {
955743Slinton 		    arg = subop;
965485Slinton 		}
975743Slinton 		printf("%d", arg);
985743Slinton 		break;
995485Slinton 
1005743Slinton 	    case STRING: {
1015743Slinton 		char c;
1025485Slinton 
1035743Slinton 		putchar('\'');
1045743Slinton 		while (subop > 0) {
1055743Slinton 		    iread(&c, addr, sizeof(c));
1065743Slinton 		    if (c == '\0') {
1075743Slinton 			break;
1085743Slinton 		    }
1095743Slinton 		    putchar(c);
1105743Slinton 		    subop--;
1115743Slinton 		    addr++;
1125743Slinton 		}
1135743Slinton 		addr++;
1145743Slinton 		putchar('\'');
115*30845Smckusick #ifdef tahoe
116*30845Smckusick 		addr = (ADDRESS)(((int)addr + 3) & ~3);
117*30845Smckusick #else
1185743Slinton 		if ((addr&1) != 0) {
1195743Slinton 		    addr++;
1205743Slinton 		}
121*30845Smckusick #endif
1225743Slinton 		break;
1235743Slinton 	    }
1245485Slinton 
1255743Slinton 	    default:
1265743Slinton 		panic("bad argtype %d", o->argtype[i]);
1275743Slinton 		/*NOTREACHED*/
1285743Slinton 	}
1295743Slinton     }
1305743Slinton     switch(op) {
1315743Slinton 	case O_CON:
1325743Slinton 	    addr += arg;
133*30845Smckusick #ifdef tahoe
134*30845Smckusick 	    addr = (ADDRESS)(((int)addr + 3) & ~3);
135*30845Smckusick #endif
1365743Slinton 	    break;
1375485Slinton 
1385743Slinton 	case O_CASE1OP:
1395743Slinton 	    addr = docase(addr, 1, subop);
1405743Slinton 	    break;
1415485Slinton 
1425743Slinton 	case O_CASE2OP:
1435743Slinton 	    addr = docase(addr, 2, subop);
1445743Slinton 	    break;
1455485Slinton 
1465743Slinton 	case O_CASE4OP:
1475743Slinton 	    addr = docase(addr, 4, subop);
1485743Slinton 	    break;
1495743Slinton     }
1505743Slinton     putchar('\n');
1515743Slinton     return(addr);
1525485Slinton }
1535485Slinton 
1545485Slinton /*
1555485Slinton  * print out the destinations and cases
1565485Slinton  */
1575485Slinton 
1585485Slinton LOCAL ADDRESS docase(addr, size, n)
1595485Slinton ADDRESS addr;
1605485Slinton int size;
1615485Slinton int n;
1625485Slinton {
1635743Slinton     register int i;
1645743Slinton     char c;
1655743Slinton     short arg;
1665743Slinton     long longarg;
1675485Slinton 
1685743Slinton     iread(&arg, addr, sizeof(arg));
1695743Slinton     printf("\n\t%5d", arg);
1705743Slinton     addr += 2;
1715743Slinton     for (i = 1; i < n; i++) {
1725485Slinton 	iread(&arg, addr, sizeof(arg));
1735743Slinton 	printf(", %5d", arg);
1745485Slinton 	addr += 2;
1755743Slinton     }
1765743Slinton     printf("\n\t");
1775743Slinton     for (i = 0; i < n; i++) {
1785743Slinton 	switch(size) {
1795743Slinton 	    case 1:
1805743Slinton 		iread(&c, addr, sizeof(c));
1815743Slinton 		printf("%5d", c);
1825743Slinton 		break;
1835743Slinton 
1845743Slinton 	    case 2:
1855485Slinton 		iread(&arg, addr, sizeof(arg));
1865743Slinton 		printf("%5d", arg);
1875743Slinton 		break;
1885485Slinton 
1895743Slinton 	    case 4:
190*30845Smckusick #ifdef tahoe
191*30845Smckusick 		addr = (ADDRESS)(((int)addr + 3) & ~3);
192*30845Smckusick #endif
1935743Slinton 		iread(&longarg, addr, sizeof(longarg));
1945743Slinton 		printf("%5d", longarg);
1955743Slinton 		break;
1965485Slinton 	}
1975743Slinton 	addr += size;
1985743Slinton 	if (i < n - 1) {
1995743Slinton 	    printf(", ");
2005485Slinton 	}
2015743Slinton     }
202*30845Smckusick #ifdef tahoe
203*30845Smckusick     addr = (ADDRESS)(((int)addr + 3) & ~3);
204*30845Smckusick #else
2055743Slinton     if ((addr&01) == 01) {
2065743Slinton 	addr++;
2075743Slinton     }
208*30845Smckusick #endif
2095743Slinton     return(addr);
2105485Slinton }
211