home *** CD-ROM | disk | FTP | other *** search
- #
- /*
- * C debugger -- part 2
- */
-
- char ssymbol[];
- int dotinc;
- int dot;
-
-
- psymoff(v, lim)
- {
- register char *w;
-
- w = vallook(v);
- if (w > lim) {
- printf("%.1o", v);
- return;
- }
- printf("%.8s", ssymbol);
- if (w)
- printf("+%d", w);
- }
-
- #define ISP 1
- #define DOUBLE 0
- #define SINGLE 1
- #define SINGLW 2
- #define MULDIV 4
- #define BRANCH 5
- #define NOADDR 6
- #define FLTREV 7
- #define FLTNOR 8
- #define SPECL1 9
- #define SPECL2 10
- #define SPECL3 11
- #define SPECL4 12
- #define SPECL5 13
- #define SPECL6 14
- #define SPECL7 15
- #define SPECL8 18
- #define SPECL9 19
-
- struct optab {
- int mask;
- int val;
- int itype;
- char *iname;
- } optab[] {
- 0107777, 0010000, DOUBLE, "mov",
- 0107777, 0020000, DOUBLE, "cmp",
- 0107777, 0030000, DOUBLE, "bit",
- 0107777, 0040000, DOUBLE, "bic",
- 0107777, 0050000, DOUBLE, "bis",
- 0007777, 0060000, DOUBLE, "add",
- 0007777, 0160000, DOUBLE, "su",
- 0100077, 0005000, SINGLE, "clr",
- 0100077, 0005100, SINGLE, "com",
- 0100077, 0005200, SINGLE, "inc",
- 0100077, 0005300, SINGLE, "dec",
- 0100077, 0005400, SINGLE, "neg",
- 0100077, 0005500, SINGLE, "adc",
- 0100077, 0005600, SINGLE, "sbc",
- 0100077, 0005700, SINGLE, "tst",
- 0100077, 0006000, SINGLE, "ror",
- 0100077, 0006100, SINGLE, "rol",
- 0100077, 0006200, SINGLE, "asr",
- 0100077, 0006300, SINGLE, "asl",
- 0000077, 0000100, SINGLE, "jmp",
- 0000077, 0000300, SINGLE, "swab",
- 0000077, 0170100, SINGLW, "ldfps",
- 0000077, 0170200, SINGLW, "stfps",
- 0000077, 0170300, SINGLW, "stst",
- 0000077, 0170400, SINGLW, "clrf",
- 0000077, 0170500, SINGLW, "tstf",
- 0000077, 0170600, SINGLW, "absf",
- 0000077, 0170700, SINGLW, "negf",
- 0000077, 0006700, SINGLW, "sxt",
- 0000077, 0006600, SINGLW, "mtpi",
- 0000077, 0106600, SINGLW, "mtpd",
- 0000077, 0006500, SINGLW, "mfpi",
- 0000077, 0106500, SINGLW, "mfpd",
- 0000777, 0070000, MULDIV, "mul",
- 0000777, 0071000, MULDIV, "div",
- 0000777, 0072000, MULDIV, "ash",
- 0000777, 0073000, MULDIV, "ashc",
- 0000377, 0000400, BRANCH, "br",
- 0000377, 0001000, BRANCH, "bne",
- 0000377, 0001400, BRANCH, "beq",
- 0000377, 0002000, BRANCH, "bge",
- 0000377, 0002400, BRANCH, "blt",
- 0000377, 0003000, BRANCH, "bgt",
- 0000377, 0003400, BRANCH, "ble",
- 0000377, 0100000, BRANCH, "bpl",
- 0000377, 0100400, BRANCH, "bmi",
- 0000377, 0101000, BRANCH, "bhi",
- 0000377, 0101400, BRANCH, "blos",
- 0000377, 0102000, BRANCH, "bvc",
- 0000377, 0102400, BRANCH, "bvs",
- 0000377, 0103000, BRANCH, "bhis",
- 0000377, 0103400, BRANCH, "blo",
- 0000000, 0000000, NOADDR, "halt",
- 0000000, 0000001, NOADDR, "wait",
- 0000000, 0000002, NOADDR, "rti",
- 0000000, 0000004, NOADDR, "iot",
- 0000000, 0000005, NOADDR, "reset",
- 0000377, 0171000, FLTREV, "mulf",
- 0000377, 0171400, FLTREV, "modf",
- 0000377, 0172000, FLTREV, "addf",
- 0000377, 0172400, FLTREV, "movf",
- 0000377, 0173000, FLTREV, "subf",
- 0000377, 0173400, FLTREV, "cmpf",
- 0000377, 0174000, FLTNOR, "movf",
- 0000377, 0174400, FLTREV, "divf",
- 0000377, 0175000, FLTNOR, "movei",
- 0000377, 0175400, FLTNOR, "movfi",
- 0000377, 0176000, FLTNOR, "movfo",
- 0000377, 0176400, FLTREV, "movie",
- 0000377, 0177000, FLTREV, "movif",
- 0000377, 0177400, FLTREV, "movof",
- 0000000, 0170000, NOADDR, "cfcc",
- 0000000, 0170001, NOADDR, "setf",
- 0000000, 0170002, NOADDR, "seti",
- 0000000, 0170011, NOADDR, "setd",
- 0000000, 0170012, NOADDR, "setl",
- 0000777, 0004000, SPECL1, "jsr",
- 0000777, 0074000, SPECL1, "xor",
- 0000007, 0000200, SPECL2, "rts",
- 0000017, 0000240, SPECL3, "cflg",
- 0000017, 0000260, SPECL3, "sflg",
- 0000377, 0104000, SPECL4, "emt",
- 0000377, 0104400, SPECL5, "sys",
- 0000077, 0006400, SPECL7, "mark",
- 0000777, 0077000, SPECL8, "sob",
- 0000007, 0000230, SPECL9, "spl",
- 0177777, 0000000, SPECL6, "oct",
- };
-
- struct systab {
- int argc;
- char *sname;
- } systab[] {
- 1, "indir",
- 0, "exit",
- 0, "fork",
- 2, "read",
- 2, "write",
- 2, "open",
- 0, "close",
- 0, "wait",
- 2, "creat",
- 2, "link",
- 1, "unlink",
- 2, "exec",
- 1, "chdir",
- 0, "time",
- 3, "mknod",
- 2, "chmod",
- 2, "chown",
- 1, "break",
- 2, "stat",
- 2, "seek",
- 0, "getpid",
- 3, "mount",
- 1, "umount",
- 0, "setuid",
- 0, "getuid",
- 0, "stime",
- 3, "ptrace",
- 0, "27",
- 1, "fstat",
- 0, "29",
- 1, "smdate",
- 1, "stty",
- 1, "gtty",
- 0, "33",
- 0, "nice",
- 0, "sleep",
- 0, "sync",
- 1, "kill",
- 0, "switch",
- 0, "39",
- 0, "40",
- 0, "dup",
- 0, "pipe",
- 1, "times",
- 4, "profil",
- 0, "45",
- 0, "setgid",
- 0, "getgid",
- 2, "signal",
- 0, "49",
- 0, "50",
- 0, "51",
- 0, "52",
- 0, "53",
- 0, "54",
- 0, "55",
- 0, "56",
- 0, "57",
- 0, "58",
- 0, "59",
- 0, "60",
- 0, "61",
- 0, "62",
- 0, "63",
- };
-
- char *regname[] { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"};
-
- printins(f)
- {
- register ins, w;
- register struct optab *p;
-
- dotinc = 2;
- ins = cget(dot, ISP);
- if (vallook(dot)==0)
- printf("%.8s:", ssymbol);
- printf("\t");
- for (p=optab;; p++)
- if ((ins & ~p->mask) == p->val)
- break;
- printf("%s", p->iname);
- switch (p->itype) {
-
- /* rts */
- case SPECL2:
- ins =& 07;
-
- case SINGLE:
- if (ins < 0)
- printf("b");
-
- case SINGLW:
- printf("\t");
- paddr(ins);
- return;
-
- case FLTREV:
- ins =& 0377;
-
- case MULDIV:
- ins = ((ins>>6)&07) | ((ins<<6)&07700);
- goto doub;
-
- case FLTNOR:
- ins =& 0377;
-
- /* jsr, xor */
- case SPECL1:
- ins =& 0777;
- goto doub;
-
- case DOUBLE:
- if (ins<0)
- printf("b");
- doub:
- printf("\t");
- paddr(ins>>6);
- printf(",");
- paddr(ins);
- return;
-
- case NOADDR:
- return;
-
- /* sob */
- case SPECL8:
- printf("\t");
- paddr((ins>>6)&07);
- printf(",");
- ins = - (ins&077);
- goto bran;
-
- case BRANCH:
- printf("\t");
- bran:
- ins =& 0377;
- if (ins&0200)
- ins =| 0177400;
- ins = dot + (ins<<1) + 2;
- psymoff(ins, 010000);
- return;
-
- /* emt */
- case SPECL4:
- ins =& 0377;
- /* mark */
- case SPECL7:
- ins =& 077;
- /* spl */
- case SPECL9:
- ins =& 07;
- printf("\t%d", ins);
- return;
-
- /* sys */
- case SPECL5:
- printf("\t%s", systab[ins =& 077].sname);
- if (ins==0 && f==0) { /* indir */
- w = dot;
- dot = cget(dot+2, ISP);
- printf(" {");
- printins(1);
- printf("}");
- dotinc = 4;
- dot = w;
- return;
- }
- w = systab[ins].argc;
- while (w--) {
- printf("; ");
- psymoff(cget(dot+dotinc, ISP), 010000);
- dotinc =+ 2;
- }
- return;
-
- default:
- printf("\t%.1o", ins);
- }
- }
-
- paddr(aa)
- {
- register a, r;
-
- a = aa;
- r = a&07;
- a =& 070;
- if (r==7 && a&020) {
- if (a&010)
- printf("*");
- if (a&040)
- psymoff(cget(dot+dotinc, ISP)+dot+dotinc+2, 010000);
- else {
- printf("$");
- psymoff(cget(dot+dotinc, ISP), 010000);
- }
- dotinc =+ 2;
- return;
- }
- r = regname[r];
- switch (a) {
- /* r */
- case 000:
- printf("%s", r);
- return;
-
- /* (r) */
- case 010:
- printf("(%s)", r);
- return;
-
- /* *(r)+ */
- case 030:
- printf("*");
-
- /* (r)+ */
- case 020:
- printf("(%s)+", r);
- return;
-
- /* *-(r) */
- case 050:
- printf("*");
-
- /* -(r) */
- case 040:
- printf("-(%s)", r);
- return;
-
- /* *x(r) */
- case 070:
- printf("*");
-
- /* x(r) */
- case 060:
- psymoff(cget(dot+dotinc, ISP), 010000);
- dotinc =+ 2;
- printf("(%s)", r);
- return;
- }
- }
-