У меня тут снова затык (такой уж я программист) с опросом
клавиатуры под RT-11.
Скрытый текст
form, давненько подсказал мне более грамотную конструкцию для Паскаля, чем ту, что я прежде использовал - и всё равно не спасает от проскакивания как самого нажатия, так и значения нажатой клавиши.
Проблема такая. Программа должна выводить в непрерывном цикле
последовательно три экрана с различной информацией. Т.о. алгоритм такой примерно (это в исходнике у меня!) :
И вот подстава!Код:/* в шапке, в разделе VAR описаны глобальные переменные */ PROGRAM KLAVAPODSTAVA; VAR INKEY ORIGIN 177560B: INTEGER; /* RA-КЛАВ. */ KEY ORIGIN 177562B: INTEGER; /* RD-КЛАВ. */ FUNCTION KEYPRESS: BOOLEAN; /* ПИШУ ТАКУЮ ФУН-Ю */ BEGIN KEYPRESS:=FALSE; INKEY:=0; IF(INKEY AND 128)<>0 THEN KEYPRESS:=TRUE; END; BEGIN REPEAT WRITELN(' ТЕКСТОВЫЙ БЛОК №1 - ПРИВЕТСТВИЕ'); WHILE NOT KEYPRESS DO; WRITELN(' ТЕКСТОВЫЙ БЛОК №2'); WHILE NOT KEYPRESS DO; WRITELN(' ТЕКСТОВЫЙ БЛОК №3'); WHILE NOT KEYPRESS DO; UNTIL KEY=3; END.
Первое привествие вроде бы норм выводится и ожидается нажатие
клавиши. Но после блока 2 сразу выводится блок 3 и только тогда
срабатывает ожидание нажатия. Более того сохраняется значение нажатой кнопки (что не допустимо), поскольку если в третьем блоке
какая-то функция на какую-то клавишу назначена и именно она была нажата в предыдущем опросе клавиатуры - то она автоматом выполняется. Как же это всё победить и что я не так делаю?
Иногда почему то срабатывает даже <ВК> который жмётся при запуске .SAV файла ???
Буду рад любому ответу и комментариям.
У меня просто рушится вся система общения с игроком в предполагаемой ASCII игрушке, то есть "остро-необходимо" что бы
каждый раз опрос клавиатуры был гарантировано уникальным, ждал нажатия кнопки и дальше (в зависимости от значения регистра
данных - то есть "клавиши") будет что-то там ветвиться\вызываться.
Спасибо.
[свернуть]
Последний раз редактировалось hobot; 26.01.2014 в 23:22. Причина: убрал вопрос под "спойлер".
Надо доверить опрос клавиатуры операционной системе, а в программе для проверки готовности символа использовать ассемблерную вставку с вызовом .TTINR
А чтобы этот вызов не подвешивал программу в старших релизах RT-11 - добавить ассемблерную вставку, которая будет устанавливать нужные биты JSW.
---------- Post added at 22:13 ---------- Previous post was at 21:58 ----------
Код:VAR SIMB :INTEGER; PROCEDURE READSIM; BEGIN (*$C EMT ^O340 BCS SKIP MOV %0,SIMB(%5) SKIP: *) END;Код:PROCEDURE TTSPEC; BEGIN (*$C BIS #^O10000,@#^O44 *) END;
Вариант OMSI-PASCAL, отличие от предыдущего в размере .OBJ библиотеки
- она больше на 6 блоков и файл получаемый после линковки на 3 блока
вырастает как минимум.
OMSIPAS_BIGOBJ.rar
Я давно это всё подозревал, а сегодня всё таки раскидал по нужным местам и просто запустил и вся теория разом подтвердилась, FAST-PASCAL и в том числе модуль GRAPH были впервые реализованы для ДВК-2М.
Скрытый текст
[свернуть]
Затем и на БК-11М
Скрытый текст
[свернуть]
О том что турбо среда и модуль граф начиная с самой первой версии имели УК-НЦ воплощение было известно и так. Ура! Всем кто знали и молчали троекратное! ) Учитывая, что модуль GRAPH двухцветный - сильно упрощает адаптацию под конкретное видео устройство каждой из отечественных PDP-шек.
осталось ещё найти мифический GAS.SAV...
Последний раз редактировалось hobot; 26.05.2014 в 01:52.
На закусочку к предыдущему сообщению, я до конца так и не доглядел,
вернулся к компу оно вылетело в систему, но первый кадр сделал сразу )
Да! Теперь и на спектруме? http://zx.oberon2.ru/forum/viewtopic.php?f=10&t=85
Последний раз редактировалось hobot; 12.03.2014 в 00:47.
Это издание просто очень интересно - хотя и посвящено не только
и не столько Паскалю и Ассемблеру, но основы программирования
там изложенные очень даже полезны ( я вот как триллер читаю сейчас)
для понимания местного ассемблера, у меня такого учебника не было,
я даже не знал, что такая чудесная книжка есть (узнал недавно).
http://publ.lib.ru/ARCHIVES/E/ERSHOV...shov_A.P..html
По ссылке обе части издания. Книга написана простым и понятным
языком и интересна помимо прочего очень информативными иллюстрациями.
предложеный Patronom вариант
не работает и даже не пытается, процедура просто проскакивает как пустая при выполнении программы (что я не так делаю?)!!!Код:VAR SIMB :INTEGER; PROCEDURE READSIM; BEGIN (*$C EMT ^O340 BCS SKIP MOV %0,SIMB(%5) SKIP: *) END;
Да и почему вместо (SP) %5, a вместо R0 %0 ???
.TTINR так же просто игнорируется при выполнении программыСообщение от Patron
И вот этот вариант сбоит - то есть пропускает ожидание через раз,
может реагирует и на отжатие???
Я в шоке!!!Код:var INKEY ORIGIN 177560B: INTEGER; KEY ORIGIN 177562B: INTEGER; <...> repeat INKEY:=0; until (INKEY AND 128)<>0;
Ребята подскажите как
1 - мне получить 100% гарантию ожидания нажатия клавиатуры в любом месте программы и в регистре данных клавиатуры или какой-нибудь переменной сохранить нажатую кнопку в виде кода или символа
2 - мне считать нажатие с клавиатуры без ожидания нажатия внутри
цикла например и опять таки иметь этот код или в регистре или в переменной (но тут обычно хватает тупо обнулить РА и потом уже
в цикле проверять что нажато было последний раз)
Буфер - про буфер и как его почистить я вообще не буду спрашивать, мне бы просто выяснить 1 и 2 пункты )
В чём моя ошибка? Что я не так делаю? Должен же быть человеческий и рабочий способ !!! Печаль! А главное последний
вариант работает, но хитро!!! Манипулировать с регистрами клавиатуры получается, но непредсказуемо как-то. Печаль два раза.
Легко заметить, что содержимое глобальной переменной SIMB изменяется только тогда, когда была нажата клавиша. Иначе процедура просто "проскакивает", не изменяя вообще ничего.
Использовать надо так:
Код:VAR SIM,SIMB :INTEGER; PROCEDURE READSIM; BEGIN (*$C EMT ^O340 BCS EXIT MOV %0,SIMB(%5) EXIT: *) END; PROCEDURE MOVEORM1; LABEL 9; VAR PW :^REC; BEGIN IF SIMB<>SIM THEN BEGIN 9: CASE SIMB OF 70B: BEGIN DX:=0; DY:=-1 ;DD:=3 END; 65B: BEGIN DX:=0; DY:=1 ;DD:=3 END; 64B: BEGIN DX:=-1; DY:=0 ;DD:=1 END; 66B: BEGIN DX:=1; DY:=0 ;DD:=1 END; 67B: BEGIN SIM:=SIM+1; IF SIM=67B THEN SIM:=70B; IF SIM>70B THEN SIM:=64B; SIMB:=SIM; GOTO 9 END; 105B: STOP; ELSE BEGIN SIM:=SIM-1;IF SIM=67B THEN SIM:=66B; IF SIM<64B THEN SIM:=70B; SIMB:=SIM; GOTO 9 END END; (* CASE *) SIM:=SIMB; END; NEW(PW); PW^.X:=P^.X+DX; PW^.Y:=P^.Y+DY; IF DIRECTION>0 THEN BEGIN PW^.PRED:=P; PW^.SLED:=NIL; P^.SLED:=PW END ELSE BEGIN PW^.SLED:=P; PW^.PRED:=NIL; P^.PRED:=PW END; P:=PW; END; (*************************************************************) (* M A I N P R O G R A M *) (*************************************************************) BEGIN REPEAT READSIM; MOVEORM1; UNTIL ( LEN>1000 ); END.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)