Applied the remaining mainline PCem commits.
This commit is contained in:
208
src/mem.c
208
src/mem.c
@@ -1281,25 +1281,29 @@ void writememb386l(uint32_t seg, uint32_t addr, uint8_t val)
|
||||
uint16_t readmemwl(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
if ((addr2&0xFFF)>0xFFE)
|
||||
{
|
||||
if (addr2 < 0x100000 && ram_mapped_addr[addr2 >> 14] && ram_mapped_addr[(addr2+1) >> 14])
|
||||
{
|
||||
return readmembl(seg+addr)|(readmembl(seg+addr+1)<<8);
|
||||
}
|
||||
if (cr0>>31)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
if (seg==-1)
|
||||
{
|
||||
x86gpf("NULL segment", 0);
|
||||
return -1;
|
||||
}
|
||||
if (addr2 & 1)
|
||||
{
|
||||
if (!cpu_cyrix_alignment || (addr2 & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2 & 0xFFF) > 0xFFE)
|
||||
{
|
||||
if (cr0 >> 31)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else if (readlookup2[addr2 >> 12] != -1)
|
||||
return *(uint16_t *)(readlookup2[addr2 >> 12] + addr2);
|
||||
}
|
||||
if (addr2 < 0x100000 && ram_mapped_addr[addr2 >> 14])
|
||||
{
|
||||
addr = (ram_mapped_addr[addr2 >> 14] & MEM_MAP_TO_SHADOW_RAM_MASK) ? addr2 : (ram_mapped_addr[addr2 >> 14] & ~0x3FFF) + (addr2 & 0x3FFF);
|
||||
@@ -1327,31 +1331,6 @@ uint16_t readmemwl(uint32_t seg, uint32_t addr)
|
||||
void writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
if ((addr2&0xFFF)>0xFFE)
|
||||
{
|
||||
if (addr2 < 0x100000 && ram_mapped_addr[addr2 >> 14])
|
||||
{
|
||||
writemembl(seg+addr,val);
|
||||
writemembl(seg+addr+1,val>>8);
|
||||
return;
|
||||
}
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+1) == 0xffffffff) return;
|
||||
}
|
||||
if (is386)
|
||||
{
|
||||
writememb386l(seg,addr,val);
|
||||
writememb386l(seg,addr+1,val>>8);
|
||||
}
|
||||
else
|
||||
{
|
||||
writemembl(seg+addr,val);
|
||||
writemembl(seg+addr+1,val>>8);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (seg==-1)
|
||||
{
|
||||
@@ -1364,6 +1343,37 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
if(addr < mem_size * 1024) *((uint16_t *)&ram[addr]) = val;
|
||||
return;
|
||||
}
|
||||
|
||||
if (addr2 & 1)
|
||||
{
|
||||
if (!cpu_cyrix_alignment || (addr2 & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2 & 0xFFF) > 0xFFE)
|
||||
{
|
||||
if (cr0 >> 31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+1) == 0xffffffff) return;
|
||||
}
|
||||
if (is386)
|
||||
{
|
||||
writememb386l(seg,addr,val);
|
||||
writememb386l(seg,addr+1,val>>8);
|
||||
}
|
||||
else
|
||||
{
|
||||
writemembl(seg+addr,val);
|
||||
writemembl(seg+addr+1,val>>8);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (writelookup2[addr2 >> 12] != -1)
|
||||
{
|
||||
*(uint16_t *)(writelookup2[addr2 >> 12] + addr2) = val;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (page_lookup[addr2>>12])
|
||||
{
|
||||
page_lookup[addr2>>12]->write_w(addr2, val, page_lookup[addr2>>12]);
|
||||
@@ -1397,19 +1407,6 @@ void writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
uint32_t readmemll(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
if ((addr2&0xFFF)>0xFFC)
|
||||
{
|
||||
if (addr2 < 0x100000 && (ram_mapped_addr[addr2 >> 14] || ram_mapped_addr[(addr2+3) >> 14]))
|
||||
{
|
||||
return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16);
|
||||
}
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff;
|
||||
if (mmutranslate_read(addr2+3) == 0xffffffff) return 0xffffffff;
|
||||
}
|
||||
return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16);
|
||||
}
|
||||
|
||||
if (seg==-1)
|
||||
{
|
||||
@@ -1423,6 +1420,24 @@ uint32_t readmemll(uint32_t seg, uint32_t addr)
|
||||
if(addr < mem_size * 1024) return *((uint32_t *)&ram[addr]);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
if (addr2 & 3)
|
||||
{
|
||||
if (!cpu_cyrix_alignment || (addr2 & 7) > 4)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2&0xFFF)>0xFFC)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff;
|
||||
if (mmutranslate_read(addr2+3) == 0xffffffff) return 0xffffffff;
|
||||
}
|
||||
return readmemwl(seg,addr)|(readmemwl(seg,addr+2)<<16);
|
||||
}
|
||||
else if (readlookup2[addr2 >> 12] != -1)
|
||||
return *(uint32_t *)(readlookup2[addr2 >> 12] + addr2);
|
||||
}
|
||||
|
||||
if (cr0>>31)
|
||||
{
|
||||
addr2 = mmutranslate_read(addr2);
|
||||
@@ -1444,17 +1459,6 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
if ((addr2&0xFFF)>0xFFC)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+3) == 0xffffffff) return;
|
||||
}
|
||||
writememwl(seg,addr,val);
|
||||
writememwl(seg,addr+2,val>>16);
|
||||
return;
|
||||
}
|
||||
if (seg==-1)
|
||||
{
|
||||
x86gpf("NULL segment", 0);
|
||||
@@ -1466,6 +1470,27 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val)
|
||||
if(addr < mem_size * 1024) *((uint32_t *)&ram[addr]) = val;
|
||||
return;
|
||||
}
|
||||
if (addr2 & 3)
|
||||
{
|
||||
if (!cpu_cyrix_alignment || (addr2 & 7) > 4)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2 & 0xFFF) > 0xFFC)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+3) == 0xffffffff) return;
|
||||
}
|
||||
writememwl(seg,addr,val);
|
||||
writememwl(seg,addr+2,val>>16);
|
||||
return;
|
||||
}
|
||||
else if (writelookup2[addr2 >> 12] != -1)
|
||||
{
|
||||
*(uint32_t *)(writelookup2[addr2 >> 12] + addr2) = val;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (page_lookup[addr2>>12])
|
||||
{
|
||||
page_lookup[addr2>>12]->write_l(addr2, val, page_lookup[addr2>>12]);
|
||||
@@ -1503,15 +1528,6 @@ void writememll(uint32_t seg, uint32_t addr, uint32_t val)
|
||||
uint64_t readmemql(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
if ((addr2&0xFFF)>0xFF8)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff;
|
||||
if (mmutranslate_read(addr2+7) == 0xffffffff) return 0xffffffff;
|
||||
}
|
||||
return readmemll(seg,addr)|((uint64_t)readmemll(seg,addr+4)<<32);
|
||||
}
|
||||
|
||||
if (seg==-1)
|
||||
{
|
||||
@@ -1525,6 +1541,23 @@ uint64_t readmemql(uint32_t seg, uint32_t addr)
|
||||
if(addr < mem_size * 1024) return *((uint64_t *)&ram[addr]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (addr2 & 7)
|
||||
{
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2 & 0xFFF) > 0xFF8)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_read(addr2) == 0xffffffff) return 0xffffffff;
|
||||
if (mmutranslate_read(addr2+7) == 0xffffffff) return 0xffffffff;
|
||||
}
|
||||
return readmemll(seg,addr)|((uint64_t)readmemll(seg,addr+4)<<32);
|
||||
}
|
||||
else if (readlookup2[addr2 >> 12] != -1)
|
||||
return *(uint64_t *)(readlookup2[addr2 >> 12] + addr2);
|
||||
}
|
||||
|
||||
if (cr0>>31)
|
||||
{
|
||||
addr2 = mmutranslate_read(addr2);
|
||||
@@ -1544,17 +1577,6 @@ void writememql(uint32_t seg, uint32_t addr, uint64_t val)
|
||||
{
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
if ((addr2 & 0xFFF) > 0xFF8)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+7) == 0xffffffff) return;
|
||||
}
|
||||
writememll(seg, addr, val);
|
||||
writememll(seg, addr+4, val >> 32);
|
||||
return;
|
||||
}
|
||||
if (seg==-1)
|
||||
{
|
||||
x86gpf("NULL segment", 0);
|
||||
@@ -1566,6 +1588,26 @@ void writememql(uint32_t seg, uint32_t addr, uint64_t val)
|
||||
if(addr < mem_size * 1024) *((uint64_t *)&ram[addr]) = val;
|
||||
return;
|
||||
}
|
||||
if (addr2 & 7)
|
||||
{
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr2 & 0xFFF) > 0xFF8)
|
||||
{
|
||||
if (cr0>>31)
|
||||
{
|
||||
if (mmutranslate_write(addr2) == 0xffffffff) return;
|
||||
if (mmutranslate_write(addr2+7) == 0xffffffff) return;
|
||||
}
|
||||
writememll(seg, addr, val);
|
||||
writememll(seg, addr+4, val >> 32);
|
||||
return;
|
||||
}
|
||||
else if (writelookup2[addr2 >> 12] != -1)
|
||||
{
|
||||
*(uint64_t *)(writelookup2[addr2 >> 12] + addr2) = val;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (page_lookup[addr2>>12])
|
||||
{
|
||||
page_lookup[addr2>>12]->write_l(addr2, val, page_lookup[addr2>>12]);
|
||||
|
||||
Reference in New Issue
Block a user