summit: Major driver update

- Hook up color attribute
- Add a handmade palette, so colors should be mostly correct now
- Hook up scroll registers (scrolling is still wrong though)
- Fix memory map (A15 and A14 are not decoded)
- Map most of the rest of the inputs, better labels for inputs
- Add a rudimentary layout showing the lamps and buttons
- Hook up coin counters
- Remove references to MC6845 and AY8910
- Add a link to the patent describing the machine
This commit is contained in:
Dirk Best 2020-03-20 12:51:30 +01:00
parent 8654016b16
commit e069f7ac2c
2 changed files with 463 additions and 263 deletions

View File

@ -1,327 +1,400 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*
// license: BSD-3-Clause
// copyright-holders: David Haywood, Dirk Best
/***************************************************************************
Summit Coin - Push Over (c)1981
Video Fruit Machine
Push-Over
see:
http://www.youtube.com/watch?v=2vtAwkP7JyM
http://www.youtube.com/watch?v=xx7b5Zd1Qvc
© 1981 Summit Coin
HW could be Galaxian-like
Video Fruit Machine
needs inputs, prom decode, sound, artwork (lamps), probably some irq masking and the like
TODO:
- Scrolling is wrong
- Missing graphics at top and right (pound values)
- Palette (currently handmade)
- Sound (discrete?)
- Better artwork
*/
Notes:
- https://www.youtube.com/watch?v=2vtAwkP7JyM
- https://www.youtube.com/watch?v=xx7b5Zd1Qvc
- https://patents.google.com/patent/GB2106293A/en
***************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
#include "video/mc6845.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
#include "speaker.h"
#include "summit.lh"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class summit_state : public driver_device
{
public:
summit_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_attr(*this, "attr"),
m_vram(*this, "vram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
m_palette(*this, "palette"),
m_attr(*this, "attr"),
m_vram(*this, "vram"),
m_lamps(*this, "lamp_%u", 0U)
{ }
void summit(machine_config &config);
protected:
virtual void video_start() override;
virtual void machine_start() override;
private:
required_shared_ptr<uint8_t> m_attr;
required_shared_ptr<uint8_t> m_vram;
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_attr;
required_shared_ptr<uint8_t> m_vram;
output_finder<16> m_lamps;
DECLARE_WRITE8_MEMBER(out_w);
void summit_palette(palette_device &palette) const;
uint32_t screen_update_summit(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void mainmap(address_map &map);
void sound_w(uint8_t data);
void out2_w(uint8_t data);
void out3_w(uint8_t data);
void lamps1_w(uint8_t data);
void lamps2_w(uint8_t data);
void vram_w(offs_t offset, uint8_t data);
void summit_palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(tile_info);
uint32_t screen_update_summit(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
tilemap_t *m_tilemap;
};
void summit_state::video_start()
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
void summit_state::mainmap(address_map &map)
{
map.global_mask(0x3fff);
map(0x0000, 0x17ff).rom();
map(0x2000, 0x23ff).ram().share("attr");
map(0x2800, 0x2bff).ram().w(FUNC(summit_state::vram_w)).share("vram");
map(0x3000, 0x31ff).ram();
map(0x3800, 0x3800).portr("IN0");
map(0x3800, 0x3800).w(FUNC(summit_state::sound_w));
map(0x3880, 0x3880).w(FUNC(summit_state::out2_w));
map(0x3900, 0x3900).portr("IN1");
map(0x3900, 0x3900).w(FUNC(summit_state::out3_w));
map(0x3980, 0x3980).w(FUNC(summit_state::lamps1_w));
map(0x3a00, 0x3a00).portr("IN2");
map(0x3a00, 0x3a00).w(FUNC(summit_state::lamps2_w));
map(0x3b00, 0x3b00).portr("IN3");
}
//**************************************************************************
// INPUT PORT DEFINITIONS
//**************************************************************************
static INPUT_PORTS_START( summit )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_CANCEL )
PORT_DIPNAME( 0x02, 0x02, "IN0-02" ) // tilt?
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPNAME( 0x04, 0x04, "IN0-04" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
PORT_DIPNAME( 0x40, 0x40, "Percentage 02" ) // payout percentage
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 72
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // 70
PORT_DIPNAME( 0x80, 0x80, "IN0-80" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Right / Gamble")
PORT_DIPNAME( 0x02, 0x02, "IN1-02" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Left / Collect")
PORT_DIPNAME( 0x08, 0x08, "IN1-08" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Down")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Up")
PORT_DIPNAME( 0x40, 0x40, "Percentage 04" ) // payout percentage
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 74
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // 70
PORT_DIPNAME( 0x80, 0x80, "IN1-80" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_START("IN2")
PORT_DIPNAME( 0x01, 0x01, "Token Refill" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPNAME( 0x02, 0x02, "IN2-02" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_TOGGLE
PORT_DIPNAME( 0x08, 0x08, "IN2-08" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPNAME( 0x10, 0x10, "IN2-10" ) // output to 0x3a00 bit 3
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPNAME( 0x20, 0x20, "IN2-20" ) // output to 0x3880 bit 3, 0x3a00 bit 1
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPNAME( 0x40, 0x40, "Percentage 08" ) // payout percentage
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 78
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // 70
PORT_DIPNAME( 0x80, 0x80, "IN2-80" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_BET ) PORT_NAME("Start")
PORT_DIPNAME( 0x02, 0x02, "IN3-02" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("50p")
PORT_DIPNAME( 0x08, 0x08, "IN3-04" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Token")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Cash")
PORT_DIPNAME( 0x40, 0x40, "Percentage 16" ) // payout percentage
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 86
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // 70
PORT_DIPNAME( 0x80, 0x80, "IN3-80" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
INPUT_PORTS_END
//**************************************************************************
// VIDEO EMULATION
//**************************************************************************
void summit_state::vram_w(offs_t offset, uint8_t data)
{
if (offset < 0x20)
m_tilemap->set_scrollx(offset, data);
m_vram[offset] = data;
}
uint32_t summit_state::screen_update_summit(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx = m_gfxdecode->gfx(0);
int count = 0x0000;
m_tilemap->mark_all_dirty();
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
int y,x;
for (y=0;y<32;y++)
{
for (x=0;x<32;x++)
{
int tile = (m_vram[count] | ((m_attr[count]&1)<<8) );
gfx->opaque(bitmap,cliprect,tile,0,0,0,x*8,y*8);
count++;
}
}
return 0;
}
WRITE8_MEMBER(summit_state::out_w)
TILE_GET_INFO_MEMBER(summit_state::tile_info)
{
// attribute bit 0 used for both tile index and color?
uint8_t attr = m_attr[(tile_index)];
uint16_t tile = (BIT(attr, 0) << 8) | m_vram[tile_index];
tileinfo.set(0, tile, attr & 0x0f, 0);
}
void summit_state::mainmap(address_map &map)
{
map(0x0000, 0x17ff).rom();
map(0x2000, 0x23ff).ram().share("attr");
map(0x2800, 0x2bff).ram().share("vram");
map(0x3800, 0x3800).portr("IN0");
// map(0x3880, 0x3880).w(FUNC(summit_state::out_w));
map(0x3900, 0x3900).portr("IN1").w(FUNC(summit_state::out_w)); // lamps
// map(0x3980, 0x3980).w(FUNC(summit_state::out_w));
map(0x3a00, 0x3a00).portr("IN2"); //.w(FUNC(summit_state::out_w));
map(0x3b00, 0x3b00).portr("IN3");
map(0x7000, 0x71ff).ram();
}
static INPUT_PORTS_START( summit )
PORT_START("IN0")
PORT_DIPNAME( 0x01, 0x01, "IN0" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) // Hold1
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) // Hold2
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON5 ) // Hold3
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) // Gamble / Left
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Collect / Right
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN2")
PORT_DIPNAME( 0x01, 0x01, "IN2" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "Game/Test" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN4")
PORT_DIPNAME( 0x01, 0x01, "IN4" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN5")
PORT_DIPNAME( 0x01, 0x01, "IN5" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN6")
PORT_DIPNAME( 0x01, 0x01, "IN6" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN7")
PORT_DIPNAME( 0x01, 0x01, "IN7" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END
static const gfx_layout tiles8x8_layout =
{
8,8,
8, 8,
RGN_FRAC(1,2),
2,
{ 0, RGN_FRAC(1,2) },
{ 7,6,5,4,3,2,1,0 },
{ 7, 6, 5, 4, 3, 2, 1, 0 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8
};
static GFXDECODE_START( gfx_summit )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 1 )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 )
GFXDECODE_END
static constexpr rgb_t summit_pens[64] =
{
{ 0x00, 0x00, 0x00 }, // 00: black
{ 0x00, 0x7f, 0x00 }, // 01: dark green
{ 0xff, 0xff, 0xff }, // 02: white
{ 0xff, 0x00, 0x00 }, // 03: red
{ 0xff, 0x00, 0xff }, // 04: ?
{ 0xff, 0x00, 0xff }, // 05: ?
{ 0xff, 0x00, 0xff }, // 06: ?
{ 0xff, 0x00, 0xff }, // 07: ?
{ 0x00, 0x00, 0x00 }, // 08: black
{ 0x7f, 0x00, 0x00 }, // 09: brown
{ 0xff, 0xff, 0xff }, // 0a: white
{ 0xff, 0x00, 0x00 }, // 0b: red
{ 0x00, 0x00, 0x00 }, // 0c: black
{ 0xff, 0x00, 0xff }, // 0d: ?
{ 0xff, 0x00, 0x00 }, // 0e: red
{ 0xff, 0x00, 0xff }, // 0f: ?
{ 0x00, 0x00, 0x00 }, // 10: black
{ 0xff, 0x7f, 0x00 }, // 11: orange
{ 0xff, 0xff, 0xff }, // 12: white
{ 0xff, 0xff, 0x7f }, // 13: light orange
{ 0xff, 0x00, 0xff }, // 14: ?
{ 0xff, 0x00, 0xff }, // 15: ?
{ 0xff, 0x00, 0xff }, // 16: ?
{ 0xff, 0x00, 0xff }, // 17: ?
{ 0x00, 0x00, 0x00 }, // 18: black
{ 0xff, 0x00, 0x00 }, // 19: red
{ 0xff, 0xff, 0xff }, // 1a: white
{ 0x00, 0x00, 0xff }, // 1b: blue
{ 0x00, 0x00, 0x00 }, // 1c: black
{ 0xff, 0x00, 0xff }, // 1d: ?
{ 0x00, 0x00, 0xff }, // 1e: blue
{ 0xff, 0x00, 0xff }, // 1f: ?
{ 0x00, 0x00, 0x00 }, // 20: black
{ 0xff, 0x00, 0x00 }, // 21: red
{ 0xff, 0xff, 0x00 }, // 22: yellow
{ 0x00, 0x00, 0xff }, // 23: blue
{ 0xff, 0x00, 0xff }, // 24: ?
{ 0xff, 0x00, 0xff }, // 25: ?
{ 0xff, 0x00, 0xff }, // 26: ?
{ 0xff, 0x00, 0xff }, // 27: ?
{ 0x00, 0x00, 0x00 }, // 28: black
{ 0x00, 0x00, 0xff }, // 29: blue
{ 0xff, 0xff, 0xff }, // 2a: white
{ 0xff, 0xff, 0x00 }, // 2b: yellow
{ 0x00, 0x00, 0x00 }, // 2c: black
{ 0x00, 0x00, 0x00 }, // 2d: black
{ 0xff, 0xff, 0xff }, // 2e: white
{ 0xff, 0xff, 0xff }, // 2f: white
{ 0x00, 0x00, 0x00 }, // 30: black
{ 0x00, 0x00, 0xff }, // 31: blue
{ 0xff, 0xff, 0xff }, // 32: white
{ 0x7f, 0x00, 0x00 }, // 33: brown
{ 0xff, 0x00, 0xff }, // 34: ?
{ 0xff, 0x00, 0xff }, // 35: ?
{ 0xff, 0x00, 0xff }, // 36: ?
{ 0xff, 0x00, 0xff }, // 37: ?
{ 0x00, 0x00, 0x00 }, // 38: black
{ 0xff, 0x00, 0x00 }, // 39: red
{ 0x7f, 0x00, 0x00 }, // 3a: brown
{ 0x00, 0x7f, 0x00 }, // 3b: dark green
{ 0x00, 0x00, 0x00 }, // 3c: black
{ 0xff, 0x00, 0xff }, // 3d: ?
{ 0x00, 0x7f, 0x00 }, // 3e: dark green
{ 0xff, 0x00, 0xff } // 3f: ?
};
void summit_state::summit_palette(palette_device &palette) const
{
palette.set_pen_colors(0, summit_pens);
}
//**************************************************************************
// AUDIO EMULATION
//**************************************************************************
void summit_state::sound_w(uint8_t data)
{
// likely connected to some kind of discrete audio hardware
// 0x00 mute?
// 0x14 reel bump
// 0x42 go sound
// 0x48 gamble/collect win
// 0x80 mute?
}
//**************************************************************************
// MACHINE EMULATION
//**************************************************************************
void summit_state::out2_w(uint8_t data)
{
if (0)
logerror("out2: %02x %d %d %d %d %d %d %d %d\n", data, BIT(data, 7), BIT(data, 6), BIT(data, 5), BIT(data, 4), BIT(data, 3), BIT(data, 2), BIT(data, 1), BIT(data, 0));
}
void summit_state::out3_w(uint8_t data)
{
// 765----- not used?
// ---4---- coin lockout?
// ----3--- cash in
// -----2-- 10p out
// ------1- toggles rapidly
// -------0 unknown
// machine().bookkeeping().coin_lockout_w(0, BIT(data, 4));
machine().bookkeeping().coin_counter_w(0, BIT(data, 3));
machine().bookkeeping().coin_counter_w(1, BIT(data, 2));
}
void summit_state::lamps1_w(uint8_t data)
{
// 76------ not used?
// --5----- collect/win lamp
// ---4---- collect/win lamp
// ----3--- cancel lamp
// -----2-- hold 3 lamp
// ------1- hold 2 lamp
// -------0 hold 1 lamp
for (int i = 0; i < 8; i++)
m_lamps[i] = BIT(data, i);
}
void summit_state::lamps2_w(uint8_t data)
{
// 765----- not used?
// ---4---- gamble lamp
// ----3--- active when IN2-10 active
// -----2-- go lamp
// ------1- active when IN2-20 active
// -------0 start lamp
for (int i = 0; i < 8; i++)
m_lamps[8 + i] = BIT(data, i);
}
void summit_state::machine_start()
{
m_lamps.resolve();
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(summit_state::tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_tilemap->set_scroll_rows(32);
}
//**************************************************************************
// MACHINE DEFINTIONS
//**************************************************************************
void summit_state::summit(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000);
m_maincpu->set_addrmap(AS_PROGRAM, &summit_state::mainmap);
m_maincpu->set_vblank_int("screen", FUNC(summit_state::irq0_line_hold));
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -330,12 +403,22 @@ void summit_state::summit(machine_config &config)
screen.set_screen_update(FUNC(summit_state::screen_update_summit));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_summit);
PALETTE(config, m_palette, FUNC(summit_state::summit_palette), 256);
PALETTE(config, m_palette, FUNC(summit_state::summit_palette), 64);
// sound hardware
SPEAKER(config, "mono").front_center();
config.set_default_layout(layout_summit);
}
//**************************************************************************
// ROM DEFINITIONS
//**************************************************************************
ROM_START( pushover )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x1800, "maincpu", 0 )
ROM_LOAD( "po40.bin", 0x0000, 0x0800, CRC(eb612cf7) SHA1(93d6b4d5a3c275cc27bece6f1fb1e8be7c6997bf) )
ROM_LOAD( "po41.bin", 0x0800, 0x0800, CRC(268fd1b2) SHA1(a2421807cb38901ec7c24a8c6eecb34677235c21) )
ROM_LOAD( "po42.bin", 0x1000, 0x0800, CRC(c0bb3f19) SHA1(8e773cc9503755a24428f9b0bbad1721a38e2c54) )
@ -347,11 +430,16 @@ ROM_START( pushover )
ROM_LOAD( "pu8.bin", 0x1800, 0x0800, CRC(e7da3be6) SHA1(b02aceef84860cdc9190b73ffe3fa8173e210682) )
ROM_REGION( 0x1000, "proms", 0 )
ROM_LOAD( "prom1.bin", 0x0000, 0x0400, CRC(2d947698) SHA1(85405a005fa6108e8d5ef5a7a12745ba05109661) )
ROM_LOAD( "prom2.bin", 0x0400, 0x0400, CRC(87e11191) SHA1(59da09621f1a3c827bb0c158295ac1744a960aa4) )
ROM_LOAD( "prom3.bin", 0x0800, 0x0400, CRC(fe0fb97a) SHA1(05c41988bd1fe18725023a1a67c1b3cae01b2028) )
ROM_LOAD( "prom4.bin", 0x0c00, 0x0400, CRC(ce26b2c4) SHA1(a44b7a05c0c72592fe6083244c785e9ed1149909) )
ROM_LOAD( "prom1.bin", 0x000, 0x400, CRC(2d947698) SHA1(85405a005fa6108e8d5ef5a7a12745ba05109661) )
ROM_LOAD( "prom2.bin", 0x400, 0x400, CRC(87e11191) SHA1(59da09621f1a3c827bb0c158295ac1744a960aa4) )
ROM_LOAD( "prom3.bin", 0x800, 0x400, CRC(fe0fb97a) SHA1(05c41988bd1fe18725023a1a67c1b3cae01b2028) )
ROM_LOAD( "prom4.bin", 0xc00, 0x400, CRC(ce26b2c4) SHA1(a44b7a05c0c72592fe6083244c785e9ed1149909) )
ROM_END
GAME( 1981, pushover, 0, summit, summit, summit_state, empty_init, ROT270, "Summit Coin", "Push Over (Summit Coin)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_WRONG_COLORS )
//**************************************************************************
// SYSTEM DRIVERS
//**************************************************************************
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROTATION COMPANY FULLNAME FLAGS
GAME( 1981, pushover, 0, summit, summit, summit_state, empty_init, ROT270, "Summit Coin", "Push-Over (Summit Coin)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_COLORS )

112
src/mame/layout/summit.lay Normal file
View File

@ -0,0 +1,112 @@
<?xml version="1.0"?>
<!--
license: CC0
copyright-holders: Dirk Best
Simple layout for Push-Over (Summit Coin)
-->
<mamelayout version="2">
<element name="background"></element>
<element name="gamble" defstate="0">
<rect state="0"><color red="0.2" green="0.2" blue="0.0" /></rect>
<rect state="1"><color red="0.8" green="0.8" blue="0.0" /></rect>
<text string="GAMBLE"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="cancel" defstate="0">
<rect state="0"><color red="0.2" green="0.0" blue="0.0" /></rect>
<rect state="1"><color red="0.8" green="0.0" blue="0.0" /></rect>
<text string="CANCEL"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="hold" defstate="0">
<rect state="0"><color red="0.2" green="0.2" blue="0.0" /></rect>
<rect state="1"><color red="0.8" green="0.8" blue="0.0" /></rect>
<text string="HOLD"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="start" defstate="0">
<rect state="0"><color red="0.0" green="0.2" blue="0.0" /></rect>
<rect state="1"><color red="0.0" green="0.8" blue="0.0" /></rect>
<text string="START"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="go" defstate="0">
<rect state="0"><color red="0.2" green="0.2" blue="0.0" /></rect>
<rect state="1"><color red="0.8" green="0.8" blue="0.0" /></rect>
<text string="GO"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="red" defstate="0">
<rect state="0"><color red="0.2" green="0.0" blue="0.0" /></rect>
<rect state="1"><color red="0.8" green="0.0" blue="0.0" /></rect>
</element>
<element name="green" defstate="0">
<rect state="0"><color red="0.0" green="0.2" blue="0.0" /></rect>
<rect state="1"><color red="0.0" green="0.8" blue="0.0" /></rect>
</element>
<view name="Buttons">
<backdrop element="background">
<bounds x="0" y="0" width="600" height="800" />
</backdrop>
<screen index="0">
<bounds left="60" top="80" right="480" bottom="640" />
</screen>
<cpanel name="lamp_12" element="gamble">
<bounds x="10" y="20" width="70" height="35" />
</cpanel>
<cpanel name="lamp_3" element="cancel" inputtag="IN0" inputmask="0x01">
<bounds x="10" y="730" width="70" height="35" />
</cpanel>
<cpanel name="lamp_0" element="hold" inputtag="IN0" inputmask="0x08">
<bounds x="90" y="730" width="70" height="35" />
</cpanel>
<cpanel name="lamp_1" element="hold" inputtag="IN0" inputmask="0x10">
<bounds x="170" y="730" width="70" height="35" />
</cpanel>
<cpanel name="lamp_2" element="hold" inputtag="IN0" inputmask="0x20">
<bounds x="250" y="730" width="70" height="35" />
</cpanel>
<cpanel name="lamp_8" element="start" inputtag="IN3" inputmask="0x01">
<bounds x="400" y="730" width="70" height="35" />
</cpanel>
<cpanel name="lamp_10" element="go">
<bounds x="550" y="600" width="40" height="35" />
</cpanel>
<cpanel name="lamp_4" element="red">
<bounds x="200" y="20" width="40" height="35" />
</cpanel>
<cpanel name="lamp_5" element="green">
<bounds x="250" y="20" width="40" height="35" />
</cpanel>
<!-- Might not be lamps -->
<cpanel name="lamp_6" element="green">
<bounds x="550" y="200" width="20" height="20" />
</cpanel>
<cpanel name="lamp_7" element="green">
<bounds x="550" y="230" width="20" height="20" />
</cpanel>
<cpanel name="lamp_9" element="green">
<bounds x="550" y="260" width="20" height="20" />
</cpanel>
<cpanel name="lamp_11" element="green">
<bounds x="550" y="290" width="20" height="20" />
</cpanel>
<cpanel name="lamp_13" element="green">
<bounds x="550" y="320" width="20" height="20" />
</cpanel>
<cpanel name="lamp_14" element="green">
<bounds x="550" y="350" width="20" height="20" />
</cpanel>
<cpanel name="lamp_15" element="green">
<bounds x="550" y="380" width="20" height="20" />
</cpanel>
</view>
</mamelayout>