#include <osbind.h>

/*
 *
 * Floating point peripheral macros.
 *
 * FPset(reg,value): set an FP register with a FLOAT value.
 * FPdblset(reg,value): set a register with a DOUBLE value.
 * FPmove(dest,src): Move a value from src register to dest.
 * FPget(reg,variable): set FLOAT 'variable' to the contents of register 'reg'.
 * FPadd(r1,r2): Add r2 to r1 (result is left in r1).
 * FPsub(r1,r2): Subtract r2 from r1 (result is left in r1).
 * FPsglmul(r1,r2): Multiply r1 by r2 (result is left in r1). DOUBLE multiply.
 * FPmul(r1,r2): Multiply r1 by r2 (result is left in r1). SINGLE multiply.
 * FPblt(var): Set bit 0 of var if condition code "less than" is true.
 */

#define FPstat ((int *)(0xFFFFFa40L))
#define FPcmd ((int *)(0xFFFFFa4aL))
#define FPcondition ((int *)(0xFFFFFA4E))
#define FPop ((float *)(0xFFFFFa50L))
#define FPlop ((long *)(0xFFFFFA50L))

#define FPwait() { while (*FPstat != 0x802) ; }

#define FPset(r,v) { \
	FPwait(); \
	*FPcmd = (0x4400 | ((r)<<7)) ; \
	*FPstat + 1; \
	*FPop = (v) ; }

#define FPdblset(r,v) { \
	FPwait(); \
	*FPcmd = (0x5400 | ((r)<<7)) ; \
	*FPstat + 1; \
	*FPlop = *(long *)(&v); \
	*FPstat + 1; \
	*FPlop = *(((long *)(&v))+1); }

#define FPmove(d,s) { \
	FPwait(); \
	*FPcmd = (0x0000 | ((s)<<10) | ((d)<<7)); \
	*FPstat + 1; }
	
#define FPget(r,var) { \
	FPwait(); \
	*FPcmd = (0x6400 | ((r)<<7)) ; \
	while (*FPstat != 0xb104) ; \
	var = *FPop; }

#define FPadd(r,opnd) { \
	FPwait(); \
	*FPcmd = (0x0022 | ((opnd) << 10) | ((r) << 7)); \
	*FPstat + 1; }

#define FPsub(r,opnd) { \
	FPwait(); \
	*FPcmd = (0x0028 | ((opnd) << 10) | ((r) << 7)); \
	*FPstat + 1; }

#define FPsglmul(r, opnd) { \
	FPwait(); \
	*FPcmd = (0x0027 | ((opnd) << 10) | ((r) << 7)); \
	*FPstat + 1; }

#define FPmul(r,opnd) { \
	FPwait(); \
	*FPcmd = (0x0023 | ((opnd) << 10) | ((r) << 7)); \
	*FPstat + 1; }

#define FPblt(ret) { \
	FPwait(); \
	*FPcondition=(0x0014); \
	ret = *FPstat ; }

extern double x,y;
extern int maxcnt;

hwdoit()
{
    register int count=0;
    int stat;
    double temp;

    FPset(0,4.0);
    FPset(4,0.0);
    FPset(5,0.0);
    FPdblset(7,x);
    FPdblset(1,y);
    
    do {
	FPmove(2,4);
	FPmul(2,2);

	FPmove(3,5);
	FPmul(3,3);

	FPmove(6,2);
	FPsub(6,3);
	FPadd(6,7);

	FPmul(4,5);
	FPadd(4,4);
	FPadd(4,1);

	FPmove(5,4);

	FPmove(4,6);

	FPadd(2,3);
	FPsub(2,0);

	++count;

	FPblt(stat);

    } while ((count<maxcnt) && (1&stat));

    return count;
}


