static char sccsid
[] = "@(#)xeq.c 4.3 %G%";
/* service routines for sub process control */
* single step until loc with descriptor format d is modified
oldval
= getval(loc
, d
, DSP
);
} while (oldval
== getval(loc
, d
, DSP
));
return(getval(loc
, d
, DSP
));
/* single step count source stmts */
register int thisline
, curline
;
register struct proct
*thisproc
;
if (sdbttym
.sg_flags
!= userttym
.sg_flags
)
dot
= *(ADDR
*) (((ADDR
) &u
) + PC
);
thisproc
= adrtoprocp(dot
);
thisline
= adrtolineno(dot
);
if (count
== 0) count
= 1;
if (cmd
== 'S') { /* MACHINE DEPENDENT */
dot
= *(ADDR
*) (((ADDR
) &u
) + PC
);
if ((get(dot
,ISP
) & 0xff) == 0xfb){ /* calls */
*(ADDR
*) (((ADDR
) &u
) + USP
) + 16;
retaddr
= dot
= get(retaddr
, DSP
);
dot
= *(ADDR
*) (((ADDR
) &u
) + PC
);
if (retaddr
!= dot
&& signo
== 0) {
printf("Breakpoint at \n");
dot
= *(ADDR
*) (((ADDR
) &u
) + PC
);
curline
= adrtolineno(dot
);
((thisproc
== adrtoprocp(dot
) && thisline
== curline
) ||
if (sdbttym
.sg_flags
!= userttym
.sg_flags
)
* subargs[1] = number of arguments
* subargs[2:NUMARGS] = actual arguments
register int i
, numchars
, *subargp
;
ADDR straddr
, adr
, praddr
;
printf("Cannot find %s\n", proc
);
straddr
= extaddr("_dbargs");
error("Program not loaded with -lg");
for (i
=0; i
<NUMARGS
- 2; i
++) { /* process an argument */
*subargp
++ = straddr
+ sizeof subargs
+ numchars
;
substr
.c
[numchars
++] = ch
;
substr
.c
[numchars
-1] = '\0';
error("Unterminated string constant");
if (numchars
> sizeof substr
.c
) {
error("Too many string constants");
} else if ((ch
>= '0' && ch
<= '9') || ch
== '-') {
*subargp
++ = readint(&argsp
);
} else if ((ch
>= 'a' && ch
<= 'z') ||
(ch
>= 'A' && ch
<= 'Z') || ch
== '_') {
j
= varaddr(curproc()->pname
, var
);
*(ADDR
*)(((ADDR
) &u
) + R0
+ (WORDSIZE
)*j
) :
getval(j
, typetodesc(sl_type
, 0)[0], DSP
);
} while (varchar(*argsp
) || number(*argsp
));
printf("Unexpected character %c\n", ch
);
pcs
= *(ADDR
*)(((ADDR
)&u
)+PC
);
fps
= *(ADDR
*)(((ADDR
)&u
)+FP
);
aps
= *(ADDR
*)(((ADDR
)&u
)+AP
);
if (bkpts
= scanbkpt(userpc
)) {
if (flagss
= bkpts
->flag
) {
dot
= *(ADDR
*)(((ADDR
)&u
)+PC
) = extaddr("_dbsubc");
error("Internal error - cannot find _dbsubc");
if (pid
== 0 || signo
) subpcs('r');
subargs
[1] = (subargp
- subargs
) - 2;
for (j
=0; j
<=(subargp
-subargs
); j
++) {
put(adr
, DSP
, subargs
[j
]);
adr
= straddr
+ sizeof subargs
;
for (j
=0; j
<(numchars
+WORDSIZE
-1)/WORDSIZE
; j
++) {
put(adr
, DSP
, substr
.w
[j
]);
if (!signo
) printf("Breakpoint");
while (*argsp
== ' ' || *argsp
== ',')
error ("Too many arguments");
/* get arguments from core file, place them in args */
if ((procp
= initframe()) == badproc
) goto old1
;
if (eqstr("main", procp
->pname
))
} while ((procp
= nextframe()) != badproc
);
old1
: cpstr(args
, oldargs
);
printf("%s %s\n", symfil
, args
);
fnd
: ac
= get(argp
, DSP
);
if ((ac
== 0) || (ac
& 0xff)) goto old1
;
av
= (ADDR
) get(argp
+8, DSP
);
for (i
=0; i
<WORDSIZE
; i
++) {
if (word
.c
[i
] == '\0') goto l1
;
printf("%s %s\n", symfil
, args
);
if (c
!= 'r' && c
!= 'R' && sdbttym
.sg_flags
!= userttym
.sg_flags
)
if (sdbttym
.sg_flags
!= userttym
.sg_flags
)
*(ADDR
*)(((ADDR
)&u
)+PC
) == extaddr("_dbsubn")) {
dispf((ADDR
) 0, *argsp
? argsp
: "d", N_RSYM
, 0, 0, DSP
);
printf("Procedure returned normally\n");
userpc
= dot
= *(ADDR
*)(((ADDR
)&u
)+PC
) = pcs
;
*(ADDR
*)(((ADDR
)&u
)+FP
) = fps
;
*(ADDR
*)(((ADDR
)&u
)+AP
) = aps
;
/* execute commands from a breakpoint */
do { /* process a command */
} while (*cmds
++ != '\n');