summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/im6402.h
blob: 7feb7fed1c22824d0387a619419b444f4836147f (plain) (tree)
1
2
3
4
5
6

                               



                                                                            























                                                                            





                                                   

                                                                            

                             
 
            
 
                     



                                                                            
                                  

                                                                            
                                           
                                          

                                                           
 
                                          
                                                                               
 
                                         
                                                                              

                                           
                                                                                

                                          
                                                                               






                                                                            

                                        
                                                                     


                                   
                                                                                                       
 





                                                                                                                                             
 




                                                            
                                                      
                                       
 





                                                             
 
                                                                          














                                            

                                             
 
                                            



                                             




                                        
 



                                        







                   
 






                   
 
                   
                      
                  
                        
 
                      
                      
                  
                        



                         
                                          
 
                               
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/***************************************************************************

    Intersil IM6402 Universal Asynchronous Receiver/Transmitter emulation

****************************************************************************
                            _____   _____
                   Vcc   1 |*    \_/     | 40  NOTE
                  NOTE   2 |             | 39  EPE
                   GND   3 |             | 38  CLS1
                   RRD   4 |             | 37  CLS2
                  RBR8   5 |             | 36  SBS
                  RBR7   6 |             | 35  PI
                  RBR6   7 |             | 34  CRL
                  RBR5   8 |             | 33  TBR8
                  RBR4   9 |             | 32  TBR7
                  RBR3  10 |    IM6402   | 31  TBR6
                  RBR2  11 |    IM6403   | 30  TBR5
                  RBR1  12 |             | 29  TBR4
                    PE  13 |             | 28  TBR3
                    FE  14 |             | 27  TBR2
                    OE  15 |             | 26  TBR1
                   SFD  16 |             | 25  TRO
                  NOTE  17 |             | 24  TRE
                   DRR  18 |             | 23  TRBL
                    DR  19 |             | 22  TBRE
                   RRI  20 |_____________| 21  MR


                NOTE:   PIN     IM6402      IM6403
                        ---------------------------
                        2       N/C         CONTROL
                        17      RRC         OSC IN
                        40      TRC         OSC OUT

***************************************************************************/

#ifndef MAME_MACHINE_IM6402_H
#define MAME_MACHINE_IM6402_H

#pragma once

#include "diserial.h"



/***************************************************************************
    INTERFACE CONFIGURATION MACROS
***************************************************************************/

#define MCFG_IM6402_ADD(_tag, _rrc, _trc) \
	MCFG_DEVICE_ADD(_tag, IM6402, 0) \
	downcast<im6402_device &>(*device).set_rrc(_rrc); \
	downcast<im6402_device &>(*device).set_trc(_trc);

#define MCFG_IM6402_TRO_CALLBACK(_write) \
	downcast<im6402_device &>(*device).set_tro_wr_callback(DEVCB_##_write);

#define MCFG_IM6402_DR_CALLBACK(_write) \
	downcast<im6402_device &>(*device).set_dr_wr_callback(DEVCB_##_write);

#define MCFG_IM6402_TBRE_CALLBACK(_write) \
	downcast<im6402_device &>(*device).set_tbre_wr_callback(DEVCB_##_write);

#define MCFG_IM6402_TRE_CALLBACK(_write) \
	downcast<im6402_device &>(*device).set_tre_wr_callback(DEVCB_##_write);



/***************************************************************************
    TYPE DEFINITIONS
***************************************************************************/

// ======================> im6402_device

class im6402_device : public device_t, public device_serial_interface
{
public:
	// construction/destruction
	im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	void set_rrc(int rrc) { m_rrc = rrc; }
	void set_trc(int trc) { m_trc = trc; }
	template <class Object> devcb_base &set_tro_wr_callback(Object &&cb) { return m_write_tro.set_callback(std::forward<Object>(cb)); }
	template <class Object> devcb_base &set_dr_wr_callback(Object &&cb) { return m_write_dr.set_callback(std::forward<Object>(cb)); }
	template <class Object> devcb_base &set_tbre_wr_callback(Object &&cb) { return m_write_tbre.set_callback(std::forward<Object>(cb)); }
	template <class Object> devcb_base &set_tre_wr_callback(Object &&cb) { return m_write_tre.set_callback(std::forward<Object>(cb)); }

	auto tro_callback() { return m_write_tro.bind(); }
	auto dr_callback() { return m_write_dr.bind(); }
	auto tbre_callback() { return m_write_tbre.bind(); }
	auto tre_callback() { return m_write_tre.bind(); }

	DECLARE_READ8_MEMBER( read ) { return m_rbr; }
	DECLARE_WRITE8_MEMBER( write );

	DECLARE_READ_LINE_MEMBER( dr_r ) { return m_dr; }
	DECLARE_READ_LINE_MEMBER( tbre_r ) { return m_tbre; }
	DECLARE_READ_LINE_MEMBER( tre_r ) { return m_tre; }
	DECLARE_READ_LINE_MEMBER( pe_r ) { return m_pe; }
	DECLARE_READ_LINE_MEMBER( fe_r ) { return m_fe; }
	DECLARE_READ_LINE_MEMBER( oe_r ) { return m_oe; }

	DECLARE_WRITE_LINE_MEMBER( write_rri ); // receiver register input
	DECLARE_WRITE_LINE_MEMBER( rrc_w );
	DECLARE_WRITE_LINE_MEMBER( trc_w );
	DECLARE_WRITE_LINE_MEMBER( rrd_w );
	DECLARE_WRITE_LINE_MEMBER( sfd_w );
	DECLARE_WRITE_LINE_MEMBER( drr_w );
	DECLARE_WRITE_LINE_MEMBER( mr_w );
	DECLARE_WRITE_LINE_MEMBER( crl_w );
	DECLARE_WRITE_LINE_MEMBER( pi_w );
	DECLARE_WRITE_LINE_MEMBER( sbs_w );
	DECLARE_WRITE_LINE_MEMBER( cls1_w );
	DECLARE_WRITE_LINE_MEMBER( cls2_w );
	DECLARE_WRITE_LINE_MEMBER( epe_w );

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	// device_serial_interface overrides
	virtual void tra_callback() override;
	virtual void tra_complete() override;
	virtual void rcv_callback() override;
	virtual void rcv_complete() override;

private:
	inline void set_dr(int state);
	inline void set_tbre(int state);
	inline void set_tre(int state);

	devcb_write_line   m_write_tro;
	devcb_write_line   m_write_dr;
	devcb_write_line   m_write_tbre;
	devcb_write_line   m_write_tre;

	// status
	int m_dr;
	int m_tbre;
	int m_tre;
	int m_pe;
	int m_fe;
	int m_oe;

	// control
	int m_cls1;
	int m_cls2;
	int m_sbs;
	int m_sfd;
	int m_epe;
	int m_pi;

	// receiver
	uint8_t m_rbr;
	int m_rrc;
	int m_rrc_count;

	// transmitter
	uint8_t m_tbr;
	int m_trc;
	int m_trc_count;
};


// device type definition
DECLARE_DEVICE_TYPE(IM6402, im6402_device)

#endif // MAME_MACHINE_IM6402_H