Diff for /np2/sound/beepc.c between versions 1.3 and 1.10

version 1.3, 2003/10/19 16:54:51 version 1.10, 2004/07/04 08:30:16
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "i286.h"  #include        "dosio.h"
   #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "sound.h"  #include        "sound.h"
Line 11 Line 12
         BEEPCFG         beepcfg;          BEEPCFG         beepcfg;
   
   
   // #define      BEEPLOG
   
   #if defined(BEEPLOG)
   static struct {
           FILEH   fh;
           UINT    events;
           UINT32  event[0x10000];
   } bplog;
   
   static void beeplogflash(void) {
   
           if ((bplog.fh != FILEH_INVALID) && (bplog.events)) {
                   file_write(bplog.fh, bplog.event, bplog.events * sizeof(UINT32));
                   bplog.events = 0;
           }
   }
   #endif
   
   
 void beep_initialize(UINT rate) {  void beep_initialize(UINT rate) {
   
         beepcfg.rate = rate;          beepcfg.rate = rate;
         beepcfg.vol = 2;          beepcfg.vol = 2;
         beepcfg.puchibase = (rate * 3) / (11025 * 2);  #if defined(BEEPLOG)
           bplog.fh = file_create("beeplog");
           bplog.events = 0;
   #endif
   }
   
   void beep_deinitialize(void) {
   
   #if defined(BEEPLOG)
           beeplogflash();
           if (bplog.fh != FILEH_INVALID) {
                   file_close(bplog.fh);
                   bplog.fh = FILEH_INVALID;
           }
   #endif
 }  }
   
 void beep_setvol(UINT vol) {  void beep_setvol(UINT vol) {
Line 23  void beep_setvol(UINT vol) { Line 57  void beep_setvol(UINT vol) {
         beepcfg.vol = vol & 3;          beepcfg.vol = vol & 3;
 }  }
   
   void beep_changeclock(void) {
   
           UINT32  hz;
           UINT    rate;
   
           hz = pccore.realclock / 25;
           rate = beepcfg.rate / 25;
           beepcfg.samplebase = (1 << 16) * rate / hz;
   }
   
 void beep_reset(void) {  void beep_reset(void) {
   
         if (beepcfg.rate) {          beep_changeclock();
                 beepcfg.sampleclock = (pc.realclock / beepcfg.rate);  
 //              TRACEOUT(("%d %d", pc.realclock, beepcfg.rate));  
         }  
         else {  
                 beepcfg.sampleclock = 0;  
         }  
         ZeroMemory(&beep, sizeof(beep));          ZeroMemory(&beep, sizeof(beep));
         beep.mode = 1;          beep.mode = 1;
 }  }
   
   
 void beep_hzset(UINT16 cnt) {  void beep_hzset(UINT16 cnt) {
   
         double  hz;          double  hz;
Line 44  void beep_hzset(UINT16 cnt) { Line 81  void beep_hzset(UINT16 cnt) {
         sound_sync();          sound_sync();
         beep.hz = 0;          beep.hz = 0;
         if ((cnt & 0xff80) && (beepcfg.rate)) {          if ((cnt & 0xff80) && (beepcfg.rate)) {
                 hz = 65536.0 / 4.0 * pc.baseclock / beepcfg.rate / cnt;                  hz = 65536.0 / 4.0 * pccore.baseclock / beepcfg.rate / cnt;
                 if (hz < 0x8000) {                  if (hz < 0x8000) {
                         beep.hz = (UINT16)hz;                          beep.hz = (UINT16)hz;
                         return;                          return;
                 }                  }
         }          }
         beep.puchi = beepcfg.puchibase;  
 }  }
   
 void beep_modeset(void) {  void beep_modeset(void) {
   
         BYTE    newmode;          UINT8   newmode;
   
         newmode = (pit.mode[1] >> 2) & 3;          newmode = (pit.ch[1].ctrl >> 2) & 3;
         beep.puchi = beepcfg.puchibase;  
         if (beep.mode != newmode) {          if (beep.mode != newmode) {
                 sound_sync();                  sound_sync();
                 beep.mode = newmode;                  beep.mode = newmode;
                 if (!newmode) {                                 // mode:#0, #1                  beep_eventinit();
                         beep_eventinit();  
                 }  
         }          }
 }  }
   
Line 76  static void beep_eventset(void) { Line 109  static void beep_eventset(void) {
   
         enable = beep.low & beep.buz;          enable = beep.low & beep.buz;
         if (beep.enable != enable) {          if (beep.enable != enable) {
   #if defined(BEEPLOG)
                   UINT32  tmp;
                   tmp = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK;
                   if (enable) {
                           tmp |= 0x80000000;
                   }
                   else {
                           tmp &= ~0x80000000;
                   }
                   bplog.event[bplog.events++] = tmp;
                   if (bplog.events >= (sizeof(bplog.event)/sizeof(UINT32))) {
                           beeplogflash();
                   }
   #endif
                   if (beep.events >= (BEEPEVENT_MAX / 2)) {
                           sound_sync();
                   }
                 beep.enable = enable;                  beep.enable = enable;
                 if (beep.events < BEEPEVENT_MAX) {                  if (beep.events < BEEPEVENT_MAX) {
                         clock = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK;                          clock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK;
                         evt = beep.event + beep.events;                          evt = beep.event + beep.events;
                         beep.events++;                          beep.events++;
                         evt->clock = clock - beep.clock;                          evt->clock = (clock - beep.clock) * beepcfg.samplebase;
                         evt->enable = enable;                          evt->enable = enable;
                         beep.clock = clock;                          beep.clock = clock;
 //                      TRACEOUT(("%d %d", evt->clock, evt->enable));  
                 }                  }
         }          }
 }  }
Line 94  void beep_eventinit(void) { Line 143  void beep_eventinit(void) {
         beep.low = 0;          beep.low = 0;
         beep.enable = 0;          beep.enable = 0;
         beep.lastenable = 0;          beep.lastenable = 0;
         beep.clock = dsound_lastclock;          beep.clock = soundcfg.lastclock;
                                         // nevent.clock + nevent.baseclock - nevent.remainclock;  
         beep.events = 0;          beep.events = 0;
 }  }
   
 void beep_eventreset(void) {  void beep_eventreset(void) {
   
         beep.lastenable = beep.enable;          beep.lastenable = beep.enable;
         beep.clock = dsound_lastclock;          beep.clock = soundcfg.lastclock;
         beep.events = 0;          beep.events = 0;
 }  }
   
   
 void beep_lheventset(int low) {  void beep_lheventset(int low) {
   
         if (beep.low != low) {          if (beep.low != low) {
                 beep.low = low;                  beep.low = low;
                 if (!beep.mode) {                  beep_eventset();
                         if (beep.events >= (BEEPEVENT_MAX / 2)) {  
                                 sound_sync();  
                         }  
                         beep_eventset();  
                 }  
         }          }
 }  }
   
Line 125  void beep_oneventset(void) { Line 167  void beep_oneventset(void) {
         int             buz;          int             buz;
   
         buz = (sysport.c & 8)?0:1;          buz = (sysport.c & 8)?0:1;
   
         if (beep.buz != buz) {          if (beep.buz != buz) {
                 sound_sync();  
                 beep.buz = buz;                  beep.buz = buz;
                 if (buz) {                  beep_eventset();
                         beep.puchi = beepcfg.puchibase;  
                 }  
                 if (!beep.mode) {  
                         beep_eventset();  
                 }  
                 else {  
                         beep.cnt = 0;  
                 }  
         }          }
 }  }
   
   
 // ----  
   
 #if 0  
 LABEL void __fastcall beep_update(void *buf, int buflength) {  
   
                 __asm {  
                                 cmp             edx, 0  
                                 je              beep_end  
   
                                 cmp             beep.mode, 1  
                                 jc              beep_onshot  
                                 jne             beep_end  
   
                                 cmp             beep.buz, 0  
                                 je              beep_puchichk  
                                 mov             ax, beep.hz  
                                 test    ax, ax  
                                 je              beep_puchichk  
   
                                 pushad  
                                 mov             edi, beeptbl.vol  
                                 test    edi, edi  
                                 je              beep_mkend  
                                 shl             edi, 8  
   
 beep_lp1:               mov             esi, 4  
 beep_lp2:               add             beep.cnt, ax  
                                 js              short beep_mina  
                                         add             [ecx], edi  
                                         add             [ecx+4], edi  
                                 jmp             short beep_lped  
 beep_mina:                      sub             [ecx], edi  
                                         sub             [ecx+4], edi  
 beep_lped:              dec             esi  
                                 jne             beep_lp2  
                                 add             ecx, 8  
                                 dec             edx  
                                 jne             beep_lp1  
                                 mov             beep.puchi, edx  
   
 beep_mkend:             popad  
 beep_end:               ret  
   
                                 align   4  
 beep_puchichk:  cmp             beep.puchi, 0  
                                 jne             short beep_puchiout  
                                 ret  
                                 align   4  
 beep_puchiout:  pushad  
                                 mov             edi, beeptbl.vol  
                                 shl             edi, 10  
 beep_puchilp:   add             [ecx], edi  
                                 add             [ecx+4], edi  
                                 add             ecx, 8  
                                 dec             beep.puchi  
                                 je              beep_puchiend  
                                 dec             edx  
                                 jne             beep_puchilp  
 beep_puchiend:  popad  
                                 ret  
   
                                 align   4  
 beep_onshot:    cmp             beepevent.events, 0  
                                 je              beep_end  
                                 cmp             pc.sampleclock, 0  
                                 je              beep_end  
   
                                 pushad  
                                 mov             esi, offset beepevent.event  
                                 movzx   edi, np2cfg.BEEP_VOL  
                                 test    edi, edi  
                                 je              beep1s_mkend  
                                 shl             edi, 11  
   
 beep1shot_lp:   mov             ebp, pc.sampleclock  
                                 xor             eax, eax  
   
 beep1shot_lp1:  mov             ebx, [esi]BEEP1EVENT.clock  
                                 cmp             ebp, ebx  
                                 jc              beep1s_envof  
   
                                 cmp             beepevent.lastenable, 0  
                                 je              beep1s_rmnchk  
                                 add             eax, ebx  
 beep1s_rmnchk:  mov             edx, [esi]BEEP1EVENT.enable  
                                 mov             beepevent.lastenable, edx  
                                 add             esi, type BEEP1EVENT  
                                 dec             beepevent.events  
                                 je              beep_nonevents  
                                 sub             ebp, ebx  
                                 jne             beep1shot_lp1  
                                 jmp             short beep1s_calcvol  
   
 beep1s_envof:   sub             [esi]BEEP1EVENT.clock, ebp  
                                 cmp             beepevent.lastenable, 0  
                                 je              beep1s_calcvol  
                                 add             eax, ebp  
 beep1s_calcvol: mul             edi  
                                 div             pc.sampleclock  
                                 add             [ecx], eax  
                                 add             [ecx+4], eax  
                                 add             ecx, 8  
                                 dec             dword ptr [esp + 20]                    ; pushad¤Îedx  
                                 jne             beep1shot_lp  
                                 jmp             beep1s_mkend  
   
 beep_nonevents: cmp             beepevent.lastenable, 0  
                                 je              beep1s_calc2  
                                 sub             ebp, ebx  
 ;                               shr             ebp, 1  
                                 add             eax, ebp  
 beep1s_calc2:   mul             edi  
                                 div             pc.sampleclock  
                                 add             [ecx], eax  
                                 add             [ecx+4], eax  
                                 add             ecx, 8  
                                 dec             dword ptr [esp + 20]                    ; pushad¤Îedx  
                                 je              beep1s_mkend  
                                 cmp             beepevent.lastenable, 0  
                                 je              beep1s_mkend  
 beep1shot_lp2:  add             [ecx], edi  
                                 add             [ecx+4], edi  
                                 add             ecx, 8  
                                 dec             dword ptr [esp + 20]                    ; pushad¤Îedx  
                                 jne             beep1shot_lp2  
   
 beep1s_mkend:  
                                 popad  
                                 ret  
                 }  
 }  
 #endif  
   

Removed from v.1.3  
changed lines
  Added in v.1.10


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