diff --git a/src/386.c b/src/386.c
index 21df2e257..d685edf56 100644
--- a/src/386.c
+++ b/src/386.c
@@ -46,7 +46,7 @@ uint32_t rmdat32;
#define fetchdat rmdat32
uint32_t backupregs[16];
extern int oddeven;
-int inttype,abrt;
+int inttype;
uint32_t oldcs2;
@@ -172,8 +172,8 @@ static inline void fetch_ea_16_long(uint32_t rmdat)
}
}
-#define fetch_ea_16(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_16_long(rmdat); if (abrt) return 0; }
-#define fetch_ea_32(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_32_long(rmdat); } if (abrt) return 0
+#define fetch_ea_16(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_16_long(rmdat); if (cpu_state.abrt) return 0; }
+#define fetch_ea_32(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_32_long(rmdat); } if (cpu_state.abrt) return 0
#include "x86_flags.h"
@@ -246,7 +246,7 @@ dontprint=0;
opcodestart:
fetchdat = fastreadl(cs + cpu_state.pc);
- if (!abrt)
+ if (!cpu_state.abrt)
{
trap = flags & T_FLAG;
opcode = fetchdat & 0xFF;
@@ -262,11 +262,11 @@ opcodestart:
if (!use32) cpu_state.pc &= 0xffff;
- if (abrt)
+ if (cpu_state.abrt)
{
flags_rebuild();
// pclog("Abort\n");
-// if (CS == 0x228) pclog("Abort at %04X:%04X - %i %i %i\n",CS,pc,notpresent,nullseg,abrt);
+// if (CS == 0x228) pclog("Abort at %04X:%04X - %i %i %i\n",CS,pc,notpresent,nullseg,cpu_state.abrt);
/* if (testr[0]!=EAX) pclog("EAX corrupted %08X\n",pc);
if (testr[1]!=EBX) pclog("EBX corrupted %08X\n",pc);
if (testr[2]!=ECX) pclog("ECX corrupted %08X\n",pc);
@@ -276,19 +276,19 @@ opcodestart:
if (testr[6]!=EBP) pclog("EBP corrupted %08X\n",pc);
if (testr[7]!=ESP) pclog("ESP corrupted %08X\n",pc);*/
/* if (testr[8]!=flags) pclog("FLAGS corrupted %08X\n",pc);*/
- tempi = abrt;
- abrt = 0;
+ tempi = cpu_state.abrt;
+ cpu_state.abrt = 0;
x86_doabrt(tempi);
- if (abrt)
+ if (cpu_state.abrt)
{
- abrt = 0;
+ cpu_state.abrt = 0;
CS = oldcs;
cpu_state.pc = cpu_state.oldpc;
pclog("Double fault %i\n", ins);
pmodeint(8, 0);
- if (abrt)
+ if (cpu_state.abrt)
{
- abrt = 0;
+ cpu_state.abrt = 0;
softresetx86();
pclog("Triple fault - reset\n");
}
diff --git a/src/386_common.h b/src/386_common.h
index 89b8abd24..d1350f55d 100644
--- a/src/386_common.h
+++ b/src/386_common.h
@@ -21,7 +21,7 @@ extern uint16_t ea_rseg;
#define check_io_perm(port) if (!IOPLp || (eflags&VM_FLAG)) \
{ \
int tempi = checkio(port); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
if (tempi) \
{ \
x86gpf("check_io_perm(): no permission",0); \
@@ -32,7 +32,7 @@ extern uint16_t ea_rseg;
#define checkio_perm(port) if (!IOPLp || (eflags&VM_FLAG)) \
{ \
tempi = checkio(port); \
- if (abrt) break; \
+ if (cpu_state.abrt) break; \
if (tempi) \
{ \
x86gpf("checkio_perm(): no permission",0); \
@@ -44,7 +44,7 @@ extern uint16_t ea_rseg;
#define check_io_perm(port) if (msw&1 && ((CPL > IOPL) || (eflags&VM_FLAG))) \
{ \
int tempi = checkio(port); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
if (tempi) \
{ \
x86gpf("check_io_perm(): no permission",0); \
@@ -55,71 +55,13 @@ extern uint16_t ea_rseg;
#define checkio_perm(port) if (msw&1 && ((CPL > IOPL) || (eflags&VM_FLAG))) \
{ \
tempi = checkio(port); \
- if (abrt) break; \
+ if (cpu_state.abrt) break; \
if (tempi) \
{ \
x86gpf("checkio_perm(): no permission",0); \
break; \
} \
}
-#if 0
-#define CHECK_READ(chseg, low, high) \
- if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) \
- { \
- x86gpf("Limit check (READ)", 0); \
- return 1; \
- } \
- if (msw&1 && !(eflags&VM_FLAG) && !((chseg)->access & 0x80)) \
- { \
- if ((chseg) == &_ss) \
- x86ss(NULL,(chseg)->seg & 0xfffc); \
- else \
- pclog("Read from seg not present", (chseg)->seg & 0xfffc); \
- return 1; \
- }
-
-#define CHECK_WRITE(chseg, low, high) \
- if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || !((chseg)->access & 2)) \
- { \
- x86gpf("Limit check (WRITE)", 0); \
- return 1; \
- } \
- if (msw&1 && !(eflags&VM_FLAG) && !((chseg)->access & 0x80)) \
- { \
- if ((chseg) == &_ss) \
- x86ss(NULL,(chseg)->seg & 0xfffc); \
- else \
- x86np("Write to seg not present", (chseg)->seg & 0xfffc); \
- return 1; \
- }
-
-#if 0
-#define CHECK_WRITE_REP(chseg, low, high) \
- if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) \
- { \
- x86gpf("Limit check (WRITE_REP)", 0); \
- if (1 != 1) break; \
- } \
- if (msw&1 && !(eflags&VM_FLAG) && !((chseg)->access & 0x80)) \
- { \
- if ((chseg) == &_ss) \
- x86ss(NULL,(chseg)->seg & 0xfffc); \
- else \
- x86np("Write (REP) to seg not present", (chseg)->seg & 0xfffc); \
- break; \
- }
-#endif
-
-#define CHECK_WRITE_REP(chseg, low, high) \
- if (msw&1 && !(eflags&VM_FLAG) && !((chseg)->access & 0x80)) \
- { \
- if ((chseg) == &_ss) \
- x86ss(NULL,(chseg)->seg & 0xfffc); \
- else \
- x86np("Write (REP) to seg not present", (chseg)->seg & 0xfffc); \
- break; \
- }
-#endif
#define CHECK_READ(chseg, low, high) \
if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) \
@@ -183,7 +125,7 @@ static inline uint8_t fastreadb(uint32_t a)
if ((a >> 12) == pccache)
return *((uint8_t *)&pccache2[a]);
t = getpccache(a);
- if (abrt)
+ if (cpu_state.abrt)
return;
pccache = a >> 12;
pccache2 = t;
@@ -202,7 +144,7 @@ static inline uint16_t fastreadw(uint32_t a)
}
if ((a>>12)==pccache) return *((uint16_t *)&pccache2[a]);
t = getpccache(a);
- if (abrt)
+ if (cpu_state.abrt)
return;
pccache = a >> 12;
@@ -219,7 +161,7 @@ static inline uint32_t fastreadl(uint32_t a)
if ((a>>12)!=pccache)
{
t = getpccache(a);
- if (abrt)
+ if (cpu_state.abrt)
return 0;
pccache2 = t;
pccache=a>>12;
diff --git a/src/386_dynarec.c b/src/386_dynarec.c
index 4744d945b..72b322330 100644
--- a/src/386_dynarec.c
+++ b/src/386_dynarec.c
@@ -19,7 +19,7 @@ int cpu_reps, cpu_reps_latched;
int cpu_notreps, cpu_notreps_latched;
int inrecomp = 0;
-int cpu_recomp_blocks, cpu_recomp_ins, cpu_recomp_full_ins, cpu_new_blocks;
+int cpu_recomp_blocks, cpu_recomp_full_ins, cpu_new_blocks;
int cpu_recomp_blocks_latched, cpu_recomp_ins_latched, cpu_recomp_full_ins_latched, cpu_new_blocks_latched;
int cpu_block_end = 0;
@@ -52,7 +52,7 @@ uint16_t biosmask;
uint32_t rmdat32;
uint32_t backupregs[16];
int oddeven=0;
-int inttype,abrt;
+int inttype;
uint32_t oldcs2;
@@ -178,8 +178,8 @@ static inline void fetch_ea_16_long(uint32_t rmdat)
}
}
-#define fetch_ea_16(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_16_long(rmdat); if (abrt) return 1; }
-#define fetch_ea_32(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_32_long(rmdat); } if (abrt) return 1
+#define fetch_ea_16(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_16_long(rmdat); if (cpu_state.abrt) return 1; }
+#define fetch_ea_32(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_32_long(rmdat); } if (cpu_state.abrt) return 1
#include "x86_flags.h"
@@ -349,7 +349,7 @@ int rep386(int fv)
checkio_perm(DX);
temp2=inb(DX);
writememb(es,DI,temp2);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI--;
else DI++;
c--;
@@ -365,7 +365,7 @@ int rep386(int fv)
checkio_perm(DX);
temp2=inb(DX);
writememb(es,EDI,temp2);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI--;
else EDI++;
c--;
@@ -381,7 +381,7 @@ int rep386(int fv)
// pclog("REP INSW %04x %04x:%04x %04x\n", DX, ES, DI, CX);
tempw=inw(DX);
writememw(es,DI,tempw);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI-=2;
else DI+=2;
c--;
@@ -396,7 +396,7 @@ int rep386(int fv)
{
templ=inl(DX);
writememl(es,DI,templ);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI-=4;
else DI+=4;
c--;
@@ -411,7 +411,7 @@ int rep386(int fv)
{
tempw=inw(DX);
writememw(es,EDI,tempw);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI-=2;
else EDI+=2;
c--;
@@ -426,7 +426,7 @@ int rep386(int fv)
{
templ=inl(DX);
writememl(es,EDI,templ);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI-=4;
else EDI+=4;
c--;
@@ -440,7 +440,7 @@ int rep386(int fv)
if (c>0)
{
temp2 = readmemb(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
checkio_perm(DX);
outb(DX,temp2);
if (flags&D_FLAG) SI--;
@@ -456,7 +456,7 @@ int rep386(int fv)
if (c>0)
{
temp2 = readmemb(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
checkio_perm(DX);
outb(DX,temp2);
if (flags&D_FLAG) ESI--;
@@ -472,7 +472,7 @@ int rep386(int fv)
if (c>0)
{
tempw = readmemw(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
// pclog("OUTSW %04X -> %04X\n",SI,tempw);
outw(DX,tempw);
if (flags&D_FLAG) SI-=2;
@@ -488,7 +488,7 @@ int rep386(int fv)
if (c > 0)
{
templ = readmeml(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
outl(DX, templ);
if (flags & D_FLAG) SI -= 4;
else SI += 4;
@@ -503,7 +503,7 @@ int rep386(int fv)
if (c>0)
{
tempw = readmemw(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
outw(DX,tempw);
if (flags&D_FLAG) ESI-=2;
else ESI+=2;
@@ -518,7 +518,7 @@ int rep386(int fv)
if (c > 0)
{
templ = readmeml(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
outl(DX, templ);
if (flags & D_FLAG) ESI -= 4;
else ESI += 4;
@@ -536,8 +536,8 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, DI, DI);
- temp2 = readmemb(cpu_state.ea_seg->base, SI); if (abrt) break;
- writememb(es,DI,temp2); if (abrt) break;
+ temp2 = readmemb(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) break;
+ writememb(es,DI,temp2); if (cpu_state.abrt) break;
// if (output==3) pclog("MOVSB %08X:%04X -> %08X:%04X %02X\n",ds,SI,es,DI,temp2);
if (flags&D_FLAG) { DI--; SI--; }
else { DI++; SI++; }
@@ -555,8 +555,8 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, EDI, EDI);
- temp2 = readmemb(cpu_state.ea_seg->base, ESI); if (abrt) break;
- writememb(es,EDI,temp2); if (abrt) break;
+ temp2 = readmemb(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) break;
+ writememb(es,EDI,temp2); if (cpu_state.abrt) break;
if (flags&D_FLAG) { EDI--; ESI--; }
else { EDI++; ESI++; }
c--;
@@ -573,8 +573,8 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, DI, DI+1);
- tempw = readmemw(cpu_state.ea_seg->base, SI); if (abrt) break;
- writememw(es,DI,tempw); if (abrt) break;
+ tempw = readmemw(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) break;
+ writememw(es,DI,tempw); if (cpu_state.abrt) break;
if (flags&D_FLAG) { DI-=2; SI-=2; }
else { DI+=2; SI+=2; }
c--;
@@ -591,9 +591,9 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, DI, DI+3);
- templ = readmeml(cpu_state.ea_seg->base, SI); if (abrt) break;
+ templ = readmeml(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) break;
// pclog("MOVSD %08X from %08X to %08X (%04X:%08X)\n", templ, ds+SI, es+DI, CS, pc);
- writememl(es,DI,templ); if (abrt) break;
+ writememl(es,DI,templ); if (cpu_state.abrt) break;
if (flags&D_FLAG) { DI-=4; SI-=4; }
else { DI+=4; SI+=4; }
c--;
@@ -610,8 +610,8 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, EDI, EDI+1);
- tempw = readmemw(cpu_state.ea_seg->base, ESI); if (abrt) break;
- writememw(es,EDI,tempw); if (abrt) break;
+ tempw = readmemw(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) break;
+ writememw(es,EDI,tempw); if (cpu_state.abrt) break;
// if (output) pclog("Written %04X from %08X to %08X %i %08X %04X %08X %04X\n",tempw,ds+ESI,es+EDI,c,ds,ES,es,ES);
if (flags&D_FLAG) { EDI-=2; ESI-=2; }
else { EDI+=2; ESI+=2; }
@@ -629,9 +629,9 @@ int rep386(int fv)
while (c > 0)
{
CHECK_WRITE_REP(&_es, EDI, EDI+3);
- templ = readmeml(cpu_state.ea_seg->base, ESI); if (abrt) break;
+ templ = readmeml(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) break;
// if ((EDI&0xFFFF0000)==0xA0000) cycles-=12;
- writememl(es,EDI,templ); if (abrt) break;
+ writememl(es,EDI,templ); if (cpu_state.abrt) break;
// if (output) pclog("Load %08X from %08X to %08X %04X %08X %04X %08X\n",templ,ESI,EDI,DS,ds,ES,es);
if (flags&D_FLAG) { EDI-=4; ESI-=4; }
else { EDI+=4; ESI+=4; }
@@ -652,7 +652,7 @@ int rep386(int fv)
{
temp = readmemb(cpu_state.ea_seg->base, SI);
temp2=readmemb(es,DI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { DI--; SI--; }
else { DI++; SI++; }
c--;
@@ -670,7 +670,7 @@ int rep386(int fv)
{
temp = readmemb(cpu_state.ea_seg->base, ESI);
temp2=readmemb(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { EDI--; ESI--; }
else { EDI++; ESI++; }
c--;
@@ -691,7 +691,7 @@ int rep386(int fv)
tempw2=readmemw(es,DI);
// pclog("%04X %04X %c%c %c%c\n", tempw, tempw2, tempw & 0xff, tempw >> 8, tempw2 & 0xff, tempw2 >> 8);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { DI-=2; SI-=2; }
else { DI+=2; SI+=2; }
c--;
@@ -709,7 +709,7 @@ int rep386(int fv)
{
templ = readmeml(cpu_state.ea_seg->base, SI);
templ2=readmeml(es,DI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { DI-=4; SI-=4; }
else { DI+=4; SI+=4; }
c--;
@@ -727,7 +727,7 @@ int rep386(int fv)
{
tempw = readmemw(cpu_state.ea_seg->base, ESI);
tempw2=readmemw(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { EDI-=2; ESI-=2; }
else { EDI+=2; ESI+=2; }
c--;
@@ -745,7 +745,7 @@ int rep386(int fv)
{
templ = readmeml(cpu_state.ea_seg->base, ESI);
templ2=readmeml(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
if (flags&D_FLAG) { EDI-=4; ESI-=4; }
else { EDI+=4; ESI+=4; }
c--;
@@ -762,7 +762,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, DI, DI);
writememb(es,DI,AL);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI--;
else DI++;
c--;
@@ -780,7 +780,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, EDI, EDI);
writememb(es,EDI,AL);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI--;
else EDI++;
c--;
@@ -798,7 +798,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, DI, DI+1);
writememw(es,DI,AX);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI-=2;
else DI+=2;
c--;
@@ -816,7 +816,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, EDI, EDI+1);
writememw(es,EDI,AX);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI-=2;
else EDI+=2;
c--;
@@ -834,7 +834,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, DI, DI+3);
writememl(es,DI,EAX);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) DI-=4;
else DI+=4;
c--;
@@ -852,7 +852,7 @@ int rep386(int fv)
{
CHECK_WRITE_REP(&_es, EDI, EDI+3);
writememl(es,EDI,EAX);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) EDI-=4;
else EDI+=4;
c--;
@@ -871,7 +871,7 @@ int rep386(int fv)
if (c>0)
{
AL = readmemb(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) SI--;
else SI++;
c--;
@@ -886,7 +886,7 @@ int rep386(int fv)
if (c>0)
{
AL = readmemb(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) ESI--;
else ESI++;
c--;
@@ -901,7 +901,7 @@ int rep386(int fv)
if (c>0)
{
AX = readmemw(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) SI-=2;
else SI+=2;
c--;
@@ -916,7 +916,7 @@ int rep386(int fv)
if (c>0)
{
EAX = readmeml(cpu_state.ea_seg->base, SI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) SI-=4;
else SI+=4;
c--;
@@ -931,7 +931,7 @@ int rep386(int fv)
if (c>0)
{
AX = readmemw(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) ESI-=2;
else ESI+=2;
c--;
@@ -946,7 +946,7 @@ int rep386(int fv)
if (c>0)
{
EAX = readmeml(cpu_state.ea_seg->base, ESI);
- if (abrt) break;
+ if (cpu_state.abrt) break;
if (flags&D_FLAG) ESI-=4;
else ESI+=4;
c--;
@@ -963,7 +963,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
temp2=readmemb(es,DI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
setsub8(AL,temp2);
tempz = (ZF_SET()) ? 1 : 0;
if (flags&D_FLAG) DI--;
@@ -986,7 +986,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
temp2=readmemb(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
// if (output) pclog("Compare %02X,%02X\n",temp2,AL);
setsub8(AL,temp2);
tempz = (ZF_SET()) ? 1 : 0;
@@ -1009,7 +1009,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
tempw=readmemw(es,DI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
setsub16(AX,tempw);
tempz = (ZF_SET()) ? 1 : 0;
if (flags&D_FLAG) DI-=2;
@@ -1031,7 +1031,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
templ=readmeml(es,DI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
setsub32(EAX,templ);
tempz = (ZF_SET()) ? 1 : 0;
if (flags&D_FLAG) DI-=4;
@@ -1053,7 +1053,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
tempw=readmemw(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
setsub16(AX,tempw);
tempz = (ZF_SET()) ? 1 : 0;
if (flags&D_FLAG) EDI-=2;
@@ -1075,7 +1075,7 @@ int rep386(int fv)
while ((c > 0) && (fv == tempz))
{
templ=readmeml(es,EDI);
- if (abrt) { flags=of; break; }
+ if (cpu_state.abrt) { flags=of; break; }
setsub32(EAX,templ);
tempz = (ZF_SET()) ? 1 : 0;
if (flags&D_FLAG) EDI-=4;
@@ -1100,7 +1100,7 @@ int rep386(int fv)
if (rep32&0x200) ECX=c;
else CX=c;
CPU_BLOCK_END();
- return abrt;
+ return cpu_state.abrt;
//pclog("rep cpu_block_end=%d %p\n", cpu_block_end, (void *)&cpu_block_end);
// if (output) pclog("%03X %03X\n",rep32,use32);
}
@@ -1113,7 +1113,7 @@ int checkio(int port)
t = readmemw(tr.base, 0x66);
cpl_override = 0;
// pclog("CheckIO 1 %08X %04x %02x\n",tr.base, eflags, _cs.access);
- if (abrt) return 0;
+ if (cpu_state.abrt) return 0;
// pclog("CheckIO %04X %01X %01X %02X %04X %04X %08X ",CS,CPL,IOPL,port,t,t+(port>>3),tr.base+t+(port>>3));
if ((t+(port>>3))>tr.limit) return 1;
cpl_override = 1;
@@ -1247,7 +1247,7 @@ void exec386_dynarec(int cycs)
fetchdat = fastreadl(cs + cpu_state.pc);
// if (!fetchdat)
// fatal("Dead with cache off\n");
- if (!abrt)
+ if (!cpu_state.abrt)
{
trap = flags & T_FLAG;
opcode = fetchdat & 0xFF;
@@ -1271,7 +1271,7 @@ void exec386_dynarec(int cycs)
ss=oldss;
ssegs=0;
}*/
- if (abrt)
+ if (cpu_state.abrt)
CPU_BLOCK_END();
if (trap)
CPU_BLOCK_END();
@@ -1293,7 +1293,7 @@ void exec386_dynarec(int cycs)
int valid_block = 0;
trap = 0;
- if (block && !abrt)
+ if (block && !cpu_state.abrt)
{
page_t *page = &pages[phys_addr >> 12];
@@ -1367,7 +1367,7 @@ inrecomp=0;
insc += codeblock_ins[index];*/
/* pclog("Exit block now %04X:%04X\n", CS, pc);*/
}
- else if (valid_block && !abrt)
+ else if (valid_block && !cpu_state.abrt)
{
uint32_t start_page = cpu_state.pc >> 12;
uint32_t start_pc = cpu_state.pc;
@@ -1398,7 +1398,7 @@ inrecomp=0;
// fatal("Dead ffffffff\n");
// if (!fetchdat)
// fatal("Dead\n");
- if (!abrt)
+ if (!cpu_state.abrt)
{
trap = flags & T_FLAG;
opcode = fetchdat & 0xFF;
@@ -1430,7 +1430,7 @@ inrecomp=0;
CPU_BLOCK_END();
- if (abrt)
+ if (cpu_state.abrt)
{
codegen_block_remove();
CPU_BLOCK_END();
@@ -1440,7 +1440,7 @@ inrecomp=0;
insc++;
}
- if (!abrt && !x86_was_reset)
+ if (!cpu_state.abrt && !x86_was_reset)
codegen_block_end_recompile(block);
if (x86_was_reset)
@@ -1449,7 +1449,7 @@ inrecomp=0;
codegen_in_recompile = 0;
// output &= ~2;
}
- else if (!abrt)
+ else if (!cpu_state.abrt)
{
/*Mark block but do not recompile*/
uint32_t start_page = cpu_state.pc >> 12;
@@ -1477,7 +1477,7 @@ inrecomp=0;
codegen_endpc = (cs + cpu_state.pc) + 8;
fetchdat = fastreadl(cs + cpu_state.pc);
- if (!abrt)
+ if (!cpu_state.abrt)
{
trap = flags & T_FLAG;
opcode = fetchdat & 0xFF;
@@ -1507,7 +1507,7 @@ inrecomp=0;
CPU_BLOCK_END();
- if (abrt)
+ if (cpu_state.abrt)
{
codegen_block_remove();
CPU_BLOCK_END();
@@ -1517,7 +1517,7 @@ inrecomp=0;
insc++;
}
- if (!abrt && !x86_was_reset)
+ if (!cpu_state.abrt && !x86_was_reset)
codegen_block_end();
if (x86_was_reset)
@@ -1534,22 +1534,22 @@ inrecomp=0;
// timer_end_period(cycles);
- if (abrt)
+ if (cpu_state.abrt)
{
flags_rebuild();
- tempi = abrt;
- abrt = 0;
+ tempi = cpu_state.abrt;
+ cpu_state.abrt = 0;
x86_doabrt(tempi);
- if (abrt)
+ if (cpu_state.abrt)
{
- abrt = 0;
+ cpu_state.abrt = 0;
CS = oldcs;
cpu_state.pc = cpu_state.oldpc;
pclog("Double fault %i\n", ins);
pmodeint(8, 0);
- if (abrt)
+ if (cpu_state.abrt)
{
- abrt = 0;
+ cpu_state.abrt = 0;
softresetx86();
pclog("Triple fault - reset\n");
}
diff --git a/src/386_ops.h b/src/386_ops.h
index 7a3b9f901..26722133d 100644
--- a/src/386_ops.h
+++ b/src/386_ops.h
@@ -19,13 +19,13 @@ static inline void PUSH_W(uint16_t val)
{
if (stack32)
{
- writememw(ss, ESP - 2, val); if (abrt) return;
+ writememw(ss, ESP - 2, val); if (cpu_state.abrt) return;
ESP -= 2;
cpu_state.last_ea = ESP;
}
else
{
- writememw(ss, (SP - 2) & 0xFFFF, val); if (abrt) return;
+ writememw(ss, (SP - 2) & 0xFFFF, val); if (cpu_state.abrt) return;
SP -= 2;
cpu_state.last_ea = SP;
}
@@ -35,13 +35,13 @@ static inline void PUSH_L(uint32_t val)
{
if (stack32)
{
- writememl(ss, ESP - 4, val); if (abrt) return;
+ writememl(ss, ESP - 4, val); if (cpu_state.abrt) return;
ESP -= 4;
cpu_state.last_ea = ESP;
}
else
{
- writememl(ss, (SP - 4) & 0xFFFF, val); if (abrt) return;
+ writememl(ss, (SP - 4) & 0xFFFF, val); if (cpu_state.abrt) return;
SP -= 4;
cpu_state.last_ea = SP;
}
@@ -52,13 +52,13 @@ static inline uint16_t POP_W()
uint16_t ret;
if (stack32)
{
- ret = readmemw(ss, ESP); if (abrt) return 0;
+ ret = readmemw(ss, ESP); if (cpu_state.abrt) return 0;
ESP += 2;
cpu_state.last_ea = ESP;
}
else
{
- ret = readmemw(ss, SP); if (abrt) return 0;
+ ret = readmemw(ss, SP); if (cpu_state.abrt) return 0;
SP += 2;
cpu_state.last_ea = SP;
}
@@ -70,13 +70,13 @@ static inline uint32_t POP_L()
uint32_t ret;
if (stack32)
{
- ret = readmeml(ss, ESP); if (abrt) return 0;
+ ret = readmeml(ss, ESP); if (cpu_state.abrt) return 0;
ESP += 4;
cpu_state.last_ea = ESP;
}
else
{
- ret = readmeml(ss, SP); if (abrt) return 0;
+ ret = readmeml(ss, SP); if (cpu_state.abrt) return 0;
SP += 4;
cpu_state.last_ea = SP;
}
@@ -88,13 +88,13 @@ static inline uint16_t POP_W_seg(uint32_t seg)
uint16_t ret;
if (stack32)
{
- ret = readmemw(seg, ESP); if (abrt) return 0;
+ ret = readmemw(seg, ESP); if (cpu_state.abrt) return 0;
ESP += 2;
cpu_state.last_ea = ESP;
}
else
{
- ret = readmemw(seg, SP); if (abrt) return 0;
+ ret = readmemw(seg, SP); if (cpu_state.abrt) return 0;
SP += 2;
cpu_state.last_ea = SP;
}
@@ -106,13 +106,13 @@ static inline uint32_t POP_L_seg(uint32_t seg)
uint32_t ret;
if (stack32)
{
- ret = readmeml(seg, ESP); if (abrt) return 0;
+ ret = readmeml(seg, ESP); if (cpu_state.abrt) return 0;
ESP += 4;
cpu_state.last_ea = ESP;
}
else
{
- ret = readmeml(seg, SP); if (abrt) return 0;
+ ret = readmeml(seg, SP); if (cpu_state.abrt) return 0;
SP += 4;
cpu_state.last_ea = SP;
}
diff --git a/src/808x.c b/src/808x.c
index 5ba43d1a9..24587e8ca 100644
--- a/src/808x.c
+++ b/src/808x.c
@@ -341,7 +341,6 @@ reg = If mod=11, (depending on data size, 16 bits/8 bits, 32 bits=extend 16 bit
If BP or SP are in address calc, seg is SS, else DS
*/
-int cycles=0;
uint32_t easeg;
int rmdat;
@@ -548,7 +547,7 @@ chdir(pcempath);
f=fopen("rram4.dmp","wb");
for (c=0;c<0x0050000;c++)
{
- abrt = 0;
+ cpu_state.abrt = 0;
putc(readmemb386l(0,c+0x80000000),f);
}
fclose(f);
diff --git a/src/PCem.manifest b/src/86Box.manifest
similarity index 96%
rename from src/PCem.manifest
rename to src/86Box.manifest
index 921baa27c..7c75fcf37 100644
--- a/src/PCem.manifest
+++ b/src/86Box.manifest
@@ -3,7 +3,7 @@
Your application description here.
diff --git a/src/Makefile.mingw b/src/Makefile.mingw
index 28351275d..d0216e955 100644
--- a/src/Makefile.mingw
+++ b/src/Makefile.mingw
@@ -5,7 +5,7 @@ WINDRES = windres.exe
CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -funroll-loops -fpeel-loops -ftracer -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse -mstackrealign
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o cdrom-ioctl.o cdrom-iso.o \
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o dac.o \
- device.o disc.o disc_fdi.o disc_img.o disc_sector_86box.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
+ device.o disc.o disc_86f.o disc_fdi.o disc_img.o disc_sector_86box.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \
diff --git a/src/Makefile.mingw64 b/src/Makefile.mingw64
index bf05e2155..8caa256ef 100644
--- a/src/Makefile.mingw64
+++ b/src/Makefile.mingw64
@@ -5,7 +5,7 @@ WINDRES = windres.exe
CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -funroll-loops -fpeel-loops -ftracer -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse -mstackrealign
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o cdrom-ioctl.o cdrom-iso.o \
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \
- device.o disc.o disc_fdi.o disc_img.o disc_sector_86box.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
+ device.o disc.o disc_86f.o disc_fdi.o disc_img.o disc_sector_86box.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \
diff --git a/src/codegen.h b/src/codegen.h
index d4012fb1c..c15f85e77 100644
--- a/src/codegen.h
+++ b/src/codegen.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#include "mem.h"
#ifdef __amd64__
@@ -242,7 +239,6 @@ void codegen_block_start_recompile(codeblock_t *block);
void codegen_block_end_recompile(codeblock_t *block);
void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_pc, uint32_t old_pc);
void codegen_generate_seg_restore();
-void codegen_check_abrt();
void codegen_set_op32();
void codegen_flush();
void codegen_check_flush(struct page_t *page, uint64_t mask, uint32_t phys_addr);
@@ -250,7 +246,7 @@ void codegen_check_flush(struct page_t *page, uint64_t mask, uint32_t phys_addr)
extern int cpu_block_end;
extern uint32_t codegen_endpc;
-extern int cpu_recomp_blocks, cpu_recomp_ins, cpu_recomp_full_ins, cpu_new_blocks;
+extern int cpu_recomp_blocks, cpu_recomp_full_ins, cpu_new_blocks;
extern int cpu_recomp_blocks_latched, cpu_recomp_ins_latched, cpu_recomp_full_ins_latched, cpu_new_blocks_latched;
extern int cpu_recomp_flushes, cpu_recomp_flushes_latched;
extern int cpu_recomp_evicted, cpu_recomp_evicted_latched;
diff --git a/src/codegen_ops_fpu.h b/src/codegen_ops_fpu.h
index 2cb1be8fc..69e20597e 100644
--- a/src/codegen_ops_fpu.h
+++ b/src/codegen_ops_fpu.h
@@ -119,7 +119,7 @@ static uint32_t ropFILDq(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint
FP_LOAD_IQ();
- codegen_fpu_loaded_iq[(TOP - 1) & 7] = 1;
+ codegen_fpu_loaded_iq[(cpu_state.TOP - 1) & 7] = 1;
return op_pc + 1;
}
@@ -483,7 +483,7 @@ static uint32_t ropFSTSW_AX(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, u
int host_reg;
FP_ENTER();
- host_reg = LOAD_VAR_W(&npxs);
+ host_reg = LOAD_VAR_W(&cpu_state.npxs);
STORE_REG_TARGET_W_RELEASE(host_reg, REG_AX);
return op_pc;
@@ -579,7 +579,7 @@ static uint32_t ropFLDCW(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint
CHECK_SEG_READ(target_seg);
MEM_LOAD_ADDR_EA_W(target_seg);
- STORE_HOST_REG_ADDR_W((uintptr_t)&npxc, 0);
+ STORE_HOST_REG_ADDR_W((uintptr_t)&cpu_state.npxc, 0);
return op_pc + 1;
}
@@ -594,7 +594,7 @@ static uint32_t ropFSTCW(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint
CHECK_SEG_WRITE(target_seg);
- host_reg = LOAD_VAR_W((uintptr_t)&npxc);
+ host_reg = LOAD_VAR_W((uintptr_t)&cpu_state.npxc);
MEM_STORE_ADDR_EA_W(target_seg, host_reg);
return op_pc + 1;
diff --git a/src/codegen_ops_x86-64.h b/src/codegen_ops_x86-64.h
index 55b670652..05582c28d 100644
--- a/src/codegen_ops_x86-64.h
+++ b/src/codegen_ops_x86-64.h
@@ -4,6 +4,9 @@
#define HOST_REG_XMM_START 0
#define HOST_REG_XMM_END 7
+
+#define IS_32_ADDR(x) !(((uintptr_t)x) & 0xffffffff00000000)
+
static inline int find_host_xmm_reg()
{
int c;
@@ -200,7 +203,7 @@ static int LOAD_REG_B(int reg)
addbyte(0x44); /*MOVZX W[reg],host_reg*/
addbyte(0x8b);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg & 3].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg & 3].b));
}
codegen_reg_loaded[reg & 3] = 1;
@@ -220,7 +223,7 @@ static int LOAD_REG_W(int reg)
addbyte(0x44); /*MOVZX W[reg],host_reg*/
addbyte(0x8b);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].w));
}
codegen_reg_loaded[reg & 7] = 1;
@@ -237,7 +240,7 @@ static int LOAD_REG_L(int reg)
addbyte(0x44); /*MOVZX W[reg],host_reg*/
addbyte(0x8b);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].l));
}
codegen_reg_loaded[reg & 7] = 1;
@@ -307,7 +310,7 @@ static void STORE_REG_TARGET_B_RELEASE(int host_reg, int guest_reg)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | (dest_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].w));
}
else
{
@@ -326,7 +329,7 @@ static void STORE_REG_TARGET_B_RELEASE(int host_reg, int guest_reg)
addbyte(0xc0 | (dest_reg & 7));
addbyte(0x88); /*MOVB regs[reg].b, AH*/
addbyte(0x65);
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].b));
}
else
{
@@ -336,7 +339,7 @@ static void STORE_REG_TARGET_B_RELEASE(int host_reg, int guest_reg)
addbyte(0x44); /*MOVB regs[guest_reg].b, host_reg*/
addbyte(0x88);
addbyte(0x45 | ((host_reg & 3) << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].b));
}
}
else
@@ -352,7 +355,7 @@ static void STORE_REG_TARGET_B_RELEASE(int host_reg, int guest_reg)
addbyte(0xc0 | (dest_reg & 7) | ((host_reg & 7) << 3));
addbyte(0x88); /*MOVB regs[guest_reg].b, host_reg*/
addbyte(0x45 | ((host_reg & 3) << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].b));
}
}
}
@@ -370,7 +373,7 @@ static void STORE_REG_TARGET_W_RELEASE(int host_reg, int guest_reg)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].w));
}
else
{
@@ -381,7 +384,7 @@ static void STORE_REG_TARGET_W_RELEASE(int host_reg, int guest_reg)
addbyte(0x66); /*MOVW regs[guest_reg].w, host_reg*/
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].w));
}
}
static void STORE_REG_TARGET_L_RELEASE(int host_reg, int guest_reg)
@@ -394,7 +397,7 @@ static void STORE_REG_TARGET_L_RELEASE(int host_reg, int guest_reg)
addbyte(0x44); /*MOVL regs[guest_reg].l, host_reg*/
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].l));
}
else
{
@@ -403,7 +406,7 @@ static void STORE_REG_TARGET_L_RELEASE(int host_reg, int guest_reg)
addbyte(0xc0 | guest_reg | (host_reg << 3));
addbyte(0x89); /*MOVL regs[guest_reg].l, host_reg*/
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].l));
}
}
@@ -415,14 +418,14 @@ static void STORE_REG_B_RELEASE(int host_reg)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg & 7].w));
}
else
{
addbyte(0x44); /*MOVB [reg],host_reg*/
addbyte(0x88);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg & 7].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg & 7].b));
}
}
static void STORE_REG_W_RELEASE(int host_reg)
@@ -431,14 +434,14 @@ static void STORE_REG_W_RELEASE(int host_reg)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg & 7].w));
}
static void STORE_REG_L_RELEASE(int host_reg)
{
addbyte(0x44); /*MOVL [reg],host_reg*/
addbyte(0x89);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg & 7].l));
}
static void STORE_IMM_REG_B(int reg, uint8_t val)
@@ -460,7 +463,7 @@ static void STORE_IMM_REG_B(int reg, uint8_t val)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 3].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 3].w));
}
else
{
@@ -470,7 +473,7 @@ static void STORE_IMM_REG_B(int reg, uint8_t val)
addbyte(0x44); /*MOVB reg, regs[reg].b*/
addbyte(0x88);
addbyte(0x45 | (reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].b - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].b));
}
}
static void STORE_IMM_REG_W(int reg, uint16_t val)
@@ -483,7 +486,7 @@ static void STORE_IMM_REG_W(int reg, uint16_t val)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | (reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].w));
}
static void STORE_IMM_REG_L(int reg, uint32_t val)
{
@@ -493,16 +496,16 @@ static void STORE_IMM_REG_L(int reg, uint32_t val)
addbyte(0x44); /*MOVL reg, regs[reg].l*/
addbyte(0x89);
addbyte(0x45 | (reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].l));
}
static void STORE_IMM_ADDR_L(uintptr_t addr, uint32_t val)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0xC7); /*MOVL [addr],val*/
addbyte(0x45);
- addbyte(addr - (uintptr_t)&cpu_state);
+ addbyte(addr - (uintptr_t)&cpu_state - 128);
addlong(val);
}
else if (addr < 0x100000000)
@@ -515,7 +518,12 @@ static void STORE_IMM_ADDR_L(uintptr_t addr, uint32_t val)
}
else
{
- fatal("addr > 32-bit\n");
+ addbyte(0x48); /*MOV ESI, &addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad(addr);
+ addbyte(0xc7); /*MOVL [ESI], val*/
+ addbyte(0x00 | REG_ESI);
+ addlong(val);
}
}
@@ -859,11 +867,23 @@ static void CHECK_SEG_READ(x86seg *seg)
if (seg->checked)
return;
- addbyte(0x83); /*CMP seg->base, -1*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
- addbyte(-1);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x83); /*CMP seg->base, -1*/
+ addbyte(0x3c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ addbyte(-1);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x83); /*CMP RSI, -1*/
+ addbyte(0xe8 | REG_ESI);
+ addbyte(0xff);
+ }
addbyte(0x0f); /*JE end*/
addbyte(0x84);
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
@@ -881,11 +901,23 @@ static void CHECK_SEG_WRITE(x86seg *seg)
if (seg->checked)
return;
- addbyte(0x83); /*CMP seg->base, -1*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
- addbyte(-1);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x83); /*CMP seg->base, -1*/
+ addbyte(0x3c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ addbyte(-1);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x83); /*CMP RSI, -1*/
+ addbyte(0xe8 | REG_ESI);
+ addbyte(0xff);
+ }
addbyte(0x0f); /*JE end*/
addbyte(0x84);
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
@@ -894,10 +926,20 @@ static void CHECK_SEG_WRITE(x86seg *seg)
}
static void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
{
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0xb8 | REG_ESI); /*MOV ESI, &addr*/
+ addlong((uint32_t)seg);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)seg);
+ }
addbyte(0x3b); /*CMP EAX, seg->limit_low*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&seg->limit_low);
+ addbyte(0x46);
+ addbyte((uintptr_t)&seg->limit_low - (uintptr_t)seg);
addbyte(0x0f); /*JB BLOCK_GPF_OFFSET*/
addbyte(0x82);
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
@@ -907,9 +949,8 @@ static void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
addbyte(0xc0);
addbyte(end_offset);
addbyte(0x3b); /*CMP EAX, seg->limit_high*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&seg->limit_high);
+ addbyte(0x46);
+ addbyte((uintptr_t)&seg->limit_high - (uintptr_t)seg);
addbyte(0x0f); /*JNBE BLOCK_GPF_OFFSET*/
addbyte(0x87);
addlong(BLOCK_GPF_OFFSET - (block_pos + 4));
@@ -919,14 +960,23 @@ static void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
}
}
-#define IS_32_ADDR(x) !(((uintptr_t)x) & 0xffffffff00000000)
-
static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -964,15 +1014,14 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
addbyte(0x04);
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+12+8+6);
+ addbyte(2+2+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
call_long(readmemb386l);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -981,10 +1030,21 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
}
static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1031,15 +1091,14 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-1);
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+12+8+6);
+ addbyte(2+2+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
call_long(readmemwl);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1048,10 +1107,21 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
}
static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1097,15 +1167,14 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-3);
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+12+8+6);
+ addbyte(2+2+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
call_long(readmemll);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1114,10 +1183,21 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
}
static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1164,15 +1244,14 @@ static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-7);
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+12+8+6);
+ addbyte(2+2+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
call_long(readmemql);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1223,10 +1302,21 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
addbyte(8);
host_reg = 8;
}
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1274,16 +1364,15 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
addbyte(REG_EDI | (REG_ESI << 3));
}
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+3+12+8+6);
+ addbyte(2+2+3+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
load_param_3_reg_32(host_reg);
call_long(writememb386l);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1292,10 +1381,21 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
}
static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1354,16 +1454,15 @@ static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
addbyte(-1);
}
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+3+12+8+6);
+ addbyte(2+2+3+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
load_param_3_reg_32(host_reg);
call_long(writememwl);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1372,10 +1471,21 @@ static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
}
static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1432,16 +1542,15 @@ static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
addbyte(-3);
}
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+3+12+8+6);
+ addbyte(2+2+3+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
load_param_3_reg_32(host_reg);
call_long(writememll);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1450,10 +1559,21 @@ static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
}
static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
{
- addbyte(0x8b); /*MOVL ECX, seg->base*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong((uint32_t)&seg->base);
+ if (IS_32_ADDR(&seg->base))
+ {
+ addbyte(0x8b); /*MOVL ECX, seg->base*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong((uint32_t)&seg->base);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, &seg->base*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)&seg->base);
+ addbyte(0x8b); /*MOV ECX, [RSI]*/
+ addbyte(0x0e);
+ }
addbyte(0x67); /*LEA ESI, (EAX,ECX)*/
addbyte(0x8d);
addbyte(0x34);
@@ -1511,16 +1631,15 @@ static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
addbyte(-7);
}
addbyte(0xeb); /*JMP done*/
- addbyte(2+2+3+12+8+6);
+ addbyte(2+2+3+12+4+6);
/*slowpath:*/
load_param_1_reg_32(REG_ECX);
load_param_2_reg_32(REG_EAX);
load_param_3_reg_64(host_reg);
call_long(writememql);
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3c);
- addbyte(0x25);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1568,10 +1687,27 @@ static void STORE_HOST_REG_ADDR_BL(uintptr_t addr, int host_reg)
addbyte(0xb6);
addbyte(0xc0 | (REG_ECX << 3) | (host_reg & 7));
}
- addbyte(0x89); /*MOV addr, EBX*/
- addbyte(0x04 | (REG_ECX << 3));
- addbyte(0x25);
- addlong(addr);
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
+ {
+ addbyte(0x89); /*MOV addr, ECX*/
+ addbyte(0x45 | (REG_ECX << 3));
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
+ }
+ else if (IS_32_ADDR(addr))
+ {
+ addbyte(0x89); /*MOV addr, ECX*/
+ addbyte(0x04 | (REG_ECX << 3));
+ addbyte(0x25);
+ addlong(addr);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RSI, addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)addr);
+ addbyte(0x89); /*MOV [RSI], ECX*/
+ addbyte(0x0e);
+ }
}
static void STORE_HOST_REG_ADDR_WL(uintptr_t addr, int host_reg)
{
@@ -1580,53 +1716,73 @@ static void STORE_HOST_REG_ADDR_WL(uintptr_t addr, int host_reg)
addbyte(0x0f); /*MOVZX ECX, host_reg*/
addbyte(0xb7);
addbyte(0xc0 | (REG_ECX << 3) | (host_reg & 7));
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0x89); /*MOV addr, ECX*/
addbyte(0x45 | (REG_ECX << 3));
- addbyte((uint32_t)addr - (uint32_t)&cpu_state);
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
}
- else
+ else if (IS_32_ADDR(addr))
{
addbyte(0x89); /*MOV addr, ECX*/
addbyte(0x04 | (REG_ECX << 3));
addbyte(0x25);
addlong(addr);
}
+ else
+ {
+ addbyte(0x48); /*MOV RSI, addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)addr);
+ addbyte(0x89); /*MOV [RSI], ECX*/
+ addbyte(0x0e);
+ }
}
static void STORE_HOST_REG_ADDR_W(uintptr_t addr, int host_reg)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0x66); /*MOVW [addr],host_reg*/
if (host_reg & 8)
addbyte(0x44);
addbyte(0x89);
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)addr - (uint32_t)&cpu_state);
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
}
- else
+ else if (IS_32_ADDR(addr))
{
addbyte(0x66);
if (host_reg & 8)
addbyte(0x44);
- addbyte(0x89); /*MOVL addr,host_reg*/
+ addbyte(0x89); /*MOVW addr,host_reg*/
addbyte(0x04 | ((host_reg & 7) << 3));
addbyte(0x25);
addlong(addr);
}
+ else
+ {
+ addbyte(0x48); /*MOV RSI, addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)addr);
+
+ addbyte(0x66);
+ if (host_reg & 8)
+ addbyte(0x44);
+ addbyte(0x89); /*MOVW [RSI],host_reg*/
+ addbyte(0x06 | ((host_reg & 7) << 3));
+ }
}
static void STORE_HOST_REG_ADDR(uintptr_t addr, int host_reg)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
if (host_reg & 8)
addbyte(0x44);
addbyte(0x89); /*MOVL [addr],host_reg*/
addbyte(0x45 | ((host_reg & 7) << 3));
- addbyte((uint32_t)addr - (uint32_t)&cpu_state);
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
}
- else
+ else if (IS_32_ADDR(addr))
{
if (host_reg & 8)
addbyte(0x44);
@@ -1635,6 +1791,17 @@ static void STORE_HOST_REG_ADDR(uintptr_t addr, int host_reg)
addbyte(0x25);
addlong(addr);
}
+ else
+ {
+ addbyte(0x48); /*MOV RSI, addr*/
+ addbyte(0xb8 | REG_ESI);
+ addquad((uint64_t)addr);
+
+ if (host_reg & 8)
+ addbyte(0x44);
+ addbyte(0x89); /*MOVL [RSI],host_reg*/
+ addbyte(0x06 | ((host_reg & 7) << 3));
+ }
}
static void AND_HOST_REG_B(int dst_reg, int src_reg)
@@ -2689,7 +2856,7 @@ static void LOAD_STACK_TO_EA(int off)
{
addbyte(0x8b); /*MOVL EAX,[ESP]*/
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
if (off)
{
addbyte(0x83); /*ADD EAX, off*/
@@ -2702,7 +2869,7 @@ static void LOAD_STACK_TO_EA(int off)
addbyte(0x0f); /*MOVZX EAX,W[ESP]*/
addbyte(0xb7);
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
if (off)
{
addbyte(0x66); /*ADD AX, off*/
@@ -2717,7 +2884,7 @@ static void LOAD_EBP_TO_EA(int off)
{
addbyte(0x8b); /*MOVL EAX,[EBP]*/
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&EBP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_EBP].l));
if (off)
{
addbyte(0x83); /*ADD EAX, off*/
@@ -2730,7 +2897,7 @@ static void LOAD_EBP_TO_EA(int off)
addbyte(0x0f); /*MOVZX EAX,W[EBP]*/
addbyte(0xb7);
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&EBP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_BP].l));
if (off)
{
addbyte(0x66); /*ADD AX, off*/
@@ -2748,14 +2915,14 @@ static void SP_MODIFY(int off)
{
addbyte(0x83); /*ADD [ESP], off*/
addbyte(0x45);
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
addbyte(off);
}
else
{
addbyte(0x81); /*ADD [ESP], off*/
addbyte(0x45);
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
addlong(off);
}
}
@@ -2766,7 +2933,7 @@ static void SP_MODIFY(int off)
addbyte(0x66); /*ADD [SP], off*/
addbyte(0x83);
addbyte(0x45);
- addbyte((uint32_t)&SP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
addbyte(off);
}
else
@@ -2774,7 +2941,7 @@ static void SP_MODIFY(int off)
addbyte(0x66); /*ADD [SP], off*/
addbyte(0x81);
addbyte(0x45);
- addbyte((uint32_t)&SP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
addword(off);
}
}
@@ -2789,17 +2956,16 @@ static void TEST_ZERO_JUMP_W(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | (host_reg & 7));
addbyte(0);
addbyte(0x75); /*JNZ +*/
- addbyte(7+5+(taken_cycles ? 8 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -2813,17 +2979,16 @@ static void TEST_ZERO_JUMP_L(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | (host_reg & 7));
addbyte(0);
addbyte(0x75); /*JNZ +*/
- addbyte(7+5+(taken_cycles ? 8 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -2839,17 +3004,16 @@ static void TEST_NONZERO_JUMP_W(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | (host_reg & 7));
addbyte(0);
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(taken_cycles ? 8 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -2863,17 +3027,16 @@ static void TEST_NONZERO_JUMP_L(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | (host_reg & 7));
addbyte(0);
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(taken_cycles ? 8 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -2886,7 +3049,7 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
{
addbyte(0x83); /*CMP flags_res, 0*/
addbyte(0x7d);
- addbyte((uintptr_t)&cpu_state.flags_res - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_res));
addbyte(0);
addbyte(0x74); /*JZ +*/
}
@@ -2908,17 +3071,16 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x75); /*JNZ +*/
else
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(timing_bt ? 8 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -2945,17 +3107,16 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
addbyte(0x75); /*JNZ +*/
else
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(timing_bt ? 8 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -2968,7 +3129,7 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
{
addbyte(0x83); /*CMP flags_res, 0*/
addbyte(0x7d);
- addbyte((uintptr_t)&cpu_state.flags_res - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_res));
addbyte(0);
addbyte(0x74); /*JZ +*/
}
@@ -3002,17 +3163,16 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x75); /*JNZ +*/
else
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(timing_bt ? 8 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -3023,11 +3183,30 @@ static int LOAD_VAR_W(uintptr_t addr)
{
int host_reg = REG_EBX;
- addbyte(0x0f); /*MOVZX host_reg,[reg]*/
- addbyte(0xb7);
- addbyte(0x04 | (host_reg << 3));
- addbyte(0x25);
- addlong((uint32_t)addr);
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
+ {
+ addbyte(0x0f); /*MOVZX host_reg, offset[cpu_state]*/
+ addbyte(0xb7);
+ addbyte(0x45 | (host_reg << 3));
+ addbyte(addr - (uintptr_t)&cpu_state - 128);
+ }
+ else if (IS_32_ADDR(addr))
+ {
+ addbyte(0x0f); /*MOVZX host_reg,[reg]*/
+ addbyte(0xb7);
+ addbyte(0x04 | (host_reg << 3));
+ addbyte(0x25);
+ addlong((uint32_t)addr);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV host_reg, &addr*/
+ addbyte(0xb8 | host_reg);
+ addquad(addr);
+ addbyte(0x0f); /*MOVZX host_reg, [host_reg]*/
+ addbyte(0xb7);
+ addbyte(host_reg | (host_reg << 3));
+ }
return host_reg;
}
@@ -3035,10 +3214,27 @@ static int LOAD_VAR_L(uintptr_t addr)
{
int host_reg = REG_EBX;
- addbyte(0x8b); /*MOVL host_reg,[reg]*/
- addbyte(0x04 | (host_reg << 3));
- addbyte(0x25);
- addlong((uint32_t)addr);
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
+ {
+ addbyte(0x8b); /*MOVL host_reg, offset[cpu_state]*/
+ addbyte(0x45 | (host_reg << 3));
+ addbyte(addr - (uintptr_t)&cpu_state - 128);
+ }
+ else if (IS_32_ADDR(addr))
+ {
+ addbyte(0x8b); /*MOVL host_reg,[reg]*/
+ addbyte(0x04 | (host_reg << 3));
+ addbyte(0x25);
+ addlong((uint32_t)addr);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV host_reg, &addr*/
+ addbyte(0xb8 | host_reg);
+ addquad(addr);
+ addbyte(0x8b); /*MOVL host_reg, [host_reg]*/
+ addbyte(host_reg | (host_reg << 3));
+ }
return host_reg;
}
@@ -3338,17 +3534,28 @@ static void FP_ENTER()
{
if (codegen_fpu_entered)
return;
-
- addbyte(0xf6); /*TEST cr0, 0xc*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&cr0);
- addbyte(0xc);
+ if (IS_32_ADDR(&cr0))
+ {
+ addbyte(0xf6); /*TEST cr0, 0xc*/
+ addbyte(0x04);
+ addbyte(0x25);
+ addlong((uintptr_t)&cr0);
+ addbyte(0x0c);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RAX, &cr0*/
+ addbyte(0xb8 | REG_EAX);
+ addquad(&cr0);
+ addbyte(0xf6); /*TEST [RAX], 0xc*/
+ addbyte(0 | (REG_EAX << 3));
+ addbyte(0x0c);
+ }
addbyte(0x74); /*JZ +*/
addbyte(7+5+12+5);
addbyte(0xC7); /*MOVL [oldpc],op_old_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(op_old_pc);
load_param_1_32(&codeblock[block_current], 7);
CALL_FUNC(x86_int);
@@ -3361,73 +3568,75 @@ static void FP_ENTER()
static void FP_FXCH(int reg)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
- addbyte(0x48); /*MOV RSI, ST*/
- addbyte(0xbe);
- addquad((uint64_t)ST);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
addbyte(0x83); /*ADD EAX, reg*/
addbyte(0xc0);
addbyte(reg);
- addbyte(0x48); /*MOV RDX, [RSI + RBX*8]*/
+ addbyte(0x48); /*MOV RDX, ST[RBX*8]*/
addbyte(0x8b);
- addbyte(0x14);
- addbyte(0xde);
+ addbyte(0x54);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
addbyte(0x83); /*AND EAX, 7*/
addbyte(0xe0);
addbyte(0x07);
- addbyte(0x48); /*MOV RCX, [RSI + RAX*8]*/
+ addbyte(0x48); /*MOV RCX, ST[RAX*8]*/
addbyte(0x8b);
- addbyte(0x0c);
- addbyte(0xc6);
- addbyte(0x48); /*MOV [RSI + RAX*8], RDX*/
+ addbyte(0x4c);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x48); /*MOV ST[RAX*8], RDX*/
addbyte(0x89);
- addbyte(0x14);
- addbyte(0xc6);
- addbyte(0x48); /*MOV [RSI + RBX*8], RCX*/
+ addbyte(0x54);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x48); /*MOV ST[RBX*8], RCX*/
addbyte(0x89);
- addbyte(0x0c);
- addbyte(0xde);
-
- addbyte(0x48); /*MOVL ESI, tag*/
- addbyte(0xbe);
- addquad((uintptr_t)tag);
+ addbyte(0x4c);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
+
addbyte(0x8a); /*MOV CL, tag[EAX]*/
- addbyte(0x14);
- addbyte(0x1e);
+ addbyte(0x4c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
addbyte(0x8a); /*MOV DL, tag[EBX]*/
- addbyte(0x0c);
- addbyte(0x06);
+ addbyte(0x54);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
addbyte(0x88); /*MOV tag[EBX], CL*/
- addbyte(0x14);
- addbyte(0x06);
+ addbyte(0x4c);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
addbyte(0x88); /*MOV tag[EAX], DL*/
- addbyte(0x0c);
- addbyte(0x1e);
+ addbyte(0x54);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
- addbyte(0x48); /*MOV RSI, ST_i64*/
- addbyte(0xbe);
- addquad((uint64_t)ST_i64);
- addbyte(0x48); /*MOV RDX, [RSI + RBX*8]*/
+ addbyte(0x48); /*MOV RDX, MM[RBX*8]*/
addbyte(0x8b);
- addbyte(0x14);
- addbyte(0xde);
- addbyte(0x48); /*MOV RCX, [RSI + RAX*8]*/
+ addbyte(0x54);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(MM));
+ addbyte(0x48); /*MOV RCX, MM[RAX*8]*/
addbyte(0x8b);
- addbyte(0x0c);
- addbyte(0xc6);
- addbyte(0x48); /*MOV [RSI + RAX*8], RDX*/
+ addbyte(0x4c);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(MM));
+ addbyte(0x48); /*MOV MM[RAX*8], RDX*/
addbyte(0x89);
- addbyte(0x14);
- addbyte(0xc6);
- addbyte(0x48); /*MOV [RSI + RBX*8], RCX*/
+ addbyte(0x54);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(MM));
+ addbyte(0x48); /*MOV MM[RBX*8], RCX*/
addbyte(0x89);
- addbyte(0x0c);
- addbyte(0xde);
+ addbyte(0x4c);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(MM));
reg = reg;
}
@@ -3436,9 +3645,8 @@ static void FP_FXCH(int reg)
static void FP_FLD(int reg)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (reg)
@@ -3462,54 +3670,55 @@ static void FP_FLD(int reg)
addbyte(0x48); /*MOV RCX, ST[EAX*8]*/
addbyte(0x8b);
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x83); /*AND EBX, 7*/
addbyte(0xe3);
addbyte(0x07);
addbyte(0x48); /*MOV RDX, ST_i64[EAX*8]*/
addbyte(0x8b);
- addbyte(0x14);
+ addbyte(0x54);
addbyte(0xc5);
- addlong((uintptr_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x8a); /*MOV AL, [tag+EAX]*/
- addbyte(0x80);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
addbyte(0x48); /*MOV ST[EBX*8], RCX*/
addbyte(0x89);
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x48); /*MOV ST_i64[EBX*8], RDX*/
addbyte(0x89);
- addbyte(0x14);
+ addbyte(0x54);
addbyte(0xdd);
- addlong((uintptr_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x88); /*MOV [tag+EBX], AL*/
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
addbyte(0x89); /*MOV [TOP], EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
}
static void FP_FST(int reg)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x48); /*MOV RCX, ST[EAX*8]*/
addbyte(0x8b);
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x8a); /*MOV BL, [tag+EAX]*/
- addbyte(0x98);
- addlong((uintptr_t)tag);
+ addbyte(0x5c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
if (reg)
{
@@ -3523,23 +3732,24 @@ static void FP_FST(int reg)
addbyte(0x48); /*MOV ST[EAX*8], RCX*/
addbyte(0x89);
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x88); /*MOV [tag+EAX], BL*/
- addbyte(0x98);
- addlong((uintptr_t)tag);
+ addbyte(0x5c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
}
static void FP_POP()
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xc6); /*MOVB tag[EAX], 3*/
- addbyte(0x80);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
addbyte(3);
addbyte(0x83); /*ADD AL, 1*/
addbyte(0xc0);
@@ -3548,17 +3758,15 @@ static void FP_POP()
addbyte(0xe0);
addbyte(7);
addbyte(0x89); /*MOV [TOP], EAX*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
}
static void FP_LOAD_S()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x66); /*MOVD XMM0, EAX*/
addbyte(0x0f);
addbyte(0x6e);
@@ -3576,26 +3784,25 @@ static void FP_LOAD_S()
addbyte(0x85); /*TEST EAX, EAX*/
addbyte(0xc0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x66); /*MOVQ [ST+EBX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
}
static void FP_LOAD_D()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x83); /*SUB EBX, 1*/
addbyte(0xeb);
addbyte(0x01);
@@ -3606,26 +3813,25 @@ static void FP_LOAD_D()
addbyte(0x85);
addbyte(0xc0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x48); /*MOVQ [ST+EBX*8], RAX*/
addbyte(0x89);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
}
static void FP_LOAD_IW()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x0f); /*MOVSX EAX, AX*/
addbyte(0xbf);
addbyte(0xc0);
@@ -3642,26 +3848,25 @@ static void FP_LOAD_IW()
addbyte(0x85); /*TEST EAX, EAX*/
addbyte(0xc0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x66); /*MOVQ [ST+EBX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
}
static void FP_LOAD_IL()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x83); /*SUB EBX, 1*/
addbyte(0xeb);
addbyte(0x01);
@@ -3675,26 +3880,25 @@ static void FP_LOAD_IL()
addbyte(0x85); /*TEST EAX, EAX*/
addbyte(0xc0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x66); /*MOVQ [ST+EBX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
}
static void FP_LOAD_IQ()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x83); /*SUB EBX, 1*/
addbyte(0xeb);
addbyte(0x01);
@@ -3711,35 +3915,34 @@ static void FP_LOAD_IQ()
addbyte(0xc0);
addbyte(0x48); /*MOV [ST_i64+EBX*8], RAX*/
addbyte(0x89);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x0f); /*SETE AL*/
addbyte(0x94);
addbyte(0xc0);
addbyte(0x66); /*MOVQ [ST+EBX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0c); /*OR AL, TAG_UINT64*/
addbyte(TAG_UINT64);
addbyte(0x88); /*MOV [tag+EBX], AL*/
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag));
}
static int FP_LOAD_REG(int reg)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -3752,9 +3955,9 @@ static int FP_LOAD_REG(int reg)
addbyte(0xf3); /*MOVQ XMM0, ST[EBX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0xf2); /*CVTSD2SS XMM0, XMM0*/
addbyte(0x0f);
addbyte(0x5a);
@@ -3769,9 +3972,8 @@ static int FP_LOAD_REG(int reg)
static void FP_LOAD_REG_D(int reg, int *host_reg1, int *host_reg2)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1c);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -3783,9 +3985,9 @@ static void FP_LOAD_REG_D(int reg, int *host_reg1, int *host_reg2)
}
addbyte(0x48); /*MOV RBX, ST[EBX*8]*/
addbyte(0x8b);
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
*host_reg1 = REG_EBX;
}
@@ -3793,7 +3995,7 @@ static int64_t x87_fround(double b)
{
int64_t a, c;
- switch ((npxc>>10)&3)
+ switch ((cpu_state.npxc >> 10) & 3)
{
case 0: /*Nearest*/
a = (int64_t)floor(b);
@@ -3818,9 +4020,8 @@ static int FP_LOAD_REG_INT_W(int reg)
addbyte(0xc3);
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EAX, reg*/
@@ -3833,9 +4034,9 @@ static int FP_LOAD_REG_INT_W(int reg)
addbyte(0xf3); /*MOVQ XMM0, ST[EAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
CALL_FUNC(x87_fround);
@@ -3849,9 +4050,8 @@ static int FP_LOAD_REG_INT(int reg)
addbyte(0xc3);
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EAX, reg*/
@@ -3864,9 +4064,9 @@ static int FP_LOAD_REG_INT(int reg)
addbyte(0xf3); /*MOVQ XMM0, ST[EAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
CALL_FUNC(x87_fround);
@@ -3880,9 +4080,8 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
addbyte(0xc3);
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EAX, reg*/
@@ -3893,16 +4092,16 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
addbyte(7);
}
- if (codegen_fpu_loaded_iq[TOP] && (tag[TOP] & TAG_UINT64))
+ if (codegen_fpu_loaded_iq[cpu_state.TOP] && (cpu_state.tag[cpu_state.TOP] & TAG_UINT64))
{
/*If we know the register was loaded with FILDq in this block and
has not been modified, then we can skip most of the conversion
and just load the 64-bit integer representation directly */
addbyte(0x48); /*MOV RAX, [ST_i64+EAX*8]*/
addbyte(0x8b);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x48); /*XCHG RBX, RAX*/
addbyte(0x93);
@@ -3912,29 +4111,30 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
return;
}
- addbyte(0xf6); /*TEST TAG[EBX], TAG_UINT64*/
- addbyte(0x80);
- addlong((uintptr_t)tag);
+ addbyte(0xf6); /*TEST TAG[EAX], TAG_UINT64*/
+ addbyte(0x44);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
addbyte(TAG_UINT64);
addbyte(0x74); /*JZ +*/
- addbyte(8+2);
+ addbyte(5+2);
addbyte(0x48); /*MOV RAX, [ST_i64+EAX*8]*/
addbyte(0x8b);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0xeb); /*JMP done*/
- addbyte(9+12);
+ addbyte(6+12);
addbyte(0xf3); /*MOVQ XMM0, ST[EAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
CALL_FUNC(x87_fround);
@@ -3954,12 +4154,8 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
static void FP_OP_REG(int op, int dst, int src)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
- addbyte(0x48); /*MOV RSI, ST*/
- addbyte(0xbe);
- addquad((uint64_t)ST);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (dst)
@@ -3980,91 +4176,103 @@ static void FP_OP_REG(int op, int dst, int src)
addbyte(0xe0 | REG_EBX);
addbyte(0x07);
}
+ addbyte(0x80); /*AND tag[EAX], ~TAG_UINT64*/
+ addbyte(0x64);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
+ addbyte(~TAG_UINT64);
if (op == FPU_DIVR || op == FPU_SUBR)
{
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RBX*8]*/
+ addbyte(0xf3); /*MOVQ XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
}
else
{
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RAX*8]*/
+ addbyte(0xf3); /*MOVQ XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
switch (op)
{
case FPU_ADD:
- addbyte(0xf2); /*ADDSD XMM0, [RSI+RBX*8]*/
+ addbyte(0xf2); /*ADDSD XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x58);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
break;
case FPU_DIV:
- addbyte(0xf2); /*DIVSD XMM0, [RSI+RBX*8]*/
+ addbyte(0xf2); /*DIVSD XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x5e);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
break;
case FPU_DIVR:
- addbyte(0xf2); /*DIVSD XMM0, [RSI+RAX*8]*/
+ addbyte(0xf2); /*DIVSD XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x5e);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
break;
case FPU_MUL:
- addbyte(0xf2); /*MULSD XMM0, [RSI+RBX*8]*/
+ addbyte(0xf2); /*MULSD XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x59);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
break;
case FPU_SUB:
- addbyte(0xf2); /*SUBSD XMM0, [RSI+RBX*8]*/
+ addbyte(0xf2); /*SUBSD XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x5c);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
break;
case FPU_SUBR:
- addbyte(0xf2); /*SUBSD XMM0, [RSI+RAX*8]*/
+ addbyte(0xf2); /*SUBSD XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x5c);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
break;
}
addbyte(0x66); /*MOVQ [RSI+RAX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
static void FP_OP_MEM(int op)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
- addbyte(0x48); /*MOV RSI, ST*/
- addbyte(0xbe);
- addquad((uint64_t)ST);
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RAX*8]*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
+ addbyte(0xf3); /*MOVQ XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EAX], ~TAG_UINT64*/
- addbyte(0xa0 | REG_EAX);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag));
addbyte(~TAG_UINT64);
switch (op)
@@ -4108,19 +4316,21 @@ static void FP_OP_MEM(int op)
}
if (op == FPU_DIVR || op == FPU_SUBR)
{
- addbyte(0x66); /*MOVQ [RSI+RAX*8], XMM1*/
+ addbyte(0x66); /*MOVQ ST[RAX*8], XMM1*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x0c);
- addbyte(0xc6);
+ addbyte(0x4c);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
else
{
- addbyte(0x66); /*MOVQ [RSI+RAX*8], XMM0*/
+ addbyte(0x66); /*MOVQ ST[RAX*8], XMM0*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
}
@@ -4143,7 +4353,7 @@ static void FP_OP_D(int op)
addbyte(0x0f);
addbyte(0x6e);
addbyte(0xc8);
- if (((npxc >> 10) & 3) && op == FPU_ADD)
+ if (((cpu_state.npxc >> 10) & 3) && op == FPU_ADD)
{
addbyte(0x0f); /*STMXCSR [ESP+8]*/
addbyte(0xae);
@@ -4157,7 +4367,7 @@ static void FP_OP_D(int op)
addbyte(0x25); /*AND EAX, ~(3 << 13)*/
addlong(~(3 << 10));
addbyte(0x0d); /*OR EAX, (npxc & (3 << 10)) << 3*/
- addlong((npxc & (3 << 10)) << 3);
+ addlong((cpu_state.npxc & (3 << 10)) << 3);
addbyte(0x89); /*MOV [RSP+12], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -4169,7 +4379,7 @@ static void FP_OP_D(int op)
addbyte(0x0c);
}
FP_OP_MEM(op);
- if (((npxc >> 10) & 3) && op == FPU_ADD)
+ if (((cpu_state.npxc >> 10) & 3) && op == FPU_ADD)
{
addbyte(0x0f); /*LDMXCSR [RSP+8]*/
addbyte(0xae);
@@ -4206,12 +4416,8 @@ static void FP_OP_IL(int op)
static void FP_COMPARE_REG(int dst, int src)
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
- addbyte(0x48); /*MOV RSI, ST*/
- addbyte(0xbe);
- addquad((uint64_t)ST);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (src || dst)
@@ -4225,9 +4431,8 @@ static void FP_COMPARE_REG(int dst, int src)
}
addbyte(0x8a); /*MOV CL, [npxs+1]*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
// addbyte(0xdb); /*FCLEX*/
// addbyte(0xe2);
addbyte(0x80); /*AND CL, ~(C0|C2|C3)*/
@@ -4236,29 +4441,33 @@ static void FP_COMPARE_REG(int dst, int src)
if (src)
{
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RBX*8]*/
+ addbyte(0xf3); /*MOVQ XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xde);
- addbyte(0x66); /*COMISD XMM0, [RSI+RAX*8]*/
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x66); /*COMISD XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x2f);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
else
{
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RAX*8]*/
+ addbyte(0xf3); /*MOVQ XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xc6);
- addbyte(0x66); /*COMISD XMM0, [RSI+RBX*8]*/
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x66); /*COMISD XMM0, ST[RBX*8]*/
addbyte(0x0f);
addbyte(0x2f);
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
}
addbyte(0x9f); /*LAHF*/
@@ -4268,32 +4477,27 @@ static void FP_COMPARE_REG(int dst, int src)
addbyte(0x08); /*OR CL, AH*/
addbyte(0xe1);
addbyte(0x88); /*MOV [npxs+1], CL*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_COMPARE_MEM()
{
addbyte(0x8b); /*MOV EAX, [TOP]*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&TOP);
- addbyte(0x48); /*MOV RSI, ST*/
- addbyte(0xbe);
- addquad((uint64_t)ST);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x8a); /*MOV CL, [npxs+1]*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
// addbyte(0xdb); /*FCLEX*/
// addbyte(0xe2);
- addbyte(0xf3); /*MOVQ XMM0, [RSI+RAX*8]*/
+ addbyte(0xf3); /*MOVQ XMM0, ST[RAX*8]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND CL, ~(C0|C2|C3)*/
addbyte(0xe1);
addbyte((~(C0|C2|C3)) >> 8);
@@ -4308,9 +4512,8 @@ static void FP_COMPARE_MEM()
addbyte(0x08); /*OR CL, AH*/
addbyte(0xe1);
addbyte(0x88); /*MOV [npxs+1], CL*/
- addbyte(0x0c);
- addbyte(0x25);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_COMPARE_S()
{
@@ -4355,40 +4558,83 @@ static void FP_COMPARE_IL()
static void SET_BITS(uintptr_t addr, uint32_t val)
{
- if (val & ~0xff)
+ if (IS_32_ADDR(addr))
{
- addbyte(0x81);
- addbyte(0x0c);
- addbyte(0x25);
- addlong(addr);
- addlong(val);
+ if (val & ~0xff)
+ {
+ addbyte(0x81); /*OR [addr], val*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong(addr);
+ addlong(val);
+ }
+ else
+ {
+ addbyte(0x80); /*OR [addr], val*/
+ addbyte(0x0c);
+ addbyte(0x25);
+ addlong(addr);
+ addbyte(val);
+ }
}
else
- {
- addbyte(0x80);
- addbyte(0x0c);
- addbyte(0x25);
- addlong(addr);
- addbyte(val);
+ {
+ addbyte(0x48); /*MOV RAX, &addr*/
+ addbyte(0xb8 | REG_EAX);
+ addquad(addr);
+ if (val & ~0xff)
+ {
+ addbyte(0x81); /*OR [RAX], val*/
+ addbyte(0x08);
+ addlong(val);
+ }
+ else
+ {
+ addbyte(0x80); /*OR [RAX], val*/
+ addbyte(0x08);
+ addbyte(val);
+ }
}
}
+
static void CLEAR_BITS(uintptr_t addr, uint32_t val)
{
- if (val & ~0xff)
+ if (IS_32_ADDR(addr))
{
- addbyte(0x81);
- addbyte(0x24);
- addbyte(0x25);
- addlong(addr);
- addlong(~val);
+ if (val & ~0xff)
+ {
+ addbyte(0x81); /*AND [addr], val*/
+ addbyte(0x24);
+ addbyte(0x25);
+ addlong(addr);
+ addlong(~val);
+ }
+ else
+ {
+ addbyte(0x80); /*AND [addr], val*/
+ addbyte(0x24);
+ addbyte(0x25);
+ addlong(addr);
+ addbyte(~val);
+ }
}
else
- {
- addbyte(0x80);
- addbyte(0x24);
- addbyte(0x25);
- addlong(addr);
- addbyte(~val);
+ {
+ addbyte(0x48); /*MOV RAX, &addr*/
+ addbyte(0xb8 | REG_EAX);
+ addquad(addr);
+ if (val & ~0xff)
+ {
+ addbyte(0x81); /*AND [RAX], val*/
+ addbyte(0x20);
+ addlong(~val);
+ }
+ else
+ {
+ addbyte(0x80); /*AND [RAX], val*/
+ addbyte(0x20);
+ addbyte(~val);
+ }
}
}
@@ -4400,16 +4646,28 @@ static void MMX_ENTER()
if (codegen_mmx_entered)
return;
- addbyte(0xf6); /*TEST cr0, 0xc*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uintptr_t)&cr0);
- addbyte(0xc);
+ if (IS_32_ADDR(&cr0))
+ {
+ addbyte(0xf6); /*TEST cr0, 0xc*/
+ addbyte(0x04);
+ addbyte(0x25);
+ addlong((uintptr_t)&cr0);
+ addbyte(0x0c);
+ }
+ else
+ {
+ addbyte(0x48); /*MOV RAX, &cr0*/
+ addbyte(0xb8 | REG_EAX);
+ addquad(&cr0);
+ addbyte(0xf6); /*TEST [RAX], 0xc*/
+ addbyte(0 | (REG_EAX << 3));
+ addbyte(0x0c);
+ }
addbyte(0x74); /*JZ +*/
addbyte(7+5+12+5);
addbyte(0xC7); /*MOVL [oldpc],op_old_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(op_old_pc);
load_param_1_32(&codeblock[block_current], 7);
CALL_FUNC(x86_int);
@@ -4419,23 +4677,19 @@ static void MMX_ENTER()
addbyte(0x31); /*XOR EAX, EAX*/
addbyte(0xc0);
- addbyte(0xc7); /*MOV ISMMX, 1*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&ismmx);
- addlong(1);
+ addbyte(0xc6); /*MOV ISMMX, 1*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(ismmx));
+ addbyte(1);
addbyte(0x89); /*MOV TOP, EAX*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&TOP);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV tag, EAX*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&tag[0]);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0x89); /*MOV tag+4, EAX*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&tag[4]);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(tag[4]));
codegen_mmx_entered = 1;
}
@@ -4447,9 +4701,9 @@ static int LOAD_MMX_D(int guest_reg)
int host_reg = REG_EBX;
addbyte(0x8b); /*MOV EBX, reg*/
- addbyte(0x04 | (host_reg << 3));
+ addbyte(0x44 | (host_reg << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
return host_reg;
}
@@ -4462,9 +4716,9 @@ static void LOAD_MMX_Q(int guest_reg, int *host_reg1, int *host_reg2)
else
addbyte(0x48);
addbyte(0x8b); /*MOV RBX, reg*/
- addbyte(0x04 | ((host_reg & 7) << 3));
+ addbyte(0x44 | ((host_reg & 7) << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].q);
+ addbyte(cpu_state_offset(MM[guest_reg].q));
*host_reg1 = host_reg;
}
@@ -4476,9 +4730,9 @@ static int LOAD_MMX_Q_MMX(int guest_reg)
addbyte(0xf3); /*MOV XMMx, reg*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x04 | ((dst_reg & 7) << 3));
+ addbyte(0x44 | ((dst_reg & 7) << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].q);
+ addbyte(cpu_state_offset(MM[guest_reg].q));
return dst_reg;
}
@@ -4503,16 +4757,16 @@ static int LOAD_INT_TO_MMX(int src_reg1, int src_reg2)
static void STORE_MMX_LQ(int guest_reg, int host_reg1)
{
addbyte(0xC7); /*MOVL [reg],0*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].l[1]);
+ addbyte(cpu_state_offset(MM[guest_reg].l[1]));
addlong(0);
if (host_reg1 & 8)
addbyte(0x44);
addbyte(0x89); /*MOVL [reg],host_reg*/
- addbyte(0x04 | ((host_reg1 & 7) << 3));
+ addbyte(0x44 | ((host_reg1 & 7) << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
}
static void STORE_MMX_Q(int guest_reg, int host_reg1, int host_reg2)
{
@@ -4521,18 +4775,18 @@ static void STORE_MMX_Q(int guest_reg, int host_reg1, int host_reg2)
else
addbyte(0x48);
addbyte(0x89); /*MOV [reg],host_reg*/
- addbyte(0x04 | ((host_reg1 & 7) << 3));
+ addbyte(0x44 | ((host_reg1 & 7) << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
}
static void STORE_MMX_Q_MMX(int guest_reg, int host_reg)
{
addbyte(0x66); /*MOVQ [guest_reg],host_reg*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x04 | (host_reg << 3));
+ addbyte(0x44 | (host_reg << 3));
addbyte(0x25);
- addlong((uint32_t)&MM[guest_reg].q);
+ addbyte(cpu_state_offset(MM[guest_reg].q));
}
#define MMX_x86_OP(name, opcode) \
diff --git a/src/codegen_ops_x86.h b/src/codegen_ops_x86.h
index 0183b917a..b46010349 100644
--- a/src/codegen_ops_x86.h
+++ b/src/codegen_ops_x86.h
@@ -52,11 +52,11 @@ static void STORE_IMM_ADDR_W(uintptr_t addr, uint16_t val)
}
static void STORE_IMM_ADDR_L(uintptr_t addr, uint32_t val)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0xC7); /*MOVL [addr],val*/
addbyte(0x45);
- addbyte(addr - (uint32_t)&cpu_state);
+ addbyte(addr - (uint32_t)&cpu_state - 128);
addlong(val);
}
else
@@ -73,9 +73,9 @@ static void STORE_IMM_REG_B(int reg, uint8_t val)
addbyte(0xC6); /*MOVB [addr],val*/
addbyte(0x45);
if (reg & 4)
- addbyte((uint32_t)&cpu_state.regs[reg & 3].b.h - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 3].b.h));
else
- addbyte((uint32_t)&cpu_state.regs[reg & 3].b.l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 3].b.l));
addbyte(val);
}
static void STORE_IMM_REG_W(int reg, uint16_t val)
@@ -83,14 +83,14 @@ static void STORE_IMM_REG_W(int reg, uint16_t val)
addbyte(0x66); /*MOVW [addr],val*/
addbyte(0xC7);
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].w));
addword(val);
}
static void STORE_IMM_REG_L(int reg, uint32_t val)
{
addbyte(0xC7); /*MOVL [addr],val*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].l));
addlong(val);
}
@@ -103,9 +103,9 @@ static int LOAD_REG_B(int reg)
addbyte(0xb6);
addbyte(0x45 | (host_reg << 3));
if (reg & 4)
- addbyte((uint32_t)&cpu_state.regs[reg & 3].b.h - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 3].b.h));
else
- addbyte((uint32_t)&cpu_state.regs[reg & 3].b.l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 3].b.l));
return host_reg;
}
@@ -117,7 +117,7 @@ static int LOAD_REG_W(int reg)
addbyte(0x0f); /*MOVZX W[reg],host_reg*/
addbyte(0xb7);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].w));
return host_reg;
}
@@ -128,7 +128,7 @@ static int LOAD_REG_L(int reg)
addbyte(0x8b); /*MOVL host_reg,[reg]*/
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[reg & 7].l));
return host_reg;
}
@@ -185,9 +185,9 @@ static void STORE_REG_B_RELEASE(int host_reg)
addbyte(0x88); /*MOVB [reg],host_reg*/
addbyte(0x45 | (host_reg << 3));
if (host_reg_mapping[host_reg] & 4)
- addbyte((uint32_t)&cpu_state.regs[host_reg_mapping[host_reg] & 3].b.h - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg_mapping[host_reg] & 3].b.h));
else
- addbyte((uint32_t)&cpu_state.regs[host_reg_mapping[host_reg] & 3].b.l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg_mapping[host_reg] & 3].b.l));
host_reg_mapping[host_reg] = -1;
}
static void STORE_REG_W_RELEASE(int host_reg)
@@ -195,14 +195,14 @@ static void STORE_REG_W_RELEASE(int host_reg)
addbyte(0x66); /*MOVW [reg],host_reg*/
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg_mapping[host_reg]].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg_mapping[host_reg]].w));
host_reg_mapping[host_reg] = -1;
}
static void STORE_REG_L_RELEASE(int host_reg)
{
addbyte(0x89); /*MOVL [reg],host_reg*/
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[host_reg_mapping[host_reg]].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[host_reg_mapping[host_reg]].l));
host_reg_mapping[host_reg] = -1;
}
@@ -211,9 +211,9 @@ static void STORE_REG_TARGET_B_RELEASE(int host_reg, int guest_reg)
addbyte(0x88); /*MOVB [guest_reg],host_reg*/
addbyte(0x45 | (host_reg << 3));
if (guest_reg & 4)
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].b.h - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].b.h));
else
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 3].b.l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 3].b.l));
host_reg_mapping[host_reg] = -1;
}
static void STORE_REG_TARGET_W_RELEASE(int host_reg, int guest_reg)
@@ -221,14 +221,14 @@ static void STORE_REG_TARGET_W_RELEASE(int host_reg, int guest_reg)
addbyte(0x66); /*MOVW [guest_reg],host_reg*/
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].w - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].w));
host_reg_mapping[host_reg] = -1;
}
static void STORE_REG_TARGET_L_RELEASE(int host_reg, int guest_reg)
{
addbyte(0x89); /*MOVL [guest_reg],host_reg*/
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)&cpu_state.regs[guest_reg & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[guest_reg & 7].l));
host_reg_mapping[host_reg] = -1;
}
@@ -239,12 +239,12 @@ static void RELEASE_REG(int host_reg)
static void STORE_HOST_REG_ADDR_W(uintptr_t addr, int host_reg)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0x66); /*MOVW [addr],host_reg*/
addbyte(0x89);
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)addr - (uint32_t)&cpu_state);
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
}
else
{
@@ -256,11 +256,11 @@ static void STORE_HOST_REG_ADDR_W(uintptr_t addr, int host_reg)
}
static void STORE_HOST_REG_ADDR(uintptr_t addr, int host_reg)
{
- if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x80)
+ if (addr >= (uintptr_t)&cpu_state && addr < ((uintptr_t)&cpu_state)+0x100)
{
addbyte(0x89); /*MOVL [addr],host_reg*/
addbyte(0x45 | (host_reg << 3));
- addbyte((uint32_t)addr - (uint32_t)&cpu_state);
+ addbyte((uint32_t)addr - (uint32_t)&cpu_state - 128);
}
else
{
@@ -689,7 +689,7 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
addbyte(0x04);
addbyte(0x3a);
addbyte(0xeb); /*JMP done*/
- addbyte(4+3+5+7+6+3);
+ addbyte(4+3+5+4+6+3);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -699,9 +699,9 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
addbyte(0x24);
addbyte(0xe8); /*CALL readmemb386l*/
addlong((uint32_t)readmemb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -747,7 +747,7 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
addbyte(0x3a);
addbyte(-1);
addbyte(0xeb); /*JMP done*/
- addbyte(4+3+5+7+6+3);
+ addbyte(4+3+5+4+6+3);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -757,9 +757,9 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
addbyte(0x24);
addbyte(0xe8); /*CALL readmemwl*/
addlong((uint32_t)readmemwl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f);
addbyte(0x85); /*JNE end*/
@@ -804,7 +804,7 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
addbyte(0x3a);
addbyte(-3);
addbyte(0xeb); /*JMP done*/
- addbyte(4+3+5+7+6);
+ addbyte(4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -814,9 +814,9 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
addbyte(0x24);
addbyte(0xe8); /*CALL readmemll*/
addlong((uint32_t)readmemll - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f);
addbyte(0x85); /*JNE end*/
@@ -863,7 +863,7 @@ static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
addbyte(0x3a);
addbyte(-7+4);
addbyte(0xeb); /*JMP done*/
- addbyte(4+3+5+7+6);
+ addbyte(4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -873,9 +873,9 @@ static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
addbyte(0x24);
addbyte(0xe8); /*CALL readmemql*/
addlong((uint32_t)readmemql - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f);
addbyte(0x85); /*JNE end*/
@@ -928,7 +928,7 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
addbyte(0x04 | (host_reg << 3));
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(0xeb); /*JMP done*/
- addbyte(4+5+4+3+5+7+6);
+ addbyte(4+5+4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -944,9 +944,9 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
addbyte(0x24);
addbyte(0xe8); /*CALL writememb386l*/
addlong((uint32_t)writememb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -986,7 +986,7 @@ static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-1);
addbyte(0xeb); /*JMP done*/
- addbyte(4+5+4+3+5+7+6);
+ addbyte(4+5+4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -1002,9 +1002,9 @@ static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
addbyte(0x24);
addbyte(0xe8); /*CALL writememwl*/
addlong((uint32_t)writememwl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1043,7 +1043,7 @@ static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-3);
addbyte(0xeb); /*JMP done*/
- addbyte(4+5+4+3+5+7+6);
+ addbyte(4+5+4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -1059,9 +1059,9 @@ static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
addbyte(0x24);
addbyte(0xe8); /*CALL writememll*/
addlong((uint32_t)writememll - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1104,7 +1104,7 @@ static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
addbyte(REG_EDI | (REG_ESI << 3));
addbyte(-7+0x04);
addbyte(0xeb); /*JMP done*/
- addbyte(4+5+4+4+3+5+7+6);
+ addbyte(4+5+4+4+3+5+4+6);
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
addbyte(0x44);
addbyte(0x24);
@@ -1124,9 +1124,9 @@ static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
addbyte(0x24);
addbyte(0xe8); /*CALL writememql*/
addlong((uint32_t)writememql - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
- addbyte(0x83); /*CMP abrt, 0*/
- addbyte(0x3d);
- addlong((uint32_t)&abrt);
+ addbyte(0x80); /*CMP abrt, 0*/
+ addbyte(0x7d);
+ addbyte(cpu_state_offset(abrt));
addbyte(0);
addbyte(0x0f); /*JNE end*/
addbyte(0x85);
@@ -1243,13 +1243,13 @@ static x86seg *FETCH_EA_32(x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, u
{
addbyte(0x8b); /*MOVL EAX, regs[sib&7].l*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[sib & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
}
break;
case 1:
addbyte(0x8b); /*MOVL EAX, regs[sib&7].l*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[sib & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
addbyte(0x83); /*ADDL EAX, imm8*/
addbyte(0xc0 | REG_EAX);
addbyte((int8_t)(rmdat >> 16));
@@ -1261,7 +1261,7 @@ static x86seg *FETCH_EA_32(x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, u
addlong(new_eaaddr);
addbyte(0x03); /*ADDL EAX, regs[sib&7].l*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[sib & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
(*op_pc) += 4;
break;
}
@@ -1288,20 +1288,20 @@ static x86seg *FETCH_EA_32(x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, u
case 0:
addbyte(0x03); /*ADDL EAX, regs[sib&7].l*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[(sib >> 3) & 7].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l));
break;
case 1:
- addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte((uint32_t)&cpu_state.regs[(sib >> 3) & 7].l - (uint32_t)&EAX); /*MOVL EDI, reg*/
+ addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL EDI, reg*/
addbyte(0x01); addbyte(0xc0 | REG_EAX | (REG_EDI << 3)); /*ADDL EAX, EDI*/
addbyte(0x01); addbyte(0xc0 | REG_EAX | (REG_EDI << 3)); /*ADDL EAX, EDI*/
break;
case 2:
- addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte((uint32_t)&cpu_state.regs[(sib >> 3) & 7].l - (uint32_t)&EAX); /*MOVL EDI, reg*/
+ addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL EDI, reg*/
addbyte(0xC1); addbyte(0xE0 | REG_EDI); addbyte(2); /*SHL EDI, 2*/
addbyte(0x01); addbyte(0xc0 | REG_EAX | (REG_EDI << 3)); /*ADDL EAX, EDI*/
break;
case 3:
- addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte((uint32_t)&cpu_state.regs[(sib >> 3) & 7].l - (uint32_t)&EAX); /*MOVL EDI reg*/
+ addbyte(0x8B); addbyte(0x45 | (REG_EDI << 3)); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL EDI reg*/
addbyte(0xC1); addbyte(0xE0 | REG_EDI); addbyte(3); /*SHL EDI, 3*/
addbyte(0x01); addbyte(0xc0 | REG_EAX | (REG_EDI << 3)); /*ADDL EAX, EDI*/
break;
@@ -1320,7 +1320,7 @@ static x86seg *FETCH_EA_32(x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, u
}
addbyte(0x8b); /*MOVL EAX, regs[rm].l*/
addbyte(0x45);
- addbyte((uint32_t)&cpu_state.regs[rm].l - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[rm].l));
cpu_state.eaaddr = cpu_state.regs[rm].l;
if (mod)
{
@@ -1359,7 +1359,7 @@ static void LOAD_STACK_TO_EA(int off)
{
addbyte(0x8b); /*MOVL EAX,[ESP]*/
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
if (off)
{
addbyte(0x83); /*ADD EAX, off*/
@@ -1372,7 +1372,7 @@ static void LOAD_STACK_TO_EA(int off)
addbyte(0x0f); /*MOVZX EAX,W[ESP]*/
addbyte(0xb7);
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
if (off)
{
addbyte(0x66); /*ADD AX, off*/
@@ -1388,7 +1388,7 @@ static void LOAD_EBP_TO_EA(int off)
{
addbyte(0x8b); /*MOVL EAX,[EBP]*/
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&EBP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_EBP].l));
if (off)
{
addbyte(0x83); /*ADD EAX, off*/
@@ -1401,7 +1401,7 @@ static void LOAD_EBP_TO_EA(int off)
addbyte(0x0f); /*MOVZX EAX,W[EBP]*/
addbyte(0xb7);
addbyte(0x45 | (REG_EAX << 3));
- addbyte((uint32_t)&EBP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_EBP].w));
if (off)
{
addbyte(0x66); /*ADD AX, off*/
@@ -1419,14 +1419,14 @@ static void SP_MODIFY(int off)
{
addbyte(0x83); /*ADD [ESP], off*/
addbyte(0x45);
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
addbyte(off);
}
else
{
addbyte(0x81); /*ADD [ESP], off*/
addbyte(0x45);
- addbyte((uint32_t)&ESP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].l));
addlong(off);
}
}
@@ -1437,7 +1437,7 @@ static void SP_MODIFY(int off)
addbyte(0x66); /*ADD [SP], off*/
addbyte(0x83);
addbyte(0x45);
- addbyte((uint32_t)&SP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
addbyte(off);
}
else
@@ -1445,7 +1445,7 @@ static void SP_MODIFY(int off)
addbyte(0x66); /*ADD [SP], off*/
addbyte(0x81);
addbyte(0x45);
- addbyte((uint32_t)&SP - (uint32_t)&EAX);
+ addbyte(cpu_state_offset(regs[REG_ESP].w));
addword(off);
}
}
@@ -1459,16 +1459,16 @@ static void TEST_ZERO_JUMP_W(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | host_reg);
addbyte(0);
addbyte(0x75); /*JNZ +*/
- addbyte(7+5+(taken_cycles ? 7 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -1480,16 +1480,16 @@ static void TEST_ZERO_JUMP_L(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | host_reg);
addbyte(0);
addbyte(0x75); /*JNZ +*/
- addbyte(7+5+(taken_cycles ? 7 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -1503,16 +1503,16 @@ static void TEST_NONZERO_JUMP_W(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | host_reg);
addbyte(0);
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(taken_cycles ? 7 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -1524,16 +1524,16 @@ static void TEST_NONZERO_JUMP_L(int host_reg, uint32_t new_pc, int taken_cycles)
addbyte(0xc0 | 0x38 | host_reg);
addbyte(0);
addbyte(0x74); /*JZ +*/
- addbyte(7+5+(taken_cycles ? 7 : 0));
+ addbyte(7+5+(taken_cycles ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(new_pc);
if (taken_cycles)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(taken_cycles);
}
addbyte(0xe9); /*JMP end*/
@@ -1547,10 +1547,10 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
case FLAGS_SUB8:
addbyte(0x8a); /*MOV AL, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3a); /*CMP AL, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x76); /*JBE*/
else
@@ -1560,11 +1560,11 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x66); /*MOV AX, flags_op1*/
addbyte(0x8b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x66); /*CMP AX, flags_op2*/
addbyte(0x3b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x76); /*JBE*/
else
@@ -1573,10 +1573,10 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
case FLAGS_SUB32:
addbyte(0x8b); /*MOV EAX, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3b); /*CMP EAX, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x76); /*JBE*/
else
@@ -1588,7 +1588,7 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
{
addbyte(0x83); /*CMP flags_res, 0*/
addbyte(0x7d);
- addbyte((uintptr_t)&cpu_state.flags_res - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_res));
addbyte(0);
addbyte(0x74); /*JZ +*/
}
@@ -1600,7 +1600,7 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x75); /*JNZ +*/
}
if (not)
- addbyte(5+2+2+7+5+(timing_bt ? 7 : 0));
+ addbyte(5+2+2+7+5+(timing_bt ? 4 : 0));
else
addbyte(5+2+2);
CALL_FUNC(CF_SET);
@@ -1612,16 +1612,16 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x74); /*JZ +*/
break;
}
- addbyte(7+5+(timing_bt ? 7 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -1635,10 +1635,10 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
case FLAGS_SUB8:
addbyte(0x8a); /*MOV AL, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3a); /*CMP AL, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7c); /*JL*/
else
@@ -1648,11 +1648,11 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
addbyte(0x66); /*MOV AX, flags_op1*/
addbyte(0x8b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x66); /*CMP AX, flags_op2*/
addbyte(0x3b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7c); /*JL*/
else
@@ -1661,10 +1661,10 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
case FLAGS_SUB32:
addbyte(0x8b); /*MOV EAX, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3b); /*CMP EAX, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7c); /*JL*/
else
@@ -1692,16 +1692,16 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
addbyte(0x74); /*JZ +*/
break;
}
- addbyte(7+5+(timing_bt ? 7 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -1715,10 +1715,10 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
case FLAGS_SUB8:
addbyte(0x8a); /*MOV AL, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3a); /*CMP AL, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7e); /*JLE*/
else
@@ -1728,11 +1728,11 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x66); /*MOV AX, flags_op1*/
addbyte(0x8b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x66); /*CMP AX, flags_op2*/
addbyte(0x3b);
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7e); /*JLE*/
else
@@ -1741,10 +1741,10 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
case FLAGS_SUB32:
addbyte(0x8b); /*MOV EAX, flags_op1*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op1 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op1));
addbyte(0x3b); /*CMP EAX, flags_op2*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.flags_op2 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_op2));
if (not)
addbyte(0x7e); /*JLE*/
else
@@ -1756,7 +1756,7 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
{
addbyte(0x83); /*CMP flags_res, 0*/
addbyte(0x7d);
- addbyte((uintptr_t)&cpu_state.flags_res - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(flags_res));
addbyte(0);
addbyte(0x74); /*JZ +*/
}
@@ -1768,7 +1768,7 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x75); /*JNZ +*/
}
if (not)
- addbyte(5+2+3+5+2+3+2+2+7+5+(timing_bt ? 7 : 0));
+ addbyte(5+2+3+5+2+3+2+2+7+5+(timing_bt ? 4 : 0));
else
addbyte(5+2+3+5+2+3+2+2);
@@ -1792,16 +1792,16 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0x74); /*JZ +*/
break;
}
- addbyte(7+5+(timing_bt ? 7 : 0));
+ addbyte(7+5+(timing_bt ? 4 : 0));
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc+pc_offset+offset);
if (timing_bt)
{
addbyte(0x83); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uintptr_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addbyte(timing_bt);
}
addbyte(0xe9); /*JMP end*/
@@ -1822,7 +1822,7 @@ static void FP_ENTER()
addbyte(7+7+5+5);
addbyte(0xC7); /*MOVL [oldpc],op_old_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(op_old_pc);
addbyte(0xc7); /*MOV [ESP], 7*/
addbyte(0x04);
@@ -1838,8 +1838,9 @@ static void FP_ENTER()
static void FP_FLD(int reg)
{
- addbyte(0xa1); /*MOV EAX, [TOP]*/
- addlong((uintptr_t)&TOP);
+ addbyte(0x8b); /*MOV EAX, [TOP]*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (reg)
@@ -1862,55 +1863,59 @@ static void FP_FLD(int reg)
}
addbyte(0xdd); /*FLD [ST+EAX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x83); /*AND EBX, 7*/
addbyte(0xe3);
addbyte(0x07);
addbyte(0x8b); /*MOV EDX, [ST_i64+EAX]*/
- addbyte(0x14);
+ addbyte(0x54);
addbyte(0xc5);
- addlong((uintptr_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x8b); /*MOV ECX, [ST_i64+4+EAX]*/
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xc5);
- addlong(((uintptr_t)ST_i64) + 4);
+ addbyte(cpu_state_offset(MM)+4);
addbyte(0x8a); /*MOV AL, [tag+EAX]*/
- addbyte(0x80);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x88); /*MOV [tag+EBX], AL*/
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0x89); /*MOV [ST_i64+EBX], EDX*/
- addbyte(0x14);
+ addbyte(0x54);
addbyte(0xdd);
- addlong((uintptr_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x89); /*MOV [ST_i64+EBX+4], ECX*/
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xdd);
- addlong(((uintptr_t)ST_i64) + 4);
+ addbyte(cpu_state_offset(MM)+4);
addbyte(0x89); /*MOV [TOP], EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
}
static void FP_FST(int reg)
{
- addbyte(0xa1); /*MOV EAX, [TOP]*/
- addlong((uintptr_t)&TOP);
+ addbyte(0x8b); /*MOV EAX, [TOP]*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xdd); /*FLD [ST+EAX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
- addbyte(0x88); /*MOV BL, [tag+EAX]*/
- addbyte(0x98);
- addlong((uintptr_t)tag);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x8a); /*MOV BL, [tag+EAX]*/
+ addbyte(0x5c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
if (reg)
{
@@ -1923,18 +1928,20 @@ static void FP_FST(int reg)
}
addbyte(0xdd); /*FSTP [ST+EAX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xc5);
- addlong((uintptr_t)ST);
- addbyte(0x8a); /*MOV [tag+EAX], BL*/
- addbyte(0x98);
- addlong((uintptr_t)tag);
+ addbyte(cpu_state_offset(ST));
+ addbyte(0x88); /*MOV [tag+EAX], BL*/
+ addbyte(0x5c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
}
static void FP_FXCH(int reg)
{
- addbyte(0xa1); /*MOV EAX, [TOP]*/
- addlong((uintptr_t)&TOP);
+ addbyte(0x8b); /*MOV EAX, [TOP]*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
addbyte(0x83); /*ADD EAX, reg*/
@@ -1942,40 +1949,44 @@ static void FP_FXCH(int reg)
addbyte(reg);
//#if 0
addbyte(0xdd); /*FLD [ST+EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x83); /*AND EAX, 7*/
addbyte(0xe0);
addbyte(0x07);
addbyte(0xdd); /*FLD [ST+EAX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xc5);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdd); /*FSTP [ST+EAX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xc5);
- addlong((uintptr_t)ST);
- addbyte(0xbe); /*MOVL ESI, tag*/
- addlong((uintptr_t)tag);
+ addbyte(cpu_state_offset(ST));
+// addbyte(0xbe); /*MOVL ESI, tag*/
+// addlong((uintptr_t)cpu_state.tag);
addbyte(0x8a); /*MOV CL, tag[EAX]*/
- addbyte(0x0c);
- addbyte(0x06);
+ addbyte(0x4c);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0x8a); /*MOV DL, tag[EBX]*/
- addbyte(0x14);
- addbyte(0x1e);
+ addbyte(0x54);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0x88); /*MOV tag[EBX], CL*/
- addbyte(0x0c);
- addbyte(0x1e);
+ addbyte(0x4c);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0x88); /*MOV tag[EAX], DL*/
- addbyte(0x14);
- addbyte(0x06);
+ addbyte(0x54);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(0xbe); /*MOVL ESI, ST_int64*/
- addlong((uintptr_t)ST_i64);
+ addlong((uintptr_t)cpu_state.MM);
addbyte(0x8b); /*MOV ECX, ST_int64[EAX*8]*/
addbyte(0x0c);
addbyte(0xc6);
@@ -2008,7 +2019,7 @@ static void FP_FXCH(int reg)
//#endif
#if 0
addbyte(0xbe); /*MOVL ESI, ST*/
- addlong((uintptr_t)ST);
+ addlong((uintptr_t)cpu_state.ST);
addbyte(0x8b); /*MOVL EDX, [ESI+EBX*8]*/
addbyte(0x14);
@@ -2049,8 +2060,8 @@ static void FP_FXCH(int reg)
static void FP_LOAD_S()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2067,22 +2078,23 @@ static void FP_LOAD_S()
addbyte(0xf8);
addbyte(0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
}
static void FP_LOAD_D()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2105,22 +2117,23 @@ static void FP_LOAD_D()
addbyte(0xf8);
addbyte(0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
}
static void FP_LOAD_IW()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2137,22 +2150,23 @@ static void FP_LOAD_IW()
addbyte(0xf8);
addbyte(0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
}
static void FP_LOAD_IL()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2169,22 +2183,23 @@ static void FP_LOAD_IL()
addbyte(0xf8);
addbyte(0);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0f); /*SETE [tag+EBX]*/
addbyte(0x94);
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
}
static void FP_LOAD_IQ()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x83); /*SUB EBX, 1*/
addbyte(0xeb);
addbyte(1);
@@ -2192,44 +2207,45 @@ static void FP_LOAD_IQ()
addbyte(0xe3);
addbyte(7);
addbyte(0x89); /*MOV [ST_i64+EBX*8], EAX*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x09); /*OR EAX, EDX*/
addbyte(0xd0);
addbyte(0x89); /*MOV [ST_i64+4+EBX*8], EDX*/
- addbyte(0x14);
+ addbyte(0x54);
addbyte(0xdd);
- addlong(((uint32_t)ST_i64) + 4);
+ addbyte(cpu_state_offset(MM)+4);
addbyte(0x83); /*CMP EAX, 0*/
addbyte(0xf8);
addbyte(0);
addbyte(0xdf); /*FILDl [ST_i64+EBX*8]*/
- addbyte(0x2c);
+ addbyte(0x6c);
addbyte(0xdd);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0x0f); /*SETE AL*/
addbyte(0x94);
addbyte(0xc0);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x0c); /*OR AL, TAG_UINT64*/
addbyte(TAG_UINT64);
addbyte(0x89); /*MOV TOP, EBX*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x88); /*MOV [tag+EBX], AL*/
- addbyte(0x83);
- addlong((uint32_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
}
static int FP_LOAD_REG(int reg)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -2240,9 +2256,9 @@ static int FP_LOAD_REG(int reg)
addbyte(7);
}
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0xd9); /*FSTP [ESP]*/
addbyte(0x1c);
addbyte(0x24);
@@ -2256,8 +2272,8 @@ static int FP_LOAD_REG(int reg)
static void FP_LOAD_REG_D(int reg, int *host_reg1, int *host_reg2)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -2268,9 +2284,9 @@ static void FP_LOAD_REG_D(int reg, int *host_reg1, int *host_reg2)
addbyte(7);
}
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdd); /*FSTP [ESP]*/
addbyte(0x1c);
addbyte(0x24);
@@ -2291,10 +2307,10 @@ static double _fp_half = 0.5;
static void FP_LOAD_ROUNDING()
{
- pclog("npxc %04x\n", npxc);
+ pclog("cpu_state.npxc %04x\n", cpu_state.npxc);
addbyte(0x8b); /*MOV EDX, npxc*/
addbyte(0x15);
- addlong((uintptr_t)&npxc);
+ addlong((uintptr_t)&cpu_state.npxc);
addbyte(0xd9); /*FSTCW [ESP+8]*/
addbyte(0x7c);
addbyte(0x24);
@@ -2320,7 +2336,7 @@ static int32_t x87_fround32(double b)
{
int64_t a, c;
- switch ((npxc>>10)&3)
+ switch ((cpu_state.npxc >> 10) & 3)
{
case 0: /*Nearest*/
a = (int64_t)floor(b);
@@ -2343,7 +2359,7 @@ static int64_t x87_fround64(double b)
{
int64_t a, c;
- switch ((npxc>>10)&3)
+ switch ((cpu_state.npxc >> 10) & 3)
{
case 0: /*Nearest*/
a = (int64_t)floor(b);
@@ -2365,8 +2381,8 @@ static int64_t x87_fround64(double b)
static int FP_LOAD_REG_INT_W(int reg)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -2377,9 +2393,9 @@ static int FP_LOAD_REG_INT_W(int reg)
addbyte(7);
}
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x89); /*MOV [ESP+8], EAX*/
addbyte(0x44);
@@ -2405,8 +2421,8 @@ static int FP_LOAD_REG_INT_W(int reg)
static int FP_LOAD_REG_INT(int reg)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -2417,9 +2433,9 @@ static int FP_LOAD_REG_INT(int reg)
addbyte(7);
}
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x89); /*MOV [ESP+8], EAX*/
addbyte(0x44);
@@ -2445,8 +2461,8 @@ static int FP_LOAD_REG_INT(int reg)
static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
if (reg)
{
addbyte(0x83); /*ADD EBX, reg*/
@@ -2456,46 +2472,47 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
addbyte(0xe3);
addbyte(7);
}
- if (codegen_fpu_loaded_iq[TOP] && (tag[TOP] & TAG_UINT64))
+ if (codegen_fpu_loaded_iq[cpu_state.TOP] && (cpu_state.tag[cpu_state.TOP] & TAG_UINT64))
{
/*If we know the register was loaded with FILDq in this block and
has not been modified, then we can skip most of the conversion
and just load the 64-bit integer representation directly */
addbyte(0x8b); /*MOV ECX, [ST_i64+EBX*8]*/
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xdd);
- addlong((uint32_t)ST_i64+4);
+ addbyte(cpu_state_offset(MM)+4);
addbyte(0x8b); /*MOV EBX, [ST_i64+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
return;
}
addbyte(0xf6); /*TEST TAG[EBX], TAG_UINT64*/
- addbyte(0x83);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(TAG_UINT64);
addbyte(0x74); /*JZ +*/
- addbyte(7+7+2);
+ addbyte(4+4+2);
addbyte(0x8b); /*MOV ECX, [ST_i64+EBX*8]*/
- addbyte(0x0c);
+ addbyte(0x4c);
addbyte(0xdd);
- addlong((uint32_t)ST_i64+4);
+ addbyte(cpu_state_offset(MM)+4);
addbyte(0x8b); /*MOV EBX, [ST_i64+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uint32_t)ST_i64);
+ addbyte(cpu_state_offset(MM));
addbyte(0xeb); /*JMP done*/
- addbyte(7+4+3+5+2+2+4);
+ addbyte(4+4+3+5+2+2+4);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x89); /*MOV [ESP+8], EAX*/
addbyte(0x44);
@@ -2525,18 +2542,21 @@ static void FP_LOAD_REG_INT_Q(int reg, int *host_reg1, int *host_reg2)
static void FP_POP()
{
- addbyte(0xa1); /*MOV EAX, TOP*/
- addlong((uintptr_t)&TOP);
+ addbyte(0x8b); /*MOV EAX, TOP*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
addbyte(0xc6); /*MOVB tag[EAX], 3*/
- addbyte(0x80);
- addlong((uintptr_t)tag);
+ addbyte(0x44);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(3);
addbyte(0x04); /*ADD AL, 1*/
addbyte(1);
addbyte(0x24); /*AND AL, 7*/
addbyte(7);
- addbyte(0xa2); /*MOV TOP, AL*/
- addlong((uintptr_t)&TOP);
+ addbyte(0x88); /*MOV TOP, AL*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
}
#define FPU_ADD 0x00
@@ -2549,36 +2569,37 @@ static void FP_POP()
static void FP_OP_S(int op)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xd8); /*FADD [ESP]*/
addbyte(0x04 | op);
addbyte(0x24);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
}
static void FP_OP_D(int op)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
- if (((npxc >> 10) & 3) && op == FPU_ADD)
+ if (((cpu_state.npxc >> 10) & 3) && op == FPU_ADD)
{
addbyte(0x9b); /*FSTCW [ESP+8]*/
addbyte(0xd9);
@@ -2595,7 +2616,7 @@ static void FP_OP_D(int op)
addword(~(3 << 10));
addbyte(0x66); /*OR AX, npxc & (3 << 10)*/
addbyte(0x0d);
- addword(npxc & (3 << 10));
+ addword(cpu_state.npxc & (3 << 10));
addbyte(0x66); /*MOV [ESP+12], AX*/
addbyte(0x89);
addbyte(0x44);
@@ -2611,21 +2632,22 @@ static void FP_OP_D(int op)
addbyte(0x24);
addbyte(0x04);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xdc); /*FADD [ESP]*/
addbyte(0x04 | op);
addbyte(0x24);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
- if (((npxc >> 10) & 3) && op == FPU_ADD)
+ addbyte(cpu_state_offset(ST));
+ if (((cpu_state.npxc >> 10) & 3) && op == FPU_ADD)
{
addbyte(0xd9); /*FLDCW [ESP+8]*/
addbyte(0x6c);
@@ -2636,56 +2658,58 @@ static void FP_OP_D(int op)
static void FP_OP_IW(int op)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xde); /*FADD [ESP]*/
addbyte(0x04 | op);
addbyte(0x24);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
}
static void FP_OP_IL(int op)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xda); /*FADD [ESP]*/
addbyte(0x04 | op);
addbyte(0x24);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
}
static void FP_OP_IQ(int op)
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2694,20 +2718,21 @@ static void FP_OP_IQ(int op)
addbyte(0x24);
addbyte(0x04);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xdc); /*FADD [ESP]*/
addbyte(0x04 | op);
addbyte(0x24);
addbyte(0xdd); /*FSTP [ST+EBX*8]*/
- addbyte(0x1c);
+ addbyte(0x5c);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
}
#define C0 (1<<8)
@@ -2718,18 +2743,18 @@ static void FP_OP_IQ(int op)
static void FP_COMPARE_S()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x8a); /*MOV BL, [npxs+1]*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
addbyte(0xdb); /*FCLEX*/
addbyte(0xe2);
addbyte(0x80); /*AND BL, ~(C0|C2|C3)*/
@@ -2746,14 +2771,14 @@ static void FP_COMPARE_S()
addbyte(0x08); /*OR BL, AH*/
addbyte(0xe3);
addbyte(0x88); /*MOV [npxs+1], BL*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_COMPARE_D()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
@@ -2762,12 +2787,12 @@ static void FP_COMPARE_D()
addbyte(0x24);
addbyte(0x04);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x8a); /*MOV BL, [npxs+1]*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
addbyte(0xdb); /*FCLEX*/
addbyte(0xe2);
addbyte(0x80); /*AND BL, ~(C0|C2|C3)*/
@@ -2784,24 +2809,24 @@ static void FP_COMPARE_D()
addbyte(0x08); /*OR BL, AH*/
addbyte(0xe3);
addbyte(0x88); /*MOV [npxs+1], BL*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_COMPARE_IW()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x8a); /*MOV BL, [npxs+1]*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
addbyte(0xdb); /*FCLEX*/
addbyte(0xe2);
addbyte(0x80); /*AND BL, ~(C0|C2|C3)*/
@@ -2818,24 +2843,24 @@ static void FP_COMPARE_IW()
addbyte(0x08); /*OR BL, AH*/
addbyte(0xe3);
addbyte(0x88); /*MOV [npxs+1], BL*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_COMPARE_IL()
{
addbyte(0x8b); /*MOV EBX, TOP*/
- addbyte(0x1d);
- addlong((uintptr_t)&TOP);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(TOP));
addbyte(0x89); /*MOV [ESP], EAX*/
addbyte(0x04);
addbyte(0x24);
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
+ addbyte(0x44);
addbyte(0xdd);
- addlong((uintptr_t)ST);
+ addbyte(cpu_state_offset(ST));
addbyte(0x8a); /*MOV BL, [npxs+1]*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
addbyte(0xdb); /*FCLEX*/
addbyte(0xe2);
addbyte(0x80); /*AND BL, ~(C0|C2|C3)*/
@@ -2852,16 +2877,17 @@ static void FP_COMPARE_IL()
addbyte(0x08); /*OR BL, AH*/
addbyte(0xe3);
addbyte(0x88); /*MOV [npxs+1], BL*/
- addbyte(0x1d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x5d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static void FP_OP_REG(int op, int dst, int src)
{
- addbyte(0xa1); /*MOV EAX, TOP*/
- addlong((uintptr_t)&TOP);
- addbyte(0xbe); /*MOVL ESI, ST*/
- addlong((uintptr_t)ST);
+ addbyte(0x8b); /*MOV EAX, TOP*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
+// addbyte(0xbe); /*MOVL ESI, ST*/
+// addlong((uintptr_t)cpu_state.ST);
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (src || dst)
@@ -2877,43 +2903,52 @@ static void FP_OP_REG(int op, int dst, int src)
if (src)
{
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EBX], ~TAG_UINT64*/
- addbyte(0xa3);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x1d);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xdc); /*FADD ST[EAX*8]*/
- addbyte(0x04 | op);
- addbyte(0xc6);
+ addbyte(0x44 | op);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdd); /*FSTP ST[EBX*8]*/
- addbyte(0x1c);
- addbyte(0xde);
+ addbyte(0x5c);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
}
else
{
addbyte(0xdd); /*FLD [ESI+EAX*8]*/
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
addbyte(0x80); /*AND tag[EAX], ~TAG_UINT64*/
- addbyte(0xa0);
- addlong((uintptr_t)tag);
+ addbyte(0x64);
+ addbyte(0x05);
+ addbyte(cpu_state_offset(tag[0]));
addbyte(~TAG_UINT64);
addbyte(0xdc); /*FADD ST[EBX*8]*/
- addbyte(0x04 | op);
- addbyte(0xde);
+ addbyte(0x44 | op);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdd); /*FSTP ST[EAX*8]*/
- addbyte(0x1c);
- addbyte(0xc6);
+ addbyte(0x5c);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
}
static void FP_COMPARE_REG(int dst, int src)
{
- addbyte(0xa1); /*MOV EAX, TOP*/
- addlong((uintptr_t)&TOP);
- addbyte(0xbe); /*MOVL ESI, ST*/
- addlong((uintptr_t)ST);
+ addbyte(0x8b); /*MOV EAX, TOP*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
+// addbyte(0xbe); /*MOVL ESI, ST*/
+// addlong((uintptr_t)cpu_state.ST);
addbyte(0x89); /*MOV EBX, EAX*/
addbyte(0xc3);
if (src || dst)
@@ -2927,8 +2962,8 @@ static void FP_COMPARE_REG(int dst, int src)
}
addbyte(0x8a); /*MOV CL, [npxs+1]*/
- addbyte(0x0d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
addbyte(0xdb); /*FCLEX*/
addbyte(0xe2);
addbyte(0x80); /*AND CL, ~(C0|C2|C3)*/
@@ -2938,20 +2973,24 @@ static void FP_COMPARE_REG(int dst, int src)
if (src)
{
addbyte(0xdd); /*FLD ST[EBX*8]*/
- addbyte(0x04);
- addbyte(0xde);
+ addbyte(0x44);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdc); /*FCOMP ST[EAX*8]*/
- addbyte(0x04 | 0x18);
- addbyte(0xc6);
+ addbyte(0x44 | 0x18);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
}
else
{
addbyte(0xdd); /*FLD [ESI+EAX*8]*/
- addbyte(0x04);
- addbyte(0xc6);
+ addbyte(0x44);
+ addbyte(0xc5);
+ addbyte(cpu_state_offset(ST));
addbyte(0xdc); /*FCOMP ST[EBX*8]*/
- addbyte(0x04 | 0x18);
- addbyte(0xde);
+ addbyte(0x44 | 0x18);
+ addbyte(0xdd);
+ addbyte(cpu_state_offset(ST));
}
addbyte(0xdf); /*FSTSW AX*/
@@ -2962,8 +3001,8 @@ static void FP_COMPARE_REG(int dst, int src)
addbyte(0x08); /*OR CL, AH*/
addbyte(0xe1);
addbyte(0x88); /*MOV [npxs+1], CL*/
- addbyte(0x0d);
- addlong(((uintptr_t)&npxs) + 1);
+ addbyte(0x4d);
+ addbyte(cpu_state_offset(npxs) + 1);
}
static int ZERO_EXTEND_W_B(int reg)
@@ -3066,7 +3105,7 @@ static void MMX_ENTER()
addbyte(7+7+5+5);
addbyte(0xC7); /*MOVL [oldpc],op_old_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(op_old_pc);
addbyte(0xc7); /*MOV [ESP], 7*/
addbyte(0x04);
@@ -3079,16 +3118,19 @@ static void MMX_ENTER()
addbyte(0x31); /*XOR EAX, EAX*/
addbyte(0xc0);
- addbyte(0xc7); /*MOV ISMMX, 1*/
- addbyte(0x05);
- addlong((uint32_t)&ismmx);
- addlong(1);
- addbyte(0xa3); /*MOV TOP, EAX*/
- addlong((uint32_t)&TOP);
- addbyte(0xa3); /*MOV tag, EAX*/
- addlong((uint32_t)&tag[0]);
- addbyte(0xa3); /*MOV tag+4, EAX*/
- addlong((uint32_t)&tag[4]);
+ addbyte(0xc6); /*MOV ISMMX, 1*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(ismmx));
+ addbyte(1);
+ addbyte(0x8b); /*MOV TOP, EAX*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(TOP));
+ addbyte(0x8b); /*MOV tag, EAX*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(tag[0]));
+ addbyte(0x8b); /*MOV tag+4, EAX*/
+ addbyte(0x45);
+ addbyte(cpu_state_offset(tag[4]));
codegen_mmx_entered = 1;
}
@@ -3101,8 +3143,8 @@ static int LOAD_MMX_D(int guest_reg)
host_reg_mapping[host_reg] = 100;
addbyte(0x8b); /*MOV EBX, reg*/
- addbyte(0x05 | (host_reg << 3));
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(0x45 | (host_reg << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
return host_reg;
}
@@ -3121,11 +3163,11 @@ static int LOAD_MMX_Q(int guest_reg, int *host_reg1, int *host_reg2)
}
addbyte(0x8b); /*MOV EBX, reg*/
- addbyte(0x05 | ((*host_reg1) << 3));
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(0x45 | ((*host_reg1) << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
addbyte(0x8b); /*MOV ECX, reg+4*/
- addbyte(0x05 | ((*host_reg2) << 3));
- addlong((uint32_t)&MM[guest_reg].l[1]);
+ addbyte(0x45 | ((*host_reg2) << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[1]));
}
static int LOAD_MMX_Q_MMX(int guest_reg)
{
@@ -3135,8 +3177,8 @@ static int LOAD_MMX_Q_MMX(int guest_reg)
addbyte(0xf3); /*MOVQ dst_reg,[reg]*/
addbyte(0x0f);
addbyte(0x7e);
- addbyte(0x05 | (dst_reg << 3));
- addlong((uint32_t)&MM[guest_reg].q);
+ addbyte(0x45 | (dst_reg << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].q));
return dst_reg;
}
@@ -3165,29 +3207,29 @@ static int LOAD_INT_TO_MMX(int src_reg1, int src_reg2)
static void STORE_MMX_LQ(int guest_reg, int host_reg1)
{
addbyte(0xC7); /*MOVL [reg],0*/
- addbyte(0x05);
- addlong((uint32_t)&MM[guest_reg].l[1]);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(MM[guest_reg].l[1]));
addlong(0);
addbyte(0x89); /*MOVL [reg],host_reg*/
- addbyte(0x05 | (host_reg1 << 3));
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(0x45 | (host_reg1 << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
}
static void STORE_MMX_Q(int guest_reg, int host_reg1, int host_reg2)
{
addbyte(0x89); /*MOVL [reg],host_reg*/
- addbyte(0x05 | (host_reg1 << 3));
- addlong((uint32_t)&MM[guest_reg].l[0]);
+ addbyte(0x45 | (host_reg1 << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[0]));
addbyte(0x89); /*MOVL [reg],host_reg*/
- addbyte(0x05 | (host_reg2 << 3));
- addlong((uint32_t)&MM[guest_reg].l[1]);
+ addbyte(0x45 | (host_reg2 << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].l[1]));
}
static void STORE_MMX_Q_MMX(int guest_reg, int host_reg)
{
addbyte(0x66); /*MOVQ [guest_reg],host_reg*/
addbyte(0x0f);
addbyte(0xd6);
- addbyte(0x05 | (host_reg << 3));
- addlong((uint32_t)&MM[guest_reg].q);
+ addbyte(0x45 | (host_reg << 3));
+ addbyte(cpu_state_offset(MM[guest_reg].q));
}
#define MMX_x86_OP(name, opcode) \
diff --git a/src/codegen_x86-64.c b/src/codegen_x86-64.c
index ab964790f..c1de9f781 100644
--- a/src/codegen_x86-64.c
+++ b/src/codegen_x86-64.c
@@ -356,9 +356,9 @@ void codegen_block_start_recompile(codeblock_t *block)
addbyte(0x83);
addbyte(0xEC);
addbyte(0x28);
- addbyte(0x48); /*MOVL EBP, &EAX*/
+ addbyte(0x48); /*MOVL RBP, &cpu_state*/
addbyte(0xBD);
- addquad((uint64_t)&EAX);
+ addquad(((uintptr_t)&cpu_state) + 128);
// pclog("New block %i for %08X %03x\n", block_current, cs+pc, block_num);
@@ -473,17 +473,15 @@ void codegen_block_end_recompile(codeblock_t *block)
if (codegen_block_cycles)
{
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uint32_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addlong((uint32_t)codegen_block_cycles);
}
if (codegen_block_ins)
{
addbyte(0x81); /*ADD $codegen_block_ins,ins*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&cpu_recomp_ins);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(cpu_recomp_ins));
addlong(codegen_block_ins);
}
#if 0
@@ -589,7 +587,7 @@ int opcode_0f_modrm[256] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/
- 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /*a0*/
+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/
1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/
@@ -612,7 +610,7 @@ static x86seg *codegen_generate_ea_16_long(x86seg *op_ea_seg, uint32_t fetchdat,
{
addbyte(0xC7); /*MOVL $0,(ssegs)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
addlong((fetchdat >> 8) & 0xffff);
(*op_pc) += 2;
}
@@ -722,7 +720,7 @@ static x86seg *codegen_generate_ea_16_long(x86seg *op_ea_seg, uint32_t fetchdat,
}
addbyte(0x89); /*MOV eaaddr, EAX*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
if (mod1seg[cpu_rm] == &ss && !op_ssegs)
op_ea_seg = &_ss;
@@ -877,7 +875,7 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
addbyte(0x89); /*MOV eaaddr, EAX*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
}
else
{
@@ -888,7 +886,7 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
new_eaaddr = fastreadl(cs + (*op_pc) + 1);
addbyte(0xC7); /*MOVL $new_eaaddr,(eaaddr)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
addlong(new_eaaddr);
(*op_pc) += 4;
return op_ea_seg;
@@ -919,14 +917,14 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
}
addbyte(0x89); /*MOV eaaddr, EAX*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
}
else
{
addbyte(0x44); /*MOV eaaddr, base_reg*/
addbyte(0x89);
addbyte(0x45 | (base_reg << 3));
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
}
}
return op_ea_seg;
@@ -1074,7 +1072,7 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
}
fetchdat = fastreadl(cs + op_pc);
codegen_timing_prefix(opcode, fetchdat);
- if (abrt)
+ if (cpu_state.abrt)
return;
opcode = fetchdat & 0xff;
if (!pc_off)
@@ -1095,18 +1093,16 @@ generate_call:
if (codegen_block_cycles)
{
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2c);
- addbyte(0x25);
- addlong((uint32_t)&cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
addlong((uint32_t)codegen_block_cycles);
codegen_block_cycles = 0;
}
if (codegen_block_ins)
{
addbyte(0x81); /*ADD $codegen_block_ins,ins*/
- addbyte(0x04);
- addbyte(0x25);
- addlong((uint32_t)&cpu_recomp_ins);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(cpu_recomp_ins));
addlong(codegen_block_ins);
codegen_block_ins = 0;
}
@@ -1147,7 +1143,7 @@ generate_call:
last_ssegs = op_ssegs;
addbyte(0xC6); /*MOVB $0,(ssegs)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.ssegs - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(ssegs));
addbyte(op_ssegs);
}
//#if 0
@@ -1166,7 +1162,7 @@ generate_call:
addbyte(0xC7); /*MOVL $rm | mod | reg,(rm_mod_reg_data)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.rm_data.rm_mod_reg_data - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(rm_data.rm_mod_reg_data));
addlong(cpu_rm | (cpu_mod << 8) | (cpu_reg << 16));
op_pc += pc_off;
@@ -1182,25 +1178,25 @@ generate_call:
// last_ea_seg = op_ea_seg;
addbyte(0xC7); /*MOVL $&_ds,(ea_seg)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.ea_seg - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(ea_seg));
addlong((uint32_t)op_ea_seg);
}
addbyte(0xC7); /*MOVL [pc],new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc + pc_off);
addbyte(0xC7); /*MOVL $old_pc,(oldpc)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(old_pc);
if (op_32 != last_op32)
{
last_op32 = op_32;
addbyte(0xC7); /*MOVL $use32,(op32)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.op32 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(op32));
addlong(op_32);
}
@@ -1221,15 +1217,4 @@ generate_call:
codegen_endpc = (cs + cpu_state.pc) + 8;
}
-void codegen_check_abrt()
-{
- codeblock_t *block = &codeblock[block_current];
-// pclog("Generate check abrt at %08X\n", &codeblock[block_current][block_pos]);
- addbyte(0xf7); addbyte(0x04); /*TESTL $-1, (abrt)*/
- addbyte(0x25);
- addlong((uint32_t)&abrt); addlong(0xffffffff);
- addbyte(0x0F); addbyte(0x85); /*JNZ 0*/
- addlong((uint32_t)&block->data[BLOCK_EXIT_OFFSET] - (uint32_t)(&block->data[block_pos + 4]));
-}
-
#endif
diff --git a/src/codegen_x86.c b/src/codegen_x86.c
index a368e8016..6bfa57020 100644
--- a/src/codegen_x86.c
+++ b/src/codegen_x86.c
@@ -333,8 +333,8 @@ void codegen_block_start_recompile(codeblock_t *block)
addbyte(0x83); /*SUBL $16,%esp*/
addbyte(0xEC);
addbyte(0x10);
- addbyte(0xBD); /*MOVL EBP, &EAX*/
- addlong((uint32_t)&EAX);
+ addbyte(0xBD); /*MOVL EBP, &cpu_state*/
+ addlong(((uintptr_t)&cpu_state) + 128);
// pclog("New block %i for %08X %03x\n", block_current, cs+pc, block_num);
@@ -446,15 +446,15 @@ void codegen_block_end_recompile(codeblock_t *block)
if (codegen_block_cycles)
{
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uint32_t)&cycles);
- addlong((uint32_t)codegen_block_cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
+ addlong(codegen_block_cycles);
}
if (codegen_block_ins)
{
addbyte(0x81); /*ADD $codegen_block_ins,ins*/
- addbyte(0x05);
- addlong((uint32_t)&cpu_recomp_ins);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(cpu_recomp_ins));
addlong(codegen_block_ins);
}
#if 0
@@ -550,7 +550,7 @@ int opcode_0f_modrm[256] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/
- 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /*a0*/
+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/
1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/
@@ -573,7 +573,7 @@ static x86seg *codegen_generate_ea_16_long(x86seg *op_ea_seg, uint32_t fetchdat,
{
addbyte(0xC7); /*MOVL $0,(ssegs)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
addlong((fetchdat >> 8) & 0xffff);
(*op_pc) += 2;
}
@@ -645,7 +645,7 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
{
addbyte(0x8b); /*MOVL regs[sib&7].l, %eax*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.regs[sib & 7].l - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
}
break;
case 1:
@@ -654,7 +654,7 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
addlong(new_eaaddr);
addbyte(0x03); /*ADDL regs[sib&7].l, %eax*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.regs[sib & 7].l - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
(*op_pc)++;
break;
case 2:
@@ -663,7 +663,7 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
addlong(new_eaaddr);
addbyte(0x03); /*ADDL regs[sib&7].l, %eax*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.regs[sib & 7].l - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(regs[sib & 7].l));
(*op_pc) += 4;
break;
}
@@ -681,20 +681,20 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
case 0:
addbyte(0x03); /*ADDL regs[sib&7].l, %eax*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.regs[(sib >> 3) & 7].l - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l));
break;
case 1:
- addbyte(0x8B); addbyte(0x5D); addbyte((uintptr_t)&cpu_state.regs[(sib >> 3) & 7].l - (uintptr_t)&cpu_state); /*MOVL armregs[RD],%ebx*/
+ addbyte(0x8B); addbyte(0x5D); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL armregs[RD],%ebx*/
addbyte(0x01); addbyte(0xD8); /*ADDL %ebx,%eax*/
addbyte(0x01); addbyte(0xD8); /*ADDL %ebx,%eax*/
break;
case 2:
- addbyte(0x8B); addbyte(0x5D); addbyte((uintptr_t)&cpu_state.regs[(sib >> 3) & 7].l - (uintptr_t)&cpu_state); /*MOVL armregs[RD],%ebx*/
+ addbyte(0x8B); addbyte(0x5D); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL armregs[RD],%ebx*/
addbyte(0xC1); addbyte(0xE3); addbyte(2); /*SHL $2,%ebx*/
addbyte(0x01); addbyte(0xD8); /*ADDL %ebx,%eax*/
break;
case 3:
- addbyte(0x8B); addbyte(0x5D); addbyte((uintptr_t)&cpu_state.regs[(sib >> 3) & 7].l - (uintptr_t)&cpu_state); /*MOVL armregs[RD],%ebx*/
+ addbyte(0x8B); addbyte(0x5D); addbyte(cpu_state_offset(regs[(sib >> 3) & 7].l)); /*MOVL armregs[RD],%ebx*/
addbyte(0xC1); addbyte(0xE3); addbyte(3); /*SHL $2,%ebx*/
addbyte(0x01); addbyte(0xD8); /*ADDL %ebx,%eax*/
break;
@@ -710,14 +710,14 @@ static x86seg *codegen_generate_ea_32_long(x86seg *op_ea_seg, uint32_t fetchdat,
new_eaaddr = fastreadl(cs + (*op_pc) + 1);
addbyte(0xC7); /*MOVL $new_eaaddr,(eaaddr)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.eaaddr - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(eaaddr));
addlong(new_eaaddr);
(*op_pc) += 4;
return op_ea_seg;
}
addbyte(0x8b); /*MOVL regs[sib&7].l, %eax*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.regs[cpu_rm].l - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(regs[cpu_rm].l));
// addbyte(0xa1); /*MOVL regs[cpu_rm].l, %eax*/
// addlong((uint32_t)&cpu_state.regs[cpu_rm].l);
cpu_state.eaaddr = cpu_state.regs[cpu_rm].l;
@@ -888,7 +888,7 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
}
fetchdat = fastreadl(cs + op_pc);
codegen_timing_prefix(opcode, fetchdat);
- if (abrt)
+ if (cpu_state.abrt)
return;
opcode = fetchdat & 0xff;
if (!pc_off)
@@ -910,16 +910,16 @@ generate_call:
if (codegen_block_cycles)
{
addbyte(0x81); /*SUB $codegen_block_cycles, cyclcs*/
- addbyte(0x2d);
- addlong((uint32_t)&cycles);
- addlong((uint32_t)codegen_block_cycles);
+ addbyte(0x6d);
+ addbyte(cpu_state_offset(_cycles));
+ addlong(codegen_block_cycles);
codegen_block_cycles = 0;
}
if (codegen_block_ins)
{
addbyte(0x81); /*ADD $codegen_block_ins,ins*/
- addbyte(0x05);
- addlong((uint32_t)&cpu_recomp_ins);
+ addbyte(0x45);
+ addbyte(cpu_state_offset(cpu_recomp_ins));
addlong(codegen_block_ins);
codegen_block_ins = 0;
}
@@ -961,7 +961,7 @@ generate_call:
addbyte(0xC6); /*MOVB [ssegs],op_ssegs*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.ssegs - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(ssegs));
addbyte(op_pc + pc_off);
}
@@ -980,7 +980,7 @@ generate_call:
addbyte(0xC7); /*MOVL $rm | mod | reg,(rm_mod_reg_data)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.rm_data.rm_mod_reg_data - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(rm_data.rm_mod_reg_data));
addlong(cpu_rm | (cpu_mod << 8) | (cpu_reg << 16));
op_pc += pc_off;
@@ -996,18 +996,18 @@ generate_call:
last_ea_seg = op_ea_seg;
addbyte(0xC7); /*MOVL $&_ds,(ea_seg)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.ea_seg - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(ea_seg));
addlong((uint32_t)op_ea_seg);
}
addbyte(0xC7); /*MOVL pc,new_pc*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.pc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(pc));
addlong(op_pc + pc_off);
addbyte(0xC7); /*MOVL $old_pc,(oldpc)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.oldpc - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(oldpc));
addlong(old_pc);
if (op_32 != last_op32)
@@ -1015,7 +1015,7 @@ generate_call:
last_op32 = op_32;
addbyte(0xC7); /*MOVL $use32,(op32)*/
addbyte(0x45);
- addbyte((uintptr_t)&cpu_state.op32 - (uintptr_t)&cpu_state);
+ addbyte(cpu_state_offset(op32));
addlong(op_32);
}
@@ -1042,14 +1042,4 @@ generate_call:
codegen_endpc = (cs + cpu_state.pc) + 8;
}
-void codegen_check_abrt()
-{
- codeblock_t *block = &codeblock[block_current];
-// pclog("Generate check abrt at %08X\n", &codeblock[block_current][block_pos]);
- addbyte(0x83); addbyte(0x3d); /*CMP abrt, 0*/
- addlong((uint32_t)&abrt); addbyte(0);
- addbyte(0x0F); addbyte(0x85); /*JNZ 0*/
- addlong((uint32_t)&block->data[BLOCK_EXIT_OFFSET] - (uint32_t)(&block->data[block_pos + 4]));
-}
-
#endif
diff --git a/src/disc.c b/src/disc.c
index 0a9d07882..31856a41a 100644
--- a/src/disc.c
+++ b/src/disc.c
@@ -7,6 +7,7 @@
#include "disc.h"
#include "disc_fdi.h"
#include "disc_img.h"
+#include "disc_86f.h"
#include "fdc.h"
#include "fdd.h"
#include "timer.h"
@@ -66,6 +67,7 @@ loaders[]=
{"144", img_load, img_close, -1},
{"360", img_load, img_close, -1},
{"720", img_load, img_close, -1},
+ {"86F", d86f_load, d86f_close, -1},
{"DSK", img_load, img_close, -1},
{"FLP", img_load, img_close, -1},
{"IMG", img_load, img_close, -1},
@@ -149,7 +151,7 @@ int disc_hole(int drive)
}
}
-int disc_byteperiod(int drive)
+double disc_byteperiod(int drive)
{
drive ^= fdd_swap;
@@ -159,20 +161,16 @@ int disc_byteperiod(int drive)
}
else
{
- return 32;
+ return 32.0;
}
}
double disc_real_period()
{
- int64_t dbp;
double ddbp;
double dusec;
- dbp = disc_byteperiod(disc_drivesel ^ fdd_swap);
- ddbp = (double) dbp;
-
- if (dbp == 26) ddbp = 160.0 / 6.0;
+ ddbp = disc_byteperiod(disc_drivesel ^ fdd_swap);
dusec = (double) TIMER_USEC;
diff --git a/src/disc.h b/src/disc.h
index 2d49d2401..808f64294 100644
--- a/src/disc.h
+++ b/src/disc.h
@@ -9,7 +9,7 @@ typedef struct
void (*readaddress)(int drive, int track, int side, int density);
void (*format)(int drive, int track, int side, int density, uint8_t fill);
int (*hole)(int drive);
- int (*byteperiod)(int drive);
+ double (*byteperiod)(int drive);
void (*stop)(int drive);
void (*poll)();
int (*realtrack)(int drive, int track);
@@ -32,7 +32,7 @@ void disc_readaddress(int drive, int track, int side, int density);
void disc_format(int drive, int track, int side, int density, uint8_t fill);
int disc_realtrack(int drive, int track);
int disc_hole(int drive);
-int disc_byteperiod(int drive);
+double disc_byteperiod(int drive);
void disc_stop(int drive);
int disc_empty(int drive);
void disc_set_rate(int drive, int drvden, int rate);
diff --git a/src/disc_86f.c b/src/disc_86f.c
index e9ed87d85..674cc5f07 100644
--- a/src/disc_86f.c
+++ b/src/disc_86f.c
@@ -3,11 +3,9 @@
*/
#include "ibm.h"
#include "disc.h"
-#include "disc_d86f.h"
+#include "disc_86f.h"
#include "fdd.h"
-/*Handling for 'sector based' image formats (like .IMG) as opposed to 'stream based' formats (eg .FDI)*/
-
#define MAX_SECTORS 256
typedef struct
@@ -20,13 +18,7 @@ typedef struct
static sector_t d86f_data[2][2][MAX_SECTORS];
static int d86f_count[2][2];
-int cur_track_pos[2] = {0, 0};
-int id_counter[2] = {0, 0};
-int data_counter[2] = {0, 0};
-int gap3_counter[2] = {0, 0};
-int cur_rate[2] = {0, 0};
-
-sector_t *last_sector[2];
+int d86f_cur_track_pos[2] = {0, 0};
enum
{
@@ -52,34 +44,27 @@ static int d86f_side[2] = {0, 0};
static int d86f_drive;
static int d86f_sector[2] = {0, 0};
static int d86f_n[2] = {0, 0};
-static int disc_intersector_delay[2] = {0, 0};
-static int disc_postdata_delay[2] = {0, 0};
-static int disc_track_delay[2] = {0, 0};
-static int disc_gap4_delay[2] = {0, 0};
static uint8_t d86f_fill[2] = {0, 0};
-static int cur_sector[2], cur_byte[2];
+static int cur_sector[2]/*, cur_byte[2]*/;
static int index_count[2];
+static int format_sector_count[2] = {0, 0};
-int raw_tsize[2] = {6250, 6250};
-int gap2_size[2] = {22, 22};
-int gap3_size[2] = {0, 0};
-int gap4_size[2] = {0, 0};
-
-int d86f_reset_state(int drive);
-
static struct
{
FILE *f;
- uint8_t track_data[2][50000];
- uint8_t track_layout[2][50000];
- uint8_t track_flags[2][256];
- uint32_t track_pos[2][256];
+ uint8_t disk_flags;
+ uint8_t track_data[2][25000];
+ uint8_t track_layout[2][25000];
+ uint8_t track_flags;
+ uint8_t track_in_file;
+ uint32_t track_pos[256];
+ uint16_t raw_track_size;
} d86f[2];
/* Needed for formatting! */
int d86f_realtrack(int drive, int track)
{
- if (!(d86f[drive].track_flags[track] & 0x40) && fdd_doublestep_40(drive))
+ if (!(d86f[drive].track_flags & 0x40) && fdd_doublestep_40(drive))
track /= 2;
return track;
@@ -87,10 +72,50 @@ int d86f_realtrack(int drive, int track)
void d86f_writeback(int drive, int track);
+static uint16_t CRCTable[256];
+
+static void d86f_setupcrc(uint16_t poly, uint16_t rvalue)
+{
+ int c = 256, bc;
+ uint16_t crctemp;
+
+ while(c--)
+ {
+ crctemp = c << 8;
+ bc = 8;
+
+ while(bc--)
+ {
+ if(crctemp & 0x8000)
+ {
+ crctemp = (crctemp << 1) ^ poly;
+ }
+ else
+ {
+ crctemp <<= 1;
+ }
+ }
+
+ CRCTable[c] = crctemp;
+ }
+}
+
+typedef union {
+ uint16_t word;
+ uint8_t bytes[2];
+} crc_t;
+
+static crc_t crc[2];
+
+static void d86f_calccrc(int drive, uint8_t byte)
+{
+ crc[drive].word = (crc[drive].word << 8) ^ CRCTable[(crc[drive].word >> 8)^byte];
+}
+
void d86f_init()
{
memset(d86f, 0, sizeof(d86f));
-// adl[0] = adl[1] = 0;
+ d86f_setupcrc(0x1021, 0xcdb4);
}
void d86f_load(int drive, char *fn)
@@ -99,6 +124,9 @@ void d86f_load(int drive, char *fn)
uint32_t len = 0;
uint16_t version = 0;
+ int i = 0;
+ int j = 0;
+
writeprot[drive] = 0;
d86f[drive].f = fopen(fn, "rb+");
if (!d86f[drive].f)
@@ -111,7 +139,7 @@ void d86f_load(int drive, char *fn)
fwriteprot[drive] = writeprot[drive];
fseek(d86f[drive].f, 0, SEEK_END);
- len = ftell(f);
+ len = ftell(d86f[drive].f);
fseek(d86f[drive].f, 0, SEEK_SET);
if (len < 52056)
@@ -123,9 +151,10 @@ void d86f_load(int drive, char *fn)
fread(&magic, 4, 1, d86f[drive].f);
- if (magic != 0x464236368)
+ if (magic != 0x46423638)
{
/* File is not of the valid format, abort. */
+ pclog("86F: Unrecognized magic bytes: %08X\n", magic);
fclose(d86f[drive].f);
return;
}
@@ -134,336 +163,103 @@ void d86f_load(int drive, char *fn)
if (version != 0x0100)
{
- /* File is not of a recognized format version. */
+ /* File is not of a recognized format version abort. */
+ pclog("86F: Unrecognized file version: %04X\n", version);
fclose(d86f[drive].f);
return;
}
- if (strcmp(ext, "fdi") == 0)
+ fread(&(d86f[drive].disk_flags), 1, 1, d86f[drive].f);
+
+ if (((d86f[drive].disk_flags >> 1) & 3) == 3)
{
- /* This is a Japanese FDI image, so let's read the header */
- pclog("d86f_load(): File is a Japanese FDI image...\n");
- fseek(d86f[drive].f, 0x10, SEEK_SET);
- fread(&bpb_bps, 1, 2, d86f[drive].f);
- fseek(d86f[drive].f, 0x0C, SEEK_SET);
- fread(&size, 1, 4, d86f[drive].f);
- bpb_total = size / bpb_bps;
- fseek(d86f[drive].f, 0x08, SEEK_SET);
- fread(&(d86f[drive].base), 1, 4, d86f[drive].f);
- fseek(d86f[drive].f, d86f[drive].base + 0x15, SEEK_SET);
- bpb_mid = fgetc(d86f[drive].f);
- if (bpb_mid < 0xF0) bpb_mid = 0xF0;
- fseek(d86f[drive].f, 0x14, SEEK_SET);
- bpb_sectors = fgetc(d86f[drive].f);
- fseek(d86f[drive].f, 0x18, SEEK_SET);
- bpb_sides = fgetc(d86f[drive].f);
-
- fdi = 1;
- }
- else
- {
- /* Read the BPB */
- pclog("d86f_load(): File is a raw image...\n");
- fseek(d86f[drive].f, 0x0B, SEEK_SET);
- fread(&bpb_bps, 1, 2, d86f[drive].f);
- fseek(d86f[drive].f, 0x13, SEEK_SET);
- fread(&bpb_total, 1, 2, d86f[drive].f);
- fseek(d86f[drive].f, 0x15, SEEK_SET);
- bpb_mid = fgetc(d86f[drive].f);
- fseek(d86f[drive].f, 0x18, SEEK_SET);
- bpb_sectors = fgetc(d86f[drive].f);
- fseek(d86f[drive].f, 0x1A, SEEK_SET);
- bpb_sides = fgetc(d86f[drive].f);
-
- d86f[drive].base = 0;
- fdi = 0;
-
- fseek(d86f[drive].f, -1, SEEK_END);
- size = ftell(d86f[drive].f) + 1;
+ /* Invalid disk hole. */
+ pclog("86F: Unrecognized disk hole type 3\n");
+ fclose(d86f[drive].f);
+ return;
}
- d86f[drive].sides = 2;
- d86f[drive].sector_size = 512;
-
- d86f[drive].hole = 0;
-
- pclog("BPB reports %i sides and %i bytes per sector\n", bpb_sides, bpb_bps);
-
- if (((bpb_sides < 1) || (bpb_sides > 2) || (bpb_bps < 128) || (bpb_bps > 2048)) && !fdi)
+ if (!writeprot[drive])
{
- /* The BPB is giving us a wacky number of sides and/or bytes per sector, therefore it is most probably
- not a BPB at all, so we have to guess the parameters from file size. */
-
- if (size <= (160*1024)) { d86f[drive].sectors = 8; d86f[drive].tracks = 40; d86f[drive].sides = 1; bit_rate_300 = 250; raw_tsize[drive] = 6250; }
- else if (size <= (180*1024)) { d86f[drive].sectors = 9; d86f[drive].tracks = 40; d86f[drive].sides = 1; bit_rate_300 = 250; raw_tsize[drive] = 6250; }
- else if (size <= (320*1024)) { d86f[drive].sectors = 8; d86f[drive].tracks = 40; bit_rate_300 = 250; raw_tsize[drive] = 6250; }
- else if (size <= (360*1024)) { d86f[drive].sectors = 9; d86f[drive].tracks = 40; bit_rate_300 = 250; raw_tsize[drive] = 6250; } /*Double density*/
- else if (size <= (640*1024)) { d86f[drive].sectors = 8; d86f[drive].tracks = 80; bit_rate_300 = 250; raw_tsize[drive] = 6250; } /*Double density 640k*/
- else if (size < (1024*1024)) { d86f[drive].sectors = 9; d86f[drive].tracks = 80; bit_rate_300 = 250; raw_tsize[drive] = 6250; } /*Double density*/
- else if (size <= 1228800) { d86f[drive].sectors = 15; d86f[drive].tracks = 80; bit_rate_300 = (500.0 * 300.0) / 360.0; raw_tsize[drive] = 10416; } /*High density 1.2MB*/
- else if (size <= 1261568) { d86f[drive].sectors = 8; d86f[drive].tracks = 77; d86f[drive].sector_size = 1024; bit_rate_300 = (500.0 * 300.0) / 360.0; raw_tsize[drive] = 10416; } /*High density 1.25MB Japanese format*/
- else if (size <= (0x1A4000-1)) { d86f[drive].sectors = 18; d86f[drive].tracks = 80; bit_rate_300 = 500; raw_tsize[drive] = 12500; } /*High density (not supported by Tandy 1000)*/
- else if (size <= 1556480) { d86f[drive].sectors = 19; d86f[drive].tracks = 80; bit_rate_300 = 500; raw_tsize[drive] = 12500; } /*High density (not supported by Tandy 1000)*/
- else if (size <= 1638400) { d86f[drive].sectors = 10; d86f[drive].tracks = 80; d86f[drive].sector_size = 1024; bit_rate_300 = 500; raw_tsize[drive] = 12500; } /*High density (not supported by Tandy 1000)*/
- // else if (size == 1884160) { d86f[drive].sectors = 23; d86f[drive].tracks = 80; bit_rate_300 = 500; } /*XDF format - used by OS/2 Warp*/
- // else if (size == 1763328) { d86f[drive].sectors = 21; d86f[drive].tracks = 82; bit_rate_300 = 500; } /*XDF format - used by OS/2 Warp*/
- else if (size <= 2000000) { d86f[drive].sectors = 21; d86f[drive].tracks = 80; bit_rate_300 = 500; raw_tsize[drive] = 12500; } /*DMF format - used by Windows 95 - changed by OBattler to 2000000, ie. the real unformatted capacity @ 500 kbps and 300 rpm */
- else if (size <= 2949120) { d86f[drive].sectors = 36; d86f[drive].tracks = 80; bit_rate_300 = 1000; raw_tsize[drive] = 25000; } /*E density*/
-
- temp_rate = 2;
- bpb_bps = d86f[drive].sector_size;
- bpt = bpb_bps * d86f[drive].sectors;
- if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][0] * bpb_bps))
- {
- temp_rate = 2;
- raw_tsize[drive] = 5208;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][1] * bpb_bps))
- {
- temp_rate = 2;
- raw_tsize[drive] = 6250;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][2] * bpb_bps))
- {
- temp_rate = 1;
- raw_tsize[drive] = 7500;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][3] * bpb_bps))
- {
- if (bpb_bps == 512) max_spt = (bit_rate_300 == 500) ? 21 : 17;
- temp_rate = (bit_rate_300 == 500) ? 0 : 4;
- raw_tsize[drive] = (bit_rate_300 == 500) ? 12500 : 10416;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][4] * bpb_bps))
- {
- if (bpb_bps == 512) max_spt = 21;
- pclog("max_spt is %i\n", max_spt);
- temp_rate = 0;
- raw_tsize[drive] = 12500;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][5] * bpb_bps))
- {
- if (bpb_bps == 512) max_spt = 41;
- temp_rate = 3;
- raw_tsize[drive] = 25000;
- }
- else /* Image too big, eject */
- {
- pclog("Image is bigger than can fit on an ED floppy, ejecting...\n");
- fclose(d86f[drive].f);
- return;
- }
-
- pclog("Temporary rate: %i (%i bytes per track)\n", temp_rate, bpt);
-
- d86f[drive].xdf_type = 0;
- }
- else
- {
- /* The BPB readings appear to be valid, so let's set the values. */
- /* Number of tracks = number of total sectors divided by sides times sectors per track. */
- if (fdi)
- {
- /* The image is a Japanese FDI, therefore we read the number of tracks from the header. */
- fseek(d86f[drive].f, 0x1C, SEEK_SET);
- fread(&(d86f[drive].tracks), 1, 4, d86f[drive].f);
- }
- else
- {
- d86f[drive].tracks = ((uint32_t) bpb_total) / (((uint32_t) bpb_sides) * ((uint32_t) bpb_sectors));
- }
- /* The rest we just set directly from the BPB. */
- d86f[drive].sectors = bpb_sectors;
- d86f[drive].sides = bpb_sides;
- /* The sector size. */
- d86f[drive].sector_size = bpb_bps;
- /* Now we calculate bytes per track, which is bpb_sectors * bpb_bps. */
- bpt = (uint32_t) bpb_sectors * (uint32_t) bpb_bps;
- /* Now we should be able to calculate the bit rate. */
- pclog("The image has %i bytes per track\n", bpt);
-
- temp_rate = 2;
- if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][0] * bpb_bps))
- {
- bit_rate_300 = ((250.0 * 300.0) / 360.0);
- temp_rate = 2;
- raw_tsize[drive] = 5208;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][1] * bpb_bps))
- {
- bit_rate_300 = 250;
- temp_rate = 2;
- raw_tsize[drive] = 6250;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][2] * bpb_bps))
- {
- bit_rate_300 = 300;
- temp_rate = 1;
- raw_tsize[drive] = 7500;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][3] * bpb_bps))
- {
- bit_rate_300 = (bpb_mid == 0xF0) ? 500 : ((500.0 * 300.0) / 360.0);
- if (bpb_bps == 512) max_spt = (bit_rate_300 == 500) ? 21 : 17;
- temp_rate = (bit_rate_300 == 500) ? 0 : 4;
- raw_tsize[drive] = (bit_rate_300 == 500) ? 12500 : 10416;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][4] * bpb_bps))
- {
- bit_rate_300 = 500;
- if (bpb_bps == 512) max_spt = 21;
- pclog("max_spt is %i\n", max_spt);
- temp_rate = 0;
- raw_tsize[drive] = 12500;
- }
- else if (bpt <= (maximum_sectors[sector_size_code(bpb_bps)][5] * bpb_bps))
- {
- bit_rate_300 = 1000;
- if (bpb_bps == 512) max_spt = 41;
- temp_rate = 3;
- raw_tsize[drive] = 25000;
- }
- else /* Image too big, eject */
- {
- pclog("Image is bigger than can fit on an ED floppy, ejecting...\n");
- fclose(d86f[drive].f);
- return;
- }
-
- if (bpb_bps == 512) /* BPB reports 512 bytes per sector, let's see if it's XDF or not */
- {
- if (bit_rate_300 <= 300) /* Double-density disk, not XDF */
- {
- d86f[drive].xdf_type = 0;
- }
- else
- {
- pclog("bpb_sectors is %i\n", bpb_sectors);
- if (bpb_sectors > max_spt)
- {
- switch(bpb_sectors)
- {
- case 19: /* High density XDF @ 360 rpm */
- d86f[drive].xdf_type = 1;
- break;
- case 23: /* High density XDF @ 300 rpm */
- d86f[drive].xdf_type = 2;
- pclog("XDF type is 2 @ %i kbps\n", bit_rate_300);
- break;
-#if 0
- case 24: /* High density XXDF @ 300 rpm */
- d86f[drive].xdf_type = 4;
- break;
-#endif
- case 46: /* Extended density XDF */
- d86f[drive].xdf_type = 3;
- break;
-#if 0
- case 48: /* Extended density XXDF */
- d86f[drive].xdf_type = 5;
- break;
-#endif
- default: /* Unknown, as we're beyond maximum sectors, get out */
- fclose(d86f[drive].f);
- return;
- }
- }
- else /* Amount of sectors per track that fits into a track, therefore not XDF */
- {
- d86f[drive].xdf_type = 0;
- }
- }
- }
- else /* BPB reports sector size other than 512, can't possibly be XDF */
- {
- d86f[drive].xdf_type = 0;
- }
- }
-
- gap2_size[drive] = (temp_rate == 3) ? 41 : 22;
- pclog("GAP2 size: %i bytes\n", gap2_size[drive]);
- gap3_size[drive] = gap3_sizes[temp_rate][sector_size_code(d86f[drive].sector_size)][d86f[drive].sectors];
- if (gap3_size)
- {
- pclog("GAP3 size: %i bytes\n", gap3_size[drive]);
- }
- else
- {
- // fclose(d86f[drive].f);
- gap3_size[drive] = 40;
- pclog("WARNING: Floppy image of unknown format was inserted into drive %c:!\n", drive + 0x41);
- }
- gap4_size[drive] = raw_tsize[drive] - (((pre_gap + gap2_size[drive] + pre_data + d86f[drive].sector_size + post_gap + gap3_size[drive]) * d86f[drive].sectors) + pre_track);
- pclog("GAP4 size: %i bytes\n", gap4_size[drive]);
- if (d86f[drive].xdf_type)
- {
- gap4_size[drive] = 1;
- }
-
- if (bit_rate_300 == 250)
- {
- d86f[drive].hole = 0;
- /* If drive does not support 300 RPM, the medium is to be read at a period of 26 (300 kbps). */
- d86f[drive].byte_period = 29;
- }
- else if (bit_rate_300 == 300)
- {
- d86f[drive].hole = 0;
- d86f[drive].byte_period = 26;
- }
- else if (bit_rate_300 == 1000)
- {
- d86f[drive].hole = 2;
- d86f[drive].byte_period = 8;
- }
- else if (bit_rate_300 < 250)
- {
- d86f[drive].hole = 0;
- d86f[drive].byte_period = 32;
- }
- else
- {
- d86f[drive].hole = 1;
- d86f[drive].byte_period = 16;
- }
-
- if (d86f[drive].xdf_type) /* In case of XDF-formatted image, write-protect */
- {
- writeprot[drive] = 1;
+ writeprot[drive] = (d86f[drive].disk_flags & 0x10) ? 1 : 0;
fwriteprot[drive] = writeprot[drive];
}
+ fread(d86f[drive].track_pos, 1, 1024, d86f[drive].f);
+
+ if (!(d86f[drive].track_pos[0]))
+ {
+ /* File has no track 0, abort. */
+ pclog("86F: No Track 0\n");
+ fclose(d86f[drive].f);
+ return;
+ }
+
+ /* Load track 0 flags as default. */
+ fseek(d86f[drive].f, d86f[drive].track_pos[0], SEEK_SET);
+ fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
+ fseek(d86f[drive].f, 0, SEEK_SET);
+
drives[drive].seek = d86f_seek;
- drives[drive].readsector = disc_sector_readsector;
- drives[drive].writesector = disc_sector_writesector;
- drives[drive].readaddress = disc_sector_readaddress;
+ drives[drive].readsector = d86f_readsector;
+ drives[drive].writesector = d86f_writesector;
+ drives[drive].readaddress = d86f_readaddress;
drives[drive].hole = d86f_hole;
drives[drive].byteperiod = d86f_byteperiod;
- drives[drive].poll = disc_sector_poll;
- drives[drive].format = disc_sector_format;
+ drives[drive].poll = d86f_poll;
+ drives[drive].format = d86f_format;
drives[drive].realtrack = d86f_realtrack;
- drives[drive].stop = disc_sector_stop;
- disc_sector_writeback[drive] = d86f_writeback;
-
- d86f[drive].bitcell_period_300rpm = 1000000.0 / bit_rate_300*2.0;
- pclog("bit_rate_300=%g\n", bit_rate_300);
- pclog("bitcell_period_300=%g\n", d86f[drive].bitcell_period_300rpm);
-// d86f[drive].bitcell_period_300rpm = disc_get_bitcell_period(d86f[drive].rate);
- pclog("d86f_load %d %p sectors=%i tracks=%i sides=%i sector_size=%i hole=%i\n", drive, drives, d86f[drive].sectors, d86f[drive].tracks, d86f[drive].sides, d86f[drive].sector_size, d86f[drive].hole);
+ drives[drive].stop = d86f_stop;
}
int d86f_hole(int drive)
{
- return d86f[drive].hole;
+ return (d86f[drive].disk_flags >> 1) & 3;
}
-int d86f_byteperiod(int drive)
+double d86f_byteperiod(int drive)
{
- if (d86f[drive].byte_period == 29)
+ switch (d86f[drive].track_flags & 0x0f)
{
- return (fdd_get_type(drive) & 1) ? 32 : 26;
+ case 0x02: /* 125 kbps, FM */
+ if (!(d86f[drive].track_flags & 0x20))
+ {
+ /* 300 rpm, 125 kbps = 360 rpm, 150 kbps; so we do this trick for 360 rpm-only drives to accept them. */
+ return ((fdd_get_type(drive) & 3) == 2) ? (320.0 / 6.0) : 64.0;
+ }
+ return 64.0;
+ case 0x01: /* 150 kbps, FM */
+ if (d86f[drive].track_flags & 0x20)
+ {
+ /* 360 rpm, 150 kbps = 300 rpm, 125 kbps; so we do this trick for 300 rpm-only drives to accept them. */
+ return ((fdd_get_type(drive) & 3) == 1) ? 64.0 : (320.0 / 6.0);
+ }
+ return 320.0 / 6.0;
+ case 0x0A: /* 250 kbps, MFM */
+ case 0x00: /* 250 kbps, FM */
+ if (!(d86f[drive].track_flags & 0x20))
+ {
+ /* 300 rpm, 250 kbps = 360 rpm, 300 kbps; so we do this trick for 360 rpm-only drives to accept them. */
+ return ((fdd_get_type(drive) & 3) == 2) ? (160.0 / 6.0) : 32.0;
+ }
+ return 32.0;
+ case 0x09: /* 300 kbps, MFM */
+ if (d86f[drive].track_flags & 0x20)
+ {
+ /* 360 rpm, 300 kbps = 300 rpm, 250 kbps; so we do this trick for 300 rpm-only drives to accept them. */
+ return ((fdd_get_type(drive) & 3) == 1) ? 32.0 : (160.0 / 6.0);
+ }
+ return 160.0 / 6.0;
+ case 0x08: /* 500 kbps, MFM */
+ return 16.0;
+ case 0x0B: /* 1000 kbps, MFM */
+ return 8.0;
+ case 0x0D: /* 2000 kbps, MFM */
+ return 4.0;
+ default:
+ return 32.0;
}
- return d86f[drive].byte_period;
+ return 32.0;
}
void d86f_close(int drive)
@@ -473,175 +269,138 @@ void d86f_close(int drive)
d86f[drive].f = NULL;
}
+char track_layout[2][2][25512];
+
+int id_positions[2][2][MAX_SECTORS];
+
+/* 0 = MFM, 1 = FM, 2 = MFM perpendicular, 3 = reserved */
+/* 4 = ISO, 0 = IBM */
+int d86f_media_type = 0;
+
+/* Bits 0-3 define byte type, bit 5 defines whether it is a per-track (0) or per-sector (1) byte, if bit 7 is set, the byte is the index hole. */
+#define BYTE_GAP0 0x00
+#define BYTE_GAP1 0x10
+#define BYTE_GAP4 0x20
+#define BYTE_GAP2 0x40
+#define BYTE_GAP3 0x50
+#define BYTE_I_SYNC 0x01
+#define BYTE_ID_SYNC 0x41
+#define BYTE_DATA_SYNC 0x51
+#define BYTE_IAM_SYNC 0x02
+#define BYTE_IDAM_SYNC 0x42
+#define BYTE_DATAAM_SYNC 0x52
+#define BYTE_IAM 0x03
+#define BYTE_IDAM 0x43
+#define BYTE_DATAAM 0x53
+#define BYTE_ID 0x44
+#define BYTE_DATA 0x54
+#define BYTE_ID_CRC 0x45
+#define BYTE_DATA_CRC 0x55
+
+#define BYTE_INDEX_HOLE 0x80 /* 1 = index hole, 0 = regular byte */
+#define BYTE_IS_SECTOR 0x40 /* 1 = per-sector, 0 = per-track */
+#define BYTE_IS_POST_TRACK 0x20 /* 1 = after all sectors, 0 = before or during all sectors */
+#define BYTE_IS_DATA 0x10 /* 1 = data, 0 = id */
+#define BYTE_TYPE 0x0F /* 5 = crc, 4 = data, 3 = address mark, 2 = address mark sync, 1 = sync, 0 = gap */
+
+#define BYTE_TYPE_GAP 0x00
+#define BYTE_TYPE_SYNC 0x01
+#define BYTE_TYPE_AM_SYNC 0x02
+#define BYTE_TYPE_AM 0x03
+#define BYTE_TYPE_DATA 0x04
+#define BYTE_TYPE_CRC 0x05
+
+int d86f_get_sides(int drive)
+{
+ return (d86f[drive].disk_flags & 8) ? 2 : 1;
+}
+
+int d86f_is_40_track(int drive)
+{
+ return !(d86f[drive].disk_flags & 1);
+}
+
+int d86f_is_mfm(int drive)
+{
+ return (d86f[drive].track_flags & 8) ? 1 : 0;
+}
+
+uint16_t d86f_get_raw_size(int drive)
+{
+ double rate = 0.0;
+ int mfm = d86f_is_mfm(drive);
+ double rpm = (d86f[drive].track_flags & 0x20) ? 360.0 : 300.0;
+ double size = 6250.0;
+ switch (d86f[drive].track_flags & 7)
+ {
+ case 0:
+ rate = 500.0;
+ break;
+ case 1:
+ rate = 300.0;
+ break;
+ case 2:
+ rate = 250.0;
+ break;
+ case 3:
+ rate = 1000.0;
+ break;
+ case 5:
+ rate = 2000.0;
+ break;
+ }
+ if (!mfm) rate /= 2.0;
+ size = (size / 250.0) * rate;
+ size = (size * 300.0) / rpm;
+ return (uint16_t) size;
+}
+
void d86f_seek(int drive, int track)
{
+ int sides = d86f_get_sides(drive);
int side;
- int current_xdft = d86f[drive].xdf_type - 1;
- uint8_t sectors_fat, effective_sectors, sector_gap; /* Needed for XDF */
-
- int sector, current_pos, sh, sr, spos, sside;
-
- if (!d86f[drive].f)
- return;
- // pclog("Seek drive=%i track=%i sectors=%i sector_size=%i sides=%i\n", drive, track, d86f[drive].sectors,d86f[drive].sector_size, d86f[drive].sides);
-// pclog(" %i %i\n", drive_type[drive], d86f[drive].tracks);
-#ifdef MAINLINE
- if ((d86f[drive].tracks <= 41) && fdd_doublestep_40(drive))
-#else
- if ((d86f[drive].tracks <= 43) && fdd_doublestep_40(drive))
-#endif
+ if (d86f_is_40_track(drive) && fdd_doublestep_40(drive))
track /= 2;
- // pclog("Disk seeked to track %i\n", track);
- disc_track[drive] = track;
+ memset(d86f[drive].track_layout[0], BYTE_GAP4, 25000);
+ memset(d86f[drive].track_data[0], 0xFF, 25000);
- if (d86f[drive].sides == 2)
- {
- fseek(d86f[drive].f, d86f[drive].base + (track * d86f[drive].sectors * d86f[drive].sector_size * 2), SEEK_SET);
- // pclog("Seek: Current file position (H0) is: %08X\n", ftell(d86f[drive].f));
- fread(d86f[drive].track_data[0], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- // pclog("Seek: Current file position (H1) is: %08X\n", ftell(d86f[drive].f));
- fread(d86f[drive].track_data[1], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- }
- else
- {
- fseek(d86f[drive].f, d86f[drive].base + (track * d86f[drive].sectors * d86f[drive].sector_size), SEEK_SET);
- fread(d86f[drive].track_data[0], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- }
-
- disc_sector_reset(drive, 0);
- disc_sector_reset(drive, 1);
-
- if (d86f[drive].xdf_type)
+ if (d86f_get_sides(drive) == 2)
{
- sectors_fat = xdf_track0[current_xdft][0];
- effective_sectors = xdf_track0[current_xdft][1];
- sector_gap = xdf_track0[current_xdft][2];
+ memset(d86f[drive].track_layout[1], BYTE_GAP4, 25000);
+ memset(d86f[drive].track_data[1], 0xFF, 25000);
+ }
- if (!track)
- {
- /* Track 0, register sectors according to track 0 layout. */
- current_pos = 0;
- for (sector = 0; sector < (d86f[drive].sectors * 2); sector++)
- {
- if (xdf_track0_layout[current_xdft][sector])
- {
- sh = xdf_track0_layout[current_xdft][sector] & 0xFF;
- sr = xdf_track0_layout[current_xdft][sector] >> 8;
- spos = current_pos;
- sside = 0;
- if (spos > (d86f[drive].sectors * d86f[drive].sector_size))
- {
- spos -= (d86f[drive].sectors * d86f[drive].sector_size);
- sside = 1;
- }
- disc_sector_add(drive, sh, track, sh, sr, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[sside][spos]);
- }
- current_pos += 512;
- }
-#if 0
- /* Track 0, register sectors according to track 0 map. */
- /* First, the "Side 0" buffer, will also contain one sector from side 1. */
- current_pos = 0;
- for (sector = 0; sector < sectors_fat; sector++)
- {
- if ((sector+0x81) >= 0x91)
- {
- disc_sector_add(drive, 0, track, 0, sector+0x85, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- }
- else
- {
- disc_sector_add(drive, 0, track, 0, sector+0x81, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- }
- current_pos += 512;
- }
- disc_sector_add(drive, 1, track, 1, 0x81, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- for (sector = 0; sector < 7; sector++)
- {
- disc_sector_add(drive, 0, track, 0, sector+1, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- }
- disc_sector_add(drive, 0, track, 0, 0x9B, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9C, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9D, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9E, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += 512;
- /* Now the "Side 1" buffer, will also contain one sector from side 0. */
- current_pos = 0;
- for (sector = 0; (sector < effective_sectors - 1); sector++)
- {
- disc_sector_add(drive, 1, track, 1, sector+0x82, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[1][current_pos]);
- current_pos += 512;
- }
- disc_sector_add(drive, 0, track, 0, 8, 2,
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[1][current_pos]);
- current_pos += 512;
-#endif
- }
- else
- {
- /* Non-zero track, this will have sectors of various sizes. */
- /* First, the "Side 0" buffer. */
- current_pos = 0;
- for (sector = 0; sector < xdf_spt[current_xdft]; sector++)
- {
- disc_sector_add(drive, xdf_map[current_xdft][sector][0], track, xdf_map[current_xdft][sector][0],
- xdf_map[current_xdft][sector][2] + 0x80, xdf_map[current_xdft][sector][2],
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[0][current_pos]);
- current_pos += (128 << xdf_map[current_xdft][sector][2]);
- }
- /* Then, the "Side 1" buffer. */
- current_pos = 0;
- for (sector = xdf_spt[current_xdft]; sector < (xdf_spt[current_xdft] << 1); sector++)
- {
- disc_sector_add(drive, xdf_map[current_xdft][sector][0], track, xdf_map[current_xdft][sector][0],
- xdf_map[current_xdft][sector][2] + 0x80, xdf_map[current_xdft][sector][2],
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[1][current_pos]);
- current_pos += (128 << xdf_map[current_xdft][sector][2]);
- }
- }
- }
- else
- {
- for (side = 0; side < d86f[drive].sides; side++)
- {
- for (sector = 0; sector < d86f[drive].sectors; sector++)
- disc_sector_add(drive, side, track, side, sector+1, d86f_sector_size_code(drive),
- d86f[drive].bitcell_period_300rpm,
- &d86f[drive].track_data[side][sector * d86f[drive].sector_size]);
- }
- }
- for (side = d86f[drive].sides - 1; side >= 0; side--)
+ if (!(d86f[drive].track_pos[track]))
{
- disc_sector_prepare_track_layout(drive, side);
+ /* Track does not exist in the image, initialize it as unformatted. */
+ d86f[drive].track_in_file = 0;
+ d86f[drive].track_flags = 0x0A; /* 300 rpm, MFM, 250 kbps */
+
+ d86f[drive].raw_track_size = 6250;
+ return;
+ }
+
+ d86f[drive].track_in_file = 1;
+
+ fseek(d86f[drive].f, d86f[drive].track_pos[track], SEEK_SET);
+
+ fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
+
+ d86f[drive].raw_track_size = d86f_get_raw_size(drive);
+
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 2, SEEK_SET);
+ fread(d86f[drive].track_layout[0], 1, d86f[drive].raw_track_size, d86f[drive].f);
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 25002, SEEK_SET);
+ fread(d86f[drive].track_data[0], 1, d86f[drive].raw_track_size, d86f[drive].f);
+
+ if (d86f_get_sides(drive) == 2)
+ {
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 50002, SEEK_SET);
+ fread(d86f[drive].track_layout[1], 1, d86f[drive].raw_track_size, d86f[drive].f);
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 75002, SEEK_SET);
+ fread(d86f[drive].track_data[1], 1, d86f[drive].raw_track_size, d86f[drive].f);
}
}
@@ -650,20 +409,25 @@ void d86f_writeback(int drive, int track)
if (!d86f[drive].f)
return;
- if (d86f[drive].xdf_type)
+ if (!d86f[drive].track_in_file)
return; /*Should never happen*/
- if (d86f[drive].sides == 2)
- {
- fseek(d86f[drive].f, d86f[drive].base + (track * d86f[drive].sectors * d86f[drive].sector_size * 2), SEEK_SET);
- fwrite(d86f[drive].track_data[0], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- fwrite(d86f[drive].track_data[1], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- }
- else
- {
- fseek(d86f[drive].f, d86f[drive].base + (track * d86f[drive].sectors * d86f[drive].sector_size), SEEK_SET);
- fwrite(d86f[drive].track_data[0], d86f[drive].sectors * d86f[drive].sector_size, 1, d86f[drive].f);
- }
+ fseek(d86f[drive].f, d86f[drive].track_pos[track], SEEK_SET);
+
+ fwrite(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
+
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 2, SEEK_SET);
+ fwrite(d86f[drive].track_layout[0], 1, d86f[drive].raw_track_size, d86f[drive].f);
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 25002, SEEK_SET);
+ fwrite(d86f[drive].track_data[0], 1, d86f[drive].raw_track_size, d86f[drive].f);
+
+ if (d86f_get_sides(drive) == 2)
+ {
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 50002, SEEK_SET);
+ fwrite(d86f[drive].track_layout[1], 1, d86f[drive].raw_track_size, d86f[drive].f);
+ fseek(d86f[drive].f, d86f[drive].track_pos[track] + 75002, SEEK_SET);
+ fwrite(d86f[drive].track_data[1], 1, d86f[drive].raw_track_size, d86f[drive].f);
+ }
}
void d86f_reset(int drive, int side)
@@ -672,47 +436,61 @@ void d86f_reset(int drive, int side)
if (side == 0)
{
- d86f_reset_state(drive);
- // cur_track_pos[drive] = 0;
+ index_count[drive] = 0;
d86f_state[drive] = STATE_SEEK;
}
}
-void d86f_add(int drive, int side, uint8_t c, uint8_t h, uint8_t r, uint8_t n, int rate, uint8_t *data)
-{
- sector_t *s = &d86f_data[drive][side][d86f_count[drive][side]];
-//pclog("d86f_add: drive=%i side=%i %i r=%i\n", drive, side, d86f_count[drive][side],r );
- if (d86f_count[drive][side] >= MAX_SECTORS)
- return;
-
- s->c = c;
- s->h = h;
- s->r = r;
- s->n = n;
- // pclog("Adding sector: %i %i %i %i\n", c, h, r, n);
- s->rate = rate;
- s->data = data;
-
- d86f_count[drive][side]++;
-}
-
static int get_bitcell_period(int drive)
{
- // return (d86f_data[drive][d86f_side[drive]][cur_sector[drive]].rate * 300) / fdd_getrpm(drive);
- return ((&d86f_data[drive][0][0])->rate * 300) / fdd_getrpm(drive);
- return (cur_rate[drive] * 300) / fdd_getrpm(drive);
+ double rate = 0.0;
+ int mfm = (d86f[drive].track_flags & 8) ? 1 : 0;
+ double rpm = (d86f[drive].track_flags & 0x20) ? 360.0 : 300.0;
+ double size = 8000.0;
+ switch (d86f[drive].track_flags & 7)
+ {
+ case 0:
+ rate = 500.0;
+ break;
+ case 1:
+ rate = 300.0;
+ break;
+ case 2:
+ rate = 250.0;
+ break;
+ case 3:
+ rate = 1000.0;
+ break;
+ case 5:
+ rate = 2000.0;
+ break;
+ }
+ if (!mfm) rate /= 2.0;
+ size = (size * 250.0) / rate;
+ size = (size * 300.0) / rpm;
+ size = (size * fdd_getrpm(drive)) / 300.0;
+ return (int) size;
}
void d86f_readsector(int drive, int sector, int track, int side, int rate, int sector_size)
{
- // pclog("d86f_readsector: fdc_period=%i d86f_period=%i rate=%i sector=%i track=%i side=%i\n", fdc_get_bitcell_period(), get_bitcell_period(drive), rate, sector, track, side);
+ // pclog("d86f_readsector: fdc_period=%i img_period=%i rate=%i sector=%i track=%i side=%i\n", fdc_get_bitcell_period(), get_bitcell_period(drive), rate, sector, track, side);
d86f_track[drive] = track;
d86f_side[drive] = side;
+
+ if (side && (d86f_get_sides(drive) == 1))
+ {
+ fdc_notfound();
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ return;
+ }
+
d86f_drive = drive;
d86f_sector[drive] = sector;
d86f_n[drive] = sector_size;
- d86f_reset_state(drive);
+ index_count[drive] = 0;
if (sector == SECTOR_FIRST)
d86f_state[drive] = STATE_READ_FIND_FIRST_SECTOR;
else if (sector == SECTOR_NEXT)
@@ -723,36 +501,146 @@ void d86f_readsector(int drive, int sector, int track, int side, int rate, int s
void d86f_writesector(int drive, int sector, int track, int side, int rate, int sector_size)
{
-// pclog("d86f_writesector: fdc_period=%i d86f_period=%i rate=%i\n", fdc_get_bitcell_period(), get_bitcell_period(), rate);
+ // pclog("d86f_writesector: fdc_period=%i img_period=%i rate=%i\n", fdc_get_bitcell_period(), get_bitcell_period(drive), rate);
d86f_track[drive] = track;
d86f_side[drive] = side;
+
+ if (side && (d86f_get_sides(drive) == 1))
+ {
+ fdc_notfound();
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ return;
+ }
+
d86f_drive = drive;
d86f_sector[drive] = sector;
d86f_n[drive] = sector_size;
- d86f_reset_state(drive);
+ index_count[drive] = 0;
d86f_state[drive] = STATE_WRITE_FIND_SECTOR;
}
void d86f_readaddress(int drive, int track, int side, int rate)
{
-// pclog("d86f_readaddress: fdc_period=%i d86f_period=%i rate=%i track=%i side=%i\n", fdc_get_bitcell_period(), get_bitcell_period(), rate, track, side);
+ // pclog("d86f_readaddress: fdc_period=%i img_period=%i rate=%i track=%i side=%i\n", fdc_get_bitcell_period(), get_bitcell_period(drive), rate, track, side);
d86f_track[drive] = track;
d86f_side[drive] = side;
+
+ if (side && (d86f_get_sides(drive) == 1))
+ {
+ fdc_notfound();
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ return;
+ }
+
d86f_drive = drive;
- d86f_reset_state(drive);
+ index_count[drive] = 0;
d86f_state[drive] = STATE_READ_FIND_ADDRESS;
}
+int d86f_is_iso(int drive)
+{
+ return 0; /* Currently, we always use the IBM format, not ISO. */
+}
+
+void d86f_prepare_track_layout(int drive, int side)
+{
+ int i = 0;
+ int j = 0;
+ int real_gap0_len = d86f_is_mfm(drive) ? 80 : 40;
+ int sync_len = d86f_is_mfm(drive) ? 12 : 6;
+ int am_len = d86f_is_mfm(drive) ? 4 : 1;
+ int real_gap1_len = d86f_is_mfm(drive) ? 50 : 26;
+ int real_gap2_len = (fdc_get_bit_rate() >= 1000) ? 41 : 22;
+ int real_gap3_len = fdc_get_gap();
+ memset(d86f[drive].track_layout[side], BYTE_GAP4, d86f_get_raw_size(drive));
+ i = 0;
+ if (!(d86f_is_iso(drive)))
+ {
+ memset(d86f[drive].track_layout[side] + i, BYTE_GAP0, real_gap0_len);
+ i += real_gap0_len;
+ memset(d86f[drive].track_layout[side] + i, BYTE_I_SYNC, sync_len);
+ i += sync_len;
+ if (d86f_is_mfm(drive))
+ {
+ memset(d86f[drive].track_layout[side] + i, BYTE_IAM_SYNC, 3);
+ i += 3;
+ }
+ memset(d86f[drive].track_layout[side] + i, BYTE_IAM, 1);
+ i++;
+ memset(d86f[drive].track_layout[side] + i, BYTE_GAP1, real_gap1_len);
+ i += real_gap1_len;
+ }
+ else
+ {
+ memset(d86f[drive].track_layout[side] + i, BYTE_GAP1, real_gap1_len);
+ i += real_gap1_len;
+ }
+ d86f[drive].track_layout[side][0] |= BYTE_INDEX_HOLE;
+ for (j = 0; j < fdc_get_format_sectors(); j++)
+ {
+ // pclog("Sector %i (%i)\n", j, s->n);
+ memset(d86f[drive].track_layout[side] + i, BYTE_ID_SYNC, sync_len);
+ i += sync_len;
+ if (d86f_is_mfm(drive))
+ {
+ memset(d86f[drive].track_layout[side] + i, BYTE_IDAM_SYNC, 3);
+ i += 3;
+ }
+ memset(d86f[drive].track_layout[side] + i, BYTE_IDAM, 1);
+ i++;
+ memset(d86f[drive].track_layout[side] + i, BYTE_ID, 4);
+ i += 4;
+ memset(d86f[drive].track_layout[side] + i, BYTE_ID_CRC, 2);
+ i += 2;
+ memset(d86f[drive].track_layout[side] + i, BYTE_GAP2, real_gap2_len);
+ i += real_gap2_len;
+ memset(d86f[drive].track_layout[side] + i, BYTE_DATA_SYNC, sync_len);
+ i += sync_len;
+ if (d86f_is_mfm(drive))
+ {
+ memset(d86f[drive].track_layout[side] + i, BYTE_DATAAM_SYNC, 3);
+ i += 3;
+ }
+ memset(d86f[drive].track_layout[side] + i, BYTE_DATAAM, 1);
+ i++;
+ memset(d86f[drive].track_layout[side] + i, BYTE_DATA, (128 << fdc_get_format_n()));
+ i += (128 << fdc_get_format_n());
+ memset(d86f[drive].track_layout[side] + i, BYTE_DATA_CRC, 2);
+ i += 2;
+ memset(d86f[drive].track_layout[side] + i, BYTE_GAP3, real_gap3_len);
+ i += real_gap3_len;
+ }
+}
+
void d86f_format(int drive, int track, int side, int rate, uint8_t fill)
{
d86f_track[drive] = track;
d86f_side[drive] = side;
+
+ if (side && (d86f_get_sides(drive) == 1))
+ {
+ fdc_notfound();
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ return;
+ }
+
d86f_drive = drive;
d86f_fill[drive] = fill;
- d86f_reset_state(drive);
+ index_count[drive] = 0;
+ /* Let's prepare the track space and layout before filling. */
+ d86f[drive].track_flags &= 0xc0;
+ d86f[drive].track_flags |= (fdd_getrpm(drive ^ fdd_swap) == 360) ? 0x20 : 0;
+ d86f[drive].track_flags |= fdc_get_bit_rate();
+ d86f[drive].track_flags |= fdc_is_mfm() ? 8 : 0;
+ memset(d86f[drive].track_data[side], 0xFF, 25000);
+ d86f_prepare_track_layout(drive, side);
d86f_state[drive] = STATE_FORMAT_FIND;
+ format_sector_count[drive] = 0;
}
void d86f_stop(int drive)
@@ -765,148 +653,42 @@ static void index_pulse(int drive)
if (d86f_state[drive] != STATE_IDLE) fdc_indexpulse();
}
-// char *track_buffer[2][2][25512];
-char track_layout[2][2][25512];
+typedef struct {
+ uint8_t c;
+ uint8_t h;
+ uint8_t r;
+ uint8_t n;
+} sector_data_t;
-int id_positions[2][2][MAX_SECTORS];
-
-/* 0 = MFM, 1 = FM, 2 = MFM perpendicular, 3 = reserved */
-/* 4 = ISO, 0 = IBM */
-int media_type = 0;
-
-#define BYTE_GAP 0
-#define BYTE_SYNC 1
-#define BYTE_IAM 2
-#define BYTE_IDAM 3
-#define BYTE_ID 4
-#define BYTE_ID_CRC 5
-#define BYTE_DATA_AM 6
-#define BYTE_DATA 7
-#define BYTE_DATA_CRC 8
-#define BYTE_SECTOR_GAP 9
-#define BYTE_GAP3 10
-#define BYTE_AM_SYNC 11
-#define BYTE_INDEX_HOLE 12
-#define BYTE_EMPTY 255
-
-void d86f_prepare_track_layout(int drive, int side)
-{
- sector_t *s;
- int i = 0;
- int j = 0;
- int real_gap0_len = ((media_type & 3) == 1) ? 40 : 80;
- int sync_len = ((media_type & 3) == 1) ? 6 : 12;
- int am_len = ((media_type & 3) == 1) ? 1 : 4;
- int real_gap1_len = ((media_type & 3) == 1) ? 26 : 50;
- // track_layout[drive][side] = (char *) malloc(raw_tsize[drive]);
- // id_positions[drive][side] = (int *) malloc(d86f_count[drive][side] * 4);
- memset(track_layout[drive][side], BYTE_GAP, raw_tsize[drive]);
- memset(id_positions[drive][side], 0, 1024);
- i = 0;
- if (!(media_type & 4))
- {
- memset(track_layout[drive][side] + i, BYTE_INDEX_HOLE, 1);
- i++;
- memset(track_layout[drive][side] + i, BYTE_GAP, real_gap0_len - 1);
- i += real_gap0_len - 1;
- memset(track_layout[drive][side] + i, BYTE_SYNC, sync_len);
- i += sync_len;
- if ((media_type & 3) != 1)
- {
- memset(track_layout[drive][side] + i, BYTE_AM_SYNC, 3);
- i += 3;
- }
- memset(track_layout[drive][side] + i, BYTE_IAM, 1);
- i++;
- memset(track_layout[drive][side] + i, BYTE_GAP, real_gap1_len);
- i += real_gap1_len;
- }
- else
- {
- memset(track_layout[drive][side] + i, BYTE_INDEX_HOLE, 1);
- i++;
- memset(track_layout[drive][side] + i, BYTE_GAP, real_gap1_len - 1);
- i += real_gap1_len - 1;
- }
- for (j = 0; j < d86f_count[drive][side]; j++)
- {
- s = &d86f_data[drive][side][j];
- // pclog("Sector %i (%i)\n", j, s->n);
- memset(track_layout[drive][side] + i, BYTE_SYNC, sync_len);
- i += sync_len;
- if ((media_type & 3) != 1)
- {
- memset(track_layout[drive][side] + i, BYTE_AM_SYNC, 3);
- i += 3;
- }
- id_positions[drive][side][j] = i;
- memset(track_layout[drive][side] + i, BYTE_IDAM, 1);
- i++;
- memset(track_layout[drive][side] + i, BYTE_ID, 4);
- i += 4;
- memset(track_layout[drive][side] + i, BYTE_ID_CRC, 2);
- i += 2;
- memset(track_layout[drive][side] + i, BYTE_SECTOR_GAP, gap2_size[drive]);
- i += gap2_size[drive];
- memset(track_layout[drive][side] + i, BYTE_SYNC, sync_len);
- i += sync_len;
- if ((media_type & 3) != 1)
- {
- memset(track_layout[drive][side] + i, BYTE_AM_SYNC, 3);
- i += 3;
- }
- memset(track_layout[drive][side] + i, BYTE_DATA_AM, 1);
- i++;
- memset(track_layout[drive][side] + i, BYTE_DATA, (128 << ((int) s->n)));
- i += (128 << ((int) s->n));
- memset(track_layout[drive][side] + i, BYTE_DATA_CRC, 2);
- i += 2;
- memset(track_layout[drive][side] + i, BYTE_GAP3, gap3_size[drive]);
- i += gap3_size[drive];
- }
-
- if (side == 0) d86f_state[drive] = STATE_IDLE;
-
-#if 0
- FILE *f = fopen("layout.dmp", "wb");
- fwrite(track_layout[drive][side], 1, raw_tsize[drive], f);
- fclose(f);
- fatal("good getpccache!\n");
-#endif
-}
-
-int d86f_reset_state(int drive)
-{
- id_counter[drive] = data_counter[drive] = index_count[drive] = gap3_counter[drive] = cur_rate[drive] = 0;
- last_sector[drive] = NULL;
-}
-
-int d86f_find_sector(int drive)
-{
- int side = d86f_side[drive];
- int i = 0;
- for (i = 0; i < d86f_count[drive][side]; i++)
- {
- if (id_positions[drive][side][i] == cur_track_pos[drive])
- {
- return i;
- }
- }
- return -1;
-}
+sector_data_t last_sector[2];
int d86f_match(int drive)
{
int temp;
- if (last_sector[drive] == NULL) return 0;
- temp = (d86f_track[drive] == last_sector[drive]->c);
- temp = temp && (d86f_side[drive] == last_sector[drive]->h);
- temp = temp && (d86f_sector[drive] == last_sector[drive]->r);
+ temp = (d86f_track[drive] == last_sector[drive].c);
+ temp = temp && (d86f_side[drive] == last_sector[drive].h);
+ temp = temp && (d86f_sector[drive] == last_sector[drive].r);
+ temp = temp && (d86f_n[drive] == last_sector[drive].n);
+ return temp;
+}
+
+uint32_t d86f_get_data_len(int drive)
+{
if (d86f_n[drive])
{
- temp = temp && (d86f_n[drive] == last_sector[drive]->n);
+ return (128 << ((uint32_t) d86f_n[drive]));
+ }
+ else
+ {
+ if (fdc_get_dtl() < 128)
+ {
+ return fdc_get_dtl();
+ }
+ else
+ {
+ return (128 << ((uint32_t) d86f_n[drive]));
+ }
}
- return temp;
}
int d86f_can_read_address(int drive)
@@ -914,6 +696,7 @@ int d86f_can_read_address(int drive)
int temp;
temp = (fdc_get_bitcell_period() == get_bitcell_period(drive));
temp = temp && fdd_can_read_medium(drive ^ fdd_swap);
+ temp = temp && (fdc_is_mfm() == d86f_is_mfm(drive));
return temp;
}
@@ -922,8 +705,7 @@ int d86f_can_format(int drive)
int temp;
temp = !writeprot[drive];
temp = temp && !swwp;
- temp = temp && d86f_can_read_address(drive);
- temp = temp && (fdc_get_format_sectors() == d86f_count[drive][d86f_side[drive]]);
+ temp = temp && fdd_can_read_medium(drive ^ fdd_swap);
return temp;
}
@@ -939,6 +721,17 @@ int d86f_find_state(int drive)
return temp;
}
+int d86f_find_state_nf(int drive)
+{
+ int temp;
+ temp = (d86f_state[drive] == STATE_READ_FIND_SECTOR);
+ temp = temp || (d86f_state[drive] == STATE_READ_FIND_FIRST_SECTOR);
+ temp = temp || (d86f_state[drive] == STATE_READ_FIND_NEXT_SECTOR);
+ temp = temp || (d86f_state[drive] == STATE_WRITE_FIND_SECTOR);
+ temp = temp || (d86f_state[drive] == STATE_READ_FIND_ADDRESS);
+ return temp;
+}
+
int d86f_read_state(int drive)
{
int temp;
@@ -948,6 +741,31 @@ int d86f_read_state(int drive)
return temp;
}
+int d86f_section_pos[2] = {0, 0};
+
+int data_pos[2] = {0, 0};
+
+int d86f_data_size(int drive)
+{
+ int temp;
+ temp = d86f_n[drive];
+ temp = 128 << temp;
+ return temp;
+}
+
+typedef union
+{
+ uint32_t dword;
+ uint8_t byte_array[4];
+} sector_id;
+
+sector_id format_sector_id[2];
+sector_id rw_sector_id[2];
+
+crc_t crc_bytes[2];
+
+static uint32_t datac[2] = {0, 0};
+
void d86f_poll()
{
sector_t *s;
@@ -957,10 +775,23 @@ void d86f_poll()
int found_sector = 0;
int b = 0;
- if (d86f_state[drive] == STATE_SEEK)
+ int cur_id_pos = 0;
+ int cur_gap3_pos = 0;
+
+ uint8_t track_byte = 0;
+ uint8_t track_index = 0;
+ uint8_t track_sector = 0;
+ uint8_t track_byte_type = 0;
+
+ uint8_t old_track_byte = 0;
+ uint8_t old_track_index = 0;
+ uint8_t old_track_sector = 0;
+ uint8_t old_track_byte_type = 0;
+
+ if ((d86f_state[drive] == STATE_SEEK) || (d86f_state[drive] == STATE_IDLE))
{
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
return;
}
@@ -970,206 +801,300 @@ void d86f_poll()
{
if (d86f_can_read_address(drive))
{
- pclog("d86f_poll(): Disk is write protected or attempting to format wrong number of sectors per track\n");
+ // pclog("d86f_poll(): Disk is write protected or attempting to format wrong number of sectors per track\n");
fdc_writeprotect();
}
else
{
- pclog("d86f_poll(): Unable to format at the requested density or bitcell period\n");
+ // pclog("d86f_poll(): Unable to format at the requested density or bitcell period\n");
fdc_notfound();
}
d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
return;
}
}
- // if (d86f_state[drive] != STATE_IDLE) pclog("%04X: %01X\n", cur_track_pos[drive], track_layout[drive][side][cur_track_pos[drive]]);
- if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_GAP)
+
+ track_byte = d86f[drive].track_layout[side][d86f_cur_track_pos[drive]];
+ track_index = track_byte & BYTE_INDEX_HOLE;
+ track_sector = track_byte & BYTE_IS_SECTOR;
+ track_byte_type = track_byte & BYTE_TYPE;
+
+ if (track_index)
{
- if (d86f_read_state(drive) || (d86f_state[drive] == STATE_WRITE_SECTOR) || (d86f_state[drive] == STATE_FORMAT))
+ if (d86f_state[drive] != STATE_IDLE)
{
- /* We're at GAP4b or even GAP4a and still in a read, write, or format state, this means we've overrun the gap.
- Return with sector not found. */
- // pclog("d86f_poll(): Gap overrun at GAP4\n");
- fdc_notfound();
- d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
- return;
+ index_pulse(drive);
+ index_count[drive]++;
+ }
+ if (d86f_state[drive] == STATE_FORMAT)
+ {
+ // pclog("Index hole hit again, format finished\n");
+ d86f_state[drive] = STATE_IDLE;
+ if (!disable_write) d86f_writeback(drive, d86f_track[drive]);
+ fdc_sector_finishread(drive);
+ }
+ if ((d86f_state[drive] == STATE_FORMAT_FIND) && d86f_can_read_address(drive))
+ {
+ // pclog("Index hole hit, formatting track...\n");
+ d86f_state[drive] = STATE_FORMAT;
}
}
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_INDEX_HOLE)
+
+ if (d86f_read_state(drive) || (d86f_state[drive] == STATE_WRITE_SECTOR))
{
- index_pulse(drive);
- if (d86f_state[drive] != STATE_IDLE) index_count[drive]++;
- if (d86f_read_state(drive) || (d86f_state[drive] == STATE_WRITE_SECTOR) || (d86f_state[drive] == STATE_FORMAT))
+ /* For the first (data size) bytes, send to the FDC or receive from the FDC and write. */
+ if (d86f_read_state(drive) && (datac[drive] < d86f_data_size(drive)))
{
- /* We're at the index address mark and still in a read, write, or format state, this means we've overrun the gap.
- Return with sector not found. */
- // pclog("d86f_poll(): Gap overrun at IAM\n");
- fdc_notfound();
- d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
- return;
- }
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_IDAM)
- {
- found_sector = d86f_find_sector(drive);
- // pclog("Found sector: %i\n", found_sector);
- cur_sector[drive] = found_sector;
- last_sector[drive] = &d86f_data[drive][d86f_side[drive]][found_sector];
- cur_rate[drive] = last_sector[drive]->rate;
- if (!(d86f_can_read_address(drive))) last_sector[drive] = NULL;
- if (d86f_read_state(drive) || (d86f_state[drive] == STATE_WRITE_SECTOR) || (d86f_state[drive] == STATE_FORMAT))
- {
- /* We're at a sector ID address mark and still in a read, write, or format state, this means we've overrun the gap.
- Return with sector not found. */
- pclog("d86f_poll(): Gap (%i) overrun at IDAM\n", fdc_get_gap());
- fdc_notfound();
- d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
- return;
- }
- if ((d86f_state[drive] == STATE_FORMAT_FIND) && d86f_can_read_address(drive)) d86f_state[drive] = STATE_FORMAT;
- id_counter[drive] = 0;
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_ID)
- {
- id_counter[drive]++;
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_ID_CRC)
- {
- id_counter[drive]++;
- if (id_counter[drive] == 6)
- {
- /* ID CRC read, if state is read address, return address */
- if ((d86f_state[drive] == STATE_READ_FIND_ADDRESS) && !(d86f_can_read_address(drive)))
+ if (fdc_data(d86f[drive].track_data[side][d86f_cur_track_pos[drive]]))
{
- if (fdc_get_bitcell_period() != get_bitcell_period(drive))
+ /* Data failed to be sent to the FDC, abort. */
+ // pclog("d86f_poll(): Unable to send further data to the FDC\n");
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
+ return;
+ }
+ }
+
+ if ((d86f_state[drive] == STATE_WRITE_SECTOR) && (datac[drive] < d86f_data_size(drive)))
+ {
+ data = fdc_getdata(datac[drive] == ((128 << ((uint32_t) last_sector[drive].n)) - 1));
+ if (data == -1)
+ {
+ /* Data failed to be sent from the FDC, abort. */
+ // pclog("d86f_poll(): Unable to receive further data from the FDC\n");
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
+ return;
+ }
+ if (!disable_write)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = data;
+ d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] = BYTE_DATA;
+ if (!d86f_cur_track_pos[drive]) d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] |= BYTE_INDEX_HOLE;
+ }
+ }
+
+ if (datac[drive] < d86f_data_size(drive))
+ {
+ d86f_calccrc(drive, d86f[drive].track_data[side][d86f_cur_track_pos[drive]]);
+ }
+
+ if (datac[drive] == d86f_data_size(drive))
+ {
+ if (d86f_read_state(drive))
+ {
+ crc_bytes[drive].bytes[0] = d86f[drive].track_data[side][d86f_cur_track_pos[drive]];
+ }
+
+ if (d86f_state[drive] == STATE_WRITE_SECTOR)
+ {
+ if (!disable_write)
{
- pclog("Unable to read sector ID: Bitcell period mismatch (%i != %i)...\n", fdc_get_bitcell_period(), get_bitcell_period(drive));
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[0];
+ d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] = BYTE_DATA_CRC;
+ if (!d86f_cur_track_pos[drive]) d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] |= BYTE_INDEX_HOLE;
+ }
+ }
+ }
+
+ if (datac[drive] == (d86f_data_size(drive) + 1))
+ {
+ if (d86f_read_state(drive))
+ {
+ crc_bytes[drive].bytes[1] = d86f[drive].track_data[side][d86f_cur_track_pos[drive]];
+ }
+
+ if (d86f_state[drive] == STATE_WRITE_SECTOR)
+ {
+ if (!disable_write)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[1];
+ d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] = BYTE_DATA_CRC;
+ if (!d86f_cur_track_pos[drive]) d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] |= BYTE_INDEX_HOLE;
+ }
+ }
+ }
+
+ if ((datac[drive] > (d86f_data_size(drive) + 1)) && (datac[drive] <= (d86f_data_size(drive) + fdc_get_gap() + 1)) && (d86f_state[drive] == STATE_WRITE_SECTOR) && !disable_write)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = fdc_is_mfm() ? 0x4E : 0xFF;
+ d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] = BYTE_GAP3;
+ if (!d86f_cur_track_pos[drive]) d86f[drive].track_layout[side][d86f_cur_track_pos[drive]] |= BYTE_INDEX_HOLE;
+ }
+
+ /* At the last data of the FDC-specified gap length, compare the calculated CRC with the one we read and error out if mismatch, otherwise finish with success. */
+ if (datac[drive] == (d86f_data_size(drive) + fdc_get_gap() + 1))
+ {
+ if (d86f_read_state(drive))
+ {
+ d86f_state[drive] = STATE_IDLE;
+ if (crc_bytes[drive].word != crc[drive].word)
+ {
+ // pclog("d86f_poll(): Data CRC error (%04X, %04X) (%i) (%04X)\n", crc_bytes[drive].word, crc[drive].word, d86f_data_size(drive), d86f_cur_track_pos[drive] - fdc_get_gap() - 1);
+ fdc_finishread();
+ fdc_datacrcerror();
}
else
{
- pclog("Unable to read sector ID: Media type not supported by the drive...\n");
+ fdc_sector_finishread();
}
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
+ return;
}
- if ((d86f_state[drive] == STATE_READ_FIND_ADDRESS) && d86f_can_read_address(drive))
+ if (d86f_state[drive] == STATE_WRITE_SECTOR)
{
- // pclog("Reading sector ID...\n");
- fdc_sectorid(last_sector[drive]->c, last_sector[drive]->h, last_sector[drive]->r, last_sector[drive]->n, 0, 0);
- d86f_state[drive] = STATE_IDLE;
- }
- id_counter[drive] = 0;
- }
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_DATA_AM)
- {
- data_counter[drive] = 0;
- switch (d86f_state[drive])
- {
- case STATE_READ_FIND_SECTOR:
- if (d86f_match(drive) && d86f_can_read_address(drive)) d86f_state[drive] = STATE_READ_SECTOR;
- break;
- case STATE_READ_FIND_FIRST_SECTOR:
- if ((cur_sector[drive] == 0) && d86f_can_read_address(drive)) d86f_state[drive] = STATE_READ_FIRST_SECTOR;
- break;
- case STATE_READ_FIND_NEXT_SECTOR:
- if (d86f_can_read_address(drive)) d86f_state[drive] = STATE_READ_NEXT_SECTOR;
- break;
- case STATE_WRITE_FIND_SECTOR:
- if (d86f_match(drive) && d86f_can_read_address(drive)) d86f_state[drive] = STATE_WRITE_SECTOR;
- break;
- }
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_DATA)
- {
- if (d86f_read_state(drive) && (last_sector[drive] != NULL))
- {
- if (fdc_data(last_sector[drive]->data[data_counter[drive]]))
- {
- /* Data failed to be sent to the FDC, abort. */
- pclog("d86f_poll(): Unable to send further data to the FDC\n");
- d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
+ d86f_state[drive] = STATE_IDLE;
+ if (!disable_write) d86f_writeback(drive, d86f_track[drive]);
+ fdc_sector_finishread(drive);
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
return;
}
}
- if ((d86f_state[drive] == STATE_WRITE_SECTOR) && (last_sector[drive] != NULL))
- {
- data = fdc_getdata(cur_byte[drive] == ((128 << ((uint32_t) last_sector[drive]->n)) - 1));
- if (data == -1)
+
+ datac[drive]++;
+ }
+
+ switch(track_byte & ~BYTE_INDEX_HOLE)
+ {
+ case BYTE_GAP0:
+ case BYTE_GAP1:
+ case BYTE_GAP2:
+ case BYTE_GAP3:
+ case BYTE_GAP4:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = fdc_is_mfm() ? 0x4E : 0xFF;
+ break;
+ case BYTE_IAM_SYNC:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = 0xC2;
+ break;
+ case BYTE_IAM:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = 0xFC;
+ break;
+ case BYTE_ID_SYNC:
+ if (d86f_state[drive] == STATE_FORMAT)
{
- /* Data failed to be sent from the FDC, abort. */
- pclog("d86f_poll(): Unable to receive further data from the FDC\n");
- d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
- return;
- }
- if (!disable_write) last_sector[drive]->data[data_counter[drive]] = data;
- }
- if ((d86f_state[drive] == STATE_FORMAT) && (last_sector[drive] != NULL))
- {
- if (!disable_write) last_sector[drive]->data[data_counter[drive]] = d86f_fill[drive];
- }
- data_counter[drive]++;
- if (last_sector[drive] == NULL)
- {
- data_counter[drive] = 0;
- }
- else
- {
- data_counter[drive] %= (128 << ((uint32_t) last_sector[drive]->n));
- if (!data_counter[drive])
- {
- if (d86f_read_state(drive) && (last_sector[drive] != NULL))
+ cur_id_pos = d86f_cur_track_pos[drive] - d86f_section_pos[drive];
+ if (!disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = 0;
+ if (cur_id_pos > 3) break;
+ data = fdc_getdata(0);
+ if ((data == -1) && (cur_id_pos < 3))
{
- d86f_state[drive] = STATE_IDLE;
- fdc_finishread(drive);
+ /* Data failed to be sent from the FDC, abort. */
+ // pclog("d86f_poll(): Unable to receive further data from the FDC\n");
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
+ return;
}
- if ((d86f_state[drive] == STATE_WRITE_SECTOR) && (last_sector[drive] != NULL))
+ format_sector_id[drive].byte_array[cur_id_pos] = data & 0xff;
+ d86f_calccrc(drive, format_sector_id[drive].byte_array[cur_id_pos]);
+ // pclog("format_sector_id[%i] = %i\n", cur_id_pos, format_sector_id[drive].byte_array[cur_id_pos]);
+ if (cur_id_pos == 3)
{
- d86f_state[drive] = STATE_IDLE;
- if (!disable_write) d86f_writeback[drive](drive, d86f_track[drive]);
- fdc_finishread(drive);
- }
- if ((d86f_state[drive] == STATE_FORMAT) && (last_sector[drive] != NULL))
- {
- d86f_state[drive] = STATE_IDLE;
- if (!disable_write) d86f_writeback[drive](drive, d86f_track[drive]);
- fdc_finishread(drive);
+ fdc_stop_id_request();
+ // pclog("Formatting sector: %08X...\n", format_sector_id[drive].dword);
}
}
- }
+ break;
+ case BYTE_I_SYNC:
+ case BYTE_DATA_SYNC:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = 0;
+ break;
+ case BYTE_IDAM_SYNC:
+ case BYTE_DATAAM_SYNC:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = 0xA1;
+ break;
+ case BYTE_IDAM:
+ case BYTE_DATAAM:
+ if (d86f_find_state_nf(drive) || (d86f_state[drive] == STATE_FORMAT)) crc[drive].word = fdc_is_mfm() ? 0xcdb4 : 0xffff;
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write) d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = (track_byte == BYTE_IDAM) ? 0xFE : 0xFB;
+ if (d86f_state[drive] == STATE_FORMAT) d86f_calccrc(drive, d86f[drive].track_data[side][d86f_cur_track_pos[drive]]);
+ if (d86f_find_state_nf(drive) && ((d86f_state[drive] != STATE_WRITE_FIND_SECTOR) || ((track_byte & ~BYTE_INDEX_HOLE) == BYTE_IDAM)))
+ {
+ d86f_calccrc(drive, d86f[drive].track_data[side][d86f_cur_track_pos[drive]]);
+ }
+ break;
+ case BYTE_ID:
+ cur_id_pos = d86f_cur_track_pos[drive] - d86f_section_pos[drive];
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = format_sector_id[drive].byte_array[cur_id_pos];
+ }
+ if (d86f_find_state_nf(drive))
+ {
+ rw_sector_id[drive].byte_array[cur_id_pos] = d86f[drive].track_data[side][d86f_cur_track_pos[drive]];
+ }
+ if ((d86f_state[drive] == STATE_FORMAT) || d86f_find_state_nf(drive))
+ {
+ d86f_calccrc(drive, d86f[drive].track_data[side][d86f_cur_track_pos[drive]]);
+ }
+ break;
+ case BYTE_DATA:
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = d86f_fill[drive];
+ d86f_calccrc(drive, d86f_fill[drive]);
+ }
+ break;
+ case BYTE_ID_CRC:
+ cur_id_pos = d86f_cur_track_pos[drive] - d86f_section_pos[drive];
+ if (d86f_find_state_nf(drive))
+ {
+ crc_bytes[drive].bytes[0] = d86f[drive].track_data[side][(d86f_cur_track_pos[drive] - 1) % d86f_get_raw_size(drive)];
+ crc_bytes[drive].bytes[1] = d86f[drive].track_data[side][d86f_cur_track_pos[drive]];
+ }
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write)
+ {
+ if (cur_id_pos)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[1];
+ }
+ else
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[0];
+ }
+ }
+ break;
+ case BYTE_DATA_CRC:
+ cur_id_pos = d86f_cur_track_pos[drive] - d86f_section_pos[drive];
+ if ((d86f_state[drive] == STATE_FORMAT) && !disable_write)
+ {
+ if (cur_id_pos)
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[1];
+ }
+ else
+ {
+ d86f[drive].track_data[side][d86f_cur_track_pos[drive]] = crc[drive].bytes[0];
+ }
+ }
+ break;
}
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_GAP3)
- {
- if (gap3_counter[drive] == fdc_get_gap())
- {
- }
- gap3_counter[drive]++;
- gap3_counter[drive] %= gap3_size[drive];
- // pclog("GAP3 counter = %i\n", gap3_counter[drive]);
- }
- else if (track_layout[drive][side][cur_track_pos[drive]] == BYTE_GAP)
- {
- if (last_sector[drive] != NULL) last_sector[drive] = NULL;
- }
- b = track_layout[drive][side][cur_track_pos[drive]];
- cur_track_pos[drive]++;
- cur_track_pos[drive] %= raw_tsize[drive];
+
+ old_track_byte = track_byte;
+ old_track_index = track_index;
+ old_track_sector = track_sector;
+ old_track_byte_type = track_byte_type;
+
+ d86f_cur_track_pos[drive]++;
+ d86f_cur_track_pos[drive] %= d86f_get_raw_size(drive);
+
+ track_byte = d86f[drive].track_layout[side][d86f_cur_track_pos[drive]];
+ track_index = track_byte & BYTE_INDEX_HOLE;
+ track_sector = track_byte & BYTE_IS_SECTOR;
+ track_byte_type = track_byte & BYTE_TYPE;
+
if ((d86f_state[drive] != STATE_IDLE) && (d86f_state[drive] != STATE_SEEK))
{
if (index_count[drive] > 1)
@@ -1182,13 +1107,101 @@ void d86f_poll()
// pclog("d86f_poll(): Sector not found (%i %i %i %i)\n", d86f_track[drive], d86f_side[drive], d86f_sector[drive], d86f_n[drive]);
fdc_notfound();
d86f_state[drive] = STATE_IDLE;
- d86f_reset_state(drive);
+ index_count[drive] = 0;
return;
}
}
}
- if ((b != BYTE_GAP3) && (track_layout[drive][side][cur_track_pos[drive]] == BYTE_GAP3))
+
+ if ((d86f_state[drive] == STATE_IDLE) || (d86f_state[drive] == STATE_SEEK)) return;
+
+ if (track_byte != old_track_byte)
{
- gap3_counter[drive] = 0;
+ // if (d86f_state[drive] == STATE_FORMAT) pclog("Track byte: %02X, old: %02X\n", track_byte, old_track_byte);
+ d86f_section_pos[drive] = d86f_cur_track_pos[drive];
+
+ switch(track_byte & ~BYTE_INDEX_HOLE)
+ {
+ case BYTE_ID_SYNC:
+ if (d86f_state[drive] == STATE_FORMAT)
+ {
+ // pclog("Requesting next sector ID...\n");
+ fdc_request_next_sector_id();
+ }
+ break;
+ case BYTE_GAP2:
+ if (d86f_find_state_nf(drive))
+ {
+ if (d86f_match(drive) && d86f_can_read_address(drive))
+ {
+ if (crc_bytes[drive].word != crc[drive].word)
+ {
+ // pclog("d86f_poll(): Header CRC error\n");
+ fdc_finishread();
+ fdc_headercrcerror();
+ d86f_state[drive] = STATE_IDLE;
+ index_count[drive] = 0;
+ return;
+ }
+ }
+
+ last_sector[drive].c = rw_sector_id[drive].byte_array[0];
+ last_sector[drive].h = rw_sector_id[drive].byte_array[1];
+ last_sector[drive].r = rw_sector_id[drive].byte_array[2];
+ last_sector[drive].n = rw_sector_id[drive].byte_array[3];
+ // pclog("Read sector ID in find state: %i %i %i %i (sought: %i, %i, %i, %i)\n", last_sector[drive].c, last_sector[drive].h, last_sector[drive].r, last_sector[drive].n, d86f_track[drive], d86f_side[drive], d86f_sector[drive], d86f_n[drive]);
+ }
+
+ if (d86f_state[drive] == STATE_FORMAT)
+ {
+ last_sector[drive].c = format_sector_id[drive].byte_array[0];
+ last_sector[drive].h = format_sector_id[drive].byte_array[1];
+ last_sector[drive].r = format_sector_id[drive].byte_array[2];
+ last_sector[drive].n = format_sector_id[drive].byte_array[3];
+ }
+
+ if ((d86f_state[drive] == STATE_READ_FIND_ADDRESS) && d86f_can_read_address(drive))
+ {
+ // pclog("Reading sector ID...\n");
+ fdc_sectorid(last_sector[drive].c, last_sector[drive].h, last_sector[drive].r, last_sector[drive].n, 0, 0);
+ d86f_state[drive] = STATE_IDLE;
+ }
+ break;
+ case BYTE_DATA:
+ if (d86f_read_state(drive) || (d86f_state[drive] == STATE_WRITE_SECTOR)) return;
+ datac[drive] = 0;
+ switch (d86f_state[drive])
+ {
+ case STATE_READ_FIND_SECTOR:
+ if (d86f_match(drive) && d86f_can_read_address(drive))
+ {
+ d86f_state[drive] = STATE_READ_SECTOR;
+ }
+ break;
+ case STATE_READ_FIND_FIRST_SECTOR:
+ if ((cur_sector[drive] == 0) && d86f_can_read_address(drive)) d86f_state[drive] = STATE_READ_FIRST_SECTOR;
+ break;
+ case STATE_READ_FIND_NEXT_SECTOR:
+ if (d86f_can_read_address(drive)) d86f_state[drive] = STATE_READ_NEXT_SECTOR;
+ break;
+ case STATE_WRITE_FIND_SECTOR:
+ if (d86f_match(drive) && d86f_can_read_address(drive))
+ {
+ if (!disable_write)
+ {
+ d86f[drive].track_data[side][(d86f_cur_track_pos[drive] - 1) % d86f_get_raw_size(drive)] = 0xFB;
+ }
+ d86f_calccrc(drive, d86f[drive].track_data[side][(d86f_cur_track_pos[drive] - 1) % d86f_get_raw_size(drive)]);
+
+ d86f_state[drive] = STATE_WRITE_SECTOR;
+ // pclog("Write start: %i %i %i %i, data size: %i (%i)\n", last_sector[drive].c, last_sector[drive].h, last_sector[drive].r, last_sector[drive].n, d86f_data_size(drive), d86f_n[drive]);
+ }
+ break;
+ /* case STATE_FORMAT:
+ // pclog("Format: Starting sector fill...\n");
+ break; */
+ }
+ break;
+ }
}
}
diff --git a/src/disc_86f.h b/src/disc_86f.h
index 55bec939c..96a83131f 100644
--- a/src/disc_86f.h
+++ b/src/disc_86f.h
@@ -5,26 +5,17 @@ void d86f_init();
void d86f_load(int drive, char *fn);
void d86f_close(int drive);
void d86f_seek(int drive, int track);
-void d86f_readsector(int drive, int sector, int track, int side, int density);
-void d86f_writesector(int drive, int sector, int track, int side, int density);
-void d86f_readaddress(int drive, int sector, int side, int density);
-void d86f_format(int drive, int sector, int side, int density);
int d86f_hole(int drive);
-int d86f_byteperiod(int drive);
+double d86f_byteperiod(int drive);
void d86f_stop(int drive);
void d86f_poll();
int d86f_realtrack(int track, int drive);
void d86f_reset(int drive, int side);
-void d86f_add(int drive, int side, uint8_t c, uint8_t h, uint8_t r, uint8_t n, int rate, uint8_t *data);
void d86f_readsector(int drive, int sector, int track, int side, int density, int sector_size);
void d86f_writesector(int drive, int sector, int track, int side, int density, int sector_size);
void d86f_readaddress(int drive, int sector, int side, int density);
void d86f_format(int drive, int sector, int side, int density, uint8_t fill);
-void d86f_stop();
-void d86f_poll();
-void d86f_stop();
-extern void (*d86f_writeback[2])(int drive, int track);
void d86f_prepare_track_layout(int drive, int side);
#define length_gap0 80
diff --git a/src/disc_fdi.c b/src/disc_fdi.c
index 663bf7976..04c98c3ec 100644
--- a/src/disc_fdi.c
+++ b/src/disc_fdi.c
@@ -71,20 +71,20 @@ void fdi_init()
fdi_setupcrc(0x1021, 0xcdb4);
}
-int fdi_byteperiod(int drive)
+double fdi_byteperiod(int drive)
{
switch (fdi2raw_get_bit_rate(fdi[drive].h))
{
case 1000:
- return 8;
+ return 8.0;
case 500:
- return 16;
+ return 16.0;
case 300:
- return 26;
+ return 160.0 / 6.0;
case 250:
- return 32;
+ return 32.0;
default:
- return 32;
+ return 32.0;
}
}
diff --git a/src/disc_fdi.h b/src/disc_fdi.h
index b6e5abc55..f1399b48e 100644
--- a/src/disc_fdi.h
+++ b/src/disc_fdi.h
@@ -10,7 +10,7 @@ void fdi_writesector(int drive, int sector, int track, int side, int density, in
void fdi_readaddress(int drive, int sector, int side, int density);
void fdi_format(int drive, int sector, int side, int density, uint8_t fill);
int fdi_hole(int drive);
-int fdi_byteperiod(int drive);
+double fdi_byteperiod(int drive);
void fdi_stop();
void fdi_poll();
int fdi_realtrack(int track, int drive);
diff --git a/src/disc_img.c b/src/disc_img.c
index ee6d63e78..431806585 100644
--- a/src/disc_img.c
+++ b/src/disc_img.c
@@ -22,11 +22,6 @@ static struct
uint32_t base;
} img[2];
-#if 0
-static uint8_t xdf_track0[5][3];
-static uint8_t xdf_spt[5];
-static uint8_t xdf_map[5][24][3];
-#endif
static uint8_t xdf_track0[3][3];
static uint8_t xdf_spt[3];
static uint8_t xdf_map[3][24][3];
@@ -107,11 +102,7 @@ static int gap3_sizes[5][8][256] = { [0][1][16] = 0x54,
/* Needed for formatting! */
int img_realtrack(int drive, int track)
{
-#ifdef MAINLINE
- if ((img[drive].tracks <= 41) && fdd_doublestep_40(drive))
-#else
if ((img[drive].tracks <= 43) && fdd_doublestep_40(drive))
-#endif
track /= 2;
return track;
@@ -119,30 +110,6 @@ int img_realtrack(int drive, int track)
void img_writeback(int drive, int track);
-static int img_sector_size_code(int drive)
-{
- switch(img[drive].sector_size)
- {
- case 128:
- return 0;
- case 256:
- return 1;
- default:
- case 512:
- return 2;
- case 1024:
- return 3;
- case 2048:
- return 4;
- case 4096:
- return 5;
- case 8192:
- return 6;
- case 16384:
- return 7;
- }
-}
-
static int sector_size_code(int sector_size)
{
switch(sector_size)
@@ -167,6 +134,11 @@ static int sector_size_code(int sector_size)
}
}
+static int img_sector_size_code(int drive)
+{
+ return sector_size_code(img[drive].sector_size);
+}
+
void img_init()
{
memset(img, 0, sizeof(img));
@@ -220,24 +192,6 @@ static void initialize_xdf_maps()
add_to_map(xdf_map[2][6], 1, 2, 5);
add_to_map(xdf_map[2][7], 1, 3, 7);
-#if 0
- // XXDF 3.5" 2HD
- add_to_map(xdf_track0[3], 12, 20, 4);
- xdf_spt[3] = 2;
- add_to_map(xdf_map[3][0], 0, 0, 5);
- add_to_map(xdf_map[3][1], 1, 1, 6);
- add_to_map(xdf_map[3][2], 0, 1, 6);
- add_to_map(xdf_map[3][3], 1, 0, 5);
-
- // XXDF 3.5" 2ED
- add_to_map(xdf_track0[4], 21, 39, 9);
- xdf_spt[4] = 2;
- add_to_map(xdf_map[4][0], 0, 0, 6);
- add_to_map(xdf_map[4][1], 1, 1, 7);
- add_to_map(xdf_map[4][2], 0, 1, 7);
- add_to_map(xdf_map[4][3], 1, 0, 6);
-#endif
-
xdf_maps_initialized = 1;
}
@@ -485,19 +439,9 @@ void img_load(int drive, char *fn)
img[drive].xdf_type = 2;
pclog("XDF type is 2 @ %i kbps\n", bit_rate_300);
break;
-#if 0
- case 24: /* High density XXDF @ 300 rpm */
- img[drive].xdf_type = 4;
- break;
-#endif
case 46: /* Extended density XDF */
img[drive].xdf_type = 3;
break;
-#if 0
- case 48: /* Extended density XXDF */
- img[drive].xdf_type = 5;
- break;
-#endif
default: /* Unknown, as we're beyond maximum sectors, get out */
fclose(img[drive].f);
return;
@@ -516,24 +460,13 @@ void img_load(int drive, char *fn)
}
gap2_size[drive] = (temp_rate == 3) ? 41 : 22;
- pclog("GAP2 size: %i bytes\n", gap2_size[drive]);
+ // pclog("GAP2 size: %i bytes\n", gap2_size[drive]);
gap3_size[drive] = gap3_sizes[temp_rate][sector_size_code(img[drive].sector_size)][img[drive].sectors];
- if (gap3_size)
+ if (!gap3_size[drive])
{
- pclog("GAP3 size: %i bytes\n", gap3_size[drive]);
- }
- else
- {
- // fclose(img[drive].f);
gap3_size[drive] = 40;
pclog("WARNING: Floppy image of unknown format was inserted into drive %c:!\n", drive + 0x41);
}
- gap4_size[drive] = raw_tsize[drive] - (((pre_gap + gap2_size[drive] + pre_data + img[drive].sector_size + post_gap + gap3_size[drive]) * img[drive].sectors) + pre_track);
- pclog("GAP4 size: %i bytes\n", gap4_size[drive]);
- if (img[drive].xdf_type)
- {
- gap4_size[drive] = 1;
- }
if (bit_rate_300 == 250)
{
@@ -592,13 +525,13 @@ int img_hole(int drive)
return img[drive].hole;
}
-int img_byteperiod(int drive)
+double img_byteperiod(int drive)
{
if (img[drive].byte_period == 29)
{
- return (fdd_get_type(drive) & 1) ? 32 : 26;
+ return (fdd_get_type(drive) & 1) ? 32.0 : (160.0 / 6.0);
}
- return img[drive].byte_period;
+ return (double) img[drive].byte_period;
}
void img_close(int drive)
@@ -621,11 +554,7 @@ void img_seek(int drive, int track)
return;
// pclog("Seek drive=%i track=%i sectors=%i sector_size=%i sides=%i\n", drive, track, img[drive].sectors,img[drive].sector_size, img[drive].sides);
// pclog(" %i %i\n", drive_type[drive], img[drive].tracks);
-#ifdef MAINLINE
- if ((img[drive].tracks <= 41) && fdd_doublestep_40(drive))
-#else
if ((img[drive].tracks <= 43) && fdd_doublestep_40(drive))
-#endif
track /= 2;
// pclog("Disk seeked to track %i\n", track);
@@ -666,7 +595,7 @@ void img_seek(int drive, int track)
sr = xdf_track0_layout[current_xdft][sector] >> 8;
spos = current_pos;
sside = 0;
- if (spos > (img[drive].sectors * img[drive].sector_size))
+ if (spos >= (img[drive].sectors * img[drive].sector_size))
{
spos -= (img[drive].sectors * img[drive].sector_size);
sside = 1;
@@ -677,67 +606,6 @@ void img_seek(int drive, int track)
}
current_pos += 512;
}
-#if 0
- /* Track 0, register sectors according to track 0 map. */
- /* First, the "Side 0" buffer, will also contain one sector from side 1. */
- current_pos = 0;
- for (sector = 0; sector < sectors_fat; sector++)
- {
- if ((sector+0x81) >= 0x91)
- {
- disc_sector_add(drive, 0, track, 0, sector+0x85, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- }
- else
- {
- disc_sector_add(drive, 0, track, 0, sector+0x81, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- }
- current_pos += 512;
- }
- disc_sector_add(drive, 1, track, 1, 0x81, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- for (sector = 0; sector < 7; sector++)
- {
- disc_sector_add(drive, 0, track, 0, sector+1, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- }
- disc_sector_add(drive, 0, track, 0, 0x9B, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9C, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9D, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- disc_sector_add(drive, 0, track, 0, 0x9E, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[0][current_pos]);
- current_pos += 512;
- /* Now the "Side 1" buffer, will also contain one sector from side 0. */
- current_pos = 0;
- for (sector = 0; (sector < effective_sectors - 1); sector++)
- {
- disc_sector_add(drive, 1, track, 1, sector+0x82, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[1][current_pos]);
- current_pos += 512;
- }
- disc_sector_add(drive, 0, track, 0, 8, 2,
- img[drive].bitcell_period_300rpm,
- &img[drive].track_data[1][current_pos]);
- current_pos += 512;
-#endif
}
else
{
@@ -776,7 +644,7 @@ void img_seek(int drive, int track)
}
for (side = img[drive].sides - 1; side >= 0; side--)
{
- disc_sector_prepare_track_layout(drive, side);
+ disc_sector_prepare_track_layout(drive, side, track);
}
}
@@ -801,3 +669,7 @@ void img_writeback(int drive, int track)
}
}
+int img_xdf_type(int drive)
+{
+ return img[drive].xdf_type;
+}
diff --git a/src/disc_img.h b/src/disc_img.h
index 92a72d62a..529157b86 100644
--- a/src/disc_img.h
+++ b/src/disc_img.h
@@ -10,7 +10,7 @@ void img_writesector(int drive, int sector, int track, int side, int density);
void img_readaddress(int drive, int sector, int side, int density);
void img_format(int drive, int sector, int side, int density);
int img_hole(int drive);
-int img_byteperiod(int drive);
+double img_byteperiod(int drive);
void img_stop(int drive);
void img_poll();
int img_realtrack(int track, int drive);
diff --git a/src/disc_sector.h b/src/disc_sector.h
index d4bd0a12f..60e873f6a 100644
--- a/src/disc_sector.h
+++ b/src/disc_sector.h
@@ -12,7 +12,7 @@ void disc_sector_poll();
void disc_sector_stop();
extern void (*disc_sector_writeback[2])(int drive, int track);
-void disc_sector_prepare_track_layout(int drive, int side);
+void disc_sector_prepare_track_layout(int drive, int side, int track);
#define length_gap0 80
#define length_gap1 50
@@ -36,4 +36,4 @@ void disc_sector_prepare_track_layout(int drive, int side);
extern int raw_tsize[2];
extern int gap2_size[2];
extern int gap3_size[2];
-extern int gap4_size[2];
+// extern int gap4_size[2];
diff --git a/src/disc_sector_86box.c b/src/disc_sector_86box.c
index 9ad06abd2..fd577af7d 100644
--- a/src/disc_sector_86box.c
+++ b/src/disc_sector_86box.c
@@ -53,10 +53,6 @@ static int disc_sector_side[2] = {0, 0};
static int disc_sector_drive;
static int disc_sector_sector[2] = {0, 0};
static int disc_sector_n[2] = {0, 0};
-static int disc_intersector_delay[2] = {0, 0};
-static int disc_postdata_delay[2] = {0, 0};
-static int disc_track_delay[2] = {0, 0};
-static int disc_gap4_delay[2] = {0, 0};
static uint8_t disc_sector_fill[2] = {0, 0};
static int cur_sector[2], cur_byte[2];
static int index_count[2];
@@ -64,7 +60,6 @@ static int index_count[2];
int raw_tsize[2] = {6250, 6250};
int gap2_size[2] = {22, 22};
int gap3_size[2] = {0, 0};
-int gap4_size[2] = {0, 0};
int disc_sector_reset_state(int drive);
@@ -75,7 +70,6 @@ void disc_sector_reset(int drive, int side)
if (side == 0)
{
disc_sector_reset_state(drive);
- // cur_track_pos[drive] = 0;
disc_sector_state[drive] = STATE_SEEK;
}
}
@@ -209,7 +203,29 @@ int media_type = 0;
#define BYTE_TYPE_DATA 0x04
#define BYTE_TYPE_CRC 0x05
-void disc_sector_prepare_track_layout(int drive, int side)
+#define GAP3_LEN_VARIABLE 0x1B
+
+int gap3_sizes[3][2] = { {74, 36}, {77, 77}, {60, 60} };
+
+int disc_sector_get_gap3_size(int drive, int side, int track)
+{
+ if (!img_xdf_type(drive))
+ {
+ return gap3_size[drive];
+ }
+
+ switch (track)
+ {
+ case 0:
+ return gap3_sizes[img_xdf_type(drive) - 1][side];
+ default:
+ return GAP3_LEN_VARIABLE;
+ }
+
+ return 0x7A;
+}
+
+void disc_sector_prepare_track_layout(int drive, int side, int track)
{
sector_t *s;
int i = 0;
@@ -278,18 +294,11 @@ void disc_sector_prepare_track_layout(int drive, int side)
i += (128 << ((int) s->n));
memset(track_layout[drive][side] + i, BYTE_DATA_CRC, 2);
i += 2;
- memset(track_layout[drive][side] + i, BYTE_GAP3, gap3_size[drive]);
- i += gap3_size[drive];
+ memset(track_layout[drive][side] + i, BYTE_GAP3, disc_sector_get_gap3_size(drive, side, track));
+ i += disc_sector_get_gap3_size(drive, side, track);
}
if (side == 0) disc_sector_state[drive] = STATE_IDLE;
-
-#if 0
- FILE *f = fopen("layout.dmp", "wb");
- fwrite(track_layout[drive][side], 1, raw_tsize[drive], f);
- fclose(f);
- fatal("good getpccache!\n");
-#endif
}
int disc_sector_reset_state(int drive)
@@ -610,17 +619,7 @@ void disc_sector_poll()
if (!(disc_sector_can_read_address(drive))) last_sector[drive] = NULL;
/* ID CRC read, if state is read address, return address */
- if ((disc_sector_state[drive] == STATE_READ_FIND_ADDRESS) && !(disc_sector_can_read_address(drive)))
- {
- if (fdc_get_bitcell_period() != get_bitcell_period(drive))
- {
- // pclog("Unable to read sector ID: Bitcell period mismatch (%i != %i)...\n", fdc_get_bitcell_period(), get_bitcell_period(drive));
- }
- else
- {
- // pclog("Unable to read sector ID: Media type not supported by the drive...\n");
- }
- }
+ // if ((disc_sector_state[drive] == STATE_READ_FIND_ADDRESS) && !(disc_sector_can_read_address(drive)))
if ((disc_sector_state[drive] == STATE_READ_FIND_ADDRESS) && disc_sector_can_read_address(drive))
{
// pclog("Reading sector ID...\n");
@@ -633,7 +632,10 @@ void disc_sector_poll()
switch (disc_sector_state[drive])
{
case STATE_READ_FIND_SECTOR:
- if (disc_sector_match(drive) && disc_sector_can_read_address(drive)) disc_sector_state[drive] = STATE_READ_SECTOR;
+ if (disc_sector_match(drive) && disc_sector_can_read_address(drive))
+ {
+ disc_sector_state[drive] = STATE_READ_SECTOR;
+ }
break;
case STATE_READ_FIND_FIRST_SECTOR:
if ((cur_sector[drive] == 0) && disc_sector_can_read_address(drive)) disc_sector_state[drive] = STATE_READ_FIRST_SECTOR;
diff --git a/src/fdc.c b/src/fdc.c
index ce6b92316..ced392afc 100644
--- a/src/fdc.c
+++ b/src/fdc.c
@@ -34,6 +34,7 @@ typedef struct FDC
int abort;
uint8_t format_dat[256];
int format_state;
+ int format_n;
int tc;
int written;
@@ -99,10 +100,18 @@ void fdc_reset()
// pclog("Reset FDC\n");
}
-int ins;
-
int fdc_get_bitcell_period();
+int fdc_get_format_n()
+{
+ return fdc.format_n;
+}
+
+int fdc_is_mfm()
+{
+ return (fdc.command & 0x40) ? 1 : 0;
+}
+
double fdc_get_hut()
{
int hut = (fdc.specify[0] & 0xF);
@@ -339,6 +348,26 @@ void fdc_update_rate(int drive)
// pclog("fdc_update_rate: rate=%i bit_rate=%i bitcell_period=%i\n", fdc.rate, bit_rate, fdc.bitcell_period);
}
+int fdc_get_bit_rate()
+{
+ switch(bit_rate)
+ {
+ case 500:
+ return 0;
+ case 300:
+ return 1;
+ case 2000:
+ return 1 | 4;
+ case 250:
+ return 2;
+ case 1000:
+ return 3;
+ default:
+ return 2;
+ }
+ return 2;
+}
+
int fdc_get_bitcell_period()
{
return fdc.bitcell_period;
@@ -500,7 +529,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc.data_ready = 0;
fdc.command=val;
-// pclog("Starting FDC command %02X\n",fdc.command);
+ // pclog("Starting FDC command %02X\n",fdc.command);
switch (fdc.command&0x1F)
{
case 1: /*Mode*/
@@ -635,7 +664,7 @@ bad_command:
fdc.params[fdc.pnum++]=val;
if (fdc.pnum==fdc.ptot)
{
-// pclog("Got all params %02X\n", fdc.command);
+ // pclog("Got all params %02X\n", fdc.command);
fdc.stat=0x30;
discint=fdc.command&0x1F;
timer_process();
@@ -747,6 +776,8 @@ bad_command:
fdc.gap = fdc.params[3];
fdc.dtl = 4000000;
fdc.format_sectors = fdc.params[2];
+ fdc.format_n = fdc.params[1];
+ if ((fdc.format_sectors == 18) && (fdc.format_n == 2)) fatal("Deliberate fatal\n");
fdc.format_state = 1;
fdc.pos = 0;
fdc.stat = 0x30;
@@ -1111,33 +1142,10 @@ void fdc_callback()
disctime = 128 * (1 << TIMER_SHIFT);
timer_update_outstanding();
}
-#if 0
else if (fdc.format_state == 2)
{
- temp = fdc_getdata(fdc.pos == ((fdc.params[2] * 4) - 1));
- if (temp == -1)
- {
- timer_process();
- disctime = 128 * (1 << TIMER_SHIFT);
- timer_update_outstanding();
- return;
- }
- fdc.format_dat[fdc.pos++] = temp;
- if (fdc.pos == (fdc.params[2] * 4))
- fdc.format_state = 3;
- timer_process();
- disctime = 128 * (1 << TIMER_SHIFT);
- timer_update_outstanding();
- }
- else if (fdc.format_state == 3)
-#endif
- else if (fdc.format_state == 2)
- {
- pclog("Format next stage track %i head %i\n", fdc.track[fdc.drive], fdc.head);
+ // pclog("Format next stage track %i head %i n %i is_mfm %i gap %i sc %i\n", fdc.track[fdc.drive], fdc.head, fdc_get_format_n(), fdc_is_mfm(), fdc_get_gap(), fdc_get_format_sectors());
disc_format(fdc.drive, fdc.track[fdc.drive], fdc.head, fdc.rate, fdc.params[4]);
-#if 0
- fdc.format_state = 4;
-#endif
fdc.format_state = 3;
}
else
diff --git a/src/ibm.h b/src/ibm.h
index acd26f6bc..5d91e198f 100644
--- a/src/ibm.h
+++ b/src/ibm.h
@@ -112,10 +112,24 @@ typedef struct
int checked; /*Non-zero if selector is known to be valid*/
} x86seg;
+typedef union MMX_REG
+{
+ uint64_t q;
+ int64_t sq;
+ uint32_t l[2];
+ int32_t sl[2];
+ uint16_t w[4];
+ int16_t sw[4];
+ uint8_t b[8];
+ int8_t sb[8];
+} MMX_REG;
+
struct
{
x86reg regs[8];
+ uint8_t tag[8];
+
x86seg *ea_seg;
uint32_t eaaddr;
@@ -127,6 +141,8 @@ struct
uint32_t oldpc;
uint32_t op32;
uint32_t last_ea;
+
+ int TOP;
union
{
@@ -138,12 +154,29 @@ struct
} rm_data;
int8_t ssegs;
+ int8_t ismmx;
+ int8_t abrt;
+
+ int _cycles;
+ int cpu_recomp_ins;
+
+ uint16_t npxs, npxc;
+
+ double ST[8];
+
+ uint16_t MM_w4[8];
+
+ MMX_REG MM[8];
} cpu_state;
+#define cycles cpu_state._cycles
+
#define COMPILE_TIME_ASSERT(expr) typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0];
COMPILE_TIME_ASSERT(sizeof(cpu_state) <= 128);
+#define cpu_state_offset(MEMBER) ((uintptr_t)&cpu_state.MEMBER - (uintptr_t)&cpu_state - 128)
+
/*x86reg regs[8];*/
uint16_t flags,eflags;
@@ -214,7 +247,6 @@ uint32_t dr[8];
//#define IOPLp 1
//#define IOPLV86 ((!(msw&1)) || (CPL<=IOPL))
-extern int cycles;
extern int cycles_lost;
extern int israpidcad;
extern int is486;
diff --git a/src/mem.c b/src/mem.c
index 17aef99c4..d1a3d6a51 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -736,8 +736,6 @@ int loadbios()
-int abrt=0;
-
void resetreadlookup()
{
int c;
@@ -902,7 +900,7 @@ uint32_t mmutranslatereal(uint32_t addr, int rw)
uint32_t addr2;
uint32_t temp,temp2,temp3;
- if (abrt)
+ if (cpu_state.abrt)
{
// pclog("Translate recursive abort\n");
return -1;
@@ -922,7 +920,7 @@ uint32_t mmutranslatereal(uint32_t addr, int rw)
temp&=1;
if (CPL==3) temp|=4;
if (rw) temp|=2;
- abrt = ABRT_PF;
+ cpu_state.abrt = ABRT_PF;
abrt_error = temp;
/* if (addr == 0x70046D)
{
@@ -952,9 +950,9 @@ uint32_t mmutranslatereal(uint32_t addr, int rw)
temp&=1;
if (CPL==3) temp|=4;
if (rw) temp|=2;
- abrt = ABRT_PF;
+ cpu_state.abrt = ABRT_PF;
abrt_error = temp;
-// pclog("%04X\n",abrt);
+// pclog("%04X\n",cpu_state.abrt);
return -1;
}
mmu_perm=temp&4;
@@ -970,7 +968,7 @@ uint32_t mmutranslate_noabrt(uint32_t addr, int rw)
uint32_t addr2;
uint32_t temp,temp2,temp3;
- if (abrt)
+ if (cpu_state.abrt)
return -1;
addr2 = ((cr3 & ~0xfff) + ((addr >> 20) & 0xffc));
diff --git a/src/pc.c b/src/pc.c
index 111c1f967..6fc97f127 100644
--- a/src/pc.c
+++ b/src/pc.c
@@ -264,6 +264,7 @@ void initpc(int argc, char *argv[])
disc_init();
fdi_init();
img_init();
+ d86f_init();
vlan_reset(); //NETWORK
network_card_init(network_card_current);
@@ -482,7 +483,7 @@ void runpc()
scycles_lost = cycles_lost;
cpu_recomp_blocks_latched = cpu_recomp_blocks;
- cpu_recomp_ins_latched = cpu_recomp_ins;
+ cpu_recomp_ins_latched = cpu_state.cpu_recomp_ins;
cpu_recomp_full_ins_latched = cpu_recomp_full_ins;
cpu_new_blocks_latched = cpu_new_blocks;
cpu_recomp_flushes_latched = cpu_recomp_flushes;
@@ -493,7 +494,7 @@ void runpc()
cpu_notreps_latched = cpu_notreps;
cpu_recomp_blocks = 0;
- cpu_recomp_ins = 0;
+ cpu_state.cpu_recomp_ins = 0;
cpu_recomp_full_ins = 0;
cpu_new_blocks = 0;
cpu_recomp_flushes = 0;
diff --git a/src/pc.rc b/src/pc.rc
index 6cb2384f8..9023ff12f 100644
--- a/src/pc.rc
+++ b/src/pc.rc
@@ -70,7 +70,7 @@ END
ConfigureDlg DIALOGEX 0, 0, 248+40, 248+60
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Configure PCem"
+CAPTION "Configure 86Box"
FONT 9, "Segoe UI"
BEGIN
DEFPUSHBUTTON "OK",IDOK,64,284,50,14, WS_TABSTOP
@@ -254,7 +254,7 @@ BEGIN
LTEXT "1",IDC_STEXT1,16,186,180,1000
END
-1 24 "PCem.manifest"
+1 24 "86Box.manifest"
/* Icon by Devcore - https://commons.wikimedia.org/wiki/File:Icon_PC2_256x256.png */
100 ICON "86Box.ico"
diff --git a/src/pit.c b/src/pit.c
index cab9c9b35..34387843c 100644
--- a/src/pit.c
+++ b/src/pit.c
@@ -318,7 +318,6 @@ static int pit_read_timer(int t)
return pit.count[t];
}
-extern int ins;
void pit_write(uint16_t addr, uint8_t val, void *priv)
{
int t;
diff --git a/src/vid_cga.c b/src/vid_cga.c
index bf25c390e..2f2e47654 100644
--- a/src/vid_cga.c
+++ b/src/vid_cga.c
@@ -383,13 +383,12 @@ void cga_poll(void *p)
updatewindowsize(xsize, (ysize << 1) + 16);
}
-startblit();
if (cga->composite)
video_blit_memtoscreen(0, cga->firstline - 4, 0, (cga->lastline - cga->firstline) + 8, xsize, (cga->lastline - cga->firstline) + 8);
else
video_blit_memtoscreen_8(0, cga->firstline - 4, xsize, (cga->lastline - cga->firstline) + 8);
frames++;
-endblit();
+
video_res_x = xsize - 16;
video_res_y = ysize;
if (cga->cgamode & 1)
diff --git a/src/vid_ega.c b/src/vid_ega.c
index a1f2f0b4b..a60ad138d 100644
--- a/src/vid_ega.c
+++ b/src/vid_ega.c
@@ -627,7 +627,6 @@ void ega_poll(void *p)
updatewindowsize(xsize + x_add_ex, ysize + y_add_ex);
}
-startblit();
if (enable_overscan)
{
if ((x >= 160) && ((ega->lastline - ega->firstline) >= 120))
@@ -658,7 +657,6 @@ startblit();
}
video_blit_memtoscreen(32, 0, ega->firstline, ega->lastline + y_add_ex, xsize + x_add_ex, ega->lastline - ega->firstline + y_add_ex);
- endblit();
frames++;
diff --git a/src/vid_hercules.c b/src/vid_hercules.c
index 37e7582e5..c74bb879f 100644
--- a/src/vid_hercules.c
+++ b/src/vid_hercules.c
@@ -275,9 +275,7 @@ void hercules_poll(void *p)
if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize);
}
- startblit();
video_blit_memtoscreen_8(0, hercules->firstline, xsize, ysize);
- endblit();
frames++;
if ((hercules->ctrl & 2) && (hercules->ctrl2 & 1))
{
diff --git a/src/vid_incolor.c b/src/vid_incolor.c
index 9226943a3..9db14a0ae 100644
--- a/src/vid_incolor.c
+++ b/src/vid_incolor.c
@@ -971,9 +971,7 @@ void incolor_poll(void *p)
if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize);
}
- startblit();
video_blit_memtoscreen(0, incolor->firstline, 0, incolor->lastline - incolor->firstline, xsize, incolor->lastline - incolor->firstline);
- endblit();
frames++;
if ((incolor->ctrl & INCOLOR_CTRL_GRAPH) && (incolor->ctrl2 & INCOLOR_CTRL2_GRAPH))
{
diff --git a/src/vid_mda.c b/src/vid_mda.c
index cfaeeb6bf..6c14d2b38 100644
--- a/src/vid_mda.c
+++ b/src/vid_mda.c
@@ -240,9 +240,7 @@ void mda_poll(void *p)
if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize);
}
- startblit();
video_blit_memtoscreen_8(0, mda->firstline, xsize, mda->lastline - mda->firstline);
- endblit();
frames++;
video_res_x = mda->crtc[1];
video_res_y = mda->crtc[6];
diff --git a/src/vid_olivetti_m24.c b/src/vid_olivetti_m24.c
index 722759780..9a2e82aad 100644
--- a/src/vid_olivetti_m24.c
+++ b/src/vid_olivetti_m24.c
@@ -399,10 +399,10 @@ void m24_poll(void *p)
if (ysize < 32) ysize = 200;
updatewindowsize(xsize, ysize + 16);
}
-startblit();
+
video_blit_memtoscreen_8(0, m24->firstline - 8, xsize, (m24->lastline - m24->firstline) + 16);
frames++;
-endblit();
+
video_res_x = xsize - 16;
video_res_y = ysize;
if (m24->cgamode & 1)
diff --git a/src/vid_pc1512.c b/src/vid_pc1512.c
index 97cd35668..8df13bf64 100644
--- a/src/vid_pc1512.c
+++ b/src/vid_pc1512.c
@@ -407,14 +407,14 @@ static void pc1512_poll(void *p)
if (ysize < 32) ysize = 200;
updatewindowsize(xsize, (ysize << 1) + 16);
}
-startblit();
+
video_blit_memtoscreen_8(0, pc1512->firstline - 4, xsize, (pc1512->lastline - pc1512->firstline) + 8);
// blit(buffer,vbuf,0,firstline-4,0,0,xsize,(lastline-firstline)+8+1);
// if (vid_resize) stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,winsizex,winsizey);
// else stretch_blit(vbuf,screen,0,0,xsize,(lastline-firstline)+8+1,0,0,xsize,((lastline-firstline)<<1)+16+2);
// if (readflash) rectfill(screen,winsizex-40,8,winsizex-8,14,0xFFFFFFFF);
// readflash=0;
-endblit();
+
video_res_x = xsize - 16;
video_res_y = ysize;
if (pc1512->cgamode & 1)
diff --git a/src/vid_pcjr.c b/src/vid_pcjr.c
index ce3e26ae2..3f07f59b4 100644
--- a/src/vid_pcjr.c
+++ b/src/vid_pcjr.c
@@ -580,12 +580,12 @@ void pcjr_poll(void *p)
}
// printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize);
- startblit();
+
if (cga_comp)
video_blit_memtoscreen(0, pcjr->firstline-4, 0, (pcjr->lastline - pcjr->firstline) + 8, xsize, (pcjr->lastline - pcjr->firstline) + 8);
else
video_blit_memtoscreen_8(0, pcjr->firstline-4, xsize, (pcjr->lastline - pcjr->firstline) + 8);
- endblit();
+
frames++;
video_res_x = xsize - 16;
video_res_y = ysize;
diff --git a/src/vid_tandy.c b/src/vid_tandy.c
index 4b589ded7..dbba96481 100644
--- a/src/vid_tandy.c
+++ b/src/vid_tandy.c
@@ -618,12 +618,12 @@ void tandy_poll(void *p)
}
// printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize);
- startblit();
+
if (cga_comp)
video_blit_memtoscreen(0, tandy->firstline-4, 0, (tandy->lastline - tandy->firstline) + 8, xsize, (tandy->lastline - tandy->firstline) + 8);
else
video_blit_memtoscreen_8(0, tandy->firstline-4, xsize, (tandy->lastline - tandy->firstline) + 8);
- endblit();
+
frames++;
video_res_x = xsize - 16;
video_res_y = ysize;
diff --git a/src/vid_tandysl.c b/src/vid_tandysl.c
index 070e5a4d4..464df8bf4 100644
--- a/src/vid_tandysl.c
+++ b/src/vid_tandysl.c
@@ -634,9 +634,9 @@ static void tandysl_poll(void *p)
}
// printf("Blit %i %i\n",firstline,lastline);
//printf("Xsize is %i\n",xsize);
- startblit();
+
video_blit_memtoscreen_8(0, tandy->firstline-4, xsize, (tandy->lastline - tandy->firstline) + 8);
- endblit();
+
frames++;
video_res_x = xsize - 16;
video_res_y = ysize;
diff --git a/src/vid_voodoo.c b/src/vid_voodoo.c
index cc87dea6b..9b8157d9f 100644
--- a/src/vid_voodoo.c
+++ b/src/vid_voodoo.c
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker, leilei
- see COPYING for more details
-*/
#include
#include
#include "ibm.h"
@@ -201,7 +198,7 @@ typedef struct voodoo_t
int swap_count;
int disp_buffer;
- int64_t timer_count;
+ int timer_count;
int line;
svga_t *svga;
@@ -600,6 +597,8 @@ enum
FBZ_DEPTH_BIAS = (1 << 16),
+ FBZ_DEPTH_SOURCE = (1 << 20),
+
FBZ_PARAM_ADJUST = (1 << 26)
};
@@ -611,6 +610,7 @@ enum
TEX_I8 = 0x3,
TEX_AI8 = 0x4,
TEX_PAL8 = 0x5,
+ TEX_A8Y4I2Q2 = 0x9,
TEX_R5G6B5 = 0xa,
TEX_ARGB1555 = 0xb,
TEX_ARGB4444 = 0xc,
@@ -1154,6 +1154,13 @@ static inline void tex_read(voodoo_state_t *state, voodoo_texture_state_t *textu
state->tex_a = 0xff;
break;
+ case TEX_A8Y4I2Q2:
+ state->tex_r = state->palette[dat & 0xff].rgba.r;
+ state->tex_g = state->palette[dat & 0xff].rgba.g;
+ state->tex_b = state->palette[dat & 0xff].rgba.b;
+ state->tex_a = dat >> 8;
+ break;
+
case TEX_R5G6B5:
state->tex_r = rgb565[dat].r;
state->tex_g = rgb565[dat].g;
@@ -1292,6 +1299,13 @@ static inline void tex_read_4(voodoo_state_t *state, voodoo_texture_state_t *tex
state->tex_a = 0xff;
break;
+ case TEX_A8Y4I2Q2:
+ state->tex_r = (state->palette[dat[0] & 0xff].rgba.r * d[0] + state->palette[dat[1] & 0xff].rgba.r * d[1] + state->palette[dat[2] & 0xff].rgba.r * d[2] + state->palette[dat[3] & 0xff].rgba.r * d[3]) >> 8;
+ state->tex_g = (state->palette[dat[0] & 0xff].rgba.g * d[0] + state->palette[dat[1] & 0xff].rgba.g * d[1] + state->palette[dat[2] & 0xff].rgba.g * d[2] + state->palette[dat[3] & 0xff].rgba.g * d[3]) >> 8;
+ state->tex_b = (state->palette[dat[0] & 0xff].rgba.b * d[0] + state->palette[dat[1] & 0xff].rgba.b * d[1] + state->palette[dat[2] & 0xff].rgba.b * d[2] + state->palette[dat[3] & 0xff].rgba.b * d[3]) >> 8;
+ state->tex_a = ((dat[0] >> 8) * d[0] + (dat[1] >> 8) * d[1] + (dat[2] >> 8) * d[2] + (dat[3] >> 8) * d[3]) >> 8;
+ break;
+
case TEX_R5G6B5:
state->tex_r = (rgb565[dat[0]].r * d[0] + rgb565[dat[1]].r * d[1] + rgb565[dat[2]].r * d[2] + rgb565[dat[3]].r * d[3]) >> 8;
state->tex_g = (rgb565[dat[0]].g * d[0] + rgb565[dat[1]].g * d[1] + rgb565[dat[2]].g * d[2] + rgb565[dat[3]].g * d[3]) >> 8;
@@ -1405,7 +1419,7 @@ static inline void voodoo_get_texture(voodoo_t *voodoo, voodoo_params_t *params,
}
-#define DEPTH_TEST() \
+#define DEPTH_TEST(comp_depth) \
do \
{ \
switch (depth_op) \
@@ -1414,42 +1428,42 @@ static inline void voodoo_get_texture(voodoo_t *voodoo, voodoo_params_t *params,
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
case DEPTHOP_LESSTHAN: \
- if (!(new_depth < old_depth)) \
+ if (!(comp_depth < old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
} \
break; \
case DEPTHOP_EQUAL: \
- if (!(new_depth == old_depth)) \
+ if (!(comp_depth == old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
} \
break; \
case DEPTHOP_LESSTHANEQUAL: \
- if (!(new_depth <= old_depth)) \
+ if (!(comp_depth <= old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
} \
break; \
case DEPTHOP_GREATERTHAN: \
- if (!(new_depth > old_depth)) \
+ if (!(comp_depth > old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
} \
break; \
case DEPTHOP_NOTEQUAL: \
- if (!(new_depth != old_depth)) \
+ if (!(comp_depth != old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
} \
break; \
case DEPTHOP_GREATERTHANEQUAL: \
- if (!(new_depth >= old_depth)) \
+ if (!(comp_depth >= old_depth)) \
{ \
voodoo->fbiZFuncFail++; \
goto skip_pixel; \
@@ -1796,10 +1810,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
voodoo_draw = voodoo_get_block(voodoo, params, state, odd_even);
#endif
-#if 0
if (voodoo_output)
pclog("dxAB=%08x dxBC=%08x dxAC=%08x\n", state->dxAB, state->dxBC, state->dxAC);
-#endif
// pclog("Start %i %i\n", ystart, voodoo->fbzMode & (1 << 17));
for (; state->y < yend; state->y++)
{
@@ -1845,10 +1857,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
x = (x + 0x7000) >> 16;
x2 = (x2 + 0x7000) >> 16;
-#if 0
if (voodoo_output)
pclog("%03i:%03i : Ax=%08x start_x=%08x dSdX=%016llx dx=%08x s=%08x -> ", x, state->y, state->vertexAx << 8, start_x, params->tmu[0].dTdX, dx, state->tmu0_t);
-#endif
state->ir += (params->dRdX * dx);
state->ig += (params->dGdX * dx);
@@ -1860,10 +1870,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
state->tmu0_w += (params->tmu[0].dWdX * dx);
state->w += (params->dWdX * dx);
-#if 0
if (voodoo_output)
pclog("%08llx %lli %lli\n", state->tmu0_t, state->tmu0_t >> (18+state->lod), (state->tmu0_t + (1 << 17+state->lod)) >> (18+state->lod));
-#endif
if (params->fbzMode & 1)
{
@@ -1919,10 +1927,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
state->fb_mem = fb_mem = &voodoo->fb_mem[params->draw_offset + (real_y * voodoo->row_width)];
state->aux_mem = aux_mem = &voodoo->fb_mem[params->aux_offset + (real_y * voodoo->row_width)];
-#if 0
if (voodoo_output)
pclog("%03i: x=%08x x2=%08x xstart=%08x xend=%08x dx=%08x start_x2=%08x\n", state->y, x, x2, state->xstart, state->xend, dx, start_x2);
-#endif
state->pixel_count = 0;
state->x = x;
@@ -1940,10 +1946,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
start_x = x;
voodoo->pixel_count[odd_even]++;
voodoo->fbiPixelsIn++;
-#if 0
if (voodoo_output)
pclog(" X=%03i T=%08x\n", x, state->tmu0_t);
-#endif
// if (voodoo->fbzMode & FBZ_RGB_WMASK)
{
int update = 1;
@@ -1984,7 +1988,7 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
{
uint16_t old_depth = aux_mem[x];
- DEPTH_TEST();
+ DEPTH_TEST((params->fbzMode & FBZ_DEPTH_SOURCE) ? (params->zaColor & 0xffff) : new_depth);
}
dat = fb_mem[x];
@@ -2675,9 +2679,7 @@ static void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p)
voodoo->params.swapbufferCMD = val;
-#if 0
pclog("Swap buffer %08x %d %p\n", val, voodoo->swap_count, &voodoo->swap_count);
-#endif
// voodoo->front_offset = params->front_offset;
wait_for_render_thread_idle(voodoo);
if (!(val & 1))
@@ -3364,7 +3366,7 @@ static void voodoo_fb_writew(uint32_t addr, uint16_t val, void *p)
{
uint16_t old_depth = *(uint16_t *)(&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]);
- DEPTH_TEST();
+ DEPTH_TEST(new_depth);
}
if ((params->fbzMode & FBZ_CHROMAKEY) &&
@@ -3505,7 +3507,7 @@ static void voodoo_fb_writel(uint32_t addr, uint32_t val, void *p)
{
uint16_t old_depth = *(uint16_t *)(&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]);
- DEPTH_TEST();
+ DEPTH_TEST(new_depth);
}
if ((params->fbzMode & FBZ_CHROMAKEY) &&
@@ -3919,7 +3921,7 @@ static void voodoo_writel(uint32_t addr, uint32_t val, void *p)
}
}
else
- voodoo->dac_readdata = voodoo->dac_data[voodoo->dac_reg];
+ voodoo->dac_readdata = voodoo->dac_data[voodoo->dac_readdata];
}
else
{
@@ -4006,16 +4008,12 @@ static void voodoo_recalcmapping(voodoo_t *voodoo)
{
if (voodoo->pci_enable && voodoo->memBaseAddr)
{
-#if 0
pclog("voodoo_recalcmapping : memBaseAddr %08X\n", voodoo->memBaseAddr);
-#endif
mem_mapping_set_addr(&voodoo->mapping, voodoo->memBaseAddr, 0x01000000);
}
else
{
-#if 0
pclog("voodoo_recalcmapping : disabled\n");
-#endif
mem_mapping_disable(&voodoo->mapping);
}
}
@@ -4024,9 +4022,7 @@ uint8_t voodoo_pci_read(int func, int addr, void *p)
{
voodoo_t *voodoo = (voodoo_t *)p;
-#if 0
pclog("Voodoo PCI read %08X\n", addr);
-#endif
switch (addr)
{
case 0x00: return 0x1a; /*3dfx*/
@@ -4054,9 +4050,7 @@ void voodoo_pci_write(int func, int addr, uint8_t val, void *p)
{
voodoo_t *voodoo = (voodoo_t *)p;
-#if 0
pclog("Voodoo PCI write %04X %02X\n", addr, val);
-#endif
switch (addr)
{
case 0x04:
diff --git a/src/vid_voodoo_codegen_x86-64.h b/src/vid_voodoo_codegen_x86-64.h
index e7992b16e..551c53e49 100644
--- a/src/vid_voodoo_codegen_x86-64.h
+++ b/src/vid_voodoo_codegen_x86-64.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
/*Registers :
alphaMode
@@ -260,6 +257,13 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addbyte(0xb7);
addbyte(0x1c);
addbyte(0x59);
+ if (params->fbzMode & FBZ_DEPTH_SOURCE)
+ {
+ addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/
+ addbyte(0xb7);
+ addbyte(0x86);
+ addlong(offsetof(voodoo_params_t, zaColor));
+ }
addbyte(0x39); /*CMP EAX, EBX*/
addbyte(0xd8);
if (depthop == DEPTHOP_LESSTHAN)
@@ -1311,6 +1315,147 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addlong(0xff000000);
break;
+ case TEX_A8Y4I2Q2:
+ addbyte(0x48); /*MOV RBP, state->palette[EDI]*/
+ addbyte(0x8b);
+ addbyte(0xaf);
+ addlong(offsetof(voodoo_state_t, palette));
+ addbyte(0x0f); /*MOVZX ECX, AL*/
+ addbyte(0xb6);
+ addbyte(0xc8);
+ addbyte(0x66); /*MOVD XMM0, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x44);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, AH*/
+ addbyte(0xb6);
+ addbyte(0xcc);
+ addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xc2);
+ addbyte(0xc1); /*SHR EAX, 16*/
+ addbyte(0xe8);
+ addbyte(16);
+ addbyte(0x66); /*PINSRW XMM0, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc1);
+ addbyte(3);
+ addbyte(0x0f); /*MOVZX ECX, AL*/
+ addbyte(0xb6);
+ addbyte(0xc8);
+ addbyte(0x0f); /*MOVZX EAX, AH*/
+ addbyte(0xb6);
+ addbyte(0xc4);
+ addbyte(0x66); /*MOVD XMM1, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x4c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x06);
+ addbyte(0x0f); /*MOVZX ECX, DL*/
+ addbyte(0xb6);
+ addbyte(0xca);
+ addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xca);
+ addbyte(0x66); /*PINSRW XMM1, EAX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc8);
+ addbyte(3);
+ addbyte(0x66); /*MOVD XMM3, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x5c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, DH*/
+ addbyte(0xb6);
+ addbyte(0xce);
+ addbyte(0xc1); /*SHR EDX, 16*/
+ addbyte(0xea);
+ addbyte(16);
+ addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xda);
+ addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x4e);
+ addbyte(0x10);
+ addbyte(0x66); /*PINSRW XMM3, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xd9);
+ addbyte(3);
+ addbyte(0x0f); /*MOVZX ECX, DL*/
+ addbyte(0xb6);
+ addbyte(0xca);
+ addbyte(0x66); /*PADDW XMM0, XMM1*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc1);
+ addbyte(0x66); /*MOVD XMM1, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x4c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, DH*/
+ addbyte(0xb6);
+ addbyte(0xce);
+ addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xca);
+ addbyte(0x66); /*PMULLW XMM3, bilinear_lookup[ESI]+0x20*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x5e);
+ addbyte(0x20);
+ addbyte(0x66); /*PINSR1 XMM1, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc9);
+ addbyte(3);
+ addbyte(0x66); /*PADDW XMM0, XMM3*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc3);
+ addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x30*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x4e);
+ addbyte(0x30);
+ addbyte(0x66); /*PADDW XMM0, XMM1*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc1);
+ addbyte(0x66); /*PSRLW XMM0, 8*/
+ addbyte(0x0f);
+ addbyte(0x71);
+ addbyte(0xd0);
+ addbyte(8);
+ addbyte(0x66); /*PACKUSWB XMM0, XMM0*/
+ addbyte(0x0f);
+ addbyte(0x67);
+ addbyte(0xc0);
+ addbyte(0x66); /*MOV EAX, XMM0*/
+ addbyte(0x0f);
+ addbyte(0x7e);
+ addbyte(0xc0);
+ break;
+
case TEX_R5G6B5:
addbyte(0x49); /*MOV R8, rgb565*/
addbyte(0xb8);
@@ -2077,6 +2222,31 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addlong(0xff000000);
break;
+ case TEX_A8Y4I2Q2:
+ addbyte(0x48); /*MOV RBP, state->palette[EDI]*/
+ addbyte(0x8b);
+ addbyte(0xaf);
+ addlong(offsetof(voodoo_state_t, palette));
+ addbyte(0x89); /*MOV EBX, EAX*/
+ addbyte(0xc3);
+ addbyte(0x25); /*AND EAX, 0x000000ff*/
+ addlong(0x000000ff);
+ addbyte(0x8b); /*MOV EAX, [EBP+EAX*4]*/
+ addbyte(0x44);
+ addbyte(0x85);
+ addbyte(0);
+ addbyte(0xc1); /*SHL EBX, 16*/
+ addbyte(0xe3);
+ addbyte(16);
+ addbyte(0x81); /*AND EBX, 0xff000000*/
+ addbyte(0xe3);
+ addlong(0xff000000);
+ addbyte(0x25); /*AND EAX, 0x00ffffff*/
+ addlong(0x00ffffff);
+ addbyte(0x09); /*OR EAX, EBX*/
+ addbyte(0xd8);
+ break;
+
case TEX_R5G6B5:
addbyte(0x49); /*MOV R8, rgb565*/
addbyte(0xb8);
diff --git a/src/vid_voodoo_codegen_x86.h b/src/vid_voodoo_codegen_x86.h
index 593adadf7..5d47445b0 100644
--- a/src/vid_voodoo_codegen_x86.h
+++ b/src/vid_voodoo_codegen_x86.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
/*Registers :
alphaMode
@@ -239,6 +236,13 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addbyte(0xb7);
addbyte(0x1c);
addbyte(0x59);
+ if (params->fbzMode & FBZ_DEPTH_SOURCE)
+ {
+ addbyte(0x0f); /*MOVZX EAX, zaColor[ESI]*/
+ addbyte(0xb7);
+ addbyte(0x86);
+ addlong(offsetof(voodoo_params_t, zaColor));
+ }
addbyte(0x39); /*CMP EAX, EBX*/
addbyte(0xd8);
if (depthop == DEPTHOP_LESSTHAN)
@@ -1289,6 +1293,146 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addlong(0xff000000);
break;
+ case TEX_A8Y4I2Q2:
+ addbyte(0x8b); /*MOV EBP, state->palette[EDI]*/
+ addbyte(0xaf);
+ addlong(offsetof(voodoo_state_t, palette));
+ addbyte(0x0f); /*MOVZX ECX, AL*/
+ addbyte(0xb6);
+ addbyte(0xc8);
+ addbyte(0x66); /*MOVD XMM0, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x44);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, AH*/
+ addbyte(0xb6);
+ addbyte(0xcc);
+ addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xc2);
+ addbyte(0xc1); /*SHR EAX, 16*/
+ addbyte(0xe8);
+ addbyte(16);
+ addbyte(0x66); /*PINSRW XMM0, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc1);
+ addbyte(3);
+ addbyte(0x0f); /*MOVZX ECX, AL*/
+ addbyte(0xb6);
+ addbyte(0xc8);
+ addbyte(0x0f); /*MOVZX EAX, AH*/
+ addbyte(0xb6);
+ addbyte(0xc4);
+ addbyte(0x66); /*MOVD XMM1, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x4c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x06);
+ addbyte(0x0f); /*MOVZX ECX, DL*/
+ addbyte(0xb6);
+ addbyte(0xca);
+ addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xca);
+ addbyte(0x66); /*PINSRW XMM1, EAX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc8);
+ addbyte(3);
+ addbyte(0x66); /*MOVD XMM3, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x5c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, DH*/
+ addbyte(0xb6);
+ addbyte(0xce);
+ addbyte(0xc1); /*SHR EDX, 16*/
+ addbyte(0xea);
+ addbyte(16);
+ addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xda);
+ addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x4e);
+ addbyte(0x10);
+ addbyte(0x66); /*PINSRW XMM3, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xd9);
+ addbyte(3);
+ addbyte(0x0f); /*MOVZX ECX, DL*/
+ addbyte(0xb6);
+ addbyte(0xca);
+ addbyte(0x66); /*PADDW XMM0, XMM1*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc1);
+ addbyte(0x66); /*MOVD XMM1, [EBP+ECX*4]*/
+ addbyte(0x0f);
+ addbyte(0x6e);
+ addbyte(0x4c);
+ addbyte(0x8d);
+ addbyte(0);
+ addbyte(0x0f); /*MOVZX ECX, DH*/
+ addbyte(0xb6);
+ addbyte(0xce);
+ addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/
+ addbyte(0x0f);
+ addbyte(0x60);
+ addbyte(0xca);
+ addbyte(0x66); /*PMULLW XMM3, bilinear_lookup[ESI]+0x20*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x5e);
+ addbyte(0x20);
+ addbyte(0x66); /*PINSR1 XMM1, ECX, 3*/
+ addbyte(0x0f);
+ addbyte(0xc4);
+ addbyte(0xc9);
+ addbyte(3);
+ addbyte(0x66); /*PADDW XMM0, XMM3*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc3);
+ addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x30*/
+ addbyte(0x0f);
+ addbyte(0xd5);
+ addbyte(0x4e);
+ addbyte(0x30);
+ addbyte(0x66); /*PADDW XMM0, XMM1*/
+ addbyte(0x0f);
+ addbyte(0xfd);
+ addbyte(0xc1);
+ addbyte(0x66); /*PSRLW XMM0, 8*/
+ addbyte(0x0f);
+ addbyte(0x71);
+ addbyte(0xd0);
+ addbyte(8);
+ addbyte(0x66); /*PACKUSWB XMM0, XMM0*/
+ addbyte(0x0f);
+ addbyte(0x67);
+ addbyte(0xc0);
+ addbyte(0x66); /*MOV EAX, XMM0*/
+ addbyte(0x0f);
+ addbyte(0x7e);
+ addbyte(0xc0);
+ break;
+
case TEX_R5G6B5:
addbyte(0x0f); /*MOVZX ECX, AX*/
addbyte(0xb7);
@@ -2040,6 +2184,30 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
addlong(0xff000000);
break;
+ case TEX_A8Y4I2Q2:
+ addbyte(0x8b); /*MOV EBP, state->palette[EDI]*/
+ addbyte(0xaf);
+ addlong(offsetof(voodoo_state_t, palette));
+ addbyte(0x89); /*MOV EBX, EAX*/
+ addbyte(0xc3);
+ addbyte(0x25); /*AND EAX, 0x000000ff*/
+ addlong(0x000000ff);
+ addbyte(0x8b); /*MOV EAX, [EBP+EAX*4]*/
+ addbyte(0x44);
+ addbyte(0x85);
+ addbyte(0);
+ addbyte(0xc1); /*SHL EBX, 16*/
+ addbyte(0xe3);
+ addbyte(16);
+ addbyte(0x81); /*AND EBX, 0xff000000*/
+ addbyte(0xe3);
+ addlong(0xff000000);
+ addbyte(0x25); /*AND EAX, 0x00ffffff*/
+ addlong(0x00ffffff);
+ addbyte(0x09); /*OR EAX, EBX*/
+ addbyte(0xd8);
+ break;
+
case TEX_R5G6B5:
addbyte(0x8b); /*MOV EAX, rgb565[EAX*4]*/
addbyte(0x04);
diff --git a/src/win.c b/src/win.c
index 203f4f17c..30c047467 100644
--- a/src/win.c
+++ b/src/win.c
@@ -77,8 +77,8 @@ static struct
int winsizex=640,winsizey=480;
int efwinsizey=480;
int gfx_present[GFX_MAX];
-#undef cs
-CRITICAL_SECTION cs;
+
+HANDLE ghMutex;
HANDLE mainthreadh;
@@ -172,12 +172,12 @@ void releasemouse()
void startblit()
{
- EnterCriticalSection(&cs);
+ WaitForSingleObject(ghMutex, INFINITE);
}
void endblit()
{
- LeaveCriticalSection(&cs);
+ ReleaseMutex(ghMutex);
}
void leave_fullscreen()
@@ -702,7 +702,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
/// QueryPerformanceCounter(&counter_posold);
// counter_posold.QuadPart*=100;
- InitializeCriticalSection(&cs);
+ ghMutex = CreateMutex(NULL, FALSE, NULL);
mainthreadh=(HANDLE)_beginthread(mainthread,0,NULL);
SetThreadPriority(mainthreadh, THREAD_PRIORITY_HIGHEST);
@@ -994,7 +994,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
case IDM_DISC_A:
- if (!getfile(hwnd,"Disc image (*.12;*.144;*.360;*.720;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD)\0*.12;*.144;*.360;*.720;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD\0All files (*.*)\0*.*\0",discfns[0]))
+ if (!getfile(hwnd,"Disc image (*.12;*.144;*.360;*.720;*.86F;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD)\0*.12;*.144;*.360;*.720;*.86F;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD\0All files (*.*)\0*.*\0",discfns[0]))
{
disc_close(0);
disc_load(0, openfilestring);
@@ -1002,7 +1002,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
break;
case IDM_DISC_B:
- if (!getfile(hwnd,"Disc image (*.12;*.144;*.360;*.720;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD)\0*.12;*.144;*.360;*.720;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD\0All files (*.*)\0*.*\0",discfns[1]))
+ if (!getfile(hwnd,"Disc image (*.12;*.144;*.360;*.720;*.86F;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD)\0*.12;*.144;*.360;*.720;*.86F;*.DSK;*.IMG;*.IMA;*.FDI;*.FLP;*.XDF;*.VFD\0All files (*.*)\0*.*\0",discfns[1]))
{
disc_close(1);
disc_load(1, openfilestring);
diff --git a/src/x86.h b/src/x86.h
index a43674f09..565d52591 100644
--- a/src/x86.h
+++ b/src/x86.h
@@ -5,7 +5,7 @@ int oldcpl;
extern int nmi_enable;
int tempc;
-int cycles,output;
+int output;
int firstrepcycle;
uint32_t easeg,ealimit,ealimitw;
@@ -14,7 +14,7 @@ int skipnextprint;
int inhlt;
uint8_t opcode;
-int ins,noint;
+int noint;
uint16_t lastcs,lastpc;
int timetolive,keyboardtimer;
@@ -83,7 +83,6 @@ enum
ABRT_PF = 0xE
};
-extern int abrt;
extern uint32_t abrt_error;
void x86_doabrt(int x86_abrt);
diff --git a/src/x86_ops_arith.h b/src/x86_ops_arith.h
index 88054a67d..dd05e5688 100644
--- a/src/x86_ops_arith.h
+++ b/src/x86_ops_arith.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define OP_ARITH(name, operation, setflags, flagops, gettempc) \
static int op ## name ## _b_rmw_a16(uint32_t fetchdat) \
{ \
@@ -16,9 +13,9 @@
} \
else \
{ \
- uint8_t dst = geteab(); if (abrt) return 1; \
+ uint8_t dst = geteab(); if (cpu_state.abrt) return 1; \
uint8_t src = getr8(cpu_reg); \
- seteab(operation); if (abrt) return 1; \
+ seteab(operation); if (cpu_state.abrt) return 1; \
setflags ## 8 flagops; \
CLOCK_CYCLES(timing_mr); \
} \
@@ -38,9 +35,9 @@
} \
else \
{ \
- uint8_t dst = geteab(); if (abrt) return 1; \
+ uint8_t dst = geteab(); if (cpu_state.abrt) return 1; \
uint8_t src = getr8(cpu_reg); \
- seteab(operation); if (abrt) return 1; \
+ seteab(operation); if (cpu_state.abrt) return 1; \
setflags ## 8 flagops; \
CLOCK_CYCLES(timing_mr); \
} \
@@ -61,9 +58,9 @@
} \
else \
{ \
- uint16_t dst = geteaw(); if (abrt) return 1; \
+ uint16_t dst = geteaw(); if (cpu_state.abrt) return 1; \
uint16_t src = cpu_state.regs[cpu_reg].w; \
- seteaw(operation); if (abrt) return 1; \
+ seteaw(operation); if (cpu_state.abrt) return 1; \
setflags ## 16 flagops; \
CLOCK_CYCLES(timing_mr); \
} \
@@ -83,9 +80,9 @@
} \
else \
{ \
- uint16_t dst = geteaw(); if (abrt) return 1; \
+ uint16_t dst = geteaw(); if (cpu_state.abrt) return 1; \
uint16_t src = cpu_state.regs[cpu_reg].w; \
- seteaw(operation); if (abrt) return 1; \
+ seteaw(operation); if (cpu_state.abrt) return 1; \
setflags ## 16 flagops; \
CLOCK_CYCLES(timing_mr); \
} \
@@ -106,9 +103,9 @@
} \
else \
{ \
- uint32_t dst = geteal(); if (abrt) return 1; \
+ uint32_t dst = geteal(); if (cpu_state.abrt) return 1; \
uint32_t src = cpu_state.regs[cpu_reg].l; \
- seteal(operation); if (abrt) return 1; \
+ seteal(operation); if (cpu_state.abrt) return 1; \
setflags ## 32 flagops; \
CLOCK_CYCLES(timing_mrl); \
} \
@@ -128,9 +125,9 @@
} \
else \
{ \
- uint32_t dst = geteal(); if (abrt) return 1; \
+ uint32_t dst = geteal(); if (cpu_state.abrt) return 1; \
uint32_t src = cpu_state.regs[cpu_reg].l; \
- seteal(operation); if (abrt) return 1; \
+ seteal(operation); if (cpu_state.abrt) return 1; \
setflags ## 32 flagops; \
CLOCK_CYCLES(timing_mrl); \
} \
@@ -143,7 +140,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_16(fetchdat); \
dst = getr8(cpu_reg); \
- src = geteab(); if (abrt) return 1; \
+ src = geteab(); if (cpu_state.abrt) return 1; \
setflags ## 8 flagops; \
setr8(cpu_reg, operation); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm); \
@@ -155,7 +152,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_32(fetchdat); \
dst = getr8(cpu_reg); \
- src = geteab(); if (abrt) return 1; \
+ src = geteab(); if (cpu_state.abrt) return 1; \
setflags ## 8 flagops; \
setr8(cpu_reg, operation); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm); \
@@ -168,7 +165,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_16(fetchdat); \
dst = cpu_state.regs[cpu_reg].w; \
- src = geteaw(); if (abrt) return 1; \
+ src = geteaw(); if (cpu_state.abrt) return 1; \
setflags ## 16 flagops; \
cpu_state.regs[cpu_reg].w = operation; \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm); \
@@ -180,7 +177,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_32(fetchdat); \
dst = cpu_state.regs[cpu_reg].w; \
- src = geteaw(); if (abrt) return 1; \
+ src = geteaw(); if (cpu_state.abrt) return 1; \
setflags ## 16 flagops; \
cpu_state.regs[cpu_reg].w = operation; \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm); \
@@ -193,7 +190,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_16(fetchdat); \
dst = cpu_state.regs[cpu_reg].l; \
- src = geteal(); if (abrt) return 1; \
+ src = geteal(); if (cpu_state.abrt) return 1; \
setflags ## 32 flagops; \
cpu_state.regs[cpu_reg].l = operation; \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rml); \
@@ -205,7 +202,7 @@
if (gettempc) tempc = CF_SET() ? 1 : 0; \
fetch_ea_32(fetchdat); \
dst = cpu_state.regs[cpu_reg].l; \
- src = geteal(); if (abrt) return 1; \
+ src = geteal(); if (cpu_state.abrt) return 1; \
setflags ## 32 flagops; \
cpu_state.regs[cpu_reg].l = operation; \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rml); \
@@ -237,7 +234,7 @@
static int op ## name ## _EAX_imm(uint32_t fetchdat) \
{ \
uint32_t dst = EAX; \
- uint32_t src = getlong(); if (abrt) return 1; \
+ uint32_t src = getlong(); if (cpu_state.abrt) return 1; \
if (gettempc) tempc = CF_SET() ? 1 : 0; \
setflags ## 32 flagops; \
EAX = operation; \
@@ -257,7 +254,7 @@ static int opCMP_b_rmw_a16(uint32_t fetchdat)
{
uint8_t dst;
fetch_ea_16(fetchdat);
- dst = geteab(); if (abrt) return 1;
+ dst = geteab(); if (cpu_state.abrt) return 1;
setsub8(dst, getr8(cpu_reg));
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -267,7 +264,7 @@ static int opCMP_b_rmw_a32(uint32_t fetchdat)
{
uint8_t dst;
fetch_ea_32(fetchdat);
- dst = geteab(); if (abrt) return 1;
+ dst = geteab(); if (cpu_state.abrt) return 1;
setsub8(dst, getr8(cpu_reg));
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -278,7 +275,7 @@ static int opCMP_w_rmw_a16(uint32_t fetchdat)
{
uint16_t dst;
fetch_ea_16(fetchdat);
- dst = geteaw(); if (abrt) return 1;
+ dst = geteaw(); if (cpu_state.abrt) return 1;
setsub16(dst, cpu_state.regs[cpu_reg].w);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -288,7 +285,7 @@ static int opCMP_w_rmw_a32(uint32_t fetchdat)
{
uint16_t dst;
fetch_ea_32(fetchdat);
- dst = geteaw(); if (abrt) return 1;
+ dst = geteaw(); if (cpu_state.abrt) return 1;
setsub16(dst, cpu_state.regs[cpu_reg].w);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -299,7 +296,7 @@ static int opCMP_l_rmw_a16(uint32_t fetchdat)
{
uint32_t dst;
fetch_ea_16(fetchdat);
- dst = geteal(); if (abrt) return 1;
+ dst = geteal(); if (cpu_state.abrt) return 1;
setsub32(dst, cpu_state.regs[cpu_reg].l);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -309,7 +306,7 @@ static int opCMP_l_rmw_a32(uint32_t fetchdat)
{
uint32_t dst;
fetch_ea_32(fetchdat);
- dst = geteal(); if (abrt) return 1;
+ dst = geteal(); if (cpu_state.abrt) return 1;
setsub32(dst, cpu_state.regs[cpu_reg].l);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
@@ -320,7 +317,7 @@ static int opCMP_b_rm_a16(uint32_t fetchdat)
{
uint8_t src;
fetch_ea_16(fetchdat);
- src = geteab(); if (abrt) return 1;
+ src = geteab(); if (cpu_state.abrt) return 1;
setsub8(getr8(cpu_reg), src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm);
return 0;
@@ -329,7 +326,7 @@ static int opCMP_b_rm_a32(uint32_t fetchdat)
{
uint8_t src;
fetch_ea_32(fetchdat);
- src = geteab(); if (abrt) return 1;
+ src = geteab(); if (cpu_state.abrt) return 1;
setsub8(getr8(cpu_reg), src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm);
return 0;
@@ -339,7 +336,7 @@ static int opCMP_w_rm_a16(uint32_t fetchdat)
{
uint16_t src;
fetch_ea_16(fetchdat);
- src = geteaw(); if (abrt) return 1;
+ src = geteaw(); if (cpu_state.abrt) return 1;
setsub16(cpu_state.regs[cpu_reg].w, src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm);
return 0;
@@ -348,7 +345,7 @@ static int opCMP_w_rm_a32(uint32_t fetchdat)
{
uint16_t src;
fetch_ea_32(fetchdat);
- src = geteaw(); if (abrt) return 1;
+ src = geteaw(); if (cpu_state.abrt) return 1;
setsub16(cpu_state.regs[cpu_reg].w, src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rm);
return 0;
@@ -358,7 +355,7 @@ static int opCMP_l_rm_a16(uint32_t fetchdat)
{
uint32_t src;
fetch_ea_16(fetchdat);
- src = geteal(); if (abrt) return 1;
+ src = geteal(); if (cpu_state.abrt) return 1;
setsub32(cpu_state.regs[cpu_reg].l, src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rml);
return 0;
@@ -367,7 +364,7 @@ static int opCMP_l_rm_a32(uint32_t fetchdat)
{
uint32_t src;
fetch_ea_32(fetchdat);
- src = geteal(); if (abrt) return 1;
+ src = geteal(); if (cpu_state.abrt) return 1;
setsub32(cpu_state.regs[cpu_reg].l, src);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_rml);
return 0;
@@ -391,7 +388,7 @@ static int opCMP_AX_imm(uint32_t fetchdat)
static int opCMP_EAX_imm(uint32_t fetchdat)
{
- uint32_t src = getlong(); if (abrt) return 1;
+ uint32_t src = getlong(); if (cpu_state.abrt) return 1;
setsub32(EAX, src);
CLOCK_CYCLES(timing_rr);
return 0;
@@ -401,7 +398,7 @@ static int opTEST_b_a16(uint32_t fetchdat)
{
uint8_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
temp2 = getr8(cpu_reg);
setznp8(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -412,7 +409,7 @@ static int opTEST_b_a32(uint32_t fetchdat)
{
uint8_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
temp2 = getr8(cpu_reg);
setznp8(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -424,7 +421,7 @@ static int opTEST_w_a16(uint32_t fetchdat)
{
uint16_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
temp2 = cpu_state.regs[cpu_reg].w;
setznp16(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -435,7 +432,7 @@ static int opTEST_w_a32(uint32_t fetchdat)
{
uint16_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
temp2 = cpu_state.regs[cpu_reg].w;
setznp16(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -447,7 +444,7 @@ static int opTEST_l_a16(uint32_t fetchdat)
{
uint32_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
temp2 = cpu_state.regs[cpu_reg].l;
setznp32(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -458,7 +455,7 @@ static int opTEST_l_a32(uint32_t fetchdat)
{
uint32_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
temp2 = cpu_state.regs[cpu_reg].l;
setznp32(temp & temp2);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
@@ -482,7 +479,7 @@ static int opTEST_AX(uint32_t fetchdat)
}
static int opTEST_EAX(uint32_t fetchdat)
{
- uint32_t temp = getlong(); if (abrt) return 1;
+ uint32_t temp = getlong(); if (cpu_state.abrt) return 1;
setznp32(EAX & temp);
CLOCK_CYCLES(timing_rr);
return 0;
@@ -490,46 +487,46 @@ static int opTEST_EAX(uint32_t fetchdat)
#define ARITH_MULTI(ea_width, flag_width) \
- dst = getea ## ea_width(); if (abrt) return 1; \
+ dst = getea ## ea_width(); if (cpu_state.abrt) return 1; \
switch (rmdat&0x38) \
{ \
case 0x00: /*ADD ea, #*/ \
- setea ## ea_width(dst + src); if (abrt) return 1; \
+ setea ## ea_width(dst + src); if (cpu_state.abrt) return 1; \
setadd ## flag_width(dst, src); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x08: /*OR ea, #*/ \
dst |= src; \
- setea ## ea_width(dst); if (abrt) return 1; \
+ setea ## ea_width(dst); if (cpu_state.abrt) return 1; \
setznp ## flag_width(dst); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x10: /*ADC ea, #*/ \
tempc = CF_SET() ? 1 : 0; \
- setea ## ea_width(dst + src + tempc); if (abrt) return 1; \
+ setea ## ea_width(dst + src + tempc); if (cpu_state.abrt) return 1; \
setadc ## flag_width(dst, src); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x18: /*SBB ea, #*/ \
tempc = CF_SET() ? 1 : 0; \
- setea ## ea_width(dst - (src + tempc)); if (abrt) return 1; \
+ setea ## ea_width(dst - (src + tempc)); if (cpu_state.abrt) return 1; \
setsbc ## flag_width(dst, src); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x20: /*AND ea, #*/ \
dst &= src; \
- setea ## ea_width(dst); if (abrt) return 1; \
+ setea ## ea_width(dst); if (cpu_state.abrt) return 1; \
setznp ## flag_width(dst); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x28: /*SUB ea, #*/ \
- setea ## ea_width(dst - src); if (abrt) return 1; \
+ setea ## ea_width(dst - src); if (cpu_state.abrt) return 1; \
setsub ## flag_width(dst, src); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
case 0x30: /*XOR ea, #*/ \
dst ^= src; \
- setea ## ea_width(dst); if (abrt) return 1; \
+ setea ## ea_width(dst); if (cpu_state.abrt) return 1; \
setznp ## flag_width(dst); \
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mr); \
break; \
@@ -546,7 +543,7 @@ static int op80_a16(uint32_t fetchdat)
uint8_t src, dst;
fetch_ea_16(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
ARITH_MULTI(b, 8);
return 0;
@@ -556,7 +553,7 @@ static int op80_a32(uint32_t fetchdat)
uint8_t src, dst;
fetch_ea_32(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
ARITH_MULTI(b, 8);
return 0;
@@ -566,7 +563,7 @@ static int op81_w_a16(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_16(fetchdat);
- src = getword(); if (abrt) return 1;
+ src = getword(); if (cpu_state.abrt) return 1;
ARITH_MULTI(w, 16);
return 0;
@@ -576,7 +573,7 @@ static int op81_w_a32(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_32(fetchdat);
- src = getword(); if (abrt) return 1;
+ src = getword(); if (cpu_state.abrt) return 1;
ARITH_MULTI(w, 16);
return 0;
@@ -586,7 +583,7 @@ static int op81_l_a16(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_16(fetchdat);
- src = getlong(); if (abrt) return 1;
+ src = getlong(); if (cpu_state.abrt) return 1;
ARITH_MULTI(l, 32);
return 0;
@@ -596,7 +593,7 @@ static int op81_l_a32(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_32(fetchdat);
- src = getlong(); if (abrt) return 1;
+ src = getlong(); if (cpu_state.abrt) return 1;
ARITH_MULTI(l, 32);
return 0;
@@ -607,7 +604,7 @@ static int op83_w_a16(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_16(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
if (src & 0x80) src |= 0xff00;
ARITH_MULTI(w, 16);
@@ -618,7 +615,7 @@ static int op83_w_a32(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_32(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
if (src & 0x80) src |= 0xff00;
ARITH_MULTI(w, 16);
@@ -630,7 +627,7 @@ static int op83_l_a16(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_16(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
if (src & 0x80) src |= 0xffffff00;
ARITH_MULTI(l, 32);
@@ -641,7 +638,7 @@ static int op83_l_a32(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_32(fetchdat);
- src = getbyte(); if (abrt) return 1;
+ src = getbyte(); if (cpu_state.abrt) return 1;
if (src & 0x80) src |= 0xffffff00;
ARITH_MULTI(l, 32);
diff --git a/src/x86_ops_atomic.h b/src/x86_ops_atomic.h
index aecf5ae4d..7d90e22d1 100644
--- a/src/x86_ops_atomic.h
+++ b/src/x86_ops_atomic.h
@@ -8,10 +8,10 @@ static int opCMPXCHG_b_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
if (AL == temp) seteab(getr8(cpu_reg));
else AL = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub8(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -26,10 +26,10 @@ static int opCMPXCHG_b_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
if (AL == temp) seteab(getr8(cpu_reg));
else AL = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub8(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -45,10 +45,10 @@ static int opCMPXCHG_w_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
if (AX == temp) seteaw(cpu_state.regs[cpu_reg].w);
else AX = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub16(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -63,10 +63,10 @@ static int opCMPXCHG_w_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
if (AX == temp) seteaw(cpu_state.regs[cpu_reg].w);
else AX = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub16(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -82,10 +82,10 @@ static int opCMPXCHG_l_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
if (EAX == temp) seteal(cpu_state.regs[cpu_reg].l);
else EAX = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub32(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -100,10 +100,10 @@ static int opCMPXCHG_l_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
if (EAX == temp) seteal(cpu_state.regs[cpu_reg].l);
else EAX = temp;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
setsub32(temp2, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 6 : 10);
return 0;
@@ -120,7 +120,7 @@ static int opCMPXCHG8B_a16(uint32_t fetchdat)
}
fetch_ea_16(fetchdat);
temp = geteal();
- temp_hi = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
+ temp_hi = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
if (EAX == temp && EDX == temp_hi)
{
seteal(EBX);
@@ -131,7 +131,7 @@ static int opCMPXCHG8B_a16(uint32_t fetchdat)
EAX = temp;
EDX = temp_hi;
}
- if (abrt) return 0;
+ if (cpu_state.abrt) return 0;
flags_rebuild();
if (temp == temp2 && temp_hi == temp2_hi)
flags |= Z_FLAG;
@@ -151,7 +151,7 @@ static int opCMPXCHG8B_a32(uint32_t fetchdat)
}
fetch_ea_32(fetchdat);
temp = geteal();
- temp_hi = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
+ temp_hi = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
if (EAX == temp && EDX == temp_hi)
{
seteal(EBX);
@@ -162,7 +162,7 @@ static int opCMPXCHG8B_a32(uint32_t fetchdat)
EAX = temp;
EDX = temp_hi;
}
- if (abrt) return 0;
+ if (cpu_state.abrt) return 0;
flags_rebuild();
if (temp == temp2 && temp_hi == temp2_hi)
flags |= Z_FLAG;
@@ -182,8 +182,8 @@ static int opXADD_b_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
- seteab(temp + getr8(cpu_reg)); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
+ seteab(temp + getr8(cpu_reg)); if (cpu_state.abrt) return 1;
setadd8(temp, getr8(cpu_reg));
setr8(cpu_reg, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
@@ -199,8 +199,8 @@ static int opXADD_b_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
- seteab(temp + getr8(cpu_reg)); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
+ seteab(temp + getr8(cpu_reg)); if (cpu_state.abrt) return 1;
setadd8(temp, getr8(cpu_reg));
setr8(cpu_reg, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
@@ -217,8 +217,8 @@ static int opXADD_w_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp + cpu_state.regs[cpu_reg].w); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp + cpu_state.regs[cpu_reg].w); if (cpu_state.abrt) return 1;
setadd16(temp, cpu_state.regs[cpu_reg].w);
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
@@ -234,8 +234,8 @@ static int opXADD_w_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp + cpu_state.regs[cpu_reg].w); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp + cpu_state.regs[cpu_reg].w); if (cpu_state.abrt) return 1;
setadd16(temp, cpu_state.regs[cpu_reg].w);
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
@@ -252,8 +252,8 @@ static int opXADD_l_a16(uint32_t fetchdat)
return 1;
}
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
- seteal(temp + cpu_state.regs[cpu_reg].l); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp + cpu_state.regs[cpu_reg].l); if (cpu_state.abrt) return 1;
setadd32(temp, cpu_state.regs[cpu_reg].l);
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
@@ -269,8 +269,8 @@ static int opXADD_l_a32(uint32_t fetchdat)
return 1;
}
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
- seteal(temp + cpu_state.regs[cpu_reg].l); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp + cpu_state.regs[cpu_reg].l); if (cpu_state.abrt) return 1;
setadd32(temp, cpu_state.regs[cpu_reg].l);
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 4);
diff --git a/src/x86_ops_bit.h b/src/x86_ops_bit.h
index 695209a01..9b3d71005 100644
--- a/src/x86_ops_bit.h
+++ b/src/x86_ops_bit.h
@@ -5,7 +5,7 @@ static int opBT_w_r_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].w / 16) * 2); eal_r = 0;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
if (temp & (1 << (cpu_state.regs[cpu_reg].w & 15))) flags |= C_FLAG;
else flags &= ~C_FLAG;
@@ -19,7 +19,7 @@ static int opBT_w_r_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].w / 16) * 2); eal_r = 0;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
if (temp & (1 << (cpu_state.regs[cpu_reg].w & 15))) flags |= C_FLAG;
else flags &= ~C_FLAG;
@@ -33,7 +33,7 @@ static int opBT_l_r_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].l / 32) * 4); eal_r = 0;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
flags_rebuild();
if (temp & (1 << (cpu_state.regs[cpu_reg].l & 31))) flags |= C_FLAG;
else flags &= ~C_FLAG;
@@ -47,7 +47,7 @@ static int opBT_l_r_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].l / 32) * 4); eal_r = 0;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
flags_rebuild();
if (temp & (1 << (cpu_state.regs[cpu_reg].l & 31))) flags |= C_FLAG;
else flags &= ~C_FLAG;
@@ -64,10 +64,10 @@ static int opBT_l_r_a32(uint32_t fetchdat)
\
fetch_ea_16(fetchdat); \
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].w / 16) * 2); eal_r = eal_w = 0; \
- temp = geteaw(); if (abrt) return 1; \
+ temp = geteaw(); if (cpu_state.abrt) return 1; \
tempc = (temp & (1 << (cpu_state.regs[cpu_reg].w & 15))) ? 1 : 0; \
temp operation (1 << (cpu_state.regs[cpu_reg].w & 15)); \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
else flags &= ~C_FLAG; \
@@ -82,10 +82,10 @@ static int opBT_l_r_a32(uint32_t fetchdat)
\
fetch_ea_32(fetchdat); \
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].w / 16) * 2); eal_r = eal_w = 0; \
- temp = geteaw(); if (abrt) return 1; \
+ temp = geteaw(); if (cpu_state.abrt) return 1; \
tempc = (temp & (1 << (cpu_state.regs[cpu_reg].w & 15))) ? 1 : 0; \
temp operation (1 << (cpu_state.regs[cpu_reg].w & 15)); \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
else flags &= ~C_FLAG; \
@@ -100,10 +100,10 @@ static int opBT_l_r_a32(uint32_t fetchdat)
\
fetch_ea_16(fetchdat); \
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].l / 32) * 4); eal_r = eal_w = 0; \
- temp = geteal(); if (abrt) return 1; \
+ temp = geteal(); if (cpu_state.abrt) return 1; \
tempc = (temp & (1 << (cpu_state.regs[cpu_reg].l & 31))) ? 1 : 0; \
temp operation (1 << (cpu_state.regs[cpu_reg].l & 31)); \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
else flags &= ~C_FLAG; \
@@ -118,10 +118,10 @@ static int opBT_l_r_a32(uint32_t fetchdat)
\
fetch_ea_32(fetchdat); \
cpu_state.eaaddr += ((cpu_state.regs[cpu_reg].l / 32) * 4); eal_r = eal_w = 0; \
- temp = geteal(); if (abrt) return 1; \
+ temp = geteal(); if (cpu_state.abrt) return 1; \
tempc = (temp & (1 << (cpu_state.regs[cpu_reg].l & 31))) ? 1 : 0; \
temp operation (1 << (cpu_state.regs[cpu_reg].l & 31)); \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
else flags &= ~C_FLAG; \
@@ -142,7 +142,7 @@ static int opBA_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
temp = geteaw();
- count = getbyte(); if (abrt) return 1;
+ count = getbyte(); if (cpu_state.abrt) return 1;
tempc = temp & (1 << count);
flags_rebuild();
switch (rmdat & 0x38)
@@ -168,7 +168,7 @@ static int opBA_w_a16(uint32_t fetchdat)
x86illegal();
break;
}
- seteaw(temp); if (abrt) return 1;
+ seteaw(temp); if (cpu_state.abrt) return 1;
if (tempc) flags |= C_FLAG;
else flags &= ~C_FLAG;
CLOCK_CYCLES(6);
@@ -182,7 +182,7 @@ static int opBA_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
temp = geteaw();
- count = getbyte(); if (abrt) return 1;
+ count = getbyte(); if (cpu_state.abrt) return 1;
tempc = temp & (1 << count);
flags_rebuild();
switch (rmdat & 0x38)
@@ -208,7 +208,7 @@ static int opBA_w_a32(uint32_t fetchdat)
x86illegal();
break;
}
- seteaw(temp); if (abrt) return 1;
+ seteaw(temp); if (cpu_state.abrt) return 1;
if (tempc) flags |= C_FLAG;
else flags &= ~C_FLAG;
CLOCK_CYCLES(6);
@@ -223,7 +223,7 @@ static int opBA_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
temp = geteal();
- count = getbyte(); if (abrt) return 1;
+ count = getbyte(); if (cpu_state.abrt) return 1;
tempc = temp & (1 << count);
flags_rebuild();
switch (rmdat & 0x38)
@@ -249,7 +249,7 @@ static int opBA_l_a16(uint32_t fetchdat)
x86illegal();
break;
}
- seteal(temp); if (abrt) return 1;
+ seteal(temp); if (cpu_state.abrt) return 1;
if (tempc) flags |= C_FLAG;
else flags &= ~C_FLAG;
CLOCK_CYCLES(6);
@@ -263,7 +263,7 @@ static int opBA_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
temp = geteal();
- count = getbyte(); if (abrt) return 1;
+ count = getbyte(); if (cpu_state.abrt) return 1;
tempc = temp & (1 << count);
flags_rebuild();
switch (rmdat & 0x38)
@@ -289,7 +289,7 @@ static int opBA_l_a32(uint32_t fetchdat)
x86illegal();
break;
}
- seteal(temp); if (abrt) return 1;
+ seteal(temp); if (cpu_state.abrt) return 1;
if (tempc) flags |= C_FLAG;
else flags &= ~C_FLAG;
CLOCK_CYCLES(6);
diff --git a/src/x86_ops_bitscan.h b/src/x86_ops_bitscan.h
index 7f3c17b1a..edd3fde33 100644
--- a/src/x86_ops_bitscan.h
+++ b/src/x86_ops_bitscan.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define BS_common(start, end, dir, dest, time) \
flags_rebuild(); \
if (temp) \
@@ -25,7 +22,7 @@ static int opBSF_w_a16(uint32_t fetchdat)
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
BS_common(0, 16, 1, cpu_state.regs[cpu_reg].w, (is486) ? 1 : 3);
@@ -37,7 +34,7 @@ static int opBSF_w_a32(uint32_t fetchdat)
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
BS_common(0, 16, 1, cpu_state.regs[cpu_reg].w, (is486) ? 1 : 3);
@@ -49,7 +46,7 @@ static int opBSF_l_a16(uint32_t fetchdat)
uint32_t temp;
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
BS_common(0, 32, 1, cpu_state.regs[cpu_reg].l, (is486) ? 1 : 3);
@@ -61,7 +58,7 @@ static int opBSF_l_a32(uint32_t fetchdat)
uint32_t temp;
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
BS_common(0, 32, 1, cpu_state.regs[cpu_reg].l, (is486) ? 1 : 3);
@@ -74,7 +71,7 @@ static int opBSR_w_a16(uint32_t fetchdat)
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
BS_common(15, -1, -1, cpu_state.regs[cpu_reg].w, 3);
@@ -86,7 +83,7 @@ static int opBSR_w_a32(uint32_t fetchdat)
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
BS_common(15, -1, -1, cpu_state.regs[cpu_reg].w, 3);
@@ -98,7 +95,7 @@ static int opBSR_l_a16(uint32_t fetchdat)
uint32_t temp;
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
BS_common(31, -1, -1, cpu_state.regs[cpu_reg].l, 3);
@@ -110,7 +107,7 @@ static int opBSR_l_a32(uint32_t fetchdat)
uint32_t temp;
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
BS_common(31, -1, -1, cpu_state.regs[cpu_reg].l, 3);
diff --git a/src/x86_ops_call.h b/src/x86_ops_call.h
index e8e5b4d5e..b6c72e06f 100644
--- a/src/x86_ops_call.h
+++ b/src/x86_ops_call.h
@@ -12,19 +12,19 @@
cycles -= timing_call_rm; \
} \
optype = 0; \
- if (abrt) { cgate16 = cgate32 = 0; return 1; } \
+ if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
oldss = ss; \
if (cgate32) \
{ \
uint32_t old_esp = ESP; \
- PUSH_L(old_cs); if (abrt) { cgate16 = cgate32 = 0; return 1; } \
- PUSH_L(old_pc); if (abrt) { ESP = old_esp; return 1; } \
+ PUSH_L(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
+ PUSH_L(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
} \
else \
{ \
uint32_t old_esp = ESP; \
- PUSH_W(old_cs); if (abrt) { cgate16 = cgate32 = 0; return 1; } \
- PUSH_W(old_pc); if (abrt) { ESP = old_esp; return 1; } \
+ PUSH_W(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
+ PUSH_W(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
}
#define CALL_FAR_l(new_seg, new_pc) \
@@ -41,19 +41,19 @@
cycles -= timing_call_rm; \
} \
optype = 0; \
- if (abrt) { cgate16 = cgate32 = 0; return 1; } \
+ if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
oldss = ss; \
if (cgate16) \
{ \
uint32_t old_esp = ESP; \
- PUSH_W(old_cs); if (abrt) { cgate16 = cgate32 = 0; return 1; } \
- PUSH_W(old_pc); if (abrt) { ESP = old_esp; return 1; } \
+ PUSH_W(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
+ PUSH_W(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
} \
else \
{ \
uint32_t old_esp = ESP; \
- PUSH_L(old_cs); if (abrt) { cgate16 = cgate32 = 0; return 1; } \
- PUSH_L(old_pc); if (abrt) { ESP = old_esp; return 1; } \
+ PUSH_L(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
+ PUSH_L(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
}
@@ -63,7 +63,7 @@ static int opCALL_far_w(uint32_t fetchdat)
uint16_t new_cs, new_pc;
new_pc = getwordf();
- new_cs = getword(); if (abrt) return 1;
+ new_cs = getword(); if (cpu_state.abrt) return 1;
CALL_FAR_w(new_cs, new_pc);
CPU_BLOCK_END();
@@ -76,7 +76,7 @@ static int opCALL_far_l(uint32_t fetchdat)
uint32_t new_cs, new_pc;
new_pc = getlong();
- new_cs = getword(); if (abrt) return 1;
+ new_cs = getword(); if (cpu_state.abrt) return 1;
CALL_FAR_l(new_cs, new_pc);
CPU_BLOCK_END();
@@ -97,19 +97,19 @@ static int opFF_w_a16(uint32_t fetchdat)
switch (rmdat & 0x38)
{
case 0x00: /*INC w*/
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp + 1); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp + 1); if (cpu_state.abrt) return 1;
setadd16nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x08: /*DEC w*/
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp - 1); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp - 1); if (cpu_state.abrt) return 1;
setsub16nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x10: /*CALL*/
- new_pc = geteaw(); if (abrt) return 1;
+ new_pc = geteaw(); if (cpu_state.abrt) return 1;
PUSH_W(cpu_state.pc);
cpu_state.pc = new_pc;
CPU_BLOCK_END();
@@ -118,13 +118,13 @@ static int opFF_w_a16(uint32_t fetchdat)
break;
case 0x18: /*CALL far*/
new_pc = readmemw(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, (cpu_state.eaaddr + 2)); if (abrt) return 1;
+ new_cs = readmemw(easeg, (cpu_state.eaaddr + 2)); if (cpu_state.abrt) return 1;
CALL_FAR_w(new_cs, new_pc);
CPU_BLOCK_END();
break;
case 0x20: /*JMP*/
- new_pc = geteaw(); if (abrt) return 1;
+ new_pc = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
CPU_BLOCK_END();
if (is486) CLOCK_CYCLES(5);
@@ -133,13 +133,13 @@ static int opFF_w_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/
oxpc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
+ new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
- loadcsjmp(new_cs, oxpc); if (abrt) return 1;
+ loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
break;
case 0x30: /*PUSH w*/
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
PUSH_W(temp);
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
@@ -148,7 +148,7 @@ static int opFF_w_a16(uint32_t fetchdat)
// fatal("Bad FF opcode %02X\n",rmdat&0x38);
x86illegal();
}
- return abrt;
+ return cpu_state.abrt;
}
static int opFF_w_a32(uint32_t fetchdat)
{
@@ -162,19 +162,19 @@ static int opFF_w_a32(uint32_t fetchdat)
switch (rmdat & 0x38)
{
case 0x00: /*INC w*/
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp + 1); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp + 1); if (cpu_state.abrt) return 1;
setadd16nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x08: /*DEC w*/
- temp = geteaw(); if (abrt) return 1;
- seteaw(temp - 1); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(temp - 1); if (cpu_state.abrt) return 1;
setsub16nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x10: /*CALL*/
- new_pc = geteaw(); if (abrt) return 1;
+ new_pc = geteaw(); if (cpu_state.abrt) return 1;
PUSH_W(cpu_state.pc);
cpu_state.pc = new_pc;
CPU_BLOCK_END();
@@ -183,13 +183,13 @@ static int opFF_w_a32(uint32_t fetchdat)
break;
case 0x18: /*CALL far*/
new_pc = readmemw(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, (cpu_state.eaaddr + 2)); if (abrt) return 1;
+ new_cs = readmemw(easeg, (cpu_state.eaaddr + 2)); if (cpu_state.abrt) return 1;
CALL_FAR_w(new_cs, new_pc);
CPU_BLOCK_END();
break;
case 0x20: /*JMP*/
- new_pc = geteaw(); if (abrt) return 1;
+ new_pc = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
CPU_BLOCK_END();
if (is486) CLOCK_CYCLES(5);
@@ -198,13 +198,13 @@ static int opFF_w_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/
oxpc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
+ new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
- loadcsjmp(new_cs, oxpc); if (abrt) return 1;
+ loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
break;
case 0x30: /*PUSH w*/
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
PUSH_W(temp);
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
@@ -213,7 +213,7 @@ static int opFF_w_a32(uint32_t fetchdat)
// fatal("Bad FF opcode %02X\n",rmdat&0x38);
x86illegal();
}
- return abrt;
+ return cpu_state.abrt;
}
static int opFF_l_a16(uint32_t fetchdat)
@@ -228,19 +228,19 @@ static int opFF_l_a16(uint32_t fetchdat)
switch (rmdat & 0x38)
{
case 0x00: /*INC l*/
- temp = geteal(); if (abrt) return 1;
- seteal(temp + 1); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp + 1); if (cpu_state.abrt) return 1;
setadd32nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x08: /*DEC l*/
- temp = geteal(); if (abrt) return 1;
- seteal(temp - 1); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp - 1); if (cpu_state.abrt) return 1;
setsub32nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x10: /*CALL*/
- new_pc = geteal(); if (abrt) return 1;
+ new_pc = geteal(); if (cpu_state.abrt) return 1;
PUSH_L(cpu_state.pc);
cpu_state.pc = new_pc;
CPU_BLOCK_END();
@@ -249,13 +249,13 @@ static int opFF_l_a16(uint32_t fetchdat)
break;
case 0x18: /*CALL far*/
new_pc = readmeml(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, (cpu_state.eaaddr + 4)); if (abrt) return 1;
+ new_cs = readmemw(easeg, (cpu_state.eaaddr + 4)); if (cpu_state.abrt) return 1;
CALL_FAR_l(new_cs, new_pc);
CPU_BLOCK_END();
break;
case 0x20: /*JMP*/
- new_pc = geteal(); if (abrt) return 1;
+ new_pc = geteal(); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
CPU_BLOCK_END();
if (is486) CLOCK_CYCLES(5);
@@ -264,13 +264,13 @@ static int opFF_l_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/
oxpc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
+ new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
- loadcsjmp(new_cs, oxpc); if (abrt) return 1;
+ loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
break;
case 0x30: /*PUSH l*/
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
PUSH_L(temp);
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
@@ -279,7 +279,7 @@ static int opFF_l_a16(uint32_t fetchdat)
// fatal("Bad FF opcode %02X\n",rmdat&0x38);
x86illegal();
}
- return abrt;
+ return cpu_state.abrt;
}
static int opFF_l_a32(uint32_t fetchdat)
{
@@ -293,20 +293,20 @@ static int opFF_l_a32(uint32_t fetchdat)
switch (rmdat & 0x38)
{
case 0x00: /*INC l*/
- temp = geteal(); if (abrt) return 1;
- seteal(temp + 1); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp + 1); if (cpu_state.abrt) return 1;
setadd32nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x08: /*DEC l*/
- temp = geteal(); if (abrt) return 1;
- seteal(temp - 1); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(temp - 1); if (cpu_state.abrt) return 1;
setsub32nc(temp, 1);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x10: /*CALL*/
- new_pc = geteal(); if (abrt) return 1;
- PUSH_L(cpu_state.pc); if (abrt) return 1;
+ new_pc = geteal(); if (cpu_state.abrt) return 1;
+ PUSH_L(cpu_state.pc); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
CPU_BLOCK_END();
if (is486) CLOCK_CYCLES(5);
@@ -314,13 +314,13 @@ static int opFF_l_a32(uint32_t fetchdat)
break;
case 0x18: /*CALL far*/
new_pc = readmeml(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, (cpu_state.eaaddr + 4)); if (abrt) return 1;
+ new_cs = readmemw(easeg, (cpu_state.eaaddr + 4)); if (cpu_state.abrt) return 1;
CALL_FAR_l(new_cs, new_pc);
CPU_BLOCK_END();
break;
case 0x20: /*JMP*/
- new_pc = geteal(); if (abrt) return 1;
+ new_pc = geteal(); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
CPU_BLOCK_END();
if (is486) CLOCK_CYCLES(5);
@@ -329,13 +329,13 @@ static int opFF_l_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/
oxpc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr);
- new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
+ new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
- loadcsjmp(new_cs, oxpc); if (abrt) return 1;
+ loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
break;
case 0x30: /*PUSH l*/
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
PUSH_L(temp);
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
@@ -344,5 +344,5 @@ static int opFF_l_a32(uint32_t fetchdat)
// fatal("Bad FF opcode %02X\n",rmdat&0x38);
x86illegal();
}
- return abrt;
+ return cpu_state.abrt;
}
diff --git a/src/x86_ops_flag.h b/src/x86_ops_flag.h
index 1781d0af2..5b259f3b0 100644
--- a/src/x86_ops_flag.h
+++ b/src/x86_ops_flag.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opCMC(uint32_t fetchdat)
{
flags_rebuild();
@@ -96,7 +93,7 @@ static int opPUSHF(uint32_t fetchdat)
flags_rebuild();
PUSH_W(flags);
CLOCK_CYCLES(4);
- return abrt;
+ return cpu_state.abrt;
}
static int opPUSHFD(uint32_t fetchdat)
{
@@ -111,7 +108,7 @@ static int opPUSHFD(uint32_t fetchdat)
flags_rebuild();
PUSH_L(flags | (tempw << 16));
CLOCK_CYCLES(4);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPF_286(uint32_t fetchdat)
@@ -124,7 +121,7 @@ static int opPOPF_286(uint32_t fetchdat)
return 1;
}
- tempw = POP_W(); if (abrt) return 1;
+ tempw = POP_W(); if (cpu_state.abrt) return 1;
if (!(msw & 1)) flags = (flags & 0x7000) | (tempw & 0x0fd5) | 2;
else if (!(CPL)) flags = (tempw & 0x7fd5) | 2;
@@ -148,7 +145,7 @@ static int opPOPF(uint32_t fetchdat)
return 1;
}
- tempw = POP_W(); if (abrt) return 1;
+ tempw = POP_W(); if (cpu_state.abrt) return 1;
if (!(CPL) || !(msw & 1)) flags = (tempw & 0x7fd5) | 2;
else if (IOPLp) flags = (flags & 0x3000) | (tempw & 0x4fd5) | 2;
@@ -171,7 +168,7 @@ static int opPOPFD(uint32_t fetchdat)
return 1;
}
- templ = POP_L(); if (abrt) return 1;
+ templ = POP_L(); if (cpu_state.abrt) return 1;
if (!(CPL) || !(msw & 1)) flags = (templ & 0x7fd5) | 2;
else if (IOPLp) flags = (flags & 0x3000) | (templ & 0x4fd5) | 2;
diff --git a/src/x86_ops_i686.h b/src/x86_ops_i686.h
index c6f26e368..220399fcd 100644
--- a/src/x86_ops_i686.h
+++ b/src/x86_ops_i686.h
@@ -5,7 +5,7 @@ static int internal_illegal(char *s)
{
cpu_state.pc = cpu_state.oldpc;
x86gpf(s, 0);
- return abrt;
+ return cpu_state.abrt;
}
/* 0 = Limit 0-15
@@ -44,7 +44,7 @@ static int opSYSENTER(uint32_t fetchdat)
pclog("Model specific registers: cs_msr=%04X, esp_msr=%08X, eip_msr=%08X\n", cs_msr, esp_msr, eip_msr);
pclog("Other information: eip=%08X esp=%08X eflags=%04X flags=%04X use32=%04X stack32=%i\n", cpu_state.pc, ESP, eflags, flags, use32, stack32);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
ESP = esp_msr;
cpu_state.pc = eip_msr;
@@ -98,7 +98,7 @@ static int opSYSEXIT(uint32_t fetchdat)
pclog("Model specific registers: cs_msr=%04X, esp_msr=%08X, eip_msr=%08X\n", cs_msr, esp_msr, eip_msr);
pclog("Other information: eip=%08X esp=%08X eflags=%04X flags=%04X use32=%04X stack32=%i ECX=%08X EDX=%08X\n", cpu_state.pc, ESP, eflags, flags, use32, stack32, ECX, EDX);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
ESP = ECX;
cpu_state.pc = EDX;
@@ -138,7 +138,7 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
uint8_t fxinst = 0;
uint16_t twd = x87_gettag();
uint16_t old_eaaddr = 0;
- int old_ismmx = ismmx;
+ int old_ismmx = cpu_state.ismmx;
uint8_t ftwb = 0;
uint16_t rec_ftw = 0;
uint16_t fpus = 0;
@@ -153,7 +153,7 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
{
pclog("Effective address %04X not on 16-byte boundary\n", cpu_state.eaaddr);
x86gpf(NULL, 0);
- return abrt;
+ return cpu_state.abrt;
}
fxinst = (rmdat >> 3) & 7;
@@ -164,7 +164,7 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
// if (cpu_mod == 3) pclog("MOD is 3\n");
x86illegal();
- return abrt;
+ return cpu_state.abrt;
}
FP_ENTER();
@@ -176,11 +176,11 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
/* FXRSTOR */
// pclog("FXRSTOR issued\n");
- npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
fpus = readmemw(easeg, cpu_state.eaaddr + 2);
- npxc = (npxc & ~FPU_CW_Reserved_Bits) | 0x0040;
- TOP = (fpus >> 11) & 7;
- npxs &= fpus & ~0x3800;
+ cpu_state.npxc = (cpu_state.npxc & ~FPU_CW_Reserved_Bits) | 0x0040;
+ cpu_state.TOP = (fpus >> 11) & 7;
+ cpu_state.npxs &= fpus & ~0x3800;
/* foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF; */
@@ -213,42 +213,42 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
} */
cpu_state.eaaddr = old_eaaddr + 32;
- x87_ldmmx(&MM[0]); x87_ld_frstor(0);
+ x87_ldmmx(&(cpu_state.MM[0]), &(cpu_state.MM_w4[0])); x87_ld_frstor(0);
cpu_state.eaaddr = old_eaaddr + 48;
- x87_ldmmx(&MM[1]); x87_ld_frstor(1);
+ x87_ldmmx(&(cpu_state.MM[1]), &(cpu_state.MM_w4[1])); x87_ld_frstor(1);
cpu_state.eaaddr = old_eaaddr + 64;
- x87_ldmmx(&MM[2]); x87_ld_frstor(2);
+ x87_ldmmx(&(cpu_state.MM[2]), &(cpu_state.MM_w4[2])); x87_ld_frstor(2);
cpu_state.eaaddr = old_eaaddr + 80;
- x87_ldmmx(&MM[3]); x87_ld_frstor(3);
+ x87_ldmmx(&(cpu_state.MM[3]), &(cpu_state.MM_w4[3])); x87_ld_frstor(3);
cpu_state.eaaddr = old_eaaddr + 96;
- x87_ldmmx(&MM[4]); x87_ld_frstor(4);
+ x87_ldmmx(&(cpu_state.MM[4]), &(cpu_state.MM_w4[4])); x87_ld_frstor(4);
cpu_state.eaaddr = old_eaaddr + 112;
- x87_ldmmx(&MM[5]); x87_ld_frstor(5);
+ x87_ldmmx(&(cpu_state.MM[5]), &(cpu_state.MM_w4[5])); x87_ld_frstor(5);
cpu_state.eaaddr = old_eaaddr + 128;
- x87_ldmmx(&MM[6]); x87_ld_frstor(6);
+ x87_ldmmx(&(cpu_state.MM[6]), &(cpu_state.MM_w4[6])); x87_ld_frstor(6);
cpu_state.eaaddr = old_eaaddr + 144;
- x87_ldmmx(&MM[7]); x87_ld_frstor(7);
+ x87_ldmmx(&(cpu_state.MM[7]), &(cpu_state.MM_w4[7])); x87_ld_frstor(7);
- ismmx = 0;
+ cpu_state.ismmx = 0;
/*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times
something like this is needed*/
- if (MM[0].w[4] == 0xffff && MM[1].w[4] == 0xffff && MM[2].w[4] == 0xffff && MM[3].w[4] == 0xffff &&
- MM[4].w[4] == 0xffff && MM[5].w[4] == 0xffff && MM[6].w[4] == 0xffff && MM[7].w[4] == 0xffff &&
- !TOP && !(*(uint64_t *)tag))
- ismmx = old_ismmx;
+ if (cpu_state.MM[0].w[4] == 0xffff && cpu_state.MM[1].w[4] == 0xffff && cpu_state.MM[2].w[4] == 0xffff && cpu_state.MM[3].w[4] == 0xffff &&
+ cpu_state.MM[4].w[4] == 0xffff && cpu_state.MM[5].w[4] == 0xffff && cpu_state.MM[6].w[4] == 0xffff && cpu_state.MM[7].w[4] == 0xffff &&
+ !cpu_state.TOP && !(*(uint64_t *)cpu_state.tag))
+ cpu_state.ismmx = old_ismmx;
x87_settag(rec_ftw);
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
- if(abrt) pclog("FXRSTOR: abrt != 0\n");
+ if(cpu_state.abrt) pclog("FXRSTOR: abrt != 0\n");
}
else
{
@@ -264,8 +264,8 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
if (twd & 0x3000 == 0x3000) ftwb |= 0x40;
if (twd & 0xC000 == 0xC000) ftwb |= 0x80;
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememb(easeg,cpu_state.eaaddr+4,ftwb);
writememw(easeg,cpu_state.eaaddr+6,(x87_op_off>>16)<<12);
@@ -276,37 +276,37 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
writememw(easeg,cpu_state.eaaddr+20,x87_op_seg);
cpu_state.eaaddr = old_eaaddr + 32;
- ismmx ? x87_stmmx(MM[0]) : x87_st_fsave(0);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[0]) : x87_st_fsave(0);
cpu_state.eaaddr = old_eaaddr + 48;
- ismmx ? x87_stmmx(MM[1]) : x87_st_fsave(1);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[1]) : x87_st_fsave(1);
cpu_state.eaaddr = old_eaaddr + 64;
- ismmx ? x87_stmmx(MM[2]) : x87_st_fsave(2);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[2]) : x87_st_fsave(2);
cpu_state.eaaddr = old_eaaddr + 80;
- ismmx ? x87_stmmx(MM[3]) : x87_st_fsave(3);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[3]) : x87_st_fsave(3);
cpu_state.eaaddr = old_eaaddr + 96;
- ismmx ? x87_stmmx(MM[4]) : x87_st_fsave(4);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[4]) : x87_st_fsave(4);
cpu_state.eaaddr = old_eaaddr + 112;
- ismmx ? x87_stmmx(MM[5]) : x87_st_fsave(5);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[5]) : x87_st_fsave(5);
cpu_state.eaaddr = old_eaaddr + 128;
- ismmx ? x87_stmmx(MM[6]) : x87_st_fsave(6);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[6]) : x87_st_fsave(6);
cpu_state.eaaddr = old_eaaddr + 144;
- ismmx ? x87_stmmx(MM[7]) : x87_st_fsave(7);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[7]) : x87_st_fsave(7);
cpu_state.eaaddr = old_eaaddr;
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
- if(abrt) pclog("FXSAVE: abrt != 0\n");
+ if(cpu_state.abrt) pclog("FXSAVE: abrt != 0\n");
}
- return abrt;
+ return cpu_state.abrt;
}
static int opFXSAVESTOR_a32(uint32_t fetchdat)
@@ -314,7 +314,7 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
uint8_t fxinst = 0;
uint16_t twd = x87_gettag();
uint32_t old_eaaddr = 0;
- int old_ismmx = ismmx;
+ int old_ismmx = cpu_state.ismmx;
uint8_t ftwb = 0;
uint16_t rec_ftw = 0;
uint16_t fpus = 0;
@@ -329,7 +329,7 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
{
pclog("Effective address %08X not on 16-byte boundary\n", cpu_state.eaaddr);
x86gpf(NULL, 0);
- return abrt;
+ return cpu_state.abrt;
}
fxinst = (rmdat >> 3) & 7;
@@ -340,7 +340,7 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
// if (cpu_mod == 3) pclog("MOD is 3\n");
x86illegal();
- return abrt;
+ return cpu_state.abrt;
}
FP_ENTER();
@@ -352,11 +352,11 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
/* FXRSTOR */
// pclog("FXRSTOR issued\n");
- npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
fpus = readmemw(easeg, cpu_state.eaaddr + 2);
- npxc = (npxc & ~FPU_CW_Reserved_Bits) | 0x0040;
- TOP = (fpus >> 11) & 7;
- npxs &= fpus & ~0x3800;
+ cpu_state.npxc = (cpu_state.npxc & ~FPU_CW_Reserved_Bits) | 0x0040;
+ cpu_state.TOP = (fpus >> 11) & 7;
+ cpu_state.npxs &= fpus & ~0x3800;
/* foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF; */
@@ -389,42 +389,42 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
} */
cpu_state.eaaddr = old_eaaddr + 32;
- x87_ldmmx(&MM[0]); x87_ld_frstor(0);
+ x87_ldmmx(&(cpu_state.MM[0]), &(cpu_state.MM_w4[0])); x87_ld_frstor(0);
cpu_state.eaaddr = old_eaaddr + 48;
- x87_ldmmx(&MM[1]); x87_ld_frstor(1);
+ x87_ldmmx(&(cpu_state.MM[1]), &(cpu_state.MM_w4[1])); x87_ld_frstor(1);
cpu_state.eaaddr = old_eaaddr + 64;
- x87_ldmmx(&MM[2]); x87_ld_frstor(2);
+ x87_ldmmx(&(cpu_state.MM[2]), &(cpu_state.MM_w4[2])); x87_ld_frstor(2);
cpu_state.eaaddr = old_eaaddr + 80;
- x87_ldmmx(&MM[3]); x87_ld_frstor(3);
+ x87_ldmmx(&(cpu_state.MM[3]), &(cpu_state.MM_w4[3])); x87_ld_frstor(3);
cpu_state.eaaddr = old_eaaddr + 96;
- x87_ldmmx(&MM[4]); x87_ld_frstor(4);
+ x87_ldmmx(&(cpu_state.MM[4]), &(cpu_state.MM_w4[4])); x87_ld_frstor(4);
cpu_state.eaaddr = old_eaaddr + 112;
- x87_ldmmx(&MM[5]); x87_ld_frstor(5);
+ x87_ldmmx(&(cpu_state.MM[5]), &(cpu_state.MM_w4[5])); x87_ld_frstor(5);
cpu_state.eaaddr = old_eaaddr + 128;
- x87_ldmmx(&MM[6]); x87_ld_frstor(6);
+ x87_ldmmx(&(cpu_state.MM[6]), &(cpu_state.MM_w4[6])); x87_ld_frstor(6);
cpu_state.eaaddr = old_eaaddr + 144;
- x87_ldmmx(&MM[7]); x87_ld_frstor(7);
+ x87_ldmmx(&(cpu_state.MM[7]), &(cpu_state.MM_w4[7])); x87_ld_frstor(7);
- ismmx = 0;
+ cpu_state.ismmx = 0;
/*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times
something like this is needed*/
- if (MM[0].w[4] == 0xffff && MM[1].w[4] == 0xffff && MM[2].w[4] == 0xffff && MM[3].w[4] == 0xffff &&
- MM[4].w[4] == 0xffff && MM[5].w[4] == 0xffff && MM[6].w[4] == 0xffff && MM[7].w[4] == 0xffff &&
- !TOP && !(*(uint64_t *)tag))
- ismmx = old_ismmx;
+ if (cpu_state.MM[0].w[4] == 0xffff && cpu_state.MM[1].w[4] == 0xffff && cpu_state.MM[2].w[4] == 0xffff && cpu_state.MM[3].w[4] == 0xffff &&
+ cpu_state.MM[4].w[4] == 0xffff && cpu_state.MM[5].w[4] == 0xffff && cpu_state.MM[6].w[4] == 0xffff && cpu_state.MM[7].w[4] == 0xffff &&
+ !cpu_state.TOP && !(*(uint64_t *)cpu_state.tag))
+ cpu_state.ismmx = old_ismmx;
x87_settag(rec_ftw);
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
- if(abrt) pclog("FXRSTOR: abrt != 0\n");
+ if(cpu_state.abrt) pclog("FXRSTOR: abrt != 0\n");
}
else
{
@@ -440,8 +440,8 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
if (twd & 0x3000 == 0x3000) ftwb |= 0x40;
if (twd & 0xC000 == 0xC000) ftwb |= 0x80;
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememb(easeg,cpu_state.eaaddr+4,ftwb);
writememw(easeg,cpu_state.eaaddr+6,(x87_op_off>>16)<<12);
@@ -452,37 +452,37 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
writememw(easeg,cpu_state.eaaddr+20,x87_op_seg);
cpu_state.eaaddr = old_eaaddr + 32;
- ismmx ? x87_stmmx(MM[0]) : x87_st_fsave(0);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[0]) : x87_st_fsave(0);
cpu_state.eaaddr = old_eaaddr + 48;
- ismmx ? x87_stmmx(MM[1]) : x87_st_fsave(1);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[1]) : x87_st_fsave(1);
cpu_state.eaaddr = old_eaaddr + 64;
- ismmx ? x87_stmmx(MM[2]) : x87_st_fsave(2);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[2]) : x87_st_fsave(2);
cpu_state.eaaddr = old_eaaddr + 80;
- ismmx ? x87_stmmx(MM[3]) : x87_st_fsave(3);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[3]) : x87_st_fsave(3);
cpu_state.eaaddr = old_eaaddr + 96;
- ismmx ? x87_stmmx(MM[4]) : x87_st_fsave(4);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[4]) : x87_st_fsave(4);
cpu_state.eaaddr = old_eaaddr + 112;
- ismmx ? x87_stmmx(MM[5]) : x87_st_fsave(5);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[5]) : x87_st_fsave(5);
cpu_state.eaaddr = old_eaaddr + 128;
- ismmx ? x87_stmmx(MM[6]) : x87_st_fsave(6);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[6]) : x87_st_fsave(6);
cpu_state.eaaddr = old_eaaddr + 144;
- ismmx ? x87_stmmx(MM[7]) : x87_st_fsave(7);
+ cpu_state.ismmx ? x87_stmmx(cpu_state.MM[7]) : x87_st_fsave(7);
cpu_state.eaaddr = old_eaaddr;
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
- if(abrt) pclog("FXSAVE: abrt != 0\n");
+ if(cpu_state.abrt) pclog("FXSAVE: abrt != 0\n");
}
- return abrt;
+ return cpu_state.abrt;
}
#define AMD_SYSCALL_EIP (star & 0xFFFFFFFF)
diff --git a/src/x86_ops_inc_dec.h b/src/x86_ops_inc_dec.h
index 576a45a46..3e636639d 100644
--- a/src/x86_ops_inc_dec.h
+++ b/src/x86_ops_inc_dec.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define INC_DEC_OP(name, reg, inc, setflags) \
static int op ## name (uint32_t fetchdat) \
{ \
@@ -52,16 +49,16 @@ static int opINCDEC_b_a16(uint32_t fetchdat)
uint8_t temp;
fetch_ea_16(fetchdat);
- temp=geteab(); if (abrt) return 1;
+ temp=geteab(); if (cpu_state.abrt) return 1;
if (rmdat&0x38)
{
- seteab(temp - 1); if (abrt) return 1;
+ seteab(temp - 1); if (cpu_state.abrt) return 1;
setsub8nc(temp, 1);
}
else
{
- seteab(temp + 1); if (abrt) return 1;
+ seteab(temp + 1); if (cpu_state.abrt) return 1;
setadd8nc(temp, 1);
}
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
@@ -72,16 +69,16 @@ static int opINCDEC_b_a32(uint32_t fetchdat)
uint8_t temp;
fetch_ea_32(fetchdat);
- temp=geteab(); if (abrt) return 1;
+ temp=geteab(); if (cpu_state.abrt) return 1;
if (rmdat&0x38)
{
- seteab(temp - 1); if (abrt) return 1;
+ seteab(temp - 1); if (cpu_state.abrt) return 1;
setsub8nc(temp, 1);
}
else
{
- seteab(temp + 1); if (abrt) return 1;
+ seteab(temp + 1); if (cpu_state.abrt) return 1;
setadd8nc(temp, 1);
}
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
diff --git a/src/x86_ops_jump.h b/src/x86_ops_jump.h
index e0a1a1030..8514c4bdb 100644
--- a/src/x86_ops_jump.h
+++ b/src/x86_ops_jump.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define cond_O ( VF_SET())
#define cond_NO (!VF_SET())
#define cond_B ( CF_SET())
@@ -49,7 +46,7 @@
\
static int opJ ## condition ## _l(uint32_t fetchdat) \
{ \
- uint32_t offset = getlong(); if (abrt) return 1; \
+ uint32_t offset = getlong(); if (cpu_state.abrt) return 1; \
CLOCK_CYCLES(timing_bnt); \
if (cond_ ## condition) \
{ \
@@ -207,7 +204,7 @@ static int opJMP_r16(uint32_t fetchdat)
}
static int opJMP_r32(uint32_t fetchdat)
{
- int32_t offset = (int32_t)getlong(); if (abrt) return 1;
+ int32_t offset = (int32_t)getlong(); if (cpu_state.abrt) return 1;
cpu_state.pc += offset;
CPU_BLOCK_END();
CLOCK_CYCLES((is486) ? 3 : 7);
@@ -217,7 +214,7 @@ static int opJMP_r32(uint32_t fetchdat)
static int opJMP_far_a16(uint32_t fetchdat)
{
uint16_t addr = getwordf();
- uint16_t seg = getword(); if (abrt) return 1;
+ uint16_t seg = getword(); if (cpu_state.abrt) return 1;
uint32_t oxpc = cpu_state.pc;
cpu_state.pc = addr;
loadcsjmp(seg, oxpc);
@@ -227,7 +224,7 @@ static int opJMP_far_a16(uint32_t fetchdat)
static int opJMP_far_a32(uint32_t fetchdat)
{
uint32_t addr = getlong();
- uint16_t seg = getword(); if (abrt) return 1;
+ uint16_t seg = getword(); if (cpu_state.abrt) return 1;
uint32_t oxpc = cpu_state.pc;
cpu_state.pc = addr;
loadcsjmp(seg, oxpc);
@@ -246,7 +243,7 @@ static int opCALL_r16(uint32_t fetchdat)
}
static int opCALL_r32(uint32_t fetchdat)
{
- int32_t addr = getlong(); if (abrt) return 1;
+ int32_t addr = getlong(); if (cpu_state.abrt) return 1;
PUSH_L(cpu_state.pc);
cpu_state.pc += addr;
CPU_BLOCK_END();
@@ -258,7 +255,7 @@ static int opRET_w(uint32_t fetchdat)
{
uint16_t ret;
- ret = POP_W(); if (abrt) return 1;
+ ret = POP_W(); if (cpu_state.abrt) return 1;
cpu_state.pc = ret;
CPU_BLOCK_END();
@@ -269,7 +266,7 @@ static int opRET_l(uint32_t fetchdat)
{
uint32_t ret;
- ret = POP_L(); if (abrt) return 1;
+ ret = POP_L(); if (cpu_state.abrt) return 1;
cpu_state.pc = ret;
CPU_BLOCK_END();
@@ -282,7 +279,7 @@ static int opRET_w_imm(uint32_t fetchdat)
uint16_t offset = getwordf();
uint16_t ret;
- ret = POP_W(); if (abrt) return 1;
+ ret = POP_W(); if (cpu_state.abrt) return 1;
if (stack32) ESP += offset;
else SP += offset;
cpu_state.pc = ret;
@@ -296,7 +293,7 @@ static int opRET_l_imm(uint32_t fetchdat)
uint16_t offset = getwordf();
uint32_t ret;
- ret = POP_L(); if (abrt) return 1;
+ ret = POP_L(); if (cpu_state.abrt) return 1;
if (stack32) ESP += offset;
else SP += offset;
cpu_state.pc = ret;
diff --git a/src/x86_ops_misc.h b/src/x86_ops_misc.h
index 3dd2779a7..6fbab66bf 100644
--- a/src/x86_ops_misc.h
+++ b/src/x86_ops_misc.h
@@ -46,21 +46,21 @@ static int opF6_a16(uint32_t fetchdat)
int8_t temps;
fetch_ea_16(fetchdat);
- dst = geteab(); if (abrt) return 1;
+ dst = geteab(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST b,#8*/
- src = readmemb(cs, cpu_state.pc); cpu_state.pc++; if (abrt) return 1;
+ src = readmemb(cs, cpu_state.pc); cpu_state.pc++; if (cpu_state.abrt) return 1;
setznp8(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT b*/
- seteab(~dst); if (abrt) return 1;
+ seteab(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x18: /*NEG b*/
- seteab(0 - dst); if (abrt) return 1;
+ seteab(0 - dst); if (cpu_state.abrt) return 1;
setsub8(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
@@ -136,21 +136,21 @@ static int opF6_a32(uint32_t fetchdat)
int8_t temps;
fetch_ea_32(fetchdat);
- dst = geteab(); if (abrt) return 1;
+ dst = geteab(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST b,#8*/
- src = readmemb(cs, cpu_state.pc); cpu_state.pc++; if (abrt) return 1;
+ src = readmemb(cs, cpu_state.pc); cpu_state.pc++; if (cpu_state.abrt) return 1;
setznp8(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT b*/
- seteab(~dst); if (abrt) return 1;
+ seteab(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x18: /*NEG b*/
- seteab(0 - dst); if (abrt) return 1;
+ seteab(0 - dst); if (cpu_state.abrt) return 1;
setsub8(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
@@ -229,21 +229,21 @@ static int opF7_w_a16(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_16(fetchdat);
- dst = geteaw(); if (abrt) return 1;
+ dst = geteaw(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST w*/
- src = getword(); if (abrt) return 1;
+ src = getword(); if (cpu_state.abrt) return 1;
setznp16(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT w*/
- seteaw(~dst); if (abrt) return 1;
+ seteaw(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x18: /*NEG w*/
- seteaw(0 - dst); if (abrt) return 1;
+ seteaw(0 - dst); if (cpu_state.abrt) return 1;
setsub16(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
@@ -315,21 +315,21 @@ static int opF7_w_a32(uint32_t fetchdat)
uint16_t src, dst;
fetch_ea_32(fetchdat);
- dst = geteaw(); if (abrt) return 1;
+ dst = geteaw(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST w*/
- src = getword(); if (abrt) return 1;
+ src = getword(); if (cpu_state.abrt) return 1;
setznp16(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT w*/
- seteaw(~dst); if (abrt) return 1;
+ seteaw(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
case 0x18: /*NEG w*/
- seteaw(0 - dst); if (abrt) return 1;
+ seteaw(0 - dst); if (cpu_state.abrt) return 1;
setsub16(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mm);
break;
@@ -400,22 +400,22 @@ static int opF7_l_a16(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_16(fetchdat);
- dst = geteal(); if (abrt) return 1;
+ dst = geteal(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST l*/
- src = getlong(); if (abrt) return 1;
+ src = getlong(); if (cpu_state.abrt) return 1;
setznp32(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT l*/
- seteal(~dst); if (abrt) return 1;
+ seteal(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mml);
break;
case 0x18: /*NEG l*/
- seteal(0 - dst); if (abrt) return 1;
+ seteal(0 - dst); if (cpu_state.abrt) return 1;
setsub32(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mml);
break;
@@ -462,22 +462,22 @@ static int opF7_l_a32(uint32_t fetchdat)
uint32_t src, dst;
fetch_ea_32(fetchdat);
- dst = geteal(); if (abrt) return 1;
+ dst = geteal(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
case 0x00: /*TEST l*/
- src = getlong(); if (abrt) return 1;
+ src = getlong(); if (cpu_state.abrt) return 1;
setznp32(src & dst);
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 2);
else CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
break;
case 0x10: /*NOT l*/
- seteal(~dst); if (abrt) return 1;
+ seteal(~dst); if (cpu_state.abrt) return 1;
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mml);
break;
case 0x18: /*NEG l*/
- seteal(0 - dst); if (abrt) return 1;
+ seteal(0 - dst); if (cpu_state.abrt) return 1;
setsub32(0, dst);
CLOCK_CYCLES((cpu_mod == 3) ? timing_rr : timing_mml);
break;
@@ -544,7 +544,7 @@ static int opHLT(uint32_t fetchdat)
static int opLOCK(uint32_t fetchdat)
{
fetchdat = fastreadl(cs + cpu_state.pc);
- if (abrt) return 0;
+ if (cpu_state.abrt) return 0;
cpu_state.pc++;
CLOCK_CYCLES(4);
@@ -560,7 +560,7 @@ static int opBOUND_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
low = geteaw();
- high = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
+ high = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
if (((int16_t)cpu_state.regs[cpu_reg].w < low) || ((int16_t)cpu_state.regs[cpu_reg].w > high))
{
@@ -578,7 +578,7 @@ static int opBOUND_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
low = geteaw();
- high = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
+ high = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
if (((int16_t)cpu_state.regs[cpu_reg].w < low) || ((int16_t)cpu_state.regs[cpu_reg].w > high))
{
@@ -597,7 +597,7 @@ static int opBOUND_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
low = geteal();
- high = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
+ high = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
if (((int32_t)cpu_state.regs[cpu_reg].l < low) || ((int32_t)cpu_state.regs[cpu_reg].l > high))
{
@@ -615,7 +615,7 @@ static int opBOUND_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
low = geteal();
- high = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
+ high = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
if (((int32_t)cpu_state.regs[cpu_reg].l < low) || ((int32_t)cpu_state.regs[cpu_reg].l > high))
{
diff --git a/src/x86_ops_mmx.h b/src/x86_ops_mmx.h
index b266d4842..1af186d0b 100644
--- a/src/x86_ops_mmx.h
+++ b/src/x86_ops_mmx.h
@@ -6,12 +6,12 @@
#define MMX_GETSRC() \
if (cpu_mod == 3) \
{ \
- src = MM[cpu_rm]; \
+ src = cpu_state.MM[cpu_rm]; \
CLOCK_CYCLES(1); \
} \
else \
{ \
- src.q = readmemq(easeg, cpu_state.eaaddr); if (abrt) return 1; \
+ src.q = readmemq(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 1; \
CLOCK_CYCLES(2); \
}
diff --git a/src/x86_ops_mmx_arith.h b/src/x86_ops_mmx_arith.h
index 92986e511..302a44eaa 100644
--- a/src/x86_ops_mmx_arith.h
+++ b/src/x86_ops_mmx_arith.h
@@ -6,14 +6,14 @@ static int opPADDB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] += src.b[0];
- MM[cpu_reg].b[1] += src.b[1];
- MM[cpu_reg].b[2] += src.b[2];
- MM[cpu_reg].b[3] += src.b[3];
- MM[cpu_reg].b[4] += src.b[4];
- MM[cpu_reg].b[5] += src.b[5];
- MM[cpu_reg].b[6] += src.b[6];
- MM[cpu_reg].b[7] += src.b[7];
+ cpu_state.MM[cpu_reg].b[0] += src.b[0];
+ cpu_state.MM[cpu_reg].b[1] += src.b[1];
+ cpu_state.MM[cpu_reg].b[2] += src.b[2];
+ cpu_state.MM[cpu_reg].b[3] += src.b[3];
+ cpu_state.MM[cpu_reg].b[4] += src.b[4];
+ cpu_state.MM[cpu_reg].b[5] += src.b[5];
+ cpu_state.MM[cpu_reg].b[6] += src.b[6];
+ cpu_state.MM[cpu_reg].b[7] += src.b[7];
return 0;
}
@@ -25,14 +25,14 @@ static int opPADDB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] += src.b[0];
- MM[cpu_reg].b[1] += src.b[1];
- MM[cpu_reg].b[2] += src.b[2];
- MM[cpu_reg].b[3] += src.b[3];
- MM[cpu_reg].b[4] += src.b[4];
- MM[cpu_reg].b[5] += src.b[5];
- MM[cpu_reg].b[6] += src.b[6];
- MM[cpu_reg].b[7] += src.b[7];
+ cpu_state.MM[cpu_reg].b[0] += src.b[0];
+ cpu_state.MM[cpu_reg].b[1] += src.b[1];
+ cpu_state.MM[cpu_reg].b[2] += src.b[2];
+ cpu_state.MM[cpu_reg].b[3] += src.b[3];
+ cpu_state.MM[cpu_reg].b[4] += src.b[4];
+ cpu_state.MM[cpu_reg].b[5] += src.b[5];
+ cpu_state.MM[cpu_reg].b[6] += src.b[6];
+ cpu_state.MM[cpu_reg].b[7] += src.b[7];
return 0;
}
@@ -45,10 +45,10 @@ static int opPADDW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] += src.w[0];
- MM[cpu_reg].w[1] += src.w[1];
- MM[cpu_reg].w[2] += src.w[2];
- MM[cpu_reg].w[3] += src.w[3];
+ cpu_state.MM[cpu_reg].w[0] += src.w[0];
+ cpu_state.MM[cpu_reg].w[1] += src.w[1];
+ cpu_state.MM[cpu_reg].w[2] += src.w[2];
+ cpu_state.MM[cpu_reg].w[3] += src.w[3];
return 0;
}
@@ -60,10 +60,10 @@ static int opPADDW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] += src.w[0];
- MM[cpu_reg].w[1] += src.w[1];
- MM[cpu_reg].w[2] += src.w[2];
- MM[cpu_reg].w[3] += src.w[3];
+ cpu_state.MM[cpu_reg].w[0] += src.w[0];
+ cpu_state.MM[cpu_reg].w[1] += src.w[1];
+ cpu_state.MM[cpu_reg].w[2] += src.w[2];
+ cpu_state.MM[cpu_reg].w[3] += src.w[3];
return 0;
}
@@ -76,8 +76,8 @@ static int opPADDD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] += src.l[0];
- MM[cpu_reg].l[1] += src.l[1];
+ cpu_state.MM[cpu_reg].l[0] += src.l[0];
+ cpu_state.MM[cpu_reg].l[1] += src.l[1];
return 0;
}
@@ -89,8 +89,8 @@ static int opPADDD_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] += src.l[0];
- MM[cpu_reg].l[1] += src.l[1];
+ cpu_state.MM[cpu_reg].l[0] += src.l[0];
+ cpu_state.MM[cpu_reg].l[1] += src.l[1];
return 0;
}
@@ -103,14 +103,14 @@ static int opPADDSB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sb[0] = SSATB(MM[cpu_reg].sb[0] + src.sb[0]);
- MM[cpu_reg].sb[1] = SSATB(MM[cpu_reg].sb[1] + src.sb[1]);
- MM[cpu_reg].sb[2] = SSATB(MM[cpu_reg].sb[2] + src.sb[2]);
- MM[cpu_reg].sb[3] = SSATB(MM[cpu_reg].sb[3] + src.sb[3]);
- MM[cpu_reg].sb[4] = SSATB(MM[cpu_reg].sb[4] + src.sb[4]);
- MM[cpu_reg].sb[5] = SSATB(MM[cpu_reg].sb[5] + src.sb[5]);
- MM[cpu_reg].sb[6] = SSATB(MM[cpu_reg].sb[6] + src.sb[6]);
- MM[cpu_reg].sb[7] = SSATB(MM[cpu_reg].sb[7] + src.sb[7]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(cpu_state.MM[cpu_reg].sb[0] + src.sb[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(cpu_state.MM[cpu_reg].sb[1] + src.sb[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(cpu_state.MM[cpu_reg].sb[2] + src.sb[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(cpu_state.MM[cpu_reg].sb[3] + src.sb[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(cpu_state.MM[cpu_reg].sb[4] + src.sb[4]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(cpu_state.MM[cpu_reg].sb[5] + src.sb[5]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(cpu_state.MM[cpu_reg].sb[6] + src.sb[6]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(cpu_state.MM[cpu_reg].sb[7] + src.sb[7]);
return 0;
}
@@ -122,14 +122,14 @@ static int opPADDSB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sb[0] = SSATB(MM[cpu_reg].sb[0] + src.sb[0]);
- MM[cpu_reg].sb[1] = SSATB(MM[cpu_reg].sb[1] + src.sb[1]);
- MM[cpu_reg].sb[2] = SSATB(MM[cpu_reg].sb[2] + src.sb[2]);
- MM[cpu_reg].sb[3] = SSATB(MM[cpu_reg].sb[3] + src.sb[3]);
- MM[cpu_reg].sb[4] = SSATB(MM[cpu_reg].sb[4] + src.sb[4]);
- MM[cpu_reg].sb[5] = SSATB(MM[cpu_reg].sb[5] + src.sb[5]);
- MM[cpu_reg].sb[6] = SSATB(MM[cpu_reg].sb[6] + src.sb[6]);
- MM[cpu_reg].sb[7] = SSATB(MM[cpu_reg].sb[7] + src.sb[7]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(cpu_state.MM[cpu_reg].sb[0] + src.sb[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(cpu_state.MM[cpu_reg].sb[1] + src.sb[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(cpu_state.MM[cpu_reg].sb[2] + src.sb[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(cpu_state.MM[cpu_reg].sb[3] + src.sb[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(cpu_state.MM[cpu_reg].sb[4] + src.sb[4]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(cpu_state.MM[cpu_reg].sb[5] + src.sb[5]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(cpu_state.MM[cpu_reg].sb[6] + src.sb[6]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(cpu_state.MM[cpu_reg].sb[7] + src.sb[7]);
return 0;
}
@@ -142,14 +142,14 @@ static int opPADDUSB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = USATB(MM[cpu_reg].b[0] + src.b[0]);
- MM[cpu_reg].b[1] = USATB(MM[cpu_reg].b[1] + src.b[1]);
- MM[cpu_reg].b[2] = USATB(MM[cpu_reg].b[2] + src.b[2]);
- MM[cpu_reg].b[3] = USATB(MM[cpu_reg].b[3] + src.b[3]);
- MM[cpu_reg].b[4] = USATB(MM[cpu_reg].b[4] + src.b[4]);
- MM[cpu_reg].b[5] = USATB(MM[cpu_reg].b[5] + src.b[5]);
- MM[cpu_reg].b[6] = USATB(MM[cpu_reg].b[6] + src.b[6]);
- MM[cpu_reg].b[7] = USATB(MM[cpu_reg].b[7] + src.b[7]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(cpu_state.MM[cpu_reg].b[0] + src.b[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(cpu_state.MM[cpu_reg].b[1] + src.b[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(cpu_state.MM[cpu_reg].b[2] + src.b[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(cpu_state.MM[cpu_reg].b[3] + src.b[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(cpu_state.MM[cpu_reg].b[4] + src.b[4]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(cpu_state.MM[cpu_reg].b[5] + src.b[5]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(cpu_state.MM[cpu_reg].b[6] + src.b[6]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(cpu_state.MM[cpu_reg].b[7] + src.b[7]);
return 0;
}
@@ -161,14 +161,14 @@ static int opPADDUSB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = USATB(MM[cpu_reg].b[0] + src.b[0]);
- MM[cpu_reg].b[1] = USATB(MM[cpu_reg].b[1] + src.b[1]);
- MM[cpu_reg].b[2] = USATB(MM[cpu_reg].b[2] + src.b[2]);
- MM[cpu_reg].b[3] = USATB(MM[cpu_reg].b[3] + src.b[3]);
- MM[cpu_reg].b[4] = USATB(MM[cpu_reg].b[4] + src.b[4]);
- MM[cpu_reg].b[5] = USATB(MM[cpu_reg].b[5] + src.b[5]);
- MM[cpu_reg].b[6] = USATB(MM[cpu_reg].b[6] + src.b[6]);
- MM[cpu_reg].b[7] = USATB(MM[cpu_reg].b[7] + src.b[7]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(cpu_state.MM[cpu_reg].b[0] + src.b[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(cpu_state.MM[cpu_reg].b[1] + src.b[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(cpu_state.MM[cpu_reg].b[2] + src.b[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(cpu_state.MM[cpu_reg].b[3] + src.b[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(cpu_state.MM[cpu_reg].b[4] + src.b[4]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(cpu_state.MM[cpu_reg].b[5] + src.b[5]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(cpu_state.MM[cpu_reg].b[6] + src.b[6]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(cpu_state.MM[cpu_reg].b[7] + src.b[7]);
return 0;
}
@@ -181,10 +181,10 @@ static int opPADDSW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sw[0] = SSATW(MM[cpu_reg].sw[0] + src.sw[0]);
- MM[cpu_reg].sw[1] = SSATW(MM[cpu_reg].sw[1] + src.sw[1]);
- MM[cpu_reg].sw[2] = SSATW(MM[cpu_reg].sw[2] + src.sw[2]);
- MM[cpu_reg].sw[3] = SSATW(MM[cpu_reg].sw[3] + src.sw[3]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(cpu_state.MM[cpu_reg].sw[0] + src.sw[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(cpu_state.MM[cpu_reg].sw[1] + src.sw[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(cpu_state.MM[cpu_reg].sw[2] + src.sw[2]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(cpu_state.MM[cpu_reg].sw[3] + src.sw[3]);
return 0;
}
@@ -196,10 +196,10 @@ static int opPADDSW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sw[0] = SSATW(MM[cpu_reg].sw[0] + src.sw[0]);
- MM[cpu_reg].sw[1] = SSATW(MM[cpu_reg].sw[1] + src.sw[1]);
- MM[cpu_reg].sw[2] = SSATW(MM[cpu_reg].sw[2] + src.sw[2]);
- MM[cpu_reg].sw[3] = SSATW(MM[cpu_reg].sw[3] + src.sw[3]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(cpu_state.MM[cpu_reg].sw[0] + src.sw[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(cpu_state.MM[cpu_reg].sw[1] + src.sw[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(cpu_state.MM[cpu_reg].sw[2] + src.sw[2]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(cpu_state.MM[cpu_reg].sw[3] + src.sw[3]);
return 0;
}
@@ -212,10 +212,10 @@ static int opPADDUSW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = USATW(MM[cpu_reg].w[0] + src.w[0]);
- MM[cpu_reg].w[1] = USATW(MM[cpu_reg].w[1] + src.w[1]);
- MM[cpu_reg].w[2] = USATW(MM[cpu_reg].w[2] + src.w[2]);
- MM[cpu_reg].w[3] = USATW(MM[cpu_reg].w[3] + src.w[3]);
+ cpu_state.MM[cpu_reg].w[0] = USATW(cpu_state.MM[cpu_reg].w[0] + src.w[0]);
+ cpu_state.MM[cpu_reg].w[1] = USATW(cpu_state.MM[cpu_reg].w[1] + src.w[1]);
+ cpu_state.MM[cpu_reg].w[2] = USATW(cpu_state.MM[cpu_reg].w[2] + src.w[2]);
+ cpu_state.MM[cpu_reg].w[3] = USATW(cpu_state.MM[cpu_reg].w[3] + src.w[3]);
return 0;
}
@@ -227,10 +227,10 @@ static int opPADDUSW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = USATW(MM[cpu_reg].w[0] + src.w[0]);
- MM[cpu_reg].w[1] = USATW(MM[cpu_reg].w[1] + src.w[1]);
- MM[cpu_reg].w[2] = USATW(MM[cpu_reg].w[2] + src.w[2]);
- MM[cpu_reg].w[3] = USATW(MM[cpu_reg].w[3] + src.w[3]);
+ cpu_state.MM[cpu_reg].w[0] = USATW(cpu_state.MM[cpu_reg].w[0] + src.w[0]);
+ cpu_state.MM[cpu_reg].w[1] = USATW(cpu_state.MM[cpu_reg].w[1] + src.w[1]);
+ cpu_state.MM[cpu_reg].w[2] = USATW(cpu_state.MM[cpu_reg].w[2] + src.w[2]);
+ cpu_state.MM[cpu_reg].w[3] = USATW(cpu_state.MM[cpu_reg].w[3] + src.w[3]);
return 0;
}
@@ -243,15 +243,15 @@ static int opPMADDWD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- if (MM[cpu_reg].l[0] == 0x80008000 && src.l[0] == 0x80008000)
- MM[cpu_reg].l[0] = 0x80000000;
+ if (cpu_state.MM[cpu_reg].l[0] == 0x80008000 && src.l[0] == 0x80008000)
+ cpu_state.MM[cpu_reg].l[0] = 0x80000000;
else
- MM[cpu_reg].sl[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) + ((int32_t)MM[cpu_reg].sw[1] * (int32_t)src.sw[1]);
+ cpu_state.MM[cpu_reg].sl[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) + ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)src.sw[1]);
- if (MM[cpu_reg].l[1] == 0x80008000 && src.l[1] == 0x80008000)
- MM[cpu_reg].l[1] = 0x80000000;
+ if (cpu_state.MM[cpu_reg].l[1] == 0x80008000 && src.l[1] == 0x80008000)
+ cpu_state.MM[cpu_reg].l[1] = 0x80000000;
else
- MM[cpu_reg].sl[1] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) + ((int32_t)MM[cpu_reg].sw[3] * (int32_t)src.sw[3]);
+ cpu_state.MM[cpu_reg].sl[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) + ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)src.sw[3]);
return 0;
}
@@ -263,15 +263,15 @@ static int opPMADDWD_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- if (MM[cpu_reg].l[0] == 0x80008000 && src.l[0] == 0x80008000)
- MM[cpu_reg].l[0] = 0x80000000;
+ if (cpu_state.MM[cpu_reg].l[0] == 0x80008000 && src.l[0] == 0x80008000)
+ cpu_state.MM[cpu_reg].l[0] = 0x80000000;
else
- MM[cpu_reg].sl[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) + ((int32_t)MM[cpu_reg].sw[1] * (int32_t)src.sw[1]);
+ cpu_state.MM[cpu_reg].sl[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) + ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)src.sw[1]);
- if (MM[cpu_reg].l[1] == 0x80008000 && src.l[1] == 0x80008000)
- MM[cpu_reg].l[1] = 0x80000000;
+ if (cpu_state.MM[cpu_reg].l[1] == 0x80008000 && src.l[1] == 0x80008000)
+ cpu_state.MM[cpu_reg].l[1] = 0x80000000;
else
- MM[cpu_reg].sl[1] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) + ((int32_t)MM[cpu_reg].sw[3] * (int32_t)src.sw[3]);
+ cpu_state.MM[cpu_reg].sl[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) + ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)src.sw[3]);
return 0;
}
@@ -284,10 +284,10 @@ static int opPMULLW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].w[0] *= MM[cpu_rm].w[0];
- MM[cpu_reg].w[1] *= MM[cpu_rm].w[1];
- MM[cpu_reg].w[2] *= MM[cpu_rm].w[2];
- MM[cpu_reg].w[3] *= MM[cpu_rm].w[3];
+ cpu_state.MM[cpu_reg].w[0] *= cpu_state.MM[cpu_rm].w[0];
+ cpu_state.MM[cpu_reg].w[1] *= cpu_state.MM[cpu_rm].w[1];
+ cpu_state.MM[cpu_reg].w[2] *= cpu_state.MM[cpu_rm].w[2];
+ cpu_state.MM[cpu_reg].w[3] *= cpu_state.MM[cpu_rm].w[3];
CLOCK_CYCLES(1);
}
else
@@ -295,11 +295,11 @@ static int opPMULLW_a16(uint32_t fetchdat)
MMX_REG src;
src.l[0] = readmeml(easeg, cpu_state.eaaddr);
- src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
- MM[cpu_reg].w[0] *= src.w[0];
- MM[cpu_reg].w[1] *= src.w[1];
- MM[cpu_reg].w[2] *= src.w[2];
- MM[cpu_reg].w[3] *= src.w[3];
+ src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].w[0] *= src.w[0];
+ cpu_state.MM[cpu_reg].w[1] *= src.w[1];
+ cpu_state.MM[cpu_reg].w[2] *= src.w[2];
+ cpu_state.MM[cpu_reg].w[3] *= src.w[3];
CLOCK_CYCLES(2);
}
return 0;
@@ -311,10 +311,10 @@ static int opPMULLW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].w[0] *= MM[cpu_rm].w[0];
- MM[cpu_reg].w[1] *= MM[cpu_rm].w[1];
- MM[cpu_reg].w[2] *= MM[cpu_rm].w[2];
- MM[cpu_reg].w[3] *= MM[cpu_rm].w[3];
+ cpu_state.MM[cpu_reg].w[0] *= cpu_state.MM[cpu_rm].w[0];
+ cpu_state.MM[cpu_reg].w[1] *= cpu_state.MM[cpu_rm].w[1];
+ cpu_state.MM[cpu_reg].w[2] *= cpu_state.MM[cpu_rm].w[2];
+ cpu_state.MM[cpu_reg].w[3] *= cpu_state.MM[cpu_rm].w[3];
CLOCK_CYCLES(1);
}
else
@@ -322,11 +322,11 @@ static int opPMULLW_a32(uint32_t fetchdat)
MMX_REG src;
src.l[0] = readmeml(easeg, cpu_state.eaaddr);
- src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
- MM[cpu_reg].w[0] *= src.w[0];
- MM[cpu_reg].w[1] *= src.w[1];
- MM[cpu_reg].w[2] *= src.w[2];
- MM[cpu_reg].w[3] *= src.w[3];
+ src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].w[0] *= src.w[0];
+ cpu_state.MM[cpu_reg].w[1] *= src.w[1];
+ cpu_state.MM[cpu_reg].w[2] *= src.w[2];
+ cpu_state.MM[cpu_reg].w[3] *= src.w[3];
CLOCK_CYCLES(2);
}
return 0;
@@ -339,10 +339,10 @@ static int opPMULHW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].w[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)MM[cpu_rm].sw[0]) >> 16;
- MM[cpu_reg].w[1] = ((int32_t)MM[cpu_reg].sw[1] * (int32_t)MM[cpu_rm].sw[1]) >> 16;
- MM[cpu_reg].w[2] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)MM[cpu_rm].sw[2]) >> 16;
- MM[cpu_reg].w[3] = ((int32_t)MM[cpu_reg].sw[3] * (int32_t)MM[cpu_rm].sw[3]) >> 16;
+ cpu_state.MM[cpu_reg].w[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)cpu_state.MM[cpu_rm].sw[0]) >> 16;
+ cpu_state.MM[cpu_reg].w[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)cpu_state.MM[cpu_rm].sw[1]) >> 16;
+ cpu_state.MM[cpu_reg].w[2] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)cpu_state.MM[cpu_rm].sw[2]) >> 16;
+ cpu_state.MM[cpu_reg].w[3] = ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)cpu_state.MM[cpu_rm].sw[3]) >> 16;
CLOCK_CYCLES(1);
}
else
@@ -350,11 +350,11 @@ static int opPMULHW_a16(uint32_t fetchdat)
MMX_REG src;
src.l[0] = readmeml(easeg, cpu_state.eaaddr);
- src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
- MM[cpu_reg].w[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) >> 16;
- MM[cpu_reg].w[1] = ((int32_t)MM[cpu_reg].sw[1] * (int32_t)src.sw[1]) >> 16;
- MM[cpu_reg].w[2] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) >> 16;
- MM[cpu_reg].w[3] = ((int32_t)MM[cpu_reg].sw[3] * (int32_t)src.sw[3]) >> 16;
+ src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].w[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) >> 16;
+ cpu_state.MM[cpu_reg].w[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)src.sw[1]) >> 16;
+ cpu_state.MM[cpu_reg].w[2] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) >> 16;
+ cpu_state.MM[cpu_reg].w[3] = ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)src.sw[3]) >> 16;
CLOCK_CYCLES(2);
}
return 0;
@@ -366,10 +366,10 @@ static int opPMULHW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].w[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)MM[cpu_rm].sw[0]) >> 16;
- MM[cpu_reg].w[1] = ((int32_t)MM[cpu_reg].sw[1] * (int32_t)MM[cpu_rm].sw[1]) >> 16;
- MM[cpu_reg].w[2] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)MM[cpu_rm].sw[2]) >> 16;
- MM[cpu_reg].w[3] = ((int32_t)MM[cpu_reg].sw[3] * (int32_t)MM[cpu_rm].sw[3]) >> 16;
+ cpu_state.MM[cpu_reg].w[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)cpu_state.MM[cpu_rm].sw[0]) >> 16;
+ cpu_state.MM[cpu_reg].w[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)cpu_state.MM[cpu_rm].sw[1]) >> 16;
+ cpu_state.MM[cpu_reg].w[2] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)cpu_state.MM[cpu_rm].sw[2]) >> 16;
+ cpu_state.MM[cpu_reg].w[3] = ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)cpu_state.MM[cpu_rm].sw[3]) >> 16;
CLOCK_CYCLES(1);
}
else
@@ -377,11 +377,11 @@ static int opPMULHW_a32(uint32_t fetchdat)
MMX_REG src;
src.l[0] = readmeml(easeg, cpu_state.eaaddr);
- src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (abrt) return 0;
- MM[cpu_reg].w[0] = ((int32_t)MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) >> 16;
- MM[cpu_reg].w[1] = ((int32_t)MM[cpu_reg].sw[1] * (int32_t)src.sw[1]) >> 16;
- MM[cpu_reg].w[2] = ((int32_t)MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) >> 16;
- MM[cpu_reg].w[3] = ((int32_t)MM[cpu_reg].sw[3] * (int32_t)src.sw[3]) >> 16;
+ src.l[1] = readmeml(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].w[0] = ((int32_t)cpu_state.MM[cpu_reg].sw[0] * (int32_t)src.sw[0]) >> 16;
+ cpu_state.MM[cpu_reg].w[1] = ((int32_t)cpu_state.MM[cpu_reg].sw[1] * (int32_t)src.sw[1]) >> 16;
+ cpu_state.MM[cpu_reg].w[2] = ((int32_t)cpu_state.MM[cpu_reg].sw[2] * (int32_t)src.sw[2]) >> 16;
+ cpu_state.MM[cpu_reg].w[3] = ((int32_t)cpu_state.MM[cpu_reg].sw[3] * (int32_t)src.sw[3]) >> 16;
CLOCK_CYCLES(2);
}
return 0;
@@ -395,14 +395,14 @@ static int opPSUBB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] -= src.b[0];
- MM[cpu_reg].b[1] -= src.b[1];
- MM[cpu_reg].b[2] -= src.b[2];
- MM[cpu_reg].b[3] -= src.b[3];
- MM[cpu_reg].b[4] -= src.b[4];
- MM[cpu_reg].b[5] -= src.b[5];
- MM[cpu_reg].b[6] -= src.b[6];
- MM[cpu_reg].b[7] -= src.b[7];
+ cpu_state.MM[cpu_reg].b[0] -= src.b[0];
+ cpu_state.MM[cpu_reg].b[1] -= src.b[1];
+ cpu_state.MM[cpu_reg].b[2] -= src.b[2];
+ cpu_state.MM[cpu_reg].b[3] -= src.b[3];
+ cpu_state.MM[cpu_reg].b[4] -= src.b[4];
+ cpu_state.MM[cpu_reg].b[5] -= src.b[5];
+ cpu_state.MM[cpu_reg].b[6] -= src.b[6];
+ cpu_state.MM[cpu_reg].b[7] -= src.b[7];
return 0;
}
@@ -414,14 +414,14 @@ static int opPSUBB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] -= src.b[0];
- MM[cpu_reg].b[1] -= src.b[1];
- MM[cpu_reg].b[2] -= src.b[2];
- MM[cpu_reg].b[3] -= src.b[3];
- MM[cpu_reg].b[4] -= src.b[4];
- MM[cpu_reg].b[5] -= src.b[5];
- MM[cpu_reg].b[6] -= src.b[6];
- MM[cpu_reg].b[7] -= src.b[7];
+ cpu_state.MM[cpu_reg].b[0] -= src.b[0];
+ cpu_state.MM[cpu_reg].b[1] -= src.b[1];
+ cpu_state.MM[cpu_reg].b[2] -= src.b[2];
+ cpu_state.MM[cpu_reg].b[3] -= src.b[3];
+ cpu_state.MM[cpu_reg].b[4] -= src.b[4];
+ cpu_state.MM[cpu_reg].b[5] -= src.b[5];
+ cpu_state.MM[cpu_reg].b[6] -= src.b[6];
+ cpu_state.MM[cpu_reg].b[7] -= src.b[7];
return 0;
}
@@ -434,10 +434,10 @@ static int opPSUBW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] -= src.w[0];
- MM[cpu_reg].w[1] -= src.w[1];
- MM[cpu_reg].w[2] -= src.w[2];
- MM[cpu_reg].w[3] -= src.w[3];
+ cpu_state.MM[cpu_reg].w[0] -= src.w[0];
+ cpu_state.MM[cpu_reg].w[1] -= src.w[1];
+ cpu_state.MM[cpu_reg].w[2] -= src.w[2];
+ cpu_state.MM[cpu_reg].w[3] -= src.w[3];
return 0;
}
@@ -449,10 +449,10 @@ static int opPSUBW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] -= src.w[0];
- MM[cpu_reg].w[1] -= src.w[1];
- MM[cpu_reg].w[2] -= src.w[2];
- MM[cpu_reg].w[3] -= src.w[3];
+ cpu_state.MM[cpu_reg].w[0] -= src.w[0];
+ cpu_state.MM[cpu_reg].w[1] -= src.w[1];
+ cpu_state.MM[cpu_reg].w[2] -= src.w[2];
+ cpu_state.MM[cpu_reg].w[3] -= src.w[3];
return 0;
}
@@ -465,8 +465,8 @@ static int opPSUBD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] -= src.l[0];
- MM[cpu_reg].l[1] -= src.l[1];
+ cpu_state.MM[cpu_reg].l[0] -= src.l[0];
+ cpu_state.MM[cpu_reg].l[1] -= src.l[1];
return 0;
}
@@ -478,8 +478,8 @@ static int opPSUBD_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] -= src.l[0];
- MM[cpu_reg].l[1] -= src.l[1];
+ cpu_state.MM[cpu_reg].l[0] -= src.l[0];
+ cpu_state.MM[cpu_reg].l[1] -= src.l[1];
return 0;
}
@@ -492,14 +492,14 @@ static int opPSUBSB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sb[0] = SSATB(MM[cpu_reg].sb[0] - src.sb[0]);
- MM[cpu_reg].sb[1] = SSATB(MM[cpu_reg].sb[1] - src.sb[1]);
- MM[cpu_reg].sb[2] = SSATB(MM[cpu_reg].sb[2] - src.sb[2]);
- MM[cpu_reg].sb[3] = SSATB(MM[cpu_reg].sb[3] - src.sb[3]);
- MM[cpu_reg].sb[4] = SSATB(MM[cpu_reg].sb[4] - src.sb[4]);
- MM[cpu_reg].sb[5] = SSATB(MM[cpu_reg].sb[5] - src.sb[5]);
- MM[cpu_reg].sb[6] = SSATB(MM[cpu_reg].sb[6] - src.sb[6]);
- MM[cpu_reg].sb[7] = SSATB(MM[cpu_reg].sb[7] - src.sb[7]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(cpu_state.MM[cpu_reg].sb[0] - src.sb[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(cpu_state.MM[cpu_reg].sb[1] - src.sb[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(cpu_state.MM[cpu_reg].sb[2] - src.sb[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(cpu_state.MM[cpu_reg].sb[3] - src.sb[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(cpu_state.MM[cpu_reg].sb[4] - src.sb[4]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(cpu_state.MM[cpu_reg].sb[5] - src.sb[5]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(cpu_state.MM[cpu_reg].sb[6] - src.sb[6]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(cpu_state.MM[cpu_reg].sb[7] - src.sb[7]);
return 0;
}
@@ -511,14 +511,14 @@ static int opPSUBSB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sb[0] = SSATB(MM[cpu_reg].sb[0] - src.sb[0]);
- MM[cpu_reg].sb[1] = SSATB(MM[cpu_reg].sb[1] - src.sb[1]);
- MM[cpu_reg].sb[2] = SSATB(MM[cpu_reg].sb[2] - src.sb[2]);
- MM[cpu_reg].sb[3] = SSATB(MM[cpu_reg].sb[3] - src.sb[3]);
- MM[cpu_reg].sb[4] = SSATB(MM[cpu_reg].sb[4] - src.sb[4]);
- MM[cpu_reg].sb[5] = SSATB(MM[cpu_reg].sb[5] - src.sb[5]);
- MM[cpu_reg].sb[6] = SSATB(MM[cpu_reg].sb[6] - src.sb[6]);
- MM[cpu_reg].sb[7] = SSATB(MM[cpu_reg].sb[7] - src.sb[7]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(cpu_state.MM[cpu_reg].sb[0] - src.sb[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(cpu_state.MM[cpu_reg].sb[1] - src.sb[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(cpu_state.MM[cpu_reg].sb[2] - src.sb[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(cpu_state.MM[cpu_reg].sb[3] - src.sb[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(cpu_state.MM[cpu_reg].sb[4] - src.sb[4]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(cpu_state.MM[cpu_reg].sb[5] - src.sb[5]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(cpu_state.MM[cpu_reg].sb[6] - src.sb[6]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(cpu_state.MM[cpu_reg].sb[7] - src.sb[7]);
return 0;
}
@@ -531,14 +531,14 @@ static int opPSUBUSB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = USATB(MM[cpu_reg].b[0] - src.b[0]);
- MM[cpu_reg].b[1] = USATB(MM[cpu_reg].b[1] - src.b[1]);
- MM[cpu_reg].b[2] = USATB(MM[cpu_reg].b[2] - src.b[2]);
- MM[cpu_reg].b[3] = USATB(MM[cpu_reg].b[3] - src.b[3]);
- MM[cpu_reg].b[4] = USATB(MM[cpu_reg].b[4] - src.b[4]);
- MM[cpu_reg].b[5] = USATB(MM[cpu_reg].b[5] - src.b[5]);
- MM[cpu_reg].b[6] = USATB(MM[cpu_reg].b[6] - src.b[6]);
- MM[cpu_reg].b[7] = USATB(MM[cpu_reg].b[7] - src.b[7]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(cpu_state.MM[cpu_reg].b[0] - src.b[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(cpu_state.MM[cpu_reg].b[1] - src.b[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(cpu_state.MM[cpu_reg].b[2] - src.b[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(cpu_state.MM[cpu_reg].b[3] - src.b[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(cpu_state.MM[cpu_reg].b[4] - src.b[4]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(cpu_state.MM[cpu_reg].b[5] - src.b[5]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(cpu_state.MM[cpu_reg].b[6] - src.b[6]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(cpu_state.MM[cpu_reg].b[7] - src.b[7]);
return 0;
}
@@ -550,14 +550,14 @@ static int opPSUBUSB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = USATB(MM[cpu_reg].b[0] - src.b[0]);
- MM[cpu_reg].b[1] = USATB(MM[cpu_reg].b[1] - src.b[1]);
- MM[cpu_reg].b[2] = USATB(MM[cpu_reg].b[2] - src.b[2]);
- MM[cpu_reg].b[3] = USATB(MM[cpu_reg].b[3] - src.b[3]);
- MM[cpu_reg].b[4] = USATB(MM[cpu_reg].b[4] - src.b[4]);
- MM[cpu_reg].b[5] = USATB(MM[cpu_reg].b[5] - src.b[5]);
- MM[cpu_reg].b[6] = USATB(MM[cpu_reg].b[6] - src.b[6]);
- MM[cpu_reg].b[7] = USATB(MM[cpu_reg].b[7] - src.b[7]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(cpu_state.MM[cpu_reg].b[0] - src.b[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(cpu_state.MM[cpu_reg].b[1] - src.b[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(cpu_state.MM[cpu_reg].b[2] - src.b[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(cpu_state.MM[cpu_reg].b[3] - src.b[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(cpu_state.MM[cpu_reg].b[4] - src.b[4]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(cpu_state.MM[cpu_reg].b[5] - src.b[5]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(cpu_state.MM[cpu_reg].b[6] - src.b[6]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(cpu_state.MM[cpu_reg].b[7] - src.b[7]);
return 0;
}
@@ -570,10 +570,10 @@ static int opPSUBSW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sw[0] = SSATW(MM[cpu_reg].sw[0] - src.sw[0]);
- MM[cpu_reg].sw[1] = SSATW(MM[cpu_reg].sw[1] - src.sw[1]);
- MM[cpu_reg].sw[2] = SSATW(MM[cpu_reg].sw[2] - src.sw[2]);
- MM[cpu_reg].sw[3] = SSATW(MM[cpu_reg].sw[3] - src.sw[3]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(cpu_state.MM[cpu_reg].sw[0] - src.sw[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(cpu_state.MM[cpu_reg].sw[1] - src.sw[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(cpu_state.MM[cpu_reg].sw[2] - src.sw[2]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(cpu_state.MM[cpu_reg].sw[3] - src.sw[3]);
return 0;
}
@@ -585,10 +585,10 @@ static int opPSUBSW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].sw[0] = SSATW(MM[cpu_reg].sw[0] - src.sw[0]);
- MM[cpu_reg].sw[1] = SSATW(MM[cpu_reg].sw[1] - src.sw[1]);
- MM[cpu_reg].sw[2] = SSATW(MM[cpu_reg].sw[2] - src.sw[2]);
- MM[cpu_reg].sw[3] = SSATW(MM[cpu_reg].sw[3] - src.sw[3]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(cpu_state.MM[cpu_reg].sw[0] - src.sw[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(cpu_state.MM[cpu_reg].sw[1] - src.sw[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(cpu_state.MM[cpu_reg].sw[2] - src.sw[2]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(cpu_state.MM[cpu_reg].sw[3] - src.sw[3]);
return 0;
}
@@ -601,10 +601,10 @@ static int opPSUBUSW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = USATW(MM[cpu_reg].w[0] - src.w[0]);
- MM[cpu_reg].w[1] = USATW(MM[cpu_reg].w[1] - src.w[1]);
- MM[cpu_reg].w[2] = USATW(MM[cpu_reg].w[2] - src.w[2]);
- MM[cpu_reg].w[3] = USATW(MM[cpu_reg].w[3] - src.w[3]);
+ cpu_state.MM[cpu_reg].w[0] = USATW(cpu_state.MM[cpu_reg].w[0] - src.w[0]);
+ cpu_state.MM[cpu_reg].w[1] = USATW(cpu_state.MM[cpu_reg].w[1] - src.w[1]);
+ cpu_state.MM[cpu_reg].w[2] = USATW(cpu_state.MM[cpu_reg].w[2] - src.w[2]);
+ cpu_state.MM[cpu_reg].w[3] = USATW(cpu_state.MM[cpu_reg].w[3] - src.w[3]);
return 0;
}
@@ -616,10 +616,10 @@ static int opPSUBUSW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = USATW(MM[cpu_reg].w[0] - src.w[0]);
- MM[cpu_reg].w[1] = USATW(MM[cpu_reg].w[1] - src.w[1]);
- MM[cpu_reg].w[2] = USATW(MM[cpu_reg].w[2] - src.w[2]);
- MM[cpu_reg].w[3] = USATW(MM[cpu_reg].w[3] - src.w[3]);
+ cpu_state.MM[cpu_reg].w[0] = USATW(cpu_state.MM[cpu_reg].w[0] - src.w[0]);
+ cpu_state.MM[cpu_reg].w[1] = USATW(cpu_state.MM[cpu_reg].w[1] - src.w[1]);
+ cpu_state.MM[cpu_reg].w[2] = USATW(cpu_state.MM[cpu_reg].w[2] - src.w[2]);
+ cpu_state.MM[cpu_reg].w[3] = USATW(cpu_state.MM[cpu_reg].w[3] - src.w[3]);
return 0;
}
diff --git a/src/x86_ops_mmx_cmp.h b/src/x86_ops_mmx_cmp.h
index 91780edcb..eb401b83f 100644
--- a/src/x86_ops_mmx_cmp.h
+++ b/src/x86_ops_mmx_cmp.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opPCMPEQB_a16(uint32_t fetchdat)
{
MMX_REG src;
@@ -10,14 +7,14 @@ static int opPCMPEQB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = (MM[cpu_reg].b[0] == src.b[0]) ? 0xff : 0;
- MM[cpu_reg].b[1] = (MM[cpu_reg].b[1] == src.b[1]) ? 0xff : 0;
- MM[cpu_reg].b[2] = (MM[cpu_reg].b[2] == src.b[2]) ? 0xff : 0;
- MM[cpu_reg].b[3] = (MM[cpu_reg].b[3] == src.b[3]) ? 0xff : 0;
- MM[cpu_reg].b[4] = (MM[cpu_reg].b[4] == src.b[4]) ? 0xff : 0;
- MM[cpu_reg].b[5] = (MM[cpu_reg].b[5] == src.b[5]) ? 0xff : 0;
- MM[cpu_reg].b[6] = (MM[cpu_reg].b[6] == src.b[6]) ? 0xff : 0;
- MM[cpu_reg].b[7] = (MM[cpu_reg].b[7] == src.b[7]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[0] = (cpu_state.MM[cpu_reg].b[0] == src.b[0]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[1] = (cpu_state.MM[cpu_reg].b[1] == src.b[1]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[2] = (cpu_state.MM[cpu_reg].b[2] == src.b[2]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[3] = (cpu_state.MM[cpu_reg].b[3] == src.b[3]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[4] = (cpu_state.MM[cpu_reg].b[4] == src.b[4]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[5] = (cpu_state.MM[cpu_reg].b[5] == src.b[5]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[6] = (cpu_state.MM[cpu_reg].b[6] == src.b[6]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[7] = (cpu_state.MM[cpu_reg].b[7] == src.b[7]) ? 0xff : 0;
return 0;
}
@@ -30,14 +27,14 @@ static int opPCMPEQB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = (MM[cpu_reg].b[0] == src.b[0]) ? 0xff : 0;
- MM[cpu_reg].b[1] = (MM[cpu_reg].b[1] == src.b[1]) ? 0xff : 0;
- MM[cpu_reg].b[2] = (MM[cpu_reg].b[2] == src.b[2]) ? 0xff : 0;
- MM[cpu_reg].b[3] = (MM[cpu_reg].b[3] == src.b[3]) ? 0xff : 0;
- MM[cpu_reg].b[4] = (MM[cpu_reg].b[4] == src.b[4]) ? 0xff : 0;
- MM[cpu_reg].b[5] = (MM[cpu_reg].b[5] == src.b[5]) ? 0xff : 0;
- MM[cpu_reg].b[6] = (MM[cpu_reg].b[6] == src.b[6]) ? 0xff : 0;
- MM[cpu_reg].b[7] = (MM[cpu_reg].b[7] == src.b[7]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[0] = (cpu_state.MM[cpu_reg].b[0] == src.b[0]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[1] = (cpu_state.MM[cpu_reg].b[1] == src.b[1]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[2] = (cpu_state.MM[cpu_reg].b[2] == src.b[2]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[3] = (cpu_state.MM[cpu_reg].b[3] == src.b[3]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[4] = (cpu_state.MM[cpu_reg].b[4] == src.b[4]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[5] = (cpu_state.MM[cpu_reg].b[5] == src.b[5]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[6] = (cpu_state.MM[cpu_reg].b[6] == src.b[6]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[7] = (cpu_state.MM[cpu_reg].b[7] == src.b[7]) ? 0xff : 0;
return 0;
}
@@ -51,14 +48,14 @@ static int opPCMPGTB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = (MM[cpu_reg].sb[0] > src.sb[0]) ? 0xff : 0;
- MM[cpu_reg].b[1] = (MM[cpu_reg].sb[1] > src.sb[1]) ? 0xff : 0;
- MM[cpu_reg].b[2] = (MM[cpu_reg].sb[2] > src.sb[2]) ? 0xff : 0;
- MM[cpu_reg].b[3] = (MM[cpu_reg].sb[3] > src.sb[3]) ? 0xff : 0;
- MM[cpu_reg].b[4] = (MM[cpu_reg].sb[4] > src.sb[4]) ? 0xff : 0;
- MM[cpu_reg].b[5] = (MM[cpu_reg].sb[5] > src.sb[5]) ? 0xff : 0;
- MM[cpu_reg].b[6] = (MM[cpu_reg].sb[6] > src.sb[6]) ? 0xff : 0;
- MM[cpu_reg].b[7] = (MM[cpu_reg].sb[7] > src.sb[7]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[0] = (cpu_state.MM[cpu_reg].sb[0] > src.sb[0]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[1] = (cpu_state.MM[cpu_reg].sb[1] > src.sb[1]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[2] = (cpu_state.MM[cpu_reg].sb[2] > src.sb[2]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[3] = (cpu_state.MM[cpu_reg].sb[3] > src.sb[3]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[4] = (cpu_state.MM[cpu_reg].sb[4] > src.sb[4]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[5] = (cpu_state.MM[cpu_reg].sb[5] > src.sb[5]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[6] = (cpu_state.MM[cpu_reg].sb[6] > src.sb[6]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[7] = (cpu_state.MM[cpu_reg].sb[7] > src.sb[7]) ? 0xff : 0;
return 0;
}
@@ -71,14 +68,14 @@ static int opPCMPGTB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = (MM[cpu_reg].sb[0] > src.sb[0]) ? 0xff : 0;
- MM[cpu_reg].b[1] = (MM[cpu_reg].sb[1] > src.sb[1]) ? 0xff : 0;
- MM[cpu_reg].b[2] = (MM[cpu_reg].sb[2] > src.sb[2]) ? 0xff : 0;
- MM[cpu_reg].b[3] = (MM[cpu_reg].sb[3] > src.sb[3]) ? 0xff : 0;
- MM[cpu_reg].b[4] = (MM[cpu_reg].sb[4] > src.sb[4]) ? 0xff : 0;
- MM[cpu_reg].b[5] = (MM[cpu_reg].sb[5] > src.sb[5]) ? 0xff : 0;
- MM[cpu_reg].b[6] = (MM[cpu_reg].sb[6] > src.sb[6]) ? 0xff : 0;
- MM[cpu_reg].b[7] = (MM[cpu_reg].sb[7] > src.sb[7]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[0] = (cpu_state.MM[cpu_reg].sb[0] > src.sb[0]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[1] = (cpu_state.MM[cpu_reg].sb[1] > src.sb[1]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[2] = (cpu_state.MM[cpu_reg].sb[2] > src.sb[2]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[3] = (cpu_state.MM[cpu_reg].sb[3] > src.sb[3]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[4] = (cpu_state.MM[cpu_reg].sb[4] > src.sb[4]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[5] = (cpu_state.MM[cpu_reg].sb[5] > src.sb[5]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[6] = (cpu_state.MM[cpu_reg].sb[6] > src.sb[6]) ? 0xff : 0;
+ cpu_state.MM[cpu_reg].b[7] = (cpu_state.MM[cpu_reg].sb[7] > src.sb[7]) ? 0xff : 0;
return 0;
}
@@ -92,10 +89,10 @@ static int opPCMPEQW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = (MM[cpu_reg].w[0] == src.w[0]) ? 0xffff : 0;
- MM[cpu_reg].w[1] = (MM[cpu_reg].w[1] == src.w[1]) ? 0xffff : 0;
- MM[cpu_reg].w[2] = (MM[cpu_reg].w[2] == src.w[2]) ? 0xffff : 0;
- MM[cpu_reg].w[3] = (MM[cpu_reg].w[3] == src.w[3]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[0] = (cpu_state.MM[cpu_reg].w[0] == src.w[0]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[1] = (cpu_state.MM[cpu_reg].w[1] == src.w[1]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[2] = (cpu_state.MM[cpu_reg].w[2] == src.w[2]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[3] = (cpu_state.MM[cpu_reg].w[3] == src.w[3]) ? 0xffff : 0;
return 0;
}
@@ -108,10 +105,10 @@ static int opPCMPEQW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = (MM[cpu_reg].w[0] == src.w[0]) ? 0xffff : 0;
- MM[cpu_reg].w[1] = (MM[cpu_reg].w[1] == src.w[1]) ? 0xffff : 0;
- MM[cpu_reg].w[2] = (MM[cpu_reg].w[2] == src.w[2]) ? 0xffff : 0;
- MM[cpu_reg].w[3] = (MM[cpu_reg].w[3] == src.w[3]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[0] = (cpu_state.MM[cpu_reg].w[0] == src.w[0]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[1] = (cpu_state.MM[cpu_reg].w[1] == src.w[1]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[2] = (cpu_state.MM[cpu_reg].w[2] == src.w[2]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[3] = (cpu_state.MM[cpu_reg].w[3] == src.w[3]) ? 0xffff : 0;
return 0;
}
@@ -125,10 +122,10 @@ static int opPCMPGTW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = (MM[cpu_reg].sw[0] > src.sw[0]) ? 0xffff : 0;
- MM[cpu_reg].w[1] = (MM[cpu_reg].sw[1] > src.sw[1]) ? 0xffff : 0;
- MM[cpu_reg].w[2] = (MM[cpu_reg].sw[2] > src.sw[2]) ? 0xffff : 0;
- MM[cpu_reg].w[3] = (MM[cpu_reg].sw[3] > src.sw[3]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[0] = (cpu_state.MM[cpu_reg].sw[0] > src.sw[0]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[1] = (cpu_state.MM[cpu_reg].sw[1] > src.sw[1]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[2] = (cpu_state.MM[cpu_reg].sw[2] > src.sw[2]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[3] = (cpu_state.MM[cpu_reg].sw[3] > src.sw[3]) ? 0xffff : 0;
return 0;
}
@@ -141,10 +138,10 @@ static int opPCMPGTW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = (MM[cpu_reg].sw[0] > src.sw[0]) ? 0xffff : 0;
- MM[cpu_reg].w[1] = (MM[cpu_reg].sw[1] > src.sw[1]) ? 0xffff : 0;
- MM[cpu_reg].w[2] = (MM[cpu_reg].sw[2] > src.sw[2]) ? 0xffff : 0;
- MM[cpu_reg].w[3] = (MM[cpu_reg].sw[3] > src.sw[3]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[0] = (cpu_state.MM[cpu_reg].sw[0] > src.sw[0]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[1] = (cpu_state.MM[cpu_reg].sw[1] > src.sw[1]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[2] = (cpu_state.MM[cpu_reg].sw[2] > src.sw[2]) ? 0xffff : 0;
+ cpu_state.MM[cpu_reg].w[3] = (cpu_state.MM[cpu_reg].sw[3] > src.sw[3]) ? 0xffff : 0;
return 0;
}
@@ -158,8 +155,8 @@ static int opPCMPEQD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = (MM[cpu_reg].l[0] == src.l[0]) ? 0xffffffff : 0;
- MM[cpu_reg].l[1] = (MM[cpu_reg].l[1] == src.l[1]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[0] = (cpu_state.MM[cpu_reg].l[0] == src.l[0]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[1] = (cpu_state.MM[cpu_reg].l[1] == src.l[1]) ? 0xffffffff : 0;
return 0;
}
@@ -172,8 +169,8 @@ static int opPCMPEQD_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = (MM[cpu_reg].l[0] == src.l[0]) ? 0xffffffff : 0;
- MM[cpu_reg].l[1] = (MM[cpu_reg].l[1] == src.l[1]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[0] = (cpu_state.MM[cpu_reg].l[0] == src.l[0]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[1] = (cpu_state.MM[cpu_reg].l[1] == src.l[1]) ? 0xffffffff : 0;
return 0;
}
@@ -187,8 +184,8 @@ static int opPCMPGTD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = (MM[cpu_reg].sl[0] > src.sl[0]) ? 0xffffffff : 0;
- MM[cpu_reg].l[1] = (MM[cpu_reg].sl[1] > src.sl[1]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[0] = (cpu_state.MM[cpu_reg].sl[0] > src.sl[0]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[1] = (cpu_state.MM[cpu_reg].sl[1] > src.sl[1]) ? 0xffffffff : 0;
return 0;
}
@@ -201,8 +198,8 @@ static int opPCMPGTD_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = (MM[cpu_reg].sl[0] > src.sl[0]) ? 0xffffffff : 0;
- MM[cpu_reg].l[1] = (MM[cpu_reg].sl[1] > src.sl[1]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[0] = (cpu_state.MM[cpu_reg].sl[0] > src.sl[0]) ? 0xffffffff : 0;
+ cpu_state.MM[cpu_reg].l[1] = (cpu_state.MM[cpu_reg].sl[1] > src.sl[1]) ? 0xffffffff : 0;
return 0;
}
diff --git a/src/x86_ops_mmx_logic.h b/src/x86_ops_mmx_logic.h
index 91c4053b9..be5132e85 100644
--- a/src/x86_ops_mmx_logic.h
+++ b/src/x86_ops_mmx_logic.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opPAND_a16(uint32_t fetchdat)
{
MMX_REG src;
@@ -9,7 +6,7 @@ static int opPAND_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q &= src.q;
+ cpu_state.MM[cpu_reg].q &= src.q;
return 0;
}
static int opPAND_a32(uint32_t fetchdat)
@@ -20,7 +17,7 @@ static int opPAND_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q &= src.q;
+ cpu_state.MM[cpu_reg].q &= src.q;
return 0;
}
@@ -32,7 +29,7 @@ static int opPANDN_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q = ~MM[cpu_reg].q & src.q;
+ cpu_state.MM[cpu_reg].q = ~cpu_state.MM[cpu_reg].q & src.q;
return 0;
}
static int opPANDN_a32(uint32_t fetchdat)
@@ -43,7 +40,7 @@ static int opPANDN_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q = ~MM[cpu_reg].q & src.q;
+ cpu_state.MM[cpu_reg].q = ~cpu_state.MM[cpu_reg].q & src.q;
return 0;
}
@@ -55,7 +52,7 @@ static int opPOR_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q |= src.q;
+ cpu_state.MM[cpu_reg].q |= src.q;
return 0;
}
static int opPOR_a32(uint32_t fetchdat)
@@ -66,7 +63,7 @@ static int opPOR_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q |= src.q;
+ cpu_state.MM[cpu_reg].q |= src.q;
return 0;
}
@@ -78,7 +75,7 @@ static int opPXOR_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q ^= src.q;
+ cpu_state.MM[cpu_reg].q ^= src.q;
return 0;
}
static int opPXOR_a32(uint32_t fetchdat)
@@ -89,6 +86,6 @@ static int opPXOR_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].q ^= src.q;
+ cpu_state.MM[cpu_reg].q ^= src.q;
return 0;
}
diff --git a/src/x86_ops_mmx_mov.h b/src/x86_ops_mmx_mov.h
index dbb0cc5ea..8cc0c8e26 100644
--- a/src/x86_ops_mmx_mov.h
+++ b/src/x86_ops_mmx_mov.h
@@ -5,17 +5,17 @@ static int opMOVD_l_mm_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].l[0] = cpu_state.regs[cpu_rm].l;
- MM[cpu_reg].l[1] = 0;
+ cpu_state.MM[cpu_reg].l[0] = cpu_state.regs[cpu_rm].l;
+ cpu_state.MM[cpu_reg].l[1] = 0;
CLOCK_CYCLES(1);
}
else
{
uint32_t dst;
- dst = readmeml(easeg, cpu_state.eaaddr); if (abrt) return 1;
- MM[cpu_reg].l[0] = dst;
- MM[cpu_reg].l[1] = 0;
+ dst = readmeml(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 1;
+ cpu_state.MM[cpu_reg].l[0] = dst;
+ cpu_state.MM[cpu_reg].l[1] = 0;
CLOCK_CYCLES(2);
}
@@ -28,17 +28,17 @@ static int opMOVD_l_mm_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].l[0] = cpu_state.regs[cpu_rm].l;
- MM[cpu_reg].l[1] = 0;
+ cpu_state.MM[cpu_reg].l[0] = cpu_state.regs[cpu_rm].l;
+ cpu_state.MM[cpu_reg].l[1] = 0;
CLOCK_CYCLES(1);
}
else
{
uint32_t dst;
- dst = readmeml(easeg, cpu_state.eaaddr); if (abrt) return 1;
- MM[cpu_reg].l[0] = dst;
- MM[cpu_reg].l[1] = 0;
+ dst = readmeml(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 1;
+ cpu_state.MM[cpu_reg].l[0] = dst;
+ cpu_state.MM[cpu_reg].l[1] = 0;
CLOCK_CYCLES(2);
}
@@ -52,13 +52,13 @@ static int opMOVD_mm_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- cpu_state.regs[cpu_rm].l = MM[cpu_reg].l[0];
+ cpu_state.regs[cpu_rm].l = cpu_state.MM[cpu_reg].l[0];
CLOCK_CYCLES(1);
}
else
{
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3);
- writememl(easeg, cpu_state.eaaddr, MM[cpu_reg].l[0]); if (abrt) return 1;
+ writememl(easeg, cpu_state.eaaddr, cpu_state.MM[cpu_reg].l[0]); if (cpu_state.abrt) return 1;
CLOCK_CYCLES(2);
}
return 0;
@@ -70,13 +70,13 @@ static int opMOVD_mm_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- cpu_state.regs[cpu_rm].l = MM[cpu_reg].l[0];
+ cpu_state.regs[cpu_rm].l = cpu_state.MM[cpu_reg].l[0];
CLOCK_CYCLES(1);
}
else
{
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3);
- writememl(easeg, cpu_state.eaaddr, MM[cpu_reg].l[0]); if (abrt) return 1;
+ writememl(easeg, cpu_state.eaaddr, cpu_state.MM[cpu_reg].l[0]); if (cpu_state.abrt) return 1;
CLOCK_CYCLES(2);
}
return 0;
@@ -89,15 +89,15 @@ static int opMOVQ_q_mm_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].q = MM[cpu_rm].q;
+ cpu_state.MM[cpu_reg].q = cpu_state.MM[cpu_rm].q;
CLOCK_CYCLES(1);
}
else
{
uint64_t dst;
- dst = readmemq(easeg, cpu_state.eaaddr); if (abrt) return 1;
- MM[cpu_reg].q = dst;
+ dst = readmemq(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 1;
+ cpu_state.MM[cpu_reg].q = dst;
CLOCK_CYCLES(2);
}
return 0;
@@ -109,15 +109,15 @@ static int opMOVQ_q_mm_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].q = MM[cpu_rm].q;
+ cpu_state.MM[cpu_reg].q = cpu_state.MM[cpu_rm].q;
CLOCK_CYCLES(1);
}
else
{
uint64_t dst;
- dst = readmemq(easeg, cpu_state.eaaddr); if (abrt) return 1;
- MM[cpu_reg].q = dst;
+ dst = readmemq(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 1;
+ cpu_state.MM[cpu_reg].q = dst;
CLOCK_CYCLES(2);
}
return 0;
@@ -130,13 +130,13 @@ static int opMOVQ_mm_q_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_rm].q = MM[cpu_reg].q;
+ cpu_state.MM[cpu_rm].q = cpu_state.MM[cpu_reg].q;
CLOCK_CYCLES(1);
}
else
{
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 7);
- writememq(easeg, cpu_state.eaaddr, MM[cpu_reg].l[0]); if (abrt) return 1;
+ writememq(easeg, cpu_state.eaaddr, cpu_state.MM[cpu_reg].l[0]); if (cpu_state.abrt) return 1;
CLOCK_CYCLES(2);
}
return 0;
@@ -148,13 +148,13 @@ static int opMOVQ_mm_q_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_rm].q = MM[cpu_reg].q;
+ cpu_state.MM[cpu_rm].q = cpu_state.MM[cpu_reg].q;
CLOCK_CYCLES(1);
}
else
{
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 7);
- writememq(easeg, cpu_state.eaaddr, MM[cpu_reg].q); if (abrt) return 1;
+ writememq(easeg, cpu_state.eaaddr, cpu_state.MM[cpu_reg].q); if (cpu_state.abrt) return 1;
CLOCK_CYCLES(2);
}
return 0;
diff --git a/src/x86_ops_mmx_pack.h b/src/x86_ops_mmx_pack.h
index 847eb8a59..50b813cb3 100644
--- a/src/x86_ops_mmx_pack.h
+++ b/src/x86_ops_mmx_pack.h
@@ -5,15 +5,15 @@ static int opPUNPCKLDQ_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].l[1] = MM[cpu_rm].l[0];
+ cpu_state.MM[cpu_reg].l[1] = cpu_state.MM[cpu_rm].l[0];
CLOCK_CYCLES(1);
}
else
{
uint32_t src;
- src = readmeml(easeg, cpu_state.eaaddr); if (abrt) return 0;
- MM[cpu_reg].l[1] = src;
+ src = readmeml(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].l[1] = src;
CLOCK_CYCLES(2);
}
@@ -26,15 +26,15 @@ static int opPUNPCKLDQ_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (cpu_mod == 3)
{
- MM[cpu_reg].l[1] = MM[cpu_rm].l[0];
+ cpu_state.MM[cpu_reg].l[1] = cpu_state.MM[cpu_rm].l[0];
CLOCK_CYCLES(1);
}
else
{
uint32_t src;
- src = readmeml(easeg, cpu_state.eaaddr); if (abrt) return 0;
- MM[cpu_reg].l[1] = src;
+ src = readmeml(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 0;
+ cpu_state.MM[cpu_reg].l[1] = src;
CLOCK_CYCLES(2);
}
@@ -49,8 +49,8 @@ static int opPUNPCKHDQ_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = MM[cpu_reg].l[1];
- MM[cpu_reg].l[1] = src.l[1];
+ cpu_state.MM[cpu_reg].l[0] = cpu_state.MM[cpu_reg].l[1];
+ cpu_state.MM[cpu_reg].l[1] = src.l[1];
return 0;
}
@@ -62,8 +62,8 @@ static int opPUNPCKHDQ_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].l[0] = MM[cpu_reg].l[1];
- MM[cpu_reg].l[1] = src.l[1];
+ cpu_state.MM[cpu_reg].l[0] = cpu_state.MM[cpu_reg].l[1];
+ cpu_state.MM[cpu_reg].l[1] = src.l[1];
return 0;
}
@@ -76,14 +76,14 @@ static int opPUNPCKLBW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[7] = src.b[3];
- MM[cpu_reg].b[6] = MM[cpu_reg].b[3];
- MM[cpu_reg].b[5] = src.b[2];
- MM[cpu_reg].b[4] = MM[cpu_reg].b[2];
- MM[cpu_reg].b[3] = src.b[1];
- MM[cpu_reg].b[2] = MM[cpu_reg].b[1];
- MM[cpu_reg].b[1] = src.b[0];
- MM[cpu_reg].b[0] = MM[cpu_reg].b[0];
+ cpu_state.MM[cpu_reg].b[7] = src.b[3];
+ cpu_state.MM[cpu_reg].b[6] = cpu_state.MM[cpu_reg].b[3];
+ cpu_state.MM[cpu_reg].b[5] = src.b[2];
+ cpu_state.MM[cpu_reg].b[4] = cpu_state.MM[cpu_reg].b[2];
+ cpu_state.MM[cpu_reg].b[3] = src.b[1];
+ cpu_state.MM[cpu_reg].b[2] = cpu_state.MM[cpu_reg].b[1];
+ cpu_state.MM[cpu_reg].b[1] = src.b[0];
+ cpu_state.MM[cpu_reg].b[0] = cpu_state.MM[cpu_reg].b[0];
return 0;
}
@@ -95,14 +95,14 @@ static int opPUNPCKLBW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[7] = src.b[3];
- MM[cpu_reg].b[6] = MM[cpu_reg].b[3];
- MM[cpu_reg].b[5] = src.b[2];
- MM[cpu_reg].b[4] = MM[cpu_reg].b[2];
- MM[cpu_reg].b[3] = src.b[1];
- MM[cpu_reg].b[2] = MM[cpu_reg].b[1];
- MM[cpu_reg].b[1] = src.b[0];
- MM[cpu_reg].b[0] = MM[cpu_reg].b[0];
+ cpu_state.MM[cpu_reg].b[7] = src.b[3];
+ cpu_state.MM[cpu_reg].b[6] = cpu_state.MM[cpu_reg].b[3];
+ cpu_state.MM[cpu_reg].b[5] = src.b[2];
+ cpu_state.MM[cpu_reg].b[4] = cpu_state.MM[cpu_reg].b[2];
+ cpu_state.MM[cpu_reg].b[3] = src.b[1];
+ cpu_state.MM[cpu_reg].b[2] = cpu_state.MM[cpu_reg].b[1];
+ cpu_state.MM[cpu_reg].b[1] = src.b[0];
+ cpu_state.MM[cpu_reg].b[0] = cpu_state.MM[cpu_reg].b[0];
return 0;
}
@@ -115,14 +115,14 @@ static int opPUNPCKHBW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = MM[cpu_reg].b[4];
- MM[cpu_reg].b[1] = src.b[4];
- MM[cpu_reg].b[2] = MM[cpu_reg].b[5];
- MM[cpu_reg].b[3] = src.b[5];
- MM[cpu_reg].b[4] = MM[cpu_reg].b[6];
- MM[cpu_reg].b[5] = src.b[6];
- MM[cpu_reg].b[6] = MM[cpu_reg].b[7];
- MM[cpu_reg].b[7] = src.b[7];
+ cpu_state.MM[cpu_reg].b[0] = cpu_state.MM[cpu_reg].b[4];
+ cpu_state.MM[cpu_reg].b[1] = src.b[4];
+ cpu_state.MM[cpu_reg].b[2] = cpu_state.MM[cpu_reg].b[5];
+ cpu_state.MM[cpu_reg].b[3] = src.b[5];
+ cpu_state.MM[cpu_reg].b[4] = cpu_state.MM[cpu_reg].b[6];
+ cpu_state.MM[cpu_reg].b[5] = src.b[6];
+ cpu_state.MM[cpu_reg].b[6] = cpu_state.MM[cpu_reg].b[7];
+ cpu_state.MM[cpu_reg].b[7] = src.b[7];
return 0;
}
@@ -134,14 +134,14 @@ static int opPUNPCKHBW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].b[0] = MM[cpu_reg].b[4];
- MM[cpu_reg].b[1] = src.b[4];
- MM[cpu_reg].b[2] = MM[cpu_reg].b[5];
- MM[cpu_reg].b[3] = src.b[5];
- MM[cpu_reg].b[4] = MM[cpu_reg].b[6];
- MM[cpu_reg].b[5] = src.b[6];
- MM[cpu_reg].b[6] = MM[cpu_reg].b[7];
- MM[cpu_reg].b[7] = src.b[7];
+ cpu_state.MM[cpu_reg].b[0] = cpu_state.MM[cpu_reg].b[4];
+ cpu_state.MM[cpu_reg].b[1] = src.b[4];
+ cpu_state.MM[cpu_reg].b[2] = cpu_state.MM[cpu_reg].b[5];
+ cpu_state.MM[cpu_reg].b[3] = src.b[5];
+ cpu_state.MM[cpu_reg].b[4] = cpu_state.MM[cpu_reg].b[6];
+ cpu_state.MM[cpu_reg].b[5] = src.b[6];
+ cpu_state.MM[cpu_reg].b[6] = cpu_state.MM[cpu_reg].b[7];
+ cpu_state.MM[cpu_reg].b[7] = src.b[7];
return 0;
}
@@ -154,10 +154,10 @@ static int opPUNPCKLWD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[3] = src.w[1];
- MM[cpu_reg].w[2] = MM[cpu_reg].w[1];
- MM[cpu_reg].w[1] = src.w[0];
- MM[cpu_reg].w[0] = MM[cpu_reg].w[0];
+ cpu_state.MM[cpu_reg].w[3] = src.w[1];
+ cpu_state.MM[cpu_reg].w[2] = cpu_state.MM[cpu_reg].w[1];
+ cpu_state.MM[cpu_reg].w[1] = src.w[0];
+ cpu_state.MM[cpu_reg].w[0] = cpu_state.MM[cpu_reg].w[0];
return 0;
}
@@ -169,10 +169,10 @@ static int opPUNPCKLWD_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[3] = src.w[1];
- MM[cpu_reg].w[2] = MM[cpu_reg].w[1];
- MM[cpu_reg].w[1] = src.w[0];
- MM[cpu_reg].w[0] = MM[cpu_reg].w[0];
+ cpu_state.MM[cpu_reg].w[3] = src.w[1];
+ cpu_state.MM[cpu_reg].w[2] = cpu_state.MM[cpu_reg].w[1];
+ cpu_state.MM[cpu_reg].w[1] = src.w[0];
+ cpu_state.MM[cpu_reg].w[0] = cpu_state.MM[cpu_reg].w[0];
return 0;
}
@@ -185,10 +185,10 @@ static int opPUNPCKHWD_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = MM[cpu_reg].w[2];
- MM[cpu_reg].w[1] = src.w[2];
- MM[cpu_reg].w[2] = MM[cpu_reg].w[3];
- MM[cpu_reg].w[3] = src.w[3];
+ cpu_state.MM[cpu_reg].w[0] = cpu_state.MM[cpu_reg].w[2];
+ cpu_state.MM[cpu_reg].w[1] = src.w[2];
+ cpu_state.MM[cpu_reg].w[2] = cpu_state.MM[cpu_reg].w[3];
+ cpu_state.MM[cpu_reg].w[3] = src.w[3];
return 0;
}
@@ -200,10 +200,10 @@ static int opPUNPCKHWD_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- MM[cpu_reg].w[0] = MM[cpu_reg].w[2];
- MM[cpu_reg].w[1] = src.w[2];
- MM[cpu_reg].w[2] = MM[cpu_reg].w[3];
- MM[cpu_reg].w[3] = src.w[3];
+ cpu_state.MM[cpu_reg].w[0] = cpu_state.MM[cpu_reg].w[2];
+ cpu_state.MM[cpu_reg].w[1] = src.w[2];
+ cpu_state.MM[cpu_reg].w[2] = cpu_state.MM[cpu_reg].w[3];
+ cpu_state.MM[cpu_reg].w[3] = src.w[3];
return 0;
}
@@ -215,16 +215,16 @@ static int opPACKSSWB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].sb[0] = SSATB(dst.sw[0]);
- MM[cpu_reg].sb[1] = SSATB(dst.sw[1]);
- MM[cpu_reg].sb[2] = SSATB(dst.sw[2]);
- MM[cpu_reg].sb[3] = SSATB(dst.sw[3]);
- MM[cpu_reg].sb[4] = SSATB(src.sw[0]);
- MM[cpu_reg].sb[5] = SSATB(src.sw[1]);
- MM[cpu_reg].sb[6] = SSATB(src.sw[2]);
- MM[cpu_reg].sb[7] = SSATB(src.sw[3]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(dst.sw[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(dst.sw[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(dst.sw[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(dst.sw[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(src.sw[0]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(src.sw[1]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(src.sw[2]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(src.sw[3]);
return 0;
}
@@ -235,16 +235,16 @@ static int opPACKSSWB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].sb[0] = SSATB(dst.sw[0]);
- MM[cpu_reg].sb[1] = SSATB(dst.sw[1]);
- MM[cpu_reg].sb[2] = SSATB(dst.sw[2]);
- MM[cpu_reg].sb[3] = SSATB(dst.sw[3]);
- MM[cpu_reg].sb[4] = SSATB(src.sw[0]);
- MM[cpu_reg].sb[5] = SSATB(src.sw[1]);
- MM[cpu_reg].sb[6] = SSATB(src.sw[2]);
- MM[cpu_reg].sb[7] = SSATB(src.sw[3]);
+ cpu_state.MM[cpu_reg].sb[0] = SSATB(dst.sw[0]);
+ cpu_state.MM[cpu_reg].sb[1] = SSATB(dst.sw[1]);
+ cpu_state.MM[cpu_reg].sb[2] = SSATB(dst.sw[2]);
+ cpu_state.MM[cpu_reg].sb[3] = SSATB(dst.sw[3]);
+ cpu_state.MM[cpu_reg].sb[4] = SSATB(src.sw[0]);
+ cpu_state.MM[cpu_reg].sb[5] = SSATB(src.sw[1]);
+ cpu_state.MM[cpu_reg].sb[6] = SSATB(src.sw[2]);
+ cpu_state.MM[cpu_reg].sb[7] = SSATB(src.sw[3]);
return 0;
}
@@ -256,16 +256,16 @@ static int opPACKUSWB_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].b[0] = USATB(dst.sw[0]);
- MM[cpu_reg].b[1] = USATB(dst.sw[1]);
- MM[cpu_reg].b[2] = USATB(dst.sw[2]);
- MM[cpu_reg].b[3] = USATB(dst.sw[3]);
- MM[cpu_reg].b[4] = USATB(src.sw[0]);
- MM[cpu_reg].b[5] = USATB(src.sw[1]);
- MM[cpu_reg].b[6] = USATB(src.sw[2]);
- MM[cpu_reg].b[7] = USATB(src.sw[3]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(dst.sw[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(dst.sw[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(dst.sw[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(dst.sw[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(src.sw[0]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(src.sw[1]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(src.sw[2]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(src.sw[3]);
return 0;
}
@@ -276,16 +276,16 @@ static int opPACKUSWB_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].b[0] = USATB(dst.sw[0]);
- MM[cpu_reg].b[1] = USATB(dst.sw[1]);
- MM[cpu_reg].b[2] = USATB(dst.sw[2]);
- MM[cpu_reg].b[3] = USATB(dst.sw[3]);
- MM[cpu_reg].b[4] = USATB(src.sw[0]);
- MM[cpu_reg].b[5] = USATB(src.sw[1]);
- MM[cpu_reg].b[6] = USATB(src.sw[2]);
- MM[cpu_reg].b[7] = USATB(src.sw[3]);
+ cpu_state.MM[cpu_reg].b[0] = USATB(dst.sw[0]);
+ cpu_state.MM[cpu_reg].b[1] = USATB(dst.sw[1]);
+ cpu_state.MM[cpu_reg].b[2] = USATB(dst.sw[2]);
+ cpu_state.MM[cpu_reg].b[3] = USATB(dst.sw[3]);
+ cpu_state.MM[cpu_reg].b[4] = USATB(src.sw[0]);
+ cpu_state.MM[cpu_reg].b[5] = USATB(src.sw[1]);
+ cpu_state.MM[cpu_reg].b[6] = USATB(src.sw[2]);
+ cpu_state.MM[cpu_reg].b[7] = USATB(src.sw[3]);
return 0;
}
@@ -297,12 +297,12 @@ static int opPACKSSDW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].sw[0] = SSATW(dst.sl[0]);
- MM[cpu_reg].sw[1] = SSATW(dst.sl[1]);
- MM[cpu_reg].sw[2] = SSATW(src.sl[0]);
- MM[cpu_reg].sw[3] = SSATW(src.sl[1]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(dst.sl[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(dst.sl[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(src.sl[0]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(src.sl[1]);
return 0;
}
@@ -313,12 +313,12 @@ static int opPACKSSDW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
MMX_GETSRC();
- dst = MM[cpu_reg];
+ dst = cpu_state.MM[cpu_reg];
- MM[cpu_reg].sw[0] = SSATW(dst.sl[0]);
- MM[cpu_reg].sw[1] = SSATW(dst.sl[1]);
- MM[cpu_reg].sw[2] = SSATW(src.sl[0]);
- MM[cpu_reg].sw[3] = SSATW(src.sl[1]);
+ cpu_state.MM[cpu_reg].sw[0] = SSATW(dst.sl[0]);
+ cpu_state.MM[cpu_reg].sw[1] = SSATW(dst.sl[1]);
+ cpu_state.MM[cpu_reg].sw[2] = SSATW(src.sl[0]);
+ cpu_state.MM[cpu_reg].sw[3] = SSATW(src.sl[1]);
return 0;
}
diff --git a/src/x86_ops_mmx_shift.h b/src/x86_ops_mmx_shift.h
index 5ce94f03b..429347598 100644
--- a/src/x86_ops_mmx_shift.h
+++ b/src/x86_ops_mmx_shift.h
@@ -1,12 +1,12 @@
#define MMX_GETSHIFT() \
if (cpu_mod == 3) \
{ \
- shift = MM[cpu_rm].b[0]; \
+ shift = cpu_state.MM[cpu_rm].b[0]; \
CLOCK_CYCLES(1); \
} \
else \
{ \
- shift = readmemb(easeg, cpu_state.eaaddr); if (abrt) return 0; \
+ shift = readmemb(easeg, cpu_state.eaaddr); if (cpu_state.abrt) return 0; \
CLOCK_CYCLES(2); \
}
@@ -23,32 +23,32 @@ static int opPSxxW_imm(uint32_t fetchdat)
{
case 0x10: /*PSRLW*/
if (shift > 15)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
{
- MM[reg].w[0] >>= shift;
- MM[reg].w[1] >>= shift;
- MM[reg].w[2] >>= shift;
- MM[reg].w[3] >>= shift;
+ cpu_state.MM[reg].w[0] >>= shift;
+ cpu_state.MM[reg].w[1] >>= shift;
+ cpu_state.MM[reg].w[2] >>= shift;
+ cpu_state.MM[reg].w[3] >>= shift;
}
break;
case 0x20: /*PSRAW*/
if (shift > 15)
shift = 15;
- MM[reg].sw[0] >>= shift;
- MM[reg].sw[1] >>= shift;
- MM[reg].sw[2] >>= shift;
- MM[reg].sw[3] >>= shift;
+ cpu_state.MM[reg].sw[0] >>= shift;
+ cpu_state.MM[reg].sw[1] >>= shift;
+ cpu_state.MM[reg].sw[2] >>= shift;
+ cpu_state.MM[reg].sw[3] >>= shift;
break;
case 0x30: /*PSLLW*/
if (shift > 15)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
{
- MM[reg].w[0] <<= shift;
- MM[reg].w[1] <<= shift;
- MM[reg].w[2] <<= shift;
- MM[reg].w[3] <<= shift;
+ cpu_state.MM[reg].w[0] <<= shift;
+ cpu_state.MM[reg].w[1] <<= shift;
+ cpu_state.MM[reg].w[2] <<= shift;
+ cpu_state.MM[reg].w[3] <<= shift;
}
break;
default:
@@ -72,13 +72,13 @@ static int opPSLLW_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 15)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].w[0] <<= shift;
- MM[cpu_reg].w[1] <<= shift;
- MM[cpu_reg].w[2] <<= shift;
- MM[cpu_reg].w[3] <<= shift;
+ cpu_state.MM[cpu_reg].w[0] <<= shift;
+ cpu_state.MM[cpu_reg].w[1] <<= shift;
+ cpu_state.MM[cpu_reg].w[2] <<= shift;
+ cpu_state.MM[cpu_reg].w[3] <<= shift;
}
return 0;
@@ -93,13 +93,13 @@ static int opPSLLW_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 15)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].w[0] <<= shift;
- MM[cpu_reg].w[1] <<= shift;
- MM[cpu_reg].w[2] <<= shift;
- MM[cpu_reg].w[3] <<= shift;
+ cpu_state.MM[cpu_reg].w[0] <<= shift;
+ cpu_state.MM[cpu_reg].w[1] <<= shift;
+ cpu_state.MM[cpu_reg].w[2] <<= shift;
+ cpu_state.MM[cpu_reg].w[3] <<= shift;
}
return 0;
@@ -115,13 +115,13 @@ static int opPSRLW_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 15)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].w[0] >>= shift;
- MM[cpu_reg].w[1] >>= shift;
- MM[cpu_reg].w[2] >>= shift;
- MM[cpu_reg].w[3] >>= shift;
+ cpu_state.MM[cpu_reg].w[0] >>= shift;
+ cpu_state.MM[cpu_reg].w[1] >>= shift;
+ cpu_state.MM[cpu_reg].w[2] >>= shift;
+ cpu_state.MM[cpu_reg].w[3] >>= shift;
}
return 0;
@@ -136,13 +136,13 @@ static int opPSRLW_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 15)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].w[0] >>= shift;
- MM[cpu_reg].w[1] >>= shift;
- MM[cpu_reg].w[2] >>= shift;
- MM[cpu_reg].w[3] >>= shift;
+ cpu_state.MM[cpu_reg].w[0] >>= shift;
+ cpu_state.MM[cpu_reg].w[1] >>= shift;
+ cpu_state.MM[cpu_reg].w[2] >>= shift;
+ cpu_state.MM[cpu_reg].w[3] >>= shift;
}
return 0;
@@ -160,10 +160,10 @@ static int opPSRAW_a16(uint32_t fetchdat)
if (shift > 15)
shift = 15;
- MM[cpu_reg].sw[0] >>= shift;
- MM[cpu_reg].sw[1] >>= shift;
- MM[cpu_reg].sw[2] >>= shift;
- MM[cpu_reg].sw[3] >>= shift;
+ cpu_state.MM[cpu_reg].sw[0] >>= shift;
+ cpu_state.MM[cpu_reg].sw[1] >>= shift;
+ cpu_state.MM[cpu_reg].sw[2] >>= shift;
+ cpu_state.MM[cpu_reg].sw[3] >>= shift;
return 0;
}
@@ -179,10 +179,10 @@ static int opPSRAW_a32(uint32_t fetchdat)
if (shift > 15)
shift = 15;
- MM[cpu_reg].sw[0] >>= shift;
- MM[cpu_reg].sw[1] >>= shift;
- MM[cpu_reg].sw[2] >>= shift;
- MM[cpu_reg].sw[3] >>= shift;
+ cpu_state.MM[cpu_reg].sw[0] >>= shift;
+ cpu_state.MM[cpu_reg].sw[1] >>= shift;
+ cpu_state.MM[cpu_reg].sw[2] >>= shift;
+ cpu_state.MM[cpu_reg].sw[3] >>= shift;
return 0;
}
@@ -200,26 +200,26 @@ static int opPSxxD_imm(uint32_t fetchdat)
{
case 0x10: /*PSRLD*/
if (shift > 31)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
{
- MM[reg].l[0] >>= shift;
- MM[reg].l[1] >>= shift;
+ cpu_state.MM[reg].l[0] >>= shift;
+ cpu_state.MM[reg].l[1] >>= shift;
}
break;
case 0x20: /*PSRAD*/
if (shift > 31)
shift = 31;
- MM[reg].sl[0] >>= shift;
- MM[reg].sl[1] >>= shift;
+ cpu_state.MM[reg].sl[0] >>= shift;
+ cpu_state.MM[reg].sl[1] >>= shift;
break;
case 0x30: /*PSLLD*/
if (shift > 31)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
{
- MM[reg].l[0] <<= shift;
- MM[reg].l[1] <<= shift;
+ cpu_state.MM[reg].l[0] <<= shift;
+ cpu_state.MM[reg].l[1] <<= shift;
}
break;
default:
@@ -243,11 +243,11 @@ static int opPSLLD_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 31)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].l[0] <<= shift;
- MM[cpu_reg].l[1] <<= shift;
+ cpu_state.MM[cpu_reg].l[0] <<= shift;
+ cpu_state.MM[cpu_reg].l[1] <<= shift;
}
return 0;
@@ -262,11 +262,11 @@ static int opPSLLD_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 31)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].l[0] <<= shift;
- MM[cpu_reg].l[1] <<= shift;
+ cpu_state.MM[cpu_reg].l[0] <<= shift;
+ cpu_state.MM[cpu_reg].l[1] <<= shift;
}
return 0;
@@ -282,11 +282,11 @@ static int opPSRLD_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 31)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].l[0] >>= shift;
- MM[cpu_reg].l[1] >>= shift;
+ cpu_state.MM[cpu_reg].l[0] >>= shift;
+ cpu_state.MM[cpu_reg].l[1] >>= shift;
}
return 0;
@@ -301,11 +301,11 @@ static int opPSRLD_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 31)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
{
- MM[cpu_reg].l[0] >>= shift;
- MM[cpu_reg].l[1] >>= shift;
+ cpu_state.MM[cpu_reg].l[0] >>= shift;
+ cpu_state.MM[cpu_reg].l[1] >>= shift;
}
return 0;
@@ -323,8 +323,8 @@ static int opPSRAD_a16(uint32_t fetchdat)
if (shift > 31)
shift = 31;
- MM[cpu_reg].sl[0] >>= shift;
- MM[cpu_reg].sl[1] >>= shift;
+ cpu_state.MM[cpu_reg].sl[0] >>= shift;
+ cpu_state.MM[cpu_reg].sl[1] >>= shift;
return 0;
}
@@ -340,8 +340,8 @@ static int opPSRAD_a32(uint32_t fetchdat)
if (shift > 31)
shift = 31;
- MM[cpu_reg].sl[0] >>= shift;
- MM[cpu_reg].sl[1] >>= shift;
+ cpu_state.MM[cpu_reg].sl[0] >>= shift;
+ cpu_state.MM[cpu_reg].sl[1] >>= shift;
return 0;
}
@@ -359,20 +359,20 @@ static int opPSxxQ_imm(uint32_t fetchdat)
{
case 0x10: /*PSRLW*/
if (shift > 63)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
- MM[reg].q >>= shift;
+ cpu_state.MM[reg].q >>= shift;
break;
case 0x20: /*PSRAW*/
if (shift > 63)
shift = 63;
- MM[reg].sq >>= shift;
+ cpu_state.MM[reg].sq >>= shift;
break;
case 0x30: /*PSLLW*/
if (shift > 63)
- MM[reg].q = 0;
+ cpu_state.MM[reg].q = 0;
else
- MM[reg].q <<= shift;
+ cpu_state.MM[reg].q <<= shift;
break;
default:
pclog("Bad PSxxQ (0F 73) instruction %02X\n", op);
@@ -395,9 +395,9 @@ static int opPSLLQ_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 63)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
- MM[cpu_reg].q <<= shift;
+ cpu_state.MM[cpu_reg].q <<= shift;
return 0;
}
@@ -411,9 +411,9 @@ static int opPSLLQ_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 63)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
- MM[cpu_reg].q <<= shift;
+ cpu_state.MM[cpu_reg].q <<= shift;
return 0;
}
@@ -428,9 +428,9 @@ static int opPSRLQ_a16(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 63)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
- MM[cpu_reg].q >>= shift;
+ cpu_state.MM[cpu_reg].q >>= shift;
return 0;
}
@@ -444,9 +444,9 @@ static int opPSRLQ_a32(uint32_t fetchdat)
MMX_GETSHIFT();
if (shift > 63)
- MM[cpu_reg].q = 0;
+ cpu_state.MM[cpu_reg].q = 0;
else
- MM[cpu_reg].q >>= shift;
+ cpu_state.MM[cpu_reg].q >>= shift;
return 0;
}
diff --git a/src/x86_ops_mov.h b/src/x86_ops_mov.h
index 71f33d2c8..2884a3944 100644
--- a/src/x86_ops_mov.h
+++ b/src/x86_ops_mov.h
@@ -98,56 +98,56 @@ static int opMOV_SP_imm(uint32_t fetchdat)
static int opMOV_EAX_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
EAX = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_EBX_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
EBX = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_ECX_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
ECX = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_EDX_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
EDX = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_ESI_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
ESI = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_EDI_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
EDI = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_EBP_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
EBP = templ;
CLOCK_CYCLES(timing_rr);
return 0;
}
static int opMOV_ESP_imm(uint32_t fetchdat)
{
- uint32_t templ = getlong(); if (abrt) return 1;
+ uint32_t templ = getlong(); if (cpu_state.abrt) return 1;
ESP = templ;
CLOCK_CYCLES(timing_rr);
return 0;
@@ -157,64 +157,64 @@ static int opMOV_b_imm_a16(uint32_t fetchdat)
{
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = readmemb(cs,cpu_state.pc); cpu_state.pc++; if (abrt) return 1;
+ temp = readmemb(cs,cpu_state.pc); cpu_state.pc++; if (cpu_state.abrt) return 1;
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr);
seteab(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_b_imm_a32(uint32_t fetchdat)
{
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = getbyte(); if (abrt) return 1;
+ temp = getbyte(); if (cpu_state.abrt) return 1;
seteab(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_w_imm_a16(uint32_t fetchdat)
{
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = getword(); if (abrt) return 1;
+ temp = getword(); if (cpu_state.abrt) return 1;
seteaw(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_w_imm_a32(uint32_t fetchdat)
{
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = getword(); if (abrt) return 1;
+ temp = getword(); if (cpu_state.abrt) return 1;
seteaw(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_imm_a16(uint32_t fetchdat)
{
uint32_t temp;
fetch_ea_16(fetchdat);
- temp = getlong(); if (abrt) return 1;
+ temp = getlong(); if (cpu_state.abrt) return 1;
seteal(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_imm_a32(uint32_t fetchdat)
{
uint32_t temp;
fetch_ea_32(fetchdat);
- temp = getlong(); if (abrt) return 1;
+ temp = getlong(); if (cpu_state.abrt) return 1;
seteal(temp);
CLOCK_CYCLES(timing_rr);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_AL_a16(uint32_t fetchdat)
{
uint16_t addr = getwordf();
- uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AL = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -222,7 +222,7 @@ static int opMOV_AL_a16(uint32_t fetchdat)
static int opMOV_AL_a32(uint32_t fetchdat)
{
uint32_t addr = getlong();
- uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AL = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -230,7 +230,7 @@ static int opMOV_AL_a32(uint32_t fetchdat)
static int opMOV_AX_a16(uint32_t fetchdat)
{
uint16_t addr = getwordf();
- uint16_t temp = readmemw(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AX = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -238,7 +238,7 @@ static int opMOV_AX_a16(uint32_t fetchdat)
static int opMOV_AX_a32(uint32_t fetchdat)
{
uint32_t addr = getlong();
- uint16_t temp = readmemw(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AX = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -246,7 +246,7 @@ static int opMOV_AX_a32(uint32_t fetchdat)
static int opMOV_EAX_a16(uint32_t fetchdat)
{
uint16_t addr = getwordf();
- uint32_t temp = readmeml(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
EAX = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -254,7 +254,7 @@ static int opMOV_EAX_a16(uint32_t fetchdat)
static int opMOV_EAX_a32(uint32_t fetchdat)
{
uint32_t addr = getlong();
- uint32_t temp = readmeml(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
EAX = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
return 0;
@@ -265,42 +265,42 @@ static int opMOV_a16_AL(uint32_t fetchdat)
uint16_t addr = getwordf();
writememb(cpu_state.ea_seg->base, addr, AL);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_a32_AL(uint32_t fetchdat)
{
uint32_t addr = getlong();
writememb(cpu_state.ea_seg->base, addr, AL);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_a16_AX(uint32_t fetchdat)
{
uint16_t addr = getwordf();
writememw(cpu_state.ea_seg->base, addr, AX);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_a32_AX(uint32_t fetchdat)
{
- uint32_t addr = getlong(); if (abrt) return 1;
+ uint32_t addr = getlong(); if (cpu_state.abrt) return 1;
writememw(cpu_state.ea_seg->base, addr, AX);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_a16_EAX(uint32_t fetchdat)
{
uint16_t addr = getwordf();
writememl(cpu_state.ea_seg->base, addr, EAX);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_a32_EAX(uint32_t fetchdat)
{
- uint32_t addr = getlong(); if (abrt) return 1;
+ uint32_t addr = getlong(); if (cpu_state.abrt) return 1;
writememl(cpu_state.ea_seg->base, addr, EAX);
CLOCK_CYCLES((is486) ? 1 : 2);
- return abrt;
+ return cpu_state.abrt;
}
@@ -343,7 +343,7 @@ static int opLEA_l_a32(uint32_t fetchdat)
static int opXLAT_a16(uint32_t fetchdat)
{
uint32_t addr = (BX + AL)&0xFFFF;
- uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AL = temp;
CLOCK_CYCLES(5);
return 0;
@@ -351,7 +351,7 @@ static int opXLAT_a16(uint32_t fetchdat)
static int opXLAT_a32(uint32_t fetchdat)
{
uint32_t addr = EBX + AL;
- uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, addr); if (cpu_state.abrt) return 1;
AL = temp;
CLOCK_CYCLES(5);
return 0;
@@ -371,7 +371,7 @@ static int opMOV_b_r_a16(uint32_t fetchdat)
seteab(getr8(cpu_reg));
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_b_r_a32(uint32_t fetchdat)
{
@@ -387,7 +387,7 @@ static int opMOV_b_r_a32(uint32_t fetchdat)
seteab(getr8(cpu_reg));
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_w_r_a16(uint32_t fetchdat)
{
@@ -403,7 +403,7 @@ static int opMOV_w_r_a16(uint32_t fetchdat)
seteaw(cpu_state.regs[cpu_reg].w);
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_w_r_a32(uint32_t fetchdat)
{
@@ -419,7 +419,7 @@ static int opMOV_w_r_a32(uint32_t fetchdat)
seteaw(cpu_state.regs[cpu_reg].w);
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_r_a16(uint32_t fetchdat)
{
@@ -435,7 +435,7 @@ static int opMOV_l_r_a16(uint32_t fetchdat)
seteal(cpu_state.regs[cpu_reg].l);
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_r_a32(uint32_t fetchdat)
{
@@ -451,7 +451,7 @@ static int opMOV_l_r_a32(uint32_t fetchdat)
seteal(cpu_state.regs[cpu_reg].l);
CLOCK_CYCLES(is486 ? 1 : 2);
}
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_r_b_a16(uint32_t fetchdat)
@@ -466,7 +466,7 @@ static int opMOV_r_b_a16(uint32_t fetchdat)
{
uint8_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
setr8(cpu_reg, temp);
CLOCK_CYCLES(is486 ? 1 : 4);
}
@@ -484,7 +484,7 @@ static int opMOV_r_b_a32(uint32_t fetchdat)
{
uint8_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
setr8(cpu_reg, temp);
CLOCK_CYCLES(is486 ? 1 : 4);
}
@@ -502,7 +502,7 @@ static int opMOV_r_w_a16(uint32_t fetchdat)
{
uint16_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+1);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
}
@@ -520,7 +520,7 @@ static int opMOV_r_w_a32(uint32_t fetchdat)
{
uint16_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+1);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((is486) ? 1 : 4);
}
@@ -538,7 +538,7 @@ static int opMOV_r_l_a16(uint32_t fetchdat)
{
uint32_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+3);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES(is486 ? 1 : 4);
}
@@ -556,7 +556,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
{
uint32_t temp;
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+3);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES(is486 ? 1 : 4);
}
@@ -575,7 +575,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
{ \
uint16_t temp; \
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+1); \
- temp = geteaw(); if (abrt) return 1; \
+ temp = geteaw(); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].w = temp; \
} \
} \
@@ -593,7 +593,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
{ \
uint16_t temp; \
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+1); \
- temp = geteaw(); if (abrt) return 1; \
+ temp = geteaw(); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].w = temp; \
} \
} \
@@ -611,7 +611,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
{ \
uint32_t temp; \
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+3); \
- temp = geteal(); if (abrt) return 1; \
+ temp = geteal(); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].l = temp; \
} \
} \
@@ -629,7 +629,7 @@ static int opMOV_r_l_a32(uint32_t fetchdat)
{ \
uint32_t temp; \
CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr+3); \
- temp = geteal(); if (abrt) return 1; \
+ temp = geteal(); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].l = temp; \
} \
} \
diff --git a/src/x86_ops_mov_seg.h b/src/x86_ops_mov_seg.h
index e06509a7c..700a69da7 100644
--- a/src/x86_ops_mov_seg.h
+++ b/src/x86_ops_mov_seg.h
@@ -25,7 +25,7 @@ static int opMOV_w_seg_a16(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 3);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_w_seg_a32(uint32_t fetchdat)
{
@@ -54,7 +54,7 @@ static int opMOV_w_seg_a32(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 3);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_seg_a16(uint32_t fetchdat)
@@ -90,7 +90,7 @@ static int opMOV_l_seg_a16(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 3);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_l_seg_a32(uint32_t fetchdat)
{
@@ -125,7 +125,7 @@ static int opMOV_l_seg_a32(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 3);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_seg_w_a16(uint32_t fetchdat)
@@ -134,7 +134,7 @@ static int opMOV_seg_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
- new_seg=geteaw(); if (abrt) return 1;
+ new_seg=geteaw(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
@@ -146,14 +146,14 @@ static int opMOV_seg_w_a16(uint32_t fetchdat)
break;
case 0x10: /*SS*/
loadseg(new_seg, &_ss);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.oldpc = cpu_state.pc;
cpu_state.op32 = use32;
cpu_state.ssegs = 0;
cpu_state.ea_seg = &_ds;
fetchdat = fastreadl(cs + cpu_state.pc);
cpu_state.pc++;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
x86_opcodes[(fetchdat & 0xff) | cpu_state.op32](fetchdat >> 8);
return 1;
case 0x20: /*FS*/
@@ -165,7 +165,7 @@ static int opMOV_seg_w_a16(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
- return abrt;
+ return cpu_state.abrt;
}
static int opMOV_seg_w_a32(uint32_t fetchdat)
{
@@ -173,7 +173,7 @@ static int opMOV_seg_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
- new_seg=geteaw(); if (abrt) return 1;
+ new_seg=geteaw(); if (cpu_state.abrt) return 1;
switch (rmdat & 0x38)
{
@@ -185,14 +185,14 @@ static int opMOV_seg_w_a32(uint32_t fetchdat)
break;
case 0x10: /*SS*/
loadseg(new_seg, &_ss);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.oldpc = cpu_state.pc;
cpu_state.op32 = use32;
cpu_state.ssegs = 0;
cpu_state.ea_seg = &_ds;
fetchdat = fastreadl(cs + cpu_state.pc);
cpu_state.pc++;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
x86_opcodes[(fetchdat & 0xff) | cpu_state.op32](fetchdat >> 8);
return 1;
case 0x20: /*FS*/
@@ -204,7 +204,7 @@ static int opMOV_seg_w_a32(uint32_t fetchdat)
}
CLOCK_CYCLES((cpu_mod == 3) ? 2 : 5);
- return abrt;
+ return cpu_state.abrt;
}
@@ -215,8 +215,8 @@ static int opLDS_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
- loadseg(seg, &_ds); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ds); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = addr;
CLOCK_CYCLES(7);
@@ -229,8 +229,8 @@ static int opLDS_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
- loadseg(seg, &_ds); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ds); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = addr;
CLOCK_CYCLES(7);
@@ -244,8 +244,8 @@ static int opLDS_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
- loadseg(seg, &_ds); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ds); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = addr;
CLOCK_CYCLES(7);
@@ -259,8 +259,8 @@ static int opLDS_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
- loadseg(seg, &_ds); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ds); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = addr;
CLOCK_CYCLES(7);
@@ -274,8 +274,8 @@ static int opLSS_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
- loadseg(seg, &_ss); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ss); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = addr;
CLOCK_CYCLES(7);
@@ -288,8 +288,8 @@ static int opLSS_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1;
- loadseg(seg, &_ss); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ss); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = addr;
CLOCK_CYCLES(7);
@@ -303,8 +303,8 @@ static int opLSS_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
- loadseg(seg, &_ss); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ss); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = addr;
CLOCK_CYCLES(7);
@@ -318,8 +318,8 @@ static int opLSS_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1;
- loadseg(seg, &_ss); if (abrt) return 1;
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
+ loadseg(seg, &_ss); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = addr;
CLOCK_CYCLES(7);
@@ -334,8 +334,8 @@ static int opLSS_l_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat); \
ILLEGAL_ON(cpu_mod == 3); \
addr = readmemw(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1; \
- loadseg(seg, &sel); if (abrt) return 1; \
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; \
+ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].w = addr; \
\
CLOCK_CYCLES(7); \
@@ -349,8 +349,8 @@ static int opLSS_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat); \
ILLEGAL_ON(cpu_mod == 3); \
addr = readmemw(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 2); if (abrt) return 1; \
- loadseg(seg, &sel); if (abrt) return 1; \
+ seg = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; \
+ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].w = addr; \
\
CLOCK_CYCLES(7); \
@@ -365,8 +365,8 @@ static int opLSS_l_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat); \
ILLEGAL_ON(cpu_mod == 3); \
addr = readmeml(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1; \
- loadseg(seg, &sel); if (abrt) return 1; \
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; \
+ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].l = addr; \
\
CLOCK_CYCLES(7); \
@@ -381,8 +381,8 @@ static int opLSS_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat); \
ILLEGAL_ON(cpu_mod == 3); \
addr = readmeml(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 4); if (abrt) return 1; \
- loadseg(seg, &sel); if (abrt) return 1; \
+ seg = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; \
+ loadseg(seg, &sel); if (cpu_state.abrt) return 1; \
cpu_state.regs[cpu_reg].l = addr; \
\
CLOCK_CYCLES(7); \
diff --git a/src/x86_ops_movx.h b/src/x86_ops_movx.h
index 30c743c4f..9badebc91 100644
--- a/src/x86_ops_movx.h
+++ b/src/x86_ops_movx.h
@@ -1,12 +1,9 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opMOVZX_w_b_a16(uint32_t fetchdat)
{
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = (uint16_t)temp;
CLOCK_CYCLES(3);
@@ -17,7 +14,7 @@ static int opMOVZX_w_b_a32(uint32_t fetchdat)
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = (uint16_t)temp;
CLOCK_CYCLES(3);
@@ -28,7 +25,7 @@ static int opMOVZX_l_b_a16(uint32_t fetchdat)
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
CLOCK_CYCLES(3);
@@ -39,7 +36,7 @@ static int opMOVZX_l_b_a32(uint32_t fetchdat)
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
CLOCK_CYCLES(3);
@@ -50,7 +47,7 @@ static int opMOVZX_w_w_a16(uint32_t fetchdat)
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES(3);
@@ -61,7 +58,7 @@ static int opMOVZX_w_w_a32(uint32_t fetchdat)
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES(3);
@@ -72,7 +69,7 @@ static int opMOVZX_l_w_a16(uint32_t fetchdat)
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
CLOCK_CYCLES(3);
@@ -83,7 +80,7 @@ static int opMOVZX_l_w_a32(uint32_t fetchdat)
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
CLOCK_CYCLES(3);
@@ -95,7 +92,7 @@ static int opMOVSX_w_b_a16(uint32_t fetchdat)
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = (uint16_t)temp;
if (temp & 0x80)
cpu_state.regs[cpu_reg].w |= 0xff00;
@@ -108,7 +105,7 @@ static int opMOVSX_w_b_a32(uint32_t fetchdat)
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = (uint16_t)temp;
if (temp & 0x80)
cpu_state.regs[cpu_reg].w |= 0xff00;
@@ -121,7 +118,7 @@ static int opMOVSX_l_b_a16(uint32_t fetchdat)
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
if (temp & 0x80)
cpu_state.regs[cpu_reg].l |= 0xffffff00;
@@ -134,7 +131,7 @@ static int opMOVSX_l_b_a32(uint32_t fetchdat)
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
if (temp & 0x80)
cpu_state.regs[cpu_reg].l |= 0xffffff00;
@@ -147,7 +144,7 @@ static int opMOVSX_l_w_a16(uint32_t fetchdat)
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
if (temp & 0x8000)
cpu_state.regs[cpu_reg].l |= 0xffff0000;
@@ -160,7 +157,7 @@ static int opMOVSX_l_w_a32(uint32_t fetchdat)
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = (uint32_t)temp;
if (temp & 0x8000)
cpu_state.regs[cpu_reg].l |= 0xffff0000;
diff --git a/src/x86_ops_mul.h b/src/x86_ops_mul.h
index 9b2c3a605..37003bbd4 100644
--- a/src/x86_ops_mul.h
+++ b/src/x86_ops_mul.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opIMUL_w_iw_a16(uint32_t fetchdat)
{
int32_t templ;
@@ -8,8 +5,8 @@ static int opIMUL_w_iw_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
- tempw = geteaw(); if (abrt) return 1;
- tempw2 = getword(); if (abrt) return 1;
+ tempw = geteaw(); if (cpu_state.abrt) return 1;
+ tempw2 = getword(); if (cpu_state.abrt) return 1;
templ = ((int)tempw) * ((int)tempw2);
flags_rebuild();
@@ -27,8 +24,8 @@ static int opIMUL_w_iw_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
- tempw = geteaw(); if (abrt) return 1;
- tempw2 = getword(); if (abrt) return 1;
+ tempw = geteaw(); if (cpu_state.abrt) return 1;
+ tempw2 = getword(); if (cpu_state.abrt) return 1;
templ = ((int)tempw) * ((int)tempw2);
flags_rebuild();
@@ -47,8 +44,8 @@ static int opIMUL_l_il_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
- templ = geteal(); if (abrt) return 1;
- templ2 = getlong(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
+ templ2 = getlong(); if (cpu_state.abrt) return 1;
temp64 = ((int64_t)templ) * ((int64_t)templ2);
flags_rebuild();
@@ -66,8 +63,8 @@ static int opIMUL_l_il_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
- templ = geteal(); if (abrt) return 1;
- templ2 = getlong(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
+ templ2 = getlong(); if (cpu_state.abrt) return 1;
temp64 = ((int64_t)templ) * ((int64_t)templ2);
flags_rebuild();
@@ -86,8 +83,8 @@ static int opIMUL_w_ib_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
- tempw = geteaw(); if (abrt) return 1;
- tempw2 = getbyte(); if (abrt) return 1;
+ tempw = geteaw(); if (cpu_state.abrt) return 1;
+ tempw2 = getbyte(); if (cpu_state.abrt) return 1;
if (tempw2 & 0x80) tempw2 |= 0xff00;
templ = ((int)tempw) * ((int)tempw2);
@@ -106,8 +103,8 @@ static int opIMUL_w_ib_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
- tempw = geteaw(); if (abrt) return 1;
- tempw2 = getbyte(); if (abrt) return 1;
+ tempw = geteaw(); if (cpu_state.abrt) return 1;
+ tempw2 = getbyte(); if (cpu_state.abrt) return 1;
if (tempw2 & 0x80) tempw2 |= 0xff00;
templ = ((int)tempw) * ((int)tempw2);
@@ -126,8 +123,8 @@ static int opIMUL_l_ib_a16(uint32_t fetchdat)
int32_t templ, templ2;
fetch_ea_16(fetchdat);
- templ = geteal(); if (abrt) return 1;
- templ2 = getbyte(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
+ templ2 = getbyte(); if (cpu_state.abrt) return 1;
if (templ2 & 0x80) templ2 |= 0xffffff00;
temp64 = ((int64_t)templ)*((int64_t)templ2);
@@ -145,8 +142,8 @@ static int opIMUL_l_ib_a32(uint32_t fetchdat)
int32_t templ, templ2;
fetch_ea_32(fetchdat);
- templ = geteal(); if (abrt) return 1;
- templ2 = getbyte(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
+ templ2 = getbyte(); if (cpu_state.abrt) return 1;
if (templ2 & 0x80) templ2 |= 0xffffff00;
temp64 = ((int64_t)templ)*((int64_t)templ2);
@@ -167,7 +164,7 @@ static int opIMUL_w_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
templ = (int32_t)(int16_t)cpu_state.regs[cpu_reg].w * (int32_t)(int16_t)geteaw();
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = templ & 0xFFFF;
flags_rebuild();
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
@@ -182,7 +179,7 @@ static int opIMUL_w_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
templ = (int32_t)(int16_t)cpu_state.regs[cpu_reg].w * (int32_t)(int16_t)geteaw();
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = templ & 0xFFFF;
flags_rebuild();
if ((templ >> 15) != 0 && (templ >> 15) != -1) flags |= C_FLAG | V_FLAG;
@@ -198,7 +195,7 @@ static int opIMUL_l_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
temp64 = (int64_t)(int32_t)cpu_state.regs[cpu_reg].l * (int64_t)(int32_t)geteal();
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp64 & 0xFFFFFFFF;
flags_rebuild();
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
@@ -213,7 +210,7 @@ static int opIMUL_l_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
temp64 = (int64_t)(int32_t)cpu_state.regs[cpu_reg].l * (int64_t)(int32_t)geteal();
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp64 & 0xFFFFFFFF;
flags_rebuild();
if ((temp64 >> 31) != 0 && (temp64 >> 31) != -1) flags |= C_FLAG | V_FLAG;
diff --git a/src/x86_ops_pmode.h b/src/x86_ops_pmode.h
index 65a56fb7d..9b4aa029c 100644
--- a/src/x86_ops_pmode.h
+++ b/src/x86_ops_pmode.h
@@ -5,13 +5,13 @@ static int opARPL_a16(uint32_t fetchdat)
NOTRM
fetch_ea_16(fetchdat);
pclog("ARPL_a16\n");
- temp_seg = geteaw(); if (abrt) return 1;
+ temp_seg = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
if ((temp_seg & 3) < (cpu_state.regs[cpu_reg].w & 3))
{
temp_seg = (temp_seg & 0xfffc) | (cpu_state.regs[cpu_reg].w & 3);
- seteaw(temp_seg); if (abrt) return 1;
+ seteaw(temp_seg); if (cpu_state.abrt) return 1;
flags |= Z_FLAG;
}
else
@@ -27,13 +27,13 @@ static int opARPL_a32(uint32_t fetchdat)
NOTRM
fetch_ea_32(fetchdat);
pclog("ARPL_a32\n");
- temp_seg = geteaw(); if (abrt) return 1;
+ temp_seg = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
if ((temp_seg & 3) < (cpu_state.regs[cpu_reg].w & 3))
{
temp_seg = (temp_seg & 0xfffc) | (cpu_state.regs[cpu_reg].w & 3);
- seteaw(temp_seg); if (abrt) return 1;
+ seteaw(temp_seg); if (cpu_state.abrt) return 1;
flags |= Z_FLAG;
}
else
@@ -52,7 +52,7 @@ static int opARPL_a32(uint32_t fetchdat)
NOTRM \
fetch_ea(fetchdat); \
\
- sel = geteaw(); if (abrt) return 1; \
+ sel = geteaw(); if (cpu_state.abrt) return 1; \
\
flags_rebuild(); \
if (!(sel & 0xfffc)) { flags &= ~Z_FLAG; return 0; } /*Null selector*/ \
@@ -61,7 +61,7 @@ static int opARPL_a32(uint32_t fetchdat)
{ \
cpl_override = 1; \
desc = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4); \
- cpl_override = 0; if (abrt) return 1; \
+ cpl_override = 0; if (cpu_state.abrt) return 1; \
} \
flags &= ~Z_FLAG; \
if ((desc & 0x1f00) == 0x000) valid = 0; \
@@ -84,7 +84,7 @@ static int opARPL_a32(uint32_t fetchdat)
cpl_override = 0; \
} \
CLOCK_CYCLES(11); \
- return abrt; \
+ return cpu_state.abrt; \
}
opLAR(w_a16, fetch_ea_16, 0)
@@ -101,7 +101,7 @@ opLAR(l_a32, fetch_ea_32, 1)
NOTRM \
fetch_ea(fetchdat); \
\
- sel = geteaw(); if (abrt) return 1; \
+ sel = geteaw(); if (cpu_state.abrt) return 1; \
flags_rebuild(); \
flags &= ~Z_FLAG; \
if (!(sel & 0xfffc)) return 0; /*Null selector*/ \
@@ -110,7 +110,7 @@ opLAR(l_a32, fetch_ea_32, 1)
{ \
cpl_override = 1; \
desc = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4); \
- cpl_override = 0; if (abrt) return 1; \
+ cpl_override = 0; if (cpu_state.abrt) return 1; \
} \
if ((desc & 0x1400) == 0x400) valid = 0; /*Interrupt or trap or call gate*/ \
if ((desc & 0x1f00) == 0x000) valid = 0; /*Invalid*/ \
@@ -139,7 +139,7 @@ opLAR(l_a32, fetch_ea_32, 1)
cpl_override = 0; \
} \
CLOCK_CYCLES(10); \
- return abrt; \
+ return cpu_state.abrt; \
}
opLSL(w_a16, fetch_ea_16, 0)
@@ -173,13 +173,13 @@ static int op0F00_common(uint32_t fetchdat)
x86gpf(NULL,0);
return 1;
}
- sel = geteaw(); if (abrt) return 1;
+ sel = geteaw(); if (cpu_state.abrt) return 1;
addr = (sel & ~7) + gdt.base;
limit = readmemw(0, addr) + ((readmemb(0, addr + 6) & 0xf) << 16);
base = (readmemw(0, addr + 2)) | (readmemb(0, addr + 4) << 16) | (readmemb(0, addr + 7) << 24);
access = readmemb(0, addr + 5);
granularity = readmemb(0, addr + 6) & 0x80;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
ldt.limit = limit;
ldt.access = access;
if (granularity)
@@ -198,13 +198,13 @@ static int op0F00_common(uint32_t fetchdat)
x86gpf(NULL,0);
break;
}
- sel = geteaw(); if (abrt) return 1;
+ sel = geteaw(); if (cpu_state.abrt) return 1;
addr = (sel & ~7) + gdt.base;
limit = readmemw(0, addr) + ((readmemb(0, addr + 6) & 0xf) << 16);
base = (readmemw(0, addr + 2)) | (readmemb(0, addr + 4) << 16) | (readmemb(0, addr + 7) << 24);
access = readmemb(0, addr + 5);
granularity = readmemb(0, addr + 6) & 0x80;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
tr.seg = sel;
tr.limit = limit;
tr.access = access;
@@ -217,14 +217,14 @@ static int op0F00_common(uint32_t fetchdat)
CLOCK_CYCLES(20);
break;
case 0x20: /*VERR*/
- sel = geteaw(); if (abrt) return 1;
+ sel = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
flags &= ~Z_FLAG;
if (!(sel & 0xfffc)) return 0; /*Null selector*/
cpl_override = 1;
valid = (sel & ~7) < ((sel & 4) ? ldt.limit : gdt.limit);
desc = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4);
- cpl_override = 0; if (abrt) return 1;
+ cpl_override = 0; if (cpu_state.abrt) return 1;
if (!(desc & 0x1000)) valid = 0;
if ((desc & 0xC00) != 0xC00) /*Exclude conforming code segments*/
{
@@ -236,14 +236,14 @@ static int op0F00_common(uint32_t fetchdat)
CLOCK_CYCLES(20);
break;
case 0x28: /*VERW*/
- sel = geteaw(); if (abrt) return 1;
+ sel = geteaw(); if (cpu_state.abrt) return 1;
flags_rebuild();
flags &= ~Z_FLAG;
if (!(sel & 0xfffc)) return 0; /*Null selector*/
cpl_override = 1;
valid = (sel & ~7) < ((sel & 4) ? ldt.limit : gdt.limit);
desc = readmemw(0, ((sel & 4) ? ldt.base : gdt.base) + (sel & ~7) + 4);
- cpl_override = 0; if (abrt) return 1;
+ cpl_override = 0; if (cpu_state.abrt) return 1;
if (!(desc & 0x1000)) valid = 0;
dpl = (desc >> 13) & 3; /*Check permissions*/
if (dpl < CPL || dpl < (sel & 3)) valid = 0;
@@ -259,7 +259,7 @@ static int op0F00_common(uint32_t fetchdat)
x86illegal();
break;
}
- return abrt;
+ return cpu_state.abrt;
}
static int op0F00_a16(uint32_t fetchdat)
@@ -311,7 +311,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
}
// pclog("LGDT %08X:%08X\n", easeg, eaaddr);
limit = geteaw();
- base = readmeml(0, easeg + cpu_state.eaaddr + 2); if (abrt) return 1;
+ base = readmeml(0, easeg + cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
// pclog(" %08X %04X\n", base, limit);
gdt.limit = limit;
gdt.base = base;
@@ -327,7 +327,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
}
// pclog("LIDT %08X:%08X\n", easeg, eaaddr);
limit = geteaw();
- base = readmeml(0, easeg + cpu_state.eaaddr + 2); if (abrt) return 1;
+ base = readmeml(0, easeg + cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
// pclog(" %08X %04X\n", base, limit);
idt.limit = limit;
idt.base = base;
@@ -347,7 +347,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
x86gpf(NULL, 0);
break;
}
- tempw = geteaw(); if (abrt) return 1;
+ tempw = geteaw(); if (cpu_state.abrt) return 1;
if (msw & 1) tempw |= 1;
msw = tempw;
break;
@@ -372,7 +372,7 @@ static int op0F01_common(uint32_t fetchdat, int is32, int is286)
x86illegal();
break;
}
- return abrt;
+ return cpu_state.abrt;
}
static int op0F01_w_a16(uint32_t fetchdat)
diff --git a/src/x86_ops_prefix.h b/src/x86_ops_prefix.h
index 72142e241..3777894b7 100644
--- a/src/x86_ops_prefix.h
+++ b/src/x86_ops_prefix.h
@@ -2,7 +2,7 @@
static int op ## name ## _w_a16(uint32_t fetchdat) \
{ \
fetchdat = fastreadl(cs + cpu_state.pc); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
cpu_state.pc++; \
\
cpu_state.ea_seg = &seg; \
@@ -15,7 +15,7 @@ static int op ## name ## _w_a16(uint32_t fetchdat) \
static int op ## name ## _l_a16(uint32_t fetchdat) \
{ \
fetchdat = fastreadl(cs + cpu_state.pc); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
cpu_state.pc++; \
\
cpu_state.ea_seg = &seg; \
@@ -28,7 +28,7 @@ static int op ## name ## _l_a16(uint32_t fetchdat) \
static int op ## name ## _w_a32(uint32_t fetchdat) \
{ \
fetchdat = fastreadl(cs + cpu_state.pc); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
cpu_state.pc++; \
\
cpu_state.ea_seg = &seg; \
@@ -41,7 +41,7 @@ static int op ## name ## _w_a32(uint32_t fetchdat) \
static int op ## name ## _l_a32(uint32_t fetchdat) \
{ \
fetchdat = fastreadl(cs + cpu_state.pc); \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
cpu_state.pc++; \
\
cpu_state.ea_seg = &seg; \
@@ -61,7 +61,7 @@ op_seg(SS, _ss)
static int op_66(uint32_t fetchdat) /*Data size select*/
{
fetchdat = fastreadl(cs + cpu_state.pc);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.pc++;
cpu_state.op32 = ((use32 & 0x100) ^ 0x100) | (cpu_state.op32 & 0x200);
@@ -71,7 +71,7 @@ static int op_66(uint32_t fetchdat) /*Data size select*/
static int op_67(uint32_t fetchdat) /*Address size select*/
{
fetchdat = fastreadl(cs + cpu_state.pc);
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
cpu_state.pc++;
cpu_state.op32 = ((use32 & 0x200) ^ 0x200) | (cpu_state.op32 & 0x100);
diff --git a/src/x86_ops_ret.h b/src/x86_ops_ret.h
index eaebea37f..7775ce6fd 100644
--- a/src/x86_ops_ret.h
+++ b/src/x86_ops_ret.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define RETF_a16(stack_offset) \
if ((msw&1) && !(eflags&VM_FLAG)) \
{ \
@@ -18,7 +15,7 @@
cpu_state.pc = readmemw(ss, SP); \
loadcs(readmemw(ss, SP + 2)); \
} \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
if (stack32) ESP += 4 + stack_offset; \
else SP += 4 + stack_offset; \
cycles -= timing_retf_rm;
@@ -40,7 +37,7 @@
cpu_state.pc = readmeml(ss, SP); \
loadcs(readmeml(ss, SP + 4) & 0xffff); \
} \
- if (abrt) return 1; \
+ if (cpu_state.abrt) return 1; \
if (stack32) ESP += 8 + stack_offset; \
else SP += 8 + stack_offset; \
cycles -= timing_retf_rm;
@@ -110,7 +107,7 @@ static int opIRET_286(uint32_t fetchdat)
flags_extract();
nmi_enable = 1;
CPU_BLOCK_END();
- return abrt;
+ return cpu_state.abrt;
}
static int opIRET(uint32_t fetchdat)
@@ -150,7 +147,7 @@ static int opIRET(uint32_t fetchdat)
flags_extract();
nmi_enable = 1;
CPU_BLOCK_END();
- return abrt;
+ return cpu_state.abrt;
}
static int opIRETD(uint32_t fetchdat)
@@ -192,6 +189,6 @@ static int opIRETD(uint32_t fetchdat)
flags_extract();
nmi_enable = 1;
CPU_BLOCK_END();
- return abrt;
+ return cpu_state.abrt;
}
diff --git a/src/x86_ops_set.h b/src/x86_ops_set.h
index 737257af7..0094b85d4 100644
--- a/src/x86_ops_set.h
+++ b/src/x86_ops_set.h
@@ -1,13 +1,10 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define opSET(condition) \
static int opSET ## condition ## _a16(uint32_t fetchdat) \
{ \
fetch_ea_16(fetchdat); \
seteab((cond_ ## condition) ? 1 : 0); \
CLOCK_CYCLES(4); \
- return abrt; \
+ return cpu_state.abrt; \
} \
\
static int opSET ## condition ## _a32(uint32_t fetchdat) \
@@ -15,7 +12,7 @@
fetch_ea_32(fetchdat); \
seteab((cond_ ## condition) ? 1 : 0); \
CLOCK_CYCLES(4); \
- return abrt; \
+ return cpu_state.abrt; \
}
opSET(O)
diff --git a/src/x86_ops_shift.h b/src/x86_ops_shift.h
index 22df47281..25babcf36 100644
--- a/src/x86_ops_shift.h
+++ b/src/x86_ops_shift.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
#define OP_SHIFT_b(c) \
{ \
uint8_t temp_orig = temp; \
@@ -15,7 +12,7 @@
temp = (temp << 1) | temp2; \
c--; \
} \
- seteab(temp); if (abrt) return 1; \
+ seteab(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
@@ -29,7 +26,7 @@
if (temp2) temp |= 0x80; \
c--; \
} \
- seteab(temp); if (abrt) return 1; \
+ seteab(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
@@ -45,7 +42,7 @@
temp = (temp << 1) | tempc; \
c--; \
} \
- seteab(temp); if (abrt) return 1; \
+ seteab(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 7)) flags |= V_FLAG; \
@@ -61,25 +58,25 @@
temp = (temp >> 1) | tempc; \
c--; \
} \
- seteab(temp); if (abrt) return 1; \
+ seteab(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x40) flags |= V_FLAG; \
CLOCK_CYCLES((cpu_mod == 3) ? 9 : 10); \
break; \
case 0x20: case 0x30: /*SHL b,CL*/ \
- seteab(temp << c); if (abrt) return 1; \
+ seteab(temp << c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHL8, temp_orig, c, (temp << c) & 0xff); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x28: /*SHR b,CL*/ \
- seteab(temp >> c); if (abrt) return 1; \
+ seteab(temp >> c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHR8, temp_orig, c, temp >> c); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x38: /*SAR b,CL*/ \
temp = (int8_t)temp >> c; \
- seteab(temp); if (abrt) return 1; \
+ seteab(temp); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SAR8, temp_orig, c, temp); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
@@ -100,7 +97,7 @@
temp = (temp << 1) | temp2; \
c--; \
} \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
@@ -114,7 +111,7 @@
if (temp2) temp |= 0x8000; \
c--; \
} \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
@@ -130,7 +127,7 @@
temp = (temp << 1) | tempc; \
c--; \
} \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 15)) flags |= V_FLAG; \
@@ -146,25 +143,25 @@
temp = (temp >> 1) | tempc; \
c--; \
} \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x4000) flags |= V_FLAG; \
CLOCK_CYCLES((cpu_mod == 3) ? 9 : 10); \
break; \
case 0x20: case 0x30: /*SHL w, c*/ \
- seteaw(temp << c); if (abrt) return 1; \
+ seteaw(temp << c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHL16, temp_orig, c, (temp << c) & 0xffff); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x28: /*SHR w, c*/ \
- seteaw(temp >> c); if (abrt) return 1; \
+ seteaw(temp >> c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHR16, temp_orig, c, temp >> c); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x38: /*SAR w, c*/ \
temp = (int16_t)temp >> c; \
- seteaw(temp); if (abrt) return 1; \
+ seteaw(temp); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SAR16, temp_orig, c, temp); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
@@ -185,7 +182,7 @@
temp = (temp << 1) | temp2; \
c--; \
} \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
@@ -199,7 +196,7 @@
if (temp2) temp |= 0x80000000; \
c--; \
} \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
@@ -215,7 +212,7 @@
temp = (temp << 1) | tempc; \
c--; \
} \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((flags & C_FLAG) ^ (temp >> 31)) flags |= V_FLAG; \
@@ -231,25 +228,25 @@
temp = (temp >> 1) | tempc; \
c--; \
} \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
flags &= ~(C_FLAG | V_FLAG); \
if (temp2) flags |= C_FLAG; \
if ((temp ^ (temp >> 1)) & 0x40000000) flags |= V_FLAG; \
CLOCK_CYCLES((cpu_mod == 3) ? 9 : 10); \
break; \
case 0x20: case 0x30: /*SHL l, c*/ \
- seteal(temp << c); if (abrt) return 1; \
+ seteal(temp << c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHL32, temp_orig, c, temp << c); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x28: /*SHR l, c*/ \
- seteal(temp >> c); if (abrt) return 1; \
+ seteal(temp >> c); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SHR32, temp_orig, c, temp >> c); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
case 0x38: /*SAR l, c*/ \
temp = (int32_t)temp >> c; \
- seteal(temp); if (abrt) return 1; \
+ seteal(temp); if (cpu_state.abrt) return 1; \
set_flags_shift(FLAGS_SAR32, temp_orig, c, temp); \
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 7); \
break; \
@@ -264,7 +261,7 @@ static int opC0_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -276,7 +273,7 @@ static int opC0_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -288,7 +285,7 @@ static int opC1_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -300,7 +297,7 @@ static int opC1_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -312,7 +309,7 @@ static int opC1_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -324,7 +321,7 @@ static int opC1_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = readmemb(cs, cpu_state.pc) & 31; cpu_state.pc++;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -336,7 +333,7 @@ static int opD0_a16(uint32_t fetchdat)
uint8_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -347,7 +344,7 @@ static int opD0_a32(uint32_t fetchdat)
uint8_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -358,7 +355,7 @@ static int opD1_w_a16(uint32_t fetchdat)
uint16_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -369,7 +366,7 @@ static int opD1_w_a32(uint32_t fetchdat)
uint16_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -380,7 +377,7 @@ static int opD1_l_a16(uint32_t fetchdat)
uint32_t temp, temp2;
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -391,7 +388,7 @@ static int opD1_l_a32(uint32_t fetchdat)
uint32_t temp, temp2;
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -404,7 +401,7 @@ static int opD2_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = CL & 31;
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -416,7 +413,7 @@ static int opD2_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = CL & 31;
- temp = geteab(); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
OP_SHIFT_b(c);
return 0;
}
@@ -428,7 +425,7 @@ static int opD3_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = CL & 31;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -440,7 +437,7 @@ static int opD3_w_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = CL & 31;
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
OP_SHIFT_w(c);
return 0;
}
@@ -452,7 +449,7 @@ static int opD3_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
c = CL & 31;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -464,7 +461,7 @@ static int opD3_l_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
c = CL & 31;
- temp = geteal(); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
OP_SHIFT_l(c);
return 0;
}
@@ -473,12 +470,12 @@ static int opD3_l_a32(uint32_t fetchdat)
#define SHLD_w() \
if (count) \
{ \
- uint16_t tempw = geteaw(); if (abrt) return 1; \
+ uint16_t tempw = geteaw(); if (cpu_state.abrt) return 1; \
int tempc = ((tempw << (count - 1)) & (1 << 15)) ? 1 : 0; \
uint32_t templ = (tempw << 16) | cpu_state.regs[cpu_reg].w; \
if (count <= 16) tempw = templ >> (16 - count); \
else tempw = (templ << count) >> 16; \
- seteaw(tempw); if (abrt) return 1; \
+ seteaw(tempw); if (cpu_state.abrt) return 1; \
setznp16(tempw); \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
@@ -487,10 +484,10 @@ static int opD3_l_a32(uint32_t fetchdat)
#define SHLD_l() \
if (count) \
{ \
- uint32_t templ = geteal(); if (abrt) return 1; \
+ uint32_t templ = geteal(); if (cpu_state.abrt) return 1; \
int tempc = ((templ << (count - 1)) & (1 << 31)) ? 1 : 0; \
templ = (templ << count) | (cpu_state.regs[cpu_reg].l >> (32 - count)); \
- seteal(templ); if (abrt) return 1; \
+ seteal(templ); if (cpu_state.abrt) return 1; \
setznp32(templ); \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
@@ -500,11 +497,11 @@ static int opD3_l_a32(uint32_t fetchdat)
#define SHRD_w() \
if (count) \
{ \
- uint16_t tempw = geteaw(); if (abrt) return 1; \
+ uint16_t tempw = geteaw(); if (cpu_state.abrt) return 1; \
int tempc = (tempw >> (count - 1)) & 1; \
uint32_t templ = tempw | (cpu_state.regs[cpu_reg].w << 16); \
tempw = templ >> count; \
- seteaw(tempw); if (abrt) return 1; \
+ seteaw(tempw); if (cpu_state.abrt) return 1; \
setznp16(tempw); \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
@@ -513,10 +510,10 @@ static int opD3_l_a32(uint32_t fetchdat)
#define SHRD_l() \
if (count) \
{ \
- uint32_t templ = geteal(); if (abrt) return 1; \
+ uint32_t templ = geteal(); if (cpu_state.abrt) return 1; \
int tempc = (templ >> (count - 1)) & 1; \
templ = (templ >> count) | (cpu_state.regs[cpu_reg].l << (32 - count)); \
- seteal(templ); if (abrt) return 1; \
+ seteal(templ); if (cpu_state.abrt) return 1; \
setznp32(templ); \
flags_rebuild(); \
if (tempc) flags |= C_FLAG; \
diff --git a/src/x86_ops_stack.h b/src/x86_ops_stack.h
index c6342ee99..766cc0616 100644
--- a/src/x86_ops_stack.h
+++ b/src/x86_ops_stack.h
@@ -3,7 +3,7 @@
{ \
PUSH_W(reg); \
CLOCK_CYCLES((is486) ? 1 : 2); \
- return abrt; \
+ return cpu_state.abrt; \
}
#define PUSH_L_OP(reg) \
@@ -11,7 +11,7 @@
{ \
PUSH_L(reg); \
CLOCK_CYCLES((is486) ? 1 : 2); \
- return abrt; \
+ return cpu_state.abrt; \
}
#define POP_W_OP(reg) \
@@ -19,7 +19,7 @@
{ \
reg = POP_W(); \
CLOCK_CYCLES((is486) ? 1 : 4); \
- return abrt; \
+ return cpu_state.abrt; \
}
#define POP_L_OP(reg) \
@@ -27,7 +27,7 @@
{ \
reg = POP_L(); \
CLOCK_CYCLES((is486) ? 1 : 4); \
- return abrt; \
+ return cpu_state.abrt; \
}
PUSH_W_OP(AX)
@@ -79,7 +79,7 @@ static int opPUSHA_w(uint32_t fetchdat)
writememw(ss, ESP - 12, BP);
writememw(ss, ESP - 14, SI);
writememw(ss, ESP - 16, DI);
- if (!abrt) ESP -= 16;
+ if (!cpu_state.abrt) ESP -= 16;
}
else
{
@@ -91,10 +91,10 @@ static int opPUSHA_w(uint32_t fetchdat)
writememw(ss, ((SP - 12) & 0xFFFF), BP);
writememw(ss, ((SP - 14) & 0xFFFF), SI);
writememw(ss, ((SP - 16) & 0xFFFF), DI);
- if (!abrt) SP -= 16;
+ if (!cpu_state.abrt) SP -= 16;
}
CLOCK_CYCLES((is486) ? 11 : 18);
- return abrt;
+ return cpu_state.abrt;
}
static int opPUSHA_l(uint32_t fetchdat)
{
@@ -108,7 +108,7 @@ static int opPUSHA_l(uint32_t fetchdat)
writememl(ss, ESP - 24, EBP);
writememl(ss, ESP - 28, ESI);
writememl(ss, ESP - 32, EDI);
- if (!abrt) ESP -= 32;
+ if (!cpu_state.abrt) ESP -= 32;
}
else
{
@@ -120,34 +120,34 @@ static int opPUSHA_l(uint32_t fetchdat)
writememl(ss, ((SP - 24) & 0xFFFF), EBP);
writememl(ss, ((SP - 28) & 0xFFFF), ESI);
writememl(ss, ((SP - 32) & 0xFFFF), EDI);
- if (!abrt) SP -= 32;
+ if (!cpu_state.abrt) SP -= 32;
}
CLOCK_CYCLES((is486) ? 11 : 18);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPA_w(uint32_t fetchdat)
{
if (stack32)
{
- DI = readmemw(ss, ESP); if (abrt) return 1;
- SI = readmemw(ss, ESP + 2); if (abrt) return 1;
- BP = readmemw(ss, ESP + 4); if (abrt) return 1;
- BX = readmemw(ss, ESP + 8); if (abrt) return 1;
- DX = readmemw(ss, ESP + 10); if (abrt) return 1;
- CX = readmemw(ss, ESP + 12); if (abrt) return 1;
- AX = readmemw(ss, ESP + 14); if (abrt) return 1;
+ DI = readmemw(ss, ESP); if (cpu_state.abrt) return 1;
+ SI = readmemw(ss, ESP + 2); if (cpu_state.abrt) return 1;
+ BP = readmemw(ss, ESP + 4); if (cpu_state.abrt) return 1;
+ BX = readmemw(ss, ESP + 8); if (cpu_state.abrt) return 1;
+ DX = readmemw(ss, ESP + 10); if (cpu_state.abrt) return 1;
+ CX = readmemw(ss, ESP + 12); if (cpu_state.abrt) return 1;
+ AX = readmemw(ss, ESP + 14); if (cpu_state.abrt) return 1;
ESP += 16;
}
else
{
- DI = readmemw(ss, ((SP) & 0xFFFF)); if (abrt) return 1;
- SI = readmemw(ss, ((SP + 2) & 0xFFFF)); if (abrt) return 1;
- BP = readmemw(ss, ((SP + 4) & 0xFFFF)); if (abrt) return 1;
- BX = readmemw(ss, ((SP + 8) & 0xFFFF)); if (abrt) return 1;
- DX = readmemw(ss, ((SP + 10) & 0xFFFF)); if (abrt) return 1;
- CX = readmemw(ss, ((SP + 12) & 0xFFFF)); if (abrt) return 1;
- AX = readmemw(ss, ((SP + 14) & 0xFFFF)); if (abrt) return 1;
+ DI = readmemw(ss, ((SP) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ SI = readmemw(ss, ((SP + 2) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ BP = readmemw(ss, ((SP + 4) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ BX = readmemw(ss, ((SP + 8) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ DX = readmemw(ss, ((SP + 10) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ CX = readmemw(ss, ((SP + 12) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ AX = readmemw(ss, ((SP + 14) & 0xFFFF)); if (cpu_state.abrt) return 1;
SP += 16;
}
CLOCK_CYCLES((is486) ? 9 : 24);
@@ -157,24 +157,24 @@ static int opPOPA_l(uint32_t fetchdat)
{
if (stack32)
{
- EDI = readmeml(ss, ESP); if (abrt) return 1;
- ESI = readmeml(ss, ESP + 4); if (abrt) return 1;
- EBP = readmeml(ss, ESP + 8); if (abrt) return 1;
- EBX = readmeml(ss, ESP + 16); if (abrt) return 1;
- EDX = readmeml(ss, ESP + 20); if (abrt) return 1;
- ECX = readmeml(ss, ESP + 24); if (abrt) return 1;
- EAX = readmeml(ss, ESP + 28); if (abrt) return 1;
+ EDI = readmeml(ss, ESP); if (cpu_state.abrt) return 1;
+ ESI = readmeml(ss, ESP + 4); if (cpu_state.abrt) return 1;
+ EBP = readmeml(ss, ESP + 8); if (cpu_state.abrt) return 1;
+ EBX = readmeml(ss, ESP + 16); if (cpu_state.abrt) return 1;
+ EDX = readmeml(ss, ESP + 20); if (cpu_state.abrt) return 1;
+ ECX = readmeml(ss, ESP + 24); if (cpu_state.abrt) return 1;
+ EAX = readmeml(ss, ESP + 28); if (cpu_state.abrt) return 1;
ESP += 32;
}
else
{
- EDI = readmeml(ss, ((SP) & 0xFFFF)); if (abrt) return 1;
- ESI = readmeml(ss, ((SP + 4) & 0xFFFF)); if (abrt) return 1;
- EBP = readmeml(ss, ((SP + 8) & 0xFFFF)); if (abrt) return 1;
- EBX = readmeml(ss, ((SP + 16) & 0xFFFF)); if (abrt) return 1;
- EDX = readmeml(ss, ((SP + 20) & 0xFFFF)); if (abrt) return 1;
- ECX = readmeml(ss, ((SP + 24) & 0xFFFF)); if (abrt) return 1;
- EAX = readmeml(ss, ((SP + 28) & 0xFFFF)); if (abrt) return 1;
+ EDI = readmeml(ss, ((SP) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ ESI = readmeml(ss, ((SP + 4) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ EBP = readmeml(ss, ((SP + 8) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ EBX = readmeml(ss, ((SP + 16) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ EDX = readmeml(ss, ((SP + 20) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ ECX = readmeml(ss, ((SP + 24) & 0xFFFF)); if (cpu_state.abrt) return 1;
+ EAX = readmeml(ss, ((SP + 28) & 0xFFFF)); if (cpu_state.abrt) return 1;
SP += 32;
}
CLOCK_CYCLES((is486) ? 9 : 24);
@@ -186,14 +186,14 @@ static int opPUSH_imm_w(uint32_t fetchdat)
uint16_t val = getwordf();
PUSH_W(val);
CLOCK_CYCLES(2);
- return abrt;
+ return cpu_state.abrt;
}
static int opPUSH_imm_l(uint32_t fetchdat)
{
- uint32_t val = getlong(); if (abrt) return 1;
+ uint32_t val = getlong(); if (cpu_state.abrt) return 1;
PUSH_L(val);
CLOCK_CYCLES(2);
- return abrt;
+ return cpu_state.abrt;
}
static int opPUSH_imm_bw(uint32_t fetchdat)
@@ -204,7 +204,7 @@ static int opPUSH_imm_bw(uint32_t fetchdat)
PUSH_W(tempw);
CLOCK_CYCLES(2);
- return abrt;
+ return cpu_state.abrt;
}
static int opPUSH_imm_bl(uint32_t fetchdat)
{
@@ -214,18 +214,18 @@ static int opPUSH_imm_bl(uint32_t fetchdat)
PUSH_L(templ);
CLOCK_CYCLES(2);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPW_a16(uint32_t fetchdat)
{
uint16_t temp;
- temp = POP_W(); if (abrt) return 1;
+ temp = POP_W(); if (cpu_state.abrt) return 1;
fetch_ea_16(fetchdat);
seteaw(temp);
- if (abrt)
+ if (cpu_state.abrt)
{
if (stack32) ESP -= 2;
else SP -= 2;
@@ -233,17 +233,17 @@ static int opPOPW_a16(uint32_t fetchdat)
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 6);
else CLOCK_CYCLES((cpu_mod == 3) ? 4 : 5);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPW_a32(uint32_t fetchdat)
{
uint16_t temp;
- temp = POP_W(); if (abrt) return 1;
+ temp = POP_W(); if (cpu_state.abrt) return 1;
fetch_ea_32(fetchdat);
seteaw(temp);
- if (abrt)
+ if (cpu_state.abrt)
{
if (stack32) ESP -= 2;
else SP -= 2;
@@ -251,18 +251,18 @@ static int opPOPW_a32(uint32_t fetchdat)
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 6);
else CLOCK_CYCLES((cpu_mod == 3) ? 4 : 5);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPL_a16(uint32_t fetchdat)
{
uint32_t temp;
- temp = POP_L(); if (abrt) return 1;
+ temp = POP_L(); if (cpu_state.abrt) return 1;
fetch_ea_16(fetchdat);
seteal(temp);
- if (abrt)
+ if (cpu_state.abrt)
{
if (stack32) ESP -= 4;
else SP -= 4;
@@ -270,17 +270,17 @@ static int opPOPL_a16(uint32_t fetchdat)
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 6);
else CLOCK_CYCLES((cpu_mod == 3) ? 4 : 5);
- return abrt;
+ return cpu_state.abrt;
}
static int opPOPL_a32(uint32_t fetchdat)
{
uint32_t temp;
- temp = POP_L(); if (abrt) return 1;
+ temp = POP_L(); if (cpu_state.abrt) return 1;
fetch_ea_32(fetchdat);
seteal(temp);
- if (abrt)
+ if (cpu_state.abrt)
{
if (stack32) ESP -= 4;
else SP -= 4;
@@ -288,7 +288,7 @@ static int opPOPL_a32(uint32_t fetchdat)
if (is486) CLOCK_CYCLES((cpu_mod == 3) ? 1 : 6);
else CLOCK_CYCLES((cpu_mod == 3) ? 4 : 5);
- return abrt;
+ return cpu_state.abrt;
}
@@ -298,7 +298,7 @@ static int opENTER_w(uint32_t fetchdat)
int count = (fetchdat >> 16) & 0xff; cpu_state.pc++;
uint32_t tempEBP = EBP, tempESP = ESP, frame_ptr;
- PUSH_W(BP); if (abrt) return 1;
+ PUSH_W(BP); if (cpu_state.abrt) return 1;
frame_ptr = ESP;
if (count > 0)
@@ -309,13 +309,13 @@ static int opENTER_w(uint32_t fetchdat)
BP -= 2;
tempw = readmemw(ss, BP);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
PUSH_W(tempw);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
CLOCK_CYCLES((is486) ? 3 : 4);
}
PUSH_W(frame_ptr);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
CLOCK_CYCLES((is486) ? 3 : 5);
}
BP = frame_ptr;
@@ -331,7 +331,7 @@ static int opENTER_l(uint32_t fetchdat)
int count = (fetchdat >> 16) & 0xff; cpu_state.pc++;
uint32_t tempEBP = EBP, tempESP = ESP, frame_ptr;
- PUSH_L(EBP); if (abrt) return 1;
+ PUSH_L(EBP); if (cpu_state.abrt) return 1;
frame_ptr = ESP;
if (count > 0)
@@ -342,13 +342,13 @@ static int opENTER_l(uint32_t fetchdat)
EBP -= 4;
templ = readmeml(ss, EBP);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
PUSH_L(templ);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
CLOCK_CYCLES((is486) ? 3 : 4);
}
PUSH_L(frame_ptr);
- if (abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; EBP = tempEBP; return 1; }
CLOCK_CYCLES((is486) ? 3 : 5);
}
EBP = frame_ptr;
@@ -367,7 +367,7 @@ static int opLEAVE_w(uint32_t fetchdat)
SP = BP;
temp = POP_W();
- if (abrt) { ESP = tempESP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; return 1; }
BP = temp;
CLOCK_CYCLES(4);
@@ -380,7 +380,7 @@ static int opLEAVE_l(uint32_t fetchdat)
ESP = EBP;
temp = POP_L();
- if (abrt) { ESP = tempESP; return 1; }
+ if (cpu_state.abrt) { ESP = tempESP; return 1; }
EBP = temp;
CLOCK_CYCLES(4);
@@ -393,13 +393,13 @@ static int opLEAVE_l(uint32_t fetchdat)
{ \
PUSH_W(seg); \
CLOCK_CYCLES(2); \
- return abrt; \
+ return cpu_state.abrt; \
} \
static int opPUSH_ ## seg ## _l(uint32_t fetchdat) \
{ \
PUSH_L(seg); \
CLOCK_CYCLES(2); \
- return abrt; \
+ return cpu_state.abrt; \
}
#define POP_SEG_OPS(seg, realseg) \
@@ -407,19 +407,19 @@ static int opLEAVE_l(uint32_t fetchdat)
{ \
uint16_t temp_seg; \
uint32_t temp_esp = ESP; \
- temp_seg = POP_W(); if (abrt) return 1; \
- loadseg(temp_seg, realseg); if (abrt) ESP = temp_esp; \
+ temp_seg = POP_W(); if (cpu_state.abrt) return 1; \
+ loadseg(temp_seg, realseg); if (cpu_state.abrt) ESP = temp_esp; \
CLOCK_CYCLES(is486 ? 3 : 7); \
- return abrt; \
+ return cpu_state.abrt; \
} \
static int opPOP_ ## seg ## _l(uint32_t fetchdat) \
{ \
uint32_t temp_seg; \
uint32_t temp_esp = ESP; \
- temp_seg = POP_L(); if (abrt) return 1; \
- loadseg(temp_seg & 0xffff, realseg); if (abrt) ESP = temp_esp; \
+ temp_seg = POP_L(); if (cpu_state.abrt) return 1; \
+ loadseg(temp_seg & 0xffff, realseg); if (cpu_state.abrt) ESP = temp_esp; \
CLOCK_CYCLES(is486 ? 3 : 7); \
- return abrt; \
+ return cpu_state.abrt; \
}
@@ -440,8 +440,8 @@ static int opPOP_SS_w(uint32_t fetchdat)
{
uint16_t temp_seg;
uint32_t temp_esp = ESP;
- temp_seg = POP_W(); if (abrt) return 1;
- loadseg(temp_seg, &_ss); if (abrt) { ESP = temp_esp; return 1; }
+ temp_seg = POP_W(); if (cpu_state.abrt) return 1;
+ loadseg(temp_seg, &_ss); if (cpu_state.abrt) { ESP = temp_esp; return 1; }
CLOCK_CYCLES(is486 ? 3 : 7);
cpu_state.oldpc = cpu_state.pc;
@@ -450,7 +450,7 @@ static int opPOP_SS_w(uint32_t fetchdat)
cpu_state.ea_seg = &_ds;
fetchdat = fastreadl(cs + cpu_state.pc);
cpu_state.pc++;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
x86_opcodes[(fetchdat & 0xff) | cpu_state.op32](fetchdat >> 8);
return 1;
@@ -459,8 +459,8 @@ static int opPOP_SS_l(uint32_t fetchdat)
{
uint32_t temp_seg;
uint32_t temp_esp = ESP;
- temp_seg = POP_L(); if (abrt) return 1;
- loadseg(temp_seg & 0xffff, &_ss); if (abrt) { ESP = temp_esp; return 1; }
+ temp_seg = POP_L(); if (cpu_state.abrt) return 1;
+ loadseg(temp_seg & 0xffff, &_ss); if (cpu_state.abrt) { ESP = temp_esp; return 1; }
CLOCK_CYCLES(is486 ? 3 : 7);
cpu_state.oldpc = cpu_state.pc;
@@ -469,7 +469,7 @@ static int opPOP_SS_l(uint32_t fetchdat)
cpu_state.ea_seg = &_ds;
fetchdat = fastreadl(cs + cpu_state.pc);
cpu_state.pc++;
- if (abrt) return 1;
+ if (cpu_state.abrt) return 1;
x86_opcodes[(fetchdat & 0xff) | cpu_state.op32](fetchdat >> 8);
return 1;
diff --git a/src/x86_ops_string.h b/src/x86_ops_string.h
index 898b31ac8..c00c68c3e 100644
--- a/src/x86_ops_string.h
+++ b/src/x86_ops_string.h
@@ -1,7 +1,7 @@
static int opMOVSB_a16(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (abrt) return 1;
- writememb(es, DI, temp); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
+ writememb(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { DI--; SI--; }
else { DI++; SI++; }
CLOCK_CYCLES(7);
@@ -9,8 +9,8 @@ static int opMOVSB_a16(uint32_t fetchdat)
}
static int opMOVSB_a32(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
- writememb(es, EDI, temp); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
+ writememb(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { EDI--; ESI--; }
else { EDI++; ESI++; }
CLOCK_CYCLES(7);
@@ -19,8 +19,8 @@ static int opMOVSB_a32(uint32_t fetchdat)
static int opMOVSW_a16(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (abrt) return 1;
- writememw(es, DI, temp); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
+ writememw(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
else { DI += 2; SI += 2; }
CLOCK_CYCLES(7);
@@ -28,8 +28,8 @@ static int opMOVSW_a16(uint32_t fetchdat)
}
static int opMOVSW_a32(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
- writememw(es, EDI, temp); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
+ writememw(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
else { EDI += 2; ESI += 2; }
CLOCK_CYCLES(7);
@@ -38,8 +38,8 @@ static int opMOVSW_a32(uint32_t fetchdat)
static int opMOVSL_a16(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (abrt) return 1;
- writememl(es, DI, temp); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
+ writememl(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
else { DI += 4; SI += 4; }
CLOCK_CYCLES(7);
@@ -47,8 +47,8 @@ static int opMOVSL_a16(uint32_t fetchdat)
}
static int opMOVSL_a32(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
- writememl(es, EDI, temp); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
+ writememl(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
else { EDI += 4; ESI += 4; }
CLOCK_CYCLES(7);
@@ -59,7 +59,7 @@ static int opMOVSL_a32(uint32_t fetchdat)
static int opCMPSB_a16(uint32_t fetchdat)
{
uint8_t src = readmemb(cpu_state.ea_seg->base, SI);
- uint8_t dst = readmemb(es, DI); if (abrt) return 1;
+ uint8_t dst = readmemb(es, DI); if (cpu_state.abrt) return 1;
setsub8(src, dst);
if (flags & D_FLAG) { DI--; SI--; }
else { DI++; SI++; }
@@ -69,7 +69,7 @@ static int opCMPSB_a16(uint32_t fetchdat)
static int opCMPSB_a32(uint32_t fetchdat)
{
uint8_t src = readmemb(cpu_state.ea_seg->base, ESI);
- uint8_t dst = readmemb(es, EDI); if (abrt) return 1;
+ uint8_t dst = readmemb(es, EDI); if (cpu_state.abrt) return 1;
setsub8(src, dst);
if (flags & D_FLAG) { EDI--; ESI--; }
else { EDI++; ESI++; }
@@ -80,7 +80,7 @@ static int opCMPSB_a32(uint32_t fetchdat)
static int opCMPSW_a16(uint32_t fetchdat)
{
uint16_t src = readmemw(cpu_state.ea_seg->base, SI);
- uint16_t dst = readmemw(es, DI); if (abrt) return 1;
+ uint16_t dst = readmemw(es, DI); if (cpu_state.abrt) return 1;
setsub16(src, dst);
if (flags & D_FLAG) { DI -= 2; SI -= 2; }
else { DI += 2; SI += 2; }
@@ -90,7 +90,7 @@ static int opCMPSW_a16(uint32_t fetchdat)
static int opCMPSW_a32(uint32_t fetchdat)
{
uint16_t src = readmemw(cpu_state.ea_seg->base, ESI);
- uint16_t dst = readmemw(es, EDI); if (abrt) return 1;
+ uint16_t dst = readmemw(es, EDI); if (cpu_state.abrt) return 1;
setsub16(src, dst);
if (flags & D_FLAG) { EDI -= 2; ESI -= 2; }
else { EDI += 2; ESI += 2; }
@@ -101,7 +101,7 @@ static int opCMPSW_a32(uint32_t fetchdat)
static int opCMPSL_a16(uint32_t fetchdat)
{
uint32_t src = readmeml(cpu_state.ea_seg->base, SI);
- uint32_t dst = readmeml(es, DI); if (abrt) return 1;
+ uint32_t dst = readmeml(es, DI); if (cpu_state.abrt) return 1;
setsub32(src, dst);
if (flags & D_FLAG) { DI -= 4; SI -= 4; }
else { DI += 4; SI += 4; }
@@ -111,7 +111,7 @@ static int opCMPSL_a16(uint32_t fetchdat)
static int opCMPSL_a32(uint32_t fetchdat)
{
uint32_t src = readmeml(cpu_state.ea_seg->base, ESI);
- uint32_t dst = readmeml(es, EDI); if (abrt) return 1;
+ uint32_t dst = readmeml(es, EDI); if (cpu_state.abrt) return 1;
setsub32(src, dst);
if (flags & D_FLAG) { EDI -= 4; ESI -= 4; }
else { EDI += 4; ESI += 4; }
@@ -121,7 +121,7 @@ static int opCMPSL_a32(uint32_t fetchdat)
static int opSTOSB_a16(uint32_t fetchdat)
{
- writememb(es, DI, AL); if (abrt) return 1;
+ writememb(es, DI, AL); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI--;
else DI++;
CLOCK_CYCLES(4);
@@ -129,7 +129,7 @@ static int opSTOSB_a16(uint32_t fetchdat)
}
static int opSTOSB_a32(uint32_t fetchdat)
{
- writememb(es, EDI, AL); if (abrt) return 1;
+ writememb(es, EDI, AL); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI--;
else EDI++;
CLOCK_CYCLES(4);
@@ -138,7 +138,7 @@ static int opSTOSB_a32(uint32_t fetchdat)
static int opSTOSW_a16(uint32_t fetchdat)
{
- writememw(es, DI, AX); if (abrt) return 1;
+ writememw(es, DI, AX); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI -= 2;
else DI += 2;
CLOCK_CYCLES(4);
@@ -146,7 +146,7 @@ static int opSTOSW_a16(uint32_t fetchdat)
}
static int opSTOSW_a32(uint32_t fetchdat)
{
- writememw(es, EDI, AX); if (abrt) return 1;
+ writememw(es, EDI, AX); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI -= 2;
else EDI += 2;
CLOCK_CYCLES(4);
@@ -155,7 +155,7 @@ static int opSTOSW_a32(uint32_t fetchdat)
static int opSTOSL_a16(uint32_t fetchdat)
{
- writememl(es, DI, EAX); if (abrt) return 1;
+ writememl(es, DI, EAX); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI -= 4;
else DI += 4;
CLOCK_CYCLES(4);
@@ -163,7 +163,7 @@ static int opSTOSL_a16(uint32_t fetchdat)
}
static int opSTOSL_a32(uint32_t fetchdat)
{
- writememl(es, EDI, EAX); if (abrt) return 1;
+ writememl(es, EDI, EAX); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI -= 4;
else EDI += 4;
CLOCK_CYCLES(4);
@@ -173,7 +173,7 @@ static int opSTOSL_a32(uint32_t fetchdat)
static int opLODSB_a16(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
AL = temp;
if (flags & D_FLAG) SI--;
else SI++;
@@ -182,7 +182,7 @@ static int opLODSB_a16(uint32_t fetchdat)
}
static int opLODSB_a32(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
AL = temp;
if (flags & D_FLAG) ESI--;
else ESI++;
@@ -192,7 +192,7 @@ static int opLODSB_a32(uint32_t fetchdat)
static int opLODSW_a16(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
AX = temp;
if (flags & D_FLAG) SI -= 2;
else SI += 2;
@@ -201,7 +201,7 @@ static int opLODSW_a16(uint32_t fetchdat)
}
static int opLODSW_a32(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
AX = temp;
if (flags & D_FLAG) ESI -= 2;
else ESI += 2;
@@ -211,7 +211,7 @@ static int opLODSW_a32(uint32_t fetchdat)
static int opLODSL_a16(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
EAX = temp;
if (flags & D_FLAG) SI -= 4;
else SI += 4;
@@ -220,7 +220,7 @@ static int opLODSL_a16(uint32_t fetchdat)
}
static int opLODSL_a32(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
EAX = temp;
if (flags & D_FLAG) ESI -= 4;
else ESI += 4;
@@ -231,7 +231,7 @@ static int opLODSL_a32(uint32_t fetchdat)
static int opSCASB_a16(uint32_t fetchdat)
{
- uint8_t temp = readmemb(es, DI); if (abrt) return 1;
+ uint8_t temp = readmemb(es, DI); if (cpu_state.abrt) return 1;
setsub8(AL, temp);
if (flags & D_FLAG) DI--;
else DI++;
@@ -240,7 +240,7 @@ static int opSCASB_a16(uint32_t fetchdat)
}
static int opSCASB_a32(uint32_t fetchdat)
{
- uint8_t temp = readmemb(es, EDI); if (abrt) return 1;
+ uint8_t temp = readmemb(es, EDI); if (cpu_state.abrt) return 1;
setsub8(AL, temp);
if (flags & D_FLAG) EDI--;
else EDI++;
@@ -250,7 +250,7 @@ static int opSCASB_a32(uint32_t fetchdat)
static int opSCASW_a16(uint32_t fetchdat)
{
- uint16_t temp = readmemw(es, DI); if (abrt) return 1;
+ uint16_t temp = readmemw(es, DI); if (cpu_state.abrt) return 1;
setsub16(AX, temp);
if (flags & D_FLAG) DI -= 2;
else DI += 2;
@@ -259,7 +259,7 @@ static int opSCASW_a16(uint32_t fetchdat)
}
static int opSCASW_a32(uint32_t fetchdat)
{
- uint16_t temp = readmemw(es, EDI); if (abrt) return 1;
+ uint16_t temp = readmemw(es, EDI); if (cpu_state.abrt) return 1;
setsub16(AX, temp);
if (flags & D_FLAG) EDI -= 2;
else EDI += 2;
@@ -269,7 +269,7 @@ static int opSCASW_a32(uint32_t fetchdat)
static int opSCASL_a16(uint32_t fetchdat)
{
- uint32_t temp = readmeml(es, DI); if (abrt) return 1;
+ uint32_t temp = readmeml(es, DI); if (cpu_state.abrt) return 1;
setsub32(EAX, temp);
if (flags & D_FLAG) DI -= 4;
else DI += 4;
@@ -278,7 +278,7 @@ static int opSCASL_a16(uint32_t fetchdat)
}
static int opSCASL_a32(uint32_t fetchdat)
{
- uint32_t temp = readmeml(es, EDI); if (abrt) return 1;
+ uint32_t temp = readmeml(es, EDI); if (cpu_state.abrt) return 1;
setsub32(EAX, temp);
if (flags & D_FLAG) EDI -= 4;
else EDI += 4;
@@ -291,7 +291,7 @@ static int opINSB_a16(uint32_t fetchdat)
uint8_t temp;
check_io_perm(DX);
temp = inb(DX);
- writememb(es, DI, temp); if (abrt) return 1;
+ writememb(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI--;
else DI++;
CLOCK_CYCLES(15);
@@ -302,7 +302,7 @@ static int opINSB_a32(uint32_t fetchdat)
uint8_t temp;
check_io_perm(DX);
temp = inb(DX);
- writememb(es, EDI, temp); if (abrt) return 1;
+ writememb(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI--;
else EDI++;
CLOCK_CYCLES(15);
@@ -315,7 +315,7 @@ static int opINSW_a16(uint32_t fetchdat)
check_io_perm(DX);
check_io_perm(DX + 1);
temp = inw(DX);
- writememw(es, DI, temp); if (abrt) return 1;
+ writememw(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI -= 2;
else DI += 2;
CLOCK_CYCLES(15);
@@ -327,7 +327,7 @@ static int opINSW_a32(uint32_t fetchdat)
check_io_perm(DX);
check_io_perm(DX + 1);
temp = inw(DX);
- writememw(es, EDI, temp); if (abrt) return 1;
+ writememw(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI -= 2;
else EDI += 2;
CLOCK_CYCLES(15);
@@ -342,7 +342,7 @@ static int opINSL_a16(uint32_t fetchdat)
check_io_perm(DX + 2);
check_io_perm(DX + 3);
temp = inl(DX);
- writememl(es, DI, temp); if (abrt) return 1;
+ writememl(es, DI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) DI -= 4;
else DI += 4;
CLOCK_CYCLES(15);
@@ -356,7 +356,7 @@ static int opINSL_a32(uint32_t fetchdat)
check_io_perm(DX + 2);
check_io_perm(DX + 3);
temp = inl(DX);
- writememl(es, EDI, temp); if (abrt) return 1;
+ writememl(es, EDI, temp); if (cpu_state.abrt) return 1;
if (flags & D_FLAG) EDI -= 4;
else EDI += 4;
CLOCK_CYCLES(15);
@@ -365,7 +365,7 @@ static int opINSL_a32(uint32_t fetchdat)
static int opOUTSB_a16(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
if (flags & D_FLAG) SI--;
else SI++;
@@ -375,7 +375,7 @@ static int opOUTSB_a16(uint32_t fetchdat)
}
static int opOUTSB_a32(uint32_t fetchdat)
{
- uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint8_t temp = readmemb(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
if (flags & D_FLAG) ESI--;
else ESI++;
@@ -386,7 +386,7 @@ static int opOUTSB_a32(uint32_t fetchdat)
static int opOUTSW_a16(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
check_io_perm(DX + 1);
if (flags & D_FLAG) SI -= 2;
@@ -397,7 +397,7 @@ static int opOUTSW_a16(uint32_t fetchdat)
}
static int opOUTSW_a32(uint32_t fetchdat)
{
- uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint16_t temp = readmemw(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
check_io_perm(DX + 1);
if (flags & D_FLAG) ESI -= 2;
@@ -409,7 +409,7 @@ static int opOUTSW_a32(uint32_t fetchdat)
static int opOUTSL_a16(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, SI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
check_io_perm(DX + 1);
check_io_perm(DX + 2);
@@ -422,7 +422,7 @@ static int opOUTSL_a16(uint32_t fetchdat)
}
static int opOUTSL_a32(uint32_t fetchdat)
{
- uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (abrt) return 1;
+ uint32_t temp = readmeml(cpu_state.ea_seg->base, ESI); if (cpu_state.abrt) return 1;
check_io_perm(DX);
check_io_perm(DX + 1);
check_io_perm(DX + 2);
diff --git a/src/x86_ops_xchg.h b/src/x86_ops_xchg.h
index 10748ee02..4ab58e897 100644
--- a/src/x86_ops_xchg.h
+++ b/src/x86_ops_xchg.h
@@ -1,12 +1,9 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
static int opXCHG_b_a16(uint32_t fetchdat)
{
uint8_t temp;
fetch_ea_16(fetchdat);
- temp = geteab(); if (abrt) return 1;
- seteab(getr8(cpu_reg)); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
+ seteab(getr8(cpu_reg)); if (cpu_state.abrt) return 1;
setr8(cpu_reg, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
@@ -15,8 +12,8 @@ static int opXCHG_b_a32(uint32_t fetchdat)
{
uint8_t temp;
fetch_ea_32(fetchdat);
- temp = geteab(); if (abrt) return 1;
- seteab(getr8(cpu_reg)); if (abrt) return 1;
+ temp = geteab(); if (cpu_state.abrt) return 1;
+ seteab(getr8(cpu_reg)); if (cpu_state.abrt) return 1;
setr8(cpu_reg, temp);
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
@@ -26,8 +23,8 @@ static int opXCHG_w_a16(uint32_t fetchdat)
{
uint16_t temp;
fetch_ea_16(fetchdat);
- temp = geteaw(); if (abrt) return 1;
- seteaw(cpu_state.regs[cpu_reg].w); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(cpu_state.regs[cpu_reg].w); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
@@ -36,8 +33,8 @@ static int opXCHG_w_a32(uint32_t fetchdat)
{
uint16_t temp;
fetch_ea_32(fetchdat);
- temp = geteaw(); if (abrt) return 1;
- seteaw(cpu_state.regs[cpu_reg].w); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
+ seteaw(cpu_state.regs[cpu_reg].w); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].w = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
@@ -47,8 +44,8 @@ static int opXCHG_l_a16(uint32_t fetchdat)
{
uint32_t temp;
fetch_ea_16(fetchdat);
- temp = geteal(); if (abrt) return 1;
- seteal(cpu_state.regs[cpu_reg].l); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(cpu_state.regs[cpu_reg].l); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
@@ -57,8 +54,8 @@ static int opXCHG_l_a32(uint32_t fetchdat)
{
uint32_t temp;
fetch_ea_32(fetchdat);
- temp = geteal(); if (abrt) return 1;
- seteal(cpu_state.regs[cpu_reg].l); if (abrt) return 1;
+ temp = geteal(); if (cpu_state.abrt) return 1;
+ seteal(cpu_state.regs[cpu_reg].l); if (cpu_state.abrt) return 1;
cpu_state.regs[cpu_reg].l = temp;
CLOCK_CYCLES((cpu_mod == 3) ? 3 : 5);
return 0;
diff --git a/src/x86seg.c b/src/x86seg.c
index 371d41ee1..ab2735840 100644
--- a/src/x86seg.c
+++ b/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)
@@ -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);
diff --git a/src/x87.c b/src/x87.c
index 2f3b8ac29..547e56091 100644
--- a/src/x87.c
+++ b/src/x87.c
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker
- see COPYING for more details
-*/
//Quake timedemo demo1 - 8.1FPS
//11A00 - D_SCAlloc
@@ -22,15 +19,6 @@
#include "x87.h"
#include "386_common.h"
-double ST[8];
-uint64_t ST_i64[8];
-MMX_REG MM[8];
-int ismmx;
-uint16_t npxs,npxc;
-uint8_t tag[8];
-
-int TOP;
-
uint16_t x87_gettag()
{
uint16_t ret = 0;
@@ -38,10 +26,10 @@ uint16_t x87_gettag()
for (c = 0; c < 8; c++)
{
- if (tag[c] & TAG_UINT64)
+ if (cpu_state.tag[c] & TAG_UINT64)
ret |= 2 << (c*2);
else
- ret |= (tag[c] << (c*2));
+ ret |= (cpu_state.tag[c] << (c*2));
}
return ret;
@@ -49,42 +37,42 @@ uint16_t x87_gettag()
void x87_settag(uint16_t new_tag)
{
- tag[0] = new_tag & 3;
- tag[1] = (new_tag >> 2) & 3;
- tag[2] = (new_tag >> 4) & 3;
- tag[3] = (new_tag >> 6) & 3;
- tag[4] = (new_tag >> 8) & 3;
- tag[5] = (new_tag >> 10) & 3;
- tag[6] = (new_tag >> 12) & 3;
- tag[7] = (new_tag >> 14) & 3;
+ cpu_state.tag[0] = new_tag & 3;
+ cpu_state.tag[1] = (new_tag >> 2) & 3;
+ cpu_state.tag[2] = (new_tag >> 4) & 3;
+ cpu_state.tag[3] = (new_tag >> 6) & 3;
+ cpu_state.tag[4] = (new_tag >> 8) & 3;
+ cpu_state.tag[5] = (new_tag >> 10) & 3;
+ cpu_state.tag[6] = (new_tag >> 12) & 3;
+ cpu_state.tag[7] = (new_tag >> 14) & 3;
}
void x87_dumpregs()
{
- if (ismmx)
+ if (cpu_state.ismmx)
{
- pclog("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", MM[0].q, MM[1].q, MM[2].q, MM[3].q);
- pclog("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", MM[4].q, MM[5].q, MM[6].q, MM[7].q);
+ pclog("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q);
+ pclog("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q);
}
else
{
- pclog("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n",ST[TOP],ST[(TOP+1)&7],ST[(TOP+2)&7],ST[(TOP+3)&7]);
- pclog("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n",ST[(TOP+4)&7],ST[(TOP+5)&7],ST[(TOP+6)&7],ST[(TOP+7)&7]);
+ pclog("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n",cpu_state.ST[cpu_state.TOP],cpu_state.ST[(cpu_state.TOP+1)&7],cpu_state.ST[(cpu_state.TOP+2)&7],cpu_state.ST[(cpu_state.TOP+3)&7]);
+ pclog("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n",cpu_state.ST[(cpu_state.TOP+4)&7],cpu_state.ST[(cpu_state.TOP+5)&7],cpu_state.ST[(cpu_state.TOP+6)&7],cpu_state.ST[(cpu_state.TOP+7)&7]);
}
- pclog("Status = %04X Control = %04X Tag = %04X\n",npxs,npxc,x87_gettag());
+ pclog("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag());
}
void x87_print()
{
- if (ismmx)
+ if (cpu_state.ismmx)
{
- pclog("\tMM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\t", MM[0].q, MM[1].q, MM[2].q, MM[3].q);
- pclog("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", MM[4].q, MM[5].q, MM[6].q, MM[7].q);
+ pclog("\tMM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\t", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q);
+ pclog("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q);
}
else
{
- pclog("\tST(0)=%.20f\tST(1)=%.20f\tST(2)=%f\tST(3)=%f\t",ST[TOP&7],ST[(TOP+1)&7],ST[(TOP+2)&7],ST[(TOP+3)&7]);
- pclog("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t TOP=%i CR=%04X SR=%04X TAG=%04X\n",ST[(TOP+4)&7],ST[(TOP+5)&7],ST[(TOP+6)&7],ST[(TOP+7)&7], TOP, npxc, npxs, x87_gettag());
+ pclog("\tST(0)=%.20f\tST(1)=%.20f\tST(2)=%f\tST(3)=%f\t",cpu_state.ST[cpu_state.TOP&7],cpu_state.ST[(cpu_state.TOP+1)&7],cpu_state.ST[(cpu_state.TOP+2)&7],cpu_state.ST[(cpu_state.TOP+3)&7]);
+ pclog("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\tTOP=%i CR=%04X SR=%04X TAG=%04X\n",cpu_state.ST[(cpu_state.TOP+4)&7],cpu_state.ST[(cpu_state.TOP+5)&7],cpu_state.ST[(cpu_state.TOP+6)&7],cpu_state.ST[(cpu_state.TOP+7)&7], cpu_state.TOP, cpu_state.npxc, cpu_state.npxs, x87_gettag());
}
}
diff --git a/src/x87.h b/src/x87.h
index fa3b9ccdf..6a0c532b1 100644
--- a/src/x87.h
+++ b/src/x87.h
@@ -1,25 +1,5 @@
uint32_t x87_pc_off,x87_op_off;
uint16_t x87_pc_seg,x87_op_seg;
-extern int TOP;
-extern uint16_t npxs, npxc;
-extern uint8_t tag[8];
-extern int ismmx;
-extern double ST[8];
-extern uint64_t ST_i64[8];
-
-typedef union MMX_REG
-{
- uint64_t q;
- int64_t sq;
- uint32_t l[2];
- int32_t sl[2];
- uint16_t w[5];
- int16_t sw[4];
- uint8_t b[8];
- int8_t sb[8];
-} MMX_REG;
-
-extern MMX_REG MM[8];
static inline void x87_set_mmx();
static inline void x87_emms();
@@ -27,5 +7,5 @@ static inline void x87_emms();
uint16_t x87_gettag();
void x87_settag(uint16_t new_tag);
-/*Hack for FPU copy. If set then ST_i64 contains the 64-bit integer loaded by FILD*/
+/*Hack for FPU copy. If set then MM[].q contains the 64-bit integer loaded by FILD*/
#define TAG_UINT64 (1 << 2)
diff --git a/src/x87_ops.h b/src/x87_ops.h
index 1bfd1e6c7..1c0db7bdb 100644
--- a/src/x87_ops.h
+++ b/src/x87_ops.h
@@ -1,6 +1,3 @@
-/* Copyright holders: Sarah Walker, Tenshi, leilei
- see COPYING for more details
-*/
#include
#include
@@ -8,7 +5,7 @@
static int rounding_modes[4] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO};
-#define ST(x) ST[((TOP+(x))&7)]
+#define ST(x) cpu_state.ST[((cpu_state.TOP+(x))&7)]
#define C0 (1<<8)
#define C1 (1<<9)
@@ -21,8 +18,8 @@ static int rounding_modes[4] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZ
{ \
if (((double)src2) == 0.0) \
{ \
- npxs |= STATUS_ZERODIVIDE; \
- if (npxc & STATUS_ZERODIVIDE) \
+ cpu_state.npxs |= STATUS_ZERODIVIDE; \
+ if (cpu_state.npxc & STATUS_ZERODIVIDE) \
dst = src1 / (double)src2; \
else \
{ \
@@ -37,15 +34,15 @@ static int rounding_modes[4] = {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZ
static inline void x87_set_mmx()
{
- TOP = 0;
- *(uint64_t *)tag = 0;
- ismmx = 1;
+ cpu_state.TOP = 0;
+ *(uint64_t *)cpu_state.tag = 0;
+ cpu_state.ismmx = 1;
}
static inline void x87_emms()
{
- *tag = 0x0303030303030303ll;
- ismmx = 0;
+ *cpu_state.tag = 0x0303030303030303ll;
+ cpu_state.ismmx = 0;
}
static inline void x87_checkexceptions()
@@ -54,16 +51,16 @@ static inline void x87_checkexceptions()
static inline void x87_push(double i)
{
- TOP=(TOP-1)&7;
- ST[TOP]=i;
- tag[TOP&7] = (i == 0.0) ? 1 : 0;
+ cpu_state.TOP=(cpu_state.TOP-1)&7;
+ cpu_state.ST[cpu_state.TOP] = i;
+ cpu_state.tag[cpu_state.TOP&7] = (i == 0.0) ? 1 : 0;
}
static inline double x87_pop()
{
- double t=ST[TOP];
- tag[TOP&7] = 3;
- TOP=(TOP+1)&7;
+ double t = cpu_state.ST[cpu_state.TOP];
+ cpu_state.tag[cpu_state.TOP&7] = 3;
+ cpu_state.TOP=(cpu_state.TOP+1)&7;
return t;
}
@@ -71,7 +68,7 @@ static inline int64_t x87_fround(double b)
{
int64_t a, c;
- switch ((npxc>>10)&3)
+ switch ((cpu_state.npxc>>10)&3)
{
case 0: /*Nearest*/
a = (int64_t)floor(b);
@@ -103,24 +100,16 @@ static inline double x87_ld80()
uint64_t ll;
} eind;
} test;
-
- int64_t exp64;
- int64_t blah;
- int64_t exp64final;
-
- int64_t mant64;
- int64_t sign;
-
test.eind.ll = readmeml(easeg,cpu_state.eaaddr);
test.eind.ll |= (uint64_t)readmeml(easeg,cpu_state.eaaddr+4)<<32;
test.begin = readmemw(easeg,cpu_state.eaaddr+8);
- exp64 = (((test.begin&0x7fff) - BIAS80));
- blah = ((exp64 >0)?exp64:-exp64)&0x3ff;
- exp64final = ((exp64 >0)?blah:-blah) +BIAS64;
+ int64_t exp64 = (((test.begin&0x7fff) - BIAS80));
+ int64_t blah = ((exp64 >0)?exp64:-exp64)&0x3ff;
+ int64_t exp64final = ((exp64 >0)?blah:-blah) +BIAS64;
- mant64 = (test.eind.ll >> 11) & (0xfffffffffffff);
- sign = (test.begin&0x8000)?1:0;
+ int64_t mant64 = (test.eind.ll >> 11) & (0xfffffffffffff);
+ int64_t sign = (test.begin&0x8000)?1:0;
if ((test.begin & 0x7fff) == 0x7fff)
exp64final = 0x7ff;
@@ -145,19 +134,13 @@ static inline void x87_st80(double d)
} eind;
} test;
- int64_t sign80;
- int64_t exp80;
- int64_t exp80final;
- int64_t mant80;
- int64_t mant80final;
-
test.eind.d=d;
- sign80 = (test.eind.ll&(0x8000000000000000))?1:0;
- exp80 = test.eind.ll&(0x7ff0000000000000);
- exp80final = (exp80>>52);
- mant80 = test.eind.ll&(0x000fffffffffffff);
- mant80final = (mant80 << 11);
+ int64_t sign80 = (test.eind.ll&(0x8000000000000000))?1:0;
+ int64_t exp80 = test.eind.ll&(0x7ff0000000000000);
+ int64_t exp80final = (exp80>>52);
+ int64_t mant80 = test.eind.ll&(0x000fffffffffffff);
+ int64_t mant80final = (mant80 << 11);
if (exp80final == 0x7ff) /*Infinity / Nan*/
{
@@ -180,42 +163,42 @@ static inline void x87_st80(double d)
static inline void x87_st_fsave(int reg)
{
- reg = (TOP + reg) & 7;
+ reg = (cpu_state.TOP + reg) & 7;
- if (tag[reg] & TAG_UINT64)
+ if (cpu_state.tag[reg] & TAG_UINT64)
{
- writememl(easeg, cpu_state.eaaddr, ST_i64[reg] & 0xffffffff);
- writememl(easeg, cpu_state.eaaddr + 4, ST_i64[reg] >> 32);
+ writememl(easeg, cpu_state.eaaddr, cpu_state.MM[reg].q & 0xffffffff);
+ writememl(easeg, cpu_state.eaaddr + 4, cpu_state.MM[reg].q >> 32);
writememw(easeg, cpu_state.eaaddr + 8, 0x5555);
}
else
- x87_st80(ST[reg]);
+ x87_st80(cpu_state.ST[reg]);
}
static inline void x87_ld_frstor(int reg)
{
uint16_t temp;
- reg = (TOP + reg) & 7;
+ reg = (cpu_state.TOP + reg) & 7;
temp = readmemw(easeg, cpu_state.eaaddr + 8);
- if (temp == 0x5555 && tag[reg] == 2)
+ if (temp == 0x5555 && cpu_state.tag[reg] == 2)
{
- tag[reg] = TAG_UINT64;
- ST_i64[reg] = readmeml(easeg, cpu_state.eaaddr);
- ST_i64[reg] |= ((uint64_t)readmeml(easeg, cpu_state.eaaddr + 4) << 32);
- ST[reg] = (double)ST_i64[reg];
+ cpu_state.tag[reg] = TAG_UINT64;
+ cpu_state.MM[reg].q = readmeml(easeg, cpu_state.eaaddr);
+ cpu_state.MM[reg].q |= ((uint64_t)readmeml(easeg, cpu_state.eaaddr + 4) << 32);
+ cpu_state.ST[reg] = (double)cpu_state.MM[reg].q;
}
else
- ST[reg] = x87_ld80();
+ cpu_state.ST[reg] = x87_ld80();
}
-static inline void x87_ldmmx(MMX_REG *r)
+static inline void x87_ldmmx(MMX_REG *r, uint16_t *w4)
{
r->l[0] = readmeml(easeg, cpu_state.eaaddr);
r->l[1] = readmeml(easeg, cpu_state.eaaddr + 4);
- r->w[4] = readmemw(easeg, cpu_state.eaaddr + 8);
+ *w4 = readmemw(easeg, cpu_state.eaaddr + 8);
}
static inline void x87_stmmx(MMX_REG r)
diff --git a/src/x87_ops_arith.h b/src/x87_ops_arith.h
index 2cc13f901..48a141e2f 100644
--- a/src/x87_ops_arith.h
+++ b/src/x87_ops_arith.h
@@ -4,13 +4,13 @@ static int opFADD ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
- if ((npxc >> 10) & 3) \
- fesetround(rounding_modes[(npxc >> 10) & 3]); \
+ load_var = get(); if (cpu_state.abrt) return 1; \
+ if ((cpu_state.npxc >> 10) & 3) \
+ fesetround(rounding_modes[(cpu_state.npxc >> 10) & 3]); \
ST(0) += use_var; \
- if ((npxc >> 10) & 3) \
+ if ((cpu_state.npxc >> 10) & 3) \
fesetround(FE_TONEAREST); \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(8); \
return 0; \
} \
@@ -19,9 +19,9 @@ static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
- npxs &= ~(C0|C2|C3); \
- npxs |= x87_compare(ST(0), (double)use_var); \
+ load_var = get(); if (cpu_state.abrt) return 1; \
+ cpu_state.npxs &= ~(C0|C2|C3); \
+ cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
CLOCK_CYCLES(4); \
return 0; \
} \
@@ -30,9 +30,9 @@ static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
- npxs &= ~(C0|C2|C3); \
- npxs |= x87_compare(ST(0), (double)use_var); \
+ load_var = get(); if (cpu_state.abrt) return 1; \
+ cpu_state.npxs &= ~(C0|C2|C3); \
+ cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
x87_pop(); \
CLOCK_CYCLES(4); \
return 0; \
@@ -42,9 +42,9 @@ static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
+ load_var = get(); if (cpu_state.abrt) return 1; \
x87_div(ST(0), ST(0), use_var); \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(73); \
return 0; \
} \
@@ -53,9 +53,9 @@ static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
+ load_var = get(); if (cpu_state.abrt) return 1; \
x87_div(ST(0), use_var, ST(0)); \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(73); \
return 0; \
} \
@@ -64,9 +64,9 @@ static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
+ load_var = get(); if (cpu_state.abrt) return 1; \
ST(0) *= use_var; \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(11); \
return 0; \
} \
@@ -75,9 +75,9 @@ static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
+ load_var = get(); if (cpu_state.abrt) return 1; \
ST(0) -= use_var; \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(8); \
return 0; \
} \
@@ -86,9 +86,9 @@ static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
optype t; \
FP_ENTER(); \
fetch_ea_ ## a_size(fetchdat); \
- load_var = get(); if (abrt) return 1; \
+ load_var = get(); if (cpu_state.abrt) return 1; \
ST(0) = use_var - ST(0); \
- tag[TOP] &= ~TAG_UINT64; \
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64; \
CLOCK_CYCLES(8); \
return 0; \
}
@@ -113,7 +113,7 @@ static int opFADD(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FADD\n");
ST(0) = ST(0) + ST(fetchdat & 7);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -123,7 +123,7 @@ static int opFADDr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FADD\n");
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -133,7 +133,7 @@ static int opFADDP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FADDP\n");
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(8);
return 0;
@@ -144,9 +144,9 @@ static int opFCOM(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FCOM\n");
- npxs &= ~(C0|C2|C3);
- if (ST(0) == ST(fetchdat & 7)) npxs |= C3;
- else if (ST(0) < ST(fetchdat & 7)) npxs |= C0;
+ cpu_state.npxs &= ~(C0|C2|C3);
+ if (ST(0) == ST(fetchdat & 7)) cpu_state.npxs |= C3;
+ else if (ST(0) < ST(fetchdat & 7)) cpu_state.npxs |= C0;
CLOCK_CYCLES(4);
return 0;
}
@@ -156,8 +156,8 @@ static int opFCOMP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FCOMP\n");
- npxs &= ~(C0|C2|C3);
- npxs |= x87_compare(ST(0), ST(fetchdat & 7));
+ cpu_state.npxs &= ~(C0|C2|C3);
+ cpu_state.npxs |= x87_compare(ST(0), ST(fetchdat & 7));
x87_pop();
CLOCK_CYCLES(4);
return 0;
@@ -168,11 +168,11 @@ static int opFCOMPP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FCOMPP\n");
- npxs &= ~(C0|C2|C3);
+ cpu_state.npxs &= ~(C0|C2|C3);
if (*(uint64_t *)&ST(0) == ((uint64_t)1 << 63) && *(uint64_t *)&ST(1) == 0)
- npxs |= C0; /*Nasty hack to fix 80387 detection*/
+ cpu_state.npxs |= C0; /*Nasty hack to fix 80387 detection*/
else
- npxs |= x87_compare(ST(0), ST(1));
+ cpu_state.npxs |= x87_compare(ST(0), ST(1));
x87_pop();
x87_pop();
@@ -184,8 +184,8 @@ static int opFUCOMPP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FUCOMPP\n", easeg, cpu_state.eaaddr);
- npxs &= ~(C0|C2|C3);
- npxs |= x87_ucompare(ST(0), ST(1));
+ cpu_state.npxs &= ~(C0|C2|C3);
+ cpu_state.npxs |= x87_ucompare(ST(0), ST(1));
x87_pop();
x87_pop();
CLOCK_CYCLES(5);
@@ -224,7 +224,7 @@ static int opFDIV(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIV\n");
x87_div(ST(0), ST(0), ST(fetchdat & 7));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(73);
return 0;
}
@@ -234,7 +234,7 @@ static int opFDIVr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIV\n");
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(73);
return 0;
}
@@ -244,7 +244,7 @@ static int opFDIVP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIVP\n");
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(73);
return 0;
@@ -256,7 +256,7 @@ static int opFDIVR(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIVR\n");
x87_div(ST(0), ST(fetchdat&7), ST(0));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(73);
return 0;
}
@@ -266,7 +266,7 @@ static int opFDIVRr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIVR\n");
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(73);
return 0;
}
@@ -276,7 +276,7 @@ static int opFDIVRP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FDIVR\n");
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(73);
return 0;
@@ -288,7 +288,7 @@ static int opFMUL(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FMUL\n");
ST(0) = ST(0) * ST(fetchdat & 7);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(16);
return 0;
}
@@ -298,7 +298,7 @@ static int opFMULr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FMUL\n");
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(16);
return 0;
}
@@ -308,7 +308,7 @@ static int opFMULP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FMULP\n");
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(16);
return 0;
@@ -320,7 +320,7 @@ static int opFSUB(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUB\n");
ST(0) = ST(0) - ST(fetchdat & 7);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -330,7 +330,7 @@ static int opFSUBr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUB\n");
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -340,7 +340,7 @@ static int opFSUBP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUBP\n");
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(8);
return 0;
@@ -352,7 +352,7 @@ static int opFSUBR(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUBR\n");
ST(0) = ST(fetchdat & 7) - ST(0);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -362,7 +362,7 @@ static int opFSUBRr(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUBR\n");
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
CLOCK_CYCLES(8);
return 0;
}
@@ -372,7 +372,7 @@ static int opFSUBRP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSUBRP\n");
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
- tag[(TOP + fetchdat) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(8);
return 0;
@@ -383,8 +383,8 @@ static int opFUCOM(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FUCOM\n");
- npxs &= ~(C0|C2|C3);
- npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
+ cpu_state.npxs &= ~(C0|C2|C3);
+ cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
CLOCK_CYCLES(4);
return 0;
}
@@ -394,8 +394,8 @@ static int opFUCOMP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FUCOMP\n");
- npxs &= ~(C0|C2|C3);
- npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
+ cpu_state.npxs &= ~(C0|C2|C3);
+ cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
x87_pop();
CLOCK_CYCLES(4);
return 0;
diff --git a/src/x87_ops_loadstore.h b/src/x87_ops_loadstore.h
index 4fa64aaa7..ed083b921 100644
--- a/src/x87_ops_loadstore.h
+++ b/src/x87_ops_loadstore.h
@@ -4,7 +4,7 @@ static int opFILDiw_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FILDw %08X:%08X\n", easeg, cpu_state.eaaddr);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", (double)temp);
x87_push((double)temp);
CLOCK_CYCLES(13);
@@ -16,7 +16,7 @@ static int opFILDiw_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FILDw %08X:%08X\n", easeg, cpu_state.eaaddr);
- temp = geteaw(); if (abrt) return 1;
+ temp = geteaw(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", (double)temp);
x87_push((double)temp);
CLOCK_CYCLES(13);
@@ -34,7 +34,7 @@ static int opFISTiw_a16(uint32_t fetchdat)
fatal("FISTw overflow %i\n", temp64);*/
seteaw((int16_t)temp64);
CLOCK_CYCLES(29);
- return abrt;
+ return cpu_state.abrt;
}
static int opFISTiw_a32(uint32_t fetchdat)
{
@@ -47,7 +47,7 @@ static int opFISTiw_a32(uint32_t fetchdat)
fatal("FISTw overflow %i\n", temp64);*/
seteaw((int16_t)temp64);
CLOCK_CYCLES(29);
- return abrt;
+ return cpu_state.abrt;
}
static int opFISTPiw_a16(uint32_t fetchdat)
@@ -59,7 +59,7 @@ static int opFISTPiw_a16(uint32_t fetchdat)
temp64 = x87_fround(ST(0));
/* if (temp64 > 32767 || temp64 < -32768)
fatal("FISTw overflow %i\n", temp64);*/
- seteaw((int16_t)temp64); if (abrt) return 1;
+ seteaw((int16_t)temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(29);
return 0;
@@ -73,7 +73,7 @@ static int opFISTPiw_a32(uint32_t fetchdat)
temp64 = x87_fround(ST(0));
/* if (temp64 > 32767 || temp64 < -32768)
fatal("FISTw overflow %i\n", temp64);*/
- seteaw((int16_t)temp64); if (abrt) return 1;
+ seteaw((int16_t)temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(29);
return 0;
@@ -85,11 +85,11 @@ static int opFILDiq_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FILDl %08X:%08X\n", easeg, cpu_state.eaaddr);
- temp64 = geteaq(); if (abrt) return 1;
+ temp64 = geteaq(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,cpu_state.eaaddr), readmeml(easeg,cpu_state.eaaddr+4));
x87_push((double)temp64);
- ST_i64[TOP] = temp64;
- tag[TOP] |= TAG_UINT64;
+ cpu_state.MM[cpu_state.TOP].q = temp64;
+ cpu_state.tag[cpu_state.TOP] |= TAG_UINT64;
CLOCK_CYCLES(10);
return 0;
@@ -100,11 +100,11 @@ static int opFILDiq_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FILDl %08X:%08X\n", easeg, cpu_state.eaaddr);
- temp64 = geteaq(); if (abrt) return 1;
+ temp64 = geteaq(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f %08X %08X\n", (double)temp64, readmeml(easeg,cpu_state.eaaddr), readmeml(easeg,cpu_state.eaaddr+4));
x87_push((double)temp64);
- ST_i64[TOP] = temp64;
- tag[TOP] |= TAG_UINT64;
+ cpu_state.MM[cpu_state.TOP].q = temp64;
+ cpu_state.tag[cpu_state.TOP] |= TAG_UINT64;
CLOCK_CYCLES(10);
return 0;
@@ -132,7 +132,7 @@ static int FBSTP_a16(uint32_t fetchdat)
}
tempc = (uint8_t)floor(fmod(tempd, 10.0));
if (ST(0) < 0.0) tempc |= 0x80;
- writememb(easeg, cpu_state.eaaddr + 9, tempc); if (abrt) return 1;
+ writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
x87_pop();
return 0;
}
@@ -158,7 +158,7 @@ static int FBSTP_a32(uint32_t fetchdat)
}
tempc = (uint8_t)floor(fmod(tempd, 10.0));
if (ST(0) < 0.0) tempc |= 0x80;
- writememb(easeg, cpu_state.eaaddr + 9, tempc); if (abrt) return 1;
+ writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
x87_pop();
return 0;
}
@@ -169,11 +169,11 @@ static int FISTPiq_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FISTPl %08X:%08X\n", easeg, cpu_state.eaaddr);
- if (tag[TOP] & TAG_UINT64)
- temp64 = ST_i64[TOP];
+ if (cpu_state.tag[cpu_state.TOP] & TAG_UINT64)
+ temp64 = cpu_state.MM[cpu_state.TOP].q;
else
temp64 = x87_fround(ST(0));
- seteaq(temp64); if (abrt) return 1;
+ seteaq(temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(29);
return 0;
@@ -184,11 +184,11 @@ static int FISTPiq_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FISTPl %08X:%08X\n", easeg, cpu_state.eaaddr);
- if (tag[TOP] & TAG_UINT64)
- temp64 = ST_i64[TOP];
+ if (cpu_state.tag[cpu_state.TOP] & TAG_UINT64)
+ temp64 = cpu_state.MM[cpu_state.TOP].q;
else
temp64 = x87_fround(ST(0));
- seteaq(temp64); if (abrt) return 1;
+ seteaq(temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(29);
return 0;
@@ -200,7 +200,7 @@ static int opFILDil_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FILDs %08X:%08X\n", easeg, cpu_state.eaaddr);
- templ = geteal(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
x87_push((double)templ);
CLOCK_CYCLES(9);
@@ -212,7 +212,7 @@ static int opFILDil_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FILDs %08X:%08X\n", easeg, cpu_state.eaaddr);
- templ = geteal(); if (abrt) return 1;
+ templ = geteal(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f %08X %i\n", (double)templ, templ, templ);
x87_push((double)templ);
CLOCK_CYCLES(9);
@@ -230,7 +230,7 @@ static int opFISTil_a16(uint32_t fetchdat)
fatal("FISTl out of range! %i\n", temp64);*/
seteal((int32_t)temp64);
CLOCK_CYCLES(28);
- return abrt;
+ return cpu_state.abrt;
}
static int opFISTil_a32(uint32_t fetchdat)
{
@@ -243,7 +243,7 @@ static int opFISTil_a32(uint32_t fetchdat)
fatal("FISTl out of range! %i\n", temp64);*/
seteal((int32_t)temp64);
CLOCK_CYCLES(28);
- return abrt;
+ return cpu_state.abrt;
}
static int opFISTPil_a16(uint32_t fetchdat)
@@ -255,7 +255,7 @@ static int opFISTPil_a16(uint32_t fetchdat)
temp64 = x87_fround(ST(0));
/* if (temp64 > 2147483647 || temp64 < -2147483647)
fatal("FISTl out of range! %i\n", temp64);*/
- seteal((int32_t)temp64); if (abrt) return 1;
+ seteal((int32_t)temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(28);
return 0;
@@ -269,7 +269,7 @@ static int opFISTPil_a32(uint32_t fetchdat)
temp64 = x87_fround(ST(0));
/* if (temp64 > 2147483647 || temp64 < -2147483647)
fatal("FISTl out of range! %i\n", temp64);*/
- seteal((int32_t)temp64); if (abrt) return 1;
+ seteal((int32_t)temp64); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(28);
return 0;
@@ -281,7 +281,7 @@ static int opFLDe_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FLDe %08X:%08X\n", easeg, cpu_state.eaaddr);
- t=x87_ld80(); if (abrt) return 1;
+ t=x87_ld80(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", t);
x87_push(t);
CLOCK_CYCLES(6);
@@ -293,7 +293,7 @@ static int opFLDe_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FLDe %08X:%08X\n", easeg, cpu_state.eaaddr);
- t=x87_ld80(); if (abrt) return 1;
+ t=x87_ld80(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", t);
x87_push(t);
CLOCK_CYCLES(6);
@@ -305,7 +305,7 @@ static int opFSTPe_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, cpu_state.eaaddr);
- x87_st80(ST(0)); if (abrt) return 1;
+ x87_st80(ST(0)); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(6);
return 0;
@@ -315,7 +315,7 @@ static int opFSTPe_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FSTPe %08X:%08X\n", easeg, cpu_state.eaaddr);
- x87_st80(ST(0)); if (abrt) return 1;
+ x87_st80(ST(0)); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(6);
return 0;
@@ -327,7 +327,7 @@ static int opFLDd_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FLDd %08X:%08X\n", easeg, cpu_state.eaaddr);
- t.i = geteaq(); if (abrt) return 1;
+ t.i = geteaq(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", t.d);
x87_push(t.d);
CLOCK_CYCLES(3);
@@ -339,7 +339,7 @@ static int opFLDd_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FLDd %08X:%08X\n", easeg, cpu_state.eaaddr);
- t.i = geteaq(); if (abrt) return 1;
+ t.i = geteaq(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", t.d);
x87_push(t.d);
CLOCK_CYCLES(3);
@@ -355,7 +355,7 @@ static int opFSTd_a16(uint32_t fetchdat)
t.d = ST(0);
seteaq(t.i);
CLOCK_CYCLES(8);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTd_a32(uint32_t fetchdat)
{
@@ -366,7 +366,7 @@ static int opFSTd_a32(uint32_t fetchdat)
t.d = ST(0);
seteaq(t.i);
CLOCK_CYCLES(8);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTPd_a16(uint32_t fetchdat)
@@ -377,7 +377,7 @@ static int opFSTPd_a16(uint32_t fetchdat)
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 7);
if (fplog) pclog("FSTd %08X:%08X\n", easeg, cpu_state.eaaddr);
t.d = ST(0);
- seteaq(t.i); if (abrt) return 1;
+ seteaq(t.i); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(8);
return 0;
@@ -390,7 +390,7 @@ static int opFSTPd_a32(uint32_t fetchdat)
CHECK_WRITE(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 7);
if (fplog) pclog("FSTd %08X:%08X\n", easeg, cpu_state.eaaddr);
t.d = ST(0);
- seteaq(t.i); if (abrt) return 1;
+ seteaq(t.i); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(8);
return 0;
@@ -402,7 +402,7 @@ static int opFLDs_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FLDs %08X:%08X\n", easeg, cpu_state.eaaddr);
- ts.i = geteal(); if (abrt) return 1;
+ ts.i = geteal(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", ts.s);
x87_push((double)ts.s);
CLOCK_CYCLES(3);
@@ -414,7 +414,7 @@ static int opFLDs_a32(uint32_t fetchdat)
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FLDs %08X:%08X\n", easeg, cpu_state.eaaddr);
- ts.i = geteal(); if (abrt) return 1;
+ ts.i = geteal(); if (cpu_state.abrt) return 1;
if (fplog) pclog(" %f\n", ts.s);
x87_push((double)ts.s);
CLOCK_CYCLES(3);
@@ -430,7 +430,7 @@ static int opFSTs_a16(uint32_t fetchdat)
ts.s = (float)ST(0);
seteal(ts.i);
CLOCK_CYCLES(7);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTs_a32(uint32_t fetchdat)
{
@@ -441,7 +441,7 @@ static int opFSTs_a32(uint32_t fetchdat)
ts.s = (float)ST(0);
seteal(ts.i);
CLOCK_CYCLES(7);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTPs_a16(uint32_t fetchdat)
@@ -451,7 +451,7 @@ static int opFSTPs_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (fplog) pclog("FSTs %08X:%08X\n", easeg, cpu_state.eaaddr);
ts.s = (float)ST(0);
- seteal(ts.i); if (abrt) return 1;
+ seteal(ts.i); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(7);
return 0;
@@ -463,7 +463,7 @@ static int opFSTPs_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (fplog) pclog("FSTs %08X:%08X\n", easeg, cpu_state.eaaddr);
ts.s = (float)ST(0);
- seteal(ts.i); if (abrt) return 1;
+ seteal(ts.i); if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(7);
return 0;
diff --git a/src/x87_ops_misc.h b/src/x87_ops_misc.h
index 7fc1cb0ed..dbd17af19 100644
--- a/src/x87_ops_misc.h
+++ b/src/x87_ops_misc.h
@@ -3,7 +3,7 @@ static int opFSTSW_AX(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FSTSW\n");
- AX = npxs;
+ AX = cpu_state.npxs;
CLOCK_CYCLES(3);
return 0;
}
@@ -22,7 +22,7 @@ static int opFCLEX(uint32_t fetchdat)
{
FP_ENTER();
cpu_state.pc++;
- npxs &= 0xff00;
+ cpu_state.npxs &= 0xff00;
CLOCK_CYCLES(4);
return 0;
}
@@ -31,10 +31,10 @@ static int opFINIT(uint32_t fetchdat)
{
FP_ENTER();
cpu_state.pc++;
- npxc = 0x37F;
- npxs = 0;
- *(uint64_t *)tag = 0x0303030303030303ll;
- TOP = 0;
+ cpu_state.npxc = 0x37F;
+ cpu_state.npxs = 0;
+ *(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
+ cpu_state.TOP = 0;
CLOCK_CYCLES(17);
return 0;
}
@@ -45,7 +45,7 @@ static int opFFREE(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FFREE\n");
- tag[(TOP + fetchdat) & 7] = 3;
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3;
CLOCK_CYCLES(3);
return 0;
}
@@ -54,8 +54,8 @@ static int opFFREEP(uint32_t fetchdat)
{
FP_ENTER();
cpu_state.pc++;
- if (fplog) pclog("FFREEP\n");
- tag[(TOP + fetchdat) & 7] = 3; if (abrt) return 1;
+ if (fplog) pclog("FFREE\n");
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3; if (cpu_state.abrt) return 1;
x87_pop();
CLOCK_CYCLES(3);
return 0;
@@ -67,7 +67,7 @@ static int opFST(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FST\n");
ST(fetchdat & 7) = ST(0);
- tag[(TOP + fetchdat) & 7] = tag[TOP & 7];
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
CLOCK_CYCLES(3);
return 0;
}
@@ -79,7 +79,7 @@ static int opFSTP(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSTP\n");
ST(fetchdat & 7) = ST(0);
- tag[(TOP + fetchdat) & 7] = tag[TOP & 7];
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
x87_pop();
CLOCK_CYCLES(3);
return 0;
@@ -95,82 +95,82 @@ static int FSTOR()
{
case 0x000: /*16-bit real mode*/
case 0x001: /*16-bit protected mode*/
- npxc = readmemw(easeg, cpu_state.eaaddr);
- npxs = readmemw(easeg, cpu_state.eaaddr+2);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+2);
x87_settag(readmemw(easeg, cpu_state.eaaddr+4));
- TOP = (npxs >> 11) & 7;
+ cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
cpu_state.eaaddr += 14;
break;
case 0x100: /*32-bit real mode*/
case 0x101: /*32-bit protected mode*/
- npxc = readmemw(easeg, cpu_state.eaaddr);
- npxs = readmemw(easeg, cpu_state.eaaddr+4);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+4);
x87_settag(readmemw(easeg, cpu_state.eaaddr+8));
- TOP = (npxs >> 11) & 7;
+ cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
cpu_state.eaaddr += 28;
break;
}
- x87_ldmmx(&MM[0]); x87_ld_frstor(0); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[1]); x87_ld_frstor(1); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[2]); x87_ld_frstor(2); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[3]); x87_ld_frstor(3); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[4]); x87_ld_frstor(4); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[5]); x87_ld_frstor(5); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[6]); x87_ld_frstor(6); cpu_state.eaaddr += 10;
- x87_ldmmx(&MM[7]); x87_ld_frstor(7);
+ x87_ldmmx(&cpu_state.MM[0], &cpu_state.MM_w4[0]); x87_ld_frstor(0); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[1], &cpu_state.MM_w4[1]); x87_ld_frstor(1); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[2], &cpu_state.MM_w4[2]); x87_ld_frstor(2); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[3], &cpu_state.MM_w4[3]); x87_ld_frstor(3); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[4], &cpu_state.MM_w4[4]); x87_ld_frstor(4); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[5], &cpu_state.MM_w4[5]); x87_ld_frstor(5); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[6], &cpu_state.MM_w4[6]); x87_ld_frstor(6); cpu_state.eaaddr += 10;
+ x87_ldmmx(&cpu_state.MM[7], &cpu_state.MM_w4[7]); x87_ld_frstor(7);
- ismmx = 0;
+ cpu_state.ismmx = 0;
/*Horrible hack, but as PCem doesn't keep the FPU stack in 80-bit precision at all times
something like this is needed*/
- if (MM[0].w[4] == 0xffff && MM[1].w[4] == 0xffff && MM[2].w[4] == 0xffff && MM[3].w[4] == 0xffff &&
- MM[4].w[4] == 0xffff && MM[5].w[4] == 0xffff && MM[6].w[4] == 0xffff && MM[7].w[4] == 0xffff &&
- !TOP && !(*(uint64_t *)tag))
- ismmx = 1;
+ if (cpu_state.MM_w4[0] == 0xffff && cpu_state.MM_w4[1] == 0xffff && cpu_state.MM_w4[2] == 0xffff && cpu_state.MM_w4[3] == 0xffff &&
+ cpu_state.MM_w4[4] == 0xffff && cpu_state.MM_w4[5] == 0xffff && cpu_state.MM_w4[6] == 0xffff && cpu_state.MM_w4[7] == 0xffff &&
+ !cpu_state.TOP && !(*(uint64_t *)cpu_state.tag))
+ cpu_state.ismmx = 1;
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
- if (fplog) pclog("FRSTOR %08X:%08X %i %i %04X\n", easeg, cpu_state.eaaddr, ismmx, TOP, x87_gettag());
- return abrt;
+ if (fplog) pclog("FRSTOR %08X:%08X %i %i %04X\n", easeg, cpu_state.eaaddr, cpu_state.ismmx, cpu_state.TOP, x87_gettag());
+ return cpu_state.abrt;
}
static int opFSTOR_a16(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_16(fetchdat);
FSTOR();
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTOR_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
FSTOR();
- return abrt;
+ return cpu_state.abrt;
}
static int FSAVE()
{
FP_ENTER();
- if (fplog) pclog("FSAVE %08X:%08X %i\n", easeg, cpu_state.eaaddr, ismmx);
- npxs = (npxs & ~(7 << 11)) | (TOP << 11);
+ if (fplog) pclog("FSAVE %08X:%08X %i\n", easeg, cpu_state.eaaddr, cpu_state.ismmx);
+ cpu_state.npxs = (cpu_state.npxs & ~(7 << 11)) | (cpu_state.TOP << 11);
switch ((cr0 & 1) | (cpu_state.op32 & 0x100))
{
case 0x000: /*16-bit real mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+4,x87_gettag());
writememw(easeg,cpu_state.eaaddr+6,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+10,x87_op_off);
cpu_state.eaaddr+=14;
- if (ismmx)
+ if (cpu_state.ismmx)
{
- x87_stmmx(MM[0]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[1]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[2]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[3]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[4]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[5]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[6]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[7]);
+ x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[7]);
}
else
{
@@ -185,24 +185,24 @@ static int FSAVE()
}
break;
case 0x001: /*16-bit protected mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+4,x87_gettag());
writememw(easeg,cpu_state.eaaddr+6,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+8,x87_pc_seg);
writememw(easeg,cpu_state.eaaddr+10,x87_op_off);
writememw(easeg,cpu_state.eaaddr+12,x87_op_seg);
cpu_state.eaaddr+=14;
- if (ismmx)
+ if (cpu_state.ismmx)
{
- x87_stmmx(MM[0]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[1]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[2]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[3]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[4]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[5]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[6]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[7]);
+ x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[7]);
}
else
{
@@ -217,23 +217,23 @@ static int FSAVE()
}
break;
case 0x100: /*32-bit real mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+4,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+8,x87_gettag());
writememw(easeg,cpu_state.eaaddr+12,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+20,x87_op_off);
writememl(easeg,cpu_state.eaaddr+24,(x87_op_off>>16)<<12);
cpu_state.eaaddr+=28;
- if (ismmx)
+ if (cpu_state.ismmx)
{
- x87_stmmx(MM[0]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[1]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[2]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[3]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[4]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[5]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[6]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[7]);
+ x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[7]);
}
else
{
@@ -248,24 +248,24 @@ static int FSAVE()
}
break;
case 0x101: /*32-bit protected mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+4,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+8,x87_gettag());
writememl(easeg,cpu_state.eaaddr+12,x87_pc_off);
writememl(easeg,cpu_state.eaaddr+16,x87_pc_seg);
writememl(easeg,cpu_state.eaaddr+20,x87_op_off);
writememl(easeg,cpu_state.eaaddr+24,x87_op_seg);
cpu_state.eaaddr+=28;
- if (ismmx)
+ if (cpu_state.ismmx)
{
- x87_stmmx(MM[0]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[1]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[2]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[3]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[4]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[5]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[6]); cpu_state.eaaddr+=10;
- x87_stmmx(MM[7]);
+ x87_stmmx(cpu_state.MM[0]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[1]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[2]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[3]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[4]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[5]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[6]); cpu_state.eaaddr+=10;
+ x87_stmmx(cpu_state.MM[7]);
}
else
{
@@ -281,21 +281,21 @@ static int FSAVE()
break;
}
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSAVE_a16(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_16(fetchdat);
FSAVE();
- return abrt;
+ return cpu_state.abrt;
}
static int opFSAVE_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
FSAVE();
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTSW_a16(uint32_t fetchdat)
@@ -303,18 +303,18 @@ static int opFSTSW_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, cpu_state.eaaddr);
- seteaw((npxs & 0xC7FF) | (TOP << 11));
+ seteaw((cpu_state.npxs & 0xC7FF) | (cpu_state.TOP << 11));
CLOCK_CYCLES(3);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTSW_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FSTSW %08X:%08X\n", easeg, cpu_state.eaaddr);
- seteaw((npxs & 0xC7FF) | (TOP << 11));
+ seteaw((cpu_state.npxs & 0xC7FF) | (cpu_state.TOP << 11));
CLOCK_CYCLES(3);
- return abrt;
+ return cpu_state.abrt;
}
@@ -326,11 +326,11 @@ static int opFLD(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FLD %f\n", ST(fetchdat & 7));
- old_tag = tag[(TOP + fetchdat) & 7];
- old_i64 = ST_i64[(TOP + fetchdat) & 7];
+ old_tag = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7];
+ old_i64 = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q;
x87_push(ST(fetchdat&7));
- tag[TOP] = old_tag;
- ST_i64[TOP] = old_i64;
+ cpu_state.tag[cpu_state.TOP] = old_tag;
+ cpu_state.MM[cpu_state.TOP].q = old_i64;
CLOCK_CYCLES(4);
return 0;
}
@@ -346,12 +346,12 @@ static int opFXCH(uint32_t fetchdat)
td = ST(0);
ST(0) = ST(fetchdat&7);
ST(fetchdat&7) = td;
- old_tag = tag[TOP];
- tag[TOP] = tag[(TOP + fetchdat) & 7];
- tag[(TOP + fetchdat) & 7] = old_tag;
- old_i64 = ST_i64[TOP];
- ST_i64[TOP] = ST_i64[(TOP + fetchdat) & 7];
- ST_i64[(TOP + fetchdat) & 7] = old_i64;
+ old_tag = cpu_state.tag[cpu_state.TOP];
+ cpu_state.tag[cpu_state.TOP] = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7];
+ cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = old_tag;
+ old_i64 = cpu_state.MM[cpu_state.TOP].q;
+ cpu_state.MM[cpu_state.TOP].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q;
+ cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q = old_i64;
CLOCK_CYCLES(4);
return 0;
@@ -363,7 +363,7 @@ static int opFCHS(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FCHS\n");
ST(0) = -ST(0);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(6);
return 0;
}
@@ -374,7 +374,7 @@ static int opFABS(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FABS %f\n", ST(0));
ST(0) = fabs(ST(0));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(3);
return 0;
}
@@ -384,9 +384,9 @@ static int opFTST(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FTST\n");
- npxs &= ~(C0|C2|C3);
- if (ST(0) == 0.0) npxs |= C3;
- else if (ST(0) < 0.0) npxs |= C0;
+ cpu_state.npxs &= ~(C0|C2|C3);
+ if (ST(0) == 0.0) cpu_state.npxs |= C3;
+ else if (ST(0) < 0.0) cpu_state.npxs |= C0;
CLOCK_CYCLES(4);
return 0;
}
@@ -395,12 +395,12 @@ static int opFXAM(uint32_t fetchdat)
{
FP_ENTER();
cpu_state.pc++;
- if (fplog) pclog("FXAM %i %f\n", tag[TOP&7], ST(0));
- npxs &= ~(C0|C1|C2|C3);
- if (tag[TOP&7] == 3) npxs |= (C0|C3);
- else if (ST(0) == 0.0) npxs |= C3;
- else npxs |= C2;
- if (ST(0) < 0.0) npxs |= C1;
+ if (fplog) pclog("FXAM %i %f\n", cpu_state.tag[cpu_state.TOP&7], ST(0));
+ cpu_state.npxs &= ~(C0|C1|C2|C3);
+ if (cpu_state.tag[cpu_state.TOP&7] == 3) cpu_state.npxs |= (C0|C3);
+ else if (ST(0) == 0.0) cpu_state.npxs |= C3;
+ else cpu_state.npxs |= C2;
+ if (ST(0) < 0.0) cpu_state.npxs |= C1;
CLOCK_CYCLES(8);
return 0;
}
@@ -471,7 +471,7 @@ static int opFLDZ(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FLDZ\n");
x87_push(0.0);
- tag[TOP&7] = 1;
+ cpu_state.tag[cpu_state.TOP&7] = 1;
CLOCK_CYCLES(4);
return 0;
}
@@ -482,7 +482,7 @@ static int opF2XM1(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("F2XM1\n");
ST(0) = pow(2.0, ST(0)) - 1.0;
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(200);
return 0;
}
@@ -493,7 +493,7 @@ static int opFYL2X(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FYL2X\n");
ST(1) = ST(1) * (log(ST(0)) / log(2.0));
- tag[(TOP + 1) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + 1) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(250);
return 0;
@@ -505,7 +505,7 @@ static int opFYL2XP1(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FYL2XP1\n");
ST(1) = ST(1) * (log(ST(0)+1.0) / log(2.0));
- tag[(TOP + 1) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + 1) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(250);
return 0;
@@ -517,9 +517,9 @@ static int opFPTAN(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FPTAN\n");
ST(0) = tan(ST(0));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
x87_push(1.0);
- npxs &= ~C2;
+ cpu_state.npxs &= ~C2;
CLOCK_CYCLES(235);
return 0;
}
@@ -530,7 +530,7 @@ static int opFPATAN(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FPATAN\n");
ST(1) = atan2(ST(1), ST(0));
- tag[(TOP + 1) & 7] &= ~TAG_UINT64;
+ cpu_state.tag[(cpu_state.TOP + 1) & 7] &= ~TAG_UINT64;
x87_pop();
CLOCK_CYCLES(250);
return 0;
@@ -541,7 +541,7 @@ static int opFDECSTP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FDECSTP\n");
- TOP = (TOP - 1) & 7;
+ cpu_state.TOP = (cpu_state.TOP - 1) & 7;
CLOCK_CYCLES(4);
return 0;
}
@@ -551,7 +551,7 @@ static int opFINCSTP(uint32_t fetchdat)
FP_ENTER();
cpu_state.pc++;
if (fplog) pclog("FDECSTP\n");
- TOP = (TOP + 1) & 7;
+ cpu_state.TOP = (cpu_state.TOP + 1) & 7;
CLOCK_CYCLES(4);
return 0;
}
@@ -564,12 +564,12 @@ static int opFPREM(uint32_t fetchdat)
if (fplog) pclog("FPREM %f %f ", ST(0), ST(1));
temp64 = (int64_t)(ST(0) / ST(1));
ST(0) = ST(0) - (ST(1) * (double)temp64);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
if (fplog) pclog("%f\n", ST(0));
- npxs &= ~(C0|C1|C2|C3);
- if (temp64 & 4) npxs|=C0;
- if (temp64 & 2) npxs|=C3;
- if (temp64 & 1) npxs|=C1;
+ cpu_state.npxs &= ~(C0|C1|C2|C3);
+ if (temp64 & 4) cpu_state.npxs|=C0;
+ if (temp64 & 2) cpu_state.npxs|=C3;
+ if (temp64 & 1) cpu_state.npxs|=C1;
CLOCK_CYCLES(100);
return 0;
}
@@ -581,12 +581,12 @@ static int opFPREM1(uint32_t fetchdat)
if (fplog) pclog("FPREM1 %f %f ", ST(0), ST(1));
temp64 = (int64_t)(ST(0) / ST(1));
ST(0) = ST(0) - (ST(1) * (double)temp64);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
if (fplog) pclog("%f\n", ST(0));
- npxs &= ~(C0|C1|C2|C3);
- if (temp64 & 4) npxs|=C0;
- if (temp64 & 2) npxs|=C3;
- if (temp64 & 1) npxs|=C1;
+ cpu_state.npxs &= ~(C0|C1|C2|C3);
+ if (temp64 & 4) cpu_state.npxs|=C0;
+ if (temp64 & 2) cpu_state.npxs|=C3;
+ if (temp64 & 1) cpu_state.npxs|=C1;
CLOCK_CYCLES(100);
return 0;
}
@@ -597,7 +597,7 @@ static int opFSQRT(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSQRT\n");
ST(0) = sqrt(ST(0));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(83);
return 0;
}
@@ -610,9 +610,9 @@ static int opFSINCOS(uint32_t fetchdat)
if (fplog) pclog("FSINCOS\n");
td = ST(0);
ST(0) = sin(td);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
x87_push(cos(td));
- npxs &= ~C2;
+ cpu_state.npxs &= ~C2;
CLOCK_CYCLES(330);
return 0;
}
@@ -623,7 +623,7 @@ static int opFRNDINT(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FRNDINT %g ", ST(0));
ST(0) = (double)x87_fround(ST(0));
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
if (fplog) pclog("%g\n", ST(0));
CLOCK_CYCLES(21);
return 0;
@@ -637,7 +637,7 @@ static int opFSCALE(uint32_t fetchdat)
if (fplog) pclog("FSCALE\n");
temp64 = (int64_t)ST(1);
ST(0) = ST(0) * pow(2.0, (double)temp64);
- tag[TOP] &= ~TAG_UINT64;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
CLOCK_CYCLES(30);
return 0;
}
@@ -648,8 +648,8 @@ static int opFSIN(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FSIN\n");
ST(0) = sin(ST(0));
- tag[TOP] &= ~TAG_UINT64;
- npxs &= ~C2;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
+ cpu_state.npxs &= ~C2;
CLOCK_CYCLES(300);
return 0;
}
@@ -660,8 +660,8 @@ static int opFCOS(uint32_t fetchdat)
cpu_state.pc++;
if (fplog) pclog("FCOS\n");
ST(0) = cos(ST(0));
- tag[TOP] &= ~TAG_UINT64;
- npxs &= ~C2;
+ cpu_state.tag[cpu_state.TOP] &= ~TAG_UINT64;
+ cpu_state.npxs &= ~C2;
CLOCK_CYCLES(300);
return 0;
}
@@ -675,21 +675,21 @@ static int FLDENV()
{
case 0x000: /*16-bit real mode*/
case 0x001: /*16-bit protected mode*/
- npxc = readmemw(easeg, cpu_state.eaaddr);
- npxs = readmemw(easeg, cpu_state.eaaddr+2);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+2);
x87_settag(readmemw(easeg, cpu_state.eaaddr+4));
- TOP = (npxs >> 11) & 7;
+ cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
break;
case 0x100: /*32-bit real mode*/
case 0x101: /*32-bit protected mode*/
- npxc = readmemw(easeg, cpu_state.eaaddr);
- npxs = readmemw(easeg, cpu_state.eaaddr+4);
+ cpu_state.npxc = readmemw(easeg, cpu_state.eaaddr);
+ cpu_state.npxs = readmemw(easeg, cpu_state.eaaddr+4);
x87_settag(readmemw(easeg, cpu_state.eaaddr+8));
- TOP = (npxs >> 11) & 7;
+ cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
break;
}
CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
- return abrt;
+ return cpu_state.abrt;
}
static int opFLDENV_a16(uint32_t fetchdat)
@@ -697,14 +697,14 @@ static int opFLDENV_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
FLDENV();
- return abrt;
+ return cpu_state.abrt;
}
static int opFLDENV_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
FLDENV();
- return abrt;
+ return cpu_state.abrt;
}
static int opFLDCW_a16(uint32_t fetchdat)
@@ -714,8 +714,8 @@ static int opFLDCW_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
if (fplog) pclog("FLDCW %08X:%08X\n", easeg, cpu_state.eaaddr);
tempw = geteaw();
- if (abrt) return 1;
- npxc = tempw;
+ if (cpu_state.abrt) return 1;
+ cpu_state.npxc = tempw;
CLOCK_CYCLES(4);
return 0;
}
@@ -726,8 +726,8 @@ static int opFLDCW_a32(uint32_t fetchdat)
fetch_ea_32(fetchdat);
if (fplog) pclog("FLDCW %08X:%08X\n", easeg, cpu_state.eaaddr);
tempw = geteaw();
- if (abrt) return 1;
- npxc = tempw;
+ if (cpu_state.abrt) return 1;
+ cpu_state.npxc = tempw;
CLOCK_CYCLES(4);
return 0;
}
@@ -739,15 +739,15 @@ static int FSTENV()
switch ((cr0 & 1) | (cpu_state.op32 & 0x100))
{
case 0x000: /*16-bit real mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+4,x87_gettag());
writememw(easeg,cpu_state.eaaddr+6,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+10,x87_op_off);
break;
case 0x001: /*16-bit protected mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+2,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+2,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+4,x87_gettag());
writememw(easeg,cpu_state.eaaddr+6,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+8,x87_pc_seg);
@@ -755,16 +755,16 @@ static int FSTENV()
writememw(easeg,cpu_state.eaaddr+12,x87_op_seg);
break;
case 0x100: /*32-bit real mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+4,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+8,x87_gettag());
writememw(easeg,cpu_state.eaaddr+12,x87_pc_off);
writememw(easeg,cpu_state.eaaddr+20,x87_op_off);
writememl(easeg,cpu_state.eaaddr+24,(x87_op_off>>16)<<12);
break;
case 0x101: /*32-bit protected mode*/
- writememw(easeg,cpu_state.eaaddr,npxc);
- writememw(easeg,cpu_state.eaaddr+4,npxs);
+ writememw(easeg,cpu_state.eaaddr,cpu_state.npxc);
+ writememw(easeg,cpu_state.eaaddr+4,cpu_state.npxs);
writememw(easeg,cpu_state.eaaddr+8,x87_gettag());
writememl(easeg,cpu_state.eaaddr+12,x87_pc_off);
writememl(easeg,cpu_state.eaaddr+16,x87_pc_seg);
@@ -773,7 +773,7 @@ static int FSTENV()
break;
}
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTENV_a16(uint32_t fetchdat)
@@ -781,14 +781,14 @@ static int opFSTENV_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
FSTENV();
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTENV_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
FSTENV();
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTCW_a16(uint32_t fetchdat)
@@ -796,18 +796,18 @@ static int opFSTCW_a16(uint32_t fetchdat)
FP_ENTER();
fetch_ea_16(fetchdat);
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, cpu_state.eaaddr);
- seteaw(npxc);
+ seteaw(cpu_state.npxc);
CLOCK_CYCLES(3);
- return abrt;
+ return cpu_state.abrt;
}
static int opFSTCW_a32(uint32_t fetchdat)
{
FP_ENTER();
fetch_ea_32(fetchdat);
if (fplog) pclog("FSTCW %08X:%08X\n", easeg, cpu_state.eaaddr);
- seteaw(npxc);
+ seteaw(cpu_state.npxc);
CLOCK_CYCLES(3);
- return abrt;
+ return cpu_state.abrt;
}
#define opFCMOV(condition) \
@@ -818,8 +818,8 @@ static int opFSTCW_a32(uint32_t fetchdat)
if (fplog) pclog("FCMOV %f\n", ST(fetchdat & 7)); \
if (cond_ ## condition) \
{ \
- tag[TOP] = tag[(TOP + fetchdat) & 7]; \
- ST_i64[TOP] = ST_i64[(TOP + fetchdat) & 7]; \
+ cpu_state.tag[cpu_state.TOP] = cpu_state.tag[(cpu_state.TOP + fetchdat) & 7]; \
+ cpu_state.MM[cpu_state.TOP].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; \
ST(0) = ST(fetchdat & 7); \
} \
CLOCK_CYCLES(4); \