From 9ba75bd91092d37e53eed63fa86acafb26a61627 Mon Sep 17 00:00:00 2001 From: TomW Date: Sat, 7 Jun 2014 15:57:57 +0100 Subject: [PATCH] Minor memory optimisations. --- src/386.c | 20 ++++++------- src/808x.c | 18 ++++-------- src/ibm.h | 6 ++-- src/mem.c | 84 ++++++++++++++++-------------------------------------- src/x87.c | 8 +++--- 5 files changed, 46 insertions(+), 90 deletions(-) diff --git a/src/386.c b/src/386.c index 1538890..bef722c 100644 --- a/src/386.c +++ b/src/386.c @@ -55,16 +55,14 @@ int cgate32; #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 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 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 *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v -uint32_t mmucache[0x100000]; - uint8_t romext[32768]; uint8_t *ram,*rom; uint16_t biosmask; @@ -194,7 +192,7 @@ static inline uint32_t geteal_mem() 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 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 ( 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) - 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 ( 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) - eal_w = (uint32_t *)&ram[writelookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)]; + eal_w = (uint32_t *)(writelookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr); } } diff --git a/src/808x.c b/src/808x.c index adb1beb..00032fe 100644 --- a/src/808x.c +++ b/src/808x.c @@ -43,20 +43,20 @@ uint8_t readmemb(uint32_t a) { if (a!=(cs+pc)) memcycs+=4; 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) { 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) { if (a!=(cs+pc)) memcycs+=(8>>is8086); 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; } @@ -73,20 +73,20 @@ void writememb(uint32_t a, uint8_t v) { memcycs+=4; 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 writememw(uint32_t s, uint32_t a, uint16_t v) { memcycs+=(8>>is8086); 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 writememl(uint32_t s, uint32_t a, uint32_t 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); x87_dumpregs(); -/* for (c=0;c<1024*1024;c++) - { - if (mmucache[c]!=0xFFFFFFFF) d++; - } - printf("Entries in MMU cache : %i\n",d);*/ indump = 0; } @@ -642,7 +637,6 @@ void resetx86() idt.base = 0; flags=2; makeznptable(); - initmmucache(); resetreadlookup(); makemod1table(); resetmcr(); diff --git a/src/ibm.h b/src/ibm.h index 75c5a50..b6c2c87 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -17,9 +17,9 @@ int writelnext; extern int mmu_perm; -#define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):ram[readlookup2[(a)>>12]+((a)&0xFFF)]) -#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 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 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 *)(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 *)(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 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 diff --git a/src/mem.c b/src/mem.c index 6c588ee..0792154 100644 --- a/src/mem.c +++ b/src/mem.c @@ -424,20 +424,8 @@ int loadbios() -uint32_t mmucache[0x100000]; -int mmucaches[64]; -int mmunext=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() { int c; @@ -488,15 +476,6 @@ void flushmmucache() // memset(writelookup,0xFF,sizeof(writelookup)); // memset(writelookup2,0xFF,1024*1024*4); /* 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++) { @@ -531,15 +510,6 @@ void flushmmucache_nopc() writelookup[c]=0xFFFFFFFF; } } - mmuflush++; - for (c=0;c<64;c++) - { - if (mmucaches[c]!=0xFFFFFFFF) - { - mmucache[mmucaches[c]]=0xFFFFFFFF; - mmucaches[c]=0xFFFFFFFF; - } - } } void flushmmucache_cr3() @@ -559,15 +529,6 @@ void flushmmucache_cr3() 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++) { if (readlookup2[c] != 0xFFFFFFFF) @@ -586,8 +547,10 @@ void flushmmucache_cr3() } 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; extern uint32_t testr[9]; @@ -596,6 +559,7 @@ uint32_t mmutranslatereal(uint32_t addr, int rw) { uint32_t addr2; uint32_t temp,temp2,temp3; + if (abrt) { // pclog("Translate recursive abort\n"); @@ -707,7 +671,7 @@ void addreadlookup(uint32_t virt, uint32_t phys) readlookup2[readlookup[readlnext]]=0xFFFFFFFF; // readlnum--; } - readlookup2[virt>>12]=phys&~0xFFF; + readlookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) - (virt & ~0xfff)]; readlookupp[readlnext]=mmu_perm; readlookup[readlnext++]=virt>>12; readlnext&=(cachesize-1); @@ -748,7 +712,7 @@ void addwritelookup(uint32_t virt, uint32_t phys) writelookup2[writelookup[writelnext]]=0xFFFFFFFF; // writelnum--; } - writelookup2[virt>>12]=phys&~0xFFF; + writelookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) - (virt & ~0xfff)]; writelookupp[writelnext]=mmu_perm; writelookup[writelnext++]=virt>>12; writelnext&=(cachesize-1); @@ -764,7 +728,7 @@ uint8_t *getpccache(uint32_t a) { // if (output==3) pclog("Translate GetPCCache %08X\n",a); pctrans=1; - a=mmutranslate(a,0); + a = mmutranslate_read(a); pctrans=0; // if (output==3) pclog("GetPCCache output %08X\n",a); if (a==0xFFFFFFFF) return ram; @@ -816,7 +780,7 @@ uint8_t readmembl(uint32_t addr) mem_logical_addr = addr; if (cr0 >> 31) { - addr = mmutranslate(addr, 0); + addr = mmutranslate_read(addr); if (addr == 0xFFFFFFFF) return 0xFF; } addr &= rammask; @@ -832,7 +796,7 @@ void writemembl(uint32_t addr, uint8_t val) if (cr0 >> 31) { - addr = mmutranslate(addr,1); + addr = mmutranslate_write(addr); if (addr == 0xFFFFFFFF) return; } addr &= rammask; @@ -857,7 +821,7 @@ uint8_t readmemb386l(uint32_t seg, uint32_t addr) if (cr0 >> 31) { - addr = mmutranslate(addr, 0); + addr = mmutranslate_read(addr); 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; if (cr0 >> 31) { - addr = mmutranslate(addr, 1); + addr = mmutranslate_write(addr); if (addr == 0xFFFFFFFF) return; } @@ -900,8 +864,8 @@ uint16_t readmemwl(uint32_t seg, uint32_t addr) { if (cr0>>31) { - if (mmutranslate(addr2, 0) == 0xffffffff) return 0xffff; - if (mmutranslate(addr2+1, 0) == 0xffffffff) return 0xffff; + if (mmutranslate_read(addr2) == 0xffffffff) return 0xffff; + if (mmutranslate_read(addr2+1) == 0xffffffff) return 0xffff; } if (is386) return readmemb386l(seg,addr)|(readmemb386l(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) { - addr2=mmutranslate(addr2,0); + addr2 = mmutranslate_read(addr2); if (addr2==0xFFFFFFFF) return 0xFFFF; } @@ -938,8 +902,8 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val) { if (cr0>>31) { - if (mmutranslate(addr2, 1) == 0xffffffff) return; - if (mmutranslate(addr2+1, 1) == 0xffffffff) return; + if (mmutranslate_write(addr2) == 0xffffffff) return; + if (mmutranslate_write(addr2+1) == 0xffffffff) return; } if (is386) { @@ -962,7 +926,7 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val) } if (cr0>>31) { - addr2=mmutranslate(addr2,1); + addr2 = mmutranslate_write(addr2); if (addr2==0xFFFFFFFF) return; } @@ -993,8 +957,8 @@ uint32_t readmemll(uint32_t seg, uint32_t addr) { if (cr0>>31) { - if (mmutranslate(addr2, 0) == 0xffffffff) return 0xffffffff; - if (mmutranslate(addr2+3, 0) == 0xffffffff) return 0xffffffff; + if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff; + if (mmutranslate_read(addr2+3) == 0xffffffff) return 0xffffffff; } 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) { - addr2=mmutranslate(addr2,0); + addr2 = mmutranslate_read(addr2); if (addr2==0xFFFFFFFF) return 0xFFFFFFFF; } @@ -1032,8 +996,8 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val) { if (cr0>>31) { - if (mmutranslate(addr2, 1) == 0xffffffff) return; - if (mmutranslate(addr2+3, 1) == 0xffffffff) return; + if (mmutranslate_write(addr2) == 0xffffffff) return; + if (mmutranslate_write(addr2+3) == 0xffffffff) return; } writememwl(seg,addr,val); writememwl(seg,addr+2,val>>16); @@ -1047,7 +1011,7 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val) } if (cr0>>31) { - addr2=mmutranslate(addr2,1); + addr2 = mmutranslate_write(addr2); if (addr2==0xFFFFFFFF) return; } diff --git a/src/x87.c b/src/x87.c index 3dbdb4e..d4de324 100644 --- a/src/x87.c +++ b/src/x87.c @@ -19,11 +19,11 @@ #undef readmemb #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 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 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 *(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 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 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 *)(writelookup2[((s) + (a)) >> 12] + (s) + (a)) = v static inline uint8_t geteab() {