--- np2/i386c/memory.c 2004/03/19 00:30:01 1.20 +++ np2/i386c/memory.c 2004/04/05 09:45:06 1.24 @@ -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; @@ -735,10 +796,10 @@ void MEMCALL i286_vram_dispatch(UINT fun const VACCTBL *vacc; - vacc = vacctbl + (func & 0x0f); #if defined(SUPPORT_PC9821) if (!(func & 0x20)) { #endif + vacc = vacctbl + (func & 0x0f); memfn.rd8[0xa8000 >> 15] = vacc->rd8; memfn.rd8[0xb0000 >> 15] = vacc->rd8; memfn.rd8[0xb8000 >> 15] = vacc->rd8; @@ -770,22 +831,22 @@ const VACCTBL *vacc; else { memfn.rd8[0xa8000 >> 15] = mem9821_b0r; memfn.rd8[0xb0000 >> 15] = mem9821_b0r; - memfn.rd8[0xb8000 >> 15] = vacc->rd8; + memfn.rd8[0xb8000 >> 15] = i286_nonram_r; memfn.rd8[0xe0000 >> 15] = mem9821_b2r; memfn.wr8[0xa8000 >> 15] = mem9821_b0w; memfn.wr8[0xb0000 >> 15] = mem9821_b0w; - memfn.wr8[0xb8000 >> 15] = vacc->wr8; + memfn.wr8[0xb8000 >> 15] = i286_wn; memfn.wr8[0xe0000 >> 15] = mem9821_b2w; memfn.rd16[0xa8000 >> 15] = mem9821_b0rw; memfn.rd16[0xb0000 >> 15] = mem9821_b0rw; - memfn.rd16[0xb8000 >> 15] = vacc->rd16; + memfn.rd16[0xb8000 >> 15] = i286_nonram_rw; memfn.rd16[0xe0000 >> 15] = mem9821_b2rw; memfn.wr16[0xa8000 >> 15] = mem9821_b0ww; memfn.wr16[0xb0000 >> 15] = mem9821_b0ww; - memfn.wr16[0xb8000 >> 15] = vacc->wr16; + memfn.wr16[0xb8000 >> 15] = i286w_wn; memfn.wr16[0xe0000 >> 15] = mem9821_b2ww; } #endif @@ -1105,35 +1166,32 @@ void MEMCALL memp_write(UINT32 address, // ---- Logical Space (BIOS) -static UINT32 physicaladdr(UINT32 addr) { +static UINT32 physicaladdr(UINT32 addr, BOOL wr) { UINT32 a; UINT32 pde; UINT32 pte; - if (CPU_STAT_PAGING) { - a = CPU_STAT_PDE_BASE + ((addr >> 20) & 0xffc); - pde = i286_memoryread_d(a); - if (!(pde & CPU_PDE_PRESENT)) { - goto retdummy; - } -#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); + a = CPU_STAT_PDE_BASE + ((addr >> 20) & 0xffc); + pde = i286_memoryread_d(a); + if (!(pde & CPU_PDE_PRESENT)) { + goto retdummy; + } + if (!(pde & CPU_PDE_ACCESS)) { + i286_memorywrite(a, (UINT8)(pde | CPU_PDE_ACCESS)); + } + a = (pde & CPU_PDE_BASEADDR_MASK) + ((addr >> 10) & 0xffc); + pte = cpu_memoryread_d(a); + if (!(pte & CPU_PTE_PRESENT)) { + goto retdummy; + } + if (!(pte & CPU_PTE_ACCESS)) { + i286_memorywrite(a, (UINT8)(pte | CPU_PTE_ACCESS)); + } + if ((wr) && (!(pte & CPU_PTE_DIRTY))) { + i286_memorywrite(a, (UINT8)(pte | CPU_PTE_DIRTY)); } + addr = (pte & CPU_PTE_BASEADDR_MASK) + (addr & 0x00000fff); return(addr); retdummy: @@ -1147,7 +1205,7 @@ REG8 MEMCALL meml_read8(UINT seg, UINT o addr = (seg << 4) + LOW16(off); if (CPU_STAT_PAGING) { - addr = physicaladdr(addr); + addr = physicaladdr(addr, FALSE); } return(i286_memoryread(addr)); } @@ -1161,7 +1219,7 @@ REG16 MEMCALL meml_read16(UINT seg, UINT return(i286_memoryread_w(addr)); } else if ((addr + 1) & 0xfff) { - return(i286_memoryread_w(physicaladdr(addr))); + return(i286_memoryread_w(physicaladdr(addr, FALSE))); } return(meml_read8(seg, off) + (meml_read8(seg, off + 1) << 8)); } @@ -1172,7 +1230,7 @@ void MEMCALL meml_write8(UINT seg, UINT addr = (seg << 4) + LOW16(off); if (CPU_STAT_PAGING) { - addr = physicaladdr(addr); + addr = physicaladdr(addr, TRUE); } i286_memorywrite(addr, dat); } @@ -1186,7 +1244,7 @@ void MEMCALL meml_write16(UINT seg, UINT i286_memorywrite_w(addr, dat); } else if ((addr + 1) & 0xfff) { - i286_memorywrite_w(physicaladdr(addr), dat); + i286_memorywrite_w(physicaladdr(addr, TRUE), dat); } else { meml_write8(seg, off, (REG8)dat); @@ -1196,16 +1254,21 @@ void MEMCALL meml_write16(UINT seg, UINT void MEMCALL meml_readstr(UINT seg, UINT off, void *dat, UINT leng) { - UINT32 adrs; + UINT32 addr; + UINT rem; UINT size; while(leng) { off = LOW16(off); - adrs = (seg << 4) + off; - size = 0x1000 - (adrs & 0xfff); - size = min(size, leng); - size = min(size, 0x10000 - off); - memp_read(physicaladdr(adrs), dat, size); + addr = (seg << 4) + off; + rem = 0x10000 - off; + size = min(leng, rem); + if (CPU_STAT_PAGING) { + rem = 0x1000 - (addr & 0xfff); + size = min(size, rem); + addr = physicaladdr(addr, FALSE); + } + memp_read(addr, dat, size); off += size; dat = ((BYTE *)dat) + size; leng -= size; @@ -1214,16 +1277,21 @@ void MEMCALL meml_readstr(UINT seg, UINT void MEMCALL meml_writestr(UINT seg, UINT off, const void *dat, UINT leng) { - UINT32 adrs; + UINT32 addr; + UINT rem; UINT size; while(leng) { off = LOW16(off); - adrs = (seg << 4) + off; - size = 0x1000 - (adrs & 0xfff); - size = min(size, leng); - size = min(size, 0x10000 - off); - memp_write(physicaladdr(adrs), dat, size); + addr = (seg << 4) + off; + rem = 0x10000 - off; + size = min(leng, rem); + if (CPU_STAT_PAGING) { + rem = 0x1000 - (addr & 0xfff); + size = min(size, rem); + addr = physicaladdr(addr, TRUE); + } + memp_write(addr, dat, size); off += size; dat = ((BYTE *)dat) + size; leng -= size; @@ -1241,7 +1309,7 @@ void MEMCALL meml_read(UINT32 address, v while(leng) { size = 0x1000 - (address & 0xfff); size = min(size, leng); - memp_read(physicaladdr(address), dat, size); + memp_read(physicaladdr(address, FALSE), dat, size); address += size; dat = ((BYTE *)dat) + size; leng -= size; @@ -1260,7 +1328,7 @@ void MEMCALL meml_write(UINT32 address, while(leng) { size = 0x1000 - (address & 0xfff); size = min(size, leng); - memp_write(physicaladdr(address), dat, size); + memp_write(physicaladdr(address, TRUE), dat, size); address += size; dat = ((BYTE *)dat) + size; leng -= size;