summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/am2847.h
blob: 0e70d2bf37fdf574cee8cdfea38b0e8e29cd4e8b (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12





                                                                       





                        


                                                                       
                       









                                
                 
 









                                                  








                                                                       




















































































                                                                                                                                                                                    
                  
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
/**********************************************************************

    AMD Am2847/Am2896 Quad 80/96-Bit Static Shift Registers

    Pin-compatible with:
    * 2532B
    * TMS3120
    * TMS3409
    * MK1007
    * 3347

***********************************************************************

    Connection Diagram:
              ___ ___
    OUT A  1 |*  u   | 16  Vss
     RC A  2 |       | 15  IN D
     IN A  3 |       | 14  RC D
    OUT B  4 |       | 13  OUT D
     RC B  5 |       | 12  Vgg
     IN B  6 |       | 11  CP
    OUT C  7 |       | 10  IN C
      Vdd  8 |_______| 9   RC C

    Logic Symbol:

                2      5      9      14
                |      |      |      |
           _____|______|______|______|_____
          |   RC A   RC B   RC C   RC D    |
     3 ---| IN A                     OUT A |--- 1
     6 ---| IN A                     OUT B |--- 4
    10 ---| IN A                     OUT C |--- 7
    15 ---| IN A                     OUT D |--- 13
    11 ---| CP                             |
          |________________________________|


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

#pragma once

#ifndef AM2847_H
#define AM2847_H


#define MCFG_AM2847_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, AM2847, 0)

#define MCFG_AM2849_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, AM2849, 0)

#define MCFG_TMS3409_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, TMS3409, 0)

class am2847_base_device : public device_t
{
public:
	am2847_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, size_t size);

	DECLARE_WRITE_LINE_MEMBER( in_a_w );
	DECLARE_WRITE_LINE_MEMBER( in_b_w );
	DECLARE_WRITE_LINE_MEMBER( in_c_w );
	DECLARE_WRITE_LINE_MEMBER( in_d_w );
	void in_w(uint8_t data); // Or if you prefer...

	DECLARE_WRITE_LINE_MEMBER( rc_a_w );
	DECLARE_WRITE_LINE_MEMBER( rc_b_w );
	DECLARE_WRITE_LINE_MEMBER( rc_c_w );
	DECLARE_WRITE_LINE_MEMBER( rc_d_w );
	void rc_w(uint8_t data); // Or if you prefer...

	DECLARE_WRITE_LINE_MEMBER( cp_w );

	uint8_t out_r() const { return m_out; }

protected:
	virtual void device_start() override;
	virtual void device_reset() override;

	void init();
	void shift();

	class shifter
	{
	public:
		shifter() : m_buffer_size(0) { }
		void alloc(size_t size);
		void init();
		int shift(bool recycle, int in);
	protected:
		std::unique_ptr<uint16_t[]> m_buffer;
		size_t m_buffer_size;
	};

	shifter m_shifters[4];
	uint8_t m_in;
	uint8_t m_out;
	uint8_t m_rc;
	int m_cp;

	const size_t m_buffer_size;
};

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

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

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

// device type definition
extern const device_type AM2847;
extern const device_type AM2849;
extern const device_type TMS3409;

#endif // AM2847_H