--- np2/io/pit.c 2003/12/26 03:41:05 1.13 +++ np2/io/pit.c 2004/03/12 18:19:57 1.19 @@ -10,35 +10,24 @@ #include "beep.h" -// #define uPD71054 // NP2はuPD8253Cベース #define BEEPCOUNTEREX // BEEPアイドル時のカウンタをα倍に +#if defined(CPUCORE_IA32) +// #define uPD71054 // だめぽ _| ̄|○ +#endif // --- Interval timer -// ver0.31 常に回す… -static void setsystimerevent_noint(BOOL absolute) { - - nevent_set(NEVENT_ITIMER, pc.multiple << 16, systimer_noint, absolute); -} - -void systimer_noint(NEVENTITEM item) { - - if (item->flag & NEVENT_SETEVENT) { - setsystimerevent_noint(NEVENT_RELATIVE); - } -} - static void setsystimerevent(BOOL absolute) { SINT32 cnt; cnt = pit.value[0]; if (cnt > 8) { // 根拠なし - cnt *= pc.multiple; + cnt *= pccore.multiple; } else { - cnt = pc.multiple << 16; + cnt = pccore.multiple << 16; } nevent_set(NEVENT_ITIMER, cnt, systimer, absolute); } @@ -56,7 +45,7 @@ void systimer(NEVENTITEM item) { setsystimerevent(NEVENT_RELATIVE); } else { - nevent_set(NEVENT_ITIMER, pc.multiple << 16, + nevent_set(NEVENT_ITIMER, pccore.multiple << 16, systimer, NEVENT_RELATIVE); } } @@ -72,10 +61,10 @@ static void setbeepeventex(BOOL absolute cnt = pit.value[1]; if (cnt > 2) { - cnt *= pc.multiple; + cnt *= pccore.multiple; } else { - cnt = pc.multiple << 16; + cnt = pccore.multiple << 16; } while(cnt < 0x100000) { cnt <<= 1; @@ -90,10 +79,10 @@ static void setbeepevent(BOOL absolute) cnt = pit.value[1]; if (cnt > 2) { - cnt *= pc.multiple; + cnt *= pccore.multiple; } else { - cnt = pc.multiple << 16; + cnt = pccore.multiple << 16; } nevent_set(NEVENT_BEEP, cnt, beeponeshot, absolute); } @@ -127,10 +116,10 @@ static void setrs232cevent(BOOL absolute SINT32 cnt; if (pit.value[2] > 1) { - cnt = pc.multiple * pit.value[2] * rs232c.mul; + cnt = pccore.multiple * pit.value[2] * rs232c.mul; } else { - cnt = (pc.multiple << 16) * rs232c.mul; + cnt = (pccore.multiple << 16) * rs232c.mul; } nevent_set(NEVENT_RS232C, cnt, rs232ctimer, absolute); } @@ -170,7 +159,7 @@ static UINT pit_latch(int ch) { if (clock < 0) { return(0); } - clock /= pc.multiple; + clock /= pccore.multiple; if (pit.value[1] > 2) { clock %= pit.value[1]; } @@ -182,7 +171,7 @@ static UINT pit_latch(int ch) { } clock = nevent_getremain(NEVENT_ITIMER + ch); if (clock >= 0) { - return(clock / pc.multiple); + return(clock / pccore.multiple); } return(0); } @@ -316,12 +305,38 @@ static void IOOUTCALL pit_o77(UINT port, beep_modeset(); } } +#if defined(uPD71054) + else { + // これ現状じゃだめぽ_| ̄|○ ver0.76に回す… + TRACEOUT(("multiple latch commands - %x", dat)); + for (ch=0; ch<3; ch++) { + if (dat & (2 << ch)) { + if (!(dat & 0x10)) { + } + if (!(dat & 0x20)) { + } + } + } + } +#endif (void)port; } static REG8 IOINPCALL pit_i71(UINT port) { - return(pit_getcount((port >> 1) & 3)); + int ch; + + ch = (port >> 1) & 3; +#if defined(uPD71054) + if (pit.stat[ch]) { + REG8 ret; + ret = pit.stat[ch]; + pit.stat[ch] = 0; + TRACEOUT(("stat out -> %d-%x", ch, ret)); + return(ret); + } +#endif + return(pit_getcount(ch)); } @@ -336,7 +351,7 @@ static const IOINP piti71[4] = { void itimer_reset(void) { ZeroMemory(&pit, sizeof(pit)); - if (pc.cpumode & CPUMODE_8MHz) { + if (pccore.cpumode & CPUMODE_8MHZ) { pit.value[1] = 998; // 4MHz } else { @@ -355,8 +370,12 @@ void itimer_bind(void) { iocore_attachsysoutex(0x0071, 0x0cf1, pito71, 4); iocore_attachsysinpex(0x0071, 0x0cf1, piti71, 4); + iocore_attachout(0x3fd9, pit_o71); iocore_attachout(0x3fdb, pit_o73); + iocore_attachout(0x3fdd, pit_o75); iocore_attachout(0x3fdf, pit_o77); + iocore_attachinp(0x3fd9, pit_i71); iocore_attachinp(0x3fdb, pit_i71); + iocore_attachinp(0x3fdd, pit_i71); }