new working clone

-----------------
Ufo Robo Dangar (9/26/1986, Japan) [Angelo Salese]
This commit is contained in:
angelosa 2018-04-21 06:58:06 +02:00
parent 5e53c46819
commit 5d74309d3b
3 changed files with 67 additions and 10 deletions

View File

@ -228,7 +228,7 @@ WRITE8_MEMBER(cop01_state::prot_address_w)
WRITE8_MEMBER(cop01_state::prot_data_w) WRITE8_MEMBER(cop01_state::prot_data_w)
{ {
if( m_prot_command>=0x32 && m_prot_command<=0x37 ) if( m_prot_command >=0x32 && m_prot_command <=0x37 )
{ {
m_prot_reg[m_prot_command-0x32] = data; m_prot_reg[m_prot_command-0x32] = data;

View File

@ -24,12 +24,10 @@ TODO
but it should really copy stuff from the extra ROM. but it should really copy stuff from the extra ROM.
- Ninja Emaki has minor protection issues, see NB1414M4 simulation for more info. - Ninja Emaki has minor protection issues, see NB1414M4 simulation for more info.
- dangarj has unemulated protection at I/Os 0x80-1 for missing sprites. - dangarj has unemulated protection at I/Os 0x80-1 for missing sprites.
[0x80] W is data This is a 1412M2, which is the same chip used in terracre.cpp and cop01.cpp
[0x81] W --11 xxxx address The protection here is used for a code snippet at 0xf9c0, that of course is the
[0x80] R result
The protection is used for a code snippet at 0xf9c0, that of course is the
sprite handling. The code snippet is sum8 with 0x27 at 0x9d74 so no, the sprite handling. The code snippet is sum8 with 0x27 at 0x9d74 so no, the
later dangar US version snippet doesn't work ... later dangar US version snippet doesn't work
***************************************************************************/ ***************************************************************************/
@ -60,7 +58,40 @@ READ8_MEMBER(galivan_state::IO_port_c0_r)
return (0x58); /* To Avoid Reset on Ufo Robot dangar */ return (0x58); /* To Avoid Reset on Ufo Robot dangar */
} }
// simplified version of the 1412M2 in cop01 (needs to be device-ified)
READ8_MEMBER(galivan_state::prot_data_r)
{
if(m_prot_command == 0x37)
{
uint16_t prot_offset = (m_prot_reg[1]<<8)|(m_prot_reg[2]);
uint8_t *prot_rom = memregion("prot_data")->base();
uint8_t prot_adj = 0x44;
//printf("%02x",(prot_rom[prot_offset] - 0x44) & 0xff);
return prot_rom[prot_offset & 0x1fff] - prot_adj; // minus value correct?
}
popmessage("%02x protection read used",m_prot_command);
return 0;
}
WRITE8_MEMBER(galivan_state::prot_data_w)
{
if( m_prot_command >=0x32 && m_prot_command <=0x37 )
{
m_prot_reg[m_prot_command-0x32] = data;
return;
}
popmessage("%02x protection write used",m_prot_command);
}
WRITE8_MEMBER(galivan_state::prot_address_w)
{
m_prot_command = data;
}
void galivan_state::galivan_map(address_map &map) void galivan_state::galivan_map(address_map &map)
{ {
@ -101,6 +132,15 @@ void galivan_state::io_map(address_map &map)
map(0xc0, 0xc0).r(this, FUNC(galivan_state::IO_port_c0_r)); /* dangar needs to return 0x58 */ map(0xc0, 0xc0).r(this, FUNC(galivan_state::IO_port_c0_r)); /* dangar needs to return 0x58 */
} }
void galivan_state::dangarj_io_map(address_map &map)
{
io_map(map);
// 1412M2
map(0x80, 0x80).rw(this, FUNC(galivan_state::prot_data_r), FUNC(galivan_state::prot_data_w));
map(0x81, 0x81).w(this, FUNC(galivan_state::prot_address_w));
}
WRITE8_MEMBER(galivan_state::blit_trigger_w) WRITE8_MEMBER(galivan_state::blit_trigger_w)
{ {
m_nb1414m4->exec((m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap); m_nb1414m4->exec((m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap);
@ -474,6 +514,12 @@ MACHINE_CONFIG_START(galivan_state::galivan)
MCFG_SOUND_ROUTE_EX(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac2", -1.0, DAC_VREF_NEG_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_START(galivan_state::dangarj)
galivan(config);
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(dangarj_io_map)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(galivan_state::ninjemak) MACHINE_CONFIG_START(galivan_state::ninjemak)
/* basic machine hardware */ /* basic machine hardware */
@ -796,7 +842,7 @@ ROM_START( dangarj ) /* all rom labels are simply numbers, with the owl logo and
ROM_REGION( 0x0100, "user1", 0 ) ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "82s129.7f", 0x0000, 0x0100, CRC(29bc6216) SHA1(1d7864ad06ad0cd5e3d1905fc6066bee1cd90995) ) /* sprite palette bank */ ROM_LOAD( "82s129.7f", 0x0000, 0x0100, CRC(29bc6216) SHA1(1d7864ad06ad0cd5e3d1905fc6066bee1cd90995) ) /* sprite palette bank */
ROM_REGION( 0x2000, "user2", 0 ) /* located on a daughter card DG-3 with an additional 8.00MHz OSC & Nichibutsu 1412M2 XBA (unknown MCU?) */ ROM_REGION( 0x2000, "prot_data", 0 ) /* located on a daughter card DG-3 with an additional 8.00MHz OSC & Nichibutsu 1412M2 XBA (unknown MCU?) */
ROM_LOAD( "dg-3.ic7.2764", 0x0000, 0x2000, CRC(84a56d26) SHA1(6a1cdac7b9e04ccbcc29491f37f7554d09ea6d34) ) ROM_LOAD( "dg-3.ic7.2764", 0x0000, 0x2000, CRC(84a56d26) SHA1(6a1cdac7b9e04ccbcc29491f37f7554d09ea6d34) )
ROM_END ROM_END
@ -1192,9 +1238,9 @@ GAME( 1985, galivan2, galivan, galivan, galivan, galivan_state, 0, ROT27
GAME( 1985, galivan3, galivan, galivan, galivan, galivan_state, 0, ROT270, "Nichibutsu", "Cosmo Police Galivan (12/11/1985)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, galivan3, galivan, galivan, galivan, galivan_state, 0, ROT270, "Nichibutsu", "Cosmo Police Galivan (12/11/1985)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dangar, 0, galivan, dangar, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (4/07/1987)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, dangar, 0, galivan, dangar, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (4/07/1987)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dangara, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (12/1/1986)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, dangara, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (12/1/1986)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, dangarb, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (9/26/1986)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, dangarj, dangar, dangarj, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (9/26/1986, Japan)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND ) // wrong BGM in game, no SFXs
GAME( 1986, dangarj, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (9/26/1986, Japan)", MACHINE_SUPPORTS_SAVE|MACHINE_NOT_WORKING ) // no sprites visable GAME( 1986, dangarb, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (9/26/1986, bootleg set 1)", MACHINE_SUPPORTS_SAVE ) // checks protection like dangarj but check readback is patched at 0x9d58 (also checks i/o port 0xc0?)
GAME( 1986, dangarbt, dangar, galivan, dangarb, galivan_state, 0, ROT270, "bootleg", "Ufo Robo Dangar (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, dangarbt, dangar, galivan, dangarb, galivan_state, 0, ROT270, "bootleg", "Ufo Robo Dangar (9/26/1986, bootleg set 2)", MACHINE_SUPPORTS_SAVE ) // directly patched at entry point 0x9d44
GAME( 1986, ninjemak, 0, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) GAME( 1986, ninjemak, 0, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION )
GAME( 1986, youma, ninjemak, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) GAME( 1986, youma, ninjemak, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION )
GAME( 1986, youma2, ninjemak, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan, alt)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) GAME( 1986, youma2, ninjemak, ninjemak, ninjemak, galivan_state, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan, alt)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION )

View File

@ -42,6 +42,10 @@ public:
DECLARE_WRITE8_MEMBER(galivan_sound_command_w); DECLARE_WRITE8_MEMBER(galivan_sound_command_w);
DECLARE_READ8_MEMBER(soundlatch_clear_r); DECLARE_READ8_MEMBER(soundlatch_clear_r);
DECLARE_READ8_MEMBER(IO_port_c0_r); DECLARE_READ8_MEMBER(IO_port_c0_r);
DECLARE_WRITE8_MEMBER(prot_address_w);
DECLARE_WRITE8_MEMBER(prot_data_w);
DECLARE_READ8_MEMBER(prot_data_r);
DECLARE_WRITE8_MEMBER(blit_trigger_w); DECLARE_WRITE8_MEMBER(blit_trigger_w);
DECLARE_WRITE8_MEMBER(youmab_extra_bank_w); DECLARE_WRITE8_MEMBER(youmab_extra_bank_w);
DECLARE_READ8_MEMBER(youmab_8a_r); DECLARE_READ8_MEMBER(youmab_8a_r);
@ -74,12 +78,19 @@ public:
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch; required_device<generic_latch_8_device> m_soundlatch;
void galivan(machine_config &config); void galivan(machine_config &config);
void dangarj(machine_config &config);
void ninjemak(machine_config &config); void ninjemak(machine_config &config);
void youmab(machine_config &config); void youmab(machine_config &config);
void galivan_map(address_map &map); void galivan_map(address_map &map);
void io_map(address_map &map); void io_map(address_map &map);
void dangarj_io_map(address_map &map);
void ninjemak_io_map(address_map &map); void ninjemak_io_map(address_map &map);
void ninjemak_map(address_map &map); void ninjemak_map(address_map &map);
void sound_io_map(address_map &map); void sound_io_map(address_map &map);
void sound_map(address_map &map); void sound_map(address_map &map);
private:
// dangarj specific (to be removed from here)
uint8_t m_prot_command;
uint8_t m_prot_reg[6];
uint8_t test;
}; };