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

Defined functions

paddr defined in line 324; used 4 times
printins defined in line 211; used 2 times
psymoff defined in line 11; used 8 times

Defined variables

dot defined in line 8; used 12 times
dotinc defined in line 7; used 10 times
optab defined in line 49; used 1 times
regname defined in line 209; used 1 times
ssymbol defined in line 6; used 2 times
systab defined in line 142; used 2 times

Defined struct's

optab defined in line 44; used 2 times
  • in line 214(2)
systab defined in line 139; never used

Defined macros

BRANCH defined in line 30; used 15 times
DOUBLE defined in line 26; used 7 times
FLTNOR defined in line 33; used 4 times
FLTREV defined in line 32; used 10 times
ISP defined in line 25; used 6 times
MULDIV defined in line 29; used 4 times
NOADDR defined in line 31; used 10 times
SINGLE defined in line 27; used 14 times
SINGLW defined in line 28; used 12 times
SPECL1 defined in line 34; used 2 times
SPECL2 defined in line 35; used 1 times
SPECL3 defined in line 36; used 2 times
SPECL4 defined in line 37; used 1 times
SPECL5 defined in line 38; used 1 times
SPECL6 defined in line 39; used 1 times
SPECL7 defined in line 40; used 1 times
SPECL8 defined in line 41; used 1 times
SPECL9 defined in line 42; used 1 times
Last modified: 1975-05-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 945
Valid CSS Valid XHTML 1.0 Strict