mirror of
https://github.com/holub/mame
synced 2025-10-06 00:54:22 +03:00
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)
This commit is contained in:
parent
9f5c4c5ceb
commit
c3709b0558
@ -31246,30 +31246,6 @@ Notice that these are not working on real hardware due to bugged code with VDP i
|
|||||||
</part>
|
</part>
|
||||||
</software>
|
</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">
|
<software name="tomclown">
|
||||||
<description>Tom Clown (USA)</description>
|
<description>Tom Clown (USA)</description>
|
||||||
<year>1993</year>
|
<year>1993</year>
|
||||||
@ -32901,6 +32877,4 @@ This dump is either a bad dump or a wrongly patched one.
|
|||||||
</dataarea>
|
</dataarea>
|
||||||
</part>
|
</part>
|
||||||
</software>
|
</software>
|
||||||
|
|
||||||
|
|
||||||
</softwarelist>
|
</softwarelist>
|
||||||
|
@ -3182,8 +3182,8 @@ files {
|
|||||||
MAME_DIR .. "src/mame/machine/segabb.h",
|
MAME_DIR .. "src/mame/machine/segabb.h",
|
||||||
MAME_DIR .. "src/mame/machine/megadriv.cpp",
|
MAME_DIR .. "src/mame/machine/megadriv.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/megadriv.h",
|
MAME_DIR .. "src/mame/includes/megadriv.h",
|
||||||
MAME_DIR .. "src/mame/drivers/megadrvb.cpp",
|
MAME_DIR .. "src/mame/drivers/megadriv_acbl.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/megadrvb.h",
|
MAME_DIR .. "src/mame/includes/megadriv_acbl.h",
|
||||||
MAME_DIR .. "src/mame/drivers/megaplay.cpp",
|
MAME_DIR .. "src/mame/drivers/megaplay.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/megatech.cpp",
|
MAME_DIR .. "src/mame/drivers/megatech.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/calcune.cpp",
|
MAME_DIR .. "src/mame/drivers/calcune.cpp",
|
||||||
|
@ -2836,6 +2836,8 @@ files {
|
|||||||
MAME_DIR .. "src/mame/machine/gdrom.h",
|
MAME_DIR .. "src/mame/machine/gdrom.h",
|
||||||
MAME_DIR .. "src/mame/drivers/megadriv.cpp",
|
MAME_DIR .. "src/mame/drivers/megadriv.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/megadriv.h",
|
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/segapico.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/sega_sawatte.cpp",
|
MAME_DIR .. "src/mame/drivers/sega_sawatte.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/segapm.cpp",
|
MAME_DIR .. "src/mame/drivers/segapm.cpp",
|
||||||
@ -3367,6 +3369,10 @@ files {
|
|||||||
MAME_DIR .. "src/mame/drivers/crvision.cpp",
|
MAME_DIR .. "src/mame/drivers/crvision.cpp",
|
||||||
MAME_DIR .. "src/mame/includes/crvision.h",
|
MAME_DIR .. "src/mame/includes/crvision.h",
|
||||||
MAME_DIR .. "src/mame/drivers/geniusiq.cpp",
|
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/laser3k.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/lcmate2.cpp",
|
MAME_DIR .. "src/mame/drivers/lcmate2.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/pc4.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/qvt201.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/qvt6800.cpp",
|
MAME_DIR .. "src/mame/drivers/qvt6800.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/rd100.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/rvoice.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/sacstate.cpp",
|
MAME_DIR .. "src/mame/drivers/sacstate.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/sartorius.cpp",
|
MAME_DIR .. "src/mame/drivers/sartorius.cpp",
|
||||||
|
@ -229,7 +229,7 @@ const double XTAL::known_xtals[] = {
|
|||||||
21'052'600, /* NEC PC-98xx pixel clock */
|
21'052'600, /* NEC PC-98xx pixel clock */
|
||||||
21'060'000, /* HP 264x display clock (60 Hz configuration) */
|
21'060'000, /* HP 264x display clock (60 Hz configuration) */
|
||||||
21'254'400, /* TeleVideo 970 132-column display clock */
|
21'254'400, /* TeleVideo 970 132-column display clock */
|
||||||
21'281'370, /* Radica Tetris */
|
21'281'370, /* Radica Tetris (PAL) */
|
||||||
21'300'000,
|
21'300'000,
|
||||||
21'477'272, /* BMC bowling, some Data East 90's games, Vtech Socrates; (6x NTSC subcarrier) */
|
21'477'272, /* BMC bowling, some Data East 90's games, Vtech Socrates; (6x NTSC subcarrier) */
|
||||||
22'000'000,
|
22'000'000,
|
||||||
|
@ -694,7 +694,7 @@ mcr68.cpp
|
|||||||
meadows.cpp
|
meadows.cpp
|
||||||
meadwttl.cpp
|
meadwttl.cpp
|
||||||
mediagx.cpp
|
mediagx.cpp
|
||||||
megadrvb.cpp
|
megadriv_acbl.cpp
|
||||||
megaphx.cpp
|
megaphx.cpp
|
||||||
megaplay.cpp
|
megaplay.cpp
|
||||||
megasys1.cpp
|
megasys1.cpp
|
||||||
|
266
src/mame/audio/rad_eu3a05.cpp
Normal file
266
src/mame/audio/rad_eu3a05.cpp
Normal file
@ -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;
|
||||||
|
}
|
64
src/mame/audio/rad_eu3a05.h
Normal file
64
src/mame/audio/rad_eu3a05.h
Normal file
@ -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
|
@ -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;
|
} 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)
|
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]);
|
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)
|
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);
|
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)
|
static ADDRESS_MAP_START(geniusiq_mem, AS_PROGRAM, 16, geniusiq_state)
|
||||||
ADDRESS_MAP_UNMAP_HIGH
|
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 )
|
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
|
INPUT_PORTS_END
|
||||||
|
|
||||||
static INPUT_PORTS_START( gl8008cx )
|
|
||||||
INPUT_PORTS_END
|
|
||||||
|
|
||||||
void geniusiq_state::machine_start()
|
void geniusiq_state::machine_start()
|
||||||
{
|
{
|
||||||
@ -831,20 +727,6 @@ MACHINE_CONFIG_DERIVED(geniusiq_state::iqtv512, iq128)
|
|||||||
MCFG_AMD_29F040_ADD("flash")
|
MCFG_AMD_29F040_ADD("flash")
|
||||||
MACHINE_CONFIG_END
|
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 definition */
|
||||||
|
|
||||||
ROM_START( iq128 )
|
ROM_START( iq128 )
|
||||||
@ -862,45 +744,15 @@ ROM_START( iqtv512 )
|
|||||||
ROM_LOAD( "27-06171-000.bin", 0x0000, 0x200000, CRC(2597af70) SHA1(9db8151a84517407d380424410b6fa0003ceb1eb) )
|
ROM_LOAD( "27-06171-000.bin", 0x0000, 0x200000, CRC(2597af70) SHA1(9db8151a84517407d380424410b6fa0003ceb1eb) )
|
||||||
ROM_END
|
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_START( itunlim )
|
||||||
ROM_REGION(0x200000, "maincpu", 0)
|
ROM_REGION(0x200000, "maincpu", 0)
|
||||||
ROM_LOAD( "27-06124-002.u3", 0x000000, 0x200000, CRC(0c0753ce) SHA1(d22504d583ca8d6a9d2f56fbaa3e1d52c442a1e9) )
|
ROM_LOAD( "27-06124-002.u3", 0x000000, 0x200000, CRC(0c0753ce) SHA1(d22504d583ca8d6a9d2f56fbaa3e1d52c442a1e9) )
|
||||||
ROM_END
|
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 */
|
/* Driver */
|
||||||
|
|
||||||
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
|
// 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, 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( 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( 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( 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)
|
|
||||||
|
@ -42,7 +42,7 @@ Unfortunately it's read protected.
|
|||||||
#include "sound/2612intf.h"
|
#include "sound/2612intf.h"
|
||||||
#include "sound/sn76496.h"
|
#include "sound/sn76496.h"
|
||||||
#include "includes/megadriv.h"
|
#include "includes/megadriv.h"
|
||||||
#include "includes/megadrvb.h"
|
#include "includes/megadriv_acbl.h"
|
||||||
|
|
||||||
static INPUT_PORTS_START( hshavoc )
|
static INPUT_PORTS_START( hshavoc )
|
||||||
PORT_START("IN0") /* 16bit */
|
PORT_START("IN0") /* 16bit */
|
||||||
|
105
src/mame/drivers/iqunlim.cpp
Normal file
105
src/mame/drivers/iqunlim.cpp
Normal file
@ -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)
|
@ -258,7 +258,7 @@ connector, but of course, I can be wrong.
|
|||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "includes/megadriv.h"
|
#include "includes/megadriv.h"
|
||||||
#include "includes/megadrvb.h"
|
#include "includes/megadriv_acbl.h"
|
||||||
|
|
||||||
|
|
||||||
/************************************ Megadrive Bootlegs *************************************/
|
/************************************ Megadrive Bootlegs *************************************/
|
191
src/mame/drivers/megadriv_rad.cpp
Normal file
191
src/mame/drivers/megadriv_rad.cpp
Normal file
@ -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
|
||||||
|
|
@ -51,7 +51,7 @@ Notes:
|
|||||||
#include "sound/2612intf.h"
|
#include "sound/2612intf.h"
|
||||||
|
|
||||||
#include "includes/megadriv.h"
|
#include "includes/megadriv.h"
|
||||||
#include "includes/megadrvb.h"
|
#include "includes/megadriv_acbl.h"
|
||||||
|
|
||||||
/* Puckman Pockimon Input Ports */
|
/* Puckman Pockimon Input Ports */
|
||||||
static INPUT_PORTS_START( puckpkmn )
|
static INPUT_PORTS_START( puckpkmn )
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
---
|
---
|
||||||
Other games that might be on this hardware
|
Other games that might be on this hardware
|
||||||
|
|
||||||
Golden Tee Home Edition
|
|
||||||
Skateboarding
|
Skateboarding
|
||||||
+ some of the earlier PlayTV games (not Soccer, that's XaviX, see xavix.cpp)
|
+ some of the earlier PlayTV games (not Soccer, that's XaviX, see xavix.cpp)
|
||||||
|
|
||||||
@ -159,11 +158,13 @@
|
|||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
#include "machine/bankdev.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:
|
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),
|
: driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_ram(*this, "ram"),
|
m_ram(*this, "ram"),
|
||||||
@ -285,267 +286,7 @@ private:
|
|||||||
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void radica_eu3a05_state::video_start()
|
||||||
#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()
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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)
|
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);
|
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
|
// 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);
|
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;
|
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
|
/* this doesn't handle 8x8 4bpp, haven't seen it used
|
||||||
nor is there support for horizontal scrolling etc.
|
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);
|
bitmap.fill(0, cliprect);
|
||||||
|
|
||||||
@ -893,36 +634,36 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b
|
|||||||
|
|
||||||
// System control
|
// System control
|
||||||
|
|
||||||
WRITE8_MEMBER(radica_6502_state::radicasi_rombank_hi_w)
|
WRITE8_MEMBER(radica_eu3a05_state::radicasi_rombank_hi_w)
|
||||||
{
|
{
|
||||||
// written with the banking?
|
// 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_rombank_hi = data;
|
||||||
|
|
||||||
m_bank->set_bank(m_rombank_lo | (m_rombank_hi << 8));
|
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;
|
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;
|
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
|
// how best to handle this, we probably need to run the PAL machine at 50hz
|
||||||
// the text under the radica logo differs between regions
|
// 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 0xff; // NTSC
|
||||||
//return 0x00; // PAL
|
//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..
|
/* 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();
|
return machine().rand();
|
||||||
}
|
}
|
||||||
@ -944,71 +685,71 @@ READ8_MEMBER(radica_6502_state::radicasi_5003_r)
|
|||||||
|
|
||||||
// Tile bases
|
// 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;
|
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;
|
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;
|
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;
|
return m_tile_gfxbase_hi_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sprite Tile bases
|
// 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;
|
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;
|
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;
|
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;
|
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];
|
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;
|
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
|
c3 8bpp 16x16 1100 0011
|
||||||
e3 4bpp 16x16 1110 0011
|
e3 4bpp 16x16 1110 0011
|
||||||
@ -1020,103 +761,103 @@ WRITE8_MEMBER(radica_6502_state::radicasi_vidctrl_w)
|
|||||||
|
|
||||||
// DMA device
|
// 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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
//m_dmatrg_data = data;
|
||||||
|
|
||||||
address_space& fullbankspace = m_bank->space(AS_PROGRAM);
|
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?
|
// 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;
|
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;
|
m_50a9_data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sound callback
|
// 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);
|
address_space& fullbankspace = m_bank->space(AS_PROGRAM);
|
||||||
return fullbankspace.read_byte(offset);
|
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?
|
// can the addresses move around?
|
||||||
AM_RANGE(0x0000, 0x05ff) AM_RAM AM_SHARE("ram")
|
AM_RANGE(0x0000, 0x05ff) AM_RAM AM_SHARE("ram")
|
||||||
AM_RANGE(0x0600, 0x3dff) AM_RAM AM_SHARE("vram")
|
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
|
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(0x000000, 0x3fffff) AM_ROM AM_REGION("maincpu", 0)
|
||||||
AM_RANGE(0x400000, 0x40ffff) AM_RAM // ?? only ever cleared maybe a mirror of below?
|
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
|
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
|
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)
|
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)
|
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 = 0;
|
||||||
m_custom_irq_vector = 0x0000;
|
m_custom_irq_vector = 0x0000;
|
||||||
@ -1487,7 +1051,7 @@ void radica_6502_state::machine_start()
|
|||||||
m_bank->set_bank(0x7f);
|
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
|
/* the 6502 core sets the default stack value to 0x01bd
|
||||||
and Tetris does not initialize it to anything else
|
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_ENTRY( "maincpu", 0, texture_helper_8bpp_layout, 0x0, 1 )
|
||||||
GFXDECODE_END
|
GFXDECODE_END
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(radica_6502_state::interrupt)
|
INTERRUPT_GEN_MEMBER(radica_eu3a05_state::interrupt)
|
||||||
{
|
{
|
||||||
m_custom_irq = 1;
|
m_custom_irq = 1;
|
||||||
m_custom_irq_vector = 0xffd4;
|
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 */
|
/* 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_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_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_ADD("bank", ADDRESS_MAP_BANK, 0)
|
||||||
MCFG_DEVICE_PROGRAM_MAP(radicasi_bank_map)
|
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_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_SCREEN_REFRESH_RATE(60)
|
||||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
|
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_SIZE(32*8, 32*8)
|
||||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
|
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
|
||||||
MCFG_SCREEN_PALETTE("palette")
|
MCFG_SCREEN_PALETTE("palette")
|
||||||
@ -1614,7 +1178,7 @@ MACHINE_CONFIG_START(radica_6502_state::radicasi)
|
|||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
MCFG_DEVICE_ADD("6ch_sound", RADICA6502_SOUND, 8000)
|
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)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
@ -1635,5 +1199,5 @@ ROM_START( rad_sinv )
|
|||||||
ROM_RELOAD(0x300000, 0x100000)
|
ROM_RELOAD(0x300000, 0x100000)
|
||||||
ROM_END
|
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_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_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_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"
|
722
src/mame/drivers/rad_eu3a14.cpp
Normal file
722
src/mame/drivers/rad_eu3a14.cpp
Normal file
@ -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 )
|
@ -1342,12 +1342,18 @@ ROM_START( wirels60 )
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
|
// 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, 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, 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, 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( 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, 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 )
|
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 )
|
||||||
|
46
src/mame/drivers/vtech_eu3a12.cpp
Normal file
46
src/mame/drivers/vtech_eu3a12.cpp
Normal file
@ -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 )
|
98
src/mame/drivers/vtech_unk1.cpp
Normal file
98
src/mame/drivers/vtech_unk1.cpp
Normal file
@ -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)
|
46
src/mame/drivers/vtech_unk2.cpp
Normal file
46
src/mame/drivers/vtech_unk2.cpp
Normal file
@ -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)
|
@ -1,17 +1,15 @@
|
|||||||
// license:BSD-3-Clause
|
// license:BSD-3-Clause
|
||||||
// copyright-holders:David Haywood
|
// copyright-holders:David Haywood
|
||||||
|
|
||||||
|
#ifndef MAME_INCLUDES_MEGADRIV_ACBL_H
|
||||||
|
#define MAME_INCLUDES_MEGADRIV_ACBL_H
|
||||||
|
|
||||||
class md_boot_state : public md_base_state
|
class md_boot_state : public md_base_state
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
md_boot_state(const machine_config &mconfig, device_type type, const char *tag)
|
md_boot_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: md_base_state(mconfig, type, tag) { m_protcount = 0;}
|
: 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(aladmdb);
|
||||||
DECLARE_DRIVER_INIT(mk3mdb);
|
DECLARE_DRIVER_INIT(mk3mdb);
|
||||||
DECLARE_DRIVER_INIT(ssf2mdb);
|
DECLARE_DRIVER_INIT(ssf2mdb);
|
||||||
@ -38,4 +36,12 @@ public:
|
|||||||
void puckpkmn(machine_config &config);
|
void puckpkmn(machine_config &config);
|
||||||
void jzth(machine_config &config);
|
void jzth(machine_config &config);
|
||||||
void puckpkmna(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
|
34
src/mame/includes/megadriv_rad.h
Normal file
34
src/mame/includes/megadriv_rad.h
Normal file
@ -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
|
84
src/mame/machine/rad_eu3a05gpio.cpp
Normal file
84
src/mame/machine/rad_eu3a05gpio.cpp
Normal file
@ -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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
52
src/mame/machine/rad_eu3a05gpio.h
Normal file
52
src/mame/machine/rad_eu3a05gpio.h
Normal file
@ -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
|
@ -13742,13 +13742,9 @@ suprpokrb // (c) 1986 Grayhound Electronics
|
|||||||
geneve // 1987? Myarc Geneve 9640
|
geneve // 1987? Myarc Geneve 9640
|
||||||
|
|
||||||
@source:geniusiq.cpp
|
@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 // 1997 Genius IQ 128 (Germany)
|
||||||
iq128_fr // 1997 Genius PC (France)
|
iq128_fr // 1997 Genius PC (France)
|
||||||
iqtv512 // IQ TV512 (Germany)
|
iqtv512 // IQ TV512 (Germany)
|
||||||
iqunlim // 199? IQ Unlimited (680x0)
|
|
||||||
itunlim // 199? IT Unlimited
|
itunlim // 199? IT Unlimited
|
||||||
|
|
||||||
@source:genpc.cpp
|
@source:genpc.cpp
|
||||||
@ -15388,6 +15384,9 @@ iq151 //
|
|||||||
grndtour // (c) 1993
|
grndtour // (c) 1993
|
||||||
iqblock // (c) 1993
|
iqblock // (c) 1993
|
||||||
|
|
||||||
|
@source:iqunlim.cpp
|
||||||
|
iqunlim // 199? IQ Unlimited (680x0)
|
||||||
|
|
||||||
@source:iris3130.cpp
|
@source:iris3130.cpp
|
||||||
sgi_ip2 // IP2: IRIS 3xx0, 68020, 16MHz
|
sgi_ip2 // IP2: IRIS 3xx0, 68020, 16MHz
|
||||||
|
|
||||||
@ -20499,7 +20498,7 @@ wmegam2 // 1993 Victor Wondermega M2 (Japan)
|
|||||||
xeye // 1993 JVC X'eye (USA)
|
xeye // 1993 JVC X'eye (USA)
|
||||||
dcat16 //
|
dcat16 //
|
||||||
|
|
||||||
@source:megadrvb.cpp
|
@source:megadriv_acbl.cpp
|
||||||
aladmdb // MegaDrive-based hack
|
aladmdb // MegaDrive-based hack
|
||||||
mk3mdb // MegaDrive-based hack
|
mk3mdb // MegaDrive-based hack
|
||||||
sonic2mb // MegaDrive-based hack
|
sonic2mb // MegaDrive-based hack
|
||||||
@ -20507,6 +20506,11 @@ srmdb // MegaDrive-based hack
|
|||||||
ssf2mdb // MegaDrive-based hack
|
ssf2mdb // MegaDrive-based hack
|
||||||
topshoot // (c) 1995 Sun Mixing
|
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
|
@source:megaphx.cpp
|
||||||
megaphx // (c) 1991 Dinamic / Inder
|
megaphx // (c) 1991 Dinamic / Inder
|
||||||
|
|
||||||
@ -32429,7 +32433,10 @@ r9751 // ROLM 9751 phone system
|
|||||||
@source:rabbit.cpp
|
@source:rabbit.cpp
|
||||||
rabbit // (c) 1997 Electronic Arts
|
rabbit // (c) 1997 Electronic Arts
|
||||||
|
|
||||||
@source:radicasi.cpp
|
@source:rad_eu3a14.cpp
|
||||||
|
rad_gtg
|
||||||
|
|
||||||
|
@source:rad_eu3a05.cpp
|
||||||
rad_sinv
|
rad_sinv
|
||||||
rad_tetr
|
rad_tetr
|
||||||
|
|
||||||
@ -37991,6 +37998,16 @@ laser350 // 1984? Laser 350
|
|||||||
laser500 // 1984? Laser 500
|
laser500 // 1984? Laser 500
|
||||||
laser700 // 1984? Laser 700
|
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
|
@source:vulgus.cpp
|
||||||
mach9 // bootleg (ITISA)
|
mach9 // bootleg (ITISA)
|
||||||
vulgus // 5/1984 (c) 1984
|
vulgus // 5/1984 (c) 1984
|
||||||
|
@ -309,6 +309,7 @@ intv.cpp
|
|||||||
ipc.cpp
|
ipc.cpp
|
||||||
ipds.cpp
|
ipds.cpp
|
||||||
iq151.cpp
|
iq151.cpp
|
||||||
|
iqunlim.cpp
|
||||||
iris3130.cpp
|
iris3130.cpp
|
||||||
irisha.cpp
|
irisha.cpp
|
||||||
isbc.cpp
|
isbc.cpp
|
||||||
@ -374,6 +375,7 @@ mc8030.cpp
|
|||||||
mcb216.cpp
|
mcb216.cpp
|
||||||
mccpm.cpp
|
mccpm.cpp
|
||||||
megadriv.cpp
|
megadriv.cpp
|
||||||
|
megadriv_rad.cpp
|
||||||
mekd2.cpp
|
mekd2.cpp
|
||||||
mephisto.cpp
|
mephisto.cpp
|
||||||
mephisto_montec.cpp
|
mephisto_montec.cpp
|
||||||
@ -566,7 +568,8 @@ qvt201.cpp
|
|||||||
qvt6800.cpp
|
qvt6800.cpp
|
||||||
qx10.cpp
|
qx10.cpp
|
||||||
r9751.cpp
|
r9751.cpp
|
||||||
radicasi.cpp
|
rad_eu3a05.cpp
|
||||||
|
rad_eu3a14.cpp
|
||||||
radio86.cpp
|
radio86.cpp
|
||||||
rainbow.cpp
|
rainbow.cpp
|
||||||
rambo.cpp
|
rambo.cpp
|
||||||
@ -765,6 +768,9 @@ vt520.cpp
|
|||||||
vta2000.cpp
|
vta2000.cpp
|
||||||
vtech1.cpp
|
vtech1.cpp
|
||||||
vtech2.cpp
|
vtech2.cpp
|
||||||
|
vtech_eu3a12.cpp
|
||||||
|
vtech_unk1.cpp
|
||||||
|
vtech_unk2.cpp
|
||||||
wangpc.cpp
|
wangpc.cpp
|
||||||
wicat.cpp
|
wicat.cpp
|
||||||
wswan.cpp
|
wswan.cpp
|
||||||
|
Loading…
Reference in New Issue
Block a user