#include /* * * 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