xref: /original-bsd/old/adb/adb.vax/pcs.c (revision 0b87e0ab)
1*0b87e0abSsam #ifndef lint
2*0b87e0abSsam static	char sccsid[] = "@(#)pcs.c	4.2 08/11/83";
3*0b87e0abSsam #endif
42580ab78Sroot /*
52580ab78Sroot  *
62580ab78Sroot  *	UNIX debugger
72580ab78Sroot  *
82580ab78Sroot  */
92580ab78Sroot 
102580ab78Sroot #include "defs.h"
112580ab78Sroot 
122580ab78Sroot 
132580ab78Sroot MSG		NOBKPT;
142580ab78Sroot MSG		SZBKPT;
152580ab78Sroot MSG		EXBKPT;
162580ab78Sroot MSG		NOPCS;
172580ab78Sroot MSG		BADMOD;
182580ab78Sroot 
192580ab78Sroot /* breakpoints */
202580ab78Sroot BKPTR		bkpthead;
212580ab78Sroot 
222580ab78Sroot CHAR		*lp;
232580ab78Sroot CHAR		lastc;
242580ab78Sroot 
252580ab78Sroot INT		signo;
262580ab78Sroot L_INT		dot;
272580ab78Sroot INT		pid;
282580ab78Sroot L_INT		cntval;
292580ab78Sroot L_INT		loopcnt;
302580ab78Sroot 
312580ab78Sroot L_INT		entrypt;
322580ab78Sroot INT		adrflg;
332580ab78Sroot 
342580ab78Sroot 
352580ab78Sroot 
362580ab78Sroot /* sub process control */
372580ab78Sroot 
subpcs(modif)382580ab78Sroot subpcs(modif)
392580ab78Sroot {
402580ab78Sroot 	REG INT		check;
412580ab78Sroot 	INT		execsig,runmode;
422580ab78Sroot 	REG BKPTR	bkptr;
432580ab78Sroot 	STRING		comptr;
442580ab78Sroot 	execsig=0; loopcnt=cntval;
452580ab78Sroot 
462580ab78Sroot 	switch (modif) {
472580ab78Sroot 
482580ab78Sroot 	    /* delete breakpoint */
492580ab78Sroot 	    case 'd': case 'D':
502580ab78Sroot 		IF (bkptr=scanbkpt(dot))
512580ab78Sroot 		THEN bkptr->flag=0; return;
522580ab78Sroot 		ELSE error(NOBKPT);
532580ab78Sroot 		FI
542580ab78Sroot 
552580ab78Sroot 	    /* set breakpoint */
562580ab78Sroot 	    case 'b': case 'B':
572580ab78Sroot 		IF (bkptr=scanbkpt(dot))
582580ab78Sroot 		THEN bkptr->flag=0;
592580ab78Sroot 		FI
602580ab78Sroot 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
612580ab78Sroot 		DO IF bkptr->flag == 0
622580ab78Sroot 		   THEN break;
632580ab78Sroot 		   FI
642580ab78Sroot 		OD
652580ab78Sroot 		IF bkptr==0
662580ab78Sroot 		THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1
672580ab78Sroot 		     THEN error(SZBKPT);
682580ab78Sroot 		     ELSE bkptr->nxtbkpt=bkpthead;
692580ab78Sroot 			  bkpthead=bkptr;
702580ab78Sroot 		     FI
712580ab78Sroot 		FI
722580ab78Sroot 		bkptr->loc = dot;
732580ab78Sroot 		bkptr->initcnt = bkptr->count = cntval;
742580ab78Sroot 		bkptr->flag = BKPTSET;
752580ab78Sroot 		check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
762580ab78Sroot 		REP *comptr++ = readchar();
772580ab78Sroot 		PER check-- ANDF lastc!=EOR DONE
782580ab78Sroot 		*comptr=0; lp--;
792580ab78Sroot 		IF check
802580ab78Sroot 		THEN return;
812580ab78Sroot 		ELSE error(EXBKPT);
822580ab78Sroot 		FI
832580ab78Sroot 
842580ab78Sroot 	    /* exit */
852580ab78Sroot 	    case 'k' :case 'K':
862580ab78Sroot 		IF pid
872580ab78Sroot 		THEN printf("%d: killed", pid); endpcs(); return;
882580ab78Sroot 		FI
892580ab78Sroot 		error(NOPCS);
902580ab78Sroot 
912580ab78Sroot 	    /* run program */
922580ab78Sroot 	    case 'r': case 'R':
932580ab78Sroot 		endpcs();
942580ab78Sroot 		setup(); runmode=CONTIN;
952580ab78Sroot 		IF adrflg
962580ab78Sroot 		THEN IF !scanbkpt(dot) THEN loopcnt++; FI
972580ab78Sroot 		ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI
982580ab78Sroot 		FI
992580ab78Sroot 		break;
1002580ab78Sroot 
1012580ab78Sroot 	    /* single step */
1022580ab78Sroot 	    case 's': case 'S':
1032580ab78Sroot 		IF pid
1042580ab78Sroot 		THEN
1052580ab78Sroot 			runmode=SINGLE; execsig=getsig(signo);
1062580ab78Sroot 		ELSE setup(); loopcnt--;
1072580ab78Sroot 		FI
1082580ab78Sroot 		break;
1092580ab78Sroot 
1102580ab78Sroot 	    /* continue with optional signal */
1112580ab78Sroot 	    case 'c': case 'C': case 0:
1122580ab78Sroot 		IF pid==0 THEN error(NOPCS); FI
1132580ab78Sroot 		runmode=CONTIN; execsig=getsig(signo);
1142580ab78Sroot 		break;
1152580ab78Sroot 
1162580ab78Sroot 	    default: error(BADMOD);
1172580ab78Sroot 	}
1182580ab78Sroot 
1192580ab78Sroot 	IF loopcnt>0 ANDF runpcs(runmode,execsig)
1202580ab78Sroot 	THEN printf("breakpoint%16t");
1212580ab78Sroot 	ELSE printf("stopped at%16t");
1222580ab78Sroot 	FI
1232580ab78Sroot 	delbp();
1242580ab78Sroot 	printpc();
1252580ab78Sroot }
1262580ab78Sroot 
127