@@ -34,8 +34,13 @@ smc777_kbd_device::smc777_kbd_device(const machine_config &mconfig, const char *
3434
3535void smc777_kbd_device::device_start ()
3636{
37+ m_aux_timer = timer_alloc (FUNC (smc777_kbd_device::aux_ready), this );
38+ m_aux_timer->adjust (attotime::never);
39+ m_aux_hs = 4 ;
40+
3741 save_item (NAME (m_command));
3842 save_item (NAME (m_status));
43+ save_item (NAME (m_aux_hs));
3944 save_item (NAME (m_scan_code));
4045 save_item (NAME (m_repeat_interval));
4146 save_item (NAME (m_repeat_start));
@@ -52,6 +57,7 @@ void smc777_kbd_device::device_reset()
5257 reset_key_state ();
5358 start_processing (attotime::from_hz (1'200 ));
5459 typematic_stop ();
60+ // don't reset aux timer: we do that separatedly
5561
5662 m_command = 0 ;
5763 m_status = 0 ;
@@ -300,16 +306,22 @@ void smc777_kbd_device::key_make(uint8_t row, uint8_t column)
300306{
301307 m_scan_code = translate (row, column);
302308 m_status |= 5 ;
309+ // printf("%d %d\n", row, column);
303310 // take count of multipresses like this (testable in games like ldrun/cloderun)
304311 m_held_keys ++;
305312}
306313
307314void smc777_kbd_device::key_break (uint8_t row, uint8_t column)
308315{
309- // m_scan_code = 0;
310316 m_held_keys --;
311317 if (m_held_keys <= 0 )
318+ {
319+ // clear code for safety
320+ // (would cause drift in stuff like hudson1~5, where pressing enter at MAME startup
321+ // will get stuck from POST up to game selection)
322+ m_scan_code = 0 ;
312323 m_status &= ~4 ;
324+ }
313325}
314326
315327void smc777_kbd_device::key_repeat (uint8_t row, uint8_t column)
@@ -337,7 +349,9 @@ void smc777_kbd_device::scan_mode(u8 data)
337349 }
338350 // IEF: enable interrupt
339351 if (BIT (data, 0 ))
340- LOG (" Enable ief_key (tbd)\n " );
352+ {
353+ LOG (" Enable ief_key (TBD)\n " );
354+ }
341355}
342356
343357u8 smc777_kbd_device::data_r (offs_t offset)
@@ -405,7 +419,9 @@ u8 smc777_kbd_device::status_r(offs_t offset)
405419 res|= (m_key_mod->read () & 3 ) << 6 ;
406420 }
407421 else
408- res = 4 | (m_command == 0x80 );
422+ {
423+ res = m_aux_hs | (m_command == 0x80 );
424+ }
409425
410426 return res;
411427}
@@ -457,5 +473,14 @@ void smc777_kbd_device::control_w(offs_t offset, u8 data)
457473 LOG (" Initialize key\n " );
458474 break ;
459475 }
476+ m_aux_hs &= ~4 ;
477+ // TODO: timing
478+ m_aux_timer->adjust (attotime::from_usec (250 ));
460479 }
461480}
481+
482+ // - bugatk expects BUSY to go low otherwise space key won't work during gameplay
483+ TIMER_CALLBACK_MEMBER (smc777_kbd_device::aux_ready)
484+ {
485+ m_aux_hs |= 4 ;
486+ }
0 commit comments