summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/funtech.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/funtech.cpp')
-rw-r--r--src/mame/drivers/funtech.cpp486
1 files changed, 0 insertions, 486 deletions
diff --git a/src/mame/drivers/funtech.cpp b/src/mame/drivers/funtech.cpp
deleted file mode 100644
index 06b94be2839..00000000000
--- a/src/mame/drivers/funtech.cpp
+++ /dev/null
@@ -1,486 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:David Haywood
-/*
-
-program rom contains the following details
-
-COMPANY:FUN TECH CORPORATION
-PRODUCT-NAME:SUPER TWO IN ONE
-PROJECTOR:TIEN YUAN CHIEN,NOMA
-HARDWARE-DESIGNER:EN YU CHENG
-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
-
-board has an M5255 for sound
-and an unpopulated position for a YM2413 or UM3567
-
-*/
-
-#include "emu.h"
-
-#include "cpu/z80/z80.h"
-#include "sound/ay8910.h"
-#include "machine/nvram.h"
-#include "machine/ticket.h"
-#include "emupal.h"
-#include "screen.h"
-#include "speaker.h"
-#include "tilemap.h"
-
-#include "fts2in1.lh"
-
-
-
-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_lamps(*this, "lamp%u", 0U)
- { }
-
- void funtech(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<8> m_lamps;
-
- uint8_t m_vreg;
-
- tilemap_t *m_fg_tilemap;
-
- INTERRUPT_GEN_MEMBER(vblank_interrupt);
-
- DECLARE_WRITE8_MEMBER(lamps_w);
- DECLARE_WRITE8_MEMBER(coins_w);
- DECLARE_WRITE8_MEMBER(vreg_w);
-
- DECLARE_WRITE8_MEMBER(fgram_w);
-
- TILE_GET_INFO_MEMBER(get_fg_tile_info);
-
- tilemap_t *m_reel_tilemap[3];
-
- template<uint8_t Reel> DECLARE_WRITE8_MEMBER(reel_ram_w);
-
- 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);
-};
-
-
-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];
-
- code |= (attr & 0x0f) << 8;
-
- if (m_vreg&1) code |= 0x1000;
-
- SET_TILE_INFO_MEMBER(0,
- code,
- attr>>4,
- 0);
-}
-
-template<uint8_t Reel>
-TILE_GET_INFO_MEMBER(fun_tech_corp_state::get_reel_tile_info)
-{
- int code = m_reel_ram[Reel][tile_index];
- if (m_vreg & 0x4) code |= 0x100;
- if (m_vreg & 0x8) code |= 0x200;
-
- SET_TILE_INFO_MEMBER(1,
- code,
- 0,
- 0);
-}
-
-template<uint8_t Reel>
-WRITE8_MEMBER(fun_tech_corp_state::reel_ram_w)
-{
- m_reel_ram[Reel][offset] = data;
- m_reel_tilemap[Reel]->mark_tile_dirty(offset);
-}
-
-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);
-
- m_reel_tilemap[0]->set_scroll_cols(64);
- m_reel_tilemap[1]->set_scroll_cols(64);
- m_reel_tilemap[2]->set_scroll_cols(64);
-
-}
-
-WRITE8_MEMBER(fun_tech_corp_state::fgram_w)
-{
- m_fgram[offset] = data;
- m_fg_tilemap->mark_tile_dirty(offset&0x7ff);
-}
-
-
-uint32_t fun_tech_corp_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++)
- {
- for (int i = 0; i < 64; i++)
- {
- m_reel_tilemap[reel]->set_scrolly(i, m_reel_scroll[reel][i]);
- }
- }
-
- const rectangle visible1(0 * 8, (14 + 48) * 8 - 1, 4 * 8, (4 + 7) * 8 - 1);
- const rectangle visible2(0 * 8, (14 + 48) * 8 - 1, 12 * 8, (12 + 7) * 8 - 1);
- const rectangle visible3(0 * 8, (14 + 48) * 8 - 1, 18 * 8, (18 + 7) * 8 - 1);
-
- m_reel_tilemap[0]->draw(screen, bitmap, visible1, 0, 0);
- m_reel_tilemap[1]->draw(screen, bitmap, visible2, 0, 0);
- m_reel_tilemap[2]->draw(screen, bitmap, visible3, 0, 0);
- }
- else
- {
- // this mode seems to draw reel1 as fullscreen using a different set of scroll regs
- for (int i = 0; i < 64; i++)
- {
- m_reel_tilemap[0]->set_scrolly(i, m_reel1_alt_scroll[i]);
- }
-
- m_reel_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
- }
-
-
- m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- return 0;
-}
-
-
-
-INTERRUPT_GEN_MEMBER(fun_tech_corp_state::vblank_interrupt)
-{
-// if (m_nmi_enable)
- device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-
-
-void fun_tech_corp_state::funtech_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(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]);
- map(0xf600, 0xf7ff).ram();
-
- map(0xf840, 0xf87f).ram().share(m_reel_scroll[0]);
- map(0xf880, 0xf8bf).ram().share(m_reel_scroll[1]);
- map(0xf900, 0xf93f).ram().share(m_reel_scroll[2]);
-
- map(0xf9c0, 0xf9ff).ram().share(m_reel1_alt_scroll); // or a mirror, gets used in 'full screen' mode.
-}
-
-
-WRITE8_MEMBER(fun_tech_corp_state::lamps_w)
-{
- for (int i = 0; i < 8; i++)
- m_lamps[i] = BIT(data, i);
-}
-
-WRITE8_MEMBER(fun_tech_corp_state::coins_w)
-{
- if (data & 0x01) printf("coins_w %02x\n", data);
-
- // 80 = hopper motor?
- m_hopper->motor_w(BIT(data, 7));
-
- // 40 = ? sometimes
-
- // 20 = coin 3 counter
- machine().bookkeeping().coin_counter_w(2, data & 0x20 );
-
- // 10 = coin 2 counter
- machine().bookkeeping().coin_counter_w(1, data & 0x10 );
-
- // 08 = coin 4 counter
- machine().bookkeeping().coin_counter_w(3, data & 0x08 );
-
- // 04 = coin 1 counter
- machine().bookkeeping().coin_counter_w(0, data & 0x04 );
-
- // 02 = used when hopper is used (coin out counter?)
-}
-
-WRITE8_MEMBER(fun_tech_corp_state::vreg_w)
-{
- if (data & 0xb2) printf("vreg_w %02x\n", data);
-
- // -x-- rr-t
- // t = text tile bank
- // r = reel tile bank
- // x = show reel 1 full screen?
-
- m_vreg = data;
- m_fg_tilemap->mark_all_dirty();
- m_reel_tilemap[0]->mark_all_dirty();
-}
-
-
-
-void fun_tech_corp_state::funtech_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(0x03, 0x03).w(FUNC(fun_tech_corp_state::vreg_w));
-
- map(0x04, 0x04).portr("IN0");
- map(0x05, 0x05).portr("IN1");
- map(0x06, 0x06).portr("DSW1");
- map(0x07, 0x07).portr("DSW2");
-
- map(0x10, 0x10).portr("IN4");
-
- map(0x11, 0x11).w("aysnd", FUNC(ay8910_device::data_w));
- map(0x12, 0x12).w("aysnd", FUNC(ay8910_device::address_w));
-}
-
-static INPUT_PORTS_START( funtech )
- PORT_START("IN0")
- // the buttons are all multi-purpose as it's a 2-in-1.
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Hold 5, Bet")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Hold 1, Take, Odds, Stop 1")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Hold 4, Double")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Hold 3, Small, Stop 3")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Hold 2, Big, Stop 2")
-
- PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r)
- PORT_DIPNAME( 0x08, 0x08, "IN1-08" ) // some kind of key-out? reduces credits to 0
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, "IN1-10" ) // prevents start from working in the poker game at least
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_SERVICE_NO_TOGGLE( 0x20, IP_ACTIVE_LOW )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN4 ) // note?
-
- // the board contains 4 banks of 8 dipswitches, the code does not appear to read that many.
- PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x01, "Reel Speed" )
- PORT_DIPSETTING( 0x01, "Low" )
- PORT_DIPSETTING( 0x00, "High" )
- PORT_DIPNAME( 0x06, 0x06, "Max Bet" )
- PORT_DIPSETTING( 0x00, "8" )
- PORT_DIPSETTING( 0x04, "16" )
- PORT_DIPSETTING( 0x02, "32" )
- PORT_DIPSETTING( 0x06, "64" )
- PORT_DIPNAME( 0x08, 0x08, "Min Bet for Bonus" )
- PORT_DIPSETTING( 0x00, "8" )
- PORT_DIPSETTING( 0x08, "16" )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("DSW2")
- PORT_DIPNAME( 0x0f, 0x0f, "Main Game Percent" )
- 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 Enable" )
- PORT_DIPSETTING( 0x00, "Disabled" )
- PORT_DIPSETTING( 0x10, "Enabled" )
- PORT_DIPNAME( 0x20, 0x20, "Double Up Percent" )
- PORT_DIPSETTING( 0x00, "80" )
- PORT_DIPSETTING( 0x20, "90" )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) // unused?
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("IN4") // the dipswitch screen doesn't list these, maybe determined by the hopper?
- PORT_DIPNAME( 0x07, 0x07, "Coin 4 Value" )
- PORT_DIPSETTING( 0x00, "1" )
- PORT_DIPSETTING( 0x04, "2" )
- PORT_DIPSETTING( 0x02, "5" )
- PORT_DIPSETTING( 0x06, "10" )
- PORT_DIPSETTING( 0x01, "20" )
- PORT_DIPSETTING( 0x05, "25" )
- PORT_DIPSETTING( 0x03, "50" )
- PORT_DIPSETTING( 0x07, "100" )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x60, 0x00, "Payout Value" )
- PORT_DIPSETTING( 0x00, "1" )
- PORT_DIPSETTING( 0x40, "2" )
- PORT_DIPSETTING( 0x20, "10" )
- PORT_DIPSETTING( 0x60, "50" )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- 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 },
- 32*64
-};
-
-
-static const gfx_layout tiles8x8_layout =
-{
- 8,8,
- RGN_FRAC(1,1),
- 4,
- { 0, 1, 2, 3 },
- { 4, 0, 12, 8, 20, 16, 28, 24 },
- { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
- 32*8
-};
-
-
-static GFXDECODE_START( gfx_funtech )
- GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 )
- GFXDECODE_ENTRY( "gfx2", 0, tiles8x32_layout, 0x100, 1 )
-GFXDECODE_END
-
-
-
-
-void fun_tech_corp_state::machine_start()
-{
- m_lamps.resolve();
-
- save_item(NAME(m_vreg));
-}
-
-
-void fun_tech_corp_state::funtech(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));
-
- /* 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);
- 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 */
- SPEAKER(config, "mono").front_center();
-
- AY8910(config, "aysnd", 1500000).add_route(ALL_OUTPUTS, "mono", 1.00); /* M5255, ? MHz */
-}
-
-
-
-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_LOAD( "u18.bin", 0x00000, 0x80000, CRC(d1154aac) SHA1(dc03c4b7a4dfda2a30bfabaeb0ce053660961663) ) // 1ST AND 2ND HALF IDENTICAL
-
- ROM_REGION( 0x40000, "gfx2", 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
-
-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 )