--- np2/i386c/memory.c 2004/03/04 16:58:57 1.15 +++ np2/i386c/memory.c 2004/03/29 05:50:29 1.22 @@ -15,16 +15,14 @@ BYTE mem[0x200000]; -#define USE_HIMEM 0x110000 - // ---- write byte -static void MEMCALL i286_wt(UINT32 address, REG8 value) { +static void MEMCALL i286_wt(UINT32 address, REG8 value) { // MAIN mem[address & CPU_ADRSMASK] = (BYTE)value; } -static void MEMCALL tram_wt(UINT32 address, REG8 value) { +static void MEMCALL tram_wt(UINT32 address, REG8 value) { // VRAM CPU_REMCLOCK -= MEMWAIT_TRAM; if (address < 0xa2000) { @@ -56,7 +54,7 @@ static void MEMCALL tram_wt(UINT32 addre } } -static void MEMCALL vram_w0(UINT32 address, REG8 value) { +static void MEMCALL vram_w0(UINT32 address, REG8 value) { // VRAM CPU_REMCLOCK -= MEMWAIT_VRAM; mem[address] = (BYTE)value; @@ -64,7 +62,7 @@ static void MEMCALL vram_w0(UINT32 addre gdcs.grphdisp |= 1; } -static void MEMCALL vram_w1(UINT32 address, REG8 value) { +static void MEMCALL vram_w1(UINT32 address, REG8 value) { // VRAM CPU_REMCLOCK -= MEMWAIT_VRAM; mem[address + VRAM_STEP] = (BYTE)value; @@ -72,7 +70,7 @@ static void MEMCALL vram_w1(UINT32 addre gdcs.grphdisp |= 2; } -static void MEMCALL grcg_rmw0(UINT32 address, REG8 value) { +static void MEMCALL grcg_rmw0(UINT32 address, REG8 value) { // VRAM REG8 mask; BYTE *vram; @@ -101,7 +99,7 @@ static void MEMCALL grcg_rmw0(UINT32 add } } -static void MEMCALL grcg_rmw1(UINT32 address, REG8 value) { +static void MEMCALL grcg_rmw1(UINT32 address, REG8 value) { // VRAM REG8 mask; BYTE *vram; @@ -130,7 +128,7 @@ static void MEMCALL grcg_rmw1(UINT32 add } } -static void MEMCALL grcg_tdw0(UINT32 address, REG8 value) { +static void MEMCALL grcg_tdw0(UINT32 address, REG8 value) { // VRAM BYTE *vram; @@ -154,7 +152,7 @@ static void MEMCALL grcg_tdw0(UINT32 add (void)value; } -static void MEMCALL grcg_tdw1(UINT32 address, REG8 value) { +static void MEMCALL grcg_tdw1(UINT32 address, REG8 value) { // VRAM BYTE *vram; @@ -178,13 +176,25 @@ static void MEMCALL grcg_tdw1(UINT32 add (void)value; } -static void MEMCALL egc_wt(UINT32 address, REG8 value) { +static void MEMCALL egc_wt(UINT32 address, REG8 value) { // VRAM CPU_REMCLOCK -= MEMWAIT_GRCG; egc_write(address, value); } -static void MEMCALL i286_wb(UINT32 address, REG8 value) { +static void MEMCALL emmc_wt(UINT32 address, REG8 value) { + + CPU_EMSPTR[(address >> 14) & 3][LOW14(address)] = (BYTE)value; +} + +static void MEMCALL i286_wd(UINT32 address, REG8 value) { // D0000〜DFFFF + + if (CPU_RAM_D000 & (1 << ((address >> 12) & 15))) { + mem[address] = (BYTE)value; + } +} + +static void MEMCALL i286_wb(UINT32 address, REG8 value) { // F8000〜FFFFF mem[address + 0x1c8000 - 0xe8000] = (BYTE)value; } @@ -284,6 +294,11 @@ static REG8 MEMCALL egc_rd(UINT32 addres return(egc_read(address)); } +static REG8 MEMCALL emmc_rd(UINT32 address) { + + return(CPU_EMSPTR[(address >> 14) & 3][LOW14(address)]); +} + static REG8 MEMCALL i286_rb(UINT32 address) { if (CPU_ITFBANK) { @@ -456,10 +471,48 @@ static void MEMCALL egcw_wt(UINT32 addre } } +static void MEMCALL emmcw_wt(UINT32 address, REG16 value) { + + BYTE *ptr; + + if ((address & 0x3fff) != 0x3fff) { + ptr = CPU_EMSPTR[(address >> 14) & 3] + LOW14(address); + STOREINTELWORD(ptr, value); + } + else { + CPU_EMSPTR[(address >> 14) & 3][0x3fff] = (BYTE)value; + CPU_EMSPTR[((address + 1) >> 14) & 3][0] = (BYTE)(value >> 8); + } +} + +static void MEMCALL i286w_wd(UINT32 address, REG16 value) { + + BYTE *ptr; + UINT16 bit; + + ptr = mem + address; + bit = 1 << ((address >> 12) & 15); + if ((address + 1) & 0xfff) { + if (CPU_RAM_D000 & bit) { + STOREINTELWORD(ptr, value); + } + } + else { + if (CPU_RAM_D000 & bit) { + ptr[0] = (UINT8)value; + } + if (CPU_RAM_D000 & (bit << 1)) { + ptr[1] = (UINT8)(value >> 8); + } + } +} + static void MEMCALL i286w_wb(UINT32 address, REG16 value) { - mem[address + 0x1c8000 - 0xe8000] = (BYTE)value; - mem[address + 0x1c8001 - 0xe8000] = (BYTE)(value >> 8); + BYTE *ptr; + + ptr = mem + (address + 0x1c8000 - 0xe8000); + STOREINTELWORD(ptr, value); } static void MEMCALL i286w_wn(UINT32 address, REG16 value) { @@ -588,6 +641,22 @@ static REG16 MEMCALL egcw_rd(UINT32 addr } } +static REG16 MEMCALL emmcw_rd(UINT32 address) { + +const BYTE *ptr; + REG16 ret; + + if ((address & 0x3fff) != 0x3fff) { + ptr = CPU_EMSPTR[(address >> 14) & 3] + LOW14(address); + return(LOADINTELWORD(ptr)); + } + else { + ret = CPU_EMSPTR[(address >> 14) & 3][0x3fff]; + ret += CPU_EMSPTR[((address + 1) >> 14) & 3][0] << 8; + return(ret); + } +} + static REG16 MEMCALL i286w_rb(UINT32 address) { if (CPU_ITFBANK) { @@ -612,14 +681,12 @@ typedef struct { } MEMFN; typedef struct { - MEM8READ brd8; - MEM8READ ird8; - MEM8WRITE ewr8; - MEM8WRITE bwr8; - MEM16READ brd16; - MEM16READ ird16; - MEM16WRITE ewr16; - MEM16WRITE bwr16; + MEM8READ brd8; // E8000-F7FFF byte read + MEM8READ ird8; // F8000-FFFFF byte read + MEM8WRITE bwr8; // E8000-FFFFF byte write + MEM16READ brd16; // E8000-F7FFF word read + MEM16READ ird16; // F8000-FFFFF word read + MEM16WRITE bwr16; // F8000-FFFFF word write } MMAPTBL; typedef struct { @@ -636,7 +703,7 @@ static MEMFN memfn = { i286_rd, i286_rd, i286_rd, i286_rd, // 60 i286_rd, i286_rd, i286_rd, i286_rd, // 80 tram_rd, vram_r0, vram_r0, vram_r0, // a0 - i286_rd, i286_rd, i286_rd, i286_rd, // c0 + emmc_rd, emmc_rd, i286_rd, i286_rd, // c0 vram_r0, i286_rd, i286_rd, i286_rb}, // e0 {i286_wt, i286_wt, i286_wt, i286_wt, // 00 @@ -645,7 +712,7 @@ static MEMFN memfn = { i286_wt, i286_wt, i286_wt, i286_wt, // 60 i286_wt, i286_wt, i286_wt, i286_wt, // 80 tram_wt, vram_w0, vram_w0, vram_w0, // a0 - i286_wn, i286_wn, i286_wn, i286_wn, // c0 + emmc_wt, emmc_wt, i286_wd, i286_wd, // c0 vram_w0, i286_wn, i286_wn, i286_wn}, // e0 {i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 00 @@ -654,7 +721,7 @@ static MEMFN memfn = { i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 60 i286w_rd, i286w_rd, i286w_rd, i286w_rd, // 80 tramw_rd, vramw_r0, vramw_r0, vramw_r0, // a0 - i286w_rd, i286w_rd, i286w_rd, i286w_rd, // c0 + emmcw_rd, emmcw_rd, i286w_rd, i286w_rd, // c0 vramw_r0, i286w_rd, i286w_rd, i286w_rb}, // e0 {i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 00 @@ -663,14 +730,14 @@ static MEMFN memfn = { i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 60 i286w_wt, i286w_wt, i286w_wt, i286w_wt, // 80 tramw_wt, vramw_w0, vramw_w0, vramw_w0, // a0 - i286w_wn, i286w_wn, i286w_wn, i286w_wn, // c0 + emmcw_wt, emmcw_wt, i286w_wd, i286w_wd, // c0 vramw_w0, i286w_wn, i286w_wn, i286w_wn}}; // e0 static const MMAPTBL mmaptbl[2] = { - {i286_rd, i286_rb, i286_wn, i286_wn, - i286w_rd, i286w_rb, i286w_wn, i286w_wn}, - {i286_rb, i286_rb, i286_wt, i286_wb, - i286w_rb, i286w_rb, i286w_wt, i286w_wb}}; + {i286_rd, i286_rb, i286_wn, + i286w_rd, i286w_rb, i286w_wn}, + {i286_rb, i286_rb, i286_wb, + i286w_rb, i286w_rb, i286w_wb}}; static const VACCTBL vacctbl[0x10] = { {vram_r0, vram_w0, vramw_r0, vramw_w0}, // 00 @@ -713,9 +780,6 @@ const MMAPTBL *mm; memfn.rd8[0xe8000 >> 15] = mm->brd8; memfn.rd8[0xf0000 >> 15] = mm->brd8; memfn.rd8[0xf8000 >> 15] = mm->ird8; - - memfn.wr8[0xd0000 >> 15] = mm->ewr8; - memfn.wr8[0xd8000 >> 15] = mm->ewr8; memfn.wr8[0xe8000 >> 15] = mm->bwr8; memfn.wr8[0xf0000 >> 15] = mm->bwr8; memfn.wr8[0xf8000 >> 15] = mm->bwr8; @@ -723,9 +787,6 @@ const MMAPTBL *mm; memfn.rd16[0xe8000 >> 15] = mm->brd16; memfn.rd16[0xf0000 >> 15] = mm->brd16; memfn.rd16[0xf8000 >> 15] = mm->ird16; - - memfn.wr16[0xd0000 >> 15] = mm->ewr16; - memfn.wr16[0xd8000 >> 15] = mm->ewr16; memfn.wr16[0xe8000 >> 15] = mm->bwr16; memfn.wr16[0xf0000 >> 15] = mm->bwr16; memfn.wr16[0xf8000 >> 15] = mm->bwr16; @@ -808,11 +869,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 +904,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,12 +967,15 @@ 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(("mem_w %x %x", addr, value)); +// TRACEOUT(("out of mem (write8): %x", addr)); } } else { @@ -928,10 +1000,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); @@ -1088,20 +1166,33 @@ void MEMCALL memp_write(UINT32 address, // ---- Logical Space (BIOS) -static UINT32 realaddr(UINT32 addr) { +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); @@ -1110,7 +1201,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 +1266,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 +1284,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 +1295,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 +1314,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