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