FPU opcode 0xd9 0xd8-0xdf are aliases for FSTP1. Doom v1.0 now works when FPU enabled.

Fixed TAG manipulation on several instructions.
This commit is contained in:
TomW 2013-12-14 11:31:37 +00:00
commit 7671f1e90d

View file

@ -392,6 +392,7 @@ void x87_d9()
double td; double td;
int64_t temp64; int64_t temp64;
uint16_t tempw; uint16_t tempw;
int temp;
if (mod==3) if (mod==3)
{ {
switch (rmdat32&0xFF) switch (rmdat32&0xFF)
@ -416,6 +417,12 @@ void x87_d9()
return; return;
case 0xD8: case 0xD9: case 0xDA: case 0xDB: /*Invalid, but apparently not illegal*/ case 0xD8: case 0xD9: case 0xDA: case 0xDB: /*Invalid, but apparently not illegal*/
case 0xDC: case 0xDD: case 0xDE: case 0xDF: case 0xDC: case 0xDD: case 0xDE: case 0xDF:
if (fplog) pclog("FSTP\n");
ST(rmdat32 & 7) = ST(0);
temp = (tag >> ((TOP & 7) << 1)) & 3;
tag &= ~(3 << (((TOP + rmdat32) & 7) << 1));
tag |= (temp << (((TOP + rmdat32) & 7) << 1));
x87_pop();
cycles-=3; cycles-=3;
return; return;
case 0xE0: /*FCHS*/ case 0xE0: /*FCHS*/
@ -548,10 +555,11 @@ void x87_d9()
cycles-=330; cycles-=330;
return; return;
case 0xFC: /*FRNDINT*/ case 0xFC: /*FRNDINT*/
if (fplog) pclog("FRNDINT\n"); if (fplog) pclog("FRNDINT %g ", ST(0));
// pclog("FRNDINT %f %i ",ST(0),(npxc>>10)&3); // pclog("FRNDINT %f %i ",ST(0),(npxc>>10)&3);
ST(0)=(double)x87_fround(ST(0)); ST(0)=(double)x87_fround(ST(0));
// pclog("%f\n",ST(0)); // pclog("%f\n",ST(0));
if (fplog) pclog("%g\n", ST(0));
cycles-=21; cycles-=21;
return; return;
case 0xFD: /*FSCALE*/ case 0xFD: /*FSCALE*/
@ -807,10 +815,11 @@ void x87_db()
cycles-=28; cycles-=28;
return; return;
case 3: /*FISTP short*/ case 3: /*FISTP short*/
if (fplog) pclog("FISTPs %08X:%08X\n", easeg, eaaddr); if (fplog) pclog("FISTPs %08X:%08X %g ", easeg, eaaddr, ST(0));
temp64 = x87_fround(ST(0)); temp64 = x87_fround(ST(0));
/* if (temp64 > 2147483647 || temp64 < -2147483647) /* if (temp64 > 2147483647 || temp64 < -2147483647)
fatal("FISTPl out of range! %i\n", temp64);*/ fatal("FISTPl out of range! %i\n", temp64);*/
if (fplog) pclog("%lli %llX\n", temp64, temp64);
seteal((int32_t)temp64); if (abrt) return; seteal((int32_t)temp64); if (abrt) return;
x87_pop(); x87_pop();
cycles-=28; cycles-=28;
@ -953,23 +962,23 @@ void x87_dd()
{ {
case 0: /*FFREE*/ case 0: /*FFREE*/
if (fplog) pclog("FFREE\n"); if (fplog) pclog("FFREE\n");
tag|=(3<<((rmdat32&7)<<1)); tag |= (3 << (((TOP + rmdat32) & 7) << 1));
cycles-=3; cycles-=3;
return; return;
case 2: /*FST*/ case 2: /*FST*/
if (fplog) pclog("FST\n"); if (fplog) pclog("FST\n");
ST(rmdat32&7)=ST(0); ST(rmdat32 & 7) = ST(0);
temp=(tag>>((TOP&7)<<1))&3; temp = (tag >> ((TOP & 7) << 1)) & 3;
tag&=~(3<<((rmdat32&7)<<1)); tag &= ~(3 << (((TOP + rmdat32) & 7) << 1));
tag|=(temp<<((rmdat32&7)<<1)); tag |= (temp << (((TOP + rmdat32) & 7) << 1));
cycles-=3; cycles-=3;
return; return;
case 3: /*FSTP*/ case 3: /*FSTP*/
if (fplog) pclog("FSTP\n"); if (fplog) pclog("FSTP\n");
ST(rmdat32&7)=ST(0); ST(rmdat32 & 7) = ST(0);
temp=(tag>>((TOP&7)<<1))&3; temp = (tag >> ((TOP & 7) << 1)) & 3;
tag&=~(3<<((rmdat32&7)<<1)); tag &= ~(3 << (((TOP + rmdat32) & 7) << 1));
tag|=(temp<<((rmdat32&7)<<1)); tag |= (temp << (((TOP + rmdat32) & 7) << 1));
x87_pop(); x87_pop();
cycles-=3; cycles-=3;
return; return;