mirror of
https://github.com/holub/mame
synced 2025-05-30 17:41:47 +03:00
vgmplay: Added Stop, Pause, Play, Restart, and Loop controls, nw
This commit is contained in:
parent
1f99a9eee3
commit
7faebc9f4d
@ -131,6 +131,12 @@ public:
|
||||
template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_bank_w);
|
||||
template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_w);
|
||||
|
||||
void stop();
|
||||
void pause();
|
||||
bool paused() const { return m_paused; }
|
||||
void play();
|
||||
void toggle_loop() { m_loop = !m_loop; }
|
||||
|
||||
private:
|
||||
struct rom_block {
|
||||
offs_t start_address;
|
||||
@ -146,7 +152,10 @@ private:
|
||||
address_space_config m_file_config, m_io_config, m_io16_config;
|
||||
address_space *m_file, *m_io, *m_io16;
|
||||
|
||||
int m_icount, m_state;
|
||||
int m_icount;
|
||||
int m_state;
|
||||
bool m_paused;
|
||||
bool m_loop;
|
||||
|
||||
uint32_t m_pc;
|
||||
|
||||
@ -172,6 +181,15 @@ private:
|
||||
|
||||
DEFINE_DEVICE_TYPE(VGMPLAY, vgmplay_device, "vgmplay_core", "VGM Player engine")
|
||||
|
||||
enum vgmplay_inputs : uint8_t
|
||||
{
|
||||
VGMPLAY_STOP,
|
||||
VGMPLAY_PAUSE,
|
||||
VGMPLAY_PLAY,
|
||||
VGMPLAY_RESTART,
|
||||
VGMPLAY_LOOP,
|
||||
};
|
||||
|
||||
class vgmplay_state : public driver_device
|
||||
{
|
||||
public:
|
||||
@ -181,6 +199,7 @@ public:
|
||||
|
||||
DECLARE_READ8_MEMBER(file_r);
|
||||
DECLARE_READ8_MEMBER(file_size_r);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(key_pressed);
|
||||
|
||||
template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_clock_w);
|
||||
template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_pin7_w);
|
||||
@ -209,6 +228,9 @@ public:
|
||||
private:
|
||||
std::vector<uint8_t> m_file_data;
|
||||
required_device<bitbanger_device> m_file;
|
||||
required_device<vgmplay_device> m_vgmplay;
|
||||
required_device<speaker_device> m_lspeaker;
|
||||
required_device<speaker_device> m_rspeaker;
|
||||
required_device<ym2612_device> m_ym2612;
|
||||
required_device<ym2151_device> m_ym2151;
|
||||
required_device<ym2413_device> m_ym2413;
|
||||
@ -268,11 +290,32 @@ void vgmplay_device::device_reset()
|
||||
{
|
||||
m_pc = 0;
|
||||
m_state = RESET;
|
||||
m_paused = false;
|
||||
m_loop = true;
|
||||
|
||||
m_ym2612_stream_offset = 0;
|
||||
blocks_clear();
|
||||
}
|
||||
|
||||
void vgmplay_device::stop()
|
||||
{
|
||||
device_reset();
|
||||
m_paused = true;
|
||||
}
|
||||
|
||||
void vgmplay_device::pause()
|
||||
{
|
||||
m_paused = !m_paused;
|
||||
}
|
||||
|
||||
void vgmplay_device::play()
|
||||
{
|
||||
if (m_paused && m_state != DONE)
|
||||
m_paused = false;
|
||||
else
|
||||
device_reset();
|
||||
}
|
||||
|
||||
uint32_t vgmplay_device::execute_min_cycles() const
|
||||
{
|
||||
return 0;
|
||||
@ -355,6 +398,16 @@ void vgmplay_device::execute_run()
|
||||
break;
|
||||
}
|
||||
case RUN: {
|
||||
if (m_paused)
|
||||
{
|
||||
machine().sound().system_mute(1);
|
||||
m_icount = 0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
machine().sound().system_mute(0);
|
||||
}
|
||||
if(machine().debug_flags & DEBUG_FLAG_ENABLED)
|
||||
debugger_instruction_hook(m_pc);
|
||||
uint8_t code = m_file->read_byte(m_pc);
|
||||
@ -634,14 +687,23 @@ void vgmplay_device::execute_run()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DONE: {
|
||||
case DONE:
|
||||
{
|
||||
static bool done = false;
|
||||
if(!done) {
|
||||
if(!done && !m_loop)
|
||||
{
|
||||
logerror("done\n");
|
||||
done = true;
|
||||
}
|
||||
if(machine().debug_flags & DEBUG_FLAG_ENABLED)
|
||||
debugger_instruction_hook(m_pc);
|
||||
else if (m_loop)
|
||||
{
|
||||
device_reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(machine().debug_flags & DEBUG_FLAG_ENABLED)
|
||||
debugger_instruction_hook(m_pc);
|
||||
}
|
||||
m_icount = 0;
|
||||
break;
|
||||
}
|
||||
@ -1075,6 +1137,9 @@ READ8_MEMBER(vgmplay_device::c352_rom_r)
|
||||
vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_file(*this, "file")
|
||||
, m_vgmplay(*this, "vgmplay")
|
||||
, m_lspeaker(*this, "lspeaker")
|
||||
, m_rspeaker(*this, "rspeaker")
|
||||
, m_ym2612(*this, "ym2612")
|
||||
, m_ym2151(*this, "ym2151")
|
||||
, m_ym2413(*this, "ym2413")
|
||||
@ -1479,7 +1544,39 @@ WRITE8_MEMBER(vgmplay_state::scc_w)
|
||||
}
|
||||
}
|
||||
|
||||
INPUT_CHANGED_MEMBER(vgmplay_state::key_pressed)
|
||||
{
|
||||
if (!newval)
|
||||
return;
|
||||
|
||||
int val = (uint8_t)(uintptr_t)param;
|
||||
switch (val)
|
||||
{
|
||||
case VGMPLAY_STOP:
|
||||
m_vgmplay->stop();
|
||||
break;
|
||||
case VGMPLAY_PAUSE:
|
||||
m_vgmplay->pause();
|
||||
break;
|
||||
case VGMPLAY_PLAY:
|
||||
m_vgmplay->play();
|
||||
break;
|
||||
case VGMPLAY_RESTART:
|
||||
m_vgmplay->device_reset();
|
||||
break;
|
||||
case VGMPLAY_LOOP:
|
||||
m_vgmplay->toggle_loop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( vgmplay )
|
||||
PORT_START("CONTROLS")
|
||||
PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_STOP) PORT_NAME("Stop")
|
||||
PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_PAUSE) PORT_NAME("Pause")
|
||||
PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_PLAY) PORT_NAME("Play")
|
||||
PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_RESTART) PORT_NAME("Restart")
|
||||
PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_LOOP) PORT_NAME("Loop")
|
||||
INPUT_PORTS_END
|
||||
|
||||
void vgmplay_state::file_map(address_map &map)
|
||||
|
Loading…
Reference in New Issue
Block a user