БИБЛИОТЕКА СИСТЕМНЫХ ПОДПРОГРАММ
РУКОВОДСТВО ПРОГРАММИСТА

1. НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ БИБЛИОТЕКИ СИСТЕМНЫХ ПОДПРОГРАММ

1.1. Назначение

Библиотека системных подпрограмм (файл SYSLIB.OBJ) предназначена для выполнения различных системных операций в режиме любого монитора (SJ, FB и ХМ) операционной системы ФОДОС-2 и обеспечивает:

Список системных подпрограмм приведён в приложении 1.

1.2. Условия применения

1.2.1. Требования к техническим средствам

Для выполнения системных подпрограмм необходима следующая минимальная конфигурация технических средств:

1.2.2. Требования к программным средствам

Для работы с библиотекой системных подпрограмм необходимы следующие программные средства:

  1. компоненты операционной системы ФОДОС-2:

    FMON<YY>.SYS - монитор системы;

    SWAP.SYS - файл свопинга;

    <ZZ>.SYS - драйвер диска;

    TT.SYS - драйвер терминала;

    LINK.SAV - программа "Редактор связей";

    LIBK.SAV - программа "Библиотекарь";

    MACRO.SAV - транслятор с языка Ассемблер;

    EDIT.SAV - программа "Редактор текста";

    K13.SAV - программа "Экранный редактор";

    где YY - SJ, FB или ХМ;

    ZZ - RK, DX, DY, MX, MY или RKX, DXX, DYX

  2. компоненты системы Фортран/ФОДОС-2:

    FORTRA.SAV - транслятор с языка Фортран;

    FORLIB.OBJ - библиотека Фортрана.

1.2.3. Порядок использования библиотеки системных подпрограмм

Для выполнения системных подпрограмм необходимо предварительно выполнить следующие действия:

  1. составить программу на языке Фортран или языке Ассемблер с командами обращения к библиотеке;
  2. протранслировать программу и получить объектный модуль программы;
  3. связать объектный модуль программы с программами библиотеки и библиотеки Фортрана и получить загрузочный модуль;
  4. запустить полученный загрузочный модуль.

ПРИМЕЧАНИЯ.

  1. Для использования по умолчанию библиотеки Фортрана FORLIB.OBJ и оверлейных драйверов их следует включить в библиотеку SYSLIB.OBJ.

    Включение модулей FORLIB в библиотеку SYSLIB.OBJ выполняется по команде монитора

    LIBRARY/INSERT/REMOVE SYSLIB FORLIB <ВК>
    ?GLOBAL? ¤OYRH <ВК>
    ?GLOBAL? <ВК>
  2. Если в программе, вызывающей подпрограммы библиотеки, используется объявление IMPLICIT , изменяющее тип внешних функций, необходимо явно указать тип функций библиотеки, которые выдают результаты типа целый и вещественный.

1.2.4. Требования к оперативной памяти для Фортран - программ в основном режиме

Для выполнения в основном режиме Фортран - программы, вызывающей системные подпрограммы, объём оперативной памяти рассчитывается по формуле:

1/2(504+(35*N)+(R-136)+(А*512))+Z

где N и R - аргументы переключателей /N и /R транслятора с языка Фортран (по умолчанию N = 6, R = 136);

А - число одновременно открытых файлов. При использовании двойной буферизации значение А должно быть умножено на 2 (по умолчанию А = 1);

Z - дополнительный объём памяти, требуемый для выполнения подпрограмм IQSET, ICDFN, INTSET и системных подпрограмм, вызывающих подпрограммы завершения (см. табл. 1).

Таблица 1

Подпрограмма

Z

IQSET

10*Q

ICDFN

6*NM

INTSET

25*IN

Системная подпрограмма,
вызывающая подпрограмму завершения

64+R/2

Q - число дополнительных элементов очереди;

NM - число дополнительных каналов;

IN - число обращений к подпрограмме INTSET;

R - аргумент переключателя /R транслятора с языка Фортран.

Список системных подпрограмм, которые вызывают подпрограммы завершения, приведён в приложении 2.

Если для выполнения Фортран - программы в основном режиме недостаточно оперативной памяти, печатается сообщение:

?ERR 0 NON - FORTRAN ERROR CALL

(см. [3]).

1.2.5. Особенности использования USR

Программы на языке Ассемблера, которые обращаются к системным подпрограммам (и подпрограммам библиотеки Фортрана FORLIB), использующим USR, вызывают свопинг USR, если она не резидентна. USR помещается в область памяти, которая задаётся указателем стека и занимает 2К слов (10000(8) ячеек).

Необходимо следить за тем, чтобы FORLIB, программы на языке Ассемблер, а также подпрограммы завершения и обслуживания прерываний (и их данные) не располагались в области свопинга USR. Выполнение этого требования обеспечивается одним из следующих действий:

При вызове Фортран - программой системных подпрограмм, использующих USR (если она не резидентна), размер секции OTS¤I должен быть не менее 2К слов, в противном случае необходимо расширить OTS¤I до необходимой длины. Информация о распределении .MCALL секций приведена в документе [2].

1.2.6. Требования к подпрограммам завершения

Подпрограммы завершения создаются пользователями на языке Фортран или языке Ассемблер и не должны иметь более двух параметров. Например, на языке Фортран заголовок подпрограммы имеет вид:

SUBROUTINE CR[(A1[,A2])]

где CR - имя подпрограммы завершения;

A1 - слово состояния канала;

А2 - номер используемого канала.

Для подпрограмм завершения на языке Ассемблер А1 принимает значение содержимого R0, а А2 - содержимого R1.

При создании подпрограмм завершения необходимо учитывать следующее:

  1. каналы, предназначенные для использования подпрограммами завершения, должны назначаться по подпрограмме IGETC перед обращением к системной подпрограмме, освобождаться по IFREEC и объявляться в COMMON;
  2. первое обращение к системной подпрограмме, использующей подпрограмму завершения, должно осуществляться из основного задания;
  3. файлы, обрабатываемые подпрограммой завершения, должны открываться в основном задании;
  4. подпрограммы завершения не должны использовать системные подпрограммы, вызывающие USR (см. приложение 2);
  5. имена подпрограмм завершения и обслуживания прерываний, вызываемых системными подпрограммами ISCHED, ITIMER, IREADF и другие, должны быть объявлены в Фортран - программе с помощью EXTERNAL;
  6. выход из подпрограммы завершения на Фортране должен осуществляться по оператору RETURN;
  7. выход из подпрограммы завершения на языке Ассемблер должен осуществляться по команде RTS PC;
  8. подпрограммы завершения могут быть использованы повторно, но не могут вводиться многократно, то есть основная программа будет работать неправильно, если она будет прервана на уровне завершения;
  9. в режиме SJ в каждый момент времени должна выполняться только одна подпрограмма завершения.

Управление подпрограммами завершения осуществляется из системных подпрограмм (в которых предусмотрен их вызов) после окончания операции ввода-вывода данных или через заданный интервал времени.

Управление подпрограммами завершения различно в разных режимах. Подпрограммы завершения в режиме SJ могут прерывать друг друга, так как они выполняются с тем же приоритетом, что и устройство, прерывание от которого запланировало их. Например, подпрограмма завершения, вызываемая системной подпрограммой IWRITC для обслуживания устройства ТТ: выполняется с приоритетом 4. Подпрограмма завершения, вызываемая для обслуживания таймера, выполняется с тем же приоритетом, что и часы системы.

В режиме FB и ХМ подпрограммы завершения выполняются с нулевым приоритетом. Они не прерывают друг друга, а устанавливаются в очередь для последовательной обработки.

2. ОБРАЩЕНИЕ К ПОДПРОГРАММАМ.

Входные и выходные данные

Обращение к системным подпрограммам осуществляется на языке Фортран и на языке Ассемблер.

2.1. Обращение на Фортране

Обращение к системным подпрограммам на языке Фортран осуществляется как к внешней функции, если необходимо получить значение результата, или как к внешней подпрограмме, если значение результата не требуется.

Формат обращения:

I = F[(A1,A2,...,AN)]

или

CALL S[(A1,А2,...,AN)]

где

F

- символическое имя функции;

 

S

- символическое имя системной подпрограммы;

 

AN

- фактические параметры.

Например, подпрограмма LOCK может быть вызвана как CALL LOCK или I = LOCK

Существует ряд подпрограмм, которые не возвращают результат выполнения в качестве значения функции, поэтому обращение к таким подпрограммам как к внешним функциям не имеет смысла.

Обращение на языке Фортран осуществляется ко всем системным подпрограммам библиотеки SYSLIB.OBJ.

2.2. Обращение на Ассемблере

Обращение к системным подпрограммам на языке Ассемблер осуществляется по команде:

JSR PC,S

где

PC

- символическое имя счётчика команд;

 

S

- символическое имя системной подпрограммы.

До обращения к системной подпрограмме символическое имя этой подпрограммы должно быть объявлено как глобальное, в регистре R5 указан адрес списка параметров подпрограммы, первый элемент которого задаёт число параметров, второй - адрес первого параметра, третий - адрес второго параметра и т.д.

Программы на языке Ассемблер должны запоминать содержимое используемых регистров общего назначения до обращения к системным подпрограммам и восстановить их после выхода из подпрограммы.

Системные функции помещают результат в регистры общего назначения, в зависимости от типа данных результата (см. табл. 2).

Таблица 2

Тип результата

Регистры

Целый, логический

R0

Вещественный

R0 - R1:

R0 - старшие разряды результата

R1 - младшие разряды результата

Двойной точности

R0 - R3:

R0 - R2 - старшие разряды результата

R3 - младшие разряды результата

Комплексный

R0 - R3:

R0, R1 - старшие и младшие разряды действительной части результата

R2, R3 - старшие и младшие разряды мнимой части результата

Обращение на языке Ассемблер осуществляется ко всем системным подпрограммам библиотеки за исключением подпрограмм, перечисленных в приложении 2.

Пример обращения на языке Ассемблер:

        .GLOBL JMUL
               .
               .
               .
        MOV   #LIST,R5
        JSR   PC,JMUL
        CMP   #-2,R0
        BEQ   OVRFL
               .
               .
               .
LIST:   .WORD 3
        .WORD OPR1
        .WORD OPR2
        .WORD RESULT
OPR1:   .WORD 100
        .WORD 0
OPR2:   .WORD 10
        .WORD 10
RESULT: .BLKW 2
        .END

2.3. Входные и выходные данные.

 Входными и выходными даннымидля системных подпрограмм являются данные типа целый, вещественный, двойной точности, логический и текстовый. Запись данных и представление их в машине приведено в документах [2], [4].

3. ХАРАКТЕРИСТИКИ ПОДПРОГРАММ

В данном разделе описаны характеристики системных подпрограмм, особенности их выполнения, приведены примеры.

Обращение к системным подпрограммам приведено на языке Фортран. Число параметров и порядок их следования сохраняется при обращении к подпрограммам на языке Ассемблер.

Системные подпрограммы осуществляют:

  1. операции с файлами;
  2. передачу данных;
  3. операции с каналами;
  4. описание устройств и файлов;
  5. работу с таймером;
  6. системные операции;
  7. операции с данными INTEGER*4;
  8. операции с текстовыми данными;
  9. преобразования RADIX-50;
  10. работу в мультитерминальном режиме;
  11. вспомогательные операции.

В табл. 3 приведены условные обозначения часто используемых параметров подпрограмм.

Таблица 3

Обозна- чение

Описание параметра

С

Целое или имя переменной типа целый, определяющей номер канала

D

Имя четырёхсловного массива типа целый, содержащего спецификацию файла (уст:имфайл.тип) в коде RADIX-50 (каждый элемент массива занимает одно слово памяти)

В

Целое или имя переменной типа целый, определяющей номер блока в файле, в который записываются или из которого считываются данные

BF

Имя массива типа целый, определяющего область памяти, используемую как буфер ввода-вывода

CR

Имя подпрограммы завершения на языке Ассемблер или на языке Фортран

AR

Имя четырёхсловного массива типа целый, используемого подпрограммой завершения для связи

W

Целое или имя переменной типа целый, определяющей число слов, передаваемых во время операций ввода-вывода

UN

Целое или имя переменной типа целый, определяющей логический номер терминала

LE

Целое или имя переменной типа целый, определяющей максимальное число символов в текстовом данном

ER

Имя переменной типа целый, определяющей признак ошибки

I

Имя переменной типа целый, которой присваивается значение функции

H

Целое или имя переменной типа целый, определяющей время в часах

М

Целое или имя переменной типа целый, определяющей время в минутах (от 00 до 59)

S

Целое или имя переменной типа целый, определяющей время в секундах (от 00 до 59)

T

Целое или имя переменной типа целый, определяющей время в долях секунды (доля секунды - 1/50 секунды для 50-герцового таймера).

ПРИМЕЧАНИЯ.

  1. Под данными типа целый понимаются данные INTEGER*2.
  2. Параметры, указанные в табл. 3, далее в подпрограммах не описываются.

3.1. Операции с файлами

Во время выполнения операций с файлами драйвер соответствующего устройства должен быть резидентным.

3.1.1. CLOSEC/ICLOSE

Назначение: закрытие канала и разрешение его использования в другой операции.

Обращение:

CALL CLOSEC(C[,I])
I = CLOSEC(C)
CALL ICLOSE(C[,I])
I = ICLOSE(C)

Значение функции:

I = 0 подпрограмма выполнена;

I = -4 файл с указанным именем существует и защищён. На устройстве записан второй файл с тем же именем.

Ограничения:

  1. CLOSEC нельзя вызывать из подпрограммы завершения или обслуживания прерываний.
  2. CLOSEC (или PURGE) может быть выполнена для любого канала, назначенного для ввода или вывода данных. Вызов CLOSEC для не назначенного канала игнорируется.

ПРИМЕЧАНИЕ. CLOSEC, которая выполняется для канала, связанного с файлом, открытым по подпрограмме IENTER, вызывает корректировку справочника устройства и файл становится постоянным. Если устройство уже содержит файл с тем же именем и типом файла, старый файл стирается, когда новый становится постоянным. Применение CLOSEC к файлу, открытому с помощью LOOKUP, не изменяет справочника устройства.

Пример:

    REAL*4 DBLK(2)
    DATA DBLK/6RSY0NEW,6RFILDAT/
    DATA ISIZE/56/
          .
          .
          .
    ICHAN = IGETC()
    IF(ICHAN.LT.0) GOTO 100
    IERR = IENTER(ICHAN,DBLK,ISIZE)
    IF(IERR.LT.0) GOTO 20
20  GOTO(100,120,130) ABS(IER)
    CALL ICLOSE(ICHAN, I)
    IF(I.EQ.-4) GOTO 20
    CALL IFREEC(ICHAN)
    CALL EXIT
100 STOP 'NO AVAILABLE CHANNELS'
110 STOP 'CHANNEL ALREADY IN USE'
120 STOP 'NOT ENOUGH ROOM ON DEVICE'
130 STOP 'DEVICE IN USE'
200 STOP 'PROTECTION ERROR'
    END

3.1.2. IDELET

Назначение: стирание файла с заданного устройства.

Обращение:

I = IDELET(С,D[,SN])

Описание параметров:

SN - целое или имя переменной типа целый, определяющей номер файла для магнитной ленты кассетного типа или способ поиска файла для магнитной ленты;

-1 - поиск файла по его имени с текущего положения магнитной ленты;

0 - перемотка магнитной ленты и поиск файла по его имени;

N - поиск файла с последовательным номером N (N-го файла от начала ленты).

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 указанный канал занят;

I = 2 указанный файл не найден на устройстве;

I = 3 устройство занято;

I = 4 файл с указанным именем существует и защищён.

Ограничения: IDELET не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЕ. После выполнения IDELET указанный канал освобождается.

Пример:

    REAL*4 FILNAM(2)
    DATA FILNAM/6RSY0FTN,6R5  DAT/
          .
          .
          .
    I = IGETC()
    IF(I.LT.0) STOP 'NO CHANNEL'
    CALL IDELET(I,FILNAM)
    CALL IFREEC(I)

3.1.3. IENTER

Назначение: открытие канала и резервирование области на томе для записи временного файла с заданным именем.

Обращение:

I = IENTER(C,D,L[,SN])

Описание параметров:

L - целое или имя переменной типа целый, определяющей размер резервируемой области на томе:

0 - половина наибольшей свободной области, либо вторая по величине свободная область в зависимости от того, которая больше;

N - число блоков;

1 - наибольшая свободная область;

SN - то же, что в п. 3.1.2 и SN = -2:

Значение функции:

I = -1 указанный канал занят;

I = -2 не найдена область большая либо равная N блоков при значении L = N;

I = -3 устройство занято;

I = -4 файл с указанным именем существует и защищён;

I = -5 файл с данным последовательным номером не найден;

I = N подпрограмма выполнена. N - число блоков, зарезервированных для файла (N = 0 для устройств нефайловой структуры).

Ограничения: IENTER не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

Пример:

    REAL*4 DBLK(2)
    DATA DBLK/6RSY0TEM,6RP  ТМР/
    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'NO AVAILABLE CHANNEL'
          .
          .
          .
    IF(IENTER(ICHAN,DBLK,20).LT.0) STOP 'ENTER FAILURE'
          .
          .
          .
    CALL PURGE(ICHAN)
    CALL IFREEC(ICHAN)

3.1.4. IFPROT

Назначение: установление или отмена защиты файла от стирания.

Обращение:

 I = IFPROT(C,F,P)

Описание параметров:

C - целое или имя переменной типа целый, определяющей номер канала, на котором будет осуществлена защита;

F - буквенно-цифровой литерал, содержащий спецификацию защищаемого файла в виде уст:имфайл.тип;

P - целое, принимающее значение 1 или 0:

1 - установить защиту файла;

0 - отменить защиту файла.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 канал занят;

I = 2 файл не найден;

I = 3 недопустимая операция;

I = 4 недопустимое значение параметра Р.

Пример:

В данном примере устанавливается защита файла SY:RITAFB.SYS от стирания.

    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'CANNOT ALLOCATE CHANNEL'
    I = IFPROT(ICHAN,'SY:RITAFB.SYS',1)
          .
          .
          .
    END

3.1.5. IRENAM

Назначение: переименование указанного файла на заданном устройстве.

Обращение:

I = IRENAM(C,D)

Описание параметров:

D - имя восьмисловного массива, содержащего спецификации файлов в коде RADIX-50:

D(1) - D(4) - старая спецификация файла;

D(5) - D(8) - новая спецификация файла;

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 указанный канал занят;

I = 2 указанный файл не найден на устройстве;

I = 3 файл с указанным именем существует и защищён.

ПРИМЕЧАНИЕ. Если файл с указанным именем и типом уже существует на устройстве, то он стирается.

Пример:

    REAL*8 NAME(2)
    DATA NAME/12RDK0FTN2  DAT,12RDK0FTN2  OLD/
          .
          .
          .
    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'NO CHANNEL'
    CALL IRENAM(ICHAN,NAME)
    CALL IFREEC(ICHAN)

3.1.6. ISFDAT

Назначение: изменение даты создания файла на устройстве файловой структуры.

Обращение:

I = ISFDAT(C,D,IDAT)

Описание параметров:

C - целое или имя переменной типа целый, определяющей номер используемого канала;

