--- np2/io/pit.c 2003/11/12 20:02:54 1.5 +++ np2/io/pit.c 2003/11/28 08:01:33 1.8 @@ -45,15 +45,21 @@ static void setsystimerevent(BOOL absolu void systimer(NEVENTITEM item) { if (item->flag & NEVENT_SETEVENT) { + if (pit.intr[0]) { + pit.intr[0] = 0; + pic_setirq(0); +// TRACEOUT(("int-08 [%.2x]", pit.mode[0])); + } if ((pit.mode[0] & 0x0c) == 0x04) { // レートジェネレータ + pit.intr[0] = 1; setsystimerevent(NEVENT_RELATIVE); } else { - setsystimerevent_noint(NEVENT_RELATIVE); + nevent_set(NEVENT_ITIMER, pc.multiple << 16, + systimer, NEVENT_RELATIVE); } } - pic_setirq(0); } @@ -117,6 +123,7 @@ void rs232ctimer(NEVENTITEM item) { rs232c_callback(); } + // --------------------------------------------------------------------------- static UINT16 itimer_latch(int ch) { @@ -141,7 +148,6 @@ static UINT16 itimer_latch(int ch) { return(0); } - void itimer_setflag(int ch, BYTE value) { pit.flag[ch] = 0; @@ -215,11 +221,12 @@ BYTE itimer_getcount(int ch) { // system timer static void IOOUTCALL pit_o71(UINT port, BYTE dat) { -// TRACEOUT(("pic71: %d", dat)); +// TRACEOUT(("pic o71: %x [%.4x %.4x]", dat, I286_CS, I286_IP)); if (itimer_setcount(0, dat)) { return; } pic.pi[0].irr &= (~1); + pit.intr[0] = 1; setsystimerevent(NEVENT_ABSOLUTE); (void)port; } @@ -256,14 +263,15 @@ static void IOOUTCALL pit_o77(UINT port, int ch; -// TRACEOUT(("pic77: %x", dat)); +// TRACEOUT(("pic o77: %x", dat)); ch = (dat >> 6) & 3; if (ch != 3) { itimer_setflag(ch, dat); if (ch == 0) { // 書込みで itimerのirrがリセットされる… pic.pi[0].irr &= (~1); if (dat & 0x30) { // 一応ラッチ時は割り込みをセットしない - setsystimerevent(NEVENT_ABSOLUTE); + pit.intr[0] = 1; +// setsystimerevent(NEVENT_ABSOLUTE); } } if (ch == 1) {