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:
OBattler
2016-08-31 22:49:56 +02:00
parent d860ea79ed
commit 1ddad56c8c
81 changed files with 4255 additions and 3899 deletions

View File

@@ -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);