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