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: }