read opcodes from specified space, not always from i-space
[unix-history] / usr / src / old / adb / adb.tahoe / pcs.c
CommitLineData
26de6110
SL
1#ifndef lint
2static char sccsid[] = "@(#)pcs.c 1.1 (Berkeley) %G%";
3#endif
4
5/*
6 *
7 * UNIX debugger
8 *
9 */
10
11#include "defs.h"
12
13
14MSG NOBKPT;
15MSG SZBKPT;
16MSG EXBKPT;
17MSG NOPCS;
18MSG BADMOD;
19
20/* breakpoints */
21BKPTR bkpthead;
22
23CHAR *lp;
24CHAR lastc;
25
26INT signo;
27L_INT dot;
28L_INT pid;
29L_INT cntval;
30L_INT loopcnt;
31
32L_INT entrypt;
33INT adrflg;
34
35
36
37/* sub process control */
38
39subpcs(modif)
40{
41 REG check;
42 REG execsig,runmode;
43 REG BKPTR bkptr;
44 REG STRING comptr;
45 execsig=0; loopcnt=cntval;
46
47 switch (modif) {
48
49 /* delete breakpoint */
50 case 'd': case 'D':
51 IF (bkptr=scanbkpt(dot))
52 THEN bkptr->flag=0; return;
53 ELSE error(NOBKPT);
54 FI
55
56 /* set breakpoint */
57 case 'b': case 'B':
58 IF (bkptr=scanbkpt(dot))
59 THEN bkptr->flag=0;
60 FI
61 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
62 DO IF bkptr->flag == 0
63 THEN break;
64 FI
65 OD
66 IF bkptr==0
67 THEN IF (bkptr=(BKPTR)sbrk(sizeof *bkptr)) == (BKPTR)-1
68 THEN error(SZBKPT);
69 ELSE bkptr->nxtbkpt=bkpthead;
70 bkpthead=bkptr;
71 FI
72 FI
73 bkptr->loc = dot;
74 bkptr->initcnt = bkptr->count = cntval;
75 bkptr->flag = BKPTSET;
76 check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
77 REP *comptr++ = readchar();
78 PER check-- ANDF lastc!=EOR DONE
79 *comptr=0; lp--;
80 IF check
81 THEN return;
82 ELSE error(EXBKPT);
83 FI
84
85 /* exit */
86 case 'k' :case 'K':
87 IF pid
88 THEN printf("%d: killed", pid); endpcs(); return;
89 FI
90 error(NOPCS);
91
92 /* run program */
93 case 'r': case 'R':
94 endpcs();
95 setup(); runmode=CONTIN;
96/*
97 IF adrflg
98 THEN IF !scanbkpt(dot) THEN loopcnt++; FI
99 ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI
100 FI
101*/
102 break;
103
104 /* single step */
105 case 's': case 'S':
106 IF pid
107 THEN
108 runmode=SINGLE; execsig=getsig(signo);
109 ELSE setup(); loopcnt--;
110 FI
111 break;
112
113 /* continue with optional signal */
114 case 'c': case 'C': case 0:
115 IF pid==0 THEN error(NOPCS); FI
116 runmode=CONTIN; execsig=getsig(signo);
117 break;
118
119 default: error(BADMOD);
120 }
121
122 IF loopcnt>0 ANDF runpcs(runmode,execsig)
123 THEN printf("breakpoint%16t");
124 ELSE printf("stopped at%16t");
125 FI
126 delbp();
127 printpc();
128}
129