summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/controlid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/controlid.cpp')
-rw-r--r--src/mame/drivers/controlid.cpp69
1 files changed, 50 insertions, 19 deletions
diff --git a/src/mame/drivers/controlid.cpp b/src/mame/drivers/controlid.cpp
index 79e1bbcde32..5308bfbc65e 100644
--- a/src/mame/drivers/controlid.cpp
+++ b/src/mame/drivers/controlid.cpp
@@ -44,54 +44,83 @@ public:
void controlidx628(machine_config &config);
private:
+ virtual void machine_start() override;
+
DECLARE_WRITE8_MEMBER(p0_w);
+ DECLARE_READ8_MEMBER(p1_r);
DECLARE_WRITE8_MEMBER(p1_w);
+ DECLARE_READ8_MEMBER(p2_r);
+ DECLARE_READ8_MEMBER(p3_r);
DECLARE_WRITE8_MEMBER(p3_w);
DECLARE_PALETTE_INIT(controlidx628);
void io_map(address_map &map);
- void prog_map(address_map &map);
required_device<nt7534_device> m_lcdc;
- uint8_t p0_data;
- uint8_t p1_data;
- uint8_t p3_data;
+ uint8_t m_p0_data;
+ uint8_t m_p1_data;
+ uint8_t m_p3_data;
};
+void controlidx628_state::machine_start()
+{
+ m_p0_data = 0xff;
+ m_p1_data = 0xff;
+ m_p3_data = 0xff;
+
+ save_item(NAME(m_p0_data));
+ save_item(NAME(m_p1_data));
+ save_item(NAME(m_p3_data));
+}
+
/*************************
* Memory map information *
*************************/
-void controlidx628_state::prog_map(address_map &map)
-{
- map(0x0000, 0x1fff).rom();
-}
-
void controlidx628_state::io_map(address_map &map)
{
map(0x8000, 0xffff).ram();
}
-WRITE8_MEMBER( controlidx628_state::p0_w )
+WRITE8_MEMBER(controlidx628_state::p0_w)
{
- p0_data = data;
+ m_p0_data = data;
}
-WRITE8_MEMBER( controlidx628_state::p1_w )
+READ8_MEMBER(controlidx628_state::p1_r)
{
- if ((BIT(p1_data, 6) == 0) && (BIT(data, 6) == 1)) // on raising-edge of bit 6
+ // P1.1 is used for serial I/O; P1.4 and P1.5 are also used bidirectionally
+ return 0xcd;
+}
+
+WRITE8_MEMBER(controlidx628_state::p1_w)
+{
+ if ((BIT(m_p1_data, 6) == 0) && (BIT(data, 6) == 1)) // on raising-edge of bit 6
{
- m_lcdc->write(space, BIT(data, 7), p0_data);
+ m_lcdc->write(space, BIT(data, 7), m_p0_data);
}
- p1_data = data;
+ // P1.0 is also used as a serial I/O clock
+ m_p1_data = data;
+}
+
+READ8_MEMBER(controlidx628_state::p2_r)
+{
+ // Low nibble used for input
+ return 0xf0;
+}
+
+READ8_MEMBER(controlidx628_state::p3_r)
+{
+ // P3.3 (INT1) and P3.4 (T0) used bidirectionally
+ return 0xff;
}
-WRITE8_MEMBER( controlidx628_state::p3_w )
+WRITE8_MEMBER(controlidx628_state::p3_w)
{
- p3_data = data;
+ m_p3_data = data;
}
/*************************
@@ -115,11 +144,13 @@ PALETTE_INIT_MEMBER(controlidx628_state, controlidx628)
MACHINE_CONFIG_START(controlidx628_state::controlidx628)
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", I80C32, XTAL(11'059'200)) // Actually the board has an Atmel AT89S52 MCU.
- MCFG_DEVICE_PROGRAM_MAP(prog_map)
+ MCFG_DEVICE_ADD("maincpu", AT89S52, XTAL(11'059'200))
MCFG_DEVICE_IO_MAP(io_map)
MCFG_MCS51_PORT_P0_OUT_CB(WRITE8(*this, controlidx628_state, p0_w))
+ MCFG_MCS51_PORT_P1_IN_CB(READ8(*this, controlidx628_state, p1_r))
MCFG_MCS51_PORT_P1_OUT_CB(WRITE8(*this, controlidx628_state, p1_w))
+ MCFG_MCS51_PORT_P2_IN_CB(READ8(*this, controlidx628_state, p2_r))
+ MCFG_MCS51_PORT_P3_IN_CB(READ8(*this, controlidx628_state, p3_r))
MCFG_MCS51_PORT_P3_OUT_CB(WRITE8(*this, controlidx628_state, p3_w))
// video hardware