diff --git a/src/keyboard_amstrad.c b/src/keyboard_amstrad.c index 4d1eb20..2d47355 100644 --- a/src/keyboard_amstrad.c +++ b/src/keyboard_amstrad.c @@ -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 @@ void keyboard_amstrad_write(uint16_t port, uint8_t val, void *priv) 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 --git a/src/keyboard_at.c b/src/keyboard_at.c index e45744e..b2136e0 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -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 @@ void keyboard_at_write(uint16_t port, uint8_t val, void *priv) 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 --git a/src/keyboard_olim24.c b/src/keyboard_olim24.c index 3324ca1..e0258df 100644 --- a/src/keyboard_olim24.c +++ b/src/keyboard_olim24.c @@ -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 @@ void keyboard_olim24_write(uint16_t port, uint8_t val, void *priv) 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 --git a/src/keyboard_pcjr.c b/src/keyboard_pcjr.c index d6afd76..017a653 100644 --- a/src/keyboard_pcjr.c +++ b/src/keyboard_pcjr.c @@ -124,9 +124,10 @@ void keyboard_pcjr_write(uint16_t port, uint8_t val, void *priv) 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 --git a/src/keyboard_xt.c b/src/keyboard_xt.c index 7625f6b..7e992d9 100644 --- a/src/keyboard_xt.c +++ b/src/keyboard_xt.c @@ -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 @@ void keyboard_xt_write(uint16_t port, uint8_t val, void *priv) 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 --git a/src/sound.h b/src/sound.h index 2b1cf2c..5e0b9a1 100644 --- a/src/sound.h +++ b/src/sound.h @@ -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 --git a/src/sound_speaker.c b/src/sound_speaker.c index 32c66a6..760c0d1 100644 --- a/src/sound_speaker.c +++ b/src/sound_speaker.c @@ -8,24 +8,26 @@ static int16_t speaker_buffer[SOUNDBUFLEN]; 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 --git a/src/sound_speaker.h b/src/sound_speaker.h index a55bfd8..15f9a01 100644 --- a/src/sound_speaker.h +++ b/src/sound_speaker.h @@ -1,3 +1,6 @@ void speaker_init(); extern int speaker_mute; + +extern int speaker_gated; +extern int speaker_enable, was_speaker_enable;