Fix the LxS fix again.
This commit is contained in:
@@ -248,19 +248,6 @@ int checkio(uint32_t port, int mask);
|
||||
return 1; \
|
||||
}
|
||||
|
||||
#define CHECK_READ_2OP(chseg, low, high, low2, high2) \
|
||||
if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || (low2 < (chseg)->limit_low) || (high2 > (chseg)->limit_high) || ((msw & 1) && !(cpu_state.eflags & VM_FLAG) && (((chseg)->access & 10) == 8))) { \
|
||||
x86gpf("Limit check (READ)", 0); \
|
||||
return 1; \
|
||||
} \
|
||||
if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !((chseg)->access & 0x80)) { \
|
||||
if ((chseg) == &cpu_state.seg_ss) \
|
||||
x86ss(NULL, (chseg)->seg & 0xfffc); \
|
||||
else \
|
||||
x86np("Read from seg not present", (chseg)->seg & 0xfffc); \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
#define CHECK_READ_REP(chseg, low, high) \
|
||||
if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) { \
|
||||
x86gpf("Limit check (READ)", 0); \
|
||||
|
||||
@@ -272,10 +272,13 @@ opLDS_w_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(cpu_mod == 3);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1,
|
||||
((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1);
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
addr = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
cpu_state.eaa16[0] += 2;
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
op_loadseg(seg, &cpu_state.seg_ds);
|
||||
@@ -319,10 +322,13 @@ opLDS_l_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(cpu_mod == 3);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3,
|
||||
((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1);
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff));
|
||||
addr = readmeml(easeg, cpu_state.eaa16[0]);
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
cpu_state.eaa16[0] += 4;
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
op_loadseg(seg, &cpu_state.seg_ds);
|
||||
@@ -367,10 +373,13 @@ opLSS_w_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(cpu_mod == 3);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1,
|
||||
((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1);
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
addr = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
cpu_state.eaa16[0] += 2;
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
op_loadseg(seg, &cpu_state.seg_ss);
|
||||
@@ -414,11 +423,13 @@ opLSS_l_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
ILLEGAL_ON(cpu_mod == 3);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3,
|
||||
((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1);
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 5) & 0xffff));
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff));
|
||||
addr = readmeml(easeg, cpu_state.eaa16[0]);
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
cpu_state.eaa16[0] += 4;
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
op_loadseg(seg, &cpu_state.seg_ss);
|
||||
@@ -462,9 +473,13 @@ opLSS_l_a32(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat); \
|
||||
SEG_CHECK_READ(cpu_state.ea_seg); \
|
||||
ILLEGAL_ON(cpu_mod == 3); \
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); \
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
|
||||
addr = readmemw(easeg, cpu_state.eaa16[0]); \
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); \
|
||||
if (cpu_state.abrt) \
|
||||
return 1; \
|
||||
cpu_state.eaa16[0] += 2; \
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]); \
|
||||
if (cpu_state.abrt) \
|
||||
return 1; \
|
||||
op_loadseg(seg, &sel); \
|
||||
@@ -507,9 +522,13 @@ opLSS_l_a32(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat); \
|
||||
SEG_CHECK_READ(cpu_state.ea_seg); \
|
||||
ILLEGAL_ON(cpu_mod == 3); \
|
||||
CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); \
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff)); \
|
||||
addr = readmeml(easeg, cpu_state.eaa16[0]); \
|
||||
seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); \
|
||||
if (cpu_state.abrt) \
|
||||
return 1; \
|
||||
cpu_state.eaa16[0] += 4; \
|
||||
CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
|
||||
seg = readmemw(easeg, cpu_state.eaa16[0]); \
|
||||
if (cpu_state.abrt) \
|
||||
return 1; \
|
||||
op_loadseg(seg, &sel); \
|
||||
|
||||
Reference in New Issue
Block a user