From f5193fabfad7bc99ff8d4488de062c8de2a90ad6 Mon Sep 17 00:00:00 2001 From: Furrtek Date: Mon, 1 Aug 2022 18:55:57 +0200 Subject: konami/k051960.cpp: Implemented shadow configuration bits (fixes shadows in Devastators). (#9353) Added descriptions for the other previously undocumented register bits, even if they shouldn't affect any game. Attempted to get chqflag shadow/highlights working properly with no k051960 hack. konami/k054000.cpp: Updated implementation to better match how the chip works. --- src/mame/konami/chqflag.cpp | 31 ++++++++--------- src/mame/konami/chqflag.h | 1 - src/mame/konami/k051960.cpp | 78 +++++++++++++++++++++++++------------------ src/mame/konami/k051960.h | 18 +++++----- src/mame/konami/k054000.cpp | 75 +++++++++++++++++++++-------------------- src/mame/konami/k054000.h | 2 ++ src/mame/konami/mainevt.cpp | 7 ---- src/mame/konami/mainevt_v.cpp | 3 -- src/mame/konami/tmnt.cpp | 16 ++------- src/mame/konami/tmnt.h | 1 - 10 files changed, 112 insertions(+), 120 deletions(-) diff --git a/src/mame/konami/chqflag.cpp b/src/mame/konami/chqflag.cpp index e1d7c4a6952..2c63d9aacfc 100644 --- a/src/mame/konami/chqflag.cpp +++ b/src/mame/konami/chqflag.cpp @@ -77,17 +77,25 @@ void chqflag_state::chqflag_vreg_w(uint8_t data) * 0x88 is for when night shows up (max amount of highlight) * 0x08 is used at dawn after 0x88 state * The shadow part looks ugly when rain starts/ends pouring (-> black colored with a setting of 0x00), - * the reference shows dimmed background when this event occurs (which is handled via reg 1 bit 0 of k051960 device), + * the reference shows dimmed background when this event occurs, * might be actually disabling the shadow here (-> setting 1.0f instead). * * TODO: true values aren't known, also shadow_factors table probably scales towards zero instead (game doesn't use those) */ - const double shadow_factors[4] = {0.8, 1.33, 1.66, 2.0 }; - const double highlight_factors[4] = {1.0, 1.33, 1.66, 2.0 }; - uint8_t shadow_value = ((data & 0x80) >> 6) | ((data & 0x08) >> 3); + const double shadow_factors[4] = {0.8, 1.0, 1.33, 1.66}; + uint8_t shadow_value = (data & 0x08) >> 3; + uint8_t shadow_setting = (data & 0x80) >> 7; + + m_k051960->set_shadow_inv(shadow_setting); - m_palette->set_shadow_factor(m_last_vreg != 0 ? highlight_factors[shadow_value] : shadow_factors[shadow_value] ); + m_palette->set_shadow_factor(shadow_factors[(shadow_setting << 1) + shadow_value]); + if (shadow_setting != m_last_vreg) + { + m_last_vreg = shadow_setting; + update_background_shadows(shadow_setting); + } + #if 0 if ((data & 0x80) != m_last_vreg) { @@ -304,18 +312,6 @@ inline void chqflag_state::update_background_shadows(uint8_t data) m_palette->set_pen_contrast(i, brt); } - -WRITE_LINE_MEMBER(chqflag_state::background_brt_w) -{ -// popmessage("%d",state); - - if (state != m_last_vreg) - { - m_last_vreg = state; - update_background_shadows(state); - } -} - void chqflag_state::chqflag(machine_config &config) { /* basic machine hardware */ @@ -348,7 +344,6 @@ void chqflag_state::chqflag(machine_config &config) m_k051960->set_sprite_callback(FUNC(chqflag_state::sprite_callback)); m_k051960->irq_handler().set_inputline(m_maincpu, KONAMI_IRQ_LINE); m_k051960->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); - m_k051960->vreg_contrast_handler().set(FUNC(chqflag_state::background_brt_w)); K051316(config, m_k051316[0], 0); m_k051316[0]->set_palette(m_palette); diff --git a/src/mame/konami/chqflag.h b/src/mame/konami/chqflag.h index e6329ca3f30..c8b92fc11c0 100644 --- a/src/mame/konami/chqflag.h +++ b/src/mame/konami/chqflag.h @@ -46,7 +46,6 @@ private: void k007232_extvolume_w(uint8_t data); void volume_callback0(uint8_t data); void volume_callback1(uint8_t data); - DECLARE_WRITE_LINE_MEMBER(background_brt_w); K051316_CB_MEMBER(zoom_callback_1); K051316_CB_MEMBER(zoom_callback_2); K051960_CB_MEMBER(sprite_callback); diff --git a/src/mame/konami/k051960.cpp b/src/mame/konami/k051960.cpp index 900fd6ebab2..d280a2e6c13 100644 --- a/src/mame/konami/k051960.cpp +++ b/src/mame/konami/k051960.cpp @@ -24,27 +24,33 @@ The 051960 can also genenrate IRQ, FIRQ and NMI signals. memory map: 000-007 is for the 051937, but also seen by the 051960 400-7ff is 051960 only -000 R bit 0 = vblank? +000 R bit 0 = active display flag aliens waits for it to be 0 before starting to copy sprite data thndrx2 needs it to pulse for the startup checks to succeed 000 W bit 0 = irq acknowledge - bit 1 = firq acknowledge? + bit 1 = firq acknowledge bit 2 = nmi enable/acknowledge bit 3 = flip screen (applies to sprites only, not tilemaps) - bit 4 = unknown, used by Devastators, TMNT, Aliens, Chequered Flag, maybe others + bit 4 = disable internal sprite processing + used by Devastators, TMNT, Aliens, Chequered Flag, maybe others aliens sets it just after checking bit 0, and before copying the sprite data bit 5 = enable gfx ROM reading -001 W Devastators sets bit 1, function unknown. + bit 6 = let cpu address bits 2~5 pass through CA0~3 when bit 5 is set +001 W bit 0 = invert shadow for all pens + bit 1 = force shadows for pen 0x0f + bit 2 = disable shadows for pen 0x0f (priority over bit 1) + Devastators sets bit 1. Ultraman sets the register to 0x0f. None of the other games I tested seem to set this register to other than 0. - Update: Chequered Flag sets bit 0 when background should be dimmed (palette control?) + Update: Chequered Flag sets bit 0 when background should be dimmed. 002-003 W selects the portion of the gfx ROMs to be read. -004 W Aliens uses this to select the ROM bank to be read, but Punk Shot +004 W bit 0 = OC6 when gfx ROM reading is enabled + bit 1 = OC7 when gfx ROM reading is enabled + Aliens uses this to select the ROM bank to be read, but Punk Shot and TMNT don't, they use another bit of the registers above. Many other games write to this register before testing. - It is possible that bits 2-7 of 003 go to OC0-OC5, and bits 0-1 of - 004 go to OC6-OC7. + Bits 2-7 of 003 go to OC0-OC5. 004-007 R reads data from the gfx ROMs (32 bits in total). The address of the data is determined by the register above and by the last address accessed on the 051960; plus bank switch bits for larger ROMs. @@ -140,11 +146,12 @@ k051960_device::k051960_device(const machine_config &mconfig, const char *tag, d , m_irq_handler(*this) , m_firq_handler(*this) , m_nmi_handler(*this) - , m_vreg_contrast_handler(*this) , m_romoffset(0) - , m_spriteflip(0) - , m_readroms(0) - , m_nmi_enabled(0) + , m_spriteflip(false) + , m_readroms(false) + , m_shadow_config(0) + , m_inv_shadow(false) + , m_nmi_enabled(false) { } @@ -169,6 +176,11 @@ void k051960_device::set_plane_order(int order) } } +void k051960_device::set_shadow_inv(bool inv) +{ + m_inv_shadow = inv; +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -203,12 +215,13 @@ void k051960_device::device_start() m_irq_handler.resolve_safe(); m_firq_handler.resolve_safe(); m_nmi_handler.resolve_safe(); - m_vreg_contrast_handler.resolve_safe(); // register for save states save_item(NAME(m_romoffset)); save_item(NAME(m_spriteflip)); save_item(NAME(m_readroms)); + save_item(NAME(m_shadow_config)); + save_item(NAME(m_inv_shadow)); save_item(NAME(m_nmi_enabled)); save_item(NAME(m_spriterombank)); save_pointer(NAME(m_ram), 0x400); @@ -221,9 +234,11 @@ void k051960_device::device_start() void k051960_device::device_reset() { m_romoffset = 0; - m_spriteflip = 0; - m_readroms = 0; - m_nmi_enabled = 0; + m_spriteflip = false; + m_readroms = false; + m_shadow_config = 0; + m_inv_shadow = false; + m_nmi_enabled = false; m_spriterombank[0] = 0; m_spriterombank[1] = 0; @@ -254,14 +269,15 @@ TIMER_CALLBACK_MEMBER( k051960_device::scanline_callback ) int k051960_device::k051960_fetchromdata( int byte ) { - int code, color, pri, shadow, off1, addr; + int code, color, pri, off1, addr; + bool shadow; addr = m_romoffset + (m_spriterombank[0] << 8) + ((m_spriterombank[1] & 0x03) << 16); code = (addr & 0x3ffe0) >> 5; off1 = addr & 0x1f; color = ((m_spriterombank[1] & 0xfc) >> 2) + ((m_spriterombank[2] & 0x03) << 6); pri = 0; - shadow = color & 0x80; + shadow = false; m_k051960_cb(&code, &color, &pri, &shadow); addr = (code << 7) | (off1 << 2) | byte; @@ -309,7 +325,7 @@ void k051960_device::k051937_w(offs_t offset, u8 data) //if (data & 0xc2) popmessage("051937 reg 00 = %02x",data); if (BIT(data, 0)) m_irq_handler(CLEAR_LINE); // bit 0, irq ack - if (BIT(data, 1)) m_firq_handler(CLEAR_LINE); // bit 1, firq ack? + if (BIT(data, 1)) m_firq_handler(CLEAR_LINE); // bit 1, firq ack // bit 2, nmi enable/ack m_nmi_enabled = BIT(data, 2); @@ -317,23 +333,20 @@ void k051960_device::k051937_w(offs_t offset, u8 data) m_nmi_handler(CLEAR_LINE); /* bit 3 = flip screen */ - m_spriteflip = data & 0x08; + m_spriteflip = BIT(data, 3); - /* bit 4 used by Devastators and TMNT, unknown */ + /* bit 4 used by Devastators and TMNT, to protect sprite RAM from corruption during updates ? */ /* bit 5 = enable gfx ROM reading */ - m_readroms = data & 0x20; + m_readroms = BIT(data, 5); //logerror("%s: write %02x to 051937 address %x\n", m_maincpu->pc(), data, offset); } else if (offset == 1) { - //popmessage("%04x: write %02x to 051937 address %x", m_maincpu->pc(), data, offset); - // Chequered Flag uses this bit to enable background palette dimming - // TODO: use a callback here for now, pending further investigation over this bit - m_vreg_contrast_handler(BIT(data,0)); - // unknown, Devastators writes 02 here in game if (0) logerror("%s: %02x to 051937 address %x\n", machine().describe_context(), data, offset); + + m_shadow_config = data & 0x07; } else if (offset >= 2 && offset < 5) { @@ -385,7 +398,7 @@ void k051960_device::k051960_sprites_draw( bitmap_ind16 &bitmap, const rectangle int sortedlist[NUM_SPRITES]; uint8_t drawmode_table[256]; - memset(drawmode_table, DRAWMODE_SOURCE, sizeof(drawmode_table)); + memset(drawmode_table, (BIT(m_shadow_config, 0) ^ m_inv_shadow) ? DRAWMODE_SHADOW : DRAWMODE_SOURCE, sizeof(drawmode_table)); drawmode_table[0] = DRAWMODE_NONE; for (offs = 0; offs < NUM_SPRITES; offs++) @@ -405,7 +418,8 @@ void k051960_device::k051960_sprites_draw( bitmap_ind16 &bitmap, const rectangle for (pri_code = 0; pri_code < NUM_SPRITES; pri_code++) { - int ox, oy, code, color, pri, shadow, size, w, h, x, y, flipx, flipy, zoomx, zoomy; + int ox, oy, code, color, pri, size, w, h, x, y, flipx, flipy, zoomx, zoomy; + bool shadow; /* sprites can be grouped up to 8x8. The draw order is 0 1 4 5 16 17 20 21 2 3 6 7 18 19 22 23 @@ -428,7 +442,7 @@ void k051960_device::k051960_sprites_draw( bitmap_ind16 &bitmap, const rectangle code = m_ram[offs + 2] + ((m_ram[offs + 1] & 0x1f) << 8); color = m_ram[offs + 3] & 0xff; pri = 0; - shadow = color & 0x80; + shadow = (!BIT(m_shadow_config, 2) && (BIT(m_shadow_config, 1) || BIT(color, 7))) ^ BIT(m_shadow_config, 0); m_k051960_cb(&code, &color, &pri, &shadow); if (max_priority != -1) @@ -463,8 +477,8 @@ void k051960_device::k051960_sprites_draw( bitmap_ind16 &bitmap, const rectangle flipy = !flipy; } - drawmode_table[gfx(0)->granularity() - 1] = shadow ? DRAWMODE_SHADOW : DRAWMODE_SOURCE; - + drawmode_table[gfx(0)->granularity() - 1] = (shadow ^ m_inv_shadow) ? DRAWMODE_SHADOW : DRAWMODE_SOURCE; + if (zoomx == 0x10000 && zoomy == 0x10000) { int sx, sy; diff --git a/src/mame/konami/k051960.h b/src/mame/konami/k051960.h index 43db938c508..9bdd7248d20 100644 --- a/src/mame/konami/k051960.h +++ b/src/mame/konami/k051960.h @@ -13,7 +13,7 @@ enum }; -#define K051960_CB_MEMBER(_name) void _name(int *code, int *color, int *priority, int *shadow) +#define K051960_CB_MEMBER(_name) void _name(int *code, int *color, int *priority, bool *shadow) class k051960_device : public device_t, public device_gfx_interface, public device_video_interface @@ -26,7 +26,7 @@ class k051960_device : public device_t, public device_gfx_interface, public devi DECLARE_GFXDECODE_MEMBER(gfxinfo_gradius3); public: - using sprite_delegate = device_delegate; + using sprite_delegate = device_delegate; k051960_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -34,12 +34,11 @@ public: auto nmi_handler() { return m_nmi_handler.bind(); } - auto vreg_contrast_handler() { return m_vreg_contrast_handler.bind(); } - // static configuration template void set_sprite_callback(T &&... args) { m_k051960_cb.set(std::forward(args)...); } void set_plane_order(int order); + void set_shadow_inv(bool inv); /* The callback is passed: @@ -84,12 +83,13 @@ private: // TODO: is this even used by anything? devcb_write_line m_firq_handler; devcb_write_line m_nmi_handler; - devcb_write_line m_vreg_contrast_handler; - uint8_t m_spriterombank[3]; - int m_romoffset; - int m_spriteflip, m_readroms; - int m_nmi_enabled; + uint8_t m_spriterombank[3]; + uint8_t m_romoffset; + bool m_spriteflip, m_readroms; + uint8_t m_shadow_config; + bool m_inv_shadow; + bool m_nmi_enabled; int k051960_fetchromdata( int byte ); }; diff --git a/src/mame/konami/k054000.cpp b/src/mame/konami/k054000.cpp index ecbcde356ff..ee72e70b4d5 100644 --- a/src/mame/konami/k054000.cpp +++ b/src/mame/konami/k054000.cpp @@ -9,9 +9,8 @@ happened. It has no access to gfx data, it only does arithmetical operations on the parameters. - TODO: - - Thunder Cross II POST checks of this chip, we currently bypass that with a ROM patch in - driver. It literally tests the chip in an unit test fashion: + Thunder Cross II POST checks of this chip. + It literally tests the chip in an unit test fashion: 1. zeroing all ports; 2. test that status returns 0; 3. ping ACX reg 0 with 0xff; @@ -21,18 +20,10 @@ 7. ping ACX reg 1 with 0xff; 8. test status = 1; 9. rinse and repeat until all registers are exausted. - Assertion eventually fails when testing the "delta" registers: - ACX ffffffff|ACY ffffff00|AAX 01 AAY 01 - BCX ffffff00|BCY ffffff00|BAX 01 BAY 01 - Result: actual 0 (yes), expected 1 (no) - - The fun part is that game doesn't even access the chip at all during gameplay - (or at least not until stage 6, where game disallows continues) while the specific - "delta" registers are instead challenged by Vendetta OTG attacks (cfr. MT#06393, MT#07839). - We currently pay the technical debt inside thndrx2 itself, by notifying that "14D" returns - bad but still making it to boot anyway while marking these games with MUP. - Any attempt to fix it here without real HW tests goes into wild speculations unfortunately. + The fun part is that game doesn't even access the chip at all during gameplay + (or at least not until stage 6, where game disallows continues) while the specific + "delta" registers are instead challenged by Vendetta OTG attacks (cfr. MT#06393, MT#07839). **************************************************************************************************/ @@ -100,13 +91,13 @@ void k054000_device::device_reset() Memory map: 00 unused 01-03 W A center X -04 W A delta correction X? +04 W A delta correction X 05 unused 06 W A semiaxis X 07 W A semiaxis Y 08 unused 09-0b W A center Y -0c W A delta correction Y? +0c W A delta correction Y 0d unused 0e W B semiaxis X 0f W B semiaxis Y @@ -120,41 +111,46 @@ void k054000_device::map(address_map &map) { map.unmap_value_low(); map(0x01, 0x04).w(FUNC(k054000_device::acx_w)); - map(0x06, 0x06).lw8(NAME([this] (u8 data) { m_Aax = data + 1; })); - map(0x07, 0x07).lw8(NAME([this] (u8 data) { m_Aay = data + 1; })); + map(0x06, 0x06).lw8(NAME([this] (u8 data) { m_Aax = data; })); + map(0x07, 0x07).lw8(NAME([this] (u8 data) { m_Aay = data; })); map(0x09, 0x0c).w(FUNC(k054000_device::acy_w)); - map(0x0e, 0x0e).lw8(NAME([this] (u8 data) { m_Bax = data + 1; })); - map(0x0f, 0x0f).lw8(NAME([this] (u8 data) { m_Bay = data + 1; })); + map(0x0e, 0x0e).lw8(NAME([this] (u8 data) { m_Bax = data; })); + map(0x0f, 0x0f).lw8(NAME([this] (u8 data) { m_Bay = data; })); map(0x11, 0x13).w(FUNC(k054000_device::bcy_w)); map(0x15, 0x17).w(FUNC(k054000_device::bcx_w)); map(0x18, 0x18).r(FUNC(k054000_device::status_r)); } -inline int k054000_device::convert_raw_to_result(u8 *buf) +inline int k054000_device::convert_raw_to_result_delta(u8 *buf) { int res = (buf[0] << 16) | (buf[1] << 8) | buf[2]; - //if (buf[0] & 0x80) - // res = (0x1000000 - res); - // last value in the buffer is used as OTG correction in Vendetta + + // Last value in the buffer is used as OTG correction in Vendetta if (buf[3] & 0x80) res -= (0x100 - buf[3]); else res += buf[3]; + return res; } +inline int k054000_device::convert_raw_to_result(u8 *buf) +{ + return (buf[0] << 16) | (buf[1] << 8) | buf[2]; +} + void k054000_device::acx_w(offs_t offset, u8 data) { m_raw_Acx[offset] = data; - m_Acx = convert_raw_to_result(m_raw_Acx); + m_Acx = convert_raw_to_result_delta(m_raw_Acx); } void k054000_device::acy_w(offs_t offset, u8 data) { m_raw_Acy[offset] = data; - m_Acy = convert_raw_to_result(m_raw_Acy); + m_Acy = convert_raw_to_result_delta(m_raw_Acy); } void k054000_device::bcx_w(offs_t offset, u8 data) @@ -169,21 +165,28 @@ void k054000_device::bcy_w(offs_t offset, u8 data) m_Bcy = convert_raw_to_result(m_raw_Bcy); } -u8 k054000_device::status_r() +u8 k054000_device::axis_check(u32 m_Ac, u32 m_Bc, u32 m_Aa, u32 m_Ba) { u8 res = 0; - - if (m_Acx + m_Aax < m_Bcx - m_Bax) + s32 sub = m_Ac - m_Bc; + + // MSB check + if ((sub > 511) || (sub <= -1024)) res |= 1; - - if (m_Bcx + m_Bax < m_Acx - m_Aax) - res |= 1; - - if (m_Acy + m_Aay < m_Bcy - m_Bay) + + // LSB check + if ((abs(sub) & 0x1ff) > ((m_Aa + m_Ba) & 0x1ff)) res |= 1; + + return res; +} - if (m_Bcy + m_Bay < m_Acy - m_Aay) - res |= 1; +u8 k054000_device::status_r() +{ + u8 res; + + res = axis_check(m_Acx, m_Bcx, m_Aax, m_Bax); + res |= axis_check(m_Acy, m_Bcy, m_Aay, m_Bay); if (LIVE_HITBOX_VIEW) logerror(print_hitbox_state(res)); diff --git a/src/mame/konami/k054000.h b/src/mame/konami/k054000.h index dd6799b0593..8f434982783 100644 --- a/src/mame/konami/k054000.h +++ b/src/mame/konami/k054000.h @@ -25,7 +25,9 @@ private: void acy_w(offs_t offset, u8 data); void bcx_w(offs_t offset, u8 data); void bcy_w(offs_t offset, u8 data); + int convert_raw_to_result_delta(u8 *buf); int convert_raw_to_result(u8 *buf); + u8 axis_check(u32 m_Ac, u32 m_Bc, u32 m_Aa, u32 m_Ba); u8 status_r(); u8 m_raw_Acx[4]{}, m_raw_Acy[4]{}, m_raw_Bcx[4]{}, m_raw_Bcy[4]{}; diff --git a/src/mame/konami/mainevt.cpp b/src/mame/konami/mainevt.cpp index 3b6f990a17b..2c314d8a2b9 100644 --- a/src/mame/konami/mainevt.cpp +++ b/src/mame/konami/mainevt.cpp @@ -14,13 +14,6 @@ Notes: - Devastators: has player-trench collision detection issues, player isn't supposed to go through them. -- Devastators: shadows don't work. Bit 7 of the sprite attribute is always 0, - could there be a global enable flag in the 051960? - This is particularly evident in level 2 where plane shadows cover other sprites. - The priority/shadow encoder PROM is quite complex, however bits 5-7 of the sprite - attribute don't seem to be used, at least not in the first two levels, so the - PROM just maps to the fixed priority order currently implemented. - - Devastators: sprite zooming for the planes in level 2 is particularly bad. - Devastators: title screen white backdrop is always supposed to flicker, diff --git a/src/mame/konami/mainevt_v.cpp b/src/mame/konami/mainevt_v.cpp index d31c2762790..49fa23122c0 100644 --- a/src/mame/konami/mainevt_v.cpp +++ b/src/mame/konami/mainevt_v.cpp @@ -67,9 +67,6 @@ K051960_CB_MEMBER(mainevt_state::dv_sprite_callback) { enum { sprite_colorbase = 128 / 16 }; - // enable shadow if upper bits are 0 - *shadow = ((*color & 0xe0) >> 5) == 0; - /* TODO: the priority/shadow handling (bits 5-7) seems to be quite complex (see PROM) */ *color = sprite_colorbase + (*color & 0x07); } diff --git a/src/mame/konami/tmnt.cpp b/src/mame/konami/tmnt.cpp index c81fd789e5f..3760477cd44 100644 --- a/src/mame/konami/tmnt.cpp +++ b/src/mame/konami/tmnt.cpp @@ -4452,16 +4452,6 @@ void tmnt_state::init_cuebrick() save_item(NAME(m_cuebrick_nvram)); } -void tmnt_state::init_thndrx2() -{ - u16 *ROM = (u16 *)memregion("maincpu")->base(); - - // cfr. notes in k054000 device - // this makes 11C / 12C to return bad (for ROM checksum) - // but goes on instead of halting for 14D (the protection chip device) - ROM[0x16c0 / 2] = 0x4e71; -} - // YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME,FLAGS GAME( 1989, cuebrick, 0, cuebrick, cuebrick, tmnt_state, init_cuebrick,ROT0, "Konami", "Cue Brick (World, version D)", MACHINE_SUPPORTS_SAVE ) @@ -4527,9 +4517,9 @@ GAME( 1991, ssridersjbd, ssriders, ssriders, ssriders, tmnt_state, empty_init, GAME( 1991, ssridersb, ssriders, sunsetbl, sunsetbl, tmnt_state, empty_init, ROT0, "bootleg", "Sunset Riders (bootleg 4 Players ver ADD)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1991, ssriders2, ssriders, sunsetbl, sunsetbl, tmnt_state, empty_init, ROT0, "bootleg", "Sunset Riders 2 (bootleg 4 Players ver ADD)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1991, thndrx2, 0, thndrx2, thndrx2, tmnt_state, init_thndrx2, ROT0, "Konami", "Thunder Cross II (World)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // Fails k054000 unit tests, cfr. driver_init & device -GAME( 1991, thndrx2a, thndrx2, thndrx2, thndrx2, tmnt_state, init_thndrx2, ROT0, "Konami", "Thunder Cross II (Asia)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // ^ -GAME( 1991, thndrx2j, thndrx2, thndrx2, thndrx2, tmnt_state, init_thndrx2, ROT0, "Konami", "Thunder Cross II (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // ^ +GAME( 1991, thndrx2, 0, thndrx2, thndrx2, tmnt_state, empty_init, ROT0, "Konami", "Thunder Cross II (World)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, thndrx2a, thndrx2, thndrx2, thndrx2, tmnt_state, empty_init, ROT0, "Konami", "Thunder Cross II (Asia)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, thndrx2j, thndrx2, thndrx2, thndrx2, tmnt_state, empty_init, ROT0, "Konami", "Thunder Cross II (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, prmrsocr, 0, prmrsocr, prmrsocr, prmrsocr_state, empty_init, ROT0, "Konami", "Premier Soccer (ver EAB)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, prmrsocrj, prmrsocr, prmrsocr, prmrsocr, prmrsocr_state, empty_init, ROT0, "Konami", "Premier Soccer (ver JAB)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/tmnt.h b/src/mame/konami/tmnt.h index f60120ea017..c29db69a80e 100644 --- a/src/mame/konami/tmnt.h +++ b/src/mame/konami/tmnt.h @@ -61,7 +61,6 @@ public: void init_mia(); void init_tmnt(); void init_cuebrick(); - void init_thndrx2(); protected: virtual void machine_start() override; -- cgit v1.2.3