summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <hazemamewip@hotmail.com>2018-01-25 03:00:14 +0000
committer ajrhacker <ajrhacker@users.noreply.github.com>2018-01-24 22:00:14 -0500
commitc3709b05582b6600063e065ada9a3faffd844a7b (patch)
treec6ecd6fcc43b3f356423ca13cdb3257c1759a8ee
parent9f5c4c5cebc7e9220fd2c1a852937dad20720b83 (diff)
various reorganization of radica and vtech stuff (#3108)
* various reorganization of radica and vtech stuff * missed this (nw) * correct file (nw) * newlines and stuff (nw) * less c_str (nw) * worse (IMHO) filenames (nw) * format got messed up (nw) * some bits for golden tee (nw) * get us renderng something in rad_gtg (nw) * some basic inputs (nw) * further improvements to the Golden Tee Home Edition (radica eu3a14) added Radica Sensible Soccer [Sean Riddle] * tilebase handling (nw) * golden tee home video improvements (nw)
-rw-r--r--hash/megadriv.xml26
-rw-r--r--scripts/target/mame/arcade.lua4
-rw-r--r--scripts/target/mame/mess.lua13
-rw-r--r--src/emu/xtal.cpp2
-rw-r--r--src/mame/arcade.flt2
-rw-r--r--src/mame/audio/rad_eu3a05.cpp266
-rw-r--r--src/mame/audio/rad_eu3a05.h64
-rw-r--r--src/mame/drivers/geniusiq.cpp148
-rw-r--r--src/mame/drivers/hshavoc.cpp2
-rw-r--r--src/mame/drivers/iqunlim.cpp105
-rw-r--r--src/mame/drivers/megadriv_acbl.cpp (renamed from src/mame/drivers/megadrvb.cpp)2
-rw-r--r--src/mame/drivers/megadriv_rad.cpp191
-rw-r--r--src/mame/drivers/puckpkmn.cpp2
-rw-r--r--src/mame/drivers/rad_eu3a05.cpp (renamed from src/mame/drivers/radicasi.cpp)612
-rw-r--r--src/mame/drivers/rad_eu3a14.cpp722
-rw-r--r--src/mame/drivers/vii.cpp12
-rw-r--r--src/mame/drivers/vtech_eu3a12.cpp46
-rw-r--r--src/mame/drivers/vtech_unk1.cpp98
-rw-r--r--src/mame/drivers/vtech_unk2.cpp46
-rw-r--r--src/mame/includes/megadriv_acbl.h (renamed from src/mame/includes/megadrvb.h)16
-rw-r--r--src/mame/includes/megadriv_rad.h34
-rw-r--r--src/mame/machine/rad_eu3a05gpio.cpp84
-rw-r--r--src/mame/machine/rad_eu3a05gpio.h52
-rw-r--r--src/mame/mame.lst29
-rw-r--r--src/mame/mess.flt8
25 files changed, 1865 insertions, 721 deletions
diff --git a/hash/megadriv.xml b/hash/megadriv.xml
index fe835c0d57d..69fc784bbe1 100644
--- a/hash/megadriv.xml
+++ b/hash/megadriv.xml
@@ -31246,30 +31246,6 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="radicav1">
- <description>Radica: Volume 1 (USA)</description>
- <year>2004</year>
- <publisher>Radica Games ~ Sega</publisher>
- <part name="cart" interface="megadriv_cart">
- <feature name="slot" value="rom_radica"/>
- <dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="radicav1.bin" size="4194304" crc="3b4c8438" sha1="5ed9c053f9ebc8d4bf571d57e562cf347585d158" offset="0x000000" loadflag="load16_word_swap"/>
- </dataarea>
- </part>
- </software>
-
- <software name="radicasf">
- <description>Radica: Street Fighter Pack (Euro)</description>
- <year>2004</year>
- <publisher>Radica Games ~ Capcom</publisher>
- <part name="cart" interface="megadriv_cart">
- <feature name="slot" value="rom_radica"/>
- <dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="radicasf.bin" size="4194304" crc="868afb44" sha1="f4339e36272c18b1d49aa4095127ed18e0961df6" offset="0x000000" loadflag="load16_word_swap"/>
- </dataarea>
- </part>
- </software>
-
<software name="tomclown">
<description>Tom Clown (USA)</description>
<year>1993</year>
@@ -32901,6 +32877,4 @@ This dump is either a bad dump or a wrongly patched one.
</dataarea>
</part>
</software>
-
-
</softwarelist>
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 891c98089df..9620917c985 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -3182,8 +3182,8 @@ files {
MAME_DIR .. "src/mame/machine/segabb.h",
MAME_DIR .. "src/mame/machine/megadriv.cpp",
MAME_DIR .. "src/mame/includes/megadriv.h",
- MAME_DIR .. "src/mame/drivers/megadrvb.cpp",
- MAME_DIR .. "src/mame/includes/megadrvb.h",
+ MAME_DIR .. "src/mame/drivers/megadriv_acbl.cpp",
+ MAME_DIR .. "src/mame/includes/megadriv_acbl.h",
MAME_DIR .. "src/mame/drivers/megaplay.cpp",
MAME_DIR .. "src/mame/drivers/megatech.cpp",
MAME_DIR .. "src/mame/drivers/calcune.cpp",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index aaf93bdba8f..6bedc7cfbd2 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2836,6 +2836,8 @@ files {
MAME_DIR .. "src/mame/machine/gdrom.h",
MAME_DIR .. "src/mame/drivers/megadriv.cpp",
MAME_DIR .. "src/mame/includes/megadriv.h",
+ MAME_DIR .. "src/mame/drivers/megadriv_rad.cpp",
+ MAME_DIR .. "src/mame/includes/megadriv_rad.h",
MAME_DIR .. "src/mame/drivers/segapico.cpp",
MAME_DIR .. "src/mame/drivers/sega_sawatte.cpp",
MAME_DIR .. "src/mame/drivers/segapm.cpp",
@@ -3367,6 +3369,10 @@ files {
MAME_DIR .. "src/mame/drivers/crvision.cpp",
MAME_DIR .. "src/mame/includes/crvision.h",
MAME_DIR .. "src/mame/drivers/geniusiq.cpp",
+ MAME_DIR .. "src/mame/drivers/vtech_unk1.cpp",
+ MAME_DIR .. "src/mame/drivers/vtech_unk2.cpp",
+ MAME_DIR .. "src/mame/drivers/vtech_eu3a12.cpp",
+ MAME_DIR .. "src/mame/drivers/iqunlim.cpp",
MAME_DIR .. "src/mame/drivers/laser3k.cpp",
MAME_DIR .. "src/mame/drivers/lcmate2.cpp",
MAME_DIR .. "src/mame/drivers/pc4.cpp",
@@ -3614,7 +3620,12 @@ files {
MAME_DIR .. "src/mame/drivers/qvt201.cpp",
MAME_DIR .. "src/mame/drivers/qvt6800.cpp",
MAME_DIR .. "src/mame/drivers/rd100.cpp",
- MAME_DIR .. "src/mame/drivers/radicasi.cpp",
+ MAME_DIR .. "src/mame/drivers/rad_eu3a14.cpp",
+ MAME_DIR .. "src/mame/drivers/rad_eu3a05.cpp",
+ MAME_DIR .. "src/mame/audio/rad_eu3a05.cpp",
+ MAME_DIR .. "src/mame/audio/rad_eu3a05.h",
+ MAME_DIR .. "src/mame/machine/rad_eu3a05gpio.cpp",
+ MAME_DIR .. "src/mame/machine/rad_eu3a05gpio.h",
MAME_DIR .. "src/mame/drivers/rvoice.cpp",
MAME_DIR .. "src/mame/drivers/sacstate.cpp",
MAME_DIR .. "src/mame/drivers/sartorius.cpp",
diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp
index 8b830f962d4..0971364d0f1 100644
--- a/src/emu/xtal.cpp
+++ b/src/emu/xtal.cpp
@@ -229,7 +229,7 @@ const double XTAL::known_xtals[] = {
21'052'600, /* NEC PC-98xx pixel clock */
21'060'000, /* HP 264x display clock (60 Hz configuration) */
21'254'400, /* TeleVideo 970 132-column display clock */
- 21'281'370, /* Radica Tetris */
+ 21'281'370, /* Radica Tetris (PAL) */
21'300'000,
21'477'272, /* BMC bowling, some Data East 90's games, Vtech Socrates; (6x NTSC subcarrier) */
22'000'000,
diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt
index 2d3e1c54bb9..0a726441563 100644
--- a/src/mame/arcade.flt
+++ b/src/mame/arcade.flt
@@ -694,7 +694,7 @@ mcr68.cpp
meadows.cpp
meadwttl.cpp
mediagx.cpp
-megadrvb.cpp
+megadriv_acbl.cpp
megaphx.cpp
megaplay.cpp
megasys1.cpp
diff --git a/src/mame/audio/rad_eu3a05.cpp b/src/mame/audio/rad_eu3a05.cpp
new file mode 100644
index 00000000000..b77e1bdc6a4
--- /dev/null
+++ b/src/mame/audio/rad_eu3a05.cpp
@@ -0,0 +1,266 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+// Format not understood, it is not OKI ADPCM or IMA ADPCM, maybe something more basic?
+
+#include "emu.h"
+#include "rad_eu3a05.h"
+
+DEFINE_DEVICE_TYPE(RADICA6502_SOUND, radica6502_sound_device, "radica6502sound", "Radica 6502 Sound")
+
+radica6502_sound_device::radica6502_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, RADICA6502_SOUND, tag, owner, clock)
+ , device_sound_interface(mconfig, *this)
+ , m_stream(nullptr)
+ , m_space_read_cb(*this)
+{
+}
+
+void radica6502_sound_device::device_start()
+{
+ m_space_read_cb.resolve_safe(0);
+ m_stream = stream_alloc(0, 1, 8000);
+}
+
+void radica6502_sound_device::device_reset()
+{
+ for (int i = 0; i < 6; i++)
+ {
+ m_sound_byte_address[i] = 0;
+ m_sound_byte_len[i] = 0;
+ m_sound_current_nib_pos[i] = 0;
+ }
+
+ m_isstopped = 0x3f;
+}
+
+//-------------------------------------------------
+// sound_stream_update - handle a stream update
+//-------------------------------------------------
+
+void radica6502_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
+{
+ // reset the output stream
+ memset(outputs[0], 0, samples * sizeof(*outputs[0]));
+
+ int outpos = 0;
+ // loop while we still have samples to generate
+ while (samples-- != 0)
+ {
+ for (int channel = 0; channel < 6; channel++)
+ {
+ if (!((m_isstopped >> channel) & 1))
+ {
+ //logerror("m_isstopped %02x channel %d is active %08x %06x\n", m_isstopped, channel, m_sound_byte_address[channel], m_sound_current_nib_pos[channel]);
+
+ int readoffset = m_sound_byte_address[channel] + (m_sound_current_nib_pos[channel] / 2);
+
+ int nibble = m_space_read_cb(readoffset);
+
+ nibble = nibble >> ((m_sound_current_nib_pos[channel] & 1) ? 0 : 4);
+ nibble &= 0x0f;
+
+ // it's actually some form of ADPCM? but apparently NOT the OKI ADPCM
+ if (nibble & 0x08)
+ nibble -= 0x10;
+
+ outputs[0][outpos] += nibble * 0x100;
+
+ m_sound_current_nib_pos[channel]++;
+
+ if (m_sound_current_nib_pos[channel] >= m_sound_byte_len[channel] * 2)
+ {
+ m_sound_current_nib_pos[channel] = 0;
+ m_isstopped |= (1 << channel);
+
+ // maybe should generate an interrupt with vector
+ // ffb8, ffbc, ffc0, ffc4, ffc8, or ffcc depending on which channel finished??
+ }
+ }
+ else
+ {
+ //logerror("m_isstopped %02x channel %d is NOT active %08x %06x\n", m_isstopped, channel, m_sound_byte_address[channel], m_sound_current_nib_pos[channel]);
+ }
+ }
+ outpos++;
+ }
+}
+
+
+void radica6502_sound_device::handle_sound_addr_w(int which, int offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 0x00:
+ m_sound_byte_address[which] = (m_sound_byte_address[which] & 0xffff00) | (data<<0);
+ logerror("%s: sound_0 (%d) write lo address %02x (real address is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_address[which]);
+ break;
+
+ case 0x01:
+ m_sound_byte_address[which] = (m_sound_byte_address[which] & 0xff00ff) | (data<<8);
+ logerror("%s: sound_0 (%d) write md address %02x (real address is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_address[which]);
+ break;
+
+ case 0x02:
+ m_sound_byte_address[which] = (m_sound_byte_address[which] & 0x00ffff) | (data<<16);
+ logerror("%s: sound_0 (%d) write hi address %02x (real address is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_address[which]);
+ break;
+ }
+}
+
+uint8_t radica6502_sound_device::handle_sound_addr_r(int which, int offset)
+{
+ switch (offset)
+ {
+ case 0x00:
+ logerror("%s: sound_0 (%d) read lo address\n", machine().describe_context(), which);
+ return (m_sound_byte_address[which]>>0) & 0xff;
+
+ case 0x01:
+ logerror("%s: sound_0 (%d) read mid address\n", machine().describe_context(), which);
+ return (m_sound_byte_address[which]>>8) & 0xff;
+
+ case 0x02:
+ logerror("%s: sound_0 (%d) read hi address\n", machine().describe_context(), which);
+ return (m_sound_byte_address[which]>>16) & 0xff;
+ }
+
+ return 0x00;
+}
+
+WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_addr_w)
+{
+ m_stream->update();
+ handle_sound_addr_w(offset / 3, offset % 3, data);
+}
+
+READ8_MEMBER(radica6502_sound_device::radicasi_sound_addr_r)
+{
+ m_stream->update();
+ return handle_sound_addr_r(offset / 3, offset % 3);
+}
+
+void radica6502_sound_device::handle_sound_size_w(int which, int offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 0x00:
+ m_sound_byte_len[which] = (m_sound_byte_len[which] & 0xffff00) | (data<<0);
+ logerror("%s: sound_1 (%d) write lo size %02x (real size is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_len[which]);
+ break;
+
+ case 0x01:
+ m_sound_byte_len[which] = (m_sound_byte_len[which] & 0xff00ff) | (data<<8);
+ logerror("%s: sound_1 (%d) write md size %02x (real size is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_len[which]);
+ break;
+
+ case 0x02:
+ m_sound_byte_len[which] = (m_sound_byte_len[which] & 0x00ffff) | (data<<16);
+ logerror("%s: sound_1 (%d) write hi size %02x (real size is now %08x)\n", machine().describe_context(), which, data, m_sound_byte_len[which]);
+ break;
+ }
+}
+
+uint8_t radica6502_sound_device::handle_sound_size_r(int which, int offset)
+{
+ switch (offset)
+ {
+ case 0x00:
+ logerror("%s: sound_1 (%d) read lo size\n", machine().describe_context(), which);
+ return (m_sound_byte_len[which]>>0) & 0xff;
+
+ case 0x01:
+ logerror("%s: sound_1 (%d) read mid size\n", machine().describe_context(), which);
+ return (m_sound_byte_len[which]>>8) & 0xff;
+
+ case 0x02:
+ logerror("%s: sound_1 (%d) read hi size\n", machine().describe_context(), which);
+ return (m_sound_byte_len[which]>>16) & 0xff;
+ }
+
+ return 0x00;
+}
+
+WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_size_w)
+{
+ m_stream->update();
+ handle_sound_size_w(offset / 3, offset % 3, data);
+}
+
+READ8_MEMBER(radica6502_sound_device::radicasi_sound_size_r)
+{
+ m_stream->update();
+ return handle_sound_size_r(offset / 3, offset % 3);
+}
+
+READ8_MEMBER(radica6502_sound_device::radicasi_sound_trigger_r)
+{
+ m_stream->update();
+
+ logerror("%s: sound read from trigger?\n", machine().describe_context());
+ return m_sound_trigger;
+}
+
+
+WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_trigger_w)
+{
+ m_stream->update();
+
+ logerror("%s: sound write to trigger? %02x\n", machine().describe_context(), data);
+ m_sound_trigger = data;
+
+ for (int i = 0; i < 6; i++)
+ {
+ int bit = (data >> i) & 1;
+
+ if (bit)
+ handle_sound_trigger(i);
+ }
+
+ if (data & 0xc0)
+ logerror(" UNEXPECTED BITS SET");
+}
+
+/* this is read/written with the same individual bits for each channel as the trigger
+ maybe related to interrupts? */
+READ8_MEMBER(radica6502_sound_device::radicasi_sound_unk_r)
+{
+ logerror("%s: radicasi_sound_unk_r\n", machine().describe_context());
+ // don't think this reads back what was written probably a status of something instead?
+ return 0x00; //m_sound_unk;
+}
+
+WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_unk_w)
+{
+ logerror("%s: radicasi_sound_unk_w %02x\n", machine().describe_context(), data);
+
+ for (int i = 0; i < 6; i++)
+ {
+ int bit = (data >> i) & 1;
+
+ if (bit)
+ logerror("(unknown operation on channel %d)\n", i);
+ }
+
+ m_sound_unk = data;
+
+ if (data & 0xc0)
+ logerror(" UNEXPECTED BITS SET");
+}
+
+void radica6502_sound_device::handle_sound_trigger(int which)
+{
+ logerror("Triggering operation on channel (%d) with params %08x %08x\n", which, m_sound_byte_address[which], m_sound_byte_len[which]);
+
+ m_sound_current_nib_pos[which] = 0;
+ m_isstopped &= ~(1 << which);
+}
+
+
+READ8_MEMBER(radica6502_sound_device::radicasi_50a8_r)
+{
+ m_stream->update();
+
+ logerror("%s: radicasi_50a8_r\n", machine().describe_context());
+ return m_isstopped;
+}
diff --git a/src/mame/audio/rad_eu3a05.h b/src/mame/audio/rad_eu3a05.h
new file mode 100644
index 00000000000..55a98a6e183
--- /dev/null
+++ b/src/mame/audio/rad_eu3a05.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_AUDIO_RAD_EU3A05_H
+#define MAME_AUDIO_RAD_EU3A05_H
+
+#define MCFG_RADICA6502_SOUND_SPACE_READ_CB(_devcb) \
+ devcb = &radica6502_sound_device::set_space_read_callback(*device, DEVCB_##_devcb);
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> radica6502_sound_device
+
+class radica6502_sound_device : public device_t, public device_sound_interface
+{
+public:
+ radica6502_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <class Object> static devcb_base &set_space_read_callback(device_t &device, Object &&cb) { return downcast<radica6502_sound_device &>(device).m_space_read_cb.set_callback(std::forward<Object>(cb)); }
+
+ DECLARE_WRITE8_MEMBER(radicasi_sound_addr_w);
+ DECLARE_READ8_MEMBER(radicasi_sound_addr_r);
+ DECLARE_WRITE8_MEMBER(radicasi_sound_size_w);
+ DECLARE_READ8_MEMBER(radicasi_sound_size_r);
+ DECLARE_READ8_MEMBER(radicasi_sound_trigger_r);
+ DECLARE_WRITE8_MEMBER(radicasi_sound_trigger_w);
+ DECLARE_READ8_MEMBER(radicasi_sound_unk_r);
+ DECLARE_WRITE8_MEMBER(radicasi_sound_unk_w);
+
+ DECLARE_READ8_MEMBER(radicasi_50a8_r);
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // sound stream update overrides
+ virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+
+private:
+ sound_stream *m_stream;
+ devcb_read8 m_space_read_cb;
+
+ uint32_t m_sound_byte_address[6];
+ uint32_t m_sound_byte_len[6];
+ uint32_t m_sound_current_nib_pos[6];
+
+ uint8_t m_sound_trigger;
+ uint8_t m_sound_unk;
+
+ uint8_t m_isstopped;
+
+ void handle_sound_trigger(int which);
+
+ void handle_sound_addr_w(int which, int offset, uint8_t data);
+ uint8_t handle_sound_addr_r(int which, int offset);
+ void handle_sound_size_w(int which, int offset, uint8_t data);
+ uint8_t handle_sound_size_r(int which, int offset);
+};
+
+DECLARE_DEVICE_TYPE(RADICA6502_SOUND, radica6502_sound_device)
+
+#endif // MAME_AUDIO_RAD_EU3A05_H
diff --git a/src/mame/drivers/geniusiq.cpp b/src/mame/drivers/geniusiq.cpp
index a907f8f30c1..8a7b994ede1 100644
--- a/src/mame/drivers/geniusiq.cpp
+++ b/src/mame/drivers/geniusiq.cpp
@@ -148,87 +148,6 @@ PCB - German Version:
+------+ +--------------------------------------+ +-----------------------------------+ +----------+
-IQ Unlimited - GERMAN:
- +------------------------------------------------------------------------------+
- | |
-+-----+ |
-| |
-| |
-| |
-| +----+ +---+ |
-| | A2 | +----+ | | |
-| | | | A4 | |A1 | +-+ |
-| +----+ +----+ | | | | |
-| | | +-+ |
-| | | |
-| +---+ +--+
-| |
-| +-------+ |
-+--+ |65C5L5K| +----+
- | | HC374 | |
-+--+ +----------+ +-------+ +--+
-| |DragonBall| |
-| C +----+ |EZ | +-------+ C |
-| A | A3 | | | |65C5L5K| A |
-| R +----+ |LSC414328P| | HC374 | R |
-| T |U16 IJ75C| +-------+ T |
-| R | HHAV984S | R |
-| I +----------+ I |
-| D CARD 1 +------------+ CARD 0 D |
-| G | AM29F0400 | G |
-| E | | +------+ +--------+ E |
-| +------------+ | LGS | |LHMN5KR7| |
-| S | | | | S |
-| L |GM71C1| | 1998 | L |
-| O GER |8163CJ| | | O |
-| T 038 |6 | |27-06126| T |
-| | | |-007 | |
-+--+ | | | | +--+
- | | | | VTECH | |
- | +------+ +--------+ |
- | 35-19600-200 703139-G|
- +-------------------------------------------------------------------------+
-
-A1 = 98AHCLT / 27-05992-0-0 / VTech
-A2 = 9932 HBL / C807U-1442 / 35016B / Japan
-A3 = ACT139
-A4 = MAX232
-
-
-Leader 8008 CX (German version)
-
-+---+-----------+-----+-----------------------+-----+-----+-----+
-| |SERIAL PORT| |PARALLEL PORT (PRINTER)| |MOUSE| |
-| +-----------+ +-----------------------+ +-----+ |
-| |
-| |
-| |
-| |
-| +----+ |
-| | A0 | |
-| +----+ |
-| |
-| |
-| +--------+ |
-| | | |
-| CPU | VTECH | +------+ |
-| |LHMV5GNS| | | |
-| | | |GM76U8| |
-| |1999 | |128CLF| |
-| |27-6393-| |W85 | |
-| +-----------+ |11 | | | |
-| |27-6296-0-0| | | | | |
-| |47C241M NH7| | | +------+ |
-| +-----------+ +--------+ |
-| |
-| |
-| |
-| |
-+---------------------------------------------------------------+
-
-CPU = epoxy blob
-GM76U8128CLFW85 = LGS / Hynix 131,072 WORDS x 8 BIT CMOS SRAM
-TMP47C241MG = TCLS-47 series 4-bit CPU with 2048x8 internal ROM
****************************************************************************/
@@ -312,19 +231,6 @@ private:
} m_keyboard;
};
-class gl8008cx_state : public driver_device
-{
-public:
- gl8008cx_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu")
- { }
-
- required_device<cpu_device> m_maincpu;
-
- virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void gl8008cx(machine_config &config);
-};
PALETTE_INIT_MEMBER(geniusiq_state, geniusiq)
{
@@ -353,10 +259,6 @@ PALETTE_INIT_MEMBER(geniusiq_state, geniusiq)
palette.set_pen_color(i, palette_val[i*3], palette_val[i*3+1], palette_val[i*3+2]);
}
-uint32_t gl8008cx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- return 0;
-}
uint32_t geniusiq_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
@@ -511,10 +413,6 @@ INPUT_CHANGED_MEMBER( geniusiq_state::send_input )
queue_input(data);
}
-static ADDRESS_MAP_START(gl8008cx_mem, AS_PROGRAM, 16, gl8008cx_state)
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x1FFFFF) AM_ROM
-ADDRESS_MAP_END
static ADDRESS_MAP_START(geniusiq_mem, AS_PROGRAM, 16, geniusiq_state)
ADDRESS_MAP_UNMAP_HIGH
@@ -743,8 +641,6 @@ static INPUT_PORTS_START( geniusiq_de )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_1 ) PORT_CHAR('1') PORT_CHAR('!') PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x66 )
INPUT_PORTS_END
-static INPUT_PORTS_START( gl8008cx )
-INPUT_PORTS_END
void geniusiq_state::machine_start()
{
@@ -831,20 +727,6 @@ MACHINE_CONFIG_DERIVED(geniusiq_state::iqtv512, iq128)
MCFG_AMD_29F040_ADD("flash")
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(gl8008cx_state::gl8008cx)
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, XTAL(32'000'000)/2) // TODO wrong CPU and frequency
- MCFG_CPU_PROGRAM_MAP(gl8008cx_mem)
-
- /* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( gl8008cx_state, screen_update )
-MACHINE_CONFIG_END
-
/* ROM definition */
ROM_START( iq128 )
@@ -862,45 +744,15 @@ ROM_START( iqtv512 )
ROM_LOAD( "27-06171-000.bin", 0x0000, 0x200000, CRC(2597af70) SHA1(9db8151a84517407d380424410b6fa0003ceb1eb) )
ROM_END
-ROM_START( gl8008cx )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "27-6393-11.u1", 0x0000, 0x200000, CRC(fd49db46) SHA1(fc55bb31f42068f9d6cc8e2c2f419c3c4edb4fe6) )
-
- ROM_REGION(0x800, "subcpu", 0)
- ROM_LOAD( "27-6296-0-0.u3", 0x000, 0x800, NO_DUMP )
-ROM_END
-
-ROM_START( bs9009cx )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "27-6603-01.u1", 0x0000, 0x200000, CRC(2c299f65) SHA1(44b37007a7c4087d7c2bd8c24907402bfe445ba4) )
-
- ROM_REGION(0x800, "subcpu", 0)
- ROM_LOAD( "mcu.u5", 0x000, 0x800, NO_DUMP )
-ROM_END
-
ROM_START( itunlim )
ROM_REGION(0x200000, "maincpu", 0)
ROM_LOAD( "27-06124-002.u3", 0x000000, 0x200000, CRC(0c0753ce) SHA1(d22504d583ca8d6a9d2f56fbaa3e1d52c442a1e9) )
ROM_END
-ROM_START( iqunlim )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD16_WORD_SWAP( "27-06126-007.bin", 0x000000, 0x200000, CRC(af38c743) SHA1(5b91748536905812e6de7145638699acb375865a) )
-ROM_END
-
-ROM_START( glmmc )
- ROM_REGION(0x200000, "maincpu", 0)
- ROM_LOAD( "27-5889-00.bin", 0x000000, 0x080000, CRC(5e2c6359) SHA1(cc01c7bd5c87224b63dd1044db5a36a5cb7824f1) )
-ROM_END
-
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
COMP( 1997, iq128, 0, 0, iq128, geniusiq_de, geniusiq_state, 0, "Video Technology", "Genius IQ 128 (Germany)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
COMP( 1997, iq128_fr, iq128, 0, iq128, geniusiq, geniusiq_state, 0, "Video Technology", "Genius IQ 128 (France)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
COMP( 1998, iqtv512, 0, 0, iqtv512, geniusiq_de, geniusiq_state, 0, "Video Technology", "Genius IQ TV 512 (Germany)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
-COMP( 1999, gl8008cx, 0, 0, gl8008cx, gl8008cx, gl8008cx_state, 0, "Video Technology", "Genius Leader 8008 CX (Germany)", MACHINE_IS_SKELETON)
-COMP( 1999, bs9009cx, 0, 0, gl8008cx, gl8008cx, gl8008cx_state, 0, "Video Technology", "BrainStation 9009 CXL (Germany)", MACHINE_IS_SKELETON)
COMP( 1998, itunlim, 0, 0, iq128, geniusiq_de, geniusiq_state, 0, "Video Technology", "VTech IT Unlimited (UK)", MACHINE_NO_SOUND)
-COMP( 19??, iqunlim, 0, 0, iq128, geniusiq_de, geniusiq_state, 0, "Video Technology", "VTech IQ Unlimited (Germany)", MACHINE_IS_SKELETON)
-COMP( 19??, glmmc, 0, 0, iq128, geniusiq_de, geniusiq_state, 0, "Video Technology", "Genius Leader Master Mega Color (Germany)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/hshavoc.cpp b/src/mame/drivers/hshavoc.cpp
index ae7d7ade2af..d579ead92c0 100644
--- a/src/mame/drivers/hshavoc.cpp
+++ b/src/mame/drivers/hshavoc.cpp
@@ -42,7 +42,7 @@ Unfortunately it's read protected.
#include "sound/2612intf.h"
#include "sound/sn76496.h"
#include "includes/megadriv.h"
-#include "includes/megadrvb.h"
+#include "includes/megadriv_acbl.h"
static INPUT_PORTS_START( hshavoc )
PORT_START("IN0") /* 16bit */
diff --git a/src/mame/drivers/iqunlim.cpp b/src/mame/drivers/iqunlim.cpp
new file mode 100644
index 00000000000..61041faf558
--- /dev/null
+++ b/src/mame/drivers/iqunlim.cpp
@@ -0,0 +1,105 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+
+/*
+
+
+IQ Unlimited - GERMAN:
+ +------------------------------------------------------------------------------+
+ | |
++-----+ |
+| |
+| |
+| |
+| +----+ +---+ |
+| | A2 | +----+ | | |
+| | | | A4 | |A1 | +-+ |
+| +----+ +----+ | | | | |
+| | | +-+ |
+| | | |
+| +---+ +--+
+| |
+| +-------+ |
++--+ |65C5L5K| +----+
+ | | HC374 | |
++--+ +----------+ +-------+ +--+
+| |DragonBall| |
+| C +----+ |EZ | +-------+ C |
+| A | A3 | | | |65C5L5K| A |
+| R +----+ |LSC414328P| | HC374 | R |
+| T |U16 IJ75C| +-------+ T |
+| R | HHAV984S | R |
+| I +----------+ I |
+| D CARD 1 +------------+ CARD 0 D |
+| G | AM29F0400 | G |
+| E | | +------+ +--------+ E |
+| +------------+ | LGS | |LHMN5KR7| |
+| S | | | | S |
+| L |GM71C1| | 1998 | L |
+| O GER |8163CJ| | | O |
+| T 038 |6 | |27-06126| T |
+| | | |-007 | |
++--+ | | | | +--+
+ | | | | VTECH | |
+ | +------+ +--------+ |
+ | 35-19600-200 703139-G|
+ +-------------------------------------------------------------------------+
+
+A1 = 98AHCLT / 27-05992-0-0 / VTech
+A2 = 9932 HBL / C807U-1442 / 35016B / Japan
+A3 = ACT139
+A4 = MAX232
+
+*/
+
+#include "emu.h"
+#include "screen.h"
+#include "cpu/m68000/m68000.h"
+
+class iqunlim_state : public driver_device
+{
+public:
+ iqunlim_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu")
+ { }
+
+ required_device<cpu_device> m_maincpu;
+
+ virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void iqunlim(machine_config &config);
+};
+
+uint32_t iqunlim_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+static ADDRESS_MAP_START(iqunlim_mem, AS_PROGRAM, 16, iqunlim_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1FFFFF) AM_ROM
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( iqunlim )
+INPUT_PORTS_END
+
+MACHINE_CONFIG_START(iqunlim_state::iqunlim)
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, XTAL(32'000'000)/2) // DragonBall EZ (MC68EZ328) (68k core) (is the xtal correct? this was from the other hardware)
+ MCFG_CPU_PROGRAM_MAP(iqunlim_mem)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ MCFG_SCREEN_UPDATE_DRIVER( iqunlim_state, screen_update )
+MACHINE_CONFIG_END
+
+ROM_START( iqunlim )
+ ROM_REGION(0x200000, "maincpu", 0)
+ ROM_LOAD16_WORD_SWAP( "27-06126-007.bin", 0x000000, 0x200000, CRC(af38c743) SHA1(5b91748536905812e6de7145638699acb375865a) )
+ROM_END
+
+COMP( 19??, iqunlim, 0, 0, iqunlim, iqunlim, iqunlim_state, 0, "Video Technology", "VTech IQ Unlimited (Germany)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/megadrvb.cpp b/src/mame/drivers/megadriv_acbl.cpp
index 0259cdf7f36..bfb91265a5b 100644
--- a/src/mame/drivers/megadrvb.cpp
+++ b/src/mame/drivers/megadriv_acbl.cpp
@@ -258,7 +258,7 @@ connector, but of course, I can be wrong.
#include "emu.h"
#include "includes/megadriv.h"
-#include "includes/megadrvb.h"
+#include "includes/megadriv_acbl.h"
/************************************ Megadrive Bootlegs *************************************/
diff --git a/src/mame/drivers/megadriv_rad.cpp b/src/mame/drivers/megadriv_rad.cpp
new file mode 100644
index 00000000000..2684e2f9434
--- /dev/null
+++ b/src/mame/drivers/megadriv_rad.cpp
@@ -0,0 +1,191 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+/*
+ Radica 'Mega Drive' and 'Genesis' clones
+ these were mini battery operated "TV Game" consoles with wired in controller and no cartslot
+ fully licensed by Sega
+
+ reproduction 'System on a Chip' hardware, not perfect, flaws will need emulating eventually.
+
+ not dumped
+
+ Genesis Volume 2
+ Genesis SF2 / GnG (PAL one is locked to PAL)
+
+ Outrun 2019 (probably identical ROM to MD version, just custom controller)
+
+ more?
+
+*/
+
+#include "emu.h"
+#include "includes/megadriv.h"
+#include "includes/megadriv_rad.h"
+
+// todo, use actual MD map, easier once maps are part of base class.
+static ADDRESS_MAP_START( megadriv_radica_map, AS_PROGRAM, 16, megadriv_radica_state )
+ AM_RANGE(0x000000, 0x3fffff) AM_READ(read) /* Cartridge Program Rom */
+ AM_RANGE(0xa00000, 0xa01fff) AM_READWRITE(megadriv_68k_read_z80_ram, megadriv_68k_write_z80_ram)
+ AM_RANGE(0xa02000, 0xa03fff) AM_WRITE(megadriv_68k_write_z80_ram)
+ AM_RANGE(0xa04000, 0xa04003) AM_READWRITE8(megadriv_68k_YM2612_read, megadriv_68k_YM2612_write, 0xffff)
+ AM_RANGE(0xa06000, 0xa06001) AM_WRITE(megadriv_68k_z80_bank_write)
+ AM_RANGE(0xa10000, 0xa1001f) AM_READWRITE(megadriv_68k_io_read, megadriv_68k_io_write)
+ AM_RANGE(0xa11100, 0xa11101) AM_READWRITE(megadriv_68k_check_z80_bus, megadriv_68k_req_z80_bus)
+ AM_RANGE(0xa11200, 0xa11201) AM_WRITE(megadriv_68k_req_z80_reset)
+ AM_RANGE(0xa13000, 0xa130ff) AM_READ(read_a13)
+ AM_RANGE(0xc00000, 0xc0001f) AM_DEVREADWRITE("gen_vdp", sega315_5313_device, vdp_r, vdp_w)
+ AM_RANGE(0xe00000, 0xe0ffff) AM_RAM AM_MIRROR(0x1f0000) AM_SHARE("megadrive_ram")
+ADDRESS_MAP_END
+
+READ16_MEMBER(megadriv_radica_state::read)
+{
+ return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (0x400000 - 1))/2];
+}
+
+READ16_MEMBER(megadriv_radica_state::read_a13)
+{
+ if (offset < 0x80)
+ m_bank = offset & 0x3f;
+
+ // low bit gets set when selecting cannon fodder or mega lo mania in the rad_ssoc set, pointing to the wrong area, but rad_gen1 needs it for the menu
+ // as they're standalones it could just be different logic
+ if (m_bank != 0x3f)
+ m_bank &= 0x3e;
+
+ return 0;
+}
+
+// controller is wired directly into unit, no controller slots
+static INPUT_PORTS_START( megadriv_radica_3button )
+ PORT_INCLUDE( md_common )
+
+ PORT_MODIFY("PAD1")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_MODIFY("PAD2")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 )
+INPUT_PORTS_END
+
+// the 6-in-1 and Sonic Gold units really only have a single wired controller, and no way to connect a 2nd one, despite having some 2 player games!
+static INPUT_PORTS_START( megadriv_radica_3button_1player )
+ PORT_INCLUDE( megadriv_radica_3button )
+
+ PORT_MODIFY("PAD2")
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( megadriv_radica_6button )
+ PORT_INCLUDE( megadriv_radica_3button )
+
+ PORT_START("EXTRA1") /* Extra buttons for Joypad 1 (6 button + start + mode) NOT READ DIRECTLY */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("EXTRA2") /* Extra buttons for Joypad 2 (6 button + start + mode) NOT READ DIRECTLY */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0")
+ PORT_START("UNK")
+INPUT_PORTS_END
+
+
+MACHINE_START_MEMBER(megadriv_radica_state, megadriv_radica_6button)
+{
+ MACHINE_START_CALL_MEMBER(megadriv);
+ m_vdp->stop_timers();
+
+ m_io_pad_6b[0] = ioport("EXTRA1");
+ m_io_pad_6b[1] = ioport("EXTRA2");
+ m_io_pad_6b[2] = ioport("IN0");
+ m_io_pad_6b[3] = ioport("UNK");
+
+ // setup timers for 6 button pads
+ for (int i = 0; i < 3; i++)
+ m_io_timeout[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(md_base_state::io_timeout_timer_callback),this), (void*)(uintptr_t)i);
+
+ save_item(NAME(m_bank));
+}
+
+MACHINE_START_MEMBER(megadriv_radica_state, megadriv_radica_3button)
+{
+ MACHINE_START_CALL_MEMBER(megadriv);
+ m_vdp->stop_timers();
+ save_item(NAME(m_bank));
+}
+
+MACHINE_RESET_MEMBER(megadriv_radica_state, megadriv_radica)
+{
+ m_bank = 0;
+ MACHINE_RESET_CALL_MEMBER(megadriv);
+ m_maincpu->reset();
+}
+
+MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_3button_ntsc)
+ MCFG_FRAGMENT_ADD(md_ntsc)
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(megadriv_radica_map)
+ MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_3button)
+ MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_3button_pal)
+ MCFG_FRAGMENT_ADD(md_pal)
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(megadriv_radica_map)
+ MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_3button)
+ MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_6button_pal)
+ MCFG_FRAGMENT_ADD(md_pal)
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(megadriv_radica_map)
+ MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_6button)
+ MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
+MACHINE_CONFIG_END
+
+
+
+
+ROM_START( rad_sf )
+ ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "radicasf.bin", 0x000000, 0x400000, CRC(868afb44) SHA1(f4339e36272c18b1d49aa4095127ed18e0961df6) )
+ROM_END
+
+ROM_START( rad_gen1 )
+ ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "radicav1.bin", 0x000000, 0x400000, CRC(3b4c8438) SHA1(5ed9c053f9ebc8d4bf571d57e562cf347585d158) )
+ROM_END
+
+ROM_START( rad_ssoc )
+ ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_LOAD( "sensiblesoccer.bin", 0x000000, 0x400000, CRC(b8745ab3) SHA1(0ab3f26e5ffd288e5a3a5db676951b9095299eb0) ) // should be byteswapped?
+ROM_END
+
+DRIVER_INIT_MEMBER(megadriv_radica_state,megadriv_radica_6button_pal)
+{
+ DRIVER_INIT_CALL(megadrie);
+ // 6 button game, so overwrite 3 button io handlers
+ m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_6button),this);
+ m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_6button),this);
+}
+
+// NTSC releases
+CONS( 2004, rad_gen1,0, 0, megadriv_radica_3button_ntsc, megadriv_radica_3button_1player, megadriv_radica_state, megadriv, "Radica / Sega", "Genesis Collection Volume 1 (Radica, Arcade Legends) (USA)", 0)
+
+// PAL releases
+CONS( 2004, rad_sf, 0, 0, megadriv_radica_6button_pal, megadriv_radica_6button, megadriv_radica_state, megadriv_radica_6button_pal, "Radica / Capcom / Sega", "Street Fighter II: Special Champion Edition [Ghouls'n Ghosts] (Radica, Arcade Legends) (Europe)", 0) // SF2 game is region locked, US version ROM is definitely different
+CONS( 2004, rad_ssoc,0, 0, megadriv_radica_3button_pal, megadriv_radica_3button, megadriv_radica_state, megadrie, "Radica / Sensible Software / Sega", "Sensible Soccer plus [Cannon Fodder, Mega lo Mania] (Radica, Arcade Legends) (Europe)", 0) // still branded as Arcade Legends even if none of these were ever arcade games
+
diff --git a/src/mame/drivers/puckpkmn.cpp b/src/mame/drivers/puckpkmn.cpp
index 3e1de67307f..d51d2f30787 100644
--- a/src/mame/drivers/puckpkmn.cpp
+++ b/src/mame/drivers/puckpkmn.cpp
@@ -51,7 +51,7 @@ Notes:
#include "sound/2612intf.h"
#include "includes/megadriv.h"
-#include "includes/megadrvb.h"
+#include "includes/megadriv_acbl.h"
/* Puckman Pockimon Input Ports */
static INPUT_PORTS_START( puckpkmn )
diff --git a/src/mame/drivers/radicasi.cpp b/src/mame/drivers/rad_eu3a05.cpp
index a821e5759d4..6c2f11ad3af 100644
--- a/src/mame/drivers/radicasi.cpp
+++ b/src/mame/drivers/rad_eu3a05.cpp
@@ -23,7 +23,6 @@
---
Other games that might be on this hardware
- Golden Tee Home Edition
Skateboarding
+ some of the earlier PlayTV games (not Soccer, that's XaviX, see xavix.cpp)
@@ -159,11 +158,13 @@
#include "screen.h"
#include "speaker.h"
#include "machine/bankdev.h"
+#include "audio/rad_eu3a05.h"
+#include "machine/rad_eu3a05gpio.h"
-class radica_6502_state : public driver_device
+class radica_eu3a05_state : public driver_device
{
public:
- radica_6502_state(const machine_config &mconfig, device_type type, const char *tag)
+ radica_eu3a05_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ram(*this, "ram"),
@@ -285,267 +286,7 @@ private:
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
-
-#define MCFG_RADICA6502_SOUND_SPACE_READ_CB(_devcb) \
- devcb = &radica6502_sound_device::set_space_read_callback(*device, DEVCB_##_devcb);
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> radica6502_sound_device
-
-class radica6502_sound_device : public device_t, public device_sound_interface
-{
-public:
- radica6502_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> static devcb_base &set_space_read_callback(device_t &device, Object &&cb) { return downcast<radica6502_sound_device &>(device).m_space_read_cb.set_callback(std::forward<Object>(cb)); }
-
- DECLARE_WRITE8_MEMBER(radicasi_sound_addr_w);
- DECLARE_READ8_MEMBER(radicasi_sound_addr_r);
- DECLARE_WRITE8_MEMBER(radicasi_sound_size_w);
- DECLARE_READ8_MEMBER(radicasi_sound_size_r);
- DECLARE_READ8_MEMBER(radicasi_sound_trigger_r);
- DECLARE_WRITE8_MEMBER(radicasi_sound_trigger_w);
- DECLARE_READ8_MEMBER(radicasi_sound_unk_r);
- DECLARE_WRITE8_MEMBER(radicasi_sound_unk_w);
-
- DECLARE_READ8_MEMBER(radicasi_50a8_r);
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
- // sound stream update overrides
- virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
-
-private:
- sound_stream *m_stream;
- devcb_read8 m_space_read_cb;
-
- uint32_t m_sound_byte_address[6];
- uint32_t m_sound_byte_len[6];
- uint32_t m_sound_current_nib_pos[6];
-
- uint8_t m_sound_trigger;
- uint8_t m_sound_unk;
-
- uint8_t m_isstopped;
-
- void handle_sound_trigger(int which);
-
- void handle_sound_addr_w(int which, int offset, uint8_t data);
- uint8_t handle_sound_addr_r(int which, int offset);
- void handle_sound_size_w(int which, int offset, uint8_t data);
- uint8_t handle_sound_size_r(int which, int offset);
-};
-
-//DECLARE_DEVICE_TYPE(RADICA6502_SOUND, radica6502_sound_device)
-DEFINE_DEVICE_TYPE(RADICA6502_SOUND, radica6502_sound_device, "radica6502sound", "Radica 6502 Sound")
-
-radica6502_sound_device::radica6502_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, RADICA6502_SOUND, tag, owner, clock)
- , device_sound_interface(mconfig, *this)
- , m_stream(nullptr)
- , m_space_read_cb(*this)
-{
-}
-
-void radica6502_sound_device::device_start()
-{
- m_space_read_cb.resolve_safe(0);
- m_stream = stream_alloc(0, 1, 8000);
-}
-
-void radica6502_sound_device::device_reset()
-{
- for (int i = 0; i < 6; i++)
- {
- m_sound_byte_address[i] = 0;
- m_sound_byte_len[i] = 0;
- m_sound_current_nib_pos[i] = 0;
- }
-
- m_isstopped = 0x3f;
-}
-
-//-------------------------------------------------
-// sound_stream_update - handle a stream update
-//-------------------------------------------------
-
-void radica6502_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
-{
- // reset the output stream
- memset(outputs[0], 0, samples * sizeof(*outputs[0]));
-
- int outpos = 0;
- // loop while we still have samples to generate
- while (samples-- != 0)
- {
- for (int channel = 0; channel < 6; channel++)
- {
- if (!((m_isstopped >> channel) & 1))
- {
- //logerror("m_isstopped %02x channel %d is active %08x %06x\n", m_isstopped, channel, m_sound_byte_address[channel], m_sound_current_nib_pos[channel]);
-
- int readoffset = m_sound_byte_address[channel] + (m_sound_current_nib_pos[channel] / 2);
-
- int nibble = m_space_read_cb(readoffset);
-
- nibble = nibble >> ((m_sound_current_nib_pos[channel] & 1) ? 0 : 4);
- nibble &= 0x0f;
-
- // it's actually some form of ADPCM? but apparently NOT the OKI ADPCM
- if (nibble & 0x08)
- nibble -= 0x10;
-
- outputs[0][outpos] += nibble * 0x100;
-
- m_sound_current_nib_pos[channel]++;
-
- if (m_sound_current_nib_pos[channel] >= m_sound_byte_len[channel] * 2)
- {
- m_sound_current_nib_pos[channel] = 0;
- m_isstopped |= (1 << channel);
-
- // maybe should generate an interrupt with vector
- // ffb8, ffbc, ffc0, ffc4, ffc8, or ffcc depending on which channel finished??
- }
- }
- else
- {
- //logerror("m_isstopped %02x channel %d is NOT active %08x %06x\n", m_isstopped, channel, m_sound_byte_address[channel], m_sound_current_nib_pos[channel]);
- }
- }
- outpos++;
- }
-}
-
-
-#define MCFG_RADICA6502_GPIO_READ_PORT0_CB(_devcb) \
- devcb = &radica6502_gpio_device::set_gpio_read_0_callback(*device, DEVCB_##_devcb);
-
-#define MCFG_RADICA6502_GPIO_READ_PORT1_CB(_devcb) \
- devcb = &radica6502_gpio_device::set_gpio_read_1_callback(*device, DEVCB_##_devcb);
-
-#define MCFG_RADICA6502_GPIO_READ_PORT2_CB(_devcb) \
- devcb = &radica6502_gpio_device::set_gpio_read_2_callback(*device, DEVCB_##_devcb);
-
-
-class radica6502_gpio_device : public device_t
-{
-public:
- radica6502_gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> static devcb_base &set_gpio_read_0_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &set_gpio_read_1_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &set_gpio_read_2_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read2_cb.set_callback(std::forward<Object>(cb)); }
-
- DECLARE_READ8_MEMBER(gpio_r);
- DECLARE_WRITE8_MEMBER(gpio_w);
-
- DECLARE_WRITE8_MEMBER(gpio_unk_w);
-
-
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
-private:
- devcb_read8 m_space_read0_cb;
- devcb_read8 m_space_read1_cb;
- devcb_read8 m_space_read2_cb;
-
- uint8_t read_port_data(int which);
- uint8_t read_direction(int which);
- void write_port_data(int which, uint8_t data);
- void write_direction(int which, uint8_t data);
-
- uint8_t m_ddr[3];
- uint8_t m_unk[3];
-};
-
-//DECLARE_DEVICE_TYPE(RADICA6502_SOUND, radica6502_gpio_device)
-DEFINE_DEVICE_TYPE(RADICA6502_GPIO, radica6502_gpio_device, "radica6502gpio", "Radica 6502 GPIO")
-
-radica6502_gpio_device::radica6502_gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, RADICA6502_GPIO, tag, owner, clock)
- , m_space_read0_cb(*this)
- , m_space_read1_cb(*this)
- , m_space_read2_cb(*this)
-{
-}
-
-void radica6502_gpio_device::device_start()
-{
- m_space_read0_cb.resolve_safe(0xff);
- m_space_read1_cb.resolve_safe(0xff);
- m_space_read2_cb.resolve_safe(0xff);
-}
-
-void radica6502_gpio_device::device_reset()
-{
- for (int i = 0; i < 3; i++)
- {
- m_ddr[i] = 0;
- m_unk[i] = 0;
- }
-}
-
-uint8_t radica6502_gpio_device::read_port_data(int which)
-{
- //todo, actually use the direction registers
- switch (which)
- {
- case 0: return m_space_read0_cb();
- case 1: return m_space_read1_cb();
- case 2: return m_space_read2_cb();
- }
-
- return 0xff;
-}
-
-uint8_t radica6502_gpio_device::read_direction(int which)
-{
- return m_ddr[which];
-}
-
-READ8_MEMBER(radica6502_gpio_device::gpio_r)
-{
-
- int port = offset/2;
- if (!(offset&1)) return read_direction(port);
- else return read_port_data(port);
-}
-
-void radica6502_gpio_device::write_port_data(int which, uint8_t data)
-{
- //todo, actually use the direction registers
- logerror("%s: write_port_data (port %d) %02x (direction register %02x)\n", which, data, m_ddr[which]);
-}
-
-void radica6502_gpio_device::write_direction(int which, uint8_t data)
-{
- logerror("%s: write_direction (port %d) %02x\n", which, data);
- m_ddr[which] = data;
-}
-
-WRITE8_MEMBER(radica6502_gpio_device::gpio_w)
-{
-
- int port = offset/2;
- if (!(offset&1)) return write_direction(port, data);
- else return write_port_data(port, data);
-}
-
-WRITE8_MEMBER(radica6502_gpio_device::gpio_unk_w)
-{
- logerror("%s: gpio_unk_w (port %d) %02x (direction register %02x)\n", offset, data, m_ddr[offset]);
-}
-
-void radica_6502_state::video_start()
+void radica_eu3a05_state::video_start()
{
}
@@ -555,7 +296,7 @@ void radica_6502_state::video_start()
that space (Tetris seems to rely on mirroring? as it sets all addresses up for the lower 1MB instead)
*/
-void radica_6502_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+void radica_eu3a05_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
address_space& fullbankspace = m_bank->space(AS_PROGRAM);
@@ -693,7 +434,7 @@ double hue2rgb(double p, double q, double t)
}
// a hacky mess for now
-bool radica_6502_state::get_tile_data(int base, int drawpri, int& tile, int &attr, int &unk2)
+bool radica_eu3a05_state::get_tile_data(int base, int drawpri, int& tile, int &attr, int &unk2)
{
tile = m_vram[base * 4] + (m_vram[(base * 4) + 1] << 8);
@@ -716,7 +457,7 @@ bool radica_6502_state::get_tile_data(int base, int drawpri, int& tile, int &att
return true;
}
-void radica_6502_state::draw_tilemaps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int drawpri)
+void radica_eu3a05_state::draw_tilemaps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int drawpri)
{
/* this doesn't handle 8x8 4bpp, haven't seen it used
nor is there support for horizontal scrolling etc.
@@ -844,7 +585,7 @@ void radica_6502_state::draw_tilemaps(screen_device &screen, bitmap_ind16 &bitma
}
}
-uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t radica_eu3a05_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
@@ -893,36 +634,36 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b
// System control
-WRITE8_MEMBER(radica_6502_state::radicasi_rombank_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_rombank_hi_w)
{
// written with the banking?
- //logerror("%s: radicasi_rombank_hi_w (set ROM bank) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_rombank_hi_w (set ROM bank) %02x\n", machine().describe_context(), data);
m_rombank_hi = data;
m_bank->set_bank(m_rombank_lo | (m_rombank_hi << 8));
}
-WRITE8_MEMBER(radica_6502_state::radicasi_rombank_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_rombank_lo_w)
{
- //logerror("%s: radicasi_rombank_lo_w (select ROM bank) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_rombank_lo_w (select ROM bank) %02x\n", machine().describe_context(), data);
m_rombank_lo = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_rombank_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_rombank_lo_r)
{
return m_rombank_lo;
}
-READ8_MEMBER(radica_6502_state::radicasi_pal_ntsc_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_pal_ntsc_r)
{
// how best to handle this, we probably need to run the PAL machine at 50hz
// the text under the radica logo differs between regions
- logerror("%s: radicasi_pal_ntsc_r (region + more?)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_pal_ntsc_r (region + more?)\n", machine().describe_context());
return 0xff; // NTSC
//return 0x00; // PAL
}
-READ8_MEMBER(radica_6502_state::radicasi_5003_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_5003_r)
{
/* masked with 0x0f, 0x01 or 0x03 depending on situation..
@@ -934,7 +675,7 @@ READ8_MEMBER(radica_6502_state::radicasi_5003_r)
*/
- logerror("%s: radicasi_5003_r (RNG?)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_5003_r (RNG?)\n", machine().describe_context());
return machine().rand();
}
@@ -944,71 +685,71 @@ READ8_MEMBER(radica_6502_state::radicasi_5003_r)
// Tile bases
-WRITE8_MEMBER(radica_6502_state::radicasi_tile_gfxbase_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_tile_gfxbase_lo_w)
{
- //logerror("%s: radicasi_tile_gfxbase_lo_w (select GFX base lower) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_tile_gfxbase_lo_w (select GFX base lower) %02x\n", machine().describe_context(), data);
m_tile_gfxbase_lo_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_tile_gfxbase_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_tile_gfxbase_hi_w)
{
- //logerror("%s: radicasi_tile_gfxbase_hi_w (select GFX base upper) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_tile_gfxbase_hi_w (select GFX base upper) %02x\n", machine().describe_context(), data);
m_tile_gfxbase_hi_data = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_tile_gfxbase_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_tile_gfxbase_lo_r)
{
- //logerror("%s: radicasi_tile_gfxbase_lo_r (GFX base lower)\n", machine().describe_context().c_str());
+ //logerror("%s: radicasi_tile_gfxbase_lo_r (GFX base lower)\n", machine().describe_context());
return m_tile_gfxbase_lo_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_tile_gfxbase_hi_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_tile_gfxbase_hi_r)
{
- //logerror("%s: radicasi_tile_gfxbase_hi_r (GFX base upper)\n", machine().describe_context().c_str());
+ //logerror("%s: radicasi_tile_gfxbase_hi_r (GFX base upper)\n", machine().describe_context());
return m_tile_gfxbase_hi_data;
}
// Sprite Tile bases
-WRITE8_MEMBER(radica_6502_state::radicasi_sprite_gfxbase_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_sprite_gfxbase_lo_w)
{
- //logerror("%s: radicasi_sprite_gfxbase_lo_w (select Sprite GFX base lower) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_sprite_gfxbase_lo_w (select Sprite GFX base lower) %02x\n", machine().describe_context(), data);
m_sprite_gfxbase_lo_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_sprite_gfxbase_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_sprite_gfxbase_hi_w)
{
- //logerror("%s: radicasi_sprite_gfxbase_hi_w (select Sprite GFX base upper) %02x\n", machine().describe_context().c_str(), data);
+ //logerror("%s: radicasi_sprite_gfxbase_hi_w (select Sprite GFX base upper) %02x\n", machine().describe_context(), data);
m_sprite_gfxbase_hi_data = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_sprite_gfxbase_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_sprite_gfxbase_lo_r)
{
- //logerror("%s: radicasi_sprite_gfxbase_lo_r (Sprite GFX base lower)\n", machine().describe_context().c_str());
+ //logerror("%s: radicasi_sprite_gfxbase_lo_r (Sprite GFX base lower)\n", machine().describe_context());
return m_sprite_gfxbase_lo_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_sprite_gfxbase_hi_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_sprite_gfxbase_hi_r)
{
- //logerror("%s: radicasi_sprite_gfxbase_hi_r (Sprite GFX base upper)\n", machine().describe_context().c_str());
+ //logerror("%s: radicasi_sprite_gfxbase_hi_r (Sprite GFX base upper)\n", machine().describe_context());
return m_sprite_gfxbase_hi_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_sprite_bg_scroll_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_sprite_bg_scroll_r)
{
return m_bg_scroll[offset];
}
-WRITE8_MEMBER(radica_6502_state::radicasi_sprite_bg_scroll_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_sprite_bg_scroll_w)
{
m_bg_scroll[offset] = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_vidctrl_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_vidctrl_w)
{
- logerror("%s: radicasi_vidctrl_w %02x (video control?)\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_vidctrl_w %02x (video control?)\n", machine().describe_context(), data);
/*
c3 8bpp 16x16 1100 0011
e3 4bpp 16x16 1110 0011
@@ -1020,103 +761,103 @@ WRITE8_MEMBER(radica_6502_state::radicasi_vidctrl_w)
// DMA device
-WRITE8_MEMBER(radica_6502_state::radicasi_dmasrc_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_lo_w)
{
- logerror("%s: radicasi_dmasrc_lo_w (select DMA source low) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmasrc_lo_w (select DMA source low) %02x\n", machine().describe_context(), data);
m_dmasrc_lo_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmasrc_md_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_md_w)
{
- logerror("%s: radicasi_dmasrc_md_w (select DMA source middle) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmasrc_md_w (select DMA source middle) %02x\n", machine().describe_context(), data);
m_dmasrc_md_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmasrc_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_hi_w)
{
- logerror("%s: radicasi_dmasrc_hi_w (select DMA source upper) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmasrc_hi_w (select DMA source upper) %02x\n", machine().describe_context(), data);
m_dmasrc_hi_data = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmasrc_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_lo_r)
{
- logerror("%s: radicasi_dmasrc_lo_r (DMA source low)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmasrc_lo_r (DMA source low)\n", machine().describe_context());
return m_dmasrc_lo_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmasrc_md_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_md_r)
{
- logerror("%s: radicasi_dmasrc_md_r (DMA source middle)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmasrc_md_r (DMA source middle)\n", machine().describe_context());
return m_dmasrc_md_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmasrc_hi_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmasrc_hi_r)
{
- logerror("%s: radicasi_dmasrc_hi_r (DMA source upper)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmasrc_hi_r (DMA source upper)\n", machine().describe_context());
return m_dmasrc_hi_data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmadst_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmadst_lo_w)
{
- logerror("%s: radicasi_dmadst_lo_w (select DMA Dest lower) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmadst_lo_w (select DMA Dest lower) %02x\n", machine().describe_context(), data);
m_dmadst_lo_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmadst_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmadst_hi_w)
{
- logerror("%s: radicasi_dmadst_hi_w (select DMA Dest upper) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmadst_hi_w (select DMA Dest upper) %02x\n", machine().describe_context(), data);
m_dmadst_hi_data = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmadst_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmadst_lo_r)
{
- logerror("%s: radicasi_dmadst_lo_r (DMA Dest lower)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmadst_lo_r (DMA Dest lower)\n", machine().describe_context());
return m_dmadst_lo_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmadst_hi_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmadst_hi_r)
{
- logerror("%s: radicasi_dmadst_hi_r (DMA Dest upper)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmadst_hi_r (DMA Dest upper)\n", machine().describe_context());
return m_dmadst_hi_data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmasize_lo_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmasize_lo_w)
{
- logerror("%s: radicasi_dmasize_lo_w (select DMA Size lower) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmasize_lo_w (select DMA Size lower) %02x\n", machine().describe_context(), data);
m_dmasize_lo_data = data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmasize_hi_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmasize_hi_w)
{
- logerror("%s: radicasi_dmasize_hi_w (select DMA Size upper) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmasize_hi_w (select DMA Size upper) %02x\n", machine().describe_context(), data);
m_dmasize_hi_data = data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmasize_lo_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmasize_lo_r)
{
- logerror("%s: radicasi_dmasize_lo_r (DMA Size lower)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmasize_lo_r (DMA Size lower)\n", machine().describe_context());
return m_dmasize_lo_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmasize_hi_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmasize_hi_r)
{
- logerror("%s: radicasi_dmasize_hi_r (DMA Size upper)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmasize_hi_r (DMA Size upper)\n", machine().describe_context());
return m_dmasize_hi_data;
}
-READ8_MEMBER(radica_6502_state::radicasi_dmatrg_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_dmatrg_r)
{
- logerror("%s: radicasi_dmatrg_r (DMA operation state?)\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_dmatrg_r (DMA operation state?)\n", machine().describe_context());
return 0x00;//m_dmatrg_data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_dmatrg_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_dmatrg_w)
{
- logerror("%s: radicasi_dmatrg_w (trigger DMA operation) %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_dmatrg_w (trigger DMA operation) %02x\n", machine().describe_context(), data);
//m_dmatrg_data = data;
address_space& fullbankspace = m_bank->space(AS_PROGRAM);
@@ -1140,205 +881,28 @@ WRITE8_MEMBER(radica_6502_state::radicasi_dmatrg_w)
-void radica6502_sound_device::handle_sound_addr_w(int which, int offset, uint8_t data)
-{
- switch (offset)
- {
- case 0x00:
- m_sound_byte_address[which] = (m_sound_byte_address[which] & 0xffff00) | (data<<0);
- logerror("%s: sound_0 (%d) write lo address %02x (real address is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_address[which]);
- break;
-
- case 0x01:
- m_sound_byte_address[which] = (m_sound_byte_address[which] & 0xff00ff) | (data<<8);
- logerror("%s: sound_0 (%d) write md address %02x (real address is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_address[which]);
- break;
-
- case 0x02:
- m_sound_byte_address[which] = (m_sound_byte_address[which] & 0x00ffff) | (data<<16);
- logerror("%s: sound_0 (%d) write hi address %02x (real address is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_address[which]);
- break;
- }
-}
-
-uint8_t radica6502_sound_device::handle_sound_addr_r(int which, int offset)
-{
- switch (offset)
- {
- case 0x00:
- logerror("%s: sound_0 (%d) read lo address\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_address[which]>>0) & 0xff;
-
- case 0x01:
- logerror("%s: sound_0 (%d) read mid address\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_address[which]>>8) & 0xff;
-
- case 0x02:
- logerror("%s: sound_0 (%d) read hi address\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_address[which]>>16) & 0xff;
- }
-
- return 0x00;
-}
-
-WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_addr_w)
-{
- m_stream->update();
- handle_sound_addr_w(offset / 3, offset % 3, data);
-}
-
-READ8_MEMBER(radica6502_sound_device::radicasi_sound_addr_r)
-{
- m_stream->update();
- return handle_sound_addr_r(offset / 3, offset % 3);
-}
-
-void radica6502_sound_device::handle_sound_size_w(int which, int offset, uint8_t data)
-{
- switch (offset)
- {
- case 0x00:
- m_sound_byte_len[which] = (m_sound_byte_len[which] & 0xffff00) | (data<<0);
- logerror("%s: sound_1 (%d) write lo size %02x (real size is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_len[which]);
- break;
-
- case 0x01:
- m_sound_byte_len[which] = (m_sound_byte_len[which] & 0xff00ff) | (data<<8);
- logerror("%s: sound_1 (%d) write md size %02x (real size is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_len[which]);
- break;
-
- case 0x02:
- m_sound_byte_len[which] = (m_sound_byte_len[which] & 0x00ffff) | (data<<16);
- logerror("%s: sound_1 (%d) write hi size %02x (real size is now %08x)\n", machine().describe_context().c_str(), which, data, m_sound_byte_len[which]);
- break;
- }
-}
-
-uint8_t radica6502_sound_device::handle_sound_size_r(int which, int offset)
-{
- switch (offset)
- {
- case 0x00:
- logerror("%s: sound_1 (%d) read lo size\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_len[which]>>0) & 0xff;
-
- case 0x01:
- logerror("%s: sound_1 (%d) read mid size\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_len[which]>>8) & 0xff;
-
- case 0x02:
- logerror("%s: sound_1 (%d) read hi size\n", machine().describe_context().c_str(), which);
- return (m_sound_byte_len[which]>>16) & 0xff;
- }
-
- return 0x00;
-}
-
-WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_size_w)
-{
- m_stream->update();
- handle_sound_size_w(offset / 3, offset % 3, data);
-}
-
-READ8_MEMBER(radica6502_sound_device::radicasi_sound_size_r)
-{
- m_stream->update();
- return handle_sound_size_r(offset / 3, offset % 3);
-}
-
-READ8_MEMBER(radica6502_sound_device::radicasi_sound_trigger_r)
-{
- m_stream->update();
-
- logerror("%s: sound read from trigger?\n", machine().describe_context().c_str());
- return m_sound_trigger;
-}
-
-
-WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_trigger_w)
-{
- m_stream->update();
-
- logerror("%s: sound write to trigger? %02x\n", machine().describe_context().c_str(), data);
- m_sound_trigger = data;
-
- for (int i = 0; i < 6; i++)
- {
- int bit = (data >> i) & 1;
-
- if (bit)
- handle_sound_trigger(i);
- }
-
- if (data & 0xc0)
- logerror(" UNEXPECTED BITS SET");
-}
-
-/* this is read/written with the same individual bits for each channel as the trigger
- maybe related to interrupts? */
-READ8_MEMBER(radica6502_sound_device::radicasi_sound_unk_r)
-{
- logerror("%s: radicasi_sound_unk_r\n", machine().describe_context().c_str());
- // don't think this reads back what was written probably a status of something instead?
- return 0x00; //m_sound_unk;
-}
-
-WRITE8_MEMBER(radica6502_sound_device::radicasi_sound_unk_w)
-{
- logerror("%s: radicasi_sound_unk_w %02x\n", machine().describe_context().c_str(), data);
-
- for (int i = 0; i < 6; i++)
- {
- int bit = (data >> i) & 1;
-
- if (bit)
- logerror("(unknown operation on channel %d)\n", i);
- }
-
- m_sound_unk = data;
-
- if (data & 0xc0)
- logerror(" UNEXPECTED BITS SET");
-}
-
-void radica6502_sound_device::handle_sound_trigger(int which)
-{
- logerror("Triggering operation on channel (%d) with params %08x %08x\n", which, m_sound_byte_address[which], m_sound_byte_len[which]);
-
- m_sound_current_nib_pos[which] = 0;
- m_isstopped &= ~(1 << which);
-}
-
-
-READ8_MEMBER(radica6502_sound_device::radicasi_50a8_r)
-{
- m_stream->update();
-
- logerror("%s: radicasi_50a8_r\n", machine().describe_context().c_str());
- return m_isstopped;
-}
// probably also sound device, maybe for forcing channels to stop?
-READ8_MEMBER(radica_6502_state::radicasi_50a9_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_50a9_r)
{
- logerror("%s: radicasi_50a9_r\n", machine().describe_context().c_str());
+ logerror("%s: radicasi_50a9_r\n", machine().describe_context());
return m_50a9_data;
}
-WRITE8_MEMBER(radica_6502_state::radicasi_50a9_w)
+WRITE8_MEMBER(radica_eu3a05_state::radicasi_50a9_w)
{
- logerror("%s: radicasi_50a9_w %02x\n", machine().describe_context().c_str(), data);
+ logerror("%s: radicasi_50a9_w %02x\n", machine().describe_context(), data);
m_50a9_data = data;
}
// sound callback
-READ8_MEMBER(radica_6502_state::read_full_space)
+READ8_MEMBER(radica_eu3a05_state::read_full_space)
{
address_space& fullbankspace = m_bank->space(AS_PROGRAM);
return fullbankspace.read_byte(offset);
}
-static ADDRESS_MAP_START( radicasi_map, AS_PROGRAM, 8, radica_6502_state )
+static ADDRESS_MAP_START( radicasi_map, AS_PROGRAM, 8, radica_eu3a05_state )
// can the addresses move around?
AM_RANGE(0x0000, 0x05ff) AM_RAM AM_SHARE("ram")
AM_RANGE(0x0600, 0x3dff) AM_RAM AM_SHARE("vram")
@@ -1406,7 +970,7 @@ static ADDRESS_MAP_START( radicasi_map, AS_PROGRAM, 8, radica_6502_state )
ADDRESS_MAP_END
-static ADDRESS_MAP_START( radicasi_bank_map, AS_PROGRAM, 8, radica_6502_state )
+static ADDRESS_MAP_START( radicasi_bank_map, AS_PROGRAM, 8, radica_eu3a05_state )
AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_REGION("maincpu", 0)
AM_RANGE(0x400000, 0x40ffff) AM_RAM // ?? only ever cleared maybe a mirror of below?
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("pixram") // Qix writes here and sets the tile base here instead of ROM so it can have a pixel layer
@@ -1450,7 +1014,7 @@ INPUT_PORTS_END
the others look like they might be timer service routines
*/
-READ8_MEMBER(radica_6502_state::radicasi_nmi_vector_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_nmi_vector_r)
{
if (m_custom_nmi)
{
@@ -1463,7 +1027,7 @@ READ8_MEMBER(radica_6502_state::radicasi_nmi_vector_r)
}
}
-READ8_MEMBER(radica_6502_state::radicasi_irq_vector_r)
+READ8_MEMBER(radica_eu3a05_state::radicasi_irq_vector_r)
{
if (m_custom_irq)
{
@@ -1476,7 +1040,7 @@ READ8_MEMBER(radica_6502_state::radicasi_irq_vector_r)
}
}
-void radica_6502_state::machine_start()
+void radica_eu3a05_state::machine_start()
{
m_custom_irq = 0;
m_custom_irq_vector = 0x0000;
@@ -1487,7 +1051,7 @@ void radica_6502_state::machine_start()
m_bank->set_bank(0x7f);
}
-void radica_6502_state::machine_reset()
+void radica_eu3a05_state::machine_reset()
{
/* the 6502 core sets the default stack value to 0x01bd
and Tetris does not initialize it to anything else
@@ -1567,7 +1131,7 @@ static GFXDECODE_START( radicasi_fake )
GFXDECODE_ENTRY( "maincpu", 0, texture_helper_8bpp_layout, 0x0, 1 )
GFXDECODE_END
-INTERRUPT_GEN_MEMBER(radica_6502_state::interrupt)
+INTERRUPT_GEN_MEMBER(radica_eu3a05_state::interrupt)
{
m_custom_irq = 1;
m_custom_irq_vector = 0xffd4;
@@ -1581,12 +1145,12 @@ INTERRUPT_GEN_MEMBER(radica_6502_state::interrupt)
*/
}
-MACHINE_CONFIG_START(radica_6502_state::radicasi)
+MACHINE_CONFIG_START(radica_eu3a05_state::radicasi)
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",M6502,XTAL(21'281'370)/2) // Tetris has a XTAL(21'281'370), not confirmed on Space Invaders, actual CPU clock unknown.
MCFG_CPU_PROGRAM_MAP(radicasi_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", radica_6502_state, interrupt)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", radica_eu3a05_state, interrupt)
MCFG_DEVICE_ADD("bank", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(radicasi_bank_map)
@@ -1599,7 +1163,7 @@ MACHINE_CONFIG_START(radica_6502_state::radicasi)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(radica_6502_state, screen_update)
+ MCFG_SCREEN_UPDATE_DRIVER(radica_eu3a05_state, screen_update)
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
MCFG_SCREEN_PALETTE("palette")
@@ -1614,7 +1178,7 @@ MACHINE_CONFIG_START(radica_6502_state::radicasi)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_DEVICE_ADD("6ch_sound", RADICA6502_SOUND, 8000)
- MCFG_RADICA6502_SOUND_SPACE_READ_CB(READ8(radica_6502_state, read_full_space))
+ MCFG_RADICA6502_SOUND_SPACE_READ_CB(READ8(radica_eu3a05_state, read_full_space))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
@@ -1635,5 +1199,5 @@ ROM_START( rad_sinv )
ROM_RELOAD(0x300000, 0x100000)
ROM_END
-CONS( 2004, rad_sinv, 0, 0, radicasi, rad_sinv, radica_6502_state, 0, "Radica (licensed from Taito)", "Space Invaders [Lunar Rescue, Colony 5, Qix, Phoenix] (Radica, Arcade Legends TV Game)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // "5 Taito games in 1"
-CONS( 2004, rad_tetr, 0, 0, radicasi, rad_tetr, radica_6502_state, 0, "Radica (licensed from Elorg / The Tetris Company)", "Tetris (Radica, Arcade Legends TV Game)", MACHINE_NOT_WORKING ) // "5 Tetris games in 1"
+CONS( 2004, rad_sinv, 0, 0, radicasi, rad_sinv, radica_eu3a05_state, 0, "Radica (licensed from Taito)", "Space Invaders [Lunar Rescue, Colony 7, Qix, Phoenix] (Radica, Arcade Legends TV Game)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // "5 Taito games in 1"
+CONS( 2004, rad_tetr, 0, 0, radicasi, rad_tetr, radica_eu3a05_state, 0, "Radica (licensed from Elorg / The Tetris Company)", "Tetris (Radica, Arcade Legends TV Game)", MACHINE_NOT_WORKING ) // "5 Tetris games in 1"
diff --git a/src/mame/drivers/rad_eu3a14.cpp b/src/mame/drivers/rad_eu3a14.cpp
new file mode 100644
index 00000000000..74b2e48a6e3
--- /dev/null
+++ b/src/mame/drivers/rad_eu3a14.cpp
@@ -0,0 +1,722 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood, R.Belmont
+
+/*
+ These use a 6502 derived CPU under a glob
+ The CPU die is marked 'ELAN EU3A14'
+
+ There is a second glob surrounded by TSOP48 pads
+ this contains the ROM
+
+ Known to be on this hardware
+
+ Golden Tee Golf Home Edition (developed by FarSight Studios)
+
+ Maybe on this hardware
+
+ PlayTV Real Swing Golf (also developed by FarSight, looks similar but with different controls)
+
+
+ In many ways this is similar to the rad_eu3a05.cpp hardware
+ but the video system has changed, here the sprites are more traditional non-tile based, rather
+ than coming from 'pages'
+
+*/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "screen.h"
+#include "speaker.h"
+#include "machine/bankdev.h"
+#include "audio/rad_eu3a05.h"
+#include "machine/timer.h"
+
+/*
+
+ffb0 rti
+ffb4 rti
+ffb8 rti
+ffbc rti
+
+ffc0 rti
+ffc4 rti
+ffc8 rti
+ffcc rti
+
+ffd0 rti
+ffd4 main irq?
+ffd8 rti
+ffdc rti
+
+ffe0 something with 5045 bit 0x08 and 9d in ram (increase or decrease) (ADC interrupt)
+ffe4 something with 5045 bit 0x20 and 9c in ram (increase of decrease) (ADC interrupt)
+
+ffe8 rti
+ffec rti
+
+regular NMI (e3f0 - jump to ($19e2) which seems to point to rti, but could move..)
+regular IRQ (e3f3 - points to rti)
+
+*/
+
+
+class radica_eu3a14_state : public driver_device
+{
+public:
+ radica_eu3a14_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_palram(*this, "palram"),
+ m_scrollregs(*this, "scrollregs"),
+ m_tilebase(*this, "tilebase"),
+ m_mainram(*this, "mainram"),
+ m_dmaparams(*this, "dmaparams"),
+ m_bank(*this, "bank"),
+ m_palette(*this, "palette"),
+ m_gfxdecode(*this, "gfxdecode")
+ { }
+
+ READ8_MEMBER(irq_vector_r);
+
+ // screen updates
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void radica_eu3a14(machine_config &config);
+
+ int m_custom_irq;
+ uint16_t m_custom_irq_vector;
+
+ INTERRUPT_GEN_MEMBER(interrupt);
+
+ DECLARE_READ8_MEMBER(radicasi_pal_ntsc_r);
+
+ DECLARE_READ8_MEMBER(dma_trigger_r);
+ DECLARE_WRITE8_MEMBER(dma_trigger_w);
+
+ DECLARE_READ8_MEMBER(radicasi_rombank_lo_r);
+ DECLARE_WRITE8_MEMBER(radicasi_rombank_lo_w);
+ DECLARE_WRITE8_MEMBER(radicasi_rombank_hi_w);
+
+ DECLARE_READ8_MEMBER(random_r) { return machine().rand(); };
+
+ TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb);
+
+ // for callback
+ DECLARE_READ8_MEMBER(read_full_space);
+
+protected:
+ // driver_device overrides
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ virtual void video_start() override;
+
+private:
+ double hue2rgb(double p, double q, double t);
+
+ required_device<cpu_device> m_maincpu;
+ required_shared_ptr<uint8_t> m_palram;
+ required_shared_ptr<uint8_t> m_scrollregs;
+ required_shared_ptr<uint8_t> m_tilebase;
+ required_shared_ptr<uint8_t> m_mainram;
+ required_shared_ptr<uint8_t> m_dmaparams;
+ required_device<address_map_bank_device> m_bank;
+ required_device<palette_device> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+
+ uint8_t m_rombank_hi;
+ uint8_t m_rombank_lo;
+
+ void handle_palette(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_page(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int xbase, int ybase);
+ void draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+};
+
+
+void radica_eu3a14_state::video_start()
+{
+}
+
+double radica_eu3a14_state::hue2rgb(double p, double q, double t)
+{
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6.0f) return p + (q - p) * 6 * t;
+ if (t < 1 / 2.0f) return q;
+ if (t < 2 / 3.0f) return p + (q - p) * (2 / 3.0f - t) * 6;
+ return p;
+}
+
+void radica_eu3a14_state::handle_palette(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ // Palette
+ int offs = 0;
+ for (int index = 0; index < 512; index++)
+ {
+ uint16_t dat = m_palram[offs++] << 8;
+ dat |= m_palram[offs++];
+
+ // llll lsss ---h hhhh
+ int l_raw = (dat & 0xf800) >> 11;
+ int sl_raw = (dat & 0x0700) >> 8;
+ int h_raw = (dat & 0x001f) >> 0;
+
+ double l = (double)l_raw / 31.0f;
+ double s = (double)sl_raw / 7.0f;
+ double h = (double)h_raw / 24.0f;
+
+ double r, g, b;
+
+ if (s == 0) {
+ r = g = b = l; // greyscale
+ }
+ else {
+ double q = l < 0.5f ? l * (1 + s) : l + s - l * s;
+ double p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1 / 3.0f);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1 / 3.0f);
+ }
+
+ int r_real = r * 255.0f;
+ int g_real = g * 255.0f;
+ int b_real = b * 255.0f;
+
+ m_palette->set_pen_color(index, r_real, g_real, b_real);
+ }
+}
+
+void radica_eu3a14_state::draw_page(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int xbase, int ybase)
+{
+ gfx_element *gfx = m_gfxdecode->gfx(3);
+
+ int base = (m_tilebase[1] << 8) | m_tilebase[0];
+
+ int xdraw = xbase;
+ int ydraw = ybase;
+ int count = 0;
+
+ for (int i = 0x800+0x1c0*which; i < 0x800+0x1c0*(which+1); i+=2)
+ {
+ int tile = m_mainram[i+0] | (m_mainram[i+1] << 8);
+
+ gfx->transpen(bitmap, cliprect, tile+base, 0, 0, 0, xdraw, ydraw, 0);
+ xdraw+=16;
+
+ count++;
+ if (((count % 16) == 0))
+ {
+ xdraw -= 256;
+ ydraw += 16;
+ }
+ }
+}
+
+void radica_eu3a14_state::draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ int xscroll = m_scrollregs[0] | (m_scrollregs[1] << 8);
+ int yscroll = m_scrollregs[2] | (m_scrollregs[3] << 8);
+
+ draw_page(screen,bitmap,cliprect,0, 0-xscroll, 0-yscroll);
+ draw_page(screen,bitmap,cliprect,1, 256-xscroll, 0-yscroll);
+ draw_page(screen,bitmap,cliprect,2, 0-xscroll, 224-yscroll);
+ draw_page(screen,bitmap,cliprect,3, 256-xscroll, 224-yscroll);
+
+ draw_page(screen,bitmap,cliprect,0, 512+0-xscroll, 0-yscroll);
+ draw_page(screen,bitmap,cliprect,1, 512+256-xscroll, 0-yscroll);
+ draw_page(screen,bitmap,cliprect,2, 512+0-xscroll, 224-yscroll);
+ draw_page(screen,bitmap,cliprect,3, 512+256-xscroll, 224-yscroll);
+
+ draw_page(screen,bitmap,cliprect,0, 0-xscroll, 448+0-yscroll);
+ draw_page(screen,bitmap,cliprect,1, 256-xscroll, 448+0-yscroll);
+ draw_page(screen,bitmap,cliprect,2, 0-xscroll, 448+224-yscroll);
+ draw_page(screen,bitmap,cliprect,3, 256-xscroll, 448+224-yscroll);
+
+ draw_page(screen,bitmap,cliprect,0, 512+0-xscroll, 448+0-yscroll);
+ draw_page(screen,bitmap,cliprect,1, 512+256-xscroll, 448+0-yscroll);
+ draw_page(screen,bitmap,cliprect,2, 512+0-xscroll, 448+224-yscroll);
+ draw_page(screen,bitmap,cliprect,3, 512+256-xscroll, 448+224-yscroll);
+}
+
+void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ // first 4 sprite entries seem to be garbage sprites, so we start at 0x20
+ // likely we're just interpreting them wrong and they're used for blanking things or clipping?
+ for (int i = 0x20; i < 0x800; i += 8)
+ {
+ /*
+ +0 e--f hhww flip, enable, height, width
+ +1 yyyy yyyy ypos
+ +2 xxxx xxxx xpos
+ +3 pppp ---- palette
+ +4 tttt tttt tile bits
+ +5 tttt tttt
+ +6 ---- ---- (more tile bits)
+ +7 ---- ----
+
+ */
+
+ int attr = m_mainram[i + 0];
+ int y = m_mainram[i + 1];
+ int x = m_mainram[i + 2];
+ int attr2 = m_mainram[i + 3];
+
+ int h = attr & 0x0c;
+ int w = attr & 0x03;
+ int flipx = (attr & 0x10) >> 4;
+
+ int height = 0;
+ int width = 0;
+ int pal = attr2 >> 4;
+
+ // no idea
+ if (attr2 & 0x08)
+ pal += 0x10;
+
+ switch (h)
+ {
+ case 0x0:height = 2; break;
+ case 0x4:height = 4; break;
+ case 0x8:height = 8; break;
+ case 0xc:height = 16; break;
+ }
+
+ switch (w)
+ {
+ case 0x0:width = 1; break;
+ case 0x1:width = 2; break;
+ case 0x2:width = 4; break;
+ case 0x3:width = 8; break;
+ }
+
+ y -= ((height * 2) - 4);
+
+ x -= ((width * 4) - 4);
+
+ height *= 4;
+
+ x -= 8;
+ y -= 4;
+
+ // int base = 0x18000;
+ int offset = ((m_mainram[i + 5] << 8) + (m_mainram[i + 4] << 0));
+ int extra = m_mainram[i + 6];
+ gfx_element *gfx;
+ gfx = m_gfxdecode->gfx(1);
+
+#if 0
+ static int test = 0x0000;
+ if (machine().input().code_pressed_once(KEYCODE_W))
+ {
+ test += 0x2000;
+ popmessage("%02x", test);
+ }
+ if (machine().input().code_pressed_once(KEYCODE_Q))
+ {
+ test -= 0x2000;
+ popmessage("%02x", test);
+ }
+#endif
+
+ // this probably comes from somewhere else, base register
+ offset += 0x8000;
+
+ // these additions are odd, because 0x8000 should already be coming
+ // from the tile bits above
+
+ // 2bpp modes, always have bit --- --x- set?
+ if (extra == 0x02)
+ {
+ offset <<= 1;
+ gfx = m_gfxdecode->gfx(0);
+ pal = 0;
+ }
+
+ if (extra == 0x0a) // bits ---- x-x-
+ {
+ offset += 0x10000;
+ offset <<= 1;
+ gfx = m_gfxdecode->gfx(0);
+ pal = 0;
+ }
+
+ // 4bpp modes, always have bit --- -x-- set?
+
+ if (extra == 0x04) // bits ---- -x--
+ {
+ //
+ }
+
+ if (extra == 0x0c) // bits ---- xx--
+ offset += 0x10000;
+
+ if (extra == 0x14) // bits ---x -x--
+ offset += 0x20000;
+
+
+ offset = offset >> 1;
+
+ if (attr & 0x80)
+ {
+ int count = 0;
+ for (int yy = 0; yy < height; yy++)
+ {
+ for (int xx = 0; xx < width; xx++)
+ {
+ gfx->transpen(bitmap, cliprect, offset + count, pal, flipx, 0, x + xx * 8, y + yy, 0);
+ count++;
+ }
+ }
+ }
+ }
+}
+
+
+
+uint32_t radica_eu3a14_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bitmap.fill(0, cliprect);
+
+ handle_palette(screen, bitmap, cliprect);
+ draw_background(screen, bitmap, cliprect);
+ draw_sprites(screen, bitmap, cliprect);
+
+ return 0;
+}
+
+// sound callback
+READ8_MEMBER(radica_eu3a14_state::read_full_space)
+{
+ address_space& fullbankspace = m_bank->space(AS_PROGRAM);
+ return fullbankspace.read_byte(offset);
+}
+
+// irq controller seems to be like the Radica Space Invaders
+READ8_MEMBER(radica_eu3a14_state::irq_vector_r)
+{
+ if (m_custom_irq)
+ {
+ return m_custom_irq_vector >> (offset*8);
+ }
+ else
+ {
+ uint8_t *rom = memregion("maincpu")->base();
+ return rom[0x001ffe + offset];
+ }
+}
+
+/*
+ code at 0000 maps to e000
+ code at 1000 maps to f000
+
+ data at 2000
+ data at 3000
+ data at 4000
+ blank 5000
+ blank 6000
+
+ code at 7000 maps to 3000
+ code at 8000 maps to 6000
+ 9000 maps to 7000
+ a000 maps to 8000
+ b000 maps to 9000
+ c000 maps to a000
+ d000 maps to b000
+ e000 maps to c000
+*/
+
+WRITE8_MEMBER(radica_eu3a14_state::radicasi_rombank_hi_w)
+{
+ // written with the banking?
+ //logerror("%s: radicasi_rombank_hi_w (set ROM bank) %02x\n", machine().describe_context(), data);
+ m_rombank_hi = data;
+
+ m_bank->set_bank(m_rombank_lo | (m_rombank_hi << 8));
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::radicasi_rombank_lo_w)
+{
+ //logerror("%s: radicasi_rombank_lo_w (select ROM bank) %02x\n", machine().describe_context(), data);
+ m_rombank_lo = data;
+}
+
+READ8_MEMBER(radica_eu3a14_state::radicasi_rombank_lo_r)
+{
+ return m_rombank_lo;
+}
+
+READ8_MEMBER(radica_eu3a14_state::radicasi_pal_ntsc_r)
+{
+ // how best to handle this, we probably need to run the PAL machine at 50hz
+ // the text under the radica logo differs between regions
+ logerror("%s: radicasi_pal_ntsc_r (region + more?)\n", machine().describe_context());
+ return 0xff; // NTSC
+ //return 0x00; // PAL
+}
+
+static ADDRESS_MAP_START( bank_map, AS_PROGRAM, 8, radica_eu3a14_state )
+ AM_RANGE(0x000000, 0x3fffff) AM_ROM AM_REGION("maincpu", 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( radica_eu3a14_map, AS_PROGRAM, 8, radica_eu3a14_state )
+ AM_RANGE(0x0000, 0x01ff) AM_RAM
+ AM_RANGE(0x0200, 0x1fff) AM_RAM AM_SHARE("mainram") // 200-9ff is sprites? a00 - ??? is tilemap?
+
+ AM_RANGE(0x3000, 0x3fff) AM_RAM // runs code from here
+
+ AM_RANGE(0x4800, 0x4bff) AM_RAM AM_SHARE("palram")
+
+ // similar to eu3a05, at least for pal flags and rom banking
+ AM_RANGE(0x5007, 0x5007) AM_NOP
+ AM_RANGE(0x5008, 0x5008) AM_WRITENOP // startup
+ AM_RANGE(0x5009, 0x5009) AM_NOP
+ AM_RANGE(0x500a, 0x500a) AM_WRITENOP // startup
+ AM_RANGE(0x500b, 0x500b) AM_READ(radicasi_pal_ntsc_r) AM_WRITENOP // PAL / NTSC flag at least
+ AM_RANGE(0x500c, 0x500c) AM_WRITE(radicasi_rombank_hi_w)
+ AM_RANGE(0x500d, 0x500d) AM_READWRITE(radicasi_rombank_lo_r, radicasi_rombank_lo_w)
+
+ // DMA is similar to, but not the same as eu3a05
+ AM_RANGE(0x500f, 0x5017) AM_RAM AM_SHARE("dmaparams")
+ AM_RANGE(0x5018, 0x5018) AM_READWRITE(dma_trigger_r, dma_trigger_w)
+
+ // probably GPIO like eu3a05, although it access 47/48 as unknown instead of 48/49/4a
+ AM_RANGE(0x5040, 0x5040) AM_WRITENOP
+ AM_RANGE(0x5041, 0x5041) AM_READ_PORT("IN0")
+ AM_RANGE(0x5042, 0x5042) AM_WRITENOP
+ AM_RANGE(0x5043, 0x5043) AM_NOP
+ AM_RANGE(0x5044, 0x5044) AM_WRITENOP
+ AM_RANGE(0x5045, 0x5045) AM_READ_PORT("IN1") AM_WRITENOP
+ AM_RANGE(0x5046, 0x5046) AM_WRITENOP
+ AM_RANGE(0x5047, 0x5047) AM_WRITENOP
+ AM_RANGE(0x5048, 0x5048) AM_WRITENOP
+
+ // sound appears to be the same as eu3a05
+ AM_RANGE(0x5080, 0x5091) AM_DEVREADWRITE("6ch_sound", radica6502_sound_device, radicasi_sound_addr_r, radicasi_sound_addr_w)
+ AM_RANGE(0x5092, 0x50a3) AM_DEVREADWRITE("6ch_sound", radica6502_sound_device, radicasi_sound_size_r, radicasi_sound_size_w)
+ AM_RANGE(0x50a4, 0x50a4) AM_DEVREADWRITE("6ch_sound", radica6502_sound_device, radicasi_sound_unk_r, radicasi_sound_unk_w) // read frequently on this
+ AM_RANGE(0x50a5, 0x50a5) AM_DEVREADWRITE("6ch_sound", radica6502_sound_device, radicasi_sound_trigger_r, radicasi_sound_trigger_w)
+ AM_RANGE(0x50a6, 0x50a6) AM_WRITENOP // startup
+ AM_RANGE(0x50a7, 0x50a7) AM_WRITENOP // startup
+ AM_RANGE(0x50a8, 0x50a8) AM_DEVREAD("6ch_sound", radica6502_sound_device, radicasi_50a8_r)
+ AM_RANGE(0x50a9, 0x50a9) AM_WRITENOP // startup
+
+ // video regs are here this time
+ AM_RANGE(0x5100, 0x5100) AM_RAM
+ AM_RANGE(0x5103, 0x5106) AM_RAM
+ AM_RANGE(0x5107, 0x5107) AM_RAM // on transitions, maybe layer disables?
+
+ AM_RANGE(0x5110, 0x5112) AM_RAM // startup
+ AM_RANGE(0x5113, 0x5113) AM_RAM // written with tilebase?
+ AM_RANGE(0x5114, 0x5115) AM_RAM AM_SHARE("tilebase")
+ AM_RANGE(0x5116, 0x5117) AM_RAM
+ AM_RANGE(0x5121, 0x5124) AM_RAM AM_SHARE("scrollregs")
+ AM_RANGE(0x5150, 0x5150) AM_RAM // startup
+ AM_RANGE(0x5151, 0x5153) AM_RAM // startup
+
+ AM_RANGE(0x6000, 0xdfff) AM_DEVICE("bank", address_map_bank_device, amap8)
+
+ AM_RANGE(0xfffe, 0xffff) AM_READ(irq_vector_r)
+
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("maincpu", 0x0000)
+ADDRESS_MAP_END
+
+READ8_MEMBER(radica_eu3a14_state::dma_trigger_r)
+{
+ logerror("%s: dma_trigger_r\n", machine().describe_context());
+ return 0;
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::dma_trigger_w)
+{
+ uint32_t dmasrc = (m_dmaparams[2] << 16) | (m_dmaparams[1] << 8) | (m_dmaparams[0] << 0);
+ uint32_t dmadst = (m_dmaparams[5] << 16) | (m_dmaparams[4] << 8) | (m_dmaparams[3] << 0);
+ uint32_t dmalen = (m_dmaparams[8] << 16) | (m_dmaparams[7] << 8) | (m_dmaparams[6] << 0);
+
+ //logerror("%s: dma_trigger_w %02x (src %08x dst %08x size %08x)\n", machine().describe_context(), data, dmasrc, dmadst, dmalen);
+
+ address_space& fullbankspace = m_bank->space(AS_PROGRAM);
+ address_space& destspace = m_maincpu->space(AS_PROGRAM);
+
+ if (data == 0x08)
+ {
+ for (int i = 0; i < dmalen; i++)
+ {
+ uint8_t dat = fullbankspace.read_byte(dmasrc + i);
+ destspace.write_byte(dmadst + i, dat);
+ }
+ }
+ else
+ {
+ logerror("UNKNOWN DMA TRIGGER VALUE\n");
+ }
+}
+
+
+
+static INPUT_PORTS_START( radica_eu3a14 )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) // back / backspin
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) // up and down in the menus should be the trackball?!
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x08, 0x08, "Track Y test" ) // trackball up/down direction bit? (read in interrupt, increases / decreases a counter)
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x20, 0x20, "Track X test" ) // trackball left / right direction bit? (read in interrupt, increases / decreases a counter)
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+void radica_eu3a14_state::machine_start()
+{
+}
+
+void radica_eu3a14_state::machine_reset()
+{
+ // rather be safe
+ m_maincpu->set_state_int(M6502_S, 0x1ff);
+
+ m_bank->set_bank(0x01);
+}
+
+
+TIMER_DEVICE_CALLBACK_MEMBER(radica_eu3a14_state::scanline_cb)
+{
+ // these interrupts need to occur based on how fast the trackball is
+ // being moved, the direction is read in a port.
+
+ int scanline = param;
+
+ if (scanline == 20)
+ {
+ // vertical trackball
+ m_custom_irq_vector = 0xffe0;
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0,HOLD_LINE);
+ }
+
+ if (scanline == 40)
+ {
+ // horizontal trackball
+ m_custom_irq_vector = 0xffe4;
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0,HOLD_LINE);
+ }
+}
+
+INTERRUPT_GEN_MEMBER(radica_eu3a14_state::interrupt)
+{
+ m_custom_irq = 1;
+ m_custom_irq_vector = 0xffd4;
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0,HOLD_LINE);
+}
+
+
+static const gfx_layout helper8x1x2_layout =
+{
+ 8,1,
+ RGN_FRAC(1,1),
+ 2,
+ { STEP2(0,1) },
+ { STEP8(0,2) },
+ { 0 },
+ 8 * 2
+};
+
+static const gfx_layout helper8x1x4_layout =
+{
+ 8,1,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { STEP8(0,4) },
+ { 0 },
+ 8 * 4
+};
+
+static const gfx_layout helper8x1x8_layout =
+{
+ 8,1,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { 0 },
+ 8 * 8
+};
+
+// background
+static const gfx_layout helper16x16x8_layout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP16(0,8) },
+ { STEP16(0,16*8) },
+ 16 * 16 * 8
+};
+
+static GFXDECODE_START( helper )
+ GFXDECODE_ENTRY( "maincpu", 0, helper8x1x2_layout, 0x0, 128 )
+ GFXDECODE_ENTRY( "maincpu", 0, helper8x1x4_layout, 0x0, 32 )
+ GFXDECODE_ENTRY( "maincpu", 0, helper8x1x8_layout, 0x0, 2 )
+ GFXDECODE_ENTRY( "maincpu", 0, helper16x16x8_layout, 0x0, 2 )
+GFXDECODE_END
+
+
+
+MACHINE_CONFIG_START(radica_eu3a14_state::radica_eu3a14)
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",M6502,XTAL(21'477'272)/2) // marked as 21'477'270
+ MCFG_CPU_PROGRAM_MAP(radica_eu3a14_map)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", radica_eu3a14_state, interrupt)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", radica_eu3a14_state, scanline_cb, "screen", 0, 1)
+
+ MCFG_DEVICE_ADD("bank", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(bank_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
+ MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8)
+ MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(24)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x8000)
+
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", helper)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
+ MCFG_SCREEN_UPDATE_DRIVER(radica_eu3a14_state, screen_update)
+ MCFG_SCREEN_SIZE(32*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
+
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_PALETTE_ADD("palette", 512)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_DEVICE_ADD("6ch_sound", RADICA6502_SOUND, 8000)
+ MCFG_RADICA6502_SOUND_SPACE_READ_CB(READ8(radica_eu3a14_state, read_full_space))
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+MACHINE_CONFIG_END
+
+ROM_START( rad_gtg )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "goldentee.bin", 0x000000, 0x400000, CRC(b1985c63) SHA1(c42a59fcb665eb801d9ca5312b90e39333e52de4) )
+ROM_END
+
+CONS( 2006, rad_gtg, 0, 0, radica_eu3a14, radica_eu3a14, radica_eu3a14_state, 0, "Radica (licensed from Incredible Technologies)", "Golden Tee Golf: Home Edition", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
index 0eee52ad909..0e870df1a55 100644
--- a/src/mame/drivers/vii.cpp
+++ b/src/mame/drivers/vii.cpp
@@ -1342,12 +1342,18 @@ ROM_START( wirels60 )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 2004, batmantv, vii, 0, batman, batman, vii_state, batman, "JAKKS Pacific Inc / HotGen Ltd", "The Batman", MACHINE_NO_SOUND )
+
+// VTech systems
CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vii_state, vsmile, "VTech", "V.Smile (US)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
CONS( 2005, vsmileg, vsmile, 0, vsmile, vsmile, vii_state, vsmile, "VTech", "V.Smile (Germany)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
CONS( 2005, vsmilef, vsmile, 0, vsmile, vsmile, vii_state, vsmile, "VTech", "V.Smile (France)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
CONS( 2005, vsmileb, 0, 0, vsmile, vsmile, vii_state, vsmile, "VTech", "V.Smile Baby (US)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
-CONS( 2007, vii, 0, 0, vii, vii, vii_state, vii, "Jungle Soft / KenSingTon / Chintendo / Siatronics", "Vii", MACHINE_NO_SOUND )
-CONS( 2008, walle, vii, 0, batman, walle, vii_state, walle, "JAKKS Pacific Inc", "Wall-E", MACHINE_NO_SOUND )
+
+// Jungle Soft TV games
+CONS( 2007, vii, 0, 0, vii, vii, vii_state, vii, "Jungle Soft / KenSingTon / Chintendo / Siatronics", "Vii", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // some games run, others crash
CONS( 2010, zone60, 0, 0, wirels60, wirels60, vii_state, wirels60, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_NO_SOUND )
CONS( 2010, wirels60, 0, 0, wirels60, wirels60, vii_state, wirels60, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_NO_SOUND )
+
+// JAKKS Pacific Inc TV games
+CONS( 2004, batmantv, 0, 0, batman, batman, vii_state, batman, "JAKKS Pacific Inc / HotGen Ltd", "The Batman", MACHINE_NO_SOUND )
+CONS( 2008, walle, 0, 0, batman, walle, vii_state, walle, "JAKKS Pacific Inc", "Wall-E", MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/vtech_eu3a12.cpp b/src/mame/drivers/vtech_eu3a12.cpp
new file mode 100644
index 00000000000..9ad004d69a0
--- /dev/null
+++ b/src/mame/drivers/vtech_eu3a12.cpp
@@ -0,0 +1,46 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+
+// CPU die is an Elan EU3A12, it isn't clear what it is compatible with (16-bit?)
+
+#include "emu.h"
+#include "screen.h"
+
+class vreadere_state : public driver_device
+{
+public:
+ vreadere_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ { }
+
+ virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void vreadere(machine_config &config);
+};
+
+uint32_t vreadere_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+static INPUT_PORTS_START( vreadere )
+INPUT_PORTS_END
+
+MACHINE_CONFIG_START(vreadere_state::vreadere)
+ /* basic machine hardware */
+ // MCFG_CPU_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ MCFG_SCREEN_UPDATE_DRIVER( vreadere_state, screen_update )
+MACHINE_CONFIG_END
+
+ROM_START( vreadere )
+ ROM_REGION(0x400000, "maincpu", 0)
+ ROM_LOAD( "27-08291.U2", 0x000000, 0x400000, CRC(f2eb801f) SHA1(33e2d28ab2f04b17f66880898832265d50de54d4) )
+ROM_END
+
+COMP( 2004, vreadere, 0, 0, vreadere, vreadere, vreadere_state, 0, "Video Technology", "Reader Laptop E (Germany)", MACHINE_IS_SKELETON ) \ No newline at end of file
diff --git a/src/mame/drivers/vtech_unk1.cpp b/src/mame/drivers/vtech_unk1.cpp
new file mode 100644
index 00000000000..07c9e8b4593
--- /dev/null
+++ b/src/mame/drivers/vtech_unk1.cpp
@@ -0,0 +1,98 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+
+// Unknown CPU type
+
+/*
+
+Leader 8008 CX (German version)
+
++---+-----------+-----+-----------------------+-----+-----+-----+
+| |SERIAL PORT| |PARALLEL PORT (PRINTER)| |MOUSE| |
+| +-----------+ +-----------------------+ +-----+ |
+| |
+| |
+| |
+| |
+| +----+ |
+| | A0 | |
+| +----+ |
+| |
+| |
+| +--------+ |
+| | | |
+| CPU | VTECH | +------+ |
+| |LHMV5GNS| | | |
+| | | |GM76U8| |
+| |1999 | |128CLF| |
+| |27-6393-| |W85 | |
+| +-----------+ |11 | | | |
+| |27-6296-0-0| | | | | |
+| |47C241M NH7| | | +------+ |
+| +-----------+ +--------+ |
+| |
+| |
+| |
+| |
++---------------------------------------------------------------+
+
+CPU = epoxy blob
+GM76U8128CLFW85 = LGS / Hynix 131,072 WORDS x 8 BIT CMOS SRAM
+TMP47C241MG = TCLS-47 series 4-bit CPU with 2048x8 internal ROM
+
+*/
+
+#include "emu.h"
+#include "screen.h"
+
+class gl8008cx_state : public driver_device
+{
+public:
+ gl8008cx_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ { }
+
+ virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void gl8008cx(machine_config &config);
+};
+
+uint32_t gl8008cx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+static INPUT_PORTS_START( gl8008cx )
+INPUT_PORTS_END
+
+MACHINE_CONFIG_START(gl8008cx_state::gl8008cx)
+ /* basic machine hardware */
+ // MCFG_CPU_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ MCFG_SCREEN_UPDATE_DRIVER( gl8008cx_state, screen_update )
+MACHINE_CONFIG_END
+
+ROM_START( gl8008cx )
+ ROM_REGION(0x200000, "maincpu", 0)
+ ROM_LOAD( "27-6393-11.u1", 0x0000, 0x200000, CRC(fd49db46) SHA1(fc55bb31f42068f9d6cc8e2c2f419c3c4edb4fe6) )
+
+ ROM_REGION(0x800, "subcpu", 0)
+ ROM_LOAD( "27-6296-0-0.u3", 0x000, 0x800, NO_DUMP )
+ROM_END
+
+ROM_START( bs9009cx )
+ ROM_REGION(0x200000, "maincpu", 0)
+ ROM_LOAD( "27-6603-01.u1", 0x0000, 0x200000, CRC(2c299f65) SHA1(44b37007a7c4087d7c2bd8c24907402bfe445ba4) )
+
+ ROM_REGION(0x800, "subcpu", 0)
+ ROM_LOAD( "mcu.u5", 0x000, 0x800, NO_DUMP )
+ROM_END
+
+
+COMP( 1999, gl8008cx, 0, 0, gl8008cx, gl8008cx, gl8008cx_state, 0, "Video Technology", "Genius Leader 8008 CX (Germany)", MACHINE_IS_SKELETON)
+COMP( 1999, bs9009cx, 0, 0, gl8008cx, gl8008cx, gl8008cx_state, 0, "Video Technology", "BrainStation 9009 CXL (Germany)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/vtech_unk2.cpp b/src/mame/drivers/vtech_unk2.cpp
new file mode 100644
index 00000000000..a14db1abdf0
--- /dev/null
+++ b/src/mame/drivers/vtech_unk2.cpp
@@ -0,0 +1,46 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+
+// Unknown CPU type
+
+#include "emu.h"
+#include "screen.h"
+
+class glmmc_state : public driver_device
+{
+public:
+ glmmc_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ { }
+
+ virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void glmmc(machine_config &config);
+};
+
+uint32_t glmmc_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+static INPUT_PORTS_START( glmmc )
+INPUT_PORTS_END
+
+MACHINE_CONFIG_START(glmmc_state::glmmc)
+ /* basic machine hardware */
+ // MCFG_CPU_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ MCFG_SCREEN_UPDATE_DRIVER( glmmc_state, screen_update )
+MACHINE_CONFIG_END
+
+ROM_START( glmmc )
+ ROM_REGION(0x200000, "maincpu", 0)
+ ROM_LOAD( "27-5889-00.bin", 0x000000, 0x080000, CRC(5e2c6359) SHA1(cc01c7bd5c87224b63dd1044db5a36a5cb7824f1) )
+ROM_END
+
+COMP( 19??, glmmc, 0, 0, glmmc, glmmc, glmmc_state, 0, "Video Technology", "Genius Leader Master Mega Color (Germany)", MACHINE_IS_SKELETON)
diff --git a/src/mame/includes/megadrvb.h b/src/mame/includes/megadriv_acbl.h
index 97f288f03ae..709bce45f75 100644
--- a/src/mame/includes/megadrvb.h
+++ b/src/mame/includes/megadriv_acbl.h
@@ -1,17 +1,15 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
+#ifndef MAME_INCLUDES_MEGADRIV_ACBL_H
+#define MAME_INCLUDES_MEGADRIV_ACBL_H
+
class md_boot_state : public md_base_state
{
public:
md_boot_state(const machine_config &mconfig, device_type type, const char *tag)
: md_base_state(mconfig, type, tag) { m_protcount = 0;}
- // bootleg specific
- int m_aladmdb_mcu_port;
-
- int m_protcount;
-
DECLARE_DRIVER_INIT(aladmdb);
DECLARE_DRIVER_INIT(mk3mdb);
DECLARE_DRIVER_INIT(ssf2mdb);
@@ -38,4 +36,12 @@ public:
void puckpkmn(machine_config &config);
void jzth(machine_config &config);
void puckpkmna(machine_config &config);
+
+private:
+ // bootleg specific
+ int m_aladmdb_mcu_port;
+
+ int m_protcount;
};
+
+#endif // MAME_INCLUDES_MEGADRIV_ACBL_H
diff --git a/src/mame/includes/megadriv_rad.h b/src/mame/includes/megadriv_rad.h
new file mode 100644
index 00000000000..c9d92839f39
--- /dev/null
+++ b/src/mame/includes/megadriv_rad.h
@@ -0,0 +1,34 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_INCLUDES_MEGADRIV_RAD_H
+#define MAME_INCLUDES_MEGADRIV_RAD_H
+
+class megadriv_radica_state : public md_base_state
+{
+public:
+ megadriv_radica_state(const machine_config &mconfig, device_type type, const char *tag)
+ : md_base_state(mconfig, type, tag),
+ m_bank(0),
+ m_rom(*this, "maincpu")
+ {}
+
+ DECLARE_DRIVER_INIT(megadriv_radica_6button_pal);
+
+ DECLARE_MACHINE_START(megadriv_radica_6button);
+ DECLARE_MACHINE_START(megadriv_radica_3button);
+ DECLARE_MACHINE_RESET(megadriv_radica);
+
+ DECLARE_READ16_MEMBER(read);
+ DECLARE_READ16_MEMBER(read_a13);
+
+ void megadriv_radica_6button_pal(machine_config &config);
+ void megadriv_radica_3button_ntsc(machine_config &config);
+ void megadriv_radica_3button_pal(machine_config &config);
+
+private:
+ int m_bank;
+ required_region_ptr<uint16_t> m_rom;
+};
+
+#endif // MAME_INCLUDES_MEGADRIV_RAD_H
diff --git a/src/mame/machine/rad_eu3a05gpio.cpp b/src/mame/machine/rad_eu3a05gpio.cpp
new file mode 100644
index 00000000000..c98109766b7
--- /dev/null
+++ b/src/mame/machine/rad_eu3a05gpio.cpp
@@ -0,0 +1,84 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "rad_eu3a05gpio.h"
+
+DEFINE_DEVICE_TYPE(RADICA6502_GPIO, radica6502_gpio_device, "radica6502gpio", "Radica 6502 GPIO")
+
+radica6502_gpio_device::radica6502_gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, RADICA6502_GPIO, tag, owner, clock)
+ , m_space_read0_cb(*this)
+ , m_space_read1_cb(*this)
+ , m_space_read2_cb(*this)
+{
+}
+
+void radica6502_gpio_device::device_start()
+{
+ m_space_read0_cb.resolve_safe(0xff);
+ m_space_read1_cb.resolve_safe(0xff);
+ m_space_read2_cb.resolve_safe(0xff);
+}
+
+void radica6502_gpio_device::device_reset()
+{
+ for (int i = 0; i < 3; i++)
+ {
+ m_ddr[i] = 0;
+ m_unk[i] = 0;
+ }
+}
+
+uint8_t radica6502_gpio_device::read_port_data(int which)
+{
+ //todo, actually use the direction registers
+ switch (which)
+ {
+ case 0: return m_space_read0_cb();
+ case 1: return m_space_read1_cb();
+ case 2: return m_space_read2_cb();
+ }
+
+ return 0xff;
+}
+
+uint8_t radica6502_gpio_device::read_direction(int which)
+{
+ return m_ddr[which];
+}
+
+READ8_MEMBER(radica6502_gpio_device::gpio_r)
+{
+
+ int port = offset/2;
+ if (!(offset&1)) return read_direction(port);
+ else return read_port_data(port);
+}
+
+void radica6502_gpio_device::write_port_data(int which, uint8_t data)
+{
+ //todo, actually use the direction registers
+ logerror("%s: write_port_data (port %d) %02x (direction register %02x)\n", machine().describe_context(), which, data, m_ddr[which]);
+}
+
+void radica6502_gpio_device::write_direction(int which, uint8_t data)
+{
+ logerror("%s: write_direction (port %d) %02x\n", machine().describe_context(), which, data);
+ m_ddr[which] = data;
+}
+
+WRITE8_MEMBER(radica6502_gpio_device::gpio_w)
+{
+
+ int port = offset/2;
+ if (!(offset&1)) return write_direction(port, data);
+ else return write_port_data(port, data);
+}
+
+WRITE8_MEMBER(radica6502_gpio_device::gpio_unk_w)
+{
+ logerror("%s: gpio_unk_w (port %d) %02x (direction register %02x)\n", machine().describe_context(), offset, data, m_ddr[offset]);
+}
+
+
diff --git a/src/mame/machine/rad_eu3a05gpio.h b/src/mame/machine/rad_eu3a05gpio.h
new file mode 100644
index 00000000000..ad72f61008a
--- /dev/null
+++ b/src/mame/machine/rad_eu3a05gpio.h
@@ -0,0 +1,52 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_AUDIO_RAD_EU3A05GPIO_H
+#define MAME_AUDIO_RAD_EU3A05GPIO_H
+
+#define MCFG_RADICA6502_GPIO_READ_PORT0_CB(_devcb) \
+ devcb = &radica6502_gpio_device::set_gpio_read_0_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_RADICA6502_GPIO_READ_PORT1_CB(_devcb) \
+ devcb = &radica6502_gpio_device::set_gpio_read_1_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_RADICA6502_GPIO_READ_PORT2_CB(_devcb) \
+ devcb = &radica6502_gpio_device::set_gpio_read_2_callback(*device, DEVCB_##_devcb);
+
+
+class radica6502_gpio_device : public device_t
+{
+public:
+ radica6502_gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <class Object> static devcb_base &set_gpio_read_0_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read0_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_gpio_read_1_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read1_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_gpio_read_2_callback(device_t &device, Object &&cb) { return downcast<radica6502_gpio_device &>(device).m_space_read2_cb.set_callback(std::forward<Object>(cb)); }
+
+ DECLARE_READ8_MEMBER(gpio_r);
+ DECLARE_WRITE8_MEMBER(gpio_w);
+
+ DECLARE_WRITE8_MEMBER(gpio_unk_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_read8 m_space_read0_cb;
+ devcb_read8 m_space_read1_cb;
+ devcb_read8 m_space_read2_cb;
+
+ uint8_t read_port_data(int which);
+ uint8_t read_direction(int which);
+ void write_port_data(int which, uint8_t data);
+ void write_direction(int which, uint8_t data);
+
+ uint8_t m_ddr[3];
+ uint8_t m_unk[3];
+};
+
+DECLARE_DEVICE_TYPE(RADICA6502_GPIO, radica6502_gpio_device)
+
+#endif // MAME_AUDIO_RAD_EU3A05GPIO_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 8348fe9211f..0386ebf63c5 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -13742,13 +13742,9 @@ suprpokrb // (c) 1986 Grayhound Electronics
geneve // 1987? Myarc Geneve 9640
@source:geniusiq.cpp
-bs9009cx // 1999 BrainStation 9009 CXL (Germany)
-gl8008cx // 1999 Genius Leader 8008 CX (Germany)
-glmmc // 199? Genius Master Mega Color
iq128 // 1997 Genius IQ 128 (Germany)
iq128_fr // 1997 Genius PC (France)
iqtv512 // IQ TV512 (Germany)
-iqunlim // 199? IQ Unlimited (680x0)
itunlim // 199? IT Unlimited
@source:genpc.cpp
@@ -15388,6 +15384,9 @@ iq151 //
grndtour // (c) 1993
iqblock // (c) 1993
+@source:iqunlim.cpp
+iqunlim // 199? IQ Unlimited (680x0)
+
@source:iris3130.cpp
sgi_ip2 // IP2: IRIS 3xx0, 68020, 16MHz
@@ -20499,7 +20498,7 @@ wmegam2 // 1993 Victor Wondermega M2 (Japan)
xeye // 1993 JVC X'eye (USA)
dcat16 //
-@source:megadrvb.cpp
+@source:megadriv_acbl.cpp
aladmdb // MegaDrive-based hack
mk3mdb // MegaDrive-based hack
sonic2mb // MegaDrive-based hack
@@ -20507,6 +20506,11 @@ srmdb // MegaDrive-based hack
ssf2mdb // MegaDrive-based hack
topshoot // (c) 1995 Sun Mixing
+@source:megadriv_rad.cpp
+rad_sf // (c)2004 Radica
+rad_gen1 // (c)2004 Radica
+rad_ssoc // (c)2004 Radica
+
@source:megaphx.cpp
megaphx // (c) 1991 Dinamic / Inder
@@ -32429,7 +32433,10 @@ r9751 // ROLM 9751 phone system
@source:rabbit.cpp
rabbit // (c) 1997 Electronic Arts
-@source:radicasi.cpp
+@source:rad_eu3a14.cpp
+rad_gtg
+
+@source:rad_eu3a05.cpp
rad_sinv
rad_tetr
@@ -37991,6 +37998,16 @@ laser350 // 1984? Laser 350
laser500 // 1984? Laser 500
laser700 // 1984? Laser 700
+@source:vtech_eu3a12.cpp
+vreadere
+
+@source:vtech_unk1.cpp
+bs9009cx // 1999 BrainStation 9009 CXL (Germany)
+gl8008cx // 1999 Genius Leader 8008 CX (Germany)
+
+@source:vtech_unk2.cpp
+glmmc // 199? Genius Master Mega Color
+
@source:vulgus.cpp
mach9 // bootleg (ITISA)
vulgus // 5/1984 (c) 1984
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index a60758c0a67..0f8a13d12b2 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -309,6 +309,7 @@ intv.cpp
ipc.cpp
ipds.cpp
iq151.cpp
+iqunlim.cpp
iris3130.cpp
irisha.cpp
isbc.cpp
@@ -374,6 +375,7 @@ mc8030.cpp
mcb216.cpp
mccpm.cpp
megadriv.cpp
+megadriv_rad.cpp
mekd2.cpp
mephisto.cpp
mephisto_montec.cpp
@@ -566,7 +568,8 @@ qvt201.cpp
qvt6800.cpp
qx10.cpp
r9751.cpp
-radicasi.cpp
+rad_eu3a05.cpp
+rad_eu3a14.cpp
radio86.cpp
rainbow.cpp
rambo.cpp
@@ -765,6 +768,9 @@ vt520.cpp
vta2000.cpp
vtech1.cpp
vtech2.cpp
+vtech_eu3a12.cpp
+vtech_unk1.cpp
+vtech_unk2.cpp
wangpc.cpp
wicat.cpp
wswan.cpp