summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2014-11-04 21:07:31 +0100
committer hap <happppp@users.noreply.github.com>2014-11-04 21:07:31 +0100
commit71933553c12d172aa2df6a0ef4d244923b021dd7 (patch)
tree19df869218020749ded296cf464a941bb2e12925
parent282a6e03a53d1a1f66ea01d5fe3cfc8d35f6e2de (diff)
improved cpu clock and speaker lvl
-rw-r--r--src/mess/drivers/merlin.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/mess/drivers/merlin.c b/src/mess/drivers/merlin.c
index d09fd00740b..35c113dfbd5 100644
--- a/src/mess/drivers/merlin.c
+++ b/src/mess/drivers/merlin.c
@@ -13,6 +13,7 @@
TODO:
- accurate rc osc
+ - accurate speaker levels (tone pitch sounds good though)
- is the rom dump good?
***************************************************************************/
@@ -23,8 +24,9 @@
#include "merlin.lh"
-// master clock is a single stage RC oscillator: R=?, C=?
-#define MERLIN_RC_CLOCK (500000)
+// master clock is a single stage RC oscillator: R=27K, C=100pf
+// this is an approximation compared with recordings
+#define MERLIN_RC_CLOCK (355000)
class merlin_state : public driver_device
@@ -37,17 +39,18 @@ public:
m_speaker(*this, "speaker")
{ }
- required_device<cpu_device> m_maincpu;
- required_ioport_array<4> m_button_matrix;
- required_device<speaker_sound_device> m_speaker;
-
- UINT16 m_o;
-
DECLARE_READ8_MEMBER(read_k);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_WRITE16_MEMBER(write_r);
virtual void machine_start();
+
+protected:
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<4> m_button_matrix;
+ required_device<speaker_sound_device> m_speaker;
+
+ UINT16 m_o;
};
@@ -94,15 +97,17 @@ READ8_MEMBER(merlin_state::read_k)
WRITE16_MEMBER(merlin_state::write_o)
{
- // O0-O3: input mux
- m_o = data;
-
/* The speaker is connected to O4 through O6. The 3 outputs are paralleled for
increased current driving capability. They are passed thru a 220 ohm resistor
and then to the speaker, which has the other side grounded. The software then
toggles these lines to make sounds and noises. (There is no audio generator
other than toggling it with a software delay between to make tones). */
- m_speaker->level_w(m_o & 0x70);
+ static const int count[8] = { 0, 1, 1, 2, 1, 2, 2, 3 };
+ m_speaker->level_w(count[data >> 4 & 7]);
+
+ // O0-O3: input mux
+ // O7: N/C
+ m_o = data;
}
WRITE16_MEMBER(merlin_state::write_r)
@@ -177,6 +182,8 @@ static const UINT16 merlin_output_pla[0x20] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
+static const INT16 speaker_levels[] = { 0, 32767, 0, 32767 }; // unknown too, due to output_pla being unknown
+
static MACHINE_CONFIG_START( merlin, merlin_state )
@@ -194,6 +201,7 @@ static MACHINE_CONFIG_START( merlin, merlin_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SPEAKER_LEVELS(4, speaker_levels)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END