# /* * * UNIX debugger * */ #include "defs.h" 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) L_INT adr; { access(WT,adr,space,value); } POS get(adr, space) L_INT adr; { return(access(RD,adr,space,0)); } POS chkget(n, space) L_INT n; { REG INT w; w = get(n, space); chkerr(); return(w); } access(mode,adr,space,value) L_INT adr; { INT w, w1, pmode, rd, file; rd = mode==RD; IF space == NSP THEN return(0); FI IF pid /* tracing on? */ THEN IF (adr&01) ANDF !rd THEN error(ODDADR); FI pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); w = ptrace(pmode, pid, shorten(adr&~01), value); IF adr&01 THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); w = (w>>8)&LOBYTE | (w1<<8); FI 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,2) : write(file,&value,2)) < 1 THEN errflg=(space&DSP?BADDAT:BADTXT); FI return(w); } 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) L_INT adr, lbd, ubd; { return(adr>=lbd && adr