galivan.cpp, terracre.cpp: rewritten NB1412M2 into a device [Angelo Salese]

This commit is contained in:
angelosa 2018-04-21 17:22:06 +02:00
parent 1b3c344ba3
commit 0dd80b1dba
9 changed files with 268 additions and 209 deletions

View File

@ -58,41 +58,6 @@ 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)
{
map(0x0000, 0xbfff).rom();
@ -132,12 +97,12 @@ 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)
void dangarj_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));
map(0x80, 0x80).rw("prot_chip", FUNC(nb1412m2_device::data_r), FUNC(nb1412m2_device::data_w));
map(0x81, 0x81).w("prot_chip", FUNC(nb1412m2_device::command_w));
}
@ -514,10 +479,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)
MACHINE_CONFIG_START(dangarj_state::dangarj)
galivan(config);
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(dangarj_io_map)
MCFG_DEVICE_ADD("prot_chip", NB1412M2, XTAL(8'000'000)) // divided by 2 maybe
MACHINE_CONFIG_END
MACHINE_CONFIG_START(galivan_state::ninjemak)
@ -844,7 +811,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, "prot_data", 0 ) /* located on a daughter card DG-3 with an additional 8.00MHz OSC & Nichibutsu 1412M2 XBA (unknown MCU?) */
ROM_REGION( 0x2000, "prot_chip", 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
@ -1240,7 +1207,7 @@ 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, 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, dangarj, dangar2, dangarj_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 )

View File

