wavesynth: waveblaster-based virtual expander, ks1064 for now [O. Galibert]

This commit is contained in:
Olivier Galibert 2020-10-31 21:47:33 +01:00
parent c9d3d973dd
commit f814777e46
6 changed files with 149 additions and 2 deletions

View File

@ -124,6 +124,7 @@ function createProjects_mame_virtual(_target, _subtarget)
createVirtualProjects(_target, _subtarget, "virtual")
files {
MAME_DIR .. "src/mame/drivers/vgmplay.cpp",
MAME_DIR .. "src/mame/drivers/wavesynth.cpp",
MAME_DIR .. "src/mame/drivers/ldplayer.cpp",
MAME_DIR .. "src/mame/machine/mega32x.cpp",
MAME_DIR .. "src/mame/machine/mega32x.h",

View File

@ -13,6 +13,8 @@ ks0164_device::ks0164_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, KS0164, tag, owner, clock),
device_sound_interface(mconfig, *this),
device_memory_interface(mconfig, *this),
device_serial_interface(mconfig, *this),
m_midi_tx(*this),
m_mem_region(*this, DEVICE_SELF),
m_cpu(*this, "cpu"),
m_mem_config("mem", ENDIANNESS_BIG, 16, 23)
@ -54,6 +56,11 @@ void ks0164_device::device_start()
space().cache(m_mem_cache);
m_timer = timer_alloc(0);
m_midi_tx.resolve_safe();
set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
set_rate(clock(), 542);
save_item(NAME(m_bank1_base));
save_item(NAME(m_bank1_select));
save_item(NAME(m_bank2_base));
@ -85,6 +92,8 @@ void ks0164_device::device_reset()
m_mpu_in = 0x00;
m_mpu_out = 0x00;
m_mpu_status = 0x00;
m_midi_in = 0x00;
m_midi_in_active = false;
m_timer->adjust(attotime::from_msec(1), 0, attotime::from_msec(1));
}
@ -96,6 +105,50 @@ void ks0164_device::device_timer(emu_timer &timer, device_timer_id id, int param
m_cpu->set_input_line(14, ASSERT_LINE);
}
void ks0164_device::tra_complete()
{
logerror("transmit done\n");
}
void ks0164_device::rcv_complete()
{
receive_register_extract();
m_midi_in = get_received_char();
m_midi_in_active = true;
m_cpu->set_input_line(6, ASSERT_LINE);
logerror("recieved %02x\n", m_midi_in);
}
void ks0164_device::tra_callback()
{
m_midi_tx(transmit_register_get_data_bit());
}
u8 ks0164_device::midi_r()
{
m_midi_in_active = false;
m_cpu->set_input_line(6, CLEAR_LINE);
return m_midi_in;
}
void ks0164_device::midi_w(u8 data)
{
logerror("want to transmit %02x\n", data);
}
u8 ks0164_device::midi_status_r()
{
// transmit done/tx empty on bit 1
return m_midi_in_active ? 1 : 0;
}
void ks0164_device::midi_status_w(u8 data)
{
logerror("midi status_w %02x\n", data);
}
void ks0164_device::mpuin_set(bool control, u8 data)
{
// logerror("mpu push %s %02x\n", control ? "ctrl" : "data", data);
@ -289,6 +342,7 @@ u8 ks0164_device::irqen_76_r()
return m_irqen_76;
}
// alternates 1e/5e
void ks0164_device::irqen_76_w(u8 data)
{
m_irqen_76 = data;
@ -348,6 +402,8 @@ void ks0164_device::cpu_map(address_map &map)
map(0x0068, 0x0068).rw(FUNC(ks0164_device::mpu401_r), FUNC(ks0164_device::mpu401_w));
map(0x0069, 0x0069).rw(FUNC(ks0164_device::mpu401_istatus_r), FUNC(ks0164_device::mpu401_istatus_w));
map(0x006c, 0x006c).rw(FUNC(ks0164_device::midi_r), FUNC(ks0164_device::midi_w));
map(0x006d, 0x006d).rw(FUNC(ks0164_device::midi_status_r), FUNC(ks0164_device::midi_status_w));
map(0x0076, 0x0076).rw(FUNC(ks0164_device::irqen_76_r), FUNC(ks0164_device::irqen_76_w));
map(0x0077, 0x0077).rw(FUNC(ks0164_device::irqen_77_r), FUNC(ks0164_device::irqen_77_w));

View File

@ -9,8 +9,9 @@
#pragma once
#include "cpu/ks0164/ks0164.h"
#include "diserial.h"
class ks0164_device : public device_t, public device_sound_interface, public device_memory_interface
class ks0164_device : public device_t, public device_sound_interface, public device_memory_interface, public device_serial_interface
{
public:
ks0164_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 16934400);
@ -20,6 +21,9 @@ public:
u8 mpu401_data_r();
u8 mpu401_status_r();
void midi_rx(int state) { rx_w(state); }
auto midi_tx() { return m_midi_tx.bind(); }
protected:
virtual void device_start() override;
virtual void device_reset() override;
@ -28,6 +32,10 @@ protected:
virtual space_config_vector memory_space_config() const override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual void tra_callback() override;
virtual void tra_complete() override;
virtual void rcv_complete() override;
private:
enum {
MPUS_RX_FULL = 0x01,
@ -37,6 +45,8 @@ private:
MPUS_RX_INT = 0x80
};
devcb_write_line m_midi_tx;
optional_memory_region m_mem_region;
required_device<ks0164_cpu_device> m_cpu;
address_space_config m_mem_config;
@ -53,6 +63,9 @@ private:
u8 m_mpu_out;
u8 m_mpu_status;
u8 m_midi_in;
bool m_midi_in_active;
u8 m_unk60;
u8 m_voice_select;
u8 m_irqen_76, m_irqen_77;
@ -88,6 +101,11 @@ private:
u8 mpu401_istatus_r();
void mpu401_istatus_w(u8 data);
u8 midi_r();
void midi_w(u8 data);
u8 midi_status_r();
void midi_status_w(u8 data);
static inline u16 uncomp_8_16(u8 value);
};

