New systems marked not working

------------------------------
Happy Planet [Guru]

New working clones
------------------
Mahjong Electron Base (parts 2 & 3, Japan set 3) [little0]

- excellent/es8906.cpp: fleshed out a bit
This commit is contained in:
Ivan Vangelista 2025-04-04 17:15:54 +02:00
parent b9a91cada5
commit 924601d45f
8 changed files with 521 additions and 78 deletions

View File

@ -5963,6 +5963,19 @@ ROM_START( mjelct3a )
ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END
ROM_START( mjelct3b ) // code almost identical to mjelct3
ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
ROM_LOAD( "se-3010", 0x00000, 0x20000, CRC(bcdb5827) SHA1(f27987a0ef2146ba18f0243cb4409f48da772140) )
ROM_RELOAD( 0x10000, 0x08000 )
ROM_CONTINUE( 0x28000, 0x08000 )
ROM_CONTINUE( 0x20000, 0x08000 )
ROM_CONTINUE( 0x18000, 0x08000 )
ROM_REGION( 0x200000, "blitter", 0 ) // blitter data
ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(f5b354d1) SHA1(d3f35d090de9af3f50aae9ff11de731950256212) ) // different GFX ROM
ROM_END
/***************************************************************************
Mahjong Electron Base (bootleg)
@ -7252,6 +7265,7 @@ GAME( 1993, mjelctrn, 0, mjelctrn, mjelctrn, dynax_adpcm_state, init_
GAME( 1989, mjembase, mjelctrn, mjembase, mjembase, dynax_adpcm_state, init_mjelct3, ROT180, "Dynax", "Mahjong Electromagnetic Base (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3, mjelctrn, mjelctrn, mjelct3, dynax_adpcm_state, init_mjelct3, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 3, Japan set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3a, mjelctrn, mjelctrn, mjelct3, dynax_adpcm_state, init_mjelct3a, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 3, Japan set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3b, mjelctrn, mjelctrn, mjelct3, dynax_adpcm_state, init_mjelct3, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 3, Japan set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelctrb, mjelctrn, mjelctrn, mjelct3, dynax_adpcm_state, init_mjelct3, ROT180, "bootleg", "Mahjong Electron Base (parts 2 & 4, Japan bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelct3bl, mjelctrn, mjelctrn, mjelct3, dynax_adpcm_state, init_mjelct3, ROT180, "bootleg", "Mahjong Electron Base (parts 2 & 3, Japan bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1990, majxtal7, 7jigen, neruton, majxtal7, dynax_adpcm_state, init_mjelct3, ROT180, "Dynax", "Mahjong X-Tal 7 - Crystal Mahjong / Mahjong Diamond 7 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // reuses a subset of 7jigen assets

View File

@ -501,20 +501,9 @@ static INPUT_PORTS_START( dblcrown )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static const gfx_layout char_16x16_layout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0,1,2,3 },
{ 4,0, 12,8, 20,16, 28,24, 36,32, 44,40, 52,48, 60,56 },
{ STEP16(0,8*8) },
8*8*16
};
static GFXDECODE_START( gfx_dblcrown )
GFXDECODE_ENTRY( "gfx1", 0, char_16x16_layout, 0, 0x10 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x4_packed_lsb, 0, 0x10 )
GFXDECODE_RAM( nullptr, 0, gfx_8x8x4_packed_lsb, 0, 0x10 )
GFXDECODE_END

View File

@ -15,7 +15,14 @@ Excellent ES-8712 custom
reset button (SW1)
NE555P (near SW1)
TODO: everything
TODO:
* colors
* complete inputs
* outputs
* use CRTC device for drawing routines
* sound? PCB pics show an unmarked 22 (?) pin chip with a 104K yellow resonator
* first half of the program ROM?
* why doesn't the game draw the title? pics show it should
*/
#include "emu.h"
@ -39,10 +46,12 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_gfxdecode(*this, "gfxdecode")
m_gfxdecode(*this, "gfxdecode"),
m_tileram(*this, "tileram%u", 0U),
m_attrram(*this, "attrram%u", 0U)
{ }
void es8906(machine_config &config);
void es8906(machine_config &config) ATTR_COLD;
protected:
virtual void video_start() override ATTR_COLD;
@ -52,6 +61,14 @@ private:
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr_array<uint8_t, 2> m_tileram;
required_shared_ptr_array<uint8_t, 2> m_attrram;
tilemap_t *m_tilemap[2]{};
template <uint8_t Which> void tileram_w(offs_t offset, uint8_t data);
template <uint8_t Which> void attrram_w(offs_t offset, uint8_t data);
template <uint8_t Which> TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void program_map(address_map &map) ATTR_COLD;
@ -60,10 +77,40 @@ private:
void es8906_state::video_start()
{
m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(es8906_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(es8906_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tilemap[1]->set_transparent_pen(0);
}
template <uint8_t Which>
TILE_GET_INFO_MEMBER(es8906_state::get_tile_info)
{
int const tile = m_tileram[Which][tile_index] | ((m_attrram[Which][tile_index] & 0x0f) << 8);
int const color = (m_attrram[Which][tile_index] & 0xf0) >> 4;
tileinfo.set(Which, tile, color, 0);
}
template <uint8_t Which>
void es8906_state::tileram_w(offs_t offset, uint8_t data)
{
m_tileram[Which][offset] = data;
m_tilemap[Which]->mark_tile_dirty(offset);
}
template <uint8_t Which>
void es8906_state::attrram_w(offs_t offset, uint8_t data)
{
m_attrram[Which][offset] = data;
m_tilemap[Which]->mark_tile_dirty(offset);
}
uint32_t es8906_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
@ -75,23 +122,45 @@ void es8906_state::program_map(address_map &map)
map(0x0000, 0x07ff).ram();
map(0x0800, 0x0800).w("crtc", FUNC(hd6845s_device::address_w));
map(0x0801, 0x0801).rw("crtc", FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0x1000, 0x2fff).ram();
map(0x1000, 0x17ff).ram().w(FUNC(es8906_state::tileram_w<0>)).share(m_tileram[0]);
map(0x1800, 0x1fff).ram().w(FUNC(es8906_state::attrram_w<0>)).share(m_attrram[0]);
map(0x2000, 0x27ff).ram().w(FUNC(es8906_state::tileram_w<0>)).share(m_tileram[1]); // only 0-ed at start up?
map(0x2800, 0x2fff).ram().w(FUNC(es8906_state::attrram_w<0>)).share(m_attrram[1]); // only 0-ed at start up?
map(0x3000, 0x3000).portr("IN1");
map(0x3010, 0x3010).portr("IN2");
map(0x3020, 0x3020).portr("IN3");
map(0x3030, 0x3030).portr("IN4");
map(0x3040, 0x3040).portr("IN5");
map(0x3800, 0x3800).portr("SW2");
map(0x3801, 0x3801).portr("SW3");
map(0x3802, 0x3802).portr("SW4");
map(0x3803, 0x3803).portr("SW5");
map(0x8000, 0xffff).rom();
}
static INPUT_PORTS_START( dream9 )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
static INPUT_PORTS_START( dream9 ) // TODO: inputs are very incomplete
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_LOW )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Show Rules") // press Start to return to game
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Bet 2") // ??
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -101,45 +170,133 @@ static INPUT_PORTS_START( dream9 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN4")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("IN5")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
PORT_SERVICE_NO_TOGGLE(0x40, IP_ACTIVE_LOW)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
// DIP definitions from test mode, not verified if the actually work in game (coinage seems not)
// defaults unknown, set to all off for now
PORT_START("SW2")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "Hopper Switch" ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x02, "Active Low" )
PORT_DIPSETTING( 0x00, "Active High" )
PORT_DIPNAME( 0x0c, 0x0c, "Credit Limit" ) PORT_DIPLOCATION("SW2:6,5")
PORT_DIPSETTING( 0x0c, "1000" )
PORT_DIPSETTING( 0x08, "5000" )
PORT_DIPSETTING( 0x04, "10000" )
PORT_DIPSETTING( 0x00, "50000" )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") // effect not shown in test mode
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") // effect not shown in test mode
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") // effect not shown in test mode
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") // effect not shown in test mode
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("SW3")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW3:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW3:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW3:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW3:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW3:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW3:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW3:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW3:8")
PORT_DIPNAME( 0x01, 0x01, "W-Up Type" ) PORT_DIPLOCATION("SW3:8")
PORT_DIPSETTING( 0x01, "1" )
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPNAME( 0x06, 0x06, "W-Up" ) PORT_DIPLOCATION("SW3:7,6")
PORT_DIPSETTING( 0x06, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x04, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) )
PORT_DIPNAME( 0x18, 0x18, "Maximum Bet" ) PORT_DIPLOCATION("SW3:5,4")
PORT_DIPSETTING( 0x18, "8" )
PORT_DIPSETTING( 0x10, "16" )
PORT_DIPSETTING( 0x08, "32" )
PORT_DIPSETTING( 0x00, "64" )
PORT_DIPNAME( 0xe0, 0xe0, "Rate Of Win" ) PORT_DIPLOCATION("SW3:3,2,1")
PORT_DIPSETTING( 0x00, "60%" )
PORT_DIPSETTING( 0x20, "65%" )
PORT_DIPSETTING( 0x40, "70%" )
PORT_DIPSETTING( 0x60, "75%" )
PORT_DIPSETTING( 0x80, "80%" )
PORT_DIPSETTING( 0xa0, "85%" )
PORT_DIPSETTING( 0xc0, "90%" )
PORT_DIPSETTING( 0xe0, "95%" )
PORT_START("SW4")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW4:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW4:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW4:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW4:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW4:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW4:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW4:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW4:8")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW4:8") // effect not shown in test mode
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW4:7,6,5")
PORT_DIPSETTING( 0x00, "10 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, DEF_STR( 9C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 6C_1C ) )
PORT_DIPSETTING( 0x06, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x0e, "1 Coin/50 Credits" )
PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW4:4,3,2,1")
PORT_DIPSETTING( 0x00, "10 Coins/1 Credit" )
PORT_DIPSETTING( 0x10, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 5C_2C ) )
PORT_DIPSETTING( 0x30, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x50, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x60, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x70, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x90, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0xa0, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0xb0, "1 Coin/10 Credits" )
PORT_DIPSETTING( 0xc0, "1 Coin/20 Credits" )
PORT_DIPSETTING( 0xd0, "1 Coin/25 Credits" )
PORT_DIPSETTING( 0xe0, "1 Coin/50 Credits" )
PORT_DIPSETTING( 0xf0, "1 Coin/100 Credits" )
PORT_START("SW5")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW5:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW5:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW5:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW5:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW5:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW5:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW5:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW5:8")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW5:8") // effect not shown in test mode
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW5:7") // effect not shown in test mode
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x1c, 0x1c, "Key In" ) PORT_DIPLOCATION("SW5:6,5,4")
PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" )
PORT_DIPSETTING( 0x04, "1 Coin/20 Credits" )
PORT_DIPSETTING( 0x08, "1 Coin/40 Credits" )
PORT_DIPSETTING( 0x0c, "1 Coin/50 Credits" )
PORT_DIPSETTING( 0x10, "1 Coin/100 Credits" )
PORT_DIPSETTING( 0x14, "1 Coin/200 Credits" )
PORT_DIPSETTING( 0x18, "1 Coin/250 Credits" )
PORT_DIPSETTING( 0x1c, "1 Coin/500 Credits" )
PORT_DIPNAME( 0xe0, 0xe0, "Coin C" ) PORT_DIPLOCATION("SW5:3,2,1")
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x60, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x80, "1 Coin/10 Credits" )
PORT_DIPSETTING( 0xa0, "1 Coin/20 Credits" )
PORT_DIPSETTING( 0xc0, "1 Coin/25 Credits" )
PORT_DIPSETTING( 0xe0, "1 Coin/50 Credits" )
INPUT_PORTS_END

