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