--- /dev/null
+DESTDIR=
+CFLAGS= -g -w
+CFILES= access.c command.c expr.c format.c input.c main.c message.c \
+ opset.c optab.c output.c pcs.c print.c runpcs.c setup.c sym.c
+OFILES= access.o command.o expr.o format.o input.o main.o message.o \
+ opset.o optab.o output.o pcs.o print.o runpcs.o setup.o sym.o
+
+adb: ${OFILES}
+ ${CC} -o adb ${OFILES}
+
+defs.h: mac.h mode.h
+mode.h: machine.h
+
+access.o: defs.h access.c
+command.o: defs.h command.c
+expr.o: defs.h expr.c
+format.o: defs.h format.c
+input.o: defs.h input.c
+main.o: defs.h main.c
+message.o: mac.h mode.h message.c
+ ${CC} -S message.c
+ ed <:rofix message.s
+ ${AS} -o message.o message.s
+ rm message.s
+opset.o: defs.h opset.c
+optab.o: defs.h optab.c
+ ${CC} -S optab.c
+ ed <:rofix optab.s
+ ${AS} -o optab.o optab.s
+ rm optab.s
+output.o: defs.h output.c
+pcs.o: defs.h pcs.c
+print.o: defs.h print.c
+runpcs.o: defs.h runpcs.c
+setup.o: defs.h setup.c
+sym.o: defs.h sym.c
+
+install:
+ install -s adb ${DESTDIR}/bin
+
+clean:
+ rm -f adb ${OFILES}
+
+print:
+ @ls -l | pr
+ @pr -f Makefile *.h ${CFILES}
--- /dev/null
+#
+/*
+ *
+ * UNIX debugger
+ *
+ */
+
+#include "defs.h"
+static char sccsid[] = "%Z%%M% %I% %G%";
+
+MSG ODDADR;
+MSG BADDAT;
+MSG BADTXT;
+MAP txtmap;
+MAP datmap;
+INT wtflag;
+STRING errflg;
+INT errno;
+
+INT pid;
+
+/* file handling and access routines */
+
+put(adr,space,value)
+#ifndef EDDT
+L_INT adr;
+{
+ access(WT,adr,space,value);
+}
+#else
+ L_INT *adr; {*adr=value;}
+#endif
+
+POS get(adr, space)
+#ifndef EDDT
+L_INT adr;
+{
+ return(access(RD,adr,space,0));
+}
+#else
+ L_INT *adr; {return(*adr);}
+#endif
+
+POS chkget(n, space)
+L_INT n;
+{
+#ifndef vax
+ REG INT w;
+#else
+ REG L_INT w;
+#endif
+
+ w = get(n, space);
+ chkerr();
+ return(w);
+}
+
+POS bchkget(n, space)
+L_INT n;
+{
+ return(chkget(n, space) & LOBYTE);
+}
+
+#ifndef EDDT
+access(mode,adr,space,value)
+L_INT adr;
+{
+ INT pmode,rd,file;
+ ADDR w;
+ rd = mode==RD;
+
+ IF space == NSP THEN return(0); FI
+
+ IF pid /* tracing on? */
+ THEN
+#ifndef vax
+ IF adr&01 ANDF !rd THEN error(ODDADR); FI
+#endif
+ pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER));
+ w = ptrace(pmode, pid, adr, value);
+#ifndef vax
+ IF adr&01
+ THEN w1 = ptrace(pmode, pid, shorten(adr+1), value);
+ w = (w>>8)&LOBYTE | (w1<<8);
+ FI
+#endif
+ IF errno
+ THEN errflg = (space&DSP ? BADDAT : BADTXT);
+ FI
+ return(w);
+ FI
+ w = 0;
+ IF mode==WT ANDF wtflag==0
+ THEN error("not in write mode");
+ FI
+ IF !chkmap(&adr,space)
+ THEN return(0);
+ FI
+ file=(space&DSP?datmap.ufd:txtmap.ufd);
+ IF longseek(file,adr)==0 ORF
+ (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1
+ THEN errflg=(space&DSP?BADDAT:BADTXT);
+ FI
+ return(w);
+
+}
+#endif
+
+chkmap(adr,space)
+ REG L_INT *adr;
+ REG INT space;
+{
+ REG MAPPTR amap;
+ amap=((space&DSP?&datmap:&txtmap));
+ IF space&STAR ORF !within(*adr,amap->b1,amap->e1)
+ THEN IF within(*adr,amap->b2,amap->e2)
+ THEN *adr += (amap->f2)-(amap->b2);
+ ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0);
+ FI
+ ELSE *adr += (amap->f1)-(amap->b1);
+ FI
+ return(1);
+}
+
+within(adr,lbd,ubd)
+POS adr, lbd, ubd;
+{
+ return(adr>=lbd && adr<ubd);
+}
+
+longseek(f, a)
+L_INT a;
+{
+ return(lseek(f,a,0) != -1);
+}
--- /dev/null
+#
+/*
+ *
+ * UNIX debugger
+ *
+ */
+
+#include "defs.h"
+static char sccsid[] = "%Z%%M% %I% %G%";
+
+MSG BADEQ;
+MSG NOMATCH;
+MSG BADVAR;
+MSG BADCOM;
+
+MAP txtmap;
+MAP datmap;
+INT executing;
+CHAR *lp;
+INT fcor;
+INT fsym;
+INT mkfault;
+STRING errflg;
+
+CHAR lastc;
+CHAR eqformat[128] = "z";
+CHAR stformat[128] = "X\"= \"^i";
+
+L_INT dot;
+L_INT ditto;
+INT dotinc;
+INT lastcom = '=';
+L_INT var[];
+L_INT locval;
+L_INT locmsk;
+INT pid;
+L_INT expv;
+L_INT adrval;
+INT adrflg;
+L_INT cntval;
+INT cntflg;
+
+
+
+
+/* command decoding */
+
+command(buf,defcom)
+STRING buf;
+CHAR defcom;
+{
+ INT itype, ptype, modifier, regptr;
+ BOOL longpr, eqcom;
+ CHAR wformat[1];
+ CHAR savc;
+ L_INT w, savdot;
+ STRING savlp=lp;
+ IF buf
+ THEN IF *buf==EOR
+ THEN return(FALSE);
+ ELSE lp=buf;
+ FI
+ FI
+
+ REP
+ IF adrflg=expr(0)
+ THEN dot=expv; ditto=dot;
+ FI
+ adrval=dot;
+ IF rdc()==',' ANDF expr(0)
+ THEN cntflg=TRUE; cntval=expv;
+ ELSE cntflg=FALSE; cntval=1; lp--;
+ FI
+
+ IF !eol(rdc())
+ THEN lastcom=lastc;
+ ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
+ lp--; lastcom=defcom;
+ FI
+
+ switch(lastcom&STRIP) {
+
+ case '/':
+ itype=DSP; ptype=DSYM;
+ goto trystar;
+
+ case '=':
+ itype=NSP; ptype=0;
+ goto trypr;
+
+ case '?':
+ itype=ISP; ptype=ISYM;
+ goto trystar;
+
+ trystar:
+ IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
+ IF lastcom"E
+ THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
+ FI
+
+ trypr:
+ longpr=FALSE; eqcom=lastcom=='=';
+ switch (rdc()) {
+
+ case 'm':
+ {/*reset map data*/
+ INT fcount;
+ MAP *smap;
+ UNION{MAP *m; L_INT *mp;}amap;
+
+ IF eqcom THEN error(BADEQ); FI
+ smap=(itype&DSP?&datmap:&txtmap);
+ amap.m=smap; fcount=3;
+ IF itype&STAR
+ THEN amap.mp += 3;
+ FI
+ WHILE fcount-- ANDF expr(0)
+ DO *(amap.mp)++ = expv; OD
+ IF rdc()=='?' THEN smap->ufd=fsym;
+ ELIF lastc == '/' THEN smap->ufd=fcor;
+ ELSE lp--;
+ FI
+ }
+ break;
+
+ case 'L':
+ longpr=TRUE;
+ case 'l':
+ /*search for exp*/
+ IF eqcom THEN error(BADEQ); FI
+ dotinc=(longpr?4:2); savdot=dot;
+ expr(1); locval=expv;
+ IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
+ IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
+ LOOP w=get(dot,itype);
+ IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
+ dot=inkdot(dotinc);
+ POOL
+ IF errflg
+ THEN dot=savdot; errflg=NOMATCH;
+ FI
+ psymoff(dot,ptype,"");
+ break;
+
+ case 'W':
+ longpr=TRUE;
+ case 'w':
+ IF eqcom THEN error(BADEQ); FI
+ wformat[0]=lastc; expr(1);
+ REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
+ errflg=0; dot=savdot;
+ IF longpr
+ THEN put(dot,itype,expv);
+ ELSE put(dot,itype,itol(get(dot+2,itype),expv));
+ FI
+ savdot=dot;
+ printf("=%8t"); exform(1,wformat,itype,ptype);
+ newline();
+ PER expr(0) ANDF errflg==0 DONE
+ dot=savdot;
+ chkerr();
+ break;
+
+ default:
+ lp--;
+ getformat(eqcom ? eqformat : stformat);
+ IF !eqcom
+ THEN psymoff(dot,ptype,":%16t");
+ FI
+ scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
+ }
+ break;
+
+ case '>':
+ lastcom=0; savc=rdc();
+ IF regptr=getreg(savc)
+ THEN * (ADDR *) (((ADDR)&u)+regptr)=dot;
+ ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
+ ELIF (modifier=varchk(savc)) != -1
+ THEN var[modifier]=dot;
+ ELSE error(BADVAR);
+ FI
+ break;
+
+ case '!':
+ lastcom=0;
+ shell(); break;
+
+ case '$':
+ lastcom=0;
+ printtrace(nextchar()); break;
+
+ case ':':
+ IF !executing
+ THEN executing=TRUE;
+ subpcs(nextchar());
+ executing=FALSE;
+ lastcom=0;
+ FI
+ break;
+
+ case 0:
+ prints(DBNAME);
+ break;
+
+ default: error(BADCOM);
+ }
+
+ flushbuf();
+ PER rdc()==';' DONE
+ IF buf THEN lp=savlp; ELSE lp--; FI
+ return(adrflg ANDF dot!=0);
+}
+