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