Added support for the D86F floppy image format I invented that allows things not possible with IMG images;
Applied all mainline PCem commits; Settings dialog now says 86Box instead of PCem; Manifest renamed from PCem to 86Box.
This commit is contained in:
120
src/x86seg.c
120
src/x86seg.c
@@ -115,7 +115,7 @@ void x86_doabrt(int x86_abrt)
|
||||
return;
|
||||
}
|
||||
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
|
||||
if (intgatesize == 16)
|
||||
{
|
||||
@@ -144,30 +144,30 @@ void x86_doabrt(int x86_abrt)
|
||||
}
|
||||
}
|
||||
// ingpf = 0;
|
||||
// abrt = gpf = 1;
|
||||
// cpu_state.abrt = gpf = 1;
|
||||
}
|
||||
void x86gpf(char *s, uint16_t error)
|
||||
{
|
||||
// pclog("GPF %04X : %s\n", error, s);
|
||||
abrt = ABRT_GPF;
|
||||
cpu_state.abrt = ABRT_GPF;
|
||||
abrt_error = error;
|
||||
}
|
||||
void x86ss(char *s, uint16_t error)
|
||||
{
|
||||
// pclog("SS %04X\n", error);
|
||||
abrt = ABRT_SS;
|
||||
cpu_state.abrt = ABRT_SS;
|
||||
abrt_error = error;
|
||||
}
|
||||
void x86ts(char *s, uint16_t error)
|
||||
{
|
||||
// pclog("TS %04X\n", error);
|
||||
abrt = ABRT_TS;
|
||||
cpu_state.abrt = ABRT_TS;
|
||||
abrt_error = error;
|
||||
}
|
||||
void x86np(char *s, uint16_t error)
|
||||
{
|
||||
// pclog("NP %04X : %s\n", error, s);
|
||||
abrt = ABRT_NP;
|
||||
cpu_state.abrt = ABRT_NP;
|
||||
abrt_error = error;
|
||||
}
|
||||
|
||||
@@ -309,7 +309,7 @@ void loadseg(uint16_t seg, x86seg *s)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
dpl=(segdat[2]>>13)&3;
|
||||
if (s==&_ss)
|
||||
{
|
||||
@@ -453,7 +453,7 @@ void loadcs(uint16_t seg)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
// if (optype==JMP) pclog("Code seg - %04X - %04X %04X %04X %04X\n",seg,segdat[0],segdat[1],segdat[2],segdat[3]);
|
||||
// if (!(segdat[2]&0x8000)) x86abort("Code segment not present!\n");
|
||||
// if (output) pclog("Segdat2 %04X\n",segdat[2]);
|
||||
@@ -573,7 +573,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
if (output) pclog("%04X %04X %04X %04X\n",segdat[0],segdat[1],segdat[2],segdat[3]);
|
||||
if (segdat[2]&0x1000) /*Normal code segment*/
|
||||
{
|
||||
@@ -696,7 +696,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
|
||||
if (DPL > CPL)
|
||||
{
|
||||
@@ -786,14 +786,14 @@ void PUSHW(uint16_t v)
|
||||
if (stack32)
|
||||
{
|
||||
writememw(ss,ESP-2,v);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
ESP-=2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// pclog("Write %04X to %08X\n", v, ss+((SP-2)&0xFFFF));
|
||||
writememw(ss,((SP-2)&0xFFFF),v);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
SP-=2;
|
||||
}
|
||||
}
|
||||
@@ -803,13 +803,13 @@ void PUSHL(uint32_t v)
|
||||
if (stack32)
|
||||
{
|
||||
writememl(ss,ESP-4,v);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
ESP-=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
writememl(ss,((SP-4)&0xFFFF),v);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
SP-=4;
|
||||
}
|
||||
}
|
||||
@@ -819,13 +819,13 @@ uint16_t POPW()
|
||||
if (stack32)
|
||||
{
|
||||
tempw=readmemw(ss,ESP);
|
||||
if (abrt) return 0;
|
||||
if (cpu_state.abrt) return 0;
|
||||
ESP+=2;
|
||||
}
|
||||
else
|
||||
{
|
||||
tempw=readmemw(ss,SP);
|
||||
if (abrt) return 0;
|
||||
if (cpu_state.abrt) return 0;
|
||||
SP+=2;
|
||||
}
|
||||
return tempw;
|
||||
@@ -836,13 +836,13 @@ uint32_t POPL()
|
||||
if (stack32)
|
||||
{
|
||||
templ=readmeml(ss,ESP);
|
||||
if (abrt) return 0;
|
||||
if (cpu_state.abrt) return 0;
|
||||
ESP+=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
templ=readmeml(ss,SP);
|
||||
if (abrt) return 0;
|
||||
if (cpu_state.abrt) return 0;
|
||||
SP+=4;
|
||||
}
|
||||
return templ;
|
||||
@@ -899,7 +899,7 @@ void loadcscall(uint16_t seg)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
type=segdat[2]&0xF00;
|
||||
if (type==0x400) newpc=segdat[0];
|
||||
else newpc=segdat[0]|(segdat[3]<<16);
|
||||
@@ -1032,7 +1032,7 @@ void loadcscall(uint16_t seg)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
|
||||
if (output) pclog("Code seg2 call - %04X - %04X %04X %04X\n",seg2,segdat[0],segdat[1],segdat[2]);
|
||||
|
||||
@@ -1072,7 +1072,7 @@ void loadcscall(uint16_t seg)
|
||||
newsp=readmemw(0,addr);
|
||||
}
|
||||
cpl_override=0;
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
if (output) pclog("New stack %04X:%08X\n",newss,newsp);
|
||||
if (!(newss&~3))
|
||||
{
|
||||
@@ -1106,7 +1106,7 @@ void loadcscall(uint16_t seg)
|
||||
segdat2[0]=readmemw(0,addr);
|
||||
segdat2[1]=readmemw(0,addr+2);
|
||||
segdat2[2]=readmemw(0,addr+4);
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
if (output) pclog("Read stack seg done!\n");
|
||||
if (((newss & 3) != DPL) || (DPL2 != DPL))
|
||||
{
|
||||
@@ -1163,7 +1163,7 @@ void loadcscall(uint16_t seg)
|
||||
{
|
||||
PUSHL(oldss);
|
||||
PUSHL(oldsp2);
|
||||
if (abrt)
|
||||
if (cpu_state.abrt)
|
||||
{
|
||||
// pclog("ABRT PUSHL\n");
|
||||
SS = oldss;
|
||||
@@ -1177,7 +1177,7 @@ void loadcscall(uint16_t seg)
|
||||
{
|
||||
count--;
|
||||
PUSHL(readmeml(oldssbase,oldsp+(count*4)));
|
||||
if (abrt)
|
||||
if (cpu_state.abrt)
|
||||
{
|
||||
// pclog("ABRT COPYL\n");
|
||||
SS = oldss;
|
||||
@@ -1188,7 +1188,7 @@ void loadcscall(uint16_t seg)
|
||||
}
|
||||
// x86abort("Call gate with count %i\n",count);
|
||||
// PUSHL(oldcs);
|
||||
// PUSHL(oldpc); if (abrt) return;
|
||||
// PUSHL(oldpc); if (cpu_state.abrt) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1196,7 +1196,7 @@ void loadcscall(uint16_t seg)
|
||||
PUSHW(oldss);
|
||||
if (output) pclog("Write SS to %04X:%04X\n",SS,SP);
|
||||
PUSHW(oldsp2);
|
||||
if (abrt)
|
||||
if (cpu_state.abrt)
|
||||
{
|
||||
// pclog("ABRT PUSHW\n");
|
||||
SS = oldss;
|
||||
@@ -1214,7 +1214,7 @@ void loadcscall(uint16_t seg)
|
||||
tempw=readmemw(oldssbase,(oldsp&0xFFFF)+(count*2));
|
||||
if (output) pclog("PUSH %04X\n",tempw);
|
||||
PUSHW(tempw);
|
||||
if (abrt)
|
||||
if (cpu_state.abrt)
|
||||
{
|
||||
// pclog("ABRT COPYW\n");
|
||||
SS = oldss;
|
||||
@@ -1226,7 +1226,7 @@ void loadcscall(uint16_t seg)
|
||||
// if (output) pclog("Stack %04X\n",SP);
|
||||
// if (count) x86abort("Call gate with count\n");
|
||||
// PUSHW(oldcs);
|
||||
// PUSHW(oldpc); if (abrt) return;
|
||||
// PUSHW(oldpc); if (cpu_state.abrt) return;
|
||||
}
|
||||
cycles -= timing_call_pm_gate_inner;
|
||||
break;
|
||||
@@ -1241,12 +1241,12 @@ void loadcscall(uint16_t seg)
|
||||
/* if (type==0xC00)
|
||||
{
|
||||
PUSHL(oldcs);
|
||||
PUSHL(oldpc); if (abrt) return;
|
||||
PUSHL(oldpc); if (cpu_state.abrt) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
PUSHW(oldcs);
|
||||
PUSHW(oldpc); if (abrt) return;
|
||||
PUSHW(oldpc); if (cpu_state.abrt) return;
|
||||
}*/
|
||||
CS=seg2;
|
||||
do_seg_load(&_cs, segdat);
|
||||
@@ -1312,14 +1312,14 @@ void pmoderetf(int is32, uint16_t off)
|
||||
if (is32)
|
||||
{
|
||||
newpc=POPL();
|
||||
seg=POPL(); if (abrt) return;
|
||||
seg=POPL(); if (cpu_state.abrt) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (output) pclog("PC read from %04X:%04X\n",SS,SP);
|
||||
newpc=POPW();
|
||||
if (output) pclog("CS read from %04X:%04X\n",SS,SP);
|
||||
seg=POPW(); if (abrt) return;
|
||||
seg=POPW(); if (cpu_state.abrt) return;
|
||||
}
|
||||
if (output) pclog("Return to %04X:%08X\n",seg,newpc);
|
||||
if ((seg&3)<CPL)
|
||||
@@ -1368,7 +1368,7 @@ void pmoderetf(int is32, uint16_t off)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) { ESP=oldsp; return; }
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) { ESP=oldsp; return; }
|
||||
oaddr = addr;
|
||||
|
||||
if (output) pclog("CPL %i RPL %i %i\n",CPL,seg&3,is32);
|
||||
@@ -1471,7 +1471,7 @@ void pmoderetf(int is32, uint16_t off)
|
||||
if (is32)
|
||||
{
|
||||
newsp=POPL();
|
||||
newss=POPL(); if (abrt) return;
|
||||
newss=POPL(); if (cpu_state.abrt) return;
|
||||
// pclog("is32 new stack %04X:%04X\n",newss,newsp);
|
||||
}
|
||||
else
|
||||
@@ -1479,7 +1479,7 @@ void pmoderetf(int is32, uint16_t off)
|
||||
if (output) pclog("SP read from %04X:%04X\n",SS,SP);
|
||||
newsp=POPW();
|
||||
if (output) pclog("SS read from %04X:%04X\n",SS,SP);
|
||||
newss=POPW(); if (abrt) return;
|
||||
newss=POPW(); if (cpu_state.abrt) return;
|
||||
// pclog("!is32 new stack %04X:%04X\n",newss,newsp);
|
||||
}
|
||||
if (output) pclog("Read new stack : %04X:%04X (%08X)\n", newss, newsp, ldt.base);
|
||||
@@ -1517,7 +1517,7 @@ void pmoderetf(int is32, uint16_t off)
|
||||
segdat2[0]=readmemw(0,addr);
|
||||
segdat2[1]=readmemw(0,addr+2);
|
||||
segdat2[2]=readmemw(0,addr+4);
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) { ESP=oldsp; return; }
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) { ESP=oldsp; return; }
|
||||
if (output) pclog("Segment data %04X %04X %04X %04X\n", segdat2[0], segdat2[1], segdat2[2], segdat2[3]);
|
||||
// if (((newss & 3) != DPL) || (DPL2 != DPL))
|
||||
if ((newss & 3) != (seg & 3))
|
||||
@@ -1608,7 +1608,7 @@ void pmodeint(int num, int soft)
|
||||
int new_cpl;
|
||||
|
||||
// if (!num) pclog("Pmode int 0 at %04X(%06X):%08X\n",CS,cs,cpu_state.pc);
|
||||
// pclog("Pmode int %02X %i %04X:%08X %04X:%08X %i\n",num,soft,CS,pc, SS, ESP, abrt);
|
||||
// pclog("Pmode int %02X %i %04X:%08X %04X:%08X %i\n",num,soft,CS,pc, SS, ESP, cpu_state.abrt);
|
||||
if (eflags&VM_FLAG && IOPL!=3 && soft)
|
||||
{
|
||||
if (output) pclog("V86 banned int\n");
|
||||
@@ -1646,7 +1646,7 @@ void pmodeint(int num, int soft)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(2,addr);
|
||||
segdat[2]=readmemw(4,addr);
|
||||
segdat[3]=readmemw(6,addr); cpl_override=0; if (abrt) { /* pclog("Abrt reading from %08X\n",addr); */ return; }
|
||||
segdat[3]=readmemw(6,addr); cpl_override=0; if (cpu_state.abrt) { /* pclog("Abrt reading from %08X\n",addr); */ return; }
|
||||
oaddr = addr;
|
||||
|
||||
if (output) pclog("Addr %08X seg %04X %04X %04X %04X\n",addr,segdat[0],segdat[1],segdat[2],segdat[3]);
|
||||
@@ -1710,7 +1710,7 @@ void pmodeint(int num, int soft)
|
||||
segdat2[0]=readmemw(0,addr);
|
||||
segdat2[1]=readmemw(0,addr+2);
|
||||
segdat2[2]=readmemw(0,addr+4);
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
oaddr = addr;
|
||||
|
||||
if (DPL2 > CPL)
|
||||
@@ -1786,7 +1786,7 @@ void pmodeint(int num, int soft)
|
||||
segdat3[0]=readmemw(0,addr);
|
||||
segdat3[1]=readmemw(0,addr+2);
|
||||
segdat3[2]=readmemw(0,addr+4);
|
||||
segdat3[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) return;
|
||||
segdat3[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) return;
|
||||
if (((newss & 3) != DPL2) || (DPL3 != DPL2))
|
||||
{
|
||||
// pclog("Int gate loading SS with wrong permissions\n");
|
||||
@@ -1827,7 +1827,7 @@ void pmodeint(int num, int soft)
|
||||
PUSHL(GS);
|
||||
PUSHL(FS);
|
||||
PUSHL(DS);
|
||||
PUSHL(ES); if (abrt) return;
|
||||
PUSHL(ES); if (cpu_state.abrt) return;
|
||||
loadseg(0,&_ds);
|
||||
loadseg(0,&_es);
|
||||
loadseg(0,&_fs);
|
||||
@@ -1839,7 +1839,7 @@ void pmodeint(int num, int soft)
|
||||
// if (soft) pclog("Pushl CS %08X\n", CS);
|
||||
PUSHL(CS);
|
||||
// if (soft) pclog("Pushl PC %08X\n", cpu_state.pc);
|
||||
PUSHL(cpu_state.pc); if (abrt) return;
|
||||
PUSHL(cpu_state.pc); if (cpu_state.abrt) return;
|
||||
// if (output) pclog("32Stack %04X:%08X\n",SS,ESP);
|
||||
}
|
||||
else
|
||||
@@ -1851,7 +1851,7 @@ void pmodeint(int num, int soft)
|
||||
// if (soft) pclog("Pushw CS %04X\n", CS);
|
||||
PUSHW(CS);
|
||||
// if (soft) pclog("Pushw pc %04X\n", cpu_state.pc);
|
||||
PUSHW(cpu_state.pc); if (abrt) return;
|
||||
PUSHW(cpu_state.pc); if (cpu_state.abrt) return;
|
||||
// if (output) pclog("16Stack %04X:%08X\n",SS,ESP);
|
||||
}
|
||||
cpl_override=0;
|
||||
@@ -1886,7 +1886,7 @@ void pmodeint(int num, int soft)
|
||||
// if (soft) pclog("Pushlc CS %08X\n", CS);
|
||||
PUSHL(CS);
|
||||
// if (soft) pclog("Pushlc PC %08X\n", cpu_state.pc);
|
||||
PUSHL(cpu_state.pc); if (abrt) return;
|
||||
PUSHL(cpu_state.pc); if (cpu_state.abrt) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1894,7 +1894,7 @@ void pmodeint(int num, int soft)
|
||||
// if (soft) pclog("Pushwc CS %04X\n", CS);
|
||||
PUSHW(CS);
|
||||
// if (soft) pclog("Pushwc PC %04X\n", cpu_state.pc);
|
||||
PUSHW(cpu_state.pc); if (abrt) return;
|
||||
PUSHW(cpu_state.pc); if (cpu_state.abrt) return;
|
||||
}
|
||||
new_cpl = CS & 3;
|
||||
break;
|
||||
@@ -1959,7 +1959,7 @@ void pmodeint(int num, int soft)
|
||||
segdat2[1]=readmemw(0,addr+2);
|
||||
segdat2[2]=readmemw(0,addr+4);
|
||||
segdat2[3]=readmemw(0,addr+6);
|
||||
cpl_override=0; if (abrt) return;
|
||||
cpl_override=0; if (cpu_state.abrt) return;
|
||||
if (!(segdat2[2]&0x8000))
|
||||
{
|
||||
// pclog("Int task gate not present\n");
|
||||
@@ -2004,13 +2004,13 @@ void pmodeiret(int is32)
|
||||
{
|
||||
newpc=POPL();
|
||||
seg=POPL();
|
||||
tempflags=POPL(); if (abrt) return;
|
||||
tempflags=POPL(); if (cpu_state.abrt) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
newpc=POPW();
|
||||
seg=POPW();
|
||||
tempflags=POPW(); if (abrt) return;
|
||||
tempflags=POPW(); if (cpu_state.abrt) return;
|
||||
}
|
||||
cpu_state.pc=newpc;
|
||||
_cs.base=seg<<4;
|
||||
@@ -2072,7 +2072,7 @@ void pmodeiret(int is32)
|
||||
// pclog("POP\n");
|
||||
newpc=POPL();
|
||||
seg=POPL();
|
||||
tempflags=POPL(); if (abrt) { ESP = oldsp; return; }
|
||||
tempflags=POPL(); if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
// if (output) pclog("IRETD pop %08X %08X %08X\n",newpc,seg,tempflags);
|
||||
if (is386 && ((tempflags>>16)&VM_FLAG))
|
||||
{
|
||||
@@ -2083,7 +2083,7 @@ void pmodeiret(int is32)
|
||||
segs[0]=POPL();
|
||||
segs[1]=POPL();
|
||||
segs[2]=POPL();
|
||||
segs[3]=POPL(); if (abrt) { ESP = oldsp; return; }
|
||||
segs[3]=POPL(); if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
// pclog("Pop stack %04X:%04X\n",newss,newsp);
|
||||
eflags=tempflags>>16;
|
||||
loadseg(segs[0],&_es);
|
||||
@@ -2113,7 +2113,7 @@ void pmodeiret(int is32)
|
||||
use32=0;
|
||||
flags=(tempflags&0xFFD5)|2;
|
||||
cycles -= timing_iret_v86;
|
||||
// pclog("V86 IRET to %04X:%04X %04X:%04X %04X %04X %04X %04X %i\n",CS,cpu_state.pc,SS,SP,DS,ES,FS,GS,abrt);
|
||||
// pclog("V86 IRET to %04X:%04X %04X:%04X %04X %04X %04X %04X %i\n",CS,cpu_state.pc,SS,SP,DS,ES,FS,GS,cpu_state.abrt);
|
||||
// if (CS==0xFFFF && pc==0xFFFFFFFF) timetolive=12;
|
||||
/* {
|
||||
dumpregs();
|
||||
@@ -2126,7 +2126,7 @@ void pmodeiret(int is32)
|
||||
{
|
||||
newpc=POPW();
|
||||
seg=POPW();
|
||||
tempflags=POPW(); if (abrt) { ESP = oldsp; return; }
|
||||
tempflags=POPW(); if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
}
|
||||
// if (!is386) tempflags&=0xFFF;
|
||||
// pclog("Returned to %04X:%08X %04X %04X %i\n",seg,newpc,flags,tempflags, ins);
|
||||
@@ -2175,7 +2175,7 @@ void pmodeiret(int is32)
|
||||
segdat[0]=readmemw(0,addr);
|
||||
segdat[1]=readmemw(0,addr+2);
|
||||
segdat[2]=readmemw(0,addr+4);
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) { ESP = oldsp; return; }
|
||||
segdat[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
// pclog("Seg type %04X %04X\n",segdat[2]&0x1F00,segdat[2]);
|
||||
|
||||
switch (segdat[2]&0x1F00)
|
||||
@@ -2239,12 +2239,12 @@ void pmodeiret(int is32)
|
||||
if (is32)
|
||||
{
|
||||
newsp=POPL();
|
||||
newss=POPL(); if (abrt) { ESP = oldsp; return; }
|
||||
newss=POPL(); if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
}
|
||||
else
|
||||
{
|
||||
newsp=POPW();
|
||||
newss=POPW(); if (abrt) { ESP = oldsp; return; }
|
||||
newss=POPW(); if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
}
|
||||
|
||||
if (output) pclog("IRET load stack %04X:%04X\n",newss,newsp);
|
||||
@@ -2283,7 +2283,7 @@ void pmodeiret(int is32)
|
||||
segdat2[0]=readmemw(0,addr);
|
||||
segdat2[1]=readmemw(0,addr+2);
|
||||
segdat2[2]=readmemw(0,addr+4);
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (abrt) { ESP = oldsp; return; }
|
||||
segdat2[3]=readmemw(0,addr+6); cpl_override=0; if (cpu_state.abrt) { ESP = oldsp; return; }
|
||||
// pclog("IRET SS sd2 %04X\n",segdat2[2]);
|
||||
// if (((newss & 3) != DPL) || (DPL2 != DPL))
|
||||
if ((newss & 3) != (seg & 3))
|
||||
@@ -2403,12 +2403,12 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
|
||||
new_gs=readmemw(base,0x5C);
|
||||
new_ldt=readmemw(base,0x60);
|
||||
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
if (optype==JMP || optype==OPTYPE_INT)
|
||||
{
|
||||
if (tr.seg&4) tempw=readmemw(ldt.base,(tr.seg&~7)+4);
|
||||
else tempw=readmemw(gdt.base,(tr.seg&~7)+4);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
tempw&=~0x200;
|
||||
if (tr.seg&4) writememw(ldt.base,(tr.seg&~7)+4,tempw);
|
||||
else writememw(gdt.base,(tr.seg&~7)+4,tempw);
|
||||
@@ -2445,12 +2445,12 @@ void taskswitch286(uint16_t seg, uint16_t *segdat, int is32)
|
||||
writememl(base,0,tr.seg);
|
||||
new_flags|=NT_FLAG;
|
||||
}
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
if (optype==JMP || optype==OPTYPE_INT)
|
||||
{
|
||||
if (tr.seg&4) tempw=readmemw(ldt.base,(seg&~7)+4);
|
||||
else tempw=readmemw(gdt.base,(seg&~7)+4);
|
||||
if (abrt) return;
|
||||
if (cpu_state.abrt) return;
|
||||
tempw|=0x200;
|
||||
if (tr.seg&4) writememw(ldt.base,(seg&~7)+4,tempw);
|
||||
else writememw(gdt.base,(seg&~7)+4,tempw);
|
||||
|
||||
Reference in New Issue
Block a user