/* Copyright (c) 1988 by Sozobon, Limited. Author: Johann Ruegg
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to redistribute it freely, with the
* following restrictions:
* 1) No charge may be made other than reasonable charges for reproduction.
* 2) Modified versions must be clearly marked as such.
* 3) The authors are not responsible for any harmful consequences
* of using this software, even if they result from defects in it.
*/
long
fpdiv(a,b)
long a,b;
{
long binv, adj;
long fpinv(), fpmul(), fpsub();
binv = fpinv(b);
adj = fpmul(b,binv);
adj = fpsub(2.0,adj);
return fpmul(fpmul(a,binv),adj);
}
fpinv(x)
register long x; /* d4 */
{
int exp, sign;
exp = x & 0x7f;
sign = x & 0x80;
exp = 0x81 - exp;
if (exp > 0x7f)
return 0xffffff7f|sign;
asm( "swap d4" );
asm( "move.l #$7fffffff,d0" );
asm( "divu d4,d0" );
asm( "move.l d0,d4" );
asm( "swap d4" );
asm( "clr.w d4" );
return x|sign|exp;
}