summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/i8291a.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/i8291a.cpp')
-rw-r--r--src/devices/machine/i8291a.cpp183
1 files changed, 116 insertions, 67 deletions
diff --git a/src/devices/machine/i8291a.cpp b/src/devices/machine/i8291a.cpp
index f676617e581..c2b396fe43b 100644
--- a/src/devices/machine/i8291a.cpp
+++ b/src/devices/machine/i8291a.cpp
@@ -38,17 +38,73 @@ ALLOW_SAVE_TYPE(i8291a_device::acceptor_handshake_state);
i8291a_device::i8291a_device(const machine_config &mconfig, const char *tag,
device_t *owner, uint32_t clock) :
- device_t{mconfig, I8291A, tag, owner, clock},
- m_int_write_func{*this},
- m_dreq_write_func{*this},
- m_trig_write_func{*this},
- m_eoi_write_func{*this},
- m_dav_write_func{*this},
- m_nrfd_write_func{*this},
- m_ndac_write_func{*this},
- m_srq_write_func{*this},
- m_dio_write_func{*this},
- m_dio_read_func{*this}
+ device_t{mconfig, I8291A, tag, owner, clock},
+ m_int_write_func{*this},
+ m_dreq_write_func{*this},
+ m_trig_write_func{*this},
+ m_eoi_write_func{*this},
+ m_dav_write_func{*this},
+ m_nrfd_write_func{*this},
+ m_ndac_write_func{*this},
+ m_srq_write_func{*this},
+ m_dio_write_func{*this},
+ m_dio_read_func{*this, 0xff},
+ m_din{0},
+ m_dout{0},
+ m_ints1{0},
+ m_ints2{0},
+ m_ie1{0},
+ m_ie2{0},
+ m_address0{0},
+ m_address1{0},
+ m_eos{0},
+ m_spoll_mode{0},
+ m_address_mode{0},
+ m_address_status{0},
+ m_cpt{0},
+ m_auxa{0},
+ m_auxb{0},
+ m_atn{false},
+ m_ren{false},
+ m_nrfd{false},
+ m_ndac{false},
+ m_dav{false},
+ m_srq{false},
+ m_ifc{false},
+ m_eoi{false},
+ m_dio{0},
+ m_nrfd_out{false},
+ m_ndac_out{false},
+ m_dav_out{false},
+ m_srq_out{false},
+ m_eoi_out{false},
+ m_pon{false},
+ m_rdy{false},
+ m_lpe{false},
+ m_ist{false},
+ m_rtl{false},
+ m_apt_flag{false},
+ m_cpt_flag{false},
+ m_din_flag{false},
+ m_nba{false},
+ m_pp_sense{false},
+ m_pp_line{0},
+ m_send_eoi{false},
+ m_sh_state{source_handshake_state::SIDS},
+ m_ah_state{acceptor_handshake_state::AIDS},
+ m_t_state{talker_state::TIDS},
+ m_tp_state{talker_primary_state::TPIS},
+ m_tsp_state{talker_serial_poll_state::SPIS},
+ m_l_state{listener_state::LIDS},
+ m_lp_state{listener_primary_state::LPIS},
+ m_rl_state{remote_local_state::LOCS},
+ m_pp_state{parallel_poll_state::PPIS},
+ m_dc_state{device_clear_state::DCIS},
+ m_dt_state{device_trigger_state::DTIS},
+ m_state_changed(false),
+ m_ignore_ext_signals(false),
+ m_intr_out(false),
+ m_dreq_out(false)
{
}
@@ -88,16 +144,6 @@ void i8291a_device::device_reset()
void i8291a_device::device_start()
{
- m_int_write_func.resolve_safe();
- m_dreq_write_func.resolve_safe();
- m_dav_write_func.resolve_safe();
- m_nrfd_write_func.resolve_safe();
- m_ndac_write_func.resolve_safe();
- m_eoi_write_func.resolve_safe();
- m_srq_write_func.resolve_safe();
- m_dio_read_func.resolve_safe(0xff);
- m_dio_write_func.resolve_safe();
-
save_item(NAME(m_din));
save_item(NAME(m_dout));
save_item(NAME(m_ints1));
@@ -155,7 +201,7 @@ void i8291a_device::device_start()
save_item(NAME(m_dt_state));
}
-READ8_MEMBER(i8291a_device::din_r)
+uint8_t i8291a_device::din_r()
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, m_din);
if (!machine().side_effects_disabled()) {
@@ -196,12 +242,12 @@ void i8291a_device::update_int()
if (m_intr_out != intr) {
LOGMASKED(LOG_INT, "%s: intr %s\n", __FUNCTION__, intr ? "true" : "false");
- m_int_write_func(intr);
+ m_int_write_func(intr != bool(m_auxb & REG_AUXB_INT_ACTIVE_LOW));
m_intr_out = intr;
}
}
-READ8_MEMBER(i8291a_device::ints1_r)
+uint8_t i8291a_device::ints1_r()
{
uint8_t ret = m_ints1;
@@ -213,7 +259,7 @@ READ8_MEMBER(i8291a_device::ints1_r)
return ret;
}
-READ8_MEMBER(i8291a_device::ints2_r)
+uint8_t i8291a_device::ints2_r()
{
uint8_t ret = m_ints2;
@@ -225,13 +271,13 @@ READ8_MEMBER(i8291a_device::ints2_r)
return ret;
}
-READ8_MEMBER(i8291a_device::spoll_stat_r)
+uint8_t i8291a_device::spoll_stat_r()
{
LOGMASKED(LOG_REG, "%s\n", __FUNCTION__);
return 0;
}
-READ8_MEMBER(i8291a_device::addr_stat_r)
+uint8_t i8291a_device::addr_stat_r()
{
if (!(m_address_status & 0xfe))
m_address_status = 0;
@@ -240,25 +286,25 @@ READ8_MEMBER(i8291a_device::addr_stat_r)
return m_address_status;
}
-READ8_MEMBER(i8291a_device::cpt_r)
+uint8_t i8291a_device::cpt_r()
{
LOGMASKED(LOG_REG, "%s\n", __FUNCTION__);
return m_cpt;
}
-READ8_MEMBER(i8291a_device::addr0_r)
+uint8_t i8291a_device::addr0_r()
{
//LOGMASKED(LOG_REG, "%s = %02X\n", __FUNCTION__, m_address0);
return m_address0;
}
-READ8_MEMBER(i8291a_device::addr1_r)
+uint8_t i8291a_device::addr1_r()
{
LOGMASKED(LOG_REG, "%s = %02X\n", __FUNCTION__, m_address1);
return m_address1;
}
-WRITE8_MEMBER(i8291a_device::dout_w)
+void i8291a_device::dout_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
if (m_nba)
@@ -268,35 +314,35 @@ WRITE8_MEMBER(i8291a_device::dout_w)
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::ie1_w)
+void i8291a_device::ie1_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
m_ie1 = data;
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::ie2_w)
+void i8291a_device::ie2_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
m_ie2 = data;
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::spoll_mode_w)
+void i8291a_device::spoll_mode_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
m_spoll_mode = data;
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::addr_mode_w)
+void i8291a_device::addr_mode_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
m_address_mode = data & 3;
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::aux_mode_w)
+void i8291a_device::aux_mode_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
switch (data >> 5) {
@@ -376,32 +422,35 @@ WRITE8_MEMBER(i8291a_device::aux_mode_w)
device_reset();
break;
}
- case 1:
- /* preset internal clock counter */
- break;
- case 4:
- LOGMASKED(LOG_REG, "AUXA = %02X\n", data & 0x1f);
- /* AUXA write */
- m_auxa = data;
- break;
- case 5:
- LOGMASKED(LOG_REG, "AUXB = %02X\n", data & 0x1f);
- m_auxb = data;
- break;
- case 3:
- LOGMASKED(LOG_REG, "PPOLL %s (line %d)\n", (data & 0x10) ? "disable" : "enable", data & 7);
- m_lpe = !!!(data & 0x10);
- m_pp_sense = data & 0x08;
- m_pp_line = data & 7;
- break;
- default:
- break;
-
+ break;
+ case 1:
+ /* preset internal clock counter */
+ break;
+ case 4:
+ LOGMASKED(LOG_REG, "AUXA = %02X\n", data & 0x1f);
+ /* AUXA write */
+ m_auxa = data;
+ break;
+ case 5:
+ LOGMASKED(LOG_REG, "AUXB = %02X\n", data & 0x1f);
+ // force interrupt line update if polarity is changed
+ if ((data ^ m_auxb) & REG_AUXB_INT_ACTIVE_LOW)
+ m_intr_out = !m_intr_out;
+ m_auxb = data;
+ break;
+ case 3:
+ LOGMASKED(LOG_REG, "PPOLL %s (line %d)\n", (data & 0x10) ? "disable" : "enable", data & 7);
+ m_lpe = !!!(data & 0x10);
+ m_pp_sense = data & 0x08;
+ m_pp_line = data & 7;
+ break;
+ default:
+ break;
}
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::addr01_w)
+void i8291a_device::addr01_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
if (data & REG_ADDRESS01_ARS)
@@ -411,56 +460,56 @@ WRITE8_MEMBER(i8291a_device::addr01_w)
run_fsm();
}
-WRITE8_MEMBER(i8291a_device::eos_w)
+void i8291a_device::eos_w(uint8_t data)
{
LOGMASKED(LOG_REG, "%s: %02X\n", __FUNCTION__, data);
m_eos = data;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::nrfd_w)
+void i8291a_device::nrfd_w(int state)
{
m_nrfd = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::ndac_w)
+void i8291a_device::ndac_w(int state)
{
m_ndac = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::dav_w)
+void i8291a_device::dav_w(int state)
{
m_dav = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::eoi_w)
+void i8291a_device::eoi_w(int state)
{
m_eoi = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::srq_w)
+void i8291a_device::srq_w(int state)
{
m_srq = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::ifc_w)
+void i8291a_device::ifc_w(int state)
{
m_ifc = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::atn_w)
+void i8291a_device::atn_w(int state)
{
m_atn = !state;
run_fsm();
}
-WRITE_LINE_MEMBER(i8291a_device::ren_w)
+void i8291a_device::ren_w(int state)
{
m_ren = !state;
run_fsm();