@ -93,78 +93,6 @@ AT-2
#include "speaker.h"
#ifdef UNUSED_FUNCTION
/*
0000 5000 5341 4b45 5349 4755 5245
0000 4000 0e4b 4154 5544 4f4e 0e0e
0000 3000 414e 4b41 4b45 5544 4f4e
0000 2000 0e0e 4b49 5455 4e45 0e0e
0000 1000 0e4b 414b 4553 4f42 410e
2079 0001 0004 4ed0 2079 0001 0008
4ed0 7c
*/
// protection data left for reference
static const uint16_t mAmazonProtData[] =
{
/* default high scores (0x40db4) - wrong data ? */
0x0000,0x5000,0x5341,0x4b45,0x5349,0x4755,0x5245,
0x0000,0x4000,0x0e4b,0x4154,0x5544,0x4f4e,0x0e0e,
0x0000,0x3000,0x414e,0x4b41,0x4b45,0x5544,0x4f4e,
0x0000,0x2000,0x0e0e,0x4b49,0x5455,0x4e45,0x0e0e,
0x0000,0x1000,0x0e4b,0x414b,0x4553,0x4f42,0x410e,
/* code (0x40d92) */
0x4ef9,0x0000,0x62fa,0x0000,0x4ef9,0x0000,0x805E,0x0000,
0xc800 /* checksum */
};
/*
0000 5000 5341 4b45 5349 4755 5245
0000 4000 0e4b 4154 5544 4f4e 0e0e
0000 3000 414e 4b41 4b45 5544 4f4e
0000 2000 0e0e 4b49 5455 4e45 0e0e
0000 1000 0e4b 414b 4553 4f42 410e
2079 0001 0004 4ed0 2079 0001 0008
4ed0 7c
*/
static const uint16_t mAmatelasProtData[] =
{
/* default high scores (0x40db4) */
0x0000,0x5000,0x5341,0x4b45,0x5349,0x4755,0x5245,
0x0000,0x4000,0x0e4b,0x4154,0x5544,0x4f4e,0x0e0e,
0x0000,0x3000,0x414e,0x4b41,0x4b45,0x5544,0x4f4e,
0x0000,0x2000,0x0e0e,0x4b49,0x5455,0x4e45,0x0e0e,
0x0000,0x1000,0x0e4b,0x414b,0x4553,0x4f42,0x410e,
/* code (0x40d92) */
0x4ef9,0x0000,0x632e,0x0000,0x4ef9,0x0000,0x80C2,0x0000,
0x6100 /* checksum */
};
/*
2079 0001 0004 4ed0 2079 0001 0008
4ed0 7c
It actually never jumps to 0x40dba?
*/
static const uint16_t mHoreKidProtData[] =
{
/* N/A */
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
/* code (0x40dba) */
0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,
0x1800 /* checksum */
};
#endif
WRITE16_MEMBER(terracre_state::amazon_sound_w)
{
m_soundlatch->write(space,0,((data & 0x7f) << 1) | 1);
@ -176,61 +104,6 @@ READ8_MEMBER(terracre_state::soundlatch_clear_r)
return 0;
}
// 1412M2
READ16_MEMBER(terracre_state::amazon_protection_r)
{
if(m_mAmazonProtCmd == 0x37)
{
//m_mAmazonProtReg[4] bit 0 used on hiscore data (clear on code), 0x29f vs 0x29e (not an offset?)
//its usage is more variable in mightguy for whatever reason.
uint16_t prot_offset = (m_mAmazonProtReg[1]<<8)|(m_mAmazonProtReg[2]);
uint8_t *prot_rom = memregion("prot_data")->base();
//printf("Mode %02x:%04x %04x R -> %02x (fixed %02x)\n",m_mAmazonProtReg[0],prot_offset,(m_mAmazonProtReg[3]<<8)|(m_mAmazonProtReg[4]),prot_rom[prot_offset],(prot_rom[prot_offset] - 0x44) & 0xff);
return prot_rom[prot_offset & 0x1fff] - 0x44;
}
popmessage("unknown prot cmd R %02x",m_mAmazonProtCmd);
return 0;
}
WRITE16_MEMBER(terracre_state::amazon_protection_w)
{
if( ACCESSING_BITS_0_7 )
{
if( offset==1 )
{
m_mAmazonProtCmd = data;
}
else
{
if( m_mAmazonProtCmd>=0x32 && m_mAmazonProtCmd<=0x37 )
{
m_mAmazonProtReg[m_mAmazonProtCmd-0x32] = data;
#if 0
if(m_mAmazonProtCmd == 0x32)
{
for(int i=0;i<6;i++)
printf("%02x ",m_mAmazonProtReg[i]);
printf("\n");
}
#endif
}
}
}
}
MACHINE_START_MEMBER(terracre_state,amazon)
{
/* set up for save */
save_item(NAME(m_mAmazonProtCmd));
save_item(NAME(m_mAmazonProtReg));
}
void terracre_state::terracre_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
@ -271,10 +144,12 @@ void terracre_state::amazon_base_map(address_map &map)
map(0x070000, 0x070003).noprw(); // protection (nop for bootlegs)
}
void terracre_state::amazon_1412m2_map(address_map &map)
void amazon_state::amazon_1412m2_map(address_map &map)
{
amazon_base_map(map);
map(0x070000, 0x070003).rw(this, FUNC(terracre_state::amazon_protection_r), FUNC(terracre_state::amazon_protection_w));
map(0x070000, 0x070001).rw("prot_chip", FUNC(nb1412m2_device::data_r), FUNC(nb1412m2_device::data_w)).umask16(0x00ff);
map(0x070002, 0x070003).w("prot_chip", FUNC(nb1412m2_device::command_w)).umask16(0x00ff);
}
void terracre_state::sound_map(address_map &map)
@ -637,16 +512,14 @@ MACHINE_CONFIG_START(terracre_state::amazon_base)
ym3526(config);
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(amazon_base_map)
MCFG_MACHINE_START_OVERRIDE(terracre_state,amazon)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(terracre_state::amazon_1412m2)
MACHINE_CONFIG_START(amazon_state::amazon_1412m2)
amazon_base(config);
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(amazon_1412m2_map)
// TODO: install 1412m2 here
MCFG_DEVICE_ADD("prot_chip", NB1412M2, XTAL(16'000'000)) // divided by 4 maybe
MACHINE_CONFIG_END
@ -849,7 +722,7 @@ ROM_START( amazon )
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) /* ctable */
ROM_REGION( 0x2000, "prot_data", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_LOAD( "16.18g", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
@ -888,7 +761,7 @@ ROM_START( amatelas )
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "4e", 0x000, 0x100, CRC(035f2c7b) SHA1(36e32a50146631e763711b586936b2815600f52d) ) /* ctable */
ROM_REGION( 0x2000, "prot_data", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_LOAD( "16.18g", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
@ -928,7 +801,7 @@ ROM_START( horekid )
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) /* ctable */
ROM_REGION( 0x2000, "prot_data", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_LOAD( "horekid.17", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
@ -968,7 +841,7 @@ ROM_START( horekidb )
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "kid_prom.4e", 0x000, 0x100, CRC(e4fb54ee) SHA1(aba89d347b24dc6680e6f25b4a6c0d6657bb6a83) ) /* ctable */
ROM_REGION( 0x2000, "prot_data", 0 ) /* unknown, mostly text */
ROM_REGION( 0x2000, "prot_chip", 0 ) /* unknown, mostly text */
ROM_LOAD( "horekid.17", 0x0000, 0x2000, CRC(1d8d592b) SHA1(be8d6df8b5926069ae2cbc1dc26e1fa92d63f297) )
ROM_END
@ -1024,10 +897,10 @@ GAME( 1985, terracrea,terracre, ym3526, terracre, terracre_state, 0, ROT
GAME( 1985, terracren,terracre, ym2203, terracre, terracre_state, 0, ROT270, "Nichibutsu", "Terra Cresta (YM2203)", MACHINE_SUPPORTS_SAVE )
// later HW: supports 1412M2 device, see also mightguy.cpp
GAME( 1986, amazon, 0, amazon_1412m2, amazon, terracre_state, 0, ROT270, "Nichibutsu", "Soldier Girl Amazon", MACHINE_SUPPORTS_SAVE )
GAME( 1986, amatelas, amazon, amazon_1412m2, amazon, terracre_state, 0, ROT270, "Nichibutsu", "Sei Senshi Amatelass", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekid, 0, amazon_1412m2, horekid, terracre_state, 0, ROT270, "Nichibutsu", "Kid no Hore Hore Daisakusen", MACHINE_SUPPORTS_SAVE )
GAME( 1986, amazon, 0, amazon_1412m2, amazon, amazon_state, 0, ROT270, "Nichibutsu", "Soldier Girl Amazon", MACHINE_SUPPORTS_SAVE )
GAME( 1986, amatelas, amazon, amazon_1412m2, amazon, amazon_state, 0, ROT270, "Nichibutsu", "Sei Senshi Amatelass", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekid, 0, amazon_1412m2, horekid, amazon_state, 0, ROT270, "Nichibutsu", "Kid no Hore Hore Daisakusen", MACHINE_SUPPORTS_SAVE )
// bootlegs
GAME( 1987, horekidb, horekid, amazon_base, horekid, terracre_state, 0, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, horekidb, horekid, amazon_base, horekid, terracre_state, 0, ROT270, "bootleg", "Kid no Hore Hore Daisakusen (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, boobhack, horekid, amazon_base, horekid, terracre_state, 0, ROT270, "bootleg", "Booby Kids (Italian manufactured graphic hack / bootleg of Kid no Hore Hore Daisakusen (bootleg))", MACHINE_SUPPORTS_SAVE )

View File

@ -6,6 +6,7 @@
***************************************************************************/
#include "machine/nb1412m2.h"
#include "machine/nb1414m4.h"
#include "machine/gen_latch.h"
#include "video/bufsprite.h"
@ -42,10 +43,6 @@ 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);
@ -78,19 +75,27 @@ 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;
};
class dangarj_state : public galivan_state
{
public:
dangarj_state(const machine_config &mconfig, device_type type, const char *tag)
: galivan_state(mconfig, type, tag),
m_prot(*this, "prot_chip")
{}
void dangarj(machine_config &config);
private:
required_device<nb1412m2_device> m_prot;
void dangarj_io_map(address_map &map);
};

View File

@ -1,6 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Carlos A. Lozano
#include "machine/nb1412m2.h"
#include "machine/gen_latch.h"
#include "video/bufsprite.h"
@ -26,18 +27,12 @@ public:
required_shared_ptr<uint16_t> m_bg_videoram;
required_shared_ptr<uint16_t> m_fg_videoram;
// move to 1412m2
uint8_t m_mAmazonProtCmd;
uint8_t m_mAmazonProtReg[6];
uint16_t m_xscroll;
uint16_t m_yscroll;
tilemap_t *m_background;
tilemap_t *m_foreground;
DECLARE_WRITE16_MEMBER(amazon_sound_w);
DECLARE_READ8_MEMBER(soundlatch_clear_r);
DECLARE_READ16_MEMBER(amazon_protection_r);
DECLARE_WRITE16_MEMBER(amazon_protection_w);
DECLARE_WRITE16_MEMBER(amazon_background_w);
DECLARE_WRITE16_MEMBER(amazon_foreground_w);
DECLARE_WRITE16_MEMBER(amazon_flipscreen_w);
@ -47,17 +42,28 @@ public:
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void video_start() override;
DECLARE_PALETTE_INIT(terracre);
DECLARE_MACHINE_START(amazon);
uint32_t screen_update_amazon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
void amazon_base(machine_config &config);
void amazon_1412m2(machine_config &config);
void ym2203(machine_config &config);
void ym3526(machine_config &config);
void amazon_1412m2_map(address_map &map);
void amazon_base_map(address_map &map);
void sound_2203_io_map(address_map &map);
void sound_3526_io_map(address_map &map);
void sound_map(address_map &map);
void terracre_map(address_map &map);
};
class amazon_state : public terracre_state
{
public:
amazon_state(const machine_config &mconfig, device_type type, const char *tag)
: terracre_state(mconfig, type, tag),
m_prot(*this, "prot_chip")
{}
void amazon_1412m2(machine_config &config);
void amazon_1412m2_map(address_map &map);
private:
required_device<nb1412m2_device> m_prot;
};

View File

@ -0,0 +1,142 @@
// license:LGPL-2.1+
// copyright-holders:Angelo Salese
/***************************************************************************
Nichibutsu 1412M2 device emulation
Written by Angelo Salese
Fancy data decrypter + timer + ?
Most creative usage is hooked up in Mighty Guy sound CPU,
other games just uses it as a much simpler protection chip providing code
snippets.
It is unknown at current stage if inside the chip there's a MCU
(with internal ROM).
TODO:
- understand how Mighty Guy decrypts data (uses port adjuster in a
different way than the other games);
Legacy notes from drivers:
- m_mAmazonProtReg[4] bit 0 used on hiscore data (clear on code),
0x29f vs 0x29e (not an offset?)
- static const uint16_t mAmazonProtData[] =
{
0x0000,0x5000,0x5341,0x4b45,0x5349,0x4755,0x5245, <- default high scores (0x40db4) - wrong data ?
0x0000,0x4000,0x0e4b,0x4154,0x5544,0x4f4e,0x0e0e,
0x0000,0x3000,0x414e,0x4b41,0x4b45,0x5544,0x4f4e,
0x0000,0x2000,0x0e0e,0x4b49,0x5455,0x4e45,0x0e0e,
0x0000,0x1000,0x0e4b,0x414b,0x4553,0x4f42,0x410e,
0x4ef9,0x0000,0x62fa,0x0000,0x4ef9,0x0000,0x805E,0x0000, <- code (0x40d92)
0xc800 <- checksum
};
- static const uint16_t mAmatelasProtData[] =
{
0x0000,0x5000,0x5341,0x4b45,0x5349,0x4755,0x5245, <- default high scores (0x40db4)
0x0000,0x4000,0x0e4b,0x4154,0x5544,0x4f4e,0x0e0e,
0x0000,0x3000,0x414e,0x4b41,0x4b45,0x5544,0x4f4e,
0x0000,0x2000,0x0e0e,0x4b49,0x5455,0x4e45,0x0e0e,
0x0000,0x1000,0x0e4b,0x414b,0x4553,0x4f42,0x410e,
0x4ef9,0x0000,0x632e,0x0000,0x4ef9,0x0000,0x80C2,0x0000, <- code (0x40d92)
0x6100 <- checksum
};
- static const uint16_t mHoreKidProtData[] =
{
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, <- N/A
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75,0x4e75, <- code (0x40dba) It actually never jumps there?
0x1800 <- checksum
};
***************************************************************************/
#include "emu.h"
#include "machine/nb1412m2.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(NB1412M2, nb1412m2_device, "nb1412m2", "NB1412M2 Mahjong Custom")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// nb1412m2_device - constructor
//-------------------------------------------------
nb1412m2_device::nb1412m2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, NB1412M2, tag, owner, clock)
, m_data(*this, DEVICE_SELF)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void nb1412m2_device::device_start()
{
save_item(NAME(m_command));
save_item(NAME(m_rom_address));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void nb1412m2_device::device_reset()
{
m_command = 0xff;
m_rom_address = 0;
}
//**************************************************************************
// READ/WRITE HANDLERS
//**************************************************************************
READ8_MEMBER( nb1412m2_device::data_r )
{
if(m_command == 0x37) // readback from ROM data
{
// TODO: provided by commands 0x35 & 0x36 (maybe 0x32 too)
uint8_t prot_adj = 0x44;
return m_data[m_rom_address & 0x1fff] - prot_adj;
}
return 0;
}
WRITE8_MEMBER( nb1412m2_device::data_w )
{
switch(m_command)
{
case 0x33: // rom hi
m_rom_address &= 0x00ff;
m_rom_address |= data << 8;
break;
case 0x34: // rom lo
m_rom_address &= 0xff00;
m_rom_address |= data;
break;
}
}
WRITE8_MEMBER( nb1412m2_device::command_w )
{
m_command = data;
}

View File

@ -0,0 +1,66 @@
// license:LGPL-2.1+
// copyright-holders:Angelo Salese
/***************************************************************************
Nichibutsu 1412M2 device emulation
***************************************************************************/
#ifndef MAME_MACHINE_NB1412M2_H
#define MAME_MACHINE_NB1412M2_H
#pragma once
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_NB1412M2_ADD(tag, freq) \
MCFG_DEVICE_ADD((tag), NB1412M2, (freq))
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> nb1412m2_device
class nb1412m2_device : public device_t
{
public:
// construction/destruction
nb1412m2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// I/O operations
DECLARE_WRITE8_MEMBER( command_w );
DECLARE_WRITE8_MEMBER( data_w );
DECLARE_READ8_MEMBER( data_r );
protected:
// device-level overrides
// virtual void device_validity_check(validity_checker &valid) const override;
// virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_command;
uint16_t m_rom_address;
required_region_ptr<uint8_t> m_data;
};
// device type definition
DECLARE_DEVICE_TYPE(NB1412M2, nb1412m2_device)
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
#endif // MAME_MACHINE_NB1412M2_H

View File

@ -7,8 +7,8 @@
Driver by Takahiro Nogi <nogi@kt.rim.or.jp> 1999/11/05 -
******************************************************************************/
#ifndef MAME_INCLUDES_NB1413M3_H
#define MAME_INCLUDES_NB1413M3_H
#ifndef MAME_MACHINE_NB1413M3_H
#define MAME_MACHINE_NB1413M3_H
#pragma once
@ -202,4 +202,4 @@ DECLARE_DEVICE_TYPE(NB1413M3, nb1413m3_device)
#define MCFG_NB1413M3_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, NB1413M3, 0)
#endif // MAME_INCLUDES_NB1413M3_H
#endif // MAME_MACHINE_NB1413M3_H

View File

@ -319,7 +319,7 @@ void nb1414m4_device::exec(uint16_t mcu_cmd, uint8_t *vram, uint16_t &scrollx, u
case 0x8000: break; //Ninja Emaki, attract mode
case 0xff00: break; //Ninja Emaki POST, presumably invalid
default:
popmessage("NB 1414M4 executes %04x command, contact MAMEdev\n",mcu_cmd);
popmessage("NB 1414M4 executes %04x command, contact MAMEdev",mcu_cmd);
break;
}

View File

@ -1,7 +1,7 @@
// license:LGPL-2.1+
// copyright-holders:Angelo Salese
#ifndef MAME_INCLUDES_NB1414M4_H
#define MAME_INCLUDES_NB1414M4_H
#ifndef MAME_MACHINE_NB1414M4_H
#define MAME_MACHINE_NB1414M4_H
#pragma once
@ -33,4 +33,4 @@ private:
DECLARE_DEVICE_TYPE(NB1414M4, nb1414m4_device)
#endif // MAME_INCLUDES_NB1414M4_H
#endif // MAME_MACHINE_NB1414M4_H