*/
#include "defs.h"
+SCCSID(@(#)print.c 2.9);
+#include "a.out.h"
+struct user u;
MSG LONGFIL;
MAP datmap;
SYMTAB symbol;
-INT lastframe;
-INT callpc;
+ADDR lastframe;
+ADDR callpc;
INT infile;
INT outfile;
CHAR *lp;
-INT maxoff;
-INT maxpos;
-INT octal;
+L_INT maxoff;
+L_INT maxpos;
+INT radix;
/* symbol management */
L_INT localval;
/* breakpoints */
BKPTR bkpthead;
-REGLIST reglist [] {
- "ps", ps,
- "pc", pc,
- "sp", sp,
- "r5", r5,
- "r4", r4,
- "r3", r3,
- "r2", r2,
- "r1", r1,
- "r0", r0,
+REGLIST reglist [] = {
+ "p1lr", P1LR,
+ "p1br",P1BR,
+ "p0lr", P0LR,
+ "p0br",P0BR,
+ "ksp",KSP,
+ "esp",ESP,
+ "ssp",SSP,
+ "psl", PSL,
+ "pc", PC,
+ "usp",USP,
+ "fp", FP,
+ "ap", AP,
+ "r11", R11,
+ "r10", R10,
+ "r9", R9,
+ "r8", R8,
+ "r7", R7,
+ "r6", R6,
+ "r5", R5,
+ "r4", R4,
+ "r3", R3,
+ "r2", R2,
+ "r1", R1,
+ "r0", R0,
};
-INT frnames[] { 0, 3, 4, 5, 1, 2 };
-
char lastc;
-POS corhdr[];
-POS *endhdr;
INT fcor;
STRING errflg;
L_INT cntval;
INT cntflg;
-STRING signals[] {
+STRING signals[] = {
"",
"hangup",
"interrupt",
"alarm call",
"terminated",
};
+#define MAXSIG 15
POS dynam;
REG BKPTR bkptr;
CHAR hi, lo;
- INT word;
+ ADDR word;
STRING comptr;
- L_INT argp, frame, link;
+ ADDR argp, frame, link;
SYMPTR symp;
IF cntflg==0 THEN cntval = -1; FI
ELSE outfile=open(file,1);
IF outfile<0
THEN outfile=creat(file,0644);
+#ifndef EDDT
ELSE lseek(outfile,0L,2);
+#endif
FI
FI
}
break;
- case 'o':
- octal = TRUE; break;
-
case 'd':
- octal = FALSE; break;
+ if (adrflg) {
+ if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;}
+ printf("radix=%d base ten",radix=adrval);
+ }
+ break;
case 'q': case 'Q': case '%':
done();
printregs();
return;
- case 'f': case 'F':
- printfregs(modif=='F');
- return;
-
case 'c': case 'C':
- frame=(adrflg?adrval:endhdr[r5])&EVEN; lastframe=0;
- callpc=(adrflg?get(frame+2,DSP):endhdr[pc]);
+ IF adrflg
+ THEN frame=adrval;
+ word=get(adrval+6,DSP)&0xFFFF;
+ IF word&0x2000
+ THEN /* 'calls', can figure out argp */
+ argp=adrval+20+((word>>14)&3); word &= 0xFFF;
+ WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD
+ ELSE /* 'callg', can't tell where argp is */ argp=frame;
+ FI
+ callpc=get(frame+16,DSP);
+ ELSE argp= *(ADDR *)(((ADDR)&u)+AP);
+ frame= *(ADDR *)(((ADDR)&u)+FP);
+ callpc= *(ADDR *)(((ADDR)&u)+PC);
+ FI
+ lastframe=0;
WHILE cntval--
DO chkerr();
- narg = findroutine(frame);
- printf("%.8s(", symbol.symc);
- argp = frame+4;
- IF --narg >= 0
- THEN printf("%o", get(argp, DSP));
- FI
- WHILE --narg >= 0
- DO argp += 2;
- printf(",%o", get(argp, DSP));
- OD
+ printf("%.8s(", findsym(callpc,ISYM)==-1 ? "?":symbol.symc);
+ narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI
+ LOOP IF narg==0 THEN break; FI
+ printf("%R", get(argp += 4, DSP));
+ IF --narg!=0 THEN printc(','); FI
+ POOL
prints(")\n");
IF modif=='C'
- THEN WHILE localsym(frame)
+ THEN WHILE localsym(frame,argp)
DO word=get(localval,DSP);
printf("%8t%.8s:%10t", symbol.symc);
- IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%o\n",word); FI
+ IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI
OD
FI
+ callpc=get(frame+16, DSP);
+ argp=get(frame+8, DSP);
lastframe=frame;
- frame=get(frame, DSP)&EVEN;
- IF frame==0 THEN break; FI
+ frame=get(frame+12, DSP)&EVEN;
+ IF frame==0 ORF (!adrflg ANDF (frame&0xF0000000)!=0x70000000)
+ THEN break;
+ FI
OD
break;
+#ifndef EDDT
/*print externals*/
case 'e': case 'E':
symset();
- WHILE (symp=symget())
+ WHILE symp=symget()
DO chkerr();
- IF (symp->symf)==043 ORF (symp->symf)==044
- THEN printf("%.8s:%12t%o\n", symp->symc, get(leng(symp->symv),DSP));
+ IF symp->symf==(N_DATA|N_EXT) ORF symp->symf==(N_BSS|N_EXT)
+ THEN printf("%.8s:%12t%R\n", symp->symc, get(symp->symv,DSP));
FI
OD
break;
case 'a': case 'A':
- frame=(adrflg ? adrval : endhdr[r4]);
+ frame=(adrflg ? adrval : *(ADDR *)(((ADDR)&u)+FP));
WHILE cntval--
DO chkerr();
errflg=0;
flushbuf();
break;
+#endif
/*set default c frame*/
/*print breakpoints*/
int file;
file=amap->ufd;
printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
- printf("b1 = %-16Q",amap->b1);
- printf("e1 = %-16Q",amap->e1);
- printf("f1 = %-16Q",amap->f1);
- printf("\nb2 = %-16Q",amap->b2);
- printf("e2 = %-16Q",amap->e2);
- printf("f2 = %-16Q",amap->f2);
+ printf("b1 = %-16R",amap->b1);
+ printf("e1 = %-16R",amap->e1);
+ printf("f1 = %-16R",amap->f1);
+ printf("\nb2 = %-16R",amap->b2);
+ printf("e2 = %-16R",amap->e2);
+ printf("f2 = %-16R",amap->f2);
printc(EOR);
}
-printfregs(longpr)
-{
- REG i;
- L_REAL f;
-
- printf("fpsr %o\n", corhdr[0].fpsr);
- FOR i=0; i<FRMAX; i++
- DO IF corhdr[0].fpsr&FD ORF longpr /* long mode */
- THEN f = corhdr[0].Lfr[frnames[i]];
- ELSE f = corhdr[0].Sfr[frnames[i]];
- FI
- printf("fr%-8d%-32.18f\n", i, f);
- OD
-}
-
printregs()
{
REG REGPTR p;
- INT v;
+ L_INT v;
- FOR p=reglist; p < ®list[9]; p++
- DO printf("%s%8t%o%8t", p->rname, v=endhdr[p->roffs]);
- valpr(v,(p->roffs==pc?ISYM:DSYM));
+ FOR p=reglist; p < ®list[24]; p++
+ DO printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs));
+ valpr(v,(p->roffs==PC?ISYM:DSYM));
printc(EOR);
OD
printpc();
{
REG REGPTR p;
REG STRING regptr;
+ CHAR *olp;
CHAR regnxt;
- regnxt=readchar();
- FOR p=reglist; p<®list[9]; p++
+
+ olp=lp;
+ FOR p=reglist; p < ®list[24]; p++
DO regptr=p->rname;
- IF (regnam == *regptr++) ANDF (regnxt == *regptr)
- THEN return(p->roffs);
+ IF (regnam == *regptr++)
+ THEN
+ WHILE *regptr
+ DO IF (regnxt=readchar()) != *regptr++
+ THEN --regptr; break;
+ FI
+ OD
+ IF *regptr
+ THEN lp=olp;
+ ELSE return(p->roffs);
+ FI
FI
OD
- lp--;
+ lp=olp;
return(0);
}
printpc()
{
- dot=endhdr[pc];
+ dot= *(ADDR *)(((ADDR)&u)+PC);
psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP));
printc(EOR);
}
sigprint()
{
- prints(signals[signo]);
+ IF (signo>=0) ANDF (signo<=MAXSIG) THEN prints(signals[signo]); FI
}