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

Defined functions

branch defined in line 291; used 2 times
doubl defined in line 286; used 2 times
paddr defined in line 301; used 4 times
printins defined in line 205; used 3 times

Defined variables

OPTAB defined in line 33; used 1 times
optab defined in line 39; used 1 times

Defined struct's

optab defined in line 34; used 1 times
  • in line 33

Defined macros

BRANCH defined in line 23; used 15 times
DFAULT defined in line 25; used 3 times
DOUBLE defined in line 18; used 8 times
DOUBLW defined in line 19; used 4 times
JMP defined in line 29; used 1 times
  • in line 59
JSR defined in line 30; used 1 times
NOADDR defined in line 24; used 11 times
REVERS defined in line 22; used 14 times
SINGLE defined in line 20; used 14 times
SINGLW defined in line 21; used 12 times
SOB defined in line 28; used 1 times
SYS defined in line 27; used 1 times
SYSTAB defined in line 130; used 1 times
TRAP defined in line 26; used 3 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 920
Valid CSS Valid XHTML 1.0 Strict