Add original unix v6
This commit is contained in:
@@ -0,0 +1,384 @@
|
||||
#
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user