flower.cpp: fixed all outputs, added third Z80 (nw)

This commit is contained in:
angelosa 2017-11-03 19:28:42 +01:00
parent 596ccff832
commit 50303ceacb

View File

@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese // copyright-holders:Angelo Salese
/****************************************************************************** /******************************************************************************
Flower (c) 1986 Clarue Flower (c) 1986 Clarue (licensed to Komax/Sega)
driver by Angelo Salese, driver by Angelo Salese,
original "wiped off due of not anymore licenseable" driver by insideoutboy. 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 serial number tag also showing "Clarue". GFX ROM contents also
show (C) 1986 CLARUE. A Wood Place Inc. spinoff perhaps? show (C) 1986 CLARUE. A Wood Place Inc. spinoff perhaps?
todo:
fix sound and timing
FLOWER CHIP PLACEMENT FLOWER CHIP PLACEMENT
XTAL: 18.4320 MHz XTAL: 18.4320 MHz
@ -87,14 +81,21 @@ CHIP # POSITION TYPE
#include "emu.h" #include "emu.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "audio/wiping.h"
#include "screen.h" #include "screen.h"
#include "speaker.h"
#define MASTER_CLOCK XTAL_18_432MHz
class flower_state : public driver_device class flower_state : public driver_device
{ {
public: public:
flower_state(const machine_config &mconfig, device_type type, const char *tag) flower_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, 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_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_txvram(*this, "txvram"), m_txvram(*this, "txvram"),
@ -102,10 +103,30 @@ public:
m_fgvram(*this, "fgvram"), m_fgvram(*this, "fgvram"),
m_workram(*this, "workram"), m_workram(*this, "workram"),
m_bgscroll(*this, "bgscroll"), 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<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_txvram; 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_workram;
required_shared_ptr<uint8_t> m_bgscroll; required_shared_ptr<uint8_t> m_bgscroll;
required_shared_ptr<uint8_t> m_fgscroll; 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_tx_draw(bitmap_ind16 &bitmap,const rectangle &cliprect);
void legacy_layers_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); 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) 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; 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 ) static ADDRESS_MAP_START( shared_map, AS_PROGRAM, 8, flower_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("workram") AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("workram")
AM_RANGE(0xa000, 0xa000) AM_WRITENOP 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(0xa100, 0xa100) AM_READ_PORT("P1")
AM_RANGE(0xa101, 0xa101) AM_READ_PORT("P2") AM_RANGE(0xa101, 0xa101) AM_READ_PORT("P2")
AM_RANGE(0xa102, 0xa102) AM_READ_PORT("DSW1") AM_RANGE(0xa102, 0xa102) AM_READ_PORT("DSW1")
AM_RANGE(0xa103, 0xa103) AM_READ_PORT("DSW2") 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(0xe000, 0xefff) AM_RAM AM_SHARE("txvram")
AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_SHARE("bgvram") AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_SHARE("bgvram")
AM_RANGE(0xf200, 0xf200) AM_RAM AM_SHARE("bgscroll") 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") AM_RANGE(0xfa00, 0xfa00) AM_RAM AM_SHARE("fgscroll")
ADDRESS_MAP_END 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) 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 ) static INPUT_PORTS_START( flower )
@ -368,14 +431,43 @@ static GFXDECODE_START( flower )
GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 0, 16 ) GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 0, 16 )
GFXDECODE_END GFXDECODE_END
static MACHINE_CONFIG_START( flower ) void flower_state::machine_start()
MCFG_CPU_ADD("maincpu",Z80,4000000) {
MCFG_CPU_PROGRAM_MAP(shared_map) save_item(NAME(m_audio_nmi_enable));
MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, irq0_line_hold) }
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_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_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DRIVER(flower_state, screen_update) MCFG_SCREEN_UPDATE_DRIVER(flower_state, screen_update)
@ -385,14 +477,23 @@ static MACHINE_CONFIG_START( flower )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", flower) MCFG_GFXDECODE_ADD("gfxdecode", "palette", flower)
MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 256) 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 MACHINE_CONFIG_END
ROM_START( flower ) /* Komax version */ 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_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_LOAD( "2.5f", 0x0000, 0x8000, CRC(7c7ee2d8) SHA1(1e67bfe0f3585be5a6e6719ccf9db764bafbcb01) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ 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( "12.16e", 0x4000, 0x2000, CRC(e3779f7f) SHA1(8e12d06b3cdc2fcb7b77cc35f8eca45544cc4873) )
ROM_LOAD( "11.14e", 0x6000, 0x2000, CRC(8801b34f) SHA1(256059fcd16b21e076db1c18fd9669128df1d658) ) 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_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_LOAD( "5.16a", 0x0000, 0x4000, CRC(42fa2853) SHA1(cc1e8b8231d6f27f48b05d59390e93ea1c1c0e4c) ) /* volume tables? */
ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */ ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */
@ -432,10 +533,10 @@ ROM_START( flower ) /* Komax version */
ROM_END ROM_END
ROM_START( flowerj ) /* Sega/Alpha version. Sega game number 834-5998 */ 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_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_LOAD( "2.5f", 0x0000, 0x8000, CRC(7c7ee2d8) SHA1(1e67bfe0f3585be5a6e6719ccf9db764bafbcb01) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound cpu */ 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( "12.16e", 0x4000, 0x2000, CRC(e3779f7f) SHA1(8e12d06b3cdc2fcb7b77cc35f8eca45544cc4873) )
ROM_LOAD( "11.14e", 0x6000, 0x2000, CRC(8801b34f) SHA1(256059fcd16b21e076db1c18fd9669128df1d658) ) 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_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_LOAD( "5.16a", 0x0000, 0x4000, CRC(42fa2853) SHA1(cc1e8b8231d6f27f48b05d59390e93ea1c1c0e4c) ) /* volume tables? */
ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */ ROM_REGION( 0x300, "proms", 0 ) /* RGB proms */