New systems marked not working

------------------------------
Poker & 21 [Ioannis Bampoulas]
unknown WHT gambling game [Hammy]
This commit is contained in:
Ivan Vangelista 2024-08-08 22:29:47 +02:00
parent 02595ddf2e
commit b8a506be33
5 changed files with 578 additions and 69 deletions

View File

@ -1,8 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*
// copyright-holders: David Haywood
program rom contains the following details
/*
fts2in1's program ROM contains the following details
COMPANY:FUN TECH CORPORATION
PRODUCT-NAME:SUPER TWO IN ONE
@ -12,20 +12,25 @@ SOFTWARE-DESIGNER:RANG CHANG LI,CHIH HNI HUANG,WEN CHANG LIN
PROGRAM-VERSION:1.0
PROGRAM-DATE:09/23/1993
8x8 tiles and 8x32 reels, likely going to be very similar to skylncr.cpp or goldstar.cpp (which are both very similar anyway)
palette addresses are the same as unkch in goldstar.cpp, but the io stuff is definitely different here
8x8 tiles and 8x32 reels, very similar to skylncr.cpp or goldstar.cpp (which are both very similar anyway)
palette addresses are the same as unkch in goldstar.cpp, but the I/O stuff is definitely different here
board has an M5255 for sound
and an unpopulated position for a YM2413 or UM3567
fts2ina runs on a simplified PCB (83330 13 P2IN1 - 1994 © FUN TECH), with no reels support.
It has a K-665 (Oki M6295 clone) instead of the unpopulated YM2413 / UM3567 and a WF19054 instead of the
equivalent M5255. Moreover, it has a 12 MHz XTAL instead of 10 MHz.
*/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
#include "machine/nvram.h"
#include "machine/ticket.h"
#include "sound/ay8910.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -41,76 +46,102 @@ class fun_tech_corp_state : public driver_device
public:
fun_tech_corp_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_fgram(*this, "fgram"),
m_reel_ram(*this, "reel_ram.%u", 0U),
m_reel_scroll(*this, "reel_scroll.%u", 0U),
m_reel1_alt_scroll(*this, "reel1_alt_scroll"),
m_maincpu(*this, "maincpu"),
m_hopper(*this, "hopper"),
m_gfxdecode(*this, "gfxdecode"),
m_fgram(*this, "fgram"),
m_hopper(*this, "hopper"),
m_lamps(*this, "lamp%u", 0U)
{ }
void funtech(machine_config &config);
void poker21(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
required_shared_ptr<uint8_t> m_fgram;
required_shared_ptr_array<uint8_t, 3> m_reel_ram;
required_shared_ptr_array<uint8_t, 3> m_reel_scroll;
required_shared_ptr<uint8_t> m_reel1_alt_scroll;
required_device<cpu_device> m_maincpu;
required_device<ticket_dispenser_device> m_hopper;
required_device<gfxdecode_device> m_gfxdecode;
output_finder<6> m_lamps;
uint8_t m_vreg = 0;
tilemap_t *m_fg_tilemap = nullptr;
INTERRUPT_GEN_MEMBER(vblank_interrupt);
void lamps_w(uint8_t data);
void coins_w(uint8_t data);
void vreg_w(uint8_t data);
void program_map(address_map &map);
void base(machine_config &config);
private:
required_shared_ptr<uint8_t> m_fgram;
required_device<ticket_dispenser_device> m_hopper;
output_finder<6> m_lamps;
INTERRUPT_GEN_MEMBER(vblank_interrupt);
void fgram_w(offs_t offset, uint8_t data);
void vreg_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void io_map(address_map &map);
};
class reels_state : public fun_tech_corp_state
{
public:
reels_state(const machine_config &mconfig, device_type type, const char *tag) :
fun_tech_corp_state(mconfig, type, tag),
m_reel_ram(*this, "reel_ram.%u", 0U),
m_reel_scroll(*this, "reel_scroll.%u", 0U),
m_reel1_alt_scroll(*this, "reel1_alt_scroll")
{ }
void funtech(machine_config &config);
protected:
virtual void video_start() override;
private:
required_shared_ptr_array<uint8_t, 3> m_reel_ram;
required_shared_ptr_array<uint8_t, 3> m_reel_scroll;
required_shared_ptr<uint8_t> m_reel1_alt_scroll;
tilemap_t *m_reel_tilemap[3]{};
void vreg_w(uint8_t data);
template<uint8_t Reel> void reel_ram_w(offs_t offset, uint8_t data);
template<uint8_t Reel> TILE_GET_INFO_MEMBER(get_reel_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void funtech_io_map(address_map &map);
void funtech_map(address_map &map);
void io_map(address_map &map);
void program_map(address_map &map);
};
TILE_GET_INFO_MEMBER(fun_tech_corp_state::get_fg_tile_info)
{
int code = m_fgram[tile_index];
int attr = m_fgram[tile_index+0x800];
int const attr = m_fgram[tile_index + 0x800];
code |= (attr & 0x0f) << 8;
if (m_vreg&1) code |= 0x1000;
if (m_vreg & 0x1) code |= 0x1000;
tileinfo.set(0,
code,
attr>>4,
attr >> 4,
0);
}
template<uint8_t Reel>
TILE_GET_INFO_MEMBER(fun_tech_corp_state::get_reel_tile_info)
TILE_GET_INFO_MEMBER(reels_state::get_reel_tile_info)
{
int code = m_reel_ram[Reel][tile_index];
if (m_vreg & 0x4) code |= 0x100;
@ -123,7 +154,7 @@ TILE_GET_INFO_MEMBER(fun_tech_corp_state::get_reel_tile_info)
}
template<uint8_t Reel>
void fun_tech_corp_state::reel_ram_w(offs_t offset, uint8_t data)
void reels_state::reel_ram_w(offs_t offset, uint8_t data)
{
m_reel_ram[Reel][offset] = data;
m_reel_tilemap[Reel]->mark_tile_dirty(offset);
@ -133,10 +164,15 @@ void fun_tech_corp_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fun_tech_corp_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_fg_tilemap->set_transparent_pen(0);
}
m_reel_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fun_tech_corp_state::get_reel_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
m_reel_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fun_tech_corp_state::get_reel_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
m_reel_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fun_tech_corp_state::get_reel_tile_info<2>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
void reels_state::video_start()
{
fun_tech_corp_state::video_start();
m_reel_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(reels_state::get_reel_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
m_reel_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(reels_state::get_reel_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
m_reel_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(reels_state::get_reel_tile_info<2>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
m_reel_tilemap[0]->set_scroll_cols(64);
m_reel_tilemap[1]->set_scroll_cols(64);
@ -147,7 +183,7 @@ void fun_tech_corp_state::video_start()
void fun_tech_corp_state::fgram_w(offs_t offset, uint8_t data)
{
m_fgram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset&0x7ff);
m_fg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
@ -155,6 +191,14 @@ uint32_t fun_tech_corp_state::screen_update(screen_device &screen, bitmap_ind16
{
bitmap.fill(0, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
uint32_t reels_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
if (!(m_vreg & 0x40))
{
for (uint8_t reel = 0; reel < 3; reel++)
@ -198,22 +242,26 @@ INTERRUPT_GEN_MEMBER(fun_tech_corp_state::vblank_interrupt)
}
void fun_tech_corp_state::funtech_map(address_map &map)
void fun_tech_corp_state::program_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xc1ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0xc800, 0xc9ff).ram().w("palette", FUNC(palette_device::write8_ext)).share("palette_ext");
map(0xd000, 0xd7ff).rom(); // maybe
map(0xd000, 0xd7ff).rom();
map(0xd800, 0xdfff).ram().share("nvram");
map(0xe000, 0xefff).ram().w(FUNC(fun_tech_corp_state::fgram_w)).share(m_fgram);
map(0xf000, 0xf1ff).ram().w(FUNC(fun_tech_corp_state::reel_ram_w<0>)).share(m_reel_ram[0]);
map(0xf200, 0xf3ff).ram().w(FUNC(fun_tech_corp_state::reel_ram_w<1>)).share(m_reel_ram[1]);
map(0xf400, 0xf5ff).ram().w(FUNC(fun_tech_corp_state::reel_ram_w<2>)).share(m_reel_ram[2]);
}
void reels_state::program_map(address_map &map)
{
fun_tech_corp_state::program_map(map);
map(0xf000, 0xf1ff).ram().w(FUNC(reels_state::reel_ram_w<0>)).share(m_reel_ram[0]);
map(0xf200, 0xf3ff).ram().w(FUNC(reels_state::reel_ram_w<1>)).share(m_reel_ram[1]);
map(0xf400, 0xf5ff).ram().w(FUNC(reels_state::reel_ram_w<2>)).share(m_reel_ram[2]);
map(0xf600, 0xf7ff).ram();
map(0xf840, 0xf87f).ram().share(m_reel_scroll[0]);
@ -247,7 +295,19 @@ void fun_tech_corp_state::coins_w(uint8_t data)
m_hopper->motor_w(BIT(data, 7));
}
void fun_tech_corp_state::vreg_w(uint8_t data)
{
if (data & 0xfe) logerror("vreg_w %02x\n", data);
// ---- ---t
// t = text tile bank
m_vreg = data;
m_fg_tilemap->mark_all_dirty();
}
void reels_state::vreg_w(uint8_t data)
{
if (data & 0xb2) logerror("vreg_w %02x\n", data);
@ -263,14 +323,33 @@ void fun_tech_corp_state::vreg_w(uint8_t data)
void fun_tech_corp_state::funtech_io_map(address_map &map)
void fun_tech_corp_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x01, 0x01).w(FUNC(fun_tech_corp_state::coins_w));
map(0x02, 0x02).w(FUNC(fun_tech_corp_state::lamps_w));
map(0x04, 0x04).portr("IN0");
map(0x05, 0x05).portr("IN1");
map(0x06, 0x06).portr("DSW4");
map(0x07, 0x07).portr("DSW3");
map(0x10, 0x10).r("aysnd", FUNC(ay8910_device::data_r));
map(0x11, 0x11).w("aysnd", FUNC(ay8910_device::data_w));
map(0x12, 0x12).w("aysnd", FUNC(ay8910_device::address_w));
map(0x1a, 0x1a).w(FUNC(fun_tech_corp_state::vreg_w));
}
void reels_state::io_map(address_map &map)
{
map.global_mask(0xff);
// lamps?
map(0x00, 0x00).w(FUNC(fun_tech_corp_state::lamps_w));
map(0x01, 0x01).w(FUNC(fun_tech_corp_state::coins_w));
map(0x00, 0x00).w(FUNC(reels_state::lamps_w));
map(0x01, 0x01).w(FUNC(reels_state::coins_w));
map(0x03, 0x03).w(FUNC(fun_tech_corp_state::vreg_w));
map(0x03, 0x03).w(FUNC(reels_state::vreg_w));
map(0x04, 0x04).portr("IN0");
map(0x05, 0x05).portr("IN1");
@ -282,14 +361,14 @@ void fun_tech_corp_state::funtech_io_map(address_map &map)
map(0x12, 0x12).w("aysnd", FUNC(ay8910_device::address_w));
}
static INPUT_PORTS_START( funtech )
static INPUT_PORTS_START( fts2in1 )
PORT_START("IN0")
// the buttons are all multi-purpose as it's a 2-in-1.
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5, Bet")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin A")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Coin C")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("Coin D")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1, Take Score, Odds, Left Stop") // shows odds in 8-liner game
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1, Take Score, Odds, Left Stop") // shows odds in 8-liner game
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Hold 4, Double-Up") // manual suggests this shows odds, but it doesn't
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3, Small, Right Stop")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Hold 2, Big, Center Stop")
@ -412,24 +491,155 @@ static INPUT_PORTS_START( funtech )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( poker21 )
PORT_START("IN0")
// the buttons are all multi-purpose as it's a 2-in-1.
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5, Bet")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin A")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Coin C")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("Coin D")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1, Take Score, Odds, Left Stop") // shows odds in 8-liner game
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Hold 4, Double-Up") // manual suggests this shows odds, but it doesn't
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3, Small, Right Stop")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Hold 2, Big, Center Stop")
PORT_START("IN1") // port 0x13
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" )
// the board contains 4 banks of 8 dipswitches
PORT_START("DSW1")
PORT_DIPNAME( 0x03, 0x03, "Hopper Limit" ) PORT_DIPLOCATION("NO. 1:1,2")
PORT_DIPSETTING( 0x00, "300" )
PORT_DIPSETTING( 0x02, "500" )
PORT_DIPSETTING( 0x01, "1000" )
PORT_DIPSETTING( 0x03, "Unlimited" )
PORT_DIPNAME( 0x1c, 0x1c, "Credit Limit" ) PORT_DIPLOCATION("NO. 1:3,4,5")
PORT_DIPSETTING( 0x00, "5,000" )
PORT_DIPSETTING( 0x10, "10,000" )
PORT_DIPSETTING( 0x08, "20,000" )
PORT_DIPSETTING( 0x18, "30,000" )
PORT_DIPSETTING( 0x04, "40,000" )
PORT_DIPSETTING( 0x14, "50,000" )
PORT_DIPSETTING( 0x0c, "100,000" )
PORT_DIPSETTING( 0x1c, "Unlimited" )
PORT_DIPNAME( 0x20, 0x20, "Credit Limit Display" ) PORT_DIPLOCATION("NO. 1:6")
PORT_DIPSETTING( 0x20, "Not Displayed" )
PORT_DIPSETTING( 0x00, "Displayed" )
PORT_DIPNAME( 0xc0, 0xc0, "Coin A Rate" ) PORT_DIPLOCATION("NO. 1:7,8")
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" )
PORT_START("DSW2")
PORT_DIPNAME( 0x07, 0x07, "Keyin B Rate" ) PORT_DIPLOCATION("NO. 2:1,2,3")
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x06, "1 Coin/10 Credits" )
PORT_DIPSETTING( 0x01, "1 Coin/20 Credits" )
PORT_DIPSETTING( 0x05, "1 Coin/25 Credits" )
PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" )
PORT_DIPSETTING( 0x07, "1 Coin/100 Credits" )
PORT_DIPNAME( 0x18, 0x18, "Coin C Rate" ) PORT_DIPLOCATION("NO. 2:4,5")
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x18, "1 Coin/10 Credits" )
PORT_DIPNAME( 0xe0, 0xe0, "Coin D Rate" ) PORT_DIPLOCATION("NO. 2:6,7,8")
PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C) )
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0xa0, "1 Coin/10 Credits" )
PORT_DIPSETTING( 0x60, "1 Coin/25 Credits" )
PORT_DIPSETTING( 0xe0, "1 Coin/50 Credits" )
PORT_START("DSW3")
PORT_DIPNAME( 0x0f, 0x0f, "Main Game Pay Rate" ) PORT_DIPLOCATION("NO. 3:1,2,3,4")
PORT_DIPSETTING( 0x00, "50%" )
PORT_DIPSETTING( 0x08, "53%" )
PORT_DIPSETTING( 0x04, "56%" )
PORT_DIPSETTING( 0x0c, "59%" )
PORT_DIPSETTING( 0x02, "62%" )
PORT_DIPSETTING( 0x0a, "65%" )
PORT_DIPSETTING( 0x06, "68%" )
PORT_DIPSETTING( 0x0e, "71%" )
PORT_DIPSETTING( 0x01, "74%" )
PORT_DIPSETTING( 0x09, "77%" )
PORT_DIPSETTING( 0x05, "80%" )
PORT_DIPSETTING( 0x0d, "83%" )
PORT_DIPSETTING( 0x03, "86%" )
PORT_DIPSETTING( 0x0b, "89%" )
PORT_DIPSETTING( 0x07, "92%" )
PORT_DIPSETTING( 0x0f, "95%" )
PORT_DIPNAME( 0x10, 0x10, "Double Up Game" ) PORT_DIPLOCATION("NO. 3:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "Double Up Pay Rate" ) PORT_DIPLOCATION("NO. 3:6")
PORT_DIPSETTING( 0x00, "80%" )
PORT_DIPSETTING( 0x20, "90%" )
PORT_DIPNAME( 0x40, 0x40, "Double Up 7 Player Value" ) PORT_DIPLOCATION("NO. 3:7")
PORT_DIPSETTING( 0x40, "Loss" )
PORT_DIPSETTING( 0x00, "Draw" )
PORT_DIPNAME( 0x80, 0x80, "Double Up Girl Display" ) PORT_DIPLOCATION("NO. 3:8") // if set to No girl remains clothed when winning
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
PORT_START("DSW4")
PORT_DIPNAME( 0x01, 0x01, "Reel Speed" ) PORT_DIPLOCATION("NO. 4:1")
PORT_DIPSETTING( 0x01, "Low" )
PORT_DIPSETTING( 0x00, "High" )
PORT_DIPNAME( 0x06, 0x06, "Max Bet" ) PORT_DIPLOCATION("NO. 4:2,3")
PORT_DIPSETTING( 0x00, "8" )
PORT_DIPSETTING( 0x04, "16" )
PORT_DIPSETTING( 0x02, "32" )
PORT_DIPSETTING( 0x06, "64" )
PORT_DIPNAME( 0x08, 0x08, "Min Bet for Any Bonus" ) PORT_DIPLOCATION("NO. 4:4")
PORT_DIPSETTING( 0x00, "8" )
PORT_DIPSETTING( 0x08, "16" )
PORT_DIPNAME( 0x30, 0x30, "Bonus Games Entry Condition" ) PORT_DIPLOCATION("NO. 4:5,6")
PORT_DIPSETTING( 0x00, "1-3-1-5-1" )
PORT_DIPSETTING( 0x20, "1-4-1-6-1" )
PORT_DIPSETTING( 0x10, "1-5-1-7-1" )
PORT_DIPSETTING( 0x30, "1-6-1-8-1" )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("NO. 4:7") // unused according to manual
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("NO. 4:8") // unused according to manual
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static const gfx_layout tiles8x32_layout =
{
8,32,
RGN_FRAC(1,1),
8,
{ 0, 1, 2, 3, 4 ,5, 6, 7 },
{ 0, 8, 16, 24, 32, 40, 48, 56 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64, 16*64, 17*64, 18*64, 19*64, 20*64, 21*64, 22*64, 23*64, 24*64, 25*64, 26*64, 27*64, 28*64, 29*64, 30*64, 31*64 },
{ STEP8(0,1) },
{ STEP8(0,8) },
{ STEP32(0,64) },
32*64
};
static GFXDECODE_START( gfx_funtech )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tiles8x32_layout, 0x100, 1 )
static GFXDECODE_START( gfx_fts2in1 )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_lsb, 0, 16 )
GFXDECODE_ENTRY( "reels", 0, tiles8x32_layout, 0x100, 1 )
GFXDECODE_END
static GFXDECODE_START( gfx_poker21 )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_lsb, 0, 16 )
GFXDECODE_END
@ -441,54 +651,93 @@ void fun_tech_corp_state::machine_start()
}
void fun_tech_corp_state::funtech(machine_config &config)
void fun_tech_corp_state::base(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000); /* ? MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &fun_tech_corp_state::funtech_map);
m_maincpu->set_addrmap(AS_IO, &fun_tech_corp_state::funtech_io_map);
m_maincpu->set_vblank_int("screen", FUNC(fun_tech_corp_state::vblank_interrupt));
// basic machine hardware
Z80(config, m_maincpu, 10_MHz_XTAL / 2 ); // divider not verified
m_maincpu->set_vblank_int("screen", FUNC(reels_state::vblank_interrupt));
/* 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));
screen.set_size(512, 256);
screen.set_visarea(0, 512-1, 8, 256-8-1);
screen.set_screen_update(FUNC(fun_tech_corp_state::screen_update));
screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_funtech);
GFXDECODE(config, m_gfxdecode, "palette", gfx_poker21);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 0x200);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
ay8910_device &aysnd(AY8910(config, "aysnd", 1500000)); /* M5255, ? MHz */
ay8910_device &aysnd(AY8910(config, "aysnd", 10_MHz_XTAL / 8)); // M5255, divider not verified
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 1.00);
}
void reels_state::funtech(machine_config &config)
{
base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &reels_state::program_map);
m_maincpu->set_addrmap(AS_IO, &reels_state::io_map);
subdevice<screen_device>("screen")->set_screen_update(FUNC(reels_state::screen_update));
m_gfxdecode->set_info(gfx_fts2in1);
}
void fun_tech_corp_state::poker21(machine_config &config)
{
base(config);
m_maincpu->set_clock(12_MHz_XTAL / 4); // divider not verified
m_maincpu->set_addrmap(AS_PROGRAM, &fun_tech_corp_state::program_map);
m_maincpu->set_addrmap(AS_IO, &fun_tech_corp_state::io_map);
//m_maincpu->set_vblank_int("screen", FUNC(fun_tech_corp_state::irq0_line_hold));
subdevice<screen_device>("screen")->set_screen_update(FUNC(fun_tech_corp_state::screen_update));
subdevice<ay8910_device>("aysnd")->set_clock(12_MHz_XTAL / 12); // WF19054, divider not verified
OKIM6295(config, "oki", 12_MHz_XTAL / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80); // divider and pin 7 not verified
}
ROM_START( fts2in1 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "u5.bin", 0x00000, 0x10000, CRC(ab19fd28) SHA1(a65ff732e0aaaec256cc63beff5f24419e691645) )
ROM_REGION( 0x80000, "gfx1", 0 ) // crc printed on label matches half the data, even if chip was double size. Seen on a second PCB with correct sized ROM.
ROM_REGION( 0x80000, "tiles", 0 ) // CRC printed on label matches half the data, even if chip was double size. Seen on a second PCB with correct sized ROM.
ROM_LOAD( "u18.bin", 0x00000, 0x80000, CRC(d1154aac) SHA1(dc03c4b7a4dfda2a30bfabaeb0ce053660961663) ) // 1ST AND 2ND HALF IDENTICAL
ROM_REGION( 0x40000, "gfx2", 0 )
ROM_REGION( 0x40000, "reels", 0 )
ROM_LOAD16_BYTE( "u29.bin", 0x00000, 0x20000, CRC(ed6a1e2f) SHA1(2c72e764c7c8091a8fa1dfc257a84d61e2da0e4b) )
ROM_LOAD16_BYTE( "u30.bin", 0x00001, 0x20000, CRC(d572bddc) SHA1(06499aeb47085a02af9eb4987ed987f9a3a397f7) )
ROM_END
ROM_START( poker21 ) // no ROM labels present
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "27c512.u6", 0x00000, 0x10000, CRC(77abd0c0) SHA1(18cc08911180a252f66c9c599f799f8e1ac3c875) )
ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "27c020.u29", 0x00000, 0x40000, CRC(b19a4dd5) SHA1(97b615e548141b2c087a710cdf6df2b746d3881a) )
ROM_REGION( 0x40000, "oki", 0 )
ROM_LOAD( "27c020.u36", 0x00000, 0x40000, CRC(7185dc79) SHA1(db01a5221f423137f89b04c0607b5c93d2a795f3) )
ROM_REGION( 0x200, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "palce20v8.u19", 0x000, 0x157, NO_DUMP )
ROM_END
} // anonymous namespace
GAMEL( 1993, fts2in1, 0, funtech, funtech, fun_tech_corp_state, empty_init, ROT0, "Fun Tech Corporation", "Super Two In One", MACHINE_SUPPORTS_SAVE, layout_fts2in1 )
GAMEL( 1993, fts2in1, 0, funtech, fts2in1, reels_state, empty_init, ROT0, "Fun Tech Corporation", "Super Two In One", MACHINE_SUPPORTS_SAVE, layout_fts2in1 )
GAME( 1994, poker21, 0, poker21, poker21, fun_tech_corp_state, empty_init, ROT0, "Fun Tech Corporation", "Poker & 21", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // doesn't like interrupts

View File

@ -19,6 +19,8 @@
a holographic sticker, this appears to be unprotected but has only been
read for a few sets, it probably either acts as a secondary protection
device or as a main CPU instructing the ARM.
For Crazy Bugs, MCUs with stickers J9 and F9 have been dumped and both
contained the same data, despite the different sticker.
*/

View File

@ -19952,6 +19952,7 @@ dunhuang // (c) 1995
@source:igs/funtech.cpp
fts2in1
poker21
@source:igs/goldstar.cpp
3cdpoker // hack?
@ -42515,6 +42516,9 @@ vp415 // (c) 1983 Philips
@source:skeleton/webtouchone.cpp
wto2840sp //
@source:skeleton/whtm68k.cpp
unkwht
@source:skeleton/xbase09.cpp
xbase09 //

View File

@ -196,7 +196,7 @@ void boramz80_state::pk(machine_config &config)
ppi.in_pa_callback().set([this] () { logerror("%s: PPI port A read\n", machine().describe_context()); return ioport("IN0")->read(); });
ppi.in_pb_callback().set([this] () { logerror("%s: PPI port B read\n", machine().describe_context()); return ioport("IN1")->read(); });
ppi.in_pc_callback().set([this] () { logerror("%s: PPI port C read\n", machine().describe_context()); return ioport("IN2")->read(); });
ppi.out_pc_callback().set([this] (u8 data) { logerror("%s: PPI port C write %02x\n", machine().describe_context(), data); });
ppi.out_pc_callback().set([this] (uint8_t data) { logerror("%s: PPI port C write %02x\n", machine().describe_context(), data); });
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: everything
screen.set_refresh_hz(60);
@ -264,5 +264,5 @@ ROM_END
} // anonymous namespace
GAME( 1987, pkboram, 0, pk, pkboram, boramz80_state, empty_init, ROT0, "Boram", "PK", MACHINE_IS_SKELETON ) // PK-BORAM 0211 aug.04.1987. BORAM CORP
GAME( 1988, tpkboram, 0, pk, tpkboram, boramz80_state, empty_init, ROT0, "Boram", "Turbo PK", MACHINE_IS_SKELETON ) // PK-TURBO jan.29.1988. BORAM CORP.
GAME( 1987, pkboram, 0, pk, pkboram, boramz80_state, empty_init, ROT0, "Boram", "PK - New Exciting Poker!", MACHINE_IS_SKELETON ) // PK-BORAM 0211 aug.04.1987. BORAM CORP
GAME( 1988, tpkboram, 0, pk, tpkboram, boramz80_state, empty_init, ROT0, "Boram", "Turbo PK", MACHINE_IS_SKELETON ) // PK-TURBO jan.29.1988. BORAM CORP.

