summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/i86
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2011-05-22 15:47:04 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2011-05-22 15:47:04 +0000
commite4ccc74ae32f2289938585c69d22baa2a178ad1f (patch)
tree55aa4716e74ea5b69982cbc7f6fdf4db7f1ba294 /src/emu/cpu/i86
parentdbe84fd73d6858b3bdb31604c5220901ef73f484 (diff)
i286 - some fixes from Carl (no whatsnew)
Diffstat (limited to 'src/emu/cpu/i86')
-rw-r--r--src/emu/cpu/i86/instr286.c11
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;