View File

@ -0,0 +1,68 @@
// license:BSD-3-Clause
// copyright-holders: Olivier Galibert
// A "virtual" driver to turn waveblaster cards into a screen-less expander
// Currently KS0164 only, and built-in. Evetually should be slot-based with
// multiple possible cards
#include "emu.h"
#include "speaker.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
#include "sound/ks0164.h"
class wavesynth_state : public driver_device
{
public:
wavesynth_state(const machine_config &mconfig, device_type type, const char *tag);
void wavesynth(machine_config &config);
private:
virtual void machine_start() override;
required_device<ks0164_device> m_waveblaster;
};
wavesynth_state::wavesynth_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_waveblaster(*this, "waveblaster")
{
}
void wavesynth_state::machine_start()
{
}
static INPUT_PORTS_START( wavesynth )
INPUT_PORTS_END
void wavesynth_state::wavesynth(machine_config &config)
{
KS0164(config, m_waveblaster, 16.9344_MHz_XTAL);
m_waveblaster->add_route(0, "lspeaker", 1.0);
m_waveblaster->add_route(1, "rspeaker", 1.0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
auto &mdin(MIDI_PORT(config, "mdin"));
midiin_slot(mdin);
mdin.rxd_handler().set(m_waveblaster, FUNC(ks0164_device::midi_rx));
auto &mdout(MIDI_PORT(config, "mdout"));
midiout_slot(mdout);
m_waveblaster->midi_tx().set(mdout, FUNC(midi_port_device::write_txd));
}
ROM_START( wavesynth )
ROM_REGION( 0x100000, "waveblaster", 0)
ROM_LOAD16_WORD_SWAP("ks0174-1m04.bin", 0, 0x100000, CRC(3cabaa2f) SHA1(1e894c0345eaf0ea713f36a75b065f7ee419c63c))
ROM_END
CONS( 2020, wavesynth, 0, 0, wavesynth, wavesynth, wavesynth_state, empty_init, "MAME", "Waveblaster-based expander", MACHINE_SUPPORTS_SAVE )

View File

@ -43052,6 +43052,9 @@ palestra
@source:vgmplay.cpp
vgmplay
@source:wavesynth.cpp
wavesynth
@source:ldplayer.cpp
simldv1000 // Pioneer LD-V1000
simpr8210 // Pioneer PR-8210

View File

@ -3,3 +3,4 @@
vgmplay
simldv1000
simpr8210
wavesynth