Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | ||
11 | MSG ODDADR; | |
12 | MSG BADDAT; | |
13 | MSG BADTXT; | |
14 | MAP txtmap; | |
15 | MAP datmap; | |
16 | INT wtflag; | |
17 | STRING errflg; | |
18 | INT errno; | |
19 | ||
20 | INT pid; | |
21 | ||
22 | ||
23 | ||
24 | ||
25 | /* file handling and access routines */ | |
26 | ||
27 | put(adr,space,value) | |
28 | L_INT adr; | |
29 | { | |
30 | access(WT,adr,space,value); | |
31 | } | |
32 | ||
33 | POS get(adr, space) | |
34 | L_INT adr; | |
35 | { | |
36 | return(access(RD,adr,space,0)); | |
37 | } | |
38 | ||
39 | POS chkget(n, space) | |
40 | L_INT n; | |
41 | { | |
42 | REG INT w; | |
43 | ||
44 | w = get(n, space); | |
45 | chkerr(); | |
46 | return(w); | |
47 | } | |
48 | ||
49 | access(mode,adr,space,value) | |
50 | L_INT adr; | |
51 | { | |
52 | INT w, w1, pmode, rd, file; | |
53 | rd = mode==RD; | |
54 | ||
55 | IF space == NSP THEN return(0); FI | |
56 | ||
57 | IF pid /* tracing on? */ | |
58 | THEN IF (adr&01) ANDF !rd THEN error(ODDADR); FI | |
59 | pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); | |
60 | w = ptrace(pmode, pid, shorten(adr&~01), value); | |
61 | IF adr&01 | |
62 | THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); | |
63 | w = (w>>8)&LOBYTE | (w1<<8); | |
64 | FI | |
65 | IF errno | |
66 | THEN errflg = (space&DSP ? BADDAT : BADTXT); | |
67 | FI | |
68 | return(w); | |
69 | FI | |
70 | w = 0; | |
71 | IF mode==WT ANDF wtflag==0 | |
72 | THEN error("not in write mode"); | |
73 | FI | |
74 | IF !chkmap(&adr,space) | |
75 | THEN return(0); | |
76 | FI | |
77 | file=(space&DSP?datmap.ufd:txtmap.ufd); | |
78 | IF longseek(file,adr)==0 ORF | |
79 | (rd ? read(file,&w,2) : write(file,&value,2)) < 1 | |
80 | THEN errflg=(space&DSP?BADDAT:BADTXT); | |
81 | FI | |
82 | return(w); | |
83 | ||
84 | } | |
85 | ||
86 | chkmap(adr,space) | |
87 | REG L_INT *adr; | |
88 | REG INT space; | |
89 | { | |
90 | REG MAPPTR amap; | |
91 | amap=((space&DSP?&datmap:&txtmap)); | |
92 | IF space&STAR ORF !within(*adr,amap->b1,amap->e1) | |
93 | THEN IF within(*adr,amap->b2,amap->e2) | |
94 | THEN *adr += (amap->f2)-(amap->b2); | |
95 | ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); | |
96 | FI | |
97 | ELSE *adr += (amap->f1)-(amap->b1); | |
98 | FI | |
99 | return(1); | |
100 | } | |
101 | ||
102 | within(adr,lbd,ubd) | |
103 | L_INT adr, lbd, ubd; | |
104 | { | |
105 | return(adr>=lbd && adr<ubd); | |
106 | } |