summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/74157.cpp
blob: b68dc1472e645983d62d06efdd8bf6b395c625bd (plain) (tree)
1
2
3
4
5
6




                                                                            
                                                                       















                                                                            
                                                       





                                                                                                           





                                                                                                                                                                                     











































































































































































                                                                            





                                                                            
                                                         




                                                                                                                    
// license:BSD-3-Clause
// copyright-holders:AJR

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

    74LS157/74HCT157 Quad 2 to 1-Line Data Selectors/Multiplexers (TTL)

    Often used to help feed 8-bit ROM data into a MSM5205, and for many
    other purposes.

    74LS158 has inverted outputs; 74LS157 is non-inverting.

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

#include "emu.h"
#include "74157.h"


//**************************************************************************
//  74LS157 DEVICE
//**************************************************************************

const device_type LS157 = device_creator<ls157_device>;

//-------------------------------------------------
//  ls157_device - constructor
//-------------------------------------------------

ls157_device::ls157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: ls157_device(mconfig, LS157, "74LS157 Quad 2-to-1 Multiplexer", tag, owner, clock, "74ls157", __FILE__)
{
}

ls157_device::ls157_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
	: device_t(mconfig, type, name, tag, owner, clock, shortname, source)
	, m_out_cb(*this)
{
	m_a = 0;
	m_b = 0;
	m_select = false;
	m_strobe = false;
}


//-------------------------------------------------
//  device_start - perform device-specific
//  startup
//-------------------------------------------------

void ls157_device::device_start()
{
	// resolve callbacks
	m_out_cb.resolve_safe();

	// register items for save state
	save_item(NAME(m_a));
	save_item(NAME(m_b));
	save_item(NAME(m_select));
	save_item(NAME(m_strobe));
}


//**************************************************************************
//  DATA INPUTS
//**************************************************************************

//-------------------------------------------------
//  a_w -- write nibble to A1-A4
//-------------------------------------------------

WRITE8_MEMBER(ls157_device::a_w)
{
	a_w(data);
}

void ls157_device::a_w(u8 data)
{
	m_a = data & 0xf;
	update_output();
}


//-------------------------------------------------
//  b_w -- write nibble to B1-B4
//-------------------------------------------------

WRITE8_MEMBER(ls157_device::b_w)
{
	b_w(data);
}

void ls157_device::b_w(u8 data)
{
	m_b = data & 0xf;
	update_output();
}


//-------------------------------------------------
//  ab_w -- write high nibble to A1-A4 and write
//  low nibble to B1-B4
//-------------------------------------------------

WRITE8_MEMBER(ls157_device::ab_w)
{
	ab_w(data);
}

void ls157_device::ab_w(u8 data)
{
	m_a = data >> 4;
	m_b = data & 0xf;
	update_output();
}


//-------------------------------------------------
//  ba_w -- write high nibble to B1-B4 and write
//  low nibble to A1-A4
//-------------------------------------------------

WRITE8_MEMBER(ls157_device::ba_w)
{
	ba_w(data);
}

void ls157_device::ba_w(u8 data)
{
	m_b = data >> 4;
	m_a = data & 0xf;
	update_output();
}


//-------------------------------------------------
//  interleave_w -- write even-numbered bits to
//  A1-A4 and write odd-numbered bits to B1-B4
//-------------------------------------------------

WRITE8_MEMBER(ls157_device::interleave_w)
{
	interleave_w(data);
}

void ls157_device::interleave_w(u8 data)
{
	m_b = ((data >> 4) & 8)
		| ((data >> 3) & 4)
		| ((data >> 2) & 2)
		| ((data >> 1) & 1);
	m_a = ((data >> 3) & 8)
		| ((data >> 2) & 4)
		| ((data >> 1) & 2)
		| ((data >> 0) & 1);
	update_output();
}


//**************************************************************************
//  CONTROL LINE INPUTS
//**************************************************************************

//-------------------------------------------------
//  select_w -- set select input
//-------------------------------------------------

WRITE_LINE_MEMBER(ls157_device::select_w)
{
	if (m_select != bool(state))
	{
		m_select = bool(state);
		update_output();
	}
}


//-------------------------------------------------
//  strobe_w -- set strobe input (active low)
//-------------------------------------------------

WRITE_LINE_MEMBER(ls157_device::strobe_w)
{
	if (m_strobe != bool(state))
	{
		m_strobe = bool(state);

		// Clear output when strobe goes high
		if (m_strobe)
			m_out_cb(0);
		else
			m_out_cb(m_select ? m_b : m_a);
	}
}


//-------------------------------------------------
//  update_output -- update output lines Y1-Y4
//  unless strobe is high
//-------------------------------------------------

void ls157_device::update_output()
{
	// S high, strobe low: Y1-Y4 = B1-B4
	// S low, strobe low:  Y1-Y4 = A1-A4
	if (!m_strobe)
		m_out_cb(m_select ? m_b : m_a);
}


//**************************************************************************
//  74HCT157 DEVICE
//**************************************************************************

const device_type HCT157 = device_creator<hct157_device>;

hct157_device::hct157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: ls157_device(mconfig, HCT157, "74HCT157 Quad 2-to-1 Multiplexer", tag, owner, clock, "74hct157", __FILE__)
{
}