1*22367Sdist /*
2*22367Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22367Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22367Sdist  * specifies the terms and conditions for redistribution.
5*22367Sdist  */
65485Slinton 
7*22367Sdist #ifndef lint
8*22367Sdist static char sccsid[] = "@(#)printinst.c	5.1 (Berkeley) 06/06/85";
9*22367Sdist #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"
205485Slinton 
215485Slinton LOCAL ADDRESS printop(), docase();
225485Slinton 
235485Slinton /*
245485Slinton  * print instructions within the given address range
255485Slinton  */
265485Slinton 
275485Slinton printinst(lowaddr, highaddr)
285485Slinton ADDRESS lowaddr;
295485Slinton ADDRESS highaddr;
305485Slinton {
315743Slinton     register ADDRESS addr;
325485Slinton 
335743Slinton     for (addr = lowaddr; addr <= highaddr; ) {
345743Slinton 	addr = printop(addr);
355743Slinton     }
365485Slinton }
375485Slinton 
385485Slinton /*
395485Slinton  * print count instructions from given address
405485Slinton  */
415485Slinton 
425485Slinton printninst(count, addr)
435485Slinton int count;
445485Slinton ADDRESS addr;
455485Slinton {
465743Slinton     int i;
475485Slinton 
485743Slinton     for (i = 0; i < count; i++) {
495743Slinton 	addr = printop(addr);
505743Slinton     }
515485Slinton }
525485Slinton 
535485Slinton /*
545485Slinton  * print the opcode at the given address, return the address
555485Slinton  * of the next instruction
565485Slinton  */
575485Slinton 
585485Slinton LOCAL ADDRESS printop(addr)
595485Slinton register ADDRESS addr;
605485Slinton {
615743Slinton     int i;
625743Slinton     PXOP op;
635743Slinton     OPTAB *o;
645743Slinton     char subop;
655743Slinton     short arg;
665743Slinton     long longarg;
675743Slinton     union {
685743Slinton 	short i;
695743Slinton 	struct { char c1, c2; } opword;
705743Slinton     } u;
715485Slinton 
725743Slinton     iread(&u.i, addr, sizeof(u.i));
735743Slinton     op = (PXOP) u.opword.c1;
745743Slinton     subop = u.opword.c2;
755743Slinton     o = &optab[op];
765743Slinton     printf("%5d   %s", addr, o->opname);
775743Slinton     addr += sizeof(u);
785743Slinton     for (i = 0; o->argtype[i] != 0; i++) {
795743Slinton 	if (i == 0) {
805743Slinton 	    putchar('\t');
815743Slinton 	} else {
825743Slinton 	    putchar(',');
835743Slinton 	}
845743Slinton 	switch(o->argtype[i]) {
855743Slinton 	    case ADDR4:
865743Slinton 	    case LWORD:
875743Slinton 		iread(&longarg, addr, sizeof(longarg));
885743Slinton 		printf("%d", longarg);
895743Slinton 		addr += sizeof(long);
905743Slinton 		break;
915743Slinton 
925743Slinton 	    case SUBOP:
935743Slinton 		printf("%d", subop);
945743Slinton 		break;
955743Slinton 
965743Slinton 	    case ADDR2:
975743Slinton 	    case DISP:
985743Slinton 	    case PSUBOP:
995743Slinton 	    case VLEN:
1005743Slinton 	    case HWORD:
1015743Slinton 		if (i != 0 || subop == 0) {
1025743Slinton 		    iread(&arg, addr, sizeof(arg));
1035743Slinton 		    addr += sizeof(short);
1045485Slinton 		} else {
1055743Slinton 		    arg = subop;
1065485Slinton 		}
1075743Slinton 		printf("%d", arg);
1085743Slinton 		break;
1095485Slinton 
1105743Slinton 	    case STRING: {
1115743Slinton 		char c;
1125485Slinton 
1135743Slinton 		putchar('\'');
1145743Slinton 		while (subop > 0) {
1155743Slinton 		    iread(&c, addr, sizeof(c));
1165743Slinton 		    if (c == '\0') {
1175743Slinton 			break;
1185743Slinton 		    }
1195743Slinton 		    putchar(c);
1205743Slinton 		    subop--;
1215743Slinton 		    addr++;
1225743Slinton 		}
1235743Slinton 		addr++;
1245743Slinton 		putchar('\'');
1255743Slinton 		if ((addr&1) != 0) {
1265743Slinton 		    addr++;
1275743Slinton 		}
1285743Slinton 		break;
1295743Slinton 	    }
1305485Slinton 
1315743Slinton 	    default:
1325743Slinton 		panic("bad argtype %d", o->argtype[i]);
1335743Slinton 		/*NOTREACHED*/
1345743Slinton 	}
1355743Slinton     }
1365743Slinton     switch(op) {
1375743Slinton 	case O_CON:
1385743Slinton 	    addr += arg;
1395743Slinton 	    break;
1405485Slinton 
1415743Slinton 	case O_CASE1OP:
1425743Slinton 	    addr = docase(addr, 1, subop);
1435743Slinton 	    break;
1445485Slinton 
1455743Slinton 	case O_CASE2OP:
1465743Slinton 	    addr = docase(addr, 2, subop);
1475743Slinton 	    break;
1485485Slinton 
1495743Slinton 	case O_CASE4OP:
1505743Slinton 	    addr = docase(addr, 4, subop);
1515743Slinton 	    break;
1525743Slinton     }
1535743Slinton     putchar('\n');
1545743Slinton     return(addr);
1555485Slinton }
1565485Slinton 
1575485Slinton /*
1585485Slinton  * print out the destinations and cases
1595485Slinton  */
1605485Slinton 
1615485Slinton LOCAL ADDRESS docase(addr, size, n)
1625485Slinton ADDRESS addr;
1635485Slinton int size;
1645485Slinton int n;
1655485Slinton {
1665743Slinton     register int i;
1675743Slinton     char c;
1685743Slinton     short arg;
1695743Slinton     long longarg;
1705485Slinton 
1715743Slinton     iread(&arg, addr, sizeof(arg));
1725743Slinton     printf("\n\t%5d", arg);
1735743Slinton     addr += 2;
1745743Slinton     for (i = 1; i < n; i++) {
1755485Slinton 	iread(&arg, addr, sizeof(arg));
1765743Slinton 	printf(", %5d", arg);
1775485Slinton 	addr += 2;
1785743Slinton     }
1795743Slinton     printf("\n\t");
1805743Slinton     for (i = 0; i < n; i++) {
1815743Slinton 	switch(size) {
1825743Slinton 	    case 1:
1835743Slinton 		iread(&c, addr, sizeof(c));
1845743Slinton 		printf("%5d", c);
1855743Slinton 		break;
1865743Slinton 
1875743Slinton 	    case 2:
1885485Slinton 		iread(&arg, addr, sizeof(arg));
1895743Slinton 		printf("%5d", arg);
1905743Slinton 		break;
1915485Slinton 
1925743Slinton 	    case 4:
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     }
2025743Slinton     if ((addr&01) == 01) {
2035743Slinton 	addr++;
2045743Slinton     }
2055743Slinton     return(addr);
2065485Slinton }
207