D - имя массива типа целый, определяющего спецификацию файла в коде RADIX-50, дата создания которого изменяется;

IDAT - целое, определяющее дату в формате ФОДОС-2.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 канал занят;

I = 2 файл не найден;

I = 3 недопустимая операция.

Пример:

В данном примере изменяется дата создания файла MY1:OLD23.DAT на 4 июля 1976 года.

    REAL*4 FILNAM(2)
    DATA FILNAM/6RMY1OLD,6R23 DAT/
    IDATE = 7*1024+4*32+(1976-1972)
    ICHAN = IGETC()
    I = ISFDAT(ICHAN,FILNAM,IDATE)
    IF(I.NE.0) STOP 'ERROR DURING ISFDAT CALL'
          .
          .
          .
    END

3.1.7. LOOKUP

Назначение: установление связи указанного канала с устройством и/или существующим файлом для выполнения операций ввода-вывода.

Обращение:

I = LOOKUP(C,D[,CT,SN])
I = LOOKUP(C,JB)

Описание параметров:

CT - необязательный параметр, используемый для драйвера - магнитной ленты кассетного типа. Целое или имя переменной типа целый. По умолчанию CT = 0.

SN - то же, что в п. 3.1.2.

JB - четырёхсловный описатель задания, которому передаются или от которого принимаются сообщения. Первое слово может содержать имя устройства в коде RADIX-50, второе, третье и четвёртое слово - логическое имя задания, состоящее из 6 символов в коде КОИ-7.

Значение функции:

I = N подпрограмма выполнена. N - число блоков в файле; I = 0 выполнен нефайловый LOOKUP на устройстве произвольного доступа или на устройстве нефайловой структуры или выполнен файловый LOOKUP на магнитной ленте;

I = -1 указанный канал занят;

I = -2 указанный файл не найден на устройстве;

I = -3 устройство занято;

I = -4 драйвер магнитной ленты нерезидентен;

I = -5 недопустимый параметр для устройства файловой, структуры;

I = -6 недопустимый параметр для устройства нефайловой структуры.

ПРИМЕЧАНИЯ.

  1. Используемый канал будет занят до выполнения одной из подпрограмм:

    CLOSEC или ICLOSE

    ISAVES

    PURGE

  2.  Если имя файла не задано (второе слово в параметре D равно 0) и устройство имеет файловую структуру, то началом "файла" считается абсолютный нулевой блок устройства. В этом случае говорят о нефайловом LOOKUP. Таким образом можно осуществить ввод-вывод на любой физический блок устройства. Если имя файла определено для устройства нефайловой структуры (например, LP:FILE.TYP), то имя файла игнорируется.
  3. Если логическое имя задания в параметре JB не задано, то канал может быть открыт только для ввода данных (по запросу .READ/.READC/.READW) или приёма сообщения от другого задания.

Примеры:

  1.  
        INTEGER*2 DBLK(4)
        DATA DBLK/3RDK0,3RFTN,3R44 ,3RDАТ/
        ICHAN = IGETC()
        IF(ICHAN.LT.0) STOP 'NO CHANNEL'
        IF(IFETCH(DBLK).NE.0) STOP 'BAD FETCH'
        IF(LOOKUP(ICHAN,DBLK).LT.0) STOP 'BAD LOOKUP'
        CALL ICLOSE(ICHAN,I)
        I = ICLOSE()
        CALL IFREEC(ICHAN)
              .
              .
              .
  2. Использование LOOKUP в системном задании:
        LOGICAL*1 JNAM(6)
        DIMENSION JBLK(4)
        EQUIVALENCE(JNAM(1),JBLK(2))
        DATA JNAM/'Q','U','E','U','E',0/
        DATA JBLK(1)/3RMQ /
    C   OPEN A MESSAGE CHANNEL TO 'QUEUE'
        ICHN = IGETC()
        IF(LOOKUP(ICHN,JBLK).LT.0) STOP 'QUEUE IS NOT RUNNING'
              .
              .
              .

3.2. Передача данных

3.2.1. IABTIO

Назначение: прерывание ввода-вывода на указанном канале.

Обращение:

CALL IABTIO(C)

Описание параметров:

C - целое или имя переменной типа целый, определяющей номер канала, на котором прерывается ввод-вывод.

3.2.2. GTLIN

Назначение: ввод текстового данного с системного терминала или косвенного файла.

Обращение:

CALL GTLIN(R[,PR])

Описание параметров:

R - имя массива типа LOGICAL*1 для приёма текстового данного. Число элементов массива R должно быть на единицу больше числа символов текстового данного;

PR - имя массива типа LOGICAL*1, содержащего побуждающий символ (или последовательность символов).

ПРИМЕЧАНИЯ:

  1. Размещение текстового данного в массиве приведено в п. 3.8.
  2. Число символов вводимого текстового данного должно быть не более 80.
  3. Побуждающий символ печатается на терминале подпрограммой для указания начала ввода текстового данного.

Пример:

    LOGICAL*1 INP(80),PROMT(6)
    DATA PROMT /'N','А','М','E','?',"200/
          .
          .
          .
    CALL GTLIN(INP,PROMT)

3.2.3. IRCVD/IRCVDC/IRCVDF/IRCVDW (режим FB)

Подпрограммы группы IRCVD используются в режиме FB с подпрограммами группы ISDAT (п. 3.2.5) для обмена данными (или сообщениями) между основным и фоновым заданиями.

3.2.3.1. IRCVD

Назначение: приём данных от другого задания в синхронном режиме ввода-вывода.

Обращение:

I = IRCVD(BF,W)

Описание параметров:

BF - имя массива типа целый, в который записываются данные, передаваемые другим заданием. Число элементов массива должно быть на единицу больше числа передаваемых, данных W. Первый элемент массива BF содержит число фактически принятых слов.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 попытка обращения к несуществующему заданию.

Пример:

    INTEGER*2 MSG(41)
    CALL IRCVD(MSG,40)
          .
          .
          .
    CALL MWAIT
3.2.3.2. IRCVDC

Назначение: приём данных от другого задания в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Ассемблер.

Обращение:

I = IRCVDC(BF,W,CR)

Описание параметров:

BF - то же, что в п. 3.2.3.1.

Значение функции: то же, что в п. 3.2.3.1.

3.2.3.3. IRCVDF

Назначение: приём данных от другого задания в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Фортран.

Обращение:

I = IRCVDF(BF,W,AR,CR)

Описание параметров:

BF - то же, что в п. 3.2.3.1.

Значение функции: то же, что в п. 3.2.3.1.

Пример:

    INTEGER*2 MSG(41),AREA(4)
    EXTERNAL RMSGRT
          .
          .
          .
    CALL IRCVDF(MSG,40,AREA,RMSGRT)
3.2.3.4. IRCVDW

Назначение: приём данных от другого задания в модифицированном синхронном режиме ввода-вывода.

Обращение:

I = IRCVDW(BF,W)

Описание параметров:

BF - то же, что в п. 3.2.3.1.

Значение функции: то же, что в п. 3.2.3.1.

Пример:

    INTEGER*2 MSG(41)
    IF(IRCVDW(MSG,40).NE.0) STOP 'UNEXPECTED ERROR'
          .
          .
          .

ПРИМЕЧАНИЕ. Подпрограммы группы IRCVD используют элемент очереди, что необходимо учитывать при обращении к подпрограмме IQSET (п. 3.6.6).

3.2.4. IREAD/IREADC/IREADF/IREADW

Подпрограммы группы IREAD используются с подпрограммами группы IWRITE (п. 3.2.9).

3.2.4.1. IREAD

Назначение: приём данных в буфер памяти по указанному каналу в синхронном режиме ввода-вывода.

Обращение:

I = IREAD(W,BF,B,C)

Описание параметров:

BF - имя массива типа целый, предназначенного для записи передаваемых данных. Число элементов массива должно быть не менее W.

Значение функции:

I = N подпрограмма выполнена: N - число принятых блоков (0 - для устройств нефайловой структуры);

I = -1 попытка чтения после признака конца файла;

I = -2 аппаратная ошибка;

I = -3 указанный канал не открыт.

Пример:

     INTEGER*2 BUFFER(256),RCODE,BLK
               .
               .
               .
     RCODE = IREAD(256,BUFFER,BLK,ICHAN)
     IF(RCODE+1) 1010,1000,10
     IF(IWAIT(ICHAN).NE.0) GOTO 1010
C    IF NO ERROR, START HERE
10             .
               .
               .
1000 CONTINUE
               .
               .
               .
     CALL EXIT
1010 STOP 'FATAL READ'
     END
3.2.4.2. IREADC

Назначение: приём данных в буфер памяти по указанному каналу в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Ассемблер.

Обращение:

I = IREADC(W,BF,B,C,CR)

Описание параметров:

BF - то же, что в п. 3.2.4.1.

Значение функции: то же, что в п. 3.2.4.1.

Пример:

    INTEGER*2 IBUF(256),RCODE,IBLK
    EXTERNAL RDCMP
          .
          .
          .
    RCODE = IREADC(256,IBUF,IBLK,ICHAN,RDCMP)
3.2.4.3. IREADF

Назначение: приём данных в буфер памяти по указанному каналу в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Фортран.

Обращение:

I = IREADF(W,BF,B,C,AR,CR)

Описание параметров:

BF - то же, что в п. 3.2.4.1.

Значение функции: то же, что в п. 3.2.4.1.

Пример:

    INTEGER*2 DBLK(4),BUFFER(256),BLKNO
    DATA DBLK/3RMXO,3RINP,3RUT ,3RDAT/,BLKNO/0/
    EXTERNAL RCMPLT
    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'NO CHANNEL AVAILABLE'
    IF(IFETCH(DBLK).NE.0) STOP 'BAD FETCH'
    IF(LOOKUP(ICHAN,DBLK).LT.0) STOP 'BAD LOOKUP'
          .
          .
          .
20  IF(IREADF(256,BUFFER,BLKNO,ICHAN,DBLK,RCMPLT).LT.0)
   +GOTO 100
    CALL IWAIT(ICHAN)
    BLKNO = BLKNO+1
    GOTO 20
          .
          .
          .
100 CALL ICLOSE(ICHAN,I)
    I = ICLOSE()
    CALL IFREEC(ICHAN)
          .
          .
          .
    CALL EXIT
    END
    SUBROUTINE RCMPLT(I,J)
          .
          .
          .
    RETURN
    END
3.2.4.4. IREADW

Назначение: приём данных в буфер памяти по указанному каналу в модифицированном синхронном режиме ввода-вывода.

Обращение:

I = IREADW(W,BF,B,C)

Описание параметров:

BF - то же, что в п. 3.2.4.1.

Значение функции: то же, что в п. 3.2.4.1.

Пример:

    INTEGER*2 IBUF(1024)
    ICODE = IREADW(1024,IBUF,IBLK,ICHAN)
    IF(ICODE.EQ.-1) GOTO 100
    IF(ICODE.LT.-1) GOTO 200
          .
          .
          .
    ICODE = IWRITW(1024,IBUF,IBLK,ICHAN)

3.2.5. ISDAT/ISDATC/ISDATF/ISDATW (режим FB)

Подпрограммы группы ISDAT используются в режиме FB с подпрограммами группы IRCVD (см. п. 3.2.3) для обмена данными (или сообщениями). Буфер, содержащий данные, не должен модифицироваться или повторно использоваться до тех пор, пока данные не будут приняты другим заданием.

3.2.5.1. ISDAT

Назначение: передача данных другому заданию в синхронном режиме ввода-вывода.

Обращение:

I = ISDAT(BF,W)

Описание параметров:

BF - имя массива типа целый, содержащего данные, которые необходимо передать.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 попытка обращения к несуществующему заданию.

Пример:

    INTEGER*2 MSG(40)
          .
          .
          .
    CALL ISDAT(MSG,40)
          .
          .
          .
    CALL MWAIT
3.2.5.2. ISDATC

Назначение: передача данных другому заданию в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Ассемблер.

Обращение:

I = ISDATC(BF,W,CR)

Описание параметров:

BF - то же, что в п. 3.2.5.1.

Значение функции: то же, что в п. 3.2.5.1.

Пример:

    INTEGER*2 MSG(40)
    EXTERNAL RTN
          .
          .
          .
    CALL ISDATC(MSG,40,RTN)
3.2.5.3. ISDATF

Назначение: передача данных другому заданию в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Фортран.

Обращение:

I = ISDATF(BF,W,AR,CR)

Описание параметров:

BF - то же, что в п. 3.2.5.1.

Значение функции: то же, что в п. 3.2.5.1.

Пример:

    INTEGER*2 MSG(40),SPOT(4)
    EXTERNAL RTN
          .
          .
          .
    CALL ISDATF(MSG,40,SPOT,RTN)
3.2.5.4. ISDATW

Назначение: передача данных другому заданию в модифицированном синхронном режиме ввода-вывода.

Обращение:

I = ISDATW(BF,W)

Описание параметров:

BF - то же, что в п. 3.2.5.1.

Значение функции: то же, что в п. 3.2.5.1.

Пример:

    INTEGER*2 MSG(40)
          .
          .
          .
    IF(ISDATW(MSG,40).NE.0) STOP 'FOREGROUND JOB NOT
    + RUNNING'

3.2.6. ITTINR

Назначение: ввод символа с системного терминала.

Обращение:

I = ITTINR

Значение функции:

I>0 подпрограмма выполнена;

I<0 нет символа в буфере ввода (пользователь его не напечатал).

В ФОДОС-2 различают два режима ввода-вывода с терминала - общий и специальный. Режим ввода-вывода определяется значением 12-го разряда слова состояния задания (ССЗ, ячейка 000044). Формат ССЗ приведён в документе [1]. Если значение 12-го разряда ноль, то говорят об общем режиме ввода-вывода, в противном случае - специальном.

В общем режиме ввода-вывода выполняются следующие действия:

  1. монитор отвечает "эхо" - печатью каждого вводимого с терминала символа; коды символов нижнего регистра автоматически преобразуются в коды символов верхнего регистра, если не установлен разряд 14 ССЗ;
  2. стирание символа и последовательности символов осуществляется с помощью команд ЗБ и СУ/U соответственно;
  3. прежде, чем символ или последовательность символов станут доступными для программы пользователя, должен быть напечатан один из ограничителей: <ВК>, <ПС>, команда СУ/Z или СУ/C. Возврат каретки и перевод строки также передаются программе пользователя;
  4. восьмеричные коды 175 и 176 преобразуются в восьмеричный код 33.

В специальном режиме ввода-вывода выполняются следующие действия:

  1. монитор не отвечает "эхо" - печатью каждого вводимого с терминала символа, кроме СУ/C и СУ/D;
  2. СУ/U и ЗБ не выполняют своих функций;
  3. вводимые символы сразу становятся доступными программе пользователя;
  4. нет преобразования кодов 175 и 176 в код 33.

ПРИМЕЧАНИЯ.

  1. В специальном режиме пользователь должен организовать в программе "эхо" - печать вводимых символов, если необходимо проконтролировать ввод. Команды СУ/C и СУ/D выполняют свои обычные функции. Разряды 12 и 14 ССЗ должны устанавливаться программой пользователя, если требуется специальный режим и символы нижнего регистра. Эти разряды очищаются системой, когда управление передаётся монитору.
  2. В режиме FB, если разряд 6 ССЗ не установлен, программа ITTINR приостанавливается в ожидании символа (результат I<0 не выдаётся). Если разряд 6 ССЗ установлен, программа не ждёт вводимого символа и продолжает выполняться; при этом I<0.
  3. Установить и/или очистить разряды ССЗ можно по подпрограмме IPOKE (п. 3.11.6).
  4. В режиме FB команды СУ/F и СУ/B выполняются независимо от состояния разряда 12 ССЗ.

3.2.7. ITTOUR

Назначение: вывод символа на системный терминал.

Обращение:

I = ITTOUR(CH)

Описание параметров:

CH - выводимый символ.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 буфер терминала переполнен.

ПРИМЕЧАНИЯ.

  1. Значение функции I = 1 означает, что буфер терминала, переполнен и символ не может быть выведен на терминал.
  2. В режиме FB I не принимает значение равное 1, если разряд 6 ССЗ не установлен. В этом случае выполнение задания приостанавливается до тех пор, пока не освободится место в буфере терминала. Если разряд 6 ССЗ установлен, задание не ждёт освобождения места в буфере, продолжает выполняться, но I в этом случае принимает значение 1.

3.2.8. IWAIT

Назначение: ожидание завершения передачи данных по указанному каналу.

Обращение:

I = IWAIT(C)

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 указанный канал не открыт;

I = 2 аппаратная ошибка во время выполнения предыдущей операции ввода-вывода.

ПРИМЕЧАНИЕ. IWAIT используется обычно с подпрограммами IREAD, IWRITE, ISPFN и не влияет на выполнение подпрограмм завершения.

3.2.9. IWRITE/IWRITC/IWRITF/IWRITW

 Подпрограммы группы IWRITE используются с подпрограммами группы IREAD (см. п. 3.2.4).

3.2.9.1. IWRITE

Назначение: передача данных из памяти в устройство по указанному каналу в синхронном режиме ввода-вывода.

Обращение:

I = IWRITE(W,BF,B,C)

Описание параметров:

BF - имя массива типа целый, содержащего передаваемые данные.

Значение функции:

I = N подпрограмма выполнена: N - число переданных блоков (0 - для устройств нефайловой структуры);

I = -1 попытка записать данные после признака конца файлам;

I = -2 аппаратная ошибка;

I = -3 указанный канал не открыт.

3.2.9.2. IWRITC

Назначение: передача данных из памяти в устройство по указанному каналу в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Ассемблер.

Обращение:

I = IWRITC(W,BF,B,C,CR)

Описание параметров:

BF - то же, что в п. 3.2.9.1.

Значение функции: то же, что в п. 3.2.9.1.

Пример:

    INTEGER*2 IBUF(256)
    EXTERNAL(CRTN)
          .
          .
          .
    ICODE = IWRITC(256,IBUF,IBLK,ICHAN,CRTN)
3.2.9.3. IWRITF

Назначение: передача данных из памяти в устройство по указанному каналу в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Фортран.

Обращение:

I = IWRITF(W,BF,B,C,AR,CR)

Описание параметров:

BF - то же, что в п. 3.2.9.1.

Значение функции: то же, что в п. 3.2.9.1.

Пример:

    INTEGER*2 DBLK(4),BUFFER(256),BLKNO
    DATA DBLK/3RMX0,3RINP,3RUT ,3RDAT/,BLKNO/0/
    EXTERNAL RCMPLT
          .
          .
          .
    ICODE = IWRITF(256,BUFFER,BLKNO,ICHAN,DBLK,RCMPLT)
          .
          .
          .
    END
    SUBROUTINE RCMPLT(I,J)
          .
          .
          .
    RETURN
    END
3.2.9.4. IWRITW

Назначение: передача данных из памяти в устройство по каналу в модифицированном синхронном режиме ввода-вывода.

Обращение:

I = IWRITW(W,BF,B,C)

Описание параметров:

BF - то же, что в п. 3.2.9.1.

Значение функции: то же, что в п. 3.2.9.1.

Пример:

    INTEGER*2 IBUF(1024)
          .
          .
          .
    ICODE = IREADW(1024,IBUF,IBLK,ICHAN)
    IF(ICODE.EQ.-1) GOTO 100
    IF(ICODE.LT.-1) GOTO 200
          .
          .
          .
    ICODE = IWRITW(1024,IBUF,IBLK,ICHAN)

