1 0a61c07d 2004-04-19 devnull // portable acid for all architectures
3 0a61c07d 2004-04-19 devnull defn pfl(addr)
5 0a61c07d 2004-04-19 devnull print(pcfile(addr), ":", pcline(addr), "\n");
9 0a61c07d 2004-04-19 devnull notestk(addr)
11 0a61c07d 2004-04-19 devnull local pc, sp;
12 0a61c07d 2004-04-19 devnull complex Ureg addr;
14 0a61c07d 2004-04-19 devnull pc = addr.pc\X;
15 0a61c07d 2004-04-19 devnull sp = addr.sp\X;
17 0a61c07d 2004-04-19 devnull print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " ");
19 0a61c07d 2004-04-19 devnull _stk({"PC", pc, "SP", sp, linkreg(addr)}, 1);
23 0a61c07d 2004-04-19 devnull notelstk(addr)
25 0a61c07d 2004-04-19 devnull local pc, sp;
26 0a61c07d 2004-04-19 devnull complex Ureg addr;
28 0a61c07d 2004-04-19 devnull pc = addr.pc\X;
29 0a61c07d 2004-04-19 devnull sp = addr.sp\X;
31 0a61c07d 2004-04-19 devnull print("Note pc:", pc, " sp:", sp, " ", fmt(pc, 'a'), " ");
33 0a61c07d 2004-04-19 devnull _stk({"PC", pc, "SP", sp, linkreg(addr)}, 1);
36 0a61c07d 2004-04-19 devnull defn labstk(l) // trace from a label
38 0a61c07d 2004-04-19 devnull _stk({"PC", *(l+4), "SP", *l, linkreg(0)}, 0);
41 0a61c07d 2004-04-19 devnull defn params(param)
43 0a61c07d 2004-04-19 devnull while param do {
44 0a61c07d 2004-04-19 devnull sym = head param;
45 0a61c07d 2004-04-19 devnull print(sym[0], "=", itoa(sym[1], "%ux"));
46 0a61c07d 2004-04-19 devnull param = tail param;
47 0a61c07d 2004-04-19 devnull if param then
48 0a61c07d 2004-04-19 devnull print (",");
52 0a61c07d 2004-04-19 devnull stkprefix = "";
53 0a61c07d 2004-04-19 devnull stkignore = {};
54 0a61c07d 2004-04-19 devnull stkend = 0;
56 0a61c07d 2004-04-19 devnull defn locals(l)
58 0a61c07d 2004-04-19 devnull local sym;
60 0a61c07d 2004-04-19 devnull while l do {
61 0a61c07d 2004-04-19 devnull sym = head l;
62 0a61c07d 2004-04-19 devnull print(stkprefix, "\t", sym[0], "=", itoa(sym[1], "%ux"), "\n");
63 0a61c07d 2004-04-19 devnull l = tail l;
67 0a61c07d 2004-04-19 devnull defn _stkign(file)
69 0a61c07d 2004-04-19 devnull s = stkignore;
70 0a61c07d 2004-04-19 devnull while s do {
71 0a61c07d 2004-04-19 devnull if regexp(head s, file) then
72 0a61c07d 2004-04-19 devnull return 1;
73 0a61c07d 2004-04-19 devnull s = tail s;
75 0a61c07d 2004-04-19 devnull return 0;
78 0a61c07d 2004-04-19 devnull // print a stack trace
80 0a61c07d 2004-04-19 devnull // in a run of leading frames in files matched by regexps in stkignore,
81 0a61c07d 2004-04-19 devnull // only print the last one.
82 0a61c07d 2004-04-19 devnull defn _stk(regs, dolocals)
84 0a61c07d 2004-04-19 devnull local stk, pc, fn, callerpc, paramlist, locallist;
86 0a61c07d 2004-04-19 devnull stk = strace(regs);
87 0a61c07d 2004-04-19 devnull if stkignore then {
88 0a61c07d 2004-04-19 devnull while stk && tail stk && _stkign((head tail stk)[1]) do
89 0a61c07d 2004-04-19 devnull stk = tail stk;
92 0a61c07d 2004-04-19 devnull callerpc = 0;
93 0a61c07d 2004-04-19 devnull while stk do {
94 0a61c07d 2004-04-19 devnull frame = head stk;
95 0a61c07d 2004-04-19 devnull stk = tail stk;
96 0a61c07d 2004-04-19 devnull fn = frame[0];
97 0a61c07d 2004-04-19 devnull pc = frame[1];
98 0a61c07d 2004-04-19 devnull callerpc = frame[2];
99 0a61c07d 2004-04-19 devnull paramlist = frame[3];
100 0a61c07d 2004-04-19 devnull locallist = frame[4];
102 0a61c07d 2004-04-19 devnull print(stkprefix, fmt(fn, 'a'), "(");
103 0a61c07d 2004-04-19 devnull params(paramlist);
104 0a61c07d 2004-04-19 devnull print(")");
105 0a61c07d 2004-04-19 devnull if pc != fn then
106 0a61c07d 2004-04-19 devnull print("+", itoa(pc-fn, "%ux"));
107 0a61c07d 2004-04-19 devnull print(" ");
108 0a61c07d 2004-04-19 devnull pfl(pc);
109 0a61c07d 2004-04-19 devnull if dolocals then
110 0a61c07d 2004-04-19 devnull locals(locallist);
113 0a61c07d 2004-04-19 devnull if callerpc then {
114 0a61c07d 2004-04-19 devnull print(stkprefix, fmt(callerpc, 'a'), " ");
115 0a61c07d 2004-04-19 devnull pfl(callerpc);
119 0a61c07d 2004-04-19 devnull defn findsrc(file)
121 0a61c07d 2004-04-19 devnull local lst, src;
123 0a61c07d 2004-04-19 devnull if file[0] == '/' then {
124 0a61c07d 2004-04-19 devnull src = file(file);
125 0a61c07d 2004-04-19 devnull if src != {} then {
126 0a61c07d 2004-04-19 devnull srcfiles = append srcfiles, file;
127 0a61c07d 2004-04-19 devnull srctext = append srctext, src;
128 0a61c07d 2004-04-19 devnull return src;
130 0a61c07d 2004-04-19 devnull return {};
133 0a61c07d 2004-04-19 devnull lst = srcpath;
134 0a61c07d 2004-04-19 devnull while head lst do {
135 0a61c07d 2004-04-19 devnull src = file(head lst+file);
136 0a61c07d 2004-04-19 devnull if src != {} then {
137 0a61c07d 2004-04-19 devnull srcfiles = append srcfiles, file;
138 0a61c07d 2004-04-19 devnull srctext = append srctext, src;
139 0a61c07d 2004-04-19 devnull return src;
141 0a61c07d 2004-04-19 devnull lst = tail lst;
145 0a61c07d 2004-04-19 devnull defn line(addr)
147 0a61c07d 2004-04-19 devnull local src, file;
149 0a61c07d 2004-04-19 devnull file = pcfile(addr);
150 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
152 0a61c07d 2004-04-19 devnull if src >= 0 then
153 0a61c07d 2004-04-19 devnull src = srctext[src];
155 0a61c07d 2004-04-19 devnull src = findsrc(file);
157 0a61c07d 2004-04-19 devnull if src == {} then {
158 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
159 0a61c07d 2004-04-19 devnull return {};
161 0a61c07d 2004-04-19 devnull line = pcline(addr)-1;
162 0a61c07d 2004-04-19 devnull print(file, ":", src[line], "\n");
165 0a61c07d 2004-04-19 devnull defn addsrcdir(dir)
167 0a61c07d 2004-04-19 devnull dir = dir+"/";
169 0a61c07d 2004-04-19 devnull if match(dir, srcpath) >= 0 then {
170 0a61c07d 2004-04-19 devnull print("already in srcpath\n");
171 0a61c07d 2004-04-19 devnull return {};
174 0a61c07d 2004-04-19 devnull srcpath = {dir}+srcpath;
177 0a61c07d 2004-04-19 devnull defn source()
179 0a61c07d 2004-04-19 devnull local l;
181 0a61c07d 2004-04-19 devnull l = srcpath;
182 0a61c07d 2004-04-19 devnull while l do {
183 0a61c07d 2004-04-19 devnull print(head l, "\n");
184 0a61c07d 2004-04-19 devnull l = tail l;
186 0a61c07d 2004-04-19 devnull l = srcfiles;
188 0a61c07d 2004-04-19 devnull while l do {
189 0a61c07d 2004-04-19 devnull print("\t", head l, "\n");
190 0a61c07d 2004-04-19 devnull l = tail l;
194 0a61c07d 2004-04-19 devnull defn Bsrc(addr)
196 0a61c07d 2004-04-19 devnull local lst;
198 0a61c07d 2004-04-19 devnull lst = srcpath;
199 0a61c07d 2004-04-19 devnull file = pcfile(addr);
200 0a61c07d 2004-04-19 devnull if file[0] == '/' && access(file) then {
201 0a61c07d 2004-04-19 devnull rc("B "+file+":"+itoa(pcline(addr)));
202 0a61c07d 2004-04-19 devnull return {};
204 0a61c07d 2004-04-19 devnull while head lst do {
205 0a61c07d 2004-04-19 devnull name = head lst+file;
206 0a61c07d 2004-04-19 devnull if access(name) then {
207 0a61c07d 2004-04-19 devnull rc("B "+name+":"+itoa(pcline(addr)));
208 0a61c07d 2004-04-19 devnull return {};
210 0a61c07d 2004-04-19 devnull lst = tail lst;
212 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
215 0a61c07d 2004-04-19 devnull defn srcline(addr)
217 0a61c07d 2004-04-19 devnull local text, cline, line, file, src;
218 0a61c07d 2004-04-19 devnull file = pcfile(addr);
219 0a61c07d 2004-04-19 devnull src = match(file,srcfiles);
220 0a61c07d 2004-04-19 devnull if (src>=0) then
221 0a61c07d 2004-04-19 devnull src = srctext[src];
223 0a61c07d 2004-04-19 devnull src = findsrc(file);
224 0a61c07d 2004-04-19 devnull if (src=={}) then
226 0a61c07d 2004-04-19 devnull return "(no source)";
228 0a61c07d 2004-04-19 devnull return src[pcline(addr)-1];
231 0a61c07d 2004-04-19 devnull defn src(addr)
233 0a61c07d 2004-04-19 devnull local src, file, line, cline, text;
235 0a61c07d 2004-04-19 devnull file = pcfile(addr);
236 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
238 0a61c07d 2004-04-19 devnull if src >= 0 then
239 0a61c07d 2004-04-19 devnull src = srctext[src];
241 0a61c07d 2004-04-19 devnull src = findsrc(file);
243 0a61c07d 2004-04-19 devnull if src == {} then {
244 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
245 0a61c07d 2004-04-19 devnull return {};
248 0a61c07d 2004-04-19 devnull cline = pcline(addr)-1;
249 0a61c07d 2004-04-19 devnull print(file, ":", cline+1, "\n");
250 0a61c07d 2004-04-19 devnull line = cline-5;
251 0a61c07d 2004-04-19 devnull loop 0,10 do {
252 0a61c07d 2004-04-19 devnull if line >= 0 then {
253 0a61c07d 2004-04-19 devnull if line == cline then
254 0a61c07d 2004-04-19 devnull print(">");
256 0a61c07d 2004-04-19 devnull print(" ");
257 0a61c07d 2004-04-19 devnull text = src[line];
258 0a61c07d 2004-04-19 devnull if text == {} then
259 0a61c07d 2004-04-19 devnull return {};
260 0a61c07d 2004-04-19 devnull print(line+1, "\t", text, "\n");
262 0a61c07d 2004-04-19 devnull line = line+1;
266 0a61c07d 2004-04-19 devnull defn step() // single step the process
268 0a61c07d 2004-04-19 devnull local lst, lpl, addr, bput;
270 0a61c07d 2004-04-19 devnull bput = 0;
271 0a61c07d 2004-04-19 devnull if match(*PC, bplist) >= 0 then { // Sitting on a breakpoint
272 0a61c07d 2004-04-19 devnull bput = fmt(*PC, bpfmt);
273 0a61c07d 2004-04-19 devnull *bput = @bput;
276 0a61c07d 2004-04-19 devnull lst = follow(*PC);
278 0a61c07d 2004-04-19 devnull lpl = lst;
279 0a61c07d 2004-04-19 devnull while lpl do { // place break points
280 0a61c07d 2004-04-19 devnull *(head lpl) = bpinst;
281 0a61c07d 2004-04-19 devnull lpl = tail lpl;
284 0a61c07d 2004-04-19 devnull startstop(pid); // do the step
286 0a61c07d 2004-04-19 devnull while lst do { // remove the breakpoints
287 0a61c07d 2004-04-19 devnull addr = fmt(head lst, bpfmt);
288 0a61c07d 2004-04-19 devnull *addr = @addr;
289 0a61c07d 2004-04-19 devnull lst = tail lst;
291 0a61c07d 2004-04-19 devnull if bput != 0 then
292 0a61c07d 2004-04-19 devnull *bput = bpinst;
295 0a61c07d 2004-04-19 devnull defn bpset(addr) // set a breakpoint
297 0a61c07d 2004-04-19 devnull if status(pid) != "Stopped" then {
298 0a61c07d 2004-04-19 devnull print("Waiting...\n");
299 0a61c07d 2004-04-19 devnull stop(pid);
301 0a61c07d 2004-04-19 devnull if match(addr, bplist) >= 0 then
302 0a61c07d 2004-04-19 devnull print("breakpoint already set at ", fmt(addr, 'a'), "\n");
304 0a61c07d 2004-04-19 devnull *fmt(addr, bpfmt) = bpinst;
305 0a61c07d 2004-04-19 devnull bplist = append bplist, addr;
309 0a61c07d 2004-04-19 devnull defn bptab() // print a table of breakpoints
311 0a61c07d 2004-04-19 devnull local lst, addr;
313 0a61c07d 2004-04-19 devnull lst = bplist;
314 0a61c07d 2004-04-19 devnull while lst do {
315 0a61c07d 2004-04-19 devnull addr = head lst;
316 0a61c07d 2004-04-19 devnull print("\t", fmt(addr, 'X'), " ", fmt(addr, 'a'), " ", fmt(addr, 'i'), "\n");
317 0a61c07d 2004-04-19 devnull lst = tail lst;
321 0a61c07d 2004-04-19 devnull defn bpdel(addr) // delete a breakpoint
323 0a61c07d 2004-04-19 devnull local n, pc, nbplist;
325 0a61c07d 2004-04-19 devnull n = match(addr, bplist);
326 0a61c07d 2004-04-19 devnull if n < 0 then {
327 0a61c07d 2004-04-19 devnull print("no breakpoint at ", fmt(addr, 'a'), "\n");
328 0a61c07d 2004-04-19 devnull return {};
331 0a61c07d 2004-04-19 devnull addr = fmt(addr, bpfmt);
332 0a61c07d 2004-04-19 devnull *addr = @addr;
334 0a61c07d 2004-04-19 devnull nbplist = {}; // delete from list
335 0a61c07d 2004-04-19 devnull while bplist do {
336 0a61c07d 2004-04-19 devnull pc = head bplist;
337 0a61c07d 2004-04-19 devnull if pc != addr then
338 0a61c07d 2004-04-19 devnull nbplist = append nbplist, pc;
339 0a61c07d 2004-04-19 devnull bplist = tail bplist;
341 0a61c07d 2004-04-19 devnull bplist = nbplist; // delete from memory
344 0a61c07d 2004-04-19 devnull defn cont() // continue execution
346 0a61c07d 2004-04-19 devnull local addr;
348 0a61c07d 2004-04-19 devnull addr = fmt(*PC, bpfmt);
349 0a61c07d 2004-04-19 devnull if match(addr, bplist) >= 0 then { // Sitting on a breakpoint
350 0a61c07d 2004-04-19 devnull *addr = @addr;
351 0a61c07d 2004-04-19 devnull step(); // Step over
352 0a61c07d 2004-04-19 devnull *addr = bpinst;
354 0a61c07d 2004-04-19 devnull startstop(pid); // Run
357 0a61c07d 2004-04-19 devnull defn stopped(pid) // called from acid when a process changes state
359 0a61c07d 2004-04-19 devnull pstop(pid); // stub so this is easy to replace
362 0a61c07d 2004-04-19 devnull defn procs() // print status of processes
364 0a61c07d 2004-04-19 devnull local c, lst, cpid;
366 0a61c07d 2004-04-19 devnull cpid = pid;
367 0a61c07d 2004-04-19 devnull lst = proclist;
368 0a61c07d 2004-04-19 devnull while lst do {
369 0a61c07d 2004-04-19 devnull np = head lst;
370 0a61c07d 2004-04-19 devnull setproc(np);
371 0a61c07d 2004-04-19 devnull if np == cpid then
372 0a61c07d 2004-04-19 devnull c = '>';
374 0a61c07d 2004-04-19 devnull c = ' ';
375 0a61c07d 2004-04-19 devnull print(fmt(c, 'c'), np, ": ", status(np), " at ", fmt(*PC, 'a'), " setproc(", np, ")\n");
376 0a61c07d 2004-04-19 devnull lst = tail lst;
378 0a61c07d 2004-04-19 devnull pid = cpid;
379 0a61c07d 2004-04-19 devnull if pid != 0 then
380 0a61c07d 2004-04-19 devnull setproc(pid);
383 0a61c07d 2004-04-19 devnull _asmlines = 30;
385 0a61c07d 2004-04-19 devnull defn asm(addr)
387 0a61c07d 2004-04-19 devnull local bound;
389 0a61c07d 2004-04-19 devnull bound = fnbound(addr);
391 0a61c07d 2004-04-19 devnull addr = fmt(addr, 'i');
392 0a61c07d 2004-04-19 devnull loop 1,_asmlines do {
393 0a61c07d 2004-04-19 devnull print(fmt(addr, 'a'), " ", fmt(addr, 'X'));
394 0a61c07d 2004-04-19 devnull print("\t", @addr++, "\n");
395 0a61c07d 2004-04-19 devnull if bound != {} && addr > bound[1] then {
396 0a61c07d 2004-04-19 devnull lasmaddr = addr;
397 0a61c07d 2004-04-19 devnull return {};
400 0a61c07d 2004-04-19 devnull lasmaddr = addr;
403 0a61c07d 2004-04-19 devnull defn casm()
405 0a61c07d 2004-04-19 devnull asm(lasmaddr);
408 0a61c07d 2004-04-19 devnull defn win()
410 0a61c07d 2004-04-19 devnull local npid, estr;
412 0a61c07d 2004-04-19 devnull bplist = {};
413 0a61c07d 2004-04-19 devnull notes = {};
415 0a61c07d 2004-04-19 devnull estr = "/sys/lib/acid/window '0 0 600 400' "+textfile;
416 0a61c07d 2004-04-19 devnull if progargs != "" then
417 0a61c07d 2004-04-19 devnull estr = estr+" "+progargs;
419 0a61c07d 2004-04-19 devnull npid = rc(estr);
420 0a61c07d 2004-04-19 devnull npid = atoi(npid);
421 0a61c07d 2004-04-19 devnull if npid == 0 then
422 0a61c07d 2004-04-19 devnull error("win failed to create process");
424 0a61c07d 2004-04-19 devnull setproc(npid);
425 0a61c07d 2004-04-19 devnull stopped(npid);
428 0a61c07d 2004-04-19 devnull defn win2()
430 0a61c07d 2004-04-19 devnull local npid, estr;
432 0a61c07d 2004-04-19 devnull bplist = {};
433 0a61c07d 2004-04-19 devnull notes = {};
435 0a61c07d 2004-04-19 devnull estr = "/sys/lib/acid/transcript '0 0 600 400' '100 100 700 500' "+textfile;
436 0a61c07d 2004-04-19 devnull if progargs != "" then
437 0a61c07d 2004-04-19 devnull estr = estr+" "+progargs;
439 0a61c07d 2004-04-19 devnull npid = rc(estr);
440 0a61c07d 2004-04-19 devnull npid = atoi(npid);
441 0a61c07d 2004-04-19 devnull if npid == 0 then
442 0a61c07d 2004-04-19 devnull error("win failed to create process");
444 0a61c07d 2004-04-19 devnull setproc(npid);
445 0a61c07d 2004-04-19 devnull stopped(npid);
448 0a61c07d 2004-04-19 devnull defn new()
450 0a61c07d 2004-04-19 devnull bplist = {};
451 0a61c07d 2004-04-19 devnull newproc(progargs);
452 0a61c07d 2004-04-19 devnull // Dont miss the delay slot calls
453 0a61c07d 2004-04-19 devnull bpset(follow(main)[0]);
455 0a61c07d 2004-04-19 devnull bpdel(*PC);
458 0a61c07d 2004-04-19 devnull defn stmnt() // step one statement
460 0a61c07d 2004-04-19 devnull local line;
462 0a61c07d 2004-04-19 devnull line = pcline(*PC);
463 0a61c07d 2004-04-19 devnull while 1 do {
465 0a61c07d 2004-04-19 devnull if line != pcline(*PC) then {
466 0a61c07d 2004-04-19 devnull src(*PC);
467 0a61c07d 2004-04-19 devnull return {};
472 0a61c07d 2004-04-19 devnull defn func() // step until we leave the current function
474 0a61c07d 2004-04-19 devnull local bound, end, start, pc;
476 0a61c07d 2004-04-19 devnull bound = fnbound(*PC);
477 0a61c07d 2004-04-19 devnull if bound == {} then {
478 0a61c07d 2004-04-19 devnull print("cannot locate text symbol\n");
479 0a61c07d 2004-04-19 devnull return {};
482 0a61c07d 2004-04-19 devnull pc = *PC;
483 0a61c07d 2004-04-19 devnull start = bound[0];
484 0a61c07d 2004-04-19 devnull end = bound[1];
485 0a61c07d 2004-04-19 devnull while pc >= start && pc < end do {
487 0a61c07d 2004-04-19 devnull pc = *PC;
491 0a61c07d 2004-04-19 devnull defn next()
493 0a61c07d 2004-04-19 devnull local sp, bound;
495 0a61c07d 2004-04-19 devnull sp = *SP;
496 0a61c07d 2004-04-19 devnull bound = fnbound(*PC);
497 0a61c07d 2004-04-19 devnull stmnt();
498 0a61c07d 2004-04-19 devnull pc = *PC;
499 0a61c07d 2004-04-19 devnull if pc >= bound[0] && pc < bound[1] then
500 0a61c07d 2004-04-19 devnull return {};
502 0a61c07d 2004-04-19 devnull while (pc < bound[0] || pc > bound[1]) && sp >= *SP do {
504 0a61c07d 2004-04-19 devnull pc = *PC;
506 0a61c07d 2004-04-19 devnull src(*PC);
509 0a61c07d 2004-04-19 devnull defn maps()
511 0a61c07d 2004-04-19 devnull local m, mm;
513 0a61c07d 2004-04-19 devnull m = map();
514 0a61c07d 2004-04-19 devnull while m != {} do {
515 0a61c07d 2004-04-19 devnull mm = head m;
516 0a61c07d 2004-04-19 devnull m = tail m;
517 0a61c07d 2004-04-19 devnull print(mm[2]\X, " ", mm[3]\X, " ", mm[4]\X, " ", mm[0], " ", mm[1], "\n");
521 0a61c07d 2004-04-19 devnull defn dump(addr, n, fmt)
523 0a61c07d 2004-04-19 devnull loop 0, n do {
524 0a61c07d 2004-04-19 devnull print(fmt(addr, 'X'), ": ");
525 0a61c07d 2004-04-19 devnull addr = mem(addr, fmt);
529 0a61c07d 2004-04-19 devnull defn mem(addr, fmt)
532 0a61c07d 2004-04-19 devnull local i, c, n;
535 0a61c07d 2004-04-19 devnull while fmt[i] != 0 do {
536 0a61c07d 2004-04-19 devnull c = fmt[i];
538 0a61c07d 2004-04-19 devnull while '0' <= fmt[i] && fmt[i] <= '9' do {
539 0a61c07d 2004-04-19 devnull n = 10*n + fmt[i]-'0';
540 0a61c07d 2004-04-19 devnull i = i+1;
542 0a61c07d 2004-04-19 devnull if n <= 0 then n = 1;
543 0a61c07d 2004-04-19 devnull addr = fmt(addr, fmt[i]);
544 0a61c07d 2004-04-19 devnull while n > 0 do {
545 0a61c07d 2004-04-19 devnull print(*addr++, " ");
546 0a61c07d 2004-04-19 devnull n = n-1;
548 0a61c07d 2004-04-19 devnull i = i+1;
550 0a61c07d 2004-04-19 devnull print("\n");
551 0a61c07d 2004-04-19 devnull return addr;
554 0a61c07d 2004-04-19 devnull defn symbols(pattern)
556 0a61c07d 2004-04-19 devnull local l, s;
558 0a61c07d 2004-04-19 devnull l = symbols;
559 0a61c07d 2004-04-19 devnull while l do {
560 0a61c07d 2004-04-19 devnull s = head l;
561 0a61c07d 2004-04-19 devnull if regexp(pattern, s[0]) then
562 0a61c07d 2004-04-19 devnull print(s[0], "\t", s[1], "\t", s[2], "\t", s[3], "\n");
563 0a61c07d 2004-04-19 devnull l = tail l;
567 0a61c07d 2004-04-19 devnull defn havesymbol(name)
569 0a61c07d 2004-04-19 devnull local l, s;
571 0a61c07d 2004-04-19 devnull l = symbols;
572 0a61c07d 2004-04-19 devnull while l do {
573 0a61c07d 2004-04-19 devnull s = head l;
574 0a61c07d 2004-04-19 devnull l = tail l;
575 0a61c07d 2004-04-19 devnull if s[0] == name then
576 0a61c07d 2004-04-19 devnull return 1;
578 0a61c07d 2004-04-19 devnull return 0;
581 0a61c07d 2004-04-19 devnull defn spsrch(len)
583 0a61c07d 2004-04-19 devnull local addr, a, s, e;
585 0a61c07d 2004-04-19 devnull addr = *SP;
586 0a61c07d 2004-04-19 devnull s = origin & 0x7fffffff;
587 0a61c07d 2004-04-19 devnull e = etext & 0x7fffffff;
588 0a61c07d 2004-04-19 devnull loop 1, len do {
589 0a61c07d 2004-04-19 devnull a = *addr++;
590 0a61c07d 2004-04-19 devnull c = a & 0x7fffffff;
591 0a61c07d 2004-04-19 devnull if c > s && c < e then {
592 0a61c07d 2004-04-19 devnull print("src(", a, ")\n");
598 0a61c07d 2004-04-19 devnull progargs="";
599 0a61c07d 2004-04-19 devnull print(acidfile);