From 64c941320f4a4b6d79a2729edd2a1c7dddd6b401 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 2 Mar 2017 04:49:53 +0100 Subject: [PATCH] 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. --- src/mem.c | 6 +++++- src/x86_ops_fpu.h | 8 +++++++ src/x87_ops.h | 52 +++++++++++++++++++++++++++++++++++++++------ src/x87_ops_arith.h | 2 +- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/mem.c b/src/mem.c index 015f325cf..8f170b626 100644 --- a/src/mem.c +++ b/src/mem.c @@ -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; diff --git a/src/x86_ops_fpu.h b/src/x86_ops_fpu.h index a1976f268..10102a4aa 100644 --- a/src/x86_ops_fpu.h +++ b/src/x86_ops_fpu.h @@ -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) diff --git a/src/x87_ops.h b/src/x87_ops.h index 15c0c22d1..2121e0b0b 100644 --- a/src/x87_ops.h +++ b/src/x87_ops.h @@ -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, diff --git a/src/x87_ops_arith.h b/src/x87_ops_arith.h index 48a141e2f..1313839bb 100644 --- a/src/x87_ops_arith.h +++ b/src/x87_ops_arith.h @@ -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));