diff options
Diffstat (limited to 'src/devices/machine/mc68901.h')
-rw-r--r-- | src/devices/machine/mc68901.h | 167 |
1 files changed, 87 insertions, 80 deletions
diff --git a/src/devices/machine/mc68901.h b/src/devices/machine/mc68901.h index 93f47ccfd5d..84606368b98 100644 --- a/src/devices/machine/mc68901.h +++ b/src/devices/machine/mc68901.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Curt Coder +// copyright-holders:Curt Coder, AJR /********************************************************************** Motorola MC68901 Multi Function Peripheral emulation @@ -38,8 +38,6 @@ #pragma once -#include "diserial.h" - //************************************************************************** // TYPE DEFINITIONS @@ -48,19 +46,14 @@ // ======================> mc68901_device -class mc68901_device : public device_t, - public device_serial_interface +class mc68901_device : public device_t { public: // construction/destruction - mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); void set_timer_clock(int timer_clock) { m_timer_clock = timer_clock; } - void set_rx_clock(int rx_clock) { m_rx_clock = rx_clock; } - void set_tx_clock(int tx_clock) { m_tx_clock = tx_clock; } void set_timer_clock(const XTAL &xtal) { set_timer_clock(xtal.value()); } - void set_rx_clock(const XTAL &xtal) { set_rx_clock(xtal.value()); } - void set_tx_clock(const XTAL &xtal) { set_tx_clock(xtal.value()); } auto out_irq_cb() { return m_out_irq_cb.bind(); } auto out_gpio_cb() { return m_out_gpio_cb.bind(); } @@ -73,45 +66,51 @@ public: //auto out_tr_cb() { return m_out_tr_cb.bind(); } auto iack_chain_cb() { return m_iack_chain_cb.bind(); } - DECLARE_READ8_MEMBER( read ); - DECLARE_WRITE8_MEMBER( write ); + u8 read(offs_t offset); + void write(offs_t offset, u8 data); - uint8_t get_vector(); + u8 get_vector(); - DECLARE_WRITE_LINE_MEMBER( i0_w ); - DECLARE_WRITE_LINE_MEMBER( i1_w ); - DECLARE_WRITE_LINE_MEMBER( i2_w ); - DECLARE_WRITE_LINE_MEMBER( i3_w ); - DECLARE_WRITE_LINE_MEMBER( i4_w ); - DECLARE_WRITE_LINE_MEMBER( i5_w ); - DECLARE_WRITE_LINE_MEMBER( i6_w ); - DECLARE_WRITE_LINE_MEMBER( i7_w ); + void i0_w(int state); + void i1_w(int state); + void i2_w(int state); + void i3_w(int state); + void i4_w(int state); + void i5_w(int state); + void i6_w(int state); + void i7_w(int state); - DECLARE_WRITE_LINE_MEMBER( tai_w ); - DECLARE_WRITE_LINE_MEMBER( tbi_w ); + void tai_w(int state); + void tbi_w(int state); - DECLARE_WRITE_LINE_MEMBER( write_rx ); + void si_w(int state); + void rc_w(int state); + void tc_w(int state); protected: // device-level overrides - 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; - - // device_serial_interface overrides - virtual void tra_callback() override; - virtual void tra_complete() override; - virtual void rcv_complete() override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; void check_interrupts(); - void take_interrupt(uint16_t mask); + void take_interrupt(u16 mask); + void tx_buffer_empty(); + void tx_error(); void rx_buffer_full(); void rx_error(); - void timer_count(int index); + TIMER_CALLBACK_MEMBER(timer_count); void timer_input(int index, int value); void gpio_input(int bit, int state); void gpio_output(); - void register_w(offs_t offset, uint8_t data); + + void set_so(bool state); + void rx_frame_start(); + void rx_sync_found(); + void rx_async_frame_complete(); + void rx_sync_frame_complete(); + void rx_clock(bool si); + void tx_frame_load(u8 data); + void tx_clock(); private: enum @@ -199,14 +198,12 @@ private: XMIT_STOPPING }; - static const int INT_MASK_GPIO[]; - static const int INT_MASK_TIMER[]; + static const u16 INT_MASK_GPIO[]; + static const u16 INT_MASK_TIMER[]; static const int GPIO_TIMER[]; static const int PRESCALER[]; int m_timer_clock; /* timer clock */ - int m_rx_clock; /* serial receive clock */ - int m_tx_clock; /* serial transmit clock */ devcb_write_line m_out_irq_cb; @@ -223,49 +220,59 @@ private: devcb_read8 m_iack_chain_cb; - //int m_device_type; /* device type */ - - /* registers */ - uint8_t m_gpip; /* general purpose I/O register */ - uint8_t m_aer; /* active edge register */ - uint8_t m_ddr; /* data direction register */ - - uint16_t m_ier; /* interrupt enable register */ - uint16_t m_ipr; /* interrupt pending register */ - uint16_t m_isr; /* interrupt in-service register */ - uint16_t m_imr; /* interrupt mask register */ - uint8_t m_vr; /* vector register */ - - uint8_t m_tacr; /* timer A control register */ - uint8_t m_tbcr; /* timer B control register */ - uint8_t m_tcdcr; /* timers C and D control register */ - uint8_t m_tdr[4]; /* timer data registers */ - - uint8_t m_scr; /* synchronous character register */ - uint8_t m_ucr; /* USART control register */ - uint8_t m_tsr; /* transmitter status register */ - uint8_t m_rsr; /* receiver status register */ - uint8_t m_transmit_buffer; /* USART data register */ - bool m_transmit_pending; - uint8_t m_receive_buffer; - bool m_overrun_pending; - uint8_t m_gpio_input; - uint8_t m_gpio_output; - - /* counter timer state */ - uint8_t m_tmc[4]; /* timer main counters */ - int m_ti[4]; /* timer in latch */ - int m_to[4]; /* timer out latch */ - - /* interrupt state */ - //int m_irqlevel; /* interrupt level latch */ - - /* serial state */ - uint8_t m_next_rsr; /* receiver status register latch */ - int m_rsr_read; /* receiver status register read flag */ + // registers + u8 m_gpip; // general purpose I/O register + u8 m_aer; // active edge register + u8 m_ddr; // data direction register + + u16 m_ier; // interrupt enable register + u16 m_ipr; // interrupt pending register + u16 m_isr; // interrupt in-service register + u16 m_imr; // interrupt mask register + u8 m_vr; // vector register + + u8 m_tacr; // timer A control register + u8 m_tbcr; // timer B control register + u8 m_tcdcr; // timers C and D control register + u8 m_tdr[4]; // timer data registers + + u8 m_scr; // synchronous character register + bool m_scr_parity; // parity of sync character + u8 m_ucr; // USART control register + u8 m_tsr; // transmitter status register + u8 m_rsr; // receiver status register + u8 m_transmit_buffer; // USART data register + u8 m_receive_buffer; + u8 m_gpio_input; + u8 m_gpio_output; + + // counter timer state + u8 m_tmc[4]; // timer main counters + int m_ti[4]; // timer in latch + int m_to[4]; // timer out latch + + // serial receiver state + u16 m_rframe; // receiver frame shift register + u8 m_rclk; // receiver clock counter + u8 m_rbits; // receiver bit counter + u8 m_si_scan; // receiver bitstream scan + u8 m_next_rsr; // receiver status register latch + bool m_rc; // receiver clock input + bool m_si; // serial data input + bool m_last_si; // synchronized serial data input + bool m_rparity; // receiver data parity + + // serial transmitter state + u16 m_osr; // output shift register + u8 m_tclk; // transmit clock counter + u8 m_tbits; // transmit bit counter + bool m_tc; // transmit clock input + bool m_so; // serial data output + bool m_tparity; // transmit data transmit + bool m_underrun; // underrun preset time // timers - emu_timer *m_timer[4]; /* counter timers */ + emu_timer *m_timer[4]; // counter timers }; |