Skip to content

Commit 3c9b124

Browse files
committed
sony/smc777_kbd.cpp: clear scan code on key_break, handle a vestigial BUSY flag for commands (bugatk fire button)
1 parent 67bbb92 commit 3c9b124

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/mame/sony/smc777_kbd.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,13 @@ smc777_kbd_device::smc777_kbd_device(const machine_config &mconfig, const char *
3434

3535
void 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

307314
void 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

315327
void 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

343357
u8 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+
}

src/mame/sony/smc777_kbd.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class smc777_kbd_device : public device_t
3434

3535
void scan_mode(u8 data);
3636
u8 m_command;
37-
u8 m_status;
37+
u8 m_status, m_aux_hs;
3838
u8 m_scan_code;
3939
u16 m_repeat_interval;
4040
u16 m_repeat_start;
@@ -43,6 +43,9 @@ class smc777_kbd_device : public device_t
4343
bool m_fkey_dir;
4444
u8 m_fkey_target;
4545
u8 m_fkey_index;
46+
47+
emu_timer *m_aux_timer;
48+
TIMER_CALLBACK_MEMBER(aux_ready);
4649
};
4750

4851
DECLARE_DEVICE_TYPE(SMC777_KBD, smc777_kbd_device)

0 commit comments

Comments
 (0)