--- np2/i286c/i286c.c 2004/01/05 15:47:18 1.21 +++ np2/i286c/i286c.c 2005/05/20 13:59:47 1.29 @@ -4,8 +4,11 @@ #include "v30patch.h" #include "pccore.h" #include "iocore.h" -#include "dmap.h" +#include "dmax86.h" #include "i286c.mcr" +#if defined(ENABLE_TRAP) +#include "steptrap.h" +#endif I286CORE i286core; @@ -145,6 +148,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) { @@ -167,10 +180,66 @@ void i286c_shut(void) { i286c_initreg(); } +void i286c_setextsize(UINT32 size) { + + if (CPU_EXTMEMSIZE != size) { + UINT8 *extmem; + extmem = CPU_EXTMEM; + if (extmem != NULL) { + _MFREE(extmem); + extmem = NULL; + } + if (size != 0) { + extmem = (UINT8 *)_MALLOC(size + 16, "EXTMEM"); + } + if (extmem != NULL) { + CPU_EXTMEM = extmem; + CPU_EXTMEMSIZE = size; + CPU_EXTMEMBASE = CPU_EXTMEM - 0x100000; + CPU_EXTLIMIT16 = min(size + 0x100000, 0xf00000); +#if defined(CPU_EXTLIMIT) + CPU_EXTLIMIT = size + 0x100000; +#endif + } + else { + CPU_EXTMEM = NULL; + CPU_EXTMEMSIZE = 0; + CPU_EXTMEMBASE = NULL; + CPU_EXTLIMIT16 = 0; +#if defined(CPU_EXTLIMIT) + CPU_EXTLIMIT = 0; +#endif + } + } + 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) { + + UINT8 *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; +const UINT8 *ptr; + if (vect < 0x10) TRACEOUT(("i286c_intnum - %.2x", vect)); REGPUSH0(REAL_FLAGREG) REGPUSH0(I286_CS) REGPUSH0(IP) @@ -188,7 +257,7 @@ const BYTE *ptr; void CPUCALL i286c_interrupt(REG8 vect) { UINT op; -const BYTE *ptr; +const UINT8 *ptr; op = i286_memoryread(I286_IP + CS_BASE); if (op == 0xf4) { // hlt @@ -214,23 +283,32 @@ void i286c(void) { if (I286_TRAP) { do { +#if defined(ENABLE_TRAP) + steptrap(CPU_CS, CPU_IP); +#endif GET_PCBYTE(opcode); i286op[opcode](); if (I286_TRAP) { i286c_interrupt(1); } - dmap_i286(); + dmax86(); } while(I286_REMCLOCK > 0); } else if (dmac.working) { do { +#if defined(ENABLE_TRAP) + steptrap(CPU_CS, CPU_IP); +#endif GET_PCBYTE(opcode); i286op[opcode](); - dmap_i286(); + dmax86(); } while(I286_REMCLOCK > 0); } else { do { +#if defined(ENABLE_TRAP) + steptrap(CPU_CS, CPU_IP); +#endif GET_PCBYTE(opcode); i286op[opcode](); } while(I286_REMCLOCK > 0); @@ -251,30 +329,14 @@ void i286c_step(void) { if (I286_OV) { I286_FLAG |= (O_FLAG); } - dmap_i286(); -} - - -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); + dmax86(); } // ---- test #if defined(I286C_TEST) -BYTE BYTESZPF(UINT r) { +UINT8 BYTESZPF(UINT r) { if (r & (~0xff)) { TRACEOUT(("BYTESZPF bound error: %x", r)); @@ -282,7 +344,7 @@ BYTE BYTESZPF(UINT r) { return(iflags[r & 0xff]); } -BYTE BYTESZPCF(UINT r) { +UINT8 BYTESZPCF(UINT r) { if (r & (~0x1ff)) { TRACEOUT(("BYTESZPCF bound error: %x", r)); @@ -290,10 +352,10 @@ BYTE BYTESZPCF(UINT r) { return(iflags[r & 0x1ff]); } -BYTE WORDSZPF(UINT32 r) { +UINT8 WORDSZPF(UINT32 r) { - BYTE f1; - BYTE f2; + UINT8 f1; + UINT8 f2; if (r & (~0xffff)) { TRACEOUT(("WORDSZPF bound error: %x", r)); @@ -308,10 +370,10 @@ BYTE WORDSZPF(UINT32 r) { return(f1); } -BYTE WORDSZPCF(UINT32 r) { +UINT8 WORDSZPCF(UINT32 r) { - BYTE f1; - BYTE f2; + UINT8 f1; + UINT8 f2; if ((r & 0xffff0000) && (!(r & 0x00010000))) { TRACEOUT(("WORDSZPCF bound error: %x", r));