Minor memory optimisations.

This commit is contained in:
TomW 2014-06-07 15:57:57 +01:00
commit 9ba75bd910
5 changed files with 46 additions and 90 deletions

View file

@ -55,16 +55,14 @@ int cgate32;
#undef writememb #undef writememb
#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a):ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]) #define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a): *(uint8_t *)(readlookup2[((s)+(a))>>12] + (s) + (a)) )
#define writememb(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememb386l(s,a,v); else ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]=v #define writememb(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememb386l(s,a,v); else *(uint8_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
#define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE) writememwl(s,a,v); else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v #define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE) writememwl(s,a,v); else *(uint16_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
#define writememl(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC) writememll(s,a,v); else *((uint32_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v #define writememl(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC) writememll(s,a,v); else *(uint32_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
uint32_t mmucache[0x100000];
uint8_t romext[32768]; uint8_t romext[32768];
uint8_t *ram,*rom; uint8_t *ram,*rom;
uint16_t biosmask; uint16_t biosmask;
@ -194,7 +192,7 @@ static inline uint32_t geteal_mem()
return readmeml(easeg,eaaddr); return readmeml(easeg,eaaddr);
} }
#define seteab(v) if (mod!=3) { /*if (eal_w) *(uint8_t *)eal_w=v; else */writememb386l(easeg,eaaddr,v); } else if (rm&4) regs[rm&3].b.h=v; else regs[rm].b.l=v #define seteab(v) if (mod!=3) { if (eal_w) *(uint8_t *)eal_w=v; else writememb386l(easeg,eaaddr,v); } else if (rm&4) regs[rm&3].b.h=v; else regs[rm].b.l=v
#define seteaw(v) if (mod!=3) { if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg,eaaddr,v); } else regs[rm].w=v #define seteaw(v) if (mod!=3) { if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg,eaaddr,v); } else regs[rm].w=v
#define seteal(v) if (mod!=3) { if (eal_w) *eal_w=v; else writememll(easeg,eaaddr,v); } else regs[rm].l=v #define seteal(v) if (mod!=3) { if (eal_w) *eal_w=v; else writememll(easeg,eaaddr,v); } else regs[rm].l=v
@ -269,9 +267,9 @@ static inline void fetch_ea_32_long(uint32_t rmdat)
if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC) if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC)
{ {
if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF) if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
eal_r = (uint32_t *)&ram[ readlookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)]; eal_r = (uint32_t *)(readlookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF) if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
eal_w = (uint32_t *)&ram[writelookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)]; eal_w = (uint32_t *)(writelookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
} }
} }
@ -307,9 +305,9 @@ static inline void fetch_ea_16_long(uint32_t rmdat)
if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC) if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC)
{ {
if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF) if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
eal_r = (uint32_t *)&ram[ readlookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)]; eal_r = (uint32_t *)(readlookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF) if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
eal_w = (uint32_t *)&ram[writelookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)]; eal_w = (uint32_t *)(writelookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
} }
} }

View file

@ -43,20 +43,20 @@ uint8_t readmemb(uint32_t a)
{ {
if (a!=(cs+pc)) memcycs+=4; if (a!=(cs+pc)) memcycs+=4;
if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a); if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a);
else return ram[readlookup2[(a)>>12]+((a)&0xFFF)]; else return *(uint8_t *)(readlookup2[(a) >> 12] + (a));
} }
uint8_t readmembf(uint32_t a) uint8_t readmembf(uint32_t a)
{ {
if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a); if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a);
else return ram[readlookup2[(a)>>12]+((a)&0xFFF)]; else return *(uint8_t *)(readlookup2[(a) >> 12] + (a));
} }
uint16_t readmemw(uint32_t s, uint16_t a) uint16_t readmemw(uint32_t s, uint16_t a)
{ {
if (a!=(cs+pc)) memcycs+=(8>>is8086); if (a!=(cs+pc)) memcycs+=(8>>is8086);
if ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)) return readmemwl(s,a); if ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)) return readmemwl(s,a);
else return *((uint16_t *)(&ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)])); else return *(uint16_t *)(readlookup2[(s + a) >> 12] + s + a);
} }
void refreshread() { /*pclog("Refreshread\n"); */FETCHCOMPLETE(); memcycs+=4; } void refreshread() { /*pclog("Refreshread\n"); */FETCHCOMPLETE(); memcycs+=4; }
@ -73,20 +73,20 @@ void writememb(uint32_t a, uint8_t v)
{ {
memcycs+=4; memcycs+=4;
if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v);
else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v; else *(uint8_t *)(writelookup2[a >> 12] + a) = v;
} }
void writememwl(uint32_t seg, uint32_t addr, uint16_t val); void writememwl(uint32_t seg, uint32_t addr, uint16_t val);
void writememw(uint32_t s, uint32_t a, uint16_t v) void writememw(uint32_t s, uint32_t a, uint16_t v)
{ {
memcycs+=(8>>is8086); memcycs+=(8>>is8086);
if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v); if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v);
else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v; else *(uint16_t *)(writelookup2[(s + a) >> 12] + s + a) = v;
} }
void writememll(uint32_t seg, uint32_t addr, uint32_t val); void writememll(uint32_t seg, uint32_t addr, uint32_t val);
void writememl(uint32_t s, uint32_t a, uint32_t v) void writememl(uint32_t s, uint32_t a, uint32_t v)
{ {
if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememll(s,a,v); if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememll(s,a,v);
else *((uint32_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v; else *(uint32_t *)(writelookup2[(s + a) >> 12] + s + a) = v;
} }
@ -614,11 +614,6 @@ chdir(pcempath);
} }
printf("Entries in readlookup : %i writelookup : %i\n",d,e); printf("Entries in readlookup : %i writelookup : %i\n",d,e);
x87_dumpregs(); x87_dumpregs();
/* for (c=0;c<1024*1024;c++)
{
if (mmucache[c]!=0xFFFFFFFF) d++;
}
printf("Entries in MMU cache : %i\n",d);*/
indump = 0; indump = 0;
} }
@ -642,7 +637,6 @@ void resetx86()
idt.base = 0; idt.base = 0;
flags=2; flags=2;
makeznptable(); makeznptable();
initmmucache();
resetreadlookup(); resetreadlookup();
makemod1table(); makemod1table();
resetmcr(); resetmcr();

