diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index a4ea5802b..83ef4e72b 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -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); \ diff --git a/src/cpu/x86_ops_mov_seg.h b/src/cpu/x86_ops_mov_seg.h index a34bc0c70..f5bd02923 100644 --- a/src/cpu/x86_ops_mov_seg.h +++ b/src/cpu/x86_ops_mov_seg.h @@ -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); \