--- np2/sound/fmtimer.c 2004/01/22 01:10:04 1.7 +++ np2/sound/fmtimer.c 2007/10/26 14:38:33 1.12 @@ -6,7 +6,38 @@ #include "fmboard.h" -static const BYTE irqtable[4] = {0x03, 0x0d, 0x0a, 0x0c}; +static const UINT8 irqtable[4] = {0x03, 0x0d, 0x0a, 0x0c}; + + +static void set_fmtimeraevent(BOOL absolute) { + + SINT32 l; + + l = 18 * (1024 - fmtimer.timera); + if (pccore.cpumode & CPUMODE_8MHZ) { // 4MHz + l = (l * 1248 / 625) * pccore.multiple; + } + else { // 5MHz + l = (l * 1536 / 625) * pccore.multiple; + } +// TRACEOUT(("FMTIMER-A: %08x-%d", l, absolute)); + nevent_set(NEVENT_FMTIMERA, l, fmport_a, absolute); +} + +static void set_fmtimerbevent(BOOL absolute) { + + SINT32 l; + + l = 288 * (256 - fmtimer.timerb); + if (pccore.cpumode & CPUMODE_8MHZ) { // 4MHz + l = (l * 1248 / 625) * pccore.multiple; + } + else { // 5MHz + l = (l * 1536 / 625) * pccore.multiple; + } +// TRACEOUT(("FMTIMER-B: %08x-%d", l, absolute)); + nevent_set(NEVENT_FMTIMERB, l, fmport_b, absolute); +} void fmport_a(NEVENTITEM item) { @@ -14,24 +45,17 @@ void fmport_a(NEVENTITEM item) { BOOL intreq = FALSE; if (item->flag & NEVENT_SETEVENT) { + intreq = pcm86gen_intrq(); if (fmtimer.reg & 0x04) { fmtimer.status |= 0x01; intreq = TRUE; } - if (pcm86.fifo & 0x20) { - sound_sync(); - if (pcm86.virbuf <= pcm86.fifosize) { - intreq = TRUE; - } - } if (intreq) { - pcm86.write = 1; pic_setirq(fmtimer.irq); // TRACEOUT(("fm int-A")); } -// TRACE_("A: fifo = ", pcm86.fifo); -// TRACE_("A: virbuf = ", pcm86.virbuf); -// TRACE_("A: fifosize = ", pcm86.fifosize); + + set_fmtimeraevent(FALSE); } } @@ -40,71 +64,30 @@ void fmport_b(NEVENTITEM item) { BOOL intreq = FALSE; if (item->flag & NEVENT_SETEVENT) { + intreq = pcm86gen_intrq(); if (fmtimer.reg & 0x08) { fmtimer.status |= 0x02; intreq = TRUE; } - if (pcm86.fifo & 0x20) { - sound_sync(); - if (pcm86.virbuf <= pcm86.fifosize) { - intreq = TRUE; - } - } if (intreq) { - pcm86.write = 1; pic_setirq(fmtimer.irq); // TRACEOUT(("fm int-B")); } -// TRACE_("B: fifo = ", pcm86.fifo); -// TRACE_("B: virbuf = ", pcm86.virbuf); -// TRACE_("B: fifosize = ", pcm86.fifosize); - } -} - -static void set_fmtimeraevent(BOOL absolute) { - - SINT32 l; - - l = 18 * (1024 - fmtimer.timera); - if (pccore.cpumode & CPUMODE_8MHz) { // 4MHz - l = (l * 1248 / 625) * pccore.multiple; - } - else { // 5MHz - l = (l * 1536 / 625) * pccore.multiple; - } - nevent_set(NEVENT_FMTIMERA, l, fmport_a, absolute); -} - -static void set_fmtimerbevent(BOOL absolute) { - - SINT32 l; - l = 288 * (256 - fmtimer.timerb); - if (pccore.cpumode & CPUMODE_8MHz) { // 4MHz - l = (l * 1248 / 625) * pccore.multiple; - } - else { // 5MHz - l = (l * 1536 / 625) * pccore.multiple; + set_fmtimerbevent(FALSE); } - nevent_set(NEVENT_FMTIMERB, l, fmport_b, absolute); } void fmtimer_reset(UINT irq) { ZeroMemory(&fmtimer, sizeof(fmtimer)); - -#if 0 // move - fmtimer.reg = 0x3f; - set_fmtimeraevent(NEVENT_ABSOLUTE); - set_fmtimerbevent(NEVENT_ABSOLUTE); -#endif fmtimer.intr = irq & 0xc0; fmtimer.intdisabel = irq & 0x10; fmtimer.irq = irqtable[irq >> 6]; // pic_registext(fmtimer.irq); } -void fmtimer_setreg(REG8 reg, REG8 value) { +void fmtimer_setreg(UINT reg, REG8 value) { // TRACEOUT(("fm %x %x [%.4x:%.4x]", reg, value, CPU_CS, CPU_IP)); @@ -122,7 +105,6 @@ void fmtimer_setreg(REG8 reg, REG8 value break; case 0x27: -#if 1 fmtimer.reg = value; fmtimer.status &= ~((value & 0x30) >> 4); if (value & 0x01) { @@ -133,6 +115,7 @@ void fmtimer_setreg(REG8 reg, REG8 value else { nevent_reset(NEVENT_FMTIMERA); } + if (value & 0x02) { if (!nevent_iswork(NEVENT_FMTIMERB)) { set_fmtimerbevent(NEVENT_ABSOLUTE); @@ -141,19 +124,10 @@ void fmtimer_setreg(REG8 reg, REG8 value else { nevent_reset(NEVENT_FMTIMERB); } + if (!(value & 0x03)) { pic_resetirq(fmtimer.irq); } -#else - fmtimer.reg = value; - fmtimer.status &= ~((value & 0x30) >> 4); - if ((value & 0x10) && (!nevent_iswork(NEVENT_FMTIMERA))) { - set_fmtimeraevent(NEVENT_ABSOLUTE); - } - if ((value & 0x20) && (!nevent_iswork(NEVENT_FMTIMERB))) { - set_fmtimerbevent(NEVENT_ABSOLUTE); - } -#endif break; } }