summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/xavix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/xavix.cpp')
-rw-r--r--src/mame/drivers/xavix.cpp238
1 files changed, 234 insertions, 4 deletions
diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp
index 58cff91b09f..610956ca2a0 100644
--- a/src/mame/drivers/xavix.cpp
+++ b/src/mame/drivers/xavix.cpp
@@ -68,12 +68,45 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void xavix(machine_config &config);
+
+ DECLARE_WRITE8_MEMBER(xavix_7900_w);
+
+ DECLARE_WRITE8_MEMBER(xavix_7980_w);
+ DECLARE_WRITE8_MEMBER(xavix_7981_w);
+ DECLARE_WRITE8_MEMBER(xavix_7982_w);
+ DECLARE_WRITE8_MEMBER(xavix_7983_w);
+ DECLARE_WRITE8_MEMBER(xavix_7984_w);
+ DECLARE_WRITE8_MEMBER(xavix_7985_w);
+ DECLARE_WRITE8_MEMBER(xavix_7986_w);
+ DECLARE_WRITE8_MEMBER(xavix_7987_w);
+ DECLARE_READ8_MEMBER(xavix_7980_r);
+
+
+ DECLARE_WRITE8_MEMBER(xavix_7ff9_w);
+ DECLARE_WRITE8_MEMBER(xavix_7ffa_w);
+ DECLARE_WRITE8_MEMBER(xavix_7ffb_w);
+ DECLARE_WRITE8_MEMBER(xavix_7ffe_w);
+ DECLARE_WRITE8_MEMBER(xavix_7fff_w);
+
+
protected:
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
+
+private:
+ uint8_t m_xavix_7981_data;
+ uint8_t m_xavix_7982_data;
+ uint8_t m_xavix_7983_data;
+
+ uint8_t m_xavix_7984_data;
+ uint8_t m_xavix_7985_data;
+
+ uint8_t m_xavix_7986_data;
+ uint8_t m_xavix_7987_data;
+
};
void xavix_state::video_start()
@@ -85,8 +118,182 @@ uint32_t xavix_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap
return 0;
}
+
+WRITE8_MEMBER(xavix_state::xavix_7980_w)
+{
+ logerror("%s: xavix_7980_w %02x (79xx unk trigger for 7981-7987?)\n", machine().describe_context(), data);
+
+ uint32_t source = (m_xavix_7983_data << 16) | (m_xavix_7982_data<<8) | m_xavix_7981_data;
+ uint16_t dest = (m_xavix_7985_data<<8) | m_xavix_7984_data;
+ uint16_t len = (m_xavix_7987_data<<8) | m_xavix_7986_data;
+
+ // TODO: don't do tag lookups here once satisfied this is correct
+ const uint32_t rgnlen = memregion("bios")->bytes();
+ uint8_t *rgn = memregion("bios")->base();
+
+ source &= rgnlen-1;
+ logerror(" (possible DMA op SRC %08x DST %04x LEN %04x)\n", source, dest, len);
+
+ address_space& destspace = m_maincpu->space(AS_PROGRAM);
+
+ for (int i = 0; i < len; i++)
+ {
+ uint8_t dat = rgn[(source + i) & (rgnlen-1)];
+ destspace.write_byte(dest + i, dat);
+ }
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7981_w)
+{
+ logerror("%s: xavix_7981_w %02x (79xx unk triplet byte 1)\n", machine().describe_context(), data);
+ m_xavix_7981_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7982_w)
+{
+ logerror("%s: xavix_7982_w %02x (79xx unk triplet byte 2)\n", machine().describe_context(), data);
+ m_xavix_7982_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7983_w)
+{
+ logerror("%s: xavix_7983_w %02x (79xx unk triplet byte 3)\n", machine().describe_context(), data);
+ m_xavix_7983_data = data;
+ // this would mean Taito Nostalgia relies on mirroring tho, as it has the high bits set... so could just be wrong
+ logerror(" (possible DMA ROM source of %02x%02x%02x)\n", m_xavix_7983_data, m_xavix_7982_data, m_xavix_7981_data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7984_w)
+{
+ logerror("%s: xavix_7984_w %02x (79xx unk pair 1 byte 1)\n", machine().describe_context(), data);
+ m_xavix_7984_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7985_w)
+{
+ logerror("%s: xavix_7985_w %02x (79xx unk pair 1 byte 2)\n", machine().describe_context(), data);
+ m_xavix_7985_data = data;
+
+ logerror(" (possible DMA dest of %02x%02x)\n", m_xavix_7985_data, m_xavix_7984_data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7986_w)
+{
+ logerror("%s: xavix_7986_w %02x (79xx unk pair 2 byte 1)\n", machine().describe_context(), data);
+ m_xavix_7986_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7987_w)
+{
+ logerror("%s: xavix_7987_w %02x (79xx unk pair 2 byte 2)\n", machine().describe_context(), data);
+ m_xavix_7987_data = data;
+
+ logerror(" (possible DMA len of %02x%02x)\n", m_xavix_7987_data, m_xavix_7986_data);
+}
+
+READ8_MEMBER(xavix_state::xavix_7980_r)
+{
+ logerror("%s: xavix_7980_r (79xx unk operation status?)\n", machine().describe_context());
+ return 0x00;
+}
+
+
+
+WRITE8_MEMBER(xavix_state::xavix_7ff9_w)
+{
+ logerror("%s: xavix_7ff9_w %02x (trigger for 7ffx region?)\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7ffa_w)
+{
+ logerror("%s: xavix_7ffa_w %02x (7ffx pair 1, byte 1?)\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7ffb_w)
+{
+ logerror("%s: xavix_7ffb_w %02x (7ffx pair 1, byte 2?)\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7ffe_w)
+{
+ logerror("%s: xavix_7ffe_w %02x (7ffx pair 2, byte 1?)\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7fff_w)
+{
+ logerror("%s: xavix_7fff_w %02x (7ffx pair 2, byte 2?)\n", machine().describe_context(), data);
+}
+
+
+WRITE8_MEMBER(xavix_state::xavix_7900_w)
+{
+ logerror("%s: xavix_7900_w %02x (---FIRST WRITE ON STARTUP---)\n", machine().describe_context(), data);
+}
+
+
+
+
static ADDRESS_MAP_START( xavix_map, AS_PROGRAM, 8, xavix_state )
AM_RANGE(0x000000, 0x0001ff) AM_RAM
+ AM_RANGE(0x000200, 0x003fff) AM_RAM // ends up jumping to code here? must be a DMA?
+
+ AM_RANGE(0x006200, 0x0062ff) AM_RAM // cleared to 0x80
+
+ AM_RANGE(0x006900, 0x006900) AM_WRITENOP // startup (taitons1)
+
+ AM_RANGE(0x006fc0, 0x006fc0) AM_WRITENOP // startup
+
+ AM_RANGE(0x006fd8, 0x006fd8) AM_WRITENOP // startup (taitons1)
+
+ AM_RANGE(0x006fe9, 0x006fe9) AM_WRITENOP // startup
+
+ AM_RANGE(0x006ff1, 0x006ff1) AM_WRITENOP // startup (taitons1)
+
+ AM_RANGE(0x006ff8, 0x006ff8) AM_READNOP AM_WRITENOP // startup
+
+ // taitons1 after 75f7/75f8
+ //AM_RANGE(0x0075f6, 0x0075f6) AM_WRITE(xavix_75f6_w)
+ // taitons1 written as a pair
+ //AM_RANGE(0x0075f7, 0x0075f7) AM_WRITE(xavix_75f7_w)
+ //AM_RANGE(0x0075f8, 0x0075f8) AM_WRITE(xavix_75f8_w)
+ // taitons1 written after 75f6, then read
+ //AM_RANGE(0x0075f9, 0x0075f9) AM_READWRITE(xavix_75f9_r, xavix_75f9_w)
+ // taitons1 written other 75xx operations
+ //AM_RANGE(0x0075ff, 0x0075ff) AM_WRITE(xavix_75ff_w)
+
+ AM_RANGE(0x007810, 0x007810) AM_WRITENOP // startup
+
+ AM_RANGE(0x007900, 0x007900) AM_WRITE(xavix_7900_w) // startup
+ AM_RANGE(0x007902, 0x007902) AM_WRITENOP // startup
+
+ // possible trigger for below (written after the others) waits on status of bit 1 in a loop
+ AM_RANGE(0x007980, 0x007980) AM_READWRITE(xavix_7980_r, xavix_7980_w)
+ // seem to be a triplet?
+ AM_RANGE(0x007981, 0x007981) AM_WRITE(xavix_7981_w)
+ AM_RANGE(0x007982, 0x007982) AM_WRITE(xavix_7982_w)
+ AM_RANGE(0x007983, 0x007983) AM_WRITE(xavix_7983_w)
+ // seem to be a pair
+ AM_RANGE(0x007984, 0x007984) AM_WRITE(xavix_7984_w)
+ AM_RANGE(0x007985, 0x007985) AM_WRITE(xavix_7985_w)
+ // seem to be a pair
+ AM_RANGE(0x007986, 0x007986) AM_WRITE(xavix_7986_w)
+ AM_RANGE(0x007987, 0x007987) AM_WRITE(xavix_7987_w)
+
+ AM_RANGE(0x007a00, 0x007a00) AM_READNOP // startup (taitons1)
+ AM_RANGE(0x007a01, 0x007a01) AM_READNOP // startup (taitons1)
+
+ AM_RANGE(0x007a03, 0x007a03) AM_READNOP AM_WRITENOP // startup
+
+ // again possible trigger for below, written after them
+ AM_RANGE(0x007ff9, 0x007ff9) AM_WRITE(xavix_7ff9_w)
+ // also seems to be a pair
+ AM_RANGE(0x007ffa, 0x007ffa) AM_WRITE(xavix_7ffa_w)
+ AM_RANGE(0x007ffb, 0x007ffb) AM_WRITE(xavix_7ffb_w)
+
+ // also seems to be a pair
+ AM_RANGE(0x007ffe, 0x007ffe) AM_WRITE(xavix_7ffe_w)
+ AM_RANGE(0x007fff, 0x007fff) AM_WRITE(xavix_7fff_w)
+
AM_RANGE(0x008000, 0x1fffff) AM_ROM AM_REGION("bios", 0x008000)
ADDRESS_MAP_END
@@ -169,6 +376,15 @@ void xavix_state::machine_start()
void xavix_state::machine_reset()
{
+ m_xavix_7981_data = 0;
+ m_xavix_7982_data = 0;
+ m_xavix_7983_data = 0;
+
+ m_xavix_7984_data = 0;
+ m_xavix_7985_data = 0;
+
+ m_xavix_7986_data = 0;
+ m_xavix_7987_data = 0;
}
@@ -209,6 +425,11 @@ ROM_START( taitons1 )
ROM_LOAD( "taitonostalgia1.u3", 0x000000, 0x200000, CRC(25bd8c67) SHA1(a109cd2da6aa4596e3ca3abd1afce2d0001a473f) )
ROM_END
+ROM_START( rad_ping )
+ ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "pingpong.bin", 0x000000, 0x100000, CRC(629f7f47) SHA1(2bb19fd202f1e6c319d2f7d18adbfed8a7669235) )
+ROM_END
+
ROM_START( xavtenni )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "xavixtennis.bin", 0x000000, 0x800000, CRC(23a1d918) SHA1(2241c59e8ea8328013e55952ebf9060ea0a4675b) )
@@ -217,14 +438,23 @@ ROM_END
/* The 'XaviXPORT' isn't a real console, more of a TV adapter, all the actual hardware (CPU including video hw, sound hw) is in the cartridges and controllers
and can vary between games, see notes at top of driver.
- XaviX Tennis should be a standard XaviX CPU, but at the very least makes significantly more use of custom opcodes than Taito Nostalgia 1 which only appears
- to use the call far / return far for extended memory space. It also seems to require some regular 6502 opcodes to be replaced with custom ones, yet Taito
- Nostalgia appears to use them in their normal form; either there's some kind of mode switch, or XaviX Tennis is a different CPU type.
+ According to sources XaviX Tennis should be a standard XaviX CPU, but at the very least makes significantly more use of custom opcodes than Taito Nostalgia
+ and Radica Ping Pong which only appears to use the call far / return far for extended memory space.
+ Furthermore it also seems to require some regular 6502 opcodes to be replaced with custom ones, yet the other games expect these to act normally. This
+ leads me to believe that XaviX Tennis is more likely to be a Super XaviX title.
+
The CPU die on XaviX Tennis is internally marked as NEC 85054-611
*/
CONS( 2004, xavtenni, 0, 0, xavix, xavix, xavix_state, 0, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_IS_SKELETON )
-// standalone TV games
+/* Standalone TV Games
+
+ These all have jumps to the 3xxx region, which appears to be RAM (or possibly a banked space?) hopefully it's just missing some kind of DMA transfer and
+ isn't some additional internal ROM.
+
+*/
CONS( 2006, taitons1, 0, 0, xavix, xavix, xavix_state, 0, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_IS_SKELETON )
+
+CONS( 2000, rad_ping, 0, 0, xavix, xavix, xavix_state, 0, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong", MACHINE_IS_SKELETON ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd"