OSDN Git Service

[VM][AY-3-891X] Fix pre-scaler (this is hidden feature?) for PSG.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 12 Feb 2017 08:56:11 +0000 (17:56 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 12 Feb 2017 08:56:11 +0000 (17:56 +0900)
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/keyboard.cpp
source/src/vm/fmgen/psg_ay_3_891x.cpp
source/src/vm/fmgen/psg_ay_3_891x.h

index 85b435c..354cdbd 100644 (file)
@@ -487,6 +487,7 @@ void VM::reset()
        }
 #if !defined(_FM77AV_VARIANTS) || defined(_FM8)
 # if defined(USE_AY_3_8910_AS_PSG)
+       psg->set_reg(0x2e, 0);  // set prescaler
        psg->write_signal(SIG_AY_3_891X_MUTE, 0x00, 0x01); // Okay?
 # else 
        psg->set_reg(0x27, 0); // stop timer
index cabd266..0189ed3 100644 (file)
@@ -1213,6 +1213,9 @@ KEYBOARD::~KEYBOARD()
 }
 
 #define STATE_VERSION 4
+#if defined(Q_OS_WIN)
+DLL_PREFIX_I struct cur_time_s cur_time;
+#endif
 void KEYBOARD::save_state(FILEIO *state_fio)
 {
        state_fio->FputUint32_BE(STATE_VERSION);
index 54af4ce..2638db1 100644 (file)
@@ -14,6 +14,7 @@
 
 PSG_AY_3_891X::PSG_AY_3_891X() : PSG()
 {
+       prescale = -1;
 }
 
 PSG_AY_3_891X::~PSG_AY_3_891X()
@@ -22,12 +23,26 @@ PSG_AY_3_891X::~PSG_AY_3_891X()
 
 bool PSG_AY_3_891X::Init(uint c, uint r)
 {
-       //clock = c;
-       //psgrate = r;
+       clock = c;
+       psgrate = r;
        SetClock(c, r);
+       //SetPreScaler(ps);
+       Reset();
        return true;
 }
 
+void PSG_AY_3_891X::SetPrescaler(int factor)
+{
+       static const char table[3][2] = { { 6, 4 }, { 3, 2 }, { 2, 1 } };
+       static const uint8 table2[8] = { 108,  77,  71,  67,  62,  44,  8,  5 };
+       if((factor < 0) || (factor >= 3)) return;
+       if(prescale != factor)
+       {
+               prescale = factor;
+               SetClock(clock / table[factor][1], psgrate);
+       }
+}
+
 void PSG_AY_3_891X::SetVolume(int volume_l, int volume_r)
 {
        double base_l = 0x4000 / 3.0 * pow(10.0, volume_l / 40.0);
index 1ed00ae..a9e63b7 100644 (file)
 //
 class DLL_PREFIX PSG_AY_3_891X : public PSG
 {
+protected:
+       uint32_t clock;
+       uint32_t psgrate;
+       int prescale;
 public:
        PSG_AY_3_891X();
        ~PSG_AY_3_891X();
        bool Init(uint c, uint r);
+       void SetPrescaler(int factor);
        void SetVolume(int vol_l, int vol_r);
 };