summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/phi.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/phi.h')
-rw-r--r--src/devices/machine/phi.h67
1 files changed, 51 insertions, 16 deletions
diff --git a/src/devices/machine/phi.h b/src/devices/machine/phi.h
index 6a1e9bfaad5..59b538e8fc8 100644
--- a/src/devices/machine/phi.h
+++ b/src/devices/machine/phi.h
@@ -49,6 +49,10 @@
#define MCFG_PHI_DMARQ_WRITE_CB(_write) \
downcast<phi_device &>(*device).set_dmarq_write_cb(DEVCB_##_write);
+// Set read callback for SYS_CNTRL signal
+#define MCFG_PHI_SYS_CNTRL_READ_CB(_read) \
+ downcast<phi_device &>(*device).set_sys_cntrl_read_cb(DEVCB_##_read);
+
class phi_device : public device_t
{
public:
@@ -68,11 +72,23 @@ public:
PHI_488_SIGNAL_COUNT
};
- template<class Object> devcb_base& set_dio_read_cb(Object &&cb) { return m_dio_read_func.set_callback(std::forward<Object>(cb)); }
- template<class Object> devcb_base& set_dio_write_cb(Object &&cb) { return m_dio_write_func.set_callback(std::forward<Object>(cb)); }
- template<class Object> devcb_base& set_488_signal_write_cb(phi_488_signal_t signal , Object &&cb) { return m_signal_wr_fns[ signal ].set_callback(std::forward<Object>(cb)); }
- template<class Object> devcb_base& set_int_write_cb(Object &&cb) { return m_int_write_func.set_callback(std::forward<Object>(cb)); }
- template<class Object> devcb_base& set_dmarq_write_cb(Object &&cb) { return m_dmarq_write_func.set_callback(std::forward<Object>(cb)); }
+ template <class Object> devcb_base& set_dio_read_cb(Object &&cb)
+ { return m_dio_read_func.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> devcb_base& set_dio_write_cb(Object &&cb)
+ { return m_dio_write_func.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> devcb_base& set_488_signal_write_cb(phi_488_signal_t signal , Object &&cb)
+ { return m_signal_wr_fns[ signal ].set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> devcb_base& set_int_write_cb(Object &&cb)
+ { return m_int_write_func.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> devcb_base& set_dmarq_write_cb(Object &&cb)
+ { return m_dmarq_write_func.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> devcb_base &set_sys_cntrl_read_cb(Object &&cb)
+ { return m_sys_cntrl_read_func.set_callback(std::forward<Object>(cb)); }
DECLARE_WRITE_LINE_MEMBER(eoi_w);
DECLARE_WRITE_LINE_MEMBER(dav_w);
@@ -83,6 +99,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(atn_w);
DECLARE_WRITE_LINE_MEMBER(ren_w);
+ DECLARE_WRITE8_MEMBER(bus_dio_w);
+
void set_ext_signal(phi_488_signal_t signal , int state);
// Register read/write
@@ -127,7 +145,7 @@ private:
devcb_write_line m_signal_wr_fns[ PHI_488_SIGNAL_COUNT ];
devcb_write_line m_int_write_func;
devcb_write_line m_dmarq_write_func;
-
+ devcb_read_line m_sys_cntrl_read_func;
bool m_int_line;
bool m_dmarq_line;
@@ -172,12 +190,11 @@ private:
PHI_T_SPAS,
PHI_T_TACS,
// The following are non-standard states for IDENTIFY sequencing
- PHI_T_ID1, // Untalked
- PHI_T_ID2, // Addressed by secondary address
- PHI_T_ID3, // Sending 1st byte
- PHI_T_ID4, // Waiting to send 2nd byte
- PHI_T_ID5, // Sending 2nd byte
- PHI_T_ID6 // 2nd byte sent, end of sequence
+ PHI_T_ID1, // Addressed by secondary address
+ PHI_T_ID2, // Sending 1st byte
+ PHI_T_ID3, // Waiting to send 2nd byte
+ PHI_T_ID4, // Sending 2nd byte
+ PHI_T_ID5 // 2nd byte sent, end of sequence
};
int m_t_state;
@@ -201,6 +218,9 @@ private:
int m_sr_state;
+ // RL (Remote Local) states
+ bool m_rl_rems; // false: LOCS, true: REMS
+
// PP (Parallel poll) states
enum {
PHI_PP_PPIS,
@@ -209,7 +229,6 @@ private:
};
int m_pp_state;
- bool m_pp_pacs;
uint8_t m_ppr_msg;
bool m_s_sense;
@@ -218,7 +237,6 @@ private:
PHI_C_CIDS,
PHI_C_CADS,
PHI_C_CACS,
- PHI_C_CPWS,
PHI_C_CPPS,
PHI_C_CSBS,
PHI_C_CSHS,
@@ -228,6 +246,18 @@ private:
};
int m_c_state;
+
+ // Secondary address decoder states
+ enum {
+ PHI_SA_NONE,
+ PHI_SA_PACS,
+ PHI_SA_TPAS,
+ PHI_SA_LPAS,
+ PHI_SA_UNT
+ };
+
+ int m_sa_state;
+
uint8_t m_be_counter;
uint16_t m_reg_status;
uint16_t m_reg_int_cond;
@@ -244,8 +274,8 @@ private:
NBA_CMD_FROM_OFIFO,
NBA_BYTE_FROM_OFIFO,
NBA_FROM_SPAS,
- NBA_FROM_ID3,
- NBA_FROM_ID5
+ NBA_FROM_ID2,
+ NBA_FROM_ID4
} nba_origin_t;
int m_nba_origin;
@@ -275,7 +305,12 @@ private:
uint8_t my_address(void) const;
bool tcs_msg(void) const;
bool rpp_msg(void) const;
+ uint8_t get_pp_response();
bool controller_in_charge(void) const;
+ void configure_pp_response();
+ void update_pp();
+ void update_interrupt();
+ void update_dmarq();
};
// device type definition