summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/tamag1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/tamag1.c')
-rw-r--r--src/mame/drivers/tamag1.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/mame/drivers/tamag1.c b/src/mame/drivers/tamag1.c
new file mode 100644
index 00000000000..7b0a73509a5
--- /dev/null
+++ b/src/mame/drivers/tamag1.c
@@ -0,0 +1,170 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+ Bandai Tamagotchi generation 1 hardware
+ * PCB label TMG-M1
+ * Seiko Epson E0C6S46 MCU under epoxy
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/e0c6200/e0c6s46.h"
+#include "sound/speaker.h"
+
+#include "tama.lh"
+
+
+class tamag1_state : public driver_device
+{
+public:
+ tamag1_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_speaker(*this, "speaker")
+ { }
+
+ required_device<e0c6s46_device> m_maincpu;
+ required_device<speaker_sound_device> m_speaker;
+
+ DECLARE_WRITE8_MEMBER(speaker_w);
+
+ DECLARE_PALETTE_INIT(tama);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+};
+
+
+/***************************************************************************
+
+ Video
+
+***************************************************************************/
+
+static E0C6S46_PIXEL_UPDATE_CB(tama_pixel_update)
+{
+ // 16 COM(common) pins, 40 SEG(segment) pins from MCU,
+ // 32x16 LCD screen:
+ static const int seg2x[0x28] =
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 35, 8, 9,10,11,12,13,14,
+ 15,34,33,32,31,30,29,28,
+ 27,26,25,24,36,23,22,21,
+ 20,19,18,17,16,37,38,39
+ };
+
+ int y = com, x = seg2x[seg];
+ if (cliprect.contains(x, y))
+ bitmap.pix16(y, x) = state;
+
+ // 2 rows of indicators:
+ // above screen: 0:meal, 1:lamp, 2:play, 3:medicine
+ // under screen: 4:bath, 5:scales, 6:shout, 7:attention
+
+ // they are on pin SEG8(x=35) + COM0-3, pin SEG28(x=36) + COM12-15
+ if (x == 35 && y < 4)
+ output_set_lamp_value(y, state);
+ else if (x == 36 && y >= 12)
+ output_set_lamp_value(y-8, state);
+
+ // output for svg2lay
+ char buf[0x10];
+ sprintf(buf, "%d.%d", y, x);
+ output_set_value(buf, state);
+}
+
+PALETTE_INIT_MEMBER(tamag1_state, tama)
+{
+ palette.set_pen_color(0, rgb_t(0xf1, 0xf0, 0xf9)); // background
+ palette.set_pen_color(1, rgb_t(0x3c, 0x38, 0x38)); // lcd pixel
+}
+
+
+
+/***************************************************************************
+
+ I/O
+
+***************************************************************************/
+
+WRITE8_MEMBER(tamag1_state::speaker_w)
+{
+ // R43: speaker out
+ m_speaker->level_w(data >> 3 & 1);
+}
+
+
+
+/***************************************************************************
+
+ Inputs
+
+***************************************************************************/
+
+INPUT_CHANGED_MEMBER(tamag1_state::input_changed)
+{
+ // inputs are hooked up backwards here, because MCU input
+ // ports are all tied to its interrupt controller
+ int line = (int)(FPTR)param;
+ int state = newval ? ASSERT_LINE : CLEAR_LINE;
+ m_maincpu->set_input_line(line, state);
+}
+
+static INPUT_PORTS_START( tama )
+ PORT_START("K0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K00)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K01)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K02)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
+/***************************************************************************
+
+ Machine Config
+
+***************************************************************************/
+
+static MACHINE_CONFIG_START( tama, tamag1_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", E0C6S46, XTAL_32_768kHz)
+ MCFG_E0C6S46_PIXEL_UPDATE_CB(tama_pixel_update)
+ MCFG_E0C6S46_WRITE_R_CB(4, WRITE8(tamag1_state, speaker_w))
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", LCD)
+ MCFG_SCREEN_REFRESH_RATE(XTAL_32_768kHz/1024)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(40, 16)
+ MCFG_SCREEN_VISIBLE_AREA(0, 32-1, 0, 16-1)
+ MCFG_DEFAULT_LAYOUT(layout_tama)
+ MCFG_SCREEN_UPDATE_DEVICE("maincpu", e0c6s46_device, screen_update)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_PALETTE_ADD("palette", 2)
+ MCFG_PALETTE_INIT_OWNER(tamag1_state, tama)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( tama )
+ ROM_REGION( 0x3000, "maincpu", 0 )
+ ROM_LOAD( "test.b", 0x0000, 0x3000, CRC(4372220e) SHA1(6e13d015113e16198c0059b9d0c38d7027ae7324) ) // this rom is on the die too, test pin enables it?
+ ROM_LOAD( "tama.b", 0x0000, 0x3000, CRC(5c864cb1) SHA1(4b4979cf92dc9d2fb6d7295a38f209f3da144f72) )
+ROM_END
+
+
+CONS( 1997, tama, 0, 0, tama, tama, driver_device, 0, "Bandai", "Tamagotchi (USA)", MACHINE_SUPPORTS_SAVE )