Register operands on BOUND/LEA/LDS/LES/LFS/LGS/LSS now cause invalid opcode faults. Fixes NTVDM.
This commit is contained in:
parent
876db9f38c
commit
81e24b9cb5
4 changed files with 31 additions and 0 deletions
|
|
@ -3,6 +3,17 @@
|
|||
OpFn *x86_opcodes;
|
||||
OpFn *x86_opcodes_0f;
|
||||
|
||||
#define ILLEGAL_ON(cond) \
|
||||
do \
|
||||
{ \
|
||||
if ((cond)) \
|
||||
{ \
|
||||
pc = oldpc; \
|
||||
x86illegal(); \
|
||||
return 0; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static inline void PUSH_W(uint16_t val)
|
||||
{
|
||||
if (stack32)
|
||||
|
|
|
|||
|
|
@ -539,6 +539,7 @@ static int opBOUND_w_a16(uint32_t fetchdat)
|
|||
int16_t low, high;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
low = geteaw();
|
||||
high = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
|
||||
|
|
@ -555,6 +556,7 @@ static int opBOUND_w_a32(uint32_t fetchdat)
|
|||
int16_t low, high;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
low = geteaw();
|
||||
high = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
|
||||
|
|
@ -572,6 +574,7 @@ static int opBOUND_l_a16(uint32_t fetchdat)
|
|||
int32_t low, high;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
low = geteal();
|
||||
high = readmeml(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
|
||||
|
|
@ -588,6 +591,7 @@ static int opBOUND_l_a32(uint32_t fetchdat)
|
|||
int32_t low, high;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
low = geteal();
|
||||
high = readmeml(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ static int opMOV_a32_EAX(uint32_t fetchdat)
|
|||
static int opLEA_w_a16(uint32_t fetchdat)
|
||||
{
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
regs[reg].w = eaaddr;
|
||||
cycles -= timing_rr;
|
||||
return 0;
|
||||
|
|
@ -313,6 +314,7 @@ static int opLEA_w_a16(uint32_t fetchdat)
|
|||
static int opLEA_w_a32(uint32_t fetchdat)
|
||||
{
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
regs[reg].w = eaaddr;
|
||||
cycles -= timing_rr;
|
||||
return 0;
|
||||
|
|
@ -321,6 +323,7 @@ static int opLEA_w_a32(uint32_t fetchdat)
|
|||
static int opLEA_l_a16(uint32_t fetchdat)
|
||||
{
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
regs[reg].l = eaaddr & 0xffff;
|
||||
cycles -= timing_rr;
|
||||
return 0;
|
||||
|
|
@ -328,6 +331,7 @@ static int opLEA_l_a16(uint32_t fetchdat)
|
|||
static int opLEA_l_a32(uint32_t fetchdat)
|
||||
{
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
regs[reg].l = eaaddr;
|
||||
cycles -= timing_rr;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -219,6 +219,7 @@ static int opLDS_w_a16(uint32_t fetchdat)
|
|||
uint16_t addr, seg;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmemw(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
loadseg(seg, &_ds); if (abrt) return 0;
|
||||
|
|
@ -233,6 +234,7 @@ static int opLDS_w_a32(uint32_t fetchdat)
|
|||
uint16_t addr, seg;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmemw(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
loadseg(seg, &_ds); if (abrt) return 0;
|
||||
|
|
@ -248,6 +250,7 @@ static int opLDS_l_a16(uint32_t fetchdat)
|
|||
uint16_t seg;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmeml(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
loadseg(seg, &_ds); if (abrt) return 0;
|
||||
|
|
@ -263,6 +266,7 @@ static int opLDS_l_a32(uint32_t fetchdat)
|
|||
uint16_t seg;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmeml(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
loadseg(seg, &_ds); if (abrt) return 0;
|
||||
|
|
@ -278,6 +282,7 @@ static int opLSS_w_a16(uint32_t fetchdat)
|
|||
uint16_t addr, seg;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmemw(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
loadseg(seg, &_ss); if (abrt) return 0;
|
||||
|
|
@ -292,6 +297,7 @@ static int opLSS_w_a32(uint32_t fetchdat)
|
|||
uint16_t addr, seg;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmemw(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0;
|
||||
loadseg(seg, &_ss); if (abrt) return 0;
|
||||
|
|
@ -307,6 +313,7 @@ static int opLSS_l_a16(uint32_t fetchdat)
|
|||
uint16_t seg;
|
||||
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmeml(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
loadseg(seg, &_ss); if (abrt) return 0;
|
||||
|
|
@ -322,6 +329,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
|||
uint16_t seg;
|
||||
|
||||
fetch_ea_32(fetchdat);
|
||||
ILLEGAL_ON(mod == 3);
|
||||
addr = readmeml(easeg, eaaddr);
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0;
|
||||
loadseg(seg, &_ss); if (abrt) return 0;
|
||||
|
|
@ -338,6 +346,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
|||
uint16_t addr, seg; \
|
||||
\
|
||||
fetch_ea_16(fetchdat); \
|
||||
ILLEGAL_ON(mod == 3); \
|
||||
addr = readmemw(easeg, eaaddr); \
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0; \
|
||||
loadseg(seg, &sel); if (abrt) return 0; \
|
||||
|
|
@ -352,6 +361,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
|||
uint16_t addr, seg; \
|
||||
\
|
||||
fetch_ea_32(fetchdat); \
|
||||
ILLEGAL_ON(mod == 3); \
|
||||
addr = readmemw(easeg, eaaddr); \
|
||||
seg = readmemw(easeg, eaaddr + 2); if (abrt) return 0; \
|
||||
loadseg(seg, &sel); if (abrt) return 0; \
|
||||
|
|
@ -367,6 +377,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
|||
uint16_t seg; \
|
||||
\
|
||||
fetch_ea_16(fetchdat); \
|
||||
ILLEGAL_ON(mod == 3); \
|
||||
addr = readmeml(easeg, eaaddr); \
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0; \
|
||||
loadseg(seg, &sel); if (abrt) return 0; \
|
||||
|
|
@ -382,6 +393,7 @@ static int opLSS_l_a32(uint32_t fetchdat)
|
|||
uint16_t seg; \
|
||||
\
|
||||
fetch_ea_32(fetchdat); \
|
||||
ILLEGAL_ON(mod == 3); \
|
||||
addr = readmeml(easeg, eaaddr); \
|
||||
seg = readmemw(easeg, eaaddr + 4); if (abrt) return 0; \
|
||||
loadseg(seg, &sel); if (abrt) return 0; \
|
||||
|
|
|
|||
Loading…
Reference in a new issue