Если есть PC с COM-портом ( или есть адаптер COM-USB ) - достаточно спаять шнурок, после чего можно грузиться по этому шнурку из пункта меню "Загрузка через стык С2".
Подробнее ЗДЕСЬ.
Последние версии ПО - ЗДЕСЬ.
Вид для печати
У меня тут снова затык (такой уж я программист:wink:) с опросом
клавиатуры под 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 файла ???
:confused_std:
Буду рад любому ответу и комментариям.
У меня просто рушится вся система общения с игроком в предполагаемой ASCII игрушке, то есть "остро-необходимо" что бы
каждый раз опрос клавиатуры был гарантировано уникальным, ждал нажатия кнопки и дальше (в зависимости от значения регистра
данных - то есть "клавиши") будет что-то там ветвиться\вызываться.
Спасибо.
[свернуть]
:confused_std:
Надо доверить опрос клавиатуры операционной системе, а в программе для проверки готовности символа использовать ассемблерную вставку с вызовом .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 блока
вырастает как минимум.
Вложение 45693
Я давно это всё подозревал, а сегодня всё таки раскидал по нужным местам и просто запустил и вся теория разом подтвердилась, FAST-PASCAL и в том числе модуль GRAPH были впервые реализованы для ДВК-2М.
Скрытый текст
Затем и на БК-11М
Скрытый текст
О том что турбо среда и модуль граф начиная с самой первой версии имели УК-НЦ воплощение было известно и так. Ура! Всем кто знали и молчали троекратное! ) Учитывая, что модуль GRAPH двухцветный - сильно упрощает адаптацию под конкретное видео устройство каждой из отечественных PDP-шек.
:redface:
осталось ещё найти мифический GAS.SAV...:wink:
На закусочку к предыдущему сообщению, я до конца так и не доглядел,
вернулся к компу оно вылетело в систему, но первый кадр сделал сразу )
http://s6.hostingkartinok.com/upload...bf7256589d.png
Да! Теперь и на спектруме? http://zx.oberon2.ru/forum/viewtopic.php?f=10&t=85
Это издание просто очень интересно - хотя и посвящено не только
и не столько Паскалю и Ассемблеру, но основы программирования
там изложенные очень даже полезны ( я вот как триллер читаю сейчас)
для понимания местного ассемблера, у меня такого учебника не было,
я даже не знал, что такая чудесная книжка есть (узнал недавно).
http://s7.hostingkartinok.com/upload...708c17c02a.jpg
http://publ.lib.ru/ARCHIVES/E/ERSHOV...shov_A.P..html
По ссылке обе части издания. Книга написана простым и понятным
языком и интересна помимо прочего очень информативными иллюстрациями.
:confused_std:
предложеный 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 пункты )
В чём моя ошибка? Что я не так делаю? Должен же быть человеческий и рабочий способ !!! Печаль! А главное последний
вариант работает, но хитро!!! Манипулировать с регистрами клавиатуры получается, но непредсказуемо как-то. Печаль два раза.
:frown:
Легко заметить, что содержимое глобальной переменной 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.