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);
}
