--- np2/sound/pcm86c.c 2004/01/13 05:30:59 1.4 +++ np2/sound/pcm86c.c 2004/06/02 11:02:53 1.8 @@ -35,10 +35,10 @@ void pcm86gen_setvol(UINT vol) { pcm86gen_update(); } -void pcm86_reset(void) { // ver0.28 +void pcm86_reset(void) { ZeroMemory(&pcm86, sizeof(pcm86)); - pcm86.fifosize = 0x80; // ver0.29 + pcm86.fifosize = 0x80; pcm86.dactrl = 0x32; pcm86.stepmask = (1 << 2) - 1; pcm86.stepbit = 2; @@ -68,13 +68,14 @@ void pcm86_setpcmrate(REG8 val) { } } -void pcm86_cb(NEVENTITEM item) { // ver0.29 +void pcm86_cb(NEVENTITEM item) { if (pcm86.reqirq) { sound_sync(); // RECALC_NOWCLKP; if (pcm86.virbuf <= pcm86.fifosize) { pcm86.reqirq = 0; + pcm86.irqflag = 1; pic_setirq(fmtimer.irq); } else { @@ -97,11 +98,11 @@ void pcm86_setnextintr(void) { // cnt += 4; // ちょっと延滞させる // ここで clk = pccore.realclock * cnt / 86pcm_rate // clk = ((pccore.baseclock / 86pcm_rate) * cnt) * pccore.multiple - if (pccore.baseclock == PCBASECLOCK25) { - clk = clk25_128[pcm86.fifo & 7]; + if (pccore.cpumode & CPUMODE_8MHZ) { + clk = clk20_128[pcm86.fifo & 7]; } else { - clk = clk20_128[pcm86.fifo & 7]; + clk = clk25_128[pcm86.fifo & 7]; } // cntは最大 8000h で 32bitで収まるように… clk *= cnt; @@ -122,7 +123,9 @@ void SOUNDCALL pcm86gen_checkbuf(void) { past <<= 6; past -= pcm86.lastclock; if (past >= pcm86.stepclock) { - RECALC_NOWCLKWAIT; + past = past / pcm86.stepclock; + pcm86.lastclock += (past * pcm86.stepclock); + RECALC_NOWCLKWAIT(past); } bufs = pcm86.realbuf - pcm86.virbuf; @@ -131,6 +134,7 @@ void SOUNDCALL pcm86gen_checkbuf(void) { pcm86.virbuf += bufs; if (pcm86.virbuf <= pcm86.fifosize) { pcm86.reqirq = 0; + pcm86.irqflag = 1; pic_setirq(fmtimer.irq); } else { @@ -147,3 +151,20 @@ void SOUNDCALL pcm86gen_checkbuf(void) { } } + +BOOL pcm86gen_intrq(void) { + + if (pcm86.irqflag) { + return(TRUE); + } + if (pcm86.fifo & 0x20) { + sound_sync(); + if ((pcm86.reqirq) && (pcm86.virbuf <= pcm86.fifosize)) { + pcm86.reqirq = 0; + pcm86.irqflag = 1; + return(TRUE); + } + } + return(FALSE); +} +