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.h19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/devices/cpu/sm510/sm510.h b/src/devices/cpu/sm510/sm510.h
index 5d44799864d..c1889c78847 100644
--- a/src/devices/cpu/sm510/sm510.h
+++ b/src/devices/cpu/sm510/sm510.h
@@ -32,13 +32,16 @@
#define MCFG_SM510_WRITE_S_CB(_devcb) \
devcb = &sm510_base_device::set_write_s_callback(*device, DEVCB_##_devcb);
-// 2/4-bit R (melody) output port
+// 1/2/4-bit R (buzzer/melody) output port
#define MCFG_SM510_WRITE_R_CB(_devcb) \
devcb = &sm510_base_device::set_write_r_callback(*device, DEVCB_##_devcb);
-
-// R port can be set to direct control with a mask option (default false)
-#define MCFG_SM510_R_DIRECT_CONTROL(_direct) \
- sm510_base_device::set_r_direct_control(*device, _direct);
+// 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) \
+ sm510_base_device::set_r_mask_option(*device, _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) \
@@ -112,7 +115,7 @@ public:
, m_prgwidth(prgwidth)
, m_datawidth(datawidth)
, m_stack_levels(stack_levels)
- , m_r_direct(false)
+ , m_r_mask_option(SM510_R_CONTROL_OUTPUT)
, m_lcd_ram_a(*this, "lcd_ram_a"), m_lcd_ram_b(*this, "lcd_ram_b"), m_lcd_ram_c(*this, "lcd_ram_c")
, m_write_sega(*this), m_write_segb(*this), m_write_segc(*this), m_write_segbs(*this)
, m_melody_rom(*this, "melody")
@@ -128,7 +131,7 @@ public:
template <class Object> static devcb_base &set_read_b_callback(device_t &device, Object &&cb) { return downcast<sm510_base_device &>(device).m_read_b.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_write_s_callback(device_t &device, Object &&cb) { return downcast<sm510_base_device &>(device).m_write_s.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_write_r_callback(device_t &device, Object &&cb) { return downcast<sm510_base_device &>(device).m_write_r.set_callback(std::forward<Object>(cb)); }
- static void set_r_direct_control(device_t &device, bool direct) { downcast<sm510_base_device &>(device).m_r_direct = direct; }
+ static void set_r_mask_option(device_t &device, int bit) { downcast<sm510_base_device &>(device).m_r_mask_option = bit; }
template <class Object> static devcb_base &set_write_sega_callback(device_t &device, Object &&cb) { return downcast<sm510_base_device &>(device).m_write_sega.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_write_segb_callback(device_t &device, Object &&cb) { return downcast<sm510_base_device &>(device).m_write_segb.set_callback(std::forward<Object>(cb)); }
@@ -181,7 +184,7 @@ protected:
bool m_skip;
u8 m_w;
u8 m_r, m_r_out;
- bool m_r_direct;
+ int m_r_mask_option;
bool m_k_active;
bool m_halt;
int m_clk_div;