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)
     8.1 --- a/src/sound_speaker.h	Wed Jul 16 20:00:34 2014 +0100
     8.2 +++ b/src/sound_speaker.h	Wed Jul 16 20:44:29 2014 +0100
     8.3 @@ -1,3 +1,6 @@
     8.4  void speaker_init();
     8.5  
     8.6  extern int speaker_mute;
     8.7 +
     8.8 +extern int speaker_gated;
     8.9 +extern int speaker_enable, was_speaker_enable;