--- np2/i386c/memory.c 2004/03/04 17:36:05 1.16 +++ np2/i386c/memory.c 2004/03/19 00:30:01 1.20 @@ -808,11 +808,15 @@ REG8 MEMCALL i286_memoryread(UINT32 addr return(memfn.rd8[(addr >> 15) & 0x1f](addr - 0x00f00000)); } #if defined(SUPPORT_PC9821) - else if (addr >= 0xfff00000) { + else if ((addr >= 0x00f00000) && (addr < 0x00f80000)) { + return(mem9821_r(addr)); + } + else if ((addr >= 0xfff00000) && (addr < 0xfff80000)) { return(mem9821_r(addr)); } #endif else { +// TRACEOUT(("out of mem (read8): %x", addr)); return(0xff); } } @@ -839,11 +843,15 @@ REG16 MEMCALL i286_memoryread_w(UINT32 a return(memfn.rd16[(addr >> 15) & 0x1f](addr - 0x00f00000)); } #if defined(SUPPORT_PC9821) - else if (addr >= 0xfff00000) { + else if ((addr >= 0x00f00000) && (addr < 0x00f80000)) { + return(mem9821_rw(addr)); + } + else if ((addr >= 0xfff00000) && (addr < 0xfff80000)) { return(mem9821_rw(addr)); } #endif else { +// TRACEOUT(("out of mem (read16): %x", addr)); return(0xffff); } } @@ -898,10 +906,16 @@ void MEMCALL i286_memorywrite(UINT32 add memfn.wr8[(addr >> 15) & 0x1f](addr - 0x00f00000, value); } #if defined(SUPPORT_PC9821) - else if (addr >= 0xfff00000) { + else if ((addr >= 0x00f00000) && (addr < 0x00f80000)) { + mem9821_w(addr, value); + } + else if ((addr >= 0xfff00000) && (addr < 0xfff80000)) { mem9821_w(addr, value); } #endif + else { +// TRACEOUT(("out of mem (write8): %x", addr)); + } } else { memfn.wr8[(addr >> 15) & 0x1f](addr, value); @@ -925,10 +939,16 @@ void MEMCALL i286_memorywrite_w(UINT32 a memfn.wr16[(addr >> 15) & 0x1f](addr - 0x00f00000, value); } #if defined(SUPPORT_PC9821) - else if (addr >= 0xfff00000) { + else if ((addr >= 0x00f00000) && (addr < 0x00f80000)) { + mem9821_ww(addr, value); + } + else if ((addr >= 0xfff00000) && (addr < 0xfff80000)) { mem9821_ww(addr, value); } #endif + else { +// TRACEOUT(("out of mem (write16): %x", addr)); + } } else { memfn.wr16[(addr >> 15) & 0x1f](addr, value); @@ -1087,18 +1107,31 @@ void MEMCALL memp_write(UINT32 address, static UINT32 physicaladdr(UINT32 addr) { + UINT32 a; UINT32 pde; UINT32 pte; if (CPU_STAT_PAGING) { - pde = i286_memoryread_d(CPU_STAT_PDE_BASE + ((addr >> 20) & 0xffc)); + a = CPU_STAT_PDE_BASE + ((addr >> 20) & 0xffc); + pde = i286_memoryread_d(a); if (!(pde & CPU_PDE_PRESENT)) { goto retdummy; } - pte = cpu_memoryread_d((pde & CPU_PDE_BASEADDR_MASK) + ((addr >> 10) & 0xffc)); +#if 0 + if (!(pde & CPU_PDE_ACCESS)) { + i286_memorywrite_d(a, pde | CPU_PDE_ACCESS); + } +#endif + a = (pde & CPU_PDE_BASEADDR_MASK) + ((addr >> 10) & 0xffc); + pte = cpu_memoryread_d(a); if (!(pte & CPU_PTE_PRESENT)) { goto retdummy; } +#if 0 + if (!(pte & CPU_PTE_ACCESS)) { + i286_memorywrite_d(a, pte | CPU_PTE_ACCESS); + } +#endif addr = (pte & CPU_PTE_BASEADDR_MASK) + (addr & 0x00000fff); } return(addr); @@ -1107,6 +1140,60 @@ retdummy: return(0x01000000); // てきとーにメモリが存在しない場所 } + +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; @@ -1147,13 +1234,18 @@ void MEMCALL meml_read(UINT32 address, v UINT size; - while(leng) { - size = 0x1000 - (address & 0xfff); - size = min(size, leng); - memp_read(physicaladdr(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; + } } } @@ -1161,15 +1253,19 @@ void MEMCALL meml_write(UINT32 address, UINT size; - while(leng) { - size = 0x1000 - (address & 0xfff); - size = min(size, leng); - memp_write(physicaladdr(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