diff options
Diffstat (limited to 'src/mame/drivers/flower.cpp')
-rw-r--r-- | src/mame/drivers/flower.cpp | 218 |
1 files changed, 13 insertions, 205 deletions
diff --git a/src/mame/drivers/flower.cpp b/src/mame/drivers/flower.cpp index 06891e9c4a2..26197104508 100644 --- a/src/mame/drivers/flower.cpp +++ b/src/mame/drivers/flower.cpp @@ -1,12 +1,13 @@ -// license:??? -// copyright-holders:insideoutboy, David Haywood, Stephh +// license:BSD-3-Clause +// copyright-holders:David Haywood + +// **** SKELETON DRIVER **** original removed due to unresolved licensing. + /* Flower (c)1986 Komax (USA license) (c)1986 Sega/Alpha (Sega game number 834-5998) - - Driver by InsideOutBoy, further improvements by MAME team - There is a PCB picture that shows two stickers, the first says "Flower (c) 1986 Clarue" while the second one is an original serial number tag also showing "Clarue". GFX ROM contents also @@ -74,215 +75,22 @@ CHIP # POSITION TYPE #include "emu.h" #include "cpu/z80/z80.h" -#include "includes/flower.h" - - -WRITE8_MEMBER(flower_state::flower_maincpu_irq_ack) -{ - m_maincpu->set_input_line(0, CLEAR_LINE); -} -WRITE8_MEMBER(flower_state::flower_subcpu_irq_ack) +class flower_state : public driver_device { - m_subcpu->set_input_line(0, CLEAR_LINE); -} +public: + flower_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + { } +}; -WRITE8_MEMBER(flower_state::flower_soundcpu_irq_ack) -{ - m_audiocpu->set_input_line(0, CLEAR_LINE); -} -WRITE8_MEMBER(flower_state::flower_coin_counter_w) -{ - machine().bookkeeping().coin_counter_w(0, data & 1); -} - -WRITE8_MEMBER(flower_state::flower_coin_lockout_w) -{ - machine().bookkeeping().coin_lockout_global_w(~data & 1); -} -WRITE8_MEMBER(flower_state::sound_command_w) -{ - soundlatch_byte_w(space, 0, data); - - if (*m_sn_nmi_enable & 1) - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); -} - -static ADDRESS_MAP_START( flower_cpu1_2, AS_PROGRAM, 8, flower_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0xa000, 0xa000) AM_WRITE(flower_coin_lockout_w) - AM_RANGE(0xa001, 0xa001) AM_WRITE(flower_flipscreen_w) - AM_RANGE(0xa002, 0xa002) AM_WRITE(flower_maincpu_irq_ack) - AM_RANGE(0xa003, 0xa003) AM_WRITE(flower_subcpu_irq_ack) - AM_RANGE(0xa004, 0xa004) AM_WRITE(flower_coin_counter_w) - AM_RANGE(0xa005, 0xa005) AM_WRITENOP // subcpu nmi (unused) - AM_RANGE(0xa100, 0xa100) AM_READ_PORT("IN0CPU1") - AM_RANGE(0xa101, 0xa101) AM_READ_PORT("IN1CPU1") - AM_RANGE(0xa102, 0xa102) AM_READ_PORT("IN0CPU0") - AM_RANGE(0xa103, 0xa103) AM_READ_PORT("IN1CPU0") - AM_RANGE(0xa400, 0xa400) AM_WRITE(sound_command_w) - AM_RANGE(0xc000, 0xddff) AM_RAM AM_SHARE("mainram1") - AM_RANGE(0xde00, 0xdfff) AM_RAM AM_SHARE("spriteram") - AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(flower_textram_w) AM_SHARE("textram") - AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("mainram2") // only cleared? - AM_RANGE(0xf000, 0xf1ff) AM_RAM_WRITE(flower_bg0ram_w) AM_SHARE("bg0ram") - AM_RANGE(0xf200, 0xf200) AM_RAM AM_SHARE("bg0_scroll") - AM_RANGE(0xf800, 0xf9ff) AM_RAM_WRITE(flower_bg1ram_w) AM_SHARE("bg1ram") - AM_RANGE(0xfa00, 0xfa00) AM_RAM AM_SHARE("bg1_scroll") -ADDRESS_MAP_END - -static ADDRESS_MAP_START( flower_sound_cpu, AS_PROGRAM, 8, flower_state ) - AM_RANGE(0x0000, 0x3fff) AM_ROM - AM_RANGE(0x4000, 0x4000) AM_WRITE(flower_soundcpu_irq_ack) - AM_RANGE(0x4001, 0x4001) AM_WRITEONLY AM_SHARE("sn_nmi_enable") - AM_RANGE(0x6000, 0x6000) AM_READ(soundlatch_byte_r) - AM_RANGE(0x8000, 0x803f) AM_DEVWRITE("flower", flower_sound_device, sound1_w) - AM_RANGE(0xa000, 0xa03f) AM_DEVWRITE("flower", flower_sound_device, sound2_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); -} static INPUT_PORTS_START( flower ) - PORT_START("IN0CPU0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, flower_state,coin_inserted, 0) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) - PORT_DIPNAME( 0x08, 0x08, "Energy Decrease" ) PORT_DIPLOCATION("SW2:4") - PORT_DIPSETTING( 0x08, "Slow" ) - PORT_DIPSETTING( 0x00, "Fast" ) - PORT_DIPNAME( 0x10, 0x10, "Invulnerability (Cheat)") PORT_DIPLOCATION("SW2:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Keep Weapons When Destroyed" ) PORT_DIPLOCATION("SW2:6") // check code at 0x74a2 - PORT_DIPSETTING( 0x20, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7") // "Enemy Bullets" - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x80, 0x80, "Shot Range" ) PORT_DIPLOCATION("SW2:8") // check code at 0x75f9 - PORT_DIPSETTING( 0x80, "Short" ) - PORT_DIPSETTING( 0x00, "Long" ) - - PORT_START("IN1CPU0") - PORT_DIPNAME( 0x07, 0x05, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2,3") - PORT_DIPSETTING( 0x07, "1" ) - PORT_DIPSETTING( 0x06, "2" ) - PORT_DIPSETTING( 0x05, "3" ) - PORT_DIPSETTING( 0x04, "4" ) - PORT_DIPSETTING( 0x03, "5" ) - PORT_DIPSETTING( 0x02, "6" ) - PORT_DIPSETTING( 0x01, "7" ) - PORT_DIPSETTING( 0x00, "Infinite (Cheat)") - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:4,5") - PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x18, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:6") // check code at 0x759f - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x80, "30k, then every 50k" ) - PORT_DIPSETTING( 0x00, "50k, then every 80k" ) - - PORT_START("IN0CPU1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Laser") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Missile") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 Cutter") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN1CPU1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Laser") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Missile") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Cutter") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END -static const gfx_layout flower_charlayout = -{ - 8,8, - RGN_FRAC(1,1), - 2, - { 0, 4 }, - { STEP4(0,1), STEP4(8,1) }, - { STEP8(0,16) }, - 8*8*2 -}; - -static const gfx_layout flower_tilelayout = -{ - 16,16, - RGN_FRAC(1,2), - 4, - { 0, 4, RGN_FRAC(1,2), RGN_FRAC(1,2)+4 }, - { STEP4(0,1), STEP4(8,1), STEP4(8*8*2,1), STEP4(8*8*2+8,1) }, - { STEP8(0,16), STEP8(8*8*4,16) }, - 16*16*2 -}; - -static GFXDECODE_START( flower ) - GFXDECODE_ENTRY( "gfx1", 0, flower_charlayout, 0, 64 ) - GFXDECODE_ENTRY( "gfx2", 0, flower_tilelayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, flower_tilelayout, 0, 16 ) -GFXDECODE_END - - static MACHINE_CONFIG_START( flower, flower_state ) - - /* basic machine hardware */ - // clock divider (of all cpus) is unknown. /6 (3.072 MHz) is too slow - // cpus are Z80 "A" type, official maximum speed of 4 MHz, but 4.6 MHz has been proven to work in practice - MCFG_CPU_ADD("maincpu", Z80,XTAL_18_432MHz/4) - MCFG_CPU_PROGRAM_MAP(flower_cpu1_2) - MCFG_CPU_VBLANK_INT_DRIVER("screen", flower_state, irq0_line_hold) - - MCFG_CPU_ADD("subcpu", Z80,XTAL_18_432MHz/4) - MCFG_CPU_PROGRAM_MAP(flower_cpu1_2) - MCFG_CPU_PERIODIC_INT_DRIVER(flower_state, irq0_line_hold, 120) // controls game speed? irqsource and frequency unknown - - MCFG_CPU_ADD("audiocpu", Z80,XTAL_18_432MHz/4) - MCFG_CPU_PROGRAM_MAP(flower_sound_cpu) - MCFG_CPU_PERIODIC_INT_DRIVER(flower_state, irq0_line_hold, 90) // controls music speed. irqsource and frequency unknown, same as subcpu perhaps? - - // tight sync, slowdowns otherwise -// MCFG_QUANTUM_PERFECT_CPU("maincpu") - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) - - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) // ? - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(34*8, 33*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE_DRIVER(flower_state, screen_update_flower) - MCFG_SCREEN_PALETTE("palette") - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", flower) - MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", 256) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("flower", FLOWER, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END @@ -373,5 +181,5 @@ ROM_START( flowerj ) /* Sega/Alpha version. Sega game number 834-5998 */ ROM_END -GAME( 1986, flower, 0, flower, flower, driver_device, 0, ROT0, "Clarue (Komax license)", "Flower (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1986, flowerj, flower, flower, flower, driver_device, 0, ROT0, "Clarue (Sega / Alpha Denshi Co. license)", "Flower (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) +GAME( 1986, flower, 0, flower, flower, driver_device, 0, ROT0, "Clarue (Komax license)", "Flower (US)", MACHINE_IS_SKELETON ) +GAME( 1986, flowerj, flower, flower, flower, driver_device, 0, ROT0, "Clarue (Sega / Alpha Denshi Co. license)", "Flower (Japan)", MACHINE_IS_SKELETON ) |