summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/success/tonton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/success/tonton.cpp')
-rw-r--r--src/mame/success/tonton.cpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/src/mame/success/tonton.cpp b/src/mame/success/tonton.cpp
new file mode 100644
index 00000000000..0527a3298ad
--- /dev/null
+++ b/src/mame/success/tonton.cpp
@@ -0,0 +1,265 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese, Roberto Fresca
+/**************************************************************************
+
+ Waku Waku Doubutsu Land TonTon (c) 1987 Success.
+
+ HW based off MSX2
+
+ Driver by Angelo Salese & Roberto Fresca.
+
+
+***************************************************************************
+
+ WAKUWAKU DOUBUTSU LAND TONTON (ANIMAL VIDEO SLOT)
+ (c)SUCCESS / CABINET :TAIYO JIDOKI (SUN AUTO MACHINE)
+
+ CPU : Z80
+ SOUND : YM2149F
+ XTAL : 21477.27KHz
+
+ TONTON.BIN : MAIN ROM
+
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/z80/z80.h"
+#include "machine/nvram.h"
+#include "machine/ticket.h"
+#include "sound/ay8910.h"
+#include "video/v9938.h"
+
+#include "speaker.h"
+
+
+namespace {
+
+class tonton_state : public driver_device
+{
+public:
+ tonton_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_v9938(*this, "v9938"),
+ m_maincpu(*this, "maincpu"),
+ m_hopper(*this, "hopper")
+ { }
+
+ void tonton(machine_config &config);
+
+private:
+ required_device<v9938_device> m_v9938;
+ void outport_w(offs_t offset, uint8_t data);
+ void hopper_w(uint8_t data);
+ void ay_aout_w(uint8_t data);
+ void ay_bout_w(uint8_t data);
+ required_device<cpu_device> m_maincpu;
+ required_device<ticket_dispenser_device> m_hopper;
+ void tonton_io(address_map &map) ATTR_COLD;
+ void tonton_map(address_map &map) ATTR_COLD;
+};
+
+#define MAIN_CLOCK XTAL(21'477'272)
+#define CPU_CLOCK MAIN_CLOCK/6
+#define YM2149_CLOCK MAIN_CLOCK/6/2 // '/SEL' pin tied to GND, so internal divisor x2 is active
+
+#define HOPPER_PULSE 50 // time between hopper pulses in milliseconds
+#define VDP_MEM 0x30000
+
+
+/*************************************************
+* Multi-Purpose Output Port *
+*************************************************/
+
+void tonton_state::outport_w(offs_t offset, uint8_t data)
+{
+ machine().bookkeeping().coin_counter_w(offset, data & 0x01);
+ machine().bookkeeping().coin_lockout_global_w(data & 0x02); // Coin Lock
+
+// if(data & 0xfe)
+// logerror("%02x %02x\n",data,offset);
+ if (data)
+ logerror("tonton_outport_w %02X @ %04X\n", data, m_maincpu->pc());
+}
+
+void tonton_state::hopper_w(uint8_t data)
+{
+ m_hopper->motor_w(BIT(data, 1));
+}
+
+
+/*************************************************
+* Memory Map *
+*************************************************/
+
+void tonton_state::tonton_map(address_map &map)
+{
+ map(0x0000, 0xdfff).rom();
+ map(0xe000, 0xe3ff).ram().share("nvram");
+ map(0xf000, 0xffff).ram();
+}
+
+void tonton_state::tonton_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x00, 0x00).portr("IN0");
+ map(0x00, 0x00).w(FUNC(tonton_state::outport_w));
+ map(0x01, 0x01).portr("IN1");
+ map(0x01, 0x01).w(FUNC(tonton_state::hopper_w));
+ map(0x02, 0x02).portr("DSW1");
+ map(0x03, 0x03).portr("DSW2");
+ map(0x88, 0x8b).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write));
+ map(0xa0, 0xa1).w("aysnd", FUNC(ay8910_device::address_data_w));
+ map(0xa2, 0xa2).r("aysnd", FUNC(ay8910_device::data_r));
+}
+
+
+/*************************************************
+* Input Ports Definitions *
+*************************************************/
+
+static INPUT_PORTS_START( tonton )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_Z) PORT_NAME("1. Pig")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_X) PORT_NAME("2. Penguin")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_C) PORT_NAME("3. Tiger")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_V) PORT_NAME("4. Cow")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_B) PORT_NAME("5. Bear")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_N) PORT_NAME("6. Elephant")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_CODE(KEYCODE_M) PORT_NAME("7. Lion")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_9) PORT_TOGGLE PORT_NAME("Bookkeeping")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Medal In")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_0) PORT_NAME("Reset Button")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("Unknown A")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(ticket_dispenser_device::line_r)) // hopper feedback
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x07, 0x03, "Coinage A (100 Yen)" ) PORT_DIPLOCATION("DSW1:1,2,3")
+ PORT_DIPSETTING( 0x02, "1 Coin / 3 Medal" )
+ PORT_DIPSETTING( 0x06, "1 Coin / 4 Medal" )
+ PORT_DIPSETTING( 0x01, "1 Coin / 5 Medal" )
+ PORT_DIPSETTING( 0x05, "1 Coin / 6 Medal" )
+ PORT_DIPSETTING( 0x03, "1 Coin / 10 Medal" )
+ PORT_DIPSETTING( 0x07, "1 Coin / 11 Medal" )
+ PORT_DIPSETTING( 0x04, "1 Coin / 20 Medal" )
+ PORT_DIPSETTING( 0x00, "1 Coin / 50 Medal" )
+ PORT_DIPNAME( 0x18, 0x18, "Coinage B (10 Yen)" ) PORT_DIPLOCATION("DSW1:4,5")
+ PORT_DIPSETTING( 0x00, "3 Coin / 1 Medal" )
+ PORT_DIPSETTING( 0x10, "2 Coin / 1 Medal" )
+ PORT_DIPSETTING( 0x18, "1 Coin / 1 Medal" )
+ PORT_DIPSETTING( 0x08, "1 Coin / 2 Medal" )
+ PORT_DIPNAME( 0x20, 0x20, "Service Coinage" ) PORT_DIPLOCATION("DSW1:6")
+ PORT_DIPSETTING( 0x20, "1 Pulse / 1 Medal" )
+ PORT_DIPSETTING( 0x00, "1 Pulse / 2 Medal" )
+ PORT_DIPNAME( 0x40, 0x40, "Coinage A Lock" ) PORT_DIPLOCATION("DSW1:7")
+ PORT_DIPSETTING( 0x40, "Unlocked" )
+ PORT_DIPSETTING( 0x00, "Locked" )
+ PORT_DIPNAME( 0x80, 0x80, "Payout Mode") PORT_DIPLOCATION("DSW1:8")
+ PORT_DIPSETTING( 0x80, "Manual" )
+ PORT_DIPSETTING( 0x00, "Automatic" )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x07, 0x03, "Percentage" ) PORT_DIPLOCATION("DSW2:1,2,3")
+ PORT_DIPSETTING( 0x07, "50%" )
+ PORT_DIPSETTING( 0x03, "60%" )
+ PORT_DIPSETTING( 0x05, "70%" )
+ PORT_DIPSETTING( 0x01, "75%" )
+ PORT_DIPSETTING( 0x06, "80%" )
+ PORT_DIPSETTING( 0x02, "85%" )
+ PORT_DIPSETTING( 0x04, "90%" )
+ PORT_DIPSETTING( 0x00, "95%" )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW2:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+INPUT_PORTS_END
+
+
+/*************************************************
+* R/W Handlers and Interrupt Routines *
+*************************************************/
+
+void tonton_state::ay_aout_w(uint8_t data)
+{
+ logerror("AY8910: Port A out: %02X\n", data);
+}
+
+void tonton_state::ay_bout_w(uint8_t data)
+{
+ logerror("AY8910: Port B out: %02X\n", data);
+}
+
+/*************************************************
+* Machine Driver *
+*************************************************/
+
+void tonton_state::tonton(machine_config &config)
+{
+ // basic machine hardware
+ Z80(config, m_maincpu, CPU_CLOCK); // Guess. According to other MSX2 based gambling games
+ m_maincpu->set_addrmap(AS_PROGRAM, &tonton_state::tonton_map);
+ m_maincpu->set_addrmap(AS_IO, &tonton_state::tonton_io);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ // video hardware
+ V9938(config, m_v9938, MAIN_CLOCK);
+ m_v9938->set_screen_ntsc("screen");
+ m_v9938->set_vram_size(0x20000);
+ m_v9938->int_cb().set_inputline(m_maincpu, 0);
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(HOPPER_PULSE));
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ ym2149_device &aysnd(YM2149(config, "aysnd", YM2149_CLOCK)); // Guess. According to other MSX2 based gambling games
+ /*
+ AY8910: Port A out: FF
+ AY8910: Port B out: FF
+ AY8910: Port A out: FF
+ AY8910: Port B out: FF
+ AY8910: Port A out: 00
+ AY8910: Port B out: 00
+ */
+ aysnd.port_a_write_callback().set(FUNC(tonton_state::ay_aout_w)); // Write all bits twice, and then reset them at boot
+ aysnd.port_b_write_callback().set(FUNC(tonton_state::ay_bout_w)); // Write all bits twice, and then reset them at boot
+ aysnd.add_route(ALL_OUTPUTS, "mono", 0.70);
+}
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( tonton )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "tonton.bin", 0x0000, 0x10000, CRC(6c9cacfb) SHA1(21afd5a40b785300b013ac8cb31f5e4f480657ef) )
+ROM_END
+
+} // anonymous namespace
+
+
+// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS
+GAME( 1987, tonton, 0, tonton, tonton, tonton_state, empty_init, ROT0, "Success / Taiyo Jidoki", "Waku Waku Doubutsu Land TonTon (Japan)", MACHINE_SUPPORTS_SAVE )