IBM PS/2 Model 30-286 now uses XTIDE version 1.1.5;

The 287 FPU is now correctly detected as such;
Added two instructions that were incorrectly missing from the 286, fixes Standard Mode Windows.
This commit is contained in:
OBattler
2017-03-02 04:49:53 +01:00
parent 13683628a5
commit 64c941320f
4 changed files with 59 additions and 9 deletions

View File

@@ -611,6 +611,10 @@ int loadbios()
fread(rom, 0x20000, 1, f);
fclose(f);
biosmask = 0x1ffff;
if (enable_xtide)
{
mem_load_atide115_bios();
}
return 1;
case ROM_DESKPRO_386:
@@ -729,7 +733,7 @@ int loadbios()
biosmask = 0x1ffff;
if (enable_xtide)
{
mem_load_atide_bios();
mem_load_atide115_bios();
}
return 1;

View File

@@ -3,6 +3,7 @@
*/
static int opESCAPE_d8_a16(uint32_t fetchdat)
{
pclog("D8 %02X\n", fetchdat & 0xff);
return x86_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int opESCAPE_d8_a32(uint32_t fetchdat)
@@ -12,6 +13,7 @@ static int opESCAPE_d8_a32(uint32_t fetchdat)
static int opESCAPE_d9_a16(uint32_t fetchdat)
{
pclog("D9 %02X\n", fetchdat & 0xff);
return x86_opcodes_d9_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_d9_a32(uint32_t fetchdat)
@@ -21,6 +23,7 @@ static int opESCAPE_d9_a32(uint32_t fetchdat)
static int opESCAPE_da_a16(uint32_t fetchdat)
{
pclog("DA %02X\n", fetchdat & 0xff);
return x86_opcodes_da_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_da_a32(uint32_t fetchdat)
@@ -30,6 +33,7 @@ static int opESCAPE_da_a32(uint32_t fetchdat)
static int opESCAPE_db_a16(uint32_t fetchdat)
{
pclog("DB %02X\n", fetchdat & 0xff);
return x86_opcodes_db_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_db_a32(uint32_t fetchdat)
@@ -39,6 +43,7 @@ static int opESCAPE_db_a32(uint32_t fetchdat)
static int opESCAPE_dc_a16(uint32_t fetchdat)
{
pclog("DC %02X\n", fetchdat & 0xff);
return x86_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int opESCAPE_dc_a32(uint32_t fetchdat)
@@ -48,6 +53,7 @@ static int opESCAPE_dc_a32(uint32_t fetchdat)
static int opESCAPE_dd_a16(uint32_t fetchdat)
{
pclog("DD %02X\n", fetchdat & 0xff);
return x86_opcodes_dd_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_dd_a32(uint32_t fetchdat)
@@ -57,6 +63,7 @@ static int opESCAPE_dd_a32(uint32_t fetchdat)
static int opESCAPE_de_a16(uint32_t fetchdat)
{
pclog("DE %02X\n", fetchdat & 0xff);
return x86_opcodes_de_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_de_a32(uint32_t fetchdat)
@@ -66,6 +73,7 @@ static int opESCAPE_de_a32(uint32_t fetchdat)
static int opESCAPE_df_a16(uint32_t fetchdat)
{
pclog("DF %02X\n", fetchdat & 0xff);
return x86_opcodes_df_a16[fetchdat & 0xff](fetchdat);
}
static int opESCAPE_df_a32(uint32_t fetchdat)

View File

@@ -209,6 +209,28 @@ static inline uint16_t x87_compare(double a, double b)
{
#if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined WIN32 || defined _WIN32 || defined _WIN32
uint32_t out;
if (!is386)
{
if (((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY)))
{
// pclog("Comparing infinity\n");
asm volatile ("" : : : "memory");
asm(
"fldl %2\n"
"fldl %1\n"
"fclex\n"
"fcompp\n"
"fnstsw %0\n"
: "=m" (out)
: "m" (a), "m" (a)
);
return out & (C0|C2|C3);
}
}
/* Memory barrier, to force GCC to write to the input parameters
* before the compare rather than after */
@@ -229,11 +251,27 @@ static inline uint16_t x87_compare(double a, double b)
/* Generic C version is known to give incorrect results in some
* situations, eg comparison of infinity (Unreal) */
uint32_t out = 0;
if (a == b)
out |= C3;
else if (a < b)
out |= C0;
if (is386)
{
if ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))
{
out |= C3;
return out;
}
if (a == b)
out |= C3;
else if (a < b)
out |= C0;
}
else
{
if (a == b)
out |= C3;
else if (a < b)
out |= C0;
}
return out;
#endif
@@ -755,7 +793,7 @@ OpFn OP_TABLE(fpu_287_db_a16)[256] =
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
opFNOP, opFNOP, opFCLEX, opFINIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
@@ -793,7 +831,7 @@ OpFn OP_TABLE(fpu_287_db_a32)[256] =
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
opFNOP, opFNOP, opFCLEX, opFINIT, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
opFNOP, opFNOP, opFCLEX, opFINIT, opFNOP, opFNOP, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,

View File

@@ -169,7 +169,7 @@ static int opFCOMPP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FCOMPP\n");
cpu_state.npxs &= ~(C0|C2|C3);
if (*(uint64_t *)&ST(0) == ((uint64_t)1 << 63) && *(uint64_t *)&ST(1) == 0)
if ((*(uint64_t *)&ST(0) == ((uint64_t)1 << 63) && *(uint64_t *)&ST(1) == 0) && is386)
cpu_state.npxs |= C0; /*Nasty hack to fix 80387 detection*/
else
cpu_state.npxs |= x87_compare(ST(0), ST(1));