From be2ad6e73791ff7bfff93a72f1e4191030686e1a Mon Sep 17 00:00:00 2001 From: David Haywood Date: Thu, 1 Nov 2018 17:17:55 +0000 Subject: [PATCH] XaviX - ignore unaligned palette select bits in bpp modes > 4 (ttv_lotr boot screen) (#4213) * ignore unaligned palette select bits in bpp modes > 4 * map some inputs in rad_ping (nw) * fairly sure these don't use Y index (used in ttv_mx road calcs, although still not correct) (nw) * dma IRQ allows ttv_lotr and drgqst to run further (nw) * name fix (nw) * change irq handling a little (nw) * timer notes (nw) * (nw) --- src/devices/cpu/m6502/oxavix2000.lst | 16 ++--- src/devices/cpu/m6502/xavix2000.cpp | 4 +- src/mame/drivers/xavix.cpp | 89 +++++++++++++++++----------- src/mame/includes/xavix.h | 10 ++++ src/mame/machine/xavix.cpp | 87 +++++++++++++++++++++++++-- src/mame/video/xavix.cpp | 8 ++- 6 files changed, 165 insertions(+), 49 deletions(-) diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst index 12be0a7868c..0832f2adef4 100644 --- a/src/devices/cpu/m6502/oxavix2000.lst +++ b/src/devices/cpu/m6502/oxavix2000.lst @@ -322,15 +322,15 @@ eorpa_imp prefetch(); adcpa_imp - do_adc(read_full_data_sp(m_pa+Y)); + do_adc(read_full_data_sp(m_pa)); prefetch(); stapa_imp - write_full_data_sp(m_pa+Y, A); + write_full_data_sp(m_pa, A); prefetch(); ldapa_imp - A = read_full_data_sp(m_pa+Y); + A = read_full_data_sp(m_pa); prefetch(); cmppa_imp @@ -339,7 +339,7 @@ cmppa_imp prefetch(); sbcpa_imp - do_sbc(read_full_data_sp(m_pa+Y)); + do_sbc(read_full_data_sp(m_pa)); prefetch(); orapb_imp @@ -358,15 +358,15 @@ eorpb_imp prefetch(); adcpb_imp - do_adc(read_full_data_sp(m_pb+Y)); + do_adc(read_full_data_sp(m_pb)); prefetch(); stapb_imp - write_full_data_sp(m_pb+Y, A); + write_full_data_sp(m_pb, A); prefetch(); ldapb_imp - A = read_full_data_sp(m_pb+Y); + A = read_full_data_sp(m_pb); prefetch(); cmppb_imp @@ -375,7 +375,7 @@ cmppb_imp prefetch(); sbcpb_imp - do_sbc(read_full_data_sp(m_pb+Y)); + do_sbc(read_full_data_sp(m_pb)); prefetch(); stx_aby diff --git a/src/devices/cpu/m6502/xavix2000.cpp b/src/devices/cpu/m6502/xavix2000.cpp index fe173150de0..6431bf0d336 100644 --- a/src/devices/cpu/m6502/xavix2000.cpp +++ b/src/devices/cpu/m6502/xavix2000.cpp @@ -41,11 +41,11 @@ -- loop point 1 01BC3E: A3 ldal0 a // read byte 0 of 32-bit 'long' register into accumulator - 01BC3F: 73 adcpa // adc ($Address PA), y + 01BC3F: 73 adcpa // adc ($Address PA) 01BC40: 83 stal0 a // store accumulator back in byte 0 of 32-bit 'long' register (even byte checksum?) 01BC41: FB incpa // increase 'address' register PA 01BC42: A7 ldal1 a // read byte 1 of 32-bit 'long' register into accumulator - 01BC43: 73 adcpa // adc ($Address PA), y + 01BC43: 73 adcpa // adc ($Address PA) 01BC44: 87 stal1 a // store accumulator back in byte 0 of 32-bit 'long' register (odd byte checksum?) 01BC45: FB incpa // increase 'address' register PA 01BC46: D0 F6 bne $1bc3e // (branch based on PA increase, so PA must set flags?, probably overflows after 0xffff if upper byte is 'bank'? or at 0xff if this really is a mirror of the function below diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 8c3b047954d..b79f36fd0dd 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -417,9 +417,9 @@ void xavix_state::xavix_lowbus_map(address_map &map) //map(7b82, 7b83) // Timer control - map(0x7c00, 0x7c00).w(FUNC(xavix_state::timer_control_w)); + map(0x7c00, 0x7c00).rw(FUNC(xavix_state::timer_status_r), FUNC(xavix_state::timer_control_w)); map(0x7c01, 0x7c01).rw(FUNC(xavix_state::timer_baseval_r), FUNC(xavix_state::timer_baseval_w)); // r/w tested - map(0x7c02, 0x7c02).w(FUNC(xavix_state::timer_freq_w)); + map(0x7c02, 0x7c02).rw(FUNC(xavix_state::timer_freq_r), FUNC(xavix_state::timer_freq_w)); // Barrel Shifter registers // map(0x7ff0, 0x7ff1) @@ -540,7 +540,7 @@ static INPUT_PORTS_START( rad_mtrk ) PORT_MODIFY("IN1") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Horn") - 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? + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. INPUT_PORTS_END static INPUT_PORTS_START( rad_mtrkp ) @@ -638,6 +638,24 @@ static INPUT_PORTS_START( rad_snowp ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) INPUT_PORTS_END +static INPUT_PORTS_START( rad_ping ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select?") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pause?") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SERVICE ) // resets? not a real button? + + PORT_MODIFY("IN1") // are these for the 2nd player? + //PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pause?") + //PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + //PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + //PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE ) // resets? not a real button? + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. +INPUT_PORTS_END + static INPUT_PORTS_START( namcons2 ) PORT_INCLUDE(xavix) @@ -695,8 +713,13 @@ CUSTOM_INPUT_MEMBER( xavix_state::rad_rh_in1_08_r ) static INPUT_PORTS_START( rad_rh ) PORT_INCLUDE(xavix) + PORT_MODIFY("IN0") // hold Button1+2 when resetting for a version number + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_MODIFY("IN1") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_state,rad_rh_in1_08_r, (void *)0) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. INPUT_PORTS_END /* correct, 4bpp gfxs */ @@ -991,51 +1014,51 @@ ROM_END /* Standalone TV Games */ -CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_IS_SKELETON ) +CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 2006, taitons2, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2", MACHINE_IS_SKELETON ) +CONS( 2006, taitons2, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 2006, namcons1, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1", MACHINE_IS_SKELETON ) +CONS( 2006, namcons1, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 2006, namcons2, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2", MACHINE_IS_SKELETON ) +CONS( 2006, namcons2, 0, 0, xavix_i2c_24lc04, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 2000, rad_ping, 0, 0, xavix, xavix, xavix_state, init_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( 2000, rad_ping, 0, 0, xavix, rad_ping, xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd" -CONS( 2003, rad_mtrk, 0, 0, xavix, rad_mtrk, xavix_state, init_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, init_xavix, "Radica / SSD Company LTD", "ConnecTV Monster Truck (PAL)", MACHINE_IS_SKELETON ) +CONS( 2003, rad_mtrk, 0, 0, xavix, rad_mtrk, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Monster Truck (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) +CONS( 2003, rad_mtrkp, rad_mtrk, 0, xavixp, rad_mtrkp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Monster Truck (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 200?, rad_box, 0, 0, xavix, rad_box, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Boxing (NTSC)", MACHINE_IS_SKELETON) -CONS( 200?, rad_boxp, rad_box, 0, xavixp, rad_boxp, xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Boxing (PAL)", MACHINE_IS_SKELETON) +CONS( 200?, rad_box, 0, 0, xavix, rad_box, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Boxin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) +CONS( 200?, rad_boxp, rad_box, 0, xavixp, rad_boxp, xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Boxin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_IS_SKELETON) -CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp, rad_crdnp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_IS_SKELETON) +CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) +CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp, rad_crdnp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 2002, rad_bb2, 0, 0, xavix, rad_bb2, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball 2", MACHINE_IS_SKELETON ) // contains string "Radica RBB2 V1.0" +CONS( 2002, rad_bb2, 0, 0, xavix, rad_bb2, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball 2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) // contains string "Radica RBB2 V1.0" -CONS( 2001, rad_bass, 0, 0, xavix, rad_bass, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Bass Fishin' (NTSC)", MACHINE_IS_SKELETON) -CONS( 2001, rad_bassp, rad_bass, 0, xavixp, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_IS_SKELETON) +CONS( 2001, rad_bass, 0, 0, xavix, rad_bass, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Bass Fishin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) +CONS( 2001, rad_bassp, rad_bass, 0, xavixp, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) // there is another 'Snowboarder' with a white coloured board, it appears to be a newer game closer to 'SSX Snowboarder' but without the SSX license. -CONS( 2001, rad_snow, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_IS_SKELETON) -CONS( 2001, rad_snowp, rad_snow, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_IS_SKELETON) +CONS( 2001, rad_snow, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) +CONS( 2001, rad_snowp, rad_snow, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 2003, rad_madf, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radica / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_IS_SKELETON) // no Play TV branding, USA only release? +CONS( 2003, rad_madf, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radica / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) // no Play TV branding, USA only release? -CONS( 200?, rad_fb, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Football (NTSC)", MACHINE_IS_SKELETON) // USA only release? doesn't change logo for PAL +CONS( 200?, rad_fb, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) // USA only release? doesn't change logo for PAL -CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radioa / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes", MACHINE_IS_SKELETON) +CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radioa / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_IS_SKELETON) +CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf", MACHINE_IS_SKELETON) +CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 200?, eka_base, 0, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara (US?)", MACHINE_IS_SKELETON|MACHINE_IS_BIOS_ROOT) +CONS( 200?, eka_base, 0, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara (US?)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND|MACHINE_IS_BIOS_ROOT) -CONS( 200?, eka_strt, eka_base, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Starter (US?)", MACHINE_IS_SKELETON) +CONS( 200?, eka_strt, eka_base, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Starter (US?)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) -CONS( 200?, eka_vol1, eka_base, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Volume 1 (US?)", MACHINE_IS_SKELETON) // insert calls it 'HIT MIX Vol 1' +CONS( 200?, eka_vol1, eka_base, 0, xavix, xavix, xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Volume 1 (US?)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) // insert calls it 'HIT MIX Vol 1' -CONS( 200?, eka_vol2, eka_base, 0, xavix, xavix , xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Volume 2 (US?)", MACHINE_IS_SKELETON) // insert calls it 'HIT MIX Vol 2' +CONS( 200?, eka_vol2, eka_base, 0, xavix, xavix , xavix_state, init_xavix, "Takara / Hasbro / SSD Company LTD", "e-kara Volume 2 (US?)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) // insert calls it 'HIT MIX Vol 2' /* 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. @@ -1070,9 +1093,9 @@ ROM_START( drgqst ) ROM_END -CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_IS_SKELETON ) +CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) -CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_IS_SKELETON ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_IS_SKELETON ) -CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_IS_SKELETON ) -CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_IS_SKELETON ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix, xavix_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index f73d3381c22..b9c61a873ce 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -180,10 +180,17 @@ void superxavix_lowbus_map(address_map &map); DECLARE_WRITE8_MEMBER(sound_75fe_w); DECLARE_WRITE8_MEMBER(sound_75ff_w); + DECLARE_READ8_MEMBER(timer_status_r); DECLARE_WRITE8_MEMBER(timer_control_w); DECLARE_READ8_MEMBER(timer_baseval_r); DECLARE_WRITE8_MEMBER(timer_baseval_w); + DECLARE_READ8_MEMBER(timer_freq_r); DECLARE_WRITE8_MEMBER(timer_freq_w); + uint8_t m_timer_control; + uint8_t m_timer_freq; + TIMER_CALLBACK_MEMBER(freq_timer_done); + emu_timer *m_freq_timer; + DECLARE_WRITE8_MEMBER(tmap1_regs_w); DECLARE_WRITE8_MEMBER(tmap2_regs_w); @@ -205,6 +212,9 @@ void superxavix_lowbus_map(address_map &map); required_device m_maincpu; required_device m_screen; + + void update_irqs(); + uint8_t m_irqsource; uint8_t m_vectorenable; uint8_t m_nmi_vector_lo_data; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 91dd8c1581e..80362a38434 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -10,6 +10,16 @@ // general DMA to/from entire main map (not dedicated sprite DMA) WRITE8_MEMBER(xavix_state::rom_dmatrg_w) { + // 0x80 is set in the IRQ routine, presumably to ack it + if (data & 0x80) + { + if (m_irqsource & 0x20) + { + m_irqsource &= ~0x20; + update_irqs(); + } + } + if (data & 0x01) // namcons2 writes 0x81, most of the time things write 0x01 { LOG("%s: rom_dmatrg_w (do DMA?) %02x\n", machine().describe_context(), data); @@ -30,6 +40,13 @@ WRITE8_MEMBER(xavix_state::rom_dmatrg_w) uint8_t dat = m_maincpu->read_full_data_sp(m_tmpaddress); m_maincpu->write_full_data(dest+i, dat); } + + if (data & 0x40) // or merely the absense of 0x80 being set? (ttv_lotr and drgqst are the only games needing the IRQ and both set 0x40 tho) + { + m_irqsource |= 0x20; + update_irqs(); + } + } else // the interrupt routine writes 0x80 to the trigger, maybe 'clear IRQ?' { @@ -189,8 +206,6 @@ READ8_MEMBER(xavix_state::dispctrl_6ff8_r) WRITE8_MEMBER(xavix_state::dispctrl_6ff8_w) { - // I think this is something to do with IRQ ack / enable - // 0x80 = main IRQ ack? // 0x40 = raster IRQ ack? // 0x20 = main IRQ enable @@ -198,7 +213,8 @@ WRITE8_MEMBER(xavix_state::dispctrl_6ff8_w) if (data & 0x40) { - m_maincpu->set_input_line(0, CLEAR_LINE); + m_irqsource &= ~0x40; + update_irqs(); } if (data & 0x80) @@ -210,14 +226,27 @@ WRITE8_MEMBER(xavix_state::dispctrl_6ff8_w) // printf("%s: dispctrl_6ff8_w %02x\n", machine().describe_context(), data); } +void xavix_state::update_irqs() +{ + if (m_irqsource != 0x00) + { + m_maincpu->set_input_line(0, ASSERT_LINE); + } + else + { + m_maincpu->set_input_line(0, CLEAR_LINE); + } +} TIMER_CALLBACK_MEMBER(xavix_state::interrupt_gen) { if (m_video_ctrl & 0x10) { //printf("callback on scanline %d %d with IRQ enabled\n", m_screen->vpos(), m_screen->hpos()); - m_maincpu->set_input_line(0, ASSERT_LINE); m_video_ctrl |= 0x40; + m_irqsource |= 0x40; + update_irqs(); + m_screen->update_partial(m_screen->vpos()); } m_interrupt_timer->adjust(attotime::never, 0); @@ -362,9 +391,17 @@ READ8_MEMBER(xavix_state::timer_baseval_r) return m_timer_baseval; } +READ8_MEMBER(xavix_state::timer_status_r) +{ + uint8_t ret = m_timer_control; + LOG("%s: timer_status_r\n", machine().describe_context()); + return ret; +} + WRITE8_MEMBER(xavix_state::timer_control_w) { LOG("%s: timer_control_w %02x\n", machine().describe_context(), data); + m_timer_control = data; } WRITE8_MEMBER(xavix_state::timer_baseval_w) @@ -374,12 +411,48 @@ WRITE8_MEMBER(xavix_state::timer_baseval_w) LOG("%s: timer_baseval_w %02x\n", machine().describe_context(), data); } +READ8_MEMBER(xavix_state::timer_freq_r) +{ + LOG("%s: timer_freq_r\n", machine().describe_context()); + return m_timer_freq; +} + WRITE8_MEMBER(xavix_state::timer_freq_w) { // 4-bit prescale LOG("%s: timer_freq_w %02x\n", machine().describe_context(), data); + + /* if master clock (MC) is XTAL(21'477'272) (NTSC master) + + 0x0 = MC / 2 = 10.738636 MHz + 0x1 = MC / 4 = 5.369318 MHz + 0x2 = MC / 8 = 2.684659 MHz + 0x3 = MC / 16 = 1.3423295 MHz + 0x4 = MC / 32 = 671.16475 kHz + 0x5 = MC / 64 = 335.582375 kHz + 0x6 = MC / 128 = 167.7911875 kHz + 0x7 = MC / 256 = 83.89559375 kHz + 0x8 = MC / 512 = 41.947796875 kHz + 0x9 = MC / 1024 = 20.9738984375 kHz + 0xa = MC / 2048 = 10.48694921875 kHz + 0xb = MC / 4096 = 5.243474609375 kHz + 0xc = MC / 8192 = 2.6217373046875 kHz + 0xd = MC / 16384 = 1.31086865234375 kHz + 0xe = MC / 32768 = 655.434326171875 Hz + 0xf = MC / 65536 = 327.7171630859375 Hz + */ + m_timer_freq = data & 0x0f; + + if (data & 0xf0) + LOG("%s: unexpected upper bits in timer freq %02x\n", machine().describe_context(), data & 0xf0); } +TIMER_CALLBACK_MEMBER(xavix_state::freq_timer_done) +{ + +} + + READ8_MEMBER(xavix_state::mult_r) { @@ -463,7 +536,7 @@ READ8_MEMBER(xavix_state::irq_source_r) */ LOG("%s: irq_source_r\n", machine().describe_context()); - return 0x40; + return m_irqsource; } WRITE8_MEMBER(xavix_state::irq_source_w) @@ -480,6 +553,7 @@ void xavix_state::machine_start() std::fill_n(&m_mainram[0], 0x4000, 0xff); m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_state::interrupt_gen), this)); + m_freq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_state::freq_timer_done), this)); } void xavix_state::machine_reset() @@ -534,6 +608,9 @@ void xavix_state::machine_reset() m_io0_direction = 0x00; m_io1_direction = 0x00; + m_irqsource = 0x00; + + m_timer_control = 0x00; } typedef device_delegate xavix_interrupt_vector_delegate; diff --git a/src/mame/video/xavix.cpp b/src/mame/video/xavix.cpp index 4e4187ce6ca..08dca3a2527 100644 --- a/src/mame/video/xavix.cpp +++ b/src/mame/video/xavix.cpp @@ -603,6 +603,11 @@ void xavix_state::draw_tile_line(screen_device &screen, bitmap_ind16 &bitmap, co if ((ypos >= cliprect.min_y && ypos <= cliprect.max_y)) { + // if bpp>4 then ignore unaligned palette selects bits based on bpp + // ttv_lotr uses 5bpp graphics (so 32 colour alignment) but sets palette 0xf (a 16 colour boundary) when it expects palette 0xe + if (bpp>4) + pal &= (0xf<<(bpp-4)); + int bits_per_tileline = drawwidth * bpp; // set the address here so we can increment in bits in the draw function @@ -744,7 +749,8 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, dat |= (get_next_bit() << i); } - yposptr[x] = dat + 0x100; + if (x < cliprect.max_x) + yposptr[x] = dat + 0x100; } }