summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2017-11-03 19:28:42 +0100
committer angelosa <salese_corp_ltd@email.it>2017-11-03 22:20:16 +0100
commit50303ceacbf5bfbbdc421f58a8b7572d2bcd91d2 (patch)
tree5e1717c632106f463865528b516d3532eab9c51f
parent596ccff832f8992a4363bf80ddc6c4740ae0077f (diff)
flower.cpp: fixed all outputs, added third Z80 (nw)
-rw-r--r--src/mame/drivers/flower.cpp155
1 files changed, 128 insertions, 27 deletions
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<cpu_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<cpu_device> m_mastercpu;
+ required_device<cpu_device> m_slavecpu;
+ required_device<cpu_device> m_audiocpu;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_txvram;
@@ -114,16 +135,19 @@ public:
required_shared_ptr<uint8_t> m_workram;
required_shared_ptr<uint8_t> m_bgscroll;
required_shared_ptr<uint8_t> m_fgscroll;
+ required_device<generic_latch_8_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
+void flower_state::machine_start()
+{
+ save_item(NAME(m_audio_nmi_enable));
+}
+
+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("maincpu",Z80,4000000)
+ 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("subcpu",Z80,4000000)
+ MCFG_CPU_ADD("slavecpu",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, 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 */