From 802fd7f60df8b0d64783b8050577907f26a6ecce Mon Sep 17 00:00:00 2001 From: arbee Date: Thu, 5 Jan 2023 19:09:05 -0500 Subject: macadb: much better SRQ semantics. Checked with all supported MCU types. Fixes GitHub #10790. [R. Belmont] --- src/mame/apple/macadb.cpp | 84 ++++++++++++++++++++++++----------------------- src/mame/apple/macadb.h | 3 +- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/mame/apple/macadb.cpp b/src/mame/apple/macadb.cpp index 0808000c782..2627021b8a3 100644 --- a/src/mame/apple/macadb.cpp +++ b/src/mame/apple/macadb.cpp @@ -614,7 +614,22 @@ void macadb_device::adb_talk() m_adb_buffer[0] = (m_adb_lastbutton & 0x01) ? 0x00 : 0x80; m_adb_buffer[0] |= mouseY & 0x7f; m_adb_buffer[1] = (mouseX & 0x7f) | 0x80; - m_adb_datasize = 2; + + if ((m_adb_buffer[0] != m_last_mouse[0]) || (m_adb_buffer[1] != m_last_mouse[1])) + { + m_adb_datasize = 2; + m_last_mouse[0] = m_adb_buffer[0]; + m_last_mouse[1] = m_adb_buffer[1]; + } + else + { + m_adb_datasize = 0; + + if (adb_pollkbd(0)) //&& (!m_bIsIIGSMode)) + { + m_adb_srqflag = true; + } + } break; // get ID/handler @@ -629,15 +644,10 @@ void macadb_device::adb_talk() default: break; } - - if ((adb_pollkbd(0)) && (!m_bIsIIGSMode)) - { - m_adb_srqflag = true; - } } else if (addr == m_adb_keybaddr) { - int kbd_has_data = 1; +// int kbd_has_data = 1; LOGMASKED(LOG_TALK_LISTEN, "Talking to keyboard, register %x\n", reg); switch (reg) @@ -650,47 +660,44 @@ void macadb_device::adb_talk() } else { - kbd_has_data = this->adb_pollkbd(1); + adb_pollkbd(1); } -/* if (m_adb_currentkeys[0] != 0xff) - { - printf("Keys[0] = %02x\n", m_adb_currentkeys[0]); - } - if (m_adb_currentkeys[1] != 0xff) - { - printf("Keys[1] = %02x\n", m_adb_currentkeys[1]); - }*/ - - if(kbd_has_data) + if (m_adb_keybuf_start == m_adb_keybuf_end) + { +// printf("%s: buffer empty\n", __func__); + m_adb_buffer[0] = 0xff; + m_adb_buffer[1] = 0xff; + } + else { - if (m_adb_keybuf_start == m_adb_keybuf_end) + m_adb_buffer[1] = m_adb_keybuf[m_adb_keybuf_start]; + m_adb_keybuf_start = (m_adb_keybuf_start+1) % kADBKeyBufSize; + if(m_adb_keybuf_start != m_adb_keybuf_end) { - // printf("%s: buffer empty\n", __func__); - m_adb_buffer[0] = 0xff; - m_adb_buffer[1] = 0xff; + m_adb_buffer[0] = m_adb_keybuf[m_adb_keybuf_start]; + m_adb_keybuf_start = (m_adb_keybuf_start+1) % kADBKeyBufSize; } else { - m_adb_buffer[1] = m_adb_keybuf[m_adb_keybuf_start]; - m_adb_keybuf_start = (m_adb_keybuf_start+1) % kADBKeyBufSize; - if(m_adb_keybuf_start != m_adb_keybuf_end) - { - m_adb_buffer[0] = m_adb_keybuf[m_adb_keybuf_start]; - m_adb_keybuf_start = (m_adb_keybuf_start+1) % kADBKeyBufSize; - } - else - { - m_adb_buffer[0] = 0xff; - } + m_adb_buffer[0] = 0xff; } + } + + if ((m_adb_buffer[0] != m_last_kbd[0]) || (m_adb_buffer[1] != m_last_kbd[1])) + { m_adb_datasize = 2; + m_last_kbd[0] = m_adb_buffer[0]; + m_last_kbd[1] = m_adb_buffer[1]; } else { - m_adb_buffer[0] = 0xff; - m_adb_buffer[1] = 0xff; - m_adb_datasize = 2; + m_adb_datasize = 0; + + if ((adb_pollmouse()) && (!m_bIsIIGSMode)) + { + m_adb_srqflag = true; + } } break; @@ -716,11 +723,6 @@ void macadb_device::adb_talk() default: break; } - - if ((adb_pollmouse()) && (!m_bIsIIGSMode)) - { - m_adb_srqflag = true; - } } else { diff --git a/src/mame/apple/macadb.h b/src/mame/apple/macadb.h index 2b0421acf3a..2d9a587d7ac 100644 --- a/src/mame/apple/macadb.h +++ b/src/mame/apple/macadb.h @@ -58,11 +58,12 @@ private: u16 m_key_matrix[9]; // ADB HLE state - int32_t m_adb_state, m_adb_waiting_cmd, m_adb_datasize, m_adb_buffer[257]; + int32_t m_adb_state, m_adb_waiting_cmd, m_adb_datasize; int32_t m_adb_command, m_adb_send, m_adb_timer_ticks, m_adb_extclock, m_adb_direction; int32_t m_adb_listenreg, m_adb_listenaddr, m_adb_last_talk, m_adb_srq_switch; int32_t m_adb_stream_ptr; int32_t m_adb_linestate; + u8 m_adb_buffer[257], m_last_kbd[2], m_last_mouse[2]; bool m_adb_srqflag; int m_adb_linein; -- cgit v1.2.3