View file

@ -17,9 +17,9 @@ int writelnext;
extern int mmu_perm; extern int mmu_perm;
#define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):ram[readlookup2[(a)>>12]+((a)&0xFFF)]) #define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
#define readmemw(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE)?readmemwl(s,a):*((uint16_t *)(&ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))) #define readmemw(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE)?readmemwl(s,a):*(uint16_t *)(readlookup2[((s)+(a))>>12]+(s)+(a)))
#define readmeml(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC)?readmemll(s,a):*((uint32_t *)(&ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))) #define readmeml(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC)?readmemll(s,a):*(uint32_t *)(readlookup2[((s)+(a))>>12]+(s)+(a)))
//#define writememb(a,v) if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v //#define writememb(a,v) if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v
//#define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v); else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v //#define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v); else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v

View file

@ -424,20 +424,8 @@ int loadbios()
uint32_t mmucache[0x100000];
int mmucaches[64];
int mmunext=0;
int abrt=0; int abrt=0;
void initmmucache()
{
int c;
// if (output) pclog("initmmucache\n");
memset(mmucache,0xFF,sizeof(mmucache));
for (c=0;c<64;c++) mmucaches[c]=0xFFFFFFFF;
mmunext=0;
}
void resetreadlookup() void resetreadlookup()
{ {
int c; int c;
@ -488,15 +476,6 @@ void flushmmucache()
// memset(writelookup,0xFF,sizeof(writelookup)); // memset(writelookup,0xFF,sizeof(writelookup));
// memset(writelookup2,0xFF,1024*1024*4); // memset(writelookup2,0xFF,1024*1024*4);
/* if (!(cr0>>31)) return;*/ /* if (!(cr0>>31)) return;*/
for (c=0;c<64;c++)
{
if (mmucaches[c]!=0xFFFFFFFF)
{
mmucache[mmucaches[c]]=0xFFFFFFFF;
mmucaches[c]=0xFFFFFFFF;
}
}
// pclog("Flush MMU cache\n");
/* for (c = 0; c < 1024*1024; c++) /* for (c = 0; c < 1024*1024; c++)
{ {
@ -531,15 +510,6 @@ void flushmmucache_nopc()
writelookup[c]=0xFFFFFFFF; writelookup[c]=0xFFFFFFFF;
} }
} }
mmuflush++;
for (c=0;c<64;c++)
{
if (mmucaches[c]!=0xFFFFFFFF)
{
mmucache[mmucaches[c]]=0xFFFFFFFF;
mmucaches[c]=0xFFFFFFFF;
}
}
} }
void flushmmucache_cr3() void flushmmucache_cr3()
@ -559,15 +529,6 @@ void flushmmucache_cr3()
writelookup[c]=0xFFFFFFFF; writelookup[c]=0xFFFFFFFF;
} }
} }
for (c=0;c<64;c++)
{
if (mmucaches[c]!=0xFFFFFFFF)
{
mmucache[mmucaches[c]]=0xFFFFFFFF;
mmucaches[c]=0xFFFFFFFF;
}
}
/* for (c = 0; c < 1024*1024; c++) /* for (c = 0; c < 1024*1024; c++)
{ {
if (readlookup2[c] != 0xFFFFFFFF) if (readlookup2[c] != 0xFFFFFFFF)
@ -586,8 +547,10 @@ void flushmmucache_cr3()
} }
extern int output; extern int output;
#define mmutranslate(addr,rw) mmutranslatereal(addr,rw)
//#define mmutranslate(addr,rw) ((mmucache[addr>>12]!=0xFFFFFFFF)?(mmucache[addr>>12]+(addr&0xFFF)):mmutranslatereal(addr,rw)) #define mmutranslate_read(addr) mmutranslatereal(addr,0)
#define mmutranslate_write(addr) mmutranslatereal(addr,1)
int pctrans=0; int pctrans=0;
extern uint32_t testr[9]; extern uint32_t testr[9];
@ -596,6 +559,7 @@ uint32_t mmutranslatereal(uint32_t addr, int rw)
{ {
uint32_t addr2; uint32_t addr2;
uint32_t temp,temp2,temp3; uint32_t temp,temp2,temp3;
if (abrt) if (abrt)
{ {
// pclog("Translate recursive abort\n"); // pclog("Translate recursive abort\n");
@ -707,7 +671,7 @@ void addreadlookup(uint32_t virt, uint32_t phys)
readlookup2[readlookup[readlnext]]=0xFFFFFFFF; readlookup2[readlookup[readlnext]]=0xFFFFFFFF;
// readlnum--; // readlnum--;
} }
readlookup2[virt>>12]=phys&~0xFFF; readlookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) - (virt & ~0xfff)];
readlookupp[readlnext]=mmu_perm; readlookupp[readlnext]=mmu_perm;
readlookup[readlnext++]=virt>>12; readlookup[readlnext++]=virt>>12;
readlnext&=(cachesize-1); readlnext&=(cachesize-1);
@ -748,7 +712,7 @@ void addwritelookup(uint32_t virt, uint32_t phys)
writelookup2[writelookup[writelnext]]=0xFFFFFFFF; writelookup2[writelookup[writelnext]]=0xFFFFFFFF;
// writelnum--; // writelnum--;
} }
writelookup2[virt>>12]=phys&~0xFFF; writelookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) - (virt & ~0xfff)];
writelookupp[writelnext]=mmu_perm; writelookupp[writelnext]=mmu_perm;
writelookup[writelnext++]=virt>>12; writelookup[writelnext++]=virt>>12;
writelnext&=(cachesize-1); writelnext&=(cachesize-1);
@ -764,7 +728,7 @@ uint8_t *getpccache(uint32_t a)
{ {
// if (output==3) pclog("Translate GetPCCache %08X\n",a); // if (output==3) pclog("Translate GetPCCache %08X\n",a);
pctrans=1; pctrans=1;
a=mmutranslate(a,0); a = mmutranslate_read(a);
pctrans=0; pctrans=0;
// if (output==3) pclog("GetPCCache output %08X\n",a); // if (output==3) pclog("GetPCCache output %08X\n",a);
if (a==0xFFFFFFFF) return ram; if (a==0xFFFFFFFF) return ram;
@ -816,7 +780,7 @@ uint8_t readmembl(uint32_t addr)
mem_logical_addr = addr; mem_logical_addr = addr;
if (cr0 >> 31) if (cr0 >> 31)
{ {
addr = mmutranslate(addr, 0); addr = mmutranslate_read(addr);
if (addr == 0xFFFFFFFF) return 0xFF; if (addr == 0xFFFFFFFF) return 0xFF;
} }
addr &= rammask; addr &= rammask;
@ -832,7 +796,7 @@ void writemembl(uint32_t addr, uint8_t val)
if (cr0 >> 31) if (cr0 >> 31)
{ {
addr = mmutranslate(addr,1); addr = mmutranslate_write(addr);
if (addr == 0xFFFFFFFF) return; if (addr == 0xFFFFFFFF) return;
} }
addr &= rammask; addr &= rammask;
@ -857,7 +821,7 @@ uint8_t readmemb386l(uint32_t seg, uint32_t addr)
if (cr0 >> 31) if (cr0 >> 31)
{ {
addr = mmutranslate(addr, 0); addr = mmutranslate_read(addr);
if (addr == 0xFFFFFFFF) return 0xFF; if (addr == 0xFFFFFFFF) return 0xFF;
} }
@ -880,7 +844,7 @@ void writememb386l(uint32_t seg, uint32_t addr, uint8_t val)
mem_logical_addr = addr = addr + seg; mem_logical_addr = addr = addr + seg;
if (cr0 >> 31) if (cr0 >> 31)
{ {
addr = mmutranslate(addr, 1); addr = mmutranslate_write(addr);
if (addr == 0xFFFFFFFF) return; if (addr == 0xFFFFFFFF) return;
} }
@ -900,8 +864,8 @@ uint16_t readmemwl(uint32_t seg, uint32_t addr)
{ {
if (cr0>>31) if (cr0>>31)
{ {
if (mmutranslate(addr2, 0) == 0xffffffff) return 0xffff; if (mmutranslate_read(addr2) == 0xffffffff) return 0xffff;
if (mmutranslate(addr2+1, 0) == 0xffffffff) return 0xffff; if (mmutranslate_read(addr2+1) == 0xffffffff) return 0xffff;
} }
if (is386) return readmemb386l(seg,addr)|(readmemb386l(seg,addr+1)<<8); if (is386) return readmemb386l(seg,addr)|(readmemb386l(seg,addr+1)<<8);
else return readmembl(seg+addr)|(readmembl(seg+addr+1)<<8); else return readmembl(seg+addr)|(readmembl(seg+addr+1)<<8);
@ -914,7 +878,7 @@ uint16_t readmemwl(uint32_t seg, uint32_t addr)
} }
if (cr0>>31) if (cr0>>31)
{ {
addr2=mmutranslate(addr2,0); addr2 = mmutranslate_read(addr2);
if (addr2==0xFFFFFFFF) return 0xFFFF; if (addr2==0xFFFFFFFF) return 0xFFFF;
} }
@ -938,8 +902,8 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val)
{ {
if (cr0>>31) if (cr0>>31)
{ {
if (mmutranslate(addr2, 1) == 0xffffffff) return; if (mmutranslate_write(addr2) == 0xffffffff) return;
if (mmutranslate(addr2+1, 1) == 0xffffffff) return; if (mmutranslate_write(addr2+1) == 0xffffffff) return;
} }
if (is386) if (is386)
{ {
@ -962,7 +926,7 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val)
} }
if (cr0>>31) if (cr0>>31)
{ {
addr2=mmutranslate(addr2,1); addr2 = mmutranslate_write(addr2);
if (addr2==0xFFFFFFFF) return; if (addr2==0xFFFFFFFF) return;
} }
@ -993,8 +957,8 @@ uint32_t readmemll(uint32_t seg, uint32_t addr)
{ {
if (cr0>>31) if (cr0>>31)
{ {
if (mmutranslate(addr2, 0) == 0xffffffff) return 0xffffffff; if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff;
if (mmutranslate(addr2+3, 0) == 0xffffffff) return 0xffffffff; if (mmutranslate_read(addr2+3) == 0xffffffff) return 0xffffffff;
} }
return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16); return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16);
} }
@ -1008,7 +972,7 @@ uint32_t readmemll(uint32_t seg, uint32_t addr)
if (cr0>>31) if (cr0>>31)
{ {
addr2=mmutranslate(addr2,0); addr2 = mmutranslate_read(addr2);
if (addr2==0xFFFFFFFF) return 0xFFFFFFFF; if (addr2==0xFFFFFFFF) return 0xFFFFFFFF;
} }
@ -1032,8 +996,8 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val)
{ {
if (cr0>>31) if (cr0>>31)
{ {
if (mmutranslate(addr2, 1) == 0xffffffff) return; if (mmutranslate_write(addr2) == 0xffffffff) return;
if (mmutranslate(addr2+3, 1) == 0xffffffff) return; if (mmutranslate_write(addr2+3) == 0xffffffff) return;
} }
writememwl(seg,addr,val); writememwl(seg,addr,val);
writememwl(seg,addr+2,val>>16); writememwl(seg,addr+2,val>>16);
@ -1047,7 +1011,7 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val)
} }
if (cr0>>31) if (cr0>>31)
{ {
addr2=mmutranslate(addr2,1); addr2 = mmutranslate_write(addr2);
if (addr2==0xFFFFFFFF) return; if (addr2==0xFFFFFFFF) return;
} }

View file

@ -19,11 +19,11 @@
#undef readmemb #undef readmemb
#undef writememb #undef writememb
#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a):ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]) #define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a): *((uint8_t *)readlookup2[((s)+(a))>>12]+ (s) + (a)) )
#define writememb(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememb386l(s,a,v); else ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]=v #define writememb(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememb386l(s,a,v); else *(uint8_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
#define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE) writememwl(s,a,v); else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v #define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE) writememwl(s,a,v); else *(uint16_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
#define writememl(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC) writememll(s,a,v); else *((uint32_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v #define writememl(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC) writememll(s,a,v); else *(uint32_t *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v
static inline uint8_t geteab() static inline uint8_t geteab()
{ {