Посмотрите как устроен буферизованный ввод с клавиатуры в ZXDev. Применяется буфер на 8 клавиш, обработчик повешен на прерывание, поэтому пользователь может нажать и отпустить клавишу между опросами, её нажатие всё равно будет зафиксировано. Также работает автоповтор.

https://github.com/Oleg-N-Cher/XDev/.../Lib/C/Input.c

Это примерно то же, что предлагает AzAtom.

Ещё есть универсальная процедура опроса управления, опрашивает джойстики и QAOPSpace, возвращая все (одновременно) нажатые кнопки в виде битового поля. Это для игр. Разумеется, чудес не бывает, и ей присущи все аппаратные ограничения Спектрума на одновременное число нажатых клавиш.

https://github.com/Oleg-N-Cher/XDev/...ib/C/Control.c