1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)printinst.c 5.1 (Berkeley) 6/6/85"; 9: #endif not lint 10: /* 11: * decode and print the instructions 12: */ 13: 14: #include "defs.h" 15: #include "machine.h" 16: #include "process.h" 17: #include "pxops.h" 18: #include "optab.h" 19: #include "object.h" 20: 21: LOCAL ADDRESS printop(), docase(); 22: 23: /* 24: * print instructions within the given address range 25: */ 26: 27: printinst(lowaddr, highaddr) 28: ADDRESS lowaddr; 29: ADDRESS highaddr; 30: { 31: register ADDRESS addr; 32: 33: for (addr = lowaddr; addr <= highaddr; ) { 34: addr = printop(addr); 35: } 36: } 37: 38: /* 39: * print count instructions from given address 40: */ 41: 42: printninst(count, addr) 43: int count; 44: ADDRESS addr; 45: { 46: int i; 47: 48: for (i = 0; i < count; i++) { 49: addr = printop(addr); 50: } 51: } 52: 53: /* 54: * print the opcode at the given address, return the address 55: * of the next instruction 56: */ 57: 58: LOCAL ADDRESS printop(addr) 59: register ADDRESS addr; 60: { 61: int i; 62: PXOP op; 63: OPTAB *o; 64: char subop; 65: short arg; 66: long longarg; 67: union { 68: short i; 69: struct { char c1, c2; } opword; 70: } u; 71: 72: iread(&u.i, addr, sizeof(u.i)); 73: op = (PXOP) u.opword.c1; 74: subop = u.opword.c2; 75: o = &optab[op]; 76: printf("%5d %s", addr, o->opname); 77: addr += sizeof(u); 78: for (i = 0; o->argtype[i] != 0; i++) { 79: if (i == 0) { 80: putchar('\t'); 81: } else { 82: putchar(','); 83: } 84: switch(o->argtype[i]) { 85: case ADDR4: 86: case LWORD: 87: iread(&longarg, addr, sizeof(longarg)); 88: printf("%d", longarg); 89: addr += sizeof(long); 90: break; 91: 92: case SUBOP: 93: printf("%d", subop); 94: break; 95: 96: case ADDR2: 97: case DISP: 98: case PSUBOP: 99: case VLEN: 100: case HWORD: 101: if (i != 0 || subop == 0) { 102: iread(&arg, addr, sizeof(arg)); 103: addr += sizeof(short); 104: } else { 105: arg = subop; 106: } 107: printf("%d", arg); 108: break; 109: 110: case STRING: { 111: char c; 112: 113: putchar('\''); 114: while (subop > 0) { 115: iread(&c, addr, sizeof(c)); 116: if (c == '\0') { 117: break; 118: } 119: putchar(c); 120: subop--; 121: addr++; 122: } 123: addr++; 124: putchar('\''); 125: if ((addr&1) != 0) { 126: addr++; 127: } 128: break; 129: } 130: 131: default: 132: panic("bad argtype %d", o->argtype[i]); 133: /*NOTREACHED*/ 134: } 135: } 136: switch(op) { 137: case O_CON: 138: addr += arg; 139: break; 140: 141: case O_CASE1OP: 142: addr = docase(addr, 1, subop); 143: break; 144: 145: case O_CASE2OP: 146: addr = docase(addr, 2, subop); 147: break; 148: 149: case O_CASE4OP: 150: addr = docase(addr, 4, subop); 151: break; 152: } 153: putchar('\n'); 154: return(addr); 155: } 156: 157: /* 158: * print out the destinations and cases 159: */ 160: 161: LOCAL ADDRESS docase(addr, size, n) 162: ADDRESS addr; 163: int size; 164: int n; 165: { 166: register int i; 167: char c; 168: short arg; 169: long longarg; 170: 171: iread(&arg, addr, sizeof(arg)); 172: printf("\n\t%5d", arg); 173: addr += 2; 174: for (i = 1; i < n; i++) { 175: iread(&arg, addr, sizeof(arg)); 176: printf(", %5d", arg); 177: addr += 2; 178: } 179: printf("\n\t"); 180: for (i = 0; i < n; i++) { 181: switch(size) { 182: case 1: 183: iread(&c, addr, sizeof(c)); 184: printf("%5d", c); 185: break; 186: 187: case 2: 188: iread(&arg, addr, sizeof(arg)); 189: printf("%5d", arg); 190: break; 191: 192: case 4: 193: iread(&longarg, addr, sizeof(longarg)); 194: printf("%5d", longarg); 195: break; 196: } 197: addr += size; 198: if (i < n - 1) { 199: printf(", "); 200: } 201: } 202: if ((addr&01) == 01) { 203: addr++; 204: } 205: return(addr); 206: }