home *** CD-ROM | disk | FTP | other *** search
- #
- /*
- *
- * UNIX debugger
- *
- */
-
- #include "defs.h"
-
- STRING errflg;
- L_INT dot;
- INT dotinc;
- L_INT var[];
-
-
- /* instruction printing */
-
- #define DOUBLE 0
- #define DOUBLW 1
- #define SINGLE 2
- #define SINGLW 3
- #define REVERS 4
- #define BRANCH 5
- #define NOADDR 6
- #define DFAULT 7
- #define TRAP 8
- #define SYS 9
- #define SOB 10
- #define JMP 11
- #define JSR 12
-
-
- TYPE struct optab *OPTAB;
- 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, JMP, "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, REVERS, "mul",
- 0000777, 0071000, REVERS, "div",
- 0000777, 0072000, REVERS, "ash",
- 0000777, 0073000, REVERS, "ashc",
- LOBYTE, 0000400, BRANCH, "br",
- LOBYTE, 0001000, BRANCH, "bne",
- LOBYTE, 0001400, BRANCH, "beq",
- LOBYTE, 0002000, BRANCH, "bge",
- LOBYTE, 0002400, BRANCH, "blt",
- LOBYTE, 0003000, BRANCH, "bgt",
- LOBYTE, 0003400, BRANCH, "ble",
- LOBYTE, 0100000, BRANCH, "bpl",
- LOBYTE, 0100400, BRANCH, "bmi",
- LOBYTE, 0101000, BRANCH, "bhi",
- LOBYTE, 0101400, BRANCH, "blos",
- LOBYTE, 0102000, BRANCH, "bvc",
- LOBYTE, 0102400, BRANCH, "bvs",
- LOBYTE, 0103000, BRANCH, "bcc",
- LOBYTE, 0103400, BRANCH, "bcs",
- 0000000, 0000000, NOADDR, "halt",
- 0000000, 0000001, NOADDR, "wait",
- 0000000, 0000002, NOADDR, "rti",
- 0000000, 0000003, NOADDR, "bpt",
- 0000000, 0000004, NOADDR, "iot",
- 0000000, 0000005, NOADDR, "reset",
- LOBYTE, 0171000, REVERS, "mulf",
- LOBYTE, 0171400, REVERS, "modf",
- LOBYTE, 0172000, REVERS, "addf",
- LOBYTE, 0172400, REVERS, "movf",
- LOBYTE, 0173000, REVERS, "subf",
- LOBYTE, 0173400, REVERS, "cmpf",
- LOBYTE, 0174000, DOUBLW, "movf",
- LOBYTE, 0174400, REVERS, "divf",
- LOBYTE, 0175000, DOUBLW, "movei",
- LOBYTE, 0175400, DOUBLW, "movfi",
- LOBYTE, 0176000, DOUBLW, "movfo",
- LOBYTE, 0176400, REVERS, "movie",
- LOBYTE, 0177000, REVERS, "movif",
- LOBYTE, 0177400, REVERS, "movof",
- 0000000, 0170000, NOADDR, "cfcc",
- 0000000, 0170001, NOADDR, "setf",
- 0000000, 0170002, NOADDR, "seti",
- 0000000, 0170011, NOADDR, "setd",
- 0000000, 0170012, NOADDR, "setl",
- 0000777, 0004000, JSR, "jsr",
- 0000777, 0074000, DOUBLE, "xor",
- 0000007, 0000200, SINGLE, "rts",
- 0000017, 0000240, DFAULT, "cflg",
- 0000017, 0000260, DFAULT, "sflg",
- LOBYTE, 0104000, TRAP, "emt",
- LOBYTE, 0104400, SYS, "sys",
- 0000077, 0006400, TRAP, "mark",
- 0000777, 0077000, SOB, "sob",
- 0000007, 0000230, TRAP, "spl",
- 0177777, 0000000, DFAULT, "",
- };
-
- #define SYSTAB struct systab
- 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, "alarm",
- 1, "fstat",
- 0, "pause",
- 1, "30",
- 1, "stty",
- 1, "gtty",
- 0, "access",
- 0, "nice",
- 0, "sleep",
- 0, "sync",
- 1, "kill",
- 0, "csw",
- 0, "setpgrp",
- 0, "tell",
- 0, "dup",
- 0, "pipe",
- 1, "times",
- 4, "profil",
- 0, "tiu",
- 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",
- };
-
- STRING regname[] { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"};
-
- POS type, space, incp;
-
- printins(f,idsp,ins)
- REG INT ins;
- {
- INT byte;
- REG OPTAB p;
-
- type=DSYM; space=idsp; incp=2;
- FOR p=optab;; p++
- DO IF (ins & ~p->mask) == p->val
- THEN break;
- FI
- OD
- prints(p->iname); byte=ins&0100000; ins &= p->mask;
- switch (p->itype) {
-
- case JMP:
- type=ISYM;
-
- case SINGLE:
- IF byte THEN printc('b'); FI
- case SINGLW:
- paddr("%8t",ins);
- break;
-
- case REVERS:
- doubl(ins&077,(ins>>6)&07);
- break;
-
- case JSR:
- type=ISYM;
-
- case DOUBLE:
- IF byte THEN printc('b'); FI
- case DOUBLW:
- doubl(ins>>6,ins);
-
- case NOADDR:
- break;
-
- case SOB:
- paddr("%8t",(ins>>6)&07);
- branch(",",-(ins&077));
- break;
-
- case BRANCH:
- branch("%8t",ins);
- break;
-
- case SYS:
- BEGIN
- INT indir;
- REG INT w;
- printf("%8t%s", systab[ins &= 077].sname);
- IF ins==0 ANDF f==0 ANDF idsp!=NSP /* indir */
- THEN w=dot; dot=chkget(inkdot(2),idsp);
- prints(" {");
- indir=get(dot,DSP);
- IF errflg
- THEN errflg=0; printc('?');
- ELSE printins(1,DSP,indir);
- FI
- printc('}');
- dot=w; incp=4;
- ELSE w = systab[ins].argc;
- WHILE w-- ANDF idsp!=NSP
- DO prints("; ");
- psymoff(leng(get(inkdot(incp),idsp)), NSYM, "");
- incp += 2;
- OD
- FI
- END
- break;
-
- case TRAP:
- case DFAULT:
- default:
- printf("%8t%o", ins);
- }
- dotinc=incp;
- }
-
- doubl(a,b)
- {
- paddr("%8t",a); paddr(",",b);
- }
-
- branch(s,ins)
- STRING s;
- REG INT ins;
- {
- printf(s);
- IF ins&0200 THEN ins |= 0177400; FI
- ins = shorten(dot) + (ins<<1) + 2;
- psymoff(leng(ins),ISYM,"");
- }
-
- paddr(s, a)
- STRING s;
- REG INT a;
- {
- REG INT r;
-
- var[2]=var[1];
- r = a&07; a &= 070;
-
- printf(s);
- IF r==7 ANDF a&020
- THEN IF a&010 THEN printc('*'); FI
- IF a&040
- THEN IF space==NSP
- THEN printc('?');
- ELSE var[1]=chkget(inkdot(incp),space) + shorten(inkdot(incp+2));
- psymoff(var[1],(a&010?DSYM:type),"");
- FI
- ELSE printc('$');
- IF space==NSP
- THEN printc('?');
- ELSE var[1]=chkget(inkdot(incp), space);
- psymoff(var[1], (a&010?type:NSYM), "");
- FI
- FI
- incp += 2;
- return;
- FI
- r = regname[r];
- switch (a) {
- /* r */
- case 000:
- prints(r);
- return;
-
- /* (r) */
- case 010:
- printf("(%s)", r);
- return;
-
- /* *(r)+ */
- case 030:
- printc('*');
-
- /* (r)+ */
- case 020:
- printf("(%s)+", r);
- return;
-
- /* *-(r) */
- case 050:
- printc('*');
-
- /* -(r) */
- case 040:
- printf("-(%s)", r);
- return;
-
- /* *x(r) */
- case 070:
- printc('*');
-
- /* x(r) */
- case 060:
- IF space==NSP
- THEN printc('?');
- ELSE var[1]=chkget(inkdot(incp), space);
- psymoff(var[1], (a==070?type:NSYM), "");
- FI
- incp += 2;
- printf("(%s)", r);
- return;
- }
- }
-
-
-
-