From 8a5b552a9a43c2c65de99cdc609ed8932ff818df Mon Sep 17 00:00:00 2001 From: SarahW Date: Mon, 8 Jan 2018 20:50:48 +0000 Subject: [PATCH] Correct CS:IP initialisation on 286+ reset. Patch from Greatpsycho. --- src/808x.c | 29 ++++++++++++++++++++++++----- src/x86seg.c | 12 ++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/808x.c b/src/808x.c index 971367e..c761199 100644 --- a/src/808x.c +++ b/src/808x.c @@ -628,7 +628,6 @@ void resetx86() stack32=0; // i86_Reset(); // cs=0xFFFF0; - cpu_state.pc=0; msw=0; if (is486) cr0 = 1 << 30; @@ -639,8 +638,18 @@ void resetx86() cr4 = 0; eflags=0; cgate32=0; - loadcs(0xFFFF); - rammask = AT ? 0xFFFFFFFF : 0xfffff; + if (AT) + { + loadcs(0xF000); + cpu_state.pc = 0xFFF0; + rammask = cpu_16bitbus ? 0xFFFFFF : 0xFFFFFFFF; + } + else + { + loadcs(0xFFFF); + cpu_state.pc = 0; + rammask = 0xfffff; + } idt.base = 0; flags=2; makeznptable(); @@ -667,13 +676,23 @@ void softresetx86() cpu_cur_status = 0; // i86_Reset(); // cs=0xFFFF0; - cpu_state.pc=0; msw=0; cr0=0; cr4 = 0; eflags=0; cgate32=0; - loadcs(0xFFFF); + if (AT) + { + loadcs(0xF000); + cpu_state.pc = 0xFFF0; + rammask = cpu_16bitbus ? 0xFFFFFF : 0xFFFFFFFF; + } + else + { + loadcs(0xFFFF); + cpu_state.pc = 0; + rammask = 0xfffff; + } //rammask=0xFFFFFFFF; flags=2; idt.base = 0; diff --git a/src/x86seg.c b/src/x86seg.c index 87cf2c7..23d6294 100644 --- a/src/x86seg.c +++ b/src/x86seg.c @@ -68,6 +68,18 @@ static void seg_reset(x86seg *s) s->limit = 0xFFFF; s->limit_low = 0; s->limit_high = 0xffff; + if (s == &_cs) + { + // TODO - When the PC is reset, initialization of the CS descriptor must be like the annotated line below. + //s->base = AT ? (cpu_16bitbus ? 0xFF0000 : 0xFFFF0000) : 0xFFFF0; + s->base = AT ? 0xF0000 : 0xFFFF0; + s->seg = AT ? 0xF000 : 0xFFFF; + } + else + { + s->base = 0; + s->seg = 0; + } } void x86seg_reset()