View File

@ -0,0 +1,254 @@
// license:BSD-3-Clause
// copyright-holders:
/*
Unknown WHT gambling game
The PCB is marked 'COPYRIGHT FOR WHT ELE CO,. VER 3.0'
Main components are:
M68HC000P10 CPU
24.000 MHz XTAL (near CPU)
2x MK48H64N-120 SRAM (near CPU)
HM6116L-70 SRAM (near battery)
P-80C32 audio CPU
HM6116L-70 SRAM (near P-80C32)
GM68B45S CRTC
12.000 MHz XTAL (near CRTC and P-80C32)
2x MU9C4870-80PC RAMDAC
5x HM6265L-70 SRAM (near GFX ROMs)
3x Lattice pLSI 1032-60LJ
KB89C67 (YM2413 clone)
3.579545 MHz XTAL (near KB89C67)
K-665 sound chip (Oki M6295 clone)
2x 8-DIP banks
*/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "cpu/mcs51/mcs51.h"
#include "sound/okim6295.h"
#include "sound/ymopl.h"
#include "video/mc6845.h"
#include "video/ramdac.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
// configurable logging
#define LOG_PORTS (1U << 1)
//#define VERBOSE (LOG_GENERAL | LOG_PORTS)
#include "logmacro.h"
#define LOGPORTS(...) LOGMASKED(LOG_PORTS, __VA_ARGS__)
namespace {
class whtm68k_state : public driver_device
{
public:
whtm68k_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode")
{ }
void unkwht(machine_config &config) ATTR_COLD;
protected:
virtual void video_start() override ATTR_COLD;
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void main_program_map(address_map &map) ATTR_COLD;
void audio_program_map(address_map &map) ATTR_COLD;
void audio_io_map(address_map &map) ATTR_COLD;
};
void whtm68k_state::video_start()
{
}
uint32_t whtm68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bitmap.fill(rgb_t::black(), cliprect);
return 0;
}
void whtm68k_state::main_program_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0xd00000, 0xd03fff).ram();
map(0xd10000, 0xd13fff).ram();
map(0xd20000, 0xd23fff).ram();
map(0xe00000, 0xe03fff).ram();
}
void whtm68k_state::audio_program_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x8000, 0xffff).rom().region("audiocpu", 0x8000); // TODO: banked somewhere here
}
void whtm68k_state::audio_io_map(address_map &map)
{
map(0x8000, 0x803f).ram(); // ??
map(0xa000, 0xa000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
// some kind of latch with the main CPU or inputs? Returning rand activates the sound chips.
//map(0xb000, 0xb000).lr8(NAME([this] () -> uint8_t { return machine().rand(); }));
map(0xc000, 0xc001).w("ym", FUNC(ym2413_device::write));
}
static INPUT_PORTS_START( unkwht )
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("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_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("DSW1")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
PORT_START("DSW2")
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")
INPUT_PORTS_END
// TODO: wrong, just enough to see something in the decoder
const gfx_layout gfx_8x8x4_packed_msb_r =
{
8,8,
RGN_FRAC(1,1),
4,
{ STEP4(0,1) },
{ STEP8(28,-4) },
{ STEP8(0,4*8) },
8*8*4
};
static GFXDECODE_START( gfx_wht )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_packed_msb_r, 0, 16 )
GFXDECODE_END
void whtm68k_state::unkwht(machine_config &config)
{
// basic machine hardware
M68000(config, m_maincpu, 24_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &whtm68k_state::main_program_map);
//m_maincpu->set_vblank_int("screen", FUNC(whtm68k_state::irq2_line_hold));
i80c32_device &audiocpu(I80C32(config, "audiocpu", 12_MHz_XTAL));
audiocpu.set_addrmap(AS_PROGRAM, &whtm68k_state::audio_program_map);
audiocpu.set_addrmap(AS_IO, &whtm68k_state::audio_io_map);
audiocpu.port_in_cb<0>().set([this] () { LOGPORTS("%s: 80C32 port 0 read\n", machine().describe_context()); return 0; });
audiocpu.port_in_cb<1>().set([this] () { LOGPORTS("%s: 80C32 port 1 read\n", machine().describe_context()); return 0; });
audiocpu.port_in_cb<2>().set([this] () { LOGPORTS("%s: 80C32 port 2 read\n", machine().describe_context()); return 0; });
audiocpu.port_in_cb<3>().set([this] () { LOGPORTS("%s: 80C32 port 3 read\n", machine().describe_context()); return 0; });
audiocpu.port_out_cb<0>().set([this] (uint8_t data) { LOGPORTS("%s: 80C32 port 0 write %02x\n", machine().describe_context(), data); });
audiocpu.port_out_cb<1>().set([this] (uint8_t data) { LOGPORTS("%s: 80C32 port 1 write %02x\n", machine().describe_context(), data); });
audiocpu.port_out_cb<2>().set([this] (uint8_t data) { LOGPORTS("%s: 80C32 port 2 write %02x\n", machine().describe_context(), data); });
audiocpu.port_out_cb<3>().set([this] (uint8_t data) { LOGPORTS("%s: 80C32 port 3 write %02x\n", machine().describe_context(), data); });
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: everything
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea_full();
screen.set_screen_update(FUNC(whtm68k_state::screen_update));
hd6845s_device &crtc(HD6845S(config, "crtc", 12_MHz_XTAL / 12)); // divisor guessed
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
RAMDAC(config, "ramdac", 0, "palette"); // MU9C4870-80PC
RAMDAC(config, "ramdac2", 0, "palette"); // MU9C4870-80PC
GFXDECODE(config, "gfxdecode", "palette", gfx_wht);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x400); // TODO
SPEAKER(config, "mono").front_center();
YM2413(config, "ym", 3.579545_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 1.0); // KB89C67?
OKIM6295(config, "oki", 12_MHz_XTAL / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock and pin 7 not verified
}
ROM_START( unkwht )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD16_BYTE( "chs_p1.u13", 0x00000, 0x20000, CRC(6f180b89) SHA1(cfbdd93360f6f8a8c47624c2522e6c005658a436) )
ROM_LOAD16_BYTE( "chs_p2.u14", 0x00001, 0x20000, CRC(c8f53b59) SHA1(c8c7e0131e7cbfda59cd658da0f3d4a28deef0b1) )
ROM_REGION( 0x20000, "audiocpu", 0 )
ROM_LOAD( "chs_m.u74", 0x00000, 0x20000, CRC(b0c030df) SHA1(0cd388dc39004a41cc58ebedab32cc45e338f64b) )
ROM_REGION( 0x60000, "tiles", 0 )
ROM_LOAD( "chs_v1.u50", 0x00000, 0x20000, CRC(dde0d62b) SHA1(bbf0d7dadbeec9036c20a4dfd64a8276c4ff1664) )
ROM_LOAD( "chs_v2.u54", 0x20000, 0x20000, CRC(347db59c) SHA1(532d5621ea45fe569e37612f99fed46e6b6fe377) ) // the u53 socket is between u50 and u53 on PCB
ROM_LOAD( "chs_v3.u53", 0x40000, 0x20000, CRC(36353ce4) SHA1(427c9b946398a38afae850c199438808eee96d80) )
ROM_REGION( 0x40000, "oki", 0 )
ROM_LOAD( "chs_s.u34", 0x00000, 0x20000, CRC(e8492df9) SHA1(08be7cd33b751d56ec830240840adfd841b3af93) ) // 1xxxxxxxxxxxxxxxx = 0x00, very few samples
ROM_END
} // anonymous namespace
GAME( 1996, unkwht, 0, unkwht, unkwht, whtm68k_state, empty_init, ROT0, "WHT", "unknown WHT gambling game", MACHINE_IS_SKELETON ) // 1996 WHT copyright in GFX