diff options
author | 2021-11-12 22:48:42 +1100 | |
---|---|---|
committer | 2021-11-12 22:48:42 +1100 | |
commit | 64af120bab29a76161b960ed2a3639c6a2b19afd (patch) | |
tree | dc06dfcac5e39a445b0aa69557a9376c2233886f | |
parent | fa9ece2c1810c812c082c684098be101b1962098 (diff) | |
parent | b8aa7a3d6535d1572932b4817abf16eb5d93643e (diff) |
Merge remote-tracking branch 'upstream/master'
-rw-r--r-- | 3rdparty/genie/build/gmake.linux/genie.make | 4 | ||||
-rw-r--r-- | 3rdparty/genie/scripts/genie.lua | 3 | ||||
-rw-r--r-- | hash/nes.xml | 6 | ||||
-rw-r--r-- | src/devices/bus/nes_ctrl/ctrl.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/nes_ctrl/zapper.cpp | 91 | ||||
-rw-r--r-- | src/devices/bus/nes_ctrl/zapper.h | 37 | ||||
-rw-r--r-- | src/devices/cpu/m6502/om740.lst | 2 | ||||
-rw-r--r-- | src/devices/cpu/mcs48/mcs48.h | 54 | ||||
-rw-r--r-- | src/devices/cpu/romp/romp.h | 52 | ||||
-rw-r--r-- | src/emu/emuopts.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/rtpc.cpp | 74 | ||||
-rw-r--r-- | src/mame/drivers/taitotx.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/techno.cpp | 1 | ||||
-rw-r--r-- | src/mame/drivers/vd.cpp | 226 | ||||
-rw-r--r-- | src/mame/drivers/wico.cpp | 260 | ||||
-rw-r--r-- | src/mame/layout/vd.lay | 130 | ||||
-rw-r--r-- | src/mame/machine/rtpc_iocc.cpp | 1 | ||||
-rw-r--r-- | src/mame/machine/rtpc_iocc.h | 6 | ||||
-rw-r--r-- | src/osd/windows/winmain.cpp | 67 |
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); + } } }; |