|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: #include "space.h" ! 10: ! 11: #undef SINGLE /* hack */ ! 12: ! 13: /* instruction printing */ ! 14: ! 15: #define DOUBLE 0 ! 16: #define DOUBLW 1 ! 17: #define SINGLE 2 ! 18: #define SINGLW 3 ! 19: #define REVERS 4 ! 20: #define BRANCH 5 ! 21: #define NOADDR 6 ! 22: #define DFAULT 7 ! 23: #define TRAP 8 ! 24: #define SYS 9 ! 25: #define SOB 10 ! 26: #define JMP 11 ! 27: #define JSR 12 ! 28: ! 29: #define LOBYTE 0377 ! 30: ! 31: ! 32: typedef struct optab *OPTAB; ! 33: struct optab { ! 34: short mask; ! 35: short val; ! 36: char itype; ! 37: char *iname; ! 38: } optab[] = { ! 39: 0107777, 0010000, DOUBLE, "mov", ! 40: 0107777, 0020000, DOUBLE, "cmp", ! 41: 0107777, 0030000, DOUBLE, "bit", ! 42: 0107777, 0040000, DOUBLE, "bic", ! 43: 0107777, 0050000, DOUBLE, "bis", ! 44: 0007777, 0060000, DOUBLE, "add", ! 45: 0007777, 0160000, DOUBLE, "su", ! 46: 0100077, 0005000, SINGLE, "clr", ! 47: 0100077, 0005100, SINGLE, "com", ! 48: 0100077, 0005200, SINGLE, "inc", ! 49: 0100077, 0005300, SINGLE, "dec", ! 50: 0100077, 0005400, SINGLE, "neg", ! 51: 0100077, 0005500, SINGLE, "adc", ! 52: 0100077, 0005600, SINGLE, "sbc", ! 53: 0100077, 0005700, SINGLE, "tst", ! 54: 0100077, 0006000, SINGLE, "ror", ! 55: 0100077, 0006100, SINGLE, "rol", ! 56: 0100077, 0006200, SINGLE, "asr", ! 57: 0100077, 0006300, SINGLE, "asl", ! 58: 0000077, 0000100, JMP, "jmp", ! 59: 0000077, 0000300, SINGLE, "swab", ! 60: 0000077, 0170100, SINGLW, "ldfps", ! 61: 0000077, 0170200, SINGLW, "stfps", ! 62: 0000077, 0170300, SINGLW, "stst", ! 63: 0000077, 0170400, SINGLW, "clrf", ! 64: 0000077, 0170500, SINGLW, "tstf", ! 65: 0000077, 0170600, SINGLW, "absf", ! 66: 0000077, 0170700, SINGLW, "negf", ! 67: 0000077, 0006700, SINGLW, "sxt", ! 68: 0000077, 0006600, SINGLW, "mtpi", ! 69: 0000077, 0106600, SINGLW, "mtpd", ! 70: 0000077, 0006500, SINGLW, "mfpi", ! 71: 0000077, 0106500, SINGLW, "mfpd", ! 72: 0000077, 0106700, SINGLW, "mfps", ! 73: 0000077, 0106400, SINGLW, "mtps", ! 74: 0000777, 0070000, REVERS, "mul", ! 75: 0000777, 0071000, REVERS, "div", ! 76: 0000777, 0072000, REVERS, "ash", ! 77: 0000777, 0073000, REVERS, "ashc", ! 78: LOBYTE, 0000400, BRANCH, "br", ! 79: LOBYTE, 0001000, BRANCH, "bne", ! 80: LOBYTE, 0001400, BRANCH, "beq", ! 81: LOBYTE, 0002000, BRANCH, "bge", ! 82: LOBYTE, 0002400, BRANCH, "blt", ! 83: LOBYTE, 0003000, BRANCH, "bgt", ! 84: LOBYTE, 0003400, BRANCH, "ble", ! 85: LOBYTE, 0100000, BRANCH, "bpl", ! 86: LOBYTE, 0100400, BRANCH, "bmi", ! 87: LOBYTE, 0101000, BRANCH, "bhi", ! 88: LOBYTE, 0101400, BRANCH, "blos", ! 89: LOBYTE, 0102000, BRANCH, "bvc", ! 90: LOBYTE, 0102400, BRANCH, "bvs", ! 91: LOBYTE, 0103000, BRANCH, "bcc", ! 92: LOBYTE, 0103400, BRANCH, "bcs", ! 93: 0000000, 0000000, NOADDR, "halt", ! 94: 0000000, 0000001, NOADDR, "wait", ! 95: 0000000, 0000002, NOADDR, "rti", ! 96: 0000000, 0000003, NOADDR, "bpt", ! 97: 0000000, 0000004, NOADDR, "iot", ! 98: 0000000, 0000005, NOADDR, "reset", ! 99: LOBYTE, 0171000, REVERS, "mulf", ! 100: LOBYTE, 0171400, REVERS, "modf", ! 101: LOBYTE, 0172000, REVERS, "addf", ! 102: LOBYTE, 0172400, REVERS, "movf", ! 103: LOBYTE, 0173000, REVERS, "subf", ! 104: LOBYTE, 0173400, REVERS, "cmpf", ! 105: LOBYTE, 0174000, DOUBLW, "movf", ! 106: LOBYTE, 0174400, REVERS, "divf", ! 107: LOBYTE, 0175000, DOUBLW, "movei", ! 108: LOBYTE, 0175400, DOUBLW, "movfi", ! 109: LOBYTE, 0176000, DOUBLW, "movfo", ! 110: LOBYTE, 0176400, REVERS, "movie", ! 111: LOBYTE, 0177000, REVERS, "movif", ! 112: LOBYTE, 0177400, REVERS, "movof", ! 113: 0000000, 0170000, NOADDR, "cfcc", ! 114: 0000000, 0170001, NOADDR, "setf", ! 115: 0000000, 0170002, NOADDR, "seti", ! 116: 0000000, 0170011, NOADDR, "setd", ! 117: 0000000, 0170012, NOADDR, "setl", ! 118: 0000777, 0004000, JSR, "jsr", ! 119: 0000777, 0074000, DOUBLE, "xor", ! 120: 0000007, 0000200, SINGLE, "rts", ! 121: 0000017, 0000240, DFAULT, "cflg", ! 122: 0000017, 0000260, DFAULT, "sflg", ! 123: LOBYTE, 0104000, TRAP, "emt", ! 124: #if NOTDEF ! 125: LOBYTE, 0104400, SYS, "sys", ! 126: #else ! 127: LOBYTE, 0104400, TRAP, "trap", ! 128: #endif ! 129: 0000077, 0006400, TRAP, "mark", ! 130: 0000777, 0077000, SOB, "sob", ! 131: 0000007, 0000230, TRAP, "spl", ! 132: 0177777, 0000000, DFAULT, "", ! 133: }; ! 134: ! 135: #ifdef NOTDEF ! 136: #define SYSTAB struct systab ! 137: SYSTAB { ! 138: int argc; ! 139: char *sname; ! 140: } systab[] = { ! 141: 1, "indir", ! 142: 0, "exit", ! 143: 0, "fork", ! 144: 2, "read", ! 145: 2, "write", ! 146: 2, "open", ! 147: 0, "close", ! 148: 0, "wait", ! 149: 2, "creat", ! 150: 2, "link", ! 151: 1, "unlink", ! 152: 2, "exec", ! 153: 1, "chdir", ! 154: 0, "time", ! 155: 3, "mknod", ! 156: 2, "chmod", ! 157: 2, "chown", ! 158: 1, "break", ! 159: 2, "stat", ! 160: 2, "seek", ! 161: 0, "getpid", ! 162: 3, "mount", ! 163: 1, "umount", ! 164: 0, "setuid", ! 165: 0, "getuid", ! 166: 0, "stime", ! 167: 3, "ptrace", ! 168: 0, "alarm", ! 169: 1, "fstat", ! 170: 0, "pause", ! 171: 1, "30", ! 172: 1, "stty", ! 173: 1, "gtty", ! 174: 0, "access", ! 175: 0, "nice", ! 176: 0, "sleep", ! 177: 0, "sync", ! 178: 1, "kill", ! 179: 0, "csw", ! 180: 0, "setpgrp", ! 181: 0, "tell", ! 182: 0, "dup", ! 183: 0, "pipe", ! 184: 1, "times", ! 185: 4, "profil", ! 186: 0, "tiu", ! 187: 0, "setgid", ! 188: 0, "getgid", ! 189: 2, "signal", ! 190: 0, "49", ! 191: 0, "50", ! 192: 0, "51", ! 193: 0, "52", ! 194: 0, "53", ! 195: 0, "54", ! 196: 0, "55", ! 197: 0, "56", ! 198: 0, "57", ! 199: 0, "58", ! 200: 0, "59", ! 201: 0, "60", ! 202: 0, "61", ! 203: 0, "62", ! 204: 0, "63", ! 205: }; ! 206: #endif ! 207: ! 208: char *regname[] = { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"}; ! 209: ! 210: static int type, space, incp; ! 211: ! 212: printins(idsp) ! 213: { ! 214: int byte; ! 215: register OPTAB p; ! 216: register short ins; ! 217: ! 218: ins = sget(dot, idsp); ! 219: type=DATASP; space=idsp; incp=2; ! 220: for (p=optab;; p++) ! 221: if ((ins & ~p->mask) == p->val) ! 222: break; ! 223: prints(p->iname); ! 224: byte=ins&0100000; ! 225: ins &= p->mask; ! 226: switch (p->itype) { ! 227: ! 228: case JMP: ! 229: type=INSTSP; ! 230: ! 231: case SINGLE: ! 232: if (byte) ! 233: printc('b'); ! 234: case SINGLW: ! 235: paddr("%8t",ins); ! 236: break; ! 237: ! 238: case REVERS: ! 239: doubl(ins&077,(ins>>6)&07); ! 240: break; ! 241: ! 242: case JSR: ! 243: type=INSTSP; ! 244: ! 245: case DOUBLE: ! 246: if (byte) ! 247: printc('b'); ! 248: case DOUBLW: ! 249: doubl(ins>>6,ins); ! 250: ! 251: case NOADDR: ! 252: break; ! 253: ! 254: case SOB: ! 255: paddr("%8t",(ins>>6)&07); ! 256: branch(",",-(ins&077)); ! 257: break; ! 258: ! 259: case BRANCH: ! 260: branch("%8t",ins); ! 261: break; ! 262: ! 263: #if NOTDEF ! 264: case SYS: ! 265: BEGIN ! 266: INT indir; ! 267: REG INT w; ! 268: printf("%8t%s", systab[ins &= 077].sname); ! 269: IF ins==0 ANDF f==0 ANDF idsp!=NSP /* indir */ ! 270: THEN w=dot; dot=chkget(inkdot(2),idsp); ! 271: prints(" {"); ! 272: indir=get(dot,DSP); ! 273: IF errflg ! 274: THEN errflg=0; printc('?'); ! 275: ELSE printins(1,DSP,indir); ! 276: FI ! 277: printc('}'); ! 278: dot=w; incp=4; ! 279: ELSE w = systab[ins].argc; ! 280: WHILE w-- ANDF idsp!=NSP ! 281: DO prints("; "); ! 282: psymoff(leng(get(inkdot(incp),idsp)), NSYM, ""); ! 283: incp += 2; ! 284: OD ! 285: FI ! 286: END ! 287: break; ! 288: #endif ! 289: ! 290: case TRAP: ! 291: case DFAULT: ! 292: default: ! 293: printf("%8t%o", ins); ! 294: } ! 295: dotinc=incp; ! 296: } ! 297: ! 298: static ! 299: doubl(a,b) ! 300: { ! 301: paddr("%8t",a); ! 302: paddr(",",b); ! 303: } ! 304: ! 305: static ! 306: branch(s,ins) ! 307: char *s; ! 308: register WORD ins; ! 309: { ! 310: printf(s); ! 311: if (ins&0200) ! 312: ins = (char) ins; /* sign extend byte */ ! 313: ins = dot + (ins<<1) + 2; ! 314: psymoff(ins,INSTSP,""); ! 315: } ! 316: ! 317: static ! 318: paddr(s, a) ! 319: char *s; ! 320: register int a; ! 321: { ! 322: register int r; ! 323: register char *rn; ! 324: ! 325: var[2]=var[1]; ! 326: r = a&07; a &= 070; ! 327: ! 328: printf(s); ! 329: if (r==7 && a&020) { ! 330: if (a&010) ! 331: printc('*'); ! 332: if (a&040) { ! 333: if (space==NOSP) ! 334: printc('?'); ! 335: else { ! 336: var[1]=stow(sget(inkdot(incp),space)) + inkdot(incp+2); ! 337: chkerr(); ! 338: var[1] &= 0177777; ! 339: psymoff(var[1],(a&010?DATASP:type),""); ! 340: } ! 341: } ! 342: else { ! 343: printc('$'); ! 344: if (space==NOSP) ! 345: printc('?'); ! 346: else { ! 347: var[1]=stow(sget(inkdot(incp), space)); ! 348: chkerr(); ! 349: psymoff(var[1], type, ""); ! 350: } ! 351: } ! 352: incp += 2; ! 353: return; ! 354: } ! 355: rn = regname[r]; ! 356: switch (a) { ! 357: /* r */ ! 358: case 000: ! 359: prints(rn); ! 360: return; ! 361: ! 362: /* (r) */ ! 363: case 010: ! 364: printf("(%s)", rn); ! 365: return; ! 366: ! 367: /* *(r)+ */ ! 368: case 030: ! 369: printc('*'); ! 370: ! 371: /* (r)+ */ ! 372: case 020: ! 373: printf("(%s)+", rn); ! 374: return; ! 375: ! 376: /* *-(r) */ ! 377: case 050: ! 378: printc('*'); ! 379: ! 380: /* -(r) */ ! 381: case 040: ! 382: printf("-(%s)", rn); ! 383: return; ! 384: ! 385: /* *x(r) */ ! 386: case 070: ! 387: printc('*'); ! 388: ! 389: /* x(r) */ ! 390: case 060: ! 391: if (space==NOSP) ! 392: printc('?'); ! 393: else { ! 394: var[1]=stow(sget(inkdot(incp), space)); ! 395: chkerr(); ! 396: psymoff(var[1], type, ""); ! 397: } ! 398: incp += 2; ! 399: printf("(%s)", rn); ! 400: return; ! 401: } ! 402: } ! 403: ! 404: ! 405:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.