diff --git a/src/mame/drivers/flower.cpp b/src/mame/drivers/flower.cpp index bfc65489693..03032beb5ac 100644 --- a/src/mame/drivers/flower.cpp +++ b/src/mame/drivers/flower.cpp @@ -2,7 +2,7 @@ // copyright-holders:Angelo Salese /****************************************************************************** - Flower (c) 1986 Clarue + Flower (c) 1986 Clarue (licensed to Komax/Sega) driver by Angelo Salese, original "wiped off due of not anymore licenseable" driver by insideoutboy. @@ -23,12 +23,6 @@ There is a PCB picture that shows two stickers, the first says serial number tag also showing "Clarue". GFX ROM contents also show (C) 1986 CLARUE. A Wood Place Inc. spinoff perhaps? - -todo: - -fix sound and timing - - FLOWER CHIP PLACEMENT XTAL: 18.4320 MHz @@ -87,14 +81,21 @@ CHIP # POSITION TYPE #include "emu.h" #include "cpu/z80/z80.h" +#include "machine/gen_latch.h" +#include "audio/wiping.h" #include "screen.h" +#include "speaker.h" + +#define MASTER_CLOCK XTAL_18_432MHz class flower_state : public driver_device { public: flower_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), + m_mastercpu(*this, "mastercpu"), + m_slavecpu(*this, "slavecpu"), + m_audiocpu(*this, "audiocpu"), m_palette(*this, "palette"), m_gfxdecode(*this, "gfxdecode"), m_txvram(*this, "txvram"), @@ -102,10 +103,30 @@ public: m_fgvram(*this, "fgvram"), m_workram(*this, "workram"), m_bgscroll(*this, "bgscroll"), - m_fgscroll(*this, "fgscroll") + m_fgscroll(*this, "fgscroll"), + m_soundlatch(*this, "soundlatch") { } - required_device m_maincpu; + DECLARE_WRITE8_MEMBER(flipscreen_w); + DECLARE_WRITE8_MEMBER(coin_counter_w); + DECLARE_WRITE8_MEMBER(sound_command_w); + DECLARE_WRITE8_MEMBER(audio_nmi_mask_w); + DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); + INTERRUPT_GEN_MEMBER(master_vblank_irq); + INTERRUPT_GEN_MEMBER(slave_vblank_irq); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // driver_device overrides + virtual void machine_start() override; + virtual void machine_reset() override; + + virtual void video_start() override; + +private: + required_device m_mastercpu; + required_device m_slavecpu; + required_device m_audiocpu; required_device m_palette; required_device m_gfxdecode; required_shared_ptr m_txvram; @@ -114,16 +135,19 @@ public: required_shared_ptr m_workram; required_shared_ptr m_bgscroll; required_shared_ptr m_fgscroll; + required_device m_soundlatch; - - DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void legacy_tx_draw(bitmap_ind16 &bitmap,const rectangle &cliprect); void legacy_layers_draw(bitmap_ind16 &bitmap,const rectangle &cliprect); void sprites_draw(bitmap_ind16 &bitmap,const rectangle &cliprect); + + bool m_audio_nmi_enable; }; - +void flower_state::video_start() +{ + // ... +} void flower_state::legacy_tx_draw(bitmap_ind16 &bitmap,const rectangle &cliprect) { @@ -253,14 +277,42 @@ uint32_t flower_state::screen_update( screen_device &screen, bitmap_ind16 &bitma return 0; } +WRITE8_MEMBER(flower_state::flipscreen_w) +{ + flip_screen_set(data & 1); +} + +WRITE8_MEMBER(flower_state::coin_counter_w) +{ + machine().bookkeeping().coin_counter_w(0,data & 1); +} + +WRITE8_MEMBER(flower_state::sound_command_w) +{ + m_soundlatch->write(space, 0, data & 0xff); + if(m_audio_nmi_enable == true) + m_audiocpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE); +} + +WRITE8_MEMBER(flower_state::audio_nmi_mask_w) +{ + m_audio_nmi_enable = BIT(data,0); +} + static ADDRESS_MAP_START( shared_map, AS_PROGRAM, 8, flower_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("workram") AM_RANGE(0xa000, 0xa000) AM_WRITENOP + AM_RANGE(0xa001, 0xa001) AM_WRITE(flipscreen_w) + AM_RANGE(0xa002, 0xa002) AM_WRITENOP // master irq related (0 at start, 1 at end) + AM_RANGE(0xa003, 0xa003) AM_WRITENOP // slave irq related (0 at start, 1 at end) + AM_RANGE(0xa004, 0xa004) AM_WRITE(coin_counter_w) + AM_RANGE(0xa005, 0xa005) AM_WRITENOP AM_RANGE(0xa100, 0xa100) AM_READ_PORT("P1") AM_RANGE(0xa101, 0xa101) AM_READ_PORT("P2") AM_RANGE(0xa102, 0xa102) AM_READ_PORT("DSW1") AM_RANGE(0xa103, 0xa103) AM_READ_PORT("DSW2") + AM_RANGE(0xa400, 0xa400) AM_WRITE(sound_command_w) AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("txvram") AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_SHARE("bgvram") AM_RANGE(0xf200, 0xf200) AM_RAM AM_SHARE("bgscroll") @@ -268,9 +320,20 @@ static ADDRESS_MAP_START( shared_map, AS_PROGRAM, 8, flower_state ) AM_RANGE(0xfa00, 0xfa00) AM_RAM AM_SHARE("fgscroll") ADDRESS_MAP_END +static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, flower_state ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x4000) AM_WRITENOP // audio irq related (0 at start, 1 at end) + AM_RANGE(0x4001, 0x4001) AM_WRITE(audio_nmi_mask_w) + AM_RANGE(0x6000, 0x6000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) + // TODO: wrong for this + AM_RANGE(0x8000, 0x803f) AM_DEVWRITE("wiping1", wiping_sound_device, sound_w) + AM_RANGE(0xa000, 0xa03f) AM_DEVWRITE("wiping2", wiping_sound_device, sound_w) + AM_RANGE(0xc000, 0xc7ff) AM_RAM +ADDRESS_MAP_END + INPUT_CHANGED_MEMBER(flower_state::coin_inserted) { - m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); + m_mastercpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); } static INPUT_PORTS_START( flower ) @@ -368,14 +431,43 @@ static GFXDECODE_START( flower ) GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 0, 16 ) GFXDECODE_END -static MACHINE_CONFIG_START( flower ) - MCFG_CPU_ADD("maincpu",Z80,4000000) - MCFG_CPU_PROGRAM_MAP(shared_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, irq0_line_hold) +void flower_state::machine_start() +{ + save_item(NAME(m_audio_nmi_enable)); +} - MCFG_CPU_ADD("subcpu",Z80,4000000) +void flower_state::machine_reset() +{ + m_audio_nmi_enable = false; +} + +INTERRUPT_GEN_MEMBER(flower_state::master_vblank_irq) +{ + //if(m_master_irq_enable == true) + device.execute().set_input_line(0, HOLD_LINE); +} + +INTERRUPT_GEN_MEMBER(flower_state::slave_vblank_irq) +{ + //if(m_slave_irq_enable == true) + device.execute().set_input_line(0, HOLD_LINE); +} + + +static MACHINE_CONFIG_START( flower ) + MCFG_CPU_ADD("mastercpu",Z80,MASTER_CLOCK/4) MCFG_CPU_PROGRAM_MAP(shared_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, irq0_line_hold) + MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, master_vblank_irq) + + MCFG_CPU_ADD("slavecpu",Z80,MASTER_CLOCK/4) + MCFG_CPU_PROGRAM_MAP(shared_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, slave_vblank_irq) + + MCFG_CPU_ADD("audiocpu",Z80,MASTER_CLOCK/4) + MCFG_CPU_PROGRAM_MAP(audio_map) + MCFG_CPU_PERIODIC_INT_DRIVER(flower_state, irq0_line_hold, 90) + + MCFG_QUANTUM_PERFECT_CPU("mastercpu") MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_UPDATE_DRIVER(flower_state, screen_update) @@ -385,14 +477,23 @@ static MACHINE_CONFIG_START( flower ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", flower) MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 256) + MCFG_GENERIC_LATCH_8_ADD("soundlatch") + + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("wiping1", WIPING, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + + MCFG_SOUND_ADD("wiping2", WIPING, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END ROM_START( flower ) /* Komax version */ - ROM_REGION( 0x10000, "maincpu", 0 ) /* main cpu */ + ROM_REGION( 0x10000, "mastercpu", 0 ) /* main cpu */ ROM_LOAD( "1.5j", 0x0000, 0x8000, CRC(a4c3af78) SHA1(d149b0e0d82318273dd9cc5a143b175cdc818d0d) ) - ROM_REGION( 0x10000, "subcpu", 0 ) /* sub cpu */ + ROM_REGION( 0x10000, "slavecpu", 0 ) /* sub cpu */ ROM_LOAD( "2.5f", 0x0000, 0x8000, CRC(7c7ee2d8) SHA1(1e67bfe0f3585be5a6e6719ccf9db764bafbcb01) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ @@ -413,10 +514,10 @@ ROM_START( flower ) /* Komax version */ ROM_LOAD( "12.16e", 0x4000, 0x2000, CRC(e3779f7f) SHA1(8e12d06b3cdc2fcb7b77cc35f8eca45544cc4873) ) ROM_LOAD( "11.14e", 0x6000, 0x2000, CRC(8801b34f) SHA1(256059fcd16b21e076db1c18fd9669128df1d658) ) - ROM_REGION( 0x8000, "sound1", 0 ) + ROM_REGION( 0x8000, "samples", 0 ) ROM_LOAD( "4.12a", 0x0000, 0x8000, CRC(851ed9fd) SHA1(5dc048b612e45da529502bf33d968737a7b0a646) ) /* 8-bit samples */ - ROM_REGION( 0x4000, "sound2", 0 ) + ROM_REGION( 0x4000, "soundproms", 0 ) ROM_LOAD( "5.16a", 0x0000, 0x4000, CRC(42fa2853) SHA1(cc1e8b8231d6f27f48b05d59390e93ea1c1c0e4c) ) /* volume tables? */ ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */ @@ -432,10 +533,10 @@ ROM_START( flower ) /* Komax version */ ROM_END ROM_START( flowerj ) /* Sega/Alpha version. Sega game number 834-5998 */ - ROM_REGION( 0x10000, "maincpu", 0 ) /* main cpu */ + ROM_REGION( 0x10000, "mastercpu", 0 ) /* main cpu */ ROM_LOAD( "1", 0x0000, 0x8000, CRC(63a2ef04) SHA1(0770f5a18d58b780abcda7e000c2a5e46f96d319) ) // hacked? "AKINA.N" changed to "JUKYUNG" - ROM_REGION( 0x10000, "subcpu", 0 ) /* sub cpu */ + ROM_REGION( 0x10000, "slavecpu", 0 ) /* sub cpu */ ROM_LOAD( "2.5f", 0x0000, 0x8000, CRC(7c7ee2d8) SHA1(1e67bfe0f3585be5a6e6719ccf9db764bafbcb01) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ @@ -456,10 +557,10 @@ ROM_START( flowerj ) /* Sega/Alpha version. Sega game number 834-5998 */ ROM_LOAD( "12.16e", 0x4000, 0x2000, CRC(e3779f7f) SHA1(8e12d06b3cdc2fcb7b77cc35f8eca45544cc4873) ) ROM_LOAD( "11.14e", 0x6000, 0x2000, CRC(8801b34f) SHA1(256059fcd16b21e076db1c18fd9669128df1d658) ) - ROM_REGION( 0x8000, "sound1", 0 ) + ROM_REGION( 0x8000, "samples", 0 ) ROM_LOAD( "4.12a", 0x0000, 0x8000, CRC(851ed9fd) SHA1(5dc048b612e45da529502bf33d968737a7b0a646) ) /* 8-bit samples */ - ROM_REGION( 0x4000, "sound2", 0 ) + ROM_REGION( 0x4000, "soundproms", 0 ) ROM_LOAD( "5.16a", 0x0000, 0x4000, CRC(42fa2853) SHA1(cc1e8b8231d6f27f48b05d59390e93ea1c1c0e4c) ) /* volume tables? */ ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */