diff options
Diffstat (limited to 'trunk/src/emu/machine/mc68901.h')
-rw-r--r-- | trunk/src/emu/machine/mc68901.h | 232 |
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 |