summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h8/h8_sci.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/h8/h8_sci.h')
-rw-r--r--src/devices/cpu/h8/h8_sci.h113
1 files changed, 62 insertions, 51 deletions
diff --git a/src/devices/cpu/h8/h8_sci.h b/src/devices/cpu/h8/h8_sci.h
index bf3d5b8bcbb..5a3671e63ab 100644
--- a/src/devices/cpu/h8/h8_sci.h
+++ b/src/devices/cpu/h8/h8_sci.h
@@ -14,42 +14,45 @@
#pragma once
-#include "h8.h"
-#include "h8_intc.h"
+class h8_device;
+class h8_intc_device;
class h8_sci_device : public device_t {
public:
- h8_sci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- h8_sci_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *intc, int eri, int rxi, int txi, int tei)
+ h8_sci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ template<typename T, typename U> h8_sci_device(const machine_config &mconfig, const char *tag, device_t *owner, int id, T &&cpu, U &&intc, int eri, int rxi, int txi, int tei)
: h8_sci_device(mconfig, tag, owner, 0)
{
- set_info(intc, eri, rxi, txi, tei);
+ m_cpu.set_tag(std::forward<T>(cpu));
+ m_intc.set_tag(std::forward<U>(intc));
+ m_id = id;
+ m_eri_int = eri;
+ m_rxi_int = rxi;
+ m_txi_int = txi;
+ m_tei_int = tei;
}
- void set_info(const char *intc, int eri, int rxi, int txi, int tei);
- void set_external_clock_period(const attotime &_period);
+ void do_set_external_clock_period(const attotime &_period);
- void smr_w(uint8_t data);
- uint8_t smr_r();
- void brr_w(uint8_t data);
- uint8_t brr_r();
- void scr_w(uint8_t data);
- uint8_t scr_r();
- void tdr_w(uint8_t data);
- uint8_t tdr_r();
- void ssr_w(uint8_t data);
- uint8_t ssr_r();
- uint8_t rdr_r();
- void scmr_w(uint8_t data);
- uint8_t scmr_r();
+ void smr_w(u8 data);
+ u8 smr_r();
+ void brr_w(u8 data);
+ u8 brr_r();
+ void scr_w(u8 data);
+ u8 scr_r();
+ void tdr_w(u8 data);
+ u8 tdr_r();
+ void ssr_w(u8 data);
+ u8 ssr_r();
+ u8 rdr_r();
+ void scmr_w(u8 data);
+ u8 scmr_r();
- DECLARE_WRITE_LINE_MEMBER(rx_w);
- DECLARE_WRITE_LINE_MEMBER(clk_w);
+ void do_rx_w(int state);
+ void do_clk_w(int state);
- auto tx_handler() { return tx_cb.bind(); }
- auto clk_handler() { return clk_cb.bind(); }
-
- uint64_t internal_update(uint64_t current_time);
+ u64 internal_update(u64 current_time);
+ void notify_standby(int state);
protected:
enum {
@@ -64,13 +67,13 @@ protected:
};
enum {
- CLKM_INTERNAL_ASYNC,
- CLKM_INTERNAL_ASYNC_OUT,
- CLKM_EXTERNAL_ASYNC,
- CLKM_EXTERNAL_RATE_ASYNC,
- CLKM_INTERNAL_SYNC_OUT,
- CLKM_EXTERNAL_SYNC,
- CLKM_EXTERNAL_RATE_SYNC
+ INTERNAL_ASYNC,
+ INTERNAL_ASYNC_OUT,
+ EXTERNAL_ASYNC,
+ EXTERNAL_RATE_ASYNC,
+ INTERNAL_SYNC_OUT,
+ EXTERNAL_SYNC,
+ EXTERNAL_RATE_SYNC
};
enum {
@@ -102,36 +105,44 @@ protected:
SSR_MPBT = 0x01
};
- required_device<h8_device> cpu;
- devcb_write_line tx_cb, clk_cb;
- h8_intc_device *intc;
- const char *intc_tag;
- attotime external_clock_period, cur_sync_time;
- double external_to_internal_ratio, internal_to_external_ratio;
- emu_timer *sync_timer;
+ required_device<h8_device> m_cpu;
+ required_device<h8_intc_device> m_intc;
+ attotime m_external_clock_period;
+ double m_external_to_internal_ratio, m_internal_to_external_ratio;
+ emu_timer *m_sync_timer;
+
+ int m_id, m_eri_int, m_rxi_int, m_txi_int, m_tei_int;
- int eri_int, rxi_int, txi_int, tei_int;
+ int m_tx_state, m_rx_state, m_tx_bit, m_rx_bit, m_clock_state, m_tx_parity, m_rx_parity, m_tx_clock_counter, m_rx_clock_counter;
+ u32 m_clock_mode;
+ bool m_ext_clock_value, m_rx_value;
- int tx_state, rx_state, tx_bit, rx_bit, clock_state, clock_mode, tx_parity, rx_parity, ext_clock_counter;
- bool clock_value, ext_clock_value, rx_value;
+ u8 m_rdr, m_tdr, m_smr, m_scr, m_ssr, m_brr, m_rsr, m_tsr;
+ u64 m_clock_event, m_clock_step, m_divider;
- uint8_t rdr, tdr, smr, scr, ssr, brr, rsr, tsr;
- uint64_t clock_base, divider;
+ std::string m_last_clock_message;
- std::string last_clock_message;
+ void device_start() override;
+ void device_reset() override;
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ TIMER_CALLBACK_MEMBER(sync_tick);
void clock_start(int mode);
void clock_stop(int mode);
void clock_update();
+
void tx_start();
- void tx_dropped_edge();
+ void tx_async_tick();
+ void tx_async_step();
+ void tx_sync_tick();
+ void tx_sync_step();
+
void rx_start();
void rx_done();
- void rx_raised_edge();
+ void rx_async_tick();
+ void rx_async_step();
+ void rx_sync_tick();
+ void rx_sync_step();
bool is_sync_start() const;
bool has_recv_error() const;