3.2.10. MWAIT (режим FB)

Назначение: ожидание завершения передачи данных между заданиями.

Обращение:

CALL MWAIT

ПРИМЕЧАНИЯ.

  1. Подпрограмма MWAIT используется в основном с подпрограммами группы IRCVD и ISDAT.
  2. MWAIT использует элемент очереди, что необходима учитывать при обращении к подпрограмме IQSET (см. п. 3.6.6).

Пример использования подпрограммы MWAIT приведён в п. 3.2.5.

3.2.11. PRINT

Назначение: вывод текстового данного на системный терминал.

Обращение:

CALL PRINT(ST)

Описание параметров:

ST - выводимое текстовое данное.

ПРИМЕЧАНИЯ.

  1. Текстовое данное должно заканчиваться либо нулевым байтом, либо байтом 200(B). В первом случае после вывода текстового данного автоматически осуществляется возврат каретки и перевод строки.
  2. В режиме FB в случае переключения системного терминала на обслуживание другого задания каждому сообщению предшествует побуждающий символ B> или F> в зависимости от того, какое задание его печатает (B> - фоновое, F> - основное). Текст, следующий за побуждающим символом, печатается заданием до тех пор, пока не будет на печатан другой символ F> или B>.
  3. При использовании PRINT в основном задании сообщение выводится немедленно, независимо от состояния фонового задания. В связи с этим подпрограмму PRINT следует использовать для вывода экстренных сообщений.
  4. Подпрограмма PRINT может быть использована для печати сообщений подпрограммами завершения. Управление возвращается программе пользователя после того, как все символы будут помещены в выходной буфер терминала.

Пример:

    CALL PRINT('THE COFFEE IS READY')

3.3. Операции с каналами

Для ввода-вывода данных в системе Фортран/ФОДОС-2 используется 16 каналов с номерами от 0 до 17(8). Число каналов можно увеличить до 254(10) по подпрограмме ICDFN.

Каналы, используемые для выполнения операций ввода-вывода, должны резервироваться в основной программе или её подпрограммах, но не в подпрограмме завершения.

Каналы назначаются по подпрограмме IGETC (п. 3.3.5) и возвращаются по IFREEC (п. 3.3.4).

3.3.1. ICDFN

Назначение: увеличение числа доступных каналов ввода-вывода.

Обращение:

I = ICDFN(NM[,AR])

Описание параметров:

NM - целое или имя переменной типа целый, определяющей число каналов ввода-вывода в десятичной системе счисления, 16<NM<=254;

AR - имя массива типа целый, определяющего область памяти для новых каналов.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 попытка определить меньше 16 каналов;

I = 2 для новых каналов недостаточно зарезервированной области памяти.

Ограничения: ICDFN не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. Подробная информация по определению области памяти для каналов приведена в документе [1].
  2. ICDFN рекомендуется использовать в начале основной программы перед выполнением операций ввода-вывода.
  3. Каждый раз ICDFN формирует новый набор каналов. Первоначально определённые каналы переопределяются.
  4. При использовании ICDFN в основном задании необходима дополнительная память (см. п. 1.2.4).

Пример:

    IF(ICDFN(24).EQ.2) STOP 'NOT ENOUGH MEMORY'

3.3.2. ICHCPY (режим FB)

Назначение: открытие канала и установление логической связи с каналом другого задания.

Обращение:

I = ICHCPY(C,OC)

Описание параметров:

C - целое или имя переменной типа целый, определяющей номер канала текущего задания, который используется заданием для приёма данных;

OC - целое или имя переменной типа целый, определяющей номер канала другого задания, файл которого должен быть связан с каналом C.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 нет другого задания или канал его не открыт;

I = 2 канал C занят.

Ограничения: файл, открытый на устройстве последовательного доступа, не может быть скопирован.

ПРИМЕЧАНИЯ.

  1. Если файл другого задания был открыт для формирования по подпрограмме IENTER (см. п. 3.1.3) или программному запросу .ENTER, то канал текущего задания указывает на файл, длина которого соответствует длине файла, сформированного к моменту выполнения подпрограммы ICHCPY.
  2. Программа текущего задания может производить запись в файл, который формируется другим заданием, по каналу копирования так, как если бы текущее задание формировало файл. Если при этом канал другого задания закрыт, то файл не формируется.

3.3.3. ICSTAT (режим FB)

Назначение: получение информации о состоянии канала ввода-вывода.

Обращение:

I = ICSTAT(C,AD)

Описание параметров:

AD - имя шестисловного массива типа целый, в который записывается информация о состоянии указанного канала:

AD(1) - слово состояния канала;

AD(2) - номер начального блока файла;

AD(3) - длина файла в блоках;

AD(4) - номер последнего блока, записанного в файл с момента открытия файла;

AD(5) - номер привода устройства, с которым связан канал;

AD(6) - имя устройства в коде RADIX-50, с которым связан канал.

Формат слова состояния канала приведён в приложении 3.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 канал не открыт.

Пример:

    INTEGER*2 AREA(6)
    I = 7
    IF(ICSTAT(I,AREA).NE.0) TYPE 99,I
99  FORMAT(1X,'CHANNEL',14,'IS NOT OPEN')

3.3.4. IFREEC

Назначение: возвращение номера указанного канала ввода-вывода в список доступных номеров каналов.

Обращение:

I = IFREEC(C)

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 номер канала не принадлежит списку каналов, назначенных по подпрограмме IGETC (п. 3.3.5).

Ограничения: подпрограмма IFREEC не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. Перед вызовом IFREEC канал должен быть закрыт или освобождён с помощью подпрограммы CLOSEC (см. п. 3.1.1) или PURGE (п. 3.3.9).
  2. Подпрограмма IFREEC возвращает номера тех каналов, которые были назначены по подпрограмме IGETC.

Пример:

    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'CANNOT ALLOCATE CHANNEL'
          .
          .
          .
    CALL IFREEC

3.3.5. IGETC

Назначение: назначение номера канала (от 0 до 17) для выполнения операций ввода-вывода.

Обращение:

I = IGETC()

Значение функции:

I = -1 нет свободных каналов;

I = N назначен канал N.

Ограничения: подпрограмма IGETC не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

Пример:

    ICHAN = IGETC()
    IF(ICHAN.LT.0) STOP 'CANNOT ALLOCATE CHANNEL'
          .
          .
          .
    CALL IFREEC(ICHAN)
          .
          .
          .
    END

3.3.6. ILUN

Назначение: определение номера канала, с которым связано логическое устройство.

Обращение:

I = ILUN(LN)

Описание параметров:

LN - целое или имя переменной типа целый, определяющей номер логического устройства (от 1 до 99).

Значение функции:

I = 1 логическое устройство не открыто;

I = -2 логическим устройством является терминал;

I = N, N - номер канала, с которым связано данное логическое устройство.

Пример:

    PRINT 99
