1
0
Fork 0

New segments.

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@161
This commit is contained in:
Sjoerd van der Berg 2002-08-19 12:37:51 +00:00
parent 8c2ba5ad63
commit d30a5b8a39
3 changed files with 38 additions and 40 deletions

View file

@ -32,9 +32,9 @@ restart:
case 0x05: /* ADD AX,Iw */
AXIw(ADDW);break;
case 0x06: /* PUSH ES */
Push_16(Segs[es].value);break;
Push_16(SegValue(es));break;
case 0x07: /* POP ES */
SetSegment_16(es,Pop_16());break;
SegSet16(es,Pop_16());break;
case 0x08: /* OR Eb,Gb */
RMEbGb(ORB);break;
case 0x09: /* OR Ew,Gw */
@ -48,7 +48,7 @@ restart:
case 0x0d: /* OR AX,Iw */
AXIw(ORW);break;
case 0x0e: /* PUSH CS */
Push_16(Segs[cs].value);break;
Push_16(SegValue(cs));break;
case 0x0f: /* 2 byte opcodes*/
#include "prefix_of.h"
break;
@ -65,9 +65,9 @@ restart:
case 0x15: /* ADC AX,Iw */
AXIw(ADCW);break;
case 0x16: /* PUSH SS */
Push_16(Segs[ss].value);break;
Push_16(SegValue(ss));break;
case 0x17: /* POP SS */
SetSegment_16(ss,Pop_16());break;
SegSet16(ss,Pop_16());break;
case 0x18: /* SBB Eb,Gb */
RMEbGb(SBBB);break;
case 0x19: /* SBB Ew,Gw */
@ -81,9 +81,9 @@ restart:
case 0x1d: /* SBB AX,Iw */
AXIw(SBBW);break;
case 0x1e: /* PUSH DS */
Push_16(Segs[ds].value);break;
Push_16(SegValue(ds));break;
case 0x1f: /* POP DS */
SetSegment_16(ds,Pop_16());break;
SegSet16(ds,Pop_16());break;
case 0x20: /* AND Eb,Gb */
RMEbGb(ANDB);break;
case 0x21: /* AND Ew,Gw */
@ -524,17 +524,17 @@ restart:
GetRM;Bit16u val;
switch (rm & 0x38) {
case 0x00: /* MOV Ew,ES */
val=Segs[es].value;break;
val=SegValue(es);break;
case 0x08: /* MOV Ew,CS */
val=Segs[cs].value;break;
val=SegValue(cs);break;
case 0x10: /* MOV Ew,SS */
val=Segs[ss].value;break;
val=SegValue(ss);break;
case 0x18: /* MOV Ew,DS */
val=Segs[ds].value;break;
val=SegValue(ds);break;
case 0x20: /* MOV Ew,FS */
val=Segs[fs].value;break;
val=SegValue(fs);break;
case 0x28: /* MOV Ew,GS */
val=Segs[gs].value;break;
val=SegValue(gs);break;
default:
val=0;
E_Exit("CPU:8c:Illegal RM Byte");
@ -583,18 +583,18 @@ restart:
else {GetEAa;val=LoadMw(eaa);}
switch (rm & 0x38) {
case 0x00: /* MOV ES,Ew */
SetSegment_16(es,val);break;
SegSet16(es,val);break;
case 0x08: /* MOV CS,Ew Illegal*/
E_Exit("CPU:Illegal MOV CS Call");
break;
case 0x10: /* MOV SS,Ew */
SetSegment_16(ss,val);break;
SegSet16(ss,val);break;
case 0x18: /* MOV DS,Ew */
SetSegment_16(ds,val);break;
SegSet16(ds,val);break;
case 0x20: /* MOV FS,Ew */
SetSegment_16(fs,val);break;
SegSet16(fs,val);break;
case 0x28: /* MOV GS,Ew */
SetSegment_16(gs,val);break;
SegSet16(gs,val);break;
default:
E_Exit("CPU:8e:Illegal RM Byte");
}
@ -639,8 +639,8 @@ restart:
case 0x9a: /* CALL Ap */
{
Bit16u newip=Fetchw();Bit16u newcs=Fetchw();
Push_16(Segs[cs].value);Push_16(GETIP);
SetSegment_16(cs,newcs);SETIP(newip);
Push_16(SegValue(cs));Push_16(GETIP);
SegSet16(cs,newcs);SETIP(newip);
break;
}
case 0x9b: /* WAIT */
@ -838,13 +838,13 @@ restart:
case 0xc4: /* LES */
{
GetRMrw;GetEAa;
*rmrw=LoadMw(eaa);SetSegment_16(es,LoadMw(eaa+2));
*rmrw=LoadMw(eaa);SegSet16(es,LoadMw(eaa+2));
break;
}
case 0xc5: /* LDS */
{
GetRMrw;GetEAa;
*rmrw=LoadMw(eaa);SetSegment_16(ds,LoadMw(eaa+2));
*rmrw=LoadMw(eaa);SegSet16(ds,LoadMw(eaa+2));
break;
}
case 0xc6: /* MOV Eb,Ib */
@ -876,13 +876,13 @@ restart:
{
Bit16u addsp=Fetchw();
Bit16u newip=Pop_16();Bit16u newcs=Pop_16();
reg_sp+=addsp;SetSegment_16(cs,newcs);SETIP(newip);
reg_sp+=addsp;SegSet16(cs,newcs);SETIP(newip);
break;
}
case 0xcb: /* RETF */
{
Bit16u newip=Pop_16();Bit16u newcs=Pop_16();
SetSegment_16(cs,newcs);SETIP(newip);
SegSet16(cs,newcs);SETIP(newip);
}
break;
case 0xcc: /* INT3 */
@ -900,7 +900,7 @@ restart:
case 0xcf: /* IRET */
{
Bit16u newip=Pop_16();Bit16u newcs=Pop_16();
SetSegment_16(cs,newcs);SETIP(newip);
SegSet16(cs,newcs);SETIP(newip);
Bit16u pflags=Pop_16();Save_Flagsw(pflags);
break;
}
@ -1018,7 +1018,7 @@ restart:
{
Bit16u newip=Fetchw();
Bit16u newcs=Fetchw();
SetSegment_16(cs,newcs);
SegSet16(cs,newcs);
SETIP(newip);
break;
}
@ -1466,11 +1466,11 @@ restart:
break;
case 0x18: /* CALL Ep */
{
Push_16(Segs[cs].value);
Push_16(SegValue(cs));
GetEAa;Push_16(GETIP);
Bit16u newip=LoadMw(eaa);
Bit16u newcs=LoadMw(eaa+2);
SetSegment_16(cs,newcs);
SegSet16(cs,newcs);
SETIP(newip);
}
break;
@ -1483,7 +1483,7 @@ restart:
GetEAa;
Bit16u newip=LoadMw(eaa);
Bit16u newcs=LoadMw(eaa+2);
SetSegment_16(cs,newcs);
SegSet16(cs,newcs);
SETIP(newip);
}
break;

