--- np2/i286c/i286c.c 2004/01/05 05:04:53 1.20 +++ np2/i286c/i286c.c 2004/01/25 05:41:28 1.23 @@ -94,9 +94,9 @@ const UINT8 iflags[512] = { // Z_FLA void i286c_initialize(void) { +#if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2) UINT i; - UINT bit; - REG8 f; +#endif #if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2) for (i=0; i<0x100; i++) { @@ -124,6 +124,8 @@ void i286c_initialize(void) { #if !defined(MEMOPTIMIZE) for (i=0; i<0x10000; i++) { + REG8 f; + UINT bit; f = P_FLAG; for (bit=0x80; bit; bit>>=1) { if (i & bit) { @@ -143,6 +145,16 @@ void i286c_initialize(void) { i286cea_initialize(); #endif v30cinit(); + ZeroMemory(&i286core, sizeof(i286core)); +} + +void i286c_deinitialize(void) { + + if (CPU_EXTMEM) { + _MFREE(CPU_EXTMEM); + CPU_EXTMEM = NULL; + CPU_EXTMEMSIZE = 0; + } } static void i286c_initreg(void) { @@ -150,12 +162,12 @@ static void i286c_initreg(void) { I286_CS = 0xf000; CS_BASE = 0xf0000; I286_IP = 0xfff0; - i286core.s.adrsmask = 0xfffff; + I286_ADRSMASK = 0xfffff; } void i286c_reset(void) { - ZeroMemory(&I286_STAT, sizeof(I286_STAT)); + ZeroMemory(&i286core.s, sizeof(i286core.s)); i286c_initreg(); } @@ -165,6 +177,42 @@ void i286c_shut(void) { i286c_initreg(); } +void i286c_setextsize(UINT32 size) { + + if (CPU_EXTMEMSIZE != size) { + _MFREE(CPU_EXTMEM); + if (size) { + CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); + if (CPU_EXTMEM == NULL) { + size = 0; + } + } + CPU_EXTMEMSIZE = size; + } + i286core.e.ems[0] = mem + 0xc0000; + i286core.e.ems[1] = mem + 0xc4000; + i286core.e.ems[2] = mem + 0xc8000; + i286core.e.ems[3] = mem + 0xcc000; +} + +void i286c_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); + } + i286core.e.ems[frame] = ptr; +} + + void CPUCALL i286c_intnum(UINT vect, REG16 IP) { const BYTE *ptr; @@ -253,22 +301,6 @@ void i286c_step(void) { } -UINT32 i286c_selector(UINT sel) { - - I286DTR *dtr; - UINT32 addr; - UINT32 ret; - - dtr = (sel & 4)?&I286_LDTRC:&I286_GDTR; - addr = (dtr->base24 << 16) + dtr->base + (sel & (~7)); - ret = i286_memoryread_w(addr+2); - ret += i286_memoryread(addr+4) << 16; - TRACEOUT(("selector idx=%x %s rpl=%d - real addr = %.6x", - (sel >> 3), (sel & 4)?"LDT":"GDT", sel & 3, ret)); - return(ret); -} - - // ---- test #if defined(I286C_TEST)