--- np2/sound/pcm86c.c 2003/10/16 17:58:07 1.1 +++ np2/sound/pcm86c.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 "sound.h" @@ -35,16 +35,16 @@ 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; - pcm86.stepclock = (pc.baseclock << 6); + pcm86.stepclock = (pccore.baseclock << 6); pcm86.stepclock /= 44100; - pcm86.stepclock *= pc.multiple; + pcm86.stepclock *= pccore.multiple; pcm86.rescue = (PCM86_RESCUE * 32) << 2; } @@ -54,21 +54,21 @@ void pcm86gen_update(void) { pcm86_setpcmrate(pcm86.fifo); } -void pcm86_setpcmrate(BYTE val) { +void pcm86_setpcmrate(REG8 val) { SINT32 rate; rate = pcm86rate8[val & 7]; - pcm86.stepclock = (pc.baseclock << 6); + pcm86.stepclock = (pccore.baseclock << 6); pcm86.stepclock /= rate; - pcm86.stepclock *= (pc.multiple << 3); + pcm86.stepclock *= (pccore.multiple << 3); if (pcm86cfg.rate) { pcm86.div = (rate << (PCM86_DIVBIT - 3)) / pcm86cfg.rate; pcm86.div2 = (pcm86cfg.rate << (PCM86_DIVBIT + 3)) / rate; } } -void pcm86_cb(NEVENTITEM item) { // ver0.29 +void pcm86_cb(NEVENTITEM item) { if (pcm86.reqirq) { sound_sync(); @@ -95,19 +95,19 @@ void pcm86_setnextintr(void) { cnt += pcm86.stepmask; cnt >>= pcm86.stepbit; // cnt += 4; // ちょっと延滞させる - // ここで clk = pc.realclock * cnt / 86pcm_rate - // clk = ((pc.baseclock / 86pcm_rate) * cnt) * pc.multiple - if (pc.baseclock == PCBASECLOCK25) { - clk = clk25_128[pcm86.fifo & 7]; + // ここで clk = pccore.realclock * cnt / 86pcm_rate + // clk = ((pccore.baseclock / 86pcm_rate) * cnt) * pccore.multiple + 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; clk >>= 7; // clk++; // roundup - clk *= pc.multiple; + clk *= pccore.multiple; nevent_set(NEVENT_86PCM, clk, pcm86_cb, NEVENT_ABSOLUTE); } } @@ -118,11 +118,13 @@ void SOUNDCALL pcm86gen_checkbuf(void) { long bufs; UINT32 past; - past = nevent.clock + nevent.baseclock - nevent.remainclock; + past = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; 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; @@ -147,3 +149,15 @@ void SOUNDCALL pcm86gen_checkbuf(void) { } } + +BOOL pcm86gen_intrq(void) { + + if (pcm86.fifo & 0x20) { + sound_sync(); + if ((pcm86.write) && (pcm86.virbuf <= pcm86.fifosize)) { + return(TRUE); + } + } + return(FALSE); +} +