--- np2/sound/beepc.c 2003/10/20 12:08:01 1.5 +++ np2/sound/beepc.c 2005/02/07 14:46:12 1.11 @@ -1,5 +1,6 @@ #include "compiler.h" -#include "i286.h" +#include "dosio.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" #include "sound.h" @@ -11,11 +12,44 @@ 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) { beepcfg.rate = rate; 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) { @@ -28,7 +62,7 @@ void beep_changeclock(void) { UINT32 hz; UINT rate; - hz = pc.realclock / 25; + hz = pccore.realclock / 25; rate = beepcfg.rate / 25; beepcfg.samplebase = (1 << 16) * rate / hz; } @@ -47,27 +81,23 @@ void beep_hzset(UINT16 cnt) { sound_sync(); beep.hz = 0; 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) { beep.hz = (UINT16)hz; return; } } - beep.puchi = beepcfg.puchibase; } void beep_modeset(void) { - BYTE newmode; + UINT8 newmode; - newmode = (pit.mode[1] >> 2) & 3; - beep.puchi = beepcfg.puchibase; + newmode = (pit.ch[1].ctrl >> 2) & 3; if (beep.mode != newmode) { sound_sync(); beep.mode = newmode; - if (!newmode) { // mode:#0, #1 - beep_eventinit(); - } + beep_eventinit(); } } @@ -79,9 +109,26 @@ static void beep_eventset(void) { enable = beep.low & beep.buz; 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 >= NELEMENTS(bplog.event)) { + beeplogflash(); + } +#endif + if (beep.events >= (BEEPEVENT_MAX / 2)) { + sound_sync(); + } beep.enable = enable; if (beep.events < BEEPEVENT_MAX) { - clock = I286_CLOCK + I286_BASECLOCK - I286_REMCLOCK; + clock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; evt = beep.event + beep.events; beep.events++; evt->clock = (clock - beep.clock) * beepcfg.samplebase; @@ -97,7 +144,6 @@ void beep_eventinit(void) { beep.enable = 0; beep.lastenable = 0; beep.clock = soundcfg.lastclock; - // nevent.clock + nevent.baseclock - nevent.remainclock; beep.events = 0; } @@ -108,17 +154,11 @@ void beep_eventreset(void) { beep.events = 0; } - void beep_lheventset(int low) { if (beep.low != low) { beep.low = low; - if (!beep.mode) { - if (beep.events >= (BEEPEVENT_MAX / 2)) { - sound_sync(); - } - beep_eventset(); - } + beep_eventset(); } } @@ -127,153 +167,9 @@ void beep_oneventset(void) { int buz; buz = (sysport.c & 8)?0:1; - if (beep.buz != buz) { - sound_sync(); beep.buz = buz; - if (buz) { - beep.puchi = beepcfg.puchibase; - } - if (!beep.mode) { - beep_eventset(); - } - else { - beep.cnt = 0; - } + beep_eventset(); } } - -// ---- - -#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 -