99  FORMAT('PRINT LOGICAL UNIT 6, WHITCH FURTHER DEFAULTS
    +TO LP:')
    LUNRT = ILUN(6)

3.3.7. IREOPN

Назначение: повторное установление связи указанного канала с файлом, для которого была выполнена подпрограмма ISAVES.

Обращение:

I = IREOPN(C,CB)

Описание параметров:

C - целое или имя переменной типа целый, определяющей номер канала, который будет связан с повторно открытым файлом;

CB - имя пятисловного массива, содержащего информацию о состоянии канала:

CB(1) - слово состояния канала;

CB(2) - номер начального блока файла (0 - для устройств последовательного доступа);

CB(3) - длина файла (в блоках по 256 слов);

CB(4) - не используется;

CB(5) - чётный байт - число незавершённых операций на заданном канале, нечётный байт - номер привода устройства (0 - 7), связанного с каналом.

Формат слова состояния канала приведён в приложении 3. Значение функции:

I = 0 подпрограмма выполнена;

I = 1 указанный канал занят.

ПРИМЕЧАНИЯ.

  1. Сочетание подпрограмм ISAVES/IREOPN необходимо применять при одновременной работе с большим числом файлов. Необходимое число файлов может быть открыто по подпрограмме LOOKUP (см. п. 3.1.7), а их состояние сохранено по подпрограмме ISAVES (в этом случае USR вызывается один раз для открытия всех файлов). Если из файла потребуются данные, то IREOPN позволяет программе считать их.
  2. Если при выполнении подпрограмм IREAD (см. п. 3.2.4.1) или IWRITE (см. п. 3.2.9.1) драйвер соответствующего устройства не был резидентным, при выполнении IREOPN может произойти ошибка.

Пример:

    INTEGER*2 SAVES(5,10)
    DATA ISVPTR/1/
          .
          .
          .
    CALL ISAVES(ICHAN,SAVES(1,ISVPTR))
          .
          .
          .
    CALL IREOPN(ICHAN,SAVES(1,ISVPTR))

3.3.8. ISAVES

Назначение: получение информации о состоянии канала. Эта информация даёт полное определение файла в системе ФОДОС-2.

Обращение:

I = ISAVES(C,CB)

Описание параметров:

CB - имя пятисловного массива типа целый, в который записывается информация о состоянии канала (см. п. 3.3.7).

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 указанный канал занят;

I = 2 вызов подпрограммы недопустим (файл был открыт по подпрограмме IENTER).

Ограничения:

1.   ISAVES может использоваться только в том случае, если файл был открыт по LOOKUP (см. п. 3.1.7). Если была использована подпрограмма IENTER (п. 3.1.3), то обращение к ISAVES игнорируется и возникает ошибка.

2.   ISAVES не применима к файлам, находящимся на магнитной ленте или магнитной ленте кассетного типа.

ПРИМЕЧАНИЯ.

  1. После выполнения ISAVES информация о состоянии канала запоминается и указанный канал закрывается. Если требуются сохранённые данные о канале, то используется подпрограмма IREOPN.
  2. Если ISAVES выполнена для файла, который затем стирается, область памяти, занимаемая этим файлом, становится свободной и может быть использована для формирования нового файла по подпрограмме IENTER. В этом случае содержимое файла, состояние которого считалось сохранённым, изменится.

Пример:

    INTEGER*2 BLK(5)
          .
          .
          .
    IF(ISAVES(ICHAN,BLK).NE.0) STOP 'ISAVES ERROR'

3.3.9. PURGE

Назначение: освобождение канала для использования в другой операции без выполнения действий, аналогичных действиям в подпрограммах ISAVES и CLOSEC.

Обращение:

CALL PURGE(C)

ПРИМЕЧАНИЕ. Временный файл, связанный в данный момент с каналом, после выполнения PURGE не становится постоянным. Чтобы файл стал постоянным, необходимо выполнить подпрограмму CLOSEC/ICLOSE.

3.4. Описание устройств и файлов

3.4.1. IASIGN

Назначение: запись информации в таблицу логического, устройства и отмена значений, назначаемых по умолчанию. Информация об устройстве используется библиотекой Фортрана при открытии логического устройства.

Обращение:

I = IASIGN(LN,IV[,IF[,IS[,IT]]])

Описание параметров:

LN - целое или имя переменной типа целый, определяющей номер логического устройства;

IV - имя однословного массива или имя элемента массива типа целый, содержащего имя устройства в коде RADIX-50;

IF- имя трёхсловного массива типа целый, содержащего имя и тип файла в коде RADIX-50;

IS - целое или имя переменной типа целый, определяющей число блоков для размещения выходного файла. Если IS = 0, резервируется либо половина наибольшей свободной области, либо вторая по величине свободная область. Если IS = -1, резервируется наибольшая свободная область;

IT - целое или имя переменной типа целый, определяющей дополнительные признаки, присваиваемые файлу. Это значение получается сложением величин, которые соответствуют требуемым операциям:

1 - использовать два буфера для вывода;

2 - открыть файл как временный;

4 - открыть файл для ввода-вывода. Первая операция ввода-вывода определяет использование файла. Если файл открыт для ввода, он рассматривается как новый файл, если открыт для вывода - как старый;

8 - использовать информацию об управлении кареткой;

16 - не использовать информацию об управлении кареткой;

32 - файл только для считывания.

Значение функции:

I = 0 подпрограмма выполнена;

I<>0 логическое устройство занято или нет места для размещения другого логического устройства (знак "<>" означает "не равно").

ПРИМЕЧАНИЯ.

  1. В качестве параметров IV, IF, IS могут использоваться соответствующие элементы массива F подпрограммы ICSI (п. 3.4.2).
  2. Информация об управлении кареткой используется только для форматных записей и означает, что при выводе на логическое устройство первый символ выводимой записи используется для управления кареткой. Первый символ не выводится, по нему только выполняется соответствующее действие.
  3. Если информация об управлении кареткой не используется (IT = 16), то первый символ записи не анализируется. В этом случае библиотека Фортрана выводит символ перевода строки, за которым следует запись и возврат каретки.
  4. Если параметр IT не задан, библиотека Фортрана анализирует первый символ записи для управления кареткой только на системном терминале и построчно-печатающем устройстве.
  5. IASIGN должна быть вызвана до того, как будет открыто логическое устройство, т.е. до выполнения одного из операторов READ, WRITE, PRINT, TYPE, ACCEPT, которые требуют обращения к логическому устройству.
  6. Подпрограмму IASIGN можно использовать с подпрограммой ICSI, чтобы программа пользователя могла принять стандартное описание ввода интерпретатора командной строки CSI.

Пример:

    INTEGER*2 SPEC(39)
    REAL*4 EXT(2)
    DATA EXT/6RDATDAT,6RDATDAT/
          .
          .
          .
10  IF(ICSI(SPEC,EXT,,,0).NE.0) GOTO 10
          .
          .
          .
    CALL IASIGN(3,SPEC(1),SPEC(2),SPEC(5),1)
    CALL IASIGN(4,SPEC(16),SPEC(17),0,32)

3.4.2. ICSI

Назначение: синтаксический анализ командной строки в специальном режиме работы интерпретатора командной строки и приём спецификаций файлов и переключателей.

Обращение:

I = ICSI(F,DT,[CS],[OP],X)

Описание параметров:

F - имя 39 - словного массива типа целый, предназначенного для приёма спецификаций файлов:

F(1) - имя устройства для выходного файла 1;

F(2 - 4) - имя и тип выходного файла 1;

F(5) - число блоков выходного файла 1;

F(6) - имя устройства для выходного файла 2;

F(7 - 9) - имя и тип выходного файла 2;

F(10) - число блоков выходного блока 2;

F(11) - имя устройства для выходного файла 3;

F(12 - 14) - имя и тип выходного файла 3;

F(15) - число блоков выходного файла 3;

F(16) - имя устройства для входного файла 1;

F(17 - 19) - имя и тип входного файла 3;

F(20) - имя устройства для входного файла 2;

F(21 - 23) - имя и тип входного файла 2;

F(24) - имя устройства для входного файла 3;

F(25 - 27) - имя и тип входного файла 3;

F(28) - имя устройства для входного файла 4;

F(29 - 31) - имя и тип входного файла 4;

F(32) - имя устройства для входного файла 5;

F(33 - 35) - имя и тип входного файла 5;

F(36) - имя устройства для входного файла 6;

F(37 - 39) - имя и тип входного файла 6;

DT - имя четырёхсловного массива типа целый, содержащего типы файлов в коде RADIX-50, назначаемые по умолчанию, если в командной строке не указаны типы файлов:

DT(1) - тип для всех входных файлов;

DT(2) - тип выходного файла 1;

DT(3) - тип выходного файла 2;

DT(4) - тип выходного файла 3;

CS - имя массива типа LOGICAL*1, содержащего командную строку в коде КОИ-7. Строка должна заканчиваться нулевым байтом. Если параметр не задан, печатается звёздочка (*) и осуществляется приём командной строки с терминала.

OP - имя массива типа целый со списком границ (4,N), предназначенного для приёма переключателей, где N - число используемых переключателей. Элементы массива, соответствующие переключателю К (1<= K<= N):

OP(1,К) - имя переключателя (один символ КОИ-7);

OP(2,К) - устанавливается подпрограммой:

0       - переключатель не используется;

1       - переключатель не имеет параметра;

2       - переключатель имеет параметр;

OP(3,К) - устанавливается подпрограммой в значение, равное номеру файла, для которого задан переключатель;

OP(4,К) - устанавливается подпрограммой на определённое значение, если элемент массива OP(2,К) равен 2.

Параметр OP используется, если параметр X не равен нулю.

X - число переключателей, описанных в массиве OP.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 недопустимая командная строка;

I = 2 недопустимое устройство в командной строке;

I = 3 недопустимый переключатель или использование переключателя в командной строке большее число раз, чем определено в массиве переключателей.

Ограничение: ICSI нельзя вызывать из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. В специальном режиме CSI не осуществляет загрузки драйвера и действий, аналогичных действию .MCALL запросов .CLOSE, .ENTER, .LOOKUP.
  2. Массив OP должен содержать имена всех используемых переключателей. Например, для задания имён пяти переключателей используются следующие операторы:
    INTEGER*2 SW(4,5)
    DATA SW(1,1)/'S'/,SW(1,2)/'M'/,SW(1,3)/'I'/
    DATA SW(1,4)/'L'/,SW(1,5)/'E'/

Пример:

    INTEGER*2 SPEC(39)
    REAL*4 EXT(2)
    DATA EXT/6RDATDAT,6RDATDAT/
10  TYPE 99
99  FORMAT('ENTER VALID CSI STRING WITH NO OPTIONS')
    IF(ICSI(SPEC,EXT,,,0).NE.0) GOTO 10

3.5. Работа с таймером

3.5.1. CVTTIM

Назначение: преобразование времени из внутреннего представления в часы, минуты, секунды и доли секунды.

Обращение:

CALL CVTTIM(TM,H,M,S,T)

Описание параметров:

TM - имя переменной типа INTEGER*4 или имя двухсловного массива типа INTEGER*2, определяющего время во внутреннем представлении.

ПРИМЕЧАНИЯ.

  1. Время во внутреннем представлении задаётся в десятичной системе счисления в долях секунды как данное типа INTEGER*4. Однако, в отличие от представления данных INTEGER*4 (п. 3.7), ячейка с младшим адресом должна содержать старшие разряды данного, ячейка со старшим адресок - младшие разряды данного.
  2. Если параметр TM задан в виде массива INTEGER*2, то первый элемент массива определяет старшие разряды данного, второй - младшие разряды данного.

Пример:

    INTEGER*4 ITIME
          .
          .
          .
    CALL GTIM(ITIME)
    CALL CVTTIM(ITIME,IHRS,IMIN,ISEC,ITCK)
    IF(IHRS.GE.12.AND.IHRS.LT.13) GOTO 100

3.5.2. GTIM

Назначение: определение текущего времени во внутреннем представлении. Текущее время определяется с начала суток.

 Обращение:

 CALL GTIM(IE)

Описание параметров:

IE - имя переменной типа INTEGER*4 или двухсловного массива типа INTEGER*2 для приёма результата.

ПРИМЕЧАНИЯ.

  1. Если в системе нет таймера, то IE принимает значение равное нулю.
  2. Если время не установлено по команде монитора TIME, то IE определяет время с момента загрузки системы.
  3. Для преобразования времени в часы, минуты, секунды и доли секунды может быть использована подпрограмма CVTTIM.
  4. В режиме FB значение времени автоматически восстанавливается после 24:00; в режиме SJ восстановление отсутствует.

Пример:

    INTEGER*4 JTIME
          .
          .
          .
    CALL GTIM(JTIME)

3.5.3. ICMKT

Назначение: отмена выполнения подпрограммы завершения, запланированной по подпрограмме ISCHED/ITIMER /MRKT.

Обращение:

I = ICMKT(ID,MT)

Описание параметров:

ID - целое или имя переменной типа целый, определяющей идентификатор отменяемой подпрограммы завершения. Если ID = 0, отменяются все запланированные подпрограммы завершения.

MT - имя переменной типа INTEGER*4 или имя двухсловного массива типа INTEGER*2, в который записывается значение времени во внутреннем представлении, оставшегося до выполнения подпрограммы завершения.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма завершения с указанным ID (не равным 0) не существует.

Пример:

    INTEGER*4 J
          .
          .
          .
    CALL ICMKT(0,J)
          .
          .
          .
    END 

3.5.4. ISCHED (режим FB)

Назначение: планирование выполнения подпрограммы завершения на языке Фортран в заданное время суток.

Обращение:

I = ISCHED(H,M,S,T,AR,ID,CR)

Описание параметров:

ID - целое или имя переменной типа целый, определяющей идентификатор подпрограммы завершения. Значение параметра ID передаётся в качестве фактического параметра подпрограмме CR;

CR - имя подпрограммы завершения на языке Фортран, которая должна выполниться в указанное время суток.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. Подпрограмма завершения
    SUBROUTINE CR(ID)
    INTEGER ID

    должна иметь один параметр, который получает значение, равное значению идентификатора в соответствующем вызове ISCHED.

  2. Выполнение планируемой подпрограммы завершения может быть отменено по подпрограмме ICMKT (см. п. 3.5.3).
  3. Если система занята, подпрограмма завершения может быть выполнена позднее запрошенного времени.
  4. Подпрограммы на Фортране могут быть перепланированы по времени выполнения подпрограммами ISCHED или ITIMER.
  5. ISCHED использует элемент очереди, что необходимо учитывать при обращении к подпрограмме IQSET (п. 3.6.6).

Пример:

    INTEGER*2 LINK(4)
    EXTERNAL NOON
          .
          .
          .
    I = ISCHED(12,0,0,0,LINK,0,NOON)
          .
          .
          .
    END
    SUBROUTINE NOON(ID)
          .
          .
          .
    STOP 'ABORT JOB LUNCHTIME'

3.5.5. ISDTTM

Назначение: установка системной даты и времени.

Обращение:

CALL ISDTTM(DT,HT,LT)

Описание параметров:

DT - целое, определяющее новое значение системной даты в формате даты ФОДОС;

HT - целое, определяющее старшие разряды времени в долях секунды;

LT - целое, определяющее младшие разряды времени в долях секунды.

Значение любого параметра равное "-1" оставляет соответствующее ему значение даты или времени неизменным. Пример:

    IDATE = IMONTH*1024+IDAY*32+(IYEAR-1972)
    CALL ISDTTM(IDATE,-1,-1)

3.5.6. ISLEEP (режим SJ)

Назначение: задержка выполнения основного задания на заданный промежуток времени. Время - в часах, минутах, секундах и долях секунды.

Обращение:

I = ISLEEP(H,M,S,T)

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. ISLEEP использует элемент очереди, что необходимо учитывать при обращении к IQSET (п. 3.6.6).
  2. Если система занята, основное задание может быть выполнено позднее запрошенного времени.
  3. ISLEEP не влияет на выполнение подпрограмм завершения.

Пример:

          .
          .
          .
    CALL IQSET(2)
          .
          .
          .
    CALL ISLEEP(0,0,0,4)

3.5.7. ITIMER

Назначение: планирование выполнения подпрограммы завершения на языке Фортран по истечении заданного промежутка времени.

Обращение:

I = ITIMER(H,M,S,T,AR,ID,CR)

Описание параметров:

ID - целое или имя переменной типа целый, определяющей идентификатор подпрограммы завершения. Значение параметра ID передаётся в качестве фактического параметра подпрограмме CR;

CR - имя подпрограммы завершения на языке Фортран, которая будет выполняться по истечении заданного промежутка времени.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. Подпрограмма завершения:
    SUBROUTINE CR(ID)
    INTEGER ID

    должна иметь один параметр, который получает значение, равное значению идентификатора в соответствующем вызове ITIMER.

  2. Выполнение планируемой подпрограммы завершения может быть отменено по подпрограмме ICMKT.
  3. Если система занята, подпрограмма завершения может быть выполнена позднее запрошенного времени.
  4. Подпрограммы на Фортране могут быть перепланированы по времени выполнения подпрограммами ISCHED и IQSET.
  5. ITIMER использует элемент очереди, что необходимо учитывать при обращении к подпрограмме IQSET.

Пример:

    INTEGER*2 AREA(4)
    EXTERNAL WATCHD
          .
          .
          .
    CALL ITIMER(0,12,0,0,AREA,3,WATCHD)
          .
          .
          .
    CALL ICMKT(3,AREA)
          .
          .
          .
    END
    SUBROUTINE WATCHD(ID)
          .
          .
          .
    RETURN
    END

3.5.8. ITWAIT (вариант SJ)

Назначение: задержка выполнения основного задания на заданный промежуток времени. Время - во внутреннем представлении.

Обращение:

I = ITWAIT(IM)

Описание параметров:

IM - имя переменной типа INTEGER*4 или имя двухсловного массива типа INTEGER*2, определяющего значение промежутка времени во внутреннем представлении.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. ITWAIT использует элемент очереди, что необходимо учитывать при обращении к IQSET (п. 3.6.6).
  2. Если система занята, задание может быть выполнено позднее запрошенного времени.
  3. ITWAIT не влияет на выполнение подпрограмм завершения.

Пример:

    INTEGER*2 TIME(2)
    CALL ITWAIT(TIME)

3.5.9. IUNTIL (вариант SJ)

Назначение: задержка выполнения основного задания до заданного времени суток.

Обращение:

I = IUNTIL(H,M,S,T)

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. IUNTIL использует элемент очереди, что необходимо учитывать при обращении к подпрограмме IQSET (п. 3.6.6).
  2. Если система занята, основное задание может быть выполнено позднее запрошенного времени.
  3. IUNTIL не влияет на выполнение подпрограмм завершения.

Пример:

CALL IUNTIL(13,0,0,0)

3.5.10. JTIME

Назначение: преобразование времени во внутреннее представление.

Обращение:

CALL JTIME(H,M,S,T,MT)

Описание параметров:

MT - имя переменной типа INTEGER*4 или имя двухсловного массива типа INTEGER*2, в который записывается время во внутреннем представлении.

Пример:

    INTEGER*4 J1
    CALL JTIME(3,7,23,0,J1)
    CALL JJCVT(J1)

3.5.11. MRKT (вариант SJ)

Назначение: планирование выполнения подпрограммы завершения на языке Ассемблера по истечении заданного промежутка времени.

Обращение:

I = MRKT(ID,CR,MT)

Описание параметров:

ID - целое или имя переменной типа целый, определяющей идентификатор подпрограммы завершения. Значение параметра ID передаётся в качестве фактического параметра подпрограмме CR;

CR - имя подпрограммы завершения на языке Ассемблер, которая будет выполняться по истечении заданного промежутка времени;

MT - имя переменной типа INTEGER*4 или имя двухсловного массива типа INTEGER*2, определяющего время во внутреннем представлении.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 подпрограмма не выполнена (нет свободного элемента очереди).

ПРИМЕЧАНИЯ.

  1. MRKT использует элемент очереди, что необходимо учитывать при обращении к подпрограмме IQSET (п. 3.6.6).
  2. Если система занята, подпрограмма завершения может быть выполнена позднее запрошенного времени.

Пример:

    INTEGER*2 TINT(2)
    EXTERNAL ARTN
          .
          .
          .
    CALL MRKT(4,ARTN,TINT)

3.5.12. SECNDS

Назначение: определение времени, прошедшего с заданного момента до текущего.

Обращение:

A = SECNDS(AT)

Описание параметров:

AT - константа, выражение или имя переменной типа REAL*4, значение которой определяет начало отсчёта времени.

Значение функции: результатом выполнения подпрограммы является значение A, определяющее время в долях секунды.

Пример:

    T1 = SECNDS(0.)
          .
          .
          .
    DELTA = SECNDS(T1)

3.5.13. TIMASC

Назначение: преобразование времени из внутреннего представления в часы, минуты, секунды.

Обращение:

CALL TIMASC(IE,SG)

Описание параметров:

IE - время во внутреннем представлении;

SG - имя восьмисловного массива для записи значения времени в виде HH:MM:SS, где HH - часы, MM - минуты, SS - секунды.

Пример:

    INTEGER*4 J1,J2,J3
    LOGICAL*1 STRNG(8)
          .
          .
          .
    CALL JTIME(17,0,0,0,J1)
    CALL GTIM(J2)
    CALL JJCVT(J1)
    CALL JJCVT(J2)
    CALL JSUB(J1,J2,J3)
    CALL JJCVT(J3)
          .
          .
          .
    CALL TIMASC(J3,STRNG)
    TYPE 99,(STRNG(I),I = 1,8)
99  FORMAT('IT IS',8A1,'TILL 5 P.M.')

3.5.14. TIME

Назначение: определение текущего времени в часах, минутах, секундах.

Обращение:

CALL TIME(SG)

Описание параметров:

SG - имя восьмисловного массива типа LOGICAL*1 для записи значения времени в виде HH:MM:SS, где HH - часы, MM - минуты, SS - секунды.

Пример:

    LOGICAL*1 STRNG(8)
    CALL TIME(STRNG)
    TYPE 99,(STRNG(I),I = 1,8)
99  FORMAT(' IT IS NOW ',8A1)

3.6. Системные операции

Подпрограммы данной группы выполняют системные операции аналогично системным запросам (см. [1]).

3.6.1. CHAIN

Назначение: передача управления другому фоновому заданию без вмешательства оператора.

Обращение:

CALL CHAIN(D,V,W)

Описание параметров:

V - имя первой переменной последовательности передаваемых переменных;

W - целое или имя переменной типа целый, определяющей числе слов (до 60), передаваемых фоновому заданию.

Ограничения:

  1. CHAIN нельзя вызвать из подпрограммы завершения или обслуживания прерываний.
  2. CHAIN не закрывает файл на логическом устройстве. При передаче управления от одного фонового задания другому необходимо закрыть файл на логическом устройстве с помощью подпрограммы CLOSE (см. [2]).

ПРИМЕЧАНИЯ.

  1. Последовательность передаваемых переменных может быть задана как одномерный массив, блок COMMON или часть блока COMMON.
  2. Последовательность передаваемых переменных занимает ячейки памяти с абсолютными адресами 510 - 700 в возрастающем порядке.
  3. Если передаваемых переменных нет, параметр W = 0.

Примеры:

В следующем примере передаётся управление программе PROG.SAV:

    DIMENSION SPEC(2)
    INTEGER*2 DATA(10)
    DATA SPEC/6RDT0PRO,6RG  SAV/
          .
          .
          .
    CALL CHAIN(SPEC,DATA,10)

3.6.2. DEVICE (режим FB)

Назначение: запись данных по указанным адресам или задание дополнительных действий, которые должен выполнять монитор после выполнения программы или выхода из неё по СУ/C.

Обращение:

CALL DEVICE(IL[,LK])

Описание параметров:

IL - имя массива типа целый, содержащего список пар "адрес/данное";

LK - целая константа, указатель связанного формата списка адресов и данных.

Список адресов и данных может иметь два формата - связанный и несвязанный. Оба формата должны оканчиваться нулевым словом. Связанный формат используется в случае неоднократного обращения к DEVICE и отличается от несвязанного формата тем, что содержит ноль в первом слове списка. Формат списка адресов и данных описан в документе [1].

Ограничения:

  1. В каждый момент времени может быть использован только один список адресов и данных; если задано несколько обращений к подпрограмме DEVICE, выполняется только последнее.
  2. Список адресов и данных не должен изменяться программой пользователя после вызова DEVICE и не должен размещаться в области свопинга USR.

ПРИМЕЧАНИЯ.

  1. DEVICE используется, в основном, для записи в регистры устройств необходимых данных.
  2. После окончания выполнения программы данные, указанные в списке, засылаются по указанным адресам.

Пример:

    INTEGER*2 IDR11(3)
    DATA IDR11(1)/"167770/
    DATA IDR11(2)/0/
    DATA IDR11(3)/0/
    CALL DEVICE(IDR11)

3.6.3. GTJB/IGTJB

Назначение: получение информации о выполняемом задании (номер задания, нижняя и верхняя граница памяти и другая информация).

Обращение:

CALL GTJB(DR,[JK[,I]])
I = GTJB(DR,[JK])
CALL IGTJB(DR,[JK[,I]])
I = IGTJB(DR,[JK])

Описание параметров:

DR - имя восьми- или двенадцатисловного массива типа целый для получения информации:

DR(1) - номер задания;

для FB и ХМ мониторов значение DR(1) равно:

0 - фоновое задание;

2 - основное задание;

для SJ монитора значение DR(1) равно 0; для мониторов, поддерживающих системные задания, значение DR(1) равно:

0 - фоновое задание;

2,4,6,8,10,12,14 - системные задания;

16 - основное задание;

DR(2) - адрес верхней границы памяти разделённого задания (адрес последней ячейки плюс два);

DR(3) - адрес нижней границы памяти разделённого задания (адрес первой ячейки);

DR(4) - указатель области каналов ввода-вывода;

DR(5) - адрес, смешанной области заданий для FB и ХМ мониторов (0 для SJ монитора);

DR(6) - младший байт: номер системного терминала задания, если используется мультитерминальный переключатель, или ноль в других случаях. Старший байт не используется;

DR(7) - верхняя виртуальная граница для задания, созданного редактором связей по переключателю /V в режиме ХМ; параметр равен нулю в режиме SJ и FB или если переключатель /V не используется;

DR(8) - DR(9) - не используются;

DR(10) - DR(12) - имя задания в коде КОИ-7 (только для мониторов, поддерживающих системные задания).

JK - данного типа текстовый, определяющее спецификацию файла задания, о котором требуются данные.

Значение функции:

I = 0 подпрограмма выполнена;

I = -1 указанное задание в текущий момент не выполняется.

Информация о задании записывается в восьмисловный массив, если в обращении к подпрограмме задан один параметр.

Например,

    INTEGER IJPARM(8)
    CALL GTJB(IJPARM)
    I = GTJB(IJPARM)

Для записи информации в двенадцатисловный массив в обращении к подпрограмме необходимо после первого параметра указать запятую или задать все параметры. Например,

    INTEGER IJPARM(12)
    CALL GTJB(IJPARM,)
    I = GTJB(IJPARM,)

Пример:

    DIMENSION JDATA(12)
    I = GTJB(JDATA,16)
    IF(I.EQ.0) GOTO 20
    TYPE 10
10  FORMAT('NO FG JOB!')
    STOP
20           .
             .
             .

3.6.4. IDSTAT

Назначение: получение информации о состоянии устройства.

Обращение:

I = IDSTAT(DN,US)

Описание параметров:

DN - имя переменной типа REAL*4, определяющей имя устройства в коде RADIX-50;

US - имя четырёхсловного массива типа целый для приёма информации о состоянии заданного устройства;

US(1) - слово состояния устройства;

US(2) - длина драйвера устройства в байтах;

US(3) - адрес загрузки драйвера;

US(4) - объём тома устройства: в блоках по 256 слов - для устройств с произвольным доступом к данным, 0 - для устройств с последовательным доступом.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 устройство не описано в таблицах монитора.

Ограничение: IDSTAT не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. Формат слова состояния устройства приведён в документе [1].
  2. US(3) = 0 означает, что драйвер нерезидентен.

Пример:

В данном примере определяется наличие в оперативной памяти драйвера построчно - печатающего устройства. Если его нет в памяти, программа печатает сообщение:

    INTEGER IDNAM
    INTEGER*2 CBLK(4)
    DATA IDNAM/3RLP /
    DATA CBLK/4*0/
    CALL IDSTAT(IDNAM,CBLK)
    IF(CBLK(3).EQ.0) STOP 'LOAD THE LP HANDLER AND RERUN'

3.6.5. IFETCH

Назначение: загрузка в оперативную память драйвера устройства.

Обращение:

I = IFETCH(DN)

Описание параметров:

DN - имя переменной типа REAL*4, определяющей имя устройства в коде RADIX-50, драйвер которого следует загрузить.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 недопустимое имя устройства;

I = 2 недостаточно оперативной памяти;

I = 3 отсутствует драйвер указанного устройства.

Ограничений: IFETCH не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЕ. В качестве параметра DN может использоваться соответствующий элемент массива F подпрограммы ICSI (см. п. 3.4.2).

Пример:

В данном примере загружается драйвер устройства MX:

    REAL*4 IDNAM
    DATA IDNAM/3RMX /
    IF(IFETCH(IDNAM).NE.0) STOP 'FATAL ERROR FETCHING
    +HANDLER'

3.6.6. IQSET

Назначение: увеличение числа элементов очереди ввода-вывода.

Обращение:

I = IQSET(GL)

Описание параметров:

GL - целое или имя переменной типа целый, определяющей число элементов, добавляемых к очереди.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 недостаточно оперативной памяти для размещения добавляемых элементов очереди.

Все операции ввода-вывода в системе ФОДОС-2 выполняются через централизованную систему управления очередью. Число элементов очереди должно быть на единицу больше общего числа запросов ввода-вывода и таймера, которые будут выполняться одновременно. Если для запросов на ввод-вывод нет свободных элементов очереди, то в режиме SJ выполнение программы приостанавливается до их появления. В режиме FB в то время как подпрограмма ожидает элемент очереди, выполняется другое задание.

Ограничения: IQSET не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. Если IQSET используется в основном задании, необходимо назначить дополнительную память для элементов очереди (см. п. 1.2.4).
  2. Если выполняется ввод-вывод по подпрограммам IREADW/IWRITW (п.п. 3.2.4.4, 3.2.9.4), то нет необходимости в увеличении числа элементов очереди. В этом случае определены четыре элемента очереди.
  3. Список системных подпрограмм, использующих элемент очереди, приведён в приложении 2.

Пример:

    IF(IQSET(5).NE.0) STOP 'NOTE NOUGH FREE FOR'
    +QUEUE ELEMENTS'

3.6.7. ISPFN/ISPFNC/ISPFNF/ISPFNW

Подпрограммы ISPFN, ISPFNC, ISPFNF, ISPFNW используются драйверами устройств (накопитель на гибких дисках, накопитель на магнитной ленте, накопитель на магнитной ленте кассетного типа) для выполнения специальных операций.

При использовании программ данной группы необходимо, чтобы драйвер соответствующего устройства находился в памяти и канал был связан с файлом по подпрограмме LOOKUP (см. п. 3.1.7).

Данные подпрограммы используют элемент очереди; это необходимо учитывать при обращении к IQSET.

3.6.7.1. ISPFN

Назначение: выполнение специальной операции в синхронном режиме ввода-вывода.

Обращение:

I = ISPFN(CD,C[,W,BF,B])

Описание параметров:

CD - целое или имя переменной типа целый, определяющей код специальной операции (табл. 4);

W - целое или имя переменной типа целый, определяющей число слов, занятых в операциях ввода-вывода (чтение, запись - для гибких дисков, запись с расширенным межзонным промежутком для магнитной ленты). По умолчанию W = 0. При записи на магнитную ленту параметр W = 0 указывает число записей, на которое осуществляется пропуск вперёд или назад: при пропуске назад осуществляется продвижение ленты до маркера ленты или в точку загрузки (ВОТ); при пропуске вперёд осуществляется перемотка до маркера ленты или до метки EOT.

BF - имя массива типа целый, используемого как буфер данных. По умолчанию BF = 0.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 попытка чтения или записи после признака конца файла;

I = 2 аппаратная ошибка на канале;

I = 3 канал закрыт.

Таблица 4

КОДЫ СПЕЦИАЛЬНЫХ ОПЕРАЦИЙ

Операция

Код операции

MT

CT

DX

DY

LD

MY

Чтение

371

 

377

377

   

Запись

370

 

376

376

   

Запись со стиранием данных

   

375

375

   

Пропуск вперёд к последнему файлу

 

377

       

Пропуск вперёд к последнему блоку

 

376

       

Пропуск вперёд к следующему файлу

 

375

       

Пропуск вперёд к следующему блоку

 

374

       

Перемотка

373

373

       

Запись интервала между файлами

 

372

       

Запись метки "EOF"

377

         

Пропуск вперёд

376

         

Пропуск назад

375

         

Запись с расширенным межзонным промежутком

374

         

Автономная перемотка

372

         

Получение размера тома

     

373

373

373

Чтение/запись таблицы трансляции

       

372

 

ПРИМЕЧАНИЯ:

  1. В табл. 4 использованы следующие обозначения устройств: MT - накопитель на магнитной ленте, CT - накопитель на магнитной ленте кассетного типа, DX - накопитель на гибком диске, DY, MY - накопители на гибком диске с двойной плотностью, LD - драйвер логического диска.
  2. Вызов подпрограмм для других устройств игнорируется.

Пример:

    INTEGER*2 ERRADR,ERRBLK(4)
    DATA ERRBLK/0,0,0,0/
          .
          .
          .
    ERRADR = IADDR(ERRBLK)
    ICODE = ISPFN(CODE,ICHAN,WDCT,BUF,ERRADR)
3.6.7.2. ISPFNC

Назначение: выполнение специальной операции в асинхронном режиме с использованием подпрограммы завершения на языке Ассемблер.

Обращение:

I = ISPFNC(CD,C,W,BF,B,CR)

Описание параметров:

CD, W, BF - то же, что в п. 3.6.7.1.

Значение функции: то же, что в п. 3.6.7.1.

Пример:

    INTEGER*2 ERRADR,ERRBLK(4)
    DATA ERRBLK(0,0,0,0)
          .
          .
          .
    ERRADR = IADDR(ERRBLK)
    ICODE = ISPFNC(CODE,ICHAN,WDCT,BUF,ERRADR)
3.6.7.3. ISPFNF

Назначение: выполнение специальной операции в асинхронном режиме ввода-вывода с использованием подпрограммы завершения на языке Фортран.

Обращение:

I = ISPFNF(CD,C,W,BF,B,AR,CR)

Описание параметров:

CD, W, BF - то же, что в п. 3.6.7.1.

Значение функции: то же, что в п. 3.6.7.1.

Примеры:

  1.  
        INTEGER*2 ERRADR,ERRBLK(4)
        DATA ERRBLK/0,0,0,0/
              .
              .
              .
        ERRADR = IADDR(ERRBLK)
        ICODE = ISPFNF(CODE,ICHAN,WDCT,BUF,ERRADR)
  2.  
        REAL*4 MTNAME(2),AREA(2)
        DATA MTNAME/3RMT0,0./
        EXTERNAL DONSUB
              .
              .
              .
        I = IGETC()
        CALL IFETCH(MTNAME)
        CALL LOOKUP(I,MTNAME)
              .
              .
              .
        IERR = ISPFNF("373,1,0,0,0,AREA,DONSUB)
        END
        SUBROUTINE DONSUB
              .
              .
              .
        END
3.6.7.4. ISPFNW

Назначение: выполнение специальной операции в модифицированном синхронном режиме.

Обращение:

I = ISPFNW(CD,C,[W,BF,B])

Описание параметров:

CD, W, BF - то же, что в п. 3.6.7.1.

Значение функции: то же, что в п. 3.6.7.1.

Примеры:

  1.  
        INTEGER*2 ERRADR.ERRBLK(4)
        DATA ERRBLK/0,0,0,0/
              .
              .
              .
        ERRADR = IADDR(ERRBLK)
        ICODE = ISPFNF(CODE,ICHAN,WDCT,BUF,ERRADR)
  2.  
        INTEGER*2 BUF(65),TRACK,SECTOR,DBLK(4)
        DATA DBLK/3RMX0,0,0,0,/
              .
              .
              .
        ICHAN = IGETC()
        IF(ICHAN.LT.0) STOP 'NO CHANNEL AVAILABLE'
        IF(LOOKUP(ICHAN,DBLK).LT.0) STOP 'BAD LOOKUP'
              .
              .
              .
        ICODE = ISPFNW("377,ICHAN,TRACK,BUF,SECTOR)

3.6.8. ITLOCK (режим FB/XM)

Назначение: блокирование USR в памяти, если она не используется другим заданием.

Обращение:

I = ITLOCK()

Значение функции:

I = 0 - подпрограмма выполнена;

I = 1 - USR используется другим заданием.

Ограничения: ITLOCK не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЕ. Отличие ITLOCK от LOCK состоит в том, что, если USR используется другим заданием, в случае ITLOCK USR не блокируется в памяти и управление возвращается запрашивающему заданию, в случае LOCK ожидается освобождение USR и осуществляется блокирование USR в памяти.

Пример:

    IF(ITLOCK().NE.0) GOTO 100

3.6.9. LOCK

Назначение: блокирование USR в памяти.

Обращение:

CALL LOCK

Подпрограмма LOCK блокирует USR в памяти во время выполнения ряда операций. Программа пользователя, которая часто обращается к USR, может блокировать USR в памяти по LOCK, выполнить все необходимые действия и затем освободить USR по UNLOCK, при этом не тратится время на ненужный свопинг USR. В режиме FB вызов интерпретатора командной строки(CSI) может выполнить действие аналогичное UNLOCK. В режиме FB LOCK запрещает другому заданию использовать USR. Таким образом, USR может быть блокирована на столько, на сколько это необходимо.

Высокоприоритетные задания выполняют LOCK в тех случаях, когда им требуется USR. При этом USR не будет доступна для других заданий в течение значительного промежутка времени. USR повторно не загружается и не может быть назначена для совместного использования с несколькими заданиями. В указанное время только одно задание может использовать USR, а все другие задания, сделавшие запрос USR, должны стать в очередь. Эти условия необходимо учитывать для систем, требующих одновременного использования высокоприоритетного и фонового заданий, а также при работе с магнитными лентами MT и CT.

Ограничения:

  1. Программа, вызывающая LOCK, не должна находиться в области свопинга USR. В противном случае после выполнения LOCK управление будет передано не программе пользователя, a USR. Если USR блокирована в памяти, переменные и массивы, находящиеся в области свопирования USR, не должны использоваться.
  2. После выполнения LOCK не рекомендуется использовать область памяти, которую занимает USR, даже в том случае, если не предполагается дальнейшее использование USR. Это может вызвать сбой при выполнении UNLOCK.
  3. LOCK не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЯ.

  1. Если при выполнении задания возникают условия, требующие свопинга USR, то программа пользователя (та её часть, которую USR перекрывает в памяти) записывается на системное устройство и на её место загружается USR. Если USR резидентна, свопинга не происходит.
  2. LOCK всегда загружает USR в память, если USR не резидентна.
  3. Подпрограммы LOCK/UNLOCK должны быть согласованы по числу обращений. Лишние UNLOCK игнорируются.
  4. Если была подана команда SET USR NOSWAP, подпрограммы LOCK и UNLOCK не вызывают свопинга USR, но в режиме FB подпрограмма LOCK запрещает другому заданию использовать USR, a UNLOCK разрешает другому заданию доступ к USR.

3.6.10. RCHAIN

Назначение: получение доступа к переменным, переданным по CHAIN.

 Обращение:

CALL RCHAIN(FL,V,W)

Описание параметров:

FL - имя переменной типа целый, значение которой устанавливается подпрограммой RCHAIN;

V - имя первой переменной последовательности переданных переменных (см. п. 3.6.1):

-1 - программе передано управление;

0 - программе не передано управление;

W - число слов, переданных вызываемой программе.

Ограничения: RCHAIN не может быть вызвана из подпрограммы завершения или обслуживания прерываний.

ПРИМЕЧАНИЕ. Оператор CALL, по которому осуществляется обращение к RCHAIN, должен быть первым выполняемым оператором Фортран - программы.

Пример:

    INTEGER*2 PARMS(50)
    CALL RCHAIN(IFLAG,PARMS,50)
    IF(IFLAG) GOTO 10
          .
          .
          .

3.6.11. RCTRLO

Назначение: отмена команды СУ/D (разрешение вывода на терминал).

Обращение:

CALL RCTRLO

ПРИМЕЧАНИЕ. Вывод на терминал осуществляется до тех пор, пока будет подана другая команда СУ/D.

Пример:

    CALL RCTRLO
    CALL PRINT('PRINT UNTIL ANOTHER СУ/D TYPED')

3.6.12. RESUME (режим FB)

Назначение: продолжение выполнения задания, приостановленного по SUSPND.

Обращение:

CALL RESUME

ПРИМЕЧАНИЯ.

  1. Подпрограмма RESUME используется обычно с подпрограммой SUSPND (п. 3.6.15).
  2. Обращение к RESUME осуществляется обычно из подпрограммы завершения.

Пример использования RESUME приведён в п. 3.6.15.

3.6.13. SCCA

Назначение: запрещение выполнения команды СУ/C при вызове подпрограммы без параметра и определение подачи команды СУ/C при вызове подпрограммы с параметром.

Обращение:

CALL SCCA[(IG)]

Описание параметров:

IG - имя переменной типа целый, значение которой устанавливается по подпрограмме; IG не равно нулю, если с терминала последовательно поданы две команды СУ/C.

ПРИМЕЧАНИЯ.

  1. Подпрограмма пользователя должна проверять и очищать IG перед вызовом SCCA.
  2. Подпрограмма SCCA без параметра запрещает выполнение команды СУ/C и помещает код команды в буфер, откуда она может быть считана как символ.

Пример:

    PROGRAM SCCA
    CALL PRINT('PROGRAM HAS STARTED,TYPE')
    IFLAG = 0
    CALL SCCA(IFLAG)
10  I = ITTINR()
    CALL PRINT('А СУ/C WAS TYPED')
    IF(IFLAG.EQ.0) GOTO 10
          .
          .
          .
    CALL PRINT('A DOUBLE СУ/C WAS TYPED')
    TYPE 19,IFLAG
19  FORMAT('IFLAG = ',06,/)
    CALL SCCA
    CALL PRINT('TYPE А СУ/C TO EXIT')
20  GOTO 20
    END

3.8.14. SETCMD

Назначение: передача командной строки клавиатурному монитору.

Обращение:

CALL SETCMD(KS)

Описание параметров:

KS - текстовая константа (без ограничивающих символов <ВК> и <ПС>) или переменная типа текстовый, определяющая строку для передачи клавиатурному монитору.

Командная строка будет выполнена после завершения программы пользователя.

ПРИМЕЧАНИЯ.

  1. Вызов подпрограммы SETCMD должен осуществляться до завершения программы пользователя. Командная строка должна быть короткой во избежание размещения её в области стека. Если необходимо выполнение нескольких командных строк, следует использовать косвенный файл.
  2. При использовании SETCMD
    • запрещены команды клавиатурного монитора REENTER, START, CLOSE
    • перед выполнением команды COMPILE необходимо запретить свопинг USR.
  3. Командная строка передаётся в область связей (500 - 777(8)) и записывается, начиная с ячейки 512.

Пример:

    LOGICAL*1 INPUT(134),PROMPT(8)
    DATA PROMPT/'P', 'R', 'O', 'M', 'P','T', '>', "200/
    CALL GTLIN(INPUT,PROMPT)
    CALL SETCMD(INPUT)
    END

3.6.15. SUSPND (режим FB)

Назначение: задержка выполнения задания и разрешение выполнения подпрограммы завершения.

Обращение:

CALL SUSPND

ПРИМЕЧАНИЯ.

  1. Монитор имеет счётчик задержки для каждого задания. Этот счётчик уменьшается подпрограммой SUSPND и наращивается подпрограммой RESUME (см. п. 3.6.12). Выполнение задания будет приостановлено лишь в том случае, если счётчик содержит отрицательное значение. Если вызывается RESUME перед SUSPND, подпрограмма SUSPND не выполняется.
  2. Подпрограммы SUSPND и RESUME должны быть согласованы по числу обращений.
  3. Вызов подпрограммы RESUME из программы пользователя или подпрограммы завершения увеличивает счётчик задержки.
  4. Вызов подпрограммы SUSPND из подпрограммы завершения уменьшает счётчик задержки, но не приостанавливает выполнение задания. Задание продолжает выполняться до тех пор, пока оно само не вызовет SUSPND. В этом случае для продолжения выполнения задания требуется два вызова RESUME.
  5. RESUME, вызванная из подпрограммы завершения и не согласованная с ранее выполненным вызовом SUSPND, может привести к продолжению выполнения задания после запланированного останова до того, как истечёт весь промежуток времени, заданный по ITWAIT (см. п. 3.2.8).

Пример:

    INTEGER IAREA(4)
    COMMON /RDBLK/ IBUF(256)
    EXTERNAL RDFIN
          .
          .
          .
    IF(IREADF(256,IBUF,IBLK,ICHAN,IAREА,RDFIN).NE.0)
    + GOTO 100
          .
          .
          .
    CALL SUSPND
          .
          .
          .
    END
    SUBROUTINE RDFIN(IARG1,IARG2)
    COMMON /RDBLK/ IBUF(256)
          .
          .
          .
    CALL RESUME
          .
          .
          .
    END

3.6.16. UNLOCK

Назначение: освобождение USR из памяти и загрузка программы пользователя, если при выполнении подпрограммы LOCK выполнялся свопинг USR.

Обращение:

CALL UNLOCK

ПРИМЕЧАНИЯ.

  1. Подпрограммы UNLOCK и LOCK должны быть согласованы по числу обращений. Если обращений к LOCK больше чем к UNLOCK, то USR остаётся блокированной в памяти. Лишние UNLOCK игнорируются.
  2. При выполнении двух заданий в режиме FB подпрограммы LOCK/UNLOCK рекомендуется использовать только в необходимых случаях. Если одно задание блокирует USR в памяти (LOCK), другое задание не может использовать USR до тех пор, пока USR не будет освобождена (UNLOCK).
  3. В режиме FB вызов CSI (ICSI) выполняет действие, аналогичное UNLOCK.
  4. В режиме ХМ USR всегда резидентна.

Пример:

    CALL LOCK
          .
          .
          .
    CALL UNLOCK

3.7. Операции с данными INTEGER*4

Библиотека системных подпрограмм содержит подпрограммы преобразования данных типа REAL*4, REAL*8, INTEGER*2, INTEGER*4 и выполнения арифметических операций с данными INTEGER*4.

Данное типа INTEGER*4 занимает два слова памяти. Первое слово (ячейка с младшим адресом) содержит младшие разряды, второе слово (ячейка со старшим адресом) содержит знак и старшие разряды. Диапазон представления данных INTEGER*4 от -2**31+l до 2**31-1 (знаком ** обозначена операция возведения в степень). Данные INTEGER*4 могут задаваться с помощью оператора DATA с указанием младшей и старшей части числа.

Пример:

    INTEGER*4 J
    INTEGER*2 I(2)
    EQUIVALENCE(J,I):NF
    DATA I/3,0/ ! присваивает J значение 3

При задании отрицательного числа старшая часть числа (ячейка со старшим адресом) должна быть продолжением младшей части в дополнительном коде.

Пример:

    INTEGER*4 J
    INTEGER*2 I(2)
    EQUIVALENCE(J,I)
    DATA I/-4,-1/ ! присваивает I значение - 4

Данные параметры INTEGER*4 могут быть заданы следующим образом:

    INTEGER*2 J(2)
    DATA J/3,0/

Для обозначения типа параметра в качестве первого символа параметра используются следующие буквы:

I - для параметра типа INTEGER*2;

J - для параметра типа INTEGER*4;

A - для параметра типа REAL*4;

D - для параметра типа REAL*8.

3.7.1. AJFLT

Назначение: преобразование данного типа INTEGER*4 в REAL*4 и присвоение результата функции.

Обращение:

A = AJFLT(JS)

Описание параметров:

JS - имя преобразуемой переменной или имя элемента массива типа INTEGER*4.

Значение функции: данное типа REAL*4.

Пример:

    REAL*4 VALUE,AJFLT
    INTEGER*4 JVAL
          .
          .
          .
    VALUE = AJFLT(JVAL)*3.5

3.7.2. DJFLT

Назначение: преобразование данного типа INTEGER*4, в REAL*8 и присвоение результата функции.

Обращение:

D = DJFLT(JS)

Описание параметров:

JS - имя преобразуемой переменной или имя элемента массива типа INTEGER*4.

Значение функции: данное типа REAL*8.

ПРИМЕЧАНИЕ. Если используется подпрограмма DJLT, то тип функции DJFLT должен быть определён в программе явно (REAL*8 DJFLT) или неявно (IMPLICIT REAL*8(D)). По умолчанию предполагается тип REAL*4.

Пример:

    INTEGER*4 JVAL
    REAL*8 DJFLT,D
          .
          .
          .
    D = DJFLT(JVAL)

3.7.3. IAJFLT

Назначение: преобразование данного типа INTEGER*4 в REAL*4.

Обращение:

I = IAJFLT(JS,AR)

Описание параметров:

JS - имя преобразуемой переменной или имя элемента массива типа INTEGER*4;

AR - имя переменной REAL*4 или имя элемента массива для приёма результата преобразования.

Значение функции:

I = -2 потеря значащих цифр во время преобразования;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JVAL
    REAL*4 RESULT
          .
          .
          .
    IF(IAJFLT(JVAL,RESULT).EQ.-2) TYPE 99
99  FORMAT('OVERFLOW IN INTEGER*2 TO REAL CONVERSION')

3.7.4. IDJFLT

Назначение: преобразование данного типа INTEGER*4 в REAL*8.

Обращение:

I = IDJFLT(JS,DE)

Описание параметров:

JS - имя преобразуемой переменной или имя элемента массива типа INTEGER*4;

DE - имя переменной или имя элемента - массива типа REAL*8 для приёма результата преобразования.

Значение функции:

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JJ
    REAL*8 DJ
          .
          .
          .
    IF(IDJFLT(JJ,DJ).LE.0) TYPE 99
99  FORMAT('VALUE IS NOT POSITIVE')

3.7.5. IJCVT

Назначение: преобразование данного типа INTEGER*4 в INTEGER*2

Обращение:

I = IJCVT(JS[,IS])

Описание параметров:

JS - имя преобразуемой переменной или имя элемента массива типа INTEGER*4;

IS - имя переменной INTEGER*2 для приёма результата преобразования.

Значение функции:

I = -2 переполнение;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

ПРИМЕЧАНИЕ. Если параметр IS не используется, то результат преобразования присваивается JS.

Пример:

    INTEGER*4 JVAL
    INTEGER*2 IVAL
          .
          .
          .
    IF(IJCVT(JVAL,IVAL).EQ.-2) TYPE 99
99  FORMAT('NUMBER TOO LARGE IN IJCVT CONVERSION')

3.7.6. JADD

Назначение: сложение данных типа INTEGER*4.

Обращение:

I = JADD(J1,J2,JR)

Описание параметров:

J1 - имя переменной или имя элемента массива типа INTEGER*4, первое слагаемое;

J2 - имя переменной или имя элемента массива типа INTEGER*4, второе слагаемое;

JR - имя переменной или имя элемента массива типа INTEGER*4 для приёма результата.

Значение функции:

I = -2 переполнение;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JOP1,JOP2,JRES
          .
          .
          .
    IF(JADD(JOP1,JOP2,JRES).EQ.-2) GOTO 100

3.7.7. JAFIX

Назначение: преобразование данного типа REAL*4 в INTEGER*4.

Обращение:

I = JAFIX(AS,JR)

Описание параметров:

AS - константа, выражение или имя преобразуемой переменной REAL*4;

JR - имя переменной или имя элемента массива типа INTEGER*4 для приёма результата преобразования.

Значение функции:

I = -2 переполнение;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JOP1
    ACCEPT 99,А
99  FORMAT(F15.0)
    IF(JAFIX(A,JOP1).EQ.-2) GOTO 100

3.7.8. JCMP

Назначение: сравнение данных типа INTEGER*4.

Обращение:

I = JCMP(J1,J2)

Описание параметров:

J1 - имя переменной INTEGER*4 или имя элемента массива, первый операнд;

J2 - имя переменной INTEGER*4 или имя элемента массива, второй операнд.

Значение функции:

I = -1     J1 < J2;

I = 0      J1 = J2;

I = 1      J1 > J2.

ПРИМЕЧАНИЕ. Функция имеет тип INTEGER*2.

Пример:

    INTEGER*2 JOPX,JOPY
    IF(JCMP(JOPX,JOPY)) 10,20,30
          .
          .
          .

3.7.9. JDFIX

Назначение: преобразование данного типа REAL*8 в INTEGER*4.

Обращение:

I = JDFIX(DS,JR)

Описание параметров:

DS - константа, выражение или имя переменной REAL*8;

JR - имя переменной или имя элемента массива типа INTEGER*4 для приёма результата преобразования.

Значение функции:

I = -2 переполнение;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JNUM
    REAL*8 DPNUM
          .
          .
          .
20  TYPE 98
98  FORMAT('ENTER POSITIVE INTEGER')
    ACCEPT 99,DPNUM
99  FORMAT(F20.0)
    IF(JDFIX(DPNUM,JNUM).LT.0) GOTO 20
          .
          .
          .

3.7.10. JDIV

Назначение: деление данных типа INTEGER*4.

Обращение:

I = JDIV(J1,J2,JR[,JO])

Описание параметров:

J1 - имя переменной или имя элемента массива типа INTEGER*4, делимое;

J2 - имя переменной или имя элемента массива типа INTEGER*4, делитель;

JR - имя переменной или имя элемента массива типа INTEGER*4, частное;

JO - имя переменной INTEGER*4, остаток со знаком переменной J1.

Значение функции:

I = -3 деление на ноль;

I = -1 частное меньше 0;

I = 0 частное равно 0;

I = 1 частное больше 0.

Пример:

    INTEGER*4 JN1,JN2,JQUO
          .
          .
          .
    CALL JDIV(JN1,JN2,JQUO)

3.7.11. JICVT

Назначение: преобразование данного типа INTEGER*2 в INTEGER*4

Обращение:

I = JICVT(JS,JR)

Описание параметров:

IS - имя преобразуемой переменной или имя элемента массива типа INTEGER*2;

JR - имя переменной INTEGER*4 или имя элемента массива для приёма результата преобразования.

Значение функции:

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JVAL
    CALL JICVT(478,JVAL)

3.7.12. JJCVT

Назначение: преобразование времени из внутреннего представления в данное INTEGER*4 или наоборот.

Обращение:

CALL JJCVT(JS)

Описание параметров:

JS - имя преобразуемой переменной во внутреннем представлении или INTEGER*4.

ПРИМЕЧАНИЯ.

  1. Действие данной подпрограммы заключается в перестановке слов ячеек памяти: содержимое ячейки со старшим адресом записывается по адресу ячейки с младшим адресом и наоборот.
  2. Запись времени во внутреннем представлении приведена в п. 3.5.1.

Пример:

    INTEGER*4 TIME
          .
          .
          .
    CALL GTIM(TIME)
    CALL JJCVT(TIME)

3.7.13. JMOV

Назначение: присваивание значения переменной INTEGER*4

Обращение:

I = JMOV(JS,JT)

Описание параметров:

JS - имя переменной INTEGER*4, значение которой присваивается JT;

JT - имя переменной INTEGER*2, которой присваивается значение.

Значение функции:

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 INT1
          .
          .
          .
    IF(JMOV(INT1,INT1).NE.0) GOTO 300

3.7.14. JMUL

Назначение: умножение данных типа INTEGER*4.

Обращение:

I = JMUL(J1,J2,JR)

Описание параметров:

J1 - имя переменной или имя элемента массива типа INTEGER*4, множимое;

J2 - имя переменной или имя элемента массива типа INTEGER*4, множитель;

JR - имя переменной или имя элемента массива типа INTEGER*4 для приёма произведения.

Значение функции:

I = -2 переполнение;

I = -1 произведение меньше 0;

I = 0 произведение равно 0;

I = 1 произведение больше 0.

Пример:

    INTEGER*4 J1,J2,JRES
          .
          .
          .
    IF(JMUL(J1,J2,JRES)+1) 100,10,20

3.7.15. JSUB

Назначение: вычитание данных типа INTEGER*4.

Обращение:

I = JSUB(J1,J2,JR)

Описание параметров:

J1 - имя переменной или имя элемента массива типа INTEGER*4, уменьшаемое;

J2 - имя переменной или имя элемента массива типа INTEGER*4, вычитаемое;

JR - имя переменной или имя элемента массива типа INTEGER*4 для приёма разности.

Значение функции:

I = -2 переполнение;

I = -1 результат меньше 0;

I = 0 результат равен 0;

I = 1 результат больше 0.

Пример:

    INTEGER*4 JOP1,JOP2,J3
          .
          .
          .
    CALL JSUB(JOP1,JOP2,J3)

3.8. Операции с текстовыми данными

Библиотека системных подпрограмм содержит набор подпрограмм для обработки текстовых данных. Текстовое данное задаётся в виде массива LOGICAL*1 или буквенно-цифрового литерала и может содержать любую последовательность символов, коды которых находятся в интервале от 001 до 127. Текстовое данное, которое имеет значение "пусто" (данное, не содержащее символов), может быть задано переменной или константой, принимающей нулевое значение, или переменной или константой логического типа, принимающей значение "ложь".

Каждый символ в текстовом данном имеет свою позицию. Позиции символов в текстовом данном нумеруются последовательно слева направо, начиная с 1.

Максимальная длина текстового данного 32767 символов.

3.8.1. Размещение текстового данного в массиве

Во время выполнения подпрограмм необходимо следить за тем, чтобы текстовое данное не выходило за границы массива, отведённого для него. Для задания длины текстового данного используется параметр LE. С параметром LE может использоваться параметр ER - переменная логического типа, которой первоначально Фортран-программой должно быть присвоено значение "ложь". Если результирующее текстовое данное усекается до длины LE, то параметру ER подпрограммой, в вызове которой он используется, присваивается значение "истина". При записи текстового данного в массив LOGICAL*1 следует добавлять код 000 в качестве признака конца текстового данного. Системные подпрограммы это делают автоматически.

Одномерный массив типа LOGICAL*1 может быть использован для размещения одного текстового данного, длина которого изменяется от нуля до величины, на единицу меньшей размера массива.

Массив, в который будет помещён результат, должен содержать число LE+1 элементов (один элемент предназначен для размещения признака конца текстового данного).

Для размещения одномерного массива текстовых данных может быть использован двумерный массив типа LOGICAL*1. Каждое текстовое данное массива должно иметь длину на единицу меньшую размера массива по первому измерению. Число текстовых данных в массиве определяется по второму измерению массива.

Пример:

LOGICAL*1 W(21,10)

В данном примере создаётся массив текстовых данных, который состоит из 10 текстовых данных, каждое из которых может содержать до 20 символов.

В массиве типа LOGICAL*1 может размещаться массив текстовых данных, имеющий максимум 6 измерений (максимальное число измерений массива LOGICAL*1 равно 7).

3.8.2. Передача текстовых данных

Массивы LOGICAL*1, содержащие текстовые данные, могут помещаться в COMMON и обращение к ним каких - либо или всех подпрограмм осуществляется через аналогичный COMMON. Необходимо иметь в виду, что если массив LOGICAL*1 имеет нечётное число элементов, то всем последующим переменным блока COMMON будут присвоены нечётные адреса.

Массив LOGICAL*1 имеет нечётное число элементов в том случае, если произведение размеров по всем измерениям нечётно.

Пример:

    LOGICAL*1 В(10,7) !(10*7) = 70 чётное число элементов
    LOGICAL*1 H(21)   ! 21 нечётное число элементов

Если массивы с нечётным числом элементов размещают в COMMON, то их следует помещать или последними, или попарно, чтобы получить чётное число элементов.

Пример:

COMMON А1,А2,А3(10),H(21)

Массив нечётного размера помещён в конце COMMON.

COMMON А1,А2,H(21),H1(7),А3(10)

Массивы нечётных размеров H и H1 расположены попарно.

Эти предосторожности относятся только к переменным и массивам LOGICAL*1.

Второй способ передачи текстовых данных подпрограммам - использование фактических и формальных параметров подпрограмм.

Текстовое данное может быть передано путём указания имени массива, содержащего это данное в качестве фактического параметра.

Пример:

    LOGICAL*1 А(21) ! текстовое данное "А" содержит не бо-
                    ! лее 20 символов
    CALL SUBR(A)  ! передать текстовое данное "А" подпро-
                  ! грамме SUBR

Если максимальная длина текстового данного, используемого в качестве формального параметра подпрограммы, неизвестна, или подпрограмма используется для обработки текстовых данных различной длины, то формальный параметр подпрограммы должен быть объявлен как одномерный массив LOGICAL*1.

Пример:

LOGICAL*1 ARG(1)

В этом случае системные подпрограммы обработки текстовых данных будут правильно определять длину текстового данного.

Если в подпрограмму передаётся многомерный массив текстовых данных, то он должен быть описан в вызываемой программе с теми же размерами по измерениям, с какими он указан в вызывающей программе.

3.8.3. CONCAT

Назначение: объединение двух текстовых данных.

Обращение:

CALL CONCAT(V1,V2,RT[,LE[,ER]])

Описание параметров:

V1 - имя массива, содержащего первое текстовое данное;

V2 - имя массива, содержащего второе текстовое данное;

RT - имя массива, в который помещается результат;

LE - целое или имя переменной типа целый, определяющей максимальную длину результирующего текстового данного;

ER - имя логической переменной, принимающей значение "истина", если результирующее текстовое данное усекается до длины LE.

Метод:

к текстовому данному V1 присоединяется текстовое данное V2 и код 000; полученное текстовое данное записывается в RT. Если одно текстовое данное имеет значение "пусто", то в RT копируется другое текстовое данное. Если оба текстовых данных имеют значение "пусто", то RT также имеет значение "пусто". После выполнения подпрограммы старое содержимое массива RT теряется.

Пример:

    LOGICAL*1 IN(22),OUT(30),STR(7)
          .
          .
          .
    CALL CONCAT(STR,IN,OUT,29)

3.8.4. GETSTR

Назначение: ввод форматной записи с указанного логического устройства в массив. Конечные пробелы удаляются, и присоединяется код 000.

Обращение:

CALL GETSTR(LN,RT,LE,ER)

Описание параметров:

LN - целое или имя переменной типа целый, определяющей номер логического устройства, с которого осуществляется ввод записи;

RT - имя массива, принимающего форматную запись;

LE - целое или имя переменной типа целый, определяющей максимальную длину вводимой записи;

ER - имя логической переменной, принимающей значение "истина" в случае возникновения ошибки;

ER = -1 обнаружен конец файла;

ER = -2 аппаратная ошибка;

ER = -3 запись содержит больше символов, чем определено в параметре LE.

Ограничения:

  1. Подпрограмма GETSTR не должна одновременно использоваться в подпрограммах основной программы и подпрограмме завершения одного задания.
  2. Если GETSTR используется в подпрограмме завершения, то она не должна быть первой операцией ввода-вывода на логическом устройстве.

ПРИМЕЧАНИЕ. Конечный пробел представляет собой пробел, справа от которого отсутствуют символы, отличные от пробела.

Пример:

    LOGICAL*1 STRING(81),ERR
          .
          .
          .
    CALL GETSTR(5,STRING,80,ERR)

3.8.5. INDEX

Назначение: поиск символа или последовательности символов в текстовом данном.

Обращение:

CALL INDEX(V1,PT[,E[,MT]])

 или

MT = INDEX(V1,PT[,E])

Описание параметров:

V1 - имя массива, содержащего просматриваемое текстовое данное;

PT - искомый символ или последовательность символов;

E - целое или имя переменной типа целый, определяющей номер позиции, начиная с которой осуществляется поиск;

MT - целое или имя переменной типа целый, определяющей номер позиции первого появления искомого символа или последовательности символов. MT = 0, если символ (последовательность символов) не найден.

ПРИМЕЧАНИЕ. Если параметр E не задан, поиск начинается с первого символа массива.

Пример:

    CALL SCOPY('ABCDEFGHI',STRING)
    CALL INDEX(STRING, 'EFG', ,M)
    CALL INDEX(STRING, 'XYZ', ,N)
    CALL INDEX('ABCABCABC','ABC',5,L)

3.8.6. INSERT

Назначение: замена символов одного текстового данного символами другого текстового данного.

Обращение:

CALL INSERT(M1,RS,E[,MT])

Описание параметров:

M1 - имя массива, содержащего вводимое текстовое данное;

RS - имя массива, содержащего изменяемое текстовое данное;

E - целое или имя переменной типа целый, определяющей номер позиции в RS, начиная с которой осуществляется замена символов;

MT - целое или имя переменной типа целый, определяющей максимальное число заменяемых символов.

ПРИМЕЧАНИЯ.

  1. Если параметр MT не задан, все символы, расположенные справа от E в текстовом данном массива RS, заменяются символами текстового данного массива M1.
  2. Вводимое и изменяемое текстовые данные могут находиться в одном массиве, если MT определено и не превосходит разницы значений параметра E и максимальной длины текстового данного модифицируемого массива.

Пример:

    CALL SCOPY('ABCDEFGHIJ',S1)
    CALL SCOPY(S1,S2)
    CALL INSERT('123',S1,6,3)
    CALL INSERT('123',S2,4)

3.8.7. ISCOMP/SCOMP

Назначение: сравнение двух текстовых данных:

Обращение:

CALL SCOMP(V1,V2,I)

 или

I = ISCOMP(V1,V2)

Описание параметров:

V1 - имя массива, содержащего первое текстовое данное;

V2 - имя массива, содержащего второе текстовое данное;

I - целое или имя переменной типа целый, определяющей номер позиции несовпадающих символов.

Значение функции:

I<0 - подпрограмма выполнена, V1<V2;

I = 0 - подпрограмма выполнена, V1 = V2;

I>0 - подпрограмма выполнена, V1>V2.

Метод: текстовые данные сравнивать слева направо посимвольно. Если текстовые данные имеют неодинаковую длину, то текстовое данное, имеющее меньшую длину, дополнить пробелами. Пустое текстовое данное заменить пробелами.

Ограничения:         в качестве параметров подпрограмм ISCOMP/SCOMP не может использоваться буквенно-цифровой литерал.

3.8.8. VERIFY/IVERIF

Назначение: определение позиции несовпадающих символов двух текстовых данных.

Обращение:

CALL VERIFY(V1,V2,I)

 или

I = IVERIF(V1,V2)

Описание параметров:

V1 - имя массива, содержащего первое текстовое данное;

V2 - имя массива, содержащего второе текстовое данное;

I - целое или имя переменной типа целый, определяющей номер позиции несовпадающих символов.

Значение функции:

I = 0 - текстовые данные совпадают или текстовое данное V1 является пустым;

I = N, N - номер позиции первого символа V1, не совпадающего с V2;

I = 1 - текстовое данное V2 - пустое, V1 не является пустым.

Ограничения:         в качестве параметров подпрограмм VERIFY/IVERIF не может использоваться буквенно-цифровой литерал.

Пример:

    LOGICAL*1 INSTR(81)
          .
          .
          .
    CALL VERIFY(INSTR,'0123456789',I)
    IF(I.EQ.1) STOP 'NUMBER MISSING'
    IF(I.EQ.0) I = LEN(INSTR)
    IF(I.GT.5) STOP 'TOO MANY DIGITS'
    NUM = IVALUE(INSTR,I)
          .
          .
          .
    END

3.8.9. LEN

Назначение: определение числа символов в текстовом данном.

Обращение:

I = LEN(V1)

Описание параметров:

V1 - имя массива, содержащего текстовое данное.

ПРИМЕЧАНИЯ.

  1. В качестве параметра подпрограммы LEN не может использоваться буквенно-цифровой литерал.
  2. Нулевой байт, являющийся признаком конца текстового данного, не входит в число символов текстового данного.
  3. Длина пустого текстового данного - 0.

Пример:

    LOGICAL*1 STRING(73)
          .
          .
          .
    TYPE 99,(STRING(I),I=1,LEN(STRING))
99  FORMAT('0',132A1)

3.8.10. PUTSTR

Назначение: вывод форматной записи на логическое устройство.

Обращение:

CALL PUTSTR(LN,M1,CA,ER)

Описание параметров:

LN - целое или имя переменной типа целый, определяющей номер логического устройства, на которое осуществляется вывод записи;

M1 - имя массива, содержащего форматную запись;

CA - символ, добавляемый в начало записи для управления кареткой;

ER - имя логической переменной, принимающей значение "истина" в случае возникновения ошибки:

ER = -1 обнаружен конец файла;

ER = -2 аппаратная ошибка.

Ограничения:

  1. Подпрограмма PUTSTR не должна использоваться одновременно в подпрограммах основной программы и подпрограмме завершения одного задания.
  2. Если PUTSTR используется в подпрограмме завершения, то она не должна быть первой операцией ввода-вывода на логическом устройстве.

ПРИМЕЧАНИЯ.

  1. Форматная запись массива M1 должна оканчиваться нулевым байтом.
  2. Если CA = 0, то первый символ M1 будет первым символом записи на логическом устройстве.

Пример:

    LOGICAL*1 STRING(81),ERR
          .
          .
          .
    CALL PUTSTR(7,STRING,'0',ERR)

3.8.11. REPEAT

Назначение: копирование текстового данного заданное число раз.

Обращение:

CALL REPEAT(M1,RT,IK[,LE[,ER]])

Описание параметров:

M1 - имя массива, содержащего копируемое текстовое данное;

RT - имя массива для приёма результата;

IK - целое или имя переменной типа целый, определяющей число копирований;

LE - целое или имя переменной типа целый, определяющей максимальную длину результирующего текстового данного;

ER - имя логической переменной, принимающей значение "истина", если результирующее текстовое данное усекается до длины LE.

ПРИМЕЧАНИЯ.

  1. Копируемое и результирующее текстовые данные могут находиться в одном массиве, если число копирований IK равно 1 или 0.
  2. Если IK = 1, действие REPEAT аналогично SCOPY.
  3. Если IK = 0, в массив RT помещается пустое текстовое данное. Старое содержимое RT теряется.

Пример:

    LOGICAL*1 SIN(21),SOUT(101)
    CALL REPEAT(SIN,SOUT,5)

3.8.12. SCOPY

Назначение: копирование текстового данного.

Обращение:

CALL SCOPY(M1,RS[,LE[,ER]])

M1 - имя массива, содержащего копируемое текстовое данное;

RS - имя массива для приёма копируемого текстового данного (результата);

LE - целое или имя переменной типа целый, определяющей максимальную длину результирующего текстового данного;

ER - имя логической переменной, принимающей значение "истина", если текстовое данное усекается до длины LE.

ПРИМЕЧАНИЯ:

  1. Копирование текстового данного заканчивается при появлении признака конца текстового данного или достижении заданной длины текстового данного.
  2. Копируемое и результирующее текстовые данные могут находиться в одном массиве.
  3. После выполнения подпрограммы старое содержимое массива RS теряется.

Пример:

    LOGICAL*1 STRING(80)
    CALL SCOPY('THIS IS THE INITIAL VALUE',STRING)

3.8.13. STRPAD

Назначение: дополнение текстового данного пробелами справа до заданной длины.

Обращение:

CALL STRPAD(V1,IR[,ER])

Описание параметров:

V1 - имя массива, содержащего текстовое данное, которое будет дополняться пробелами;

IR - целое или имя переменной типа целый, определяющей длину результирующего текстового данного;

ER - имя логической переменной, принимающей значение "истина", если длина исходного текстового данного превышает значение IR.

ПРИМЕЧАНИЕ. Если длина исходного текстового данного больше или равна заданной, дополнение текстового данного пробелами не производится.

Пример:

    LOGICAL*1 STR(81)
          .
          .
          .
    CALL STRPAD(STR,80)
    PRINT 100,(STR(I),I = 1,80)
100 FORMAT(80A1)

3.8.14. SUBSTR

Назначение: копирование текстового данного с указанного номера позиции.

Обращение:

CALL SUBSTR(M1,RT,IP[,LE])

Описание параметров:

M1 - имя массива, содержащего копируемое текстовое данное;

RT - имя массива для приёма копируемого текстового данного (результата);

IP - целое или имя переменной типа целый, определяющей номер позиции в массиве M1, начиная с которого осуществляется копирование текстового данного.

ПРИМЕЧАНИЯ.

  1. Если параметр LE не задан, результирующее текстовое данное будет содержать все символы копируемого текстового данного, начиная с позиции IP.
  2. Если LE = 0, в массив RT записывается текстовое данное.
  3. После выполнения подпрограммы старое содержимое RT теряется.

3.8.15. TRANSL

Назначение: модификация текстового данного путём замены и перестановки символов.

Обращение:

CALL TRANSL(M1,RT,SL[,LP])

Описание параметров:

M1 - имя массива, содержащего исходное текстовое данное;

RT - имя массива (для приёма модифицированного текстового данного;

SL - имя массива, содержащего символы для модификации;

LP - имя массива, содержащего символы, которые должны быть модифицированы.

В массив RT помещается массив M1, модифицированный символами SL. Если массив M1 содержит символ, указанный в LP, то в массиве RT он заменяется соответствующим символом из SL. Если массив LP не указан, то предполагается, что он состоит из 127 символов КОИ-7, коды которых расположены в возрастающем порядке, начиная с 001. Если текстовые данные массивов SL и LP отличаются по числу символов, то длинное текстовое данное усекается до короткого.

ПРИМЕЧАНИЕ. Для выполнения подпрограммы TRANSL требуется область стека приблизительно из 64 слов. Это следует учитывать при работе с данной подпрограммой.

Примеры:

  1.  

    CALL TRANSL(GA,GB,'-!','.?')

    GA копируется в GB, причём все точки в GA заменяются на минусы, а знаки "?" на "!".

  2. В данном примере осуществляется перестановка символов текстового данного 'THE HORN BLOWS AT MIDNIGHT' в следующем порядке: 'AT MIDNIGHT THE HORN BLOWS'
        LOGICAL*1 STRING(27),RESULT(27),PATRN(27)
        CALL SCOPY('THE HORN BLOWS AT MIDNIGHT',STRING)
        DO 10 I = 16,26
    10  PATRN(I - 15) = I
        PATRN(12) = 15
        DO 20 I = 1,14
    20  PATRN(I + 12) = I
        PATRN(27) = 0
        CALL TRANSL(PATRN,RESULT,STRING)

3.8.16. TRIM

Назначение: удаление конечных пробелов из текстового данного.

Обращение:

CALL TRIM(V1)

Описание параметров:

V1 - имя массива, содержащего исходное текстовое данное.

ПРИМЕЧАНИЯ.

  1. Если все символы текстового данного являются пробелами, то текстовое данное заменяется пустым.
  2. Если текстовое данное не имеет конечных пробелов, то оно не изменяется.

Пример:

    LOGICAL*1 STRING(81)
    ACCEPT 100,(STRING(I),I = 1,80)
100 FORMAT(80A1)
    CALL SCOPY(STRING,STRING,80)
    CALL TRIM(STRING)

3.9. Преобразования RADIX-50

3.9.1. IRAD50

Назначение: упаковка символов КОИ-7 в RADIX-50 и подсчёт числа упакованных символов.

Обращение:

N = IRAD50(G,BC,P)

Описание параметров:

G - константа, определяющая число упаковываемых символов КОИ-7;

BC - буквенно-цифровой литерал или имя массива, содержащего упаковываемые символы КОИ-7;

P - имя массива для приёма результата.

Значение функции: N - число упакованных символов КОИ-7.

Метод: три символа КОИ-7 упаковываются в одно слово RADIX-50. Число образуемых слов RADIX-50 определяется выражением (G+2)/3, имеющим целое значение.

Выполнение подпрограммы прекращается при появлении символа, не имеющего эквивалента RADIX-50, или после упаковки указанного числа символов КОИ-7.

Пример:

    REAL*8 FSPEC
    CALL IRAD50(12,'SYOTEMP DAT',FSPEC)

3.9.2. R50ASC

Назначение: распаковка символов RADIX-50 в КОИ-7.

Обращение:

CALL R50ASC(G,BC,P)

Описание параметров:

G - константа, определяющая число получаемых символов КОИ-7;

BC - имя массива, содержащего распаковываемые символы RADIX-50 ((G + 2)/3 слова);

P - имя массива для приёма результата.

ПРИМЕЧАНИЕ. Символы RADIX-50, не имеющие эквивалента КОИ-7 (т.е. коды, абсолютная величина которых больше 174777(8)), заменяются символом "?".

Пример:

    REAL*8 NAME
    LOGICAL*1 OUTPT(12)
          .
          .
          .
    CALL R50ASC(12,NAME,OUTPT)

3.9.3. RAD50

Назначение: упаковка шести символов КОИ-7 в RADIX-50.

Обращение:

A = RAD50(BC)

Описание параметров:

BC - буквенно-цифровой литерал или имя массива, содержащего упаковываемые символы КОИ-7.

Значение функции: символы RADIX-50, записанные в две ячейки памяти как данное типа REAL*4.

ПРИМЕЧАНИЕ. Подпрограмма RAD50 может использоваться для записи спецификаций файлов в коде RADIX-50.

Пример:

следующие командные строки эквивалентны:

A = RAD50(LINE)

и

CALL IRAD50(6,LINE,А)

3.10. Работа в мультитерминальном режиме

3.10.1. МТАТСН (режим FB/XM)

Назначение: установление связи задания с указанным терминалом.

Обращение:

I = МТАТСН(UN[,SA],[NJ])

Описание параметров:

SA - восьмеричная константа, определяющая адрес слова асинхронного состояния терминала;

NJ - номер задания, связанного с терминалом, если терминал занят. Значение параметра NJ устанавливается подпрограммой МТАТСН.

Значение функции:

I = 0 подпрограмма выполнена;

I = 3 номер несуществующего устройства;

I = 5 устройство связано с другим заданием;

I = 6 адрес слова асинхронного состояния терминала находится за пределами допустимых виртуальных адресов (режим ХМ).

ПРИМЕЧАНИЯ.

  1. Подпрограмма МТАТСН должна быть выполнена до того, как какое - либо задание может использовать терминал в мультитерминальном режиме.
  2. Задание использования слова асинхронного состояния терминала осуществляется при генерации системы ФОДОС-2. Формат слова асинхронного состояния терминала приведён в приложении 4.
  3. Если слово асинхронного состояния терминала не используется, значение параметра SA должно быть равно нулю.

Пример:

        INTEGER*2 UNIT,SBLOK(4),STAT(8),ASW,STRING(41),PROMPT(8)
        LOGICAL*1 TEND(11)
        REAL*4 TESTM(9)
        DATA PROMPT/'EN','ТЕ','R ','ST','RI','NG','>',"200/
        DATA TEND/'*','E','N','D',' ','T','E','S','T','*',0/
        DATA TS/'ST','ATCH','GET','SET',' ',' ',' ',' ','DTCH'/
        TYPE 106
        L=1
        IF(MTSTAT(STAT).NE.0) GOTO 999
        TYPE 99,STAT(3)
        TYPE 100 ACCEPT 101,UNIT
        IF(UNIT.EQ.99) STOP 'END OF MULTI-TERMINAL TEST'
        TYPE 110
        ACCEPT 111,IASW
        IF(IASW.EQ.'Y')IER=МТАТСН(UNIT,ASW,JOB)
        IF(IASW.NE.'Y')IER=МТАТСН(UNIT,0,JOB)
        L=2
        IF(IER) GOTO 999
        L=3
        IF(MTGET(UNIT,SBLOK(1)).NE.0) GOTO 999
        TYPE 102,UNIT,SBLOK
        CALL SETUP(SBLOK,UNIT)
        L=4
        IF(MTSET(UNIT,SBLOK(1)).NE.0) GOTO 999
        TYPE 102,UNIT,SBLOK
20      TYPE 103
        TYPE 104
        TYPE 105
30      CALL MTIN(UNIT,J)
        CALL MTOUT(UNIT,J)
        IF(J.NE.10) GOTO 30
        CALL MTRCTO(UNIT)
        IF(SBLOK(1).AND."10000) GOTO 40
        SBLOK(1)=SBLOK(1).OR."10000
        IF(MTSET(UNIT,SBLOK(1)).NE.0) GOTO 999
        GOTO 30
40      SBLOK(1)=SBLOK(1).AND..NOT."10000
         
        IF(MTSET(UNIT,SBLOK(1)).NE.0) GOTO 999
        IF(IASW.NE.'Y') GOTO 60
        TYPE 109
50      IF(.NOT.ASW.AND."40000) GOTO 50
55      CALL MTIN(UNIT,J)
        CALL MTOUT(UNIT,J)
        IF(J.NE.10) GOTO 55
        CALL MTRCTO(UNIT)
60      CALL GTLIN(STRING,PROMT)
        CALL MTPRNT(UNIT,STRING)
        CALL MTPRNT(UNIT,TEND)
        L=9
        TYPE 108,UNIT
        IF(MTDTCH(UNIT).EQ.0) GOTO 5
999     TYPE 909,TS(L),IER
        GOTO 5
99      FORMAT('OTHERE ARE',I3,'UNITS ON THIS SYSTEM')
100     FORMAT('UNIT # TO BE TESTED?')
101     FORMAT(I2)
102     FORMAT(' OUNIT',I3,' STATUS=',408)
103     FORMAT(' 0GO TO TT BEGIN TESTED ENTER 2 LINES + <ВК>')
104     FORMAT(' 1ST LINE: INPUT WILL BE ECHOED THEN REPEATED')
105     FORMAT(' 2ND LINE: TEST - INPUT ECHOED VIA MTOUT'/)
106     FORMAT(' 1  SYSLIB MT ROUTINE TEST PROGRAM')
108     FORMAT(' ABOUT TO DETATCH UNIT#',I2)
109     FORMAT(' TEST ASW - INPUT WILL BE ECHOED'/)
110     FORMAT('TEST ASYNCH STATUS WORD FUNCTION?')
111     FORMAT(A1)
909     FORMAT(' OMT',A4,' ERROR CODE = ',I3)
        END
        SUBROUTINE SETUP(SBLOK,UNIT)
        INTEGER SBLOK(4),UNIT
        TYPE 100
        ACCEPT 101,J
        IF(J)SBLOK(1) = J
        TYPE 102
        ACCEPT 101,J
        TYPE 103
        ACCEPT 101,I
        IF(I.OR.J)SBLOK(3)=I*256+J
5       TYPE 104
        ACCEPT 105,I
        IF(I)SBLOK(4) = SBLOK(4)/256*256+I
        RETURN
100     FORMAT('CONFIG BIT MASK:')
101     FORMAT(06)
102     FORMAT('CHAR REQUIRING FILLER:')
103     FORMAT('# OF FILL CHARS:')
104     FORMAT('CARRIAGE WIDTH:')
103     FORMAT(I3)
        END

3.10.2. MTDTCH (режим FB/XM)

Назначение: прерывание связи задания с терминалом.

Обращение:

I = MTDTCH(UN)

Значение функции:

I = 0 подпрограмма выполнена;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего устройства.

ПРИМЕЧАНИЕ. Подпрограмма MTDTCH используется совместно с подпрограммой МТАТСН.

3.10.3. MTGET (режим FB/XM)

Назначение: определение состояния указанного терминала.

Обращение:

I = MTGET(UN,SA[,NJ])

Описание параметров:

SA - имя четырёхсловного массива INTEGER*2, определяющего область памяти для приёма информации о состоянии терминала;

NJ - номер задания, связанного с терминалом, если терминала занят.

Значение функции:

I = 0 подпрограмма выполнена;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего устройства;

I = 4 терминал связан с другим заданием (номер задания присваивается параметру NJ);

I = 6 адрес слова асинхронного состояния терминала находится за пределами допустимых виртуальных адресов (режим ХМ).

3.10.4. MTIN (режим FB/XM)

Назначение: ввод символа с указанного терминала.

Обращение:

I = MTIN(UN,DA[,CC][,OS])

Описание параметров:

DA - имя массива для приёма вводимых с терминала символов;

CC - константа, определяющая число вводимых символов;

OS - константа, определяющая число фактически введённых символов.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 отсутствует символ в буфере ввода;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего устройства.

ПРИМЕЧАНИЯ.

  1. Если параметр CC не указан, то вводится один символ.
  2. Подпрограмма MTIN является мультитерминальной формой подпрограммы ITTINR (см. п. 3.2.6).

3.10.5. MTOUT (режим FB/XM)

Назначение: вывод символа на указанный терминал.

Обращение:

I = MTOUT(UN,DA[,CC][,OS])

Описание параметров:

DA - имя массива, содержащего выводимые символы;

CC - константа, определяющая число выводимых символов;

OS - константа, определяющая число фактически выведенных символов.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 буфер вывода переполнен;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего терминала;

I = 5 адрес буфера пользователя находится за пределами программы (в режиме ХМ).

ПРИМЕЧАНИЕ. Подпрограмма MTOUT является мульти-терминальной формой подпрограммы ITTOUR (см. п. 3.2.7).

3.10.6. MTPRNT (режим FB/XM)

Назначение: вывод текстового данного на указанный терминал.

Обращение:

I = MTPRNT(UN,SI)

Описание параметров:

SI - буквенно-цифровой литерал или имя массива, содержащего текстовое данное, которое должно быть выведено.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 буфер вывода переполнен;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего терминала;

I = 5 адрес буфера пользователя находится за пределами программы (режим ХМ).

ПРИМЕЧАНИЕ. Подпрограмма MTPRNT является мультитерминальной формой подпрограммы PRINT (см. п. 3.2.11).

3.10.7. MTRCTO (режим FB/XM)

Назначение: отмена команды СУ/D.

Обращение:

I = MTRCTO(UN)

Значение функции:

I = 0 подпрограмма выполнена;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего устройства.

ПРИМЕЧАНИЕ. Подпрограмма MTRCTO является мультитерминальной формой подпрограммы RCTRLO (см. п. 3.6.11).

3.10.8. MTSET (режим FB/XM)

Назначение: задание характеристик указанного терминала.

Обращение:

I = MTSET(UN,MS)

Описание параметров:

MS - имя четырёхсловного массива INTEGER*2, определяющего область памяти, содержащую характеристики терминала.

Значение функции:

I = 0 подпрограмма выполнена;

I = 2 терминал не связан с заданием;

I = 3 номер несуществующего устройства;

I = 6 адрес слова асинхронного состояния терминала находится за пределами допустимых виртуальных адресов (режим ХМ).

ПРИМЕЧАНИЯ.

  1. Для восстановления прежних характеристик терминала необходимо перезагрузить систему ФОДОС-2.
  2. Информация по установлению характеристик терминала приведена в документе [1] при описании запроса .MTSET.

3.10.9. MTSTAT (режим FB/XM)

Назначение: получение информации о состоянии мультитерминальной системы.

Обращение:

I = MTSTAT(A8)

Описание параметров:

A8 - имя восьмисловного массива для записи следующей информации:

A8(1) - смещение от начала резидентного монитора первого контрольного блока терминала;

A8(2) - смещение от начала резидентного монитора контрольного блока терминала для системного терминала;

A8(3) - число контрольных блоков терминала, созданных в системе (0 - 16(10));

A8(4) - размер контрольного блока терминала (в битах);

A8(5) - A8(8) - не используются.

Значение функции:

I = 0 подпрограмма выполнена;

I = 5 область A8 недоступна в режиме ХМ.

3.11. Вспомогательные операции

3.11.1. IADDR

Назначение: определение абсолютного адреса памяти константы, выражения или переменной.

Обращение:

I = IADDR(AK)

Описание параметров:

AK - константа, выражение или переменная, адрес памяти которой надо определить.

Пример:

IADDR можно использовать для определения адреса внешнего имени:

    EXTERNAL CAREA
    J = IADDR(CAREA)

3.11.2. IGETSP

Назначение: назначение свободной области памяти для выполнения программы.

Обращение:

I = IGETSP(MN,MX,IR)

Описание параметров:

MN - целое, определяющее минимальный объём свободной памяти (число слов);

MX - целое, определяющее максимальный объём свободной памяти;

IR - имя переменной типа целый, которой подпрограмма присваивает адрес начала свободной области памяти.

Значение функции:

I = -1 недостаточно свободной памяти для выделения требуемого минимального объёма памяти;

I = N размер выделенной области памяти (MN<= N <= MX).

ПРИМЕЧАНИЕ. Если недостаточно свободной памяти для выполнения программы, печатаются сообщения об ошибках с номерами 29, 30, 42.

3.11.3. INTSET

Назначение: назначение подпрограммы на языке Фортран для обслуживания прерываний.

Обращение:

I = INTSET(VT,PR,ID,CR)

Описание параметров:

VT - восьмеричная константа или имя переменной типа целый, определяющей адрес вектора прерывания;

PR - целое, определяющее приоритет (4 - 7), по которому устройство запрашивает прерывание;

ID - переменная типа целый, определяющая идентификатор, передаваемый подпрограмме обслуживания прерываний;

CR - имя подпрограммы на языке Фортран, назначаемой для обслуживания прерываний.

Значение функции:

I = 0 подпрограмма выполнена;

I = 1 недопустимый вектор прерывания;

I = 3 недостаточно памяти для организации связи.

Ограничения:

  1. INTSET не может быть вызвана из подпрограммы завершения или обслуживания прерываний.
  2. Подпрограмма обслуживания прерываний не может вызывать USR.
  3. Бит разрешения прерывания не должен быть установлен на соответствующем устройстве раньше окончания выполнения INTSET.

ПРИМЕЧАНИЯ.

  1. Имя подпрограммы обслуживания прерываний CR должно быть объявлено как внешнее имя в программе, которая вызывает INTSET. Подпрограмма должна иметь один параметр:
    SUBROUTINE CR(ID)
    INTEGER ID
  2. Параметр ID позволяет различать прерывания от разных векторов, если подпрограмма CR обслуживает несколько устройств. Если подпрограмма обслуживания прерываний введена, значение параметра ID будет равно значению, указанному для идентификатора в соответствующем вызове INTSET.
  3. При выполнении INTSET в режиме FB и ХМ рекомендуется использовать подпрограмму DEVICE для предотвращения прерываний, не связанных с окончанием программы.
  4. Если до окончания выполнения подпрограммы обслуживания прерываний происходит более двух новых прерываний по тому же вектору, выдаётся сообщение:
    ?SYSLIB - F - INTERRUPT OVERRUN

    и выполнение задания прекращается.

  5. Программный запрос .PROTECT закрепляет один из векторов за данным заданием, но если вектор прерывания защищён, сообщение об ошибке не выдаётся. Описание запроса .PROTECT приведено в документе [1].
  6. Подпрограмма обслуживания прерываний выполняется как подпрограмма завершения по программному запросу .SYNCH.
  7. Аргумент PR может быть использован в программном запросе .INTEN.

Пример:

    EXTERNAL CLKSUB
          .
          .
          .
    I = INTSET("104,6,0,CLKSUB)
    IF(I.NE.0) GOTO 100
          .
          .
          .
    END
    SUBROUTINE CLKSUB(ID)
          .
          .
          .
    END

3.11.4. IPEEK

Назначение: чтение слова по абсолютному адресу.

Обращение:

I = IPEEK(AB)

Описание параметров:

AB - восьмеричная константа или имя переменной типа целый, определяющей абсолютный адрес.

Значение функции: I = N, где N - слово по абсолютному адресу AB.

ПРИМЕЧАНИЯ.

  1. Подпрограмму можно использовать для проверки регистров устройства или любой ячейки памяти.
  2. Если AB нечётно, происходит прерывание программы и управление передаётся монитору.

Пример:

ISWIT = IPEEK("177570)

3.11.5. IPEEKB

Назначение: чтение байта по абсолютному адресу.

Обращение:

I = IPEEKB(AB)

Описание параметров:

AB - восьмеричная константа или имя переменной типа целый, определяющей абсолютный адрес байта.

Значение функции: I = N, где N - байт по абсолютному адресу AB.

ПРИМЕЧАНИЕ. Подпрограмму можно использовать для проверки регистров устройства или любого байта памяти.

Пример:

IERR = IPEEKB("53)

3.11.6. IPOKE

Назначение: запись слова по абсолютному адресу.

Обращение:

CALL IPOKE(AB,IV)

Описание параметров:

AB - восьмеричная константа или имя переменной типа целый, определяющей абсолютный адрес, по которому осуществляется запись;

IV - восьмеричная константа или имя переменной типа целый, определяющей значение, которое должно быть записано по абсолютному адресу.

ПРИМЕЧАНИЯ.

  1. Подпрограмму IPOKE можно использовать для записи значений в регистры устройства.
  2. Если AB нечётно, происходит прерывание программы и управление передаётся монитору.

Пример:

В данном примере значение переменной IVAL записывается по адресу клавишного регистра:

CALL IPOKE("177570,IVAL)

Для установки разряда 12 в ССЗ без изменения других разрядов используется следующая команда:

CALL IPOKE("44,"10000.OR.IPEEK("44))

3.11.7. IPOKEB

Назначение: запись байта по абсолютному адресу.

Обращение:

I = IPOKEB(AB,IV)

Описание параметров:

AB - восьмеричная константа или имя переменной типа целый, определяющей абсолютный адрес, по которому осуществляется запись;

IV - восьмеричная константа или имя переменной типа целый, определяющей значение, которое должно быть записано по абсолютному адресу.

ПРИМЕЧАНИЕ. IPOKEB можно использовать для записи значений в регистры устройства.

3.11.8. ISPY

Назначение: чтение слова по адресу относительно смещения от начального адреса резидентного монитора(RMON).

Обращение:

I = ISPY(RM)

Описание параметров:

RM - имя переменной типа целый, определяющей смещение от начала RMON.

Значение функции: I = N, где N - слово по относительному адресу.

ПРИМЕЧАНИЕ. Смещение от начала резидентного монитора определяется с помощью программного запроса .GVAL (см. [1]).

Пример:

IF(ISPY("300).AND.1) GOTO 200

3.11.9. IPUT

Назначение: изменение содержимого ячейки памяти, размещённой с заданным смещением от начала резидентного монитора.

Обращение:

I = IPUT(IO,VL)

Описание параметров:

IO - восьмеричная константа, определяющая смещение от начала резидентного монитора ячейки, содержимое которой будет модифицировано;

VL - целое для замены текущего содержимого ячейки.

Значение функции: I = N, где N - старое(заменённое) значение ячейки памяти.

Пример:

ISIZE = IPUT("314,100)

4. СООБЩЕНИЯ

Ниже приведено сообщение библиотеки:

?SYSLIB - F - INTERRUPT OVERRUN

Причина.

До окончания выполнения подпрограммы обслуживания прерываний произошло более двух новых прерываний по тому же вектору.

Действие.

Изменить программу, уменьшив, если возможно, число обращений к подпрограмме обслуживания прерываний и разместив их в программе равномерно. Сократить подпрограмму обслуживания прерываний.

ПРИЛОЖЕНИЕ 1

СПИСОК СИСТЕМНЫХ ПОДПРОГРАММ

Имя подпрограммы

Пункт

Наименование

Операции с файлами

CLOSEC

ICLOSE

3.1.1

Закрытие канала

IDELET

3.1.2

Стирание файла

IENTER

3.1.3

Открытие нового файла

IFPROT

3.1.4

Управление защитой файлов

IRENAM

3.1.5

Переименование файла

ISFDAT

3.1.6

Изменение даты создания файла

LOOKUP

3.1.7

Открытие существующего файла

Передача данных

IABTIO

3.2.1

Прерывание ввода-вывода на указанном канале

GTLIN

3.2.2

Ввод текстового данного с системного терминала или косвенного файла

IRCVD

IRCVDC

IRCVDF

IRCVDW

3.2.3

Приём данных от другого задания

IREAD

IREADC

IREADF

IREADW

3.2.4

Ввод данных

ISDAT

ISDATC

ISDATF

ISDATW

3.2.5

Передача данных другому заданию

ITTINR

3.2.6

Ввод символа с системного терминала

ITTOUR

3.2.7

Вывод символа на системный терминал

IWAIT

3.2.8

Ожидание завершения ввода-вывода

IWRITE

IWRITC

IWRITF

IWRITW

3.2.9

Вывод данных

MWAIT

3.2.10

Ожидание завершения передачи данных между заданиями

PRINT

3.2.11

Вывод текстового данного на системный терминал

Операции с каналами

ICDFN

3.3.1

Увеличение числа каналов

ICHCPY

3.3.2

Установление логической связи с каналом другого задания

ICSTAT

3.3.3

Получение информации о состоянии

ISAVES

3.3.8

Канала

IFREEC

3.3.4

Возвращение канала

IGETC

3.3.5

Назначение канала

ILUN

3.3.6

Определение номера канала, с которым связано логическое устройство

IREOPN

3.3.7

Повторное открытие канала

PURGE

3.3.9

Освобождение канала

Описание устройств и файлов

IASIGN

3.4.1

Установление логической связи между файлом и номером логического устройства

ICSI

3.4.2

Синтаксический анализ командной строки

Работа с таймером

CVTTIM

3.5.1

Преобразование времени из внутреннего представления в часы, минуты, секунды и доли секунды

GTIM

3.5.2

Определение текущего времени во внутреннем представлении

ICMKT

3.5.3

Отмена выполнения ISCHED, ITIMER, MRKT

ISCHED

3.5.4

Планирование выполнения подпрограммы, завершения на языке Фортран в заданное время суток

ISDTTM

3.5.5

Установка системной даты и времени

ISLEEP

3.5.6

Задержка выполнения основного задания на заданный промежуток времени (время - в часах, минутах, секундах и долях секунды)

ITIMER

3.5.7

Планирование выполнения подпрограммы завершения на языке Фортран по истечении заданного промежутка времени

ITWAIT

3.5.8

Задержка выполнения основного задания на заданный промежуток времени (время - во внутреннем представлении)

IUNTIL

3.5.9

Задержка выполнения основного задания до заданного времени суток

JTIME

3.5.10

Преобразование времени во внутреннее представление

MRKT

3.5.11

Планирование выполнения подпрограммы завершения на языке Ассемблера по истечении заданного промежутка времени

SECNDS

3.5.12

Определение прошедшего времени

TIMASC

3.5.13

Преобразование времени из внутреннего представления в часы, минуты, секунды

TIME

3.5.14

Определение текущего времени в часах, минутах, секундах

Системные операции

CHAIN

3.6.1

Передача управления другому фоновому заданию

DEVICE

3.6.2

Запись данных по указанным адресам

GTJB

IGTJB

3.6.3

Получение информации о выполняемом задании

IDSTAT

3.6.4

Получение информации о состоянии устройства

IFETCH

3.6.5

Загрузка драйвера

IQSET

3.6.6

Увеличение числа элементов очереди ввода-вывода

ISPFN

ISPFNC

ISPFNF

ISPFNW

3.6.7

Выполнение специальной операции вводам вывода

ITLOCK

3.6.8

Блокирование USR в памяти, если она не используется другим заданием

LOCK

3.6.9

Блокирование USR в памяти

RCHAIN

3.6.10

Получение доступа к переменным, переданным по CHAIN

RCTRLO

3.6.11

Отмена команды СУ/D

RESUME

3.6.12

Продолжение выполнения задания, приостановленного по SUSPND

SCCA

3.6.13

Отмена команды СУ/C

SETCMD

3.6.14

Передача командной строки клавиатурному" монитору

SUSPND

3.6.15

Задержка выполнения задания и разрешение выполнения подпрограммы завершения

UNLOCK

3.6.16

Освобождение USR из памяти

Операции с данными INTEGER*4

AJFLT

3.7.1

Преобразование данного типа  INTEGER*4 в REAL*4 и присвоение результата преобразования функции

DJFLT

3.7.2

Преобразование данного типа INTEGER*4 в REAL*8 и присвоение результата функции

IAJFLT

3.7.3

Преобразование данного типа INTEGER*4 в REAL*4

IDJFLT

3.7.4

Преобразование данного типа INTEGER*4 в REAL*8

IJCVT

3.7.5

Преобразование данного типа INTEGER*4 в INTEGER*2

JADD

3.7.6

Сложение данных типа INTEGER*2

JAFIX

3.7.7

Преобразование данного типа REAL*4 в INTEGER*2

JCMP

3.7.8

Сравнение данных типа INTEGER*2

JDFIX

3.7.9

Преобразование данного типа REAL*8 в INTEGER*4

JDIV

3.7.10

Деление данных типа INTEGER*4

JICVT

3.7.11

Преобразование данного типа INTEGER*2 в INTEGER*4

JJCVT

3.7.12

Преобразование времени из внутреннего представления в INTEGER*4 или наоборот

JMOV

3.7.13

Присваивание значений переменной INTEGER*4

JMUL

3.7.14

Умножение данных типа INTEGER*4

JSUB

3.7.15

Вычитание данных типа INTEGER*4

Операции с текстовыми данными

CONCAT

3.8.3

Объединение двух текстовых данных

GETSTR

3.8.4

Ввод форматной записи с логического устройства

INDEX

3.8.5

Поиск символа или последовательности символов в текстовом данном

INSERT

3.8.6

Замена части текстового данного

ISCOMP

SCOMP

3.8.7

Сравнение текстовых данных

VERIFY

IVERIF

3.8.8

Определение позиции несовпадающих символов двух текстовых данных

LEN

3.8.9

Определение числа символов в текстовом данном

PUTSTR

3.8.10

Вывод форматной записи на устройство

REPEAT

3.8.11

Копирование текстового данного заданное число раз

SCOPY

3.8.12

Копирование текстового данного

STRPAD

3.8.13

Дополнение текстового данного пробелами

SUBSTR

3.8.14

Копирование части текстового данного

TRANSL

3.8.15

Модификация текстового данного

TRIM

3.8.16

Удаление конечных пробелов из текстового данного

Преобразование RADIX-50

IRAD50

3.9.1

Упаковка символов КОИ-7 в RADIX-50

R50ASC

3.9.2

Распаковка символов RADIX-50 в КОИ-7

RAD50

3.9.3

Упаковка шести символов КОИ-7 в RADIX-50

Работа в мультитерминальном режиме

МТАТСН

3.10.1

Установление связи задания с указанным терминалом

MTDTCH

3.10.2

Прерывание связи задания с терминалом

MTGET

3.10.3

Определение состояния указанного терминала

MTIN

3.10.4

Ввод символа с указанного терминала

MTOUT

3.10.5

Вывод символа на указанный терминал

MTPRNT

3.10.6

Вывод текстового данного на указанный терминал

MTRCTO

3.10.7

Отмена команды СУ/D

MTSET

3.10.8

Задание характеристик указанного терминала

MTSTAT

3.10.9

Получение информации о состоянии мультитерминальной системы

Вспомогательные операции

IADDR

3.11.1

Определение абсолютного адреса памяти константы, выражения или переменной

IGETSP

3.11.2

Назначение свободной области памяти

INTSET

3.11.3

Назначение подпрограммы на языке Фортран для обслуживания прерываний

IPEEK

3.11.4

Чтение слова по абсолютному адресу

IPEEKB

3.11.5

Чтение байта по абсолютному адресу

IPOKE

3.11.6

Запись слова по абсолютному адресу

IPOKEB

3.11.7

Запись байта по абсолютному адресу

ISPY

3.11.8

Чтение слова по относительному адресу

IPUT

3.11.9

Изменение содержимого ячейки памяти по относительному адресу

В таблице данного приложения приведён список системных подпрограмм.

ПРИМЕЧАНИЯ.

  1. Подпрограммы, подчёркнутые одной чертой, выполняются только в режиме FB и ХМ.
  2. Подпрограммы, подчёркнутые дважды, выполняются в режиме SJ при наличии их поддержки во время генерации монитора.

ПРИЛОЖЕНИЕ 2

ОСОБЕННОСТИ ВЫПОЛНЕНИЯ ПОДПРОГРАММ

В данном приложении приведены системные подпрограммы, требующие для своего выполнения дополнительных условий: наличия USR в памяти, элемента очереди, а также подпрограммы, вызывающие подпрограммы завершения и подпрограммы, обращение к которым осуществляется только на языке Фортран. Такие подпрограммы помечены в таблице с помощью "да". Подпрограммы, не приведённые в данной таблице, не требуют каких - либо дополнительных условий для своего выполнения.

Имя подпрограммы

Требование USR

Использование элемента очереди

Вызов подпрограммы завершения

Обращение только на Фортране

CLOSEC

да

     

ICLOSE

да

     

GETSTR

да

   

да

GTLIN

да

     

IASIGN

     

да

ICDFN

да

   

да

ICSI

да

     

IDELET

да

     

IDSTAT

да

     

IENTER

да

     

IFETCH

да

   

да

IFREEC

     

да

IGETC

     

да

IGETSP

     

да

ILUN

     

да

INTSET

   

да

да

IQSET

да

   

да

IRCVD

 

да

   

IRCVDC

 

да

да

 

IRCVDF

 

да

да

да

IRCVDW

 

да

   

IREAD

 

да

   

IREADC

 

да

да

 

IREADF

 

да

да

да

IREADW

 

да

   

IRENAM

да

     

ISCHED

 

да

да

да

ISDAT

 

да

   

ISDATC

 

да

да

 

ISDATF

 

да

да

да

ISDATW

 

да

   

ISLEEP

 

да

   

ISPFN

 

да

   

ISPFNC

 

да

   

ISPFNF

 

да

да

да

ISPFNW

 

да

   

ITIMER

 

да

да

да

ITLOCK

да

     

ITWAIT

 

да

   

IUNTIL

 

да

   

IWRITC

 

да

да

 

IWRITE

 

да

   

IWRITF

 

да

да

да

IWRITW

 

да

   

LOCK

да

     

LOOKUP

да

     

MRKT

 

да

да

 

MWAIT

 

да

   

PUTSTR

да

   

да

SECNDS

     

да

ПРИМЕЧАНИЕ. Параметры подпрограмм, использующих USR, не должны размещаться в области свопинга USR.

ПРИЛОЖЕНИЕ 3

ФОРМАТ СЛОВА СОСТОЯНИЯ КАНАЛА

В таблице данного приложения приведено назначение разрядов слова состояния канала.

Разряд

Значение

Назначение

0

1

Аппаратная ошибка на канале

1 - 5

N

N - индекс устройства в таблицах монитора: описывает физическое устройство, связанное с используемым каналом

6

1

На канале выполняется запрос .RENAME

7

1

На канале выполнен запрос .ENTER; справочник устройства должен модифицироваться по запросу .CLOSE

8 - 12

1

Номер сегмента справочника (от 1 до 37(8)), в котором находится запись о текущем файле

13

1

Обнаружен конец файла

14

 

Не используется

15

1

Канал занят

ПРИЛОЖЕНИЕ 4

ФОРМАТ СЛОВА АСИНХРОННОГО СОСТОЯНИЯ ТЕРМИНАЛА

В таблице данного приложения приведено назначение разрядов слова асинхронного состояния терминала.

Разряд

Значение

Назначение

0 - 12

 

Не используются

13

1

Буфер вывода терминала пуст

14

1

Терминал включён

15

1

С терминала подана команда СУ/C дважды

ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ

  1. Операционная система ФОДОС-2
    Редактор связей
    Руководство оператора
  2. Операционная система ФОДОС-2
    Транслятор с Фортрана
    Руководство программиста
  3. Фортран/ФОДОС-2
    Библиотека Фортрана
    Руководство программиста
  4. Фортран/ФОДОС-2
    Описание языка