summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sm510/sm510.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/sm510/sm510.h')
-rw-r--r--src/devices/cpu/sm510/sm510.h79
1 files changed, 26 insertions, 53 deletions
diff --git a/src/devices/cpu/sm510/sm510.h b/src/devices/cpu/sm510/sm510.h
index 986381dd63c..6cf7ef24411 100644
--- a/src/devices/cpu/sm510/sm510.h
+++ b/src/devices/cpu/sm510/sm510.h
@@ -13,55 +13,12 @@
// I/O ports setup
-// 4-bit K input port (pull-down)
-#define MCFG_SM510_READ_K_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_read_k_callback(DEVCB_##_devcb);
// when in halt state, any K input going High can wake up the CPU,
// driver is required to use set_input_line(SM510_INPUT_LINE_K, state)
#define SM510_INPUT_LINE_K 0
-// 1-bit BA(aka alpha) input pin (pull-up)
-#define MCFG_SM510_READ_BA_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_read_ba_callback(DEVCB_##_devcb);
-
-// 1-bit B(beta) input pin (pull-up)
-#define MCFG_SM510_READ_B_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_read_b_callback(DEVCB_##_devcb);
-
-// 8-bit S strobe output port
-#define MCFG_SM510_WRITE_S_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_s_callback(DEVCB_##_devcb);
-
-// 1/2/4-bit R (buzzer/melody) output port
-#define MCFG_SM510_WRITE_R_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_r_callback(DEVCB_##_devcb);
-// For SM510, SM500, SM5A, R port output is selected with a mask option,
-// either from the divider or direct contol. Documented options are:
-// SM510/SM5A: control, 2(4096Hz meant for alarm sound)
-// SM500: 14, 11, 3 (divider f1, f4, f12)
-#define MCFG_SM510_R_MASK_OPTION(_bit) \
- downcast<sm510_base_device &>(*device).set_r_mask_option(_bit);
#define SM510_R_CONTROL_OUTPUT -1
-// LCD segment outputs: H1-4 as offset(low), a/b/c 1-16 as data d0-d15
-#define MCFG_SM510_WRITE_SEGA_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_sega_callback(DEVCB_##_devcb);
-#define MCFG_SM510_WRITE_SEGB_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_segb_callback(DEVCB_##_devcb);
-#define MCFG_SM510_WRITE_SEGC_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_segc_callback(DEVCB_##_devcb);
-
-// LCD bs output: same as above, but only up to 2 bits used
-#define MCFG_SM510_WRITE_SEGBS_CB(_devcb) \
- downcast<sm510_base_device &>(*device).set_write_segbs_callback(DEVCB_##_devcb);
-
-// LCD output lazy combination
-#define MCFG_SM510_WRITE_SEGS_CB(_devcb) \
- MCFG_SM510_WRITE_SEGA_CB(_devcb) \
- MCFG_SM510_WRITE_SEGB_CB(_devcb) \
- MCFG_SM510_WRITE_SEGC_CB(_devcb) \
- MCFG_SM510_WRITE_SEGBS_CB(_devcb)
-
// ACL input pin
#define SM510_INPUT_LINE_ACL INPUT_LINE_RESET
@@ -125,18 +82,34 @@ public:
, m_write_r(*this)
{ }
- // configuration helpers
- template <class Object> devcb_base &set_read_k_callback(Object &&cb) { return m_read_k.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_read_ba_callback(Object &&cb) { return m_read_ba.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_read_b_callback(Object &&cb) { return m_read_b.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_s_callback(Object &&cb) { return m_write_s.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_r_callback(Object &&cb) { return m_write_r.set_callback(std::forward<Object>(cb)); }
+ // For SM510, SM500, SM5A, R port output is selected with a mask option,
+ // either from the divider or direct contol. Documented options are:
+ // SM510/SM5A: control, 2(4096Hz meant for alarm sound)
+ // SM500: 14, 11, 3 (divider f1, f4, f12)
void set_r_mask_option(int bit) { m_r_mask_option = bit; }
- template <class Object> devcb_base &set_write_sega_callback(Object &&cb) { return m_write_sega.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_segb_callback(Object &&cb) { return m_write_segb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_segc_callback(Object &&cb) { return m_write_segc.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_segbs_callback(Object &&cb) { return m_write_segbs.set_callback(std::forward<Object>(cb)); }
+ // 4-bit K input port (pull-down)
+ auto read_k() { return m_read_k.bind(); }
+
+ // 1-bit BA(aka alpha) input pin (pull-up)
+ auto read_ba() { return m_read_ba.bind(); }
+
+ // 1-bit B(beta) input pin (pull-up)
+ auto read_b() { return m_read_b.bind(); }
+
+ // 8-bit S strobe output port
+ auto write_s() { return m_write_s.bind(); }
+
+ // 1/2/4-bit R (buzzer/melody) output port
+ auto write_r() { return m_write_r.bind(); }
+
+ // LCD segment outputs: H1-4 as offset(low), a/b/c 1-16 as data d0-d15
+ auto write_sega() { return m_write_sega.bind(); }
+ auto write_segb() { return m_write_segb.bind(); }
+ auto write_segc() { return m_write_segc.bind(); }
+
+ // LCD bs output: same as above, but only up to 2 bits used
+ auto write_segbs() { return m_write_segbs.bind(); }
protected:
// device-level overrides