--- np2/i386c/ia32/interface.c 2004/03/08 12:56:22 1.17 +++ np2/i386c/ia32/interface.c 2004/03/10 23:01:08 1.19 @@ -1,4 +1,4 @@ -/* $Id: interface.c,v 1.17 2004/03/08 12:56:22 monaka Exp $ */ +/* $Id: interface.c,v 1.19 2004/03/10 23:01:08 yui Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -185,10 +185,19 @@ ia32_step(void) } void CPUCALL -ia32_interrupt(int vect) +ia32_interrupt(int vect, int soft) { - INTERRUPT(vect, FALSE, FALSE, 0); +// TRACEOUT(("int (%x, %x) PE=%d VM=%d", vect, soft, CPU_STAT_PM, CPU_STAT_VM86)); + if (!soft) { + INTERRUPT(vect, FALSE, FALSE, 0); + } + else { + if (CPU_STAT_VM86 && (CPU_STAT_IOPL < CPU_IOPL3) && (soft == -1)) { + TRACEOUT(("BIOS interrupt: VM86 && IOPL < 3 && INTn")); + } + INTERRUPT(vect, TRUE, FALSE, 0); + } } @@ -256,7 +265,11 @@ ia32_bioscall(void) UINT32 adrs; if (!CPU_STAT_PM || CPU_STAT_VM86) { +#if 1 + adrs = (CPU_EIP - 1) + ((CPU_REGS_SREG(CPU_CS_INDEX)) << 4); +#else adrs = (CPU_EIP - 1) + CPU_STAT_CS_BASE; +#endif if ((adrs >= 0xf8000) && (adrs < 0x100000)) { biosfunc(adrs); if (!CPU_STAT_PM || CPU_STAT_VM86) {