Пример #1
0
UINT8 ppi8255_device::ppi8255_read_port(int port)
{
	UINT8 result = 0x00;

	if (m_in_mask[port])
	{
		ppi8255_input(port, devcb_call_read8(&m_port_read[port], 0));
		result |= m_read[port] & m_in_mask[port];
	}
	result |= m_latch[port] & m_out_mask[port];

	switch (port)
	{
	case 0:
		/* clear input buffer full flag */
		m_ibf_a = 0;
		break;

	case 1:
		/* clear input buffer full flag */
		m_ibf_b = 0;
		break;

	case 2:
		/* read special port 2 signals */
		ppi8255_get_handshake_signals(1, &result);
		break;
	}

	return result;
}
Пример #2
0
static UINT8 get_in_a_value(const device_config *device)
{
	pia6821_state *p = get_token(device);
	UINT8 port_a_data = 0;
	UINT8 ret;

	/* update the input */
	if (p->in_a_func.read != NULL)
		port_a_data = devcb_call_read8(&p->in_a_func, 0);
	else
	{
		if (p->in_a_pushed)
			port_a_data = p->in_a;
		else
		{
			/* mark all pins disconnected */
			p->port_a_z_mask = 0xff;

			if (!p->logged_port_a_not_connected && (p->ddr_a != 0xff))
			{
				logerror("PIA #%s: Warning! No port A read handler. Assuming pins 0x%02X not connected\n", device->tag, p->ddr_a ^ 0xff);
				p->logged_port_a_not_connected = TRUE;
			}
		}
	}

	/* - connected pins are always read
       - disconnected pins read the output buffer in output mode
       - disconnected pins are HI in input mode */
	ret = (~p->port_a_z_mask             & port_a_data) |
	      ( p->port_a_z_mask &  p->ddr_a & p->out_a) |
	      ( p->port_a_z_mask & ~p->ddr_a);

	return ret;
}
Пример #3
0
static UINT8 ppi8255_read_port(running_device *device, int port)
{
	ppi8255_t	*ppi8255 = get_safe_token(device);
	UINT8 result = 0x00;

	if (ppi8255->in_mask[port])
	{
		if (ppi8255->port_read[port].read != NULL)
			ppi8255_input(device, port, devcb_call_read8(&ppi8255->port_read[port], 0));

		result |= ppi8255->read[port] & ppi8255->in_mask[port];
	}
	result |= ppi8255->latch[port] & ppi8255->out_mask[port];

	switch (port)
	{
	case 0:
		/* clear input buffer full flag */
		ppi8255->ibf_a = 0;
		break;

	case 1:
		/* clear input buffer full flag */
		ppi8255->ibf_b = 0;
		break;

	case 2:
		/* read special port 2 signals */
		ppi8255_get_handshake_signals(ppi8255, 1, &result);
		break;
	}

	return result;
}
Пример #4
0
inline UINT8 i8355_device::read_port(int port)
{
	UINT8 data = m_output[port] & m_ddr[port];

	if (m_ddr[port] != 0xff)
	{
		data |= devcb_call_read8(&m_in_port_func[port], 0) & ~m_ddr[port];
	}

	return data;
}
Пример #5
0
inline UINT8 i8155_device::read_port(int port)
{
	UINT8 data = 0;

	switch (port)
	{
	case PORT_A:
	case PORT_B:
		switch (get_port_mode(port))
		{
		case PORT_MODE_INPUT:
			data = devcb_call_read8(&m_in_port_func[port], 0);
			break;

		case PORT_MODE_OUTPUT:
			data = m_output[port];
			break;
		}
		break;

	case PORT_C:
		switch (get_port_mode(PORT_C))
		{
		case PORT_MODE_INPUT:
			data = devcb_call_read8(&m_in_port_func[port], 0) & 0x3f;
			break;

		case PORT_MODE_OUTPUT:
			data = m_output[port] & 0x3f;
			break;

		default:
			logerror("8155 '%s' Unsupported Port C mode!\n", tag());
		}
		break;
	}

	return data;
}
Пример #6
0
void z80dma_device::do_read()
{
	UINT8 mode;

	mode = TRANSFER_MODE;
	switch(mode) {
		case TM_TRANSFER:
		case TM_SEARCH:
			if (PORTA_IS_SOURCE)
			{
				if (PORTA_MEMORY)
					m_latch = devcb_call_read8(&m_in_mreq_func, m_addressA);
				else
					m_latch = devcb_call_read8(&m_in_iorq_func, m_addressA);

				if (LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch);
				m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? PORTA_STEP : -PORTA_STEP;
			}
			else
			{
				if (PORTB_MEMORY)
					m_latch = devcb_call_read8(&m_in_mreq_func, m_addressB);
				else
					m_latch = devcb_call_read8(&m_in_iorq_func, m_addressB);

				if (LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch);
				m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? PORTB_STEP : -PORTB_STEP;
			}
			break;
		case TM_SEARCH_TRANSFER:
			fatalerror("z80dma_do_operation: unhandled search & transfer mode !\n");
			break;
		default:
			logerror("z80dma_do_operation: invalid mode %d!\n", mode);
			break;
	}
}
Пример #7
0
static UINT8 read_mode0(i8255a_t *i8255a, int port)
{
	UINT8 data = 0;

	if (port_mode(i8255a, port) == MODE_OUTPUT)
	{
		/* read data from output latch */
		data = i8255a->output[port];
	}
	else
	{
		/* read data from port */
		data = devcb_call_read8(&i8255a->in_port_func[port], 0);
	}

	return data;
}
Пример #8
0
static TIMER_CALLBACK( cdp1852_scan_tick )
{
	const device_config *device = (const device_config *)ptr;
	cdp1852_t *cdp1852 = get_safe_token(device);

	switch (cdp1852->mode)
	{
	case CDP1852_MODE_INPUT:
		/* input data into register */
		cdp1852->data = devcb_call_read8(&cdp1852->in_data_func, 0);

		/* signal processor */
		set_sr_line(cdp1852, 0);
		break;

	case CDP1852_MODE_OUTPUT:
		if (cdp1852->new_data)
		{
			cdp1852->new_data = 0;

			/* latch data into register */
			cdp1852->data = cdp1852->next_data;

			/* output data */
			devcb_call_write8(&cdp1852->out_data_func, 0, cdp1852->data);

			/* signal peripheral device */
			set_sr_line(cdp1852, 1);

			cdp1852->next_sr = 0;
		}
		else
		{
			set_sr_line(cdp1852, cdp1852->next_sr);
		}
		break;
	}
}
Пример #9
0
static UINT8 get_in_b_value(const device_config *device)
{
	pia6821_state *p = get_token(device);
	UINT8 ret;

	if (p->ddr_b == 0xff)
		/* all output, just return buffer */
		ret = p->out_b;
	else
	{
		UINT8 port_b_data;

		/* update the input */
		if (p->in_b_func.read != NULL)
			port_b_data = devcb_call_read8(&p->in_b_func, 0);
		else
		{
			if (p->in_b_pushed)
				port_b_data = p->in_b;
			else
			{
				if (!p->logged_port_b_not_connected && (p->ddr_b != 0xff))
				{
					logerror("PIA #%s: Error! No port B read handler. Three-state pins 0x%02X are undefined\n", device->tag, p->ddr_b ^ 0xff);
					p->logged_port_b_not_connected = TRUE;
				}

				/* undefined -- need to return something */
				port_b_data = 0x00;
			}
		}

		/* the DDR determines if the pin or the output buffer is read */
		ret = (p->out_b & p->ddr_b) | (port_b_data & ~p->ddr_b);
	}

	return ret;
}
Пример #10
0
static UINT8 read_pc(i8255a_t *i8255a)
{
	UINT8 data = 0;
	UINT8 mask = 0;

	/* PC upper */
	switch (group_mode(i8255a, GROUP_A))
	{
	case MODE_0:
		if (port_c_upper_mode(i8255a) == MODE_OUTPUT)
		{
			/* read data from output latch */
			data |= i8255a->output[PORT_C] & 0xf0;
		}
		else
		{
			/* read data from port */
			mask |= 0xf0;
		}
		break;

	case MODE_1:
		data |= i8255a->intr[PORT_A] ? 0x08 : 0x00;

		if (port_mode(i8255a, PORT_A) == MODE_OUTPUT)
		{
			data |= i8255a->obf[PORT_A] ? 0x80 : 0x00;
			data |= i8255a->inte[PORT_A] ? 0x40 : 0x00;
			mask |= 0x30;
		}
		else
		{
			data |= i8255a->ibf[PORT_A] ? 0x20 : 0x00;
			data |= i8255a->inte[PORT_A] ? 0x10 : 0x00;
			mask |= 0xc0;
		}
		break;

	case MODE_2:
		data |= i8255a->intr[PORT_A] ? 0x08 : 0x00;
		data |= i8255a->inte2 ? 0x10 : 0x00;
		data |= i8255a->ibf[PORT_A] ? 0x20 : 0x00;
		data |= i8255a->inte1 ? 0x40 : 0x00;
		data |= i8255a->obf[PORT_A] ? 0x80 : 0x00;
		break;
	}

	/* PC lower */
	switch (group_mode(i8255a, GROUP_B))
	{
	case MODE_0:
		if (port_c_lower_mode(i8255a) == MODE_OUTPUT)
		{
			/* read data from output latch */
			data |= i8255a->output[PORT_C] & 0x0f;
		}
		else
		{
			/* read data from port */
			mask |= 0x0f;
		}
		break;

	case MODE_1:
		data |= i8255a->inte[PORT_B] ? 0x04 : 0x00;
		data |= i8255a->intr[PORT_B] ? 0x01 : 0x00;

		if (port_mode(i8255a, PORT_B) == MODE_OUTPUT)
		{
			data |= i8255a->obf[PORT_B] ? 0x02 : 0x00;
		}
		else
		{
			data |= i8255a->ibf[PORT_B] ? 0x02 : 0x00;
		}
	}

	if (mask)
	{
		/* read data from port */
		data |= devcb_call_read8(&i8255a->in_port_func[PORT_C], 0) & mask;
	}

	return data;
}
Пример #11
0
static READ8_HANDLER( namco_52xx_R0_r )
{
	namco_52xx_state *state = get_safe_token(space->cpu->owner);
	return devcb_call_read8(&state->romread, state->address) & 0x0f;
}
Пример #12
0
static READ8_HANDLER( namco_52xx_SI_r )
{
	namco_52xx_state *state = get_safe_token(space->cpu->owner);
	return devcb_call_read8(&state->si, 0) ? 1 : 0;
}
Пример #13
0
static READ8_HANDLER( namco_53xx_Rx_r )
{
	namco_53xx_state *state = get_safe_token(space->cpu->owner);
	return devcb_call_read8(&state->in[offset], 0);
}