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 {
