summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/machine/mc68901.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/machine/mc68901.h')
-rw-r--r--trunk/src/emu/machine/mc68901.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/mc68901.h b/trunk/src/emu/machine/mc68901.h
new file mode 100644
index 00000000000..5bfaf4cb2e7
--- /dev/null
+++ b/trunk/src/emu/machine/mc68901.h
@@ -0,0 +1,232 @@
+/**********************************************************************
+
+ Motorola MC68901 Multi Function Peripheral emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************
+ _____ _____
+ R/_W 1 |* \_/ | 48 _CS
+ RS1 2 | | 47 _DS
+ RS2 3 | | 46 _DTACK
+ RS3 4 | | 45 _IACK
+ RS4 5 | | 44 D7
+ RS5 6 | | 43 D6
+ TC 7 | | 42 D5
+ SO 8 | | 41 D4
+ SI 9 | | 40 D3
+ RC 10 | | 39 D2
+ Vcc 11 | | 38 D1
+ NC 12 | MC68901 | 37 D0
+ TAO 13 | MK68901 | 36 GND
+ TBO 14 | | 35 CLK
+ TCO 15 | | 34 _IEI
+ TDO 16 | | 33 _IEO
+ XTAL1 17 | | 32 _IRQ
+ XTAL2 18 | | 31 _RR
+ TAI 19 | | 30 _TR
+ TBI 20 | | 29 I7
+ _RESET 21 | | 28 I6
+ I0 22 | | 27 I5
+ I1 23 | | 26 I4
+ I2 24 |_____________| 25 I3
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __MC68901__
+#define __MC68901__
+
+#include "emu.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_MC68901_ADD(_tag, _clock, _config) \
+ MCFG_DEVICE_ADD((_tag), MC68901, _clock) \
+ MCFG_DEVICE_CONFIG(_config)
+
+#define MC68901_INTERFACE(name) \
+ const mc68901_interface (name) =
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mc68901_interface
+
+struct mc68901_interface
+{
+ 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;
+
+ devcb_read8 m_in_gpio_cb;
+ devcb_write8 m_out_gpio_cb;
+
+ devcb_write_line m_out_tao_cb;
+ devcb_write_line m_out_tbo_cb;
+ devcb_write_line m_out_tco_cb;
+ devcb_write_line m_out_tdo_cb;
+
+ devcb_read_line m_in_si_cb;
+ devcb_write_line m_out_so_cb;
+ devcb_write_line m_out_rr_cb;
+ devcb_write_line m_out_tr_cb;
+};
+
+
+
+// ======================> mc68901_device
+
+class mc68901_device : public device_t,
+ public mc68901_interface
+{
+public:
+ // construction/destruction
+ mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+
+ int 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 );
+
+ DECLARE_WRITE_LINE_MEMBER( tai_w );
+ DECLARE_WRITE_LINE_MEMBER( tbi_w );
+
+ DECLARE_WRITE_LINE_MEMBER( rc_w );
+ DECLARE_WRITE_LINE_MEMBER( tc_w );
+
+protected:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+ void check_interrupts();
+ void take_interrupt(UINT16 mask);
+ void rx_buffer_full();
+ void rx_error();
+ void tx_buffer_empty();
+ void tx_error();
+ int get_parity_bit(UINT8 b);
+ void serial_receive();
+ void tx_disabled();
+ void tx_starting();
+ void tx_break();
+ void tx_enabled();
+ void serial_transmit();
+ void timer_count(int index);
+ void timer_input(int index, int value);
+ void gpio_input(int bit, int state);
+ void register_w(offs_t offset, UINT8 data);
+
+private:
+ static const device_timer_id TIMER_A = 0;
+ static const device_timer_id TIMER_B = 1;
+ static const device_timer_id TIMER_C = 2;
+ static const device_timer_id TIMER_D = 3;
+ static const device_timer_id TIMER_RX = 4;
+ static const device_timer_id TIMER_TX = 5;
+
+ devcb_resolved_read8 m_in_gpio_func;
+ devcb_resolved_write8 m_out_gpio_func;
+ devcb_resolved_read_line m_in_si_func;
+ devcb_resolved_write_line m_out_so_func;
+ devcb_resolved_write_line m_out_tao_func;
+ devcb_resolved_write_line m_out_tbo_func;
+ devcb_resolved_write_line m_out_tco_func;
+ devcb_resolved_write_line m_out_tdo_func;
+ devcb_resolved_write_line m_out_irq_func;
+
+ int m_device_type; /* device type */
+
+ /* registers */
+ UINT8 m_gpip; /* general purpose I/O register */
+ UINT8 m_aer; /* active edge register */
+ UINT8 m_ddr; /* data direction register */
+
+ UINT16 m_ier; /* interrupt enable register */
+ UINT16 m_ipr; /* interrupt pending register */
+ UINT16 m_isr; /* interrupt in-service register */
+ UINT16 m_imr; /* interrupt mask register */
+ UINT8 m_vr; /* vector register */
+
+ UINT8 m_tacr; /* timer A control register */
+ UINT8 m_tbcr; /* timer B control register */
+ UINT8 m_tcdcr; /* timers C and D control register */
+ UINT8 m_tdr[4]; /* timer data registers */
+
+ UINT8 m_scr; /* synchronous character register */
+ UINT8 m_ucr; /* USART control register */
+ UINT8 m_tsr; /* transmitter status register */
+ UINT8 m_rsr; /* receiver status register */
+ UINT8 m_udr; /* USART data register */
+
+ /* counter timer state */
+ UINT8 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 m_next_rsr; /* receiver status register latch */
+ int m_rsr_read; /* receiver status register read flag */
+ int m_rxtx_word; /* word length */
+ int m_rxtx_start; /* start bits */
+ int m_rxtx_stop; /* stop bits */
+
+ /* receive state */
+ UINT8 m_rx_buffer; /* receive buffer */
+ int m_rx_bits; /* receive bit count */
+ int m_rx_parity; /* receive parity bit */
+ int m_rx_state; /* receive state */
+
+ /* transmit state */
+ UINT8 m_tx_buffer; /* transmit buffer */
+ int m_tx_bits; /* transmit bit count */
+ int m_tx_parity; /* transmit parity bit */
+ int m_tx_state; /* transmit state */
+ int m_xmit_state; /* transmitter state */
+
+ // timers
+ emu_timer *m_timer[4]; /* counter timers */
+ emu_timer *m_rx_timer; /* receive timer */
+ emu_timer *m_tx_timer; /* transmit timer */
+};
+
+
+// device type definition
+extern const device_type MC68901;
+
+
+
+#endif