summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2018-05-25 22:32:57 +0200
committer angelosa <salese_corp_ltd@email.it>2018-05-25 22:39:36 +0200
commit66153a3df51aa7bac8debb326891f19041ca7d9a (patch)
tree53b45f00643ad0aba2aa170c8ecd49735ee4d5b2 /src/devices
parentacfd09004ec870edd9cbb561d6d007cfa67b0b57 (diff)
pc9801.cpp: added SpeakBoard sound card emulation [Angelo Salese, Takahiro Nogi]
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/bus/cbus/pc9801_86.cpp99
-rw-r--r--src/devices/bus/cbus/pc9801_86.h32
2 files changed, 121 insertions, 10 deletions
diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp
index d5a8badf609..130878a58ee 100644
--- a/src/devices/bus/cbus/pc9801_86.cpp
+++ b/src/devices/bus/cbus/pc9801_86.cpp
@@ -3,15 +3,20 @@
/***************************************************************************
NEC PC-9801-86 sound card
+ NEC PC-9801-SpeakBoard sound card
Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an
additional DAC port
+ SpeakBoard sound card seems to be derived design from -86, with an additional
+ OPNA mapped at 0x58*
TODO:
- joystick code should be shared between -26, -86 and -118
- Test all pcm modes
- Make volume work
- Recording
+ - actual stereo sound routing (currently routes to ALL_OUTPUTS)
+ - SpeakBoard: no idea about software that uses this;
***************************************************************************/
@@ -52,7 +57,7 @@ WRITE_LINE_MEMBER(pc9801_86_device::sound_irq)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pc9801_86_device::device_add_mconfig)
+MACHINE_CONFIG_START(pc9801_86_device::pc9801_86_config)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
MCFG_DEVICE_ADD("opna", YM2608, 7.987_MHz_XTAL)
@@ -71,6 +76,10 @@ MACHINE_CONFIG_START(pc9801_86_device::device_add_mconfig)
MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
MACHINE_CONFIG_END
+MACHINE_CONFIG_START(pc9801_86_device::device_add_mconfig)
+ pc9801_86_config(config);
+MACHINE_CONFIG_END
+
// to load a different bios for slots:
// -cbusX pc9801_86,bios=N
ROM_START( pc9801_86 )
@@ -136,8 +145,8 @@ ioport_constructor pc9801_86_device::device_input_ports() const
// pc9801_86_device - constructor
//-------------------------------------------------
-pc9801_86_device::pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, PC9801_86, tag, owner, clock),
+pc9801_86_device::pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock),
m_bus(*this, DEVICE_SELF_OWNER),
m_opna(*this, "opna"),
m_ldac(*this, "ldac"),
@@ -146,6 +155,12 @@ pc9801_86_device::pc9801_86_device(const machine_config &mconfig, const char *ta
{
}
+pc9801_86_device::pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_86_device(mconfig, PC9801_86, tag, owner, clock)
+{
+
+}
+
//-------------------------------------------------
// device_validity_check - perform validity checks
@@ -375,3 +390,81 @@ void pc9801_86_device::device_timer(emu_timer& timer, device_timer_id id, int pa
m_bus->int_w<5>(ASSERT_LINE);
}
}
+
+//**************************************************************************
+// SpeakBoard device section
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(PC9801_SPEAKBOARD, pc9801_speakboard_device, "pc9801_spb", "NEC PC9801 SpeakBoard")
+
+ROM_START( pc9801_spb )
+ ROM_REGION( 0x4000, "sound_bios", ROMREGION_ERASEFF )
+ ROM_LOAD16_BYTE( "spb lh5764 ic21_pink.bin", 0x0001, 0x2000, CRC(5bcefa1f) SHA1(ae88e45d411bf5de1cb42689b12b6fca0146c586) )
+ ROM_LOAD16_BYTE( "spb lh5764 ic22_green.bin", 0x0000, 0x2000, CRC(a7925ced) SHA1(3def9ee386ab6c31436888261bded042cd64a0eb) )
+
+ // RAM
+ ROM_REGION( 0x100000, "opna", ROMREGION_ERASE00 )
+
+ ROM_REGION( 0x100000, "opna_slave", ROMREGION_ERASE00 )
+ROM_END
+
+const tiny_rom_entry *pc9801_speakboard_device::device_rom_region() const
+{
+ return ROM_NAME( pc9801_spb );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// pc9801_86_device - constructor
+//-------------------------------------------------
+
+pc9801_speakboard_device::pc9801_speakboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_86_device(mconfig, PC9801_SPEAKBOARD, tag, owner, clock),
+ m_opna_slave(*this, "opna_slave")
+{
+}
+
+MACHINE_CONFIG_START(pc9801_speakboard_device::device_add_mconfig)
+ pc9801_86_config(config);
+
+ MCFG_DEVICE_ADD("opna_slave", YM2608, 7.987_MHz_XTAL)
+ MCFG_AY8910_OUTPUT_TYPE(0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
+MACHINE_CONFIG_END
+
+void pc9801_speakboard_device::device_start()
+{
+ pc9801_86_device::device_start();
+
+ install_device(0x0588, 0x058f, read8_delegate(FUNC(pc9801_speakboard_device::opna_slave_r), this), write8_delegate(FUNC(pc9801_speakboard_device::opna_slave_w), this) );
+}
+
+void pc9801_speakboard_device::device_reset()
+{
+ pc9801_86_device::device_reset();
+}
+
+READ8_MEMBER(pc9801_speakboard_device::opna_slave_r)
+{
+ if((offset & 1) == 0)
+ return m_opna_slave->read(space, offset >> 1);
+ else // odd
+ {
+ logerror("PC9801-SPB: Read to undefined port [%02x]\n",offset+0x588);
+ return 0xff;
+ }
+}
+
+WRITE8_MEMBER(pc9801_speakboard_device::opna_slave_w)
+{
+ if((offset & 1) == 0)
+ m_opna_slave->write(space, offset >> 1,data);
+ else // odd
+ logerror("PC9801-SPB: Write to undefined port [%02x] %02x\n",offset+0x588,data);
+}
+
diff --git a/src/devices/bus/cbus/pc9801_86.h b/src/devices/bus/cbus/pc9801_86.h
index 4a1551ef07c..29088119e58 100644
--- a/src/devices/bus/cbus/pc9801_86.h
+++ b/src/devices/bus/cbus/pc9801_86.h
@@ -26,6 +26,7 @@ class pc9801_86_device : public device_t
public:
// construction/destruction
pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8_MEMBER(opna_r);
DECLARE_WRITE8_MEMBER(opna_w);
@@ -34,6 +35,10 @@ public:
DECLARE_READ8_MEMBER(pcm_r);
DECLARE_WRITE8_MEMBER(pcm_w);
+ DECLARE_WRITE_LINE_MEMBER(sound_irq);
+ DECLARE_READ8_MEMBER(opn_porta_r);
+ DECLARE_WRITE8_MEMBER(opn_portb_w);
+
protected:
// device-level overrides
virtual void device_validity_check(validity_checker &valid) const override;
@@ -45,6 +50,7 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
void install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ void pc9801_86_config(machine_config &config);
private:
int queue_count();
@@ -60,22 +66,34 @@ private:
required_device<dac_word_interface> m_rdac;
std::vector<uint8_t> m_queue;
emu_timer *m_dac_timer;
+};
- DECLARE_WRITE_LINE_MEMBER(sound_irq);
- DECLARE_READ8_MEMBER(opn_porta_r);
- DECLARE_WRITE8_MEMBER(opn_portb_w);
+class pc9801_speakboard_device : public pc9801_86_device
+{
+public:
+ // construction/destruction
+ pc9801_speakboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ8_MEMBER(opna_slave_r);
+ DECLARE_WRITE8_MEMBER(opna_slave_w);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ required_device<ym2608_device> m_opna_slave;
};
// device type definition
DECLARE_DEVICE_TYPE(PC9801_86, pc9801_86_device)
+DECLARE_DEVICE_TYPE(PC9801_SPEAKBOARD, pc9801_speakboard_device)
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
#endif // MAME_BUS_CBUS_PC9801_86_H