Cycle counts for recompiled blocks now generated at compile time.
This commit is contained in:
parent
087f412d3f
commit
2905c43db8
43 changed files with 1142 additions and 730 deletions
|
|
@ -1079,6 +1079,9 @@ int dontprint=0;
|
||||||
|
|
||||||
#define OP_TABLE(name) ops_ ## name
|
#define OP_TABLE(name) ops_ ## name
|
||||||
|
|
||||||
|
#define CLOCK_CYCLES(c) cycles -= (c)
|
||||||
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
#include "386_ops.h"
|
#include "386_ops.h"
|
||||||
|
|
||||||
#undef NOTRM
|
#undef NOTRM
|
||||||
|
|
|
||||||
|
|
@ -1152,6 +1152,8 @@ uint32_t testr[9];
|
||||||
int dontprint=0;
|
int dontprint=0;
|
||||||
|
|
||||||
#define OP_TABLE(name) ops_ ## name
|
#define OP_TABLE(name) ops_ ## name
|
||||||
|
#define CLOCK_CYCLES(c) cycles -= (c)
|
||||||
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
#include "386_ops.h"
|
#include "386_ops.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,8 @@ static inline void fetch_ea_16_long(uint32_t rmdat)
|
||||||
#define fetch_ea_32(rmdat) pc++; mod=(rmdat >> 6) & 3; reg=(rmdat >> 3) & 7; rm = rmdat & 7; if (mod != 3) { fetch_ea_32_long(rmdat); } if (abrt) return 1
|
#define fetch_ea_32(rmdat) pc++; mod=(rmdat >> 6) & 3; reg=(rmdat >> 3) & 7; rm = rmdat & 7; if (mod != 3) { fetch_ea_32_long(rmdat); } if (abrt) return 1
|
||||||
|
|
||||||
#define OP_TABLE(name) dynarec_ops_ ## name
|
#define OP_TABLE(name) dynarec_ops_ ## name
|
||||||
|
#define CLOCK_CYCLES(c)
|
||||||
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
#include "386_ops.h"
|
#include "386_ops.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ CC = gcc.exe
|
||||||
WINDRES = windres.exe
|
WINDRES = windres.exe
|
||||||
CFLAGS = -O3 -march=i686 -fomit-frame-pointer
|
CFLAGS = -O3 -march=i686 -fomit-frame-pointer
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o \
|
||||||
codegen_x86.o config.o cpu.o dac.o device.o dma.o fdc.o gameport.o \
|
codegen_timing_486.o codegen_x86.o config.o cpu.o dac.o device.o dma.o fdc.o gameport.o \
|
||||||
headland.o i430vx.o ide.o io.o jim.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
headland.o i430vx.o ide.o io.o jim.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
||||||
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o model.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o model.o \
|
||||||
mouse.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o olivetti_m24.o \
|
mouse.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o olivetti_m24.o \
|
||||||
|
|
|
||||||
|
|
@ -50,4 +50,11 @@ extern int cpu_recomp_removed, cpu_recomp_removed_latched;
|
||||||
extern int cpu_reps, cpu_reps_latched;
|
extern int cpu_reps, cpu_reps_latched;
|
||||||
extern int cpu_notreps, cpu_notreps_latched;
|
extern int cpu_notreps, cpu_notreps_latched;
|
||||||
|
|
||||||
|
extern int codegen_block_cycles;
|
||||||
|
|
||||||
|
void codegen_timing_start();
|
||||||
|
void codegen_timing_prefix(uint8_t prefix);
|
||||||
|
void codegen_timing_opcode(uint8_t opcode, uint32_t fetchdat, int op_32);
|
||||||
|
void codegen_timing_block_end();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
365
src/codegen_timing_486.c
Normal file
365
src/codegen_timing_486.c
Normal file
|
|
@ -0,0 +1,365 @@
|
||||||
|
#ifdef DYNAREC
|
||||||
|
|
||||||
|
#include "ibm.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include "x86_ops.h"
|
||||||
|
#include "x87.h"
|
||||||
|
#include "codegen.h"
|
||||||
|
|
||||||
|
#define CYCLES(c) (int *)c
|
||||||
|
#define CYCLES2(c16, c32) (int *)((-1 & ~0xffff) | c16 | (c32 << 8))
|
||||||
|
|
||||||
|
static int *opcode_timings[256] =
|
||||||
|
{
|
||||||
|
/*00*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||||
|
/*10*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||||
|
/*20*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(4), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(4), CYCLES(3),
|
||||||
|
/*30*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(4), CYCLES(2), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(4), CYCLES(2),
|
||||||
|
|
||||||
|
/*40*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr,
|
||||||
|
/*50*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1),
|
||||||
|
/*60*/ CYCLES(11), CYCLES(9), CYCLES(7), CYCLES(9), CYCLES(4), CYCLES(4), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES2(17,25), CYCLES(1), CYCLES2(17,20), CYCLES(17), CYCLES(17), CYCLES(17), CYCLES(17),
|
||||||
|
/*70*/ &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt,
|
||||||
|
|
||||||
|
/*80*/ &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm, &timing_rm, CYCLES(5), CYCLES(5), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(3), CYCLES(1), CYCLES(5), CYCLES(6),
|
||||||
|
/*90*/ CYCLES(1), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(18), CYCLES(4), CYCLES(4), CYCLES(5), CYCLES(2), CYCLES(3),
|
||||||
|
/*a0*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(7), CYCLES(7), CYCLES(8), CYCLES(8), CYCLES(1), CYCLES(1), CYCLES(5), CYCLES(5), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6),
|
||||||
|
/*b0*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr,
|
||||||
|
|
||||||
|
/*c0*/ CYCLES(4), CYCLES(4), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6), CYCLES(1), CYCLES(1), CYCLES(14), CYCLES(5), CYCLES(13), CYCLES(13), CYCLES(26), CYCLES(0), CYCLES(3), CYCLES(15),
|
||||||
|
/*d0*/ CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(15), CYCLES(14), CYCLES(2), CYCLES(4), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*e0*/ CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(5), CYCLES(14), CYCLES(14), CYCLES(16), CYCLES(16), CYCLES(3), CYCLES(3), CYCLES(17), CYCLES(3), CYCLES(14), CYCLES(14), CYCLES(14), CYCLES(14),
|
||||||
|
/*f0*/ CYCLES(4), CYCLES(0), CYCLES(0), CYCLES(0), CYCLES(4), CYCLES(2), NULL, NULL, CYCLES(2), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(3), NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_mod3[256] =
|
||||||
|
{
|
||||||
|
/*00*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||||
|
/*10*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||||
|
/*20*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(4), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(4), CYCLES(3),
|
||||||
|
/*30*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(4), CYCLES(2), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(4), CYCLES(2),
|
||||||
|
|
||||||
|
/*40*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr,
|
||||||
|
/*50*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1),
|
||||||
|
/*60*/ CYCLES(11), CYCLES(9), CYCLES(7), CYCLES(9), CYCLES(4), CYCLES(4), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES2(14,25), CYCLES(1), CYCLES2(17,20), CYCLES(17), CYCLES(17), CYCLES(17), CYCLES(17),
|
||||||
|
/*70*/ &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt,
|
||||||
|
|
||||||
|
/*80*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(5), CYCLES(5), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(1), CYCLES(2), CYCLES(1),
|
||||||
|
/*90*/ CYCLES(1), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(18), CYCLES(4), CYCLES(4), CYCLES(5), CYCLES(2), CYCLES(3),
|
||||||
|
/*a0*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(7), CYCLES(7), CYCLES(8), CYCLES(8), CYCLES(1), CYCLES(1), CYCLES(5), CYCLES(5), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6),
|
||||||
|
/*b0*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr,
|
||||||
|
|
||||||
|
/*c0*/ CYCLES(4), CYCLES(4), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6), CYCLES(1), CYCLES(1), CYCLES(14), CYCLES(5), CYCLES(13), CYCLES(13), CYCLES(26), CYCLES(0), CYCLES(3), CYCLES(15),
|
||||||
|
/*d0*/ CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(15), CYCLES(14), CYCLES(2), CYCLES(4), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*e0*/ CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(5), CYCLES(14), CYCLES(14), CYCLES(16), CYCLES(16), CYCLES(3), CYCLES(3), CYCLES(17), CYCLES(3), CYCLES(14), CYCLES(14), CYCLES(14), CYCLES(14),
|
||||||
|
/*f0*/ CYCLES(4), CYCLES(0), CYCLES(0), CYCLES(0), CYCLES(4), CYCLES(2), NULL, NULL, CYCLES(2), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(3), NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_0f[256] =
|
||||||
|
{
|
||||||
|
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*20*/ CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*30*/ CYCLES(9), CYCLES(1), CYCLES(9), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
|
||||||
|
/*40*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*50*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*60*/ &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, NULL, NULL, &timing_rm, &timing_rm,
|
||||||
|
/*70*/ NULL, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, &timing_rm, CYCLES(100), NULL, NULL, NULL, NULL, NULL, NULL, &timing_rm, &timing_rm,
|
||||||
|
|
||||||
|
/*80*/ &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt,
|
||||||
|
/*90*/ CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3),
|
||||||
|
/*a0*/ CYCLES(3), CYCLES(3), CYCLES(14), CYCLES(8), CYCLES(3), CYCLES(4), NULL, NULL, CYCLES(3), CYCLES(3), NULL, CYCLES(13), CYCLES(3), CYCLES(3), NULL, CYCLES2(18,30),
|
||||||
|
/*b0*/ CYCLES(10), CYCLES(10), CYCLES(6), CYCLES(13), CYCLES(6), CYCLES(6), CYCLES(3), CYCLES(3), NULL, NULL, CYCLES(6), CYCLES(13), CYCLES(7), CYCLES(7), CYCLES(3), CYCLES(3),
|
||||||
|
|
||||||
|
/*c0*/ CYCLES(4), CYCLES(4), NULL, NULL, NULL, NULL, NULL, NULL, CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1),
|
||||||
|
/*d0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm,
|
||||||
|
/*e0*/ NULL, &timing_rm, &timing_rm, NULL, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm,
|
||||||
|
/*f0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL,
|
||||||
|
};
|
||||||
|
static int *opcode_timings_0f_mod3[256] =
|
||||||
|
{
|
||||||
|
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*20*/ CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), CYCLES(6), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*30*/ CYCLES(9), CYCLES(1), CYCLES(9), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
|
||||||
|
/*40*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*50*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*60*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, NULL, NULL, &timing_rr, &timing_rr,
|
||||||
|
/*70*/ NULL, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(100), NULL, NULL, NULL, NULL, NULL, NULL, &timing_rr, &timing_rr,
|
||||||
|
|
||||||
|
/*80*/ &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt, &timing_bnt,
|
||||||
|
/*90*/ CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3),
|
||||||
|
/*a0*/ CYCLES(3), CYCLES(3), CYCLES(14), CYCLES(8), CYCLES(3), CYCLES(4), NULL, NULL, CYCLES(3), CYCLES(3), NULL, CYCLES(13), CYCLES(3), CYCLES(3), NULL, CYCLES2(18,30),
|
||||||
|
/*b0*/ CYCLES(10), CYCLES(10), CYCLES(6), CYCLES(13), CYCLES(6), CYCLES(6), CYCLES(3), CYCLES(3), NULL, NULL, CYCLES(6), CYCLES(13), CYCLES(7), CYCLES(7), CYCLES(3), CYCLES(3),
|
||||||
|
|
||||||
|
/*c0*/ CYCLES(4), CYCLES(4), NULL, NULL, NULL, NULL, NULL, NULL, CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1),
|
||||||
|
/*d0*/ NULL, &timing_rr, &timing_rr, &timing_rr, NULL, &timing_rr, NULL, NULL, &timing_rr, &timing_rr, NULL, &timing_rr, &timing_rr, &timing_rr, NULL, &timing_rr,
|
||||||
|
/*e0*/ NULL, &timing_rr, &timing_rr, NULL, NULL, &timing_rr, NULL, NULL, &timing_rr, &timing_rr, NULL, &timing_rr, &timing_rr, &timing_rr, NULL, &timing_rr,
|
||||||
|
/*f0*/ NULL, &timing_rr, &timing_rr, &timing_rr, NULL, &timing_rr, NULL, NULL, &timing_rr, &timing_rr, &timing_rr, NULL, &timing_rr, &timing_rr, &timing_rr, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_shift[8] =
|
||||||
|
{
|
||||||
|
CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_shift_mod3[8] =
|
||||||
|
{
|
||||||
|
CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3)
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_f6[8] =
|
||||||
|
{
|
||||||
|
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_f6_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_f7[8] =
|
||||||
|
{
|
||||||
|
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_f7_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_ff[8] =
|
||||||
|
{
|
||||||
|
&timing_mm, &timing_mm, CYCLES(5), CYCLES(17), CYCLES(5), CYCLES(13), CYCLES(5), NULL
|
||||||
|
};
|
||||||
|
static int *opcode_timings_ff_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_rr, &timing_rr, CYCLES(5), CYCLES(17), CYCLES(5), CYCLES(13), CYCLES(5), NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_d8[8] =
|
||||||
|
{
|
||||||
|
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||||
|
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_d8_mod3[8] =
|
||||||
|
{
|
||||||
|
/* FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR*/
|
||||||
|
CYCLES(8), CYCLES(16), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_d9[8] =
|
||||||
|
{
|
||||||
|
/* FLDs FSTs FSTPs FLDENV FLDCW FSTENV FSTCW*/
|
||||||
|
CYCLES(3), NULL, CYCLES(7), CYCLES(7), CYCLES(34), CYCLES(4), CYCLES(67), CYCLES(3)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_d9_mod3[64] =
|
||||||
|
{
|
||||||
|
/*FLD*/
|
||||||
|
CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4),
|
||||||
|
/*FXCH*/
|
||||||
|
CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4),
|
||||||
|
/*FNOP*/
|
||||||
|
CYCLES(3), NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/*FSTP*/
|
||||||
|
CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3),
|
||||||
|
/* opFCHS opFABS opFTST opFXAM*/
|
||||||
|
CYCLES(6), CYCLES(3), NULL, NULL, CYCLES(4), CYCLES(8), NULL, NULL,
|
||||||
|
/* opFLD1 opFLDL2T opFLDL2E opFLDPI opFLDEG2 opFLDLN2 opFLDZ*/
|
||||||
|
CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(8), CYCLES(8), CYCLES(8), CYCLES(4), NULL,
|
||||||
|
/* opF2XM1 opFYL2X opFPTAN opFPATAN opFDECSTP opFINCSTP,*/
|
||||||
|
CYCLES(140), CYCLES(196), CYCLES(200), CYCLES(218), NULL, NULL, CYCLES(3), CYCLES(3),
|
||||||
|
/* opFPREM opFSQRT opFSINCOS opFRNDINT opFSCALE opFSIN opFCOS*/
|
||||||
|
CYCLES(70), NULL, CYCLES(83), CYCLES(292), CYCLES(21), CYCLES(30), CYCLES(257), CYCLES(257)
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_da[8] =
|
||||||
|
{
|
||||||
|
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||||
|
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_da_mod3[8] =
|
||||||
|
{
|
||||||
|
NULL, NULL, NULL, NULL, NULL, CYCLES(5), NULL, NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int *opcode_timings_db[8] =
|
||||||
|
{
|
||||||
|
/* FLDil FSTil FSTPil FLDe FSTPe*/
|
||||||
|
CYCLES(9), NULL, CYCLES(28), CYCLES(28), NULL, CYCLES(5), NULL, CYCLES(6)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_db_mod3[64] =
|
||||||
|
{
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
/* opFNOP opFCLEX opFINIT opFNOP opFNOP*/
|
||||||
|
NULL, CYCLES(3), CYCLES(7), CYCLES(17), CYCLES(3), CYCLES(3), NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_dc[8] =
|
||||||
|
{
|
||||||
|
/* opFADDd_a16 opFMULd_a16 opFCOMd_a16 opFCOMPd_a16 opFSUBd_a16 opFSUBRd_a16 opFDIVd_a16 opFDIVRd_a16*/
|
||||||
|
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_dc_mod3[8] =
|
||||||
|
{
|
||||||
|
/* opFADDr opFMULr opFSUBRr opFSUBr opFDIVRr opFDIVr*/
|
||||||
|
CYCLES(8), CYCLES(16), NULL, NULL, CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_dd[8] =
|
||||||
|
{
|
||||||
|
/* FLDd FSTd FSTPd FRSTOR FSAVE FSTSW*/
|
||||||
|
CYCLES(3), NULL, CYCLES(8), CYCLES(8), CYCLES(131), NULL, CYCLES(154), CYCLES(3)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_dd_mod3[8] =
|
||||||
|
{
|
||||||
|
/* FFFREE FST FSTP FUCOM FUCOMP*/
|
||||||
|
CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_de[8] =
|
||||||
|
{
|
||||||
|
/* FADDiw FMULiw FCOMiw FCOMPiw FSUBil FSUBRil FDIVil FDIVRil*/
|
||||||
|
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_de_mod3[8] =
|
||||||
|
{
|
||||||
|
/* FADD FMUL FCOMPP FSUB FSUBR FDIV FDIVR*/
|
||||||
|
CYCLES(8), CYCLES(16), NULL, CYCLES(5), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_df[8] =
|
||||||
|
{
|
||||||
|
/* FILDiw FISTiw FISTPiw FILDiq FBSTP FISTPiq*/
|
||||||
|
CYCLES(13), NULL, CYCLES(29), CYCLES(29), NULL, CYCLES(10), CYCLES(172), CYCLES(28)
|
||||||
|
};
|
||||||
|
static int *opcode_timings_df_mod3[8] =
|
||||||
|
{
|
||||||
|
/* FFREE FST FSTP FUCOM FUCOMP*/
|
||||||
|
CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *opcode_timings_8x[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
|
||||||
|
static int timing_count;
|
||||||
|
static uint8_t last_prefix;
|
||||||
|
|
||||||
|
static inline int COUNT(int *c, int op_32)
|
||||||
|
{
|
||||||
|
if ((uintptr_t)c <= 10000)
|
||||||
|
return (int)c;
|
||||||
|
if (((uintptr_t)c & ~0xffff) == (-1 & ~0xffff))
|
||||||
|
{
|
||||||
|
if (op_32 & 0x100)
|
||||||
|
return ((uintptr_t)c >> 8) & 0xff;
|
||||||
|
return (uintptr_t)c & 0xff;
|
||||||
|
}
|
||||||
|
return *c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void codegen_timing_start()
|
||||||
|
{
|
||||||
|
timing_count = 0;
|
||||||
|
last_prefix = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void codegen_timing_prefix(uint8_t prefix)
|
||||||
|
{
|
||||||
|
timing_count += COUNT(opcode_timings[prefix], 0);
|
||||||
|
last_prefix = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
void codegen_timing_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
||||||
|
{
|
||||||
|
static int **timings;
|
||||||
|
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
||||||
|
|
||||||
|
switch (last_prefix)
|
||||||
|
{
|
||||||
|
case 0x0f:
|
||||||
|
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xd8:
|
||||||
|
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xd9:
|
||||||
|
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||||
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xda:
|
||||||
|
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xdb:
|
||||||
|
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||||
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xdc:
|
||||||
|
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xdd:
|
||||||
|
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xde:
|
||||||
|
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xdf:
|
||||||
|
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||||
|
opcode = (opcode >> 3) & 7;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
switch (opcode)
|
||||||
|
{
|
||||||
|
case 0x80: case 0x81: case 0x82: case 0x83:
|
||||||
|
timings = mod3 ? opcode_timings_mod3 : opcode_timings_8x;
|
||||||
|
if (!mod3)
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xc0: case 0xc1: case 0xd0: case 0xd1: case 0xd2: case 0xd3:
|
||||||
|
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xf6:
|
||||||
|
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xf7:
|
||||||
|
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0xff:
|
||||||
|
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timing_count += COUNT(timings[opcode], op_32);
|
||||||
|
codegen_block_cycles += timing_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void codegen_timing_block_end()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -44,6 +44,7 @@ int cpu_recomp_removed, cpu_recomp_removed_latched;
|
||||||
|
|
||||||
static uint32_t codegen_endpc;
|
static uint32_t codegen_endpc;
|
||||||
|
|
||||||
|
int codegen_block_cycles;
|
||||||
|
|
||||||
static uint32_t last_op32;
|
static uint32_t last_op32;
|
||||||
static x86seg *last_ea_seg;
|
static x86seg *last_ea_seg;
|
||||||
|
|
@ -303,6 +304,8 @@ void codegen_block_init(uint32_t phys_addr)
|
||||||
last_op32 = -1;
|
last_op32 = -1;
|
||||||
last_ea_seg = NULL;
|
last_ea_seg = NULL;
|
||||||
last_ssegs = -1;
|
last_ssegs = -1;
|
||||||
|
|
||||||
|
codegen_block_cycles = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_block_remove()
|
void codegen_block_remove()
|
||||||
|
|
@ -355,6 +358,11 @@ void codegen_block_end()
|
||||||
block->checksum = checksum;
|
block->checksum = checksum;
|
||||||
// pclog("Checksum for %08x - %08x = %08x\n", codeblock_hash_pc[block_num] & ~3, end_pc, checksum);
|
// pclog("Checksum for %08x - %08x = %08x\n", codeblock_hash_pc[block_num] & ~3, end_pc, checksum);
|
||||||
|
|
||||||
|
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
|
||||||
|
addbyte(0x2d);
|
||||||
|
addlong((uint32_t)&cycles);
|
||||||
|
addlong((uint32_t)codegen_block_cycles);
|
||||||
|
|
||||||
addbyte(0x83); /*ADDL $8,%esp*/
|
addbyte(0x83); /*ADDL $8,%esp*/
|
||||||
addbyte(0xC4);
|
addbyte(0xC4);
|
||||||
addbyte(0x08);
|
addbyte(0x08);
|
||||||
|
|
@ -453,9 +461,10 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
|
||||||
int over = 0;
|
int over = 0;
|
||||||
int pc_off = 0;
|
int pc_off = 0;
|
||||||
|
|
||||||
|
codegen_timing_start();
|
||||||
|
|
||||||
while (!over)
|
while (!over)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
|
|
@ -466,102 +475,93 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
|
||||||
case 0x26: /*ES:*/
|
case 0x26: /*ES:*/
|
||||||
op_ea_seg = &_es;
|
op_ea_seg = &_es;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
case 0x2e: /*CS:*/
|
case 0x2e: /*CS:*/
|
||||||
op_ea_seg = &_cs;
|
op_ea_seg = &_cs;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
case 0x36: /*SS:*/
|
case 0x36: /*SS:*/
|
||||||
op_ea_seg = &_ss;
|
op_ea_seg = &_ss;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
case 0x3e: /*DS:*/
|
case 0x3e: /*DS:*/
|
||||||
op_ea_seg = &_ds;
|
op_ea_seg = &_ds;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
case 0x64: /*FS:*/
|
case 0x64: /*FS:*/
|
||||||
op_ea_seg = &_fs;
|
op_ea_seg = &_fs;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
case 0x65: /*GS:*/
|
case 0x65: /*GS:*/
|
||||||
op_ea_seg = &_gs;
|
op_ea_seg = &_gs;
|
||||||
op_ssegs = 1;
|
op_ssegs = 1;
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(4);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x66: /*Data size select*/
|
case 0x66: /*Data size select*/
|
||||||
op_32 = ((use32 & 0x100) ^ 0x100) | (op_32 & 0x200);
|
op_32 = ((use32 & 0x100) ^ 0x100) | (op_32 & 0x200);
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(2);
|
|
||||||
break;
|
break;
|
||||||
case 0x67: /*Address size select*/
|
case 0x67: /*Address size select*/
|
||||||
op_32 = ((use32 & 0x200) ^ 0x200) | (op_32 & 0x100);
|
op_32 = ((use32 & 0x200) ^ 0x200) | (op_32 & 0x100);
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(2);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd8:
|
case 0xd8:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_d8_a32 : x86_opcodes_d8_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16;
|
||||||
opcode_shift = 3;
|
opcode_shift = 3;
|
||||||
opcode_mask = 0x1f;
|
opcode_mask = 0x1f;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xd9:
|
case 0xd9:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_d9_a32 : x86_opcodes_d9_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xda:
|
case 0xda:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_da_a32 : x86_opcodes_da_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xdb:
|
case 0xdb:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_db_a32 : x86_opcodes_db_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xdc:
|
case 0xdc:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_dc_a32 : x86_opcodes_dc_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16;
|
||||||
opcode_shift = 3;
|
opcode_shift = 3;
|
||||||
opcode_mask = 0x1f;
|
opcode_mask = 0x1f;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xdd:
|
case 0xdd:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_dd_a32 : x86_opcodes_dd_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xde:
|
case 0xde:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_de_a32 : x86_opcodes_de_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
case 0xdf:
|
case 0xdf:
|
||||||
op_table = (op_32 & 0x200) ? x86_opcodes_df_a32 : x86_opcodes_df_a16;
|
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16;
|
||||||
opcode_mask = 0xff;
|
opcode_mask = 0xff;
|
||||||
over = 1;
|
over = 1;
|
||||||
pc_off = -1;
|
pc_off = -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xf0: /*LOCK*/
|
case 0xf0: /*LOCK*/
|
||||||
addbyte(0x83); addbyte(0x2D); addlong((uint32_t)&cycles); addbyte(2);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto generate_call;
|
goto generate_call;
|
||||||
}
|
}
|
||||||
|
codegen_timing_prefix(opcode);
|
||||||
fetchdat = fastreadl(cs + op_pc);
|
fetchdat = fastreadl(cs + op_pc);
|
||||||
if (abrt)
|
if (abrt)
|
||||||
return;
|
return;
|
||||||
|
|
@ -573,6 +573,8 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_call:
|
generate_call:
|
||||||
|
codegen_timing_opcode(opcode, fetchdat, op_32);
|
||||||
|
|
||||||
op = op_table[((opcode >> opcode_shift) | op_32) & opcode_mask];
|
op = op_table[((opcode >> opcode_shift) | op_32) & opcode_mask];
|
||||||
// if (output)
|
// if (output)
|
||||||
// pclog("Generate call at %08X %02X %08X %02X %08X %08X %08X %08X %08X %02X %02X %02X %02X\n", &codeblock[block_current][block_pos], opcode, new_pc, ram[old_pc], EAX, EBX, ECX, EDX, ESI, ram[0x7bd2+6],ram[0x7bd2+7],ram[0x7bd2+8],ram[0x7bd2+9]);
|
// pclog("Generate call at %08X %02X %08X %02X %08X %08X %08X %08X %08X %02X %02X %02X %02X\n", &codeblock[block_current][block_pos], opcode, new_pc, ram[old_pc], EAX, EBX, ECX, EDX, ESI, ram[0x7bd2+6],ram[0x7bd2+7],ram[0x7bd2+8],ram[0x7bd2+9]);
|
||||||
|
|
@ -632,6 +634,19 @@ generate_call:
|
||||||
addbyte(0xE8); /*CALL*/
|
addbyte(0xE8); /*CALL*/
|
||||||
addlong(((uint8_t *)op - (uint8_t *)(&block->data[block_pos + 4])));
|
addlong(((uint8_t *)op - (uint8_t *)(&block->data[block_pos + 4])));
|
||||||
|
|
||||||
|
if (codegen_block_cycles &&
|
||||||
|
((op_table == x86_dynarec_opcodes && ((opcode & 0xf0) == 0x70)) ||
|
||||||
|
(op_table == x86_dynarec_opcodes && ((opcode & 0xfc) == 0xe0)) ||
|
||||||
|
(op_table == x86_dynarec_opcodes_0f && ((opcode & 0xf0) == 0x80))))
|
||||||
|
{
|
||||||
|
/*Opcode is likely to cause block to exit, update cycle count*/
|
||||||
|
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
|
||||||
|
addbyte(0x2d);
|
||||||
|
addlong((uint32_t)&cycles);
|
||||||
|
addlong((uint32_t)codegen_block_cycles);
|
||||||
|
codegen_block_cycles = 0;
|
||||||
|
}
|
||||||
|
|
||||||
block->ins++;
|
block->ins++;
|
||||||
|
|
||||||
addbyte(0x09); /*OR %eax, %eax*/
|
addbyte(0x09); /*OR %eax, %eax*/
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
uint8_t src = getr8(reg); \
|
uint8_t src = getr8(reg); \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
setr8(rm, operation); \
|
setr8(rm, operation); \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
uint8_t src = getr8(reg); \
|
uint8_t src = getr8(reg); \
|
||||||
seteab(operation); if (abrt) return 1; \
|
seteab(operation); if (abrt) return 1; \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
cycles -= timing_mr; \
|
CLOCK_CYCLES(timing_mr); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
uint8_t src = getr8(reg); \
|
uint8_t src = getr8(reg); \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
setr8(rm, operation); \
|
setr8(rm, operation); \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
uint8_t src = getr8(reg); \
|
uint8_t src = getr8(reg); \
|
||||||
seteab(operation); if (abrt) return 1; \
|
seteab(operation); if (abrt) return 1; \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
cycles -= timing_mr; \
|
CLOCK_CYCLES(timing_mr); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
uint16_t src = regs[reg].w; \
|
uint16_t src = regs[reg].w; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
regs[rm].w = operation; \
|
regs[rm].w = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
uint16_t src = regs[reg].w; \
|
uint16_t src = regs[reg].w; \
|
||||||
seteaw(operation); if (abrt) return 1; \
|
seteaw(operation); if (abrt) return 1; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
cycles -= timing_mr; \
|
CLOCK_CYCLES(timing_mr); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -76,7 +76,7 @@
|
||||||
uint16_t src = regs[reg].w; \
|
uint16_t src = regs[reg].w; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
regs[rm].w = operation; \
|
regs[rm].w = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
uint16_t src = regs[reg].w; \
|
uint16_t src = regs[reg].w; \
|
||||||
seteaw(operation); if (abrt) return 1; \
|
seteaw(operation); if (abrt) return 1; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
cycles -= timing_mr; \
|
CLOCK_CYCLES(timing_mr); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -99,7 +99,7 @@
|
||||||
uint32_t src = regs[reg].l; \
|
uint32_t src = regs[reg].l; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
regs[rm].l = operation; \
|
regs[rm].l = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -107,7 +107,7 @@
|
||||||
uint32_t src = regs[reg].l; \
|
uint32_t src = regs[reg].l; \
|
||||||
seteal(operation); if (abrt) return 1; \
|
seteal(operation); if (abrt) return 1; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
cycles -= timing_mrl; \
|
CLOCK_CYCLES(timing_mrl); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -121,7 +121,7 @@
|
||||||
uint32_t src = regs[reg].l; \
|
uint32_t src = regs[reg].l; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
regs[rm].l = operation; \
|
regs[rm].l = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -129,7 +129,7 @@
|
||||||
uint32_t src = regs[reg].l; \
|
uint32_t src = regs[reg].l; \
|
||||||
seteal(operation); if (abrt) return 1; \
|
seteal(operation); if (abrt) return 1; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
cycles -= timing_mrl; \
|
CLOCK_CYCLES(timing_mrl); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -143,7 +143,7 @@
|
||||||
src = geteab(); if (abrt) return 1; \
|
src = geteab(); if (abrt) return 1; \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
setr8(reg, operation); \
|
setr8(reg, operation); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## name ## _b_rm_a32(uint32_t fetchdat) \
|
static int op ## name ## _b_rm_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -155,7 +155,7 @@
|
||||||
src = geteab(); if (abrt) return 1; \
|
src = geteab(); if (abrt) return 1; \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
setr8(reg, operation); \
|
setr8(reg, operation); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -168,7 +168,7 @@
|
||||||
src = geteaw(); if (abrt) return 1; \
|
src = geteaw(); if (abrt) return 1; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
regs[reg].w = operation; \
|
regs[reg].w = operation; \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## name ## _w_rm_a32(uint32_t fetchdat) \
|
static int op ## name ## _w_rm_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -180,7 +180,7 @@
|
||||||
src = geteaw(); if (abrt) return 1; \
|
src = geteaw(); if (abrt) return 1; \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
regs[reg].w = operation; \
|
regs[reg].w = operation; \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -193,7 +193,7 @@
|
||||||
src = geteal(); if (abrt) return 1; \
|
src = geteal(); if (abrt) return 1; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
regs[reg].l = operation; \
|
regs[reg].l = operation; \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rml; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rml); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## name ## _l_rm_a32(uint32_t fetchdat) \
|
static int op ## name ## _l_rm_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -205,7 +205,7 @@
|
||||||
src = geteal(); if (abrt) return 1; \
|
src = geteal(); if (abrt) return 1; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
regs[reg].l = operation; \
|
regs[reg].l = operation; \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rml; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rml); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -216,7 +216,7 @@
|
||||||
uint8_t src = getbytef(); \
|
uint8_t src = getbytef(); \
|
||||||
setflags ## 8 flagops; \
|
setflags ## 8 flagops; \
|
||||||
AL = operation; \
|
AL = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -227,7 +227,7 @@
|
||||||
uint16_t src = getwordf(); \
|
uint16_t src = getwordf(); \
|
||||||
setflags ## 16 flagops; \
|
setflags ## 16 flagops; \
|
||||||
AX = operation; \
|
AX = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -238,7 +238,7 @@
|
||||||
uint32_t src = getlong(); if (abrt) return 1; \
|
uint32_t src = getlong(); if (abrt) return 1; \
|
||||||
setflags ## 32 flagops; \
|
setflags ## 32 flagops; \
|
||||||
EAX = operation; \
|
EAX = operation; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -256,8 +256,8 @@ static int opCMP_b_rmw_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
dst = geteab(); if (abrt) return 1;
|
dst = geteab(); if (abrt) return 1;
|
||||||
setsub8(dst, getr8(reg));
|
setsub8(dst, getr8(reg));
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_b_rmw_a32(uint32_t fetchdat)
|
static int opCMP_b_rmw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -266,8 +266,8 @@ static int opCMP_b_rmw_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
dst = geteab(); if (abrt) return 1;
|
dst = geteab(); if (abrt) return 1;
|
||||||
setsub8(dst, getr8(reg));
|
setsub8(dst, getr8(reg));
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -277,8 +277,8 @@ static int opCMP_w_rmw_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
dst = geteaw(); if (abrt) return 1;
|
dst = geteaw(); if (abrt) return 1;
|
||||||
setsub16(dst, regs[reg].w);
|
setsub16(dst, regs[reg].w);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_w_rmw_a32(uint32_t fetchdat)
|
static int opCMP_w_rmw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -287,8 +287,8 @@ static int opCMP_w_rmw_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
dst = geteaw(); if (abrt) return 1;
|
dst = geteaw(); if (abrt) return 1;
|
||||||
setsub16(dst, regs[reg].w);
|
setsub16(dst, regs[reg].w);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -298,8 +298,8 @@ static int opCMP_l_rmw_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
dst = geteal(); if (abrt) return 1;
|
dst = geteal(); if (abrt) return 1;
|
||||||
setsub32(dst, regs[reg].l);
|
setsub32(dst, regs[reg].l);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_l_rmw_a32(uint32_t fetchdat)
|
static int opCMP_l_rmw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -308,8 +308,8 @@ static int opCMP_l_rmw_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
dst = geteal(); if (abrt) return 1;
|
dst = geteal(); if (abrt) return 1;
|
||||||
setsub32(dst, regs[reg].l);
|
setsub32(dst, regs[reg].l);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -319,7 +319,7 @@ static int opCMP_b_rm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
src = geteab(); if (abrt) return 1;
|
src = geteab(); if (abrt) return 1;
|
||||||
setsub8(getr8(reg), src);
|
setsub8(getr8(reg), src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_b_rm_a32(uint32_t fetchdat)
|
static int opCMP_b_rm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -328,7 +328,7 @@ static int opCMP_b_rm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
src = geteab(); if (abrt) return 1;
|
src = geteab(); if (abrt) return 1;
|
||||||
setsub8(getr8(reg), src);
|
setsub8(getr8(reg), src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -338,7 +338,7 @@ static int opCMP_w_rm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
src = geteaw(); if (abrt) return 1;
|
src = geteaw(); if (abrt) return 1;
|
||||||
setsub16(regs[reg].w, src);
|
setsub16(regs[reg].w, src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_w_rm_a32(uint32_t fetchdat)
|
static int opCMP_w_rm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -347,7 +347,7 @@ static int opCMP_w_rm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
src = geteaw(); if (abrt) return 1;
|
src = geteaw(); if (abrt) return 1;
|
||||||
setsub16(regs[reg].w, src);
|
setsub16(regs[reg].w, src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -357,7 +357,7 @@ static int opCMP_l_rm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
src = geteal(); if (abrt) return 1;
|
src = geteal(); if (abrt) return 1;
|
||||||
setsub32(regs[reg].l, src);
|
setsub32(regs[reg].l, src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rml);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMP_l_rm_a32(uint32_t fetchdat)
|
static int opCMP_l_rm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -366,7 +366,7 @@ static int opCMP_l_rm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
src = geteal(); if (abrt) return 1;
|
src = geteal(); if (abrt) return 1;
|
||||||
setsub32(regs[reg].l, src);
|
setsub32(regs[reg].l, src);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_rml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_rml);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -374,7 +374,7 @@ static int opCMP_AL_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint8_t src = getbytef();
|
uint8_t src = getbytef();
|
||||||
setsub8(AL, src);
|
setsub8(AL, src);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -382,7 +382,7 @@ static int opCMP_AX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t src = getwordf();
|
uint16_t src = getwordf();
|
||||||
setsub16(AX, src);
|
setsub16(AX, src);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -390,7 +390,7 @@ static int opCMP_EAX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t src = getlong(); if (abrt) return 1;
|
uint32_t src = getlong(); if (abrt) return 1;
|
||||||
setsub32(EAX, src);
|
setsub32(EAX, src);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -401,8 +401,8 @@ static int opTEST_b_a16(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
temp2 = getr8(reg);
|
temp2 = getr8(reg);
|
||||||
setznp8(temp & temp2);
|
setznp8(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opTEST_b_a32(uint32_t fetchdat)
|
static int opTEST_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -412,8 +412,8 @@ static int opTEST_b_a32(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
temp2 = getr8(reg);
|
temp2 = getr8(reg);
|
||||||
setznp8(temp & temp2);
|
setznp8(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -424,8 +424,8 @@ static int opTEST_w_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
temp2 = regs[reg].w;
|
temp2 = regs[reg].w;
|
||||||
setznp16(temp & temp2);
|
setznp16(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opTEST_w_a32(uint32_t fetchdat)
|
static int opTEST_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -435,8 +435,8 @@ static int opTEST_w_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
temp2 = regs[reg].w;
|
temp2 = regs[reg].w;
|
||||||
setznp16(temp & temp2);
|
setznp16(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -447,8 +447,8 @@ static int opTEST_l_a16(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
temp2 = regs[reg].l;
|
temp2 = regs[reg].l;
|
||||||
setznp32(temp & temp2);
|
setznp32(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opTEST_l_a32(uint32_t fetchdat)
|
static int opTEST_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -458,8 +458,8 @@ static int opTEST_l_a32(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
temp2 = regs[reg].l;
|
temp2 = regs[reg].l;
|
||||||
setznp32(temp & temp2);
|
setznp32(temp & temp2);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -467,21 +467,21 @@ static int opTEST_AL(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint8_t temp = getbytef();
|
uint8_t temp = getbytef();
|
||||||
setznp8(AL & temp);
|
setznp8(AL & temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opTEST_AX(uint32_t fetchdat)
|
static int opTEST_AX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t temp = getwordf();
|
uint16_t temp = getwordf();
|
||||||
setznp16(AX & temp);
|
setznp16(AX & temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opTEST_EAX(uint32_t fetchdat)
|
static int opTEST_EAX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t temp = getlong(); if (abrt) return 1;
|
uint32_t temp = getlong(); if (abrt) return 1;
|
||||||
setznp32(EAX & temp);
|
setznp32(EAX & temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -493,45 +493,45 @@ static int opTEST_EAX(uint32_t fetchdat)
|
||||||
case 0x00: /*ADD ea, #*/ \
|
case 0x00: /*ADD ea, #*/ \
|
||||||
setea ## ea_width(dst + src); if (abrt) return 1; \
|
setea ## ea_width(dst + src); if (abrt) return 1; \
|
||||||
setadd ## flag_width(dst, src); \
|
setadd ## flag_width(dst, src); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x08: /*OR ea, #*/ \
|
case 0x08: /*OR ea, #*/ \
|
||||||
dst |= src; \
|
dst |= src; \
|
||||||
setea ## ea_width(dst); if (abrt) return 1; \
|
setea ## ea_width(dst); if (abrt) return 1; \
|
||||||
setznp ## flag_width(dst); \
|
setznp ## flag_width(dst); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x10: /*ADC ea, #*/ \
|
case 0x10: /*ADC ea, #*/ \
|
||||||
setea ## ea_width(dst + src + tempc); if (abrt) return 1; \
|
setea ## ea_width(dst + src + tempc); if (abrt) return 1; \
|
||||||
setadc ## flag_width(dst, src); \
|
setadc ## flag_width(dst, src); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x18: /*SBB ea, #*/ \
|
case 0x18: /*SBB ea, #*/ \
|
||||||
setea ## ea_width(dst - (src + tempc)); if (abrt) return 1; \
|
setea ## ea_width(dst - (src + tempc)); if (abrt) return 1; \
|
||||||
setsbc ## flag_width(dst, src); \
|
setsbc ## flag_width(dst, src); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x20: /*AND ea, #*/ \
|
case 0x20: /*AND ea, #*/ \
|
||||||
dst &= src; \
|
dst &= src; \
|
||||||
setea ## ea_width(dst); if (abrt) return 1; \
|
setea ## ea_width(dst); if (abrt) return 1; \
|
||||||
setznp ## flag_width(dst); \
|
setznp ## flag_width(dst); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x28: /*SUB ea, #*/ \
|
case 0x28: /*SUB ea, #*/ \
|
||||||
setea ## ea_width(dst - src); if (abrt) return 1; \
|
setea ## ea_width(dst - src); if (abrt) return 1; \
|
||||||
setsub ## flag_width(dst, src); \
|
setsub ## flag_width(dst, src); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x30: /*XOR ea, #*/ \
|
case 0x30: /*XOR ea, #*/ \
|
||||||
dst ^= src; \
|
dst ^= src; \
|
||||||
setea ## ea_width(dst); if (abrt) return 1; \
|
setea ## ea_width(dst); if (abrt) return 1; \
|
||||||
setznp ## flag_width(dst); \
|
setznp ## flag_width(dst); \
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mr; \
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mr); \
|
||||||
break; \
|
break; \
|
||||||
case 0x38: /*CMP ea, #*/ \
|
case 0x38: /*CMP ea, #*/ \
|
||||||
setsub ## flag_width(dst, src); \
|
setsub ## flag_width(dst, src); \
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2); \
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2); \
|
||||||
else cycles -= ((mod == 3) ? 2 : 7); \
|
else CLOCK_CYCLES((mod == 3) ? 2 : 7); \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ static int opCMPXCHG_b_a16(uint32_t fetchdat)
|
||||||
else AL = temp;
|
else AL = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub8(temp2, temp);
|
setsub8(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPXCHG_b_a32(uint32_t fetchdat)
|
static int opCMPXCHG_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -31,7 +31,7 @@ static int opCMPXCHG_b_a32(uint32_t fetchdat)
|
||||||
else AL = temp;
|
else AL = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub8(temp2, temp);
|
setsub8(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ static int opCMPXCHG_w_a16(uint32_t fetchdat)
|
||||||
else AX = temp;
|
else AX = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub16(temp2, temp);
|
setsub16(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPXCHG_w_a32(uint32_t fetchdat)
|
static int opCMPXCHG_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -68,7 +68,7 @@ static int opCMPXCHG_w_a32(uint32_t fetchdat)
|
||||||
else AX = temp;
|
else AX = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub16(temp2, temp);
|
setsub16(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,7 +87,7 @@ static int opCMPXCHG_l_a16(uint32_t fetchdat)
|
||||||
else EAX = temp;
|
else EAX = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub32(temp2, temp);
|
setsub32(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPXCHG_l_a32(uint32_t fetchdat)
|
static int opCMPXCHG_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -105,7 +105,7 @@ static int opCMPXCHG_l_a32(uint32_t fetchdat)
|
||||||
else EAX = temp;
|
else EAX = temp;
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
setsub32(temp2, temp);
|
setsub32(temp2, temp);
|
||||||
cycles -= (mod == 3) ? 6 : 10;
|
CLOCK_CYCLES((mod == 3) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,6 +123,7 @@ static int opXADD_b_a16(uint32_t fetchdat)
|
||||||
seteab(temp + getr8(reg)); if (abrt) return 1;
|
seteab(temp + getr8(reg)); if (abrt) return 1;
|
||||||
setadd8(temp, getr8(reg));
|
setadd8(temp, getr8(reg));
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXADD_b_a32(uint32_t fetchdat)
|
static int opXADD_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -139,6 +140,7 @@ static int opXADD_b_a32(uint32_t fetchdat)
|
||||||
seteab(temp + getr8(reg)); if (abrt) return 1;
|
seteab(temp + getr8(reg)); if (abrt) return 1;
|
||||||
setadd8(temp, getr8(reg));
|
setadd8(temp, getr8(reg));
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -156,6 +158,7 @@ static int opXADD_w_a16(uint32_t fetchdat)
|
||||||
seteaw(temp + regs[reg].w); if (abrt) return 1;
|
seteaw(temp + regs[reg].w); if (abrt) return 1;
|
||||||
setadd16(temp, regs[reg].w);
|
setadd16(temp, regs[reg].w);
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXADD_w_a32(uint32_t fetchdat)
|
static int opXADD_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -172,6 +175,7 @@ static int opXADD_w_a32(uint32_t fetchdat)
|
||||||
seteaw(temp + regs[reg].w); if (abrt) return 1;
|
seteaw(temp + regs[reg].w); if (abrt) return 1;
|
||||||
setadd16(temp, regs[reg].w);
|
setadd16(temp, regs[reg].w);
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -189,6 +193,7 @@ static int opXADD_l_a16(uint32_t fetchdat)
|
||||||
seteal(temp + regs[reg].l); if (abrt) return 1;
|
seteal(temp + regs[reg].l); if (abrt) return 1;
|
||||||
setadd32(temp, regs[reg].l);
|
setadd32(temp, regs[reg].l);
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXADD_l_a32(uint32_t fetchdat)
|
static int opXADD_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -205,5 +210,6 @@ static int opXADD_l_a32(uint32_t fetchdat)
|
||||||
seteal(temp + regs[reg].l); if (abrt) return 1;
|
seteal(temp + regs[reg].l); if (abrt) return 1;
|
||||||
setadd32(temp, regs[reg].l);
|
setadd32(temp, regs[reg].l);
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
|
CLOCK_CYCLES((mod == 3) ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ static int opAAA(uint32_t fetchdat)
|
||||||
else
|
else
|
||||||
flags &= ~(A_FLAG | C_FLAG);
|
flags &= ~(A_FLAG | C_FLAG);
|
||||||
AL &= 0xF;
|
AL &= 0xF;
|
||||||
cycles -= is486 ? 3 : 4;
|
CLOCK_CYCLES(is486 ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -21,7 +21,7 @@ static int opAAD(uint32_t fetchdat)
|
||||||
AL = (AH * base) + AL;
|
AL = (AH * base) + AL;
|
||||||
AH = 0;
|
AH = 0;
|
||||||
setznp16(AX);
|
setznp16(AX);
|
||||||
cycles -= (is486) ? 14 : 19;
|
CLOCK_CYCLES((is486) ? 14 : 19);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ static int opAAM(uint32_t fetchdat)
|
||||||
AH = AL / base;
|
AH = AL / base;
|
||||||
AL %= base;
|
AL %= base;
|
||||||
setznp16(AX);
|
setznp16(AX);
|
||||||
cycles -= (is486) ? 15 : 17;
|
CLOCK_CYCLES((is486) ? 15 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ static int opAAS(uint32_t fetchdat)
|
||||||
else
|
else
|
||||||
flags &= ~(A_FLAG | C_FLAG);
|
flags &= ~(A_FLAG | C_FLAG);
|
||||||
AL &= 0xF;
|
AL &= 0xF;
|
||||||
cycles -= is486 ? 3 : 4;
|
CLOCK_CYCLES(is486 ? 3 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,7 +73,7 @@ static int opDAA(uint32_t fetchdat)
|
||||||
tempw = flags & (C_FLAG | A_FLAG);
|
tempw = flags & (C_FLAG | A_FLAG);
|
||||||
setznp8(AL);
|
setznp8(AL);
|
||||||
flags |= tempw;
|
flags |= tempw;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,7 @@ static int opDAS(uint32_t fetchdat)
|
||||||
tempw = flags & (C_FLAG | A_FLAG);
|
tempw = flags & (C_FLAG | A_FLAG);
|
||||||
setznp8(AL);
|
setznp8(AL);
|
||||||
flags |= tempw;
|
flags |= tempw;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ static int opBT_w_r_a16(uint32_t fetchdat)
|
||||||
if (temp & (1 << (regs[reg].w & 15))) flags |= C_FLAG;
|
if (temp & (1 << (regs[reg].w & 15))) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBT_w_r_a32(uint32_t fetchdat)
|
static int opBT_w_r_a32(uint32_t fetchdat)
|
||||||
|
|
@ -24,7 +24,7 @@ static int opBT_w_r_a32(uint32_t fetchdat)
|
||||||
if (temp & (1 << (regs[reg].w & 15))) flags |= C_FLAG;
|
if (temp & (1 << (regs[reg].w & 15))) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBT_l_r_a16(uint32_t fetchdat)
|
static int opBT_l_r_a16(uint32_t fetchdat)
|
||||||
|
|
@ -38,7 +38,7 @@ static int opBT_l_r_a16(uint32_t fetchdat)
|
||||||
if (temp & (1 << (regs[reg].l & 31))) flags |= C_FLAG;
|
if (temp & (1 << (regs[reg].l & 31))) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBT_l_r_a32(uint32_t fetchdat)
|
static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
|
|
@ -52,7 +52,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
if (temp & (1 << (regs[reg].l & 31))) flags |= C_FLAG;
|
if (temp & (1 << (regs[reg].l & 31))) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,7 +72,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
else flags &= ~C_FLAG; \
|
else flags &= ~C_FLAG; \
|
||||||
\
|
\
|
||||||
cycles -= 6; \
|
CLOCK_CYCLES(6); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opBT ## name ## _w_r_a32(uint32_t fetchdat) \
|
static int opBT ## name ## _w_r_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -90,7 +90,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
else flags &= ~C_FLAG; \
|
else flags &= ~C_FLAG; \
|
||||||
\
|
\
|
||||||
cycles -= 6; \
|
CLOCK_CYCLES(6); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opBT ## name ## _l_r_a16(uint32_t fetchdat) \
|
static int opBT ## name ## _l_r_a16(uint32_t fetchdat) \
|
||||||
|
|
@ -108,7 +108,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
else flags &= ~C_FLAG; \
|
else flags &= ~C_FLAG; \
|
||||||
\
|
\
|
||||||
cycles -= 6; \
|
CLOCK_CYCLES(6); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opBT ## name ## _l_r_a32(uint32_t fetchdat) \
|
static int opBT ## name ## _l_r_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -126,7 +126,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
else flags &= ~C_FLAG; \
|
else flags &= ~C_FLAG; \
|
||||||
\
|
\
|
||||||
cycles -= 6; \
|
CLOCK_CYCLES(6); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,7 +150,7 @@ static int opBA_w_a16(uint32_t fetchdat)
|
||||||
case 0x20: /*BT w,imm*/
|
case 0x20: /*BT w,imm*/
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
case 0x28: /*BTS w,imm*/
|
case 0x28: /*BTS w,imm*/
|
||||||
temp |= (1 << count);
|
temp |= (1 << count);
|
||||||
|
|
@ -171,7 +171,7 @@ static int opBA_w_a16(uint32_t fetchdat)
|
||||||
seteaw(temp); if (abrt) return 1;
|
seteaw(temp); if (abrt) return 1;
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBA_w_a32(uint32_t fetchdat)
|
static int opBA_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -190,7 +190,7 @@ static int opBA_w_a32(uint32_t fetchdat)
|
||||||
case 0x20: /*BT w,imm*/
|
case 0x20: /*BT w,imm*/
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
case 0x28: /*BTS w,imm*/
|
case 0x28: /*BTS w,imm*/
|
||||||
temp |= (1 << count);
|
temp |= (1 << count);
|
||||||
|
|
@ -211,7 +211,7 @@ static int opBA_w_a32(uint32_t fetchdat)
|
||||||
seteaw(temp); if (abrt) return 1;
|
seteaw(temp); if (abrt) return 1;
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -231,7 +231,7 @@ static int opBA_l_a16(uint32_t fetchdat)
|
||||||
case 0x20: /*BT w,imm*/
|
case 0x20: /*BT w,imm*/
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
case 0x28: /*BTS w,imm*/
|
case 0x28: /*BTS w,imm*/
|
||||||
temp |= (1 << count);
|
temp |= (1 << count);
|
||||||
|
|
@ -252,7 +252,7 @@ static int opBA_l_a16(uint32_t fetchdat)
|
||||||
seteal(temp); if (abrt) return 1;
|
seteal(temp); if (abrt) return 1;
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBA_l_a32(uint32_t fetchdat)
|
static int opBA_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -271,7 +271,7 @@ static int opBA_l_a32(uint32_t fetchdat)
|
||||||
case 0x20: /*BT w,imm*/
|
case 0x20: /*BT w,imm*/
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
case 0x28: /*BTS w,imm*/
|
case 0x28: /*BTS w,imm*/
|
||||||
temp |= (1 << count);
|
temp |= (1 << count);
|
||||||
|
|
@ -292,6 +292,6 @@ static int opBA_l_a32(uint32_t fetchdat)
|
||||||
seteal(temp); if (abrt) return 1;
|
seteal(temp); if (abrt) return 1;
|
||||||
if (tempc) flags |= C_FLAG;
|
if (tempc) flags |= C_FLAG;
|
||||||
else flags &= ~C_FLAG;
|
else flags &= ~C_FLAG;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
flags &= ~Z_FLAG; \
|
flags &= ~Z_FLAG; \
|
||||||
for (c = start; c != end; c += dir) \
|
for (c = start; c != end; c += dir) \
|
||||||
{ \
|
{ \
|
||||||
cycles -= time; \
|
CLOCK_CYCLES(time); \
|
||||||
if (temp & (1 << c)) \
|
if (temp & (1 << c)) \
|
||||||
{ \
|
{ \
|
||||||
dest = c; \
|
dest = c; \
|
||||||
|
|
@ -26,7 +26,7 @@ static int opBSF_w_a16(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(0, 16, 1, regs[reg].w, (is486) ? 1 : 3);
|
BS_common(0, 16, 1, regs[reg].w, (is486) ? 1 : 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSF_w_a32(uint32_t fetchdat)
|
static int opBSF_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -38,7 +38,7 @@ static int opBSF_w_a32(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(0, 16, 1, regs[reg].w, (is486) ? 1 : 3);
|
BS_common(0, 16, 1, regs[reg].w, (is486) ? 1 : 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSF_l_a16(uint32_t fetchdat)
|
static int opBSF_l_a16(uint32_t fetchdat)
|
||||||
|
|
@ -50,7 +50,7 @@ static int opBSF_l_a16(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(0, 32, 1, regs[reg].l, (is486) ? 1 : 3);
|
BS_common(0, 32, 1, regs[reg].l, (is486) ? 1 : 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSF_l_a32(uint32_t fetchdat)
|
static int opBSF_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -62,7 +62,7 @@ static int opBSF_l_a32(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(0, 32, 1, regs[reg].l, (is486) ? 1 : 3);
|
BS_common(0, 32, 1, regs[reg].l, (is486) ? 1 : 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,7 +75,7 @@ static int opBSR_w_a16(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(15, -1, -1, regs[reg].w, 3);
|
BS_common(15, -1, -1, regs[reg].w, 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSR_w_a32(uint32_t fetchdat)
|
static int opBSR_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -87,7 +87,7 @@ static int opBSR_w_a32(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(15, -1, -1, regs[reg].w, 3);
|
BS_common(15, -1, -1, regs[reg].w, 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSR_l_a16(uint32_t fetchdat)
|
static int opBSR_l_a16(uint32_t fetchdat)
|
||||||
|
|
@ -99,7 +99,7 @@ static int opBSR_l_a16(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(31, -1, -1, regs[reg].l, 3);
|
BS_common(31, -1, -1, regs[reg].l, 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBSR_l_a32(uint32_t fetchdat)
|
static int opBSR_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -111,7 +111,7 @@ static int opBSR_l_a32(uint32_t fetchdat)
|
||||||
|
|
||||||
BS_common(31, -1, -1, regs[reg].l, 3);
|
BS_common(31, -1, -1, regs[reg].l, 3);
|
||||||
|
|
||||||
cycles -= (is486) ? 6 : 10;
|
CLOCK_CYCLES((is486) ? 6 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ static int opCALL_far_w(uint32_t fetchdat)
|
||||||
CALL_FAR_w(new_cs, new_pc);
|
CALL_FAR_w(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 18 : 17;
|
CLOCK_CYCLES(is486 ? 18 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCALL_far_l(uint32_t fetchdat)
|
static int opCALL_far_l(uint32_t fetchdat)
|
||||||
|
|
@ -74,7 +74,7 @@ static int opCALL_far_l(uint32_t fetchdat)
|
||||||
CALL_FAR_l(new_cs, new_pc);
|
CALL_FAR_l(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 18 : 17;
|
CLOCK_CYCLES(is486 ? 18 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,21 +94,21 @@ static int opFF_w_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(temp + 1); if (abrt) return 1;
|
seteaw(temp + 1); if (abrt) return 1;
|
||||||
setadd16nc(temp, 1);
|
setadd16nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*DEC w*/
|
case 0x08: /*DEC w*/
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(temp - 1); if (abrt) return 1;
|
seteaw(temp - 1); if (abrt) return 1;
|
||||||
setsub16nc(temp, 1);
|
setsub16nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*CALL*/
|
case 0x10: /*CALL*/
|
||||||
new_pc = geteaw(); if (abrt) return 1;
|
new_pc = geteaw(); if (abrt) return 1;
|
||||||
PUSH_W(pc);
|
PUSH_W(pc);
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*CALL far*/
|
case 0x18: /*CALL far*/
|
||||||
new_pc = readmemw(easeg, eaaddr);
|
new_pc = readmemw(easeg, eaaddr);
|
||||||
|
|
@ -117,14 +117,14 @@ static int opFF_w_a16(uint32_t fetchdat)
|
||||||
CALL_FAR_w(new_cs, new_pc);
|
CALL_FAR_w(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 17 : 22;
|
CLOCK_CYCLES(is486 ? 17 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*JMP*/
|
case 0x20: /*JMP*/
|
||||||
new_pc = geteaw(); if (abrt) return 1;
|
new_pc = geteaw(); if (abrt) return 1;
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*JMP far*/
|
case 0x28: /*JMP far*/
|
||||||
oxpc = pc;
|
oxpc = pc;
|
||||||
|
|
@ -133,12 +133,12 @@ static int opFF_w_a16(uint32_t fetchdat)
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= is486 ? 13 : 12;
|
CLOCK_CYCLES(is486 ? 13 : 12);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*PUSH w*/
|
case 0x30: /*PUSH w*/
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
PUSH_W(temp);
|
PUSH_W(temp);
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -162,21 +162,21 @@ static int opFF_w_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(temp + 1); if (abrt) return 1;
|
seteaw(temp + 1); if (abrt) return 1;
|
||||||
setadd16nc(temp, 1);
|
setadd16nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*DEC w*/
|
case 0x08: /*DEC w*/
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(temp - 1); if (abrt) return 1;
|
seteaw(temp - 1); if (abrt) return 1;
|
||||||
setsub16nc(temp, 1);
|
setsub16nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*CALL*/
|
case 0x10: /*CALL*/
|
||||||
new_pc = geteaw(); if (abrt) return 1;
|
new_pc = geteaw(); if (abrt) return 1;
|
||||||
PUSH_W(pc);
|
PUSH_W(pc);
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*CALL far*/
|
case 0x18: /*CALL far*/
|
||||||
new_pc = readmemw(easeg, eaaddr);
|
new_pc = readmemw(easeg, eaaddr);
|
||||||
|
|
@ -185,14 +185,14 @@ static int opFF_w_a32(uint32_t fetchdat)
|
||||||
CALL_FAR_w(new_cs, new_pc);
|
CALL_FAR_w(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 17 : 22;
|
CLOCK_CYCLES(is486 ? 17 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*JMP*/
|
case 0x20: /*JMP*/
|
||||||
new_pc = geteaw(); if (abrt) return 1;
|
new_pc = geteaw(); if (abrt) return 1;
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*JMP far*/
|
case 0x28: /*JMP far*/
|
||||||
oxpc = pc;
|
oxpc = pc;
|
||||||
|
|
@ -201,12 +201,12 @@ static int opFF_w_a32(uint32_t fetchdat)
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= is486 ? 13 : 12;
|
CLOCK_CYCLES(is486 ? 13 : 12);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*PUSH w*/
|
case 0x30: /*PUSH w*/
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
PUSH_W(temp);
|
PUSH_W(temp);
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -231,21 +231,21 @@ static int opFF_l_a16(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(temp + 1); if (abrt) return 1;
|
seteal(temp + 1); if (abrt) return 1;
|
||||||
setadd32nc(temp, 1);
|
setadd32nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*DEC l*/
|
case 0x08: /*DEC l*/
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(temp - 1); if (abrt) return 1;
|
seteal(temp - 1); if (abrt) return 1;
|
||||||
setsub32nc(temp, 1);
|
setsub32nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*CALL*/
|
case 0x10: /*CALL*/
|
||||||
new_pc = geteal(); if (abrt) return 1;
|
new_pc = geteal(); if (abrt) return 1;
|
||||||
PUSH_L(pc);
|
PUSH_L(pc);
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*CALL far*/
|
case 0x18: /*CALL far*/
|
||||||
new_pc = readmeml(easeg, eaaddr);
|
new_pc = readmeml(easeg, eaaddr);
|
||||||
|
|
@ -254,14 +254,14 @@ static int opFF_l_a16(uint32_t fetchdat)
|
||||||
CALL_FAR_l(new_cs, new_pc);
|
CALL_FAR_l(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 17 : 22;
|
CLOCK_CYCLES(is486 ? 17 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*JMP*/
|
case 0x20: /*JMP*/
|
||||||
new_pc = geteal(); if (abrt) return 1;
|
new_pc = geteal(); if (abrt) return 1;
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*JMP far*/
|
case 0x28: /*JMP far*/
|
||||||
oxpc = pc;
|
oxpc = pc;
|
||||||
|
|
@ -270,12 +270,12 @@ static int opFF_l_a16(uint32_t fetchdat)
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= is486 ? 13 : 12;
|
CLOCK_CYCLES(is486 ? 13 : 12);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*PUSH l*/
|
case 0x30: /*PUSH l*/
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
PUSH_L(temp);
|
PUSH_L(temp);
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -299,21 +299,21 @@ static int opFF_l_a32(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(temp + 1); if (abrt) return 1;
|
seteal(temp + 1); if (abrt) return 1;
|
||||||
setadd32nc(temp, 1);
|
setadd32nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*DEC l*/
|
case 0x08: /*DEC l*/
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(temp - 1); if (abrt) return 1;
|
seteal(temp - 1); if (abrt) return 1;
|
||||||
setsub32nc(temp, 1);
|
setsub32nc(temp, 1);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*CALL*/
|
case 0x10: /*CALL*/
|
||||||
new_pc = geteal(); if (abrt) return 1;
|
new_pc = geteal(); if (abrt) return 1;
|
||||||
PUSH_L(pc); if (abrt) return 1;
|
PUSH_L(pc); if (abrt) return 1;
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*CALL far*/
|
case 0x18: /*CALL far*/
|
||||||
new_pc = readmeml(easeg, eaaddr);
|
new_pc = readmeml(easeg, eaaddr);
|
||||||
|
|
@ -322,14 +322,14 @@ static int opFF_l_a32(uint32_t fetchdat)
|
||||||
CALL_FAR_l(new_cs, new_pc);
|
CALL_FAR_l(new_cs, new_pc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= is486 ? 17 : 22;
|
CLOCK_CYCLES(is486 ? 17 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*JMP*/
|
case 0x20: /*JMP*/
|
||||||
new_pc = geteal(); if (abrt) return 1;
|
new_pc = geteal(); if (abrt) return 1;
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
if (is486) cycles -= 5;
|
if (is486) CLOCK_CYCLES(5);
|
||||||
else cycles -= ((mod == 3) ? 7 : 10);
|
else CLOCK_CYCLES((mod == 3) ? 7 : 10);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*JMP far*/
|
case 0x28: /*JMP far*/
|
||||||
oxpc = pc;
|
oxpc = pc;
|
||||||
|
|
@ -338,12 +338,12 @@ static int opFF_l_a32(uint32_t fetchdat)
|
||||||
pc = new_pc;
|
pc = new_pc;
|
||||||
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
loadcsjmp(new_cs, oxpc); if (abrt) return 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= is486 ? 13 : 12;
|
CLOCK_CYCLES(is486 ? 13 : 12);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*PUSH l*/
|
case 0x30: /*PUSH l*/
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
PUSH_L(temp);
|
PUSH_L(temp);
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ static int opCMC(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
flags ^= C_FLAG;
|
flags ^= C_FLAG;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11,13 +11,13 @@ static int opCLC(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
flags &= ~C_FLAG;
|
flags &= ~C_FLAG;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCLD(uint32_t fetchdat)
|
static int opCLD(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags &= ~D_FLAG;
|
flags &= ~D_FLAG;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCLI(uint32_t fetchdat)
|
static int opCLI(uint32_t fetchdat)
|
||||||
|
|
@ -32,7 +32,7 @@ static int opCLI(uint32_t fetchdat)
|
||||||
|
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -40,13 +40,13 @@ static int opSTC(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
flags |= C_FLAG;
|
flags |= C_FLAG;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSTD(uint32_t fetchdat)
|
static int opSTD(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags |= D_FLAG;
|
flags |= D_FLAG;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSTI(uint32_t fetchdat)
|
static int opSTI(uint32_t fetchdat)
|
||||||
|
|
@ -61,7 +61,7 @@ static int opSTI(uint32_t fetchdat)
|
||||||
|
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -69,14 +69,14 @@ static int opSAHF(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
flags = (flags & 0xff00) | (AH & 0xd5) | 2;
|
flags = (flags & 0xff00) | (AH & 0xd5) | 2;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLAHF(uint32_t fetchdat)
|
static int opLAHF(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
AH = flags & 0xff;
|
AH = flags & 0xff;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,7 +89,7 @@ static int opPUSHF(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
PUSH_W(flags);
|
PUSH_W(flags);
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPUSHFD(uint32_t fetchdat)
|
static int opPUSHFD(uint32_t fetchdat)
|
||||||
|
|
@ -104,7 +104,7 @@ static int opPUSHFD(uint32_t fetchdat)
|
||||||
else tempw = eflags & 4;
|
else tempw = eflags & 4;
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
PUSH_L(flags | (tempw << 16));
|
PUSH_L(flags | (tempw << 16));
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -126,7 +126,7 @@ static int opPOPF_286(uint32_t fetchdat)
|
||||||
else flags = (flags & 0x3200) | (tempw & 0x4dd5) | 2;
|
else flags = (flags & 0x3200) | (tempw & 0x4dd5) | 2;
|
||||||
flags_extract();
|
flags_extract();
|
||||||
|
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opPOPF(uint32_t fetchdat)
|
static int opPOPF(uint32_t fetchdat)
|
||||||
|
|
@ -146,7 +146,7 @@ static int opPOPF(uint32_t fetchdat)
|
||||||
else flags = (flags & 0x3200) | (tempw & 0xcdd5) | 2;
|
else flags = (flags & 0x3200) | (tempw & 0xcdd5) | 2;
|
||||||
flags_extract();
|
flags_extract();
|
||||||
|
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opPOPFD(uint32_t fetchdat)
|
static int opPOPFD(uint32_t fetchdat)
|
||||||
|
|
@ -173,6 +173,6 @@ static int opPOPFD(uint32_t fetchdat)
|
||||||
|
|
||||||
flags_extract();
|
flags_extract();
|
||||||
|
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,6 @@ static int opWAIT(uint32_t fetchdat)
|
||||||
x86_int(7);
|
x86_int(7);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
{ \
|
{ \
|
||||||
setflags(reg, 1); \
|
setflags(reg, 1); \
|
||||||
reg += inc; \
|
reg += inc; \
|
||||||
cycles -= timing_rr; \
|
CLOCK_CYCLES(timing_rr); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,7 +61,7 @@ static int opINCDEC_b_a16(uint32_t fetchdat)
|
||||||
seteab(temp + 1); if (abrt) return 1;
|
seteab(temp + 1); if (abrt) return 1;
|
||||||
setadd8nc(temp, 1);
|
setadd8nc(temp, 1);
|
||||||
}
|
}
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opINCDEC_b_a32(uint32_t fetchdat)
|
static int opINCDEC_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -81,6 +81,6 @@ static int opINCDEC_b_a32(uint32_t fetchdat)
|
||||||
seteab(temp + 1); if (abrt) return 1;
|
seteab(temp + 1); if (abrt) return 1;
|
||||||
setadd8nc(temp, 1);
|
setadd8nc(temp, 1);
|
||||||
}
|
}
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ static int opINT3(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
x86_int_sw(3);
|
x86_int_sw(3);
|
||||||
cycles -= (is486) ? 44 : 59;
|
CLOCK_CYCLES((is486) ? 44 : 59);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -71,7 +71,7 @@ static int opINTO(uint32_t fetchdat)
|
||||||
x86_int_sw(4);
|
x86_int_sw(4);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ static int opIN_AL_imm(uint32_t fetchdat)
|
||||||
uint16_t port = (uint16_t)getbytef();
|
uint16_t port = (uint16_t)getbytef();
|
||||||
check_io_perm(port);
|
check_io_perm(port);
|
||||||
AL = inb(port);
|
AL = inb(port);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIN_AX_imm(uint32_t fetchdat)
|
static int opIN_AX_imm(uint32_t fetchdat)
|
||||||
|
|
@ -12,7 +12,7 @@ static int opIN_AX_imm(uint32_t fetchdat)
|
||||||
check_io_perm(port);
|
check_io_perm(port);
|
||||||
check_io_perm(port + 1);
|
check_io_perm(port + 1);
|
||||||
AX = inw(port);
|
AX = inw(port);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIN_EAX_imm(uint32_t fetchdat)
|
static int opIN_EAX_imm(uint32_t fetchdat)
|
||||||
|
|
@ -23,7 +23,7 @@ static int opIN_EAX_imm(uint32_t fetchdat)
|
||||||
check_io_perm(port + 2);
|
check_io_perm(port + 2);
|
||||||
check_io_perm(port + 3);
|
check_io_perm(port + 3);
|
||||||
EAX = inl(port);
|
EAX = inl(port);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ static int opOUT_AL_imm(uint32_t fetchdat)
|
||||||
uint16_t port = (uint16_t)getbytef();
|
uint16_t port = (uint16_t)getbytef();
|
||||||
check_io_perm(port);
|
check_io_perm(port);
|
||||||
outb(port, AL);
|
outb(port, AL);
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUT_AX_imm(uint32_t fetchdat)
|
static int opOUT_AX_imm(uint32_t fetchdat)
|
||||||
|
|
@ -41,7 +41,7 @@ static int opOUT_AX_imm(uint32_t fetchdat)
|
||||||
check_io_perm(port);
|
check_io_perm(port);
|
||||||
check_io_perm(port + 1);
|
check_io_perm(port + 1);
|
||||||
outw(port, AX);
|
outw(port, AX);
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUT_EAX_imm(uint32_t fetchdat)
|
static int opOUT_EAX_imm(uint32_t fetchdat)
|
||||||
|
|
@ -52,7 +52,7 @@ static int opOUT_EAX_imm(uint32_t fetchdat)
|
||||||
check_io_perm(port + 2);
|
check_io_perm(port + 2);
|
||||||
check_io_perm(port + 3);
|
check_io_perm(port + 3);
|
||||||
outl(port, EAX);
|
outl(port, EAX);
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ static int opIN_AL_DX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
check_io_perm(DX);
|
check_io_perm(DX);
|
||||||
AL = inb(DX);
|
AL = inb(DX);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIN_AX_DX(uint32_t fetchdat)
|
static int opIN_AX_DX(uint32_t fetchdat)
|
||||||
|
|
@ -68,7 +68,7 @@ static int opIN_AX_DX(uint32_t fetchdat)
|
||||||
check_io_perm(DX);
|
check_io_perm(DX);
|
||||||
check_io_perm(DX + 1);
|
check_io_perm(DX + 1);
|
||||||
AX = inw(DX);
|
AX = inw(DX);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIN_EAX_DX(uint32_t fetchdat)
|
static int opIN_EAX_DX(uint32_t fetchdat)
|
||||||
|
|
@ -78,7 +78,7 @@ static int opIN_EAX_DX(uint32_t fetchdat)
|
||||||
check_io_perm(DX + 2);
|
check_io_perm(DX + 2);
|
||||||
check_io_perm(DX + 3);
|
check_io_perm(DX + 3);
|
||||||
EAX = inl(DX);
|
EAX = inl(DX);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,7 +86,7 @@ static int opOUT_AL_DX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
check_io_perm(DX);
|
check_io_perm(DX);
|
||||||
outb(DX, AL);
|
outb(DX, AL);
|
||||||
cycles -= 11;
|
CLOCK_CYCLES(11);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUT_AX_DX(uint32_t fetchdat)
|
static int opOUT_AX_DX(uint32_t fetchdat)
|
||||||
|
|
@ -95,7 +95,7 @@ static int opOUT_AX_DX(uint32_t fetchdat)
|
||||||
check_io_perm(DX);
|
check_io_perm(DX);
|
||||||
check_io_perm(DX + 1);
|
check_io_perm(DX + 1);
|
||||||
outw(DX, AX);
|
outw(DX, AX);
|
||||||
cycles -= 11;
|
CLOCK_CYCLES(11);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUT_EAX_DX(uint32_t fetchdat)
|
static int opOUT_EAX_DX(uint32_t fetchdat)
|
||||||
|
|
@ -105,6 +105,6 @@ static int opOUT_EAX_DX(uint32_t fetchdat)
|
||||||
check_io_perm(DX + 2);
|
check_io_perm(DX + 2);
|
||||||
check_io_perm(DX + 3);
|
check_io_perm(DX + 3);
|
||||||
outl(DX, EAX);
|
outl(DX, EAX);
|
||||||
cycles -= 11;
|
CLOCK_CYCLES(11);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@
|
||||||
static int opJ ## condition(uint32_t fetchdat) \
|
static int opJ ## condition(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
int8_t offset = (int8_t)getbytef(); \
|
int8_t offset = (int8_t)getbytef(); \
|
||||||
cycles -= timing_bnt; \
|
CLOCK_CYCLES(timing_bnt); \
|
||||||
if (cond_ ## condition) \
|
if (cond_ ## condition) \
|
||||||
{ \
|
{ \
|
||||||
pc += offset; \
|
pc += offset; \
|
||||||
cycles -= timing_bt; \
|
CLOCK_CYCLES_ALWAYS(timing_bt); \
|
||||||
CPU_BLOCK_END(); \
|
CPU_BLOCK_END(); \
|
||||||
return 1; \
|
return 1; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -33,11 +33,11 @@
|
||||||
static int opJ ## condition ## _w(uint32_t fetchdat) \
|
static int opJ ## condition ## _w(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
int16_t offset = (int16_t)getwordf(); \
|
int16_t offset = (int16_t)getwordf(); \
|
||||||
cycles -= timing_bnt; \
|
CLOCK_CYCLES(timing_bnt); \
|
||||||
if (cond_ ## condition) \
|
if (cond_ ## condition) \
|
||||||
{ \
|
{ \
|
||||||
pc += offset; \
|
pc += offset; \
|
||||||
cycles -= timing_bt; \
|
CLOCK_CYCLES_ALWAYS(timing_bt); \
|
||||||
CPU_BLOCK_END(); \
|
CPU_BLOCK_END(); \
|
||||||
return 1; \
|
return 1; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -47,11 +47,11 @@
|
||||||
static int opJ ## condition ## _l(uint32_t fetchdat) \
|
static int opJ ## condition ## _l(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
uint32_t offset = getlong(); if (abrt) return 1; \
|
uint32_t offset = getlong(); if (abrt) return 1; \
|
||||||
cycles -= timing_bnt; \
|
CLOCK_CYCLES(timing_bnt); \
|
||||||
if (cond_ ## condition) \
|
if (cond_ ## condition) \
|
||||||
{ \
|
{ \
|
||||||
pc += offset; \
|
pc += offset; \
|
||||||
cycles -= timing_bt; \
|
CLOCK_CYCLES_ALWAYS(timing_bt); \
|
||||||
CPU_BLOCK_END(); \
|
CPU_BLOCK_END(); \
|
||||||
return 1; \
|
return 1; \
|
||||||
} \
|
} \
|
||||||
|
|
@ -81,7 +81,7 @@ static int opLOOPNE_w(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
CX--;
|
CX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (CX && !ZF_SET())
|
if (CX && !ZF_SET())
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -94,7 +94,7 @@ static int opLOOPNE_l(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
ECX--;
|
ECX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (ECX && !ZF_SET())
|
if (ECX && !ZF_SET())
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -108,7 +108,7 @@ static int opLOOPE_w(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
CX--;
|
CX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (CX && ZF_SET())
|
if (CX && ZF_SET())
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -121,7 +121,7 @@ static int opLOOPE_l(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
ECX--;
|
ECX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (ECX && ZF_SET())
|
if (ECX && ZF_SET())
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -135,7 +135,7 @@ static int opLOOP_w(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
CX--;
|
CX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (CX)
|
if (CX)
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -148,7 +148,7 @@ static int opLOOP_l(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
ECX--;
|
ECX--;
|
||||||
cycles -= (is486) ? 7 : 11;
|
CLOCK_CYCLES((is486) ? 7 : 11);
|
||||||
if (ECX)
|
if (ECX)
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
|
|
@ -161,11 +161,11 @@ static int opLOOP_l(uint32_t fetchdat)
|
||||||
static int opJCXZ(uint32_t fetchdat)
|
static int opJCXZ(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
if (!CX)
|
if (!CX)
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -174,11 +174,11 @@ static int opJCXZ(uint32_t fetchdat)
|
||||||
static int opJECXZ(uint32_t fetchdat)
|
static int opJECXZ(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
if (!ECX)
|
if (!ECX)
|
||||||
{
|
{
|
||||||
pc += offset;
|
pc += offset;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -191,7 +191,7 @@ static int opJMP_r8(uint32_t fetchdat)
|
||||||
int8_t offset = (int8_t)getbytef();
|
int8_t offset = (int8_t)getbytef();
|
||||||
pc += offset;
|
pc += offset;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 3 : 7;
|
CLOCK_CYCLES((is486) ? 3 : 7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opJMP_r16(uint32_t fetchdat)
|
static int opJMP_r16(uint32_t fetchdat)
|
||||||
|
|
@ -199,7 +199,7 @@ static int opJMP_r16(uint32_t fetchdat)
|
||||||
int16_t offset = (int16_t)getwordf();
|
int16_t offset = (int16_t)getwordf();
|
||||||
pc += offset;
|
pc += offset;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 3 : 7;
|
CLOCK_CYCLES((is486) ? 3 : 7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opJMP_r32(uint32_t fetchdat)
|
static int opJMP_r32(uint32_t fetchdat)
|
||||||
|
|
@ -207,7 +207,7 @@ static int opJMP_r32(uint32_t fetchdat)
|
||||||
int32_t offset = (int32_t)getlong(); if (abrt) return 1;
|
int32_t offset = (int32_t)getlong(); if (abrt) return 1;
|
||||||
pc += offset;
|
pc += offset;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 3 : 7;
|
CLOCK_CYCLES((is486) ? 3 : 7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ static int opJMP_far_a16(uint32_t fetchdat)
|
||||||
pc = addr;
|
pc = addr;
|
||||||
loadcsjmp(seg, oxpc);
|
loadcsjmp(seg, oxpc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 17 : 12;
|
CLOCK_CYCLES((is486) ? 17 : 12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opJMP_far_a32(uint32_t fetchdat)
|
static int opJMP_far_a32(uint32_t fetchdat)
|
||||||
|
|
@ -230,7 +230,7 @@ static int opJMP_far_a32(uint32_t fetchdat)
|
||||||
pc = addr;
|
pc = addr;
|
||||||
loadcsjmp(seg, oxpc);
|
loadcsjmp(seg, oxpc);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 17 : 12;
|
CLOCK_CYCLES((is486) ? 17 : 12);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -240,7 +240,7 @@ static int opCALL_r16(uint32_t fetchdat)
|
||||||
PUSH_W(pc);
|
PUSH_W(pc);
|
||||||
pc += addr;
|
pc += addr;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 3 : 7;
|
CLOCK_CYCLES((is486) ? 3 : 7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCALL_r32(uint32_t fetchdat)
|
static int opCALL_r32(uint32_t fetchdat)
|
||||||
|
|
@ -249,7 +249,7 @@ static int opCALL_r32(uint32_t fetchdat)
|
||||||
PUSH_L(pc);
|
PUSH_L(pc);
|
||||||
pc += addr;
|
pc += addr;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
cycles -= (is486) ? 3 : 7;
|
CLOCK_CYCLES((is486) ? 3 : 7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -261,7 +261,7 @@ static int opRET_w(uint32_t fetchdat)
|
||||||
pc = ret;
|
pc = ret;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= (is486) ? 5 : 10;
|
CLOCK_CYCLES((is486) ? 5 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opRET_l(uint32_t fetchdat)
|
static int opRET_l(uint32_t fetchdat)
|
||||||
|
|
@ -272,7 +272,7 @@ static int opRET_l(uint32_t fetchdat)
|
||||||
pc = ret;
|
pc = ret;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= (is486) ? 5 : 10;
|
CLOCK_CYCLES((is486) ? 5 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,7 +287,7 @@ static int opRET_w_imm(uint32_t fetchdat)
|
||||||
pc = ret;
|
pc = ret;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= (is486) ? 5 : 10;
|
CLOCK_CYCLES((is486) ? 5 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opRET_l_imm(uint32_t fetchdat)
|
static int opRET_l_imm(uint32_t fetchdat)
|
||||||
|
|
@ -301,7 +301,7 @@ static int opRET_l_imm(uint32_t fetchdat)
|
||||||
pc = ret;
|
pc = ret;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
cycles -= (is486) ? 5 : 10;
|
CLOCK_CYCLES((is486) ? 5 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,38 @@
|
||||||
static int opCBW(uint32_t fetchdat)
|
static int opCBW(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
AH = (AL & 0x80) ? 0xff : 0;
|
AH = (AL & 0x80) ? 0xff : 0;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCWDE(uint32_t fetchdat)
|
static int opCWDE(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
EAX = (AX & 0x8000) ? (0xffff0000 | AX) : AX;
|
EAX = (AX & 0x8000) ? (0xffff0000 | AX) : AX;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCWD(uint32_t fetchdat)
|
static int opCWD(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
DX = (AX & 0x8000) ? 0xFFFF : 0;
|
DX = (AX & 0x8000) ? 0xFFFF : 0;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCDQ(uint32_t fetchdat)
|
static int opCDQ(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
EDX = (EAX & 0x80000000) ? 0xffffffff : 0;
|
EDX = (EAX & 0x80000000) ? 0xffffffff : 0;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opNOP(uint32_t fetchdat)
|
static int opNOP(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
cycles -= (is486) ? 1 : 3;
|
CLOCK_CYCLES((is486) ? 1 : 3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opSETALC(uint32_t fetchdat)
|
static int opSETALC(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
AL = (CF_SET()) ? 0xff : 0;
|
AL = (CF_SET()) ? 0xff : 0;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,24 +52,24 @@ static int opF6_a16(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST b,#8*/
|
case 0x00: /*TEST b,#8*/
|
||||||
src = readmemb(cs, pc); pc++; if (abrt) return 1;
|
src = readmemb(cs, pc); pc++; if (abrt) return 1;
|
||||||
setznp8(src & dst);
|
setznp8(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT b*/
|
case 0x10: /*NOT b*/
|
||||||
seteab(~dst); if (abrt) return 1;
|
seteab(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG b*/
|
case 0x18: /*NEG b*/
|
||||||
seteab(0 - dst); if (abrt) return 1;
|
seteab(0 - dst); if (abrt) return 1;
|
||||||
setsub8(0, dst);
|
setsub8(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL AL,b*/
|
case 0x20: /*MUL AL,b*/
|
||||||
AX = AL * dst;
|
AX = AL * dst;
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (AH) flags |= (C_FLAG | V_FLAG);
|
if (AH) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 13;
|
CLOCK_CYCLES(13);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL AL,b*/
|
case 0x28: /*IMUL AL,b*/
|
||||||
tempws = (int)((int8_t)AL) * (int)((int8_t)dst);
|
tempws = (int)((int8_t)AL) * (int)((int8_t)dst);
|
||||||
|
|
@ -77,7 +77,7 @@ static int opF6_a16(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int16_t)AX >> 7) != 0 && ((int16_t)AX >> 7) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int16_t)AX >> 7) != 0 && ((int16_t)AX >> 7) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV AL,b*/
|
case 0x30: /*DIV AL,b*/
|
||||||
src16 = AX;
|
src16 = AX;
|
||||||
|
|
@ -96,7 +96,7 @@ static int opF6_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= is486 ? 16 : 14;
|
CLOCK_CYCLES(is486 ? 16 : 14);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV AL,b*/
|
case 0x38: /*IDIV AL,b*/
|
||||||
tempws = (int)(int16_t)AX;
|
tempws = (int)(int16_t)AX;
|
||||||
|
|
@ -117,7 +117,7 @@ static int opF6_a16(uint32_t fetchdat)
|
||||||
// pclog("IDIVb exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
// pclog("IDIVb exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= 19;
|
CLOCK_CYCLES(19);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -140,24 +140,24 @@ static int opF6_a32(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST b,#8*/
|
case 0x00: /*TEST b,#8*/
|
||||||
src = readmemb(cs, pc); pc++; if (abrt) return 1;
|
src = readmemb(cs, pc); pc++; if (abrt) return 1;
|
||||||
setznp8(src & dst);
|
setznp8(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT b*/
|
case 0x10: /*NOT b*/
|
||||||
seteab(~dst); if (abrt) return 1;
|
seteab(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG b*/
|
case 0x18: /*NEG b*/
|
||||||
seteab(0 - dst); if (abrt) return 1;
|
seteab(0 - dst); if (abrt) return 1;
|
||||||
setsub8(0, dst);
|
setsub8(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL AL,b*/
|
case 0x20: /*MUL AL,b*/
|
||||||
AX = AL * dst;
|
AX = AL * dst;
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (AH) flags |= (C_FLAG | V_FLAG);
|
if (AH) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 13;
|
CLOCK_CYCLES(13);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL AL,b*/
|
case 0x28: /*IMUL AL,b*/
|
||||||
tempws = (int)((int8_t)AL) * (int)((int8_t)dst);
|
tempws = (int)((int8_t)AL) * (int)((int8_t)dst);
|
||||||
|
|
@ -165,7 +165,7 @@ static int opF6_a32(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int16_t)AX >> 7) != 0 && ((int16_t)AX >> 7) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int16_t)AX >> 7) != 0 && ((int16_t)AX >> 7) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV AL,b*/
|
case 0x30: /*DIV AL,b*/
|
||||||
src16 = AX;
|
src16 = AX;
|
||||||
|
|
@ -184,7 +184,7 @@ static int opF6_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= is486 ? 16 : 14;
|
CLOCK_CYCLES(is486 ? 16 : 14);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV AL,b*/
|
case 0x38: /*IDIV AL,b*/
|
||||||
tempws = (int)(int16_t)AX;
|
tempws = (int)(int16_t)AX;
|
||||||
|
|
@ -205,7 +205,7 @@ static int opF6_a32(uint32_t fetchdat)
|
||||||
// pclog("IDIVb exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
// pclog("IDIVb exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= 19;
|
CLOCK_CYCLES(19);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -231,17 +231,17 @@ static int opF7_w_a16(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST w*/
|
case 0x00: /*TEST w*/
|
||||||
src = getword(); if (abrt) return 1;
|
src = getword(); if (abrt) return 1;
|
||||||
setznp16(src & dst);
|
setznp16(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT w*/
|
case 0x10: /*NOT w*/
|
||||||
seteaw(~dst); if (abrt) return 1;
|
seteaw(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG w*/
|
case 0x18: /*NEG w*/
|
||||||
seteaw(0 - dst); if (abrt) return 1;
|
seteaw(0 - dst); if (abrt) return 1;
|
||||||
setsub16(0, dst);
|
setsub16(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL AX,w*/
|
case 0x20: /*MUL AX,w*/
|
||||||
templ = AX * dst;
|
templ = AX * dst;
|
||||||
|
|
@ -250,7 +250,7 @@ static int opF7_w_a16(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (DX) flags |= (C_FLAG | V_FLAG);
|
if (DX) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 21;
|
CLOCK_CYCLES(21);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL AX,w*/
|
case 0x28: /*IMUL AX,w*/
|
||||||
templ = (int)((int16_t)AX) * (int)((int16_t)dst);
|
templ = (int)((int16_t)AX) * (int)((int16_t)dst);
|
||||||
|
|
@ -259,7 +259,7 @@ static int opF7_w_a16(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int32_t)templ >> 15) != 0 && ((int32_t)templ >> 15) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int32_t)templ >> 15) != 0 && ((int32_t)templ >> 15) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 22;
|
CLOCK_CYCLES(22);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV AX,w*/
|
case 0x30: /*DIV AX,w*/
|
||||||
templ = (DX << 16) | AX;
|
templ = (DX << 16) | AX;
|
||||||
|
|
@ -275,7 +275,7 @@ static int opF7_w_a16(uint32_t fetchdat)
|
||||||
// fatal("DIVw BY 0 %04X:%04X %i\n",cs>>4,pc,ins);
|
// fatal("DIVw BY 0 %04X:%04X %i\n",cs>>4,pc,ins);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= is486 ? 24 : 22;
|
CLOCK_CYCLES(is486 ? 24 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV AX,w*/
|
case 0x38: /*IDIV AX,w*/
|
||||||
tempws = (int)((DX << 16)|AX);
|
tempws = (int)((DX << 16)|AX);
|
||||||
|
|
@ -292,7 +292,7 @@ static int opF7_w_a16(uint32_t fetchdat)
|
||||||
// pclog("IDIVw exception - %X / %08X = %X\n",tempws, dst, tempws2);
|
// pclog("IDIVw exception - %X / %08X = %X\n",tempws, dst, tempws2);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= 27;
|
CLOCK_CYCLES(27);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -315,17 +315,17 @@ static int opF7_w_a32(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST w*/
|
case 0x00: /*TEST w*/
|
||||||
src = getword(); if (abrt) return 1;
|
src = getword(); if (abrt) return 1;
|
||||||
setznp16(src & dst);
|
setznp16(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT w*/
|
case 0x10: /*NOT w*/
|
||||||
seteaw(~dst); if (abrt) return 1;
|
seteaw(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG w*/
|
case 0x18: /*NEG w*/
|
||||||
seteaw(0 - dst); if (abrt) return 1;
|
seteaw(0 - dst); if (abrt) return 1;
|
||||||
setsub16(0, dst);
|
setsub16(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mm;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mm);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL AX,w*/
|
case 0x20: /*MUL AX,w*/
|
||||||
templ = AX * dst;
|
templ = AX * dst;
|
||||||
|
|
@ -334,7 +334,7 @@ static int opF7_w_a32(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (DX) flags |= (C_FLAG | V_FLAG);
|
if (DX) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 21;
|
CLOCK_CYCLES(21);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL AX,w*/
|
case 0x28: /*IMUL AX,w*/
|
||||||
templ = (int)((int16_t)AX) * (int)((int16_t)dst);
|
templ = (int)((int16_t)AX) * (int)((int16_t)dst);
|
||||||
|
|
@ -343,7 +343,7 @@ static int opF7_w_a32(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int32_t)templ >> 15) != 0 && ((int32_t)templ >> 15) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int32_t)templ >> 15) != 0 && ((int32_t)templ >> 15) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 22;
|
CLOCK_CYCLES(22);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV AX,w*/
|
case 0x30: /*DIV AX,w*/
|
||||||
templ = (DX << 16) | AX;
|
templ = (DX << 16) | AX;
|
||||||
|
|
@ -359,7 +359,7 @@ static int opF7_w_a32(uint32_t fetchdat)
|
||||||
// fatal("DIVw BY 0 %04X:%04X %i\n",cs>>4,pc,ins);
|
// fatal("DIVw BY 0 %04X:%04X %i\n",cs>>4,pc,ins);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= is486 ? 24 : 22;
|
CLOCK_CYCLES(is486 ? 24 : 22);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV AX,w*/
|
case 0x38: /*IDIV AX,w*/
|
||||||
tempws = (int)((DX << 16)|AX);
|
tempws = (int)((DX << 16)|AX);
|
||||||
|
|
@ -376,7 +376,7 @@ static int opF7_w_a32(uint32_t fetchdat)
|
||||||
// pclog("IDIVw exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
// pclog("IDIVw exception - %X / %08X = %X\n", tempws, dst, tempws2);
|
||||||
x86_int(0);
|
x86_int(0);
|
||||||
}
|
}
|
||||||
cycles -= 27;
|
CLOCK_CYCLES(27);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -399,17 +399,17 @@ static int opF7_l_a16(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST l*/
|
case 0x00: /*TEST l*/
|
||||||
src = getlong(); if (abrt) return 1;
|
src = getlong(); if (abrt) return 1;
|
||||||
setznp32(src & dst);
|
setznp32(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT l*/
|
case 0x10: /*NOT l*/
|
||||||
seteal(~dst); if (abrt) return 1;
|
seteal(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mml);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG l*/
|
case 0x18: /*NEG l*/
|
||||||
seteal(0 - dst); if (abrt) return 1;
|
seteal(0 - dst); if (abrt) return 1;
|
||||||
setsub32(0, dst);
|
setsub32(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mml);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL EAX,l*/
|
case 0x20: /*MUL EAX,l*/
|
||||||
temp64 = (uint64_t)EAX * (uint64_t)dst;
|
temp64 = (uint64_t)EAX * (uint64_t)dst;
|
||||||
|
|
@ -418,7 +418,7 @@ static int opF7_l_a16(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (EDX) flags |= (C_FLAG|V_FLAG);
|
if (EDX) flags |= (C_FLAG|V_FLAG);
|
||||||
else flags &= ~(C_FLAG|V_FLAG);
|
else flags &= ~(C_FLAG|V_FLAG);
|
||||||
cycles -= 21;
|
CLOCK_CYCLES(21);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL EAX,l*/
|
case 0x28: /*IMUL EAX,l*/
|
||||||
temp64 = (int64_t)(int32_t)EAX * (int64_t)(int32_t)dst;
|
temp64 = (int64_t)(int32_t)EAX * (int64_t)(int32_t)dst;
|
||||||
|
|
@ -427,19 +427,19 @@ static int opF7_l_a16(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int64_t)temp64 >> 31) != 0 && ((int64_t)temp64 >> 31) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int64_t)temp64 >> 31) != 0 && ((int64_t)temp64 >> 31) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 38;
|
CLOCK_CYCLES(38);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV EAX,l*/
|
case 0x30: /*DIV EAX,l*/
|
||||||
if (divl(dst))
|
if (divl(dst))
|
||||||
return 1;
|
return 1;
|
||||||
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
||||||
cycles -= (is486) ? 40 : 38;
|
CLOCK_CYCLES((is486) ? 40 : 38);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV EAX,l*/
|
case 0x38: /*IDIV EAX,l*/
|
||||||
if (idivl((int32_t)dst))
|
if (idivl((int32_t)dst))
|
||||||
return 1;
|
return 1;
|
||||||
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
||||||
cycles -= 43;
|
CLOCK_CYCLES(43);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -461,17 +461,17 @@ static int opF7_l_a32(uint32_t fetchdat)
|
||||||
case 0x00: /*TEST l*/
|
case 0x00: /*TEST l*/
|
||||||
src = getlong(); if (abrt) return 1;
|
src = getlong(); if (abrt) return 1;
|
||||||
setznp32(src & dst);
|
setznp32(src & dst);
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 2);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 2);
|
||||||
else cycles -= ((mod == 3) ? 2 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*NOT l*/
|
case 0x10: /*NOT l*/
|
||||||
seteal(~dst); if (abrt) return 1;
|
seteal(~dst); if (abrt) return 1;
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mml);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*NEG l*/
|
case 0x18: /*NEG l*/
|
||||||
seteal(0 - dst); if (abrt) return 1;
|
seteal(0 - dst); if (abrt) return 1;
|
||||||
setsub32(0, dst);
|
setsub32(0, dst);
|
||||||
cycles -= (mod == 3) ? timing_rr : timing_mml;
|
CLOCK_CYCLES((mod == 3) ? timing_rr : timing_mml);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*MUL EAX,l*/
|
case 0x20: /*MUL EAX,l*/
|
||||||
temp64 = (uint64_t)EAX * (uint64_t)dst;
|
temp64 = (uint64_t)EAX * (uint64_t)dst;
|
||||||
|
|
@ -480,7 +480,7 @@ static int opF7_l_a32(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (EDX) flags |= (C_FLAG|V_FLAG);
|
if (EDX) flags |= (C_FLAG|V_FLAG);
|
||||||
else flags &= ~(C_FLAG|V_FLAG);
|
else flags &= ~(C_FLAG|V_FLAG);
|
||||||
cycles -= 21;
|
CLOCK_CYCLES(21);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*IMUL EAX,l*/
|
case 0x28: /*IMUL EAX,l*/
|
||||||
temp64 = (int64_t)(int32_t)EAX * (int64_t)(int32_t)dst;
|
temp64 = (int64_t)(int32_t)EAX * (int64_t)(int32_t)dst;
|
||||||
|
|
@ -489,19 +489,19 @@ static int opF7_l_a32(uint32_t fetchdat)
|
||||||
flags_rebuild();
|
flags_rebuild();
|
||||||
if (((int64_t)temp64 >> 31) != 0 && ((int64_t)temp64 >> 31) != -1) flags |= (C_FLAG | V_FLAG);
|
if (((int64_t)temp64 >> 31) != 0 && ((int64_t)temp64 >> 31) != -1) flags |= (C_FLAG | V_FLAG);
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
cycles -= 38;
|
CLOCK_CYCLES(38);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*DIV EAX,l*/
|
case 0x30: /*DIV EAX,l*/
|
||||||
if (divl(dst))
|
if (divl(dst))
|
||||||
return 1;
|
return 1;
|
||||||
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
||||||
cycles -= (is486) ? 40 : 38;
|
CLOCK_CYCLES((is486) ? 40 : 38);
|
||||||
break;
|
break;
|
||||||
case 0x38: /*IDIV EAX,l*/
|
case 0x38: /*IDIV EAX,l*/
|
||||||
if (idivl((int32_t)dst))
|
if (idivl((int32_t)dst))
|
||||||
return 1;
|
return 1;
|
||||||
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
if (!cpu_iscyrix) setznp32(EAX); /*Not a Cyrix*/
|
||||||
cycles -= 43;
|
CLOCK_CYCLES(43);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -521,11 +521,11 @@ static int opHLT(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
if (!((flags&I_FLAG) && pic_intpending))
|
if (!((flags&I_FLAG) && pic_intpending))
|
||||||
{
|
{
|
||||||
cycles -= 100;
|
CLOCK_CYCLES(100);
|
||||||
pc--;
|
pc--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
|
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
|
|
||||||
|
|
@ -535,7 +535,7 @@ static int opHLT(uint32_t fetchdat)
|
||||||
|
|
||||||
static int opLOCK(uint32_t fetchdat)
|
static int opLOCK(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -556,7 +556,7 @@ static int opBOUND_w_a16(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= is486 ? 7 : 10;
|
CLOCK_CYCLES(is486 ? 7 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBOUND_w_a32(uint32_t fetchdat)
|
static int opBOUND_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -574,7 +574,7 @@ static int opBOUND_w_a32(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= is486 ? 7 : 10;
|
CLOCK_CYCLES(is486 ? 7 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -593,7 +593,7 @@ static int opBOUND_l_a16(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= is486 ? 7 : 10;
|
CLOCK_CYCLES(is486 ? 7 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opBOUND_l_a32(uint32_t fetchdat)
|
static int opBOUND_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -611,7 +611,7 @@ static int opBOUND_l_a32(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= is486 ? 7 : 10;
|
CLOCK_CYCLES(is486 ? 7 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -625,7 +625,7 @@ static int opCLTS(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cr0 &= ~8;
|
cr0 &= ~8;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -636,7 +636,7 @@ static int opINVD(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cycles -= 1000;
|
CLOCK_CYCLES(1000);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -647,7 +647,7 @@ static int opWBINVD(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
cycles -= 10000;
|
CLOCK_CYCLES(10000);
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -675,7 +675,7 @@ static int opLOADALL(uint32_t fetchdat)
|
||||||
cs = readmemw(0, 0x83C) | (readmemb(0, 0x83E) << 16);
|
cs = readmemw(0, 0x83C) | (readmemb(0, 0x83E) << 16);
|
||||||
ss = readmemw(0, 0x842) | (readmemb(0, 0x844) << 16);
|
ss = readmemw(0, 0x842) | (readmemb(0, 0x844) << 16);
|
||||||
ds = readmemw(0, 0x848) | (readmemb(0, 0x84A) << 16);
|
ds = readmemw(0, 0x848) | (readmemb(0, 0x84A) << 16);
|
||||||
cycles-=195;
|
CLOCK_CYCLES(195);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -684,7 +684,7 @@ static int opCPUID(uint32_t fetchdat)
|
||||||
if (CPUID)
|
if (CPUID)
|
||||||
{
|
{
|
||||||
cpu_CPUID();
|
cpu_CPUID();
|
||||||
cycles -= 9;
|
CLOCK_CYCLES(9);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
@ -697,7 +697,7 @@ static int opRDMSR(uint32_t fetchdat)
|
||||||
if (cpu_hasMSR)
|
if (cpu_hasMSR)
|
||||||
{
|
{
|
||||||
cpu_RDMSR();
|
cpu_RDMSR();
|
||||||
cycles -= 9;
|
CLOCK_CYCLES(9);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
@ -710,7 +710,7 @@ static int opWRMSR(uint32_t fetchdat)
|
||||||
if (cpu_hasMSR)
|
if (cpu_hasMSR)
|
||||||
{
|
{
|
||||||
cpu_WRMSR();
|
cpu_WRMSR();
|
||||||
cycles -= 9;
|
CLOCK_CYCLES(9);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@
|
||||||
if (mod == 3) \
|
if (mod == 3) \
|
||||||
{ \
|
{ \
|
||||||
src = MM[rm]; \
|
src = MM[rm]; \
|
||||||
cycles--; \
|
CLOCK_CYCLES(1); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
src.l[0] = readmeml(easeg, eaaddr); \
|
src.l[0] = readmeml(easeg, eaaddr); \
|
||||||
src.l[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1; \
|
src.l[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1; \
|
||||||
cycles -= 2; \
|
CLOCK_CYCLES(2); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MMX_ENTER() \
|
#define MMX_ENTER() \
|
||||||
|
|
@ -44,6 +44,6 @@ static int opEMMS(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
x87_emms();
|
x87_emms();
|
||||||
cycles -= 100; /*Guess*/
|
CLOCK_CYCLES(100); /*Guess*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,7 @@ static int opPMULLW_a16(uint32_t fetchdat)
|
||||||
MM[reg].w[1] *= MM[rm].w[1];
|
MM[reg].w[1] *= MM[rm].w[1];
|
||||||
MM[reg].w[2] *= MM[rm].w[2];
|
MM[reg].w[2] *= MM[rm].w[2];
|
||||||
MM[reg].w[3] *= MM[rm].w[3];
|
MM[reg].w[3] *= MM[rm].w[3];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -300,7 +300,7 @@ static int opPMULLW_a16(uint32_t fetchdat)
|
||||||
MM[reg].w[1] *= src.w[1];
|
MM[reg].w[1] *= src.w[1];
|
||||||
MM[reg].w[2] *= src.w[2];
|
MM[reg].w[2] *= src.w[2];
|
||||||
MM[reg].w[3] *= src.w[3];
|
MM[reg].w[3] *= src.w[3];
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -315,7 +315,7 @@ static int opPMULLW_a32(uint32_t fetchdat)
|
||||||
MM[reg].w[1] *= MM[rm].w[1];
|
MM[reg].w[1] *= MM[rm].w[1];
|
||||||
MM[reg].w[2] *= MM[rm].w[2];
|
MM[reg].w[2] *= MM[rm].w[2];
|
||||||
MM[reg].w[3] *= MM[rm].w[3];
|
MM[reg].w[3] *= MM[rm].w[3];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -327,7 +327,7 @@ static int opPMULLW_a32(uint32_t fetchdat)
|
||||||
MM[reg].w[1] *= src.w[1];
|
MM[reg].w[1] *= src.w[1];
|
||||||
MM[reg].w[2] *= src.w[2];
|
MM[reg].w[2] *= src.w[2];
|
||||||
MM[reg].w[3] *= src.w[3];
|
MM[reg].w[3] *= src.w[3];
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -343,7 +343,7 @@ static int opPMULHW_a16(uint32_t fetchdat)
|
||||||
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)MM[rm].sw[1]) >> 16;
|
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)MM[rm].sw[1]) >> 16;
|
||||||
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)MM[rm].sw[2]) >> 16;
|
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)MM[rm].sw[2]) >> 16;
|
||||||
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)MM[rm].sw[3]) >> 16;
|
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)MM[rm].sw[3]) >> 16;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -355,7 +355,7 @@ static int opPMULHW_a16(uint32_t fetchdat)
|
||||||
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)src.sw[1]) >> 16;
|
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)src.sw[1]) >> 16;
|
||||||
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)src.sw[2]) >> 16;
|
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)src.sw[2]) >> 16;
|
||||||
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)src.sw[3]) >> 16;
|
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)src.sw[3]) >> 16;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -370,7 +370,7 @@ static int opPMULHW_a32(uint32_t fetchdat)
|
||||||
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)MM[rm].sw[1]) >> 16;
|
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)MM[rm].sw[1]) >> 16;
|
||||||
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)MM[rm].sw[2]) >> 16;
|
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)MM[rm].sw[2]) >> 16;
|
||||||
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)MM[rm].sw[3]) >> 16;
|
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)MM[rm].sw[3]) >> 16;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -382,7 +382,7 @@ static int opPMULHW_a32(uint32_t fetchdat)
|
||||||
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)src.sw[1]) >> 16;
|
MM[reg].w[1] = ((int32_t)MM[reg].sw[1] * (int32_t)src.sw[1]) >> 16;
|
||||||
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)src.sw[2]) >> 16;
|
MM[reg].w[2] = ((int32_t)MM[reg].sw[2] * (int32_t)src.sw[2]) >> 16;
|
||||||
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)src.sw[3]) >> 16;
|
MM[reg].w[3] = ((int32_t)MM[reg].sw[3] * (int32_t)src.sw[3]) >> 16;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ static int opMOVD_l_mm_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
MM[reg].l[0] = regs[rm].l;
|
MM[reg].l[0] = regs[rm].l;
|
||||||
MM[reg].l[1] = 0;
|
MM[reg].l[1] = 0;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -17,7 +17,7 @@ static int opMOVD_l_mm_a16(uint32_t fetchdat)
|
||||||
MM[reg].l[0] = dst;
|
MM[reg].l[0] = dst;
|
||||||
MM[reg].l[1] = 0;
|
MM[reg].l[1] = 0;
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -30,7 +30,7 @@ static int opMOVD_l_mm_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
MM[reg].l[0] = regs[rm].l;
|
MM[reg].l[0] = regs[rm].l;
|
||||||
MM[reg].l[1] = 0;
|
MM[reg].l[1] = 0;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -40,7 +40,7 @@ static int opMOVD_l_mm_a32(uint32_t fetchdat)
|
||||||
MM[reg].l[0] = dst;
|
MM[reg].l[0] = dst;
|
||||||
MM[reg].l[1] = 0;
|
MM[reg].l[1] = 0;
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -53,13 +53,13 @@ static int opMOVD_mm_l_a16(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
regs[rm].l = MM[reg].l[0];
|
regs[rm].l = MM[reg].l[0];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 3);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 3);
|
||||||
writememl(easeg, eaaddr, MM[reg].l[0]); if (abrt) return 1;
|
writememl(easeg, eaaddr, MM[reg].l[0]); if (abrt) return 1;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -71,13 +71,13 @@ static int opMOVD_mm_l_a32(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
regs[rm].l = MM[reg].l[0];
|
regs[rm].l = MM[reg].l[0];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 3);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 3);
|
||||||
writememl(easeg, eaaddr, MM[reg].l[0]); if (abrt) return 1;
|
writememl(easeg, eaaddr, MM[reg].l[0]); if (abrt) return 1;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -90,7 +90,7 @@ static int opMOVQ_q_mm_a16(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[reg].q = MM[rm].q;
|
MM[reg].q = MM[rm].q;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -100,7 +100,7 @@ static int opMOVQ_q_mm_a16(uint32_t fetchdat)
|
||||||
dst[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1;
|
dst[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1;
|
||||||
MM[reg].l[0] = dst[0];
|
MM[reg].l[0] = dst[0];
|
||||||
MM[reg].l[1] = dst[1];
|
MM[reg].l[1] = dst[1];
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -112,7 +112,7 @@ static int opMOVQ_q_mm_a32(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[reg].q = MM[rm].q;
|
MM[reg].q = MM[rm].q;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -122,7 +122,7 @@ static int opMOVQ_q_mm_a32(uint32_t fetchdat)
|
||||||
dst[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1;
|
dst[1] = readmeml(easeg, eaaddr + 4); if (abrt) return 1;
|
||||||
MM[reg].l[0] = dst[0];
|
MM[reg].l[0] = dst[0];
|
||||||
MM[reg].l[1] = dst[1];
|
MM[reg].l[1] = dst[1];
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -135,14 +135,14 @@ static int opMOVQ_mm_q_a16(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[rm].q = MM[reg].q;
|
MM[rm].q = MM[reg].q;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 7);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 7);
|
||||||
writememl(easeg, eaaddr, MM[reg].l[0]);
|
writememl(easeg, eaaddr, MM[reg].l[0]);
|
||||||
writememl(easeg, eaaddr + 4, MM[reg].l[1]); if (abrt) return 1;
|
writememl(easeg, eaaddr + 4, MM[reg].l[1]); if (abrt) return 1;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -154,14 +154,14 @@ static int opMOVQ_mm_q_a32(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[rm].q = MM[reg].q;
|
MM[rm].q = MM[reg].q;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 7);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr + 7);
|
||||||
writememl(easeg, eaaddr, MM[reg].l[0]);
|
writememl(easeg, eaaddr, MM[reg].l[0]);
|
||||||
writememl(easeg, eaaddr + 4, MM[reg].l[1]); if (abrt) return 1;
|
writememl(easeg, eaaddr + 4, MM[reg].l[1]); if (abrt) return 1;
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ static int opPUNPCKLDQ_a16(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[reg].l[1] = MM[rm].l[0];
|
MM[reg].l[1] = MM[rm].l[0];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -15,7 +15,7 @@ static int opPUNPCKLDQ_a16(uint32_t fetchdat)
|
||||||
src = readmeml(easeg, eaaddr); if (abrt) return 0;
|
src = readmeml(easeg, eaaddr); if (abrt) return 0;
|
||||||
MM[reg].l[1] = src;
|
MM[reg].l[1] = src;
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ static int opPUNPCKLDQ_a32(uint32_t fetchdat)
|
||||||
if (mod == 3)
|
if (mod == 3)
|
||||||
{
|
{
|
||||||
MM[reg].l[1] = MM[rm].l[0];
|
MM[reg].l[1] = MM[rm].l[0];
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -36,7 +36,7 @@ static int opPUNPCKLDQ_a32(uint32_t fetchdat)
|
||||||
src = readmeml(easeg, eaaddr); if (abrt) return 0;
|
src = readmeml(easeg, eaaddr); if (abrt) return 0;
|
||||||
MM[reg].l[1] = src;
|
MM[reg].l[1] = src;
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,12 @@
|
||||||
if (mod == 3) \
|
if (mod == 3) \
|
||||||
{ \
|
{ \
|
||||||
shift = MM[rm].b[0]; \
|
shift = MM[rm].b[0]; \
|
||||||
cycles--; \
|
CLOCK_CYCLES(1); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
shift = readmemb(easeg, eaaddr); if (abrt) return 0; \
|
shift = readmemb(easeg, eaaddr); if (abrt) return 0; \
|
||||||
cycles -= 2; \
|
CLOCK_CYCLES(2); \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opPSxxW_imm(uint32_t fetchdat)
|
static int opPSxxW_imm(uint32_t fetchdat)
|
||||||
|
|
@ -58,7 +58,7 @@ static int opPSxxW_imm(uint32_t fetchdat)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -229,7 +229,7 @@ static int opPSxxD_imm(uint32_t fetchdat)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,7 +381,7 @@ static int opPSxxQ_imm(uint32_t fetchdat)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,98 +1,98 @@
|
||||||
static int opMOV_AL_imm(uint32_t fetchdat)
|
static int opMOV_AL_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
AL = getbytef();
|
AL = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_AH_imm(uint32_t fetchdat)
|
static int opMOV_AH_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
AH = getbytef();
|
AH = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_BL_imm(uint32_t fetchdat)
|
static int opMOV_BL_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
BL = getbytef();
|
BL = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_BH_imm(uint32_t fetchdat)
|
static int opMOV_BH_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
BH = getbytef();
|
BH = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_CL_imm(uint32_t fetchdat)
|
static int opMOV_CL_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
CL = getbytef();
|
CL = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_CH_imm(uint32_t fetchdat)
|
static int opMOV_CH_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
CH = getbytef();
|
CH = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_DL_imm(uint32_t fetchdat)
|
static int opMOV_DL_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
DL = getbytef();
|
DL = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_DH_imm(uint32_t fetchdat)
|
static int opMOV_DH_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
DH = getbytef();
|
DH = getbytef();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opMOV_AX_imm(uint32_t fetchdat)
|
static int opMOV_AX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
AX = getwordf();
|
AX = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_BX_imm(uint32_t fetchdat)
|
static int opMOV_BX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
BX = getwordf();
|
BX = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_CX_imm(uint32_t fetchdat)
|
static int opMOV_CX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
CX = getwordf();
|
CX = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_DX_imm(uint32_t fetchdat)
|
static int opMOV_DX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
DX = getwordf();
|
DX = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_SI_imm(uint32_t fetchdat)
|
static int opMOV_SI_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
SI = getwordf();
|
SI = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_DI_imm(uint32_t fetchdat)
|
static int opMOV_DI_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
DI = getwordf();
|
DI = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_BP_imm(uint32_t fetchdat)
|
static int opMOV_BP_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
BP = getwordf();
|
BP = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_SP_imm(uint32_t fetchdat)
|
static int opMOV_SP_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
SP = getwordf();
|
SP = getwordf();
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -100,56 +100,56 @@ static int opMOV_EAX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
EAX = templ;
|
EAX = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EBX_imm(uint32_t fetchdat)
|
static int opMOV_EBX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
EBX = templ;
|
EBX = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_ECX_imm(uint32_t fetchdat)
|
static int opMOV_ECX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
ECX = templ;
|
ECX = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EDX_imm(uint32_t fetchdat)
|
static int opMOV_EDX_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
EDX = templ;
|
EDX = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_ESI_imm(uint32_t fetchdat)
|
static int opMOV_ESI_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
ESI = templ;
|
ESI = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EDI_imm(uint32_t fetchdat)
|
static int opMOV_EDI_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
EDI = templ;
|
EDI = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EBP_imm(uint32_t fetchdat)
|
static int opMOV_EBP_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
EBP = templ;
|
EBP = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_ESP_imm(uint32_t fetchdat)
|
static int opMOV_ESP_imm(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t templ = getlong(); if (abrt) return 1;
|
uint32_t templ = getlong(); if (abrt) return 1;
|
||||||
ESP = templ;
|
ESP = templ;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -159,7 +159,7 @@ static int opMOV_b_imm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
temp = readmemb(cs,pc); pc++; if (abrt) return 1;
|
temp = readmemb(cs,pc); pc++; if (abrt) return 1;
|
||||||
seteab(temp);
|
seteab(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_b_imm_a32(uint32_t fetchdat)
|
static int opMOV_b_imm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -168,7 +168,7 @@ static int opMOV_b_imm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
temp = getbyte(); if (abrt) return 1;
|
temp = getbyte(); if (abrt) return 1;
|
||||||
seteab(temp);
|
seteab(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -178,7 +178,7 @@ static int opMOV_w_imm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
temp = getword(); if (abrt) return 1;
|
temp = getword(); if (abrt) return 1;
|
||||||
seteaw(temp);
|
seteaw(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_w_imm_a32(uint32_t fetchdat)
|
static int opMOV_w_imm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -187,7 +187,7 @@ static int opMOV_w_imm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
temp = getword(); if (abrt) return 1;
|
temp = getword(); if (abrt) return 1;
|
||||||
seteaw(temp);
|
seteaw(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_l_imm_a16(uint32_t fetchdat)
|
static int opMOV_l_imm_a16(uint32_t fetchdat)
|
||||||
|
|
@ -196,7 +196,7 @@ static int opMOV_l_imm_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
temp = getlong(); if (abrt) return 1;
|
temp = getlong(); if (abrt) return 1;
|
||||||
seteal(temp);
|
seteal(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_l_imm_a32(uint32_t fetchdat)
|
static int opMOV_l_imm_a32(uint32_t fetchdat)
|
||||||
|
|
@ -205,7 +205,7 @@ static int opMOV_l_imm_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
temp = getlong(); if (abrt) return 1;
|
temp = getlong(); if (abrt) return 1;
|
||||||
seteal(temp);
|
seteal(temp);
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -215,7 +215,7 @@ static int opMOV_AL_a16(uint32_t fetchdat)
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AL = temp;
|
AL = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_AL_a32(uint32_t fetchdat)
|
static int opMOV_AL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -223,7 +223,7 @@ static int opMOV_AL_a32(uint32_t fetchdat)
|
||||||
uint32_t addr = getlong();
|
uint32_t addr = getlong();
|
||||||
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AL = temp;
|
AL = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_AX_a16(uint32_t fetchdat)
|
static int opMOV_AX_a16(uint32_t fetchdat)
|
||||||
|
|
@ -231,7 +231,7 @@ static int opMOV_AX_a16(uint32_t fetchdat)
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
uint16_t temp = readmemw(ea_seg->base, addr); if (abrt) return 1;
|
uint16_t temp = readmemw(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AX = temp;
|
AX = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_AX_a32(uint32_t fetchdat)
|
static int opMOV_AX_a32(uint32_t fetchdat)
|
||||||
|
|
@ -239,7 +239,7 @@ static int opMOV_AX_a32(uint32_t fetchdat)
|
||||||
uint32_t addr = getlong();
|
uint32_t addr = getlong();
|
||||||
uint16_t temp = readmemw(ea_seg->base, addr); if (abrt) return 1;
|
uint16_t temp = readmemw(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AX = temp;
|
AX = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EAX_a16(uint32_t fetchdat)
|
static int opMOV_EAX_a16(uint32_t fetchdat)
|
||||||
|
|
@ -247,7 +247,7 @@ static int opMOV_EAX_a16(uint32_t fetchdat)
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
uint32_t temp = readmeml(ea_seg->base, addr); if (abrt) return 1;
|
uint32_t temp = readmeml(ea_seg->base, addr); if (abrt) return 1;
|
||||||
EAX = temp;
|
EAX = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_EAX_a32(uint32_t fetchdat)
|
static int opMOV_EAX_a32(uint32_t fetchdat)
|
||||||
|
|
@ -255,7 +255,7 @@ static int opMOV_EAX_a32(uint32_t fetchdat)
|
||||||
uint32_t addr = getlong();
|
uint32_t addr = getlong();
|
||||||
uint32_t temp = readmeml(ea_seg->base, addr); if (abrt) return 1;
|
uint32_t temp = readmeml(ea_seg->base, addr); if (abrt) return 1;
|
||||||
EAX = temp;
|
EAX = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -263,42 +263,42 @@ static int opMOV_a16_AL(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
writememb(ea_seg->base, addr, AL);
|
writememb(ea_seg->base, addr, AL);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_a32_AL(uint32_t fetchdat)
|
static int opMOV_a32_AL(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t addr = getlong();
|
uint32_t addr = getlong();
|
||||||
writememb(ea_seg->base, addr, AL);
|
writememb(ea_seg->base, addr, AL);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_a16_AX(uint32_t fetchdat)
|
static int opMOV_a16_AX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
writememw(ea_seg->base, addr, AX);
|
writememw(ea_seg->base, addr, AX);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_a32_AX(uint32_t fetchdat)
|
static int opMOV_a32_AX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t addr = getlong(); if (abrt) return 1;
|
uint32_t addr = getlong(); if (abrt) return 1;
|
||||||
writememw(ea_seg->base, addr, AX);
|
writememw(ea_seg->base, addr, AX);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_a16_EAX(uint32_t fetchdat)
|
static int opMOV_a16_EAX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t addr = getwordf();
|
uint16_t addr = getwordf();
|
||||||
writememl(ea_seg->base, addr, EAX);
|
writememl(ea_seg->base, addr, EAX);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_a32_EAX(uint32_t fetchdat)
|
static int opMOV_a32_EAX(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t addr = getlong(); if (abrt) return 1;
|
uint32_t addr = getlong(); if (abrt) return 1;
|
||||||
writememl(ea_seg->base, addr, EAX);
|
writememl(ea_seg->base, addr, EAX);
|
||||||
cycles -= (is486) ? 1 : 2;
|
CLOCK_CYCLES((is486) ? 1 : 2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -308,7 +308,7 @@ static int opLEA_w_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
ILLEGAL_ON(mod == 3);
|
ILLEGAL_ON(mod == 3);
|
||||||
regs[reg].w = eaaddr;
|
regs[reg].w = eaaddr;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLEA_w_a32(uint32_t fetchdat)
|
static int opLEA_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -316,7 +316,7 @@ static int opLEA_w_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
ILLEGAL_ON(mod == 3);
|
ILLEGAL_ON(mod == 3);
|
||||||
regs[reg].w = eaaddr;
|
regs[reg].w = eaaddr;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -325,7 +325,7 @@ static int opLEA_l_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
ILLEGAL_ON(mod == 3);
|
ILLEGAL_ON(mod == 3);
|
||||||
regs[reg].l = eaaddr & 0xffff;
|
regs[reg].l = eaaddr & 0xffff;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLEA_l_a32(uint32_t fetchdat)
|
static int opLEA_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -333,7 +333,7 @@ static int opLEA_l_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
ILLEGAL_ON(mod == 3);
|
ILLEGAL_ON(mod == 3);
|
||||||
regs[reg].l = eaaddr;
|
regs[reg].l = eaaddr;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -344,7 +344,7 @@ static int opXLAT_a16(uint32_t fetchdat)
|
||||||
uint32_t addr = (BX + AL)&0xFFFF;
|
uint32_t addr = (BX + AL)&0xFFFF;
|
||||||
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AL = temp;
|
AL = temp;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXLAT_a32(uint32_t fetchdat)
|
static int opXLAT_a32(uint32_t fetchdat)
|
||||||
|
|
@ -352,7 +352,7 @@ static int opXLAT_a32(uint32_t fetchdat)
|
||||||
uint32_t addr = EBX + AL;
|
uint32_t addr = EBX + AL;
|
||||||
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
uint8_t temp = readmemb(ea_seg->base, addr); if (abrt) return 1;
|
||||||
AL = temp;
|
AL = temp;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -362,14 +362,14 @@ static int opMOV_b_r_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
setr8(fetchdat & 7, getr8((fetchdat >> 3) & 7));
|
setr8(fetchdat & 7, getr8((fetchdat >> 3) & 7));
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr);
|
||||||
seteab(getr8(reg));
|
seteab(getr8(reg));
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -379,14 +379,14 @@ static int opMOV_b_r_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
setr8(fetchdat & 7, getr8((fetchdat >> 3) & 7));
|
setr8(fetchdat & 7, getr8((fetchdat >> 3) & 7));
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr);
|
||||||
seteab(getr8(reg));
|
seteab(getr8(reg));
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -396,14 +396,14 @@ static int opMOV_w_r_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[fetchdat & 7].w = regs[(fetchdat >> 3) & 7].w;
|
regs[fetchdat & 7].w = regs[(fetchdat >> 3) & 7].w;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr+1);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr+1);
|
||||||
seteaw(regs[reg].w);
|
seteaw(regs[reg].w);
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -413,14 +413,14 @@ static int opMOV_w_r_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[fetchdat & 7].w = regs[(fetchdat >> 3) & 7].w;
|
regs[fetchdat & 7].w = regs[(fetchdat >> 3) & 7].w;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr+1);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr+1);
|
||||||
seteaw(regs[reg].w);
|
seteaw(regs[reg].w);
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -430,14 +430,14 @@ static int opMOV_l_r_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[fetchdat & 7].l = regs[(fetchdat >> 3) & 7].l;
|
regs[fetchdat & 7].l = regs[(fetchdat >> 3) & 7].l;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr+3);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr+3);
|
||||||
seteal(regs[reg].l);
|
seteal(regs[reg].l);
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -447,14 +447,14 @@ static int opMOV_l_r_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[fetchdat & 7].l = regs[(fetchdat >> 3) & 7].l;
|
regs[fetchdat & 7].l = regs[(fetchdat >> 3) & 7].l;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
CHECK_WRITE(ea_seg, eaaddr, eaaddr+3);
|
CHECK_WRITE(ea_seg, eaaddr, eaaddr+3);
|
||||||
seteal(regs[reg].l);
|
seteal(regs[reg].l);
|
||||||
cycles -= is486 ? 1 : 2;
|
CLOCK_CYCLES(is486 ? 1 : 2);
|
||||||
}
|
}
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
@ -465,7 +465,7 @@ static int opMOV_r_b_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
setr8((fetchdat >> 3) & 7, getr8(fetchdat & 7));
|
setr8((fetchdat >> 3) & 7, getr8(fetchdat & 7));
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -474,7 +474,7 @@ static int opMOV_r_b_a16(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr);
|
CHECK_READ(ea_seg, eaaddr, eaaddr);
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
cycles -= is486 ? 1 : 4;
|
CLOCK_CYCLES(is486 ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -484,7 +484,7 @@ static int opMOV_r_b_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
setr8((fetchdat >> 3) & 7, getr8(fetchdat & 7));
|
setr8((fetchdat >> 3) & 7, getr8(fetchdat & 7));
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -493,7 +493,7 @@ static int opMOV_r_b_a32(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr);
|
CHECK_READ(ea_seg, eaaddr, eaaddr);
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
cycles -= is486 ? 1 : 4;
|
CLOCK_CYCLES(is486 ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -503,7 +503,7 @@ static int opMOV_r_w_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[(fetchdat >> 3) & 7].w = regs[fetchdat & 7].w;
|
regs[(fetchdat >> 3) & 7].w = regs[fetchdat & 7].w;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -512,7 +512,7 @@ static int opMOV_r_w_a16(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr+1);
|
CHECK_READ(ea_seg, eaaddr, eaaddr+1);
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -522,7 +522,7 @@ static int opMOV_r_w_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[(fetchdat >> 3) & 7].w = regs[fetchdat & 7].w;
|
regs[(fetchdat >> 3) & 7].w = regs[fetchdat & 7].w;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -531,7 +531,7 @@ static int opMOV_r_w_a32(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr+1);
|
CHECK_READ(ea_seg, eaaddr, eaaddr+1);
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
cycles -= (is486) ? 1 : 4;
|
CLOCK_CYCLES((is486) ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -541,7 +541,7 @@ static int opMOV_r_l_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[(fetchdat >> 3) & 7].l = regs[fetchdat & 7].l;
|
regs[(fetchdat >> 3) & 7].l = regs[fetchdat & 7].l;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -550,7 +550,7 @@ static int opMOV_r_l_a16(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr+3);
|
CHECK_READ(ea_seg, eaaddr, eaaddr+3);
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
cycles -= is486 ? 1 : 4;
|
CLOCK_CYCLES(is486 ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -560,7 +560,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
pc++;
|
pc++;
|
||||||
regs[(fetchdat >> 3) & 7].l = regs[fetchdat & 7].l;
|
regs[(fetchdat >> 3) & 7].l = regs[fetchdat & 7].l;
|
||||||
cycles -= timing_rr;
|
CLOCK_CYCLES(timing_rr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -569,7 +569,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
|
||||||
CHECK_READ(ea_seg, eaaddr, eaaddr+3);
|
CHECK_READ(ea_seg, eaaddr, eaaddr+3);
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
cycles -= is486 ? 1 : 4;
|
CLOCK_CYCLES(is486 ? 1 : 4);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ static int opMOV_r_CRx_a16(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_r_CRx_a32(uint32_t fetchdat)
|
static int opMOV_r_CRx_a32(uint32_t fetchdat)
|
||||||
|
|
@ -67,7 +67,7 @@ static int opMOV_r_CRx_a32(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -81,7 +81,7 @@ static int opMOV_r_DRx_a16(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
regs[rm].l = 0;
|
regs[rm].l = 0;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_r_DRx_a32(uint32_t fetchdat)
|
static int opMOV_r_DRx_a32(uint32_t fetchdat)
|
||||||
|
|
@ -94,7 +94,7 @@ static int opMOV_r_DRx_a32(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
regs[rm].l = 0;
|
regs[rm].l = 0;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -135,7 +135,7 @@ static int opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_CRx_r_a32(uint32_t fetchdat)
|
static int opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||||
|
|
@ -175,7 +175,7 @@ static int opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,7 +188,7 @@ static int opMOV_DRx_r_a16(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_DRx_r_a32(uint32_t fetchdat)
|
static int opMOV_DRx_r_a32(uint32_t fetchdat)
|
||||||
|
|
@ -200,7 +200,7 @@ static int opMOV_DRx_r_a32(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -214,7 +214,7 @@ static int opMOV_r_TRx_a16(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
regs[rm].l = 0;
|
regs[rm].l = 0;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_r_TRx_a32(uint32_t fetchdat)
|
static int opMOV_r_TRx_a32(uint32_t fetchdat)
|
||||||
|
|
@ -227,7 +227,7 @@ static int opMOV_r_TRx_a32(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
regs[rm].l = 0;
|
regs[rm].l = 0;
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -240,7 +240,7 @@ static int opMOV_TRx_r_a16(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOV_TRx_r_a32(uint32_t fetchdat)
|
static int opMOV_TRx_r_a32(uint32_t fetchdat)
|
||||||
|
|
@ -252,7 +252,7 @@ static int opMOV_TRx_r_a32(uint32_t fetchdat)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ static int opMOV_w_seg_a16(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 3);
|
CLOCK_CYCLES((mod == 3) ? 2 : 3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_w_seg_a32(uint32_t fetchdat)
|
static int opMOV_w_seg_a32(uint32_t fetchdat)
|
||||||
|
|
@ -53,7 +53,7 @@ static int opMOV_w_seg_a32(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 3);
|
CLOCK_CYCLES((mod == 3) ? 2 : 3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,7 +89,7 @@ static int opMOV_l_seg_a16(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 3);
|
CLOCK_CYCLES((mod == 3) ? 2 : 3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_l_seg_a32(uint32_t fetchdat)
|
static int opMOV_l_seg_a32(uint32_t fetchdat)
|
||||||
|
|
@ -124,7 +124,7 @@ static int opMOV_l_seg_a32(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 3);
|
CLOCK_CYCLES((mod == 3) ? 2 : 3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ static int opMOV_seg_w_a16(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opMOV_seg_w_a32(uint32_t fetchdat)
|
static int opMOV_seg_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -201,7 +201,7 @@ static int opMOV_seg_w_a32(uint32_t fetchdat)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycles -= ((mod == 3) ? 2 : 5);
|
CLOCK_CYCLES((mod == 3) ? 2 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,7 +217,7 @@ static int opLDS_w_a16(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ds); if (abrt) return 1;
|
loadseg(seg, &_ds); if (abrt) return 1;
|
||||||
regs[reg].w = addr;
|
regs[reg].w = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLDS_w_a32(uint32_t fetchdat)
|
static int opLDS_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -231,7 +231,7 @@ static int opLDS_w_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ds); if (abrt) return 1;
|
loadseg(seg, &_ds); if (abrt) return 1;
|
||||||
regs[reg].w = addr;
|
regs[reg].w = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLDS_l_a16(uint32_t fetchdat)
|
static int opLDS_l_a16(uint32_t fetchdat)
|
||||||
|
|
@ -246,7 +246,7 @@ static int opLDS_l_a16(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ds); if (abrt) return 1;
|
loadseg(seg, &_ds); if (abrt) return 1;
|
||||||
regs[reg].l = addr;
|
regs[reg].l = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLDS_l_a32(uint32_t fetchdat)
|
static int opLDS_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -261,7 +261,7 @@ static int opLDS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ds); if (abrt) return 1;
|
loadseg(seg, &_ds); if (abrt) return 1;
|
||||||
regs[reg].l = addr;
|
regs[reg].l = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -276,7 +276,7 @@ static int opLSS_w_a16(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ss); if (abrt) return 1;
|
loadseg(seg, &_ss); if (abrt) return 1;
|
||||||
regs[reg].w = addr;
|
regs[reg].w = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLSS_w_a32(uint32_t fetchdat)
|
static int opLSS_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -290,7 +290,7 @@ static int opLSS_w_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ss); if (abrt) return 1;
|
loadseg(seg, &_ss); if (abrt) return 1;
|
||||||
regs[reg].w = addr;
|
regs[reg].w = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLSS_l_a16(uint32_t fetchdat)
|
static int opLSS_l_a16(uint32_t fetchdat)
|
||||||
|
|
@ -305,7 +305,7 @@ static int opLSS_l_a16(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ss); if (abrt) return 1;
|
loadseg(seg, &_ss); if (abrt) return 1;
|
||||||
regs[reg].l = addr;
|
regs[reg].l = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLSS_l_a32(uint32_t fetchdat)
|
static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -320,7 +320,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &_ss); if (abrt) return 1;
|
loadseg(seg, &_ss); if (abrt) return 1;
|
||||||
regs[reg].l = addr;
|
regs[reg].l = addr;
|
||||||
|
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -336,7 +336,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &sel); if (abrt) return 1; \
|
loadseg(seg, &sel); if (abrt) return 1; \
|
||||||
regs[reg].w = addr; \
|
regs[reg].w = addr; \
|
||||||
\
|
\
|
||||||
cycles -= 7; \
|
CLOCK_CYCLES(7); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -351,7 +351,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &sel); if (abrt) return 1; \
|
loadseg(seg, &sel); if (abrt) return 1; \
|
||||||
regs[reg].w = addr; \
|
regs[reg].w = addr; \
|
||||||
\
|
\
|
||||||
cycles -= 7; \
|
CLOCK_CYCLES(7); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -367,7 +367,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &sel); if (abrt) return 1; \
|
loadseg(seg, &sel); if (abrt) return 1; \
|
||||||
regs[reg].l = addr; \
|
regs[reg].l = addr; \
|
||||||
\
|
\
|
||||||
cycles -= 7; \
|
CLOCK_CYCLES(7); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -383,7 +383,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
||||||
loadseg(seg, &sel); if (abrt) return 1; \
|
loadseg(seg, &sel); if (abrt) return 1; \
|
||||||
regs[reg].l = addr; \
|
regs[reg].l = addr; \
|
||||||
\
|
\
|
||||||
cycles -= 7; \
|
CLOCK_CYCLES(7); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ static int opMOVZX_w_b_a16(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
regs[reg].w = (uint16_t)temp;
|
regs[reg].w = (uint16_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_w_b_a32(uint32_t fetchdat)
|
static int opMOVZX_w_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -17,7 +17,7 @@ static int opMOVZX_w_b_a32(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
regs[reg].w = (uint16_t)temp;
|
regs[reg].w = (uint16_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_l_b_a16(uint32_t fetchdat)
|
static int opMOVZX_l_b_a16(uint32_t fetchdat)
|
||||||
|
|
@ -28,7 +28,7 @@ static int opMOVZX_l_b_a16(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
regs[reg].l = (uint32_t)temp;
|
regs[reg].l = (uint32_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_l_b_a32(uint32_t fetchdat)
|
static int opMOVZX_l_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -39,7 +39,7 @@ static int opMOVZX_l_b_a32(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
regs[reg].l = (uint32_t)temp;
|
regs[reg].l = (uint32_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_w_w_a16(uint32_t fetchdat)
|
static int opMOVZX_w_w_a16(uint32_t fetchdat)
|
||||||
|
|
@ -50,7 +50,7 @@ static int opMOVZX_w_w_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_w_w_a32(uint32_t fetchdat)
|
static int opMOVZX_w_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -61,7 +61,7 @@ static int opMOVZX_w_w_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_l_w_a16(uint32_t fetchdat)
|
static int opMOVZX_l_w_a16(uint32_t fetchdat)
|
||||||
|
|
@ -72,7 +72,7 @@ static int opMOVZX_l_w_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].l = (uint32_t)temp;
|
regs[reg].l = (uint32_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVZX_l_w_a32(uint32_t fetchdat)
|
static int opMOVZX_l_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -83,7 +83,7 @@ static int opMOVZX_l_w_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
regs[reg].l = (uint32_t)temp;
|
regs[reg].l = (uint32_t)temp;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,7 +97,7 @@ static int opMOVSX_w_b_a16(uint32_t fetchdat)
|
||||||
if (temp & 0x80)
|
if (temp & 0x80)
|
||||||
regs[reg].w |= 0xff00;
|
regs[reg].w |= 0xff00;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSX_w_b_a32(uint32_t fetchdat)
|
static int opMOVSX_w_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -110,7 +110,7 @@ static int opMOVSX_w_b_a32(uint32_t fetchdat)
|
||||||
if (temp & 0x80)
|
if (temp & 0x80)
|
||||||
regs[reg].w |= 0xff00;
|
regs[reg].w |= 0xff00;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSX_l_b_a16(uint32_t fetchdat)
|
static int opMOVSX_l_b_a16(uint32_t fetchdat)
|
||||||
|
|
@ -123,7 +123,7 @@ static int opMOVSX_l_b_a16(uint32_t fetchdat)
|
||||||
if (temp & 0x80)
|
if (temp & 0x80)
|
||||||
regs[reg].l |= 0xffffff00;
|
regs[reg].l |= 0xffffff00;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSX_l_b_a32(uint32_t fetchdat)
|
static int opMOVSX_l_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -136,7 +136,7 @@ static int opMOVSX_l_b_a32(uint32_t fetchdat)
|
||||||
if (temp & 0x80)
|
if (temp & 0x80)
|
||||||
regs[reg].l |= 0xffffff00;
|
regs[reg].l |= 0xffffff00;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSX_l_w_a16(uint32_t fetchdat)
|
static int opMOVSX_l_w_a16(uint32_t fetchdat)
|
||||||
|
|
@ -149,7 +149,7 @@ static int opMOVSX_l_w_a16(uint32_t fetchdat)
|
||||||
if (temp & 0x8000)
|
if (temp & 0x8000)
|
||||||
regs[reg].l |= 0xffff0000;
|
regs[reg].l |= 0xffff0000;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSX_l_w_a32(uint32_t fetchdat)
|
static int opMOVSX_l_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -162,6 +162,6 @@ static int opMOVSX_l_w_a32(uint32_t fetchdat)
|
||||||
if (temp & 0x8000)
|
if (temp & 0x8000)
|
||||||
regs[reg].l |= 0xffff0000;
|
regs[reg].l |= 0xffff0000;
|
||||||
|
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,6 @@ static int opRDTSC(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
EAX = tsc & 0xffffffff;
|
EAX = tsc & 0xffffffff;
|
||||||
EDX = tsc >> 32;
|
EDX = tsc >> 32;
|
||||||
cycles--;
|
CLOCK_CYCLES(1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ static int opIMUL_w_iw_a16(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].w = templ & 0xffff;
|
regs[reg].w = templ & 0xffff;
|
||||||
|
|
||||||
cycles -= (mod == 3) ? 14 : 17;
|
CLOCK_CYCLES((mod == 3) ? 14 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_w_iw_a32(uint32_t fetchdat)
|
static int opIMUL_w_iw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -33,7 +33,7 @@ static int opIMUL_w_iw_a32(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].w = templ & 0xffff;
|
regs[reg].w = templ & 0xffff;
|
||||||
|
|
||||||
cycles -= (mod == 3) ? 14 : 17;
|
CLOCK_CYCLES((mod == 3) ? 14 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,7 +53,7 @@ static int opIMUL_l_il_a16(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].l = temp64 & 0xffffffff;
|
regs[reg].l = temp64 & 0xffffffff;
|
||||||
|
|
||||||
cycles-=25;
|
CLOCK_CYCLES(25);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_l_il_a32(uint32_t fetchdat)
|
static int opIMUL_l_il_a32(uint32_t fetchdat)
|
||||||
|
|
@ -72,7 +72,7 @@ static int opIMUL_l_il_a32(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].l = temp64 & 0xffffffff;
|
regs[reg].l = temp64 & 0xffffffff;
|
||||||
|
|
||||||
cycles-=25;
|
CLOCK_CYCLES(25);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ static int opIMUL_w_ib_a16(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].w = templ & 0xffff;
|
regs[reg].w = templ & 0xffff;
|
||||||
|
|
||||||
cycles -= (mod == 3) ? 14 : 17;
|
CLOCK_CYCLES((mod == 3) ? 14 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_w_ib_a32(uint32_t fetchdat)
|
static int opIMUL_w_ib_a32(uint32_t fetchdat)
|
||||||
|
|
@ -113,7 +113,7 @@ static int opIMUL_w_ib_a32(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].w = templ & 0xffff;
|
regs[reg].w = templ & 0xffff;
|
||||||
|
|
||||||
cycles -= (mod == 3) ? 14 : 17;
|
CLOCK_CYCLES((mod == 3) ? 14 : 17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,7 +133,7 @@ static int opIMUL_l_ib_a16(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].l = temp64 & 0xffffffff;
|
regs[reg].l = temp64 & 0xffffffff;
|
||||||
|
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_l_ib_a32(uint32_t fetchdat)
|
static int opIMUL_l_ib_a32(uint32_t fetchdat)
|
||||||
|
|
@ -152,7 +152,7 @@ static int opIMUL_l_ib_a32(uint32_t fetchdat)
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
regs[reg].l = temp64 & 0xffffffff;
|
regs[reg].l = temp64 & 0xffffffff;
|
||||||
|
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,7 +170,7 @@ static int opIMUL_w_w_a16(uint32_t fetchdat)
|
||||||
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
|
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
|
|
||||||
cycles -= 18;
|
CLOCK_CYCLES(18);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_w_w_a32(uint32_t fetchdat)
|
static int opIMUL_w_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -185,7 +185,7 @@ static int opIMUL_w_w_a32(uint32_t fetchdat)
|
||||||
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
|
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
|
|
||||||
cycles -= 18;
|
CLOCK_CYCLES(18);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -201,7 +201,7 @@ static int opIMUL_l_l_a16(uint32_t fetchdat)
|
||||||
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
|
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
|
|
||||||
cycles -= 30;
|
CLOCK_CYCLES(30);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opIMUL_l_l_a32(uint32_t fetchdat)
|
static int opIMUL_l_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -216,7 +216,7 @@ static int opIMUL_l_l_a32(uint32_t fetchdat)
|
||||||
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
|
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
|
||||||
else flags &= ~(C_FLAG | V_FLAG);
|
else flags &= ~(C_FLAG | V_FLAG);
|
||||||
|
|
||||||
cycles -= 30;
|
CLOCK_CYCLES(30);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ static int opARPL_a16(uint32_t fetchdat)
|
||||||
else
|
else
|
||||||
flags &= ~Z_FLAG;
|
flags &= ~Z_FLAG;
|
||||||
|
|
||||||
cycles -= is486 ? 9 : 20;
|
CLOCK_CYCLES(is486 ? 9 : 20);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opARPL_a32(uint32_t fetchdat)
|
static int opARPL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -39,7 +39,7 @@ static int opARPL_a32(uint32_t fetchdat)
|
||||||
else
|
else
|
||||||
flags &= ~Z_FLAG;
|
flags &= ~Z_FLAG;
|
||||||
|
|
||||||
cycles -= is486 ? 9 : 20;
|
CLOCK_CYCLES(is486 ? 9 : 20);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -83,7 +83,7 @@ static int opARPL_a32(uint32_t fetchdat)
|
||||||
regs[reg].w = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4) & 0xff00; \
|
regs[reg].w = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4) & 0xff00; \
|
||||||
cpl_override = 0; \
|
cpl_override = 0; \
|
||||||
} \
|
} \
|
||||||
cycles -= 11; \
|
CLOCK_CYCLES(11); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,7 +138,7 @@ opLAR(l_a32, fetch_ea_32, 1)
|
||||||
regs[reg].w = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7)); \
|
regs[reg].w = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7)); \
|
||||||
cpl_override = 0; \
|
cpl_override = 0; \
|
||||||
} \
|
} \
|
||||||
cycles -= 10; \
|
CLOCK_CYCLES(10); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -160,11 +160,11 @@ static int op0F00_common(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
case 0x00: /*SLDT*/
|
case 0x00: /*SLDT*/
|
||||||
seteaw(ldt.seg);
|
seteaw(ldt.seg);
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*STR*/
|
case 0x08: /*STR*/
|
||||||
seteaw(tr.seg);
|
seteaw(tr.seg);
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*LLDT*/
|
case 0x10: /*LLDT*/
|
||||||
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
||||||
|
|
@ -189,7 +189,7 @@ static int op0F00_common(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
ldt.base = base;
|
ldt.base = base;
|
||||||
ldt.seg = sel;
|
ldt.seg = sel;
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*LTR*/
|
case 0x18: /*LTR*/
|
||||||
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
||||||
|
|
@ -214,7 +214,7 @@ static int op0F00_common(uint32_t fetchdat)
|
||||||
tr.limit |= 0xFFF;
|
tr.limit |= 0xFFF;
|
||||||
}
|
}
|
||||||
tr.base = base;
|
tr.base = base;
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
break;
|
break;
|
||||||
case 0x20: /*VERR*/
|
case 0x20: /*VERR*/
|
||||||
sel = geteaw(); if (abrt) return 1;
|
sel = geteaw(); if (abrt) return 1;
|
||||||
|
|
@ -233,7 +233,7 @@ static int op0F00_common(uint32_t fetchdat)
|
||||||
}
|
}
|
||||||
if ((desc & 0x0800) && !(desc & 0x0200)) valid = 0; /*Non-readable code*/
|
if ((desc & 0x0800) && !(desc & 0x0200)) valid = 0; /*Non-readable code*/
|
||||||
if (valid) flags |= Z_FLAG;
|
if (valid) flags |= Z_FLAG;
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
break;
|
break;
|
||||||
case 0x28: /*VERW*/
|
case 0x28: /*VERW*/
|
||||||
sel = geteaw(); if (abrt) return 1;
|
sel = geteaw(); if (abrt) return 1;
|
||||||
|
|
@ -250,7 +250,7 @@ static int op0F00_common(uint32_t fetchdat)
|
||||||
if (desc & 0x0800) valid = 0; /*Code*/
|
if (desc & 0x0800) valid = 0; /*Code*/
|
||||||
if (!(desc & 0x0200)) valid = 0; /*Read-only data*/
|
if (!(desc & 0x0200)) valid = 0; /*Read-only data*/
|
||||||
if (valid) flags |= Z_FLAG;
|
if (valid) flags |= Z_FLAG;
|
||||||
cycles -= 20;
|
CLOCK_CYCLES(20);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -292,7 +292,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
|
||||||
if (is286)
|
if (is286)
|
||||||
base |= 0xff000000;
|
base |= 0xff000000;
|
||||||
writememl(easeg, eaaddr + 2, base);
|
writememl(easeg, eaaddr + 2, base);
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
break;
|
break;
|
||||||
case 0x08: /*SIDT*/
|
case 0x08: /*SIDT*/
|
||||||
seteaw(idt.limit);
|
seteaw(idt.limit);
|
||||||
|
|
@ -300,7 +300,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
|
||||||
if (is286)
|
if (is286)
|
||||||
base |= 0xff000000;
|
base |= 0xff000000;
|
||||||
writememl(easeg, eaaddr + 2, base);
|
writememl(easeg, eaaddr + 2, base);
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
break;
|
break;
|
||||||
case 0x10: /*LGDT*/
|
case 0x10: /*LGDT*/
|
||||||
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
||||||
|
|
@ -316,7 +316,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
|
||||||
gdt.limit = limit;
|
gdt.limit = limit;
|
||||||
gdt.base = base;
|
gdt.base = base;
|
||||||
if (!is32) gdt.base &= 0xffffff;
|
if (!is32) gdt.base &= 0xffffff;
|
||||||
cycles -= 11;
|
CLOCK_CYCLES(11);
|
||||||
break;
|
break;
|
||||||
case 0x18: /*LIDT*/
|
case 0x18: /*LIDT*/
|
||||||
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
if ((CPL || eflags&VM_FLAG) && (cr0&1))
|
||||||
|
|
@ -332,13 +332,13 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
|
||||||
idt.limit = limit;
|
idt.limit = limit;
|
||||||
idt.base = base;
|
idt.base = base;
|
||||||
if (!is32) idt.base &= 0xffffff;
|
if (!is32) idt.base &= 0xffffff;
|
||||||
cycles -= 11;
|
CLOCK_CYCLES(11);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x20: /*SMSW*/
|
case 0x20: /*SMSW*/
|
||||||
if (is486) seteaw(msw);
|
if (is486) seteaw(msw);
|
||||||
else seteaw(msw | 0xFF00);
|
else seteaw(msw | 0xFF00);
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
break;
|
break;
|
||||||
case 0x30: /*LMSW*/
|
case 0x30: /*LMSW*/
|
||||||
if ((CPL || eflags&VM_FLAG) && (msw&1))
|
if ((CPL || eflags&VM_FLAG) && (msw&1))
|
||||||
|
|
@ -362,7 +362,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mmu_invalidate(ds + eaaddr);
|
mmu_invalidate(ds + eaaddr);
|
||||||
cycles -= 12;
|
CLOCK_CYCLES(12);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ static int op ## name ## _w_a16(uint32_t fetchdat) \
|
||||||
\
|
\
|
||||||
ea_seg = &seg; \
|
ea_seg = &seg; \
|
||||||
ssegs = 1; \
|
ssegs = 1; \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
\
|
\
|
||||||
return x86_opcodes[fetchdat & 0xff](fetchdat >> 8); \
|
return x86_opcodes[fetchdat & 0xff](fetchdat >> 8); \
|
||||||
} \
|
} \
|
||||||
|
|
@ -20,7 +20,7 @@ static int op ## name ## _l_a16(uint32_t fetchdat) \
|
||||||
\
|
\
|
||||||
ea_seg = &seg; \
|
ea_seg = &seg; \
|
||||||
ssegs = 1; \
|
ssegs = 1; \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
\
|
\
|
||||||
return x86_opcodes[(fetchdat & 0xff) | 0x100](fetchdat >> 8); \
|
return x86_opcodes[(fetchdat & 0xff) | 0x100](fetchdat >> 8); \
|
||||||
} \
|
} \
|
||||||
|
|
@ -33,7 +33,7 @@ static int op ## name ## _w_a32(uint32_t fetchdat) \
|
||||||
\
|
\
|
||||||
ea_seg = &seg; \
|
ea_seg = &seg; \
|
||||||
ssegs = 1; \
|
ssegs = 1; \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
\
|
\
|
||||||
return x86_opcodes[(fetchdat & 0xff) | 0x200](fetchdat >> 8); \
|
return x86_opcodes[(fetchdat & 0xff) | 0x200](fetchdat >> 8); \
|
||||||
} \
|
} \
|
||||||
|
|
@ -46,7 +46,7 @@ static int op ## name ## _l_a32(uint32_t fetchdat) \
|
||||||
\
|
\
|
||||||
ea_seg = &seg; \
|
ea_seg = &seg; \
|
||||||
ssegs = 1; \
|
ssegs = 1; \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
\
|
\
|
||||||
return x86_opcodes[(fetchdat & 0xff) | 0x300](fetchdat >> 8); \
|
return x86_opcodes[(fetchdat & 0xff) | 0x300](fetchdat >> 8); \
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +65,7 @@ static int op_66(uint32_t fetchdat) /*Data size select*/
|
||||||
pc++;
|
pc++;
|
||||||
|
|
||||||
op32 = ((use32 & 0x100) ^ 0x100) | (op32 & 0x200);
|
op32 = ((use32 & 0x100) ^ 0x100) | (op32 & 0x200);
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return x86_opcodes[(fetchdat & 0xff) | op32](fetchdat >> 8);
|
return x86_opcodes[(fetchdat & 0xff) | op32](fetchdat >> 8);
|
||||||
}
|
}
|
||||||
static int op_67(uint32_t fetchdat) /*Address size select*/
|
static int op_67(uint32_t fetchdat) /*Address size select*/
|
||||||
|
|
@ -75,6 +75,6 @@ static int op_67(uint32_t fetchdat) /*Address size select*/
|
||||||
pc++;
|
pc++;
|
||||||
|
|
||||||
op32 = ((use32 & 0x200) ^ 0x200) | (op32 & 0x100);
|
op32 = ((use32 & 0x200) ^ 0x200) | (op32 & 0x100);
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return x86_opcodes[(fetchdat & 0xff) | op32](fetchdat >> 8);
|
return x86_opcodes[(fetchdat & 0xff) | op32](fetchdat >> 8);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
if (abrt) return 1; \
|
if (abrt) return 1; \
|
||||||
if (stack32) ESP += 4 + stack_offset; \
|
if (stack32) ESP += 4 + stack_offset; \
|
||||||
else SP += 4 + stack_offset; \
|
else SP += 4 + stack_offset; \
|
||||||
cycles -= is486 ? 13 : 18;
|
CLOCK_CYCLES(is486 ? 13 : 18);
|
||||||
|
|
||||||
#define RETF_a32(stack_offset) \
|
#define RETF_a32(stack_offset) \
|
||||||
if ((msw&1) && !(eflags&VM_FLAG)) \
|
if ((msw&1) && !(eflags&VM_FLAG)) \
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
if (abrt) return 1; \
|
if (abrt) return 1; \
|
||||||
if (stack32) ESP += 8 + stack_offset; \
|
if (stack32) ESP += 8 + stack_offset; \
|
||||||
else SP += 8 + stack_offset; \
|
else SP += 8 + stack_offset; \
|
||||||
cycles -= is486 ? 13 : 18;
|
CLOCK_CYCLES(is486 ? 13 : 18);
|
||||||
|
|
||||||
static int opRETF_a16(uint32_t fetchdat)
|
static int opRETF_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
|
|
@ -104,7 +104,7 @@ static int opIRET_286(uint32_t fetchdat)
|
||||||
loadcs(new_cs);
|
loadcs(new_cs);
|
||||||
}
|
}
|
||||||
flags_extract();
|
flags_extract();
|
||||||
cycles -= is486 ? 15 : 22;
|
CLOCK_CYCLES(is486 ? 15 : 22);
|
||||||
nmi_enable = 1;
|
nmi_enable = 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return abrt;
|
return abrt;
|
||||||
|
|
@ -144,7 +144,7 @@ static int opIRET(uint32_t fetchdat)
|
||||||
loadcs(new_cs);
|
loadcs(new_cs);
|
||||||
}
|
}
|
||||||
flags_extract();
|
flags_extract();
|
||||||
cycles -= is486 ? 15 : 22;
|
CLOCK_CYCLES(is486 ? 15 : 22);
|
||||||
nmi_enable = 1;
|
nmi_enable = 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return abrt;
|
return abrt;
|
||||||
|
|
@ -186,7 +186,7 @@ static int opIRETD(uint32_t fetchdat)
|
||||||
loadcs(new_cs);
|
loadcs(new_cs);
|
||||||
}
|
}
|
||||||
flags_extract();
|
flags_extract();
|
||||||
cycles -= is486 ? 15 : 22;
|
CLOCK_CYCLES(is486 ? 15 : 22);
|
||||||
nmi_enable = 1;
|
nmi_enable = 1;
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return abrt;
|
return abrt;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
{ \
|
{ \
|
||||||
fetch_ea_16(fetchdat); \
|
fetch_ea_16(fetchdat); \
|
||||||
seteab((cond_ ## condition) ? 1 : 0); \
|
seteab((cond_ ## condition) ? 1 : 0); \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
{ \
|
{ \
|
||||||
fetch_ea_32(fetchdat); \
|
fetch_ea_32(fetchdat); \
|
||||||
seteab((cond_ ## condition) ? 1 : 0); \
|
seteab((cond_ ## condition) ? 1 : 0); \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x08: /*ROR b,CL*/ \
|
case 0x08: /*ROR b,CL*/ \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
|
|
@ -30,51 +30,51 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x10: /*RCL b,CL*/ \
|
case 0x10: /*RCL b,CL*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 1 : 0; \
|
tempc = temp2 ? 1 : 0; \
|
||||||
temp2 = temp & 0x80; \
|
temp2 = temp & 0x80; \
|
||||||
temp = (temp << 1) | tempc; \
|
temp = (temp << 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteab(temp); if (abrt) return 1; \
|
seteab(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x18: /*RCR b,CL*/ \
|
case 0x18: /*RCR b,CL*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 0x80 : 0; \
|
tempc = temp2 ? 0x80 : 0; \
|
||||||
temp2 = temp & 1; \
|
temp2 = temp & 1; \
|
||||||
temp = (temp >> 1) | tempc; \
|
temp = (temp >> 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteab(temp); if (abrt) return 1; \
|
seteab(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x20: case 0x30: /*SHL b,CL*/ \
|
case 0x20: case 0x30: /*SHL b,CL*/ \
|
||||||
seteab(temp << c); if (abrt) return 1; \
|
seteab(temp << c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHL8, temp_orig, c, (temp << c) & 0xff); \
|
set_flags_shift(FLAGS_SHL8, temp_orig, c, (temp << c) & 0xff); \
|
||||||
if ((temp << (c - 1)) & 0x80) flags |= C_FLAG; \
|
if ((temp << (c - 1)) & 0x80) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x28: /*SHR b,CL*/ \
|
case 0x28: /*SHR b,CL*/ \
|
||||||
seteab(temp >> c); if (abrt) return 1; \
|
seteab(temp >> c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHR8, temp_orig, c, temp >> c); \
|
set_flags_shift(FLAGS_SHR8, temp_orig, c, temp >> c); \
|
||||||
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x38: /*SAR b,CL*/ \
|
case 0x38: /*SAR b,CL*/ \
|
||||||
tempc = ((temp >> (c - 1)) & 1); \
|
tempc = ((temp >> (c - 1)) & 1); \
|
||||||
|
|
@ -87,7 +87,7 @@
|
||||||
seteab(temp); if (abrt) return 1; \
|
seteab(temp); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SAR8, temp_orig, c, temp); \
|
set_flags_shift(FLAGS_SAR8, temp_orig, c, temp); \
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
@ -110,7 +110,7 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x08: /*ROR w, c*/ \
|
case 0x08: /*ROR w, c*/ \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
|
|
@ -124,51 +124,51 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x10: /*RCL w, c*/ \
|
case 0x10: /*RCL w, c*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 1 : 0; \
|
tempc = temp2 ? 1 : 0; \
|
||||||
temp2 = temp & 0x8000; \
|
temp2 = temp & 0x8000; \
|
||||||
temp = (temp << 1) | tempc; \
|
temp = (temp << 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteaw(temp); if (abrt) return 1; \
|
seteaw(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x18: /*RCR w, c*/ \
|
case 0x18: /*RCR w, c*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 0x8000 : 0; \
|
tempc = temp2 ? 0x8000 : 0; \
|
||||||
temp2 = temp & 1; \
|
temp2 = temp & 1; \
|
||||||
temp = (temp >> 1) | tempc; \
|
temp = (temp >> 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteaw(temp); if (abrt) return 1; \
|
seteaw(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x20: case 0x30: /*SHL w, c*/ \
|
case 0x20: case 0x30: /*SHL w, c*/ \
|
||||||
seteaw(temp << c); if (abrt) return 1; \
|
seteaw(temp << c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHL16, temp_orig, c, (temp << c) & 0xffff); \
|
set_flags_shift(FLAGS_SHL16, temp_orig, c, (temp << c) & 0xffff); \
|
||||||
if ((temp << (c - 1)) & 0x8000) flags |= C_FLAG; \
|
if ((temp << (c - 1)) & 0x8000) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x28: /*SHR w, c*/ \
|
case 0x28: /*SHR w, c*/ \
|
||||||
seteaw(temp >> c); if (abrt) return 1; \
|
seteaw(temp >> c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHR16, temp_orig, c, temp >> c); \
|
set_flags_shift(FLAGS_SHR16, temp_orig, c, temp >> c); \
|
||||||
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x38: /*SAR w, c*/ \
|
case 0x38: /*SAR w, c*/ \
|
||||||
tempc = ((temp >> (c - 1)) & 1); \
|
tempc = ((temp >> (c - 1)) & 1); \
|
||||||
|
|
@ -181,7 +181,7 @@
|
||||||
seteaw(temp); if (abrt) return 1; \
|
seteaw(temp); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SAR16, temp_orig, c, temp); \
|
set_flags_shift(FLAGS_SAR16, temp_orig, c, temp); \
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
@ -204,7 +204,7 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x08: /*ROR l, c*/ \
|
case 0x08: /*ROR l, c*/ \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
|
|
@ -218,51 +218,51 @@
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x10: /*RCL l, c*/ \
|
case 0x10: /*RCL l, c*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 1 : 0; \
|
tempc = temp2 ? 1 : 0; \
|
||||||
temp2 = temp & 0x80000000; \
|
temp2 = temp & 0x80000000; \
|
||||||
temp = (temp << 1) | tempc; \
|
temp = (temp << 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteal(temp); if (abrt) return 1; \
|
seteal(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
|
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x18: /*RCR l, c*/ \
|
case 0x18: /*RCR l, c*/ \
|
||||||
temp2 = flags & C_FLAG; \
|
temp2 = flags & C_FLAG; \
|
||||||
|
if (is486) CLOCK_CYCLES_ALWAYS(c); \
|
||||||
while (c > 0) \
|
while (c > 0) \
|
||||||
{ \
|
{ \
|
||||||
tempc = temp2 ? 0x80000000 : 0; \
|
tempc = temp2 ? 0x80000000 : 0; \
|
||||||
temp2 = temp & 1; \
|
temp2 = temp & 1; \
|
||||||
temp = (temp >> 1) | tempc; \
|
temp = (temp >> 1) | tempc; \
|
||||||
c--; \
|
c--; \
|
||||||
if (is486) cycles--; \
|
|
||||||
} \
|
} \
|
||||||
seteal(temp); if (abrt) return 1; \
|
seteal(temp); if (abrt) return 1; \
|
||||||
flags &= ~(C_FLAG | V_FLAG); \
|
flags &= ~(C_FLAG | V_FLAG); \
|
||||||
if (temp2) flags |= C_FLAG; \
|
if (temp2) flags |= C_FLAG; \
|
||||||
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
|
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 9 : 10); \
|
CLOCK_CYCLES((mod == 3) ? 9 : 10); \
|
||||||
break; \
|
break; \
|
||||||
case 0x20: case 0x30: /*SHL l, c*/ \
|
case 0x20: case 0x30: /*SHL l, c*/ \
|
||||||
seteal(temp << c); if (abrt) return 1; \
|
seteal(temp << c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHL32, temp_orig, c, temp << c); \
|
set_flags_shift(FLAGS_SHL32, temp_orig, c, temp << c); \
|
||||||
if ((temp << (c - 1)) & 0x80000000) flags |= C_FLAG; \
|
if ((temp << (c - 1)) & 0x80000000) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x28: /*SHR l, c*/ \
|
case 0x28: /*SHR l, c*/ \
|
||||||
seteal(temp >> c); if (abrt) return 1; \
|
seteal(temp >> c); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SHR32, temp_orig, c, temp >> c); \
|
set_flags_shift(FLAGS_SHR32, temp_orig, c, temp >> c); \
|
||||||
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
if ((temp >> (c - 1)) & 1) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
case 0x38: /*SAR l, c*/ \
|
case 0x38: /*SAR l, c*/ \
|
||||||
tempc = ((temp >> (c - 1)) & 1); \
|
tempc = ((temp >> (c - 1)) & 1); \
|
||||||
|
|
@ -275,7 +275,7 @@
|
||||||
seteal(temp); if (abrt) return 1; \
|
seteal(temp); if (abrt) return 1; \
|
||||||
set_flags_shift(FLAGS_SAR32, temp_orig, c, temp); \
|
set_flags_shift(FLAGS_SAR32, temp_orig, c, temp); \
|
||||||
if (tempc) flags |= C_FLAG; \
|
if (tempc) flags |= C_FLAG; \
|
||||||
cycles -= ((mod == 3) ? 3 : 7); \
|
CLOCK_CYCLES((mod == 3) ? 3 : 7); \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
@ -555,7 +555,7 @@ static int opD3_l_a32(uint32_t fetchdat)
|
||||||
count = getbyte() & 31; \
|
count = getbyte() & 31; \
|
||||||
operation(); \
|
operation(); \
|
||||||
\
|
\
|
||||||
cycles -= 3; \
|
CLOCK_CYCLES(3); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## operation ## _CL_a16(uint32_t fetchdat) \
|
static int op ## operation ## _CL_a16(uint32_t fetchdat) \
|
||||||
|
|
@ -566,7 +566,7 @@ static int opD3_l_a32(uint32_t fetchdat)
|
||||||
count = CL & 31; \
|
count = CL & 31; \
|
||||||
operation(); \
|
operation(); \
|
||||||
\
|
\
|
||||||
cycles -= 3; \
|
CLOCK_CYCLES(3); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## operation ## _i_a32(uint32_t fetchdat) \
|
static int op ## operation ## _i_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -577,7 +577,7 @@ static int opD3_l_a32(uint32_t fetchdat)
|
||||||
count = getbyte() & 31; \
|
count = getbyte() & 31; \
|
||||||
operation(); \
|
operation(); \
|
||||||
\
|
\
|
||||||
cycles -= 3; \
|
CLOCK_CYCLES(3); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int op ## operation ## _CL_a32(uint32_t fetchdat) \
|
static int op ## operation ## _CL_a32(uint32_t fetchdat) \
|
||||||
|
|
@ -588,7 +588,7 @@ static int opD3_l_a32(uint32_t fetchdat)
|
||||||
count = CL & 31; \
|
count = CL & 31; \
|
||||||
operation(); \
|
operation(); \
|
||||||
\
|
\
|
||||||
cycles -= 3; \
|
CLOCK_CYCLES(3); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
static int opPUSH_ ## reg (uint32_t fetchdat) \
|
static int opPUSH_ ## reg (uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
PUSH_W(reg); \
|
PUSH_W(reg); \
|
||||||
cycles -= (is486) ? 1 : 2; \
|
CLOCK_CYCLES((is486) ? 1 : 2); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
static int opPUSH_ ## reg (uint32_t fetchdat) \
|
static int opPUSH_ ## reg (uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
PUSH_L(reg); \
|
PUSH_L(reg); \
|
||||||
cycles -= (is486) ? 1 : 2; \
|
CLOCK_CYCLES((is486) ? 1 : 2); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
static int opPOP_ ## reg (uint32_t fetchdat) \
|
static int opPOP_ ## reg (uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
reg = POP_W(); \
|
reg = POP_W(); \
|
||||||
cycles -= (is486) ? 1 : 4; \
|
CLOCK_CYCLES((is486) ? 1 : 4); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
static int opPOP_ ## reg (uint32_t fetchdat) \
|
static int opPOP_ ## reg (uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
reg = POP_L(); \
|
reg = POP_L(); \
|
||||||
cycles -= (is486) ? 1 : 4; \
|
CLOCK_CYCLES((is486) ? 1 : 4); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ static int opPUSHA_w(uint32_t fetchdat)
|
||||||
writememw(ss, ((SP - 16) & 0xFFFF), DI);
|
writememw(ss, ((SP - 16) & 0xFFFF), DI);
|
||||||
if (!abrt) SP -= 16;
|
if (!abrt) SP -= 16;
|
||||||
}
|
}
|
||||||
cycles -= (is486) ? 11 : 18;
|
CLOCK_CYCLES((is486) ? 11 : 18);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPUSHA_l(uint32_t fetchdat)
|
static int opPUSHA_l(uint32_t fetchdat)
|
||||||
|
|
@ -122,7 +122,7 @@ static int opPUSHA_l(uint32_t fetchdat)
|
||||||
writememl(ss, ((SP - 32) & 0xFFFF), EDI);
|
writememl(ss, ((SP - 32) & 0xFFFF), EDI);
|
||||||
if (!abrt) SP -= 32;
|
if (!abrt) SP -= 32;
|
||||||
}
|
}
|
||||||
cycles -= (is486) ? 11 : 18;
|
CLOCK_CYCLES((is486) ? 11 : 18);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,7 +150,7 @@ static int opPOPA_w(uint32_t fetchdat)
|
||||||
AX = readmemw(ss, ((SP + 14) & 0xFFFF)); if (abrt) return 1;
|
AX = readmemw(ss, ((SP + 14) & 0xFFFF)); if (abrt) return 1;
|
||||||
SP += 16;
|
SP += 16;
|
||||||
}
|
}
|
||||||
cycles -= (is486) ? 9 : 24;
|
CLOCK_CYCLES((is486) ? 9 : 24);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opPOPA_l(uint32_t fetchdat)
|
static int opPOPA_l(uint32_t fetchdat)
|
||||||
|
|
@ -177,7 +177,7 @@ static int opPOPA_l(uint32_t fetchdat)
|
||||||
EAX = readmeml(ss, ((SP + 28) & 0xFFFF)); if (abrt) return 1;
|
EAX = readmeml(ss, ((SP + 28) & 0xFFFF)); if (abrt) return 1;
|
||||||
SP += 32;
|
SP += 32;
|
||||||
}
|
}
|
||||||
cycles -= (is486) ? 9 : 24;
|
CLOCK_CYCLES((is486) ? 9 : 24);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -185,14 +185,14 @@ static int opPUSH_imm_w(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint16_t val = getwordf();
|
uint16_t val = getwordf();
|
||||||
PUSH_W(val);
|
PUSH_W(val);
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPUSH_imm_l(uint32_t fetchdat)
|
static int opPUSH_imm_l(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
uint32_t val = getlong(); if (abrt) return 1;
|
uint32_t val = getlong(); if (abrt) return 1;
|
||||||
PUSH_L(val);
|
PUSH_L(val);
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,7 +203,7 @@ static int opPUSH_imm_bw(uint32_t fetchdat)
|
||||||
if (tempw & 0x80) tempw |= 0xFF00;
|
if (tempw & 0x80) tempw |= 0xFF00;
|
||||||
PUSH_W(tempw);
|
PUSH_W(tempw);
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPUSH_imm_bl(uint32_t fetchdat)
|
static int opPUSH_imm_bl(uint32_t fetchdat)
|
||||||
|
|
@ -213,7 +213,7 @@ static int opPUSH_imm_bl(uint32_t fetchdat)
|
||||||
if (templ & 0x80) templ |= 0xFFFFFF00;
|
if (templ & 0x80) templ |= 0xFFFFFF00;
|
||||||
PUSH_L(templ);
|
PUSH_L(templ);
|
||||||
|
|
||||||
cycles -= 2;
|
CLOCK_CYCLES(2);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -231,8 +231,8 @@ static int opPOPW_a16(uint32_t fetchdat)
|
||||||
else SP -= 2;
|
else SP -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 6);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 6);
|
||||||
else cycles -= ((mod == 3) ? 4 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 4 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPOPW_a32(uint32_t fetchdat)
|
static int opPOPW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -249,8 +249,8 @@ static int opPOPW_a32(uint32_t fetchdat)
|
||||||
else SP -= 2;
|
else SP -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 6);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 6);
|
||||||
else cycles -= ((mod == 3) ? 4 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 4 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -268,8 +268,8 @@ static int opPOPL_a16(uint32_t fetchdat)
|
||||||
else SP -= 4;
|
else SP -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 6);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 6);
|
||||||
else cycles -= ((mod == 3) ? 4 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 4 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opPOPL_a32(uint32_t fetchdat)
|
static int opPOPL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -286,8 +286,8 @@ static int opPOPL_a32(uint32_t fetchdat)
|
||||||
else SP -= 4;
|
else SP -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is486) cycles -= ((mod == 3) ? 1 : 6);
|
if (is486) CLOCK_CYCLES((mod == 3) ? 1 : 6);
|
||||||
else cycles -= ((mod == 3) ? 4 : 5);
|
else CLOCK_CYCLES((mod == 3) ? 4 : 5);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -312,17 +312,17 @@ static int opENTER_w(uint32_t fetchdat)
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
PUSH_W(tempw);
|
PUSH_W(tempw);
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
cycles -= (is486) ? 3 : 4;
|
CLOCK_CYCLES((is486) ? 3 : 4);
|
||||||
}
|
}
|
||||||
PUSH_W(frame_ptr);
|
PUSH_W(frame_ptr);
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
cycles -= (is486) ? 3 : 5;
|
CLOCK_CYCLES((is486) ? 3 : 5);
|
||||||
}
|
}
|
||||||
BP = frame_ptr;
|
BP = frame_ptr;
|
||||||
|
|
||||||
if (stack32) ESP -= offset;
|
if (stack32) ESP -= offset;
|
||||||
else SP -= offset;
|
else SP -= offset;
|
||||||
cycles -= (is486) ? 14 : 10;
|
CLOCK_CYCLES((is486) ? 14 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opENTER_l(uint32_t fetchdat)
|
static int opENTER_l(uint32_t fetchdat)
|
||||||
|
|
@ -345,17 +345,17 @@ static int opENTER_l(uint32_t fetchdat)
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
PUSH_L(templ);
|
PUSH_L(templ);
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
cycles -= (is486) ? 3 : 4;
|
CLOCK_CYCLES((is486) ? 3 : 4);
|
||||||
}
|
}
|
||||||
PUSH_L(frame_ptr);
|
PUSH_L(frame_ptr);
|
||||||
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
|
||||||
cycles -= (is486) ? 3 : 5;
|
CLOCK_CYCLES((is486) ? 3 : 5);
|
||||||
}
|
}
|
||||||
EBP = frame_ptr;
|
EBP = frame_ptr;
|
||||||
|
|
||||||
if (stack32) ESP -= offset;
|
if (stack32) ESP -= offset;
|
||||||
else SP -= offset;
|
else SP -= offset;
|
||||||
cycles -= (is486) ? 14 : 10;
|
CLOCK_CYCLES((is486) ? 14 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -370,7 +370,7 @@ static int opLEAVE_w(uint32_t fetchdat)
|
||||||
if (abrt) { ESP = tempESP; return 1; }
|
if (abrt) { ESP = tempESP; return 1; }
|
||||||
BP = temp;
|
BP = temp;
|
||||||
|
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLEAVE_l(uint32_t fetchdat)
|
static int opLEAVE_l(uint32_t fetchdat)
|
||||||
|
|
@ -383,7 +383,7 @@ static int opLEAVE_l(uint32_t fetchdat)
|
||||||
if (abrt) { ESP = tempESP; return 1; }
|
if (abrt) { ESP = tempESP; return 1; }
|
||||||
EBP = temp;
|
EBP = temp;
|
||||||
|
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -392,13 +392,13 @@ static int opLEAVE_l(uint32_t fetchdat)
|
||||||
static int opPUSH_ ## seg ## _w(uint32_t fetchdat) \
|
static int opPUSH_ ## seg ## _w(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
PUSH_W(seg); \
|
PUSH_W(seg); \
|
||||||
cycles -= 2; \
|
CLOCK_CYCLES(2); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
} \
|
} \
|
||||||
static int opPUSH_ ## seg ## _l(uint32_t fetchdat) \
|
static int opPUSH_ ## seg ## _l(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
PUSH_L(seg); \
|
PUSH_L(seg); \
|
||||||
cycles -= 2; \
|
CLOCK_CYCLES(2); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -409,7 +409,7 @@ static int opLEAVE_l(uint32_t fetchdat)
|
||||||
uint32_t temp_esp = ESP; \
|
uint32_t temp_esp = ESP; \
|
||||||
temp_seg = POP_W(); if (abrt) return 1; \
|
temp_seg = POP_W(); if (abrt) return 1; \
|
||||||
loadseg(temp_seg, realseg); if (abrt) ESP = temp_esp; \
|
loadseg(temp_seg, realseg); if (abrt) ESP = temp_esp; \
|
||||||
cycles -= is486 ? 3 : 7; \
|
CLOCK_CYCLES(is486 ? 3 : 7); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
} \
|
} \
|
||||||
static int opPOP_ ## seg ## _l(uint32_t fetchdat) \
|
static int opPOP_ ## seg ## _l(uint32_t fetchdat) \
|
||||||
|
|
@ -418,7 +418,7 @@ static int opLEAVE_l(uint32_t fetchdat)
|
||||||
uint32_t temp_esp = ESP; \
|
uint32_t temp_esp = ESP; \
|
||||||
temp_seg = POP_L(); if (abrt) return 1; \
|
temp_seg = POP_L(); if (abrt) return 1; \
|
||||||
loadseg(temp_seg & 0xffff, realseg); if (abrt) ESP = temp_esp; \
|
loadseg(temp_seg & 0xffff, realseg); if (abrt) ESP = temp_esp; \
|
||||||
cycles -= is486 ? 3 : 7; \
|
CLOCK_CYCLES(is486 ? 3 : 7); \
|
||||||
return abrt; \
|
return abrt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ static int opMOVSB_a16(uint32_t fetchdat)
|
||||||
writememb(es, DI, temp); if (abrt) return 1;
|
writememb(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { DI--; SI--; }
|
if (flags & D_FLAG) { DI--; SI--; }
|
||||||
else { DI++; SI++; }
|
else { DI++; SI++; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSB_a32(uint32_t fetchdat)
|
static int opMOVSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -13,7 +13,7 @@ static int opMOVSB_a32(uint32_t fetchdat)
|
||||||
writememb(es, EDI, temp); if (abrt) return 1;
|
writememb(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { EDI--; ESI--; }
|
if (flags & D_FLAG) { EDI--; ESI--; }
|
||||||
else { EDI++; ESI++; }
|
else { EDI++; ESI++; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ static int opMOVSW_a16(uint32_t fetchdat)
|
||||||
writememw(es, DI, temp); if (abrt) return 1;
|
writememw(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
|
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
|
||||||
else { DI += 2; SI += 2; }
|
else { DI += 2; SI += 2; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSW_a32(uint32_t fetchdat)
|
static int opMOVSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -32,7 +32,7 @@ static int opMOVSW_a32(uint32_t fetchdat)
|
||||||
writememw(es, EDI, temp); if (abrt) return 1;
|
writememw(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
|
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
|
||||||
else { EDI += 2; ESI += 2; }
|
else { EDI += 2; ESI += 2; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -42,7 +42,7 @@ static int opMOVSL_a16(uint32_t fetchdat)
|
||||||
writememl(es, DI, temp); if (abrt) return 1;
|
writememl(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
|
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
|
||||||
else { DI += 4; SI += 4; }
|
else { DI += 4; SI += 4; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opMOVSL_a32(uint32_t fetchdat)
|
static int opMOVSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -51,7 +51,7 @@ static int opMOVSL_a32(uint32_t fetchdat)
|
||||||
writememl(es, EDI, temp); if (abrt) return 1;
|
writememl(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
|
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
|
||||||
else { EDI += 4; ESI += 4; }
|
else { EDI += 4; ESI += 4; }
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -63,7 +63,7 @@ static int opCMPSB_a16(uint32_t fetchdat)
|
||||||
setsub8(src, dst);
|
setsub8(src, dst);
|
||||||
if (flags & D_FLAG) { DI--; SI--; }
|
if (flags & D_FLAG) { DI--; SI--; }
|
||||||
else { DI++; SI++; }
|
else { DI++; SI++; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPSB_a32(uint32_t fetchdat)
|
static int opCMPSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -73,7 +73,7 @@ static int opCMPSB_a32(uint32_t fetchdat)
|
||||||
setsub8(src, dst);
|
setsub8(src, dst);
|
||||||
if (flags & D_FLAG) { EDI--; ESI--; }
|
if (flags & D_FLAG) { EDI--; ESI--; }
|
||||||
else { EDI++; ESI++; }
|
else { EDI++; ESI++; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,7 +84,7 @@ static int opCMPSW_a16(uint32_t fetchdat)
|
||||||
setsub16(src, dst);
|
setsub16(src, dst);
|
||||||
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
|
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
|
||||||
else { DI += 2; SI += 2; }
|
else { DI += 2; SI += 2; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPSW_a32(uint32_t fetchdat)
|
static int opCMPSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -94,7 +94,7 @@ static int opCMPSW_a32(uint32_t fetchdat)
|
||||||
setsub16(src, dst);
|
setsub16(src, dst);
|
||||||
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
|
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
|
||||||
else { EDI += 2; ESI += 2; }
|
else { EDI += 2; ESI += 2; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ static int opCMPSL_a16(uint32_t fetchdat)
|
||||||
setsub32(src, dst);
|
setsub32(src, dst);
|
||||||
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
|
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
|
||||||
else { DI += 4; SI += 4; }
|
else { DI += 4; SI += 4; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opCMPSL_a32(uint32_t fetchdat)
|
static int opCMPSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -115,7 +115,7 @@ static int opCMPSL_a32(uint32_t fetchdat)
|
||||||
setsub32(src, dst);
|
setsub32(src, dst);
|
||||||
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
|
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
|
||||||
else { EDI += 4; ESI += 4; }
|
else { EDI += 4; ESI += 4; }
|
||||||
cycles -= (is486) ? 8 : 10;
|
CLOCK_CYCLES((is486) ? 8 : 10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ static int opSTOSB_a16(uint32_t fetchdat)
|
||||||
writememb(es, DI, AL); if (abrt) return 1;
|
writememb(es, DI, AL); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI--;
|
if (flags & D_FLAG) DI--;
|
||||||
else DI++;
|
else DI++;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSTOSB_a32(uint32_t fetchdat)
|
static int opSTOSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -132,7 +132,7 @@ static int opSTOSB_a32(uint32_t fetchdat)
|
||||||
writememb(es, EDI, AL); if (abrt) return 1;
|
writememb(es, EDI, AL); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI--;
|
if (flags & D_FLAG) EDI--;
|
||||||
else EDI++;
|
else EDI++;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,7 +141,7 @@ static int opSTOSW_a16(uint32_t fetchdat)
|
||||||
writememw(es, DI, AX); if (abrt) return 1;
|
writememw(es, DI, AX); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI -= 2;
|
if (flags & D_FLAG) DI -= 2;
|
||||||
else DI += 2;
|
else DI += 2;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSTOSW_a32(uint32_t fetchdat)
|
static int opSTOSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -149,7 +149,7 @@ static int opSTOSW_a32(uint32_t fetchdat)
|
||||||
writememw(es, EDI, AX); if (abrt) return 1;
|
writememw(es, EDI, AX); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI -= 2;
|
if (flags & D_FLAG) EDI -= 2;
|
||||||
else EDI += 2;
|
else EDI += 2;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -158,7 +158,7 @@ static int opSTOSL_a16(uint32_t fetchdat)
|
||||||
writememl(es, DI, EAX); if (abrt) return 1;
|
writememl(es, DI, EAX); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI -= 4;
|
if (flags & D_FLAG) DI -= 4;
|
||||||
else DI += 4;
|
else DI += 4;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSTOSL_a32(uint32_t fetchdat)
|
static int opSTOSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -166,7 +166,7 @@ static int opSTOSL_a32(uint32_t fetchdat)
|
||||||
writememl(es, EDI, EAX); if (abrt) return 1;
|
writememl(es, EDI, EAX); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI -= 4;
|
if (flags & D_FLAG) EDI -= 4;
|
||||||
else EDI += 4;
|
else EDI += 4;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,7 +177,7 @@ static int opLODSB_a16(uint32_t fetchdat)
|
||||||
AL = temp;
|
AL = temp;
|
||||||
if (flags & D_FLAG) SI--;
|
if (flags & D_FLAG) SI--;
|
||||||
else SI++;
|
else SI++;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLODSB_a32(uint32_t fetchdat)
|
static int opLODSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -186,7 +186,7 @@ static int opLODSB_a32(uint32_t fetchdat)
|
||||||
AL = temp;
|
AL = temp;
|
||||||
if (flags & D_FLAG) ESI--;
|
if (flags & D_FLAG) ESI--;
|
||||||
else ESI++;
|
else ESI++;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ static int opLODSW_a16(uint32_t fetchdat)
|
||||||
AX = temp;
|
AX = temp;
|
||||||
if (flags & D_FLAG) SI -= 2;
|
if (flags & D_FLAG) SI -= 2;
|
||||||
else SI += 2;
|
else SI += 2;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLODSW_a32(uint32_t fetchdat)
|
static int opLODSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -205,7 +205,7 @@ static int opLODSW_a32(uint32_t fetchdat)
|
||||||
AX = temp;
|
AX = temp;
|
||||||
if (flags & D_FLAG) ESI -= 2;
|
if (flags & D_FLAG) ESI -= 2;
|
||||||
else ESI += 2;
|
else ESI += 2;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -215,7 +215,7 @@ static int opLODSL_a16(uint32_t fetchdat)
|
||||||
EAX = temp;
|
EAX = temp;
|
||||||
if (flags & D_FLAG) SI -= 4;
|
if (flags & D_FLAG) SI -= 4;
|
||||||
else SI += 4;
|
else SI += 4;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opLODSL_a32(uint32_t fetchdat)
|
static int opLODSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -224,7 +224,7 @@ static int opLODSL_a32(uint32_t fetchdat)
|
||||||
EAX = temp;
|
EAX = temp;
|
||||||
if (flags & D_FLAG) ESI -= 4;
|
if (flags & D_FLAG) ESI -= 4;
|
||||||
else ESI += 4;
|
else ESI += 4;
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ static int opSCASB_a16(uint32_t fetchdat)
|
||||||
setsub8(AL, temp);
|
setsub8(AL, temp);
|
||||||
if (flags & D_FLAG) DI--;
|
if (flags & D_FLAG) DI--;
|
||||||
else DI++;
|
else DI++;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSCASB_a32(uint32_t fetchdat)
|
static int opSCASB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -244,7 +244,7 @@ static int opSCASB_a32(uint32_t fetchdat)
|
||||||
setsub8(AL, temp);
|
setsub8(AL, temp);
|
||||||
if (flags & D_FLAG) EDI--;
|
if (flags & D_FLAG) EDI--;
|
||||||
else EDI++;
|
else EDI++;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -254,7 +254,7 @@ static int opSCASW_a16(uint32_t fetchdat)
|
||||||
setsub16(AX, temp);
|
setsub16(AX, temp);
|
||||||
if (flags & D_FLAG) DI -= 2;
|
if (flags & D_FLAG) DI -= 2;
|
||||||
else DI += 2;
|
else DI += 2;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSCASW_a32(uint32_t fetchdat)
|
static int opSCASW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -263,7 +263,7 @@ static int opSCASW_a32(uint32_t fetchdat)
|
||||||
setsub16(AX, temp);
|
setsub16(AX, temp);
|
||||||
if (flags & D_FLAG) EDI -= 2;
|
if (flags & D_FLAG) EDI -= 2;
|
||||||
else EDI += 2;
|
else EDI += 2;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -273,7 +273,7 @@ static int opSCASL_a16(uint32_t fetchdat)
|
||||||
setsub32(EAX, temp);
|
setsub32(EAX, temp);
|
||||||
if (flags & D_FLAG) DI -= 4;
|
if (flags & D_FLAG) DI -= 4;
|
||||||
else DI += 4;
|
else DI += 4;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opSCASL_a32(uint32_t fetchdat)
|
static int opSCASL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -282,7 +282,7 @@ static int opSCASL_a32(uint32_t fetchdat)
|
||||||
setsub32(EAX, temp);
|
setsub32(EAX, temp);
|
||||||
if (flags & D_FLAG) EDI -= 4;
|
if (flags & D_FLAG) EDI -= 4;
|
||||||
else EDI += 4;
|
else EDI += 4;
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -294,7 +294,7 @@ static int opINSB_a16(uint32_t fetchdat)
|
||||||
writememb(es, DI, temp); if (abrt) return 1;
|
writememb(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI--;
|
if (flags & D_FLAG) DI--;
|
||||||
else DI++;
|
else DI++;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opINSB_a32(uint32_t fetchdat)
|
static int opINSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -305,7 +305,7 @@ static int opINSB_a32(uint32_t fetchdat)
|
||||||
writememb(es, EDI, temp); if (abrt) return 1;
|
writememb(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI--;
|
if (flags & D_FLAG) EDI--;
|
||||||
else EDI++;
|
else EDI++;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -318,7 +318,7 @@ static int opINSW_a16(uint32_t fetchdat)
|
||||||
writememw(es, DI, temp); if (abrt) return 1;
|
writememw(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI -= 2;
|
if (flags & D_FLAG) DI -= 2;
|
||||||
else DI += 2;
|
else DI += 2;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opINSW_a32(uint32_t fetchdat)
|
static int opINSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -330,7 +330,7 @@ static int opINSW_a32(uint32_t fetchdat)
|
||||||
writememw(es, EDI, temp); if (abrt) return 1;
|
writememw(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI -= 2;
|
if (flags & D_FLAG) EDI -= 2;
|
||||||
else EDI += 2;
|
else EDI += 2;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -345,7 +345,7 @@ static int opINSL_a16(uint32_t fetchdat)
|
||||||
writememl(es, DI, temp); if (abrt) return 1;
|
writememl(es, DI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) DI -= 4;
|
if (flags & D_FLAG) DI -= 4;
|
||||||
else DI += 4;
|
else DI += 4;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opINSL_a32(uint32_t fetchdat)
|
static int opINSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -359,7 +359,7 @@ static int opINSL_a32(uint32_t fetchdat)
|
||||||
writememl(es, EDI, temp); if (abrt) return 1;
|
writememl(es, EDI, temp); if (abrt) return 1;
|
||||||
if (flags & D_FLAG) EDI -= 4;
|
if (flags & D_FLAG) EDI -= 4;
|
||||||
else EDI += 4;
|
else EDI += 4;
|
||||||
cycles -= 15;
|
CLOCK_CYCLES(15);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -370,7 +370,7 @@ static int opOUTSB_a16(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) SI--;
|
if (flags & D_FLAG) SI--;
|
||||||
else SI++;
|
else SI++;
|
||||||
outb(DX, temp);
|
outb(DX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUTSB_a32(uint32_t fetchdat)
|
static int opOUTSB_a32(uint32_t fetchdat)
|
||||||
|
|
@ -380,7 +380,7 @@ static int opOUTSB_a32(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) ESI--;
|
if (flags & D_FLAG) ESI--;
|
||||||
else ESI++;
|
else ESI++;
|
||||||
outb(DX, temp);
|
outb(DX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -392,7 +392,7 @@ static int opOUTSW_a16(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) SI -= 2;
|
if (flags & D_FLAG) SI -= 2;
|
||||||
else SI += 2;
|
else SI += 2;
|
||||||
outw(DX, temp);
|
outw(DX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUTSW_a32(uint32_t fetchdat)
|
static int opOUTSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -403,7 +403,7 @@ static int opOUTSW_a32(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) ESI -= 2;
|
if (flags & D_FLAG) ESI -= 2;
|
||||||
else ESI += 2;
|
else ESI += 2;
|
||||||
outw(DX, temp);
|
outw(DX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -417,7 +417,7 @@ static int opOUTSL_a16(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) SI -= 4;
|
if (flags & D_FLAG) SI -= 4;
|
||||||
else SI += 4;
|
else SI += 4;
|
||||||
outl(EDX, temp);
|
outl(EDX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opOUTSL_a32(uint32_t fetchdat)
|
static int opOUTSL_a32(uint32_t fetchdat)
|
||||||
|
|
@ -430,6 +430,6 @@ static int opOUTSL_a32(uint32_t fetchdat)
|
||||||
if (flags & D_FLAG) ESI -= 4;
|
if (flags & D_FLAG) ESI -= 4;
|
||||||
else ESI += 4;
|
else ESI += 4;
|
||||||
outl(EDX, temp);
|
outl(EDX, temp);
|
||||||
cycles -= 14;
|
CLOCK_CYCLES(14);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ static int opXCHG_b_a16(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
seteab(getr8(reg)); if (abrt) return 1;
|
seteab(getr8(reg)); if (abrt) return 1;
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_b_a32(uint32_t fetchdat)
|
static int opXCHG_b_a32(uint32_t fetchdat)
|
||||||
|
|
@ -15,7 +15,7 @@ static int opXCHG_b_a32(uint32_t fetchdat)
|
||||||
temp = geteab(); if (abrt) return 1;
|
temp = geteab(); if (abrt) return 1;
|
||||||
seteab(getr8(reg)); if (abrt) return 1;
|
seteab(getr8(reg)); if (abrt) return 1;
|
||||||
setr8(reg, temp);
|
setr8(reg, temp);
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ static int opXCHG_w_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(regs[reg].w); if (abrt) return 1;
|
seteaw(regs[reg].w); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_w_a32(uint32_t fetchdat)
|
static int opXCHG_w_a32(uint32_t fetchdat)
|
||||||
|
|
@ -36,7 +36,7 @@ static int opXCHG_w_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
seteaw(regs[reg].w); if (abrt) return 1;
|
seteaw(regs[reg].w); if (abrt) return 1;
|
||||||
regs[reg].w = temp;
|
regs[reg].w = temp;
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ static int opXCHG_l_a16(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(regs[reg].l); if (abrt) return 1;
|
seteal(regs[reg].l); if (abrt) return 1;
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_l_a32(uint32_t fetchdat)
|
static int opXCHG_l_a32(uint32_t fetchdat)
|
||||||
|
|
@ -57,7 +57,7 @@ static int opXCHG_l_a32(uint32_t fetchdat)
|
||||||
temp = geteal(); if (abrt) return 1;
|
temp = geteal(); if (abrt) return 1;
|
||||||
seteal(regs[reg].l); if (abrt) return 1;
|
seteal(regs[reg].l); if (abrt) return 1;
|
||||||
regs[reg].l = temp;
|
regs[reg].l = temp;
|
||||||
cycles -= ((mod == 3) ? 3 : 5);
|
CLOCK_CYCLES((mod == 3) ? 3 : 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ static int opXCHG_AX_BX(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = BX;
|
AX = BX;
|
||||||
BX = temp;
|
BX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_CX(uint32_t fetchdat)
|
static int opXCHG_AX_CX(uint32_t fetchdat)
|
||||||
|
|
@ -75,7 +75,7 @@ static int opXCHG_AX_CX(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = CX;
|
AX = CX;
|
||||||
CX = temp;
|
CX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_DX(uint32_t fetchdat)
|
static int opXCHG_AX_DX(uint32_t fetchdat)
|
||||||
|
|
@ -83,7 +83,7 @@ static int opXCHG_AX_DX(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = DX;
|
AX = DX;
|
||||||
DX = temp;
|
DX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_SI(uint32_t fetchdat)
|
static int opXCHG_AX_SI(uint32_t fetchdat)
|
||||||
|
|
@ -91,7 +91,7 @@ static int opXCHG_AX_SI(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = SI;
|
AX = SI;
|
||||||
SI = temp;
|
SI = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_DI(uint32_t fetchdat)
|
static int opXCHG_AX_DI(uint32_t fetchdat)
|
||||||
|
|
@ -99,7 +99,7 @@ static int opXCHG_AX_DI(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = DI;
|
AX = DI;
|
||||||
DI = temp;
|
DI = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_BP(uint32_t fetchdat)
|
static int opXCHG_AX_BP(uint32_t fetchdat)
|
||||||
|
|
@ -107,7 +107,7 @@ static int opXCHG_AX_BP(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = BP;
|
AX = BP;
|
||||||
BP = temp;
|
BP = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_AX_SP(uint32_t fetchdat)
|
static int opXCHG_AX_SP(uint32_t fetchdat)
|
||||||
|
|
@ -115,7 +115,7 @@ static int opXCHG_AX_SP(uint32_t fetchdat)
|
||||||
uint16_t temp = AX;
|
uint16_t temp = AX;
|
||||||
AX = SP;
|
AX = SP;
|
||||||
SP = temp;
|
SP = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ static int opXCHG_EAX_EBX(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = EBX;
|
EAX = EBX;
|
||||||
EBX = temp;
|
EBX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_ECX(uint32_t fetchdat)
|
static int opXCHG_EAX_ECX(uint32_t fetchdat)
|
||||||
|
|
@ -132,7 +132,7 @@ static int opXCHG_EAX_ECX(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = ECX;
|
EAX = ECX;
|
||||||
ECX = temp;
|
ECX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_EDX(uint32_t fetchdat)
|
static int opXCHG_EAX_EDX(uint32_t fetchdat)
|
||||||
|
|
@ -140,7 +140,7 @@ static int opXCHG_EAX_EDX(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = EDX;
|
EAX = EDX;
|
||||||
EDX = temp;
|
EDX = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_ESI(uint32_t fetchdat)
|
static int opXCHG_EAX_ESI(uint32_t fetchdat)
|
||||||
|
|
@ -148,7 +148,7 @@ static int opXCHG_EAX_ESI(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = ESI;
|
EAX = ESI;
|
||||||
ESI = temp;
|
ESI = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_EDI(uint32_t fetchdat)
|
static int opXCHG_EAX_EDI(uint32_t fetchdat)
|
||||||
|
|
@ -156,7 +156,7 @@ static int opXCHG_EAX_EDI(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = EDI;
|
EAX = EDI;
|
||||||
EDI = temp;
|
EDI = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_EBP(uint32_t fetchdat)
|
static int opXCHG_EAX_EBP(uint32_t fetchdat)
|
||||||
|
|
@ -164,7 +164,7 @@ static int opXCHG_EAX_EBP(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = EBP;
|
EAX = EBP;
|
||||||
EBP = temp;
|
EBP = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opXCHG_EAX_ESP(uint32_t fetchdat)
|
static int opXCHG_EAX_ESP(uint32_t fetchdat)
|
||||||
|
|
@ -172,7 +172,7 @@ static int opXCHG_EAX_ESP(uint32_t fetchdat)
|
||||||
uint32_t temp = EAX;
|
uint32_t temp = EAX;
|
||||||
EAX = ESP;
|
EAX = ESP;
|
||||||
ESP = temp;
|
ESP = temp;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,7 +181,7 @@ static int opXCHG_EAX_ESP(uint32_t fetchdat)
|
||||||
static int opBSWAP_ ## reg(uint32_t fetchdat) \
|
static int opBSWAP_ ## reg(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
reg = (reg >> 24) | ((reg >> 8) & 0xff00) | ((reg << 8) & 0xff0000) | ((reg << 24) & 0xff000000); \
|
reg = (reg >> 24) | ((reg >> 8) & 0xff00) | ((reg << 8) & 0xff0000) | ((reg << 24) & 0xff000000); \
|
||||||
cycles--; \
|
CLOCK_CYCLES(1); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@ static int opFADD ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
ST(0) += use_var; \
|
ST(0) += use_var; \
|
||||||
cycles -= 8; \
|
CLOCK_CYCLES(8); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -17,7 +18,8 @@ static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
npxs &= ~(C0|C2|C3); \
|
npxs &= ~(C0|C2|C3); \
|
||||||
if (ST(0) == use_var) npxs |= C3; \
|
if (ST(0) == use_var) npxs |= C3; \
|
||||||
else if (ST(0) < use_var) npxs |= C0; \
|
else if (ST(0) < use_var) npxs |= C0; \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -29,7 +31,8 @@ static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
if (ST(0) == use_var) npxs |= C3; \
|
if (ST(0) == use_var) npxs |= C3; \
|
||||||
else if (ST(0) < use_var) npxs |= C0; \
|
else if (ST(0) < use_var) npxs |= C0; \
|
||||||
x87_pop(); \
|
x87_pop(); \
|
||||||
cycles -= 4; \
|
CLOCK_CYCLES(4); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -38,7 +41,8 @@ static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
x87_div(ST(0), ST(0), use_var); \
|
x87_div(ST(0), ST(0), use_var); \
|
||||||
cycles -= 73; \
|
CLOCK_CYCLES(73); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -47,7 +51,8 @@ static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
x87_div(ST(0), use_var, ST(0)); \
|
x87_div(ST(0), use_var, ST(0)); \
|
||||||
cycles -= 73; \
|
CLOCK_CYCLES(73); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -56,7 +61,8 @@ static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
ST(0) *= use_var; \
|
ST(0) *= use_var; \
|
||||||
cycles -= 11; \
|
CLOCK_CYCLES(11); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -65,7 +71,8 @@ static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
ST(0) -= use_var; \
|
ST(0) -= use_var; \
|
||||||
cycles -= 8; \
|
CLOCK_CYCLES(8); \
|
||||||
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -74,7 +81,8 @@ static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
fetch_ea_ ## a_size(fetchdat); \
|
fetch_ea_ ## a_size(fetchdat); \
|
||||||
load_var = get(); if (abrt) return 1; \
|
load_var = get(); if (abrt) return 1; \
|
||||||
ST(0) = use_var - ST(0); \
|
ST(0) = use_var - ST(0); \
|
||||||
cycles -= 8; \
|
CLOCK_CYCLES(8); \
|
||||||
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -97,7 +105,7 @@ static int opFADD(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FADD\n");
|
if (fplog) pclog("FADD\n");
|
||||||
ST(0) = ST(0) + ST(fetchdat & 7);
|
ST(0) = ST(0) + ST(fetchdat & 7);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFADDr(uint32_t fetchdat)
|
static int opFADDr(uint32_t fetchdat)
|
||||||
|
|
@ -106,7 +114,7 @@ static int opFADDr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FADD\n");
|
if (fplog) pclog("FADD\n");
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFADDP(uint32_t fetchdat)
|
static int opFADDP(uint32_t fetchdat)
|
||||||
|
|
@ -116,7 +124,7 @@ static int opFADDP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FADDP\n");
|
if (fplog) pclog("FADDP\n");
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -128,7 +136,7 @@ static int opFCOM(uint32_t fetchdat)
|
||||||
npxs &= ~(C0|C2|C3);
|
npxs &= ~(C0|C2|C3);
|
||||||
if (ST(0) == ST(fetchdat & 7)) npxs |= C3;
|
if (ST(0) == ST(fetchdat & 7)) npxs |= C3;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) npxs |= C0;
|
else if (ST(0) < ST(fetchdat & 7)) npxs |= C0;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,7 +149,7 @@ static int opFCOMP(uint32_t fetchdat)
|
||||||
if (ST(0) == ST(fetchdat & 7)) npxs |= C3;
|
if (ST(0) == ST(fetchdat & 7)) npxs |= C3;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) npxs |= C0;
|
else if (ST(0) < ST(fetchdat & 7)) npxs |= C0;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -155,7 +163,7 @@ static int opFCOMPP(uint32_t fetchdat)
|
||||||
else if (ST(0) < ST(1)) npxs |= C0;
|
else if (ST(0) < ST(1)) npxs |= C0;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFUCOMPP(uint32_t fetchdat)
|
static int opFUCOMPP(uint32_t fetchdat)
|
||||||
|
|
@ -168,7 +176,7 @@ static int opFUCOMPP(uint32_t fetchdat)
|
||||||
else if (ST(0) < ST(1)) npxs |= C0;
|
else if (ST(0) < ST(1)) npxs |= C0;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 5;
|
CLOCK_CYCLES(5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -178,7 +186,7 @@ static int opFDIV(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDIV\n");
|
if (fplog) pclog("FDIV\n");
|
||||||
x87_div(ST(0), ST(0), ST(fetchdat & 7));
|
x87_div(ST(0), ST(0), ST(fetchdat & 7));
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVr(uint32_t fetchdat)
|
static int opFDIVr(uint32_t fetchdat)
|
||||||
|
|
@ -187,7 +195,7 @@ static int opFDIVr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDIV\n");
|
if (fplog) pclog("FDIV\n");
|
||||||
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVP(uint32_t fetchdat)
|
static int opFDIVP(uint32_t fetchdat)
|
||||||
|
|
@ -197,7 +205,7 @@ static int opFDIVP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FDIVP\n");
|
if (fplog) pclog("FDIVP\n");
|
||||||
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -207,7 +215,7 @@ static int opFDIVR(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDIVR\n");
|
if (fplog) pclog("FDIVR\n");
|
||||||
x87_div(ST(0), ST(fetchdat&7), ST(0));
|
x87_div(ST(0), ST(fetchdat&7), ST(0));
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVRr(uint32_t fetchdat)
|
static int opFDIVRr(uint32_t fetchdat)
|
||||||
|
|
@ -216,7 +224,7 @@ static int opFDIVRr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDIVR\n");
|
if (fplog) pclog("FDIVR\n");
|
||||||
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVRP(uint32_t fetchdat)
|
static int opFDIVRP(uint32_t fetchdat)
|
||||||
|
|
@ -226,7 +234,7 @@ static int opFDIVRP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FDIVR\n");
|
if (fplog) pclog("FDIVR\n");
|
||||||
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 73;
|
CLOCK_CYCLES(73);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -236,7 +244,7 @@ static int opFMUL(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FMUL\n");
|
if (fplog) pclog("FMUL\n");
|
||||||
ST(0) = ST(0) * ST(fetchdat & 7);
|
ST(0) = ST(0) * ST(fetchdat & 7);
|
||||||
cycles -= 16;
|
CLOCK_CYCLES(16);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFMULr(uint32_t fetchdat)
|
static int opFMULr(uint32_t fetchdat)
|
||||||
|
|
@ -245,7 +253,7 @@ static int opFMULr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FMUL\n");
|
if (fplog) pclog("FMUL\n");
|
||||||
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
||||||
cycles -= 16;
|
CLOCK_CYCLES(16);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFMULP(uint32_t fetchdat)
|
static int opFMULP(uint32_t fetchdat)
|
||||||
|
|
@ -255,7 +263,7 @@ static int opFMULP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FMULP\n");
|
if (fplog) pclog("FMULP\n");
|
||||||
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 16;
|
CLOCK_CYCLES(16);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -265,7 +273,7 @@ static int opFSUB(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSUB\n");
|
if (fplog) pclog("FSUB\n");
|
||||||
ST(0) = ST(0) - ST(fetchdat & 7);
|
ST(0) = ST(0) - ST(fetchdat & 7);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBr(uint32_t fetchdat)
|
static int opFSUBr(uint32_t fetchdat)
|
||||||
|
|
@ -274,7 +282,7 @@ static int opFSUBr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSUB\n");
|
if (fplog) pclog("FSUB\n");
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBP(uint32_t fetchdat)
|
static int opFSUBP(uint32_t fetchdat)
|
||||||
|
|
@ -284,7 +292,7 @@ static int opFSUBP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSUBP\n");
|
if (fplog) pclog("FSUBP\n");
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -294,7 +302,7 @@ static int opFSUBR(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSUBR\n");
|
if (fplog) pclog("FSUBR\n");
|
||||||
ST(0) = ST(fetchdat & 7) - ST(0);
|
ST(0) = ST(fetchdat & 7) - ST(0);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBRr(uint32_t fetchdat)
|
static int opFSUBRr(uint32_t fetchdat)
|
||||||
|
|
@ -303,7 +311,7 @@ static int opFSUBRr(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSUBR\n");
|
if (fplog) pclog("FSUBR\n");
|
||||||
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBRP(uint32_t fetchdat)
|
static int opFSUBRP(uint32_t fetchdat)
|
||||||
|
|
@ -313,7 +321,7 @@ static int opFSUBRP(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSUBRP\n");
|
if (fplog) pclog("FSUBRP\n");
|
||||||
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -325,7 +333,7 @@ static int opFUCOM(uint32_t fetchdat)
|
||||||
npxs &= ~(C0|C2|C3);
|
npxs &= ~(C0|C2|C3);
|
||||||
if (ST(0) == ST(fetchdat&7)) npxs |= C3;
|
if (ST(0) == ST(fetchdat&7)) npxs |= C3;
|
||||||
else if (ST(0) < ST(fetchdat&7)) npxs |= C0;
|
else if (ST(0) < ST(fetchdat&7)) npxs |= C0;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -338,6 +346,6 @@ static int opFUCOMP(uint32_t fetchdat)
|
||||||
if (ST(0) == ST(fetchdat&7)) npxs |= C3;
|
if (ST(0) == ST(fetchdat&7)) npxs |= C3;
|
||||||
else if (ST(0) < ST(fetchdat&7)) npxs |= C0;
|
else if (ST(0) < ST(fetchdat&7)) npxs |= C0;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ static int opFILDiw_a16(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", (double)temp);
|
if (fplog) pclog(" %f\n", (double)temp);
|
||||||
x87_push((double)temp);
|
x87_push((double)temp);
|
||||||
cycles -= 13;
|
CLOCK_CYCLES(13);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFILDiw_a32(uint32_t fetchdat)
|
static int opFILDiw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -19,7 +19,7 @@ static int opFILDiw_a32(uint32_t fetchdat)
|
||||||
temp = geteaw(); if (abrt) return 1;
|
temp = geteaw(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", (double)temp);
|
if (fplog) pclog(" %f\n", (double)temp);
|
||||||
x87_push((double)temp);
|
x87_push((double)temp);
|
||||||
cycles -= 13;
|
CLOCK_CYCLES(13);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ static int opFISTiw_a16(uint32_t fetchdat)
|
||||||
/* if (temp64 > 32767 || temp64 < -32768)
|
/* if (temp64 > 32767 || temp64 < -32768)
|
||||||
fatal("FISTw overflow %i\n", temp64);*/
|
fatal("FISTw overflow %i\n", temp64);*/
|
||||||
seteaw((int16_t)temp64);
|
seteaw((int16_t)temp64);
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFISTiw_a32(uint32_t fetchdat)
|
static int opFISTiw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -46,7 +46,7 @@ static int opFISTiw_a32(uint32_t fetchdat)
|
||||||
/* if (temp64 > 32767 || temp64 < -32768)
|
/* if (temp64 > 32767 || temp64 < -32768)
|
||||||
fatal("FISTw overflow %i\n", temp64);*/
|
fatal("FISTw overflow %i\n", temp64);*/
|
||||||
seteaw((int16_t)temp64);
|
seteaw((int16_t)temp64);
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,7 +61,7 @@ static int opFISTPiw_a16(uint32_t fetchdat)
|
||||||
fatal("FISTw overflow %i\n", temp64);*/
|
fatal("FISTw overflow %i\n", temp64);*/
|
||||||
seteaw((int16_t)temp64); if (abrt) return 1;
|
seteaw((int16_t)temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFISTPiw_a32(uint32_t fetchdat)
|
static int opFISTPiw_a32(uint32_t fetchdat)
|
||||||
|
|
@ -75,7 +75,7 @@ static int opFISTPiw_a32(uint32_t fetchdat)
|
||||||
fatal("FISTw overflow %i\n", temp64);*/
|
fatal("FISTw overflow %i\n", temp64);*/
|
||||||
seteaw((int16_t)temp64); if (abrt) return 1;
|
seteaw((int16_t)temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,7 +88,7 @@ static int opFILDiq_a16(uint32_t fetchdat)
|
||||||
temp64 = geteaq(); if (abrt) return 1;
|
temp64 = geteaq(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,eaaddr), readmeml(easeg,eaaddr+4));
|
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,eaaddr), readmeml(easeg,eaaddr+4));
|
||||||
x87_push((double)temp64);
|
x87_push((double)temp64);
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFILDiq_a32(uint32_t fetchdat)
|
static int opFILDiq_a32(uint32_t fetchdat)
|
||||||
|
|
@ -100,7 +100,7 @@ static int opFILDiq_a32(uint32_t fetchdat)
|
||||||
temp64 = geteaq(); if (abrt) return 1;
|
temp64 = geteaq(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,eaaddr), readmeml(easeg,eaaddr+4));
|
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,eaaddr), readmeml(easeg,eaaddr+4));
|
||||||
x87_push((double)temp64);
|
x87_push((double)temp64);
|
||||||
cycles -= 10;
|
CLOCK_CYCLES(10);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,8 +166,8 @@ static int FISTPiq_a16(uint32_t fetchdat)
|
||||||
temp64 = x87_fround(ST(0));
|
temp64 = x87_fround(ST(0));
|
||||||
seteaq(temp64); if (abrt) return 1;
|
seteaq(temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
static int FISTPiq_a32(uint32_t fetchdat)
|
static int FISTPiq_a32(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
|
|
@ -178,8 +178,8 @@ static int FISTPiq_a32(uint32_t fetchdat)
|
||||||
temp64 = x87_fround(ST(0));
|
temp64 = x87_fround(ST(0));
|
||||||
seteaq(temp64); if (abrt) return 1;
|
seteaq(temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 29;
|
CLOCK_CYCLES(29);
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opFILDil_a16(uint32_t fetchdat)
|
static int opFILDil_a16(uint32_t fetchdat)
|
||||||
|
|
@ -191,7 +191,7 @@ static int opFILDil_a16(uint32_t fetchdat)
|
||||||
templ = geteal(); if (abrt) return 1;
|
templ = geteal(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
|
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
|
||||||
x87_push((double)templ);
|
x87_push((double)templ);
|
||||||
cycles -= 9;
|
CLOCK_CYCLES(9);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFILDil_a32(uint32_t fetchdat)
|
static int opFILDil_a32(uint32_t fetchdat)
|
||||||
|
|
@ -203,7 +203,7 @@ static int opFILDil_a32(uint32_t fetchdat)
|
||||||
templ = geteal(); if (abrt) return 1;
|
templ = geteal(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
|
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
|
||||||
x87_push((double)templ);
|
x87_push((double)templ);
|
||||||
cycles -= 9;
|
CLOCK_CYCLES(9);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,7 +217,7 @@ static int opFISTil_a16(uint32_t fetchdat)
|
||||||
/* if (temp64 > 2147483647 || temp64 < -2147483647)
|
/* if (temp64 > 2147483647 || temp64 < -2147483647)
|
||||||
fatal("FISTl out of range! %i\n", temp64);*/
|
fatal("FISTl out of range! %i\n", temp64);*/
|
||||||
seteal((int32_t)temp64);
|
seteal((int32_t)temp64);
|
||||||
cycles -= 28;
|
CLOCK_CYCLES(28);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFISTil_a32(uint32_t fetchdat)
|
static int opFISTil_a32(uint32_t fetchdat)
|
||||||
|
|
@ -230,7 +230,7 @@ static int opFISTil_a32(uint32_t fetchdat)
|
||||||
/* if (temp64 > 2147483647 || temp64 < -2147483647)
|
/* if (temp64 > 2147483647 || temp64 < -2147483647)
|
||||||
fatal("FISTl out of range! %i\n", temp64);*/
|
fatal("FISTl out of range! %i\n", temp64);*/
|
||||||
seteal((int32_t)temp64);
|
seteal((int32_t)temp64);
|
||||||
cycles -= 28;
|
CLOCK_CYCLES(28);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -245,7 +245,7 @@ static int opFISTPil_a16(uint32_t fetchdat)
|
||||||
fatal("FISTl out of range! %i\n", temp64);*/
|
fatal("FISTl out of range! %i\n", temp64);*/
|
||||||
seteal((int32_t)temp64); if (abrt) return 1;
|
seteal((int32_t)temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 28;
|
CLOCK_CYCLES(28);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFISTPil_a32(uint32_t fetchdat)
|
static int opFISTPil_a32(uint32_t fetchdat)
|
||||||
|
|
@ -259,7 +259,7 @@ static int opFISTPil_a32(uint32_t fetchdat)
|
||||||
fatal("FISTl out of range! %i\n", temp64);*/
|
fatal("FISTl out of range! %i\n", temp64);*/
|
||||||
seteal((int32_t)temp64); if (abrt) return 1;
|
seteal((int32_t)temp64); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 28;
|
CLOCK_CYCLES(28);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -272,7 +272,7 @@ static int opFLDe_a16(uint32_t fetchdat)
|
||||||
t=x87_ld80(); if (abrt) return 1;
|
t=x87_ld80(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", t);
|
if (fplog) pclog(" %f\n", t);
|
||||||
x87_push(t);
|
x87_push(t);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFLDe_a32(uint32_t fetchdat)
|
static int opFLDe_a32(uint32_t fetchdat)
|
||||||
|
|
@ -284,7 +284,7 @@ static int opFLDe_a32(uint32_t fetchdat)
|
||||||
t=x87_ld80(); if (abrt) return 1;
|
t=x87_ld80(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", t);
|
if (fplog) pclog(" %f\n", t);
|
||||||
x87_push(t);
|
x87_push(t);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -295,7 +295,7 @@ static int opFSTPe_a16(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, eaaddr);
|
||||||
x87_st80(ST(0)); if (abrt) return 1;
|
x87_st80(ST(0)); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSTPe_a32(uint32_t fetchdat)
|
static int opFSTPe_a32(uint32_t fetchdat)
|
||||||
|
|
@ -305,7 +305,7 @@ static int opFSTPe_a32(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, eaaddr);
|
||||||
x87_st80(ST(0)); if (abrt) return 1;
|
x87_st80(ST(0)); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -318,7 +318,7 @@ static int opFLDd_a16(uint32_t fetchdat)
|
||||||
t.i = geteaq(); if (abrt) return 1;
|
t.i = geteaq(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", t.d);
|
if (fplog) pclog(" %f\n", t.d);
|
||||||
x87_push(t.d);
|
x87_push(t.d);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFLDd_a32(uint32_t fetchdat)
|
static int opFLDd_a32(uint32_t fetchdat)
|
||||||
|
|
@ -330,7 +330,7 @@ static int opFLDd_a32(uint32_t fetchdat)
|
||||||
t.i = geteaq(); if (abrt) return 1;
|
t.i = geteaq(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", t.d);
|
if (fplog) pclog(" %f\n", t.d);
|
||||||
x87_push(t.d);
|
x87_push(t.d);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -342,7 +342,7 @@ static int opFSTd_a16(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTd %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTd %08X:%08X\n", easeg, eaaddr);
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i);
|
seteaq(t.i);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSTd_a32(uint32_t fetchdat)
|
static int opFSTd_a32(uint32_t fetchdat)
|
||||||
|
|
@ -353,7 +353,7 @@ static int opFSTd_a32(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTd %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTd %08X:%08X\n", easeg, eaaddr);
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i);
|
seteaq(t.i);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -366,7 +366,7 @@ static int opFSTPd_a16(uint32_t fetchdat)
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i); if (abrt) return 1;
|
seteaq(t.i); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSTPd_a32(uint32_t fetchdat)
|
static int opFSTPd_a32(uint32_t fetchdat)
|
||||||
|
|
@ -378,7 +378,7 @@ static int opFSTPd_a32(uint32_t fetchdat)
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i); if (abrt) return 1;
|
seteaq(t.i); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -391,7 +391,7 @@ static int opFLDs_a16(uint32_t fetchdat)
|
||||||
ts.i = geteal(); if (abrt) return 1;
|
ts.i = geteal(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", ts.s);
|
if (fplog) pclog(" %f\n", ts.s);
|
||||||
x87_push((double)ts.s);
|
x87_push((double)ts.s);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFLDs_a32(uint32_t fetchdat)
|
static int opFLDs_a32(uint32_t fetchdat)
|
||||||
|
|
@ -403,7 +403,7 @@ static int opFLDs_a32(uint32_t fetchdat)
|
||||||
ts.i = geteal(); if (abrt) return 1;
|
ts.i = geteal(); if (abrt) return 1;
|
||||||
if (fplog) pclog(" %f\n", ts.s);
|
if (fplog) pclog(" %f\n", ts.s);
|
||||||
x87_push((double)ts.s);
|
x87_push((double)ts.s);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -415,7 +415,7 @@ static int opFSTs_a16(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTs %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTs %08X:%08X\n", easeg, eaaddr);
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i);
|
seteal(ts.i);
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSTs_a32(uint32_t fetchdat)
|
static int opFSTs_a32(uint32_t fetchdat)
|
||||||
|
|
@ -426,7 +426,7 @@ static int opFSTs_a32(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSTs %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTs %08X:%08X\n", easeg, eaaddr);
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i);
|
seteal(ts.i);
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -439,7 +439,7 @@ static int opFSTPs_a16(uint32_t fetchdat)
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i); if (abrt) return 1;
|
seteal(ts.i); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSTPs_a32(uint32_t fetchdat)
|
static int opFSTPs_a32(uint32_t fetchdat)
|
||||||
|
|
@ -451,6 +451,6 @@ static int opFSTPs_a32(uint32_t fetchdat)
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i); if (abrt) return 1;
|
seteal(ts.i); if (abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 7;
|
CLOCK_CYCLES(7);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ static int opFSTSW_AX(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSTSW\n");
|
if (fplog) pclog("FSTSW\n");
|
||||||
AX = npxs;
|
AX = npxs;
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -14,7 +14,7 @@ static int opFNOP(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
pc++;
|
pc++;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ static int opFCLEX(uint32_t fetchdat)
|
||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
pc++;
|
pc++;
|
||||||
npxs &= 0xff00;
|
npxs &= 0xff00;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ static int opFINIT(uint32_t fetchdat)
|
||||||
npxs = 0;
|
npxs = 0;
|
||||||
tag = 0xFFFF;
|
tag = 0xFFFF;
|
||||||
TOP = 0;
|
TOP = 0;
|
||||||
cycles -= 17;
|
CLOCK_CYCLES(17);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -46,7 +46,7 @@ static int opFFREE(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FFREE\n");
|
if (fplog) pclog("FFREE\n");
|
||||||
tag |= (3 << (((TOP + fetchdat) & 7) << 1));
|
tag |= (3 << (((TOP + fetchdat) & 7) << 1));
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ static int opFST(uint32_t fetchdat)
|
||||||
temp = (tag >> ((TOP & 7) << 1)) & 3;
|
temp = (tag >> ((TOP & 7) << 1)) & 3;
|
||||||
tag &= ~(3 << (((TOP + fetchdat) & 7) << 1));
|
tag &= ~(3 << (((TOP + fetchdat) & 7) << 1));
|
||||||
tag |= (temp << (((TOP + fetchdat) & 7) << 1));
|
tag |= (temp << (((TOP + fetchdat) & 7) << 1));
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,14 +75,14 @@ static int opFSTP(uint32_t fetchdat)
|
||||||
tag &= ~(3 << (((TOP + fetchdat) & 7) << 1));
|
tag &= ~(3 << (((TOP + fetchdat) & 7) << 1));
|
||||||
tag |= (temp << (((TOP + fetchdat) & 7) << 1));
|
tag |= (temp << (((TOP + fetchdat) & 7) << 1));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void FSTOR()
|
static int FSTOR()
|
||||||
{
|
{
|
||||||
switch ((cr0 & 1) | (op32 & 0x100))
|
switch ((cr0 & 1) | (op32 & 0x100))
|
||||||
{
|
{
|
||||||
|
|
@ -119,8 +119,9 @@ static void FSTOR()
|
||||||
!TOP && !tag)
|
!TOP && !tag)
|
||||||
ismmx = 1;
|
ismmx = 1;
|
||||||
|
|
||||||
cycles -= (cr0 & 1) ? 34 : 44;
|
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
|
||||||
if (fplog) pclog("FRSTOR %08X:%08X %i %i %04X\n", easeg, eaaddr, ismmx, TOP, tag);
|
if (fplog) pclog("FRSTOR %08X:%08X %i %i %04X\n", easeg, eaaddr, ismmx, TOP, tag);
|
||||||
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSTOR_a16(uint32_t fetchdat)
|
static int opFSTOR_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
|
|
@ -137,7 +138,7 @@ static int opFSTOR_a32(uint32_t fetchdat)
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FSAVE()
|
static int FSAVE()
|
||||||
{
|
{
|
||||||
if (fplog) pclog("FSAVE %08X:%08X %i\n", easeg, eaaddr, ismmx);
|
if (fplog) pclog("FSAVE %08X:%08X %i\n", easeg, eaaddr, ismmx);
|
||||||
npxs = (npxs & ~(7 << 11)) | (TOP << 11);
|
npxs = (npxs & ~(7 << 11)) | (TOP << 11);
|
||||||
|
|
@ -270,7 +271,8 @@ static void FSAVE()
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles-=(cr0&1)?56:67;
|
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
|
||||||
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSAVE_a16(uint32_t fetchdat)
|
static int opFSAVE_a16(uint32_t fetchdat)
|
||||||
{
|
{
|
||||||
|
|
@ -293,7 +295,7 @@ static int opFSTSW_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, eaaddr);
|
||||||
seteaw((npxs & 0xC7FF) | (TOP << 11));
|
seteaw((npxs & 0xC7FF) | (TOP << 11));
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSTSW_a32(uint32_t fetchdat)
|
static int opFSTSW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -302,7 +304,7 @@ static int opFSTSW_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, eaaddr);
|
||||||
seteaw((npxs & 0xC7FF) | (TOP << 11));
|
seteaw((npxs & 0xC7FF) | (TOP << 11));
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -313,7 +315,7 @@ static int opFLD(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLD %f\n", ST(fetchdat & 7));
|
if (fplog) pclog("FLD %f\n", ST(fetchdat & 7));
|
||||||
x87_push(ST(fetchdat&7));
|
x87_push(ST(fetchdat&7));
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -326,7 +328,7 @@ static int opFXCH(uint32_t fetchdat)
|
||||||
td = ST(0);
|
td = ST(0);
|
||||||
ST(0) = ST(fetchdat&7);
|
ST(0) = ST(fetchdat&7);
|
||||||
ST(fetchdat&7) = td;
|
ST(fetchdat&7) = td;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -336,7 +338,7 @@ static int opFCHS(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FCHS\n");
|
if (fplog) pclog("FCHS\n");
|
||||||
ST(0) = -ST(0);
|
ST(0) = -ST(0);
|
||||||
cycles -= 6;
|
CLOCK_CYCLES(6);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -346,7 +348,7 @@ static int opFABS(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FABS %f\n", ST(0));
|
if (fplog) pclog("FABS %f\n", ST(0));
|
||||||
ST(0) = fabs(ST(0));
|
ST(0) = fabs(ST(0));
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -358,7 +360,7 @@ static int opFTST(uint32_t fetchdat)
|
||||||
npxs &= ~(C0|C2|C3);
|
npxs &= ~(C0|C2|C3);
|
||||||
if (ST(0) == 0.0) npxs |= C3;
|
if (ST(0) == 0.0) npxs |= C3;
|
||||||
else if (ST(0) < 0.0) npxs |= C0;
|
else if (ST(0) < 0.0) npxs |= C0;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -372,7 +374,7 @@ static int opFXAM(uint32_t fetchdat)
|
||||||
else if (ST(0) == 0.0) npxs |= C3;
|
else if (ST(0) == 0.0) npxs |= C3;
|
||||||
else npxs |= C2;
|
else npxs |= C2;
|
||||||
if (ST(0) < 0.0) npxs |= C1;
|
if (ST(0) < 0.0) npxs |= C1;
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -382,7 +384,7 @@ static int opFLD1(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLD1\n");
|
if (fplog) pclog("FLD1\n");
|
||||||
x87_push(1.0);
|
x87_push(1.0);
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -392,7 +394,7 @@ static int opFLDL2T(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLDL2T\n");
|
if (fplog) pclog("FLDL2T\n");
|
||||||
x87_push(3.3219280948873623);
|
x87_push(3.3219280948873623);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -402,7 +404,7 @@ static int opFLDL2E(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLDL2E\n");
|
if (fplog) pclog("FLDL2E\n");
|
||||||
x87_push(1.4426950408889634);
|
x87_push(1.4426950408889634);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -412,7 +414,7 @@ static int opFLDPI(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLDPI\n");
|
if (fplog) pclog("FLDPI\n");
|
||||||
x87_push(3.141592653589793);
|
x87_push(3.141592653589793);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -422,7 +424,7 @@ static int opFLDEG2(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLDEG2\n");
|
if (fplog) pclog("FLDEG2\n");
|
||||||
x87_push(0.3010299956639812);
|
x87_push(0.3010299956639812);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -432,7 +434,7 @@ static int opFLDLN2(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FLDLN2\n");
|
if (fplog) pclog("FLDLN2\n");
|
||||||
x87_push(0.693147180559945);
|
x87_push(0.693147180559945);
|
||||||
cycles -= 8;
|
CLOCK_CYCLES(8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -443,7 +445,7 @@ static int opFLDZ(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FLDZ\n");
|
if (fplog) pclog("FLDZ\n");
|
||||||
x87_push(0.0);
|
x87_push(0.0);
|
||||||
tag |= (1<<((TOP&7)<<1));
|
tag |= (1<<((TOP&7)<<1));
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -453,7 +455,7 @@ static int opF2XM1(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("F2XM1\n");
|
if (fplog) pclog("F2XM1\n");
|
||||||
ST(0) = pow(2.0, ST(0)) - 1.0;
|
ST(0) = pow(2.0, ST(0)) - 1.0;
|
||||||
cycles -= 200;
|
CLOCK_CYCLES(200);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -464,7 +466,7 @@ static int opFYL2X(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FYL2X\n");
|
if (fplog) pclog("FYL2X\n");
|
||||||
ST(1) = ST(1) * (log(ST(0)) / log(2.0));
|
ST(1) = ST(1) * (log(ST(0)) / log(2.0));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 250;
|
CLOCK_CYCLES(250);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -476,7 +478,7 @@ static int opFPTAN(uint32_t fetchdat)
|
||||||
ST(0) = tan(ST(0));
|
ST(0) = tan(ST(0));
|
||||||
x87_push(1.0);
|
x87_push(1.0);
|
||||||
npxs &= ~C2;
|
npxs &= ~C2;
|
||||||
cycles -= 235;
|
CLOCK_CYCLES(235);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -487,7 +489,7 @@ static int opFPATAN(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FPATAN\n");
|
if (fplog) pclog("FPATAN\n");
|
||||||
ST(1) = atan2(ST(1), ST(0));
|
ST(1) = atan2(ST(1), ST(0));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
cycles -= 250;
|
CLOCK_CYCLES(250);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -497,7 +499,7 @@ static int opFDECSTP(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDECSTP\n");
|
if (fplog) pclog("FDECSTP\n");
|
||||||
TOP = (TOP - 1) & 7;
|
TOP = (TOP - 1) & 7;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -507,7 +509,7 @@ static int opFINCSTP(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FDECSTP\n");
|
if (fplog) pclog("FDECSTP\n");
|
||||||
TOP = (TOP + 1) & 7;
|
TOP = (TOP + 1) & 7;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -524,7 +526,7 @@ static int opFPREM(uint32_t fetchdat)
|
||||||
if (temp64 & 4) npxs|=C0;
|
if (temp64 & 4) npxs|=C0;
|
||||||
if (temp64 & 2) npxs|=C3;
|
if (temp64 & 2) npxs|=C3;
|
||||||
if (temp64 & 1) npxs|=C1;
|
if (temp64 & 1) npxs|=C1;
|
||||||
cycles -= 100;
|
CLOCK_CYCLES(100);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -534,7 +536,7 @@ static int opFSQRT(uint32_t fetchdat)
|
||||||
pc++;
|
pc++;
|
||||||
if (fplog) pclog("FSQRT\n");
|
if (fplog) pclog("FSQRT\n");
|
||||||
ST(0) = sqrt(ST(0));
|
ST(0) = sqrt(ST(0));
|
||||||
cycles -= 83;
|
CLOCK_CYCLES(83);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -548,7 +550,7 @@ static int opFSINCOS(uint32_t fetchdat)
|
||||||
ST(0) = sin(td);
|
ST(0) = sin(td);
|
||||||
x87_push(cos(td));
|
x87_push(cos(td));
|
||||||
npxs &= ~C2;
|
npxs &= ~C2;
|
||||||
cycles -= 330;
|
CLOCK_CYCLES(330);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -559,7 +561,7 @@ static int opFRNDINT(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FRNDINT %g ", ST(0));
|
if (fplog) pclog("FRNDINT %g ", ST(0));
|
||||||
ST(0) = (double)x87_fround(ST(0));
|
ST(0) = (double)x87_fround(ST(0));
|
||||||
if (fplog) pclog("%g\n", ST(0));
|
if (fplog) pclog("%g\n", ST(0));
|
||||||
cycles -= 21;
|
CLOCK_CYCLES(21);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -571,7 +573,7 @@ static int opFSCALE(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSCALE\n");
|
if (fplog) pclog("FSCALE\n");
|
||||||
temp64 = (int64_t)ST(1);
|
temp64 = (int64_t)ST(1);
|
||||||
ST(0) = ST(0) * pow(2.0, (double)temp64);
|
ST(0) = ST(0) * pow(2.0, (double)temp64);
|
||||||
cycles -= 30;
|
CLOCK_CYCLES(30);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -582,7 +584,7 @@ static int opFSIN(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FSIN\n");
|
if (fplog) pclog("FSIN\n");
|
||||||
ST(0) = sin(ST(0));
|
ST(0) = sin(ST(0));
|
||||||
npxs &= ~C2;
|
npxs &= ~C2;
|
||||||
cycles -= 300;
|
CLOCK_CYCLES(300);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -593,12 +595,12 @@ static int opFCOS(uint32_t fetchdat)
|
||||||
if (fplog) pclog("FCOS\n");
|
if (fplog) pclog("FCOS\n");
|
||||||
ST(0) = cos(ST(0));
|
ST(0) = cos(ST(0));
|
||||||
npxs &= ~C2;
|
npxs &= ~C2;
|
||||||
cycles -= 300;
|
CLOCK_CYCLES(300);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void FLDENV()
|
static int FLDENV()
|
||||||
{
|
{
|
||||||
if (fplog) pclog("FLDENV %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FLDENV %08X:%08X\n", easeg, eaaddr);
|
||||||
switch ((cr0 & 1) | (op32 & 0x100))
|
switch ((cr0 & 1) | (op32 & 0x100))
|
||||||
|
|
@ -618,7 +620,8 @@ static void FLDENV()
|
||||||
TOP = (npxs >> 11) & 7;
|
TOP = (npxs >> 11) & 7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= (cr0 & 1) ? 34 : 44;
|
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
|
||||||
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opFLDENV_a16(uint32_t fetchdat)
|
static int opFLDENV_a16(uint32_t fetchdat)
|
||||||
|
|
@ -645,7 +648,7 @@ static int opFLDCW_a16(uint32_t fetchdat)
|
||||||
tempw = geteaw();
|
tempw = geteaw();
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
npxc = tempw;
|
npxc = tempw;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFLDCW_a32(uint32_t fetchdat)
|
static int opFLDCW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -657,11 +660,11 @@ static int opFLDCW_a32(uint32_t fetchdat)
|
||||||
tempw = geteaw();
|
tempw = geteaw();
|
||||||
if (abrt) return 1;
|
if (abrt) return 1;
|
||||||
npxc = tempw;
|
npxc = tempw;
|
||||||
cycles -= 4;
|
CLOCK_CYCLES(4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FSTENV()
|
static int FSTENV()
|
||||||
{
|
{
|
||||||
if (fplog) pclog("FSTENV %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTENV %08X:%08X\n", easeg, eaaddr);
|
||||||
switch ((cr0 & 1) | (op32 & 0x100))
|
switch ((cr0 & 1) | (op32 & 0x100))
|
||||||
|
|
@ -700,7 +703,8 @@ static void FSTENV()
|
||||||
writememl(easeg,eaaddr+24,x87_op_seg);
|
writememl(easeg,eaaddr+24,x87_op_seg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cycles -= (cr0 & 1) ? 56 : 67;
|
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
|
||||||
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opFSTENV_a16(uint32_t fetchdat)
|
static int opFSTENV_a16(uint32_t fetchdat)
|
||||||
|
|
@ -724,7 +728,7 @@ static int opFSTCW_a16(uint32_t fetchdat)
|
||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, eaaddr);
|
||||||
seteaw(npxc);
|
seteaw(npxc);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
static int opFSTCW_a32(uint32_t fetchdat)
|
static int opFSTCW_a32(uint32_t fetchdat)
|
||||||
|
|
@ -733,6 +737,6 @@ static int opFSTCW_a32(uint32_t fetchdat)
|
||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, eaaddr);
|
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, eaaddr);
|
||||||
seteaw(npxc);
|
seteaw(npxc);
|
||||||
cycles -= 3;
|
CLOCK_CYCLES(3);
|
||||||
return abrt;
|
return abrt;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue