mirror of
https://github.com/holub/mame
synced 2025-10-06 00:54:22 +03:00
nightgal.cpp: Added additional audio CPU for Sexy Gal (nw)
This commit is contained in:
parent
50bb041554
commit
8873e16292
@ -11,11 +11,17 @@ many thanks to Charles MacDonald for the schematics / documentation of this HW.
|
|||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- Fix Sweet Gal/Sexy Gal/Sexy Gal Tropical layer clearances (more protection?);
|
- Fix Sweet Gal/Sexy Gal/Sexy Gal Tropical layer clearances (more protection?);
|
||||||
- Understand why Night Gal Summer title screen gets wiped out (protection issue);
|
- Sexy Gal uses an additional NCS for a sample player, understand how to make it play anything (tries to read port $00 but it's always zero);
|
||||||
- NMI origin for Sexy Gal / Night Gal Summer
|
- Sweet Gal hangs after winning a round;
|
||||||
- unemulated WAIT pin for Z80, MCU asserts it when accessing communication RAM
|
- Other games in the driver also have sample ROMs, it is unknown how they are supposed to playback tho;
|
||||||
|
- Understand why Night Gal Summer title screen gets wiped out and why it doesn't get displayed at all during attract mode (protection issue?);
|
||||||
|
- NMI origin for Sweet Gal / Night Gal Summer;
|
||||||
|
- unemulated WAIT pin for Z80, MCU asserts it when accessing communication RAM;
|
||||||
|
|
||||||
*******************************************************************************************/
|
Notes:
|
||||||
|
- Night Gal Summer player hand is at $f801 onward
|
||||||
|
|
||||||
|
*******************************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
|
||||||
@ -39,6 +45,7 @@ public:
|
|||||||
m_comms_ram(*this, "comms_ram"),
|
m_comms_ram(*this, "comms_ram"),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_subcpu(*this, "sub"),
|
m_subcpu(*this, "sub"),
|
||||||
|
m_audiocpu(*this, "audiocpu"),
|
||||||
m_io_cr_clear(*this, "CR_CLEAR"),
|
m_io_cr_clear(*this, "CR_CLEAR"),
|
||||||
m_io_coins(*this, "COINS"),
|
m_io_coins(*this, "COINS"),
|
||||||
m_io_pl1_1(*this, "PL1_1"),
|
m_io_pl1_1(*this, "PL1_1"),
|
||||||
@ -60,14 +67,7 @@ public:
|
|||||||
m_palette(*this, "palette"),
|
m_palette(*this, "palette"),
|
||||||
m_blitter(*this, "blitter") { }
|
m_blitter(*this, "blitter") { }
|
||||||
|
|
||||||
/* video-related */
|
|
||||||
uint8_t m_blit_raw_data[3];
|
|
||||||
|
|
||||||
/* misc */
|
|
||||||
uint8_t m_nsc_latch;
|
|
||||||
uint8_t m_z80_latch;
|
|
||||||
uint8_t m_mux_data;
|
|
||||||
uint8_t m_pal_bank;
|
|
||||||
emu_timer *m_z80_wait_ack_timer;
|
emu_timer *m_z80_wait_ack_timer;
|
||||||
|
|
||||||
required_shared_ptr<uint8_t> m_comms_ram;
|
required_shared_ptr<uint8_t> m_comms_ram;
|
||||||
@ -75,6 +75,7 @@ public:
|
|||||||
/* devices */
|
/* devices */
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<cpu_device> m_subcpu;
|
required_device<cpu_device> m_subcpu;
|
||||||
|
optional_device<cpu_device> m_audiocpu;
|
||||||
|
|
||||||
/* memory */
|
/* memory */
|
||||||
//DECLARE_WRITE8_MEMBER(sexygal_nsc_true_blitter_w);
|
//DECLARE_WRITE8_MEMBER(sexygal_nsc_true_blitter_w);
|
||||||
@ -88,6 +89,9 @@ public:
|
|||||||
DECLARE_READ8_MEMBER(input_1p_r);
|
DECLARE_READ8_MEMBER(input_1p_r);
|
||||||
DECLARE_READ8_MEMBER(input_2p_r);
|
DECLARE_READ8_MEMBER(input_2p_r);
|
||||||
DECLARE_WRITE8_MEMBER(output_w);
|
DECLARE_WRITE8_MEMBER(output_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(sexygal_audioff_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(sexygal_audionmi_w);
|
||||||
|
|
||||||
DECLARE_DRIVER_INIT(ngalsumr);
|
DECLARE_DRIVER_INIT(ngalsumr);
|
||||||
DECLARE_DRIVER_INIT(royalqn);
|
DECLARE_DRIVER_INIT(royalqn);
|
||||||
DECLARE_WRITE8_MEMBER(ngalsumr_prot_latch_w);
|
DECLARE_WRITE8_MEMBER(ngalsumr_prot_latch_w);
|
||||||
@ -123,6 +127,18 @@ protected:
|
|||||||
TIMER_CALLBACK_MEMBER( z80_wait_ack_cb );
|
TIMER_CALLBACK_MEMBER( z80_wait_ack_cb );
|
||||||
|
|
||||||
std::unique_ptr<bitmap_ind16> m_tmp_bitmap;
|
std::unique_ptr<bitmap_ind16> m_tmp_bitmap;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/* video-related */
|
||||||
|
uint8_t m_blit_raw_data[3];
|
||||||
|
|
||||||
|
/* misc */
|
||||||
|
uint8_t m_nsc_latch;
|
||||||
|
uint8_t m_z80_latch;
|
||||||
|
uint8_t m_mux_data;
|
||||||
|
uint8_t m_pal_bank;
|
||||||
|
|
||||||
|
uint8_t m_sexygal_audioff;
|
||||||
};
|
};
|
||||||
|
|
||||||
void nightgal_state::video_start()
|
void nightgal_state::video_start()
|
||||||
@ -343,9 +359,32 @@ ADDRESS_MAP_END
|
|||||||
* Sexy Gal
|
* Sexy Gal
|
||||||
********************************/
|
********************************/
|
||||||
|
|
||||||
|
// flip flop from main to audio CPU
|
||||||
|
WRITE8_MEMBER(nightgal_state::sexygal_audioff_w)
|
||||||
|
{
|
||||||
|
// causes an irq
|
||||||
|
if(m_sexygal_audioff & 0x40 && (data & 0x40) == 0)
|
||||||
|
m_audiocpu->set_input_line(0, HOLD_LINE);
|
||||||
|
|
||||||
|
// NMI, correct?
|
||||||
|
if(m_sexygal_audioff & 0x20 && (data & 0x20) == 0)
|
||||||
|
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||||
|
|
||||||
|
// bit 4 used, audio cpu reset line?
|
||||||
|
|
||||||
|
m_sexygal_audioff = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(nightgal_state::sexygal_audionmi_w)
|
||||||
|
{
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START( sexygal_map, AS_PROGRAM, 8, nightgal_state )
|
static ADDRESS_MAP_START( sexygal_map, AS_PROGRAM, 8, nightgal_state )
|
||||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||||
AM_RANGE(0x8000, 0xbfff) AM_RAM //???
|
AM_RANGE(0x8000, 0x807f) AM_RAM AM_SHARE("sound_ram")
|
||||||
|
AM_RANGE(0xa000, 0xa000) AM_WRITE(sexygal_audioff_w)
|
||||||
AM_RANGE(0xe000, 0xefff) AM_READWRITE(royalqn_comm_r, royalqn_comm_w) AM_SHARE("comms_ram")
|
AM_RANGE(0xe000, 0xefff) AM_READWRITE(royalqn_comm_r, royalqn_comm_w) AM_SHARE("comms_ram")
|
||||||
AM_RANGE(0xf000, 0xffff) AM_RAM
|
AM_RANGE(0xf000, 0xffff) AM_RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -387,6 +426,16 @@ static ADDRESS_MAP_START( sgaltrop_nsc_map, AS_PROGRAM, 8, nightgal_state )
|
|||||||
AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("subrom", 0)
|
AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("subrom", 0)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( sexygal_audio_map, AS_PROGRAM, 8, nightgal_state )
|
||||||
|
AM_RANGE(0x0000, 0x007f) AM_RAM
|
||||||
|
|
||||||
|
AM_RANGE(0x2000, 0x207f) AM_RAM AM_SHARE("sound_ram")
|
||||||
|
AM_RANGE(0x3000, 0x3000) AM_WRITE(sexygal_audionmi_w)
|
||||||
|
AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("audiorom", 0)
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
* Royal Queen
|
* Royal Queen
|
||||||
********************************/
|
********************************/
|
||||||
@ -721,12 +770,15 @@ static MACHINE_CONFIG_DERIVED( sexygal, royalqn )
|
|||||||
MCFG_CPU_MODIFY("maincpu")
|
MCFG_CPU_MODIFY("maincpu")
|
||||||
MCFG_CPU_PROGRAM_MAP(sexygal_map)
|
MCFG_CPU_PROGRAM_MAP(sexygal_map)
|
||||||
MCFG_CPU_IO_MAP(sexygal_io)
|
MCFG_CPU_IO_MAP(sexygal_io)
|
||||||
MCFG_CPU_PERIODIC_INT_DRIVER(nightgal_state, nmi_line_pulse, 60)//???
|
//MCFG_CPU_PERIODIC_INT_DRIVER(nightgal_state, nmi_line_pulse, 60)//???
|
||||||
|
|
||||||
MCFG_CPU_MODIFY("sub")
|
MCFG_CPU_MODIFY("sub")
|
||||||
MCFG_CPU_PROGRAM_MAP(sexygal_nsc_map)
|
MCFG_CPU_PROGRAM_MAP(sexygal_nsc_map)
|
||||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", nightgal_state, irq0_line_hold)
|
MCFG_CPU_VBLANK_INT_DRIVER("screen", nightgal_state, irq0_line_hold)
|
||||||
|
|
||||||
|
MCFG_CPU_ADD("audiocpu", NSC8105, MASTER_CLOCK / 8)
|
||||||
|
MCFG_CPU_PROGRAM_MAP(sexygal_audio_map)
|
||||||
|
|
||||||
MCFG_DEVICE_REMOVE("aysnd")
|
MCFG_DEVICE_REMOVE("aysnd")
|
||||||
|
|
||||||
MCFG_SOUND_ADD("ymsnd", YM2203, MASTER_CLOCK / 8)
|
MCFG_SOUND_ADD("ymsnd", YM2203, MASTER_CLOCK / 8)
|
||||||
@ -737,7 +789,8 @@ MACHINE_CONFIG_END
|
|||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( ngalsumr, royalqn )
|
static MACHINE_CONFIG_DERIVED( ngalsumr, royalqn )
|
||||||
MCFG_CPU_MODIFY("maincpu")
|
MCFG_CPU_MODIFY("maincpu")
|
||||||
MCFG_CPU_PERIODIC_INT_DRIVER(nightgal_state, nmi_line_pulse, 60)//???
|
// TODO: happens from protection device
|
||||||
|
MCFG_CPU_PERIODIC_INT_DRIVER(nightgal_state, nmi_line_pulse, 60)
|
||||||
|
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
@ -747,6 +800,8 @@ static MACHINE_CONFIG_DERIVED( sgaltrop, sexygal )
|
|||||||
|
|
||||||
MCFG_CPU_MODIFY("sub")
|
MCFG_CPU_MODIFY("sub")
|
||||||
MCFG_CPU_PROGRAM_MAP(sgaltrop_nsc_map)
|
MCFG_CPU_PROGRAM_MAP(sgaltrop_nsc_map)
|
||||||
|
|
||||||
|
MCFG_DEVICE_REMOVE("audiocpu")
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -940,9 +995,11 @@ ROM_START( sexygal )
|
|||||||
ROM_REGION( 0x4000, "subrom", 0 )
|
ROM_REGION( 0x4000, "subrom", 0 )
|
||||||
ROM_LOAD( "1.3a", 0x00000, 0x04000, CRC(f814cf27) SHA1(ceba1f14a202d926380039d7cb4669eb8be58539) ) // has a big (16 byte wide) ASCII 'Y.M' art, written in YMs (!)
|
ROM_LOAD( "1.3a", 0x00000, 0x04000, CRC(f814cf27) SHA1(ceba1f14a202d926380039d7cb4669eb8be58539) ) // has a big (16 byte wide) ASCII 'Y.M' art, written in YMs (!)
|
||||||
|
|
||||||
ROM_REGION( 0xc000, "samples", 0 )
|
ROM_REGION( 0x4000, "audiorom", 0)
|
||||||
ROM_LOAD( "13.s7b", 0x04000, 0x04000, CRC(5eb75f56) SHA1(b7d81d786d1ac8d65a6a122140954eb89d76e8b4) )
|
ROM_LOAD( "14.s6b", 0x00000, 0x04000, CRC(b4a2497b) SHA1(7231f57b4548899c886625e883b9972c0f30e9f2) )
|
||||||
ROM_LOAD( "14.s6b", 0x08000, 0x04000, CRC(b4a2497b) SHA1(7231f57b4548899c886625e883b9972c0f30e9f2) )
|
|
||||||
|
ROM_REGION( 0x4000, "samples", 0 )
|
||||||
|
ROM_LOAD( "13.s7b", 0x00000, 0x04000, CRC(5eb75f56) SHA1(b7d81d786d1ac8d65a6a122140954eb89d76e8b4) )
|
||||||
|
|
||||||
ROM_REGION( 0x40000, "gfx", ROMREGION_ERASEFF )
|
ROM_REGION( 0x40000, "gfx", ROMREGION_ERASEFF )
|
||||||
ROM_LOAD( "2.3c", 0x00000, 0x04000, CRC(f719e09d) SHA1(c78411b4f974b3dd261d51e522e086fc30a96fcb) )
|
ROM_LOAD( "2.3c", 0x00000, 0x04000, CRC(f719e09d) SHA1(c78411b4f974b3dd261d51e522e086fc30a96fcb) )
|
||||||
@ -970,6 +1027,10 @@ ROM_START( sweetgal )
|
|||||||
ROM_REGION( 0x2000, "subrom", 0 )
|
ROM_REGION( 0x2000, "subrom", 0 )
|
||||||
ROM_LOAD( "1.3a", 0x0000, 0x2000, CRC(5342c757) SHA1(b4ff84c45bd2c6a6a468f1d0daaf5b19c4dbf8fe) ) // sldh
|
ROM_LOAD( "1.3a", 0x0000, 0x2000, CRC(5342c757) SHA1(b4ff84c45bd2c6a6a468f1d0daaf5b19c4dbf8fe) ) // sldh
|
||||||
|
|
||||||
|
ROM_REGION( 0x4000, "audiorom", 0)
|
||||||
|
// taken from sexygal, none of the samples ROMs has code, maybe it doesn't have the extra CPU as well (no access to the extra ports)
|
||||||
|
ROM_LOAD( "14.s6b", 0x00000, 0x04000, BAD_DUMP CRC(b4a2497b) SHA1(7231f57b4548899c886625e883b9972c0f30e9f2) )
|
||||||
|
|
||||||
ROM_REGION( 0xc000, "samples", 0 ) // sound samples
|
ROM_REGION( 0xc000, "samples", 0 ) // sound samples
|
||||||
ROM_LOAD( "v2_12.bin", 0x00000, 0x04000, CRC(66a35be2) SHA1(4f0d73d753387acacc5ccc90e91d848a5ecce55e) )
|
ROM_LOAD( "v2_12.bin", 0x00000, 0x04000, CRC(66a35be2) SHA1(4f0d73d753387acacc5ccc90e91d848a5ecce55e) )
|
||||||
ROM_LOAD( "v2_13.bin", 0x04000, 0x04000, CRC(60785a0d) SHA1(71eaec3512c0b18b93c083c1808eec51cfd4f520) )
|
ROM_LOAD( "v2_13.bin", 0x04000, 0x04000, CRC(60785a0d) SHA1(71eaec3512c0b18b93c083c1808eec51cfd4f520) )
|
||||||
@ -1170,7 +1231,7 @@ READ8_MEMBER(nightgal_state::ngalsumr_prot_value_r)
|
|||||||
return 0x60;
|
return 0x60;
|
||||||
|
|
||||||
case 0xc: // score table blink width
|
case 0xc: // score table blink width
|
||||||
return 80;
|
return 120;
|
||||||
case 0x2: // score table blink height
|
case 0x2: // score table blink height
|
||||||
return 8;
|
return 8;
|
||||||
|
|
||||||
@ -1187,7 +1248,7 @@ READ8_MEMBER(nightgal_state::ngalsumr_prot_value_r)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%02x\n",m_z80_latch);
|
logerror("ngalsumr protection device unemulated value latched = %02x\n",m_z80_latch);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user