From 7f99ec679094157a9f9d8404532f53ffa7822663 Mon Sep 17 00:00:00 2001 From: angelosa Date: Wed, 14 Jun 2017 07:09:50 +0200 Subject: [PATCH] cop01.cpp: improved Mighty Guy sound [Angelo Salese] --- src/mame/drivers/cop01.cpp | 70 +++++++++++++++++++++++++++++++------- src/mame/includes/cop01.h | 7 +++- 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/mame/drivers/cop01.cpp b/src/mame/drivers/cop01.cpp index 1a437c7eceb..390d95e3941 100644 --- a/src/mame/drivers/cop01.cpp +++ b/src/mame/drivers/cop01.cpp @@ -173,12 +173,12 @@ ADDRESS_MAP_END /* * sound "protection" uses address/data to ports 2/3 (R/W) * Register map: - * 0x32: always 5, dac transfer trigger? + * 0x32: always 5, rom read trigger? * 0x33: - address 1 (source?) * 0x34: / - * 0x35: - address 2 (size?) + * 0x35: - address 2 (adjust value in rom?) * 0x36: / - * 0x37: R reused for ym3526 register set + * 0x37: R reused for ym3526 register set, read protection rom (same as amatelas) * * 0x40: counter set, always 1? * 0x41: R bit 0 pulse timer? W oneshot timer? @@ -190,17 +190,61 @@ ADDRESS_MAP_END */ /* this just gets some garbage out of the YM3526 */ -READ8_MEMBER(cop01_state::kludge) +READ8_MEMBER(cop01_state::prot_data_r) { - return m_timer++; + if(m_prot_command == 0x41) + return (m_audiocpu->total_cycles() / 0x34) & 1; // wrong + + 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(); + // 0x37c are BGMs while 0x34e are SFXs? + uint8_t prot_adj = 0x82; //0xbd + + //printf("%02x",(prot_rom[prot_offset] - 0x44) & 0xff); + + return prot_rom[prot_offset & 0x1fff] - prot_adj; // minus value correct? + } + + if(m_prot_command == 0x92) // affects coin SFX playback + return 1; + + if(m_prot_command == 0x94) + return 0; + + return 0; +} + +WRITE8_MEMBER(cop01_state::prot_address_w) +{ + m_prot_command = data; +} + +WRITE8_MEMBER(cop01_state::prot_data_w) +{ + if( m_prot_command>=0x32 && m_prot_command<=0x37 ) + { + m_prot_reg[m_prot_command-0x32] = data; + + #if 0 + if(m_prot_command == 0x32) + { + for(int i=0;i<6;i++) + printf("%02x ",m_prot_reg[i]); + + printf("\n"); + } + #endif + } } static ADDRESS_MAP_START( mightguy_audio_io_map, AS_IO, 8, cop01_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVWRITE("ymsnd", ym3526_device, write) - AM_RANGE(0x02, 0x02) AM_WRITENOP /* 1412M2 address? */ - AM_RANGE(0x03, 0x03) AM_WRITENOP /* 1412M2 data? */ - AM_RANGE(0x03, 0x03) AM_READ(kludge) /* 1412M2? */ + AM_RANGE(0x02, 0x02) AM_WRITE(prot_address_w) /* 1412M2 address? */ + AM_RANGE(0x03, 0x03) AM_WRITE(prot_data_w) /* 1412M2 data? */ + AM_RANGE(0x03, 0x03) AM_READ(prot_data_r) /* 1412M2? */ AM_RANGE(0x06, 0x06) AM_READ(cop01_sound_command_r) ADDRESS_MAP_END @@ -338,9 +382,9 @@ static INPUT_PORTS_START( mightguy ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x04, "Every 200k" ) PORT_DIPSETTING( 0x00, "500k only" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) // actually reversed compared to service mode + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x00, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x10, DEF_STR( Cocktail ) ) @@ -632,7 +676,7 @@ ROM_START( mightguy ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound cpu) */ ROM_LOAD( "11.15b", 0x0000, 0x4000, CRC(576183ea) SHA1(e3f28e8e8c34ab396d158da122584ed226729c99) ) - ROM_REGION( 0x8000, "user1", 0 ) /* 1412M2 protection data, z80 encrypted code presumably */ + ROM_REGION( 0x8000, "prot_data", 0 ) /* 1412M2 protection data, z80 encrypted code presumably */ ROM_LOAD( "10.ic2", 0x0000, 0x8000, CRC(1a5d2bb1) SHA1(0fd4636133a980ba9ffa076f9010474586d37635) ) ROM_REGION( 0x02000, "gfx1", 0 ) /* alpha */ @@ -688,4 +732,4 @@ DRIVER_INIT_MEMBER(cop01_state,mightguy) GAME( 1985, cop01, 0, cop01, cop01, cop01_state, 0, ROT0, "Nichibutsu", "Cop 01 (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, cop01a, cop01, cop01, cop01, cop01_state, 0, ROT0, "Nichibutsu", "Cop 01 (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, mightguy, 0, mightguy, mightguy, cop01_state, mightguy, ROT270, "Nichibutsu", "Mighty Guy", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1986, mightguy, 0, mightguy, mightguy, cop01_state, mightguy, ROT270, "Nichibutsu", "Mighty Guy", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/cop01.h b/src/mame/includes/cop01.h index 02ea5d72a4c..117a901282a 100644 --- a/src/mame/includes/cop01.h +++ b/src/mame/includes/cop01.h @@ -35,7 +35,9 @@ public: /* sound-related */ int m_pulse; int m_timer; // kludge for ym3526 in mightguy - + uint8_t m_prot_command; + uint8_t m_prot_reg[6]; + /* devices */ required_device m_maincpu; required_device m_audiocpu; @@ -51,6 +53,9 @@ public: DECLARE_WRITE8_MEMBER(cop01_background_w); DECLARE_WRITE8_MEMBER(cop01_foreground_w); DECLARE_WRITE8_MEMBER(cop01_vreg_w); + DECLARE_WRITE8_MEMBER(prot_address_w); + DECLARE_WRITE8_MEMBER(prot_data_w); + DECLARE_READ8_MEMBER(prot_data_r); DECLARE_CUSTOM_INPUT_MEMBER(mightguy_area_r); DECLARE_DRIVER_INIT(mightguy); TILE_GET_INFO_MEMBER(get_bg_tile_info);