diff --git a/src/mame/arcade.lst b/src/mame/arcade.lst index ae3200317fe..dd5e9187a78 100644 --- a/src/mame/arcade.lst +++ b/src/mame/arcade.lst @@ -8956,6 +8956,7 @@ edfu // (c) 1991 (North America) edfbl // (c) 1991 64street // (c) 1991 64streetj // (c) 1991 (Japan) +64streetja // (c) 1991 (Japan) soldam // (c) 1992 soldamj // (c) 1992 (Japan) bigstrik // (c) 1992 diff --git a/src/mame/drivers/megasys1.cpp b/src/mame/drivers/megasys1.cpp index ad32ebb1961..bed3ec42e7d 100644 --- a/src/mame/drivers/megasys1.cpp +++ b/src/mame/drivers/megasys1.cpp @@ -43,7 +43,7 @@ Year + Game System Protection Peek-a-Boo! D Inputs --------------------------------------------------------------------- -NOTE: Chimera Beast is the only game missing a dump of its priority PROM +NOTE: Chimera Beast PROM has not been dumped, but looks like it should match 64street based on game analysis. Hardware Main CPU Sound CPU Sound Chips @@ -94,10 +94,6 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? < Issues / To Do -------------- -- There is a 512 byte PROM in the video section (differs by game) that - controls the priorities. This prom is currently missing for one game, - so we have to use fake data for it (Chimera Beast). - - Making the M6295 status register return 0 fixes the music tempo in avspirit, 64street, astyanax etc. but makes most of the effects in hachoo disappear! Define SOUND_HACK to 0 to turn this hack off @@ -105,15 +101,9 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? < bootleg version of rodlandj has one instruction patched out to do exactly the same thing that we are doing (ignoring the 6295 status). -- Understand properly how irqs truly works, kazan / iganinju is (again) broken. +- Understand properly how irqs truly works, kazan / iganinju solution seems hacky -- 64street: player characters in attract mode doesn't move at all, protection? - they move on the real PCB - -- tshingen: unemulated mosaic effect when killing enemies with the flashing sword. - See https://youtu.be/m4ZH0v8UqWs - The effect can be tested in e.g. stdragon and p47 test mode: - See https://youtu.be/zo3FTCqkNBc and https://youtu.be/dEqH017YBzw +- P47 intro effect is imperfect ( https://www.youtube.com/watch?v=eozZGcVspVw ) - Understand a handful of unknown bits in video regs @@ -144,16 +134,16 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? < MACHINE_RESET_MEMBER(megasys1_state,megasys1) { - m_ignore_oki_status = 1; /* ignore oki status due 'protection' */ - m_ip_select = 0; /* reset protection */ + + m_ignore_oki_status = 1; /* ignore oki status due 'protection' */ + m_ip_latched = 0x0006; /* reset protection - some games expect this initial read without sending anything */ m_mcu_hs = 0; } MACHINE_RESET_MEMBER(megasys1_state,megasys1_hachoo) { + MACHINE_RESET_CALL_MEMBER(megasys1); m_ignore_oki_status = 0; /* strangely hachoo need real oki status */ - m_ip_select = 0; /* reset protection */ - m_mcu_hs = 0; } @@ -254,7 +244,14 @@ TIMER_DEVICE_CALLBACK_MEMBER(megasys1_state::megasys1B_scanline) in that order. */ -READ16_MEMBER(megasys1_state::ip_select_r) +READ16_MEMBER(megasys1_state::ip_select_r) // FROM MCU +{ + return m_ip_latched; +} + + + +WRITE16_MEMBER(megasys1_state::ip_select_w) // TO MCU { int i; @@ -266,26 +263,24 @@ READ16_MEMBER(megasys1_state::ip_select_r) // 20 21 22 23 24 < edf // 51 52 53 54 55 < hayaosi1 - /* f(x) = ((x*x)>>4)&0xFF ; f(f($D)) == 6 */ - if ((m_ip_select & 0xF0) == 0xF0) return 0x000D; - for (i = 0; i < 5; i++) if (m_ip_select == m_ip_select_values[i]) break; + for (i = 0; i < 7; i++) if ((data & 0x00ff) == m_ip_select_values[i]) break; switch (i) { - case 0 : return m_io_system->read(); - case 1 : return m_io_p1->read(); - case 2 : return m_io_p2->read(); - case 3 : return m_io_dsw1->read(); - case 4 : return m_io_dsw2->read(); - default : return 0x0006; + case 0 : m_ip_latched = m_io_system->read(); break; + case 1 : m_ip_latched = m_io_p1->read(); break; + case 2 : m_ip_latched = m_io_p2->read(); break; + case 3 : m_ip_latched = m_io_dsw1->read(); break; + case 4 : m_ip_latched = m_io_dsw2->read(); break; + case 5 : m_ip_latched = 0x0d; break; // startup check? + case 6 : m_ip_latched = 0x06; break; // sent before each other command + default: return; // get out if it wasn't a valid request } -} -WRITE16_MEMBER(megasys1_state::ip_select_w) -{ - COMBINE_DATA(&m_ip_select); + + // if the command is valid, generate an IRQ from the MCU m_maincpu->set_input_line(2, HOLD_LINE); } @@ -1812,6 +1807,40 @@ ROM_START( 64street ) ROM_LOAD( "pr91009.12", 0x0000, 0x0200, CRC(c69423d6) SHA1(ba9644a9899df2d73a5a16bf7ceef1954c2e25f3) ) // same as pr-91044 on hayaosi1 ROM_END +ROM_START( 64streetja ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */ + ROM_LOAD16_BYTE( "ic53.bin", 0x000000, 0x040000, CRC(c978d086) SHA1(b091faf570841f098d4d70bf3ca4f26d6cda890a) ) + ROM_LOAD16_BYTE( "ic52.bin", 0x000001, 0x040000, CRC(af475852) SHA1(5e0a375dd904a4176ca6fdccdb67a907e270e9be) ) + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD16_BYTE( "64th_08.rom", 0x000000, 0x010000, CRC(632be0c1) SHA1(626073037249d96ac70b2d11b2dd72b22bac49c7) ) + ROM_LOAD16_BYTE( "64th_07.rom", 0x000001, 0x010000, CRC(13595d01) SHA1(e730a530ca232aab883217fa12804075cb2aa640) ) + + ROM_REGION( 0x1000, "mcu", 0 ) /* MCU Internal Code, M50747? */ + ROM_LOAD( "64street.mcu", 0x000000, 0x1000, NO_DUMP ) + + ROM_REGION( 0x80000, "gfx1", 0 ) /* Scroll 0 */ + ROM_LOAD( "64th_01.rom", 0x000000, 0x080000, CRC(06222f90) SHA1(52b6cb88b9d2209c16d1633c83c0224b6ebf29dc) ) + + ROM_REGION( 0x80000, "gfx2", 0 ) /* Scroll 1 */ + ROM_LOAD( "64th_06.rom", 0x000000, 0x080000, CRC(2bfcdc75) SHA1(f49f92f1ff58dccf72e05ecf80761c7b65a25ba3) ) + + ROM_REGION( 0x20000, "gfx3", 0 ) /* Scroll 2 */ + ROM_LOAD( "64th_09.rom", 0x000000, 0x020000, CRC(a4a97db4) SHA1(1179457a6f33b3b44fac6056f6245f3aaae6afd5) ) + + ROM_REGION( 0x100000, "gfx4", 0 ) /* Sprites */ + ROM_LOAD( "64th_05.rom", 0x000000, 0x080000, CRC(a89a7020) SHA1(be36e58e9314688ee39249944c5a6c201e0249ee) ) + ROM_LOAD( "64th_04.rom", 0x080000, 0x080000, CRC(98f83ef6) SHA1(e9b72487695ac7cdc4fbf595389c4b8781ed207e) ) + + ROM_REGION( 0x40000, "oki1", 0 ) /* Samples */ + ROM_LOAD( "64th_11.rom", 0x000000, 0x020000, CRC(b0b8a65c) SHA1(b7e42d9083d0bbfe160fc73a7317d696e90d83d6) ) + + ROM_REGION( 0x40000, "oki2", 0 ) /* Samples */ + ROM_LOAD( "64th_10.rom", 0x000000, 0x040000, CRC(a3390561) SHA1(f86d5c61e3e80d30408535c2203940ca1e95ac18) ) + + ROM_REGION( 0x0200, "proms", 0 ) /* Priority PROM */ + ROM_LOAD( "pr91009.12", 0x0000, 0x0200, CRC(c69423d6) SHA1(ba9644a9899df2d73a5a16bf7ceef1954c2e25f3) ) // same as pr-91044 on hayaosi1 +ROM_END ROM_START( 64streetj ) ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU Code */ @@ -2251,7 +2280,7 @@ ROM_START( chimerab ) ROM_LOAD( "voi10.bin", 0x000000, 0x040000, CRC(67498914) SHA1(8d89fa90f38fd102b15f26f71491ea833ec32cb2) ) ROM_REGION( 0x0200, "proms", 0 ) /* Priority PROM */ - ROM_LOAD( "prom", 0x0000, 0x0200, NO_DUMP ) + ROM_LOAD( "pr-91044", 0x0000, 0x0200, BAD_DUMP CRC(c69423d6) SHA1(ba9644a9899df2d73a5a16bf7ceef1954c2e25f3) ) // guess, but 99% sure it's meant to be the same as 64street/hayaosi1 based on analysis of game and previous handcrafted data ROM_END @@ -3988,6 +4017,10 @@ DRIVER_INIT_MEMBER(megasys1_state,64street) m_ip_select_values[2] = 0x54; m_ip_select_values[3] = 0x55; m_ip_select_values[4] = 0x56; + + m_ip_select_values[5] = 0xfa; + m_ip_select_values[6] = 0x06; + } READ16_MEMBER(megasys1_state::megasys1A_mcu_hs_r) @@ -4041,6 +4074,10 @@ DRIVER_INIT_MEMBER(megasys1_state,avspirit) m_ip_select_values[3] = 0x33; m_ip_select_values[4] = 0x34; + m_ip_select_values[5] = 0xff; + m_ip_select_values[6] = 0x06; + + // has twice less RAM m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x060000, 0x06ffff); m_maincpu->space(AS_PROGRAM).install_ram(0x070000, 0x07ffff, m_ram); @@ -4053,6 +4090,10 @@ DRIVER_INIT_MEMBER(megasys1_state,bigstrik) m_ip_select_values[2] = 0x55; m_ip_select_values[3] = 0x56; m_ip_select_values[4] = 0x57; + + m_ip_select_values[5] = 0xfb; + m_ip_select_values[6] = 0x06; + } DRIVER_INIT_MEMBER(megasys1_state,chimerab) @@ -4063,6 +4104,10 @@ DRIVER_INIT_MEMBER(megasys1_state,chimerab) m_ip_select_values[2] = 0x53; m_ip_select_values[3] = 0x54; m_ip_select_values[4] = 0x55; + + m_ip_select_values[5] = 0xf2; + m_ip_select_values[6] = 0x06; + } DRIVER_INIT_MEMBER(megasys1_state,cybattlr) @@ -4072,6 +4117,9 @@ DRIVER_INIT_MEMBER(megasys1_state,cybattlr) m_ip_select_values[2] = 0x53; m_ip_select_values[3] = 0x54; m_ip_select_values[4] = 0x55; + + m_ip_select_values[5] = 0xf2; + m_ip_select_values[6] = 0x06; } DRIVER_INIT_MEMBER(megasys1_state,edf) @@ -4081,6 +4129,10 @@ DRIVER_INIT_MEMBER(megasys1_state,edf) m_ip_select_values[2] = 0x22; m_ip_select_values[3] = 0x23; m_ip_select_values[4] = 0x24; + + m_ip_select_values[5] = 0xf0; + m_ip_select_values[6] = 0x06; + } READ16_MEMBER(megasys1_state::edfbl_input_r) @@ -4115,6 +4167,10 @@ DRIVER_INIT_MEMBER(megasys1_state,hayaosi1) m_ip_select_values[2] = 0x53; m_ip_select_values[3] = 0x54; m_ip_select_values[4] = 0x55; + + m_ip_select_values[5] = 0xfc; + m_ip_select_values[6] = 0x06; + } READ16_MEMBER(megasys1_state::iganinju_mcu_hs_r) @@ -4390,7 +4446,8 @@ GAME( 1993, hayaosi1, 0, system_B_hayaosi1, hayaosi1, megasys1_state, hay // Type C GAME( 1991, 64street, 0, system_C, 64street, megasys1_state, 64street, ROT0, "Jaleco", "64th. Street - A Detective Story (World)", 0 ) -GAME( 1991, 64streetj,64street, system_C, 64street, megasys1_state, 64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan)", 0 ) +GAME( 1991, 64streetj,64street, system_C, 64street, megasys1_state, 64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 1)", 0 ) +GAME( 1991, 64streetja,64street,system_C, 64street, megasys1_state, 64street, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 2)", 0 ) GAME( 1992, bigstrik, 0, system_C, bigstrik, megasys1_state, bigstrik, ROT0, "Jaleco", "Big Striker", 0 ) GAME( 1993, chimerab, 0, system_C, chimerab, megasys1_state, chimerab, ROT0, "Jaleco", "Chimera Beast (Japan, prototype)", 0 ) GAME( 1993, cybattlr, 0, system_C, cybattlr, megasys1_state, cybattlr, ROT90, "Jaleco", "Cybattler", 0 ) diff --git a/src/mame/includes/megasys1.h b/src/mame/includes/megasys1.h index 414b670cc36..65694249f8f 100644 --- a/src/mame/includes/megasys1.h +++ b/src/mame/includes/megasys1.h @@ -65,8 +65,8 @@ public: bitmap_ind16 m_sprite_buffer_bitmap; UINT16 *m_spriteram; - UINT16 m_ip_select; - UINT16 m_ip_select_values[5]; + UINT16 m_ip_select_values[7]; + UINT16 m_ip_latched; UINT8 m_ignore_oki_status; UINT16 m_protection_val; int m_scrollx[3]; diff --git a/src/mame/video/megasys1.cpp b/src/mame/video/megasys1.cpp index 1770c490218..7e04cec112d 100644 --- a/src/mame/video/megasys1.cpp +++ b/src/mame/video/megasys1.cpp @@ -844,14 +844,6 @@ struct priority */ -static const struct priority priorities[] = -{ - { "chimerab", - { 0x14032,0x04132,0x14032,0x04132,0xfffff,0xfffff,0xfffff,0xfffff, - 0xfffff,0xfffff,0x01324,0xfffff,0xfffff,0xfffff,0xfffff,0xfffff } - }, - { nullptr } // end of list: use the prom's data -}; /* @@ -901,27 +893,8 @@ void megasys1_state::megasys1_priority_create() { const UINT8 *color_prom = memregion("proms")->base(); int pri_code, offset, i, order; - - /* First check if we have an hand-crafted priority scheme - available (this should happen only if no good dump - of the prom is known) */ - - i = 0; - while ( priorities[i].driver && - strcmp(priorities[i].driver, machine().system().name) != 0 && - strcmp(priorities[i].driver, machine().system().parent) != 0) - i++; - - if (priorities[i].driver) - { - memcpy (m_layers_order, priorities[i].priorities, 16 * sizeof(int)); - - logerror("WARNING: using an hand-crafted priorities scheme\n"); - - return; - } - - /* Otherwise, perform the conversion from the prom itself */ + + /* convert PROM to something we can use */ for (pri_code = 0; pri_code < 0x10 ; pri_code++) // 16 priority codes {