1
0
Fork 0

FLDENV FSTENV FSTOR FSAVE added.status word can now be examined. closes #998201

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1752
This commit is contained in:
Peter Veenstra 2004-04-01 08:57:33 +00:00
parent 229e81304b
commit c7ab4990a0
2 changed files with 90 additions and 12 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: fpu.cpp,v 1.18 2004-03-29 18:03:02 qbix79 Exp $ */
/* $Id: fpu.cpp,v 1.19 2004-04-01 08:57:33 qbix79 Exp $ */
#include "dosbox.h"
#if C_FPU
@ -61,6 +61,20 @@ INLINE void FPU_SetCW(Bitu word) {
fpu.ex_mask = word & 0x3f;
}
static Bit16u FPU_GetTag(void){
Bit16u tag=0;
for(Bitu i=0;i<8;i++)
tag |= ( (fpu.tags[i]&3) <<(2*i));
return tag;
}
static void FPU_SetTag(Bit16u tag)
{
for(Bitu i=0;i<8;i++)
fpu.tags[i]= static_cast<FPU_Tag>((tag >>(2*i))&3);
}
INLINE Bitu FPU_GET_TOP(void){
@ -234,12 +248,18 @@ void FPU_ESC1_EA(Bitu rm,PhysPt addr) {
}
FPU_FPOP();
break;
case 0x05: /*FLDCW */
case 0x04: /* FLDENV */
FPU_FLDENV(addr);
break;
case 0x05: /* FLDCW */
{
Bit16u temp =mem_readw(addr);
FPU_SetCW(temp);
}
break;
case 0x06: /* FSTENV */
FPU_FSTENV(addr);
break;
case 0x07: /* FNSTCW*/
mem_writew(addr,fpu.cw);
break;
@ -432,10 +452,13 @@ void FPU_ESC3_EA(Bitu rm,PhysPt addr) {
FPU_FPOP();
break;
case 0x05: /* FLD 80 Bits Real */
FPU_FLD80(addr);
{
Real64 val = FPU_FLD80(addr);
FPU_PUSH(val);
}
break;
case 0x07: /* FSTP 80 Bits Real */
FPU_ST80(addr);
FPU_ST80(addr,TOP);
FPU_FPOP();
break;
default:
@ -461,7 +484,7 @@ void FPU_ESC3_Normal(Bitu rm) {
break;
case 0x04: //FNSETPM
case 0x05: //FRSTPM
LOG(LOG_FPU,LOG_ERROR)("80267 protected mode (un)set. Nothing done");
// LOG(LOG_FPU,LOG_ERROR)("80267 protected mode (un)set. Nothing done");
FPU_FNOP();
break;
default:
@ -543,6 +566,12 @@ void FPU_ESC5_EA(Bitu rm,PhysPt addr) {
mem_writed(addr+4,fpu.regs[TOP].l.upper);
FPU_FPOP();
break;
case 0x04: /* FSTOR */
FPU_FSTOR(addr);
break;
case 0x06: /* FSAVE */
FPU_FSAVE(addr);
break;
case 0x07: /*FNSTSW NG DISAGREES ON THIS*/
FPU_SET_TOP(TOP);
mem_writew(addr,fpu.sw);