--- np2/i286a/i286a.c 2004/01/25 05:41:28 1.9 +++ np2/i286a/i286a.c 2004/01/25 07:53:08 1.12 @@ -115,7 +115,10 @@ void i286a_shut(void) { void i286a_setextsize(UINT32 size) { if (CPU_EXTMEMSIZE != size) { - _MFREE(CPU_EXTMEM); + if (CPU_EXTMEM) { + _MFREE(CPU_EXTMEM); + CPU_EXTMEM = NULL; + } if (size) { CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); if (CPU_EXTMEM == NULL) { @@ -124,9 +127,27 @@ void i286a_setextsize(UINT32 size) { } CPU_EXTMEMSIZE = size; } + i286acore.e.ems[0] = mem + 0xc0000; + i286acore.e.ems[1] = mem + 0xc4000; + i286acore.e.ems[2] = mem + 0xc8000; + i286acore.e.ems[3] = mem + 0xcc000; } void i286a_setemm(UINT frame, UINT32 addr) { + + BYTE *ptr; + + frame &= 3; + if (addr < USE_HIMEM) { + ptr = mem + addr; + } + else if ((addr - 0x100000 + 0x4000) <= CPU_EXTMEMSIZE) { + ptr = CPU_EXTMEM + (addr - 0x100000); + } + else { + ptr = mem + 0xc0000 + (frame << 14); + } + i286acore.e.ems[frame] = ptr; }