summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2021-11-12 22:48:42 +1100
committer Robbbert <Robbbert@users.noreply.github.com>2021-11-12 22:48:42 +1100
commit64af120bab29a76161b960ed2a3639c6a2b19afd (patch)
treedc06dfcac5e39a445b0aa69557a9376c2233886f
parentfa9ece2c1810c812c082c684098be101b1962098 (diff)
parentb8aa7a3d6535d1572932b4817abf16eb5d93643e (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--3rdparty/genie/build/gmake.linux/genie.make4
-rw-r--r--3rdparty/genie/scripts/genie.lua3
-rw-r--r--hash/nes.xml6
-rw-r--r--src/devices/bus/nes_ctrl/ctrl.cpp1
-rw-r--r--src/devices/bus/nes_ctrl/zapper.cpp91
-rw-r--r--src/devices/bus/nes_ctrl/zapper.h37
-rw-r--r--src/devices/cpu/m6502/om740.lst2
-rw-r--r--src/devices/cpu/mcs48/mcs48.h54
-rw-r--r--src/devices/cpu/romp/romp.h52
-rw-r--r--src/emu/emuopts.cpp2
-rw-r--r--src/mame/drivers/rtpc.cpp74
-rw-r--r--src/mame/drivers/taitotx.cpp4
-rw-r--r--src/mame/drivers/techno.cpp1
-rw-r--r--src/mame/drivers/vd.cpp226
-rw-r--r--src/mame/drivers/wico.cpp260
-rw-r--r--src/mame/layout/vd.lay130
-rw-r--r--src/mame/machine/rtpc_iocc.cpp1
-rw-r--r--src/mame/machine/rtpc_iocc.h6
-rw-r--r--src/osd/windows/winmain.cpp67
19 files changed, 680 insertions, 341 deletions
diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make
index fbb65308854..af00e6f90f7 100644
--- a/3rdparty/genie/build/gmake.linux/genie.make
+++ b/3rdparty/genie/build/gmake.linux/genie.make
@@ -46,7 +46,7 @@ ifeq ($(config),release)
OBJDIR = obj/Release
TARGETDIR = ../../bin/linux
override TARGET = $(TARGETDIR)/genie
- DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
+ DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_FILE_OFFSET_BITS=64
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -Wno-implicit-fallthrough
@@ -133,7 +133,7 @@ ifeq ($(config),debug)
OBJDIR = obj/Debug
TARGETDIR = ../../bin/linux
override TARGET = $(TARGETDIR)/genie
- DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
+ DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_FILE_OFFSET_BITS=64
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -Wno-implicit-fallthrough
diff --git a/3rdparty/genie/scripts/genie.lua b/3rdparty/genie/scripts/genie.lua
index 7e64ad9a68a..de537253079 100644
--- a/3rdparty/genie/scripts/genie.lua
+++ b/3rdparty/genie/scripts/genie.lua
@@ -77,6 +77,9 @@
links { "m" }
linkoptions { "-rdynamic" }
+ configuration "linux"
+ define { "_FILE_OFFSET_BITS=64" }
+
configuration "macosx"
targetdir "../bin/darwin"
defines { "LUA_USE_MACOSX" }
diff --git a/hash/nes.xml b/hash/nes.xml
index 977c2f73b58..a01205bc072 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -50091,9 +50091,8 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
-<!-- The Bandai Hyper Shot controller/zapper for Space Shadow is not emulated -->
- <software name="spaceshd" supported="no">
- <description>Space Shadow (Jpn)</description>
+ <software name="spaceshd">
+ <description>Space Shadow (Japan)</description>
<year>1989</year>
<publisher>Bandai</publisher>
<info name="serial" value="BA-HYPER"/>
@@ -50103,6 +50102,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<feature name="slot" value="discrete_74x161" />
<feature name="pcb" value="BANDAI-74*161/161/32" />
<feature name="mirroring" value="pcb_controlled" />
+ <feature name="peripheral" value="bandai_hypershot" />
<dataarea name="chr" size="131072">
<rom name="space shadow (japan).chr" size="131072" crc="6690e5c1" sha1="f05cc0478786a5e6d153c2f85c00c14afa0e61b0" offset="00000" status="baddump" />
</dataarea>
diff --git a/src/devices/bus/nes_ctrl/ctrl.cpp b/src/devices/bus/nes_ctrl/ctrl.cpp
index 9c347f563fd..91c0f3376d0 100644
--- a/src/devices/bus/nes_ctrl/ctrl.cpp
+++ b/src/devices/bus/nes_ctrl/ctrl.cpp
@@ -202,6 +202,7 @@ void fc_expansion_devices(device_slot_interface &device)
device.option_add("arcstick", NES_ARCSTICK);
device.option_add("fc_keyboard", NES_FCKEYBOARD);
device.option_add("zapper", NES_ZAPPER);
+ device.option_add("bandaihs", NES_BANDAIHS);
device.option_add("vaus", NES_ARKPADDLE_FC);
device.option_add("family_trainer", NES_FTRAINER);
device.option_add("konamihs", NES_KONAMIHS);
diff --git a/src/devices/bus/nes_ctrl/zapper.cpp b/src/devices/bus/nes_ctrl/zapper.cpp
index da3df413a40..40165d1543c 100644
--- a/src/devices/bus/nes_ctrl/zapper.cpp
+++ b/src/devices/bus/nes_ctrl/zapper.cpp
@@ -3,6 +3,7 @@
/**********************************************************************
Nintendo Family Computer & Entertainment System Zapper Lightgun
+ Nintendo Family Computer Bandai Hyper Shot Lightgun
**********************************************************************/
@@ -14,7 +15,8 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(NES_ZAPPER, nes_zapper_device, "nes_zapper", "Nintendo Zapper Lightgun")
+DEFINE_DEVICE_TYPE(NES_ZAPPER, nes_zapper_device, "nes_zapper", "Nintendo Zapper Lightgun")
+DEFINE_DEVICE_TYPE(NES_BANDAIHS, nes_bandaihs_device, "nes_bandaihs", "Bandai Hyper Shot Lightgun")
static INPUT_PORTS_START( nes_zapper )
@@ -27,6 +29,21 @@ static INPUT_PORTS_START( nes_zapper )
INPUT_PORTS_END
+static INPUT_PORTS_START( nes_bandaihs )
+ PORT_INCLUDE( nes_zapper )
+
+ PORT_START("JOYPAD")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // has complete joypad inputs except button A
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+INPUT_PORTS_END
+
+
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
@@ -36,6 +53,11 @@ ioport_constructor nes_zapper_device::device_input_ports() const
return INPUT_PORTS_NAME( nes_zapper );
}
+ioport_constructor nes_bandaihs_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( nes_bandaihs );
+}
+
//**************************************************************************
@@ -43,15 +65,28 @@ ioport_constructor nes_zapper_device::device_input_ports() const
//**************************************************************************
//-------------------------------------------------
-// nes_zapper_device - constructor
+// constructor
//-------------------------------------------------
-nes_zapper_device::nes_zapper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, NES_ZAPPER, tag, owner, clock),
- device_nes_control_port_interface(mconfig, *this),
- m_lightx(*this, "ZAPPER_X"),
- m_lighty(*this, "ZAPPER_Y"),
- m_trigger(*this, "ZAPPER_T")
+nes_zapper_device::nes_zapper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_nes_control_port_interface(mconfig, *this)
+ , m_lightx(*this, "ZAPPER_X")
+ , m_lighty(*this, "ZAPPER_Y")
+ , m_trigger(*this, "ZAPPER_T")
+{
+}
+
+nes_zapper_device::nes_zapper_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_zapper_device(mconfig, NES_ZAPPER, tag, owner, clock)
+{
+}
+
+nes_bandaihs_device::nes_bandaihs_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_zapper_device(mconfig, NES_BANDAIHS, tag, owner, clock)
+ , m_joypad(*this, "JOYPAD")
+ , m_latch(0)
+ , m_strobe(0)
{
}
@@ -64,6 +99,13 @@ void nes_zapper_device::device_start()
{
}
+void nes_bandaihs_device::device_start()
+{
+ nes_zapper_device::device_start();
+ save_item(NAME(m_latch));
+ save_item(NAME(m_strobe));
+}
+
//-------------------------------------------------
// device_reset
@@ -78,9 +120,9 @@ void nes_zapper_device::device_reset()
// read
//-------------------------------------------------
-uint8_t nes_zapper_device::read_bit34()
+u8 nes_zapper_device::read_bit34()
{
- uint8_t ret = m_trigger->read();
+ u8 ret = m_trigger->read();
int x = m_lightx->read();
int y = m_lighty->read();
@@ -107,10 +149,35 @@ uint8_t nes_zapper_device::read_bit34()
return ret;
}
-uint8_t nes_zapper_device::read_exp(offs_t offset)
+u8 nes_zapper_device::read_exp(offs_t offset)
{
- uint8_t ret = 0;
+ u8 ret = 0;
if (offset == 1) // $4017
ret |= nes_zapper_device::read_bit34();
return ret;
}
+
+u8 nes_bandaihs_device::read_bit0()
+{
+ if (m_strobe & 1)
+ m_latch = m_joypad->read();
+
+ u8 ret = m_latch & 1;
+ m_latch = (m_latch >> 1) | 0x80;
+
+ return ret;
+}
+
+// In addition to bit 0 used here the real Bandai Hyper Shot also responds to
+// bits 1 and 2, neither emulated here. Bit 1 turns on and off a motor, which
+// causes the machine gun to shake as if to simulate recoil. Bit 2 turns on and
+// off an internal speaker in the gun. Videos demostrate that the speaker plays
+// the same audio as the Famicom itself. The analog audio signal of the FC is
+// carried on expansion port pin 2, so there's likely nothing more going on.
+void nes_bandaihs_device::write(u8 data)
+{
+ if (m_strobe & 1)
+ m_latch = m_joypad->read();
+
+ m_strobe = data;
+}
diff --git a/src/devices/bus/nes_ctrl/zapper.h b/src/devices/bus/nes_ctrl/zapper.h
index 5ae68fd0a6e..42443806f33 100644
--- a/src/devices/bus/nes_ctrl/zapper.h
+++ b/src/devices/bus/nes_ctrl/zapper.h
@@ -3,6 +3,7 @@
/**********************************************************************
Nintendo Family Computer & Entertainment System Zapper Lightgun
+ Nintendo Family Computer Bandai Hyper Shot Lightgun
**********************************************************************/
@@ -25,17 +26,20 @@ class nes_zapper_device : public device_t,
{
public:
// construction/destruction
- nes_zapper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_zapper_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual ioport_constructor device_input_ports() const override;
protected:
+ // construction/destruction
+ nes_zapper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual uint8_t read_bit34() override;
- virtual uint8_t read_exp(offs_t offset) override;
+ virtual u8 read_bit34() override;
+ virtual u8 read_exp(offs_t offset) override;
private:
required_ioport m_lightx;
@@ -44,7 +48,32 @@ private:
};
+// ======================> nes_bandaihs_device
+
+class nes_bandaihs_device : public nes_zapper_device
+{
+public:
+ // construction/destruction
+ nes_bandaihs_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual ioport_constructor device_input_ports() const override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ virtual u8 read_bit0() override;
+ virtual void write(u8 data) override;
+
+private:
+ required_ioport m_joypad;
+ u8 m_latch;
+ u8 m_strobe;
+};
+
+
// device type definition
-DECLARE_DEVICE_TYPE(NES_ZAPPER, nes_zapper_device)
+DECLARE_DEVICE_TYPE(NES_ZAPPER, nes_zapper_device)
+DECLARE_DEVICE_TYPE(NES_BANDAIHS, nes_bandaihs_device)
#endif // MAME_BUS_NES_CTRL_ZAPPER
diff --git a/src/devices/cpu/m6502/om740.lst b/src/devices/cpu/m6502/om740.lst
index 86e09028517..cf383b50266 100644
--- a/src/devices/cpu/m6502/om740.lst
+++ b/src/devices/cpu/m6502/om740.lst
@@ -1146,7 +1146,7 @@ sty_m_aba
sty_m_zpg
TMP = read_pc();
read_dummy(TMP);
- write(TMP, X);
+ write(TMP, Y);
prefetch();
sty_m_zpx
diff --git a/src/devices/cpu/mcs48/mcs48.h b/src/devices/cpu/mcs48/mcs48.h
index df143df239c..bb5d3da44f9 100644
--- a/src/devices/cpu/mcs48/mcs48.h
+++ b/src/devices/cpu/mcs48/mcs48.h
@@ -70,33 +70,33 @@ enum
TYPES
***************************************************************************/
-/* Official Intel MCS-48 parts */
-DECLARE_DEVICE_TYPE(I8021, i8021_device) // 1k internal ROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8022, i8022_device) // 2k internal ROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8035, i8035_device) // external ROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8048, i8048_device) // 1k internal ROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8648, i8648_device) // 1k internal OTP ROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8748, i8748_device) // 1k internal EEPROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8039, i8039_device) // external ROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8049, i8049_device) // 2k internal ROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8749, i8749_device) // 2k internal EEPROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8040, i8040_device) // external ROM, 256 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8050, i8050_device) // 4k internal ROM, 256 bytes internal RAM
-
-/* Official Intel UPI-41 parts */
-DECLARE_DEVICE_TYPE(I8041A, i8041a_device) // 1k internal ROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8741A, i8741a_device) // 1k internal EEPROM, 64 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8041AH, i8041ah_device) // 1k internal ROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8741AH, i8741ah_device) // 1k internal EEPROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8042, i8042_device) // 2k internal ROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8742, i8742_device) // 2k internal EEPROM, 128 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8042AH, i8042ah_device) // 2k internal ROM, 256 bytes internal RAM
-DECLARE_DEVICE_TYPE(I8742AH, i8742ah_device) // 2k internal EEPROM, 256 bytes internal RAM
-
-/* Clones */
-DECLARE_DEVICE_TYPE(MB8884, mb8884_device) // 8035 clone
-DECLARE_DEVICE_TYPE(N7751, n7751_device) // 8048 clone
-DECLARE_DEVICE_TYPE(M58715, m58715_device) // 8049 clone
+// Official Intel MCS-48 parts
+DECLARE_DEVICE_TYPE(I8021, i8021_device) // 1k internal ROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8022, i8022_device) // 2k internal ROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8035, i8035_device) // external ROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8048, i8048_device) // 1k internal ROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8648, i8648_device) // 1k internal OTP ROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8748, i8748_device) // 1k internal UV EPROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8039, i8039_device) // external ROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8049, i8049_device) // 2k internal ROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8749, i8749_device) // 2k internal UV EPROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8040, i8040_device) // external ROM, 256 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8050, i8050_device) // 4k internal ROM, 256 bytes internal RAM
+
+// Official Intel UPI-41 parts
+DECLARE_DEVICE_TYPE(I8041A, i8041a_device) // 1k internal ROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8741A, i8741a_device) // 1k internal UV EPROM, 64 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8041AH, i8041ah_device) // 1k internal ROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8741AH, i8741ah_device) // 1k internal UV EPROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8042, i8042_device) // 2k internal ROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8742, i8742_device) // 2k internal UV EPROM, 128 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8042AH, i8042ah_device) // 2k internal ROM, 256 bytes internal RAM
+DECLARE_DEVICE_TYPE(I8742AH, i8742ah_device) // 2k internal UV EPROM, 256 bytes internal RAM
+
+// Clones
+DECLARE_DEVICE_TYPE(MB8884, mb8884_device) // 8035 clone
+DECLARE_DEVICE_TYPE(N7751, n7751_device) // 8048 clone
+DECLARE_DEVICE_TYPE(M58715, m58715_device) // 8049 clone
diff --git a/src/devices/cpu/romp/romp.h b/src/devices/cpu/romp/romp.h
index 3ff1a55be0e..27a710f1d84 100644
--- a/src/devices/cpu/romp/romp.h
+++ b/src/devices/cpu/romp/romp.h
@@ -174,10 +174,24 @@ private:
break;
case 15:
- if (m_iou->load(address, data, mode))
- f(data);
- else
+ switch (address >> 24)
+ {
+ case 0xf0:
+ case 0xf4:
+ if (m_iou->load(address, data, mode))
+ f(data);
+ else
+ program_check(PCS_PCK | PCS_DAE);
+ break;
+
+ case 0xfc: // mc68881 assist mode
+ case 0xfd: // mc68881 non-assist mode
+ case 0xfe: // afpa dma
+ case 0xff: // fpa
+ default: // reserved
program_check(PCS_PCK | PCS_DAE);
+ break;
+ }
break;
}
}
@@ -194,8 +208,22 @@ private:
break;
case 15:
- if (!m_iou->store(address, data, mode))
+ switch (address >> 24)
+ {
+ case 0xf0:
+ case 0xf4:
+ if (!m_iou->store(address, data, mode))
+ program_check(PCS_PCK | PCS_DAE);
+ break;
+
+ case 0xfc: // mc68881 assist mode
+ case 0xfd: // mc68881 non-assist mode
+ case 0xfe: // afpa dma
+ case 0xff: // fpa
+ default: // reserved
program_check(PCS_PCK | PCS_DAE);
+ break;
+ }
break;
}
}
@@ -212,8 +240,22 @@ private:
break;
case 15:
- if (!m_iou->modify(address, f, mode))
+ switch (address >> 24)
+ {
+ case 0xf0:
+ case 0xf4:
+ if (!m_iou->modify(address, f, mode))
+ program_check(PCS_PCK | PCS_DAE);
+ break;
+
+ case 0xfc: // mc68881 assist mode
+ case 0xfd: // mc68881 non-assist mode
+ case 0xfe: // afpa dma
+ case 0xff: // fpa
+ default: // reserved
program_check(PCS_PCK | PCS_DAE);
+ break;
+ }
break;
}
}
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index bcd28082253..a045fe23317 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -205,7 +205,7 @@ const options_entry emu_options::s_option_entries[] =
{ OPTION_RAMSIZE ";ram", nullptr, OPTION_STRING, "size of RAM (if supported by driver)" },
{ OPTION_CONFIRM_QUIT, "0", OPTION_BOOLEAN, "ask for confirmation before exiting" },
{ OPTION_UI_MOUSE, "1", OPTION_BOOLEAN, "display UI mouse cursor" },
- { OPTION_LANGUAGE ";lang", "English", OPTION_STRING, "set UI display language" },
+ { OPTION_LANGUAGE ";lang", "", OPTION_STRING, "set UI display language" },
{ OPTION_NVRAM_SAVE ";nvwrite", "1", OPTION_BOOLEAN, "save NVRAM data on exit" },
{ nullptr, nullptr, OPTION_HEADER, "SCRIPTING OPTIONS" },
diff --git a/src/mame/drivers/rtpc.cpp b/src/mame/drivers/rtpc.cpp
index 62141eb4e28..17ef1ebdd66 100644
--- a/src/mame/drivers/rtpc.cpp
+++ b/src/mame/drivers/rtpc.cpp
@@ -65,8 +65,11 @@
*
*/
/*
+ * https://ardent-tool.com/615x/rt_loadable_post.html
+ *
* WIP
- * - diagnostic disk 1 fails with code 67
+ * - diagnostic disk 1 fails with alternating code a6/13
+ * exception at 0x16824: lcs r2,0x4(r9) # r9=40435c9c
* - aix vrm disk 1 fails with alternating code a6/13
*/
@@ -147,6 +150,7 @@ protected:
virtual void machine_start() override;
virtual void machine_reset() override;
+ void iocc_mem_map(address_map &map) { map.unmap_value_high(); }
template <bool SCC> void iocc_pio_map(address_map &map);
void common(machine_config &config);
@@ -233,6 +237,8 @@ void rtpc_state::init_common()
template <bool SCC> void rtpc_state::iocc_pio_map(address_map &map)
{
+ map(0x00'01e8, 0x00'01ef).noprw(); // FIXME: silence streaming tape drive adapter probes
+
if (SCC)
{
map(0x00'8000, 0x00'8003).rw(m_scc, FUNC(z80scc_device::dc_ab_r), FUNC(z80scc_device::dc_ab_w));
@@ -266,6 +272,10 @@ template <bool SCC> void rtpc_state::iocc_pio_map(address_map &map)
map(0x00'8c80, 0x00'8c80).mirror(0x03).lr8([]() { return 0xf8; }, "mcr");
map(0x00'8ca0, 0x00'8ca0).mirror(0x03).w(FUNC(rtpc_state::dia_w));
+ // 8c82 diag dma mode?
+ // 8c84 diag dma exit?
+ map(0x00'8ce0, 0x00'8ce1).nopw(); // FIXME: hex display register?
+
map(0x01'0000, 0x01'07ff).rw(m_iocc, FUNC(rtpc_iocc_device::tcw_r), FUNC(rtpc_iocc_device::tcw_w));
map(0x01'0800, 0x01'0801).mirror(0x7fc).rw(m_iocc, FUNC(rtpc_iocc_device::csr_r<1>), FUNC(rtpc_iocc_device::csr_w));
map(0x01'0802, 0x01'0803).mirror(0x7fc).rw(m_iocc, FUNC(rtpc_iocc_device::csr_r<0>), FUNC(rtpc_iocc_device::csr_w));
@@ -506,6 +516,7 @@ void rtpc_state::common(machine_config &config)
TIMER(config, "mcu_timer").configure_periodic(FUNC(rtpc_state::mcu_timer), attotime::from_hz(32768));
RTPC_IOCC(config, m_iocc, 0);
+ m_iocc->set_addrmap(0, &rtpc_state::iocc_mem_map);
m_iocc->out_int().set(reqi2, FUNC(input_merger_device::in_w<1>));
m_iocc->out_rst().set_inputline(m_dma[0], INPUT_LINE_RESET);
m_iocc->out_rst().append_inputline(m_dma[1], INPUT_LINE_RESET);
@@ -520,40 +531,61 @@ void rtpc_state::common(machine_config &config)
// D8237AC-5
// 8903HV101
AM9517A(config, m_dma[0], m_isa->clock());
- // chan usage
- // 0 serial port A
- // 1 serial port B
- // 2 diskette drive, serial port A
- // 3 pc network, serial port B
- m_isa->drq0_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<0>));
- m_isa->drq1_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<1>));
- m_isa->drq2_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<2>));
- m_isa->drq3_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<3>));
- m_dma[0]->out_hreq_callback().set(m_dma[0], FUNC(am9517a_device::hack_w));
+
+ // dma0 channel 0 == isa channel 2 (diskette drive, serial port A)
+ m_isa->drq2_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<0>));
+ m_dma[0]->in_ior_callback<0>().set([this]() { return m_isa->dack_r(2); });
+ m_dma[0]->out_iow_callback<0>().set([this](u8 data) { m_isa->dack_w(2, data); });
m_dma[0]->out_dack_callback<0>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<2>));
+
+ // dma0 channel 1 == isa channel 1 (serial port B)
+ m_isa->drq1_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<1>));
+ m_dma[0]->in_ior_callback<1>().set([this]() { return m_isa->dack_r(1); });
+ m_dma[0]->out_iow_callback<1>().set([this](u8 data) { m_isa->dack_w(1, data); });
m_dma[0]->out_dack_callback<1>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<1>));
+
+ // dma0 channel 2 == isa channel 0 (serial port A)
+ m_isa->drq0_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<2>));
+ m_dma[0]->in_ior_callback<2>().set([this]() { return m_isa->dack_r(0); });
+ m_dma[0]->out_iow_callback<2>().set([this](u8 data) { m_isa->dack_w(0, data); });
m_dma[0]->out_dack_callback<2>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<0>));
+
+ // dma0 channel 3 == isa channel 3 (pc network, serial port B)
+ m_isa->drq3_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<3>));
+ m_dma[0]->in_ior_callback<3>().set([this]() { return m_isa->dack_r(3); });
+ m_dma[0]->out_iow_callback<3>().set([this](u8 data) { m_isa->dack_w(3, data); });
m_dma[0]->out_dack_callback<3>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<3>));
+
+ m_dma[0]->out_hreq_callback().set(m_dma[0], FUNC(am9517a_device::hack_w));
m_dma[0]->in_memr_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_b_r));
m_dma[0]->out_memw_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_b_w));
+ m_dma[0]->out_eop_callback().set(m_pic[0], FUNC(pic8259_device::ir0_w));
+
+ // FIXME: eop should be asserted on the bus and tested by the device
+ // when transferring data, not routed to a specific card like this
+ m_dma[0]->out_eop_callback().append([this](int state) { m_isa->eop_w(m_iocc->adc_r(), state); });
// NEC
// D8237AC-5
// 8903HV101
AM9517A(config, m_dma[1], m_isa->clock());
- // chan usage
- // 5 reserved
- // 6 reserved
- // 7 reserved
- // 8 286 coprocessor
- m_isa->drq5_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<1>));
- m_isa->drq6_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<2>));
- m_isa->drq7_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<3>));
- m_dma[1]->out_hreq_callback().set(m_dma[1], FUNC(am9517a_device::hack_w));
+
+ // dma1 channel 0 == coprocessor channel 8?
m_dma[1]->out_dack_callback<0>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<4>));
+
+ // dma1 channel 1 == isa channel 5
+ m_isa->drq5_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<1>));
m_dma[1]->out_dack_callback<1>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<5>));
+
+ // dma1 channel 2 == isa channel 6
+ m_isa->drq6_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<2>));
m_dma[1]->out_dack_callback<2>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<6>));
+
+ // dma1 channel 3 == isa channel 7
+ m_isa->drq7_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<3>));
m_dma[1]->out_dack_callback<3>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<7>));
+
+ m_dma[1]->out_hreq_callback().set(m_dma[1], FUNC(am9517a_device::hack_w));
m_dma[1]->in_memr_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_w_r));
m_dma[1]->out_memw_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_w_w));
@@ -716,7 +748,7 @@ void rtpc_state::ibm6151(machine_config &config)
ISA16_SLOT(config, "isa3", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 2: option
ISA16_SLOT(config, "isa4", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 4: option
ISA16_SLOT(config, "isa5", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 5: coprocessor/option
- ISA16_SLOT(config, "isa6", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 6: disk/diskette adapter
+ ISA16_SLOT(config, "isa6", 0, m_isa, rtpc_isa16_cards, "fdc", false); // slot 6: disk/diskette adapter
}
ROM_START(ibm6150)
diff --git a/src/mame/drivers/taitotx.cpp b/src/mame/drivers/taitotx.cpp
index f12ad04a2fb..1a27e239753 100644
--- a/src/mame/drivers/taitotx.cpp
+++ b/src/mame/drivers/taitotx.cpp
@@ -36,7 +36,7 @@
Dragon Quest - Monster Battle Road
Dragon Quest - Monster Battle Road II Legends
Gigawing Generations
- Goketsuji Ichizoku: Matsuri Senzo Kuyou
+ Gouketsuji Ichizoku: Senzo Kuyou
Harakari Professional Baseball
Homura
King Of Jurassic
@@ -336,7 +336,7 @@ GAME( 2006, shikiga3, 0, taito_type_x, taito_type_x, taito_type_x_state, emp
GAME( 2007, raiden4, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "MOSS / Seibu Kaihatsu", "Raiden IV (v1.00J)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
GAME( 2008, kof98um, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "SNK", "The King of Fighters '98: Ultimate Match (v1.00)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
GAME( 2008, trbwtchs, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "Adventure Planning Service/Studio SiestA", "Trouble Witches AC (v1.00J)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-GAME( 2009, goketsuj, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "Atlus", "Goketsuji Ichizoku: Matsuri Senzo Kuyou (v200906230)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+GAME( 2009, goketsuj, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "Atlus", "Gouketsuji Ichizoku: Senzo Kuyou (v200906230)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
GAME( 2010, kofskyst, 0, taito_type_x, taito_type_x, taito_type_x_state, empty_init, ROT0, "Moss / SNK Playmore", "KOF Sky Stage (v1.00J)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/techno.cpp b/src/mame/drivers/techno.cpp
index 1b0816791ab..fbceb65c334 100644
--- a/src/mame/drivers/techno.cpp
+++ b/src/mame/drivers/techno.cpp
@@ -24,7 +24,6 @@ ToDo:
- Schematic shows sound rom banking, but no machine has those roms, so not coded.
- xforce: sound rom is missing
- spcteam: Bad display - can't tell if keys are doing anything.
-- spcteam: randomly, lots of unmapped reads by the audiocpu from 0x20D8,9.
***********************************************************************************/
diff --git a/src/mame/drivers/vd.cpp b/src/mame/drivers/vd.cpp
index 83300b91c9b..5090579035f 100644
--- a/src/mame/drivers/vd.cpp
+++ b/src/mame/drivers/vd.cpp
@@ -2,15 +2,23 @@
// copyright-holders:Robbbert
/**************************************************************************************
- PINBALL
- Video Dens S.A., Madrid
+PINBALL
+Video Dens S.A., Madrid
- PinMAME used as reference. The Break '86 manual scan available on the net includes
- a mostly illegible schematic.
+PinMAME used as reference. The Break '86 manual scan available on the net includes
+a mostly illegible schematic.
- Nothing in this driver is confirmed except where noted.
+Machines by this manufacturer: Ator, Break, Papillion.
+Ator runs on different hardware (peyper.cpp).
- Ator runs on different hardware (peyper.cpp).
+Status:
+- Games are playable
+- You need to hold X when starting a game
+
+ToDo:
+- Papillion: ball number not showing
+- Status display is in different digits per game
+- Mechanical sounds
***************************************************************************************/
@@ -25,6 +33,8 @@
#include "vd.lh"
+namespace {
+
class vd_state : public genpin_class
{
public:
@@ -32,46 +42,52 @@ public:
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_digits(*this, "digit%u", 0U)
+ , m_io_outputs(*this, "out%u", 0U)
{ }
void vd(machine_config &config);
+ void init_0() { m_game = 0; }
+ void init_1() { m_game = 1; }
private:
- uint8_t ack_r();
- void col_w(uint8_t data);
- void disp_w(offs_t offset, uint8_t data);
- void lamp_w(uint8_t data) { };
- void sol_w(uint8_t data) { };
+ u8 ack_r();
+ u8 x0_r();
+ void col_w(u8 data);
+ void disp_w(offs_t offset, u8 data);
+ void lamp_w(offs_t, u8);
+ void sol_w(u8 data);
TIMER_DEVICE_CALLBACK_MEMBER(irq);
- void vd_io(address_map &map);
- void vd_map(address_map &map);
-
- uint8_t m_t_c;
- uint8_t segment[5];
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
+
+ bool m_ready = 0;
+ u8 m_t_c = 0;
+ u8 m_game = 0;
+ u8 m_segment[5]{};
+ virtual void machine_start() override;
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu;
- output_finder<60> m_digits;
+ output_finder<48> m_digits;
+ output_finder<80> m_io_outputs; // 16 solenoids + 64 lamps
};
-uint8_t vd_state::ack_r()
+u8 vd_state::ack_r()
{
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); // guess
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
return 0; // this value is not used
}
-void vd_state::vd_map(address_map &map)
+void vd_state::mem_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
- map(0x6000, 0x62ff).ram();
- map(0x6700, 0x67ff).ram();
+ map(0x6000, 0x67ff).ram().share("nvram");
}
-void vd_state::vd_io(address_map &map)
+void vd_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("X0");
+ map(0x00, 0x00).r(FUNC(vd_state::x0_r));
map(0x01, 0x01).portr("X1");
map(0x02, 0x02).portr("X2");
map(0x03, 0x03).portr("X3");
@@ -109,7 +125,7 @@ static INPUT_PORTS_START( break86 )
PORT_START("DSW2") // "Micro Swicher Nº 2"
PORT_DIPNAME(0x03, 0x03, "Scoring") PORT_DIPLOCATION("SW2:8,7") // "Tanteo"
- PORT_DIPSETTING(0x03, "800k / 1.4M / 2.0M / 2.6M") // = "Bola Extra," "1ª Partida," "2ª Partida," "High Score"
+ PORT_DIPSETTING(0x03, "800k / 1.4M / 2.0M / 2.6M") // = "Bola Extra," "1 Partida," "2 Partida," "High Score"
PORT_DIPSETTING(0x02, "1.0M / 1.6M / 2.2M / 2.8M")
PORT_DIPSETTING(0x01, "1.2M / 1.8M / 2.4M / 3.0M")
PORT_DIPSETTING(0x00, "1.4M / 2.0M / 2.6M / 3.2M")
@@ -135,16 +151,64 @@ static INPUT_PORTS_START( break86 )
PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) // SW3 not populated
PORT_START("X0")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_START1)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_COIN1)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_COIN2)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_TILT)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("INP02")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("INP03")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("INP04")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("INP05")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("INP06")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("INP07")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("X1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_START1) // start
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("INP12")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("INP13")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("INP14")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("INP15")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("INP16")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("INP17")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+
PORT_START("X2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("INP21")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("INP22")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("INP23")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("INP24")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("INP25")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("INP26")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("INP27")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+
PORT_START("X3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1) // coin
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("INP32")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("INP33")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("INP34")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("INP35")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("INP36")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("INP37")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+
PORT_START("X4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP42")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP43")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP44")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP45") // start break
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP46") // start pap
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP47")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+
PORT_START("X5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP51")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("INP52")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP53")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP54")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP55")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP56")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("INP57")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
static INPUT_PORTS_START( papillon )
@@ -153,57 +217,112 @@ INPUT_PORTS_END
TIMER_DEVICE_CALLBACK_MEMBER( vd_state::irq )
{
- if (m_t_c > 40)
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, HOLD_LINE);
+ if (m_t_c > 4)
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
else
m_t_c++;
}
-void vd_state::disp_w(offs_t offset, uint8_t data)
+// machine won't boot without a ball in the outhole,
+// so this does it for you.
+u8 vd_state::x0_r()
+{
+ return ioport("X0")->read() | (m_ready ? 0 : 1);
+}
+
+void vd_state::lamp_w(offs_t offset, u8 data)
{
- segment[offset] = data;
-#if 0 // probably not how this works
- if (!offset)
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
-#endif
+ for (u8 i = 0; i < 8; i++)
+ m_io_outputs[16+offset*8+i] = BIT(data, i);
}
-void vd_state::col_w(uint8_t data)
+void vd_state::sol_w(u8 data)
{
- if (data != 0x3f)
+ for (u8 i = 0; i < 16; i++)
+ m_io_outputs[i] = (data == i) ? 1 : 0;
+
+ // Outhole for each game
+ if (((data == 0x0a) && (m_game == 1)) || ((data == 0x0b) && (m_game == 0)))
{
- data &= 7;
- m_digits[data + 11] = segment[0];
- m_digits[data + 21] = segment[1];
- m_digits[data + 31] = segment[2];
- m_digits[data + 41] = segment[3];
- m_digits[data + 51] = segment[4];
+ m_samples->start(0, 5);
+ m_ready = 1;
}
}
+void vd_state::disp_w(offs_t offset, u8 data)
+{
+ m_segment[offset] = bitswap<8>(data, 0, 1, 2, 3, 4, 5, 6, 7);
+}
+
+// The digits are standard 7-segment, except that there's no DP but instead a comma at the front.
+void vd_state::col_w(u8 data)
+{
+ if (data & 8)
+ return;
+
+ data &= 7;
+ if (!data) // machine writes to this digit but it doesn't physically exist
+ return;
+
+ // apply or remove comma in the previous digit
+ for (u8 i = 0; i < 5; i++)
+ {
+ u8 t = (m_digits[data+10*i-1] & 0x7f) | (m_segment[i] & 0x80);
+ m_digits[data+10*i-1] = t;
+ }
+
+ // now do the current digits
+ // if the comma was there before, keep it on to stop flicker
+ for (u8 i = 0; i < 5; i++)
+ {
+ u8 t = m_digits[data+10*i] & 0x80;
+ m_digits[data+10*i] = (m_segment[i] & 0x7f) | t;
+ }
+}
+
+void vd_state::machine_start()
+{
+ genpin_class::machine_start();
+
+ m_digits.resolve();
+ m_io_outputs.resolve();
+
+ save_item(NAME(m_segment));
+ save_item(NAME(m_t_c));
+ save_item(NAME(m_game));
+ save_item(NAME(m_ready));
+}
+
void vd_state::machine_reset()
{
+ genpin_class::machine_reset();
+ for (u8 i = 0; i < m_io_outputs.size(); i++)
+ m_io_outputs[i] = 0;
+
m_t_c = 0;
+ m_ready = 0;
}
void vd_state::vd(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &vd_state::vd_map);
- m_maincpu->set_addrmap(AS_IO, &vd_state::vd_io);
- TIMER(config, "irq").configure_periodic(FUNC(vd_state::irq), attotime::from_hz(484));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vd_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &vd_state::io_map);
+ TIMER(config, "irq").configure_periodic(FUNC(vd_state::irq), attotime::from_hz(300));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Sound */
genpin_audio(config);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
ay8910_device &ay1(AY8910(config, "ay1", 2000000)); //?
- ay1.add_route(ALL_OUTPUTS, "lspeaker", 0.33/3);
+ ay1.add_route(ALL_OUTPUTS, "lspeaker", 0.5);
ay1.port_a_read_callback().set_ioport("DSW2");
ay1.port_b_read_callback().set_ioport("DSW1");
ay8910_device &ay2(AY8910(config, "ay2", 2000000)); //?
- ay2.add_route(ALL_OUTPUTS, "rspeaker", 0.33/3);
+ ay2.add_route(ALL_OUTPUTS, "rspeaker", 0.5);
ay2.port_b_read_callback().set_ioport("DSW3");
/* Video */
@@ -234,6 +353,7 @@ ROM_START(papillon)
ROM_LOAD("u6.dat", 0x4000, 0x2000, CRC(6b2867b3) SHA1(720fe8a65b447e839b0eb9ea21e0b3cb0e50cf7a))
ROM_END
+} // Anonymous namespace
-GAME(1986, break86, 0, vd, break86, vd_state, empty_init, ROT0, "Video Dens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, papillon, 0, vd, papillon, vd_state, empty_init, ROT0, "Video Dens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, break86, 0, vd, break86, vd_state, init_0, ROT0, "Video Dens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, papillon, 0, vd, papillon, vd_state, init_1, ROT0, "Video Dens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/wico.cpp b/src/mame/drivers/wico.cpp
index c898ab72e99..2accfd1371f 100644
--- a/src/mame/drivers/wico.cpp
+++ b/src/mame/drivers/wico.cpp
@@ -2,16 +2,14 @@
// copyright-holders:Robbbert
/**************************************************************************
- PINBALL
- Wico's only game : Af-tor
+PINBALL
+Schematic and PinMAME used as references.
- Schematic and PinMAME used as references.
- Code for the interrupts/timers was derived from PinMAME.
+Machines by this manufacturer: Af-tor, Big Top, Whirlwind Play Booster.
- Af-Tor was the first pinball to use alphanumeric displays.
- Each display has 12 segments, but are programmed with 8-bit codes.
- This makes some of the letters look rather odd, but it is still
- readable.
+Af-Tor was the first pinball to use alphanumeric displays.
+Each display has 12 segments, but are programmed with 8-bit codes.
+This makes some of the letters look rather odd, but it is still readable.
a a
_ _
@@ -20,21 +18,18 @@
d d
- Press 9 to enter service/selftest. Press 1 to step through the tests.
- When you reach the audit stages, press 6 to advance and 5 to clear.
- In the switch test, it will report any closed dip as a failure. You can
- ignore these.
- The game has 2 balls, for multiball feature, so the outhole doesn't
- work because it thinks the 2nd ball is in play somewhere.
-
- To activate the end-of-ball, hold down X then hold down num-9.
-
-
-ToDo:
-- Add outhole/saucer sound
+Press num-0 to enter service/selftest. Press 1 to step through the tests.
+When you reach the audit stages, press 6 to advance and 5 to clear.
+In the switch test, it will report any closed dip as a failure. You can
+ignore these.
+The game has 2 balls, for multiball feature, so the outhole doesn't
+work because it thinks the 2nd ball is in play somewhere.
+To activate the end-of-ball, hold down X then tap END.
+Status:
+- Working
***************************************************************************/
@@ -48,6 +43,7 @@ ToDo:
#include "wico.lh"
+namespace {
class wico_state : public genpin_class
{
@@ -57,23 +53,25 @@ public:
, m_ccpu(*this, "ccpu")
, m_hcpu(*this, "hcpu")
, m_shared_ram(*this, "sharedram")
+ , m_io_keyboard(*this, "X%d", 0U)
, m_digits(*this, "digit%u", 0U)
+ , m_io_outputs(*this, "out%u", 0U)
{ }
void wico(machine_config &config);
private:
- uint8_t lampst_r();
- uint8_t switch_r(offs_t offset);
- void muxen_w(uint8_t data);
- void muxld_w(uint8_t data);
- void csols_w(uint8_t data);
- void msols_w(uint8_t data);
- void dled0_w(uint8_t data);
- void dled1_w(uint8_t data);
- void zcres_w(uint8_t data);
- void wdogcl_w(uint8_t data);
- uint8_t gentmrcl_r();
+ u8 lampst_r();
+ u8 switch_r(offs_t offset);
+ void muxen_w(u8 data);
+ void muxld_w(u8 data);
+ void csols_w(u8 data);
+ void msols_w(u8 data);
+ void dled0_w(u8 data);
+ void dled1_w(u8 data);
+ void zcres_w(u8 data);
+ void wdogcl_w(u8 data);
+ u8 gentmrcl_r();
TIMER_DEVICE_CALLBACK_MEMBER(irq_housekeeping);
TIMER_DEVICE_CALLBACK_MEMBER(firq_housekeeping);
void ccpu_map(address_map &map);
@@ -83,14 +81,16 @@ private:
bool m_gten;
bool m_disp_on;
bool m_diag_on;
- uint8_t m_firqtimer;
- uint8_t m_diag_segments;
+ u8 m_firqtimer;
+ u8 m_diag_segments;
+ virtual void machine_start() override;
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_ccpu;
required_device<cpu_device> m_hcpu;
- required_shared_ptr<uint8_t> m_shared_ram;
+ required_shared_ptr<u8> m_shared_ram;
+ required_ioport_array<16> m_io_keyboard;
output_finder<48> m_digits;
+ output_finder<176> m_io_outputs; // (8+36) solenoids + 4 spares + 128 lamps
};
// housekeeping cpu
@@ -123,8 +123,8 @@ void wico_state::ccpu_map(address_map &map)
//map(0x1fe0, 0x1fe0).w(FUNC(wico_state::muxld_w)); // to display module
//map(0x1fe1, 0x1fe1).w(FUNC(wico_state::store_w)); // enable save to nvram
map(0x1fe2, 0x1fe2).w(FUNC(wico_state::muxen_w)); // digit to display on diagnostic LED; d0=L will disable main displays
- map(0x1fe3, 0x1fe3).w(FUNC(wico_state::csols_w)); // solenoid column
- map(0x1fe4, 0x1fe4).w(FUNC(wico_state::msols_w)); // solenoid row
+ map(0x1fe3, 0x1fe3).w(FUNC(wico_state::csols_w)); // continuous solenoids
+ map(0x1fe4, 0x1fe4).w(FUNC(wico_state::msols_w)); // matrix solenoids
map(0x1fe5, 0x1fe5).w("sn76494", FUNC(sn76494_device::write));
map(0x1fe6, 0x1fe6).w(FUNC(wico_state::wdogcl_w)); // watchdog clear
map(0x1fe7, 0x1fe7).w(FUNC(wico_state::zcres_w)); // enable IRQ on hcpu
@@ -146,68 +146,68 @@ static INPUT_PORTS_START( wico )
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_COIN1) // Clear button
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_COIN2) // Advance button
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START1)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Top Lane 4") PORT_CODE(KEYCODE_Q)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Top Lane 3") PORT_CODE(KEYCODE_W)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Top Lane 2") PORT_CODE(KEYCODE_E)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Top Lane 1") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Top Lane 4") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Top Lane 3") PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Top Lane 2") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Top Lane 1") PORT_CODE(KEYCODE_D)
PORT_START("X1")
PORT_START("X2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper BR") PORT_CODE(KEYCODE_Y)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper BL") PORT_CODE(KEYCODE_U)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper TR") PORT_CODE(KEYCODE_I)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper TL") PORT_CODE(KEYCODE_O)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Target BR") PORT_CODE(KEYCODE_OPENBRACE)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Target BL") PORT_CODE(KEYCODE_CLOSEBRACE)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Target TR") PORT_CODE(KEYCODE_BACKSLASH)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Target TL") PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bumper BR") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bumper BL") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bumper TR") PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Bumper TL") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Target BR") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Target BL") PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Target TR") PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Target TL") PORT_CODE(KEYCODE_L)
PORT_START("X3")
PORT_START("X4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Oil Pit Release") PORT_CODE(KEYCODE_Z)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Oil Pit Target") PORT_CODE(KEYCODE_C)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Waterhole Release") PORT_CODE(KEYCODE_V)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Outhole") PORT_CODE(KEYCODE_X) // not working
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Spinner") PORT_CODE(KEYCODE_B)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Rollunder") PORT_CODE(KEYCODE_N)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Spinner") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Oil Pit Release") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Oil Pit Target") PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Waterhole Release") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Outhole") PORT_CODE(KEYCODE_X) // press END as well
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Spinner") PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Rollunder") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Spinner") PORT_CODE(KEYCODE_R)
PORT_START("X5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L SLingshot") PORT_CODE(KEYCODE_COMMA)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Slingshot") PORT_CODE(KEYCODE_STOP)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Drop Bank E") PORT_CODE(KEYCODE_A)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Drop Bank P") PORT_CODE(KEYCODE_S)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Drop Bank A") PORT_CODE(KEYCODE_D)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Drop Bank C") PORT_CODE(KEYCODE_F)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Drop Bank S") PORT_CODE(KEYCODE_G)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Drop Bank E") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L SLingshot") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Slingshot") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Drop Bank E") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Drop Bank P") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Drop Bank A") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Drop Bank C") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Drop Bank S") PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Drop Bank E") PORT_CODE(KEYCODE_COMMA)
PORT_START("X6")
PORT_START("X7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Target Zone E") PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Target Zone D") PORT_CODE(KEYCODE_1_PAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Target Zone I") PORT_CODE(KEYCODE_2_PAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Target Zone R") PORT_CODE(KEYCODE_3_PAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Target Zone T") PORT_CODE(KEYCODE_4_PAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Target Zone S") PORT_CODE(KEYCODE_5_PAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Target Zone A") PORT_CODE(KEYCODE_6_PAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Target Zone F") PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Target Zone E") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Target Zone D") PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Target Zone I") PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Target Zone R") PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Target Zone T") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Target Zone S") PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Target Zone A") PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Target Zone F") PORT_CODE(KEYCODE_BACKSLASH)
PORT_START("X8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Outlane Target") PORT_CODE(KEYCODE_MINUS)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Outlane Target") PORT_CODE(KEYCODE_EQUALS)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Rollover R Outlane") PORT_CODE(KEYCODE_J)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Rollover M Outlane") PORT_CODE(KEYCODE_K)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Rollover L Outlane") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Rollover R Outlane") PORT_CODE(KEYCODE_QUOTE)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Rollover M Outlane") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("L Rollover L Outlane") PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Outlane Target") PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Outlane Target") PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Rollover R Outlane") PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Rollover M Outlane") PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Rollover L Outlane") PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Rollover R Outlane") PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Rollover M Outlane") PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L Rollover L Outlane") PORT_CODE(KEYCODE_PGUP)
PORT_START("X9")
- PORT_START("XA")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_TILT1) PORT_NAME("Door Slam")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_TILT) PORT_NAME("Playfield Tilt")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_TILT) PORT_NAME("Pendulum Tilt")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("R Flipper Lane Change") PORT_CODE(KEYCODE_RSHIFT)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Ball Feed Middle") PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Ball Feed Lower") PORT_CODE(KEYCODE_9_PAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("10 points") PORT_CODE(KEYCODE_COLON)
- PORT_START("XB")
- PORT_START("XC")
+ PORT_START("X10")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Door Slam")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Playfield Tilt")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Pendulum Tilt")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R Flipper Lane Change") PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Ball Feed Middle") PORT_CODE(KEYCODE_PGDN)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Ball Feed Lower") PORT_CODE(KEYCODE_END)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("10 points") PORT_CODE(KEYCODE_HOME)
+ PORT_START("X11")
+ PORT_START("X12")
PORT_DIPNAME( 0x0f, 0x00, "Chute 1" )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
@@ -237,7 +237,7 @@ static INPUT_PORTS_START( wico )
PORT_DIPNAME( 0x80, 0x00, "Free Play" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("XD")
+ PORT_START("X13")
PORT_DIPNAME( 0x0f, 0x00, "Chute 2" )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
@@ -266,7 +266,7 @@ static INPUT_PORTS_START( wico )
PORT_DIPSETTING( 0x40, "2" )
PORT_DIPSETTING( 0x80, "1" )
PORT_DIPSETTING( 0xc0, "0" )
- PORT_START("XE")
+ PORT_START("X14")
PORT_DIPNAME( 0x01, 0x00, "Reset left outlane gate" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
@@ -290,7 +290,7 @@ static INPUT_PORTS_START( wico )
PORT_DIPNAME( 0x80, 0x80, "One extra ball per ball" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("XF")
+ PORT_START("X15")
PORT_DIPNAME( 0x03, 0x00, "Special bonus" )
PORT_DIPSETTING( 0x00, "Free Game" )
PORT_DIPSETTING( 0x01, "Extra Ball" )
@@ -311,35 +311,48 @@ static INPUT_PORTS_START( wico )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
// This is a dip and a pushbutton in parallel.
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Self Test")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Self Test")
INPUT_PORTS_END
// diagnostic display off
-void wico_state::dled0_w(uint8_t data)
+void wico_state::dled0_w(u8 data)
{
m_diag_on = 0;
m_digits[9] = 0;
}
// diagnostic display on
-void wico_state::dled1_w(uint8_t data)
+void wico_state::dled1_w(u8 data)
{
m_diag_on = 1;
m_digits[9] = m_diag_segments;
}
-void wico_state::csols_w(uint8_t data)
+// Continuous solenoids (d7 = flipper enable)
+// 7 solenoids + flipen
+void wico_state::csols_w(u8 data)
{
+ for (u8 i = 0; i < 8; i++)
+ m_io_outputs[i] = BIT(data, i);
}
-void wico_state::msols_w(uint8_t data)
+// Matrix solenoids
+// d0,1,2 = 1 to 6; d3,4,5 = 1 to 6; total 36 solenoids
+void wico_state::msols_w(u8 data)
{
+ u8 k = BIT(data, 3, 3) - 1;
+ if (k < 6)
+ for (u8 i = 0; i < 6; i++)
+ m_io_outputs[8+k*6+i] = (BIT(data, 0, 3) == (i+1));
+ // Outhole
+ if (data == 0x1c)
+ m_samples->start(0, 5);
}
// write to diagnostic display
-void wico_state::muxen_w(uint8_t data)
+void wico_state::muxen_w(u8 data)
{
- static const uint8_t patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; // MC14495
+ static const u8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; // MC14495
m_diag_segments = patterns[data>>4];
@@ -352,30 +365,28 @@ void wico_state::muxen_w(uint8_t data)
}
// reset digit/scan counter
-void wico_state::muxld_w(uint8_t data)
+void wico_state::muxld_w(u8 data)
{
}
// enable zero-crossing interrupt
-void wico_state::zcres_w(uint8_t data)
+void wico_state::zcres_w(u8 data)
{
m_zcen = 1;
}
// enable firq
-uint8_t wico_state::gentmrcl_r()
+u8 wico_state::gentmrcl_r()
{
m_gten = 1;
return 0xff;
}
// read a switch row
-uint8_t wico_state::switch_r(offs_t offset)
+u8 wico_state::switch_r(offs_t offset)
{
- char kbdrow[8];
offset = m_shared_ram[0x95];
- sprintf(kbdrow,"X%X",offset);
- uint8_t data = ioport(kbdrow)->read();
+ u8 data = m_io_keyboard[offset]->read();
// Reflex solenoids - operated directly by the switches without needing the cpu
if ((offset==2) && (data & 15))
@@ -388,7 +399,7 @@ uint8_t wico_state::switch_r(offs_t offset)
}
// write digits in main display
-uint8_t wico_state::lampst_r()
+u8 wico_state::lampst_r()
{
int i, j;
for (i = 0; i < 5; i++)
@@ -399,11 +410,19 @@ uint8_t wico_state::lampst_r()
j = 0;
m_digits[i * 10 + (m_shared_ram[0x96] & 7)] = bitswap<16>(j, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
}
+ // Lamps
+ for (i = 0; i < 16; i++)
+ {
+ u8 k = m_shared_ram[0x46+i];
+ for (j = 0; j < 8; j++)
+ m_io_outputs[48+i*8+j] = BIT(k, j);
+ }
+
return 0xff;
}
// reset watchdog and enable housekeeping cpu
-void wico_state::wdogcl_w(uint8_t data)
+void wico_state::wdogcl_w(u8 data)
{
m_hcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
@@ -429,8 +448,27 @@ TIMER_DEVICE_CALLBACK_MEMBER( wico_state::firq_housekeeping )
}
}
+void wico_state::machine_start()
+{
+ genpin_class::machine_start();
+
+ m_digits.resolve();
+ m_io_outputs.resolve();
+
+ save_item(NAME(m_zcen));
+ save_item(NAME(m_gten));
+ save_item(NAME(m_disp_on));
+ save_item(NAME(m_diag_on));
+ save_item(NAME(m_firqtimer));
+ save_item(NAME(m_diag_segments));
+}
+
void wico_state::machine_reset()
{
+ genpin_class::machine_reset();
+ for (u8 i = 0; i < m_io_outputs.size(); i++)
+ m_io_outputs[i] = 0;
+
m_hcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_zcen = 0;
m_gten = 0;
@@ -478,4 +516,6 @@ ROM_END
/ Big Top (1977)
/-------------------------------------------------------------------*/
-GAME(1984, aftor, 0, wico, wico, wico_state, empty_init, ROT0, "Wico", "Af-Tor", MACHINE_MECHANICAL | MACHINE_NOT_WORKING)
+} // Anonymous namespace
+
+GAME(1984, aftor, 0, wico, wico, wico_state, empty_init, ROT0, "Wico", "Af-Tor", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/layout/vd.lay b/src/mame/layout/vd.lay
index 51336bdf0c0..80e52c9f264 100644
--- a/src/mame/layout/vd.lay
+++ b/src/mame/layout/vd.lay
@@ -12,120 +12,58 @@ copyright-holders:Robbbert
</led7seg>
</element>
- <element name="P0"><text string="Ball / Match"><color red="1.0" green="1.0" blue="1.0" /></text></element>
- <element name="P1"><text string="Credits"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+ <element name="P0"><text string="Status"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Player 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Player 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Player 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Player 4"><color red="1.0" green="1.0" blue="1.0" /></text></element>
+ <group name="score">
+ <repeat count="7">
+ <param name="n" start="~s~" increment="1" />
+ <param name="x" start="0" increment="44" />
+ <element name="digit~n~" ref="digit">
+ <bounds x="~x~" y="0" width="34" height="39" />
+ </element>
+ </repeat>
+ </group>
+
<view name="Default Layout">
- <bounds left="0" top="20" right="274" bottom="394" />
+ <bounds left="0" top="20" right="318" bottom="394" />
<!-- LEDs -->
<!-- Player 1 Score -->
-
- <element name="digit11" ref="digit">
- <bounds left="10" top="45" right="44" bottom="84" />
- </element>
- <element name="digit12" ref="digit">
- <bounds left="54" top="45" right="88" bottom="84" />
- </element>
- <element name="digit13" ref="digit">
- <bounds left="98" top="45" right="132" bottom="84" />
- </element>
- <element name="digit14" ref="digit">
- <bounds left="142" top="45" right="176" bottom="84" />
- </element>
- <element name="digit15" ref="digit">
- <bounds left="186" top="45" right="220" bottom="84" />
- </element>
- <element name="digit16" ref="digit">
- <bounds left="230" top="45" right="264" bottom="84" />
- </element>
+ <param name="s" value="1" />
+ <group ref="score">
+ <bounds left="10" top="45" right="308" bottom="84" />
+ </group>
<!-- Player 2 Score -->
- <element name="digit21" ref="digit">
- <bounds left="10" top="105" right="44" bottom="144" />
- </element>
- <element name="digit22" ref="digit">
- <bounds left="54" top="105" right="88" bottom="144" />
- </element>
- <element name="digit23" ref="digit">
- <bounds left="98" top="105" right="132" bottom="144" />
- </element>
- <element name="digit24" ref="digit">
- <bounds left="142" top="105" right="176" bottom="144" />
- </element>
- <element name="digit25" ref="digit">
- <bounds left="186" top="105" right="220" bottom="144" />
- </element>
- <element name="digit26" ref="digit">
- <bounds left="230" top="105" right="264" bottom="144" />
- </element>
+ <param name="s" value="11" />
+ <group ref="score">
+ <bounds left="10" top="105" right="308" bottom="144" />
+ </group>
<!-- Player 3 Score -->
- <element name="digit31" ref="digit">
- <bounds left="10" top="165" right="44" bottom="204" />
- </element>
- <element name="digit32" ref="digit">
- <bounds left="54" top="165" right="88" bottom="204" />
- </element>
- <element name="digit33" ref="digit">
- <bounds left="98" top="165" right="132" bottom="204" />
- </element>
- <element name="digit34" ref="digit">
- <bounds left="142" top="165" right="176" bottom="204" />
- </element>
- <element name="digit35" ref="digit">
- <bounds left="186" top="165" right="220" bottom="204" />
- </element>
- <element name="digit36" ref="digit">
- <bounds left="230" top="165" right="264" bottom="204" />
- </element>
+ <param name="s" value="21" />
+ <group ref="score">
+ <bounds left="10" top="165" right="308" bottom="204" />
+ </group>
<!-- Player 4 Score -->
- <element name="digit41" ref="digit">
- <bounds left="10" top="225" right="44" bottom="264" />
- </element>
- <element name="digit42" ref="digit">
- <bounds left="54" top="225" right="88" bottom="264" />
- </element>
- <element name="digit43" ref="digit">
- <bounds left="98" top="225" right="132" bottom="264" />
- </element>
- <element name="digit44" ref="digit">
- <bounds left="142" top="225" right="176" bottom="264" />
- </element>
- <element name="digit45" ref="digit">
- <bounds left="186" top="225" right="220" bottom="264" />
- </element>
- <element name="digit46" ref="digit">
- <bounds left="230" top="225" right="264" bottom="264" />
- </element>
+ <param name="s" value="31" />
+ <group ref="score">
+ <bounds left="10" top="225" right="308" bottom="264" />
+ </group>
<!-- Credits and Balls -->
- <element name="digit51" ref="digit">
- <bounds left="10" top="345" right="44" bottom="384" />
- </element>
- <element name="digit52" ref="digit">
- <bounds left="54" top="345" right="88" bottom="384" />
- </element>
- <element name="digit53" ref="digit">
- <bounds left="98" top="345" right="132" bottom="384" />
- </element>
- <element name="digit54" ref="digit">
- <bounds left="142" top="345" right="176" bottom="384" />
- </element>
- <element name="digit55" ref="digit">
- <bounds left="186" top="345" right="220" bottom="384" />
- </element>
- <element name="digit56" ref="digit">
- <bounds left="230" top="345" right="264" bottom="384" />
- </element>
- <element ref="P0"><bounds left="200" right="258" top="330" bottom="342" /></element>
- <element ref="P1"><bounds left="30" right="88" top="330" bottom="342" /></element>
+ <param name="s" value="40" />
+ <group ref="score">
+ <bounds left="10" top="345" right="308" bottom="384" />
+ </group>
+
+ <element ref="P0"><bounds left="100" right="180" top="330" bottom="342" /></element>
<element name="text3" ref="P3"><bounds left="100" right="180" top="30" bottom="42" /></element>
<element name="text2" ref="P4"><bounds left="100" right="180" top="90" bottom="102" /></element>
<element name="text1" ref="P5"><bounds left="100" right="180" top="150" bottom="162" /></element>
diff --git a/src/mame/machine/rtpc_iocc.cpp b/src/mame/machine/rtpc_iocc.cpp
index b06cb3f5147..aa98670da98 100644
--- a/src/mame/machine/rtpc_iocc.cpp
+++ b/src/mame/machine/rtpc_iocc.cpp
@@ -98,6 +98,7 @@ u8 rtpc_iocc_device::dma_b_r(offs_t offset)
m_csr &= ~CSR_PER;
m_csr |= (CSR_DE0 >> m_adc) | CSR_DEXK;
m_out_rst(1);
+ m_out_rst(0);
set_int(true);
}
}
diff --git a/src/mame/machine/rtpc_iocc.h b/src/mame/machine/rtpc_iocc.h
index cf7a2052ec7..bf4d925a61e 100644
--- a/src/mame/machine/rtpc_iocc.h
+++ b/src/mame/machine/rtpc_iocc.h
@@ -99,6 +99,9 @@ public:
template <unsigned Channel> void dack_w(int state) { if (!state) m_adc = Channel; }
+ // HACK: temporary workaround for eop handling
+ unsigned adc_r() { return m_adc; }
+
protected:
// device_t overrides
virtual void device_start() override;
@@ -133,6 +136,9 @@ protected:
// FIXME: get size from isa bus
return 1;
}
+ else if (address == 0xf000'80e0U)
+ // exception for i/o delay register
+ return 4;
else if (address == 0xf000'8400U)
// exception for kls
return 2;
diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp
index 672fe0648f6..6211aafd720 100644
--- a/src/osd/windows/winmain.cpp
+++ b/src/osd/windows/winmain.cpp
@@ -25,6 +25,10 @@
#include <clocale>
#include <cstdarg>
#include <cstdio>
+#include <mutex>
+#include <optional>
+#include <sstream>
+#include <thread>
// standard windows headers
#include <windows.h>
@@ -55,6 +59,28 @@
class winui_output_error : public osd_output
{
+private:
+ struct ui_state
+ {
+ ~ui_state()
+ {
+ std::lock_guard guard(mutex);
+ if (thread)
+ thread->join();
+ }
+
+ std::ostringstream buffer;
+ std::optional<std::thread> thread;
+ std::mutex mutex;
+ bool active;
+ };
+
+ static ui_state &get_state()
+ {
+ static ui_state state;
+ return state;
+ }
+
public:
virtual void output_callback(osd_output_channel channel, const util::format_argument_pack<std::ostream> &args) override
{
@@ -64,12 +90,47 @@ public:
if ((video_config.windowed == 0) && !osd_common_t::s_window_list.empty())
winwindow_toggle_full_screen();
- std::ostringstream buffer;
- util::stream_format(buffer, args);
- win_message_box_utf8(!osd_common_t::s_window_list.empty() ? std::static_pointer_cast<win_window_info>(osd_common_t::s_window_list.front())->platform_window() : nullptr, buffer.str().c_str(), emulator_info::get_appname(), MB_OK);
+ auto &state(get_state());
+ std::lock_guard<std::mutex> guard(state.mutex);
+ util::stream_format(state.buffer, args);
+ if (!state.active)
+ {
+ if (state.thread)
+ {
+ state.thread->join();
+ state.thread = std::nullopt;
+ }
+ auto const parent = !osd_common_t::s_window_list.empty()
+ ? std::static_pointer_cast<win_window_info>(osd_common_t::s_window_list.front())->platform_window()
+ : nullptr;
+ state.thread.emplace(
+ [parent] ()
+ {
+ auto &state(get_state());
+ std::string message;
+ while (true)
+ {
+ {
+ std::lock_guard<std::mutex> guard(state.mutex);
+ message = std::move(state.buffer).str();
+ if (message.empty())
+ {
+ state.active = false;
+ return;
+ }
+ state.buffer.str(std::string());
+ }
+ // don't hold any locks lock while calling MessageBox
+ win_message_box_utf8(parent, message.c_str(), emulator_info::get_appname(), MB_OK);
+ }
+ });
+ state.active = true;
+ }
}
else
+ {
chain_output(channel, args);
+ }
}
};