--- np2/cbus/pcm86io.c 2004/03/30 07:12:03 1.6 +++ 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; // バッファリセット判定 @@ -50,15 +53,20 @@ static void IOOUTCALL pcm86_oa468(UINT p pcm86.lastclock <<= 6; } if ((xchgbit & 0x10) && (!(val & 0x10))) { - pcm86.write = 0; - pcm86.reqirq = 0; + 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; @@ -69,6 +77,7 @@ static void IOOUTCALL pcm86_oa468(UINT p static void IOOUTCALL pcm86_oa46a(UINT port, REG8 val) { +// TRACEOUT(("86pcm out %.4x %.2x", port, val)); sound_sync(); if (pcm86.fifo & 0x20) { #if 1 @@ -97,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; @@ -107,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; } @@ -121,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; } @@ -147,6 +178,7 @@ static REG8 IOINPCALL pcm86_ia466(UINT p ret |= 0x40; // ちと変… } (void)port; +// TRACEOUT(("86pcm in %.4x %.2x", port, ret)); return(ret); } @@ -182,12 +214,14 @@ static REG8 IOINPCALL pcm86_ia468(UINT p } #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); }