Есть идея насчёт ReadKey. Нужно сделать её похожей на стандартную турбопаскалевскую. Пусть будет буфер на 4 кода. Обработчик прерываний опрашивает клавиатуру и найденную клавишу помещает в первую свободную (=0) ячейку буфера. Автоповтор тоже так же реализуется. При отпускании тоже помещается код клавиши, но с флагом release. Так же, ещё должны быть флаги модифицирующих клавиш капс и символ шифт. Флаги возвращаются в отдельной переменной. Вызов выглядит так Readkey(key,flag);
После чтения кода процедура прокручивает буфер вперёд, обнуляя последний код. Если ничего не нажато, то возвращается код 0. Так удобнее, чем использовать конструкцию if KeyPressed then ReadKey(); Программа просто читает и обрабатывает коды клавиш, пока key возвращается не нулевой. Это хорошо подойдёт для набора текста, ввода имени в турнирную таблицу и т.д.
Вторая часть идеи. Тут предлагали дать доступ к портам, но можно по другому. Программа создаёт массив из 10 байт и вызывает функцию SetKeyBuffer(keys); Теперь обработчик прерывания видит, что задан буфер клавиш и читает порты клавиатуры и считанное заносит в этот буфер в соответствующие байты. Т.е., получаем в байтах массива нажатые кнопки с каждой полустроки клавиатуры. В 9 и 10 байты занести считанное значение порта джойстика. В итоге, всё под рукой и можно легко узнать какая клавиша нажата. Можно даже в обработчике инвертировать считанный байт, чтобы установленный бит означал нажатую клавишу. Ну это не обязательно.
В конце программа вызывает функцию ReleaseKeyBuffer;, которая обнуляет свой указатель на массив и обработчик прерывания более не заполняет его.




Ответить с цитированием