diff options
Diffstat (limited to 'src/mame/drivers/acefruit.cpp')
-rw-r--r-- | src/mame/drivers/acefruit.cpp | 789 |
1 files changed, 0 insertions, 789 deletions
diff --git a/src/mame/drivers/acefruit.cpp b/src/mame/drivers/acefruit.cpp deleted file mode 100644 index f8fc8e8b065..00000000000 --- a/src/mame/drivers/acefruit.cpp +++ /dev/null @@ -1,789 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf,Stephane Humbert -/*************************************************************************** - -Ace Video Fruit Machine hardware -(c)1981-1982 ACE Leisure - -Driver by SMF & Guddler 04/02/2007 -Inputs and Dip Switches by Stephh - -***************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "machine/nvram.h" -#include "machine/watchdog.h" -#include "emupal.h" -#include "screen.h" - -#include "sidewndr.lh" - - -class acefruit_state : public driver_device -{ -public: - acefruit_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_videoram(*this, "videoram"), - m_colorram(*this, "colorram"), - m_spriteram(*this, "spriteram"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_port_payout(*this, "PAYOUT"), - m_port_coinage(*this, "COINAGE"), - m_lamps(*this, "lamp%u", 0U), - m_solenoids(*this, "solenoid%u", 0U), - m_refresh_timer(nullptr) - { } - - void acefruit(machine_config &config); - - void init_sidewndr(); - - template <int Mask> DECLARE_READ_LINE_MEMBER(sidewndr_payout_r); - template <int Mask> DECLARE_READ_LINE_MEMBER(starspnr_coinage_r); - template <int Mask> DECLARE_READ_LINE_MEMBER(starspnr_payout_r); - -protected: - enum - { - TIMER_ACEFRUIT_REFRESH - }; - - virtual void machine_start() override; - virtual void video_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - -private: - void acefruit_colorram_w(offs_t offset, uint8_t data); - void acefruit_coin_w(uint8_t data); - void acefruit_sound_w(uint8_t data); - void acefruit_lamp_w(offs_t offset, uint8_t data); - void acefruit_solenoid_w(uint8_t data); - - void acefruit_palette(palette_device &palette) const; - uint32_t screen_update_acefruit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(acefruit_vblank); - void acefruit_update_irq(int vpos); - - void acefruit_io(address_map &map); - void acefruit_map(address_map &map); - - required_device<cpu_device> m_maincpu; - required_shared_ptr<uint8_t> m_videoram; - required_shared_ptr<uint8_t> m_colorram; - required_shared_ptr<uint8_t> m_spriteram; - required_device<gfxdecode_device> m_gfxdecode; - required_device<screen_device> m_screen; - required_device<palette_device> m_palette; - optional_ioport m_port_payout; - optional_ioport m_port_coinage; - output_finder<16> m_lamps; - output_finder<8> m_solenoids; - emu_timer *m_refresh_timer; -}; - - - -void acefruit_state::acefruit_update_irq(int vpos) -{ - int col; - int row = vpos / 8; - - for( col = 0; col < 32; col++ ) - { - int tile_index = ( col * 32 ) + row; - int color = m_colorram[ tile_index ]; - - switch( color ) - { - case 0x0c: - m_maincpu->set_input_line(0, HOLD_LINE); - break; - } - } -} - - -void acefruit_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - int vpos = m_screen->vpos(); - - switch(id) - { - case TIMER_ACEFRUIT_REFRESH: - - m_screen->update_partial(vpos); - acefruit_update_irq(vpos); - - vpos = ((vpos / 8) + 1) * 8; - - m_refresh_timer->adjust(m_screen->time_until_pos(vpos)); - break; - default: - throw emu_fatalerror("Unknown id in acefruit_state::device_timer"); - } -} - -void acefruit_state::machine_start() -{ - m_lamps.resolve(); - m_solenoids.resolve(); -} - -void acefruit_state::video_start() -{ - m_refresh_timer = timer_alloc(TIMER_ACEFRUIT_REFRESH); -} - -INTERRUPT_GEN_MEMBER(acefruit_state::acefruit_vblank) -{ - device.execute().set_input_line(0, HOLD_LINE ); - m_refresh_timer->adjust( attotime::zero ); -} - -uint32_t acefruit_state::screen_update_acefruit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int startrow = cliprect.min_y / 8; - int endrow = cliprect.max_y / 8; - - for( int row = startrow; row <= endrow; row++ ) - { - int spriterow = 0; - int spriteindex = 0; - int spriteparameter = 0; - - for( int col = 0; col < 32; col++ ) - { - int tile_index = ( col * 32 ) + row; - int code = m_videoram[ tile_index ]; - int color = m_colorram[ tile_index ]; - - if( color < 0x4 ) - { - m_gfxdecode->gfx(1)->opaque(bitmap,cliprect, code, color, 0, 0, col * 16, row * 8 ); - } - else if( color >= 0x5 && color <= 0x7 ) - { - static const int spriteskip[] = { 1, 2, 4 }; - int spritesize = spriteskip[ color - 5 ]; - gfx_element *gfx = m_gfxdecode->gfx(0); - - for( int x = 0; x < 16; x++ ) - { - int sprite = ( m_spriteram[ ( spriteindex / 64 ) % 6 ] & 0xf ) ^ 0xf; - const uint8_t *gfxdata = gfx->get_data(sprite); - - for( int y = 0; y < 8; y++ ) - { - uint16_t *dst = &bitmap.pix(y + ( row * 8 ), x + ( col * 16 ) ); - *( dst ) = *( gfxdata + ( ( spriterow + y ) * gfx->rowbytes() ) + ( ( spriteindex % 64 ) >> 1 ) ); - } - - spriteindex += spritesize; - } - } - else - { - for( int x = 0; x < 16; x++ ) - { - for( int y = 0; y < 8; y++ ) - { - uint16_t *dst = &bitmap.pix(y + ( row * 8 ), x + ( col * 16 ) ); - *( dst ) = 0; - } - } - - if( color == 0x8 ) - { - if( spriteparameter == 0 ) - { - spriteindex = code & 0xf; - } - else - { - spriterow = ( ( code >> 0 ) & 0x3 ) * 8; - spriteindex += ( ( code >> 2 ) & 0x1 ) * 16; - } - - spriteparameter = !spriteparameter; - } - else if( color == 0xc ) - { - /* irq generated in acefruit_update_irq() */ - } - } - } - } - - return 0; -} - -template <int Mask> -int acefruit_state::sidewndr_payout_r() -{ - switch (Mask) - { - case 0x01: - return ((m_port_payout->read() & Mask) >> 0); - case 0x02: - return ((m_port_payout->read() & Mask) >> 1); - default: - logerror("sidewndr_payout_r : invalid %02X bit_mask\n",Mask); - return 0; - } -} - -template <int Mask> -int acefruit_state::starspnr_coinage_r() -{ - switch (Mask) - { - case 0x01: - return ((m_port_coinage->read() & Mask) >> 0); - case 0x02: - return ((m_port_coinage->read() & Mask) >> 1); - case 0x04: - return ((m_port_coinage->read() & Mask) >> 2); - case 0x08: - return ((m_port_coinage->read() & Mask) >> 3); - default: - logerror("starspnr_coinage_r : invalid %02X bit_mask\n",Mask); - return 0; - } -} - -template <int Mask> -int acefruit_state::starspnr_payout_r() -{ - switch (Mask) - { - case 0x01: - return ((m_port_payout->read() & Mask) >> 0); - case 0x02: - return ((m_port_payout->read() & Mask) >> 1); - case 0x04: - return ((m_port_payout->read() & Mask) >> 2); - default: - logerror("starspnr_payout_r : invalid %02X bit_mask\n",Mask); - return 0; - } -} - -void acefruit_state::acefruit_colorram_w(offs_t offset, uint8_t data) -{ - m_colorram[ offset ] = data & 0xf; -} - -void acefruit_state::acefruit_coin_w(uint8_t data) -{ - /* TODO: ? */ -} - -void acefruit_state::acefruit_sound_w(uint8_t data) -{ - /* TODO: ? */ -} - -void acefruit_state::acefruit_lamp_w(offs_t offset, uint8_t data) -{ - for (int i = 0; i < 8; i++) - m_lamps[(offset << 3) | i] = BIT(data, i); -} - -void acefruit_state::acefruit_solenoid_w(uint8_t data) -{ - for (int i = 0; i < 8; i++) - m_solenoids[i] = BIT(data, i); -} - -void acefruit_state::acefruit_palette(palette_device &palette) const -{ - /* sprites */ - palette.set_pen_color( 0, rgb_t(0x00, 0x00, 0x00) ); - palette.set_pen_color( 1, rgb_t(0x00, 0x00, 0xff) ); - palette.set_pen_color( 2, rgb_t(0x00, 0xff, 0x00) ); - palette.set_pen_color( 3, rgb_t(0xff, 0x7f, 0x00) ); - palette.set_pen_color( 4, rgb_t(0xff, 0x00, 0x00) ); - palette.set_pen_color( 5, rgb_t(0xff, 0xff, 0x00) ); - palette.set_pen_color( 6, rgb_t(0xff, 0xff, 0xff) ); - palette.set_pen_color( 7, rgb_t(0x7f, 0x3f, 0x1f) ); - - /* tiles */ - palette.set_pen_color( 8, rgb_t(0x00, 0x00, 0x00) ); - palette.set_pen_color( 9, rgb_t(0xff, 0xff, 0xff) ); - palette.set_pen_color( 10, rgb_t(0x00, 0x00, 0x00) ); - palette.set_pen_color( 11, rgb_t(0x00, 0x00, 0xff) ); - palette.set_pen_color( 12, rgb_t(0x00, 0x00, 0x00) ); - palette.set_pen_color( 13, rgb_t(0x00, 0xff, 0x00) ); - palette.set_pen_color( 14, rgb_t(0x00, 0x00, 0x00) ); - palette.set_pen_color( 15, rgb_t(0xff, 0x00, 0x00) ); -} - -void acefruit_state::acefruit_map(address_map &map) -{ - map(0x0000, 0x1fff).rom(); - map(0x2000, 0x20ff).ram().share("nvram"); - map(0x4000, 0x43ff).ram().share("videoram"); - map(0x4400, 0x47ff).ram().w(FUNC(acefruit_state::acefruit_colorram_w)).share("colorram"); - map(0x8000, 0x8000).portr("IN0"); - map(0x8001, 0x8001).portr("IN1"); - map(0x8002, 0x8002).portr("IN2"); - map(0x8003, 0x8003).portr("IN3"); - map(0x8004, 0x8004).portr("IN4"); - map(0x8005, 0x8005).portr("IN5"); - map(0x8006, 0x8006).portr("IN6"); - map(0x8007, 0x8007).portr("IN7"); - map(0x6000, 0x6005).ram().share("spriteram"); - map(0xa000, 0xa001).w(FUNC(acefruit_state::acefruit_lamp_w)); - map(0xa002, 0xa003).w(FUNC(acefruit_state::acefruit_coin_w)); - map(0xa004, 0xa004).w(FUNC(acefruit_state::acefruit_solenoid_w)); - map(0xa005, 0xa006).w(FUNC(acefruit_state::acefruit_sound_w)); - map(0xc000, 0xc000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); - map(0xe000, 0xffff).rom(); -} - -void acefruit_state::acefruit_io(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).noprw(); /* ? */ -} - -static INPUT_PORTS_START( sidewndr ) - PORT_START("IN0") // 0 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME( "Stop Nudge/Nudge Up or Down" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Gamble" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) /* "Cash in" */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") /* active low or high?? */ - PORT_BIT( 0xd8, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN1") // 1 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME( "Sidewind" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Collect" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) /* "Cash in" */ - PORT_DIPNAME( 0x08, 0x00, "Accountacy System Texts" ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN2") // 2 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME( "Cancel/Clear" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME( "Refill" ) PORT_TOGGLE - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) /* "Token in" - also "Refill" when "Refill" mode ON */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, sidewndr_payout_r<0x01>) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN3") // 3 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME( "Hold/Nudge 1" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME( "Accountancy System" ) PORT_TOGGLE - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN4 ) /* "50P in" */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, sidewndr_payout_r<0x02>) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN4") // 4 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME( "Hold/Nudge 2" ) - PORT_DIPNAME( 0x02, 0x00, "Allow Clear Data" ) /* in "Accountancy System" mode */ - PORT_DIPSETTING( 0x02, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x04, "Lamp 11 always ON" ) /* code at 0x173a - write lamp status at 0x01ed */ - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x00, "Sounds" ) /* data in 0x206b and 0x206c - out sound at 0x193e */ - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN5") // 5 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME( "Hold/Nudge 3" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME( "Test Program" ) PORT_TOGGLE - PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN6") // 6 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME( "Hold/Nudge 4" ) - /* I don't know exactly what this bit is supposed to do :( - I only found that when bit is LOW, no data is updated - (check "Accountancy System" mode). And when you switch - it from LOW to HIGH, previous saved values are back - (check for example the number of credits). */ - PORT_DIPNAME( 0x02, 0x02, "Save Data" ) /* code at 0x1773 */ - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN7") // 7 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) /* next in "Accountancy System" mode */ - PORT_DIPNAME( 0x02, 0x00, "Clear Credits on Reset" ) /* also affects rolls */ - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("PAYOUT") // fake port to handle settings via multiple input ports - PORT_DIPNAME( 0x03, 0x00, "Payout %" ) - PORT_DIPSETTING( 0x00, "74%" ) - PORT_DIPSETTING( 0x02, "78%" ) - PORT_DIPSETTING( 0x01, "82%" ) - PORT_DIPSETTING( 0x03, "86%" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( spellbnd ) - PORT_INCLUDE(sidewndr) - - PORT_MODIFY("IN0") - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) /* before COIN4 test - code at 0x0994 */ - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0xd0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_MODIFY("IN1") - PORT_DIPNAME( 0x08, 0x08, "Accountacy System Texts" ) /* bit test is inverted compared to 'sidewndr' */ - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - - PORT_MODIFY("IN2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME( "Cancel" ) /* see IN4 bit 0 in "Accountancy System" mode */ - - PORT_MODIFY("IN4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME( "Clear Data" ) /* in "Accountancy System" mode */ - /* Similar to 'sidewndr' but different addresses */ - PORT_DIPNAME( 0x04, 0x04, "Lamp 11 always ON" ) /* code at 0x072a - write lamp status at 0x00ff */ - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - /* Similar to 'sidewndr' but different addresses */ - PORT_DIPNAME( 0x08, 0x00, "Sounds" ) /* data in 0x2088 and 0x2089 - out sound at 0x012d */ - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_MODIFY("IN6") - /* I don't know exactly what this bit is supposed to do :( - I only found that when bit is LOW, no data is updated - (check "Accountancy System" mode). */ - PORT_DIPNAME( 0x02, 0x02, "Save Data" ) /* code at 0x0763 (similar to 'sidewndr') and 0x18db */ - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - - PORT_MODIFY("IN7") - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) /* code at 0x04a8 */ - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_BIT( 0xf4, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - -/* I've only mapped the known inputs after comparison with 'spellbnd' and the ones known to do something */ -static INPUT_PORTS_START( starspnr ) - PORT_START("IN0") // 0 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Gamble" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) - /* tested at 0xef77 after IN5 bit 1 and before IN2 bit 2 - after coins are tested - table at 0xefa5 (3 bytes) */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") /* active low or high?? */ - - PORT_START("IN1") // 1 - /* tested at 0xe77c - call from 0x012c */ - /* tested at 0xeffb after IN6 bit 2 - invalid code after 0xf000 */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Collect/Cancel" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) - /* tested at 0xeed7 with IN1 bit 3 - before coins are tested - table at 0xef55 (4 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_coinage_r<0x08>) /* to be confirmed */ - - PORT_START("IN2") // 2 - /* tested at 0xe83c */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xe5ab - after "Collect" and "Gamble" buttons */ - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xef82 after IN5 bit 1 and after IN1 bit 3 - after coins are tested - table at 0xefa8 (3 bytes) */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xeeba with IN3 bit 3 - before coins are tested - table at 0xef55 (4 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_coinage_r<0x02>) /* to be confirmed */ - /* tested at 0x1b0f */ - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN3") // 3 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME( "Hold 1" ) - /* tested at 0xe8ea and 0xecbe */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xeeba with IN2 bit 3 - before coins are tested - table at 0xef55 (4 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_coinage_r<0x01>) /* to be confirmed */ - /* tested at 0x0178 */ - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN4") // 4 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME( "Hold 2" ) - /* tested at 0x064e */ - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xed86 */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xeed7 with IN1 bit 3 - before coins are tested - table at 0xef55 (4 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_coinage_r<0x04>) /* to be confirmed */ - - PORT_START("IN5") // 5 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME( "Hold 3" ) - /* tested at 0xef68 before IN1 bit 3 and before IN2 bit 2 - after coins are tested - table at 0xefa2 (3 bytes) */ - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0xec6f */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0x1d60 with IN6 bit 3 and IN7 bit 3 - table at 0x1d90 (8 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_payout_r<0x01>) /* to be confirmed */ - /* tested at 0xe312 and 0xe377 */ - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN6") // 6 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME( "Hold 4" ) - /* tested at 0xee42, 0xee5e and 0xeff5 before IN1 bit 0 - invalid code after 0xf000 */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0x1d60 with IN5 bit 3 and IN7 bit 3 - table at 0x1d90 (8 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_payout_r<0x02>) /* to be confirmed */ - /* tested at 0xe8dd and 0xec1c */ - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN7") // 7 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) - PORT_DIPNAME( 0x02, 0x00, "Clear Credits on Reset" ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - /* tested at 0xedcb */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - /* tested at 0x1d60 with IN5 bit 3 and IN6 bit 3 - table at 0x1d90 (8 * 3 bytes) */ - PORT_BIT( 0x08, 0x00, IPT_CUSTOM) PORT_READ_LINE_MEMBER(acefruit_state, starspnr_payout_r<0x04>) /* to be confirmed */ - /* tested at 0xec2a */ - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("COINAGE") // fake port to handle settings via multiple input ports - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x02, "1 Coin/10 Credits" ) - PORT_DIPSETTING( 0x03, "1 Coin/25 Credits" ) - PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_B ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x08, "1 Coin/10 Credits" ) - PORT_DIPSETTING( 0x0c, "1 Coin/25 Credits" ) - - PORT_START("PAYOUT") // fake port to handle settings via multiple input ports - PORT_DIPNAME( 0x07, 0x07, "Payout %" ) - PORT_DIPSETTING( 0x00, "30%" ) - PORT_DIPSETTING( 0x01, "40%" ) - PORT_DIPSETTING( 0x02, "50%" ) - PORT_DIPSETTING( 0x03, "55%" ) - PORT_DIPSETTING( 0x04, "60%" ) - PORT_DIPSETTING( 0x05, "70%" ) - PORT_DIPSETTING( 0x06, "75%" ) - PORT_DIPSETTING( 0x07, "80%" ) -INPUT_PORTS_END - -static const gfx_layout charlayout = -{ - 16,8, /* 8*8 characters doubled horizontally */ - 256, /* 256 characters */ - 1, /* 1 bit per pixel */ - { 0 }, - { 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7}, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 -}; - -static const gfx_layout spritelayout = -{ - 32,32, /* 32*32 sprites */ - 16, /* 16 sprites */ - 3, /* 3 bits per pixel */ - /* Offset to the start of each bit */ - { 0, 256*8*8, 256*8*8*2 }, - /* Offset to the start of each byte */ - { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31 - }, - /* Offset to the start of each line */ - { - 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, - 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32, - 16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32, - 24*32, 25*32, 26*32, 27*32, 28*32, 29*32, 30*32, 31*32 - }, - /* Offset to next sprite (also happens to be number of bits per sprite) */ - 32*32 /* every sprite takes 128 bytes */ -}; - -static GFXDECODE_START( gfx_acefruit ) - GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 1 ) - GFXDECODE_ENTRY( "gfx1", 0x1800, charlayout, 8, 4 ) -GFXDECODE_END - -void acefruit_state::acefruit(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 2500000); /* 2.5MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &acefruit_state::acefruit_map); - m_maincpu->set_addrmap(AS_IO, &acefruit_state::acefruit_io); - m_maincpu->set_vblank_int("screen", FUNC(acefruit_state::acefruit_vblank)); - - WATCHDOG_TIMER(config, "watchdog"); - - GFXDECODE(config, m_gfxdecode, m_palette, gfx_acefruit); - - /* video hardware */ - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(60); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); - m_screen->set_size(512, 256); - m_screen->set_visarea_full(); - m_screen->set_screen_update(FUNC(acefruit_state::screen_update_acefruit)); - m_screen->set_palette(m_palette); - - PALETTE(config, m_palette, FUNC(acefruit_state::acefruit_palette), 16); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - /* sound hardware */ -} - -void acefruit_state::init_sidewndr() -{ - uint8_t *ROM = memregion("maincpu")->base(); - /* replace "ret nc" ( 0xd0 ) with "di" */ - ROM[0] = 0xf3; - /* this is either a bad dump or the cpu core should set the carry flag on reset */ -} - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( sidewndr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "2_h09.bin", 0x000000, 0x000800, BAD_DUMP CRC(141f3b0c) SHA1(1704feba950fe7aa939b9ed54c37264d10527d11) ) - ROM_LOAD( "2_h10.bin", 0x000800, 0x000800, CRC(36a2d4af) SHA1(2388e22245497240e5721895d94d2ccd1f579eff) ) - ROM_LOAD( "2_h11.bin", 0x001000, 0x000800, CRC(e2932643) SHA1(e1c0cd5d0cd332519432cbefa8718362a6cd1ccc) ) - ROM_LOAD( "2_h12.bin", 0x001800, 0x000800, CRC(26af0b1f) SHA1(36f0e54982688b9d5a24a6986a847ac69ee0a355) ) - - ROM_REGION( 0x2000, "gfx1", 0 ) /* 8k for graphics */ - ROM_LOAD( "2_h05.bin", 0x000000, 0x000800, CRC(64b64cff) SHA1(c11f2bd2af68ae7f104b711deb7f6509fdbaeb8f) ) - ROM_LOAD( "2_h06.bin", 0x000800, 0x000800, CRC(6b96a586) SHA1(6d5ab8fefe37ca4dbc5057ebf31f12b33dbdf5c0) ) - ROM_LOAD( "2_h07.bin", 0x001000, 0x000800, CRC(3a8e68a2) SHA1(2ffe07360f57f0f11ecf326f00905747d9b66811) ) - ROM_LOAD( "2_h08.bin", 0x001800, 0x000800, CRC(bd19a758) SHA1(3fa812742f34643f66c67cb9bdb1d4d732c4f44d) ) -ROM_END - -ROM_START( spellbnd ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "h9.bin", 0x000000, 0x000800, CRC(9919fcfa) SHA1(04167b12ee9e60ef891893a305a35d3f2eccb0bb) ) - ROM_LOAD( "h10.bin", 0x000800, 0x000800, CRC(90502d00) SHA1(3bdd859d9146df2eb97b4517c446182569a55a46) ) - ROM_LOAD( "h11.bin", 0x001000, 0x000800, CRC(7375166c) SHA1(f05b01941423fd36e0a5d3aa913a594e4e7aa5d4) ) - ROM_LOAD( "h12.bin", 0x001800, 0x000800, CRC(4546c68c) SHA1(92104e2005fc772ea9f70451d9d674f95d3f0ba9) ) - - ROM_REGION( 0x2000, "gfx1", 0 ) /* 8k for graphics */ - ROM_LOAD( "h5.bin", 0x000000, 0x000800, CRC(198da32c) SHA1(bf6c4ddcda0503095d310e08057dd88154952ef4) ) - ROM_LOAD( "h6.bin", 0x000800, 0x000800, CRC(e777130f) SHA1(3421c6f399e5ec749f1908f6b4ebff7761c6c5d9) ) - ROM_LOAD( "h7.bin", 0x001000, 0x000800, CRC(bfed5b8f) SHA1(f95074e8809297eec67da9d7e33ae1dd1c5eabc0) ) - ROM_LOAD( "h8.bin", 0x001800, 0x000800, CRC(05da2b71) SHA1(3a263f605ecc9e4dca9ce0ba815af16e28bf9bc8) ) -ROM_END - -/* -Starspinner -ACE, 1982? - -PCB Layout ----------- - -|---------------------------------------------------------------------------| -| | -| XTAL BAT 2114 | -| | -| 14-1-102 P1 | -| | -| | -| | -| 14-1-102 | -| | -| 5 2114 | -| | -| 6 2114 14-1-102 | -| | -| 7 | -| | -| 8 5501 5501 14-1-102 | -| | -| h9 16-1-101 | -| | -| h10 16-1-101 | -| | -| h11 Z80 16-1-101 | -| | -| h12 P2 | -| | -| DSWA DSWB | -| | -|---------------------------------------------------------------------------| - -Notes: - Z80 - NEC D780C running at ? MHz (DIP40) - 5501 - Toshiba TC5501P 256 x4 SRAM (DIP22) - 2114 - NEC uPD2114LC 1k x8 DRAM (DIP18) - XTAL - ? MHz - BAT - VARTA Ni-Cd 3.6V 100 mAh - DSWA - 8-way DIP switch - DSWB - 8-way DIP switch - P1 - 4x10 pin connector to power supply - P2 - 4x10 pin connector to control panel -*/ - -ROM_START( starspnr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "h9.h9", 0x00e000, 0x0800, CRC(083068aa) SHA1(160a5f3bf33d0a53354f98295cd67022762928b6) ) - ROM_CONTINUE( 0x000000, 0x0800 ) - ROM_LOAD( "h10.h10", 0x00e800, 0x0800, CRC(a0a96e55) SHA1(de4dc0da5a1f358085817690cc6bdc8d94a849f8) ) - ROM_CONTINUE( 0x000800, 0x0800 ) - ROM_LOAD( "h11.h11", 0x00f000, 0x0800, BAD_DUMP CRC(ab045396) SHA1(8b3aea0b0d55f62d5b6fbd39664beb93559d2213) ) /* bad dump : invalid code in both halves ! */ - ROM_CONTINUE( 0x001000, 0x0800 ) - ROM_LOAD( "h12.h12", 0x00f800, 0x0800, CRC(8571f3f5) SHA1(e8b60a604a4a0368b6063b15b328c68f351cb740) ) /* bad dump ? nothing of interest 0xf800-0xffff */ - ROM_CONTINUE( 0x001800, 0x0800 ) - - ROM_REGION( 0x2000, "gfx1", 0 ) /* 8k for graphics */ - ROM_LOAD( "5.h5", 0x000000, 0x000800, CRC(df49876f) SHA1(68077304f096491baeddc1d6b4dc62f90de71903) ) - ROM_LOAD( "6.h6", 0x000800, 0x000800, CRC(d992e2f6) SHA1(7841efec7d81689c82b8da501cce743436e7e8d4) ) - ROM_LOAD( "7.h7", 0x001000, 0x000800, CRC(d5a40e88) SHA1(5cac8d85123720cdbb8b4630b14a27cf0ceef33f) ) - ROM_LOAD( "8.h8", 0x001800, 0x000800, CRC(0dd38c3c) SHA1(4da0cd00c76d3be2164f141ccd8c72dd9578ee61) ) - - ROM_REGION( 0x300, "proms", 0 ) - ROM_LOAD( "16-1-101.b9", 0x0000, 0x0100, NO_DUMP ) - ROM_LOAD( "16-1-101.b10", 0x0100, 0x0100, NO_DUMP ) - ROM_LOAD( "16-1-101.b11", 0x0200, 0x0100, NO_DUMP ) -ROM_END - -/* This has been identified as Silhouette with the help of a flyer */ -ROM_START( acefruit ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "vp-h9.bin", 0x00e000, 0x0800, CRC(f595daf7) SHA1(be5abd34fd06f73cd80f5b15902d158e33705c8f) ) - ROM_CONTINUE( 0x000000, 0x0800 ) - ROM_LOAD( "vp-h10.bin", 0x00e800, 0x0800, CRC(b0539100) SHA1(763f31f72f55c3322b24e127b37130d37daa5216) ) - ROM_CONTINUE( 0x000800, 0x0800 ) - ROM_LOAD( "vp-h11.bin", 0x00f000, 0x0800, CRC(fa176072) SHA1(18203278bb9c505f07390f7b95ecf9ab6d7b7122) ) - ROM_CONTINUE( 0x001000, 0x0800 ) - - ROM_REGION( 0x2000, "gfx1", 0 ) /* 8k for graphics */ - ROM_LOAD( "vp-h5.bin", 0x000000, 0x000800, CRC(dfffe063) SHA1(1b860323fe93b7d010fa35167769555a6bd4a49c) ) - ROM_LOAD( "vp-h6.bin", 0x000800, 0x000800, CRC(355203b8) SHA1(959f3599a24293f392e8b10061c39d3244f34c05) ) - ROM_LOAD( "vp-h7.bin", 0x001000, 0x000800, CRC(7784de8a) SHA1(40851724c9b7ef26964462b5e97ad943df4d56e2) ) - ROM_LOAD( "vp-h8.bin", 0x001800, 0x000800, CRC(d587e541) SHA1(902b6c4673b8b989d034d60d3c47f2499f100ba2) ) - - /* there were no proms in the set */ - ROM_REGION( 0x300, "proms", 0 ) - ROM_LOAD( "16-1-101.b9", 0x0000, 0x0100, NO_DUMP ) - ROM_LOAD( "16-1-101.b10", 0x0100, 0x0100, NO_DUMP ) - ROM_LOAD( "16-1-101.b11", 0x0200, 0x0100, NO_DUMP ) -ROM_END - - -GAMEL( 1981?, sidewndr, 0, acefruit, sidewndr, acefruit_state, init_sidewndr, ROT270, "ACE", "Sidewinder", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND, layout_sidewndr ) -GAMEL( 1981?, spellbnd, 0, acefruit, spellbnd, acefruit_state, empty_init, ROT270, "ACE", "Spellbound", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND, layout_sidewndr ) -GAME( 1982?, starspnr, 0, acefruit, starspnr, acefruit_state, empty_init, ROT270, "ACE", "Starspinner (Dutch/Nederlands)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 1982?, acefruit, 0, acefruit, spellbnd, acefruit_state, empty_init, ROT270, "ACE", "Silhouette", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // inputs and video in bonus game need fixing on this one -// not dumped: Magnum? |