Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | ||
11 | MSG NOCFN; | |
12 | ||
13 | INT callpc; | |
14 | BOOL localok; | |
15 | SYMTAB symbol; | |
16 | ||
17 | STRING errflg; | |
18 | ||
19 | ||
20 | findroutine(cframe) | |
21 | L_INT cframe; | |
22 | { | |
23 | REG INT narg, inst; | |
24 | INT lastpc, back2; | |
25 | BOOL v; | |
26 | ||
27 | v=FALSE; localok=FALSE; lastpc=callpc; | |
28 | callpc=get(cframe+2, DSP); back2=get(leng(callpc-2), ISP); | |
29 | IF (inst=get(leng(callpc-4), ISP)) == 04737 /* jsr pc,*$... */ | |
30 | THEN narg = 1; | |
31 | ELIF (inst&~077)==04700 /* jsr pc,... */ | |
32 | THEN narg=0; v=(inst!=04767); | |
33 | ELIF (back2&~077)==04700 | |
34 | THEN narg=0; v=TRUE; | |
35 | ELSE errflg=NOCFN; | |
36 | return(0); | |
37 | FI | |
38 | IF findsym( (v ? lastpc : ((inst==04767?callpc:0) + back2) ),ISYM) == -1 | |
39 | ANDF !v | |
40 | THEN symbol.symc[0] = '?'; | |
41 | symbol.symc[1] = 0; | |
42 | symbol.symv = 0; | |
43 | ELSE localok=TRUE; | |
44 | FI | |
45 | inst = get(leng(callpc), ISP); | |
46 | IF inst == 05726 /* tst (sp)+ */ | |
47 | THEN return(narg+1); | |
48 | FI | |
49 | IF inst == 022626 /* cmp (sp)+,(sp)+ */ | |
50 | THEN return(narg+2); | |
51 | FI | |
52 | IF inst == 062706 /* add $n,sp */ | |
53 | THEN return(narg+get(leng(callpc+2), ISP)/2); | |
54 | FI | |
55 | return(narg); | |
56 | } | |
57 |