PCem
changeset 132:2b9cea0be424
Improvements to PC speaker - fixes sound on Beyond Castle Wolfenstein and probably other games as well.
| author | TomW |
|---|---|
| date | Wed Jul 16 20:44:29 2014 +0100 |
| parents | f22b6152c221 |
| children | 24b744b9a632 |
| files | src/keyboard_amstrad.c src/keyboard_at.c src/keyboard_olim24.c src/keyboard_pcjr.c src/keyboard_xt.c src/sound.h src/sound_speaker.c src/sound_speaker.h |
| diffstat | 8 files changed, 35 insertions(+), 22 deletions(-) [+] |
line diff
1.1 --- a/src/keyboard_amstrad.c Wed Jul 16 20:00:34 2014 +0100 1.2 +++ b/src/keyboard_amstrad.c Wed Jul 16 20:44:29 2014 +0100 1.3 @@ -4,6 +4,7 @@ 1.4 #include "pic.h" 1.5 #include "pit.h" 1.6 #include "sound.h" 1.7 +#include "sound_speaker.h" 1.8 #include "timer.h" 1.9 1.10 #include "keyboard.h" 1.11 @@ -75,9 +76,10 @@ 1.12 keyboard_amstrad.pb = val; 1.13 ppi.pb = val; 1.14 1.15 - gated = ((val & 3) == 3); 1.16 - if (gated) 1.17 - wasgated = 1; 1.18 + speaker_gated = val & 1; 1.19 + speaker_enable = val & 2; 1.20 + if (speaker_enable) 1.21 + was_speaker_enable = 1; 1.22 pit_set_gate(2, val & 1); 1.23 1.24 if (val & 0x80)
2.1 --- a/src/keyboard_at.c Wed Jul 16 20:00:34 2014 +0100 2.2 +++ b/src/keyboard_at.c Wed Jul 16 20:44:29 2014 +0100 2.3 @@ -4,6 +4,7 @@ 2.4 #include "pic.h" 2.5 #include "pit.h" 2.6 #include "sound.h" 2.7 +#include "sound_speaker.h" 2.8 #include "timer.h" 2.9 2.10 #include "keyboard.h" 2.11 @@ -271,9 +272,10 @@ 2.12 2.13 case 0x61: 2.14 ppi.pb = val; 2.15 - gated = ((val & 3) == 3); 2.16 - if (gated) 2.17 - wasgated = 1; 2.18 + speaker_gated = val & 1; 2.19 + speaker_enable = val & 2; 2.20 + if (speaker_enable) 2.21 + was_speaker_enable = 1; 2.22 pit_set_gate(2, val & 1); 2.23 break; 2.24
3.1 --- a/src/keyboard_olim24.c Wed Jul 16 20:00:34 2014 +0100 3.2 +++ b/src/keyboard_olim24.c Wed Jul 16 20:44:29 2014 +0100 3.3 @@ -4,6 +4,7 @@ 3.4 #include "mouse.h" 3.5 #include "pic.h" 3.6 #include "sound.h" 3.7 +#include "sound_speaker.h" 3.8 #include "timer.h" 3.9 3.10 #include "keyboard.h" 3.11 @@ -143,9 +144,10 @@ 3.12 case 0x61: 3.13 ppi.pb = val; 3.14 3.15 - gated = ((val & 3) == 3); 3.16 - if (gated) 3.17 - wasgated = 1; 3.18 + speaker_gated = val & 1; 3.19 + speaker_enable = val & 2; 3.20 + if (speaker_enable) 3.21 + was_speaker_enable = 1; 3.22 pit_set_gate(2, val & 1); 3.23 break; 3.24 }
4.1 --- a/src/keyboard_pcjr.c Wed Jul 16 20:00:34 2014 +0100 4.2 +++ b/src/keyboard_pcjr.c Wed Jul 16 20:44:29 2014 +0100 4.3 @@ -124,9 +124,10 @@ 4.4 4.5 case 0x61: 4.6 keyboard_pcjr.pb = val; 4.7 - gated = ((val & 3) == 3); 4.8 - if (gated) 4.9 - wasgated = 1; 4.10 + speaker_gated = val & 1; 4.11 + speaker_enable = val & 2; 4.12 + if (speaker_enable) 4.13 + was_speaker_enable = 1; 4.14 pit_set_gate(2, val & 1); 4.15 sn76489_mute = speaker_mute = 1; 4.16 switch (val & 0x60)
5.1 --- a/src/keyboard_xt.c Wed Jul 16 20:00:34 2014 +0100 5.2 +++ b/src/keyboard_xt.c Wed Jul 16 20:44:29 2014 +0100 5.3 @@ -3,6 +3,7 @@ 5.4 #include "mem.h" 5.5 #include "pic.h" 5.6 #include "sound.h" 5.7 +#include "sound_speaker.h" 5.8 #include "timer.h" 5.9 5.10 #include "keyboard.h" 5.11 @@ -75,9 +76,10 @@ 5.12 keyboard_xt.pb = val; 5.13 ppi.pb = val; 5.14 5.15 - gated = ((val & 3) == 3); 5.16 - if (gated) 5.17 - wasgated = 1; 5.18 + speaker_gated = val & 1; 5.19 + speaker_enable = val & 2; 5.20 + if (speaker_enable) 5.21 + was_speaker_enable = 1; 5.22 pit_set_gate(2, val & 1); 5.23 5.24 if (val & 0x80)
6.1 --- a/src/sound.h Wed Jul 16 20:00:34 2014 +0100 6.2 +++ b/src/sound.h Wed Jul 16 20:44:29 2014 +0100 6.3 @@ -1,6 +1,5 @@ 6.4 void sound_add_handler(void (*poll)(void *p), void (*get_buffer)(int16_t *buffer, int len, void *p), void *p); 6.5 6.6 -extern int wasgated; 6.7 extern int sbtype; 6.8 6.9 extern int sound_card_current;
7.1 --- a/src/sound_speaker.c Wed Jul 16 20:00:34 2014 +0100 7.2 +++ b/src/sound_speaker.c Wed Jul 16 20:44:29 2014 +0100 7.3 @@ -8,24 +8,26 @@ 7.4 7.5 static int speaker_pos = 0; 7.6 7.7 -int wasgated = 0; 7.8 +int speaker_gated = 0; 7.9 +int speaker_enable = 0, was_speaker_enable = 0; 7.10 7.11 static void speaker_poll(void *p) 7.12 { 7.13 if (speaker_pos >= SOUNDBUFLEN) return; 7.14 7.15 // printf("SPeaker - %i %i %i %02X\n",speakval,gated,speakon,pit.m[2]); 7.16 - if (gated) 7.17 + if (speaker_gated && was_speaker_enable) 7.18 { 7.19 if (!pit.m[2] || pit.m[2]==4) 7.20 - speaker_buffer[speaker_pos] = speakval; 7.21 + speaker_buffer[speaker_pos] = speakval; 7.22 else 7.23 - speaker_buffer[speaker_pos] = speakon ? 0x1400 : 0; 7.24 + speaker_buffer[speaker_pos] = speakon ? 0x1400 : 0; 7.25 } 7.26 else 7.27 - speaker_buffer[speaker_pos] = wasgated ? 0x1400 : 0; 7.28 + speaker_buffer[speaker_pos] = was_speaker_enable ? 0x1400 : 0; 7.29 speaker_pos++; 7.30 - wasgated = 0; 7.31 + if (!speaker_enable) 7.32 + was_speaker_enable = 0; 7.33 } 7.34 7.35 static void speaker_get_buffer(int16_t *buffer, int len, void *p)
