diff --git a/hash/sitcom.xml b/hash/sitcom.xml
index 52bdcc2feb9..c5cc461799c 100644
--- a/hash/sitcom.xml
+++ b/hash/sitcom.xml
@@ -7,7 +7,7 @@
San
2002
San Bergmans
-
+
@@ -18,30 +18,41 @@
Flash 1
2002
Izabella Malcolm
-
+
+
+ Camera Shutter Speed Timer
+ 2002
+ Izabella Malcolm
+
+
+
+
+
+
+
Lesson 1
2002
Izabella Malcolm
-
-
+
+
-
-
+
+
-
-
+
+
@@ -51,23 +62,23 @@
2002
Izabella Malcolm
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -77,23 +88,23 @@
2002
Izabella Malcolm
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -103,23 +114,54 @@
2002
Izabella Malcolm
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+ Lesson 5
+ 2002
+ Izabella Malcolm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mame/drivers/sitcom.cpp b/src/mame/drivers/sitcom.cpp
index 73db2ef3df9..468737ba611 100644
--- a/src/mame/drivers/sitcom.cpp
+++ b/src/mame/drivers/sitcom.cpp
@@ -45,6 +45,9 @@
#include "softlist_dev.h"
#include "sitcom.lh"
+#include "sitcomtmr.lh"
+
+#include
namespace {
@@ -66,10 +69,10 @@ public:
DECLARE_WRITE_LINE_MEMBER(sod_led) { output().set_value("sod_led", state); }
DECLARE_READ_LINE_MEMBER(sid_line) { return m_rxd ? 1 : 0; }
- DECLARE_WRITE8_MEMBER(update_pia_pa);
- DECLARE_WRITE8_MEMBER(update_pia_pb);
+ virtual DECLARE_WRITE8_MEMBER(update_pia_pa);
+ virtual DECLARE_WRITE8_MEMBER(update_pia_pb);
- DECLARE_INPUT_CHANGED_MEMBER(buttons);
+ DECLARE_INPUT_CHANGED_MEMBER(update_buttons);
protected:
virtual void machine_start() override;
@@ -82,15 +85,60 @@ protected:
bool m_rxd;
};
+
+class sitcom_timer_state : public sitcom_state
+{
+public:
+ enum
+ {
+ TIMER_SHUTTER
+ };
+
+ sitcom_timer_state(const machine_config &mconfig, device_type type, const char *tag)
+ : sitcom_state(mconfig, type, tag)
+ , m_speed(*this, "SPEED")
+ , m_pia(*this, "pia")
+ , m_ds2(*this, "ds2")
+ , m_shutter_timer(nullptr)
+ , m_shutter(false)
+ , m_dac_cs(true)
+ , m_dac_wr(true)
+ {
+ }
+
+ virtual DECLARE_WRITE8_MEMBER(update_pia_pa) override;
+ virtual DECLARE_WRITE8_MEMBER(update_pia_pb) override;
+ DECLARE_READ_LINE_MEMBER(shutter_r);
+
+ DECLARE_INPUT_CHANGED_MEMBER(update_shutter);
+
+protected:
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void update_dac(uint8_t value);
+
+ required_ioport m_speed;
+ required_device m_pia;
+ required_device m_ds2;
+ emu_timer *m_shutter_timer;
+
+ bool m_shutter;
+ bool m_dac_cs, m_dac_wr;
+};
+
+
ADDRESS_MAP_START( sitcom_bank, AS_PROGRAM, 8, sitcom_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION("maincpu", 0)
+ AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION("bootstrap", 0)
AM_RANGE(0x8000, 0xffff) AM_RAM AM_SHARE("ram")
ADDRESS_MAP_END
ADDRESS_MAP_START( sitcom_mem, AS_PROGRAM, 8, sitcom_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x07ff) AM_DEVICE("bank", address_map_bank_device, amap8)
+ AM_RANGE(0x0000, 0x7fff) AM_DEVICE("bank", address_map_bank_device, amap8)
AM_RANGE(0x8000, 0xffff) AM_RAM AM_SHARE("ram")
ADDRESS_MAP_END
@@ -105,8 +153,43 @@ ADDRESS_MAP_END
INPUT_PORTS_START( sitcom )
PORT_START("BUTTONS")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Boot") PORT_CHANGED_MEMBER(DEVICE_SELF, sitcom_state, buttons, 0)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, sitcom_state, buttons, 0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Boot") PORT_CHANGED_MEMBER(DEVICE_SELF, sitcom_state, update_buttons, 0)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, sitcom_state, update_buttons, 0)
+
+ PORT_START("PORTC")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("0") PORT_CODE(KEYCODE_0)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("1") PORT_CODE(KEYCODE_1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("2") PORT_CODE(KEYCODE_2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("3") PORT_CODE(KEYCODE_3)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("4") PORT_CODE(KEYCODE_4)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("5") PORT_CODE(KEYCODE_5)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("6") PORT_CODE(KEYCODE_6)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("7") PORT_CODE(KEYCODE_7)
+INPUT_PORTS_END
+
+INPUT_PORTS_START( sitcomtmr )
+ PORT_INCLUDE(sitcom)
+
+ PORT_MODIFY("BUTTONS")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Shutter") PORT_CHANGED_MEMBER(DEVICE_SELF, sitcom_timer_state, update_shutter, 0)
+
+ PORT_MODIFY("PORTC")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Grey")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Blue")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, sitcom_timer_state, shutter_r)
+ PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("SPEED")
+ PORT_CONFNAME(0xff, 0x1e, "Shutter Speed")
+ PORT_CONFSETTING(0x00, "B")
+ PORT_CONFSETTING(0x01, "1")
+ PORT_CONFSETTING(0x02, "1/2")
+ PORT_CONFSETTING(0x04, "1/4")
+ PORT_CONFSETTING(0x08, "1/8")
+ PORT_CONFSETTING(0x0f, "1/15")
+ PORT_CONFSETTING(0x1e, "1/30")
+ PORT_CONFSETTING(0x3c, "1/60")
+ PORT_CONFSETTING(0x7d, "1/125")
INPUT_PORTS_END
@@ -134,7 +217,7 @@ WRITE8_MEMBER( sitcom_state::update_pia_pb )
output().set_indexed_value("pb", i, BIT(data, i));
}
-INPUT_CHANGED_MEMBER( sitcom_state::buttons )
+INPUT_CHANGED_MEMBER( sitcom_state::update_buttons )
{
bool const boot(BIT(m_buttons->read(), 0));
bool const reset(BIT(m_buttons->read(), 1));
@@ -148,6 +231,91 @@ INPUT_CHANGED_MEMBER( sitcom_state::buttons )
}
+WRITE8_MEMBER( sitcom_timer_state::update_pia_pa )
+{
+ if (!m_dac_cs && !m_dac_wr)
+ update_dac(data);
+
+ m_ds2->data_w(data & 0x7f);
+}
+
+WRITE8_MEMBER( sitcom_timer_state::update_pia_pb )
+{
+ if (!m_dac_cs && !BIT(data, 0))
+ update_dac(m_pia->pa_r());
+ m_dac_wr = BIT(data, 0);
+ m_dac_cs = BIT(data, 1);
+
+ m_ds2->wr_w(BIT(data, 2));
+ m_ds2->addr_w(bitswap<2>(data, 3, 4));
+ output().set_value("test_led", BIT(data, 5));
+}
+
+READ_LINE_MEMBER( sitcom_timer_state::shutter_r )
+{
+ return m_shutter ? 0 : 1;
+}
+
+INPUT_CHANGED_MEMBER( sitcom_timer_state::update_shutter )
+{
+ ioport_value const speed(m_speed->read());
+ if (!speed)
+ {
+ m_shutter = bool(newval);
+ }
+ else if (!m_shutter && newval)
+ {
+ m_shutter = true;
+ m_shutter_timer->adjust(attotime::from_hz(speed));
+ }
+}
+
+void sitcom_timer_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_SHUTTER:
+ m_shutter = false;
+ break;
+ default:
+ sitcom_state::device_timer(timer, id, param, ptr);
+ }
+}
+
+void sitcom_timer_state::machine_start()
+{
+ sitcom_state::machine_start();
+
+ m_shutter_timer = timer_alloc(TIMER_SHUTTER);
+
+ save_item(NAME(m_shutter));
+ save_item(NAME(m_dac_cs));
+ save_item(NAME(m_dac_wr));
+
+ m_shutter = false;
+ m_dac_cs = true;
+ m_dac_wr = true;
+}
+
+void sitcom_timer_state::machine_reset()
+{
+ sitcom_state::machine_reset();
+
+ m_ds2->ce_w(0);
+}
+
+void sitcom_timer_state::update_dac(uint8_t value)
+{
+ // supposed to be a DAC and an analog meter, but that's hard to do with internal layouts
+ constexpr u8 s_7seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
+ output().set_digit_value(12, s_7seg[value % 10]);
+ value /= 10;
+ output().set_digit_value(13, s_7seg[value % 10]);
+ value /= 10;
+ output().set_digit_value(14, s_7seg[value % 10] | 0x80);
+}
+
+
MACHINE_CONFIG_START( sitcom, sitcom_state )
// basic machine hardware
MCFG_CPU_ADD("maincpu", I8085A, XTAL_6_144MHz) // 3.072MHz can be used for an old slow 8085
@@ -169,6 +337,7 @@ MACHINE_CONFIG_START( sitcom, sitcom_state )
MCFG_DEVICE_ADD("pia", I8255, 0)
MCFG_I8255_OUT_PORTA_CB(WRITE8(sitcom_state, update_pia_pa))
MCFG_I8255_OUT_PORTB_CB(WRITE8(sitcom_state, update_pia_pb))
+ MCFG_I8255_IN_PORTC_CB(IOPORT("PORTC"))
// video hardware
MCFG_DEVICE_ADD("ds0", DL1414T, 0) // left display
@@ -185,8 +354,21 @@ MACHINE_CONFIG_START( sitcom, sitcom_state )
MACHINE_CONFIG_END
+MACHINE_CONFIG_DERIVED_CLASS( sitcomtmr, sitcom, sitcom_timer_state )
+ MCFG_DEVICE_ADD("ds2", DL1414T, 0) // remote display
+ MCFG_DL1414_UPDATE_HANDLER(WRITE16(sitcom_state, update_ds<2>))
+
+ MCFG_DEFAULT_LAYOUT(layout_sitcomtmr)
+MACHINE_CONFIG_END
+
+
ROM_START( sitcom )
- ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x8000, "bootstrap", ROMREGION_ERASEFF )
+ ROM_LOAD( "boot8085.bin", 0x0000, 0x06b8, CRC(1b5e3310) SHA1(3323b65f0c10b7ab6bb75ec824e6d5fb643693a8) )
+ROM_END
+
+ROM_START( sitcomtmr )
+ ROM_REGION( 0x8000, "bootstrap", ROMREGION_ERASEFF )
ROM_LOAD( "boot8085.bin", 0x0000, 0x06b8, CRC(1b5e3310) SHA1(3323b65f0c10b7ab6bb75ec824e6d5fb643693a8) )
ROM_END
@@ -195,5 +377,6 @@ ROM_END
/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
-COMP( 2002, sitcom, 0, 0, sitcom, sitcom, driver_device, 0, "San Bergmans & Izabella Malcolm", "Sitcom", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
+COMP( 2002, sitcom, 0, 0, sitcom, sitcom, driver_device, 0, "San Bergmans & Izabella Malcolm", "Sitcom", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW)
+COMP( 2002, sitcomtmr, sitcom, 0, sitcomtmr, sitcomtmr, driver_device, 0, "San Bergmans & Izabella Malcolm", "Sitcom Timer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW)
diff --git a/src/mame/layout/sitcom.lay b/src/mame/layout/sitcom.lay
index 4a6720ea3ae..b7e11f6460a 100644
--- a/src/mame/layout/sitcom.lay
+++ b/src/mame/layout/sitcom.lay
@@ -40,7 +40,7 @@
-
+
diff --git a/src/mame/layout/sitcomtmr.lay b/src/mame/layout/sitcomtmr.lay
new file mode 100644
index 00000000000..b13f2d0172b
--- /dev/null
+++ b/src/mame/layout/sitcomtmr.lay
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 7b82302aa69..d7a6bb4cb06 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -33732,6 +33732,7 @@ simpsons4pa // GX072 (c) 1991
@source:sitcom.cpp
sitcom //
+sitcomtmr //
@source:skeetsht.cpp
popshot // (c) 1991 (prototype)