t_stat fp_unpack (uint32 ad, FPA *fp) { uint8 d0, d1, esign; esign = M[ad] & FLAG; /* get exp sign */ d0 = M[ad] & DIGIT; /* get exp lo digit */ MM (ad); if ((M[ad] & FLAG) == 0) /* no flag on hi exp? */ return STOP_FPMF; d1 = M[ad] & DIGIT; /* get exp hi digit */ MM (ad); fp->addr = ad; /* save mant addr */ if (BAD_DIGIT (d1) || BAD_DIGIT (d0)) /* exp bad dig? */ return STOP_INVDIG; fp->exp = ((d1 * 10) + d0) * (esign? -1: 1); /* convert exponent */ fp->sign = (M[ad] & FLAG)? 1: 0; /* get mantissa sign */ return fp_scan_mant (fp->addr, &(fp->lnt), &(fp->zero)); }
int32 dp_cvt_ad (uint8 *ap) { int32 i, r; uint8 c; for (i = r = 0; i < DP_ADDR; i++, ap++) { /* loop thru addr */ c = *ap & DIGIT; /* get digit */ if (BAD_DIGIT (c)) /* bad digit? */ return -1; r = (r * 10) + c; /* bcd to binary */ } return r; }
int32 dp_cvt_bcd (uint32 ad, int32 len) { uint8 c; int32 r; for (r = 0; len > 0; len--) { /* loop thru char */ c = M[ad] & DIGIT; /* get digit */ if (BAD_DIGIT (c)) /* invalid? */ return -1; r = (r * 10) + c; /* cvt to bin */ PP (ad); /* next digit */ } return r; }