Commit | Line | Data |
---|---|---|
5c1cc62c BJ |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | static char sccsid[] = "%Z%%M% %I% %G%"; | |
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 | /* file handling and access routines */ | |
23 | ||
24 | put(adr,space,value) | |
25 | #ifndef EDDT | |
26 | L_INT adr; | |
27 | { | |
28 | access(WT,adr,space,value); | |
29 | } | |
30 | #else | |
31 | L_INT *adr; {*adr=value;} | |
32 | #endif | |
33 | ||
34 | POS get(adr, space) | |
35 | #ifndef EDDT | |
36 | L_INT adr; | |
37 | { | |
38 | return(access(RD,adr,space,0)); | |
39 | } | |
40 | #else | |
41 | L_INT *adr; {return(*adr);} | |
42 | #endif | |
43 | ||
44 | POS chkget(n, space) | |
45 | L_INT n; | |
46 | { | |
47 | #ifndef vax | |
48 | REG INT w; | |
49 | #else | |
50 | REG L_INT w; | |
51 | #endif | |
52 | ||
53 | w = get(n, space); | |
54 | chkerr(); | |
55 | return(w); | |
56 | } | |
57 | ||
58 | POS bchkget(n, space) | |
59 | L_INT n; | |
60 | { | |
61 | return(chkget(n, space) & LOBYTE); | |
62 | } | |
63 | ||
64 | #ifndef EDDT | |
65 | access(mode,adr,space,value) | |
66 | L_INT adr; | |
67 | { | |
68 | INT pmode,rd,file; | |
69 | ADDR w; | |
70 | rd = mode==RD; | |
71 | ||
72 | IF space == NSP THEN return(0); FI | |
73 | ||
74 | IF pid /* tracing on? */ | |
75 | THEN | |
76 | #ifndef vax | |
77 | IF adr&01 ANDF !rd THEN error(ODDADR); FI | |
78 | #endif | |
79 | pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); | |
80 | w = ptrace(pmode, pid, adr, value); | |
81 | #ifndef vax | |
82 | IF adr&01 | |
83 | THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); | |
84 | w = (w>>8)&LOBYTE | (w1<<8); | |
85 | FI | |
86 | #endif | |
87 | IF errno | |
88 | THEN errflg = (space&DSP ? BADDAT : BADTXT); | |
89 | FI | |
90 | return(w); | |
91 | FI | |
92 | w = 0; | |
93 | IF mode==WT ANDF wtflag==0 | |
94 | THEN error("not in write mode"); | |
95 | FI | |
96 | IF !chkmap(&adr,space) | |
97 | THEN return(0); | |
98 | FI | |
99 | file=(space&DSP?datmap.ufd:txtmap.ufd); | |
100 | IF longseek(file,adr)==0 ORF | |
101 | (rd ? read(file,&w,sizeof(w)) : write(file,&value,sizeof(w))) < 1 | |
102 | THEN errflg=(space&DSP?BADDAT:BADTXT); | |
103 | FI | |
104 | return(w); | |
105 | ||
106 | } | |
107 | #endif | |
108 | ||
109 | chkmap(adr,space) | |
110 | REG L_INT *adr; | |
111 | REG INT space; | |
112 | { | |
113 | REG MAPPTR amap; | |
114 | amap=((space&DSP?&datmap:&txtmap)); | |
115 | IF space&STAR ORF !within(*adr,amap->b1,amap->e1) | |
116 | THEN IF within(*adr,amap->b2,amap->e2) | |
117 | THEN *adr += (amap->f2)-(amap->b2); | |
118 | ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); | |
119 | FI | |
120 | ELSE *adr += (amap->f1)-(amap->b1); | |
121 | FI | |
122 | return(1); | |
123 | } | |
124 | ||
125 | within(adr,lbd,ubd) | |
126 | POS adr, lbd, ubd; | |
127 | { | |
128 | return(adr>=lbd && adr<ubd); | |
129 | } | |
130 | ||
131 | longseek(f, a) | |
132 | L_INT a; | |
133 | { | |
134 | return(lseek(f,a,0) != -1); | |
135 | } |