--- np2/i286c/i286c_mn.c 2003/12/01 10:45:46 1.18 +++ np2/i286c/i286c_mn.c 2003/12/03 07:59:57 1.21 @@ -10,10 +10,6 @@ #define MAX_PREFIX 8 -#define EXISTINTR (isI286EI) && (!pic.ext_irq) && \ - ((pic.pi[0].irr & (~pic.pi[0].imr)) || \ - (pic.pi[1].irr & (~pic.pi[1].imr))) - #define NEXT_OPCODE \ if (I286_REMCLOCK < 1) { \ @@ -938,6 +934,7 @@ I286FN _aaa(void) { // 37: aaa else { I286_FLAGL &= ~(A_FLAG | C_FLAG); } + I286_AL &= 0x0f; } I286FN _cmp_ea_r8(void) { // 38: cmp EA, REG8 @@ -1817,13 +1814,13 @@ I286FN _popf(void) { // 9D: popf UINT flag; - I286_WORKCLOCK(5); REGPOP0(flag) I286_OV = flag & O_FLAG; I286_FLAG = flag & (0xfff ^ O_FLAG); I286_TRAP = ((flag & 0x300) == 0x300); + I286_WORKCLOCK(5); #if defined(INTR_FAST) - if (EXISTINTR) { + if ((flag & I_FLAG) && (PICEXISTINTR)) { I286IRQCHECKTERM } #else @@ -2276,7 +2273,6 @@ I286FN _iret(void) { // CF: iret UINT flag; extirq_pop(); - I286_WORKCLOCK(31); REGPOP0(I286_IP) REGPOP0(I286_CS) REGPOP0(flag) @@ -2284,8 +2280,9 @@ I286FN _iret(void) { // CF: iret I286_FLAG = flag & (0xfff ^ O_FLAG); I286_TRAP = ((flag & 0x300) == 0x300); CS_BASE = I286_CS << 4; + I286_WORKCLOCK(31); #if defined(INTR_FAST) - if (EXISTINTR) { + if ((flag & I_FLAG) && (PICEXISTINTR)) { I286IRQCHECKTERM } #else @@ -2658,13 +2655,17 @@ I286FN _sti(void) { // FB: sti I286_WORKCLOCK(2); #if defined(INTR_FAST) if (I286_FLAG & I_FLAG) { + NEXT_OPCODE; return; // 更新の意味なし } #endif I286_FLAG |= I_FLAG; I286_TRAP = (I286_FLAG & T_FLAG) >> 8; #if defined(INTR_FAST) - if (EXISTINTR) { + if (!PICEXISTINTR) { + NEXT_OPCODE; + } + else { REMAIN_ADJUST(1) } #else