summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/am25s55x.h
blob: 1fa3cab8102532a65c7caf1e0d64fc3864867123 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

















                                                                            
                                          


























































































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

    am25s55x.h
    AMD Am25S557/Am25S558 8x8-bit Combinatorial Multiplier

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

#ifndef MAME_MACHINE_AM25S55X_H
#define MAME_MACHINE_AM25S55X_H

#pragma once

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

// ======================> am25s55x_device

class am25s55x_device : public device_t
{
public:
	// construction/destruction
	am25s55x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0);

	void x_w(uint8_t data);
	void y_w(uint8_t data);
	virtual void xm_w(int state);
	virtual void ym_w(int state);
	void oe_w(int state);

	auto s() { return m_s.bind(); }

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

	void multiply();

	union input_reg
	{
		int8_t s;
		uint8_t u;
	};

	union output_reg
	{
		int16_t s;
		uint16_t u;
	};

	uint8_t m_x_in;
	uint8_t m_y_in;
	bool m_xm;
	bool m_ym;
	bool m_oe;

	bool m_round_s;
	bool m_round_u;

	input_reg m_x;
	input_reg m_y;
	output_reg m_s_out;

	devcb_write16 m_s;
};


// ======================> am25s557_device

class am25s557_device : public am25s55x_device
{
public:
	// construction/destruction
	am25s557_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);

	virtual void xm_w(int state) override;
	virtual void ym_w(int state) override;

	void r_w(int state);

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

	void update_rounding();

	bool m_r;
};


// ======================> am25s558_device

class am25s558_device : public am25s55x_device
{
public:
	// construction/destruction
	am25s558_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);

	void rs_w(int state);
	void ru_w(int state);
};

// device type definition
DECLARE_DEVICE_TYPE(AM25S557, am25s557_device)
DECLARE_DEVICE_TYPE(AM25S558, am25s558_device)

#endif // MAME_MACHINE_AM25S55X_H