--- np2/i386c/ia32/cpu_mem.c 2003/12/11 15:03:16 1.2 +++ np2/i386c/ia32/cpu_mem.c 2004/01/13 16:32:16 1.5 @@ -1,4 +1,4 @@ -/* $Id: cpu_mem.c,v 1.2 2003/12/11 15:03:16 monaka Exp $ */ +/* $Id: cpu_mem.c,v 1.5 2004/01/13 16:32:16 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -31,13 +31,11 @@ #include "cpu.h" #include "memory.h" -// ¤¢¤È¤Ç¡Ä -extern DWORD cpumem_addrmask; - BYTE *cpumem = 0; DWORD extmem_size = 0; BYTE protectmem_size = 0; + /* * initialize 1MB-16MB memory */ @@ -500,7 +498,7 @@ cpu_vmemorywrite_d(int idx, DWORD madr, void MEMCALL cpu_memorywrite_d(DWORD address, DWORD value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM - 3) { __i286_memorywrite_d(adr, value); @@ -511,8 +509,9 @@ cpu_memorywrite_d(DWORD address, DWORD v adr -= LOWMEM; if (adr < extmem_size - 3) { STOREINTELDWORD(cpumem + adr, value); - } else { - ia32_panic("cpu_memorywrite_d: out of universe."); + } else if (adr < extmem_size) { + cpu_memorywrite_w(adr, value & 0xffff); + cpu_memorywrite_w(adr + 2, (value >> 16) & 0xffff); } } } @@ -520,7 +519,7 @@ cpu_memorywrite_d(DWORD address, DWORD v void MEMCALL cpu_memorywrite_w(DWORD address, WORD value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM - 1) { __i286_memorywrite_w(adr, value); @@ -531,8 +530,8 @@ cpu_memorywrite_w(DWORD address, WORD va adr -= LOWMEM; if (adr < extmem_size - 1) { STOREINTELWORD(cpumem + adr, value); - } else { - ia32_panic("cpu_memorywrite_w: out of universe."); + } else if (adr == extmem_size - 1) { + cpumem[adr] = value & 0xff; } } } @@ -540,7 +539,7 @@ cpu_memorywrite_w(DWORD address, WORD va void MEMCALL cpu_memorywrite(DWORD address, BYTE value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM) { __i286_memorywrite(adr, value); @@ -548,8 +547,6 @@ cpu_memorywrite(DWORD address, BYTE valu adr -= LOWMEM; if (adr < extmem_size) { cpumem[adr] = value; - } else { - ia32_panic("cpu_memorywrite: out of universe."); } } } @@ -557,7 +554,7 @@ cpu_memorywrite(DWORD address, BYTE valu DWORD MEMCALL cpu_memoryread_d(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; DWORD val; if (adr < LOWMEM - 3) { @@ -570,8 +567,8 @@ cpu_memoryread_d(DWORD address) if (adr < extmem_size - 3) { val = LOADINTELDWORD(cpumem + adr); } else { - ia32_panic("cpu_memoryread_d: out of universe."); - val = (DWORD)-1; + val = cpu_memoryread_w(adr); + val |= (DWORD)cpu_memoryread_w(adr + 2) << 16; } } return val; @@ -580,7 +577,7 @@ cpu_memoryread_d(DWORD address) WORD MEMCALL cpu_memoryread_w(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; WORD val; if (adr < LOWMEM - 1) { @@ -592,8 +589,9 @@ cpu_memoryread_w(DWORD address) adr -= LOWMEM; if (adr < extmem_size - 1) { val = LOADINTELWORD(cpumem + adr); + } else if (adr == extmem_size - 1) { + val = 0xff00 | cpumem[adr]; } else { - ia32_panic("cpu_memoryread_w: out of universe."); val = (WORD)-1; } } @@ -603,7 +601,7 @@ cpu_memoryread_w(DWORD address) BYTE MEMCALL cpu_memoryread(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; BYTE val; if (adr < LOWMEM) { @@ -613,7 +611,6 @@ cpu_memoryread(DWORD address) if (adr < extmem_size) { val = cpumem[adr]; } else { - ia32_panic("cpu_memoryread: out of universe."); val = (BYTE)-1; } }