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.cpp204
1 files changed, 138 insertions, 66 deletions
diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp
index 8c56386c83b..066e7329f93 100644
--- a/src/mame/drivers/xavix.cpp
+++ b/src/mame/drivers/xavix.cpp
@@ -57,6 +57,7 @@ public:
m_palette(*this, "palette"),
m_in0(*this, "IN0"),
m_in1(*this, "IN1"),
+ m_region(*this, "REGION"),
m_gfxdecode(*this, "gfxdecode"),
m_alt_addressing(0),
m_alt_addressing_base(0)
@@ -69,6 +70,7 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void xavix(machine_config &config);
+ void xavixp(machine_config &config);
DECLARE_WRITE8_MEMBER(xavix_7900_w);
@@ -223,6 +225,7 @@ private:
required_ioport m_in0;
required_ioport m_in1;
+ required_ioport m_region;
required_device<gfxdecode_device> m_gfxdecode;
@@ -421,6 +424,20 @@ void xavix_state::draw_tilemap(screen_device &screen, bitmap_ind16 &bitmap, cons
if (tileregs[0x7] & 0x02)
alt_tileaddressing2 = 1;
+ static int hackx = 1;
+
+ if (machine().input().code_pressed_once(KEYCODE_Q))
+ {
+ hackx--;
+ printf("%02x\n", hackx);
+ }
+
+ if (machine().input().code_pressed_once(KEYCODE_W))
+ {
+ hackx++;
+ printf("%02x\n", hackx);
+ }
+
if (tileregs[0x7] & 0x80)
{
// there's a tilemap register to specify base in main ram, although in the monster truck test mode it points to an unmapped region
@@ -438,7 +455,10 @@ void xavix_state::draw_tilemap(screen_device &screen, bitmap_ind16 &bitmap, cons
// the register being 0 probably isn't the condition here
if (tileregs[0x0] != 0x00) tile |= mainspace.read_byte((tileregs[0x0] << 8) + count);
if (tileregs[0x1] != 0x00) tile |= mainspace.read_byte((tileregs[0x1] << 8) + count) << 8;
- if (tileregs[0x2] != 0x00) tile |= mainspace.read_byte((tileregs[0x2] << 8) + count) << 16;
+
+ // at the very least boxing leaves unwanted bits set in ram after changing between mode 0x8a and 0x82, expecting them to not be used
+ if (tileregs[0x7] & 0x08)
+ tile |= mainspace.read_byte((tileregs[0x2] << 8) + count) << 16;
count++;
@@ -474,12 +494,38 @@ void xavix_state::draw_tilemap(screen_device &screen, bitmap_ind16 &bitmap, cons
}
else
{
- // fixed multiplier? or just different? only seen this in 16x8 tile mode at the moment.
- tile = tile * 8;
- basereg = (tile & 0xf0000) >> 16;
- tile &= 0xffff;
- gfxbase = (m_spr_attra[(basereg * 2) + 1] << 16) | (m_spr_attra[(basereg * 2)] << 8);
- tile+= gfxbase;
+ if (tileregs[0x7] & 0x08)
+ {
+ // seems to be an alt mode where there more tile data comes from an additional attribute table including palette and the banking indirection is changed
+ tile = tile * 8; // << 3
+
+ // boxing suggests this check happens here
+ if ((tile & 0xffff) == 0)
+ continue;
+
+ tile &= 0x0ffff;
+
+ // how we use the banking bits is not clear..
+ tile += hackx * 0x10000;
+
+ /* 0x03 = bass fishing company logo, 0x01 = xavix logo, title, 0x04 = menu background
+
+ 0x05 = card night title (ntsc) 0x01 = xavix logo, menu background, 0x08 = card night title (pal) (potentially buggy, code flow seems wrong)
+
+ 0x0e = boxing (instruction stuff) also needs palette settings.. also some bits on same layer using different bank? (0xd) or just disabled?
+
+ */
+
+ }
+ else
+ {
+ // fixed multiplier? or just different? only seen this in 16x8 tile mode at the moment.
+ tile = tile * 8;
+ basereg = (tile & 0xf0000) >> 16;
+ tile &= 0xffff;
+ gfxbase = (m_spr_attra[(basereg * 2) + 1] << 16) | (m_spr_attra[(basereg * 2)] << 8);
+ tile += gfxbase;
+ }
}
}
else
@@ -664,7 +710,7 @@ void xavix_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, cons
tile+= gfxbase;
}
- ypos = 0xff - ypos;
+ ypos = 0x100 - ypos;
xpos -= 136;
ypos -= 152;
@@ -1071,59 +1117,11 @@ READ8_MEMBER(xavix_state::xavix_75f9_r)
READ8_MEMBER(xavix_state::xavix_io_0_r)
{
- //return 0x00;
- //return 0x01; // enter test mode
return m_in0->read();
}
READ8_MEMBER(xavix_state::xavix_io_1_r)
{
- //logerror("%s: xavix_io_1_r (random status?)\n", machine().describe_context());
- /*
-
- rad_mtrk checks for 0x40 at (interrupt code)
-
- 008f02: lda $7a01 -- ??
- 008f05: and #$40
- 008f07: beq $8f17
- (code that leads to a far call screen fade function with a 'jump to self' at the end, no obvious way out)
- 008f17 - normal flow?
-
- opposite condition to above
- 018ac5: lda $7a01 -- ??
- 018ac8: and #$40
- 018aca: bne $18ac5
-
- there's a write with 0x80 before the 'jump to self'
- 018aea: lda #$80
- 018aec: sta $7a01
- 018aef: jmp $18aef
-
-
- and 0x02 elsewhere
-
- near end of interrupt function will conditionally change the value stored at 0x33 to 00 or ff depending on this bit
-
- 008f24: lda $7a01
- 008f27: and #$02
- 008f29: bne $8f3c
- (skips over code to store 0x00 at $33)
-
- 008f31: lda $7a01
- 008f34: and #$02
- 008f36: beq $8f3c
- (skips over code to store 0xff at $33)
-
- there's a similar check fo 0x02 that results in a far call
- 008099: lda $7a01
- 00809c: and #$02
- 00809e: beq $80ab
-
- writes 00 04 and 80
-
- */
-
- //return 0x02;
return m_in1->read();
}
@@ -1219,8 +1217,8 @@ READ8_MEMBER(xavix_state::pal_ntsc_r)
{
// only seen 0x10 checked in code
// in monster truck the tile base address gets set based on this, there are 2 copies of the test screen in rom, one for pal, one for ntsc, see 1854c
- return 0x00; // NTSC
- //return 0x10; // PAL
+ // likewise card night has entirely different tilesets for each region title
+ return m_region->read();
}
WRITE8_MEMBER(xavix_state::xavix_6fc0_w) // also related to tilemap 1?
@@ -1519,6 +1517,16 @@ static INPUT_PORTS_START( xavix )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("REGION") // PAL/NTSC flag
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( xavixp )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("REGION") // PAL/NTSC flag
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_SPECIAL )
INPUT_PORTS_END
/* Test mode lists the following
@@ -1549,6 +1557,12 @@ static INPUT_PORTS_START( rad_mtrk )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SERVICE1 ) // some kind of 'power off' (fades screen to black, jumps to an infinite loop) maybe low battery condition or just the power button?
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_mtrkp )
+ PORT_INCLUDE(rad_mtrk)
+
+ PORT_MODIFY("REGION") // PAL/NTSC flag
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_SPECIAL )
+INPUT_PORTS_END
static INPUT_PORTS_START( rad_crdn )
PORT_INCLUDE(xavix)
@@ -1557,6 +1571,12 @@ static INPUT_PORTS_START( rad_crdn )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) // can press this to get to a game select screen
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_crdnp )
+ PORT_INCLUDE(rad_crdn)
+
+ PORT_MODIFY("REGION") // PAL/NTSC flag
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_SPECIAL )
+INPUT_PORTS_END
static INPUT_PORTS_START( rad_box )
PORT_INCLUDE(xavix)
@@ -1577,6 +1597,12 @@ static INPUT_PORTS_START( rad_box )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // needs to be high to pass warning screen?
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_boxp )
+ PORT_INCLUDE(rad_box)
+
+ PORT_MODIFY("REGION") // PAL/NTSC flag
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL )
+INPUT_PORTS_END
/* correct, 4bpp gfxs */
@@ -1739,6 +1765,14 @@ MACHINE_CONFIG_START(xavix_state::xavix)
// sound is PCM
MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(xavix_state::xavixp)
+ xavix(config);
+
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_REFRESH_RATE(50)
+MACHINE_CONFIG_END
+
DRIVER_INIT_MEMBER(xavix_state,xavix)
{
m_rgnlen = memregion("bios")->bytes();
@@ -1784,6 +1818,21 @@ ROM_START( rad_box )
ROM_LOAD("boxing.bin", 0x000000, 0x200000, CRC(5cd40714) SHA1(165260228c029a9502ca0598c84c24fd9bdeaebe) )
ROM_END
+ROM_START( rad_boxp )
+ ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("boxing.bin", 0x000000, 0x200000, CRC(5cd40714) SHA1(165260228c029a9502ca0598c84c24fd9bdeaebe) )
+ROM_END
+
+ROM_START( rad_bass )
+ ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("bassfishin.bin", 0x000000, 0x100000, CRC(b54eb1c5) SHA1(084faa9349369f2b8846950765f9c8f758db3e9e) )
+ROM_END
+
+ROM_START( rad_bassp )
+ ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("bassfishin.bin", 0x000000, 0x100000, CRC(b54eb1c5) SHA1(084faa9349369f2b8846950765f9c8f758db3e9e) )
+ROM_END
+
ROM_START( rad_ping )
ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "pingpong.bin", 0x000000, 0x100000, CRC(629f7f47) SHA1(2bb19fd202f1e6c319d2f7d18adbfed8a7669235) )
@@ -1794,6 +1843,11 @@ ROM_START( rad_crdn )
ROM_LOAD( "cardnight.bin", 0x000000, 0x100000, CRC(d19eba08) SHA1(cedb9fe785f2a559f518a1d8ecf80d500ddc63c7) )
ROM_END
+ROM_START( rad_crdnp )
+ ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "cardnight.bin", 0x000000, 0x100000, CRC(d19eba08) SHA1(cedb9fe785f2a559f518a1d8ecf80d500ddc63c7) )
+ROM_END
+
ROM_START( rad_bb2 )
ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "baseball2.bin", 0x000000, 0x200000, CRC(bdbf6202) SHA1(18d5cc2d77cbb734629a7a5b6e0f419d21beedbd) )
@@ -1804,6 +1858,11 @@ ROM_START( rad_mtrk )
ROM_LOAD( "monstertruck.bin", 0x000000, 0x400000, CRC(dccda0a7) SHA1(7953cf29643672f8367639555b797c20bb533eab) )
ROM_END
+ROM_START( rad_mtrkp ) // rom was dumped from NTSC unit, assuming to be the same
+ ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "monstertruck.bin", 0x000000, 0x400000, CRC(dccda0a7) SHA1(7953cf29643672f8367639555b797c20bb533eab) )
+ROM_END
+
ROM_START( eka_strt )
ROM_REGION( 0x080000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "ekarastartcart.bin", 0x000000, 0x080000, CRC(8c12c0c2) SHA1(8cc1b098894af25a4bfccada884125b66f5fe8b2) )
@@ -1811,15 +1870,25 @@ ROM_END
/* Standalone TV Games */
-CONS( 2006, taitons1, 0, 0, xavix, xavix, xavix_state, taitons1, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_IS_SKELETON )
+CONS( 2006, taitons1, 0, 0, xavix, xavix, xavix_state, taitons1, "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, xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong", MACHINE_IS_SKELETON ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd"
+
+CONS( 2003, rad_mtrk, 0, 0, xavix, rad_mtrk, xavix_state, xavix, "Radica / SSD Company LTD", "Play TV Monster Truck (NTSC)", MACHINE_IS_SKELETON )
+CONS( 2003, rad_mtrkp, rad_mtrk, 0, xavixp, rad_mtrkp,xavix_state, xavix, "Radica / SSD Company LTD", "ConnecTV Monster Truck (PAL)", MACHINE_IS_SKELETON )
-CONS( 2000, rad_ping, 0, 0, xavix, xavix, xavix_state, xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong", MACHINE_IS_SKELETON ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd"
-CONS( 2003, rad_mtrk, 0, 0, xavix, rad_mtrk, xavix_state, xavix, "Radica / SSD Company LTD", "Play TV Monster Truck", MACHINE_IS_SKELETON )
-CONS( 200?, rad_box, 0, 0, xavix, rad_box, xavix_state, rad_box, "Radica / SSD Company LTD", "Play TV Boxing", MACHINE_IS_SKELETON)
-CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, rad_crdn, "Radica / SSD Company LTD", "Play TV Card Night", MACHINE_IS_SKELETON)
-CONS( 2002, rad_bb2, 0, 0, xavix, xavix, xavix_state, xavix, "Radica / SSD Company LTD", "Play TV Baseball 2", MACHINE_IS_SKELETON ) // contains string "Radica RBB2 V1.0"
+CONS( 200?, rad_box, 0, 0, xavix, rad_box, xavix_state, rad_box, "Radica / SSD Company LTD", "Play TV Boxing (NTSC)", MACHINE_IS_SKELETON)
+CONS( 200?, rad_boxp, rad_box, 0, xavixp, rad_boxp, xavix_state, rad_box, "Radica / SSD Company LTD", "ConnecTV Boxing (PAL)", MACHINE_IS_SKELETON)
-CONS (200?, eka_strt, 0, 0, xavix, xavix, xavix_state, xavix, "Takara / SSD Company LTD", "e-kara Starter", MACHINE_IS_SKELETON)
+CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, rad_crdn, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_IS_SKELETON)
+CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp, rad_crdnp,xavix_state, rad_crdn, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_IS_SKELETON)
+
+CONS( 2002, rad_bb2, 0, 0, xavix, xavix, xavix_state, xavix, "Radica / SSD Company LTD", "Play TV Baseball 2", MACHINE_IS_SKELETON ) // contains string "Radica RBB2 V1.0"
+
+CONS( 2001, rad_bass, 0, 0, xavix, xavix, xavix_state, rad_box, "Radica / SSD Company LTD", "Play TV Bass Fishin'", MACHINE_IS_SKELETON)
+CONS( 2001, rad_bassp, rad_bass, 0, xavixp, xavixp, xavix_state, rad_box, "Radica / SSD Company LTD", "ConnecTV Bass Fishin'", MACHINE_IS_SKELETON)
+
+CONS (200?, eka_strt, 0, 0, xavix, xavix, xavix_state, xavix, "Takara / SSD Company LTD", "e-kara Starter", MACHINE_IS_SKELETON)
/* 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.
@@ -1830,11 +1899,14 @@ CONS (200?, eka_strt, 0, 0, xavix, xavix, xavix_state, xavix, "Takara /
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 almost certainly a Super XaviX title.
- The CPU die on XaviX Tennis is internally marked as NEC 85054-611 and is very different to thw two below
+ The CPU die on XaviX Tennis is internally marked as NEC 85054-611 and is very different to the two below
Radica Monster truck die is marked SSD PL7351 with SSD98 also printed on the die
Radia Ping Pong die is marked SSD PA7270 with SSD97 also printed on the die (otherwise looks identical to Monster Truck)
+ Boxing, Baseball 2 and Card Night all have the SSD98 logo
+ Boxing, Bass Fishin' and Card Night are all PA7351-107. Baseball 2 looks like PL7351-181.
+
Star Wars Saga Edition also seems to be making use of additional opcodes, meaning it could also be Super Xavix, or something in-between (unless they're
caused by the bad dump, but it looks intentional)