mirror of
https://github.com/LIV2/WinUAE.git
synced 2025-12-06 00:12:52 +00:00
99 lines
3.0 KiB
C
99 lines
3.0 KiB
C
/*This file is a series of macros to get the 386+ based x87 emulation working with
|
|
the 808x emulation*/
|
|
#define X8087
|
|
#define OP_TABLE(name) ops_808x_ ## name
|
|
|
|
#define CLOCK_CYCLES(c) cycles -= (c)
|
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
|
|
|
#define fetch_ea_16(fetchdat)
|
|
#define fetch_ea_32(fetchdat)
|
|
#define SEG_CHECK_READ(seg)
|
|
#define SEG_CHECK_WRITE(seg)
|
|
#define CHECK_WRITE(seg, addr_lo, addr_hi)
|
|
#define PREFETCH_RUN(timing, bytes, rmdat, a, b, c, d, e)
|
|
|
|
static uint32_t readmeml(uint32_t seg, uint32_t addr)
|
|
{
|
|
return readmemw(seg, addr) | (readmemw(seg, addr+2) << 16);
|
|
}
|
|
static uint64_t readmemq(uint32_t seg, uint32_t addr)
|
|
{
|
|
return (uint64_t)readmemw(seg, addr) | ((uint64_t)readmemw(seg, addr+2) << 16) |
|
|
((uint64_t)readmemw(seg, addr+4) << 32) |
|
|
((uint64_t)readmemw(seg, addr+6) << 48);
|
|
}
|
|
|
|
static void writememb_8087(uint32_t seg, uint32_t addr, uint8_t val)
|
|
{
|
|
writememb(seg+addr, val);
|
|
}
|
|
static void writememl(uint32_t seg, uint32_t addr, uint32_t val)
|
|
{
|
|
writememw(seg, addr, val & 0xffff);
|
|
writememw(seg, addr+2, (val >> 16) & 0xffff);
|
|
}
|
|
static void writememq(uint32_t seg, uint32_t addr, uint64_t val)
|
|
{
|
|
writememw(seg, addr, val & 0xffff);
|
|
writememw(seg, addr+2, (val >> 16) & 0xffff);
|
|
writememw(seg, addr+4, (val >> 32) & 0xffff);
|
|
writememw(seg, addr+6, (val >> 48) & 0xffff);
|
|
}
|
|
|
|
static inline uint32_t geteal()
|
|
{
|
|
if (cpu_mod == 3)
|
|
fatal("geteal cpu_mod==3\n");
|
|
return readmeml(easeg, cpu_state.eaaddr);
|
|
}
|
|
static inline uint64_t geteaq()
|
|
{
|
|
if (cpu_mod == 3)
|
|
fatal("geteaq cpu_mod==3\n");
|
|
return readmemq(easeg, cpu_state.eaaddr);
|
|
}
|
|
static inline void seteal(uint32_t val)
|
|
{
|
|
if (cpu_mod == 3)
|
|
fatal("seteal cpu_mod==3\n");
|
|
else
|
|
writememl(easeg, cpu_state.eaaddr, val);
|
|
}
|
|
static inline void seteaq(uint64_t val)
|
|
{
|
|
if (cpu_mod == 3)
|
|
fatal("seteaq cpu_mod==3\n");
|
|
else
|
|
writememq(easeg, cpu_state.eaaddr, val);
|
|
}
|
|
|
|
#define flags_rebuild()
|
|
|
|
#define CF_SET() (cpu_state.flags & C_FLAG)
|
|
#define NF_SET() (cpu_state.flags & N_FLAG)
|
|
#define PF_SET() (cpu_state.flags & P_FLAG)
|
|
#define VF_SET() (cpu_state.flags & V_FLAG)
|
|
#define ZF_SET() (cpu_state.flags & Z_FLAG)
|
|
|
|
#define cond_O ( VF_SET())
|
|
#define cond_NO (!VF_SET())
|
|
#define cond_B ( CF_SET())
|
|
#define cond_NB (!CF_SET())
|
|
#define cond_E ( ZF_SET())
|
|
#define cond_NE (!ZF_SET())
|
|
#define cond_BE ( CF_SET() || ZF_SET())
|
|
#define cond_NBE (!CF_SET() && !ZF_SET())
|
|
#define cond_S ( NF_SET())
|
|
#define cond_NS (!NF_SET())
|
|
#define cond_P ( PF_SET())
|
|
#define cond_NP (!PF_SET())
|
|
#define cond_L (((NF_SET()) ? 1 : 0) != ((VF_SET()) ? 1 : 0))
|
|
#define cond_NL (((NF_SET()) ? 1 : 0) == ((VF_SET()) ? 1 : 0))
|
|
#define cond_LE (((NF_SET()) ? 1 : 0) != ((VF_SET()) ? 1 : 0) || (ZF_SET()))
|
|
#define cond_NLE (((NF_SET()) ? 1 : 0) == ((VF_SET()) ? 1 : 0) && (!ZF_SET()))
|
|
|
|
#define writememb writememb_8087
|
|
#include "x87_ops.h"
|
|
#undef writememb
|