--- np2/cbus/pcm86io.c 2004/03/28 19:50:25 1.5 +++ np2/cbus/pcm86io.c 2004/06/17 10:09:46 1.9 @@ -19,6 +19,7 @@ static const SINT32 pcm86rescue[] = {PCM static void IOOUTCALL pcm86_oa460(UINT port, REG8 val) { +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); pcm86.extfunc = val; fmboard_extenable((REG8)(val & 1)); (void)port; @@ -26,6 +27,7 @@ static void IOOUTCALL pcm86_oa460(UINT p static void IOOUTCALL pcm86_oa466(UINT port, REG8 val) { +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); if ((val & 0xe0) == 0xa0) { sound_sync(); pcm86.vol5 = (~val) & 15; @@ -38,6 +40,7 @@ static void IOOUTCALL pcm86_oa468(UINT p REG8 xchgbit; +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); sound_sync(); xchgbit = pcm86.fifo ^ val; // バッファリセット判定 @@ -46,28 +49,35 @@ static void IOOUTCALL pcm86_oa468(UINT p pcm86.wrtpos = 0; pcm86.realbuf = 0; pcm86.virbuf = 0; - pcm86.write = 0; - pcm86.reqirq = 0; pcm86.lastclock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; pcm86.lastclock <<= 6; } + if ((xchgbit & 0x10) && (!(val & 0x10))) { + pcm86.irqflag = 0; +// pcm86.write = 0; +// pcm86.reqirq = 0; + } // サンプリングレート変更 if (xchgbit & 7) { pcm86.rescue = pcm86rescue[val & 7] << pcm86.stepbit; pcm86_setpcmrate(val); } +#if 1 // これ重大なバグ.... + pcm86.fifo = val; +#else pcm86.fifo = val & (~0x10); +#endif if ((xchgbit & 0x80) && (val & 0x80)) { pcm86.lastclock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; pcm86.lastclock <<= 6; } - pcm86.write = 1; pcm86_setnextintr(); (void)port; } static void IOOUTCALL pcm86_oa46a(UINT port, REG8 val) { +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); sound_sync(); if (pcm86.fifo & 0x20) { #if 1 @@ -96,6 +106,27 @@ static void IOOUTCALL pcm86_oa46a(UINT p static void IOOUTCALL pcm86_oa46c(UINT port, REG8 val) { +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); +#if 1 + if (pcm86.virbuf < PCM86_LOGICALBUF) { + pcm86.virbuf++; + } + pcm86.buffer[pcm86.wrtpos] = val; + pcm86.wrtpos = (pcm86.wrtpos + 1) & PCM86_BUFMSK; + pcm86.realbuf++; + // バッファオーバーフローの監視 + if (pcm86.realbuf >= PCM86_REALBUFSIZE) { +#if 1 + pcm86.realbuf -= 4; + pcm86.readpos = (pcm86.readpos + 4) & PCM86_BUFMSK; +#else + pcm86.realbuf &= 3; // align4決めウチ + pcm86.realbuf += PCM86_REALBUFSIZE - 4; +#endif + } +// pcm86.write = 1; + pcm86.reqirq = 1; +#else if (pcm86.virbuf < PCM86_LOGICALBUF) { pcm86.virbuf++; pcm86.buffer[pcm86.wrtpos] = val; @@ -106,9 +137,10 @@ static void IOOUTCALL pcm86_oa46c(UINT p pcm86.realbuf &= 3; // align4決めウチ pcm86.realbuf += PCM86_REALBUFSIZE - 4; } - pcm86.write = 1; +// pcm86.write = 1; pcm86.reqirq = 1; } +#endif (void)port; } @@ -120,25 +152,25 @@ static REG8 IOINPCALL pcm86_ia460(UINT p static REG8 IOINPCALL pcm86_ia466(UINT port) { - UINT32 nowclk; UINT32 past; + UINT32 cnt; + UINT32 stepclock; REG8 ret; - // こんなんでお茶濁すんなら ちゃんと書き直しましょうね 漏れ… - if (!(pcm86.fifo & 0x80)) { - ret = 0; - } - else { - sound_sync(); - nowclk = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; - nowclk <<= 6; - past = nowclk - pcm86.lastclock; - if (past >= pcm86.stepclock) { - RECALC_NOWCLKWAIT; - past = nowclk - pcm86.lastclock; + past = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; + past <<= 6; + past -= pcm86.lastclock; + stepclock = pcm86.stepclock; + if (past >= stepclock) { + cnt = past / stepclock; + pcm86.lastclock += (cnt * stepclock); + past -= cnt * stepclock; + if (pcm86.fifo & 0x80) { + sound_sync(); + RECALC_NOWCLKWAIT(cnt); } - ret = ((past << 1) >= pcm86.stepclock)?1:0; } + ret = ((past << 1) >= stepclock)?1:0; if (pcm86.virbuf >= PCM86_LOGICALBUF) { // バッファフル ret |= 0x80; } @@ -146,6 +178,7 @@ static REG8 IOINPCALL pcm86_ia466(UINT p ret |= 0x40; // ちと変… } (void)port; +// TRACEOUT(("86pcm in %.4x %.2x", port, ret)); return(ret); } @@ -154,6 +187,23 @@ static REG8 IOINPCALL pcm86_ia468(UINT p REG8 ret; ret = pcm86.fifo & (~0x10); +#if 1 + if (pcm86gen_intrq()) { + ret |= 0x10; + } +#elif 1 // むしろこう? + if (pcm86.fifo & 0x20) { + sound_sync(); + if (pcm86.virbuf <= pcm86.fifosize) { + if (pcm86.write) { + pcm86.write = 0; + } + else { + ret |= 0x10; + } + } + } +#else if ((pcm86.write) && (pcm86.fifo & 0x20)) { // pcm86.write = 0; sound_sync(); @@ -162,13 +212,16 @@ static REG8 IOINPCALL pcm86_ia468(UINT p ret |= 0x10; } } +#endif (void)port; +// TRACEOUT(("86pcm in %.4x %.2x", port, ret)); return(ret); } static REG8 IOINPCALL pcm86_ia46a(UINT port) { (void)port; +// TRACEOUT(("86pcm in %.4x %.2x", port, pcm86.dactrl)); return(pcm86.dactrl); }