139 lines
2.5 KiB
C
139 lines
2.5 KiB
C
union {
|
|
short I[2];
|
|
long int L;
|
|
char C[4];
|
|
} itolws;
|
|
char *errflg;
|
|
long int dot;
|
|
short dotinc;
|
|
long int expvf;
|
|
|
|
char *
|
|
f(fcount,ifp,itype,ptype)
|
|
short fcount;
|
|
char *ifp;
|
|
{
|
|
unsigned w;
|
|
long int savdot, wx;
|
|
char *fp;
|
|
char c, modifier, longpr;
|
|
union {
|
|
double dval;
|
|
struct {
|
|
int i1;
|
|
int i2;
|
|
} ival;
|
|
} dw;
|
|
union {
|
|
float fval;
|
|
int ival;
|
|
} fw;
|
|
int gotdot = 0;
|
|
while (fcount > 0) {
|
|
fp = ifp;
|
|
c = *fp;
|
|
longpr = ((c >= 'A') & (c <= 'Z') | (c == 'f') | (c == '4') | (c == 'p') | (c == 'i'));
|
|
if ((itype == 0) || (*fp == 'a')) {
|
|
wx = dot;
|
|
w = dot;
|
|
} else {
|
|
gotdot = 1;
|
|
wx = get((int)dot, itype);
|
|
if (!longpr) {
|
|
w = (itolws.L=(wx), itolws.I[((dot)&3)>>1]);
|
|
}
|
|
}
|
|
if (c == 'F') {
|
|
dw.ival.i1 = wx;
|
|
if (itype == 0) {
|
|
dw.ival.i2 = expvf;
|
|
}
|
|
}
|
|
|
|
modifier = *fp++;
|
|
switch(modifier) {
|
|
case ' ' :
|
|
case '\t' :
|
|
break;
|
|
case 't':
|
|
case 'T':
|
|
printf("%T",fcount);
|
|
return(fp);
|
|
case 'r':
|
|
case 'R':
|
|
printf("%M",fcount);
|
|
return(fp);
|
|
case 'k':
|
|
printf("%k",w);
|
|
break;
|
|
case 'K':
|
|
printf("%K",wx);
|
|
break;
|
|
case 'a':
|
|
psymoff(dot,ptype,":%16t");
|
|
dotinc = 0;
|
|
break;
|
|
case 'p':
|
|
psymoff(0,ptype,"%16t");
|
|
break;
|
|
case 'u':
|
|
printf("%-8u",w);
|
|
break;
|
|
case 'U':
|
|
printf("%-16U",wx); break;
|
|
case 'c':
|
|
case 'C':
|
|
if (modifier == 'C') {
|
|
printesc((int)(itolws.L=(wx), itolws.C[(dot)&3]));
|
|
} else {
|
|
printc((char)(itolws.L=(wx), itolws.C[(dot)&3]));
|
|
}
|
|
dotinc = 1;
|
|
break;
|
|
case 'b':
|
|
printf("%-8x", (itolws.L=(wx), itolws.C[(dot)&3]));
|
|
dotinc = 1;
|
|
break;
|
|
case 'B':
|
|
printf("%-8o", (itolws.L=(wx), itolws.C[(dot)&3]));
|
|
dotinc = 1;
|
|
break;
|
|
case 's':
|
|
case 'S':
|
|
savdot = dot;
|
|
dotinc = 1;
|
|
while ((c = (itolws.L=(wx), itolws.C[(dot)&3])) && (errflg == 0)) {
|
|
dot = inkdot(1);
|
|
if (modifier == 'S') {
|
|
printesc(c);
|
|
} else {
|
|
printc(c);
|
|
}
|
|
endline();
|
|
if (!(dot & 3))
|
|
wx = get((int)dot, itype);
|
|
}
|
|
dotinc = dot - savdot + 1;
|
|
dot = savdot;
|
|
break;
|
|
case 'i':
|
|
if (gotdot) {
|
|
wx = get((int)(dot & ~3), itype);
|
|
}
|
|
iDasm((int)(wx), (unsigned int)0, (unsigned int)(dot&~3));
|
|
printc('\n');
|
|
break;
|
|
case 'f':
|
|
fw.ival = wx;
|
|
printf("%-16.9f", fw.fval);
|
|
dotinc = 4;
|
|
break;
|
|
case 'F':
|
|
printf("%-32.18F", dw.dval);
|
|
dotinc = 8;
|
|
break;
|
|
}
|
|
}
|
|
return(fp);
|
|
}
|