View File

@ -141,19 +141,8 @@ static INPUT_PORTS_START( specd9 )
INPUT_PORTS_END
static const gfx_layout char_16x16_layout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0,1,2,3 },
{ 4,0, 12,8, 20,16, 28,24, 36,32, 44,40, 52,48, 60,56 },
{ STEP16(0,8*8) },
8*8*16
};
static GFXDECODE_START( gfx_es9501 )
GFXDECODE_ENTRY( "gfx", 0, char_16x16_layout, 0, 0x10 )
GFXDECODE_ENTRY( "gfx", 0, gfx_16x16x4_packed_lsb, 0, 0x10 )
GFXDECODE_END

View File

@ -184,7 +184,7 @@ public:
void init_jinhulu2120gi() ATTR_COLD;
void init_jinhulu2101is() ATTR_COLD;
void init_jinhulu2100gi() ATTR_COLD;
void init_sleyuan() ATTR_COLD;
void init_sleyuan2() ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
@ -2251,7 +2251,7 @@ ROM_START( jinhuang )
ROM_LOAD( "rom.u12", 0x00000, 0x20000, CRC(27caf888) SHA1(be57ce7f6b32a51656f8f16b894f58278544201a) ) // 1ST AND 2ND HALF IDENTICAL
ROM_END
ROM_START( sleyuan )
ROM_START( sleyuan2 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "rom.u40", 0x00000, 0x10000, CRC(869a2ff7) SHA1(beb110eecf6c8c2f5d5272e0669391f73766d463) )
@ -2383,7 +2383,7 @@ void jinhulu2_state::init_dafuwng3()
if ((a & 0x0060) == 0x0060) rom[a] ^= 0x40;
}
void jinhulu2_state::init_sleyuan()
void jinhulu2_state::init_sleyuan2()
{
init_jinhulu2();
@ -2523,10 +2523,10 @@ GAME( 1995, jinhulu2120gi, jinhulu2, jinhulu2, jinhulu2, jinhulu2_state, init_j
GAME( 1996, jinhulu2101is, jinhulu2, jinhulu2, jinhulu2, jinhulu2_state, init_jinhulu2101is, ROT0, "IGS", "Jin Hu Lu II (v101IS)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // tries to link to something?
GAME( 1995, jinhulu2100gi, jinhulu2, jinhulu2, jinhulu2, jinhulu2_state, init_jinhulu2100gi, ROT0, "IGS", "Jin Hu Lu II (v100GI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper, ROM patch
GAME( 1995, huahuas2, 0, jinhulu2, huahuas2, jinhulu2_state, init_huahuas2, ROT0, "IGS", "Huahua Shijie II (v100FI, set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 1995, huahuas2a, huahuas2, jinhulu2, jinhulu2, jinhulu2_state, init_jinhulu2120gi, ROT0, "IGS", "Huahua Shijie II (v100FI, set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // no GFX ROM dump, hopper
GAME( 1995, huahuas2a, huahuas2, jinhulu2, huahuas2, jinhulu2_state, init_jinhulu2120gi, ROT0, "IGS", "Huahua Shijie II (v100FI, set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // no GFX ROM dump, hopper
GAME( 1995, huluw2, 0, jinhulu2, huluw2, jinhulu2_state, init_huluw2, ROT0, "IGS", "Hu Lu Wang II (v100KI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 1995, hsheng2, 0, jinhulu2, jinhulu2, jinhulu2_state, init_hsheng2, ROT0, "IGS", "Hua Shen II (v120DI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 1995, dafuwng3, 0, jinhulu2, jinhulu2, jinhulu2_state, init_dafuwng3, ROT0, "IGS", "Da Fu Weng III (V130LI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 1996, zuanshiw, 0, jinhulu2, zuanshiw, jinhulu2_state, init_jinhulu2120gi, ROT0, "IGS", "Zuanshi Wutai (V110II)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 2002, jinhuang, 0, jinhuang, jinhuang, jinhulu2_state, init_jinhuang, ROT0, "IGS", "Jin Huang Guan", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // different memory map
GAME( 1998, sleyuan, 0, jinhulu2, jinhulu2, jinhulu2_state, init_sleyuan, ROT0, "IGS", "Shuiguo Leyuan (V150UI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper
GAME( 1998, sleyuan2, 0, jinhulu2, jinhulu2, jinhulu2_state, init_sleyuan2, ROT0, "IGS", "Shuiguo Leyuan II (V150UI)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // hopper

View File

@ -17696,6 +17696,7 @@ mjdialq2
mjdialq2a
mjelct3
mjelct3a
mjelct3b
mjelct3bl
mjelctrb
mjelctrn
@ -20887,7 +20888,7 @@ jinhulu2
jinhulu2100gi
jinhulu2101is
jinhulu2120gi
sleyuan
sleyuan2
spk100
spk102u
spk102ua
@ -33946,6 +33947,9 @@ tactcian2
@source:namco/rbowlorama.cpp
rbowlorama
@source:namco/sg_vga.cpp
hplanet
@source:namco/shootaway2.cpp
shootaw2

290
src/mame/namco/sg_vga.cpp Normal file
View File

@ -0,0 +1,290 @@
// license:BSD-3-Clause
// copyright-holders:
/***********************************************************************************
Namco SH2-based Medal Series, Namco 2000-2001
Hardware info by Guru
---------------------
Games on this system include....
Game
Game Year Code Series#
------------------------------------------------
Shooting Paradise 2000 Z029 1st
Galaxian Fever 2000 Z030 2nd
*Pac'n Party 2000 ? 3rd
Happy Planet 2001 Z037 ?
*=confirmed but not dumped.
These games above are all medal shooting games.
There should be several more games, likely some coin pushers and
other redemption games but no others are known or secured yet.
The sound and graphics chips are the same as used on SETA2 hardware.
PCB Layout
----------
SG_VGA MAIN PCB
1828960501 (1828970501)
B0-0018B
(Note later revision 1828960502 (8128970502) B0-0018C just removes some
patch wires but appears identical)
|------------------------------------------------------------|
| CN12 CN11 CN10 L |-----| |---| |
| LT1381 L |X1-010 | | |
| L SW01 CN09 |-----| | | |
|CN08 |--------| L |U42| |
| |SH2 | L 7.3728MHz | | |
| |HD64F7045 L | | |
| |F28 | L |---| | | |
| 2003 |--U01---| L |1016 |---| |
| |---| 3404 CN07|
| 2003 CN01 62C256 |
| | SG_VGA ROM PCB
| PC410 |-----| |---| | 1828961100 (1828971100) B1-002A
| PS2801 |NEC | | | | |-------------|
|CN06 PS2801 |DX-102 | | |-----| TC551001 | | |
| |-----| |U02| DSW01 |NEC | 70MHz | | U01 |
| | | |DX-102 TC551001 | | | Notes:
| TD62083 | | |-----| CN05| | | U01-U04 32Mbit SOP44 mask ROM
| | | |-------------| | | U03 | CN01 connects to CN05 on main board
| |---| 62C256 62C256 | NEC | | | CN01|
|CN04 3403 62C256 62C256 | DX-101 | | | |
| SW03 60MHz | | | | U02 |
| M1027 |-----| | | | | |
|CN03 |NEC | | | | | |
| LA4705 BATT |DX102| |-------------| | | U04 |
|CN02 |-----| 62C256 62C256 | | |
|------------------------------------------------------------| |-------------|
Notes:
SH2 - Hitachi SH2 HD64F7045F28 QFP144 microcontroller with 256kB internal flash ROM,
4kB on-chip RAM and on-chip peripherals. Clock input 7.3728MHz.
This CPU holds the main program. Dumping it is not trivial.
ROMs:
Shooting Paradise - Z029_VER.1.10_SH2_HD64F7045F28.U01
Galaxian Fever - Z030_VER.1.28_SH2_HD64F7045F28.U01
Happy Planet - Z037_VER.1.00_SH2_HD64F7045F28.U01
U42 - DIP42 32Mbit mask ROM used for audio data. Chip is programmed in BYTE mode.
ROMs:
Shooting Paradise - SPD1_SND-0A.U42
Galaxian Fever - GXF1_SND-0A.U42
Happy Planet - HP1_SND-0A.U42
U02 - DIP40 MX27C4100 EPROM
ROMs:
Shooting Paradise - SPD1_MPR-0A.U02
Galaxian Fever - GXF1_MPR-0A.U02
Happy Planet - HP1_MPR-0A.U02
1016 - Lattice iSP1016E QFP44 CPLD, stamped with game code...
- Shooting Paradise : Z029A
- Galaxian Fever : Z030A
- Happy Planet : Z037A
62C256 - ISSI IS62C256 SOJ32 32kBx8-bit Static RAM
TC551001 - Toshiba TC551001 SOP32 128kBx8-bit Static RAM
L - LED
CN01 - Multi-pin expansion connector for a plug-in board (not populated / not used)
CN02 - 6 pin Namco connector for RGB & Sync Video Output
CN03 - 4 pin Namco connector, purpose unknown
CN04 - 9 pin Namco connector for power input
CN05 - Multi-pin connector for ROM board connection.
ROM board contains 4x 74HC373 and 4x 64Mbit SOP44 mask ROMs stamped with game code.
ROMs:
Shooting Paradise - SPD1_OBJ-1A.U01 SPD1_OBJ-0A.U02 SPD1_OBJ-3A.U03 SPD1_OBJ-2A.U04
Galaxian Fever - GXF1_OBJ-1A.U01 GXF1_OBJ-0A.U02 GXF1_OBJ-3A.U03 GXF1_OBJ-2A.U04
Happy Planet - HP1_OBJ-1A.U01 HP1_OBJ-0A.U02 HP1_OBJ-3A.U03 HP1_OBJ-2A.U04
CN06 - 50 pin flat cable connector. Probably used for controls.
CN07 - Multi-pin connector (not populated / not used)
CN08 - 20 pin flat cable connector. Probably connected to a drive board for motors and mechanical items in the cabinet.
CN09 - 8 pin connector joined to Lattice iSP1016 CPLD for JTAG programming.
CN10 - 25 pin flat cable connector (not populated / not used)
CN11 - 3 pin connector. This is a serial port TX, RX, GND, most likely for debugging purposes.
This connector is tied to the LT1381 on pins 7 and 8. Logic-level pins on the LT1381 are tied to the SH2 on pins 130, 131, 133 & 134
CN12 - 6 pin connector, purpose unknown.
SW01 - 1 DIP switch with on position tied to SH2 pin 106 (PLLVSS). DIP is off so pin 106 is not tied to GND.
SW03 - Reset Push Button
DSW01 - 8 position DIP Switch. Default all off.
LT1381 - Linear Technology (now Analog Devices) LT1381 Dual RS232 Driver/Receiver Pair
X1-010 - Allumer/Seta X1-010 Sound Chip
LA4705 - Sanyo LA4705 15W Stereo Power Amplifier
3403 - New Japan Radio Co. NJM3403 Quad Operational Amplifier
3404 - New Japan Radio Co. NJM3404 Dual Operational Amplifier
M1027 - Mitsumi MM1027 System Reset IC with Battery-Backup Circuit for Static RAM Power Switching
BATT - 3V Coin Battery
2003 - ULN2003 Darlington Array
TD62083 - Toshiba TD62083 8-Channel Darlington Sink Driver
PC410 - Sharp PC410 Photocoupler
PS2801 - NEC PS2801-4 Photocoupler
DX-102 - NEC DX-102 custom chip used for graphics generation
DX-101 - NEC DX-101 custom chip used for graphics generation
TODO:
- everything, driver-wise
- device-fy DX-101 / DX-102 emulation found in seta/seta2_v.cpp
***********************************************************************************/
#include "emu.h"
#include "cpu/sh/sh7042.h"
#include "sound/x1_010.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class sg_vga_state : public driver_device
{
public:
sg_vga_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu")
{ }
void sg_vga(machine_config &config) ATTR_COLD;
private:
required_device<sh7043a_device> m_maincpu;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void program_map(address_map &map) ATTR_COLD;
};
uint32_t sg_vga_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
return 0;
}
void sg_vga_state::program_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x200000, 0x27ffff).rom().region("external_prg", 0);
map(0x4e0000, 0x4effff).ram();
map(0x800000, 0x83ffff).ram().share("spriteram"); // ?
map(0x840000, 0x84ffff).ram().share("palette"); // ?
map(0x860000, 0x86003f).ram().share("vregs"); // ?
}
static INPUT_PORTS_START( hplanet )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("DSW")
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW01:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static const gfx_layout tile_layout =
{
8,8,
RGN_FRAC(1,1),
8,
{ STEP8(7*8, -8) },
{ STEP8(0, 1) },
{ STEP8(0, 8*8) },
8*8*8
};
/* Tiles are 8bpp, but the hardware is additionally able to discard
some bitplanes and use the low 4 bits only, or the high 4 bits only */
static GFXDECODE_START( gfx_dx_10x )
GFXDECODE_ENTRY( "sprites", 0, tile_layout, 0, 0x8000 / 16 ) // 8bpp, but 4bpp color granularity
GFXDECODE_END
void sg_vga_state::sg_vga(machine_config &config)
{
// basic machine hardware
SH7043A(config, m_maincpu, 7.3728_MHz_XTAL * 4); // actually SH7045
m_maincpu->set_addrmap(AS_PROGRAM, &sg_vga_state::program_map);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
screen.set_size(0x200, 0x100);
screen.set_visarea(0x00, 0x140-1, 0x00, 0xe0-1);
screen.set_screen_update(FUNC(sg_vga_state::screen_update));
screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_dx_10x);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x8000 + 0xf0); // extra 0xf0 because we might draw 256-color object with 16-color granularity
// sound hardware
SPEAKER(config, "mono").front_center();
x1_010_device &x1snd(X1_010(config, "x1snd", 16'000'000)); // clock unknown
x1snd.add_route(ALL_OUTPUTS, "mono", 1.0);
}
ROM_START( hplanet )
ROM_REGION( 0x40000, "maincpu", 0 ) // internal ROM
ROM_LOAD( "z037_ver.1.00_sh2_hd64f7045f28.u01", 0x00000, 0x40000, CRC(5b2e5b30) SHA1(b69b9a0cc70816449c8894fd6a46ce852b9883ab) )
ROM_REGION32_BE( 0x80000, "external_prg", 0 )
ROM_LOAD16_WORD_SWAP( "hp1_mpr-0a.u02", 0x00000, 0x80000, CRC(83dd903f) SHA1(37ca41f8423bcf6e7ae422a5a6e1aef0e52a38cc) )
ROM_REGION( 0x2000000, "sprites", 0 )
ROM_LOAD64_WORD( "hp1_obj-1a.u01", 0x000000, 0x800000, CRC(124f99b9) SHA1(41970a06a95875688f8bc21465a5bbd80b8cf8ce) )
ROM_LOAD64_WORD( "hp1_obj-0a.u02", 0x000002, 0x800000, CRC(597e179c) SHA1(5130c5f4f7f8b3c730363ff843440fa5f059663c) )
ROM_LOAD64_WORD( "hp1_obj-3a.u03", 0x000004, 0x800000, CRC(17eeb4fd) SHA1(3bc30cd8f6a43d4aee9cd2da119dbab66c99565e) )
ROM_LOAD64_WORD( "hp1_obj-2a.u04", 0x000006, 0x800000, CRC(31f71432) SHA1(b572045af0c0ad54df72d9396168be004c07f7f7) )
ROM_REGION( 0x400000, "x1snd", 0 )
ROM_LOAD( "hp1_snd-0a.u42", 0x000000, 0x400000, CRC(a78b01e5) SHA1(20e904a2e01a7e40c037a7c4ab9bd1b4e9054c4d) )
ROM_END
} // anonymous namespace
GAME( 2001, hplanet, 0, sg_vga, hplanet, sg_vga_state, empty_init, ROT0, "Namco", "Happy Planet", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )

View File

@ -33,7 +33,7 @@ TODO:
- currently starts with 9 credits inserted. After entering and exiting test mode, the game shows 0
coins and can be coined up normally;
- implement proper controls. The game has a peculiar input setup (see video link above);
- sound system is the same as namco/namcond1.cpp (puts "Quattro Ver.1.2.H8" in H8 RAM). Ir interacts
- sound system is the same as namco/namcond1.cpp (puts "Quattro Ver.1.2.H8" in H8 RAM). It interacts
with the keycus. Handling is copied over from said driver, but could probably be improved;
- after coining up there's a GFX bug that maybe points to some unimplemented feature in seta2_v.cpp;
- once the video emulation in seta/seta2_v.cpp has been devicified, remove derivation from