--- np2/cbus/pcm86io.c 2003/10/21 11:22:05 1.3 +++ np2/cbus/pcm86io.c 2004/03/30 08:48:46 1.7 @@ -1,5 +1,5 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" #include "pcm86io.h" @@ -10,21 +10,21 @@ extern PCM86CFG pcm86cfg; -static const BYTE pcm86bits[] = {1, 1, 1, 2, 0, 0, 0, 1}; +static const UINT8 pcm86bits[] = {1, 1, 1, 2, 0, 0, 0, 1}; static const SINT32 pcm86rescue[] = {PCM86_RESCUE * 32, PCM86_RESCUE * 24, PCM86_RESCUE * 16, PCM86_RESCUE * 12, PCM86_RESCUE * 8, PCM86_RESCUE * 6, PCM86_RESCUE * 4, PCM86_RESCUE * 3}; -static void IOOUTCALL pcm86_oa460(UINT port, BYTE val) { +static void IOOUTCALL pcm86_oa460(UINT port, REG8 val) { pcm86.extfunc = val; - fmboard_extenable((BYTE)(val & 1)); + fmboard_extenable((REG8)(val & 1)); (void)port; } -static void IOOUTCALL pcm86_oa466(UINT port, BYTE val) { +static void IOOUTCALL pcm86_oa466(UINT port, REG8 val) { if ((val & 0xe0) == 0xa0) { sound_sync(); @@ -34,9 +34,9 @@ static void IOOUTCALL pcm86_oa466(UINT p (void)port; } -static void IOOUTCALL pcm86_oa468(UINT port, BYTE val) { +static void IOOUTCALL pcm86_oa468(UINT port, REG8 val) { - BYTE xchgbit; + REG8 xchgbit; sound_sync(); xchgbit = pcm86.fifo ^ val; @@ -46,10 +46,12 @@ static void IOOUTCALL pcm86_oa468(UINT p pcm86.wrtpos = 0; pcm86.realbuf = 0; pcm86.virbuf = 0; + pcm86.lastclock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; + pcm86.lastclock <<= 6; + } + if ((xchgbit & 0x10) && (!(val & 0x10))) { pcm86.write = 0; pcm86.reqirq = 0; - pcm86.lastclock = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK; - pcm86.lastclock <<= 6; } // サンプリングレート変更 if (xchgbit & 7) { @@ -58,15 +60,14 @@ static void IOOUTCALL pcm86_oa468(UINT p } pcm86.fifo = val & (~0x10); if ((xchgbit & 0x80) && (val & 0x80)) { - pcm86.lastclock = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK; + 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, BYTE val) { +static void IOOUTCALL pcm86_oa46a(UINT port, REG8 val) { sound_sync(); if (pcm86.fifo & 0x20) { @@ -94,7 +95,7 @@ static void IOOUTCALL pcm86_oa46a(UINT p (void)port; } -static void IOOUTCALL pcm86_oa46c(UINT port, BYTE val) { +static void IOOUTCALL pcm86_oa46c(UINT port, REG8 val) { if (pcm86.virbuf < PCM86_LOGICALBUF) { pcm86.virbuf++; @@ -112,27 +113,33 @@ static void IOOUTCALL pcm86_oa46c(UINT p (void)port; } -static BYTE IOINPCALL pcm86_ia460(UINT port) { +static REG8 IOINPCALL pcm86_ia460(UINT port) { (void)port; return(0x40 | (pcm86.extfunc & 1)); } -static BYTE IOINPCALL pcm86_ia466(UINT port) { +static REG8 IOINPCALL pcm86_ia466(UINT port) { - UINT32 nowclk; UINT32 past; - BYTE ret; - - sound_sync(); - nowclk = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK; - nowclk <<= 6; - past = nowclk - pcm86.lastclock; - if (past >= pcm86.stepclock) { - RECALC_NOWCLKWAIT; - past = nowclk - pcm86.lastclock; + UINT32 cnt; + UINT32 stepclock; + REG8 ret; + + 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; } @@ -143,11 +150,28 @@ static BYTE IOINPCALL pcm86_ia466(UINT p return(ret); } -static BYTE IOINPCALL pcm86_ia468(UINT port) { +static REG8 IOINPCALL pcm86_ia468(UINT port) { - BYTE ret; + 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(); @@ -156,17 +180,18 @@ static BYTE IOINPCALL pcm86_ia468(UINT p ret |= 0x10; } } +#endif (void)port; return(ret); } -static BYTE IOINPCALL pcm86_ia46a(UINT port) { +static REG8 IOINPCALL pcm86_ia46a(UINT port) { (void)port; return(pcm86.dactrl); } -static BYTE IOINPCALL pcm86_inpdummy(UINT port) { +static REG8 IOINPCALL pcm86_inpdummy(UINT port) { (void)port; return(0);