протоколКод:.TY FTT.PAS PROGRAM FTT; PROCEDURE EMT340; BEGIN /*$C EMT ^O340 BCS .-2 */ END; BEGIN WRITELN(CHR(27),'H',CHR(27),'J'); WRITELN('B1'); EMT340; WRITELN('B2'); EMT340; WRITELN('B3'); EMT340; WRITELN('BYE!'); END. .
В этом же случае - функция с регистровыми переменными работает.Код:B1 - тут ждёт B2 > проскок! B3 - тут ждёт BYE! .
В "больной-большой" программе проскок в цикле как я писал выше
в случае использования и емт340 и регистровых без разницы.
(но я конечно не втыкал пока вот то что с доп. переменной и проверять её значение - как в вашем KEYS.PAS - эта штука будет
работать поскольку - понятно что будет)
Проскакивает, если стрелки нажимать. Стрелки вводят по два кода.
Для общего развития пример на родном паскале без использования MACRO-11 и особых хитростей конкретного варианта паскаля
В примере вызываются фортрановские подпрограммы которые уже есть в системной библиотеке (SYSLIB.OBJ). В принципе если почитать руководство по системной библиотеке, можно обнаружить, что там найдутся подпрограммы почти на все случаи жизни...
Маленькое замечание по использованию фортрановских подпрограмм...
Первое правило фортрана гласит: GOD is REAL, unless declared INTEGER... Шутка. Хотя для фортрана справедливо
А если серьезно, нужно просто учитывать некоторые особенности фортрана. Даже те кто долго работал с фортраном часто не знают одной простой вещи:Что делает данная строчка? Неправильный ответ - вызывает подпрограмму SUBR и передает ей в качестве аргумента 1. Правильный ответ - вызывает подпрограмму SUBR и первый раз передает ей в качестве аргумента 1. Все аргументы в фортране - ссылки. Отсюда правило - все аргументы таких подпрограмм, подключаемых из паскаля должны быть объявлены как VAR (и подпрограмма соответственно может их менять).Код:CALL SUBR(1)
Пример программы которая ждет нажатия клавиши и печатает ее код (коды для клавиш которые генерят несколько кодов в RT-11 [стрелки, <CR>, цифровые клавиши в режиме alternative keypad])... Описание подпрограмм не привожу - оно есть в описании системной библиотеки, в том числе на русском (для рафоса). Программа завершается нажатием CTRL/C. В силу особенностей RT-11, программы не могут получить код CTRL/O в однотерминальном мониторе, а в данном случае также коды CTRL/S и CTRL/Q - для этого требуется установить кое-какие битики в настройках терминала, но это уже другая история
Код:PROGRAM TEST(INPUT, OUTPUT); VAR CTRLC : INTEGER; KEY : CHAR; FUNCTION IPEEK(VAR ADDR: INTEGER): INTEGER; FORTRAN; PROCEDURE POKE(VAR ADDR, VALUE: INTEGER); FORTRAN; FUNCTION ITTINR: INTEGER; FORTRAN; PROCEDURE SCCA(VAR FLAG: INTEGER); FORTRAN; FUNCTION TTYIN: CHAR; VAR I : INTEGER; BEGIN REPEAT I:= ITTINR; UNTIL I >= 0; TTYIN:= CHR(I) END; PROCEDURE INIT; VAR ADDR : INTEGER; VALUE : INTEGER; BEGIN ADDR:= 36; VALUE:= IPEEK(ADDR) OR 4160; POKE(ADDR, VALUE); SCCA(CTRLC); END; BEGIN INIT; WRITELN('TYPE A KEY...'); REPEAT KEY:= TTYIN; WRITELN('CODE: ', ORD(KEY)) UNTIL ORD(KEY) = 3 END.Код:.PASCAL TEST TEST Errors detected: 0 Free memory: 15192 words .MAC TEST .LIN TEST/LINK:SY:PASCAL .RU TEST TYPE A KEY... CODE: 68 CODE: 74 CODE: 76 CODE: 75 CODE: 3 .
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Да содержание SYSLIB.OBJ тайна покрытая мраком ) А весит кстати порядочно )
[не актуально уже ;-)
B]Вот вопрос - как же всё таки "продвинутый драйвер клавиатуры" встроить и использовать в своих программах для УК-НЦ?[/B]
Имеется в виду - как опросить и проверить нажатие таких кнопок как НР(шифты), ПОМ, СБР, СТОП ?
Я по старой памяти помню просто глобальные переменные в Зеленоградском инструментарии они обозначались так :
S$PRESS:: - кнопки шифт (УК-НЦ не различает лев и прав)
ALF$PRESS:: - кнопка алф
и так далее по тому же принципу,
их достаточно было сравнить с нулём TST или TSTB (не помню), но предварительно загружался весьма внушительный код в виде двух процедур PPINI и CPINI из двух библиотек PP.obj и CP.obj - то есть отдельно для каждого
процессора УК-НЦ. После этого программа уже работала не зависимо от RT-11, визуально это выглядело переходом в режим 40Х24, изменением палитры, на все (абсолютно) системные кнопки программист мог повесить свои функции (!), менять на лету палитру и переключаться между двумя страницами 0 и 1 (это было удобно,
отрисовав игровой экран в странице 1 её как лампочку можно зажечь мгновенно - пример игра Conan)...
до вызова некоего EXIT - который полностью отменял все настройки по кнопкам, палитре и возвращал изображение системное на экран и системное приглашение CSI, то есть воскрешал мон в памяти и можно было спокойно дальше редактировать и отлаживать исходник !!! Представьте ещё, что к этому прилагалось удобное использование мелодий (из местного редактора (есть на многих дискетах в архиве) и 4-х цветный редактор спрайтов Magnifier со своей библиотекой процедур. Круто было очень! И в отличие от UKLOAD - не требовалось ничего предварительно загружать\запускать, конечно (и надо это понимать), что размер исполняемого модуля был увесист (но соразмеримо для запуска на РМУ и загрузки по сети УК-НЦ), поскольку включал в себя всё содержимое указанных
выше OBJ + SPROUT.OBJ (библиотеку фун.и проц. для спрайтов) + имя.OBJ (прогнанные через МАКРО файл со спрайтами в виде sprite_name:: внутри) +
SPRTAB.OBJ - таблица используемых спрайтов, где все названия спрайтов из предыдущей библиотеки просто указывались сверху вниз внутри SPRTAB::
первый спрайт имел номер 0 и так далее.
Спрайты записывались в таком примерно виде (редактор их сразу сохранял в ассемблере) ИМЯ_СПРАЙТА:: 8,8 - сначала размер по Х и У, а потом сам спрайт где обозначался цвет 1 из 4.
Сейчас похожий инструментарий обнаружен только для БК11М, авторов я не знаю, а УК-НЦ аналог с исходниками (у меня стоявший когда-то на машинке) к сожалению утерян (сильно подозреваю, что и у автора их нет).[свернуть]
form, спасибо за пример и шпоргалку! Принято на вооружение! )
Последний раз редактировалось hobot; 17.02.2015 в 05:13.
Никакой тайны. Как уже говорил, есть описание как в рамках документации на RT-11 так и на русском для рафоса. Иногда в эту библиотеку добавляли также фортрановские или паскалевские - просто чтобы не писать их в командной строке
Это требует подгрузки своего кода в область ПП. Как подгружать можно посмотреть в исходниках PRUN и многих других. Как вклиниваться в обработку клавиатуры можно посмотреть в исходниках KBFIX. А реализацию проще всего сделать такую, чтобы эти специальные клавиши транслировались в какой-то обычный ASCII код, а в программе читать их штатным образом. К примеру так поступала библиотека VIDI - принимала <ESC> последовательности и транслировала их в определенные CTRL-коды, в результате программе пофигу было какой терминал - она получала одинаковые коды.
Остальное пропустил как не несущее никакой конкретной информации - подразумевало, что я все эти программы видел и у меня в верхнем ящике стола лежат их исходники
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Нет я просто воспоминаниями делюсь - вкратце описав как это было организовано, то есть можно было одинаково успешно использовать
и в программах на ассемблере и в программах на паскале )
Вот прикольная иллюстрация в старой тетрадке обнаружил недавно !!!
Процедура ЧЕРЕП !!!Очень сильно подозреваю что это черепушка из КЦГД-шного LODE - видимо сначало должен был быть и для УК-НЦ (!), и возможно даже был (просто затерялся среди игровых пакетов, что в F-BIT продовались), а потом уже был перенесён на новенькие с КЦГД ДВКашки (хотя это только мои домыслы).
Картинки.
Скрытый текст
[свернуть]
form, возвращаясь к твоей шпоре, можно вот этуКод:PROCEDURE INIT; VAR ADDR : INTEGER; VALUE : INTEGER; BEGIN ADDR:= 36; VALUE:= IPEEK(ADDR) OR 4160; POKE(ADDR, VALUE); SCCA(CTRLC); END;
процедуру подробнее описать для танкистов-паскалистов )))
Меня конструкции типа ПЕРЕМЕННАЯ:=ЗНАЧЕНИЕ OR КОНСТАНТА
всегда в ступор приводят (я видимо мыслью иначе устроен иначе
был бы системщиком однозначно!) ADDR:= 36; и 4160 это ведь не от балды цифры, а про вызов SCCA(CTRLC); - я так понял надо
описание SCCA читать, но вот CTRLC переменная - что то я не понимаю её судьбу и значение? PEEK,POKE - это же бейсик !!! )))
---------- Post added at 21:48 ---------- Previous post was at 21:47 ----------
если это записать на ассемблере или как то развернуть как это выглядит для прямой как рельсы логики ?
Логическая операция. 36 (44 восьм) и 4160 (10100 восьм).
Берется значение адреса 44 (JSW), в нем устанавливаются 6й и 12й биты (10100), остальные биты не меняются. Эти биты устанавлвают посимвольный режим ввода без ожидния и обработки спецсимволов.
Здесь CTRLC не используется, система в этой переменной устанавливает флаг двойного нажатия CTRLC, что можно использовать для проверки этого условия (после проверки переменную нужно вручную обнулить). В программе не используется - мы просто вводом проверяем нажатие CTRL/C.
На ассемблере будет попроще конечно.
с объявлением в паскале какКод:.MCALL .SCCA,.TTINR,.TTYIN INIT:: BIS #10100,@#44 .SCCA #AREA,#AREA RETURN TTINR:: .TTINR RETURN TTYIN:: .TTYIN RETURN AREA: .BLKW 2
можно конечно обойтись без фортранизма, но я просто не знаю как в паскале возвращаются параметрыКод:PROCEDURE INIT; FORTRAN; FUNCTION TTINR: CHAR; FORTRAN; FUNCTION TTYIN: CHAR; FORTRAN
Последний раз редактировалось form; 27.03.2014 в 03:50.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
насколько я понимаю как ты сам оформишь так и возвратятся ) Из ассемблера в смысле?
Ну как то так
А если тебе допустим из примера выше надо присвоить или записать что то в N:integer то соответственноКод:10.1. ИСПОЛЬЗОВАНИЕ МАКРОАССЕМБЛЕРА ПАСКАЛЬ,РЕАЛИЗОВАННЫЙ ДЛЯ ДВК, ДАЕТ ВОЗМОЖНОСТЬ ВКЛЮЧАТЬ В ЛЮБОЕ МЕСТО ПРОГРАММЫ ОТДЕЛЬНЫЕ ФРАГМЕНТЫ НА ЯЗЫКЕ МАКРОАССЕМБЛЕР. ЧАСТИ ПРОГРАММЫ, НАПИСАННЫЕ НА МАКРОАССЕМБЛЕРЕ, МОГУТ ИСПОЛЬЗОВАТЬ ПЕРЕМЕННЫЕ ИЗ ПРОГРАММЫ НА ЯЗЫКЕ ПАСКАЛЬ, ХОТЯ ДЛЯ ЭТОГО ТРЕБУЕТСЯ НЕКОТОРОЕ ПОНИМАНИЕ ПРОЦЕССА ОРГАНИЗАЦИИ ВЫПОЛНЕНИЯ. ДЛЯ ВКЛЮЧЕНИЯ ФРАГМЕНТА НА АССЕМБЛЕРЕ ИСПОЛЬЗУЕТСЯ СПЕЦИАЛЬНЫЙ ВИД КОММЕНТАРИЕВ, НАПРИМЕР: CTP. 47 ЩИ1.700.016 ПО.04-01 35 PROCEDURE EMTTRAP (N:INTEGER); BEGIN (*$C ;НАЧАЛО ФРАГМЕНТА НА МАКРО MOV N(SP),-(SP) ;ПАРАМЕТР "N" -> В СТЕК EMT 53 ;ВЫЗВАТЬ ДИСПЕТЧЕР EMT *) END (* EMTTRAP*) ПРИ ИСПОЛЬЗОВАНИИ МАКРОАССЕМБЛЕРА СЛЕДУЕТ ПОМНИТЬ, ЧТО ОСНОВАНИЕМ СЧИСЛЕНИЯ ЧИСЛОВЫХ КОНСТАНТ ПО УМОЛЧАНИЮ ЯВЛЯЕТСЯ 10, А НЕ 8.
Это же должно работать и для глобальных подпрограмм.Код:MOV ЧТО-ТО, N(SP)
Если глобальная метка несёт в себе значение значит её
оформляем функцией нужного типа, если содержит кучу
операций то процедурой.
(но скорее всего я неправильно понял фразу про параметры.)
Можно, но с ним ПКМ интереснее и заставляет всё таки начинкойможно конечно обойтись без фортранизма
SYSLIB.OBJ обеспокоиться, раз там столько всего полезного.
В теме программирования (не в этой,а в старой по УК-НЦ) AlecV и
ты вскользь упоминаете, что Фортран вроде как системный язык DEC и RT-11, а я всю дорогу считал что MACRO-11 - ведь вроде весь монитор и PIP DUP всякие на макро написаны?
Я всегда был уверен что все вызовы .MCALL в исходниках макро
относятся к SYSMAC.SML ? И уточнение SYSLIB.OBJ при линковке
надо указывать ?
Ух! Все шпоры и разъяснения из последних сообщений взяты на вооружение! Надо бы мне кое что осмыслить и почитать прежде
чем ещё вопрос задать. Логические операции - моя встроенная логика пасует как и моя встроенная математика ) (*хобот собирает
все шпаргалки и идёт учить мат.часть )
---------- Post added at 05:22 ---------- Previous post was at 05:18 ----------
А есть ведь ещё GLIB - библиотека с линиями кружочками и прочей графикой аля бейсик - и даже вроде с исходниками (надо уточнять) - только я могу путать фортрановская она или Си-шная ? Надо уточнять.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)