Ejemplo n.º 1
0
void mm5740_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	int ako = 0;

	for (int x = 0; x < 9; x++)
	{
		uint16_t data = m_read_x[x]() ^ 0x3ff;

		if ((data ^ m_x_mask[x]) == 0)
		{
			// bail early if nothing has changed.
			continue;
		}

		for (int y = 0; y < 10; y++)
		{

			if (BIT(data, y))
			{
				uint8_t *rom = m_rom->base();
				uint16_t offset = x*10 + y;
				// Common portion
				uint16_t common = (uint16_t) rom[offset];

				offset += (((m_read_shift() ? 1: 0) + (m_read_control() ? 2: 0)) + 1) * 90;

				// Unique portion based on shift/ctrl keys.
				uint8_t uniq = rom[offset];

				uint16_t b = (((common & 0x10) << 4) | ((uniq & 0x0f) << 4) | (common & 0x0f)) ^ 0x1ff;

				ako = 1;

				if (!BIT(m_x_mask[x], y))
				{
					m_x_mask[x] |= (1 << y);
					if (m_b != b)
					{
						m_b = b;
						m_write_data_ready(ASSERT_LINE);

						return;
					}
				}
			}
			else    // key released, unmark it from the "down" info
			{
				m_x_mask[x] &= ~(1 << y);
			}
		}
	}

	if (!ako)
	{
		m_write_data_ready(CLEAR_LINE);
		m_b = -1;
	}
}
Ejemplo n.º 2
0
UINT16 ay3600_device::b_r()
{
	UINT16 data = m_b;

	m_write_data_ready(0);

	return data;
}
Ejemplo n.º 3
0
void ay3600_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	int ako = 0;

	for (int x = 0; x < 9; x++)
	{
		UINT16 data = 0;

		switch(x)
		{
			case 0: data = m_read_x0(); break;
			case 1: data = m_read_x1(); break;
			case 2: data = m_read_x2(); break;
			case 3: data = m_read_x3(); break;
			case 4: data = m_read_x4(); break;
			case 5: data = m_read_x5(); break;
			case 6: data = m_read_x6(); break;
			case 7: data = m_read_x7(); break;
			case 8: data = m_read_x8(); break;
		}

		for (int y = 0; y < 10; y++)
		{
			int b = (x * 10) + y;

			if (b > 63)
			{
				b -= 64;
				b = 0x100 | b;
			}

			b |= (m_read_shift() << 6);
			b |= (m_read_control() << 7);

			if (BIT(data, y))
			{
				if (!(m_x_mask[x] & (1 << y)))
				{
					ako = 1;

					m_x_mask[x] |= (1 << y);

					if (m_b != b)
					{
						m_b = b;

						m_write_data_ready(1);
						return;
					}
				}
			}
			else    // key released, unmark it from the "down" info
			{
				m_x_mask[x] &= ~(1 << y);
			}
		}
	}

	if (!ako)
	{
		m_b = -1;
	}

	if (ako != m_ako)
	{
		m_write_ako(ako);
		m_ako = ako;
	}
}
Ejemplo n.º 4
0
uint16_t mm5740_device::b_r()
{
	m_write_data_ready(CLEAR_LINE);
	return m_b;
}
Ejemplo n.º 5
0
void ay3600_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	int ako = 0;

	for (int x = 0; x < 9; x++)
	{
		UINT16 data = 0;

		switch(x)
		{
			case 0: data = m_read_x0(); break;
			case 1: data = m_read_x1(); break;
			case 2: data = m_read_x2(); break;
			case 3: data = m_read_x3(); break;
			case 4: data = m_read_x4(); break;
			case 5: data = m_read_x5(); break;
			case 6: data = m_read_x6(); break;
			case 7: data = m_read_x7(); break;
			case 8: data = m_read_x8(); break;
		}

		for (int y = 0; y < 10; y++)
		{
			int b = (x * 10) + y;

			if (b > 63)
			{
				b -= 64;
				b = 0x100 | b;
			}

			b |= (m_read_shift() << 6);
			b |= (m_read_control() << 7);

			if (BIT(data, y))
			{
				bool found = false;

				// is this key already down?
				for (int k = 0; k < MAX_KEYS_DOWN; k++)
				{
					if (b == m_keys_down[k])
					{
						found = true;
						break;
					}
				}

				if (!found)
				{
					ako = 1; 

					if (m_b != b)
					{
						m_b = b;

						m_write_data_ready(1);
						return;
					}

					// add to the keys down list
					for (int k = 0; k < MAX_KEYS_DOWN; k++)
					{
						if (m_keys_down[k] == -1)
						{
							m_keys_down[k] = b;
							break;
						}
					}
				}
			}
			else	// key released, unmark it from the keys_down table
			{
				for (int k = 0; k < MAX_KEYS_DOWN; k++)
				{
					if (b == m_keys_down[k])
					{
						m_keys_down[k] = -1;
					}
				}
			}
		}
	}

	if (!ako)
	{
		m_b = -1;
	}

	if (ako != m_ako)
	{
		m_write_ako(ako);
		m_ako = ako;
	}
}