Для общего развития пример на родном паскале без использования 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 .






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