mirror of
https://github.com/holub/mame
synced 2025-07-05 09:57:47 +03:00
Fix for i286 preventing error 104 on ibm5170 [Carl]
This commit is contained in:
parent
f5b8f67d17
commit
2a8dfbdeaa
@ -46,6 +46,7 @@ struct _i80286_state
|
||||
UINT16 sregs[4];
|
||||
UINT16 limit[4];
|
||||
UINT8 rights[4];
|
||||
bool valid[4];
|
||||
struct {
|
||||
UINT32 base;
|
||||
UINT16 limit;
|
||||
@ -162,6 +163,7 @@ static CPU_RESET( i80286 )
|
||||
cpustate->base[DS]=cpustate->base[SS]=cpustate->base[ES]=0;
|
||||
cpustate->rights[DS]=cpustate->rights[SS]=cpustate->rights[ES]=0x93;
|
||||
cpustate->rights[CS]=0x9a;
|
||||
cpustate->valid[CS]=cpustate->valid[SS]=cpustate->valid[DS]=cpustate->valid[ES]=1;
|
||||
cpustate->msw=0xfff0;
|
||||
cpustate->flags=2;
|
||||
ExpandFlags(cpustate->flags);
|
||||
|
@ -124,9 +124,9 @@ static UINT32 i80286_selector_address(i80286_state *cpustate,UINT16 sel)
|
||||
return ((IDX(sel)>=limit)||!IDXTBL(sel)?-1:base+IDX(sel));
|
||||
}
|
||||
|
||||
static int i80286_verify(i80286_state *cpustate, UINT16 selector, i80286_operation operation, UINT8 rights)
|
||||
static int i80286_verify(i80286_state *cpustate, UINT16 selector, i80286_operation operation, UINT8 rights, bool valid)
|
||||
{
|
||||
if (!IDXTBL(selector)) return GENERAL_PROTECTION_FAULT;
|
||||
if (!IDXTBL(selector) && !valid) return GENERAL_PROTECTION_FAULT;
|
||||
if (!SEGDESC(rights)) return GENERAL_PROTECTION_FAULT;
|
||||
|
||||
switch(operation) {
|
||||
@ -168,6 +168,7 @@ static void i80286_data_descriptor_full(i80286_state *cpustate, int reg, UINT16
|
||||
cpustate->limit[reg]=0;
|
||||
cpustate->base[reg]=0;
|
||||
cpustate->rights[reg]=0;
|
||||
cpustate->valid[reg]=0;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -204,6 +205,7 @@ static void i80286_data_descriptor_full(i80286_state *cpustate, int reg, UINT16
|
||||
cpustate->sregs[reg]=selector;
|
||||
cpustate->base[reg]=selector<<4;
|
||||
}
|
||||
cpustate->valid[reg]=1;
|
||||
}
|
||||
|
||||
static void i80286_data_descriptor(i80286_state *cpustate, int reg, UINT16 selector)
|
||||
@ -552,7 +554,7 @@ static void PREFIX286(_0fpre)(i8086_state *cpustate)
|
||||
else {
|
||||
desc[2] = ReadWord(addr+4);
|
||||
r = RIGHTS(desc);
|
||||
cpustate->ZeroVal = i80286_verify(cpustate, tmp, I80286_READ, RIGHTS(desc));
|
||||
cpustate->ZeroVal = i80286_verify(cpustate, tmp, I80286_READ, RIGHTS(desc), 0);
|
||||
cpustate->ZeroVal = cpustate->ZeroVal || (CODE(r) && CONF(r) ? 0 : (DPL(r)<PMAX(RPL(tmp),CPL)));
|
||||
}
|
||||
break;
|
||||
@ -562,7 +564,7 @@ static void PREFIX286(_0fpre)(i8086_state *cpustate)
|
||||
else {
|
||||
desc[2] = ReadWord(addr+4);
|
||||
r = RIGHTS(desc);
|
||||
cpustate->ZeroVal = i80286_verify(cpustate, tmp, I80286_WRITE, RIGHTS(desc));
|
||||
cpustate->ZeroVal = i80286_verify(cpustate, tmp, I80286_WRITE, RIGHTS(desc), 0);
|
||||
cpustate->ZeroVal = cpustate->ZeroVal || (DPL(r)<PMAX(RPL(tmp),CPL));
|
||||
}
|
||||
break;
|
||||
@ -795,10 +797,10 @@ static UINT16 i80286_far_return(i8086_state *cpustate, int iret, int bytes)
|
||||
|
||||
// docs say check rpl but windows doesn't like it
|
||||
r = cpustate->rights[DS];
|
||||
if (i80286_verify(cpustate, cpustate->sregs[DS], I80286_READ, r) || (CODE(r) && CONF(r) ? 0 : (DPL(r) < CPL)))
|
||||
if (i80286_verify(cpustate, cpustate->sregs[DS], I80286_READ, r, 0) || (CODE(r) && CONF(r) ? 0 : (DPL(r) < CPL)))
|
||||
i80286_data_descriptor(cpustate, DS, 0);
|
||||
r = cpustate->rights[ES];
|
||||
if (i80286_verify(cpustate, cpustate->sregs[ES], I80286_READ, r) || (CODE(r) && CONF(r) ? 0 : (DPL(r) < CPL)))
|
||||
if (i80286_verify(cpustate, cpustate->sregs[ES], I80286_READ, r, 0) || (CODE(r) && CONF(r) ? 0 : (DPL(r) < CPL)))
|
||||
i80286_data_descriptor(cpustate, ES, 0);
|
||||
} else {
|
||||
cpustate->regs.w[SP] += (iret?6:4) + bytes;
|
||||
@ -858,7 +860,7 @@ static void i80286_check_permission(i8086_state *cpustate, UINT8 check_seg, UINT
|
||||
UINT8 rights;
|
||||
if (PM) {
|
||||
rights = cpustate->rights[check_seg];
|
||||
trap = i80286_verify(cpustate, cpustate->sregs[check_seg], operation, rights);
|
||||
trap = i80286_verify(cpustate, cpustate->sregs[check_seg], operation, rights, cpustate->valid[check_seg]);
|
||||
if ((CODE(rights) || !EXPDOWN(rights)) && ((offset+size-1) > cpustate->limit[check_seg])) trap = GENERAL_PROTECTION_FAULT;
|
||||
if (!CODE(rights) && EXPDOWN(rights) && ((offset <= cpustate->limit[check_seg]) || ((offset+size-1) > 0xffff))) trap = GENERAL_PROTECTION_FAULT;
|
||||
|
||||
|
@ -93,6 +93,14 @@ void printer_image_device::output(UINT8 data)
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
DEVICE_IMAGE_CREATE( printer )
|
||||
-------------------------------------------------*/
|
||||
|
||||
bool printer_image_device::call_create(int format_type, option_resolution *format_options)
|
||||
{
|
||||
return call_load();
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
DEVICE_IMAGE_LOAD( printer )
|
||||
|
@ -36,6 +36,7 @@ public:
|
||||
|
||||
// image-level overrides
|
||||
virtual bool call_load();
|
||||
virtual bool call_create(int format_type, option_resolution *format_options);
|
||||
virtual void call_unload();
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_PRINTER; }
|
||||
|
Loading…
Reference in New Issue
Block a user