Made the 808x interrupts delay again, fixes PCjr (TODO: Find why exactly that's needed because it sounds like a hack to me);
Fixed compiling of the PIC code with logs enabled; A number of bugfixes in cpu/x86seg.c, fixes OS/2 1.0.
This commit is contained in:
@@ -98,7 +98,8 @@ static uint32_t *ovr_seg = NULL;
|
|||||||
static int prefetching = 1, completed = 1;
|
static int prefetching = 1, completed = 1;
|
||||||
static int in_rep = 0, repeating = 0;
|
static int in_rep = 0, repeating = 0;
|
||||||
static int oldc, clear_lock = 0;
|
static int oldc, clear_lock = 0;
|
||||||
static int refresh = 0, cycdiff;
|
static int refresh = 0, takeint = 0;
|
||||||
|
static int cycdiff;
|
||||||
|
|
||||||
|
|
||||||
/* Various things needed for 8087. */
|
/* Various things needed for 8087. */
|
||||||
@@ -946,6 +947,7 @@ reset_common(int hard)
|
|||||||
cpu_alt_reset = 0;
|
cpu_alt_reset = 0;
|
||||||
|
|
||||||
prefetching = 1;
|
prefetching = 1;
|
||||||
|
takeint = 0;
|
||||||
|
|
||||||
cpu_ven_reset();
|
cpu_ven_reset();
|
||||||
|
|
||||||
@@ -1129,11 +1131,13 @@ irq_pending(void)
|
|||||||
{
|
{
|
||||||
uint8_t temp;
|
uint8_t temp;
|
||||||
|
|
||||||
if ((cpu_state.flags & I_FLAG) && pic.int_pending && !noint)
|
if (takeint && !noint)
|
||||||
temp = 1;
|
temp = 1;
|
||||||
else
|
else
|
||||||
temp = (nmi && nmi_enable && nmi_mask) || ((cpu_state.flags & T_FLAG) && !noint);
|
temp = (nmi && nmi_enable && nmi_mask) || ((cpu_state.flags & T_FLAG) && !noint);
|
||||||
|
|
||||||
|
takeint = (cpu_state.flags & I_FLAG) && pic.int_pending;
|
||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -248,6 +248,9 @@ do_seg_load(x86seg *s, uint16_t *segdat)
|
|||||||
else
|
else
|
||||||
cpu_cur_status |= CPU_STATUS_NOTFLATSS;
|
cpu_cur_status |= CPU_STATUS_NOTFLATSS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s->base == 0xffffffff)
|
||||||
|
fatal("do_seg_load(): %04X%04X%04X%04X\n", segdat[3], segdat[2], segdat[1], segdat[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -269,7 +272,7 @@ check_seg_valid(x86seg *s)
|
|||||||
int valid = 1;
|
int valid = 1;
|
||||||
x86seg *dt = (s->seg & 0x0004) ? &ldt : &gdt;
|
x86seg *dt = (s->seg & 0x0004) ? &ldt : &gdt;
|
||||||
|
|
||||||
if (((s->seg & 0xfff8) + 7) >= dt->limit)
|
if (((s->seg & 0xfff8) + 7) > dt->limit)
|
||||||
valid = 0;
|
valid = 0;
|
||||||
|
|
||||||
switch (s->access & 0x1f) {
|
switch (s->access & 0x1f) {
|
||||||
@@ -522,7 +525,7 @@ loadcs(uint16_t seg)
|
|||||||
|
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004)? &ldt : &gdt;
|
dt = (seg & 0x0004)? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("loadcs(): Protected mode selector > DT limit", seg & 0xfffc);
|
x86gpf("loadcs(): Protected mode selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -610,7 +613,7 @@ loadcsjmp(uint16_t seg, uint32_t old_pc)
|
|||||||
}
|
}
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? &ldt : &gdt;
|
dt = (seg & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("loacsjmp(): Selector > DT limit", seg & 0xfffc);
|
x86gpf("loacsjmp(): Selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -694,7 +697,7 @@ loadcsjmp(uint16_t seg, uint32_t old_pc)
|
|||||||
}
|
}
|
||||||
addr = seg2 & 0xfff8;
|
addr = seg2 & 0xfff8;
|
||||||
dt = (seg2 & 0x0004) ? &ldt : &gdt;
|
dt = (seg2 & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("loadcsjmp(): Call gate selector > DT limit", seg2 & 0xfffc);
|
x86gpf("loadcsjmp(): Call gate selector > DT limit", seg2 & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -884,7 +887,7 @@ void loadcscall(uint16_t seg)
|
|||||||
}
|
}
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? &ldt : &gdt;
|
dt = (seg & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("loadcscall(): Selector > DT limit", seg & 0xfffc);
|
x86gpf("loadcscall(): Selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -975,7 +978,7 @@ void loadcscall(uint16_t seg)
|
|||||||
}
|
}
|
||||||
addr = seg2 & 0xfff8;
|
addr = seg2 & 0xfff8;
|
||||||
dt = (seg2 & 0x0004) ? &ldt : &gdt;
|
dt = (seg2 & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("loadcscall(): ex Selector > DT limit", seg2 & 0xfff8);
|
x86gpf("loadcscall(): ex Selector > DT limit", seg2 & 0xfff8);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1239,7 +1242,7 @@ pmoderetf(int is32, uint16_t off)
|
|||||||
}
|
}
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? &ldt : &gdt;
|
dt = (seg & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("pmoderetf(): Selector > DT limit", seg & 0xfffc);
|
x86gpf("pmoderetf(): Selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1352,7 +1355,7 @@ pmoderetf(int is32, uint16_t off)
|
|||||||
}
|
}
|
||||||
addr = newss & 0xfff8;
|
addr = newss & 0xfff8;
|
||||||
dt = (newss & 0x0004) ? &ldt : &gdt;
|
dt = (newss & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
ESP = oldsp;
|
ESP = oldsp;
|
||||||
x86gpf("pmoderetf(): New SS selector > DT limit", newss & 0xfffc);
|
x86gpf("pmoderetf(): New SS selector > DT limit", newss & 0xfffc);
|
||||||
return;
|
return;
|
||||||
@@ -1444,7 +1447,7 @@ pmodeint(int num, int soft)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addr = (num << 3);
|
addr = (num << 3);
|
||||||
if ((addr + 7) >= idt.limit) {
|
if ((addr + 7) > idt.limit) {
|
||||||
if (num == 0x08) {
|
if (num == 0x08) {
|
||||||
/* Triple fault - reset! */
|
/* Triple fault - reset! */
|
||||||
softresetx86();
|
softresetx86();
|
||||||
@@ -1490,7 +1493,7 @@ pmodeint(int num, int soft)
|
|||||||
|
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? &ldt : &gdt;
|
dt = (seg & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("pmodeint(): Interrupt or trap gate selector > DT limit", seg & 0xfffc);
|
x86gpf("pmodeint(): Interrupt or trap gate selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1535,7 +1538,7 @@ pmodeint(int num, int soft)
|
|||||||
}
|
}
|
||||||
addr = newss & 0xfff8;
|
addr = newss & 0xfff8;
|
||||||
dt = (newss & 0x0004) ? &ldt : &gdt;
|
dt = (newss & 0x0004) ? &ldt : &gdt;
|
||||||
if (addr >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86ss("pmodeint(): Interrupt or trap gate stack segment > DT", newss & 0xfffc);
|
x86ss("pmodeint(): Interrupt or trap gate stack segment > DT", newss & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1669,7 +1672,7 @@ pmodeint(int num, int soft)
|
|||||||
seg = segdat[1];
|
seg = segdat[1];
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? &ldt : &gdt;
|
dt = (seg & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86gpf("pmodeint(): Task gate selector > DT limit", seg & 0xfffc);
|
x86gpf("pmodeint(): Task gate selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1749,8 +1752,8 @@ pmodeiret(int is32)
|
|||||||
x86ts("pmodeiret(): Selector points to LDT", seg & 0xfffc);
|
x86ts("pmodeiret(): Selector points to LDT", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (addr >= gdt.limit) {
|
if ((addr + 7) > gdt.limit) {
|
||||||
x86ts(NULL,seg&~3);
|
x86ts(NULL,seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addr += gdt.base;
|
addr += gdt.base;
|
||||||
@@ -1842,7 +1845,7 @@ pmodeiret(int is32)
|
|||||||
|
|
||||||
addr = seg & 0xfff8;
|
addr = seg & 0xfff8;
|
||||||
dt = (seg & 0x0004) ? & ldt : &gdt;
|
dt = (seg & 0x0004) ? & ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
ESP = oldsp;
|
ESP = oldsp;
|
||||||
x86gpf("pmodeiret(): Selector > DT limit", seg & 0xfffc);
|
x86gpf("pmodeiret(): Selector > DT limit", seg & 0xfffc);
|
||||||
return;
|
return;
|
||||||
@@ -1927,7 +1930,7 @@ pmodeiret(int is32)
|
|||||||
}
|
}
|
||||||
addr = newss & 0xfff8;
|
addr = newss & 0xfff8;
|
||||||
dt = (newss & 0x0004) ? &ldt : &gdt;
|
dt = (newss & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
ESP = oldsp;
|
ESP = oldsp;
|
||||||
x86gpf("pmodeiret(): New SS selector > DT limit", newss & 0xfffc);
|
x86gpf("pmodeiret(): New SS selector > DT limit", newss & 0xfffc);
|
||||||
return;
|
return;
|
||||||
@@ -2138,7 +2141,7 @@ taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
|
|||||||
}
|
}
|
||||||
addr = new_cs & 0xfff8;
|
addr = new_cs & 0xfff8;
|
||||||
dt = (new_cs & 0x0004) ? &ldt : &gdt;
|
dt = (new_cs & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86ts("taskswitch286(): New CS selector > DT limit", new_cs & 0xfffc);
|
x86ts("taskswitch286(): New CS selector > DT limit", new_cs & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2300,7 +2303,7 @@ taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
|
|||||||
}
|
}
|
||||||
addr = new_cs & 0xfff8;
|
addr = new_cs & 0xfff8;
|
||||||
dt = (new_cs & 0x0004) ? &ldt : &gdt;
|
dt = (new_cs & 0x0004) ? &ldt : &gdt;
|
||||||
if ((addr + 7) >= dt->limit) {
|
if ((addr + 7) > dt->limit) {
|
||||||
x86ts(NULL, new_cs & 0xfffc);
|
x86ts(NULL, new_cs & 0xfffc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user