mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
flower.cpp: fixed all outputs, added third Z80 (nw)
This commit is contained in:
parent
596ccff832
commit
50303ceacb
@ -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
|
||||
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user