summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/mc68901.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/mc68901.h')
-rw-r--r--src/devices/machine/mc68901.h167
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
};