MiniUnix/usr/source/s1/cdb2.c
#
/*
* 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;
}
}