--- np2/cbus/pcm86io.c 2004/03/30 08:48:46 1.7 +++ 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; } @@ -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); }