--- np2/i386c/memory.c 2004/03/04 16:58:57 1.15 +++ np2/i386c/memory.c 2004/03/09 16:31:18 1.17 @@ -902,9 +902,6 @@ void MEMCALL i286_memorywrite(UINT32 add mem9821_w(addr, value); } #endif - else { - TRACEOUT(("mem_w %x %x", addr, value)); - } } else { memfn.wr8[(addr >> 15) & 0x1f](addr, value); @@ -1088,7 +1085,7 @@ void MEMCALL memp_write(UINT32 address, // ---- Logical Space (BIOS) -static UINT32 realaddr(UINT32 addr) { +static UINT32 physicaladdr(UINT32 addr) { UINT32 pde; UINT32 pte; @@ -1110,7 +1107,61 @@ retdummy: return(0x01000000); // てきとーにメモリが存在しない場所 } -void MEMCALL i286_memstr_read(UINT seg, UINT off, void *dat, UINT leng) { + +REG8 MEMCALL meml_read8(UINT seg, UINT off) { + + UINT32 addr; + + addr = (seg << 4) + LOW16(off); + if (CPU_STAT_PAGING) { + addr = physicaladdr(addr); + } + return(i286_memoryread(addr)); +} + +REG16 MEMCALL meml_read16(UINT seg, UINT off) { + + UINT32 addr; + + addr = (seg << 4) + LOW16(off); + if (!CPU_STAT_PAGING) { + return(i286_memoryread_w(addr)); + } + else if ((addr + 1) & 0xfff) { + return(i286_memoryread_w(physicaladdr(addr))); + } + return(meml_read8(seg, off) + (meml_read8(seg, off + 1) << 8)); +} + +void MEMCALL meml_write8(UINT seg, UINT off, REG8 dat) { + + UINT32 addr; + + addr = (seg << 4) + LOW16(off); + if (CPU_STAT_PAGING) { + addr = physicaladdr(addr); + } + i286_memorywrite(addr, dat); +} + +void MEMCALL meml_write16(UINT seg, UINT off, REG16 dat) { + + UINT32 addr; + + addr = (seg << 4) + LOW16(off); + if (!CPU_STAT_PAGING) { + i286_memorywrite_w(addr, dat); + } + else if ((addr + 1) & 0xfff) { + i286_memorywrite_w(physicaladdr(addr), dat); + } + else { + meml_write8(seg, off, (REG8)dat); + meml_write8(seg, off + 1, (REG8)(dat >> 8)); + } +} + +void MEMCALL meml_readstr(UINT seg, UINT off, void *dat, UINT leng) { UINT32 adrs; UINT size; @@ -1121,15 +1172,14 @@ void MEMCALL i286_memstr_read(UINT seg, size = 0x1000 - (adrs & 0xfff); size = min(size, leng); size = min(size, 0x10000 - off); - memp_read(realaddr(adrs), dat, size); + memp_read(physicaladdr(adrs), dat, size); off += size; dat = ((BYTE *)dat) + size; leng -= size; } } -void MEMCALL i286_memstr_write(UINT seg, UINT off, - const void *dat, UINT leng) { +void MEMCALL meml_writestr(UINT seg, UINT off, const void *dat, UINT leng) { UINT32 adrs; UINT size; @@ -1140,7 +1190,7 @@ void MEMCALL i286_memstr_write(UINT seg, size = 0x1000 - (adrs & 0xfff); size = min(size, leng); size = min(size, 0x10000 - off); - memp_write(realaddr(adrs), dat, size); + memp_write(physicaladdr(adrs), dat, size); off += size; dat = ((BYTE *)dat) + size; leng -= size; @@ -1151,13 +1201,18 @@ void MEMCALL meml_read(UINT32 address, v UINT size; - while(leng) { - size = 0x1000 - (address & 0xfff); - size = min(size, leng); - memp_read(realaddr(address), dat, size); - address += size; - dat = ((BYTE *)dat) + size; - leng -= size; + if (!CPU_STAT_PAGING) { + memp_read(address, dat, leng); + } + else { + while(leng) { + size = 0x1000 - (address & 0xfff); + size = min(size, leng); + memp_read(physicaladdr(address), dat, size); + address += size; + dat = ((BYTE *)dat) + size; + leng -= size; + } } } @@ -1165,15 +1220,19 @@ void MEMCALL meml_write(UINT32 address, UINT size; - while(leng) { - size = 0x1000 - (address & 0xfff); - size = min(size, leng); - memp_write(realaddr(address), dat, size); - address += size; - dat = ((BYTE *)dat) + size; - leng -= size; + if (!CPU_STAT_PAGING) { + memp_write(address, dat, leng); + } + else { + while(leng) { + size = 0x1000 - (address & 0xfff); + size = min(size, leng); + memp_write(physicaladdr(address), dat, size); + address += size; + dat = ((BYTE *)dat) + size; + leng -= size; + } } } - #endif