Diff for /np2/sound/pcm86c.c between versions 1.2 and 1.7

version 1.2, 2003/10/19 14:56:15 version 1.7, 2004/03/30 08:48:46
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "sound.h"  #include        "sound.h"
Line 35  void pcm86gen_setvol(UINT vol) { Line 35  void pcm86gen_setvol(UINT vol) {
         pcm86gen_update();          pcm86gen_update();
 }  }
   
 void pcm86_reset(void) {                                                                                        // ver0.28  void pcm86_reset(void) {
   
         ZeroMemory(&pcm86, sizeof(pcm86));          ZeroMemory(&pcm86, sizeof(pcm86));
         pcm86.fifosize = 0x80;                                                                                  // ver0.29          pcm86.fifosize = 0x80;
         pcm86.dactrl = 0x32;          pcm86.dactrl = 0x32;
         pcm86.stepmask = (1 << 2) - 1;          pcm86.stepmask = (1 << 2) - 1;
         pcm86.stepbit = 2;          pcm86.stepbit = 2;
         pcm86.stepclock = (pc.baseclock << 6);          pcm86.stepclock = (pccore.baseclock << 6);
         pcm86.stepclock /= 44100;          pcm86.stepclock /= 44100;
         pcm86.stepclock *= pc.multiple;          pcm86.stepclock *= pccore.multiple;
         pcm86.rescue = (PCM86_RESCUE * 32) << 2;          pcm86.rescue = (PCM86_RESCUE * 32) << 2;
 }  }
   
Line 54  void pcm86gen_update(void) { Line 54  void pcm86gen_update(void) {
         pcm86_setpcmrate(pcm86.fifo);          pcm86_setpcmrate(pcm86.fifo);
 }  }
   
 void pcm86_setpcmrate(BYTE val) {  void pcm86_setpcmrate(REG8 val) {
   
         SINT32  rate;          SINT32  rate;
   
         rate = pcm86rate8[val & 7];          rate = pcm86rate8[val & 7];
         pcm86.stepclock = (pc.baseclock << 6);          pcm86.stepclock = (pccore.baseclock << 6);
         pcm86.stepclock /= rate;          pcm86.stepclock /= rate;
         pcm86.stepclock *= (pc.multiple << 3);          pcm86.stepclock *= (pccore.multiple << 3);
         if (pcm86cfg.rate) {          if (pcm86cfg.rate) {
                 pcm86.div = (rate << (PCM86_DIVBIT - 3)) / pcm86cfg.rate;                  pcm86.div = (rate << (PCM86_DIVBIT - 3)) / pcm86cfg.rate;
                 pcm86.div2 = (pcm86cfg.rate << (PCM86_DIVBIT + 3)) / rate;                  pcm86.div2 = (pcm86cfg.rate << (PCM86_DIVBIT + 3)) / rate;
         }          }
 }  }
   
 void pcm86_cb(NEVENTITEM item) {                                                                        // ver0.29  void pcm86_cb(NEVENTITEM item) {
   
         if (pcm86.reqirq) {          if (pcm86.reqirq) {
                 sound_sync();                  sound_sync();
Line 95  void pcm86_setnextintr(void) { Line 95  void pcm86_setnextintr(void) {
                         cnt += pcm86.stepmask;                          cnt += pcm86.stepmask;
                         cnt >>= pcm86.stepbit;                          cnt >>= pcm86.stepbit;
 //                      cnt += 4;                                                               // ちょっと延滞させる  //                      cnt += 4;                                                               // ちょっと延滞させる
                         // ここで clk = pc.realclock * cnt / 86pcm_rate                          // ここで clk = pccore.realclock * cnt / 86pcm_rate
                         // clk = ((pc.baseclock / 86pcm_rate) * cnt) * pc.multiple                          // clk = ((pccore.baseclock / 86pcm_rate) * cnt) * pccore.multiple
                         if (pc.baseclock == PCBASECLOCK25) {                          if (pccore.cpumode & CPUMODE_8MHZ) {
                                 clk = clk25_128[pcm86.fifo & 7];                                  clk = clk20_128[pcm86.fifo & 7];
                         }                          }
                         else {                          else {
                                 clk = clk20_128[pcm86.fifo & 7];                                  clk = clk25_128[pcm86.fifo & 7];
                         }                          }
                         // cntは最大 8000h で 32bitで収まるように…                          // cntは最大 8000h で 32bitで収まるように…
                         clk *= cnt;                          clk *= cnt;
                         clk >>= 7;                          clk >>= 7;
 //                      clk++;                                          // roundup  //                      clk++;                                          // roundup
                         clk *= pc.multiple;                          clk *= pccore.multiple;
                         nevent_set(NEVENT_86PCM, clk, pcm86_cb, NEVENT_ABSOLUTE);                          nevent_set(NEVENT_86PCM, clk, pcm86_cb, NEVENT_ABSOLUTE);
                 }                  }
         }          }
Line 118  void SOUNDCALL pcm86gen_checkbuf(void) { Line 118  void SOUNDCALL pcm86gen_checkbuf(void) {
         long    bufs;          long    bufs;
         UINT32  past;          UINT32  past;
   
         past = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK;          past = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK;
         past <<= 6;          past <<= 6;
         past -= pcm86.lastclock;          past -= pcm86.lastclock;
         if (past >= pcm86.stepclock) {          if (past >= pcm86.stepclock) {
                 RECALC_NOWCLKWAIT;                  past = past / pcm86.stepclock;
                   pcm86.lastclock += (past * pcm86.stepclock);
                   RECALC_NOWCLKWAIT(past);
         }          }
   
         bufs = pcm86.realbuf - pcm86.virbuf;          bufs = pcm86.realbuf - pcm86.virbuf;
Line 147  void SOUNDCALL pcm86gen_checkbuf(void) { Line 149  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);
   }
   

Removed from v.1.2  
changed lines
  Added in v.1.7


RetroPC.NET-CVS <cvs@retropc.net>