Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Буферизованный опрос клавиатуры
https://zx.oberon.org/forum/viewtopic.php?f=10&t=221
Страница 1 из 1

Автор:  Zorko [ 26 ноя 2014, 12:15 ]
Заголовок сообщения:  Буферизованный опрос клавиатуры

Реализовал для игры Dark Woods (и, соответственно, для ZXDev) буферизованный опрос клавиатуры на прерываниях (в режиме IM 2). Обработчик прерываний заносит коды нажатых клавиш в кольцевой буфер, а процедура опроса их извлекает. Переполнение буфера обрабатывается таким способом, что нажатые ранее клавиши теряются. Здесь закономерно считаем, что более актуальны клавиши, нажатые позднее. Эта стратегия кажется более удачной, чем игнорирование всех клавиш, нажатых после переполнения буфера (как в контроллере клавиатуры IBM PC).

Идея кольцевого буфера с двумя указателями на чтение и запись взята из книги Никлауса Вирта «Проект Оберон. Разработка операционной системы и компилятора» и использована мною также в обработчике нажатий клавиш для Java ME (там коды заносятся в буфер и извлекаются из него в разных потоках исполнения).
Код: "OBERON"
  1. MODULE TestInpBuf; (*$MAIN*)
  2. IMPORT B := Basic, Input, Timer;
  3.  
  4. VAR
  5. key: Input.Key; av: SHORTINT;
  6.  
  7. BEGIN
  8. B.Init; B.CLS; B.IM2PROC(Input.RunMe50Hz);
  9. B.PRSTR("PRESS KEYS SO MANY AS POSSIBLE!"); B.PRLN;
  10. Timer.Delay(500); (* 1/50 сек. тиков, а не мс *)
  11. B.AT(0, 0); B.PRINT(Input.Available()); B.PRLN;
  12. WHILE Input.Available() > 0 DO B.PRCHAR(Input.Read()) END;
  13. B.PRLN;
  14. REPEAT
  15. av := Input.Available();
  16. B.AT(0, 0); B.PRINT(av); B.PRSTR(" ");
  17. UNTIL av = 8;
  18. B.AT(10, 10);
  19. WHILE Input.Available() > 0 DO B.PRCHAR(Input.Read()) END;
  20. LOOP END;
  21. END TestInpBuf.
Первый цикл опроса показывает как обрабатываются клавиши, нажатые уже при полном буфере. Второй просто до заполнения.

Тема «Процедура опроса клавиатуры» на zx.pk.ru

Вложения:
TestInpBuf.tap [966 байт]
Скачиваний: 2125

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/