# HG changeset patch # User TomW # Date 1405539869 -3600 # Node ID 2b9cea0be42428c846318ef9a27fab2ca3e5b942 # Parent f22b6152c221bcdb2282f9bd8ec2f78a97e51b58 Improvements to PC speaker - fixes sound on Beyond Castle Wolfenstein and probably other games as well. diff -r f22b6152c221 -r 2b9cea0be424 src/keyboard_amstrad.c --- a/src/keyboard_amstrad.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/keyboard_amstrad.c Wed Jul 16 20:44:29 2014 +0100 @@ -4,6 +4,7 @@ #include "pic.h" #include "pit.h" #include "sound.h" +#include "sound_speaker.h" #include "timer.h" #include "keyboard.h" @@ -75,9 +76,10 @@ keyboard_amstrad.pb = val; ppi.pb = val; - gated = ((val & 3) == 3); - if (gated) - wasgated = 1; + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; pit_set_gate(2, val & 1); if (val & 0x80) diff -r f22b6152c221 -r 2b9cea0be424 src/keyboard_at.c --- a/src/keyboard_at.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/keyboard_at.c Wed Jul 16 20:44:29 2014 +0100 @@ -4,6 +4,7 @@ #include "pic.h" #include "pit.h" #include "sound.h" +#include "sound_speaker.h" #include "timer.h" #include "keyboard.h" @@ -271,9 +272,10 @@ case 0x61: ppi.pb = val; - gated = ((val & 3) == 3); - if (gated) - wasgated = 1; + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; pit_set_gate(2, val & 1); break; diff -r f22b6152c221 -r 2b9cea0be424 src/keyboard_olim24.c --- a/src/keyboard_olim24.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/keyboard_olim24.c Wed Jul 16 20:44:29 2014 +0100 @@ -4,6 +4,7 @@ #include "mouse.h" #include "pic.h" #include "sound.h" +#include "sound_speaker.h" #include "timer.h" #include "keyboard.h" @@ -143,9 +144,10 @@ case 0x61: ppi.pb = val; - gated = ((val & 3) == 3); - if (gated) - wasgated = 1; + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; pit_set_gate(2, val & 1); break; } diff -r f22b6152c221 -r 2b9cea0be424 src/keyboard_pcjr.c --- a/src/keyboard_pcjr.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/keyboard_pcjr.c Wed Jul 16 20:44:29 2014 +0100 @@ -124,9 +124,10 @@ case 0x61: keyboard_pcjr.pb = val; - gated = ((val & 3) == 3); - if (gated) - wasgated = 1; + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; pit_set_gate(2, val & 1); sn76489_mute = speaker_mute = 1; switch (val & 0x60) diff -r f22b6152c221 -r 2b9cea0be424 src/keyboard_xt.c --- a/src/keyboard_xt.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/keyboard_xt.c Wed Jul 16 20:44:29 2014 +0100 @@ -3,6 +3,7 @@ #include "mem.h" #include "pic.h" #include "sound.h" +#include "sound_speaker.h" #include "timer.h" #include "keyboard.h" @@ -75,9 +76,10 @@ keyboard_xt.pb = val; ppi.pb = val; - gated = ((val & 3) == 3); - if (gated) - wasgated = 1; + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; pit_set_gate(2, val & 1); if (val & 0x80) diff -r f22b6152c221 -r 2b9cea0be424 src/sound.h --- a/src/sound.h Wed Jul 16 20:00:34 2014 +0100 +++ b/src/sound.h Wed Jul 16 20:44:29 2014 +0100 @@ -1,6 +1,5 @@ void sound_add_handler(void (*poll)(void *p), void (*get_buffer)(int16_t *buffer, int len, void *p), void *p); -extern int wasgated; extern int sbtype; extern int sound_card_current; diff -r f22b6152c221 -r 2b9cea0be424 src/sound_speaker.c --- a/src/sound_speaker.c Wed Jul 16 20:00:34 2014 +0100 +++ b/src/sound_speaker.c Wed Jul 16 20:44:29 2014 +0100 @@ -8,24 +8,26 @@ static int speaker_pos = 0; -int wasgated = 0; +int speaker_gated = 0; +int speaker_enable = 0, was_speaker_enable = 0; static void speaker_poll(void *p) { if (speaker_pos >= SOUNDBUFLEN) return; // printf("SPeaker - %i %i %i %02X\n",speakval,gated,speakon,pit.m[2]); - if (gated) + if (speaker_gated && was_speaker_enable) { if (!pit.m[2] || pit.m[2]==4) - speaker_buffer[speaker_pos] = speakval; + speaker_buffer[speaker_pos] = speakval; else - speaker_buffer[speaker_pos] = speakon ? 0x1400 : 0; + speaker_buffer[speaker_pos] = speakon ? 0x1400 : 0; } else - speaker_buffer[speaker_pos] = wasgated ? 0x1400 : 0; + speaker_buffer[speaker_pos] = was_speaker_enable ? 0x1400 : 0; speaker_pos++; - wasgated = 0; + if (!speaker_enable) + was_speaker_enable = 0; } static void speaker_get_buffer(int16_t *buffer, int len, void *p) diff -r f22b6152c221 -r 2b9cea0be424 src/sound_speaker.h --- a/src/sound_speaker.h Wed Jul 16 20:00:34 2014 +0100 +++ b/src/sound_speaker.h Wed Jul 16 20:44:29 2014 +0100 @@ -1,3 +1,6 @@ void speaker_init(); extern int speaker_mute; + +extern int speaker_gated; +extern int speaker_enable, was_speaker_enable;