View file

@ -155,9 +155,9 @@ switch(Fetchb()) {
SETcc((get_SF() == get_OF()) && !get_ZF());break;
case 0xa0: /* PUSH FS */
Push_16(Segs[fs].value);break;
Push_16(SegValue(fs));break;
case 0xa1: /* POP FS */
SetSegment_16(fs,Pop_16());break;
SegSet16(fs,Pop_16());break;
/* 0xa2 CPUID */
case 0xa3: /* BT Ew,Gw */
{
@ -190,9 +190,9 @@ switch(Fetchb()) {
/* 0xa6 XBTS (early 386 only) CMPXCHG (early 486 only) */
/* 0xa7 IBTS (early 386 only) CMPXCHG (early 486 only) */
case 0xa8: /* PUSH GS */
Push_16(Segs[gs].value);break;
Push_16(SegValue(gs));break;
case 0xa9: /* POP GS */
SetSegment_16(gs,Pop_16());break;
SegSet16(gs,Pop_16());break;
/* 0xaa RSM */
case 0xab: /* BTS Ew,Gw */
{
@ -258,13 +258,13 @@ switch(Fetchb()) {
case 0xb4: /* LFS */
{
GetRMrw;GetEAa;
*rmrw=LoadMw(eaa);SetSegment_16(fs,LoadMw(eaa+2));
*rmrw=LoadMw(eaa);SegSet16(fs,LoadMw(eaa+2));
break;
}
case 0xb5: /* LGS */
{
GetRMrw;GetEAa;
*rmrw=LoadMw(eaa);SetSegment_16(gs,LoadMw(eaa+2));
*rmrw=LoadMw(eaa);SegSet16(gs,LoadMw(eaa+2));
break;
}
case 0xb6: /* MOVZX Gw,Eb */

View file

@ -25,9 +25,7 @@
#include "fpu.h"
typedef PhysPt EAPoint;
#define SegBase(seg) Segs[seg].phys
#define SegBase(c) SegPhys(c)
#define LoadMb(off) mem_readb(off)
#define LoadMw(off) mem_readw(off)
#define LoadMd(off) mem_readd(off)
@ -52,7 +50,7 @@ extern Bitu cycle_count;
/* Enable parts of the cpu emulation */
#define CPU_386 //Enable 386 instructions
#ifdef C_FPU
#if C_FPU
#define CPU_FPU //Enable FPU escape instructions
#endif
@ -61,7 +59,7 @@ static Bitu CPU_Real_16_Slow_Decode_Special(Bitu count);
static Bitu CPU_Real_16_Slow_Decode(Bitu count) {
#include "core_16/start.h"
while (count) {
#ifdef C_DEBUG
#if C_DEBUG
cycle_count++;
#endif
count--;