diff options
author | 2011-05-22 15:47:04 +0000 | |
---|---|---|
committer | 2011-05-22 15:47:04 +0000 | |
commit | e4ccc74ae32f2289938585c69d22baa2a178ad1f (patch) | |
tree | 55aa4716e74ea5b69982cbc7f6fdf4db7f1ba294 /src/emu/cpu/i86 | |
parent | dbe84fd73d6858b3bdb31604c5220901ef73f484 (diff) |
i286 - some fixes from Carl (no whatsnew)
Diffstat (limited to 'src/emu/cpu/i86')
-rw-r--r-- | src/emu/cpu/i86/instr286.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/src/emu/cpu/i86/instr286.c b/src/emu/cpu/i86/instr286.c index 1dd122924f2..3a8df831394 100644 --- a/src/emu/cpu/i86/instr286.c +++ b/src/emu/cpu/i86/instr286.c @@ -337,6 +337,7 @@ static void i80286_code_descriptor(i80286_state *cpustate, UINT16 selector, UINT } else { // systemdescriptor UINT16 gatedesc[3]={0,0,0}; UINT16 gatesel = GATESEL(desc); + if (!gate) throw TRAP(GENERAL_PROTECTION_FAULT,IDXTBL(selector)); // can't ret through gate if (DPL(r) < PMAX(CPL,RPL(selector))) throw TRAP(GENERAL_PROTECTION_FAULT,IDXTBL(selector)); if (!PRES(r)) throw TRAP(SEG_NOT_PRESENT, IDXTBL(selector)); @@ -381,8 +382,6 @@ static void i80286_code_descriptor(i80286_state *cpustate, UINT16 selector, UINT case TASKGATE: gatesel = GATESEL(gatedesc); if ((addr = i80286_selector_address(cpustate,gatesel)) == -1) throw TRAP(GENERAL_PROTECTION_FAULT,IDXTBL(gatesel)); - gatedesc[0] = ReadWord(addr); - gatedesc[1] = ReadWord(addr+2); gatedesc[2] = ReadWord(addr+4); r = RIGHTS(gatedesc); if (SEGDESC(r) || (GATE(r) != TSSDESCIDLE)) throw TRAP(GENERAL_PROTECTION_FAULT,IDXTBL(gatesel)); @@ -406,7 +405,7 @@ static void i80286_code_descriptor(i80286_state *cpustate, UINT16 selector, UINT static void i80286_interrupt_descriptor(i80286_state *cpustate,UINT16 number, int hwint, int error) { - UINT16 desc[3], gatedesc[3]={0,0,0}, gatesel, oldcs, oldip, oldflags; + UINT16 desc[3], gatedesc[3]={0,0,0}, gatesel; UINT8 r; UINT32 addr; @@ -425,14 +424,8 @@ static void i80286_interrupt_descriptor(i80286_state *cpustate,UINT16 number, in switch (GATE(r)) { case TASKGATE: - oldcs = cpustate->sregs[CS]; - oldip = cpustate->pc-cpustate->base[CS]; - oldflags = CompressFlags(); gatesel = GATESEL(gatedesc); i80286_switch_task(cpustate, gatesel, 2); - PUSH(oldflags); - PUSH(oldcs); - PUSH(oldip); if((hwint == 1) && (error != -1)) PUSH(error); i80286_load_flags(cpustate, cpustate->flags, CPL); break; |