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; } }
UINT16 ay3600_device::b_r() { UINT16 data = m_b; m_write_data_ready(0); return data; }
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; } }
uint16_t mm5740_device::b_r() { m_write_data_ready(CLEAR_LINE); return m_b; }
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; } }