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)
{
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;

View File

@ -24,12 +24,10 @@ TODO
but it should really copy stuff from the extra ROM.
- Ninja Emaki has minor protection issues, see NB1414M4 simulation for more info.
- dangarj has unemulated protection at I/Os 0x80-1 for missing sprites.
[0x80] W is data
[0x81] W --11 xxxx address
[0x80] R result
The protection is used for a code snippet at 0xf9c0, that of course is the
This is a 1412M2, which is the same chip used in terracre.cpp and cop01.cpp
The protection here 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
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 */
}
// 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)
{
@ -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 */
}
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)
{
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)
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)
/* 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_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_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( 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, dangarb, dangar, galivan, dangar2, galivan_state, 0, ROT270, "Nichibutsu", "Ufo Robo Dangar (9/26/1986)", MACHINE_SUPPORTS_SAVE )
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, dangarbt, dangar, galivan, dangarb, galivan_state, 0, ROT270, "bootleg", "Ufo Robo Dangar (bootleg)", 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, 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 (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, 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 )

View File

@ -42,6 +42,10 @@ public:
DECLARE_WRITE8_MEMBER(galivan_sound_command_w);
DECLARE_READ8_MEMBER(soundlatch_clear_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(youmab_extra_bank_w);
DECLARE_READ8_MEMBER(youmab_8a_r);
@ -74,12 +78,19 @@ public:
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
void galivan(machine_config &config);
void dangarj(machine_config &config);
void ninjemak(machine_config &config);
void youmab(machine_config &config);
void galivan_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_map(address_map &map);
void sound_io_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;
};