|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.