summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-03-28 12:05:15 -0400
committer AJR <ajrhacker@users.noreply.github.com>2020-03-28 12:05:15 -0400
commit6c6a55d5bba7df20b31325f2a6a1d941a0e00dc1 (patch)
tree32d4e41e4a6cf1db154d9fcaa3b522cf5bb2e9b4
parent21bfb6a09ee3de9ec55dea716c98347b3188da86 (diff)
upd7001: New device
ssv.cpp: Split state class up a bit (nw)
-rw-r--r--scripts/src/machine.lua12
-rw-r--r--scripts/target/mame/arcade.lua1
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/machine/upd7001.cpp205
-rw-r--r--src/devices/machine/upd7001.h102
-rw-r--r--src/mame/drivers/alphajuno.cpp4
-rw-r--r--src/mame/drivers/px8.cpp12
-rw-r--r--src/mame/drivers/roland_jx8p.cpp31
-rw-r--r--src/mame/drivers/roland_s10.cpp10
-rw-r--r--src/mame/drivers/ssv.cpp137
-rw-r--r--src/mame/includes/ssv.h145
-rw-r--r--src/mame/video/ssv.cpp40
12 files changed, 550 insertions, 150 deletions
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua
index b5699bf01c9..7bcd796c7af 100644
--- a/scripts/src/machine.lua
+++ b/scripts/src/machine.lua
@@ -3108,6 +3108,18 @@ end
---------------------------------------------------
--
+--@src/devices/machine/upd7001.h,MACHINES["UPD7001"] = true
+---------------------------------------------------
+
+if (MACHINES["UPD7001"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/machine/upd7001.cpp",
+ MAME_DIR .. "src/devices/machine/upd7001.h",
+ }
+end
+
+---------------------------------------------------
+--
--@src/devices/machine/upd7002.h,MACHINES["UPD7002"] = true
---------------------------------------------------
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 8aafb5134bb..ef12fef1767 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -637,6 +637,7 @@ MACHINES["TMS9902"] = true
MACHINES["UPD1990A"] = true
MACHINES["UPD4992"] = true
MACHINES["UPD4701"] = true
+MACHINES["UPD7001"] = true
MACHINES["UPD7002"] = true
MACHINES["UPD7004"] = true
MACHINES["UPD71071"] = true
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 2fae4310edd..b8f0d6ddda0 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -672,6 +672,7 @@ MACHINES["TUBE"] = true
MACHINES["UPD1990A"] = true
--MACHINES["UPD4992"] = true
MACHINES["UPD4701"] = true
+MACHINES["UPD7001"] = true
MACHINES["UPD7002"] = true
--MACHINES["UPD7004"] = true
MACHINES["UPD71071"] = true
diff --git a/src/devices/machine/upd7001.cpp b/src/devices/machine/upd7001.cpp
new file mode 100644
index 00000000000..d4607e7a479
--- /dev/null
+++ b/src/devices/machine/upd7001.cpp
@@ -0,0 +1,205 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*********************************************************************
+
+ NEC µPD7001 CMOS Serial I/O Analog-to-Digital Converter
+
+ This ADC takes 56 clock cycles to convert one of its four
+ multiplexed input channels by successive approximation. The
+ 8-bit result is shifted out MSB first on the SO line. (SO and
+ EOC are open-drain outputs, making them convenient to tie
+ together since CS disables EOC but enables SO.) If only one
+ input is used, it may be connected to A0, with DL tied to Vdd
+ and SI to Vss.
+
+ The internal clock (fCK) is normally generated from a resistor
+ bridging the CL0 and CL1 pins and a capacitor between CL1 and
+ ground. The typical values R = 27 kΩ and C = 47 pF produce an
+ operating frequency of about 400 kHz. (500 kHz is the maximum
+ according to the datasheet.)
+
+*********************************************************************/
+
+#include "emu.h"
+#include "upd7001.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(UPD7001, upd7001_device, "upd7001", "NEC uPD7001 A/D Converter")
+
+//**************************************************************************
+// DEVICE IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// upd7001_device - constructor
+//-------------------------------------------------
+
+upd7001_device::upd7001_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, UPD7001, tag, owner, clock)
+ , m_an_callback(*this)
+ , m_eoc_callback(*this)
+ , m_res(0.0)
+ , m_cap(0.0)
+ , m_fck_rc(attotime::attotime::zero)
+ , m_conv_timer(nullptr)
+ , m_scsk_timer(nullptr)
+ , m_cs_active(false)
+ , m_eoc_active(false)
+ , m_oe(false)
+ , m_sck(true)
+ , m_si(true)
+ , m_so(false)
+ , m_dl(false)
+ , m_sr(0)
+ , m_mpx(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_resolve_objects -
+//-------------------------------------------------
+
+void upd7001_device::device_resolve_objects()
+{
+ // resolve callbacks
+ m_an_callback.resolve_all_safe(0);
+ m_eoc_callback.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void upd7001_device::device_start()
+{
+ // calculate RC timing (FIXME: math is not very accurate)
+ if (m_res == 0.0 || m_cap == 0.0)
+ m_fck_rc = attotime::zero;
+ else
+ m_fck_rc = attotime::from_double(m_res * m_cap * 1.97);
+
+ // initialize timers
+ m_conv_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(upd7001_device::conversion_done), this));
+ m_scsk_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(upd7001_device::output_enabled), this));
+
+ // save state
+ save_item(NAME(m_cs_active));
+ save_item(NAME(m_eoc_active));
+ save_item(NAME(m_oe));
+ save_item(NAME(m_sck));
+ save_item(NAME(m_si));
+ save_item(NAME(m_so));
+ save_item(NAME(m_dl));
+ save_item(NAME(m_sr));
+ save_item(NAME(m_mpx));
+}
+
+
+//-------------------------------------------------
+// cs_w - active-low chip select
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(upd7001_device::cs_w)
+{
+ if (!state && !m_cs_active)
+ {
+ if (m_conv_timer->enabled())
+ {
+ logerror("%s: CS lowered while conversion still in progress\n", machine().describe_context());
+ m_conv_timer->enable(false);
+ }
+
+ // EOC deasserted on falling edge
+ m_eoc_active = false;
+ m_eoc_callback(1);
+
+ // Output is enabled after 5 internal clock pulses
+ m_scsk_timer->adjust(m_fck_rc != attotime::zero ? m_fck_rc * 5 : clocks_to_attotime(5));
+ }
+ else if (state && m_cs_active)
+ {
+ // Disable data output
+ m_oe = false;
+ m_scsk_timer->enable(false);
+
+ // Begin conversion on rising edge
+ m_conv_timer->adjust(m_fck_rc != attotime::zero ? m_fck_rc * 56 : clocks_to_attotime(56));
+ }
+
+ m_cs_active = !state;
+}
+
+
+//-------------------------------------------------
+// conversion_done - finish converting the
+// selected analog input
+//-------------------------------------------------
+
+TIMER_CALLBACK_MEMBER(upd7001_device::conversion_done)
+{
+ // Load conversion result into shift register
+ m_sr = m_an_callback[m_mpx]();
+
+ // Activate EOC output
+ m_eoc_active = true;
+ m_eoc_callback(0);
+}
+
+
+//-------------------------------------------------
+// output_enabled - enable data output on SO
+//-------------------------------------------------
+
+TIMER_CALLBACK_MEMBER(upd7001_device::output_enabled)
+{
+ m_oe = true;
+}
+
+
+//-------------------------------------------------
+// sck_w - shift data out of and into register
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(upd7001_device::sck_w)
+{
+ if (m_cs_active)
+ {
+ if (!state && m_sck)
+ {
+ if (m_scsk_timer->enabled() && m_scsk_timer->remaining() > attotime::zero)
+ logerror("%s: SCK lowered %.2f microseconds too early\n", machine().describe_context(), m_scsk_timer->remaining().as_double() * 1.0E+6);
+
+ // SO updates on falling edge
+ m_so = BIT(m_sr, 7);
+ }
+ else if (state && !m_sck)
+ {
+ // SI shifted in on rising edge
+ m_sr = (m_sr << 1) | m_si;
+ if (m_dl)
+ m_mpx = m_sr & 3;
+ }
+ }
+
+ m_sck = state;
+}
+
+
+//-------------------------------------------------
+// dl_w - latch input data for multiplexer to
+// select input to convert
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(upd7001_device::dl_w)
+{
+ if (state && !m_dl && m_cs_active)
+ m_mpx = m_sr & 3;
+
+ m_dl = state;
+}
diff --git a/src/devices/machine/upd7001.h b/src/devices/machine/upd7001.h
new file mode 100644
index 00000000000..afc4b632293
--- /dev/null
+++ b/src/devices/machine/upd7001.h
@@ -0,0 +1,102 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*********************************************************************
+
+ NEC µPD7001 CMOS Serial I/O Analog-to-Digital Converter
+
+**********************************************************************
+ ___ ___
+ _EOC 1 |* \__/ | 16 Vdd
+ DL 2 | | 15 Vref
+ SI 3 | | 14 AGND
+ _SCK 4 | | 13 A3
+ SO 5 | D7001C | 12 A2
+ _CS 6 | | 11 A1
+ CL0 7 | | 10 A0
+ CL1 8 |__________| 9 Vss
+
+*********************************************************************/
+
+#ifndef MAME_MACHINE_UPD7001_H
+#define MAME_MACHINE_UPD7001_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> upd7001_device
+
+class upd7001_device : public device_t
+{
+public:
+ // device type constructors
+ upd7001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ upd7001_device(const machine_config &mconfig, const char *tag, device_t *owner, double r, double c)
+ : upd7001_device(mconfig, tag, owner, 0U)
+ {
+ set_rc(r, c);
+ }
+
+ // input callback configuration
+ auto a0_callback() { return m_an_callback[0].bind(); }
+ auto a1_callback() { return m_an_callback[1].bind(); }
+ auto a2_callback() { return m_an_callback[2].bind(); }
+ auto a3_callback() { return m_an_callback[3].bind(); }
+
+ // output callback configuration
+ auto eoc_callback() { return m_eoc_callback.bind(); }
+
+ // misc. configuration
+ void set_rc(double res, double cap) { assert(!configured()); m_res = res; m_cap = cap; }
+
+ // serial interface
+ DECLARE_WRITE_LINE_MEMBER(cs_w);
+ DECLARE_WRITE_LINE_MEMBER(sck_w);
+ DECLARE_WRITE_LINE_MEMBER(si_w) { m_si = state; }
+ DECLARE_WRITE_LINE_MEMBER(dl_w);
+ DECLARE_READ_LINE_MEMBER(so_r) { return m_oe ? m_so : 1; }
+ DECLARE_READ_LINE_MEMBER(eoc_r) { return m_eoc_active ? 0 : 1; }
+ DECLARE_READ_LINE_MEMBER(eoc_so_r) { return eoc_r() && so_r(); }
+
+protected:
+ // device-level overrides
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+private:
+ // timing helpers
+ TIMER_CALLBACK_MEMBER(conversion_done);
+ TIMER_CALLBACK_MEMBER(output_enabled);
+
+ // callback objects
+ devcb_read8::array<4> m_an_callback;
+ devcb_write_line m_eoc_callback;
+
+ // timing parameters
+ double m_res;
+ double m_cap;
+ attotime m_fck_rc;
+
+ // internal timers
+ emu_timer *m_conv_timer;
+ emu_timer *m_scsk_timer;
+
+ // internal state
+ bool m_cs_active;
+ bool m_eoc_active;
+ bool m_oe;
+ bool m_sck;
+ bool m_si;
+ bool m_so;
+ bool m_dl;
+ u8 m_sr;
+ u8 m_mpx;
+};
+
+// device type declaration
+DECLARE_DEVICE_TYPE(UPD7001, upd7001_device)
+
+#endif // MAME_MACHINE_UPD7001_H
diff --git a/src/mame/drivers/alphajuno.cpp b/src/mame/drivers/alphajuno.cpp
index c563109a387..a03efd0e6a4 100644
--- a/src/mame/drivers/alphajuno.cpp
+++ b/src/mame/drivers/alphajuno.cpp
@@ -11,6 +11,8 @@
#include "cpu/mcs51/mcs51.h"
#include "machine/mb63h149.h"
#include "machine/nvram.h"
+#include "machine/rescap.h"
+#include "machine/upd7001.h"
#include "video/hd44780.h"
#include "emupal.h"
#include "screen.h"
@@ -116,6 +118,8 @@ void alphajuno_state::ajuno1(machine_config &config)
//MB87123(config, "dco", 12_MHz_XTAL);
+ UPD7001(config, "adc", RES_K(27), CAP_P(47));
+
// LCD: LM16155A or LM16155B
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(60);
diff --git a/src/mame/drivers/px8.cpp b/src/mame/drivers/px8.cpp
index 98288519fa8..a925282f4ac 100644
--- a/src/mame/drivers/px8.cpp
+++ b/src/mame/drivers/px8.cpp
@@ -21,7 +21,7 @@
- display
- jumpers
- ROM capsule
- - uPD7001
+ - uPD7001 (controlled by uPD7508)
- RAM disk (64K/128K RAM, Z80, 4K ROM)
- modem (82C55)
- Multi-Unit (60K RAM, ROM capsule, modem, 82C55)
@@ -32,6 +32,8 @@
#include "emu.h"
#include "includes/px8.h"
+#include "machine/rescap.h"
+#include "machine/upd7001.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
@@ -744,8 +746,8 @@ void px8_state::px8(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &px8_state::px8_mem);
m_maincpu->set_addrmap(AS_IO, &px8_state::px8_io);
- /* slave cpu (HD6303) */
- m6803_cpu_device &slave(M6803(config, HD6303_TAG, XTAL_CR1 / 4)); /* 614 kHz */
+ /* slave cpu (HD6303CA) */
+ hd6301_cpu_device &slave(HD6301V1(config, HD6303_TAG, XTAL_CR1 / 4)); /* 614 kHz */
slave.set_addrmap(AS_PROGRAM, &px8_state::px8_slave_mem);
slave.set_disable();
@@ -776,7 +778,9 @@ void px8_state::px8(machine_config &config)
GENERIC_CARTSLOT(config, "capsule2", generic_plain_slot, "px8_cart", "bin,rom");
/* devices */
- I8251(config, I8251_TAG, 0);
+ I8251(config, I8251_TAG, XTAL_CR1 / 4);
+
+ UPD7001(config, UPD7001_TAG, RES_K(27), CAP_P(47));
CASSETTE(config, m_cassette);
m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
diff --git a/src/mame/drivers/roland_jx8p.cpp b/src/mame/drivers/roland_jx8p.cpp
index 7a6dc1bba17..37136fd1ddb 100644
--- a/src/mame/drivers/roland_jx8p.cpp
+++ b/src/mame/drivers/roland_jx8p.cpp
@@ -16,8 +16,8 @@
#include "machine/mb63h149.h"
#include "machine/nvram.h"
//#include "machine/pg800.h"
-//#include "machine/rescap.h"
-//#include "machine/upd7001.h"
+#include "machine/rescap.h"
+#include "machine/upd7001.h"
class roland_jx8p_state : public driver_device
{
@@ -32,6 +32,7 @@ public:
void jx8p(machine_config &config);
void jx8po(machine_config &config);
void jx10(machine_config &config);
+ void mks70(machine_config &config);
private:
u8 switches_r(offs_t offset);
@@ -312,6 +313,10 @@ void roland_jx8p_state::jx8p(machine_config &config)
{
HD6303R(config, m_assignercpu, 16_MHz_XTAL / 2); // HD63B03RP
m_assignercpu->set_addrmap(AS_PROGRAM, &roland_jx8p_state::jx8p_assigner_map);
+ m_assignercpu->in_p1_cb().set("adc", FUNC(upd7001_device::eoc_so_r)).bit(0);
+ m_assignercpu->out_p1_cb().set("adc", FUNC(upd7001_device::sck_w)).bit(1);
+ m_assignercpu->out_p1_cb().append("adc", FUNC(upd7001_device::si_w)).bit(2);
+ m_assignercpu->out_p1_cb().append("adc", FUNC(upd7001_device::cs_w)).bit(3);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5517APL + battery
@@ -320,7 +325,8 @@ void roland_jx8p_state::jx8p(machine_config &config)
GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, nullptr, "jx8p_cart");
- //UPD7001(config, "adc", RES_K(27), CAP_P(47));
+ upd7001_device &adc(UPD7001(config, "adc", RES_K(27), CAP_P(47)));
+ adc.dl_w(1);
//UPD7537(config, "displaycpu", 400_kHz_XTAL);
@@ -338,6 +344,10 @@ void roland_jx8p_state::jx10(machine_config &config)
{
HD6303R(config, m_assignercpu, 16_MHz_XTAL / 2); // HD63B03RP
m_assignercpu->set_addrmap(AS_PROGRAM, &roland_jx8p_state::superjx_assigner_map);
+ m_assignercpu->in_p1_cb().set("adc", FUNC(upd7001_device::eoc_so_r)).bit(0);
+ m_assignercpu->out_p1_cb().set("adc", FUNC(upd7001_device::sck_w)).bit(1);
+ m_assignercpu->out_p1_cb().append("adc", FUNC(upd7001_device::si_w)).bit(2);
+ m_assignercpu->out_p1_cb().append("adc", FUNC(upd7001_device::cs_w)).bit(3);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5564PL-20 + battery
@@ -346,7 +356,8 @@ void roland_jx8p_state::jx10(machine_config &config)
GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, nullptr, "jx8p_cart");
- //UPD7001(config, "adc", RES_K(27), CAP_P(47));
+ upd7001_device &adc(UPD7001(config, "adc", RES_K(27), CAP_P(47)));
+ adc.dl_w(1);
//UPD7538A(config, "displaycpu", 600_kHz_XTAL);
@@ -354,6 +365,16 @@ void roland_jx8p_state::jx10(machine_config &config)
SUPERJX_SYNTH(config, "upper", 16_MHz_XTAL / 2);
}
+void roland_jx8p_state::mks70(machine_config &config)
+{
+ jx10(config);
+
+ m_assignercpu->in_p1_cb().set_constant(0x01);
+ m_assignercpu->out_p1_cb().set_nop();
+
+ config.device_remove("adc");
+}
+
ROM_START(jx8p)
ROM_REGION(0x4000, "assigner", 0)
ROM_LOAD("jx8p_a3-1.ic6", 0x0000, 0x4000, CRC(fc566635) SHA1(aa7ce16107553f337eb87bbe6171062950389ea1))
@@ -421,4 +442,4 @@ ROM_END
SYST(1985, jx8p, 0, 0, jx8p, jx8p, roland_jx8p_state, empty_init, "Roland", "JX-8P Polyphonic Synthesizer (Ver. 3.x)", MACHINE_IS_SKELETON)
SYST(1985, jx8po, jx8p, 0, jx8po, jx8p, roland_jx8p_state, empty_init, "Roland", "JX-8P Polyphonic Synthesizer (Ver. 2.x)", MACHINE_IS_SKELETON)
SYST(1986, jx10, 0, 0, jx10, jx10, roland_jx8p_state, empty_init, "Roland", "JX-10 Super JX Polyphonic Synthesizer", MACHINE_IS_SKELETON)
-SYST(1987, mks70, jx10, 0, jx10, mks70, roland_jx8p_state, empty_init, "Roland", "MKS-70 Super JX Polyphonic Synthesizer", MACHINE_IS_SKELETON)
+SYST(1987, mks70, jx10, 0, mks70, mks70, roland_jx8p_state, empty_init, "Roland", "MKS-70 Super JX Polyphonic Synthesizer", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/roland_s10.cpp b/src/mame/drivers/roland_s10.cpp
index 1710c8a1910..9170ed91b41 100644
--- a/src/mame/drivers/roland_s10.cpp
+++ b/src/mame/drivers/roland_s10.cpp
@@ -16,6 +16,8 @@
#include "machine/i8251.h"
#include "machine/mb63h149.h"
#include "machine/nvram.h"
+#include "machine/rescap.h"
+#include "machine/upd7001.h"
#include "video/hd44780.h"
#include "emupal.h"
#include "screen.h"
@@ -165,7 +167,7 @@ void roland_s10_state::s10_ext_map(address_map &map)
{
mks100_ext_map(map);
map(0x5000, 0x57ff).mirror(0x800).rw("keyscan", FUNC(mb63h149_device::read), FUNC(mb63h149_device::write));
- //map(0xb000, 0xb0ff).mirror(0xf00).rw(FUNC(roland_s10_state::upd7001_r), FUNC(mb63h149_device::upd7001_w));
+ //map(0xb000, 0xb000).mirror(0xfff).rw(FUNC(roland_s10_state::upd7001_r), FUNC(mb63h149_device::upd7001_w));
}
void roland_s220_state::s220_ext_map(address_map &map)
@@ -228,7 +230,7 @@ void roland_s10_state::s10(machine_config &config)
m_lcdc->set_pixel_update_cb(FUNC(roland_s10_state::lcd_pixel_update));
m_lcdc->set_busy_factor(0.005);
- //UPD7001(config, "adc", RES_K(27), CAP_P(47));
+ UPD7001(config, "adc", RES_K(27), CAP_P(47));
//RF5C36(config, "wave", 26.88_MHz_XTAL);
}
@@ -239,7 +241,7 @@ void roland_s10_state::mks100(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &roland_s10_state::mks100_ext_map);
config.device_remove("keyscan");
- //config.device_remove("adc");
+ config.device_remove("adc");
}
void roland_s220_state::s220(machine_config &config)
@@ -248,7 +250,7 @@ void roland_s220_state::s220(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &roland_s220_state::s220_ext_map);
config.device_remove("keyscan");
- //config.device_remove("adc");
+ config.device_remove("adc");
// LCD unit: LDS7A1681A
subdevice<screen_device>("screen")->set_size(6*16, 8*2);
diff --git a/src/mame/drivers/ssv.cpp b/src/mame/drivers/ssv.cpp
index 5f2a7e4de38..970b12979a1 100644
--- a/src/mame/drivers/ssv.cpp
+++ b/src/mame/drivers/ssv.cpp
@@ -260,7 +260,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(ssv_state::interrupt)
}
}
-WRITE_LINE_MEMBER(ssv_state::gdfs_adc_int_w)
+WRITE_LINE_MEMBER(gdfs_state::adc_int_w)
{
if (state)
{
@@ -452,12 +452,12 @@ void ssv_state::drifto94_map(address_map &map)
Mobil Suit Gundam Final Shooting
***************************************************************************/
-READ16_MEMBER(ssv_state::gdfs_eeprom_r)
+READ16_MEMBER(gdfs_state::eeprom_r)
{
return m_adc->data_r() | (m_eeprom->do_read() << 8);
}
-WRITE16_MEMBER(ssv_state::gdfs_eeprom_w)
+WRITE16_MEMBER(gdfs_state::eeprom_w)
{
if (data & ~0x7b00)
logerror("%s - Unknown EEPROM bit written %04X\n",machine().describe_context(),data);
@@ -482,18 +482,18 @@ WRITE16_MEMBER(ssv_state::gdfs_eeprom_w)
}
-void ssv_state::gdfs_map(address_map &map)
+void gdfs_state::gdfs_map(address_map &map)
{
ssv_map(map, 0xc00000);
- map(0x400000, 0x41ffff).ram().w(FUNC(ssv_state::gdfs_tmapram_w)).share("gdfs_tmapram");
+ map(0x400000, 0x41ffff).ram().w(FUNC(gdfs_state::tmapram_w)).share("gdfs_tmapram");
map(0x420000, 0x43ffff).ram();
map(0x440000, 0x44003f).ram().share("gdfs_tmapscroll");
- map(0x500000, 0x500001).w(FUNC(ssv_state::gdfs_eeprom_w));
- map(0x540000, 0x540001).r(FUNC(ssv_state::gdfs_eeprom_r));
+ map(0x500000, 0x500001).w(FUNC(gdfs_state::eeprom_w));
+ map(0x540000, 0x540001).r(FUNC(gdfs_state::eeprom_r));
map(0x600000, 0x600fff).ram();
- map(0x800000, 0x87ffff).rw(m_gdfs_st0020, FUNC(st0020_device::sprram_r), FUNC(st0020_device::sprram_w));
- map(0x8c0000, 0x8c00ff).rw(m_gdfs_st0020, FUNC(st0020_device::regs_r), FUNC(st0020_device::regs_w));
- map(0x900000, 0x9fffff).rw(m_gdfs_st0020, FUNC(st0020_device::gfxram_r), FUNC(st0020_device::gfxram_w));
+ map(0x800000, 0x87ffff).rw(m_st0020, FUNC(st0020_device::sprram_r), FUNC(st0020_device::sprram_w));
+ map(0x8c0000, 0x8c00ff).rw(m_st0020, FUNC(st0020_device::regs_r), FUNC(st0020_device::regs_w));
+ map(0x900000, 0x9fffff).rw(m_st0020, FUNC(st0020_device::gfxram_r), FUNC(st0020_device::gfxram_w));
}
@@ -736,49 +736,46 @@ void ssv_state::survarts_map(address_map &map)
***************************************************************************/
-READ16_MEMBER(ssv_state::sxyreact_ballswitch_r)
+READ16_MEMBER(sxyreact_state::ballswitch_r)
{
- return m_io_service.read_safe(0);
+ return m_io_service->read();
}
-READ16_MEMBER(ssv_state::sxyreact_dial_r)
+uint8_t sxyreact_state::dial_r()
{
- return ((m_sxyreact_serial >> 1) & 0x80);
+ return m_sxyreact_adc->eoc_so_r() ? 0x80 : 0;
}
-
-WRITE16_MEMBER(ssv_state::sxyreact_dial_w)
+void sxyreact_state::dial_w(uint8_t data)
{
- if (ACCESSING_BITS_0_7)
- {
- if (data & 0x20)
- m_sxyreact_serial = m_io_paddle.read_safe(0) & 0xff;
-
- if ( (m_sxyreact_dial & 0x40) && !(data & 0x40) ) // $40 -> $00
- m_sxyreact_serial <<= 1; // shift 1 bit
-
- m_sxyreact_dial = data;
- }
+ m_sxyreact_adc->cs_w(BIT(data, 5));
+ m_sxyreact_adc->sck_w(BIT(data, 6));
}
-WRITE16_MEMBER(ssv_state::sxyreact_motor_w)
+WRITE16_MEMBER(sxyreact_state::motor_w)
{
// popmessage("%04X",data); // 8 = motor on; 0 = motor off
}
-void ssv_state::sxyreact_map(address_map &map)
+void ssv_state::cairblad_map(address_map &map)
{
ssv_map(map, 0xe00000);
// map(0x020000, 0x03ffff).rw(FUNC(ssv_state::mainram_r), FUNC(ssv_state::mainram_w)); // sxyreac2 reads / writes here, why?
map(0x210000, 0x210001).r("watchdog", FUNC(watchdog_timer_device::reset16_r));
// map(0x210002, 0x210003).nopw(); // ? 1 at the start
map(0x21000e, 0x21000f).w(FUNC(ssv_state::lockout_inv_w)); // Inverted lockout lines
- map(0x500002, 0x500003).r(FUNC(ssv_state::sxyreact_ballswitch_r)); // ?
- map(0x500004, 0x500005).rw(FUNC(ssv_state::sxyreact_dial_r), FUNC(ssv_state::sxyreact_motor_w)); // Dial Value (serial)
- map(0x520000, 0x520001).w(FUNC(ssv_state::sxyreact_dial_w)); // Dial Value (advance 1 bit)
map(0x580000, 0x58ffff).ram().share("nvram"); // NVRAM
}
+void sxyreact_state::sxyreact_map(address_map &map)
+{
+ cairblad_map(map);
+ map(0x500002, 0x500003).r(FUNC(sxyreact_state::ballswitch_r)); // ?
+ map(0x500004, 0x500004).r(FUNC(sxyreact_state::dial_r)); // Dial Value (serial)
+ map(0x500004, 0x500005).w(FUNC(sxyreact_state::motor_w));
+ map(0x520000, 0x520000).w(FUNC(sxyreact_state::dial_w)); // Dial Value (advance 1 bit)
+}
+
/***************************************************************************
Twin Eagle II
@@ -870,12 +867,12 @@ void ssv_state::jsk_v810_mem(address_map &map)
Eagle Shot Golf
***************************************************************************/
-WRITE8_MEMBER(ssv_state::eaglshot_gfxrom_bank_w)
+void eaglshot_state::gfxrom_bank_w(uint8_t data)
{
membank("gfxrom")->set_entry(data < 6 ? data : 6);
}
-WRITE8_MEMBER(ssv_state::eaglshot_trackball_w)
+void eaglshot_state::trackball_w(uint8_t data)
{
// All these get toggled during trackball reads; the precise arrangement is uncertain
m_upd4701->cs_w(!BIT(data, 6));
@@ -887,28 +884,28 @@ WRITE8_MEMBER(ssv_state::eaglshot_trackball_w)
-READ16_MEMBER(ssv_state::eaglshot_gfxram_r)
+uint16_t eaglshot_state::gfxram_r(offs_t offset, uint16_t mem_mask)
{
- return m_eaglshot_gfxram[offset + (m_scroll[0x76/2] & 0xf) * 0x40000/2];
+ return m_gfxram[offset + (m_scroll[0x76/2] & 0xf) * 0x40000/2];
}
-WRITE16_MEMBER(ssv_state::eaglshot_gfxram_w)
+void eaglshot_state::gfxram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
offset += (m_scroll[0x76/2] & 0xf) * 0x40000/2;
- COMBINE_DATA(&m_eaglshot_gfxram[offset]);
+ COMBINE_DATA(&m_gfxram[offset]);
m_gfxdecode->gfx(0)->mark_dirty(offset / (16*8/2));
}
-void ssv_state::eaglshot_map(address_map &map)
+void eaglshot_state::eaglshot_map(address_map &map)
{
ssv_map(map, 0xf00000);
- map(0x180000, 0x1bffff).rw(FUNC(ssv_state::eaglshot_gfxram_r), FUNC(ssv_state::eaglshot_gfxram_w));
+ map(0x180000, 0x1bffff).rw(FUNC(eaglshot_state::gfxram_r), FUNC(eaglshot_state::gfxram_w));
map(0x210000, 0x210001).nopr(); // .r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog
// map(0x210002, 0x210003).nopw(); // ? 0,4 at the start
- map(0x21000e, 0x21000f).w(FUNC(ssv_state::lockout_inv_w)); // Inverted lockout lines
- map(0x800000, 0x800000).w(FUNC(ssv_state::eaglshot_gfxrom_bank_w));
- map(0x900000, 0x900000).w(FUNC(ssv_state::eaglshot_trackball_w));
+ map(0x21000e, 0x21000f).w(FUNC(eaglshot_state::lockout_inv_w)); // Inverted lockout lines
+ map(0x800000, 0x800000).w(FUNC(eaglshot_state::gfxrom_bank_w));
+ map(0x900000, 0x900000).w(FUNC(eaglshot_state::trackball_w));
map(0xa00000, 0xbfffff).bankr("gfxrom");
map(0xc00000, 0xc007ff).ram().share("nvram"); // NVRAM
map(0xd00000, 0xd00000).r(m_upd4701, FUNC(upd4701_device::d_r));
@@ -2539,14 +2536,12 @@ void ssv_state::init_ssv_tilescram()
// srmp4
// ((uint16_t *)memregion("maincpu")->base())[0x2b38/2] = 0x037a; /* patch to see gal test mode */
-void ssv_state::init_sexy()
+void sxyreact_state::init_sexy()
{
init_ssv_tilescram();
- save_item(NAME(m_sxyreact_serial));
- save_item(NAME(m_sxyreact_dial));
}
-void ssv_state::init_eaglshot()
+void eaglshot_state::init_eaglshot()
{
init_ssv_tilescram();
membank("gfxrom")->configure_entries(0, 6+1, memregion("gfxdata")->base(), 0x200000);
@@ -2632,12 +2627,12 @@ void ssv_state::drifto94(machine_config &config)
m_screen->set_visarea(0, (0xcd-0x25)*2-1, 0, (0x101-0x13)-1);
}
-void ssv_state::gdfs(machine_config &config)
+void gdfs_state::gdfs(machine_config &config)
{
ssv(config);
/* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::gdfs_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gdfs_state::gdfs_map);
EEPROM_93C46_16BIT(config, m_eeprom);
@@ -2646,18 +2641,16 @@ void ssv_state::gdfs(machine_config &config)
m_adc->in_callback<1>().set_ioport("GUNY1");
m_adc->in_callback<2>().set_ioport("GUNX2");
m_adc->in_callback<3>().set_ioport("GUNY2");
- m_adc->eoc_callback().set(FUNC(ssv_state::gdfs_adc_int_w));
+ m_adc->eoc_callback().set(FUNC(gdfs_state::adc_int_w));
/* video hardware */
m_screen->set_visarea(0, (0xd5-0x2c)*2-1, 0, (0x102-0x12)-1);
- m_screen->set_screen_update(FUNC(ssv_state::screen_update_gdfs));
+ m_screen->set_screen_update(FUNC(gdfs_state::screen_update));
- ST0020_SPRITES(config, m_gdfs_st0020, 0);
- m_gdfs_st0020->set_palette(m_palette);
+ ST0020_SPRITES(config, m_st0020, 0);
+ m_st0020->set_palette(m_palette);
m_gfxdecode->set_info(gfx_gdfs);
-
- MCFG_VIDEO_START_OVERRIDE(ssv_state,gdfs)
}
void ssv_state::hypreact(machine_config &config)
@@ -2827,12 +2820,12 @@ void ssv_state::dynagear(machine_config &config)
m_screen->set_visarea(0, (0xd4-0x2c)*2-1, 0, (0x102 - 0x12)-1);
}
-void ssv_state::eaglshot(machine_config &config)
+void eaglshot_state::eaglshot(machine_config &config)
{
ssv(config);
/* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::eaglshot_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eaglshot_state::eaglshot_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -2844,39 +2837,45 @@ void ssv_state::eaglshot(machine_config &config)
/* video hardware */
m_screen->set_visarea(0, (0xca - 0x2a)*2-1, 0, (0xf6 - 0x16)-1);
- m_screen->set_screen_update(FUNC(ssv_state::screen_update_eaglshot));
+ m_screen->set_screen_update(FUNC(eaglshot_state::screen_update));
m_gfxdecode->set_info(gfx_eaglshot);
-
- MCFG_VIDEO_START_OVERRIDE(ssv_state,eaglshot)
}
-void ssv_state::sxyreact(machine_config &config)
+void sxyreact_state::sxyreact(machine_config &config)
{
ssv(config);
/* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::sxyreact_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sxyreact_state::sxyreact_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
+ UPD7001(config, m_sxyreact_adc, 1'500'000); // FIXME: runs too fast because CPU doesn't wait long enough
+ m_sxyreact_adc->a0_callback().set_ioport("PADDLE");
+ m_sxyreact_adc->dl_w(1);
+ m_sxyreact_adc->si_w(0);
+
/* video hardware */
m_screen->set_visarea(0, (0xcb - 0x22)*2-1, 0, (0xfe - 0x0e)-1);
}
-void ssv_state::sxyreac2(machine_config &config)
+void sxyreact_state::sxyreac2(machine_config &config)
{
ssv(config);
/* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::sxyreact_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sxyreact_state::sxyreact_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
+ UPD7001(config, m_sxyreact_adc, 1'500'000); // FIXME: runs too fast because CPU doesn't wait long enough
+ m_sxyreact_adc->a0_callback().set_ioport("PADDLE");
+
/* video hardware */
m_screen->set_visarea(0, (0xcb - 0x23)*2-1, 0, (0xfe - 0x0e)-1);
}
@@ -2886,7 +2885,7 @@ void ssv_state::cairblad(machine_config &config)
ssv(config);
/* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::sxyreact_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::cairblad_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -4850,14 +4849,14 @@ GAME( 1993, survartsj, survarts, survarts, survarts, ssv_state, init_ssv,
GAME( 1994, drifto94, 0, drifto94, drifto94, ssv_state, init_ssv, ROT0, "Visco", "Drift Out '94 - The Hard Order (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1994, eaglshot, 0, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1994, eaglshotj, eaglshot, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (Japan, bootleg?)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // from a bootleg ROM board with no proper Seta / Sammy markings, possibly original ROM tho?
+GAME( 1994, eaglshot, 0, eaglshot, eaglshot, eaglshot_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1994, eaglshotj, eaglshot, eaglshot, eaglshot, eaglshot_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (Japan, bootleg?)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // from a bootleg ROM board with no proper Seta / Sammy markings, possibly original ROM tho?
GAME( 1995, hypreact, 0, hypreact, hypreact, ssv_state, init_ssv, ROT0, "Sammy", "Mahjong Hyper Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1994, twineag2, 0, twineag2, twineag2, ssv_state, init_ssv_irq1, ROT270, "Seta", "Twin Eagle II - The Rescue Mission", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, gdfs, 0, gdfs, gdfs, ssv_state, init_ssv, ROT0, "Banpresto", "Mobile Suit Gundam Final Shooting (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // title screen spells the title "Mobil" but standardized spelling is "Mobile" it also lists the company name as "Banprest" instead of "Banpresto"
+GAME( 1995, gdfs, 0, gdfs, gdfs, gdfs_state, init_ssv, ROT0, "Banpresto", "Mobile Suit Gundam Final Shooting (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // title screen spells the title "Mobil" but standardized spelling is "Mobile" it also lists the company name as "Banprest" instead of "Banpresto"
// Ultra X Weapon: "developed by Seta" in ending screen
GAME( 1995, ultrax, 0, ultrax, ultrax, ssv_state, init_ssv_irq1, ROT270, "Banpresto / Tsuburaya Productions / Seta", "Ultra X Weapons / Ultra Keibitai", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 95-01-30 13:27:15 on startup
@@ -4882,9 +4881,9 @@ GAME( 1997, srmp7, 0, srmp7, srmp7, ssv_state, init_ssv,
GAME( 1998, ryorioh, 0, ryorioh, ryorioh, ssv_state, init_ssv, ROT0, "Visco", "Gourmet Battle Quiz Ryohrioh CooKing (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1998, sxyreact, 0, sxyreact, sxyreact, ssv_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, sxyreact, 0, sxyreact, sxyreact, sxyreact_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1999, sxyreac2, 0, sxyreac2, sxyreact, ssv_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1999, sxyreac2, 0, sxyreac2, sxyreact, sxyreact_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1999, cairblad, 0, cairblad, cairblad, ssv_state, init_ssv_tilescram, ROT270, "Sammy", "Change Air Blade (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/ssv.h b/src/mame/includes/ssv.h
index 23819cdf9dd..21e2fad64e5 100644
--- a/src/mame/includes/ssv.h
+++ b/src/mame/includes/ssv.h
@@ -11,6 +11,7 @@
#include "machine/eepromser.h"
#include "machine/timer.h"
#include "machine/upd4701.h"
+#include "machine/upd7001.h"
#include "sound/es5506.h"
#include "emupal.h"
#include "screen.h"
@@ -23,29 +24,20 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ensoniq(*this, "ensoniq"),
- m_eeprom(*this, "eeprom"),
m_dsp(*this, "dsp"),
- m_upd4701(*this, "upd4701"),
- m_adc(*this, "adc"),
m_mainram(*this, "mainram"),
m_spriteram(*this, "spriteram"),
m_scroll(*this, "scroll"),
m_irq_vectors(*this, "irq_vectors"),
- m_gdfs_tmapram(*this, "gdfs_tmapram"),
- m_gdfs_tmapscroll(*this, "gdfs_tmapscroll"),
- m_gdfs_st0020(*this, "st0020_spr"),
m_input_sel(*this, "input_sel"),
m_raster_interrupt_enabled(false),
m_io_key(*this, "KEY%u", 0U),
- m_io_service(*this, "SERVICE"),
- m_io_paddle(*this, "PADDLE"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
{ }
void ssv(machine_config &config);
- void gdfs(machine_config &config);
void dynagear(machine_config &config);
void hypreac2(machine_config &config);
void meosism(machine_config &config);
@@ -56,12 +48,9 @@ public:
void twineag2(machine_config &config);
void ryorioh(machine_config &config);
void janjans1(machine_config &config);
- void eaglshot(machine_config &config);
void survarts(machine_config &config);
- void sxyreac2(machine_config &config);
void ultrax(machine_config &config);
void vasara(machine_config &config);
- void sxyreact(machine_config &config);
void mslider(machine_config &config);
void jsk(machine_config &config);
void hypreact(machine_config &config);
@@ -71,27 +60,19 @@ public:
void init_ssv();
void init_ssv_tilescram();
- void init_eaglshot();
- void init_sexy();
void init_ssv_irq1();
void init_jsk();
void init_pastelis();
-private:
+protected:
required_device<cpu_device> m_maincpu;
required_device<es5506_device> m_ensoniq;
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
optional_device<upd96050_device> m_dsp;
- optional_device<upd4701_device> m_upd4701;
- optional_device<adc0808_device> m_adc;
required_shared_ptr<uint16_t> m_mainram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_scroll;
required_shared_ptr<uint16_t> m_irq_vectors;
- optional_shared_ptr<uint16_t> m_gdfs_tmapram;
- optional_shared_ptr<uint16_t> m_gdfs_tmapscroll;
- optional_device<st0020_device> m_gdfs_st0020;
optional_shared_ptr<uint16_t> m_input_sel;
int m_tile_code[16];
@@ -100,12 +81,8 @@ private:
int m_shadow_pen_shift;
uint8_t m_requested_int;
uint16_t m_irq_enable;
- std::unique_ptr<uint16_t[]> m_eaglshot_gfxram;
- tilemap_t *m_gdfs_tmap;
int m_interrupt_ultrax;
bool m_raster_interrupt_enabled;
- uint16_t m_sxyreact_serial;
- int m_sxyreact_dial;
uint32_t m_latches[8];
DECLARE_WRITE16_MEMBER(irq_ack_w);
@@ -124,37 +101,19 @@ private:
DECLARE_READ16_MEMBER(srmp7_irqv_r);
DECLARE_WRITE16_MEMBER(srmp7_sound_bank_w);
DECLARE_READ16_MEMBER(srmp7_input_r);
- DECLARE_READ16_MEMBER(sxyreact_ballswitch_r);
- DECLARE_READ16_MEMBER(sxyreact_dial_r);
- DECLARE_WRITE16_MEMBER(sxyreact_dial_w);
- DECLARE_WRITE16_MEMBER(sxyreact_motor_w);
DECLARE_READ32_MEMBER(latch32_r);
DECLARE_WRITE32_MEMBER(latch32_w);
DECLARE_READ16_MEMBER(latch16_r);
DECLARE_WRITE16_MEMBER(latch16_w);
- DECLARE_WRITE8_MEMBER(eaglshot_gfxrom_bank_w);
- DECLARE_WRITE8_MEMBER(eaglshot_trackball_w);
- DECLARE_READ16_MEMBER(eaglshot_gfxram_r);
- DECLARE_WRITE16_MEMBER(eaglshot_gfxram_w);
- DECLARE_WRITE16_MEMBER(gdfs_tmapram_w);
DECLARE_READ16_MEMBER(vblank_r);
DECLARE_WRITE16_MEMBER(scroll_w);
- DECLARE_READ16_MEMBER(gdfs_eeprom_r);
- DECLARE_WRITE16_MEMBER(gdfs_eeprom_w);
-
- TILE_GET_INFO_MEMBER(get_tile_info_0);
virtual void machine_reset() override;
virtual void video_start() override;
- DECLARE_VIDEO_START(gdfs);
- DECLARE_VIDEO_START(eaglshot);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_gdfs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_eaglshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
- DECLARE_WRITE_LINE_MEMBER(gdfs_adc_int_w);
void update_irq_state();
IRQ_CALLBACK_MEMBER(irq_callback);
@@ -170,11 +129,10 @@ private:
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void enable_video(int enable);
+ void cairblad_map(address_map &map);
void drifto94_map(address_map &map);
void dsp_data_map(address_map &map);
void dsp_prg_map(address_map &map);
- void eaglshot_map(address_map &map);
- void gdfs_map(address_map &map);
void hypreac2_map(address_map &map);
void hypreact_map(address_map &map);
void janjans1_map(address_map &map);
@@ -187,13 +145,10 @@ private:
void srmp4_map(address_map &map);
void srmp7_map(address_map &map);
void survarts_map(address_map &map);
- void sxyreact_map(address_map &map);
void twineag2_map(address_map &map);
void ultrax_map(address_map &map);
optional_ioport_array<4> m_io_key;
- optional_ioport m_io_service;
- optional_ioport m_io_paddle;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
@@ -201,4 +156,98 @@ private:
void ssv_map(address_map &map, u32 rom);
};
+class gdfs_state : public ssv_state
+{
+public:
+ gdfs_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ssv_state(mconfig, type, tag),
+ m_adc(*this, "adc"),
+ m_eeprom(*this, "eeprom"),
+ m_st0020(*this, "st0020_spr"),
+ m_tmapram(*this, "gdfs_tmapram"),
+ m_tmapscroll(*this, "gdfs_tmapscroll")
+ { }
+
+ void gdfs(machine_config &config);
+
+protected:
+ virtual void video_start() override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(adc_int_w);
+
+ DECLARE_READ16_MEMBER(eeprom_r);
+ DECLARE_WRITE16_MEMBER(eeprom_w);
+
+ void gdfs_map(address_map &map);
+
+ TILE_GET_INFO_MEMBER(get_tile_info_0);
+ void tmapram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ required_device<adc0808_device> m_adc;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_device<st0020_device> m_st0020;
+ required_shared_ptr<uint16_t> m_tmapram;
+ required_shared_ptr<uint16_t> m_tmapscroll;
+
+ tilemap_t *m_tmap;
+};
+
+class eaglshot_state : public ssv_state
+{
+public:
+ eaglshot_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ssv_state(mconfig, type, tag),
+ m_upd4701(*this, "upd4701")
+ { }
+
+ void eaglshot(machine_config &config);
+
+ void init_eaglshot();
+
+protected:
+ virtual void video_start() override;
+
+private:
+ void gfxrom_bank_w(uint8_t data);
+ void trackball_w(uint8_t data);
+ uint16_t gfxram_r(offs_t offset, uint16_t mem_mask);
+ void gfxram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+
+ void eaglshot_map(address_map &map);
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ required_device<upd4701_device> m_upd4701;
+
+ std::unique_ptr<uint16_t[]> m_gfxram;
+};
+
+class sxyreact_state : public ssv_state
+{
+public:
+ sxyreact_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ssv_state(mconfig, type, tag),
+ m_sxyreact_adc(*this, "adc"),
+ m_io_service(*this, "SERVICE")
+ { }
+
+ void sxyreact(machine_config &config);
+ void sxyreac2(machine_config &config);
+
+ void init_sexy();
+
+private:
+ DECLARE_READ16_MEMBER(ballswitch_r);
+ uint8_t dial_r();
+ void dial_w(uint8_t data);
+ DECLARE_WRITE16_MEMBER(motor_w);
+
+ void sxyreact_map(address_map &map);
+
+ required_device<upd7001_device> m_sxyreact_adc;
+ required_ioport m_io_service;
+};
+
#endif // MAME_INCLUDES_SSV_H
diff --git a/src/mame/video/ssv.cpp b/src/mame/video/ssv.cpp
index 1bbfd96cab8..b1cd23169d3 100644
--- a/src/mame/video/ssv.cpp
+++ b/src/mame/video/ssv.cpp
@@ -212,37 +212,37 @@ void ssv_state::video_start()
save_item(NAME(m_shadow_pen_shift));
}
-VIDEO_START_MEMBER(ssv_state,eaglshot)
+void eaglshot_state::video_start()
{
ssv_state::video_start();
- m_eaglshot_gfxram = std::make_unique<uint16_t[]>(16 * 0x40000 / 2);
+ m_gfxram = std::make_unique<uint16_t[]>(16 * 0x40000 / 2);
- m_gfxdecode->gfx(0)->set_source((uint8_t *)m_eaglshot_gfxram.get());
+ m_gfxdecode->gfx(0)->set_source((uint8_t *)m_gfxram.get());
- save_pointer(NAME(m_eaglshot_gfxram), 16 * 0x40000 / 2);
+ save_pointer(NAME(m_gfxram), 16 * 0x40000 / 2);
}
-TILE_GET_INFO_MEMBER(ssv_state::get_tile_info_0)
+TILE_GET_INFO_MEMBER(gdfs_state::get_tile_info_0)
{
- uint16_t tile = m_gdfs_tmapram[tile_index];
+ uint16_t tile = m_tmapram[tile_index];
tileinfo.set(1, tile, 0, TILE_FLIPXY( tile >> 14 ));
}
-WRITE16_MEMBER(ssv_state::gdfs_tmapram_w)
+void gdfs_state::tmapram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- COMBINE_DATA(&m_gdfs_tmapram[offset]);
- m_gdfs_tmap->mark_tile_dirty(offset);
+ COMBINE_DATA(&m_tmapram[offset]);
+ m_tmap->mark_tile_dirty(offset);
}
-VIDEO_START_MEMBER(ssv_state,gdfs)
+void gdfs_state::video_start()
{
ssv_state::video_start();
- m_gdfs_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ssv_state::get_tile_info_0)), TILEMAP_SCAN_ROWS, 16,16, 0x100,0x100);
+ m_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gdfs_state::get_tile_info_0)), TILEMAP_SCAN_ROWS, 16,16, 0x100,0x100);
- m_gdfs_tmap->set_transparent_pen(0);
+ m_tmap->set_transparent_pen(0);
}
/***************************************************************************
@@ -939,21 +939,21 @@ void ssv_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
***************************************************************************/
-uint32_t ssv_state::screen_update_eaglshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t eaglshot_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- return screen_update(screen, bitmap, cliprect);
+ return ssv_state::screen_update(screen, bitmap, cliprect);
}
-uint32_t ssv_state::screen_update_gdfs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t gdfs_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- screen_update(screen, bitmap, cliprect);
+ ssv_state::screen_update(screen, bitmap, cliprect);
// draw zooming sprites
- m_gdfs_st0020->update_screen(screen, bitmap, cliprect, false);
+ m_st0020->update_screen(screen, bitmap, cliprect, false);
- m_gdfs_tmap->set_scrollx(0, m_gdfs_tmapscroll[0x0c/2]);
- m_gdfs_tmap->set_scrolly(0, m_gdfs_tmapscroll[0x10/2]);
- m_gdfs_tmap->draw(screen, bitmap, cliprect, 0, 0);
+ m_tmap->set_scrollx(0, m_tmapscroll[0x0c/2]);
+ m_tmap->set_scrolly(0, m_tmapscroll[0x10/2]);
+ m_tmap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}