PCem

changeset 105:eb624a751863

Minor memory optimisations.
author TomW
date Sat Jun 07 15:57:57 2014 +0100
parents 41134e597e51
children af02d3d16c98
files src/386.c src/808x.c src/ibm.h src/mem.c src/x87.c
diffstat 5 files changed, 46 insertions(+), 90 deletions(-) [+]
line diff
     1.1 --- a/src/386.c	Wed Jun 04 19:45:12 2014 +0100
     1.2 +++ b/src/386.c	Sat Jun 07 15:57:57 2014 +0100
     1.3 @@ -55,16 +55,14 @@
     1.4  #undef writememb
     1.5  
     1.6  
     1.7 -#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a):ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)])
     1.8 +#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a): *(uint8_t *)(readlookup2[((s)+(a))>>12] + (s) + (a)) )
     1.9  
    1.10 -#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
    1.11 +#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
    1.12  
    1.13 -#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
    1.14 -#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
    1.15 +#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
    1.16 +#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
    1.17  
    1.18  
    1.19 -uint32_t mmucache[0x100000];
    1.20 -
    1.21  uint8_t romext[32768];
    1.22  uint8_t *ram,*rom;
    1.23  uint16_t biosmask;
    1.24 @@ -194,7 +192,7 @@
    1.25          return readmeml(easeg,eaaddr);
    1.26  }
    1.27  
    1.28 -#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
    1.29 +#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
    1.30  #define seteaw(v) if (mod!=3) { if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg,eaaddr,v);    } else regs[rm].w=v
    1.31  #define seteal(v) if (mod!=3) { if (eal_w) *eal_w=v;             else writememll(easeg,eaaddr,v);    } else regs[rm].l=v
    1.32  
    1.33 @@ -269,9 +267,9 @@
    1.34          if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC)
    1.35          {
    1.36                  if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
    1.37 -                   eal_r = (uint32_t *)&ram[ readlookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)];
    1.38 +                   eal_r = (uint32_t *)(readlookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
    1.39                  if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
    1.40 -                   eal_w = (uint32_t *)&ram[writelookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)];
    1.41 +                   eal_w = (uint32_t *)(writelookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
    1.42          }
    1.43  }
    1.44  
    1.45 @@ -307,9 +305,9 @@
    1.46          if (easeg != 0xFFFFFFFF && ((easeg + eaaddr) & 0xFFF) <= 0xFFC)
    1.47          {
    1.48                  if ( readlookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
    1.49 -                   eal_r = (uint32_t *)&ram[ readlookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)];
    1.50 +                   eal_r = (uint32_t *)(readlookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
    1.51                  if (writelookup2[(easeg + eaaddr) >> 12] != 0xFFFFFFFF)
    1.52 -                   eal_w = (uint32_t *)&ram[writelookup2[(easeg + eaaddr) >> 12] + ((easeg + eaaddr) & 0xFFF)];
    1.53 +                   eal_w = (uint32_t *)(writelookup2[(easeg + eaaddr) >> 12] + easeg + eaaddr);
    1.54          }
    1.55  }
    1.56  
     2.1 --- a/src/808x.c	Wed Jun 04 19:45:12 2014 +0100
     2.2 +++ b/src/808x.c	Sat Jun 07 15:57:57 2014 +0100
     2.3 @@ -43,20 +43,20 @@
     2.4  {
     2.5          if (a!=(cs+pc)) memcycs+=4;
     2.6          if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a);
     2.7 -        else return ram[readlookup2[(a)>>12]+((a)&0xFFF)];
     2.8 +        else return *(uint8_t *)(readlookup2[(a) >> 12] + (a));
     2.9  }
    2.10  
    2.11  uint8_t readmembf(uint32_t a)
    2.12  {
    2.13          if (readlookup2[(a)>>12]==0xFFFFFFFF) return readmembl(a);
    2.14 -        else return ram[readlookup2[(a)>>12]+((a)&0xFFF)];
    2.15 +        else return *(uint8_t *)(readlookup2[(a) >> 12] + (a));
    2.16  }
    2.17  
    2.18  uint16_t readmemw(uint32_t s, uint16_t a)
    2.19  {
    2.20          if (a!=(cs+pc)) memcycs+=(8>>is8086);
    2.21          if ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)) return readmemwl(s,a);
    2.22 -        else return *((uint16_t *)(&ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]));
    2.23 +        else return *(uint16_t *)(readlookup2[(s + a) >> 12] + s + a);
    2.24  }
    2.25  
    2.26  void refreshread() { /*pclog("Refreshread\n"); */FETCHCOMPLETE(); memcycs+=4; }
    2.27 @@ -73,20 +73,20 @@
    2.28  {
    2.29          memcycs+=4;
    2.30          if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v);
    2.31 -        else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v;
    2.32 +        else *(uint8_t *)(writelookup2[a >> 12] + a) = v;
    2.33  }
    2.34  void writememwl(uint32_t seg, uint32_t addr, uint16_t val);
    2.35  void writememw(uint32_t s, uint32_t a, uint16_t v)
    2.36  {
    2.37          memcycs+=(8>>is8086);
    2.38          if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v);
    2.39 -        else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v;
    2.40 +        else *(uint16_t *)(writelookup2[(s + a) >> 12] + s + a) = v;
    2.41  }
    2.42  void writememll(uint32_t seg, uint32_t addr, uint32_t val);
    2.43  void writememl(uint32_t s, uint32_t a, uint32_t v)
    2.44  {
    2.45          if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememll(s,a,v);
    2.46 -        else *((uint32_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v;
    2.47 +        else *(uint32_t *)(writelookup2[(s + a) >> 12] + s + a) = v;
    2.48  }
    2.49  
    2.50  
    2.51 @@ -614,11 +614,6 @@
    2.52          }
    2.53          printf("Entries in readlookup : %i    writelookup : %i\n",d,e);
    2.54          x87_dumpregs();
    2.55 -/*        for (c=0;c<1024*1024;c++)
    2.56 -        {
    2.57 -                if (mmucache[c]!=0xFFFFFFFF) d++;
    2.58 -        }
    2.59 -        printf("Entries in MMU cache : %i\n",d);*/
    2.60          indump = 0;
    2.61  }
    2.62  
    2.63 @@ -642,7 +637,6 @@
    2.64          idt.base = 0;
    2.65          flags=2;
    2.66          makeznptable();
    2.67 -        initmmucache();
    2.68          resetreadlookup();
    2.69          makemod1table();
    2.70          resetmcr();
     3.1 --- a/src/ibm.h	Wed Jun 04 19:45:12 2014 +0100
     3.2 +++ b/src/ibm.h	Sat Jun 07 15:57:57 2014 +0100
     3.3 @@ -17,9 +17,9 @@
     3.4  
     3.5  extern int mmu_perm;
     3.6  
     3.7 -#define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):ram[readlookup2[(a)>>12]+((a)&0xFFF)])
     3.8 -#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)])))
     3.9 -#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)])))
    3.10 +#define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
    3.11 +#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)))
    3.12 +#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)))
    3.13  
    3.14  //#define writememb(a,v) if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v
    3.15  //#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
     4.1 --- a/src/mem.c	Wed Jun 04 19:45:12 2014 +0100
     4.2 +++ b/src/mem.c	Sat Jun 07 15:57:57 2014 +0100
     4.3 @@ -424,20 +424,8 @@
     4.4  
     4.5  
     4.6  
     4.7 -uint32_t mmucache[0x100000];
     4.8 -int mmucaches[64];
     4.9 -int mmunext=0;
    4.10  int abrt=0;
    4.11  
    4.12 -void initmmucache()
    4.13 -{
    4.14 -        int c;
    4.15 -//        if (output) pclog("initmmucache\n");
    4.16 -        memset(mmucache,0xFF,sizeof(mmucache));
    4.17 -        for (c=0;c<64;c++) mmucaches[c]=0xFFFFFFFF;
    4.18 -        mmunext=0;
    4.19 -}
    4.20 -
    4.21  void resetreadlookup()
    4.22  {
    4.23          int c;
    4.24 @@ -488,15 +476,6 @@
    4.25  //        memset(writelookup,0xFF,sizeof(writelookup));
    4.26  //        memset(writelookup2,0xFF,1024*1024*4);
    4.27  /*        if (!(cr0>>31)) return;*/
    4.28 -        for (c=0;c<64;c++)
    4.29 -        {
    4.30 -                if (mmucaches[c]!=0xFFFFFFFF)
    4.31 -                {
    4.32 -                        mmucache[mmucaches[c]]=0xFFFFFFFF;
    4.33 -                        mmucaches[c]=0xFFFFFFFF;
    4.34 -                }
    4.35 -        }
    4.36 -//        pclog("Flush MMU cache\n");
    4.37  
    4.38  /*        for (c = 0; c < 1024*1024; c++)
    4.39          {
    4.40 @@ -531,15 +510,6 @@
    4.41                          writelookup[c]=0xFFFFFFFF;
    4.42                  }
    4.43          }
    4.44 -        mmuflush++;
    4.45 -        for (c=0;c<64;c++)
    4.46 -        {
    4.47 -                if (mmucaches[c]!=0xFFFFFFFF)
    4.48 -                {
    4.49 -                        mmucache[mmucaches[c]]=0xFFFFFFFF;
    4.50 -                        mmucaches[c]=0xFFFFFFFF;
    4.51 -                }
    4.52 -        }
    4.53  }
    4.54  
    4.55  void flushmmucache_cr3()
    4.56 @@ -559,15 +529,6 @@
    4.57                          writelookup[c]=0xFFFFFFFF;
    4.58                  }
    4.59          }
    4.60 -        for (c=0;c<64;c++)
    4.61 -        {
    4.62 -                if (mmucaches[c]!=0xFFFFFFFF)
    4.63 -                {
    4.64 -                        mmucache[mmucaches[c]]=0xFFFFFFFF;
    4.65 -                        mmucaches[c]=0xFFFFFFFF;
    4.66 -                }
    4.67 -        }
    4.68 -
    4.69  /*        for (c = 0; c < 1024*1024; c++)
    4.70          {
    4.71                  if (readlookup2[c] != 0xFFFFFFFF)
    4.72 @@ -586,8 +547,10 @@
    4.73  }
    4.74  
    4.75  extern int output;
    4.76 -#define mmutranslate(addr,rw) mmutranslatereal(addr,rw)
    4.77 -//#define mmutranslate(addr,rw) ((mmucache[addr>>12]!=0xFFFFFFFF)?(mmucache[addr>>12]+(addr&0xFFF)):mmutranslatereal(addr,rw))
    4.78 +
    4.79 +#define mmutranslate_read(addr) mmutranslatereal(addr,0)
    4.80 +#define mmutranslate_write(addr) mmutranslatereal(addr,1)
    4.81 +
    4.82  int pctrans=0;
    4.83  
    4.84  extern uint32_t testr[9];
    4.85 @@ -596,6 +559,7 @@
    4.86  {
    4.87          uint32_t addr2;
    4.88          uint32_t temp,temp2,temp3;
    4.89 +        
    4.90                  if (abrt) 
    4.91                  {
    4.92  //                        pclog("Translate recursive abort\n");
    4.93 @@ -707,7 +671,7 @@
    4.94                  readlookup2[readlookup[readlnext]]=0xFFFFFFFF;
    4.95  //                readlnum--;
    4.96          }
    4.97 -        readlookup2[virt>>12]=phys&~0xFFF;
    4.98 +        readlookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) -  (virt & ~0xfff)];
    4.99          readlookupp[readlnext]=mmu_perm;
   4.100          readlookup[readlnext++]=virt>>12;
   4.101          readlnext&=(cachesize-1);
   4.102 @@ -748,7 +712,7 @@
   4.103                  writelookup2[writelookup[writelnext]]=0xFFFFFFFF;
   4.104  //                writelnum--;
   4.105          }
   4.106 -        writelookup2[virt>>12]=phys&~0xFFF;
   4.107 +        writelookup2[virt>>12] = (uint32_t)&ram[(phys & ~0xFFF) - (virt & ~0xfff)];
   4.108          writelookupp[writelnext]=mmu_perm;
   4.109          writelookup[writelnext++]=virt>>12;
   4.110          writelnext&=(cachesize-1);
   4.111 @@ -764,7 +728,7 @@
   4.112          {
   4.113  //                if (output==3) pclog("Translate GetPCCache %08X\n",a);
   4.114  pctrans=1;
   4.115 -                a=mmutranslate(a,0);
   4.116 +                a = mmutranslate_read(a);
   4.117                  pctrans=0;
   4.118  //                if (output==3) pclog("GetPCCache output %08X\n",a);
   4.119                  if (a==0xFFFFFFFF) return ram;
   4.120 @@ -816,7 +780,7 @@
   4.121          mem_logical_addr = addr;
   4.122          if (cr0 >> 31)
   4.123          {
   4.124 -                addr = mmutranslate(addr, 0);
   4.125 +                addr = mmutranslate_read(addr);
   4.126                  if (addr == 0xFFFFFFFF) return 0xFF;
   4.127          }
   4.128          addr &= rammask;
   4.129 @@ -832,7 +796,7 @@
   4.130  
   4.131          if (cr0 >> 31)
   4.132          {
   4.133 -                addr = mmutranslate(addr,1);
   4.134 +                addr = mmutranslate_write(addr);
   4.135                  if (addr == 0xFFFFFFFF) return;
   4.136          }
   4.137          addr &= rammask;
   4.138 @@ -857,7 +821,7 @@
   4.139          
   4.140          if (cr0 >> 31)
   4.141          {
   4.142 -                addr = mmutranslate(addr, 0);
   4.143 +                addr = mmutranslate_read(addr);
   4.144                  if (addr == 0xFFFFFFFF) return 0xFF;
   4.145          }
   4.146  
   4.147 @@ -880,7 +844,7 @@
   4.148          mem_logical_addr = addr = addr + seg;
   4.149          if (cr0 >> 31)
   4.150          {
   4.151 -                addr = mmutranslate(addr, 1);
   4.152 +                addr = mmutranslate_write(addr);
   4.153                  if (addr == 0xFFFFFFFF) return;
   4.154          }
   4.155  
   4.156 @@ -900,8 +864,8 @@
   4.157          {
   4.158                  if (cr0>>31)
   4.159                  {
   4.160 -                        if (mmutranslate(addr2,   0) == 0xffffffff) return 0xffff;
   4.161 -                        if (mmutranslate(addr2+1, 0) == 0xffffffff) return 0xffff;
   4.162 +                        if (mmutranslate_read(addr2)   == 0xffffffff) return 0xffff;
   4.163 +                        if (mmutranslate_read(addr2+1) == 0xffffffff) return 0xffff;
   4.164                  }
   4.165                  if (is386) return readmemb386l(seg,addr)|(readmemb386l(seg,addr+1)<<8);
   4.166                  else       return readmembl(seg+addr)|(readmembl(seg+addr+1)<<8);
   4.167 @@ -914,7 +878,7 @@
   4.168          }
   4.169          if (cr0>>31)
   4.170          {
   4.171 -                addr2=mmutranslate(addr2,0);
   4.172 +                addr2 = mmutranslate_read(addr2);
   4.173                  if (addr2==0xFFFFFFFF) return 0xFFFF;
   4.174          }
   4.175  
   4.176 @@ -938,8 +902,8 @@
   4.177          {
   4.178                  if (cr0>>31)
   4.179                  {
   4.180 -                        if (mmutranslate(addr2,   1) == 0xffffffff) return;
   4.181 -                        if (mmutranslate(addr2+1, 1) == 0xffffffff) return;
   4.182 +                        if (mmutranslate_write(addr2)   == 0xffffffff) return;
   4.183 +                        if (mmutranslate_write(addr2+1) == 0xffffffff) return;
   4.184                  }
   4.185                  if (is386)
   4.186                  {
   4.187 @@ -962,7 +926,7 @@
   4.188          }
   4.189          if (cr0>>31)
   4.190          {
   4.191 -                addr2=mmutranslate(addr2,1);
   4.192 +                addr2 = mmutranslate_write(addr2);
   4.193                  if (addr2==0xFFFFFFFF) return;
   4.194          }
   4.195          
   4.196 @@ -993,8 +957,8 @@
   4.197          {
   4.198                  if (cr0>>31)
   4.199                  {
   4.200 -                        if (mmutranslate(addr2,   0) == 0xffffffff) return 0xffffffff;
   4.201 -                        if (mmutranslate(addr2+3, 0) == 0xffffffff) return 0xffffffff;
   4.202 +                        if (mmutranslate_read(addr2)   == 0xffffffff) return 0xffffffff;
   4.203 +                        if (mmutranslate_read(addr2+3) == 0xffffffff) return 0xffffffff;
   4.204                  }
   4.205                  return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16);
   4.206          }
   4.207 @@ -1008,7 +972,7 @@
   4.208          
   4.209          if (cr0>>31)
   4.210          {
   4.211 -                addr2=mmutranslate(addr2,0);
   4.212 +                addr2 = mmutranslate_read(addr2);
   4.213                  if (addr2==0xFFFFFFFF) return 0xFFFFFFFF;
   4.214          }
   4.215  
   4.216 @@ -1032,8 +996,8 @@
   4.217          {
   4.218                  if (cr0>>31)
   4.219                  {
   4.220 -                        if (mmutranslate(addr2,   1) == 0xffffffff) return;
   4.221 -                        if (mmutranslate(addr2+3, 1) == 0xffffffff) return;
   4.222 +                        if (mmutranslate_write(addr2)   == 0xffffffff) return;
   4.223 +                        if (mmutranslate_write(addr2+3) == 0xffffffff) return;
   4.224                  }
   4.225                  writememwl(seg,addr,val);
   4.226                  writememwl(seg,addr+2,val>>16);
   4.227 @@ -1047,7 +1011,7 @@
   4.228          }
   4.229          if (cr0>>31)
   4.230          {
   4.231 -                addr2=mmutranslate(addr2,1);
   4.232 +                addr2 = mmutranslate_write(addr2);
   4.233                  if (addr2==0xFFFFFFFF) return;
   4.234          }
   4.235          
     5.1 --- a/src/x87.c	Wed Jun 04 19:45:12 2014 +0100
     5.2 +++ b/src/x87.c	Sat Jun 07 15:57:57 2014 +0100
     5.3 @@ -19,11 +19,11 @@
     5.4  #undef readmemb
     5.5  #undef writememb
     5.6  
     5.7 -#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a):ram[readlookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)])
     5.8 -#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
     5.9 +#define readmemb(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF)?readmemb386l(s,a): *((uint8_t *)readlookup2[((s)+(a))>>12]+ (s) + (a)) )
    5.10 +#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
    5.11  
    5.12 -#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
    5.13 -#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
    5.14 +#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
    5.15 +#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
    5.16  
    5.17  static inline uint8_t geteab()
    5.18  {