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

УТВЕРЖДЁН

00008-01.33.01-1-ЛУ

 

 

 

 

 

ПЕРСОНАЛЬНАЯ ЭВМ "ЭЛЕКТРОНИКА МС0513"

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

ОПЕРАЦИОННАЯ СИСТЕМА ОС БК11

СИСТЕМНЫЕ ТАБЛИЦЫ И БИБЛИОТЕКИ

РУКОВОДСТВО ПРОГРАММИСТА

00008-01.33.01-1

 

Документ совпадает с книгой "Руководство системного программиста. Книга 1. Системные таблицы и библиотеки." Из комплекта документации РАФОС-II, но только в части, касающейся SJ-монитора и без расширенной памяти

 

 

 

 

 

 

1988


 

АННОТАЦИЯ

Данный документ состоит из двух частей.

В первой части дано описание системной макробиблиотеки и системной объектной библиотеки. Вводятся основные понятия, необходимые при работе с этими библиотеками. И правила обращения к макрокомандам, процедурам и функциям библиотек. Кроме этого даётся краткое описание системных таблиц (системная область связи и фиксированные смещения в резидентном мониторе).

Вторая часть документа содержит рекомендации по разработке драйверов внешних устройств. В ней описаны макрокоманды для их написания и даны примеры некоторых драйверов.


СОДЕРЖАНИЕ


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

Операционная система ОС БК-11 содержит широкий набор сервисных функций, таких как работа с файлами, интерпретация командных строк, управление вводом/выводом и т.д.

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

При программировании на языке Паскаль доступ к сервисным функциям программист получает через вызовы подпрограмм из системной объектной библиотеки, имеющей наименование SYSLIB.OBJ. Особенностью этих подпрограмм является то, что все параметры передаются только по имени. В эту библиотеку также включены наборы подпрограмм для работы со строковыми данными и 32-х разрядной целочисленной арифметикой.

Допустимо также обращение к подпрограммам библиотеки из программ на языке макроассемблер.

2. ХАРАКТЕРИСТИКИ БИБЛИОТЕК

Данный раздел описывает характеристики библиотеки системных макрокоманд (SYSMAC.SML) и системной объектной библиотеки (SYSLIB.OBJ).

2.1. МАКРОБИБЛИОТЕКА

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

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

Большинство системных макрокоманд используют инструкцию EMT для передачи информации монитору, который извлекает её и выполняет требуемую функцию. Младший байт инструкции EMT содержит код в интервале от 340 до 377 (восьмеричное):

377

-

зарезервирован; ОС БК-11 игнорирует EMT с этим кодом и возвращает управление программе пользователя;

376

-

используется монитором ОС БК-11; этот код не должен применяться пользователем;

375

-

системная макрокоманда с несколькими аргументами; R0 содержит адрес таблицы аргументов;

374

-

системная макрокоманда с одним аргументом; R0 содержит в старшем байте код функции, а в младшем - номер канала или 0;

360-373

-

используются монитором ОС БК-11; эти коды не должны применяться пользователем;

340-357

-

аргументы системной макрокоманды находятся в стеке и/или в R0.

Примечание. Инструкция EMT не должна использоваться в программах, написанных пользователем.

2.2. ОБЪЕКТНАЯ БИБЛИОТЕКА

Системная объектная библиотека (SYSLIB.OBJ) содержит подпрограммы, вызываемые из программ, написанных на языке Паскаль, подпрограммы позволяют использовать свойства мониторов, выполнять разнообразные вспомогательные функции. В неё входит пакет подпрограмм для работы со строками и обеспечение вспомогательных преобразований двухсловного целого.

Библиотека SYSLIB имеет:

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

Подпрограммы IPEEK, IPOKE, IPEEKB, IPOKEB и (или) ISPY для выборки адресов системы, монитора, технических средств могут различным образом выполняться на определённых конфигурациях. При программировании на языке Фортран СМ необходимо иметь в виду следующее:

3. ОБРАЩЕНИЕ К БИБЛИОТЕКАМ

Программа пользователя при выполнении операций средствами операционной системы обращается к монитору с "программным запросом". При обращении к монитору программа должна сформировать таблицу параметров и выполнить необходимую инструкцию EMT. Для облегчения формирования таблиц и выбора инструкции EMT пользователю предоставляется две библиотеки. Для формирования "программных запросов" из программ, написанных на языке ассемблер, используется системная макробиблиотека SYSMAC.SML, а из программ, написанных на языке Паскаль, используется системная объектная библиотека SYSLIB.OBJ, допускающая обращения и из программ, написанных на языке ассемблер.

3.1. ОБРАЩЕНИЕ К СИСТЕМНОЙ МАКРОБИБЛИОТЕКЕ

Имена системных макрокоманд начинаются с точки (.) для отличия их от символов и имён макрокоманд, определённых пользователем.

Аргументы системных макрокоманд должны быть допустимыми выражениями языка ассемблер, т.к. при макрорасширении в процессе трансляции они будут использованы как операнд "источник" в инструкции MOV.

Все системные макрокоманды, используемые в программе, должны быть описаны в директиве .MCALL. В процессе трансляции определения соответствующих макрокоманд будут выбраны из SYSMAC.SML.

В ОС БК-11 используются системные макрокоманды двух форматов:

1)   .PRGREQ APG1,ARG2,...,ARGN
2)   .PRGREQ AREA,APG1,ARG2,...,ARGN

Макрокоманды первого формата генерируют либо EMT 374, либо одну из EMT 340-357.

Системные макрокоманды, использующие инструкцию EMT 374, размещают аргументы в регистре R0. В младший байт заносится номер канала, а в старший - код функции.

Для системных макрокоманд с кодами 340-357 аргументы (если они заданы) размещаются в стеке, в R0 или и в R0, и в стеке.

Некоторые аргументы макрокоманды могут быть опущены.

Макрокоманды второго формата генерируют всегда EMT 375. В этом формате первый аргумент (AREA) представляет собой указатель адреса списка аргументов. Формат списка аргументов представлен на рис. 1.

R0 => AREA:

CODE

CHAN

 

ARG1

 

ARG2

 

. . .

 

ARGN

Рис. 1

Допускается отсутствие аргументов. Если опущен аргумент AREA, то предполагается, что он содержится в R0. Если опущены какие-либо аргументы от ARG1 до ARGN, то макрокоманда не изменяет соответствующих им записей в списке аргументов.

Например, в макрокоманде:

.PRGREQ AREA,ARG1,ARG2

заполняются первый и второй аргументы, а R0 содержит адрес списка аргументов.

В макрокоманде:

.PRGREQ AREA

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

В макрокоманде:

.PRGREQ ,ARG1

предполагается, что R0 уже содержит адрес списка аргументов. В списке заполняется только первый аргумент, не изменяя остальных (если они есть).

В макрокоманде:

.PRGREQ

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

Список аргументов EMT может быть заполнен статически:

        MOV     #AREA,R0
        .PRGREQ
        ...
AREA:   .BYTE   CHAN
        .BYTE   CODE
        .WORD   ARG1
        .WORD   ARG2

и динамически:

        .PRGREQ #AREA,#ARG1,#ARG2

или

        MOV     #AREA,R0
        MOV     #ARG1,2(R0)
        MOV     #ARG2,4(R0)
        MOVB    #CHAN,@R0
        MOVB    #CODE,1(R0)
        .PRGREQ

Эти три примера определяют одну и ту же макрокоманду.

ОС БК-11 предоставляет модификации системных макрокоманд второго формата (EMT 375), основанных на возможности использования ключевых аргументов, т.е. таких, на мнемонику которых реагирует макроассемблер.

3.1.1. КЛЮЧЕВОЙ АРГУМЕНТ "BLOCK"

Этот ключевой аргумент даёт возможность пользователю статически описывать список аргументов EMT. Сама макрокоманда должна быть описана в разделе данных программы пользователя следующим образом:

 
LABEL:  .PRGREQ BLOCK,ARG1,...,ARGN

где

ARG1,...,ARGN

- допустимые аргументы для директив .WORD и .BYTE.

В этом случае макрокоманда расширится в список аргументов EMT, а сама инструкция EMT генерироваться не будет.

Чтобы выполнить данную макрокоманду, пользователь должен использовать одну из трёх эквивалентных записей:

1)      .MCALL  .WRITE,.DIR,.EXIT
        .DIR    #WR
        BCS     ERROR
        .EXIT
ERROR:  . . .
WR:     .WRITE  BLOCK,CHAN,BUF,WCN,BLOCKN
        .END

2)      .MCALL  .WRITE,.EXIT
        MOV     #WR,R0
        .WRITE
        BCS     ERROR
        .EXIT
ERROR:  . . .
WR:     .WRITE  BLOCK,CHAN,BUF,WCN,BLOCKN
        .END

3)      .MCALL  .WRITE,.EXIT
        MOV     #WR,R0
        EMT     375
        BCS     ERROR
        .EXIT
ERROR:  . . .
WR:     .WRITE  BLOCK,CHAN,BUF,WCN,BLOCKN
        .END

3.1.2. КЛЮЧЕВОЙ АРГУМЕНТ "PSECT"

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

Встретив этот ключевой аргумент, макроассемблер создаёт список аргументов в программной секции ¤¤EMT¤.

Пример.

        .MCALL  .WRITE
        .PSECT  PROG
        .WRITE  PSECT,CHAN,BUF,WCN,BLOCKN,SECT=PROG
                
        .PSECT  ¤¤EMT¤         ; Расширение
¤¤¤ = .                        ; Макро-
        .BYTE   CHAN,COD       ; команды
        .WORD   BUF,WCN,BLOCKN ;
        .PSECT  PROG           ;
        MOV     #¤¤¤,R0        ;
        EMT     375            ;
        BCS     ERROR

Ключевой аргумент "PSECT" позволяет пользователю не задумываться над местом расположения списка аргументов и не резервировать для него место в программе (место будет отводиться автоматически).

3.1.3. КЛЮЧЕВОЙ АРГУМЕНТ "CODE"

Этот ключевой аргумент позволяет программисту регулировать занесение кода функции в список аргументов. CODE может иметь два значения: SET - занести код функции и NOSET - не заносить код функции.

Пример.

        .MCALL  .WRITE,.READ,.EXIT 
        ...
        .WRITE  #AREA,#CHAN,#BUF,#WCN,#BLOCKN
        ...
        .WRITE  #AREA,CODE=NOSET
        ...
        .READ   #AREA,CODE=SET
        ...
        .WHITE  #AREA,CODE=SET
        ...
        .EXIT

Этот ключевой аргумент позволяет использовать один и тот же список аргументов для макрокоманд, имеющих одни и те же аргументы, но различные коды функций. Использование этого ключевого аргумента уменьшает размер программы и время её выполнения.

3.1.4. АДРЕСАЦИЯ АРГУМЕНТОВ

Аргументы системных макрокоманд должны иметь режим адресации, допустимый в инструкции MOV. Например, для занесения в список аргументов числа шесть, используется адресация (#):

        .PRGREQ #AREA,#6

Если нужно занести содержимое адреса или регистра, используется:

        .PRGREQ #AREA,ADDR,R0

Это связано с тем, что список аргументов должен содержать непосредственно значения аргументов.

При использовании ключевых слов "BLOCK" и "PSECT" список аргументов формируется с помощью директив .WORD и .BYTE. Поэтому аргументы макрокоманд должны быть непосредственными значениями и указываться все.

Примечания:

  1. После выполнения макрокоманды все универсальные регистры, кроме R0, сохраняют свои значения. R0 содержит информацию, возвращённую монитором. В тех случаях, когда информация не возвращается, содержимое R0 не предсказуемо.
  2. Так как R0 является рабочим регистром системных макрокоманд, программист при указании аргументов не должен использовать связанных с ним режимов адресации.
  3. Указатель стека остаётся без изменений. Исключением является вызов интерпретатора командной строки (CSI).

3.2. ОБРАЩЕНИЕ К СИСТЕМНОЙ ОБЪЕКТНОЙ БИБЛИОТЕКЕ

Подпрограммы из SYSLIB.OBJ вызываются так же, как и подпрограммы, написанные пользователем. В системную объектную библиотеку входят как подпрограммы (PROCEDURE), так и функции (FUNCTION). Обращение к функции производится по имени в виде:

I=NAME([ARGUMENTS])

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

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

NAME[(ARGUMENTS)]

а в Фортране используется оператор CALL:

CALL NAME[(ARGUMENTS)]

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

Ввиду того, что в Паскале есть описатель FORTRAN, гарантирующий вызов всех параметров только по имени, рекомендуется при описании процедур и функций, вызываемых из SYSLIB.OBJ, пользоваться именно им. В дальнейшем в примерах для большей наглядности будет использоваться нотация фортрана. Например:

CALL ITWAIT(TIME)

или

I = ITWAIT(TIME)

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

Примечания.

  1. Теперь понятно, почему Фортран заменили Паскалём. Но непонятно, почему его вырезали, ведь всякая фортрановская хрень всё равно из паскаля работает.
  2. Тут должно быть ещё два раздела: как из фортрана т.е. паскаля вызывать п/п на языке ассемблера, и как из ассемблера вызывать п/п на языке фортран, т.е. паскаль. Но их по непонятным причинам вырезали. Подозреваю, потому что мозгов не хватило примеры на паскале написать.

3.2.1. ОБРАЩЕНИЕ К SYSLIB.OBJ ИЗ ПРОГРАММ НА ЯЗЫКЕ МАКРОАССЕМБЛЕР

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

Пример.

        .GLOBL  JMUL
        MOV     #LIST,R5       ;Занесение адреса параметров
        JSR     PC,JMUL        ;Обращение к функции
        CMP     #-2,R0         ;Проверка ошибки
        BEQ     ERROR
        ...
LIST:   .WORD   3              ;Блок параметров
        .WORD   OPR1
        .WORD   OPR2
        .WORD   RESULT
OPR1:   .WORD   100,0          ;множимое
OPR2:   .WORD   10,10          ;множитель
RESULT: .BLKW   2              ;результат
        .END

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

Функции помещают в регистры единственный результат. Распределение регистров для помещения различных типов переменных следующее:

USR, если она не резидентна, помещается при свопинге в область памяти, смежную со стеком (в сторону больших адресов) и занимает 2 Кслов. В эту зону не должны помещаться подпрограммы обработки прерываний, подпрограммы завершения, их данные. Проще всего проверить выполнение этого требования путём проверки карты загрузки, чтобы убедиться, что USR не перекрывает при свопинге подпрограмму на языке макроассемблера. В противном случае необходимо изменить порядок объектных модулей и библиотечных подпрограмм. Чтобы снять эти ограничения, следует сделать USR резидентной.

3.2.2. КОМПОНОВКА СИСТЕМНОЙ ОБЪЕКТНОЙ БИБЛИОТЕКИ С ПРОГРАММОЙ ПОЛЬЗОВАТЕЛЯ

При использовании библиотеки SYSLIB.OBJ с программой пользователя будут компоноваться только нужные модули. Например:

.LINK PROG

Примечание. Можно не указывать в команде файл библиотеки SYSLIB.OBJ, т.к. эта библиотека используется по умолчанию.

4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

Данный подраздел содержит описание параметров системных макрокоманд, подпрограмм и функций системной объектной библиотеки.

4.1. СИСТЕМНАЯ МАКРОБИБЛИОТЕКА

Ниже приведены основные понятия, используемые при описании макрокоманд системной макробиблиотеки.

4.1.1. НОМЕР КАНАЛА

Номер канала - это числовой логический идентификатор файла или набора данных, используемый мониторами ОС БК-11. Он принимает значение от 0 до 377 (восьмеричное). Пользователь должен сам установить связь номера канала с файлом или устройством с помощью системных макрокоманд. После установления связи для ссылки на файл или устройство, достаточно указать номер канала.

Система по умолчанию предоставляет пользователю 16 каналов. Чтобы получить большее количество каналов, необходимо использовать соответствующие системные макрокоманды.

4.1.2. БЛОК УСТРОЙСТВА

Блок устройства - четырёхсловная таблица, содержащая информацию для системной макрокоманды об имени устройства, имени и типе файла в коде .RAD50.

Первое слово содержит физическое или логическое имя устройства. Второе и третье - содержат имя файла (не более 6 символов), четвёртое - тип файла.

Имена не должны содержать точек и двоеточий, являющихся разделителями в командной строке.

Например, блок устройства, представляющий файл POKAZ.MAC на устройстве DK:, можно записать следующим образом:

        .RAD50  //
        .RAD50  /РОК/
        .RAD50  /AZ /
        .RAD50  /MAC/

либо

        .RAD50  /DК POKAZ MАС/

либо

        .DBLK   ,РОКАZ,МAC

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

4.1.3. СВОПИНГ USR

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

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

Следует отметить, что работа макрокоманды .CLOSE с устройствами нефайловой структуры (устройство печати, терминал и т.д.) обходится без использования USR.

Если в программе встретилась макрокоманда, для выполнения которой необходима USR, то область программы, в которую должна быть загружена USR, сохраняется системой в файле SWAP.SYS на системном устройстве, а USR загружается в оперативную память. Завершив выполнение требуемой операции, система восстанавливает программу из файла SWAP.SYS.

Обычно свопинг происходит по умолчанию, но можно свести количество необходимых обменов к минимуму, если при написании программ учитывать следующее:

Примечания:

  1. Операция свопинга требует относительно больших затрат времени, поэтому её необходимо по возможности избегать.
  2. Содержимое ячейки 46 игнорируется, если не нужен свопинг.
  3. SJ-монитор не контролирует правильность адреса свопинга в ячейке 46. Если область свопинга перекрывает резидентный монитор, система разрушается.
  4. Необходимо следить, чтобы USR не загружалась в программный стек, в блоки параметров обращения к USR, в буферы ввода/вывода, в драйверы устройств, в программы завершения, используемые при вызовах USR.

4.1.4. ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ

Подпрограммы завершения - написанные пользователем программы, выполняемые по окончании ввода/вывода. При входе в неё R0 содержит слово состояния канала, R1 - номер канала, с которым связана операция. Бит "C" сброшен. При работе SJ-монитора подпрограммы завершения прерывают друг друга.

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

4.2. СИСТЕМНАЯ ОБЪЕКТНАЯ БИБЛИОТЕКА

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

4.2.1. НОМЕР КАНАЛА

Номер канала является логическим идентификатором файла или набора данных. Таким образом, когда пользователь открывает файл на устройстве, он присваивает номер канала этому файлу. К открытому файлу можно обращаться через присвоенный номер канала.

OTS Фортрана имеет 16 (десятичное) каналов, доступных для использования. Функция IGETC закрепляет номер канала за программой и помечает в системе ввода/вывода, что канал используется. При освобождении канал закрывается подпрограммой CLOSEC, ICLOSE или PURGE. Канал освобождается и возвращается в систему ввода/вывода Фортрана вызовом IFREEC.

Функция ICDFN предоставляет пользователю до 255 (десятичное) каналов. Она выделяет память в области задания для размещения информации о статусе дополнительных каналов. Функцию ICDFN желательно использовать во время инициации задания. Система ввода/вывода Фортрана использует каналы от 0 до 15 (десятичное), поэтому каналы с большими номерами можно использовать без ограничений.

Каналы должны выделяться в основной программе или в её подпрограммах. Не рекомендуется выделять каналы в программах, которые были активизированы в результате завершения ввода/вывода или функциями ISCHED или ITIMER.

4.2.2. БЛОК УСТРОЙСТВА

Блоком устройства является четырёхсловный блок информации в коде RAD50, который определяет физическое устройство и имя файла. В фортране можно использовать три различных метода задания этого блока:

  1. использование операторов DIMENSION и DATA:
    DIMENSION IFILE(4)
    DATA      IFILE /3RSY, 3RFIL, 3RE, 3RXYZ/
    
  2. перевод доступной строки символьного описания файла в формат RAD50 с использованием вызовов SYSLIB, таких как IRAD50, R50ASC и RAD50, например:
    REAL*8    FILSPC
    CALL      IRAD50 (12, 'SY FILE  XYZ', FILSPC)
    
  3. использование SYSLIB с вызовом ICSI, которая обращается к интерпретатору командной строки (CSI) для приёма и грамматического разбора стандартной командной строки ОС БК-11.

4.2.3. СВОПИНГ USR

Необходимо размещать программы обслуживания прерываний и подпрограммы завершения так, чтобы они не перекрывались при свопинге USR. Границы области свопинга определяются по карте распределения памяти, построенной компоновщиком. При необходимости нужно изменить порядок объектных модулей и библиотек в команде компоновщику.

4.2.4. УПРАВЛЕНИЕ СВОПИНГОМ USR

Можно управлять свопингом USR, используя команды KMON:

SET USR NOSWAP

и

SET USR SWAP

Команда "SET USR NOSWAP" запрещает свопинг USR и фиксирует её в памяти ниже RMON. Команда "SET USR SWAP" разрешает свопинг USR.

Во время выполнения задания можно управлять свопингом USR с помощью подпрограмм LOCK и UNLOCK.

Вызов LOCK фиксирует USR в памяти. Вызов UNLOCK освобождает USR.

4.2.5. СТРАТЕГИЯ СВОПИНГА USR

При написании программ необходимо учитывать, что объектный модуль состоит из программных секций (PSECT) имеющих уникальные имена. Атрибуты, связанные с каждой PSECT, указывают компоновщику, как комбинировать различные отдельно оттранслированные модули программ пользователя, модули на языке макроассемблер и библиотечные программы в загрузочный модуль.

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

Головной модуль в программе на Фортране (обычно первый объектный модуль в последовательности предъявленных компоновщику) объявляет программные секции в следующем порядке:

Имя секции

Атрибуты

OTS¤I

RW, I, LCL, REL, CON

OTS¤P

RW, D, GBL, REL, OVR

SYS¤I

RW, I, LCL, REL, CON

USER¤I

RW, I, LCL, REL, CON

¤CODE

RW, I, LCL, REL, CON

OTS¤O

RW, I, LCL, REL, CON

SYS¤O

RW, I, LCL, REL, CON

¤DATAP

RW, D, LCL, REL, CON

OTS¤D

RW, D, LCL, REL, CON

OTS¤S

RW, D, LCL, REL, CON

SYS¤S

RW, D, LCL, REL, CON

¤DATA

RW, D, LCL, REL, CON

USER¤D

RW, D, LCL, REL, CON

.¤¤¤¤.

RW, D, GBL, REL, OVR

Др. блоки COMMON

RW, D, GBL, REL, OVR

USR может перекрывать инструкции, но не должна загружаться на зону констант и смешанных данных, которые могут быть использованы как аргументы для USR. Показанное упорядочение собирает все чистые секции в памяти перед смешанными. USR может обмениваться с секциями OTS¤I, OTS¤P, SYS¤I, USER¤I и ¤CODE. По умолчанию область обмена начинается с базы секции OTS¤I. Ячейка 46 системной области связи содержит адрес, по которому произойдёт свопинг USR. Если ячейка 46 содержит нуль, USR загружается на 2К слова ниже RMON.

4.2.6. ИСПОЛЬЗОВАНИЕ USR И ВРЕМЯ

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

Оперативное задание может быть построено так: фаза инициализации, на которой оно открывает все необходимые каналы и запускает операции реального времени; фаза реального времени, на которой выполняются операции ввода-вывода и обслуживание прерываний; фаза завершения, которая останавливает активную работу в реальном времени и затем закрывает каналы. Использование такой структуры в оперативном задании позволяет фоновому заданию выполнять операции с USR без блокирования оперативного задания. Это же упрощает свопинг USR, так как USR может обмениваться с подпрограммами обработки прерываний и буфером ввода-вывода, поскольку они неактивны.

4.2.7. РАБОТА С INTEGER*4

Целые переменные величины типа INTEGER*4 размещаются в памяти в двух словах: первое слово содержит младшую часть величины, а второе слово - знак и старшую часть величины. Диапазон представляемых чисел от -(2**31)+1 до (2**31)-1.

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

Если для задания значений переменным типа INTEGER*4 используется оператор DATA, он должен задавать как младшую, так и старшую часть. Правильное задание значения 3 переменной типа INTEGER*4:

    INTEGER*4 J
    INTEGER*2 I(2)
    EQUIVALENCE(J,I)
    DATA I/3,0/

Неправильное задание значения 3 переменной типа INTEGER*4:

    INTEGER*4 J
    DATA J/3/

При присвоении переменной типа INTEGER*4 отрицательного значения (например, -4) старшая часть (второе слово) должна быть продолжением младшей части при двухсловном представлении переменной:

    INTEGER*4 J
    INTEGER*2 I(2)
    EQUIVALENCE(J,I)
    DATA I/-4,-1/

При вызове подпрограмм удобна следующая форма присвоения значений параметрам типа INTEGER*4:

    INTEGER*2 J(2)
    DATA L/3,0/

 

4.2.8. ПОДПРОГРАММЫ, ТРЕБУЮЩИЕ ДОПОЛНИТЕЛЬНОГО ЭЛЕМЕНТА ОЧЕРЕДИ

Некоторые подпрограммы для выполнения требуют элемент очереди:

IRCVD/IRCVDC/IRCVDW

IREAD/IREADC/IREADW

ISDAT/ISDATC/ISDATW

ISLEEP

ISPFN/ISPFNC/ISPFNW

ITWAIT

IUNTIL

IWRITC/IWRITE/IWRITW

MRKT

MWAIT

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

4.2.9. ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ

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

Подпрограмма завершения - это подпрограмма, которая выполняется асинхронно с основной программой и планируется к вызову как можно скорее после завершения соответствующего события, такого как окончание ввода/вывода или истечение заданного интервала времени. Все подпрограммы завершения текущего задания имеют высший приоритет по сравнению с другими частями задания. Вызов подпрограммы завершения прерывает выполнение задания на время выполнения подпрограммы.

Подпрограммы завершения в SJ-мониторе полностью асинхронны и могут прерывать друг друга.

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

ISPFNC

IREADC

IWRITC

ISDATC

MRKT

имеют такие ограничения:

4.2.10. ФУНКЦИИ ПО ОБРАБОТКЕ СТРОК СИМВОЛОВ

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

Строки хранятся в массивах типа CHAR (в нотации Фортрана - LOGICAL*1), которые должен описать программист. Строки запоминаются в этих массивах по одному символу в каждом элементе массива плюс нулевой байт для обозначения текущего конца строки (формат ASCIZ).

Длина строки может изменяться в диапазоне от нуля символов в строке до длины, на единицу меньшей длины массива, в котором хранится строка. Максимальный размер строки 32767 (десятичное) символов. Строки могут содержать символы КОИ-7 имеющие коды от 1 до 127 (десятичное).

Необходимо следить, чтобы строка не превысила размер массива, для чего можно воспользоваться тем, что в подпрограммах системной библиотеки для ограничения длины может указываться необязательный параметр. В разделах, описывающих подпрограммы обработки символьных строк, этот параметр называется LEN. Длина выходной строки ограничивается величиной, указанной параметром LEN, плюс один элемент для конца строки. Поэтому массив, принимающий результат, должен по длине, по крайней мере, равняться значению параметра LEN плюс 1.

При указании параметра LEN может включаться необязательный параметр ERR, позволяющий определить наличие ошибки. Параметр ERR является логической переменной, которая должна первоначально устанавливаться в значение FALSE если в функции по обработке символьных строк указываются параметры LEN и ERR, а параметр LEN действительно использовался для ограничения длины результирующей строки, то тогда параметр ERR устанавливается в значение TRUE. Если параметр LEN для ограничения длины строки не использовался, то параметр ERR не изменяется.

Параметры LEN и ERR являются необязательными параметрами. Параметр LEN может задаваться отдельно, а параметр ERR - только с параметром LEN.

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

Строки, заключённые в кавычки, могут использоваться в виде параметров любой подпрограммы обработки строки, которая вызывается оператором CALL. Они могут так же использоваться для подпрограмм, вызываемых в качестве функции. Например:

CALL SCOMP(NAME,'FREE CORE',M)

Этот оператор сравнивает строку в массиве NAME со строкой символов 'FREE CORE' и устанавливает соответствующее значение целой переменной M.

5. СООБЩЕНИЯ

В процессе выполнения системных макрокоманд монитор может обнаружить ошибки, о которых необходимо сообщить пользователю. В ОС БК-11 существует три способа сообщений об ошибках:

Бит C сбрасывается при правильном выполнении программного запроса. В противном случае устанавливается в 1, поэтому практически за каждой системной макрокомандой должны следовать либо инструкция BCS, либо BCC для обнаружения возможных ошибок.

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

Некоторые серьёзные (грубые) ошибки заставляют монитор распечатывать на терминале соответствующие сообщения, после чего управление передаётся монитору. Чтобы проанализировать такие ошибки, необходимо использовать системную макрокоманду .SERR.

Тексты сообщений приводятся в документе "Сообщения и диагностика ошибок", 00008-01.94.01.

6. СИСТЕМНЫЕ ТАБЛИЦЫ

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

Свойства монитора и драйверов доступны программе с помощью системной макробиблиотеки (для программ на макроассемблере) и системной объектной библиотеки (для программ на Паскале).

6.1. СИСТЕМНАЯ ОБЛАСТЬ СВЯЗИ

Байты 40-57 (абсолютные адреса) называются системной областью связи (SYSCOM). Они содержат информацию о системе и о программе, выполняющейся в данный момент. Эта информация необходима как монитору, так и программисту. Чтобы использовать эти сведения в программе, можно применять системные макрокоманды, определяющие символьные обозначения байтов. Их содержимое определяется при загрузке монитора (в части, касающейся системы) и при загрузке программы, информация о программе берётся из нулевого блока файла загрузочного модуля программы (т.е. определяется на этапе её компоновки) и может быть изменена самой программой во время её выполнения. Ниже даны адреса байтов и их символьные обозначения.

40, 41

USERPC

Стартовый адрес программы. Это слово устанавливается компоновщиком либо самой программой.

42, 43

USERSP

Начальное значение указателя стека. Это слово устанавливается программой пользователя с помощью директивы .ASECT. По умолчанию берётся 1000 (восьмеричное) или верхний адрес области .ASECT. Указатель стека также может быть установлен ключами компоновщика.

44, 45

JSW

Слово состояния программы. Часть его битов используется только монитором, остальные могут быть изменены программой пользователя.

46, 47

UFLOAT

Адрес загрузки USR. В это слово, обычно равное 0, программой пользователя может быть установлен любой адрес в области программы. По этому адресу будет загружаться USR. Если слово равно 0, USR загружается по адресу, содержащемуся в смещении 266 RMON.

50, 51

USERTOP

Верхний адрес программы. В этом слове содержится старший адрес памяти, который предоставляется системой программе пользователя. Первоначально устанавливается компоновщиком. Может быть изменён системной макрокомандой .SETTOP.

52

ERRBYT

Байт ошибки EMT. При появлении ошибки в процессе выполнения системной макрокоманды код ошибки передаётся в данный байт, а в слове состояния процессора (PS) устанавливается бит C. Каждая системная макрокоманда имеет свой набор кодов ошибок.

53

USERRB

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

54, 55

SYSPTR

Нижний адрес RMON. ОС БК-11 всегда помещает резидентную часть монитора в верхние адреса памяти (ниже 48 КБайт). Данное слово указывает на первую ячейку памяти резидентного монитора RMON. Значение этого слова изменять запрещено.

56

TTFILL

Некоторые высокоскоростные терминалы требуют знаки-заполнители после вывода определённых символов. Байт 56 содержит код символа в КОИ-7, требующего после себя вывода знаков-заполнителей. В ОС БК-11 не используется и равен 0;

57

TTNFIL

Счётчик заполнителей; количество знаков-заполнителей определяется в зависимости от аппаратуры; если байты 56 и 57 равны нулю, то заполнители не требуются. В ОС БК-11 не используется и равен 0.

Примечание. Байт 52 должен использоваться всегда как байт, а не как слово, т.к. байт 53 применяется для указания статуса завершения программы.

6.1.1. СТАТУС ЗАВЕРШЕНИЯ ПРОГРАММЫ (USERRB)

При загрузке интерпретатор команд монитора (KMON) проверяет статус завершения пользовательской программы. Если при выполнении пользовательской программы имелись ошибки, информация о которых содержится в байте 53 (USERRB), то KMON может прервать (прекратить) дальнейшее выполнение текущего командного файла. Таким образом производится контроль за выполнением команд в командном файле. Это особенно важно, если корректное выполнение последующих команд зависит от успешного завершения предшествующих.

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

SUCCESS

Успешное завершение; этот статус завершения означает, что программа была выполнена без ошибок;

WARNING

Завершение с предупреждением; этот статус означает, что при выполнении программы было выдано предупреждающее сообщение, но программа выполнилась полностью;

ERROR

Ошибка, этот статус означает, что программа не выполнилась из-за наличия ошибки, этот статус используется в системных программах ОС БК-11, если они создают выходные файлы, несмотря на содержащиеся в них ошибки; например, компилятор может использовать этот статус для указания того, что объектный файл был создан, но программа пользователя содержит ошибки;

SEVERE ERROR

Серьёзная ошибка; этот статус означает, что программой не были созданы выходные данные; этот статус может быть установлен, если отсутствуют ресурсы, необходимые программе для полного её завершения; например, отсутствие достаточной области памяти для ассемблирования или компиляции прикладной программы;

FATAL ERROR

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

Системные программы и KMON всегда устанавливают статус завершения программы для указания результата выполнения каждой команды монитора, обычно выполнение командных файлов прекращается, если имела место ошибка при выполнении команды монитора. В табл. 1 представлены коды типов ошибок, которые могут быть установлены в байте 53.

Таблица 1

Номер бита

Значение маски
(восьмеричное)

Тип ошибки

Сообщение в ОС БК-11

0

1

SUCCESS

?PROG-I-TEXT

или отсутствует

1

2

WARNING

?PROG-W-TEXT

 

2

4

ERROR

?PROG-E-TEXT

 

1

10

SEVERE

?PROG-F-TEXT

 

4

20

FATAL

?PROG-U-TEXT

 

Примечание. Биты 5-7 зарезервированы для применения в следующих версиях системы. Программы не должны обнулять байт 53, можно только устанавливать необходимый бит с помощью инструкции BISB. Определение символьных обозначений статуса завершения и байта 53 рекомендуется выполнять с помощью системной макрокоманды .USRDF. Если при работе программы было установлено несколько битов, то система ОС БК-11 определяет статус по биту с наибольшим порядковым номером.

6.1.2. СЛОВО СОСТОЯНИЯ ЗАДАНИЯ (JSW)

Байты 44 и 45 содержат слово состояния задания (JSW) ниже даётся описание битов JSW. Биты, отмеченные "*", устанавливаются монитором или самой программой во время её выполнения. Биты, отмеченные "+", устанавливаются перед загрузкой программы (при компоновке), а биты, отмеченные "*+", могут быть установлены как до, так и при выполнении программы

15

USWAP¤

Бит свопинга USR. Устанавливается системой, если USR резидентна.

14*+

TTLC¤

Бит ввода кириллицы. Если он установлен, ввод кириллицы разрешён. Если программа пользователя не устанавливает этот бит, то при вводе с терминала драйвер производит автоматическое преобразование символов кириллицы в латинские символы.

13*+

RSTRT¤

Бит рестарта. Если требуется, чтобы программа была повторно запущена по команде REENTER с терминала, необходимо установить этот бит в программе.

12*+

TTSPC¤

Бит спецрежима терминала. Существуют два режима ввода с терминала в зависимости от 12 бита JSW:

  • если бит сброшен, то производится обычный ввод с клавиатуры системного терминала:
    • все набранные символы отображаются на экране (эхопечать);
    • выполняется стирание строки или символа с помощью специальных команд оператора <СУ/U> и <ЗБ> соответственно;
    • символы текущей строки начнут передаваться в программу пользователя только после нажатия <СУ/Z>, <СУ/C>, <ВК> и <ПС>; до их появления символы собираются в системном буфере терминала.
  • если бит установлен, то терминал находится в спецрежиме ввода:
    • ни один из набираемых символов не отображается на экране, кроме <СУ/C> и <СУ/O>;
    • <СУ/U> и <ЗБ> не выполняют своих функций, а передаются в программу как обычные знаки;
    • символы передаются в программу пользователя сразу, как только нажата клавиша на системном терминале.

11+

CHNIF¤

Бит командного файла. Если он установлен программой, то по окончании её работы выполняется косвенный командный файл.

10

 

Не используется;

9

OVLY¤

Бит оверлейной программы. Устанавливается компоновщиком при наличии оверлейных структур.

8+

CHAIN¤

Этот бит может быть использован двумя способами. Если в загрузочном модуле этот разряд не установлен, то он устанавливается монитором при загрузке программы макрокомандой .CHAIN и в байты с 500 по 777 не производится запись информации из соответствующих ячеек нулевого блока загрузочного модуля. Эти ячейки можно использовать для передачи информации загружаемой программе (обычный вариант). Если этот бит был установлен пользователем в JSW программы перед её загрузкой макрокомандой .CHAIN, то в этом случае в байты с 500 по 777 будет производиться запись (т.е. загрузка будет выполняться аналогично загрузке по команде монитора R или RUN).

7*+

HLTER¤

Бит останова по ошибке ввода/вывода. Если пользователь хочет прервать выполнение программы при возникновении ошибки ввода/вывода, он должен установить этот бит.

6*+

 

Не используется;

3*+

 

Бит незавершённой системной макрокоманды .GTLIN. Используется макрокомандой .GTLIN для получения строки с терминала, если она отсутствует в командном файле. Этот бит используется в таких системных программах как LINK, DUP, SRCCOM и LIBR. Он устанавливается, если в командном файле имеется строка ^C. Например, при выполнении командного файла весь ввод после ^C будет производиться с терминала:

RUN LINK
TEST, TEST = MOD1,LIB/I 
^C

Разряды 5, 4, 2, 1, 0 зарезервированы для системных целей.

6.2. ФИКСИРОВАННЫЕ СМЕЩЕНИЯ РЕЗИДЕНТА МОНИТОРА

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

Ниже даны фиксированные смещения RMON. Их символьное обозначение и длина в байтах даны в восьмеричном виде.

266

USRLC

2

Адрес обычной загрузки USR. Этот адрес используется при загрузке USR в память фоновым заданием, если ячейка 46 системной области связи равна 0.

270

QCOMP

2

Адрес подпрограммы завершения операции ввода/вывода для всех драйверов.

272

SPUSR

2

Слово используется драйверами устройств, не имеющих стандартную файловую структуру ОС БК-11, для сообщения монитору о появившихся ошибках. (В ОС БК-11 не используется).

274

SYUNIT

2

Старший байт содержит номер устройства, с которого была загружена система.

276

SYSVER

1

Номер редакции (версии) монитора.

277

SYSUPD

1

Номер коррекции монитора.

300

CONFIG

2

Слово конфигурации системы. Биты этого слова используются для хранения информации о наборе аппаратных средств и о параметрах монитора. Ячейка 370 содержит дополнительную информацию о системе.

302

SCROLL

2

Адрес программы обслуживания (скроллера) графического дисплея СМ-7300 (ЭПГ СМ) (В ОС БК-11 не используется).

304

TTKS

2

Адрес регистра состояния клавиатуры системного терминала (В ОС БК-11 не используется).

306

TTKB

2

Адрес буферного регистра клавиатуры системного терминала (В ОС БК-11 не используется).

310

TTPS

2

Адрес регистра состояния экрана системного терминала.

312

TTPB

2

Адрес буферного регистра экрана системного терминала.

314

MAXBLK

2

Максимальная длина файла, создаваемого по макрокоманде .ENTER, в которой аргумент LEN равен 0, по умолчанию это значение равно 177777, т.е. ограничение на длину файла отсутствует. Значение этой ячейки может быть изменено во время работы программы или при помощи программы SIPP.

320

CNTXT

2

Указатель на смешанную область задания, выполняющегося и данный момент (В ОС БК-11 не используется).

322

JOBNUM

2

номер выполняющегося задания (В ОС БК-11 не используется).

320

¤TIME

4

Время дня.

324

SYNCH

2

Адрес подпрограммы обработки системной макрокоманды .SYNCH

326

LOWMAP

24

Начало карты защиты младших адресов памяти (с 0 по 476)

352

USRLOC

2

Указатель текущей точки входа в USR. Он равен нулю, если USR не загружена в памяти. Если USR только что была загружена в память, то он указывает на начало буфера USRBUF. Во всех остальных случаях в этой ячейке содержится адрес начала области постоянных подпрограмм USR.

354

GTVECT

2

Адрес вектора прерываний по останову графического дисплея СМ-7300 (ЭПГ СМ). По умолчанию равен 320. (В ОС БК-11 не используется).

356

ERRCNT

2

Младший байт является счётчиком ошибок. Используется при работе системных программ. Старший байт не используется. (В ОС БК-11 не используется).

360

¤MTPS

2

Адрес подпрограммы обработки системной макрокоманды .MTPS.

362

¤MFPS

2

Адрес подпрограммы обработки системной макрокоманды .MFPS.

364

SYINDX

2

Индекс драйвера системного устройства в таблице устройств монитора.

370

CONFG2

2

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

372

SYSGEN

2

Слово параметров генерации монитора.

374

USRARE

2

Размер USR в байтах, программы могут использовать эту информацию для определения размера области, необходимой для свопинга USR.

406

MONAME

4

В двух словах содержится имя файла монитора (в коде RAD50), загруженного в память.

412

SUFFIX

2

Ячейка, содержит символ в коде RADIX-50 (выровненный вправо). Используемый монитором для определения имён драйверов устройств.

6.2.1. СЛОВО КОНФИГУРАЦИИ СИСТЕМЫ (CONFIG)

Слово конфигурации системы CONFIG (имеет относительное смещение 306) содержит информацию о подключённой аппаратуре и о параметрах монитора.

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

0

(FBMON¤)

Если равен 0 при FJOB¤ (бит 7) = 0, то это RM/SJ-монитор;

если равен 0 при FJOB¤ (бит 7) = 1, то это TS-монитор;

если равен 1 при MMU¤ (бит 12) = 0, то это FB-монитор;

если равен 1 при MMU¤ (бит 12) = 1, то это XM-монитор;

2

(HWDSP¤)

Имеется аппаратура графического дисплея СМ-7300 (ЭПГ-СМ) (в ОС БК-11 не используется)

5

(CLK50¤)

Если CLK50¤=1, то используется таймер с частотой прерываний 50 Гц.

Если CLK50¤=0, то используется таймер с частотой прерываний 60 Гц.

6

(HWFPU¤)

Присутствует процессор с плавающей запятой (для СМ-1420) (в ОС БК-11 не используется)

7

(FJOB¤)

Загружена оперативная программа или системное задание (в ОС БК-11 не используется)

8

(GTLNK¤)

Используется графический дисплей (после команды GT ON) (в ОС БК-11 не используется)

9

(USR¤)

USR резидентна в оперативной памяти (использовалась команда "SET USR NOSWAP").

10

Загружена системная программа QUEUE (в ОС БК-11 не используется)

11

(LSI¤)

В качестве центрального процессора используется микропроцессор типа "Электроника-60" (нет адресуемого слова состояния процессора) (в ОС БК-11 не используется)

12

(MMU¤)

Работает XM-монитор

13

(LKCS¤)

Таймер имеет регистр состояния.

14

(KW¤P)

В качестве системного используется программируемый таймер (в ОС БК-11 не используется);

15

(CLOCK¤)

В состав системы входит таймер.

6.2.2. ДОПОЛНИТЕЛЬНОЕ СЛОВО КОНФИГУРАЦИИ СИСТЕМЫ (CONFG2)

Дополнительное слово конфигурации системы (относительное смещение 370) указывает на имеющиеся дополнительные аппаратные средства в комплексе.

Все описания даны для установленного бита (приводятся номера битов, их символьные имена и назначение):

0

(CACHE¤)

В состав комплекса входит кэш-память (для СМ-1420).

1

(MPTY¤)

Используется оперативная память с контролем по чётности.

2

(SWREG¤)

Процессор имеет регистр переключателя (для чтения).

3

(LIGHT¤)

Процессор имеет регистр индикаторов (для записи).

8

(EIS¤)

Процессор имеет расширенный набор инструкций (EIS).

9

(VT6¤0)

Тип графического дисплея.

14

(TYP70¤)

Процессор допускает 22-разрядную адресацию.

15

(TYP60¤)

Процессор имеет перепрограммируемый микропрограммный блок.

Остальные биты зарезервированы для использования в. следующих версиях системы.

6.2.3. СЛОВО ПАРАМЕТРОВ ГЕНЕРАЦИИ СИСТЕМЫ (SYSGEN)

Слово параметров генерации системы содержит информацию о параметрах, определяемых при генерации системы. Все описания даны для установленного бита.

0

(ERLG¤)

Сбор статистики о работе оперативной памяти (с паритетом) и внешних устройств. (В ОС БК-11 не используется).

1

(MMGT¤)

Использование аппаратуры диспетчера памяти. (В ОС БК-11 не используется).

2

(TIMIT¤)

Использование запросов для работы с таймером в драйверах.

3

(TSG¤T)

Использование шестого регистра адреса страниц диспетчера памяти в TS-мониторе (XM-монитор использует первый регистр). (В ОС БК-11 не используется).

9

(MPTY¤)

Использование памяти с паритетом.

10

(TIMER¤)

Работа с таймером в SJ-мониторе.

13

(MTTY¤)

Работа с дополнительными терминалами. (В ОС БК-11 не используется).

14

 

Работа с системными заданиями. (В ОС БК-11 не используется).

Примечание. Значения первых четырёх битов должны соответствовать параметрам, которые устанавливаются при ассемблировании пользовательских драйверов.

7. СИСТЕМНАЯ МАКРОБИБЛИОТЕКА

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

Все рассматриваемые макрокоманды в соответствии с выполняемыми функциями подразделяются на следующие группы:

7.1. ОПЕРАЦИИ С КАТАЛОГАМИ

При выполнении макрокоманд, работающих с каталогами, используется USR, обслуживающая каталоговые структуры носителей, поэтому необходимо учитывать ограничения, связанные со свопингом. Обычно свопинг происходит по умолчанию, но существует возможность оптимизировать программу так, что количество необходимых обменов сведётся к минимуму.

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

7.1.1. МАКРОКОМАНДА .CLOSE

Системная макрокоманда .CLOSE завершает работу с указанным каналом (закрывает канал) и тем самым освобождает его для других операций.

Формат макрокоманды:

 
.CLOSE CHAN

где

CHAN

- номер канала, который необходимо закрыть.

Формат регистра R0:

R0 =

6

CHAN

Если указанный - канал CHAN не открыт, макрокоманда игнорируется.

Макрокоманда .CLOSE предназначена для файла, открытого с помощью макрокоманды .ENTER. В результате её выполнения указанный файл становится постоянным на устройстве, соответствующем указанному каналу, и в каталог заносится информация о нём (имя, тип, дата создания). При этом файл с таким же именем, уже имеющийся на этом устройстве, из каталога исключается.

Если на устройстве уже существует защищённый файл с аналогичным именем, то закрытие файла происходит, но появляется два файла с одинаковыми именами.

Длина файла, закрытого макрокомандой .CLOSE, определяется количеством заполненных блоков.

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

Ошибки:

Код

Пояснение

-3

На устройстве существует защищённый файл с указанным именем.

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

Пример приведён при описании макрокоманды .SPFUN

7.1.2. МАКРОКОМАНДА .DELETE

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

Формат макрокоманды:

 
.DELETE AREA,CHAN,DBLK,SEGNUM

где

AREA

- адрес таблицы аргументов EMT из трёх слов;

 

CHAN

- номер канала;

 

DBLK

- блок устройства;

 

SEGNUM

- номер файла при операциях с кассетами, если этот аргумент пропущен, ему присваивается значение 0.

Формат таблицы аргументов EMT:

R0 => AREA:

0

CHAN

 

DBLK

 

SEGNUM

Макрокоманда .DELETE игнорируется, если указано устройство с нефайловой структурой.

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

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

Ошибки:

Код

Пояснение

0

Канал занят;

1

Файл в каталоге устройства не найден;

2

Недопустимая операция для данного устройства;

3

Файл защищён от удаления.

Пример.

         .MCALL  .LOOKUP,.ЕXIT 
        .MCALL  .DELETE,.PRINT
ERRWD = 52
ST:     .LOOKUP #AREA,#3,#FILE1 ; открыть файл по
        BCS     NLO             ; каналу 3
        .PRINT  #МSG1
        .DELETE #AREA,#3,#FILE1 ; удалить его
        BCS     NDE1
        .PRINT  #MSG2
        .EXIT
AREA:   .BLKW   10
FILE1:  .RAD50  /SY ABC   /
        .RAD50  /TXT/
NLO:    .PRINT  #NOLO
        .EXIT
NDE:    .PRINT  #NODE
        .EXIT
NDE1:   TSTB    @#ERRWD         ; определение кода ошибки
        BNE     NDE
        .PRINT  #NODE1
        .EXIT
NODE:   .ASCIZ  /ФАЙЛ НЕ НАЙДЕН/
MSG1:   .ASCIZ  /КАНАЛ ОТКРЫТ/
NOLO:   .ASCIZ  /ОШИБКА LOOKUP/
NODE1:  .ASCIZ  /КАНАЛ ЗАНЯТ/
MSG2:   .ASCIZ  /ФАЙЛ ABC.TXT УДАЛЕН/
        .EVEN
        .END    ST

7.1.3. МАКРОКОМАНДА .ENTER

Макрокоманда .ENTER создаёт временный файл с указанным именем на заданном устройстве. Указанный номер канала связывается с файлом.

Файл становится постоянным только после выполнения макрокоманды .CLOSE. Если существовал постоянный файл с тем же именем, то он удаляется, а это имя получает вновь созданный файл. Фактическая длина файла определяется при выполнении .CLOSE.

После выполнения макрокоманды .ENTER R0 содержит фактический размер области носителя, доступной для файла. Если устройство является бескаталоговым, то R0 содержит 0.

Формат макрокоманды:

 
.ENTER AREA,CHAN,DBLK,LEN,SEGNUM

где

AREA

- адрес таблицы аргументов EMT из четырёх слов;

 

CHAN

- номер канала;

 

DBLK

- блок устройства;

 

LEN

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

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

M - представляется "M" блоков; величина "M" указывается пользователем;

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

 

SEGNUM

- при работе с кассетами означает номер файла; если он опущен, принимается нулевое значение; этот аргумент может принимать следующие значения:

0 - перемотка магнитной ленты в начало, а затем вперёд до тех пор, пока не будет найдено имя файла или обнаружена метка логического конца магнитной ленты (LEOT);

N - позиционирование магнитной ленты на начало файла с порядковым номером алгоритм позиционирования: если N больше K (номер файла, на котором установлена лента в текущий момент), поиск производится от этого положения к LEOT; если N меньше K, произойдёт перемотка ленты на начало, а затем будет выполняться поиск; в случае, если N лишь на единицу меньше K, происходит обратная перемотка на начало этого файла (N-го);

-1 - перемотка до метки LEOT и открытие файла;

-2 - перемотка магнитной ленты на начало и продвижение вперёд до тех пор, пока не будет найдено имя файла или метка LEOT.

Формат таблицы аргументов EMT:

R0 => AREA:

2

CHAN

 

DBLK

 

LEN

 

SEGNUM

Указывая нулевое значение аргумента "LEN" в макрокоманде .ENTER необходимо иметь в виду, что назначается половина наибольшей области, т.е., если на устройстве наибольшая свободная область составляет 200 блоков, а длина файла, подлежащего передаче, 150 блоков, то передача с аргументом LEN=0 невозможна, т.к. макрокоманда .ENTER предоставит только 100 блоков. Во время передачи появится ошибка ввода/вывода. Однако, если с помощью аргумента LEN=150 затребована длина в 150 блоков, то передача пройдёт без ошибок. За этим обстоятельством особенно необходимо следить при копировании на устройства, имеющие малый объём, например, BY:.

Примечание. Макрокоманда .ENTER требует, чтобы драйвер устройства находился в памяти перед её выполнением. Поэтому необходимо перед .ENTER, например, выполнить макрокоманду .FETCH.

Ошибки:

Код

Пояснение

0

Канал занят;

1

При использовании макрокоманды с фиксированной длиной "LEN" не найдена область, большая или равная "LEN", или каталог устройства оказался заполненным.

Пример приведён при описании макрокоманды .WRITW.

7.1.4. МАКРОКОМАНДА .RENAME

Эта системная макрокоманда изменяет имя указанного файла. Если на устройстве уже существует файл с тем же именем, то он удаляется.

Формат макрокоманды:

 
.RENAME AREA,CHAN,DBLK

где

AREA

- адрес таблицы аргументов EMT из двух слов;

 

CHAN

- номер канала;

 

DBLK

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

Формат таблицы аргументов EMT:

R0 = > AREA:

4

CHAN

 

DBLK

Макрокоманда .RENAME действительна только для каталоговых устройств; для остальных устройств она игнорируется.

Примечание. По завершении .RENAME канал CHAN будет свободен.

Ошибки:

Код

Пояснение

0

Канал занят;

1

Файл не найден;

2

Недопустимая операция для указанного устройства;

3

На устройстве есть защищённый файл с указанным именем.

В следующем примере файл DATA.TMP на DX0: переименовывается в файл DATA.CNT.

Пример.

        .MCALL  .FETCH,.PRINT,.EXIT,.RENAME
ST:     .FETCH  #HSPACE,#NAMBLK        ;загрузить драйвер DX
        BCS     FEER
        .RENAME #AREA,#0,#NAMBLK       ;сделать переименование
        BCS     RENER
        .EXIT
FEER:   .PRINT  #FMSG
        .EXIT
RENER:  .PRINT  #RNMSG
        .EXIT
AREA:   .BLKW   2                      ;обл. аргументов EMT
NAMBLK: .RAD50  /DX0DATA  TMP/         ;старое имя
        .RAD50  /DX0DATA  CNT/         ;новое имя
FMSG:   .ASCIZ  /ОШИБКА .FETCH/
RNMSG:  .ASCIZ  /ОШИБКА .RENAME/
        .EVEN
HSPACE = .
        .END    ST

7.1.5. МАКРОКОМАНДА .LOOKUP

Макрокоманда .LOOKUP связывает указанный канал с устройством и/или файлом для выполнения операций ввода/вывода.

Чтобы освободить канал для других операций необходимо выполнить одну из макрокоманд:

.CLOSE

.SAVESTATUS

.SRESET

.HRESET

.PURGE

.CSIGEN (освободит все каналы с номерами 0-10)

Формат макрокоманды:

 
.LOOKUP AREA,CHAN,DBLK[,SEGNUM]

где

AREA

- адрес таблицы аргументов EMT из трёх слов;

 

CHAN

- номер канала;

 

DBLK

- блок устройства;

 

SEGNUM

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

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

0 - прямая перемотка магнитной ленты от начала вперёд до тех пор, пока не будет найдено имя файла или LEOT;

N - любое положительное число означает установку ленты на файл с порядковым номером N; алгоритм позиционирования приведён в описании макрокоманды .ENTER;

Формат таблицы аргументов EMT

R0 => AREA :

1

CHAN

 

DBLK

 

SEGNUM

Следует помнить, что оверлейная программа использует 15-й канал для чтения перекрытия. Перед выполнением .LOOKUP драйвер должен находиться в памяти, после завершения макрокоманды регистр R0 содержит длину открытого файла в блоках или 0 для бескаталоговых устройств.

Ошибки:

Код

Пояснение

0

Канал занят;

1

Указанный файл в каталоге не найден.

В примере показано использование макрокоманды .LOOKUP. Определяется, существует ли на устройстве DK: рабочий файл, содержащий очередь файлов на вывод к указанному устройству. Если такой файл существует, то его размер выводится на терминал (в блоках).

Пример.

        .TITLE  LOOKUP.MAC
        .MCALL  .LOOKUP,.PRINT,.EXIT
START:  .LOOKUP #AREA,#0,#QUSPEC
        BCC     
        .PRINT  #NOFIL
        .EXIT
:     MOV     #SIZE,R1
        JSR     PC,CNV10
        .PRINT  #BUF
        .EXIT
CNV10:  MOV     R0,-(SP)
        CLR     R0
:     INC     R0
        SUB     #10.,@SP
        BGE     
        ADD     #72,@SP
        DEC     R0
        BEQ     
        CALL    CNV10
:     MOVB    (SP)+,(R1)+
        RTS     PC
AREA:   .BLKW   3
QUSPEC: .RAD50  /DK QUFILE/
        .RAD50  /TMP/
BUF:    .ASCII  /DK:QUFILE.TMP = /
SIZE:   .ASCIZ  /    BLOCKS/
NOFIL:  .ASCIZ  /?НЕ НАЙДЕН ФАЙЛ DK:QUFILE.TMP ?/
        .EVEN
        .END    START

7.2. ОПЕРАЦИИ ВВОДА/ВЫВОДА

7.2.1. МАКРОКОМАНДЫ .READ/.READC/.READW

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

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

Если считывание производится с устройства последовательного доступа, то R0 содержит требуемое для операции число слов. При обслуживании устройств с прямым доступом R0 содержит фактическое количество слов, которое будет считано (.READ, .READC) или было считано (.READW).

Если сделана попытка считывания после конца файла, то частичная передача все же возможна, но это количество слов (также отражаемое в R0) будет меньше, чем требуется. В случае частичной передачи устанавливается бит "C", и выдаётся код ошибки 0. Поэтому программа всегда должна использовать сведения о фактическом числе принятых слов, содержащихся в R0. Например, если для файла длиной в семь блоков, имеющего номера блоков с 0 по 6 выполняется макрокоманда на чтение 262 слов, начиная с блока 6, то считывается только 256 слов и устанавливается бит "C" (код ошибки 0 в ERRWD).

Ошибки одинаковы для всех трёх режимов:

Код

Пояснение

0

Попытка считывания после конца файла;

1

Ошибка аппаратуры;

2

Канал не открыт.

7.2.1.1. МАКРОКОМАНДА .READ

Макрокоманда .READ выполняет передачу данных по указанному каналу в память. После того, как запрос установлен в очередь к соответствующему драйверу, управление немедленно передаётся программе пользователя. Назначение канала производится с помощью макрокоманд .LOOKUP и .ENTER.

Формат макрокоманды:

 
.READ AREA,CHAN,BUF,WCNT,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера, куда помещаются данные;

 

WCNT

- длина буфера в словах;

 

BLK

- номер блока, который должен быть считан; для устройств с каталоговой организацией - это блок относительно начала файла, если устройство с бескаталоговой организацией (кассеты), то это номер абсолютного блока на устройстве; пользователь должен сам изменять этот аргумент перед очередным использованием данной макрокоманды.

Формат таблицы аргументов EMT:

R0 => AREA:

10

CHAN

 

BLK

 

BUF

 

WCNT

 

1

Примечание. Для использования считанных данных рекомендуется выполнить макрокоманду .WAIT, которая переводит программу в состояние ожидания до завершения операции ввода/вывода. Макрокоманда .WAIT также возвращает ошибки, которые могут появиться во время передачи.

7.2.1.2. МАКРОКОМАНДА .READC

Макрокоманда передаёт необходимое число слов по указанному каналу в память. Управление возвращается программе пользователя сразу после того, как запрос поставлен в очередь. Программа пользователя продолжает выполняться до окончания ввода данных, затем управление передаётся подпрограмме завершения, указанной в макрокоманде. После выполнения инструкции RTS PC в подпрограмме завершения управление возвращается прерванной программе.

Формат макрокоманды:

 
.READC AREA,CHAN,BUF,WCNT,CRTN,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера, куда помещаются данные;

 

WCNT

- длина буфера в словах;

 

CRTN

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

 

BLK

- номер блока, который должен быть считан; для устройств с каталоговой организацией - это блок относительно начала файла; если устройство с бескаталоговой организацией (кассеты), то это номер абсолютного блока на устройстве; пользователь должен сам изменять этот аргумент перед очередным использованием данной макрокоманды.

Формат таблицы аргументов EMT:

R0 => AREA:

10

CHAN

 

BLK

 

BUF

 

WCNT

 

CRTN

При входе в подпрограмму завершения:

Примечание. В подпрограммах завершения недопустимо использование макрокоманд, требующих USR.

7.2.1.3. МАКРОКОМАНДА .READW

Эта макрокоманда передаёт указанное количество слов по определённому каналу в память. Управление возвращается программе пользователя только после завершения операции чтения или при обнаружении ошибки.

Формат макрокоманды:

 
.READW AREA,CHAN,BUF,WCNT,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера, куда помещаются данные;

 

WCNT

- длина буфера в словах;

 

BLK

- номер блока, который должен быть считан; для устройств с каталоговой организацией - это блок относительно начала файла; если устройство с бескаталоговой организацией (кассеты), то это номер абсолютного блока на устройстве; пользователь должен сам изменять этот аргумент перед очередным использованием данной макрокоманды.

Формат таблицы аргументов EMT:

R0 => AREA:

10

CHAN

 

BLK

 

BUF

 

WCNT

 

0

Если после выполнения макрокоманды .READW установлен бит "C", это означает, что произошла ошибка передачи.

Пример приведён при описании макрокоманды .WRITW.

7.2.2. МАКРОКОМАНДЫ .TTYIN/.TTINR

Эти системные макрокоманды производят передачу знаков с системного терминала в программу пользователя. Пересылаемый символ помещается в R0, или в R0 и указанную ячейку.

Формат макрокоманды:

 
.TTYIN CHAR
 
.TTINR

где

CHAR

- адрес памяти, куда пересылается символ из R0.

Если аргумент CHAR не указан, то символ остаётся в младшем байте R0.

Макрокоманда .TTYIN расширяется в последовательность:

        EMT     340
        BCS     .-2

а .TTINR как:

        EMT     340

При работе .TTYIN выполнение основной программы приостанавливается до тех пор, пока символ не будет введён. При использовании .TTINR, если нет знака на ввод (бит 12 JSW равен 1) или строки (бит 12 JSW равен 0) на ввод, то выполняется возврат из макрокоманды с установленным битом "C".

Используя бит 12 в JSW, можно управлять работой системного терминала (см. п. 6.1.2).

Этот бит пользователь должен устанавливать сам. При возвращении управления системе он сбрасывается. Комбинации <СУ/F> и <СУ/B> не зависят от бита 12.

Примечание. Макрокоманда .TTYIN не считывает данных из командного файла. Если при использовании командных файлов необходима такая функция, используется макрокоманда .GTLIN.

Ошибки одинаковы для обоих режимов:

Код

Пояснение

0

В кольцевом буфере вывода нет символов.

Пример приведён при описании макрокоманды .TTYOUT.

7.2.3. МАКРОКОМАНДЫ .TTYOUT/.TTOUTR

Системные макрокоманды .TTYOUT и .TTOUTR выполняют передачу символов из R0 на системный терминал.

Разница между ними в том, что в случае, если в буфере монитора нет места для символа из R0, то макрокоманда .TTYOUT приостановит выполнение всей программы пользователя и будет ожидать появление свободной ячейки, в то время как макрокоманда .TTOUTR продолжит выполнение программы, даже если символ не передан из R0 в монитор.

Формат макрокоманды:

 
.TTYOUT CHAR
 
.TTOUTR

где

CHAR

- адрес ячейки, содержащей символ, который будет загружен в R0 и передан в монитор.

Если аргумент CHAR не указан, то в монитор будет передано содержимое R0.

Если после выполнения макрокоманды .TTOUTR бит "C" установлен, это означает, что в буфере нет места, и символ не был выведен.

Ошибки:

Код

Пояснение

0

Циклический буфер вывода заполнен.

Пример.

        .MCALL  .EXIT,.TTYIN,.TTYOUT,.TTINR,.TTOUTR
ST:     MOV     #BUF,R1
        CLR R2
INLOOP: .TTINR                 ;ввести символы
                               ;с терминала
CHRIN:  MOVB    R0,(R1)+       ;записать символ в буфер
        INC     R2             ; увеличить счетчик
        CMP     R0,#12
        BNE     INLOOP
        MOV     #BUF,R1
OUTLOP: MOVB    (R1),R0        ;занести символ в R0
        .TTOUTR                ;распечатать его
        BCS     NOROOM         ;нет места для выходного
                               ;буфера
CHROUT: DEC     R2             ;уменьшить счётчик
        BEQ     ST
        INC     R1             ;сдвинуть указатель
                               ;буфера и печатать
        BR      OUTLOP         ;следующий символ
NOROOM: MOVB    (R1),R0        ;периодическая попытка
        .TTOUTR                ;вывести символ
        BCC     CHROUT
TYPETT:
        .TTYOUT (R1)           ;вывести символ
        BR      CHROUT
BUF:    .BLKW   100.
        .END    ST

7.2.4. МАКРОКОМАНДА .WAIT

Системная макрокоманда .WAIT приостанавливает выполнение программы до завершения операции ввода/вывода по указанному каналу.

Формат макрокоманды:

 
.WAIT CHAN

где

CHAN

- номер канала ввода/вывода.

Формат регистра R0:

R0 =>

0

CHAN

Макрокоманда .WAIT, используемая совместно с макрокомандами .READ/.WRITE, позволяет осуществить двойную буферизацию процесса ввода/вывода.

Макрокоманда .WAIT передаёт пользователю информацию об ошибках аппаратуры в операции ввода/вывода.

Ошибки:

Код

Пояснение

0

Канал не открыт;

1

В операции ввода/вывода была аппаратная ошибка.

Пример приведён при описании макрокоманды .MRKT.

7.2.5. МАКРОКОМАНДЫ .WRITE/.WRITC/.WRITW

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

Примечание. При использовании запросов типа .READ/.WRITE для буферных операций ввода/вывода необходимо выделять дополнительные элементы очереди при помощи макрокоманды .QSET.

Ошибки одинаковы для всех трёх режимов:

Код

Пояснение

0

Попытка записи после конца файла;

1

Ошибка аппаратуры;

2

Канал не открыт.

7.2.5.1. МАКРОКОМАНДА .WRITE

Выполняет передачу указанного количества слов из памяти по каналу CHAN. Управление передаётся программе пользователя сразу после того, как запрос поставлен в очередь. Назначение канала производится при помощи макрокоманд .LOOKUP и .ENTER

Формат макрокоманды:

 
.WRITE AREA,CHAN,BUF,WCNT,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера вывода;

 

WCNT

- количество передаваемых слов;

 

BLK

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

Формат таблицы аргументов EMT:

R0 => AREA:

11

CHAN

 

BLK

 

BUF

 

WCNT

 

1

7.2.5.2. МАКРОКОМАНДА .WRITC

Передаёт необходимое количество слов из памяти по указанному каналу. Управление возвращается программе пользователя немедленно после того, как запрос поставлен в очередь. Выполнение программы пользователя продолжается до окончания вывода, затем управление передаётся подпрограмме завершения, по инструкции RTS PC в подпрограмме завершения управление передаётся в прерванную программу пользователя.

Формат макрокоманды:

 
.WRITC AREA,CHAN,BUF,WCNT,CRTN,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера вывода;

 

WCNT

- длина буфера в словах;

 

CRTN

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

 

BLK

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

Формат таблицы аргументов EMT:

R0 => AREA:

11

CHAN

 

BLK

 

BUF

 

WCNT

 

CRTN

Примечание. Для макрокоманды .WRITC действительны все соглашения и примечания, касавшиеся макрокоманды .READC.

7.2.5.3. МАКРОКОМАНДА .WRITW

Эта макрокоманда передаёт указанное количество слов из памяти по указанному каналу. Управление возвращается в программу пользователя после завершения вывода.

Формат макрокоманды:

 
.WRITW AREA,CHAN,BUF,WCNT,BLK

где

AREA

- адрес таблицы аргументов EMT из 5 слов;

 

CHAN

- номер канала;

 

BUF

- адрес буфера вывода;

 

WCNT

- длина буфера в словах;

 

BLK

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

Формат таблицы аргументов EMT:

R0 = > AREA:

11

CHAN

 

BLK

 

BUF

 

WCNT

 

0

В следующем примере с использованием .READW и .WRITW вывод полностью синхронен. Программа не выполняется до тех пор, пока весь буфер не будет заполнен или очищен.

Пример.

        .MCALL  .FETCH,.READW,.WRITW,.ENTER,.LOOKUP,.PRINT
        .MCALL  .EXIT,.CLOSE
ERRWD = 52
ST:     .FETCH  #HSPACE,#PCNAME         ; Загрузить драйвер PC
        BCS     FERR
        MOV     #AREA,R5                ; Обл. аргументов EMT
        CLR     R4                      ; R4 - канал вывода 0
        MOV     #1,R3                   ; R3 - канал ввода 1
        .ENTER  R5,R4,#PCNAME           ; Открыть файл
        BCS     ENERR
        .LOOKUP R5,R3,#PCNAME
        BCS     LKERR
        CLR     R1                      ; R1 - номер блока
LOOP:   .READW  R5,R3,#BUFF,#256.,R1    ; Считать блок
        BCS     RDERR
        .WRITW  R5,R4,#BUFF,#256.,R1    ; Записать его
        BCS     WTERR
        INC     R1                      ; Увеличить счетчик
        BR      LOOP
RDERR:  TSTB    ERRWD                   ; Это EOF ?
        BEQ                           ; Да
        .PRINT  #RDMSG
:     .EXIT
WTERR:  .PRINT  #WTMSG
        .EXIT
PCNAME: .RAD50  /PC/                    ; Для PC не нужно имя
        .WORD   0                       ; Файла, оно - 0
FERR:   .PRINT  #FEMSG
        .EXIT
ENERR:  .PRINT  #ENMSG
        .EXIT
LKERR:  .PRINT  #LKMSG
        .EXIT
FEMSG:  .ASCIZ  /СДЕЛАТЬ "INSTALL PC"/
ENMSG:  .ASCIZ  /ОШИБКА ENTER/
LKMSG:  .ASCIZ  /ОШИБКА LOOKUP/
ROMSG:  .ASCIZ  /ОШИБКА READ/
WTMSG:  .ASCIZ  /ОШИБКА WRITE/
        .EVEN
AREA:   .BLKW   10
BUFF:   .BLKW   256.
HSPACE = .
        .END    ST

Эта же программа может быть написана с использованием макрокоманд .READC и .WRITС. Макрокоманды выполнят начальную часть ввода-вывода, а подпрограммы завершения обработают оставшуюся часть.

        .MCALL  .PRINT,.EXIT,.FETCH,.ENTER,.LOCKUP
        .MCALL  .CLOSE,.READC,.WRITC,.WAIT
ERRWD = 52
ST:     .FETCH  #AREA,#PCNAME           ; Загрузить драйвер PC
        BCS     FERR
FLNK:   MOV     #AREA,R5                ; Обл. аргументов EMT
        .ENTER  R5,#1,#PCNAME           ; Открыть файл
        BCS     ENERR
        .LOOKUP R5,#0,#PCNAME
        BCS     LKERR
        CLR     R1                      ; R1 - номер блока
LOOP:   CLR     DFLG                    ; Сброс флага вып./ошиб.
        .READC  R5,#0,#BUFF,#256.,RDCOMP,R1 ; Считать блок
        BCS     EOF
:     TST     DFLG                    ; Флаг установлен ?
        BEQ                           ; Нет
        BMI     IOERR                   ; Да
EOF:    .CLOSE  #1
        .EXIT
RDCCMP: ROR     R0                      ; Бит C установлен, значит
        BCS     RWERR                   ; Встретилась ошибка
        .WRITC  R5,#0,#BUFF,#256.,#WRCOMP,BLKN ; Записать блок 
        BCC     RTS
RWERR:  MOV     #-1,DFLG                ; Флаг ошибки
RTS:    RTS     PC
WRCOMP: ROR     R0
        BCS     RWERR                   ; Ошибка аппаратуры
        INC     BLKN
        .READC  R5,#1,#BUFF,#256.,#RDCOMP,BLKN
        BCC     
        TSTB    ERRWD
        BNE     RWERR                   ; Нет
        INC     DFLG
:     RTS     PC
FERR:   MOV     #FMSG,R0
        BR      TYPIT
IOERR:  MOV     #IOMSG,R0
        BR      TYPIT
LKERR:  MOV     #LMSG,R0
        BR      TYPIT
ENERR:  MOV     #EMSG,R0
TYPIT:  .PRINT
        .EXIT
PMSG:   .ASCIZ  /СДЕЛАТЬ "INSTALL PC"/
EMSG:   .ASCIZ  /ОШИБКА ENTER/
LMSG:   .ASCIZ  /ОШИБКА LOOKUP/
IOMSG:  .ASCIZ  !ОШИБКА ВВОДА/ВЫВОДА!
        .EVEN
DFLG:   .WORD   0
PCNAMEs .RAD50  /PC/
        .WORD   0
BLKN:   .WORD   0
AREA:   .BLKW   10
BUFF:   .BLKW   256.
HSPACE  = .
        .END    ST

7.2.6. МАКРОКОМАНДА .PRINT

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

Формат макрокоманды:

 
.PRINT ADDR

где

ADDR

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

Строка, выдаваемая на печать, может оканчиваться либо нулевым байтом, либо байтом со значением <200>. Если строка оканчивается нулевым байтом, то автоматически добавляется <ВК><ПС>. Если строку заканчивает байт <200>, то выдача <ВК><ПС> не производится.

Управление возвращается программе пользователя после размещения в буфере вывода всех выводимых символов.

Ошибки отсутствуют.

7.2.7. МАКРОКОМАНДА .SPFUN

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

Формат макрокоманды:

 
.SPFUN AREA,CHAN,FUNC,BUF,WCNT,BLK,CRTN

где

AREA

- блок аргументов EMT из шести слов,

 

CHAN

- номер канала;

 

FUNC

- код функции, которую необходимо выполнить;

 

BUF

- адрес буфера;

 

WCNT

- этот аргумент является специфичным для каждого конкретного драйвера и, возможно, будет зависеть от указанной функции;

 

BLK

- данный аргумент используется аналогично аргументу WCNT;

 

CRTN

- точка входа в подпрограмму завершения; когда этот аргумент пропущен, то автоматически заносится ноль; если CRTN=0 режим аналогичен .READW; если CRTN=1 режим аналогичен .READ; если CRTN>500, то это адрес подпрограммы завершения.

Формат таблицы аргументов EMT:

R0 => AREA:

32

CHAN

 

BLK

 

BUF

 

WCNT

 

377

 

CRTN

Аргументы BLK, CHAN и WCNT могут определяться так же, как для операции .READ/.WRITE.

Макрокоманда .SPFUN даёт возможность выполнять функции, приведённые в табл. 2.

Таблица 2

Функция

MD

CT

DX

DM

DY

DL

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

 

377

 

 

 

 

Перемотка вперёд до последнего блока

 

376

 

 

 

 

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

 

375

 

 

 

 

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

 

374

 

 

 

 

Перемотка до точки загрузки

373

373

 

 

 

 

Запись межфайлового промежутка

 

372

 

 

 

 

Запись EOF

377

 

 

 

 

 

Перемотка вперёд на одну запись

376

 

 

 

 

 

Перемотка назад на одну запись

375

 

 

 

 

 

Запись

371

 

376

376

376

 

Чтение

370

 

377

377

377

 

Запись с расширенным межфайловым промежутком

374

 

 

 

 

 

Обратная перемотка в автономном режиме

372

 

 

 

 

 

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

 

 

375

 

375

 

Чтение драйвером таблицы расположения плохих блоков из блока 1-го диска

 

 

 

374

 

374

Возвращение размера драйвера

 

 

 

373

373

373

Чтобы использовать запрос .SPFUN, драйвер должен находиться в памяти, и канал должен быть связан с файлом запросом .LOOKUP.

Запрос .SPFUN для записи абсолютных блоков на гибкий диск не должен ничего записывать на нулевую дорожку, если будет использоваться команда DUP или COPY/DEVICE для поддержки носителя. DUP не записывает дату на нулевую дорожку. Также нужно следить за тем, чтобы правильно были указаны адрес буфера и количество слов. Монитор проверяет, находится ли аргумент BUF в рабочей области, но не проверяет BUF+WCNT. Если использовать запрос .SPFUN и драйвер устройства, который не поддерживает специальных функций, вызов возвращается в программу, не объявляя об ошибке.

Для драйвера диска типа RK06/07 (DM) коды специальных функций 377 и 376 требуют размера буфера на одно слово больше, чем необходимо для данных. Первое слово буфера содержит информацию об ошибке, возвращённую как результат работы запроса .SPFUN. Данные, переданные в результате запроса чтения или записи, находятся во втором и следующих словах буфера.

Коды ошибок:

Код

Значение

100000

Операция ввода/вывода прошла успешно;

100200

Обнаружен плохой блок (ошибка BSE);

100001

ECC ошибка исправлена;

100002

Ошибка при повторной попытке выполнения операции;

100004

Ошибка при попытке нового смещения;

100010

Ошибка после разметки носителя;

1770xx

Ошибка не обнаружена.

Ошибки:

Код

Пояснение

0

Попытка чтения или записи за концом файла;

1

В канале появилась аппаратная ошибка;

2

Канал не открыт.

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

Следует отметить, что код функции занимает только один байт и его значение всегда отрицательно. Допустимые значения кода не выходят за пределы от -1 до -128 десятичных (от 377 до 200 восьмеричных).

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

Пример

        .MCALL  .PRINT,.FETCH,.LOOKUP,.SPFUN
        .MCALL  .WRITW,.EXIT,.WAIT,.CLOSE
ST:     .FETCH  #HSPC,#CT           ;Загрузить драйвер СТ
        BCS     FERR
        .LOOKUP #AREA,#4,#CT
        BCS     LKERR
        .SPFUN  #AREA,#4,#373,#0    ;Перемотать синхронно
        BCS     SERR
        .WRITW  #AREA,#4,#BUFF,#256.,BLK
        BCS     WTERR
        .SPFUN  #AREA,#4,#372,#1    ;Запись межфайлового
                                    ;промежутка
        .PRINT  #DONE
        .WAIT   #4
        .CLOSE  #4
        .EXIT
AREA:   .BLKW   10
FERR:   .PRINT  #FMSG
        .EXIT
LKERR:  .PRINT  #LKMSG
        .EXIT
SERR:   .PRINT  #SMSG
        .EXIT
WTERR:  .PRINT  #WTMSG
        .EXIT
DONE:   .ASCIZ  /КОНЕЦ РАБОТЫ/
FMSG:   .ASCIZ  /ОШИБКА FETCH/
LKMSG:  .ASCIZ  /ОШИБКА LOOKUP/
SMSG:   .ASCIZ  /ОШИБКА SPFUN/
WTMSG:  .ASCIZ  /ОШИБКА WRITW/
        .EVEN
CT:     .RAD50  /CT/
        .WORD   0,0,0
BUFF:   .BLKW   256.
BLK:    .WORD   0
HSPC =  .
        .END    ST

7.3. РАБОТА С КАНАЛАМИ

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

7.3.1. МАКРОКОМАНДА .CDFN

Системная макрокоманда .CDFN используется для увеличения числа каналов ввода/вывода.

Формат макрокоманды:

 
.CDFN AREA,ADDR,NUM

где

AREA

- адрес таблицы аргументов EMT, состоящей из трёх слов;

 

ADDR

- адрес буфера для размещения каналов ввода/вывода;

 

NUM

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

Формат таблицы аргументов EMT:

R0 => AREA

15

0

 

ADDR

 

NUM

Каждое задание первоначально обеспечивается 16 (десятичное) каналами ввода/вывода, имеющими номера с 0 по 15. С помощью данной макрокоманды число каналов может быть увеличено до 256 (десятичное).

Память, используемая для размещения новых каналов ввода/вывода, резервируется в программе пользователя. Каждый канал ввода/вывода требует 5 слов памяти. Если количество определяемых каналов равно N, то пользователь должен зарезервировать для них 5*N слов памяти начиная с адреса ADDR.

Рекомендуется использовать макрокоманду .CDFN в начале программы, перед выполнением операции ввода/вывода.

Макрокоманда .CDFN определяет только новые каналы; ранее определённые каналы не используются, но содержимое старых каналов передаётся в новые. Попытка уменьшить количество каналов приведёт к сообщению об ошибке.

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

Если программа использует оверлейную структуру, 15 канал не должен изменяться, т.к. используется драйвером оверлеев. Другие каналы могут быть определены и использованы как обычно.

Макрокоманды .SRESET и .HRESET отменяют действие макрокоманды .CDFN и устанавливают исходные 16 каналов, определённые при запуске программы.

Ошибки:

Код

Пояснение

0

Сделана попытка определить меньше каналов, чем уже есть.

В примере определяется сначала 25, каналов, затем 30. каналов. При попытке определить 20. каналов возникает ошибка, т.к. ранее было определено большее количество каналов. На системный терминал выдаются сообщения.

Пример.

        .MСАLL  .CDFN,.PRINT,.HRESET,.EXIT
START:  .CDFN   #AREA,#CHANL,#25.      ;определить 25. каналов
        BCS     ERR
        .PRINT  #MSG                   ;печать сообщения
        .CDFN   #AREA,#CHANL,#30.      ;определить 30. каналов
        BCS     ERR
        .PRINT  #MSG                   ;печать сообщения
        .CDFN   #AREA,#CHANL,#20.      ;определить 20. каналов
        BCC     ЕRR1
        .PRINT  #MSG
CONT:   .HRESET                        ;возврат к 16. каналам
        .CDFN   #AREA,#CHANL,#20.      ;определить 20. каналов
        BCS     ERR
        .PRINT  #MSG                   ;печать сообщения
        .EXIT
ERR:    .PPINT  #MSG1
        .EXIT
ERR1:   .PRINT  #MSG1
        BR      CONT
ARFA:   .BLKW   3                      ;блок аргументов EMT
MSG:    .ASCIZ  /КАНАЛЫ ОПРЕДЕЛЕНЫ/
MSG1:   .ASCIZ  /ОШИБКА .CDFN/
        .EVEN
CHANL:  .BLKW   30.*5                  ;область для каналов
        .END    START

7.3.2. МАКРОКОМАНДА .PURGE

Системная макрокоманда .PURGE используется для освобождения канала без выполнения макрокоманд .HRESET, .SRESET, .SAVESTATUS или .CLOSE.

Формат макрокоманды:

 
.PURGE CHAN

где

CHAN

- номер канала (восьмеричное).

Формат регистра R0:

R0 =>

3

CHAN

Макрокоманда .PURGE освобождает канал, не выполняя никаких других операций (временно созданный файл теряется).

Если программа имеет оверлейную структуру, то в макрокоманде .PURGE нельзя задавать канал 17 (восьмеричное), т.к. этот канал используется драйвером перекрытий.

Если указанный в макрокоманде канал не занят, т.е. не связан с файлом, то макрокоманда игнорируется.

Ошибки отсутствуют.

7.3.3. МАКРОКОМАНДА .REOPEN

Макрокоманда .REOPEN связывает указанный канал с файлом, для которого была выполнена макрокоманда .SAVESTATUS, таким образом производя повторное открытие этого файла.

Формат макрокоманды:

 
.REOPEN AREA,CHAN,CBLK

где

AREA

- адрес таблицы аргументов EMT, состоящей из двух слов;

 

CHAN

- номер канала в интервале 0-377 (восьмеричное);

 

CBLK

- адрес блока из пяти слов с информацией о состоянии канала.

Формат таблицы аргументов EMT:

R0 => AREA:

6

CHAN

 

CBLK

Сочетание макрокоманд .REOPEN и .SAVESTATUS удобно в тех случаях, когда нужно одновременно обработать большое число файлов при ограниченном количестве каналов. Необходимое количество файлов можно открыть макрокомандой .LOOKUP и сохранить макрокомандой .SAVESTATUS. Когда требуются данные из файла, макрокоманда .REOPEN даёт возможность программе связать файл, сохранённый макрокомандой .SAVESTATUS, со свободным каналом и затем произвести считывание.

Макрокоманда .REOPEN может использовать любой канал, не обязательно тот, который использовался ранее макрокомандами .LOOKUP и .SAVESTATUS.

Ошибки:

Код

Пояснение

0

Канал занят.

Пример приведён при описании макрокоманды .SAVESTATUS.

7.3.4. МАКРОКОМАНДА .SAVESTATUS

Макрокоманда .SAVESTATUS передаёт 5 слов информации о состоянии канала в указанную область памяти. Освобождая канал для других целей. Эти слова содержат полную информацию, необходимую системе для определения файла.

Формат макрокоманды:

 
.SAVESTATUS AREA,CHAN,CBLK

где

AREA

- адрес таблицы аргументов EMT, состоящей из двух слов;

 

CHAN

- номер канала;

 

CBLK

- адрес блока памяти (5 слов), где сохраняется информаций о состоянии канала.

Формат таблицы аргументов EMT:

R0 => AREA:

5

CHAN

 

CBLK

После выполнения макрокоманды файл закрывается, и канал освобождается для использования.

Макрокоманда .SAVESTATUS применяется только в том случае, если файл был открыт посредством макрокоманды .LOOKUP. Если файл был открыт макрокомандой .ENTER, то использование макрокоманды .SAVESTATUS недопустимо, при этом возникает ошибка.

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

В табл. 3 приведена информация о состоянии канала. Символом «*» помечены биты, пояснения к которым даны, для установленного бита.

Таблица 3

Слово

Бит

Содержимое

1

 

Слово состояния канала

0*

Аппаратная ошибка по этому каналу

1-5

Индекс в таблицах монитора. Описывает физическое устройство, связанное с этим каналом

6*

На канале выполняется макрокоманда .RENAME

7*

В каталоге должна произойти новая запись макрокомандой .CLOSE (т.е. этот бит установлен, если выполнена макрокоманда .ENTER)

8-12

Номер сегмента каталога от 1 до 37 (восьмеричные), в котором находится запись о текущем файле

13*

Найден конец файла

14

Не используется

15*

Этот канал в данный момент занят

2

 

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

3

 

Длина файла (в блоках по 256 слов)

4

 

Не используется

5

 

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

Сочетание макрокоманд .SAVESTATUS/.REOPEN очень удобно, но необходимо соблюдать некоторые меры предосторожности:

  1. если после выполнения макрокоманды .SAVESTATUS файл был удалён до макрокоманды .REOPEN, то выполненная в этот момент макрокоманда .ENTER может использовать область этого файла как свободную и изменить её содержимое; после этого содержимое файла нельзя восстановить;
  2. при выполнении макрокоманды .REOPEN присутствие в памяти драйвера соответствующего устройства необязательно; однако, если выполняются макрокоманды .READ или .WRITE, то при отсутствии драйвера выдаётся неустранимая ошибка.

Ошибки:

Код

Пояснение

0

Указанный канал не связан с файлом, т.е. не выполнена макрокоманда .LOOKUP;

1

Указанный файл открыт макрокомандой .ENTER или находится на CT:.

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

Пример.

        .MCALL  .READ,.EXIT,.CSIGEN,.SAVESTATUS,.REOPEN
ST:     MOV     #AREA,R5
        .CSIGEN #DSPACE,#DEXT      ;ввести строку
        MOV     R0,BUF             ;указатель на
                                   ;свободную память
        .SAVEST R5,#3,#BLOCK1      ;сохранить информацию
                                   ;о первом вход. Файле
        .SAVEST R5,#4,#BLOCK2      ;о втором
        .SAVEST R5,#5,#BLOCK3      ;о третьем
        MOV     #BLOCK1,R4
PRCS:   .REOPEN R5,#0,R4           ;переоткрыть файл
                                   ;по каналу 0
        .READ   R5,#0,BUF,COUNT,BLOCK ;и обработать его
DONE:   ADD     #12,R4             ;указатель на
                                   ;следующий блок
        CMP     R4,#BLOCK3         ;последн. Файл обработан?
        BLOS    PRCS               ;нет, выполнить следующий
        .EXIT
BLOCK1: .WORD   0,0,0,0,0          ;блоки для информации
BLOCK2: .WORD   0,0,0,0,0          ;о сохраненном
BLOCK3: .WORD   0,0,0,0,0          ;состоянии каналов
AREA:   .BLKW   10
BUF:    .WORD   0
BLOCK:  .WORD   0
COUNT:  .WORD   256.
DEXT:   .WORD   0,0,0,0
DSPACE = .
        .END    ST

7.4. ОБРАБОТКА КОМАНДНОЙ СТРОКИ

7.4.1. МАКРОКОМАНДА .CSIGEN

Системная макрокоманда .CSIGEN вызывает интерпретатор командной строки (CSI) в обычном режиме.

Формат макрокоманды:

 
.CSIGEN DEFSPC,DEFEXT,CSTRNG[,LINBUF]

где

DEFSPC

- адрес области памяти, куда загружаются драйверы устройств;

 

DEFEXT

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

 

CSTRNG

- адрес командной строки или #0, если ввод строки происходит с терминала;

 

LINBUF

- адрес, где сохраняется копия командной строки.

Если строка находится в памяти, она должна заканчиваться нулевым байтом, а не содержать символы <ВК>,<ПС>.

Блок DEFEXT содержит:

слово 1 -

расширение для всех входных файлов;

слово 2 -

расширение для первого выходного файла;

слово 3 -

расширение для второго выходного файла;

слово 4 -

расширение для третьего выходного файла.

Если не используются расширения по умолчанию, соответствующие слова должны содержать ноль.

Область LINBUF (длиной 81. байт) резервируется пользователем. Вводимая строка представляется, как строка директивы .ASCIZ, и может быть напечатана с помощью макрокоманды .PRINT.

Макрокоманда .CSIGEN автоматически выбирает строку из командного файла, если был указан ввод с терминала (CSTRNG=0), а сама программа вызывалась из этого командного файла.

Макрокоманда .CSIGEN связывает три возможных выходных файла с каналами 0,1,2 соответственно и шесть входных файлов - с каналами 3-10 (восьмеричное). Пропуск спецификации файла в командной строке оставляет соответствующий канал свободным.

Область DEFSPC должна быть достаточной, чтобы вместить все вводимые драйверы одновременно. Если размеры драйверов превышают имеющуюся область, программа пользователя может быть испорчена. По завершении макрокоманды .CSIGEN R0 содержит адрес первой свободной ячейки выше драйверов.

Ключи и связанные с ними значения передаются в стек.

Ошибки:

Код

Пояснение

0

Недопустимая команда;

1

Указанное устройство отсутствует;

2

Не используется;

3

Переполнение каталога;

4

Входной файл не найден.

Примечание. Если ввод строки происходит с терминала, то при появлении ошибок сообщение о них выводится на системный терминал.

7.4.2. МАКРОКОМАНДА .CSISPC

Системная макрокоманда .CSISPC вызывает интерпретатор командной строки в специальном режиме.

Формат макрокоманды:

 
.CSISPC OUTSPC,DEFEXT,CSTRNG[,LINBUF]

где

OUTSPC

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

 

DEFEXT

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

 

CSTRNG

- адрес командной строки или #0, если ввод строки происходит с терминала;

 

LINBUF

- адрес, где сохраняется копия командной строки.

В этом режиме интерпретатор командной строки не производит загрузку драйверов и не выполняет макрокоманд .CLOSE, .ENTER и .LOOKUP.

В блоке OUTSPC отводится первые 15 слов для трёх выходных файлов (5 слов на файл) и 24 слова для шести входных файлов (4 слова на файл). Если какой-то файл отсутствует, то соответствующее поле заполняется нулями.

В блок для выходных файлов заносится:

слово 1 -

имя устройства (RADIX-50);

слово 2-3 -

имя файла (RADIX-50);

слово 4 -

расширение имени файла (RADIX-50);

слово 5 -

размер файла (восьмеричное).

В блок для входных файлов заносится:

слово 1 -

имя устройства (RADIX-50);

слово 2-3 -

имя файла (RADIX-50);

слово 4 -

расширение имени файла (RADIX-50).

Если строка находится в памяти, она должна заканчиваться нулевым байтом, а не содержать символы <ВК>, <ПС>.

Блок DEFEXT содержит:

слово 1 -

расширение для всех входных файлов;

слово 2 -

расширение для первого выходного файла;

слово 3 -

расширение для второго выходного файла;

слово 4 -

расширение для третьего выходного файла.

Если не используются расширения по умолчанию, соответствующие слова должны содержать 0.

Область LINBUF (длиной 81. байт) резервируется пользователем. Вводимая строка представляется, как строка директивы .ASCIZ, и может быть напечатана с помощью макрокоманды .PRINT.

Макрокоманда .CSISPC автоматически выбирает строку из командного файла, если был указан ввод с терминала (CSTRNG=0), а сама программа вызывалась из этого командного файла.

В общем и специальном режимах интерпретатора командной строки (CSI, ключи и соответствующие им значения передаются в стеке.

Ключом является косая черта (/), за которой следует любой символ (желательно, чтобы он был неслужебным).

За ключом может следовать значение ключа, которое указывается двоеточием (:). Значение ключа может быть либо восьмеричным числом, либо десятичным числом, либо набором буквенно-цифровых символов (от 1 до 3 символов), первый из которых должен быть буквенным. Десятичные величины указываются числом с точкой. Если точка отсутствует, то число считается восьмеричным.

Пользователь получает в стеке ключи и их значения в следующем виде:

слово 1 -

(верхушка стека) количество ключей в командной строке; если ноль, то ключи отсутствуют;

слово 2 -

младший байт содержит мнемонику ключа, старший - номер файла, с которым связан ключ; если 15 бит установлен, то ключ имеет значение;

слово 3 -

если установлен 15 бит слова 2, то содержится значение ключа; если нет, то следующий ключ (если он есть).

Примечание. Если ключ имеет несколько значений, в стек записывается соответствующее количество ключей.

Ошибки:

Код

Пояснение

0

Недопустимая команда;

1

Указанное устройство отсутствует.

Примечание. Если ввод строки происходит с терминала, то при появлении ошибок сообщение о них выводится на системный терминал.

В примере показано использование CSI в специальном режиме. Программа читает файл в формате ДОС и записывает его в формате ОС БК-11.

Пример

        .MCALL  .CSISPC,.PRINT,.EXIT,.ENTER,.CLOSE
START:  .CSISPC #OUTSP,#DEFEXT,#CSTRNG ; Ввести командную
                                    ; строку из памяти
        BCC     
        .PRINT  #MSG
        .EXIT
:     .ENTER  #AREA,#0,#OUTSPC,OUTSPC+10 ;Открыть файл
                                    ;для вывода
        BCC     
        .PRINT  #MSG1
        .EXIT
:     JSR     PC,IO               ; Подпрограмма  ввода
                                    ; в формате ДОС и вывода
                                    ; в формате ОС БК-11
        .CLOSE  #0                  ; закрыть выходной файл
        .EXIT
CSTRNG: .ASCIZ  "RK1:RAFOS,MAC=RK2:DDS.MAC" ; Командная
                                    ; строка
        .EVEN
DEFEXT: .WORD   0,0,0,0             ; Блок расширений
                                    ; по умолчанию
AREA:   .BLKW   5                   ; Блок аргументов EMT
MSG:    .ASCIZ  /ОШИБКА CSI/
MSG1:   .ASCIZ  /ОШИБКА ENTER/
        .EVEN
IO:     .                           ; Текст подпрограммы
        .
        RTS PC
OUTSP = .                           ; Блок дескрипторов
        .END    START

7.4.3. МАКРОКОМАНДА .GTLIN

Системная макрокоманда .GTLIN вводит командную информацию, отличную от формата CSI с системного терминала или из выполняющегося командного файла.

Формат макрокоманды:

 
.GTLIN LINBUF[,PROMPT]

где

LINBUF

- адрес буфера, куда вводится строка;

 

PROMPT

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

Вводимая строка в области LINBUF (81. байт) оканчивается нулевым байтом вместо <ВК><ПС>.

Макрокоманда .GTLIN требует USR и выбирает строку с системного терминала или из командного файла в зависимости от того, откуда была загружена программа.

Если была задана команда SET TT QUIET, а ввод происходит из косвенного файла, строка-подсказка игнорируется, в противном случае строка-подсказка выводится на системный терминал прежде, чем выбрана вводимая строка.

Ошибки отсутствуют.

В следующем примере программа вводит строку с терминала и распечатывает её.

Пример.

        .MCALL  .GTLIN,.PRINT,.EXIT
START:  .GTLIN  #BUF,#PROMPT        ;ввести строку
        TSTB    BUF                 ;строка пустая?
        BEQ     ЕND                 ;да
        .PRINT  #BUF                ;нет ... вывести строку
        BR      START
END:    .EXIT
PROMPT: .ASCIZ  /ВВЕДИТЕ СТРОКУ/    ;строка-подсказка
BUF:    .BLKB   82.                 ;буфер вводимой строки
        .END    START

7.5. РАБОТА С ТАЙМЕРОМ

7.5.1. МАКРОКОМАНДА .GTIM

Системная макрокоманда .GTIM возвращает текущее содержимое системного таймера (в тиках) по указанному адресу.

Формат макрокоманды:

 
.GTIM AREA,ADDR

где

AREA

- адрес таблицы аргументов EMT из двух слов;

 

ADDR

- адрес массива из двух слов, в который заносится время во внутреннем формате (первое слово содержит старшие разряды, второе - младшие).

Формат списка аргументов EMT:

R0 => AREA:

21

0

 

ADDR

Программа пользователя должна сама преобразовывать время из тиков в часы, минуты, секунды (1 сек. = 50 тикам для сети с частотой 50 Гц).

Ошибки отсутствуют.

В примере пользователь получает в ячейке TIME текущее время в тиках.

Пример.

        .MCALL  .GTIM,.EXIT
START:  .GTIM   #AREA,#TIME     ;Получить время
        .EXIT
TIME:   .WORD   0,0
AREA:   .BLKW   2               ;Блок аргументов EMT
        .END    START

7.5.2. МАКРОКОМАНДА .CMKT

Системная макрокоманда .CMKT предназначена для отмены невыполненных макрокоманд временного интервала (.MRKT).

Формат макрокоманды:

 
.CMKT AREA,ID[,TIME]

где

AREA

- адрес таблицы аргументов EMT из трёх слов;

 

ID

- идентификатор каждой макрокоманды .MRKT;

 

TIME

- адрес массива из двух слов, содержащих время во внутреннем формате, оставшееся в отменённой макрокоманде; первое слово содержит старшие разряды, второе - младшие.

Формат списка аргументов EMT:

R0 => AREA:

23

0

 

ID

 

TIME

Отмена макрокоманды .MRKT освобождает соответствующий элемент очереди для других целей.

Если несколько макрокоманд .MRKT имеют одинаковый ID, то отменяется макрокоманда с самым ранним временем окончания.

Если ID = 0, то все несистемные макрокоманды .MRKT (в диапазоне 1-177377) для данной программы отменяются, а аргумент TIME игнорируется.

Ошибки:

Код

Пояснение

0

Макрокоманда .MRKT с заданным NUM не найдена (либо макрокоманда не была задана либо она уже закончена).

Пример приведён при описании макрокоманды .MRKT.

7.5.3. МАКРОКОМАНДА .MRKT

Системная макрокоманда .MRKT планирует запуск указанной подпрограммы завершения через заданный интервал времени в тиках ( 1 с = 50 тиков для частоты сети 50 Гц).

Формат макрокоманды:

 
.MRKT AREA,TIME,CRTN,ID

где

AREA

- адрес таблицы аргументов EMT из четырёх слов;

 

TIME

- адрес массива из двух слов, содержащих временной интервал;

 

CRTN

- адрес входа в подпрограмму завершения;

 

ID

- идентификатор каждой макрокоманды .MRKT.

Формат таблицы аргументов EMT:

R0 => AREA:

22

0

 

TIME

 

CRTN

 

ID

Системная макрокоманда .MRKT требует элемент очереди. Пользователь должен сам распределить достаточное количество элементов очереди.

ID в диапазоне 177400-177777 (восьмеричное) зарезервированы для системного использования.

Несколько макрокоманд .MRKT могут иметь один и тот же ID.

При входе в подпрограмму завершения R0 содержит ID.

Ошибки:

Код

Пояснение

0

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

В следующем примере по истечении времени выдаётся сообщение на терминал.

Пример.

        .MCALL  .READ,.WAIT,.MRKT,.CMKT
        .MCALL  .QSET,.PRINT,.EXIT,.LOOKUP
START:  .LOOKUP #AREA,#0,#FILE      ; открыть файл
        BCS     LKERR
        MOV     #AREA,-(SP)
        .QSET   #QUEUE,#5           ; добавить 5 элементов
                                    ; очереди
        .MRKT   (SP),#INTRVL,#MRTN,#1   ; запустить MRTN
                                    ; по истечении времени
        BCS     NOMRKT
        .READ   #RDLST              ; читать
        BCS     RDERR
        .WAIT   #0                  ; ждать
        .CMKT   (SP),#1             ; освободить элемент
                                    ; очереди (отменить .MRKT)
        BCS     NOTDUN
        .EXIT
MRTN:                               ; подпрограмма завершения
        .PRINT  #FAIL1
        RTS     PC
LKERR:  .PRINT  #LM
        .EXIT
RDERR:  .PRINT  #RDMSG
        .EXIT
NOTDUN: .PRINT  #FAIL
        .EXIT
NOMRKT: .PRINT  #NOQ
        .EXIT
NOQ:    .ASCIZ  /НЕТ ЭЛЕМЕНТА ОЧЕРЕДИ/
FAIL:   .ASCIZ  /ОШИБКА CMKT/
FАIL1:  .ASCIZ  /ВРЕМЯ ИСТЕКЛО/
LM:     .ASCIZ  /ОШИБКА LOOKUP/
RDMSG:  .ASCIZ  /ОШИБКА READ/
        .EVEN
INTRVL: .WORD   0,13.               ; время
QUEUE:  .BLKW   5*7                 ; блок элементов
AREA:   .BLKW   5                   ; блок аргументов EMT
                                    ; для .MRKT
FILE:   .RAD50  /DK FTLE  TST/
RDLST:  .BYTE   0                   ; блок аргументов EMT
        .BYTE   10                  ; для .READ
BLOCK:  .WORD   0
        .WORD   BUF
        .WORD   256.
        .WORD   1
BUF:    .BLKW   256.                ; буфер ввода
        .END    START

7.6. СИСТЕМНЫЕ МАКРОКОМАНДЫ ОБЩЕГО НАЗНАЧЕНИЯ

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

7.6.1. МАКРОКОМАНДА .CHAIN

Системная макрокоманда .CHAIN обеспечивает загрузку новой программы вместо выполняемой и передачу ей управления без вмешательства оператора. Повторяя этот процесс, можно организовать загрузку программ по "цепочке".

Ячейки памяти 500-507 содержат имя устройства и файла (в коде RADIX-50), из которого будет выполняться загрузка новой программы, а область 510-777 используется для передачи информации загружаемой программе.

Формат макрокоманды:

.CHAIN

Формат регистра R0:

R0 =>

10

0

Выполнение макрокоманды .CHAIN гарантирует сохранение содержимого области памяти 500-510 и монитора. Сохранение ячеек 510-777 (область обмена информацией) зависит от значения бита CHAIN¤ (бит 8) в слове состояния программы перед загрузкой.

При выполнении макрокоманды .CHAIN открытые каналы ввода/вывода могут использоваться новой программой. Однако следует помнить, что монитор во время выполнения макрокоманды .CHAIN возвращается к исходным 16 каналам. Следовательно, программы, оставляющие файлы открытыми, не должны использовать макрокоманду .CDFN. Это справедливо только для программ на ассемблере. Для языков высокого уровня информация об открытых каналах и назначениях не сохраняется при выполнении макрокоманды .CHAIN.

Нерезидентные драйверы устройств выгружаются во время выполнения макрокоманды .CHAIN и должны быть загружены новой программой с помощью макрокоманды .FETCH.

Проверкой бита CHAIN¤ (бит 8) слова состояния программы JSW можно установить, была ли программа загружена посредством макрокоманды .CHAIN или командой монитора RUN.

Ошибки:

Макрокомандой .CHAIN выдаются те же сообщения об ошибках, какие генерируются при выполнении команды монитора RUN. При появлении ошибки макрокоманда .CHAIN игнорируется и управление передаётся монитору.

Примечание. При использовании макрокоманды .CHAIN нужно быть осторожным при инициализации стека. Обычно компоновщик при инициализации стека по умолчанию устанавливает его начальный адрес равным 1000 (восьмеричное). Если осторожность не соблюдена, стек может разрушить передаваемую информацию до того, как она будет использована.

Пример.

Программа PRINT.SAV загружается из программы GO.SAV с помощью макрокоманды .CHAIN.

;       ПРОГРАММА GO.SAV
;       ----------------
;
        .MCALL  .CHAIN,.TTYIN,.DBLK,.CTRLT
        .CTRLT                      ; определить управля-
                                    ; ющие символы
                                    ; (здесь LF)
START:  MOV     #500,R1
        MOV     #FILE,R2
        .REPT   4
        MOV     (R2)+,(R1)+         ; имя файла в 500-507
        .ENDR
:     .TTYIN                      ; занесение символов с
        MOVB    R0,(R1)+            ; TT: в область 510-777
        CMPB    R0,#LF              ; вся строка введена?
        BNE                       ; нет
        CLRB    -(R1)               ; да
        .CHAIN                      ; запуск программы PRINT
FILE:   .DBLK   SY,PRINT,SAV        ; имя устройства и файла
        .END    START
         
;       ПРОГРАММА PRINT
;       ---------------
;
        .MCALL  .PRINT,.EXIT
BUF = 510
START:  .PRINT  #MSG                ; печать сообщения
        .PRINT  #BUF                ; печать области 510-777
        .PRINT  #MSG1               ; печать сообщения
        .EXIT
MSG:    .ASCII  /НАЧАЛО ПЕЧАТИ СООБЩЕНИЯ ИЗ /
        .ASCIZ  /ОБЛАСТИ 510-777/
MSG1:   .ASCIZ  /КОНЕЦ ПЕЧАТИ/
        .EVEN
        .END    START

7.6.2. МАКРОКОМАНДА .CNFDF

Системная макрокоманда .CNFDF определяет символы и мнемонические обозначения разрядов слов конфигурации системы.

Формат макрокоманды:

.CNFDF

Расширение макрокоманды:

 CONFIG  =^O300
FBMON¤  =^O1
HWDSP¤  =^O4
BATCH¤  =^O10
CLK50¤  =^O40
HWFPU¤  =^O100
FJOB¤   =^O200
GTLNK¤  =^O400
USR¤    =^O1000
LSI¤    =^O4000
MMU¤    =^O10000
LKCS¤   =^O20000
KW¤P    =^O40000
CLOCK¤  =^O100000
CONFG2  =^O370
CACHE¤  =^O1
MPTY¤   =^O2
SWREG¤  =^O4
LIGHT¤  =^O10
EIS¤    =^O400
VS6¤0   =^O1000
TYP70¤  =^O40000
TYP60¤  =^O100000
SYSGEN  =^O372
ERLG¤   =^O1
MMGT¤   =^O2
TIMIT¤  =^O4
MPTY¤   =^O1000
TIMER¤  =^O2000
ESCP¤   =^O14000
MTTY¤   =^O20000

Данная макрокоманда кодов EMT не генерирует, а является чисто описательной.

Примечание. Переменной MPTY¤ значение присваивается дважды, как они разрешали этот конфликт, непонятно, или просто не использовали первое значение по назначению.

Ошибки отсутствуют.

В следующем примере определяется резидентность USR.

Пример.

        .MCALL  .CNFDF,.EXIT,.PRINT,.GVAL
        .CNFDF                     ;определить мнемонику
                                   ;смещения монитора
                                   ;CONFIG (300) и его
                                   ;битов (здесь USR¤)
START:  .GVAL   #AREА,#CONFIG      ;получить содержимое
                                   ;смещения CONFIG в R0
        BIT     R0,#USR¤           ;бит USR¤ установлен?
        BEQ                      ;нет
        .PRINT  #MSG               ;да...печать сообщения
        BR      
:     .PRINT  #MSG1              ;печать сообщения
:     .EXIT
AREA:   .BLKW   2                  ;блок аргументов EMT
MSG:    .ASCIZ  /USR НЕ РЕЗИДЕНТНА/
MSG1:   .ASCIZ  /USR РЕЗИДЕНТНА/
        .EVEN
        .END    START

7.6.3. МАКРОКОМАНДА .CTRLT

Системная макрокоманда .CTRLT определяет символьные обозначения управляющих символов (имеющих коды 0-37)

Формат макрокоманды:

.CTRLT

Расширение макрокоманды:

NUL     =^O000
SOH     =^O001
STH     =^O002
ETX     =^O003
EOT     =^O004
ENQ     =^O005
ACK     =^O006
BEL     =^O007
BS      =^O010
HT      =^O011
LF      =^O012
VT      =^O013
FF      =^O014
CR      =^O015
SO      =^O016
SI      =^O017
DLE     =^O020
DC1     =^O021
DC2     =^O022
DC3     =^O023
DC4     =^O024
NAK     =^O025
SYN     =^O026
ETB     =^O027
CAN     =^O030
EM      =^O031
SUB¤    =^O032
ESC     =^O033
FS      =^O034
GS      =^O035
RS      =^O036
US      =^O037

Данная макрокоманда кодов EMT не генерирует, а является чисто описательной.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .CHAIN.

7.6.4. МАКРОКОМАНДА .DATE

Системная макрокоманда .DATE передаёт информацию о текущей дате в R0:

Формат макрокоманды:

.DATE

Формат регистра R0:

R0 =>

12

0

Если после выполнения макрокоманды R0 = 0, то это означает, что дата не была введена пользователем.

Примечание. ОС БК-11 не производит проверку на корректность указанной даты (конец месяца и года). Например, пользователь может ввести такую дату как 31 февраля. Необходимо точно вычислять в программе год и первый день каждого месяца.

Ошибки отсутствуют.

В примере приведена подпрограмма обработки даты, введённой пользователем командой монитора DATE.

Пример

; ОБРАЩЕНИЕ К ПОДПРОГРАММЕ:
;           JSR PC,DATE
; РЕЗУЛЬТАТ: R0 = МЕСЯЦ (1-12)
;            R1 = ЧИСЛО (1-31)
;            R2 = ГОД (ПО МОДУЛЮ 100)
; ОШИБКИ: R0=0, ЕСЛИ ДАТА НЕ ВВЕДЕНА ПОЛЬЗОВАТЕЛЕМ
;
        .MCALL .DATE,.POP,.PUSH
DATE:
        .PUSH   R2,R1,R0        ; СОХРАНИТЬ РЕГИСТРЫ
        .DATE                   ; ВЫБРАТЬ ДАТУ
        MOV     R0,R2           ; ВВЕДЕНА?
        BEQ                   ; НЕТ
        BIC     #^C37,R2        ; ВЫБРАТЬ ГОД В R2
        ADD     #72.,R2
        MOV     R0,R1           ; ВЫБРАТЬ ЧИСЛО
        ASL     R1
        ASL     R1
        ASL     R1
        SWAB    R1
        BIC     #^C37,R1
        SWAB    R0              ; ВЫБРАТЬ МЕСЯЦ
        ASR     R0
        ASR     R0
        BIC     #^C37,R0
:     .POP    R0,R1,R2        ; ВОССТАНОВИТЬ РЕГИСТРЫ
        RTS     PC
        .END

7.6.5. МАКРОКОМАНДА .DBLK

Системная макрокоманда .DBLK создаёт блок устройства для указанного файла в коде RADIX-50.

Формат макрокоманды:

 
.DBLK DEV,NAM,TYP

где

DEV

- имя устройства;

 

NAM

- наименование файла;

 

TYP

- расширение имени файла.

Данная макрокоманда кодов EMT не генерирует.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .CHAIN.

7.6.6. МАКРОКОМАНДА .DIR

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

Формат макрокоманды:

 
.DIR ADDR

где

ADDR

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

Таблица аргументов может быть расположена в любом месте программы пользователя.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .SYNCH.

7.6.7. МАКРОКОМАНДА .DSTATUS

Системная макрокоманда .DSTATUS передаёт системные характеристики устройства в программу пользователя.

Формат макрокоманды:

 
.DSTATUS ADDR,DNAM

где

ADDR

- адрес блока из 4 слов для информации о состоянии устройства;

 

DNAM

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

Имя устройства может быть логическим именем. Следует помнить, что эта макрокоманда может использоваться только для устройства, драйвер которого расположен на системном диске и о нём есть информация в системных таблицах монитора.

Пользователь получает следующую информацию:

слово 1 -

параметры устройства (драйвера);

слово 2 -

размер драйвера в байтах;

слово 3 -

адрес загрузки драйвера (соответствует адресу загрузки+6); равен 0, если драйвер не загружен в память;

слово 4 -

размер устройства в блоках; ноль - для устройства последовательного доступа. Последний блок на устройстве равен минус единице.

Слово параметров устройства содержит:

бит 15 -

если сброшен, устройство последовательного доступа (например, LP, TT, CT и т.д.), иначе устройство прямого доступа (например, BY);

бит 14 -

если установлен, то устройство только для чтения (например, PR);

бит 13 -

если установлен, то устройство только для записи (например, LP);

бит 12 -

если установлен, то устройство с нестандартной файловой структурой (например, CT);

бит 11 -

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

бит 10 -

если сброшен, то макрокоманда .SPFUN запрещена, иначе драйвер может выполнять макрокоманду .SPFUN;

биты 0-7 -

номер, определяющий тип устройства.

Ниже перечислены номера устройств, используемых в ОС БК-11:

3

- устройство печати параллельного типа (LP);

4

- системный терминал (TT);

13

- накопитель на кассетной ленте (CT);

Ошибки:

Код

Пояснение

0

Устройство не обнаружено в системных таблицах монитора.

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

Пример.

        .MCALL  .DSTATUS,.PRINT,.EXIT,.FETCH,.RELEAS
START:  .DSTATUS #CODE,#FTPR        ;получить информацию
                                    ;об устройстве
        BCC     
        .PRINT  #MSG
        .EXIT
:     TST     CODE+4              ;уже загружен?
        BNE                       ;да
        .FETCH  #DRVR,#FTPR         ;нет ... загрузить
                                    ;драйвер
        BCC     
        .PRINT  #MSG1
        .EXIT
:     .PRINT  #MSG2               ;печать сообщения
        .EXIT
:     .RELEAS #FTPR               ;выгрузить драйвер
        BCC     
        .PRINT  #MSG1
        .EXIT
:     .PRINT  #MSG4               ;печать сообщения
        .EXIT
CODE:   .BLKW   4                   ;блок информации
FTPR:   .RAD50  /RK0/               ;имя устройства
        .RAD50  /FILE  MAC/         ;имя файла
MSG:    .ASCIZ  /УСТРОЙСТВО ОТСУТСТВУЕТ/
MSG1:   .ASCIZ  /ОШИБКА FETCH/
MSG2:   .ASCIZ  /ДРАЙВЕР РЕЗИДЕНТЕН/
MSG3:   .ASCIZ  /ОШИБКА RELEAS/
MSG4:   .ASCIZ  /ДРАЙВЕР ВЫГРУЖЕН/
        .EVEN
DRVR = .                            ;адрес загрузки
                                    ;драйвера
        .END    START

7.6.8. МАКРОКОМАНДА .EXIT

Системная макрокоманда .EXIT вызывает окончание программы пользователя.

Формат макрокоманды:

.EXIT

Все незавершённые макрокоманды .MRKT аннулируются. Все макрокоманды ввода/вывода и подпрограммы завершения, выполняемые для данного задания, заканчиваются нормально.

Если при выполнении макрокоманды .EXIT R0=0, то выполняется подразумеваемая макрокоманда .HRESET, запрещая последующее выполнение команд монитора REENTER, START, CLOSE.

Макрокоманда .EXIT позволяет программе пользователя передавать в ячейки 500-777 командные строки для KMON, которые выполняются после завершения задания. Операция выполняется следующим образом:

При передаче командных строк для KMON имеются следующие ограничения:

Примечание. Программа пользователя сама обеспечивает целостность данных, передаваемых KMON во время выполнения макрокоманды .EXIT. Необходимо, чтобы эта область не портилась стеком пользователя. Если макрокоманда .EXIT используется для передачи командных строк для KMON, указатель строк будет инициализирован и установлен равным 1000 (восьмеричное) перед завершением программы.

Ошибки отсутствуют.

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

Пример.

        .MCALL  .EXIT,.JSWDF
        .JSWDF                     ;определить мнемонику
                                   ;JSW и его битов
                                   ;(здесь CHNIF¤)
START:  MOV     #510,R0
        MOV     #CMDSTR,R1
:     MOV     (R1)+,(R0)+
        CMP     R1,#CMDEND
        BLO     
        BIS     #CHNIF¤,@#JSW      ;установить бит CHNIF¤
        CLR     R0
        .EXIT
CMDSTR: .WORD   CMDEND-CMDSTR      ;длина командной
                                   ;строки
        .ASCIZ  "DIRECT/FULL *.*"  ;командная строка
CMDEND:
        .EVEN
        .END    START

7.6.9. МАКРОКОМАНДЫ .FETCH/.RELEAS

Системная макрокоманда .FETCH (.RELEAS) используется для загрузки (удаления) в оперативную память драйвера устройства во время работы программы.

7.6.9.1. МАКРОКОМАНДА .FETCH

Системная макрокоманда .FETCH загружает драйвер с системного устройства в оперативную память.

Формат макрокоманды:

 
.FETCH ADDR,DNAM

где

ADDR

- адрес, куда должен загружаться драйвер устройства;

 

DNAM

- адрес слова, содержащего имя устройства в коде RADIX-50.

Адрес в памяти для загрузки драйвера пересылается в стек. После выполнения макрокоманды .FETCH R0 содержит адрес первой свободной ячейки выше драйвера. Если драйвер уже в памяти, то R0 содержит тот же адрес, что и находящийся в стеке. Если значение в стеке < 400 (восьмеричное), то для драйвера выполняется макрокоманда .RELEAS.

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

.CLOSE

.LOOKUP

.ENTER

.RENAME

.SPFUN

.DELFT

.READ

.READC

.READW

.WRITE

.WRITC

.WRITW

Примечание. Операции ввода/вывода не могут быть выполнены, если не загружен драйвер устройства.

Ошибки:

Код

Пояснение

0

Устройство отсутствует в системных таблицах монитора; на системном диске нет драйвера этого устройства.

Пример приведён при описании макрокоманды .DSTATUS.

7.6.9.2. МАКРОКОМАНДА .RELEAS

Системная макрокоманда .RELEAS удаляет указанный драйвер из оперативной памяти.

Формат макрокоманды:

 
.RELEAS DNAM

где

DNAM

- адрес слова, содержащего имя устройства в коде RADIX-50.

После макрокоманды .RELEAS, чтобы вновь использовать устройство, необходимо выполнить макрокоманду .FETCH.

Примечание. Макрокоманда .RELEAS не удаляет драйвер, загруженный командой монитора LOAD. Это можно сделать только командой монитора UNLOAD или перезагрузив систему.

Макрокоманда .RELEAS игнорируется, если:

Ошибки:

Код

Пояснение

0

Устройство с указанным именем отсутствует в системных таблицах монитора.

Пример приведён при описании макрокоманды .DSTATUS.

7.6.10. МАКРОКОМАНДА .GVAL

Системная макрокоманда .GVAL возвращает в R0 содержимое указанной ячейки монитора.

Формат макрокоманды:

 
.GVAL AREA,OFFSET

где

AREA

- адрес таблицы аргументов EMT из двух слов;

 

OFFSET

- смещение нужной ячейки от начала монитора.

Формат таблицы аргументов EMT:

R0 => AREA:

34

0

 

OFFSET

Макрокоманда .GVAL используется только для чтения и обеспечивает сохранность информации в мониторе.

Примечание. Для смещений рекомендуется пользоваться мнемоникой, полученной с помощью макрокоманды .ROFDF.

Ошибки:

Код

Пояснение

0

Смещение выходит за пределы резидентного монитора.

В примере пользователь получает номер версии монитора в ячейке MONVER и номер коррекции монитора в ячейке MONUPD.

Пример.

        .MCALL  .GVAL,.EXIT,.ROFDF
        .ROFDF                  ; получить мнемонику
                                ; смещений монитора
                                ; (здесь SYSVER)
START:  .GVAL   #AREA,#SYSVER   ; получить в R0 содер-
                                ; жимое ячейки монитора
        MOVB    R0,MONVER       ; получить номер версии
        SWAB    R0
        MOVB    R0,MONUPD       ; получить номер коррекции
        .EXIT
MONVER: .BLKB
MONUPD: .BLKB
AREA:   .BLKW   2               ; блок аргументов EMT
        .END    START

7.6.11. МАКРОКОМАНДЫ .HERR/.SERR

Макрокоманды .HERR/.SERR используются для управления (запрещения или разрешения) обработкой серьёзных ошибок в программе пользователя.

7.6.11.1. МАКРОКОМАНДА .HERR

Системная макрокоманда .HERR запрещает обработку серьёзных ошибок в программе пользователя. Эта макрокоманда используется по умолчанию.

Формат макрокоманды:

.HERR

Формат регистра R0:

R0 = >

5

0

Системная макрокоманда .HERR разрешает системе удалять программу по серьёзной ошибке и выдавать сообщение об ошибке на терминал.

Ошибки:

Обработку ошибок производит монитор.

7.6.11.2. МАКРОКОМАНДА .SERR

Системная макрокоманда .SERR позволяет программе обрабатывать серьёзные ошибки и запрещает монитору прекращать её выполнение в случае их появления.

Формат макрокоманды:

.SERR

Формат регистра R0:

R0 =>

4

0

Во время выполнения программы могут возникнуть серьёзные ошибки. Например, попытка осуществить ввод/вывод на устройство, не имеющее драйвера в памяти, или попытка загрузить драйвер устройства на место USR. Обычно эти ошибки вызывают прерывание выполнения программы с сообщением об ошибке на системный терминал. Однако, в некоторых случаях необходимо предотвратить преждевременное окончание программы из-за этих ошибок.

После выполнения макрокоманды устанавливается бит "C", а байт 52 содержит отрицательный код ошибки.

В некоторых случаях, например, при выполнении макрокоманд .LOOKUP и .ENTER, макрокоманда .SERR оставляет открытыми каналы. Поэтому пользователю самому необходимо выполнить нужную макрокоманду .PURGE или .CLOSE для этих каналов.

Ошибки:

Код

Пояснение

-1

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

-2

Отсутствует драйвер устройства, а для данной операции он необходим;

-3

Ошибка чтения/записи каталога;

-4

Ошибка .FETCH; либо произошла ошибка во время считывания драйвера, либо попытка загрузить драйвер на место RMON или USR;

-5

Ошибка считывания оверлея;

-6

В каталоге нет места для файлов;

-7

Недопустимый адрес (только при работе FB-монитора); попытка выполнить действие вне области задания;

-10

Недопустимый номер канала; номер больше, чем фактическое количество существующих каналов;

-11

Недопустимая EMT, недопустимый код функции.

Системная макрокоманда .SERR не обрабатывает прерывания по векторам 4 и 10, а так же прерывание от процессора с плавающей запятой. Они обрабатываются системными макрокомандами .TRPSET и .SPFA.

В примере для макрокоманды .ENTER требуется драйвер PC:, который не загружен в память. После выполнения макрокоманды .SERR обработка ошибок происходит в программе, а после выполнения макрокоманды .HERR происходит выход до ошибке в монитор.

Пример

        .MCALL  .ENTER,.HERR,.SERR,.PRINT,.EXIT,.USBDF
START:  .SERR                       ; запретить прерывание
                                    ; программы по ошибке
        .USBDF                      ; определить мнемонику
                                    ; статуса завершения
                                    ; программы USERRB
        .ENTER  #AREA,#1,#FILE      ; открыть файл на PC: 
        BCC     
        JSR     PC,ERR              ; идти на обработку
                                    ; ошибки
        .HERR                       ; разрешить прерывание
                                    ; программы по ошибке
        .ENTER  #AREA,#1,#FILE      ; открыть файл на PC:
        BCS     ERR1
:     .EXIT
ERR1:   .PRINT  #MSG
        .EXIT
MSG:    .ASCIZ  /ОШИБКА .ENTER/
        .EVEN
ERR:    MOVB    @#52,R0             ; подпрограмма обработки
        NEG     R0                  ; ошибок
        DEC     R0
        ASL     R0
        MOV     COD(R0),R0
        .PRINT
        BISB    #3,@#USERRB         ; установить завершение
                                    ; с грубой ошибкой
        RTS PC
COD:    .WORD   С1
        .WORD   C2
        .WORD   С3
        .WORD   C4
        .WORD   C5
        .WORD   C6
        .WORD   C7
        .WORD   C10
        .WORD   C11
C1:     .ASCIZ  /USR?/
C2:     .ASCIZ  /HE ЗАГРУЖЕН ДРАЙВЕР/
C3:     .ASCIZ  /ОШИБКА ЧТЕНИЯ КАТАЛОГА/
С4:     .ASCIZ  /ОШИБКА .FETCH/
С5:     .ASCIZ  /ОВЕРЛЕЙ?/
C6:     .ASCIZ  /НЕТ МЕСТА В КАТАЛОГЕ/
С7:     .ASCIZ  /ОШИБКА АДРЕСАЦИИ/
С10:    .ASCIZ  /НЕВЕРЕН НОМЕР КАНАЛА/
С11:    .ASCIZ  /НЕВЕРЕН КОД EMT/
        .EVEN
AREA:   .BLKW   4                   ; Блок аргументов EMT
FILE:   .RAD50  /PC/
        .WORD   0,0,0
        .END    START

7.6.12. МАКРОКОМАНДЫ .HRESEТ/.SRESEТ

Макрокоманды .HRESET/.SRESET используется для прекращения операции ввода/вывода, очищения очереди подпрограмм завершения, удаления из памяти драйверов устройств.

7.6.12.1. МАКРОКОМАНДА .HRESET

Системная макрокоманда .HRESET очищает каналы ввода/вывода, освобождает драйверы устройств, загруженные в оперативную память по макрокоманде .FETCH, и прекращает все операции ввода/вывода.

Формат макрокоманды:

.HRESET

Системная макрокоманда .HRESET не используется для сброса аппаратных ошибок.

Системная макрокоманда .HRESET действительна только для своего задания. Операции ввода/вывода для других программ продолжают выполняться.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .CDFN.

7.6.12.2. МАКРОКОМАНДА .SRESET

Системная макрокоманда .SRESET инициализирует определённые таблицы монитора, связанные с программой: освобождает каналы, очищает очередь подпрограмм завершения, удаляет загруженные драйверы.

Формат макрокоманды:

.SRESET

Драйверы системных устройств и драйверы, загруженные командой монитора LOAD, остаются резидентными.

Возвращает к использованию только 16 (десятичное) каналов ввода/вывода. Любые каналы, открытые системной макрокомандой .CDFN, исключаются.

Чтобы открыть больше 16 каналов после выполнения .SRESET, необходимо повторить макрокоманду .QSET или .CDFN.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .RCTRLO.

7.6.13. МАКРОКОМАНДА .INTEN

Системная макрокоманда .INTEN сообщает монитору о возникшем прерывании, переключает, работу в состояние "система" (в системный режим), устанавливает требуемый приоритет процессора и сохраняет содержимое регистров R4 и R5 перед передачей управления подпрограмме обслуживания прерываний. Любые другие регистры при необходимости должны сохраняться пользователем.

Формат макрокоманды:

 
.INTEN PRIO[,PIC]

где

PRIO

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

 

PIC

- необязательный аргумент.

Аргумент PIC указывает, что подпрограмма обработки прерываний написана в позиционно-независимом коде, иначе он должен отсутствовать. Аргумент обязателен для подпрограмм обработки прерываний в драйвере.

Все внешние прерывания переводят приоритет процессора на 7-й уровень. Макрокоманда .INTEN понижает приоритет процессора до требуемой величины.

Выход из программы обработки прерывания, которая использовала макрокоманду .INTEN, осуществляется по RTS PC.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .SYNCH.

7.6.14. МАКРОКОМАНДА .JSWDF

Системная макрокоманда .JSWDF определяет символы и мнемонические обозначения разрядов слова состояния программы.

Формат макрокоманды:

.JSWDF

Расширение макрокоманды:

JSW     =^O44
USWAP¤  =^O100000
TTLC¤   =^O40000
RSTRT¤  =^O20000
TTSPC¤  =^O10000
CHNIF¤  =^O4000
VIRT¤   =^O2000
OVLY¤   =^O1000
CHAIN¤  =^O400
HLTER¤  =^O200
TCBIT¤  =^O100
ESCFL¤  =^O40
ESCSQ¤  =^O20
GTLIN¤  =^O10

Данная макрокоманда не генерирует кодов EMT, а является чисто описательной.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .EXIT.

7.6.15. МАКРОКОМАНДЫ .LOCK/.UNLOCK

Макрокоманды .LOCK/.UNLOCK используются для управления USR из программы пользователя - загрузка USR в указанную область памяти и удаление из памяти.

Макрокоманда .LOCK/.UNLOCK запрещает повторное считывание программы пользователя, поэтому необходимо. Чтобы её вызов не исходил из области, которая будет выгружаться в файл свопинга USR. В этой области не должна также содержаться информация для макрокоманд, требующих вызов USR.

Не следует разрушать область USR (даже если она не нужна) после выполнения макрокоманды .LOCK, т.к. это приведёт к непредвиденным результатам при выполнении макрокоманды .UNLOCK.

Число макрокоманд .LOCK и .UNLOCK должно совпадать. Если дано больше запросов .LOCK, то USR остаётся резидентной в памяти. Если дано больше запросов .UNLOCK в программе, то они игнорируются.

7.6.15.1. МАКРОКОМАНДА .LOCK

Системная макрокоманда .LOCK загружает USR (если она не загружена) и делает её резидентной в оперативной памяти.

Формат макрокоманды:

.LOCK

При загрузке USR возможны следующие ситуации:

Ошибки отсутствуют.

7.6.15.2. МАКРОКОМАНДА .UNLOCK

Системная макрокоманда .UNLOCK отменяет запрещение свопинга USR, заданное макрокомандой .LOCK.

Формат макрокоманды:

.UNLOCK

Если макрокоманда .LOCK требовала свопинг, то .UNLOCK загружает программу пользователя обратно в память.

Если USR не требует свопинга, то .UNLOCK игнорируется.

Если выполнено больше макрокоманд .UNLOCK, чем макрокоманд .LOCK, то лишние макрокоманды игнорируются.

Ошибки отсутствуют.

В примере макрокомандой .SETTOP запрашивается вся память, что приводит к нерезидентности USR. Перед открытием канала, макрокомандой .LOCK USR заносится в память и становится резидентной, т.е. при выполнении макрокоманд .LOOKUP свопинга не происходит. После выполнения макрокоманды .UNLOCK USR снова становится нерезидентной.

Пример.

        .MCALL  .LOCK,.UNLOCK,.SETTOP,.SCMDF
        .MCALL  .LOOKUP,.PRINT,.EXIT
START:  .SCMDF                      ;определить мнемонику
                                    ;системной области связи 
                                    ;(здесь SYSPTR)
        .SETTOP @#SYSPTR            ;запросить всю память
        .LOCK                       ;вызов USR в память
        .LOOKUP #AREА,#0,#DEV1      ;использование USR
        BCS     
        .LOOKUP #AREA,#1,#DEV2
        BCS     
        .UNLOCK                     ;удалить USR из памяти
        .EXIT
:     .PRINT  #MSG .EXIT
MSG:    .ASCIZ  /ОШИБКА .LOOKUP/
        .EVEN
AREA:   .BLKW   3                   ;блок аргументов EMT
DEV1:   .RAD50  /SY PASCALSAV/
DEV2:   .RAD50  /SY EDIT  SAV/
        .END    START

7.6.16. МАКРОКОМАНДЫ .MFPS/.MTPS

Макрокоманды .MFPS/.MTPS используются для получения информации о текущем приоритете процессора или для его коррекции.

Содержимое регистра R0 сохраняется при выполнении любой из макрокоманд.

7.6.16.1. МАКРОКОМАНДА .MFPS

Системная макрокоманда .MFPS используется для считывания разрядов приоритета из слова состояния процессора.

Формат макрокоманды:

 
.MFPS ADDR

где

ADDR

- адрес, в который помещается значение приоритета. Если адрес отсутствует, значение помещается в стек.

Примечание. Коды условий разрушаются в процессе выполнения макрокоманды. Поэтому нельзя использовать эту макрокоманду для определения кодов условий. Используйте обычные инструкции перехода.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .MTPS

7.6.16.2. МАКРОКОМАНДА .MTPS

Системная макрокоманда .MTPS устанавливает разряды приоритета и T-бит в слове состояния процессора.

Формат макрокоманды:

 
.MTPS ADDR

где

ADDR

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

Ошибки отсутствуют.

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

Пример.

        .MCALL  .MFPS,.MTPS,.EXIT
START:  JSR     PC,PICKQ
        NOP
        NOP
        NOP
        .EXIT
PICKQ: .MFPS                   ;сохранить приоритет
                               ;в стеке
        MOV     #QHEAD,R4
        .MTPS   #340           ;установить приоритет 7
        MOV     @R4,R5
        BEQ     
        MOV     @R5,@R4
        .MTPS                  ;восстановить приоритет
                               ;из стека
        CLZ
:     RTS     PC
QHEAD:  .WORD   Q1
Q1:     .WORD   Q2,0,0
Q2:     .WORD   Q3,0,0
Q3:     .WORD   0,0,0
        .END    START

7.6.17. МАКРОКОМАНДЫ .POP/.PUSH

Макрокоманды .POP/.PUSH используются для извлечения или сохранения в стеке необходимой информации.

7.6.17.1. МАКРОКОМАНДА .POP

Системная макрокоманда .POP выбирает значения из стека и помещает их в указанные адреса.

Формат макрокоманды:

 
.POP ADDR

где

ADDR

- адрес, в который помещается значение из стека.

Несколько адресов должны заключаться в угловые скобки.

Например:

.POP    <ADR1,ADR2,...,ADRN>

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .DATE.

7.6.17.2. МАКРОКОМАНДА .PUSH

Системная макрокоманда .PUSH заносит содержимое указанных аргументов в стек.

Формат макрокоманды:

 
.PUSH ADDR

где

ADDR

- аргумент, значение которого необходимо занести в стек.

Несколько аргументов заключаются в угловые скобки.

Например:

.PUSH   <ADR1,ADR2,...,ADRN>

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .DATE.

7.6.18. МАКРОКОМАНДА .QSET

Системная макрокоманда .QSET увеличивает длину очереди элементов ввода/выводаб подпрограмм завершения и т.п.

Формат макрокоманды:

 
.QSET ADDR,LEN

где

ADDR

- начальный адрес области для новых элементов очереди;

 

LEN

- число новых элементов очереди.

Каждый элемент очереди занимает семь слов, следовательно, область, отводимая для очереди, должна равняться LEN*7. А в XM/TS-мониторах - десять слов.

Для работы программы, независимо от типа монитора, необходимо выделить максимальный размер области для элемента очереди (10 слов). После выполнения макрокоманды в R0 возвращается действительный верхний адрес этой области.

Макрокоманда .QSET может вызываться столько раз, сколько требуется.

Область для элементов очереди резервируется пользователем. Необходимо следить, чтобы программа не изменяла элементы, если они уже установлены. После выполнения макрокоманды R0 содержит адрес первого слова после области элементов очереди.

Макрокоманды .SRESET и .HRESET отменяют все очереди элементов, определённые пользователем. После них необходимо повторить макрокоманду .QSET, чтобы снова определить область для элементов очереди.

Элементы очереди, заданные макрокомандой .QSET не должны перекрываться с областью, в которую обменивается USR, и располагаться в оверлейной области.

Нижеперечисленные макрокоманды требуют элемент очереди:

.READ

.READC

.READW

.WRITE

.WRITC

.WRITW

.RCWD

.RCVDC

.RCVDW

.SDAT

.SDATC

.SDATW

.TWAIT

.MRKT

 

Ошибки в SJ-мониторе отсутствуют.

Пример приведён при описании макрокоманды .MRKT.

7.6.19. МАКРОКОМАНДА .RCTRLO

Системная макрокоманда .RCTRLO разрешает вывод на системный терминал (сбрасывает флаг <СУ/O>).

Формат макрокоманды:

.RCTRLO

Команда <СУ/O>, введённая с терминала, запрещает вывод на терминал. Разрешить вывод на терминал можно повторным введением <СУ/O> с терминала или с помощью макрокоманды .RCTRLO.

Ошибки отсутствуют.

В примере пользователь с клавиатуры терминала запрещает вывод на терминал. В программе макрокоманда .RCTRLO разрешает вывод на терминал, о чем указывает появление звёздочки на экране.

Пример.

        .MCALL  .RCTRLO,.CSIGEN,.EXIT,.SRESET
START:  .RCTRLO                     ; разрешить вывод на TT:
        .CSIGEN #DSPACE,#DEXT,#0    ; ввести командную
                                    ; строку
        BCS     NSCI
        .READW  #AREA,#3,#BUF,#256.,#0  ; читать
        BCS     NRE
        .WRITW  #AREA,#0,#BUF,#256.,#0  ; записать
        BCS     NWR
        .SRESET
        JMP     START
NCSI:   .PRINT  #MSG
        .EXIT
NRE:    .PRINT  #MSG1
        .EXIT
NWR:    .PRINT  #MSG2
        .EXIT
MSG:    .ASCIZ  /ОШИБКА CSI/
MSG1:   .ASCII  /ОШИБКА READ/
MSG2:   .ASCIZ  /ОШИБКА WRITE/
        .EVEN
DEXT:   .WORD   0,0,0,0             ; блок расширений
AREA:   .BLKW   5                   ; блок аргументов EMT
BUF:    .BLKW   256.                ; буфер ввода/вывода
DSPACE =.                           ; адрес загрузки
                                    ; драйверов
        .END    START

7.6.20. МАКРОКОМАНДА .ROFDF

Системная макрокоманда .ROFDF определяет мнемонические смещения полезных ячеек резидентного монитора.

Формат макрокоманды:

.ROFDF

Расширение макрокоманды:

¤USRLC  =^O266
QCOMP   =^O270
SPUSR   =^O272
SYUNIT  =^O275
SYSVER  =^O276
SYSUPD  =^O277
TTKS    =^O304
TTKB    =^O306
TTPS    =^O310
TTPB    =^O312
MAXBLK  =^O314
SYSCH   =^O324
GTVEC   =^O354
¤MTPS   =^O360
¤MFPS   =^O362
STATWD  =^O366
USRAREA =^O374
IFMXNST =^O377
EMTRTN  =^O400
FORK    =^O402

Данная макрокоманда не генерирует кодов EMT, а является чисто описательной.

Ошибки отсутствуют.

7.6.21. МАКРОКОМАНДА .SCCA

Системная макрокоманда .SCCA запрещает завершение программы по команде оператора <СУ/C>, даёт возможность программе различать одинарную и двойную команды <СУ/C>.

Формат макрокоманды:

 
.SCCA AREA,ADDR

где

AREA

- адрес таблицы аргументов EMT из двух слов;

 

ADDR

- адрес, предназначенный для слова состояния терминала (резервируется пользователем).

Формат таблицы аргументов EMT:

R0 => AREA:

35

0

 

ADDR

Системная макрокоманда .SCCA перехватывает и временно запрещает команду оператора <СУ/C>, препятствуя завершению программы. Символы <СУ/C> воспринимаются как обычные символы без специальных системных функций и помещаются во входной буфер.

При этом, если появляется двойная команда <СУ/C> устанавливается 15 бит слова состояния терминала (ADDR). Пользователь должен сам очищать его для дальнейшего использования.

Макрокоманда .SCCA не влияет на <СУ/C> из командного файла.

Если ADDR=0, то макрокоманда .SCCA игнорируется. В этом случае программа прерывается по <СУ/C>, если ожидает ввода с терминала, и по двойному <СУ/C> в любом другом случае.

Ошибки отсутствуют.

В программе запрещается выход по <СУ/C> при вводе любой (включая <СУ/C>) информации с терминала. При вводе двойного <СУ/C> монитор устанавливает 15 бит для информирования программы. Для разрешения прерывания программы по двойному <СУ/C> необходимо выполнить макрокоманду с ADDR=0.

Пример.

        .MCALL  .SCCA,.PRINT,.TTYIN,.TTYOUT
JSW    = 44
TTSPC¤ = 10000
START:  MOV     #SCCA,R1
        .SCCA   #AREA,R1           ;запретить CTRL/C
        BIS     #TTSPC¤,@#JSW
        CLR     (R1)
        .PRINT  #MSG
:     TST     (R1)               ;двойное CTRL/C?
        BNE                      ;да
        .TTYTN                     ;нет...ввести символ
        .TTYOUT                    ;эхопечать
        BR      
:     .PRINT  #CTRLC
        .SCCA   #AREA,#0           ;разрешить прерывание
                                   ;по CTRL/C
        BR      .
SCCA:   .BLKW   1                  ;слово состояния
                                   ;терминала
AREA:   .BLKW   2                  ;блок аргументов EMT
MSG:    .ASCII  /ПРИМЕР МАКРОКОМАНДЫ .SCCA/<15><12>
        .ASCIZ  "ВВЕДИТЕ CTRL/C ДВА РАЗА"
        .EVEN
CTRLC:  .ASCII  "CTRL/C ВВЕДЕНА"<15><12>
        .ASCII  "ВВЕДИТЕ ДВОЙНОЕ CTRL/C ДЛЯ ВЫХОДА"
        .ASCIZ  / ИЗ ПРОГРАММЫ/
        .EVEN
        .END    START

7.6.22. МАКРОКОМАНДА .SCMDF

Системная макрокоманда .SCMDF определяет мнемонические обозначения системной области связи.

Формат макрокоманды:

.SCMDF

Расширение макрокоманды:

 USERPC  =^O40
USERSP  =^O42
UFLOAT  =^O46
USERTOP =^O50
SYSPTR  =^O54
TTFILL  =^O56
TTNFIL  =^O57

Данная макрокоманда не генерирует кодов EMT, а является чисто описательной.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .UNLOCK.

7.6.23. МАКРОКОМАНДА .SETTOP

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

Формат макрокоманды:

 
.SETTOP ADDR

где

ADDR

- адрес слова, содержащего верхнюю границу программы. Если ADDR = -2, то запрашивается вся доступная программе память.

Монитор определяет допустимость этого адреса, необходимость свопинга в случае использования USR. Если верхняя граница памяти, запрашиваемая программой, расположена ниже начального адреса USR, то свопинг не производится, т.к. USR при этом не перекрывается. Если .SETTOP запрашивает верхнюю границу выше начального адреса USR, а команда "SET USR NOSWAP" не была выдана, то требуется свопинг.

По завершении системной макрокоманды .SETTOP R0 и ячейка 50 (восьмеричное) содержат максимальный адрес предоставляемой пользователю памяти. Если требуемый адрес превышает допустимую величину, то программе предоставляется допустимое значение.

Адрес в R0 или ячейке 50 используется программой как её абсолютный верхний адрес. Если это значение будет превышено, могут быть уничтожены части монитора и целостность системы будет нарушена.

При завершении работы программы монитор записывает части программы из файла свопинга в память и затем загружает KMON. Макрокоманда .SETTOP с нулевым адресом (ADDR = 0) запрещает считывание программы из файла свопинга перед загрузкой KMON. Эта процедура необходима для системной дискеты, если используются командные файлы для загрузки последовательности программ.

Ошибки отсутствуют.

7.6.24. МАКРОКОМАНДА .SPFA

Системная макрокоманда .SPFA предоставляет пользователям, имеющим процессор с плавающей запятой (в комплексах СМ-1420 или СМ-4/20), возможность обрабатывать прерывания по ошибке. В ОС БК-11 ясное дело - не доступна и не используется.

7.6.25. МАКРОКОМАНДА .SDTTM

Макрокоманда .SDTTM позволяет из программы пользователя установить в системе новые дату и время. В ОС БК-11 возможно не используется.

Формат макрокоманды:

 

.SDTTM AREA,ADDR

где

AREA

- адрес таблицы аргументов EMT из двух слов;

 

ADDR

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

Формат таблицы аргументов EMT:

R0 => AREA:

40

0

 

ADDR

Пользователь заносит в блок из трёх слов следующую информацию:

Слово 1 -

содержит новую системную дату во внутреннем формате (см. п. 7.6.4). Если это слово имеет отрицательное значение (соответствует некорректному значению даты), монитор игнорирует его. Значение этого слова должно быть отрицательным только в том случае, если необходимо изменить в системе только параметр "время". Если это слово имеет положительное значение, оно становится системной датой. Разряды 14 и 15 слова "системная дата" должны быть сброшены.

Слова 2 и 3 -

содержат младшие разряды (слово 2) и старшие разряды (слово 3) интервала времени во внутреннем формате. Это 32-разрядное значение времени после полуночи. Если слово 3 содержит отрицательное значение, новое время в системе не устанавливается. Необходимо записать отрицательное значение в это слово, если нужно изменить только системную дату. Если это слово положительное, устанавливается новое системное время. Для частоты питания 50 Гц слово 3 должно быть меньше или равно 101 (восьмеричное), а слово 2 меньше 165400 (восьмеричное).

Монитор не осуществляет проверку значения слов, содержащих системную дату и время на корректность записи (только проверяет эти слова на знак - отрицательное или положительное), поэтому пользователь должен сам в программе осуществлять эту проверку.

Примечание. Следует помнить, что коррекция даты и (или) времени при выполнении любой из макрокоманд типа .MRKT или .СМКТ может привести к непредсказуемым результатам.

Ошибки отсутствуют.

В следующем примере представлена подпрограмма коррекции времени на 1 час с учётом декретного времени.

Пример

; ВЫЗОВ ПОДПРОГРАММЫ ОСУЩЕСТВЛЯЕТСЯ ПО CALL ADDR,
; ГДЕ ADDR СООТВЕТСТВУЕТ OCT ИЛИ APR В ЗАВИСИМОСТИ
; ОТ ТРЕБУЕМОЙ КОРРЕКЦИИ
        .MCALL  .SDTTM,.PRINT,.EXIT,.GTIM
        .GLOBL  STD,DALITE
ОСТ:    COM     HR                  ; подготовка для умень-
        NEG     HR+2                ; шения времени на 1 час
APR:    .GTIM   #AREA,#TIME         ; получение тек. времени
        CALL    JADD                ; уход на подпрограмму
        .SDTTM  #AREA,#NEWDT        ; установка нового времени
        .GTIM   #AREA,#TIME         ; получение нового времени
        RETURN
NEWDT:  .WORD   -1                  ; дата
TIME:   .WORD   0,0                 ; время
HR:     .WORD   2                   ; значение 1 часа во
        .WORD   137440              ; внутреннем формате
AREA:   .WORD   0,0                 ;
JADD:   MOV     #HR,R4
        MOV     #AREA,R3
        MOV     #HR,R1
        MOV     -(R4),R2            ; коррекция младших
        ADD     -(R3),R2            ; разрядов
        MOV     -(R4),R5            ;
        ADC     R5                  ; если было переполнение
        ADD     -(R3),R5            ; коррекция стар. разрядов
        MOV     R2,-(R1)            ; сохранение нового
        MOV     R5,-(R1)            ; времени
        RETURN
        .END

7.6.26. МАКРОКОМАНДА .TRPSET

Системная макрокоманда .TRPSET позволяет пользователю самому обрабатывать прерывания по векторам 4 и 10. В ОС БК-11 возможно не используется.

Формат макрокоманды:

 

.TRPSET AREA, ADDR

где

AREA

- адрес таблицы аргументов из двух слов;

 

ADDR

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

Формат таблицы аргументов EMT:

R0 => AREA:

3

0

 

ADDR

Макрокоманда .TRPSET запрещает монитору удалять программу при возникновении прерываний по векторам 4 и 10.

Если при входе в программу обработки прерывания бит C сброшен, произошло прерывание по вектору 4, если бит C установлен, - прерывание по вектору 10.

Программа обработки прерывания должна заканчиваться инструкцией RTI. Перед этой инструкцией должна стоять макрокоманда .TRPSET.

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

Если прерывания происходят при выполнении подпрограммы обработки прерывания, выдаётся сообщение об ошибке и выполнение программы прерывается.

Если ADDR=0, макрокоманда .TRPSET игнорируется.

Ошибки отсутствуют.

В примере макрокоманда .TRPSET указывает адрес программы обработки "ловушек" 4 и 10.

Пример

        .MCALL  .TRPSET,.EXIT,.PRINT
START:  .TRPSET #AREA,#TRPLOC       ; запретить удалять
                                    ; программу
        MOV     #101,R0
        TST     (R0)+               ; нечетный адрес
        .WORD   67                  ; неверен код инструкции
        .EXIT
TRPLOC: MOV     R0,-(SP)            ; программa обработки
        BCS                       ; "ловушек"
        .PRINT  #TRP4
        BR      
:     .PRINT  #TRP10
:     .TRPSET #AREA,#TRPLOC
        MOV     (SP)+,R0
        RTI
AREA:   .BLKW   10                  ; блок аргументов EMT
TRP4:   .ASCIZ  /TRAP TO 4/
TRP10:  .ASCIZ  /TRAP TO 10/
        .EVEN
        .END    START

7.6.27. МАКРОКОМАНДА .USBDF

Системная макрокоманда .USBDF определяет мнемонические обозначения статуса завершения программы. В ОС БК-11 возможно не используется.

Формат макрокоманды:

.USBDF

Расширение макрокоманды:

ERRBYT  =^O52
USERRB  =^O53
SEVER¤  =^O10
ERROR¤  =^O4
WARN¤   =^O2
SUCCS¤  =^O1

Данная макрокоманда не генерирует коды EMT, а является чисто описательной.

Ошибки отсутствуют.

Пример приведён при описании макрокоманды .SERR.

7.7. МАКРОКОМАНДЫ ДЛЯ НАПИСАНИЯ ДРАЙВЕРОВ

Макрокоманды для написания драйверов описаны во второй части данного документа, 00008-01.33.01-2.

8. СИСТЕМНАЯ ОБЪЕКТНАЯ БИБЛИОТЕКА

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

Вызываемые из системной объектной библиотеки программы и функции должны иметь описатель FORTRAN. Вызов программ приводится в нотации фортрана. Для вызова из Паскаля ключевое слово CALL перед именем программы не указывается.

8.1. ОПЕРАЦИИ С КАТАЛОГАМИ

8.1.1. ПОДПРОГРАММЫ CLOSEC/ICLOSE

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

Обращение к подпрограмме CLOSEC:

 
CALL CLOSEC(CHAN[,I])

или

I=CLOSEC(CHAN)

Обращение к подпрограмме ICLOSE:

 
CALL ICLOSE(CHAN[,I])

или

I=ICLOSE(CHAN)

где

CHAN

- номер закрываемого канала; область памяти, в которой размещён этот параметр, не должна перекрываться при свопинге USR;

 

I

- содержит 0 или код ошибки; возвращаемой в случае попытки нарушения защиты файлов от удаления.

Подпрограммы CLOSEC или PURGE должны вызываться при определённых обстоятельствах для любого канала, открытого для ввода или вывода. Если в качестве параметра указан неоткрытый канал, вызов подпрограммы CLOSEC игнорируется.

Если подпрограмма CLOSEC применяется к файлу, открытому подпрограммой IENTER, происходит обновление каталога устройства, после чего файл становится постоянным. Если каталог устройства, связанного с указанным каналом, уже содержит файл с тем же именем и типом файла, то старый файл удаляется, а новый файл становится постоянным. Если уже существующий файл защищён от удаления, то выдаётся сообщение об ошибке. Применение подпрограммы CLOSEC к файлу, открытому вызовом LOOKUP, не вызывает изменения в каталоге.

Если созданный по IENTER файл закрывается подпрограммой CLOSEC, то его длина определяется количеством заполненных блоков, например, если файл записан в блок с номером 0, то длина файла 1, если в файл ничего не было записано, то ему соответствует длина 0. Если длина файла меньше размера зоны, выделенной во время выполнения вызова IENTER, то неиспользованные блоки на устройстве объявляются свободным пространством <UNUSED>.

Результаты:

I = 0

- обычный выход;

I = 4

- защищённый файл с таким именем уже существует на устройстве; выполняется подпрограмма CLOSEC; в результате на устройстве оказываются два файла с одним именем.

Пример показывает формирование и обработку файла из 56 блоков.

Пример.

      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.GE.0) GOTO 10
      GOTO (110,120,130) IABS(IERR)
10    . . .
      . . .
      CALL ICLOSE(ICHAN,IERR)
      IF (IERR.EQ.-4) GOTO 140
      CALL IFREEC(ICHAN)
      CALL EXIT
100   STOP 'НЕТ СВОБОДНЫХ КАНАЛОВ'
110   STOP 'КАНАЛ УЖЕ ИСПОЛЬЗУЕТСЯ'
120   STOP 'НА УСТРОЙСТВЕ МАЛО МЕСТА'
130   STOP 'УСТРОЙСТВО ЗАНЯТО'
140   STOP 'ЗАЩИЩЕННЫЙ ФАЙЛ УЖЕ СУЩЕСТВУЕТ'
      END

8.1.2. ФУНКЦИЯ IDELET

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

Обращение к функции:

 
I=IDELET(CHAN,DBLK[,SEGNUM])

где

CHAN

- номер канала, который будет использоваться для удаления файла, этот номер должен быть получен при помощи IGETC или, если предварительно была вызвана ICDFN, можно использовать каналы с номерами 16 (десятичное) и выше;

 

DBLK

- спецификация исключаемого файла (DЕV:FILNАM.TYP), состоящая из четырёх слов в коде RADIX-50;

 

SEGNUM

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

-1 -

это значение запрещает перемотку ленты в начало; поиск имени файла ведётся от текущего положения ленты; если текущее положение ленты неизвестно, то производится обратная перемотка до тех пор, пока не встретится метка EOF; запрещается использование любого другого отрицательного значения, т.к. все другие отрицательные значения зарезервированы;

0 -

при этом значении магнитная лента перематывается в начало, а затем движется вперёд, пока не будет найдено имя файла;

N -

любое положительное число; позиционирует магнитную ленту на файл с последовательным номером N на ленте; если последовательный номер файла (FSN) больше двух, то происходит предварительная перемотка в начало, а затем прямой поиск; если меньше двух, то происходит обратная перемотка к файлу.

После выполнения функции IDELET указанный канал освобождается. Функция IDELET требует, чтобы используемый драйвер устройства находился в оперативной памяти (это достигается с помощью вызова IFETCH или командой LOAD с терминала). Отметим, что если драйвер устройства не резидентен в ОЗУ, то происходит ошибка монитора. Более детально удаление файлов из каталога устройства описано в системной макрокоманде .DELETE.

Результаты функции:

I=0

- обычный выход;

I=1

- указанный канал уже открыт;

I=2

- указанный файл не найден;

I=3

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

I=4

- файл защищён и не может быть стёрт.

В примере файл под именем FTN5.DAT удаляется с устройства BY0:.

Пример.

      REAL*4 FILNAM(2)
      DATA FILNAM /6RBY0FТN,6R5  DAT/
      . . .
      I=IGETC()
      IF (I.LT.0) STOP 'НЕТ КАНАЛА'
      CALL IDELET(I,FILNAM)
      CALL IFREEC(I)

8.1.3. Функция IENTER

Функция IENTER выделяет область на указанном устройстве и формирует в каталоге носителя временную запись для названного файла, если на указанном устройстве уже существует файл с таким именем, то он не исключается до тех пор, пока временная запись в каталоге не будет преобразована в постоянную запись при помощи CLOSEC или ICLOSE. Этому временному файлу ставится в соответствие указанный номер канала. Подпрограмма IENTER при работе обращается к USR.

Обращение к функции:

 

 

I=IENTER(CHAN,DBLK,LENGTH[,SEGNUM])

где

CHAN

- номер канала (целое число), который связывается с файлом; этот номер должен быть получен при помощи IGETC или, если предварительно была вызвана ICDFN, можно использовать каналы с номерами 16 (десятичное) и выше;

 

DBLK

- спецификация файла, состоящая из четырёх слов в коде RADIX-50;

 

LENGTH

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

 

SEGNUM

- номер файла на кассетных накопителях на магнитных лентах; если этот параметр не указан, он принимается равным нулю; для магнитной ленты он описывает последовательный номер файла; параметр может иметь следующие значения:

-2 -

обозначает перемотку магнитной ленты в начало и поиск в прямом направлении пока не будет найдено имя файла или логический конец ленты (LEOT);

-1 -

обозначает перемещение к записи LEOT и открытие выходного файла;

0 -

обозначает перемотку ленты в начало и просмотр в прямом направлении пока не будет найдено имя файла или не обнаружен LEOT; если имя файла будет найдено, генерируется код ошибки; если файл не будет найден, то он будет создан.

N -

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

Примечания:

  1. Функцию IENTER нельзя вызывать в подпрограммах завершения и обработки прерывания.
  2. Функция IENTER требует, чтобы в памяти находился драйвер соответствующего устройства.
  3. Параметры функции должны располагаться в памяти вне области свопинга USR.

Более подробно о формировании записи в каталоге о временном файле сказано в описании системной макрокоманды .ENTER.

Результаты функции:

I=N

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

I=-1

- канал (CHAN) занят;

I=-2

- для записи файла с указанной длиной не было обнаружено <UNUSED> большего или равного указанной длине;

I=-3

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

I=-4

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

I=-5

- файл с указанным последовательным номером не найден.

В примере назначается канал для файла TEMP.TMP на устройстве SY0:. Если нет свободного канала, то программа печатает сообщение и останавливается.

Пример.

      REAL*4 DBLK(2)
      DATA DBLK/6RSY0TEM/6RP  TMP/
      ICHAN=IGETC()
      IF (ICHAN.LT.0) STOP 'НЕТ СВОБОДНОГО КАНАЛА'
C
С     СОЗДАНИЕ ВРЕМЕННОГО РАБОЧЕГО ФАЙЛА
C
      IF (IENTER(ICHAN,DBLK,20).LT.0)
*     STOP 'ОШИБКА СОЗДАНИЯ ФАЙЛА'
      CALL PURGE(ICHAN)
      CALL IFREEC(ICHAN)
      END

8.1.4. ФУНКЦИЯ IRENAM

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

Обращение к функции:

 
I=IRENAM(CHAN,DBLK)

где

CHAN

- номер канала (целое), используемого в операции; этот номер должен быть получен при помощи IGETC или, если предварительно была вызвана ICDFN, можно использовать каналы с номерами 16 (десятичное) и выше; канал вновь будет доступен для использования после выполнения операции переименования;

 

DBLK

- 8-словная зона, содержащая спецификацию существующего файла и его новую спецификацию; эта зона рассматривается в виде целого массива типа INTEGER*2 из 8 элементов; DBLK имеет форму:

1-4 слова -

являются описателем в RADIX-50 старого имени файла;

5-8 слова -

являются описателем в RADIX-50 нового имени файла.

Параметры функции IRENAM должны располагаться в памяти так, чтобы они не перекрывались с USR при свопинге.

Если на указанном устройстве уже существует файл с именем, совпадающим с новым именем файла, то этот файл удаляется. По завершении функции IRENAM указанный канал остаётся закрытым (т.е. свободным).

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

Более подробно о переименовании файлов сказано в описании системной макрокоманды .RENAME.

Результаты функции:

I=0

- обычный выход;

I=1

- указанный канал уже открыт;

I=2

- заданный файл не найден;

I=3

- файл с указанным именем уже существует и защищён.

Пример.

      REAL*8 NAME(2)
      DATA NAME /12RRK0FTN2  DAT,12RRK0FTN2  OLD/
      . . .
      ICHAN=IGETC()
      IF (ICHAN.LT.0) STOP 'HET КАНАЛА'
      CALL IRENAM(ICHAN,NAME) !СОХРАНИТЬ СТАРЫЙ ФАЙЛ
C                             ДАННЫХ
      CALL IFREEC(ICHAN)

8.1.5. ФУНКЦИЯ LOOKUP

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

CLOSEC или ICLOSE

ISAVES

PURGE

Обращение к функции:

 
I = LOOKUP(CHAN,DBLK[,COUNT,SEGNUM] )

где

CHAN

- номер канала (целое), который необходимо связать с файлом или устройством, этот номер канала должен быть получен при помощи IGETC или, если предварительно была вызвана ICDFN, можно использовать каналы с номерами 16 (десятичное) и выше;

 

DBLK

- спецификация файла или устройства, состоящая из четырёх слов в RADIX-50; следует отметить, что если USR перекроет при свопинге эти четыре слова, то результат непредсказуем;

 

COUNT

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

 

SEGNUM

- номер файла, при работе с кассетной магнитной лентой, если этот аргумент опущен, он предполагается равным 0, для магнитной ленты он описывает последовательный номер файла; предпринимаемые действия зависят от того, указано ли имя файла; последовательный номер может иметь следующие значения:

-1 -

отменяет перемотку к началу ленты, поиск осуществляется от текущей позиции, если имя файла задано, выполняется LOOKUP файлового типа (без перемотки в начало); если имя файла пусто, выполняется нефайловый LOOKUP (лента не движется); использование отрицательных значений, отличных от -1, запрещено;

0 -

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

N -

любое положительное число, позиционирует ленту на файл с последовательным номером N и проверяет совпадение имён; если имена не совпадают, генерируется ошибка, если имя файла не задано, LOOKUP файлового типа производится для файла, заданного SEGNUM;

Параметры функции LOOKUP должны располагаться так, чтобы они не перекрывались с USR при свопинге. При выполнении функции LOOKUP в оперативной памяти должен находиться драйвер управления указанным устройством.

Если в спецификации первое слово имени файла равно 0, а устройство является устройством файловой структуры, то началом "файла" назначается абсолютный нулевой блок носителя. В этом случае, который называется нефайловым открытием канала, программа получает доступ к произвольным физическим блокам устройства. Если при этом производятся операции ввода/вывода, то файловая структура на устройстве (каталог) может быть разрушена. Если имя файла указано для устройства, не имеющего файловой структуры (например, LP:FILE.ЕХТ - устройство печати), то имя игнорируется.

Результаты функции:

I=N

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

I=-1

- заданный канал уже открыт;

I=-2

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

I=-3

- устройство используется;

I=-4

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

Примеры:

      INTEGER*2 DBLK(4)
      DАТА DBLK /3RRK0,3RFTN,3R44 ,3RDAT/
      . . .
      ICHAN=IGETC()
      IF (IСHAN.LT.0) STOP 'КАНАЛ ОТСУТСТВУЕТ'
      IF (IFETCH(DBLK).NE.0) STOP 'FETCH НЕ УДАЧЕН'
      IF (LOOKUP(ICHAN,DBLK).LT.0) STOP 'LOOKUP НЕ УДАЧЕН'
      . . .
      CALL CLOSEC(ICHAN)
      CALL IFREEC(ICHAN)

8.2. ОПЕРАЦИИ ВВОДА/ВЫВОДА

8.2.1. ФУНКЦИИ IREAD/IREADC/IREADW

IREAD/IREADC/IREADW - три формы функции чтения информации по указанному каналу из файла в память. Выполнение этих функций требует элемент очереди, что должно учитываться при выполнении функции IQSET.

8.2.1.1. ФУНКЦИЯ IREAD

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

Обращение к функции:

 
I=IREAD(WCNT,BUF,BLK,CHAN)

где

WCNT

- целое; число слов, которое должно быть передано;

 

BUF

- массив, используемый в качестве буфера; этот массив должен быть по длине не меньше счётчика слов (WCNT);

 

BLK

- номер читаемого блока от начала файла; первый блок файла имеет номер 0; при необходимости программа должна увеличивать номер блока; например, если программой прочитано два блока, то для чтения следующих необходимо увеличить BLK на 2;

 

CHAN

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

В случае, когда программе требуется доступ к данным, читаемым по указанному каналу, должна вызываться функция IWAIT, это гарантирует завершение операции IREAD. Если во время передачи произошла ошибка, то наличие ошибки показывает функция IWAIT.

Результаты функции:

I=N

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

  • если счётчик слов кратен 256 и в файле доступно слов меньше, чем указано в счётчике, то N указывает число фактически считанных слов, например, если счётчик равен 512, а в файле осталось 256 слов, то I=256;
  • если счётчик слов не кратен 256 и в файле остаётся слов больше, чем указано в счётчике, то N округляется вверх до следующего блока; например, если счётчик слов равен 312, а в файле осталось больше 312 слов, то I=512, но считывается только 312 слов;
  • если счётчик слов не кратен 256 и в файле остаётся слов меньше, чем указано в счётчике, то N равно числу, кратному 256;

I=-1

- попытка считать данные после конца файла;

I=-2

- в канале произошла аппаратная ошибка;

I=-3

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

Примечание. Если в канале (например, IREAD) при асинхронной операции было обращение за пределы файла, то функция IWAIT не обнаружит этого, т.к. IWAIT обнаруживает наличие только аппаратных ошибок. Последующей операцией для этого канала будет обнаружение конца файла и выдача пользователю кода ошибки EOF.

Пример.

      INTEGER*2 BUFFER(256),RCODE,BLK
      . . .
      RCODE=IREAD(256,BUFFER,BLK,ICHAN)
      IF (RCODE+1) 1010,1000,10
10    . . .
      IF (IWAIT(ICHAN).NE.0) GOTO 1010
      . . .
1000  CONTINUE
С     КОНЕЦ ОБРАБОТКИ ФАЙЛА
      . . .
      CALL EXIT         !ЕСТЕСТВЕННЫЙ КОНЕЦ ПРОГРАММЫ
1010  STOP 'НЕПРАВИЛЬНОЕ СЧИТЫВАНИЕ'
      END

8.2.1.2. ФУНКЦИЙ IREADC

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

Обращение к функции:

 
I=IREADC(WCNT,BUF,BLK,CHAN,CRTN)

где

WCNT

- целое число слов, которое должно быть передано;

 

BUF

- массив, используемый в качестве буфера; этот массив данных должен иметь длину не меньше, чем указано в параметре WCNT;

 

BLK

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

 

CHAN

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

 

CRTN

- имя подпрограммы завершения на ассемблере.

Результаты функции представлены в описании функции IREAD

Пример.

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

8.2.1.3. ФУНКЦИЯ IREADW

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

Обращение к функции:

 
I=IREADW(WCNT,BUF,BLK,CHAN)

где

WCNT

- количество слов, которое должно быть передано;

 

BUF

- массив, используемый в качестве буфера, этот массив данных должен иметь длину не меньше, чем указано в параметре WCNT;

 

BLK

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

 

CHAN

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

Результаты функции представлены в описании функции IREAD

Пример.

      INTEGER*2 IBUF(1024)
      . . .
      ICODE=IREADW(1024,IBUF,IBLK,ICHAN)
      IF (ICODE.EQ.-1) GOTO 100   !ОБРАБОТКА КОНЦА ФАЙ-
С                                ЛА 8 ОПЕРАТОРЕ 100
      . . .
      IF (ICODE.LT.-1) GOTO 200   !ОБРАБОТКА ОШИБКИ В
С                                 ОПЕРАТОРЕ 200
С     МОДИФИЦИРОВАТЬ БЛОКИ
      . . .
С     ЗАПИСАТЬ, ЗАТЕМ ВЫЙТИ
      ICODE=IWRITW(1024,IBUF,IBLK,ICHAN)

8.2.2. ФУНКЦИЯ ITTINR

Функция ITTINR предназначена для передачи символа с системного терминала в программу пользователя. Если в буфере системы нет введённых символов, то действия системы определяются состоянием разряда 6 в слове состояния задания (JSW).

Обращение к функции:

I=ITTINR()

Если результат выполнения функции ITTINR меньше нуля, то это значит, что в буфере не было символов, т.е. оператор ещё не ввёл строку.

Существует два режима ввода с терминала. Режим задаётся битом 12 слова состояния задания. Слово состояния задания определяется содержимым 44-й ячейки памяти в области SYSCOM.

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

Если 12-й бит равен 1, то задаётся специальный режим. При этом происходит следующее:

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

12-й разряд слова состояния задания должен быть установлен программой, если необходим специальный режим управления терминалом. 14-й разряд JSW устанавливается для разрешения ввода с клавиатуры знаков кириллицы. Эти биты сбрасываются при возврате управления в монитор.

Вне зависимости от установки 12-го разряда JSW при вводе <ВК> с клавиатуры в программу, передаётся два символа: <ВК> и <ПС>. Если разряд 12 равен нулю, то эти символы отображаются и на терминале.

Преобразование кириллицы определяется установкой разряда 14. Если этот разряд равен нулю, то знаки кириллицы преобразуются в соответствующие латинские знаки перед эхопечатью (если разряд 12 при этом равен нулю) и передачей в программу. Если разряд 14 установлен в 1, то введённые символы отображаются (если разряд 12 при этом равен нулю) и пересылаются так, как они были введены.

Для установки и/или сброса битов слова состояния задания используют функцию IPEEK, а затем IPOKE. В специальном режиме (бит 12 слова состояния задания установлен) обычный фортрановский форматный ввод с клавиатуры терминала не определён.

Результаты функции:

I>0

- обычный выход, символ прочитан;

I<0

- выход с ошибкой, в буфере нет введённых символов.

Пример.

      ICHAR=ITTINR()                !СЧИТАТЬ СИМВОЛ С TT
      IF (ICHAR.LT.0)GOTO 100       !НЕТ СИМВОЛОВ

8.2.3. ФУНКЦИЯ ITTOUR

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

Обращение к функции:

 
I=ITTOUR(CHAR)

где

CHAR

- код выводимого символа, выравненное вправо целое (при желании может быть типа LOGICAL*1), которое необходимо вывести.

Если (I) - результат выполнения функции ITTOUR - равен 1, это означает, что в буфере нет свободного места и не выведен ни один символ.

Результаты функции:

I=0

- обычный выход; символ выведен;

I=1

- выход с ошибкой, кольцевой буфер полон.

Пример.

      DO 10 I=1,5
10    IF (ITTOUR("007).NE.0) GOTO 10 !ПЕРЕДАТЬ СИМВОЛ
С                                    5 РАЗ

8.2.4. Функция IWAIT

Функция IWAIT приостанавливает выполнение основной программы до тех пор, пока не закончится выполнение всех операций ввода/вывода на указанном канале. Эта функция используется с вызовами IREAD, IWRITE и ISPFN. Подпрограммы завершения продолжают выполняться.

Обращение к функции:

 
I=IWAIT(CHAN)

где

CHAN

- номер (целое) используемого канала.

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

Результаты функции:

I=0

- обычный выход;

I=1

- указанный канал не открыт;

I=2

- во время предыдущей операций ввода/вывода по этому каналу произошла аппаратная ошибка.

Пример.

      IF (IWAIT(ICHAN).NE.0) CALL IOERR(4)

8.2.5. ФУНКЦИИ IWRITE/IWRITC/IWRITW

IWRITE/IWRITC/IWRITW - три формы функции записи заданного числа слов из памяти в файл по указанному каналу. Эти функции требуют элемент очереди, что должно учитываться при выполнении функции IQSET.

8.2.5.1. ФУНКЦИЯ IWRITE

Функция IWRITE предназначена для передачи заданного числа слов из оперативной памяти по указанному каналу. Управление возвращается программе пользователя немедленно после того, как запрос был поставлен в очередь. После выполнения операции никакие действия не предпринимаются.

Обращение функции:

 
I=IWRITE(WCNT,BUF,BLK,CHAN)

где

WCNT

- количество (целое) передаваемых слов;

 

BUF

- массив, используемый для буфера вывода;

 

BLK

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

 

CHAN

- номер (целое) используемого канала; номер канала должен быть получен при помощи вызова IGETC, или, если предварительно осуществлялся вызов ICDFN, могут быть использованы каналы с номерами 16 (десятичное) и больше.

Результаты функции:

I=N

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

I=-1

- попытка записать после конца файла;

I=-2

- произошла аппаратная ошибка;

I=-3

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

Примечание. Если возвращаемый счётчик слов (WCNT) меньше требуемого, то это означает, что встретился неявный конец файла.

Пример.

      INTEGER*2 IBUF(256)
      EXTERNAL CRTN
      . . .
      ICODE=IWRITE(256,IBUF,IBLK,ICHAN,CRTN)

8.2.5.2. ФУНКЦИЯ IWRITC

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

Обращение к функции:

 
I=IWRITC(WCNT,BUF,BLK,CHAN,CRTN)

где

WCNT

- количество (целое) передаваемых слов;

 

BUF

- массив, используемый в качестве буфера вывода;

 

BLK

- целое; относительный номер блока файла, в который происходит запись; перед повторным использованием программа пользователя обычно обновляет параметр BLK (например, если программа вывела два блока, то значение BLK нужно увеличить на 2);

 

CHAN

- номер используемого канала; номер канала должен быть получен при помощи IGETC, или, если предварительно была вызвана ICDFN, можно использовать каналы с номерами 16 (десятичное) и выше.

 

CRTN

- подпрограмма, написанная на макроассемблере, которая активизируется по завершении передачи; это имя должно указываться с описателем EXTERNAL в программе на языке Паскаль, вызывающей IWRITC.

Результаты функции приведены в описании функции IWRITE.

Пример приведён в описании функции IREAD.

8.2.5.3. ФУНКЦИЯ IWRITW

Функция IWRITW предназначена для передачи заданного числа слов из оперативной памяти по указанному каналу. Управление возвращается программе пользователя после окончания передачи.

Обращение к функции:

 
I=IWRITW(WCNT,BUF,BLK,CHAN)

где

WCNT

- количество (целое) передаваемых слов;

 

BUF

- массив, используемый в качестве буфера вывода;

 

BLK

- номер (целое) блока файла, с которого начнётся запись; программа пользователя перед повторным использованием параметра BLK обновляет его;

 

CHAN

- номер (целое) используемого канала; номер должен быть получен вызовом IGETC, или, если уже вызывалась ICDFN, может быть использован канал с номером 16 (десятичное) или выше.

Результаты функции приведены в описании функции IWRITE

Пример приведён в описании функции IREADW

8.2.6. ПОДПРОГРАММА PRINT

Подпрограмма PRINT осуществляет вывод строки на системный терминал. Управление передаётся программе пользователя после помещения в системный кольцевой буфер вывода всех выводимых символов.

Выводимая строка должна заканчиваться байтом 0 или байтом 200 (восьмеричное). Если используется 0 (формат ASCIZ), вывод автоматически завершается знаками <ВК><ПС> (15 и 12 (восьмеричное)). Если используется ограничитель 200, то эти знаки не генерируются.

Обращение к подпрограмме:

 
CALL PRINT(STRING)

где

STRING

- выводимая строка.

Примечание. Все литеры, используемые в подпрограммах библиотеки системы ОС БК-11, а также все строки, вырабатываемые функциями обработки строк символов, имеют формат ASCIZ (подпрограмма CONCAT может быть использована для добавления байта 200 в строку ASCIZ).

Ошибки отсутствуют.

Пример.

      CALL PRINT(' ВЫВОД СТРОКИ ')

или

      BYTE QUEST(80)
C     ДОБАВИТЬ БАЙТ 200 И ВЫВЕСТИ БЕЗ <CR><LF>
C
      CALL CONCAT('ВАШЕ ИМЯ?',"200,QUEST)
      CALL PRINT(QUEST)

8.2.7. ФУНКЦИИ ISPFN/ISPFNC/ISPFNW

Эти функции используются для доступа к специальным средствам различных драйверов (гибких дисков, кассетных магнитных лент), они обеспечивают возможность выполнения операций, свойственных определённым устройствам, таких как перемотка и реверс, применительно к устройствам кассетной магнитной ленты. Если вызовы ISPFN выполняются для других устройств, то они игнорируются.

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

8.2.7.1. ФУНКЦИЯ ISPFN

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

Обращение к функции:

 
I=ISPFN(CODE,CHAN[,WCNT,BUF,BLK])

где

CODE

- числовой код (целое) выполняемой функции;

 

CHAN

- номер (целое) канала, используемого для операции; этот номер должен быть получен при помощи IGETC, или, если перед этим вызывалась ICDFN, можно использовать каналы с номером 16 (десятичное) и больше;

 

WCNT

- число (целое) слов, участвующих в операции, по умолчанию равно нулю; этот параметр не является обязательным при вызовах ISPFN (в зависимости от вызываемых функций); в операциях с магнитной лентой он указывает количество записей, пропускаемых вперёд или назад; при перемотке назад со счётчиком, равным нулю, лента перематывается до маркера или до начала ленты; аналогично при перемотке вперёд со счётчиком, равным нулю, перемотка ведётся до маркера или до конца ленты;

 

BUF

- массив, используемый для хранения информации; этот параметр не является обязательным при вызове ISPFN (в зависимости от вызываемых функций), значение по умолчанию - нуль;

 

BLK

- номер (целое) блока файла, над которым выполняется операция; по умолчанию принимается значение, равное нулю; этот параметр не является обязательным при вызове ISPFN (в зависимости от вызываемых функций).

Если параметр BLK применяется к магнитной ленте, он является адресом 4-словного блока ошибок и состояния и используется для записи соответствующей информации. Эти четыре слова должны быть установлены в нуль перед обращением к ISPFN.

Три последних (необязательных) аргумента (WCNT,BUF,BLK) не являются необязательными по отдельности; они должны быть указаны либо все, либо не должно быть ни одного.

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

Функция

MT

CT

DX

DM

DY

Чтение абсолютное

 

 

377

377

377

Запись абсолютная

 

 

376

376

376

Запись абсолютная с удалением данных

 

 

375

 

375

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

 

377

 

 

 

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

 

376

 

 

 

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

 

375

 

 

 

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

 

374

 

 

 

Перемотка назад к точке загрузки

370

373

 

 

 

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

 

372

 

 

 

Запись метки конца файла (EOF)

377

 

 

 

 

Продвижение вперёд на одну запись

376

 

 

 

 

Перемотка назад на одну запись

375

 

 

 

 

Запись дефектного блока в таблицу замещения

 

 

 

374

 

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

374

 

 

 

 

Автономный режим работы

372

 

 

 

 

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

 

 

 

373

373

Запись блоков переменной длины

371

 

 

 

 

Чтение блоков переменной длины

370

 

 

 

 

Примечание. Коды специальных функций для устройств МТ и ММ совпадают.

Результаты функции:

I=0

- обычный выход;

I=1

- попытка писать или читать после конца файла;

I=2

- в канале произошла аппаратная ошибка;

I=3

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

Пример.

      CALL ISPFN("373,ICHAN) !ПЕРЕМОТКА В НАЧАЛО

8.2.7.2. ФУНКЦИЯ ISPFNC

Функция ISPFNC ставит в очередь запрос на указанную операцию и немедленно возвращает управление программе. По завершении операции выполнение основной программы прерывается и вызывается заданная программа на языке ассемблер (параметр CRTN) в качестве асинхронной подпрограммы завершения.

Обращение к функции:

 
I=ISPFNC(CODE,CHAN,WCNT,BUF,BLK,CRTN)

где

CODE

- числовой код (целое) выполняемой функции (см. выше);

 

CHAN

- номер канала, используемого для операции; номер должен быть получен по вызову IGETC, или, если использовался вызов ICDFN, можно использовать канал с номером 16 (десятичное) или выше;

 

WCNT

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

 

BUF

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

 

BLK

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

 

CRTN

- имя подпрограммы на макроассемблере, которая вызывается по завершении операции;

Если параметр BLK применяется для магнитной ленты, он является адресом 4-словного блока ошибок и состояния используется для приёма соответствующей информации. В эти четыре слова должны быть первоначально занесены нули.

Результаты функции:

I=0

- обычный выход;

I=1

- попытка чтения/записи после конца файла;

I=2

- в канале произошла аппаратная ошибка;

I=3

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

8.2.7.3. ФУНКЦИЯ ISPFNW

Функция ISPFNW ставит в очередь запрос на заданную операцию и возвращает управление программе после выполнения операции.

Обращение к функции:

 
I=ISPFNW(CODE,CHAN[,WCNT,BUF,BLK])

где

CODE

- числовой код (целое) выполняемой функции (см. выше);

 

CHAN

- номер канала, используемого для операции; канал должен быть получен по IGETC, или, если вызывалась ICDFN, можно использовать канал с номером 16 (десятичное) и больше;

 

WCNT

- количество (целое) слов, участвующих в операции; этот аргумент не обязателен для некоторых вызовов ISPFNW, в зависимости от запрашиваемой функции; по умолчанию равен нулю; в операциях с магнитной лентой он указывает количество записей, пропускаемых вперёд или назад; при перемотке назад, со счётчиком равным нулю, лента перематывается до маркера или до начала ленты; аналогично, при перемотке вперёд, со счётчиком равным нулю, перемотка ведётся до маркера или до конца ленты;

 

BUF

- массив, используемый для хранения информации; если не нужен, то равен нулю; этот аргумент не обязателен для некоторых (в зависимости от кода функции) вызовов ISPFNW;

 

BLK

- номер блока файла (целое число), над которым выполняется операция; этот аргумент не обязателен для некоторых (в зависимости от кода функции) вызовов ISPFNW; по умолчанию принимается значение, равное нулю.

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

Результаты функции:

I=0

- обычный выход;

I=1

- попытка чтения/записи после конца файла;

I=2

- в канале произошла аппаратная ошибка;

I=3

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

Пример.

      INTEGER*2 BUF(65),TRACK,SECTOP,DBLK(4)
      DATA DBLK/3RDX0,0,0,0/
      . . .
      ICHAN=IGETC()
      IF (ICHAN.LT.0) STOP 'НЕТ КАНАЛА'
      IF (LOOKUP(ICHAN,DBLK).LT.0)
*     STOP 'НЕУДАЧНЫЙ LOOKUP'
      . . .
C     ПРОЧИТАТЬ АБСОЛЮТНУЮ ДОРОЖКУ И СЕКТОР
C     ГИБКОГО ДИСКА
C
      ICODE=ISPFNW("377,ICHAN,TRACK,BUF,SECТОР)
C
C     BUF(1) = ФЛАГ СТЕРТЫХ ДАННЫХ
C     BUF(2-65) = ДАННЫЕ

8.3. РАБОТА С КАНАЛАМИ

8.3.1. ФУНКЦИЯ ICDFN

В ОС БК-11 предположительно не используется.

Функция ICDFN увеличивает число каналов ввода/вывода и определяет новые каналы. Каналы, определённые до данного вызова ICDFN, не используются, т.е. функция ICDFN для 20 (десятичное) каналов в момент, когда определены 16 (десятичное) основных каналов, выделяет только 20 каналов ввода/вывода. Память, выделенная для информации об основных каналах, не используется.

Обращение к функции:

 

I=ICDFN(NUM[,AREA])

где

NUM

- количество (целое) выделяемых каналов; это число должно находиться в интервале 17-256 (десятичное);

 

AREA

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

Программа может использовать новые каналы с номером больше 16 без обращений к функции IGETC, но система ввода/вывода фортрана использует только первые 15 (десятичное) каналов. Основные 16 каналов используются USR и распределяются функцией IGETC.

Аргументы функции ICDFN должны размешаться вне области свопинга USR.

Примечания:

  1. Функцию ICDFN нельзя вызывать из подпрограммы завершения или обработки прерывания.
  2. Рекомендуется использовать функцию ICDFN в начале основной программы перед инициированием любых операций ввода/вывода.
  3. Если функция ICDFN выполняется более одного раза, каждый раз при ее вызове формируется совершенно новый набор каналов, но информация о старых каналах переписывается в новые.
  4. Функция ICDFN требует, чтобы для оперативных программ выделялась дополнительная память.

Результаты функции:

I=0

- обычный выход;

I=1

- предпринята попытка распределить меньше каналов, чем существует;

I=2

- для записи информации о Каналах недостаточно свободной памяти.

Пример.

      IF (ICDFN(24).NE.0) STOP 'НЕДОСТАТОЧНО ПАМЯТИ'

8.3.2. ФУНКЦИЯ IFREEC

В ОС БК-11 предположительно не используется.

Функция IFREEC предназначена для освобождения указанного канала и возврата его в список свободных каналов исполняющей системы Фортрана. Перед вызовом IFREEC указанный канал необходимо закрыть функцией CLOSEC (или ICLOSE) или очистить функцией PURGE. Функция IFREEC не может вызываться из подпрограмм завершения или обработки прерывания. Вызовы IFREEC должны производиться только для каналов, которые были ранее успешно выделены из списка свободных каналов исполняющей системы фортрана при помощи вызова IGETC, в противном случае результаты не предсказуемы.

Обращение к функции:

 

I=IFREEC(CHAN)

где

CHAN

- номер (целое) освобождаемого канала.

Результаты функции:

I=0

- обычный выход;

I=1

- в данный момент указанный канал не выделен.

Пример приведён в описании функции IGETC.

8.3.3. ФУНКЦИЯ IGETC

В ОС БК-11 предположительно не используется.

Функция IGETC предназначена для выделения основных каналов системы в диапазоне 0-17 (восьмеричное) для использования их другими подпрограммами SYSLIB. Исполняющая система фортрана выделяет канал пользователю и фиксирует, что он занят, т.е. система ввода/вывода Фортрана не получит к нему доступа. Функция IGETC не может вызываться из подпрограммы завершения или из подпрограммы обработки прерывания.

Обращение к функции:

      I=IGETC()

Результаты функции:

I=-1

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

I=N

- для ввода/вывода выделен канал

Пример.

      ICHAN=IGETC()         !РАСПРЕДЕЛИТЬ КАНАЛ
      IF (ICHAN.LT.0) STOP 'КАНАЛ НЕЛЬЗЯ ВЫДЕЛИТЬ'
      . . .
      CALL IFREEC(ICHAN)    !ОСВОБОДИТЬ КАНАЛ
      . . .
      END

8.3.4. ФУНКЦИЯ ILUN

В ОС БК-11 предположительно не используется.

Функция ILUN предназначена для определения номера канала, с которым связано логическое устройство фортрана в системе ОС БК-11.

Обращение к функции:

 

I=ILUN(LUN)

где

LUN

- целое выражение со значением в диапазоне 1-99; определяет номер логического устройства фортрановской системы.

Результаты функции:

I=N

- канал с номером N связан с логическим устройством системы LUN;

I=-1

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

I=-2

- логическое устройство открыто консольному терминалу.

Пример.

      PRINT 99
99    FORMAT ('НАПЕЧАТАТЬ НА '
*     'ЛОГИЧЕСКОЕ УСТРОЙСТВО 6, КОТОРЫМ ПО УМОЛЧАНИЮ '
*     'ДОЛЖНО БЫТЬ LP: ')
      LUNIT=ILUN(6) ! ОПРЕДЕЛЕНИЕ КАНАЛА ВВОДА/ВЫВОДА

8.3.5. ФУНКЦИЯ IREOPN

Функция IREOPN предназначена для повторного установления связи заданного канала с файлом, для которого предварительно было выполнено ISAVES. В случае, когда одновременно обрабатывается большое число файлов, целесообразно использовать комбинацию функций ISAVES/IREOPN. Необходимые для работы файлы могут быть открыты функцией LOOKUP, их состояние можно сохранить с помощью ISAVES, а с помощью IREOPN повторно открыть файлы и считать из них необходимые данные.

Обращение к функции:

 
I=IREOPN(CHAN,CBLK)

где

CHAN

- номер канала, связываемого с вновь открываемым файлом; первоначально этот канал должен находиться в неактивном состоянии;

 

CBLK

- 5-словный массив, в который функцией ISAVES была записана информация о состоянии канала.

CBLK представляет собой 5-элементный массив типа INTEGER*2 и имеет следующий формат:

1 элемент

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

2 элемент

- номер начального блока файла на носителе; равен нулю для устройств с нефайловой структурой;

3 элемент

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

4 элемент

- резервируется;

5 элемент

- два информационных байта; чётный байт - счётчик ввода/вывода, считает число запросов, сделанных данному каналу; нечётной байт - номер устройства, связанного с этим каналом.

Результаты функции:

I=0

- обычный выход;

I=1

- указанный канал уме используется.

8.3.6. ФУНКЦИЯ ISAVES

Функция ISAVES записывает пять слов информации о состоянии канала в указанный массив. В этом массиве после выполнения ISAVES будет содержаться полная информация о файле, необходимая ОС БК-11 для его определения. После выполнения функции ISAVES 5-словный массив находится в оперативной памяти, указанный канал закрывается и становится доступным для использования. Если необходимо вновь получить доступ к информации, которая была связана с сохраненным каналом, используется функция IREOPN.

Функцию ISAVES можно использовать только в том случае, если файл был открыт вызовом LOOKUP. Если для открытия использовалась функция IENTER, вызов ISAVES вырабатывает признак ошибки. Функция ISAVES не применяется к файлам на магнитной ленте и кассете.

Обращение к функции:

 

I=ISAVES(CHAN,CBLK)

где

CHAN

- номер канала, о котором необходимо получить информацию; этот канал должен быть получен из исполняющей системы фортрана при помощи функции IGETC или, если было обращение к ICDFN, можно использовать канал с номером 16 (десятичное) и выше;

 

CBLK

- 5-словный массив, в который необходимо записать информацию о канале (см. п. 8.3.5 IREOPN).

При использовании ISAVES/IREOPN необходимо избегать следующих ситуаций:

Результаты функции:

I=0

- обычный выходу

I=-1

- заданный канал в настоящий момент не связан с файлом;

I=-2

Файл был открыт вызовом IENTER, функция ISAVES не может выполниться.

Пример.

      INTEGER*2 BLK(5) 
      . . .
      IF (ISAVES(ICHAN,BLK).NE.0) STOP 'ОШИБКА ISAVES'

8.3.7. ПОДПРОГРАММА PURGE

Подпрограмма PURGE используется для отключения канала без выполнения функций ISAVES, CLOSEC или ICLOSE. При этом файл, связанный в настоящий момент с каналом, не становится постоянным, если он был создан по IENTER. Эту подпрограмму целесообразно применять для предотвращения превращения файлов, создаваемых функцией IENTER или системной макрокомандой .ENTER, в постоянные файлы.

Обращение к подпрограмме:

 
CALL PURGE(CHAN)

где

CHAN

- номер канала системы ОС БК-11, который необходимо отключить.

Ошибки отсутствуют.

Пример приведён в описании функции IENTER.

8.4. ОБРАБОТКА КОМАНДНОЙ СТРОКИ

8.4.1. ПОДПРОГРАММА GTLIN

Подпрограмма GTLIN передаёт строку с системного терминала или из выполняющегося командного файла в программу пользователя.

Этот запрос позволяет принимать информацию с системного терминала и управлять программой из косвенного командного файла. Подпрограмма GTLIN требует USR. Максимальный размер входной строки равен 80 символам. Описание установки разрядов в слове состояния задания (JSW) для пересылки знаков кириллицы и установки условий незавершённости дано в описании системной макрокоманды .GTLIN.

Обращение к подпрограмме:

 
CALL GTLIN(RESULT[,PROMPT])

где

RESULT

- массив, в котором помещается строка, этот массив типа LOGICAL*1 содержит максимум 80 символов плюс последний символ - указатель конца (равен нулю) и поэтому должен иметь размерность не меньшую, чем 81;

 

PROMPT

- необязательный аргумент, массив типа LOGICAL*1; строка, которая печатается до входной строки; формат строки такой же, как и в подпрограмме PRINT; если аргумент опущен, никаких сигналов готовности к вводу с клавиатуры на терминал не выводится.

Ошибки отсутствуют.

Пример.

      LOGICAL*1 INP(81), PROMP(5)
      DATA PROMP /'И','М','Я','?',"200/
       . . .
      CALL GTLIN(INP,PROMP)

8.4.2. ФУНКЦИЯ ICSI

Функция ICSI вызывает интерпретатор командной строки (CSI) системы ОС БК-11 в специальном режиме для анализа командной строки и возвращает спецификации файлов и ключей в программу. В этом режиме интерпретатор командной строки не производит загрузку драйверов и не выполняет функции CLOSE, ENTER или LOOKUP. Аргумент разрешён только в случае, когда он вводится с терминала.

Функция ICSI не может вызываться из подпрограммы завершения или обработки прерывания. Эта функция требует работы USR.

Обращение к функции:

 
I = ICSI(OUTSPC,TYPE[,CSTRING][,SWITCH],NUM)

где

OUTSPC

- массив из 39 слов, предназначенный для размещения описаний файлов в коде RADIX-50;

 

TYPE

- таблица типов файлов в RADIX-50, используемых по умолчанию; четырёхсловный массив;

 

CSTRING

- массив содержит строку, задаваемую в формате ASCIZ, которую необходимо интерпретировать как команду CSI; строка должна заканчиваться нулевым байтом; если этот параметр опущен, то система выводит символ запроса команды (*) на терминал и принимает с него командную строку; если ввод данных производится из косвенного командного файла, то обращение к терминалу не производится, а используется следующая строка командного файла;

 

SWITCH

- имя массива типа INTEGER*2 с размерностью (4,NUM), где NUM - количество ключей, определённых в программе; этот параметр должен присутствовать, если величина, указанная для параметра NUM, не равна нулю;

 

NUM

- обязательный параметр; число ключей, описанных в массиве SWITCH.

Формат OUTSPC (39-элементного массива типа INTEGER*2), следующий:

1-4 слова

- спецификация выходного файла 1;

5-е слово

- длина выходного файла 1;

6-9 слова

- спецификация выходного файла 2;

10-е слово

- длина выходного файла 2;

11-14 слова

- спецификация выходного файла 3;

15-е слово

- длина выходного файла 3;

16-19 слова

- спецификация входного файла 1;

20-23 слова

- спецификация входного файла 2;

24-27 слова

- спецификация входного файла 3;

28-31 слова

- спецификация входного файла 4;

32-35 слова

- спецификация входного файла 5;

36-39 слова

- спецификация входного файла 6.

Таблица типов файлов по умолчанию используется в случаях описания файла в строке CSI без указания типа:

TYPE(1)

- тип файла по умолчанию для всех входных файлов;

TYPE(2)

- тип файла по умолчанию для выходного файла 1;

TYPE(3)

- тип файла по умолчанию для выходного файла 2;

TYPE(4)

- тип файла по умолчанию для выходного файла 3.

Массив SWITCH имеет следующий формат для J-го ключа, описанного в массиве:

SWITCH(1,J)

- односимвольное имя ключа в КОИ-7;

SWITCH(2,J)

- устанавливается подпрограммой ICSI в 0, если ключ не был указан в строке CSI; в 1, если ключ был указан без значения; в 2, если ключ указан со значением;

SWITCH(3,J)

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

SWITCH(4,J)

- устанавливается в значение, указанное для данного ключа команды CSI, если SWITCH(2,J) равен двум;

Примечания:

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

    Если какой-либо ключ может появиться в командной строке несколько раз (или при нём может быть указано несколько значений), то этот ключ должен быть описан в массиве SWITCH столько раз, сколько семантически различных вариантов его появления существует.

  2. Параметры функции ICSI должны размещаться в памяти так, чтобы они не перекрывались с USR при свопинге.

Более подробно вызов и функционирование интерпретатора командной строки описано в системной макрокоманде .CSISPC.

Результаты функции:

I=0

- обычный выход;

I=1

- неправильная командная строка; данные не возвращаются;

I=2

- в командной строке встретилось неправильное описание устройства;

I=3

- был указан неправильный ключ или данный ключ был указан большее число раз, чем это разрешено таблицей описаний ключей SWITCH.

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

Пример.

      INTEGER*2 SPEC(39)
      REAL*8 EXT
      DATA EXT/12RDATDATDATDAT/
       . . .
10    TYPE 99
99    FORMAT('ВВЕСТИ СТРОКУ CSI БЕЗ КЛЮЧЕЙ')
      IF (ICSI(SPEC,EXT,,,0).NE.0) GOTO 10

8.5. РАБОТА С ТАЙМЕРОМ

8.5.1. ПОДПРОГРАММА CVTTIM

Подпрограмма CVTTIM преобразует время, записанное в 2-словном внутреннем формате, в часы, минуты, секунды и доли секунды.

Обращение к подпрограмме:

 
CALL CVTTIM(TIME,HRS,MIN,SEC,TICK)

где

TIME

- время, записанное в 2-словном внутреннем формате, подлежащее преобразованию; если время хранится в 2-элементном массиве типа INTEGER*2, то тогда первый элемент - старшая часть времени, второй элемент - младшая часть времени;

 

HRS

- часы; целое число;

 

MIN

- минуты; целое число;

 

SEC

- секунды; целое число;

 

TICK

- доли секунды (1/60 секунды для 60-герцевых линейных часов; 1/50 секунды для 50-герцевых линейных часов).

Ошибки отсутствуют.

Пример.

      INTEGER*4 ITIME
      . . .
      CALL GTIM(ITIME)   !ПОЛУЧИТЬ ТЕКУЩЕЕ ВРЕМЯ СУТОК
      CALL CVTTIM(ITIME,IHRS,IMIN,ISЕС,TIСК)
      IF (IHRS.GE.12.AND.IHRS.LT.13) GOTO 100 !ВРЕМЯ ОБЕДА

8.5.2. ПОДПРОГРАММА GTIM

Подпрограмма GTIM даёт программам доступ к текущему времени суток. Числовое значение, представляющее текущее время, помещается в два слова и даётся в виде долей секунды, прошедших после полуночи. Если в системе отсутствуют линейные часы, то выдаётся величина, равная нулю. Если при загрузке системы не была подана команда монитора TIME, указывающая текущее время, то возвращаемая величина будет равняться времени, прошедшему с момента загрузки системы, а не времени суток.

Обращение к подпрограмме:

 
CALL GTIM(ITIME)

где

ITIME

- двухсловный массив для приёма времени суток.

Старшая часть значения помещается в первое слово, младшая часть - во второе слово. Подпрограмма CVTTIM может использоваться для того, чтобы преобразовать время, выраженное в 2-словном внутреннем формате, в часы, минуты, секунды и доли секунды. CVTTIM проводит преобразования, основываясь на слове конфигурации монитора (для 50- и 60-герцевых линейных часов).

Ошибки отсутствуют.

Пример.

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

8.5.3. ФУНКЦИЯ ICMKT

Функция ICMKT отменяет один или несколько запланированных вызовов подпрограмм завершения, выполненных подпрограммами ISCHED, ITIMER или MRKT. Функция поддерживается SJ-монитором, если в SJ-монитор при генерации включена возможность работы с часами.

Обращение к функции:

 
I=ICMKT(ID,TIME)

где

ID

- целое выражение, идентификатор отменяемого запроса; если оно равно 0, то отменяются все запланированные запросы;

 

TIME

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

Более подробно отмена запланированных запросов описана в системной макрокоманде .CMKT.

Результаты функции:

I=0

- обычный выход;

I=1

- идентификатор (целое) не был равен 0 и указанный запрос не был найден.

Пример.

      INTEGER*4 J
      . . .
      CALL ICMKT(0,J)   !ОТМЕНИТЬ ВСЕ ЗАПЛАНИРОВАННЫЕ
C                       ЗАПРОСЫ

8.5.4. ФУНКЦИЯ ISCHED

Функция ISCHED планирует выполнение указанной подпрограммы на языке ФОРТРАН в качестве асинхронной подпрограммы завершения в заданное время суток. Выполнение этого запроса в SJ-мониторе требует поддержки таймера. В ОС БК-11 не используется, потому что в нём нет Фортрана, только Паскаль.

Обращение к функции:

 

I=ISCHED(HRS,MIN,SEC,TICK,AREA,ID,CRTN)

где

HRS

- часы, целое число;

 

MIN

- минуты, целое число;

 

SEC

- секунды, целое число;

 

TICK

- доли секунды (1/60 секунды - для 60-герцевых линейных часов; 1/50 секунды - для 50-герцевых линейных часов);

 

AREA

- 4-словный массив для хранения информации связи; эта зона не должна модифицироваться программой и перекрываться USR при свопинге; она может быть использована другими подпрограммами завершения на языке ФОРТРАН только после активизации указанной этим запросом подпрограммы завершения;

 

ID

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

 

CRTN

- имя подпрограммы на языке ФОРТРАН, которая должна быть запущена в указанное время суток; это имя должно быть указано в операторе EXTERNAL программы, вызывающей ISCHED; подпрограмма завершения имеет один параметр, например:

      SUBROUTINE ASUB(ID)
      INTEGER ID

Если подпрограмма запущена, значение целого параметра будет равно величине, указанной для параметра ID соответствующего вызова ISCHED.

Примечания:

  1. Планируемый при помощи ISCHED вызов подпрограммы завершения может позже отменяться функцией ICMKT.
  2. Если система занята, время суток, когда будет вызвана подпрограмма завершения, может оказаться позже требуемого.
  3. Подпрограмма завершения на языке ФОРТРАН может планировать вызовы самой себя, используя ISCHED и(или) ITIMER.
  4. Функция ISCHED требует элемент очереди, это должно учитываться при выполнении функции IQSET.

Результаты функции:

I=0

- обычный выход;

I=1

- нет свободного элемента очереди, планировать запрос нельзя.

Пример

      INTEGER*2 LINK(4)     !ЗОНА СВЯЗИ
      EXTERNAL NOON         !ИМЯ ВЫПОЛНЯЕМОЙ ПОДПРОГРАММЫ
      . . .
      I=ISCHED(12,0,0,0,LINK,0,NOON)    !ВЫПОЛНИТЬ ПОДПРОГ-
C                                       РАММУ NOON В
C                                       12 ЧАСОВ
      . . .
      . . .
      END
      SUBROUTINE NOON(ID)
C
C     ВЫПОЛНЕНИЕ ПРОГРАММЫ ПРЕКРАТИТСЯ НАСИЛЬНО, ЕСЛИ
C     К ЭТОМУ ВРЕМЕНИ НЕ БУДЕТ ЗАВЕРШЕНО ЗАДАНИЕ
C
      STOP 'ВЫНУЖДЕННОЕ ПРЕРЫВАНИЕ - 12 ЧАСОВ'
      END

8.5.5. ФУНКЦИЯ ISLEEP

Функция ISLEEP приостанавливает выполнение основной программы задания на заданное время, т.е. на сумму часов, минут, секунд и долей секунды, указанную в вызове ISLEEP, при этом все запланированные подпрограммы завершения продолжают вызываться. Выполнение этого запроса в SJ-мониторе требует поддержки таймера монитором.

Обращение к функции:

 
I=ISLEEP(HRS,MIN,SEC,TICK)

где

HRS

- часы; целое число;

 

MIN

- минуты; целое число;

 

SEC

- секунды; целое число;

 

TICK

- доли секунды (1/60 секунды для 60-герцевых линейных часов, 1/50 секунды для 50-герцевых линейных часов).

Примечания:

  1. Функция ISLEEP требует элемент очереди. Что необходимо учитывать при выполнении функций IQSET.
  2. Если система занята, то действительное время останова основной программы может быть больше, чем задано.

Результаты функции:

I=0 -

Нормальный выход;

I=1 -

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

Пример.

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

8.5.6. ФУНКЦИЯ ITIMER

Функция ITIMER планирует выполнение заданной подпрограммы на языке ФОРТРАН в качестве асинхронной подпрограммы завершения по истечении заданного интервала времени. Эта подпрограмма поддерживается SJ-монитором, если обеспечение таймера включено в монитор при генерации системы. В ОС БК-11 не используется, потому что в нём нет Фортрана, только Паскаль.

Обращение к функции:

 

I=ITIMER(HRS,MIN,SEC,TICK,AREA,ID,CRTN)

где

HRS

- часы, целое число;

 

MIN

- минуты, целое число;

 

SEC

- секунды, целое число;

 

TICK

- доли секунды (1/60 секунды для 60-герцевых линейных часов, 1/50 секунды для 50-герцевых линейных часов);

 

AREA

- 4-словный массив для информации связи; этот массив не должен модифицироваться программой и перекрываться при свопинге USR; данный массив может использоваться другими функциями завершения только после активизации указанной подпрограммы;

 

ID

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

 

CRTN

- имя подпрограммы на языке ФОРТРАН, которая вызывается по истечении заданного интервала времени; это имя должно указываться в операторе EXTERNAL программы, обращающейся к ITIMER; подпрограмма завершения на языке ФОРТРАН имеет один параметр, например:

      SUBROUTINE PROGR(ID)
      INTEGER ID

После вызова подпрограммы завершения значение целого параметра будет равно значению, указанному для параметра ID соответствующего вызова ITIMER.

Примечания:

  1.  Запланированный при помощи ITIMER вызов подпрограммы завершения может быть отменен вызовом функции IСМКТ.
  2. Если система занята, действительный интервал времени, по истечении которого вызывается подпрограмма завершения, может быть больше требуемого.
  3. Подпрограммы на языке ФОРТРАН могут планировать вызовы самих себя, используя ISCHED или ITIMER.
  4. Функция ITIMER требует элемент очереди, что должно учитываться при выполнении функции IQSET.

Дополнительная информация может быть получена из описания макрокоманды .MRKT.

Результаты функции:

I=0

- обычный выход;

I=1

- нет свободного элемента очереди, планировать запрос нельзя.

Пример

      INTEGER*2 AREA(4)
      EXTERNAL WATCHD
C
C     ЕСЛИ ПРОГРАММА
C     НЕ ВЫЗОВЕТ ФУНКЦИЮ ICMKT ЧЕРЕЗ 12 МИНУТ
C     ПОСЛЕ ВЫЗОВА ФУНКЦИИ ITIMER, ТО БУДЕТ
C     ВЫЗВАНА ПОДПРОГРАММА ЗАВЕРШЕНИЯ WATCHD С ПАРАМЕТРОМ
C     ID, РАВНЫМ 3
C
      CALL ITIMER(0,12,0,0,AREA,3,WATCHD)
       . . .
      CALL ICMKT(3,AREA)
       . . .
      END
      SUBROUTINE WATCHD(ID)
C
C     ЭТА ПОДПРОГРАММА ВЫЗЫВАЕТСЯ ЧЕРЕЗ 12 МИНУТ
C
      . . .
      RETURN
      END

8.5.7. ПОДПРОГРАММА JTIME

Подпрограмма JTIME преобразует указанное время во время, записанное во внутреннем формате.

Обращение к подпрограмме:

 
CALL JTIME(HRS,MIN,SEC,TICK,TIME)

где

HRS

- часы; целое число;

 

MIN

- минуты; целое число;

 

SEC

- секунды; целое число;

 

TICK

- доли секунды (1/60 секунды для 60-герцевых линейных часов, 1/50 секунды для 50-герцевых линейных часов);

 

TIME

- 2-словный массив, предназначенный для записи времени во внутреннем формате; первое слово - старшая часть записи о времени, второе слово - младшая часть.

Ошибки отсутствуют.

Пример.

      INTEGER*4 J1
C
С     ПРЕОБРАЗОВАТЬ 3 ЧАСА, 7 МИН, 23 СЕКУНДЫ В
C     ЦЕЛУЮ ВЕЛИЧИНУ ТИПА INTEGER*4
С
      CALL JTIME(3,7,23,0,J1)
      CALL JJCVT(J1)

8.5.8. ФУНКЦИЯ MRKT

Функция MRKT производит планирование вызова подпрограммы завершения, написанной на языке макроассемблера, по истечении заданного интервала. Выполнение этой функции в SJ-мониторе требует средств поддержки таймера.

Обращение к функции:

 
I=MRKT(ID,CRTN,TIME)

где

ID

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

 

CRTN

- имя макроассемблерной подпрограммы завершения, которая вызывается по истечении заданного временного интервала; это имя должно указываться оператором EXTERNAL в программе на языке Фортран, вызывающей MRKT.

 

TIME

- интервал времени, выраженный в 2-словном внутреннем формате; по истечении этого интервала вызовется подпрограмма завершения; если время записано в 2-элементный массив типа INTEGER*2, то первый элемент - старшая часть значения времени, второй элемент - младшая часть значения времени.

Примечания:

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

Более подробно планирование подпрограмм завершения описано в системной макрокоманде .MRKT.

Результаты функции:

I=0

- обычный выход;

I=1

- нет свободного элемента очереди, невозможно запланировать выполнение запроса.

Пример.

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

8.5.9. ПОДПРОГРАММА TIMASC

Подпрограмма TIMASC преобразует время, выраженное в 2-словном внутреннем формате и представляет его в массиве из 8-ми знаков кода КОИ-7 в следующей форме:

 

ЧЧ:ММ:CC

где

ЧЧ -

двузначное представление часов;

 

ММ -

двузначное представление минут;

 

СС -

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

Обращение к подпрограмме:

 
CALL TIMASC(ITIME,STRING)

где

ITIME

- время, выраженное в 2-словном внутреннем формате, которое необходимо преобразовать; первое слово параметра "ITIME" представляет старшую часть времени, второе слово - младшую часть;

 

STRING

- 8-элементный массив, принимающий запись в КОИ-7.

Ошибки отсутствуют.

В примере определяется количество времени до 17:00 и распечатывается результат.

Пример.

      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
99    FORMAT('ВРЕМЯ',8A1,' ДО 17.00 ')

8.5.10. ПОДПРОГРАММА TIME

Подпрограмма TIME представляет текущее системное время суток в виде 8-символьной строки знаков КОИ-7 в форме:

 

ЧЧ:ММ:СС

где

ЧЧ

- двузначное представление часов;

 

ММ

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

 

СС

- двузначное представление секунд.

Обращение к подпрограмме:

 
CALL TIME(STRING)

где

STRING

- 8-элементный массив, принимающий запись в КОИ-7.

Примечание. Используются 24-часовые часы. Например, час дня представляется как 13:00:00.

Ошибки отсутствуют.

Пример.

      LOGICAL*1 STRNG(8)
      . . .
      CALL TIME(STRNG)
      TYPE 99,(STRNG(I),I=1,8)
99    FORMAT(' ВРЕМЯ: ',8A1)

8.6. ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

8.6.1. ПОДПРОГРАММА CHAIN

Подпрограмма CHAIN позволяет программе пользователя вызвать другую программу пользователя, передавая ей при этом указанную информацию. Подпрограмма CHAIN не может быть вызвана из подпрограммы завершения или обработки прерывания.

При использовании подпрограммы CHAIN пользователь должен предварительно закрыть логические устройства вызовами подпрограммы CLOSE.

Обращение к подпрограмме:

 
CALL CHAIN (DBLK,VAR,WCNT)

где

DBLK

- 4-словная спецификация файла вызываемой программы в RADIX-50;

 

VAR

- первая переменная последовательности переменных с последовательно увеличивающимися адресами оперативной памяти, которые должны передаваться в вызываемую программу в специальной области оперативной памяти (абсолютные ячейки 510-777); описываемая последовательность может быть представлена одномерным массивом или блоком COMMON (или частью блока COMMON) и должна начинаться по чётному адресу (на границе слова);

 

WCNT

- счётчик слов (не более 60), указывающий число слов (начиная с первой переменной), которое должно быть передано вызываемой программе; если информация не передаётся, то параметр должен быть равен нулю.

Если размер области оперативной памяти, через которую подпрограмма CHAIN передаёт информацию в вызываемую программу, недостаточен, он может быть увеличен указанием ключа /B в команде CSI системной программе LINK или /BOTTOM в команде монитора LINK как для программы, выполняющей вызов CHAIN, так и для программы, принимающей управление.

Обращение к переданным данным может быть осуществлено вызовом подпрограммы RCHAIN.

Более полная информация представлена в описании макрокоманды .CHAIN

Ошибки отсутствуют.

В примере показывает передачу управления программе PROC.SAV, находящейся на устройстве BY1, при этом передаются значения переменных.

Пример.

      REAL*4 PROGNM(2)         !ОПИСАТЕЛЬ В RADIX-50
С                              ИМЕНИ ПРОГРАММЫ
      COMMON /BLK1/ А,В,С,D    !ПЕРЕДАВАЕМЫЕ ДАННЫЕ
      DАТА PROGNM/6RBY1PRO,6RG  SAV/
       . . .
      CALL CHAIN(PROGNM,A,8)   !ЗАГРУЗИТЬ BY1:PROG.SAV
С                              И ПЕРЕДАТЬ ЕЙ УПРАВЛЕНИЕ

8.6.2. ФУНКЦИЯ IDSTAT

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

Обращение к функции:

 
I=IDSTAT(DEVNAM,CBLK)

где

DEVNAM

- имя устройства в RADIX-50,

 

CBLK

- 4-словный массив, для получения информации об устройстве.

Массив из четырёх элементов типа INTEGER*2, имеет следующий формат:

1-е слово

- слово состояния устройства;

2-е слово

- размер драйвера (байты);

3-е слово

- точка входа драйвера (ненулевое содержимое этого слова означает, что драйвер находится в оперативной памяти);

4-е слово

- размер устройства (в блоках по 256 слов) для устройств с блочной структурой, содержимое этого слова равно нулю для устройств с последовательным доступом.

Примечание. Параметры функции IDSTAT должны размещаться в памяти так, чтобы они не перекрывались при свопинге USR.

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

Результаты функции:

I=0

- обычный выход;

I=1

- устройство не найдено в таблицах монитора.

В приведённом примере определяется, находится ли драйвер устройства печати в оперативной памяти. Если нет, то программа останавливается и печатает сообщение о том, что должен быть загружен указанный драйвер.

Пример.

      INTEGER*2 CBLK(4)
      DATA IDNAM /3RLP /
      DATA CBLK /4*0/
      CALL IDSTAT(IDNAM,CBLK)
      IF (CBLK(3).EQ.0 ) STOP 'ЗАГРУЗИТЬ ДРАЙВЕР LP: И '
*                             ' ПЕРЕЗАПУСТИТЬ ЗАДАНИЕ'

8.6.3. ФУНКЦИЯ IFETCH

Функция IFETCH загружает с системного устройства в оперативную память драйвер указанного устройства, делая это устройство доступным для операций ввода/ вывода. Драйвер загружается в свободную зону памяти, управляемую исполняющей системой Фортран. Если драйвер загружен, он не может быть освобождён, и память, в которой он находится, не может быть повторно использована для других целей. Функцию IFETCH нельзя вызывать из подпрограммы завершения или обработки прерывания, так как она требует действий USR. В ОС БК-11 предположительно не используется.

Обращение к функции:

 

I=IFETCH(DEVNAM)

где

DEVNAM

- однословное имя устройства в RADIX-50, для которого необходим драйвер; этот параметр может быть первым словом описания входного или выходного файла, генерируемого функцией ICSI; этот параметр должен располагаться в памяти так, чтобы не попадать в область свопинга USR.

Более подробно загрузка драйвера в оперативную память описывается в системной макрокоманде .FETCH.

Результаты функции:

I=0

- обычный выход;

I=1

- указанное устройство не существует;

I=2

- в памяти нет места для загрузки драйвера;

I=3

- на системном устройстве не существует драйвера указанного устройства.

Пример показывает загрузку в память драйвера RK. Выполнение программы прекращается, если драйвер не может быть загружен.

Пример

      REAL*4 IDNAM
      DATA IDNAM /3RRK /
       . . .
      IF (IFETCH(IDNAM).NE.0) STOP      !НЕУСТРАНИМАЯ ОШИБКА
C                                       ПРИ ЗАГРУЗКЕ ДРАЙВЕРА

8.6.4. ФУНКЦИЯ IQSET

Функция IQSET используется для увеличения числа доступных элементов очереди. Память под эти элементы выделяется в памяти, управляемой исполняющей системой Фортрана. Функцию IQSET нельзя вызывать из подпрограммы завершения или обслуживания прерывания. В ОС БК-11 предположительно не используется.

Обращение к функции:

 

I=IQSET(QLENG[,AREA])

где

QLENG

- количество (целое) элементов, которое добавляется к очереди; этот параметр должен помещаться в оперативной памяти так, чтобы не перекрываться USR при свопинге;

 

AREA

- память, выделяемая вызывающей программой; при работе под управлением SJ- и FB-мониторов необходимо следить, чтобы эта память не оказалась в области свопинга USR; если этот аргумент не указан при вызове, память выделяется в рабочей области исполняющей системы Фортрана.

Все операции ввода/вывода ОС БК-11 выполняются посредством централизованной системы управления очередью. Если поток запросов ввода/вывода очень велик и нет свободных элементов очереди, программа, посылающая запросы на ввод/вывод, может быть приостановлена до тех пор, пока не появится свободный элемент очереди. Если функция IQSET используется в оперативной программе, необходимо модифицировать команду монитора FRUN, чтобы выделить место для элементов очереди.

Необходимо придерживаться общего правила: каждая программа должна иметь элементов очереди на один больше общего числа запросов ввода/вывода и временных запросов, которые будут активизироваться одновременно. Функции по обслуживанию таймера, такие, как ITWAIT и MRKT, также используют элементы очереди, что должно учитываться при выделении элементов очереди для программы. Если выполняется синхронный, ввод/вывод (т.е. выполняются функции IREADW, IWRITW и т.д.), а функции по обслуживанию таймера не выполняются, не следует выделять дополнительные элементы очереди. Исполняющая система Фортрана автоматически предоставляет четыре элемента очереди.

Функции, работа которых требует элемент очереди:

IREAD/IREADC/IREADW

ISCHED

ISLEEP

ISPFM/ISPFNC/ISPFNW

ITIMER

IWRITE/IWRITC/IWRITW

MRKT

Дополнительная информация по расширению очереди приведена при описании системной макрокоманды .QSET.

Результаты функции:

I=0

- обычный выход;

I=1

- нет свободного места для дополнительных элементов очереди; выделение элементов не производилось.

Пример

      IF (IQSET(5).NE.0) STOP     !ДЛЯ ЭЛЕМЕНТОВ ОЧЕРЕДИ
С                                 НЕДОСТАТОЧНО ПАМЯТИ

8.6.5. ПОДПРОГРАММА LOCK

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

Если выполнены все условия, вызывающие свопинг, то часть программы пользователя записывается на диск в файл SWAP.SYS и USR загружается в оперативную память. В случае если USR уже находится в памяти, то свопинг не происходит. USR не освобождается до тех пор, пока не будет вызвана подпрограмма UNLOCK. Если в программе пользователя часто используется USR, то целесообразно сделать USR резидентной, закрепив её за заданием, чтобы не терять время на свопинг, выполнить все операции, связанные с вызовом USR, а затем освободить USR подпрограммой UNLOCK.

Обращение к подпрограмме:

      CALL LOCK

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

Примечания:

  1. Важно, чтобы вызов LOCK не производился из зоны, в которую будет помещаться USR. Если это произойдёт, то из USR возврат управления произойдёт не в программу пользователя, а в саму программу USR, т.к. LOCK сохраняет часть программы пользователя на диске, а на это место в оперативной памяти записывает программу USR. Более того, в программе не должно быть обращений к подпрограммам, переменным и массивам, находящимся в зоне свопинга, если USR резидентна после выполнения подпрограммы LOCK.
  2. Если подпрограмма LOCK выполнена, то нецелесообразно разрушать зону, в которую записана USR, даже в том случае, если не предполагается дальнейшее использование USR. В случае разрушения при выполнении функции UNLOCK могут получиться непредсказуемые результаты.
  3. Подпрограмму LOCK нельзя вызывать из подпрограммы завершения или обработки прерывания.
  4. Если дана команда монитора "SET USR NOSWAP" (т.е. запретить свопинг USR), то подпрограммы LOCK и UNLOCK не будут производить свопинг. Хотя LOCK будет запрещать другому заданию использовать USR, a UNLOCK - разрешать доступ к USR.
  5. Передаваемые подпрограмме USR списки параметров, такие как описание имён файлов и устройств, не должны храниться в зоне свопинга.

Ошибки отсутствуют

Пример.

      INTEGER*2 DBLK(4)
      DATA DBLK/3RDK1,3RDT1,3RFIL,3RP41/
       . . .
      CALL LOCK                ! ЗАКРЕПИТЬ USR В ПАМЯТИ
      ICHN=GETC( )             ! ИСПОЛЬЗОВАТЬ КАНАЛ
      IF (LOOKUP(ICHN,DBLK).LT.0)
*     STOP ' ?LOOKUP HE УДАЧЕН '
      CALL UNLOCK              ! ОСВОБОДИТЬ USR

8.6.6. ПОДПРОГРАММА RCHAIN

Подпрограмма RCHAIN позволяет программе пользователя определить, была ли она загружена при помощи вызова подпрограммы CHAIN другой программой, и получить доступ к переменным, передаваемым через специальную область в памяти.

Обращение к подпрограмме:

 
CALL RCHAIN (FLAG,VAR,WCNT)

где

FLAG

- целая переменная, которая устанавливается в -1, если программа вызвана по CHAIN, в противном случае - в нуль;

 

VAR

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

 

WCNT

- количество слов, передаваемых в зону, указанную параметром VAR; подпрограмма RCHAIN перемещает счётчик слов (WCNT) в область первой переменной (VAR).

Ошибки отсутствуют.

Пример.

      INTEGER*2 PARMS(50)
      CALL RCHAIN(IFLAG,PARMS,50)
      IF (IFLAG) GOTO 10        !ПЕРЕЙТИ К ОПЕРАТОРУ 10, ЕСЛИ
C                               ПРОГРАММА ВЫЗВАНА В ЦЕПОЧКЕ

8.6.7. ПОДПРОГРАММА RCTRLO

Подпрограмма RCTRLO отменяет действие команды <СУ/O>, которая была введена ранее с клавиатуры терминала, после вызова подпрограммы RCTRLO любой вывод на терминал будет осуществляться до тех пор, пока не будет вновь введена с терминала команда <СУ/O>.

Обращение к подпрограмме:

      CALL RCTRLO

Ошибки отсутствуют.

Пример.

      CALL RCTRLO
      CALL PRINT(' табличные данные ')

8.6.8. ПОДПРОГРАММА SCCA

Подпрограмма SCCA запрещает завершать программу по команде оператора <СУ/C>; даёт возможность программе различать одинарную и двойную команды <СУ/C>.

Обращение к подпрограмме:

 

CALL SCCA [(IFLAG)]

где

IFLAG

- слово состояния терминала, представляемое целым числом в формате INTEGER*2 (а не LOGICAL*1); оно должно быть предварительно очищено для того, чтобы можно было определить, вводилась ли дважды команда <СУ/C>.

Если после вызова SCCA с аргументом была подана команда <СУ/C>, то система игнорирует <СУ/C>, но помещает её в кольцевой буфер ввода. Находясь в буфере, этот символ (код "003) может быть считан программой как допустимый символ, если поступили с консоли сразу две команды <СУ/C>, то параметр IFLAG имеет ненулевое значение. Поэтому, для обнаружения этого эффекта, его необходимо предварительно проверить и очистить.

Вызов программы SCCA без аргумента отменяет описанную обработку команды <СУ/C>, возвращая систему в обычный режим.

Нормальная реакция системы на знак <СУ/C>, принятый из косвенного командного файла, не может быть отменена при помощи SCCA.

Ошибки отсутствуют.

В примере рассмотрены возможные варианты использования подпрограммы SCCA.

Пример.

      PROGRAM SCCA
      CALL PRINT(' ПРОГРАММА ЗАПУЩЕНА, ВВОДИТЕ ')
      IFLAG=0
      CALL SCCA(IFLAG)
10    I=ITTINR()               !ПРИНЯТЬ СИМВОЛ
      IF (I.NE.3) GOTO 10
C     БЫЛА ВВЕДЕНА КОМАНДА <CTRL/C>
      CALL PRINT(' БЫЛА КОМАНДА <CTRL/C> ')
      IF (IFLAG.EQ.0) GOTO 10
      CALL PRINT(' КОМАНДА <CTRL/C> ПОДРЯД ДВАЖДЫ ')
      TYPE 19,IFLAG
19    FORMAT(' IFLAG = ',06,/)
      CALL SCCA                !РАЗРЕШИТЬ ОБРАБОТКУ <CTRL/C>
      CALL PRINT(' ВВЕДИТЕ ДВА <CTRL/C> ДЛЯ ЗАВЕРШЕНИЯ')
20    GOTO 20                  !ЦИКЛ, ПОКА НЕ БУДЕТ
С                              КОМАНДА <CTRL/C>
      END

8.6.9. ПОДПРОГРАММА SETCMD

Подпрограмма SETCMD позволяет программе передать интерактивному монитору (KMON) командную строку, которая выполнится по выходе из программы. Командные строки передаются в область передачи информации по CHAIN (500-777, восьмеричное) и хранятся, начиная с ячейки 512 (восьмеричное). Программа не проверяет, перекрывает ли командная строка область стека. Поэтому, командная строка должна быть короткой и вызов подпрограммы желательно делать непосредственно перед завершением основной программы. Если необходимо выполнить несколько команд, то должен использоваться командный файл, содержащий нужное число командных строк.

Если используется подпрограмма SETCMD, то следующие команды KMON запрещены:

REENTER

START

CLOSE

Обращение к подпрограмме:

 
CALL SETCMD(STRING)

где

STRING

- командная строка для интерактивного монитора в формате ASCIZ, не содержащая символы <ВК> и <ПС>.

После вызова подпрограммы SETCMD для передачи управления монитору можно использовать как оператор STOP, так и подпрограмму EXIT.

Ошибки отсутствуют.

Пример.

      LOGICAL*1 INPUT(134),PROMPT(8)
      DATA PROMPT/'C','O','M','A','N','D','>',"200/
      CALL GTLIN(INPUT,PROMPT)
      CALL SETCMD(INPUT)
      END

8.6.10. ПОДПРОГРАММА UNLOCK

Подпрограмма UNLOCK разрешает свопинг USR. Если он был запрещён вызовом LOCK и освобождает USR, позволяя обращаться к нему другим заданиям. Если LOCK потребовало выполнения процедуры свопинга, то UNLOCK возвращает программу пользователя в память. Если свопинга при выполнении LOCK не потребовалось, то UNLOCK не порождает операций ввода/вывода.

Обращение к подпрограмме:

CALL UNLOCK

Примечание. Важно, чтобы вызовов UNLOCK было сделано не меньше, чем вызовов LOCK. Если вызовов LOCK сделано больше, чем вызовов UNLOCK, то USR остаётся резидентной в оперативной памяти и закреплённой за заданием. Если вызовов UNLOCK больше, ситуация ошибки не возникает, а лишние вызовы UNLOCK игнорируются.

Более подробно об освобождении USR описано в макрокомандах .LOCK/.UNLOCK.

Ошибки отсутствуют.

Пример.

С     ДЛЯ ВЫПОЛНЕНИЯ МНОЖЕСТВА ОПЕРАЦИЙ С USR
      CALL LOCK                !ЗАПРЕТИТЬ СВОПИНГ
С                              ВЫПОЛНИТЬ ВЫЗОВЫ USR
      . . .
      CALL UNLOCK              !ОСВОБОДИТЬ USR

8.7. СЛУЖЕБНЫЕ ОПЕРАЦИИ

8.7.1. ФУНКЦИЯ IADDR

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

Обращение к функции:

 
I=IADDR(ARG)

где

ARG

- параметр (переменная или константа), адрес которого необходимо получить; возвращаемое значение, если ARG является выражением, не предсказуемо.

Функция IADDR может использоваться для нахождения адреса подпрограмм при работе с подпрограммами на языке макроассемблера.

Результаты функции:

I - абсолютный адрес параметра.

Пример.

      EXTERNAL CAREA
      J=IADDR(CAREA)

8.7.2. ФУНКЦИЯ IPEEK

Функция IPEEK возвращает содержимое слова, находящегося по указанному абсолютному 16-разрядному адресу памяти. Эта функция может использоваться для проверки регистров устройства или какой-либо ячейки памяти.

Обращение к функции:

 
I=IPEEK(ADDR)

где

ADDR

- абсолютный адрес (целое) проверяемого слова; если этот параметр является нечётной величиной, то происходит прерывание.

Результаты функции:

I - содержимое слова, указанного адресом ADDR.

Пример.

ISWIT=IPEEK("177570) !ПОЛУЧИТЬ ЗНАЧЕНИЕ.

8.7.3. ФУНКЦИЯ IPEEKB

Функция IPEEKB возвращает содержимое байта, расположенного по указанному абсолютному адресу памяти. Поскольку эта программа работает с байтами, адрес может быть чётным или нечётным. Эта функция может использоваться для проверки регистров устройства или любого байта памяти, если значение проверяемого байта равно нулю, то в возвращаемом функцией значении старший байт также будет равен нулю.

Обращение к функции:

 
I=IPEEKB(ADDR)

где

ADDR

- абсолютный адрес (целое) проверяемого байта; в отличие от функции IPEEK функция IPEEKB допускает нечётные адреса.

Результаты функции:

I - содержимое байта, указанного адресом ADDR.

Пример.

IERR=IPEEKB("52) !ПОЛУЧИТЬ БАЙТ ОШИБКИ

8.7.4. ПОДПРОГРАММА IPOKE

Подпрограмма IPOKE записывает 16-битовую целую величину в заданную абсолютным адресом ячейку памяти. Это может использоваться для загрузки регистров устройств.

Обращение к подпрограмме:

 
CALL IPOKE(ADDR,IVALUE)

где

ADDR

- абсолютный адрес (целое) модифицируемой ячейки памяти; если этот параметр является нечётной величиной, то происходит прерывание;

 

IVALUE

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

Ошибки отсутствуют.

В примере передаётся значение IVAL в один из регистров диска.

Пример.

CALL IPOKE("177740, IVAL)

Для того, чтобы в 12 разряде ячейки, определяющей слово состояния задания, установить 1, без обнуления каких-либо других битов слова, необходимо использовать следующую форму:

CALL IPOKE("44,"10000.OR.IPEEK("44))

8.7.5. ПОДПРОГРАММА IPOKEB

Подпрограмма IPOKEB записывает определённую восьмиразрядную величину в указанный байт. Поскольку эта подпрограмма работает с байтами, указанный адрес может быть нечётным. Эта подпрограмма может использоваться для работы с регистрами внешних устройств.

Обращение к подпрограмме:

 
CALL IPOKEB(ADDR,VALUE)

где

ADDR

- абсолютный адрес (целое) байта. Подлежащего изменению; в отличие от подпрограммы IPOKE, функция IPOKEB допускает нечётную адресацию;

 

VALUE

- целое значение, которое будет храниться по адресу, определяемом параметром ADDR.

Ошибки отсутствуют.

Пример.

      CALL IPOKEB("53,"20)    !сообщить в KMON о
                              !грубой ошибке.

8.7.6. ФУНКЦИЯ ISPY

Функция ISPY возвращает в программу целое число - значение слова, находящегося на указанном смещении от начала RMON. Эта функция использует системную макрокоманду .GVAL для получения значений, записанных в ячейках монитора и имеющих фиксированные смещения.

Обращение к функции:

 
I=ISPY(IOFF)

где

IOFF

- смещение от базы резидента монитора RMON до ячейки, которую необходимо прочитать.

Результаты функции:

I - содержимое слова, находящегося на смещении IOFF от начала RMON.

8.8. 32-РАЗРЯДНАЯ АРИФМЕТИКА

8.8.1. ФУНКЦИЯ AJFLT

Функция AJFLT преобразует целую величину типа INTEGER*4 в вещественную величину типа REAL*4 и возвращает результат как значение функции.

Обращение к функции:

 
A=AJFLT (JARG)

где

JARG

- целая величина типа INTEGER*4, которую необходимо преобразовать.

Результаты функции:

A - вещественная величина типа REAL*4.

В примере преобразуется целая величина типа INTEGER*4, содержащаяся в JVAL, в вещественную величину одинарной точности типа REAL*4, умножается на 3.5 и результат записывается в VALUE.

Пример.

      REAL*4 VALUE,AJFLT
      INTEGER*4 JVAL
      . . .
      VALUE = AJFLT(JVAL)*3.5

8.8.2. ФУНКЦИЯ DJFLT

Функция DJFLT преобразует целую величину типа INTEGER*4 в вещественную величину двойной точности (тип REAL*8, DOUBLE PRECISION) и возвращает результат преобразования как значение функции.

Обращение к функции:

 
A=DJFLT(JARG)

где

JARG

- описывает величину типа INTEGER*4, которую необходимо преобразовать.

Примечание. Если используется функция DJFLT, то она должна быть описана явно как вещественная величина двойной точности (REAL*8 DJFLT) или неявно (IMPLICIT REAL*8 (D)) в программе на языке Фортран. Если это не сделано, то предполагается тип величины REAL*4 (вещественная, одинарной точности).

Результаты функции:

A - вещественная величина типа REAL*8.

Пример.

      INTEGER*4 JVAL
      REAL*8 DJFLT,D
      . . .
      D=DJFLT(JVAL)

8.8.3. ФУНКЦИЯ IAJFLT

Функция IAJFLT преобразует целую величину типа INTEGER*4 в вещественную величину типа REAL*4 и запоминает результат.

Обращение к функции:

 
I=IAJFLT(JARG,ARES)

где

JARG

- целое типа INTEGER*4, которое необходимо преобразовать;

 

ARES

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

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный;

I=-2

- при преобразовании потеряны значащие цифры.

Пример.

      INTEGER*4 JVAL
      REAL*4 RESULT
      . . .
      IF (IAJFLT(JVAL,RESULT).EQ.-2)TYPE 99
99    FORMAT(' ПЕРЕПОЛНЕНИЕ ПРИ ПРЕОБРАЗОВАНИИ ',
*     ' ЦЕЛОЙ ВЕЛИЧИНЫ В ВЕЩЕСТВЕННУЮ')

8.8.4. ФУНКЦИЯ IDJFLT

Функция IDJFLT преобразует целое типа INTEGER*4 в вещественную величину типа REAL*8 (DOUBLE PRECISION) и запоминает результат.

Обращение к функции:

 
I=IDJFLT(JARG,DRES)

где

JARG

- преобразуемая величина типа INTEGER*4;

 

DRES

- переменная типа REAL*8 для записи результата преобразований.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный.

Пример.

      INTEGER*4 JJ
      REAL*8 DJ
      . . .
      IF (IDJFLT(JJ,DJ).LE.0) TYPE 99
99    FORMAT(' ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ')

8.8.5. ФУНКЦИЯ IJCVT

Функция IJCVT преобразует величину типа INTEGER*4 в величину типа INTEGER*2.

Обращение к функции:

 
I=IJCVT(JARG[,IRES])

где

JARG

- переменная или элемент массива типа INTEGER*4, значение которого необходимо преобразовать;

 

IRES

- переменная типа INTEGER*2, предназначенная для записи результата преобразования.

Если параметр IRES не указан, то результат помещается во входную переменную INTEGER*2 (параметр JARG).

Результаты функции: (если IRES задано)

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный;

I=-2

- во время преобразования произошло переполнение.

Пример.

      INTEGER*4 JVAL
      INTEGER*2 IVAL
      . . .
      IF (IJCVT(JVAL,IVAL).EQ.-2)TYPE 99
99    FORMAT(' СЛИШКОМ БОЛЬШОЕ ЧИСЛО')

8.8.6. ФУНКЦИЯ JADD

Функция JADD вычисляет сумму двух величин типа INTEGER*4.

Обращение к функции:

 
I=JADD (JARG1,JARG2,JRES)

где

JARG1

- целое типа INTEGER*4;

 

JARG2

- целое типа INTEGER*4;

 

JRES

- целая переменная типа INTEGER*4, в которую помещается сумма операндов.

Результаты функции:

I=-1

-обычный выход. Результат отрицательный;

I=0

- обычный выход. Результат равен нулю;

I=1

- обычный выход. Результат положительный;

I=-2

- во время вычисления результата произошло переполнение.

Пример.

      INTEGER*4 JOP1,JOP2,JRES
      . . .
      IF (JADD(JOP1,JOP2,JRES).EQ.-2) GOTO 100

8.8.7. ФУНКЦИЯ JAFIX

Функция JAFIX преобразует величину типа REAL*4 в величину типа INTEGER*4.

Обращение к функции:

 
I=JAFIX (AARG,JRES)

где

AARG

- величина типа REAL*4 (константа или выражение), преобразуемая в величину типа INTEGER*4;

 

JRES

- переменная типа INTEGER*4, в которую помещается результат преобразования.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный;

I=-2

- во время вычисления результата произошло переполнение.

Пример.

      REAL*4 A
      INTEGER*4 JOP1
      . . .
      ACCEPT 99,А
99    FORMAT(F15.0)
      IF (JAFIX(А,JOP1).EQ.-2) GOTO 100

8.8.8. ФУНКЦИЯ JCMP

Функция JCMP сравнивает два значения типа INTEGER*4 и возвращает величину типа INTEGER*2, которая показывает результат сравнения.

Обращение к функции:

 
I=JCMP (JARG1,JARG2)

где

JARG1

- целое типа INTEGER*4 или элемент массива, представляющий первый операнд сравнения;

 

JARG2

- целое типа INTEGER*4 или элемент массива, представляющий второй операнд сравнения.

Результаты функции:

I=-1

- если JARG1 < JARG2;

I=0

- если JARG1 = JARG2;

I=1

- если JARG1 > JARG2 .

Пример.

      INTEGER*4 JOPX,JOPY
      . . .
      IF (JCMP(JOPX,JOPY)) 10,20,30

8.8.9. ФУНКЦИЯ JDFIX

Функция JDFIX преобразует величину типа REAL*8 (DOUBLE PRECISION) в величину типа INTEGER*4.

Обращение к функции:

 
I=JDFIX(DARG,JRES)

где

DARG

- значение типа REAL*8, которое необходимо преобразовать в величину типа INTEGER*4)

 

JRES

- переменная типа INTEGER*4, в которой записывается результат преобразования.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный;

I=-2

- во время вычисления результата произошло переполнение.

Пример.

      INTEGER*4 JNUM
      REAL*8 DPNUM
      . . .
20    TYPE 98
98    FORMAT('¤ВВЕДИТЕ ПОЛОЖИТЕЛЬНОЕ ЧИСЛО:')
      ACCEPT 99,DPNUM
99    FORMAT(D20.0)
      IF (JDFIX(DPNUM,JNUM).LT.0) GOTO 20

8.8.10. ФУНКЦИЯ JDIV

Функция JDIV вычисляет частное двух величин типа INTEGER*4.

Обращение к функции:

 
I=JDIV(JARG1,JARG2,JRES[,JREM])

где

JARG1

- целое типа INTEGER*4, делимое;

 

JARG2

- целое типа INTEGER*4, делитель;

 

JRES

- переменная типа INTEGER*4, в которую помещается частное;

 

JREM

- переменная типа INTEGER*4, в которую помещается остаток от деления.

Результаты функции:

I=-1

- обычный выход, частное отрицательно;

I=0

- обычный выход, частное равно нуля;

I=1

- обычный выход, частное положительно;

I=-3

- была предпринята попытка разделить на нуль.

Пример.

      INTEGER*4 JN1,JN2,JQUO
      CALL JDIV(JN1,JN2,JQUO)

8.8.11. ФУНКЦИЯ JICVT

Функция JICVT преобразует величину типа INTEGER*2 в величину типа INTEGER*4.

Обращение к функции:

 
I=JICVT(IARG,JRES)

где

IARG

- целое типа INTEGER*2, которое необходимо преобразовать;

 

JRES

- переменная или элемент массива типа INTEGER*4, в который записывается результат.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный.

Пример.

      INTEGER*4 JVAL
      CALL JICVT(478,JVAL)     !сформировать 32-разрядную
C                              константу

8.8.12. ПОДПРОГРАММА JJCVT

Подпрограмма JJCVT меняет местами содержимое слов переменной типа INTEGER*4 для получения значения времени во внутреннем формате и наоборот. Это необходимо в случаях, когда величина типа INTEGER*4 должна использоваться в качестве параметра подпрограммы (например, ITWAIT) по обслуживанию таймера. Время во внутреннем формате представлено следующим образом: старшая часть - в первом слове, младшая часть - во втором слове.

Обращение к подпрограмме:

 
CALL JJCVT(JARG)

где

JARG

- переменная типа INTEGER*4, содержимое которой необходимо преобразовать.

Ошибки отсутствуют.

Пример.

      INTEGER*4 TIME
. . .
CALL GTIME(TIME)         !определение времени суток
CALL JJCVT(TIME)         !преобразование в INTEGER*4

8.8.13. ФУНКЦИЯ JMOV

Функция JMOV присваивает значение переменной типа INTEGER*4 другой переменной типа INTEGER*4 и возвращает знак присвоенного значения.

Обращение к функции:

 
I=JMOV (JARG,JRES)

где

JARG

- целое типа INTEGER*4, значение которого присваивается второму аргументу;

 

JRES

- переменная типа INTEGER*4, которой присваивается значение JARG.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный.

В примере функция JMOV используется для сравнения с нулём в логическом IF.

Пример.

      INTEGER*4 INT1
      . . .
      IF (JMOV(INT1,INT1) 300,100,300   !перейти на метку 300,
С                                         если INT1 не равна 0

8.8.14. ФУНКЦИЯ JMUL

Функция JMUL вычисляет произведение величин типа INTEGER*4.

Обращение к функции:

 
I=JMUL(JARG1,JARG2,JRES)

где

JARG1

- целое типа INTEGER*4, множимое;

 

JARG2

- целое типа INTEGER*4, множитель;

 

JRES

- переменная типа INTEGER*4, в которую записывается произведение.

Результаты функции:

I=-1

- обычный выход, произведение отрицательно;

I=0

- обычный выход,, произведение равно нулю;

I=1

- обычный выход, произведение положительно;

I=-2

- при вычислении результата произошло переполнение.

Пример.

      INTEGER*4 J1,J2,JRES
      . . .
      IF (JMUL(J1,J2,JRES)+1) 100,10,20
C
C     перейти на 100, если переполнение
C     перейти на 10, если результат отрицательный
C     перейти на 20, если результат положительный или
C     нуль

8.8.15. ФУНКЦИЯ JSUB

Функция JSUB вычисляет разность между двумя величинами типа INTEGER*4.

Обращение к функции:

 
I=JSUB (JARG1,JARG2,JRES)

где

JARG1

- целое типа INTEGER*4, уменьшаемое;

 

JARG2

- целое типа INTEGER*4, вычитаемое;

 

JRES

- переменная типа INTEGER*4, предназначенная для занесения вычисленной разности.

Результаты функции:

I=-1

- обычный выход, результат отрицательный;

I=0

- обычный выход, результат равен нулю;

I=1

- обычный выход, результат положительный;

I=-2

- при вычислении результата произошло переполнение.

Пример.

      INTEGER*4 JOP1,JOP2,J3
      . . .
      CALL JSUB(JOP1,JOP2,J3)

8.9. РАБОТА СО СТРОКАМИ

8.9.1. ПОДПРОГРАММА CONCAT

Подпрограмма CONCAT предназначена для конкатенации (объединения) двух строк символов в одну.

Обращение к подпрограмме:

 
CALL CONCAT(A,B,OUT[,LEN[,ERR]])

где

A

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

 

B

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

 

OUT

- массив, в который помещается результат соединения; этот массив по числу элементов должен быть по крайней мере на единицу больше максимальной длины результата соединения (т.е. на единицу больше значения LEN, если оно указано);

 

LEN

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

 

ERR

- логическая переменная; признак ошибки, который принимает значение .TRUE., если результирующая строка усекается до длины, указанной параметром LEN.

Массив OUT заполняется символами массива "A", затем - символами массива "B", и в конце помещается ограничивающий символ "нуль". Допускается любая комбинация параметров, описывающих массивы строк. За исключением случая, когда параметры "B" и OUT определяют один и тот же массив, соединение в цепочку прекращается в случаях, когда в массиве "B" обнаружен ограничивающий символ "нуль", или когда число переданных символов равно указанному параметром LEN.

Если указан параметр ERR и длина результирующей строки окажется больше описанной параметром LEN, то параметр ERR устанавливается в .TRUE.; в противном случае параметр ERR остаётся без изменения. Поэтому, если контроль ведётся по значению ERR, то перед вызовом подпрограммы необходимо занести значение .FALSE. в ERR.

Если одна из двух строк пустая (правая или левая), то вторая строка (непустая) копируется в массив OUT. Если обе строки пусты, то в OUT записывается пустая строка. В обоих случаях старое содержимое строки OUT при вызове подпрограммы CONCAT будет потеряно.

Ошибки:

Ошибка указывается переменной ERR, если она специфицирована. Если переменная ERR задана и выходная строка занимает большую длину, чем указано параметром LEN, то переменная ERR принимает значение .TRUE., иначе переменная ERR не изменяется.

В примере объединяются строки, размещённые в массивах STR и IN. Запись ведётся в массив OUT, допускающий длину результирующей строки не более 29 символов.

Пример.

      LOGICAL*1 IN(30),OUT(30),STR(7)
      . . .
      CALL CONCAT(STR,IN,OUT,29)

8.9.2. ПОДПРОГРАММА INDEX

Подпрограмма INDEX просматривает исходную строку для нахождения в ней копии другой строки (образца) и возвращает номер позиции первого совпадения подстроки в просматриваемой строке с образцом.

Обращение к подпрограмме:

 
CALL INDEX(A,PATTRN,[I],M)

или

I=INDEX(A,PATTRN[,I])

где

A

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

 

PATTRN

- строка, которую необходимо найти в "A"; образец поиска; строка должна оканчиваться байтом 0;

 

I

- целая начальная позиция в просмотрах массива "A"; если параметр "I" опущен, то массив "A" просматривается, начиная с первого символа, т.е. по умолчанию I=1;

 

M

- целое, результат просмотра; равен номеру позиции начала образца в массиве "A", если образец был найден; в противном случае "M" равно 0.

Ошибки отсутствуют.

В примере просматривается массив STRING для нахождения первой копии строк EFG и XYZ и просматривается строка ABCABCABC для нахождения копии строки ABC после 5-й позиции.

Пример.

      CALL SCOPY('ABCDEFGHI',STRING) !ИНИЦИАЛИЗИРОВАТЬ
C                                   СТРОКУ
      CALL INDEX(STRING,'EFG',,M)   !M=5
      CALL INDEX(STRING,'XYZ',,N)   !N=0
      CALL INDEX(ABCABCABC,ABC,5,I) !I=7

8.9.3. ПОДПРОГРАММА INSERT

Подпрограмма INSERT заменяет часть одной строки другой строкой.

Обращение к подпрограмме:

 
CALL INSERT(IN,OUT,I[,M])

где

IN

- массив, содержащий вставляемую строку; строка должна завершаться байтом, равным нулю, если её длина меньше значения M, или, если M не задано;

 

OUT

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

 

I

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

 

M

- целое, максимальное число вставляемых символов.

Если максимальное число символов не указано, все символы справа от указанной позиции символа (I) в модифицируемой строке замещаются вставляемой строкой. Вставляемая строка (IN) и модифицируемая строка (OUT) могут находиться в одном массиве только в случае, если указано максимальное число символов (M) и оно меньше или равно разности между номером позиции, с которой начинается вставка, и максимальной длиной строки, допустимой для данного массива.

Ошибки отсутствуют.

Пример.

      CALL SCOPY('ABCDEFGHIJ',S1)  !инициализировать строку 1
      CALL SCOPY(S1,S2)            !инициализировать строку 2
      CALL INSERT('123',S1,6,3)    !S1='ABCDE123IJ'
      CALL INSERT('123',S2,4)      !S2='ABC123'

8.9.4. ФУНКЦИЯ LEN

Функция LEN определяет число символов строки, находящейся в указанном массиве. Символы считаются до первого нулевого байта. Если указанный массив содержит пустую строку, то возвращается величина, равная нулю.

Обращение к функции:

 
L=LEN(A)

где

А

- массив, содержащий строку; строка должна завершаться байтом 0;

Ошибки отсутствуют.

Пример.

      LOGICAL*1 STRNG(73)
      . . .
      TYPE 99,(STRNG(I),I=1,LEN(STRNG))
99    FORMAT('0',132A1)

8.9.5. ПОДПРОГРАММА REPEAT

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

Обращение к подпрограмме:

 
CALL REPEAT (IN,OUT,I[,LEN[,ERR]])

где

IN

- массив, содержащий строку, которую необходимо повторить; строка должна завершаться байтом 0;

 

OUT

- массив, в который помещается результирующая строка; этот массив должен быть, по крайней мере, на один элемент больше значения параметра LEN, если он указан; также, если указан LEN, выходная строка будет завершена байтом 0;

 

I

- количество (целое) повторений входной строки;

 

LEN

- максимальная длина (целое) результирующей строки;

 

ERR

- логическая переменная; признак ошибки, который устанавливается в состояние .TRUE., если результирующая строка усекается до длины, указанной параметром LEN.

Если число повторений (параметр "I") равно единице или нулю, то исходная и результирующая строки могут находиться в одном массиве. Если число повторений равно единице, то эта подпрограмма эквивалентна функции SCOPY; если число повторений равно нулю, то в массив, указанный параметром OUT, помещается пустая строка. Старое содержимое этого массива при вызове подпрограммы REPEAT стирается.

Ошибки:

Наличие ошибки указывается параметром ERR, если он задан. Если параметр ERR задан, а результирующая строка имеет длину больше указанной параметром LEN, то параметр ERR устанавливается в .TRUE.. В противном случае состояние параметра ERR не изменится. Поэтому, если ведётся контроль значения переменной ERR, перед вызовом подпрограммы REPEAT этой переменной необходимо присвоить значение .FALSE..

Пример.

      LOGICAL*1 SIN(21),SOUT(101)
      . . .
      CALL REPEAT(SIN,SOUT,5)

8.9.6. ПОДПРОГРАММА SCOMP/ISCOMP

Подпрограмма SCOMP сравнивает две строки символов и возвращает целое - результат сравнения.

Обращение к подпрограмме:

 
CALL SCOMP(A,B,I) 

или

I=ISCOMP(A,B)

где

A

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

 

B

- массив, содержащий вторую строку; строка должна завершаться байтом 0;

 

I

- целая переменная, принимающая результат сравнения. Строки сравниваются слева направо по одному символу, с использованием упорядоченности символов КОИ-7.

Если сравниваемые строки не совпадают, то абсолютная величина переменной "I" (или результат выполнения функции ISCOMP) - это позиция первого символа, на котором обнаружено несовпадение при просмотре слева направо.

Если строки по длине неодинаковы, то более короткая строка рассматривается, как заполненная справа пробелами до длины другой строки. Пустая строка эквивалентна строке, содержащей только пробелы.

Знак результата в случае несовпадения строк определяется лексикографическим порядком не совпавших символов.

Результаты функции:

I<0

- если A меньше B;

I=0

-если A равно B;

I>0

-если A больше B.

Пример.

      LOGICAL*1 INSTR(81)
      . . .
      CALL GETSTR(5,INSTR,80)
      CALL SCOMP('YES',INSTR,IVAL)
      IF (IVAL) GOTO 10

8.9.7. ПОДПРОГРАММА SCOPY

Подпрограмма SCOPY копирует строку символов из одного массива в другой. Копирование прекращается или при нахождении символа "нуль", или, когда переписано заданное число символов.

Обращение к подпрограмме:

 
CALL SCOPY(IN,OUT[,LEN[,ERR]])

где

IN

- массив, содержащий строку, которую необходимо копировать; строка должна завершаться байтом 0, если LEN не задано, или, если строка короче LEN;

 

OUT

- массив, предназначенный для приёма копируемой строки; этот массив должен иметь длину, по крайней мере, на единицу больше длины, задаваемой параметром LEN, если этот параметр указан, также, если LEN указан, выходная строка будет завершена байтом 0;

 

LEN

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

 

ERR

- логическая переменная, которая принимает значение .TRUE., если результирующая строка была усечена до длины, указанной параметром LEN.

Параметры IN и OUT могут описывать один и тот же массив. Строка, ранее содержавшаяся в выходном массиве, теряется при вызове подпрограммы SCOPY.

Ошибки:

Возникновение ошибок указывается параметром ERR; если параметр ERR задан, а результирующая строка была усечена до длины, заданной параметром LEN, то параметр ERR устанавливается в .TRUE.; в противном случае значение параметра ERR не изменяется; поэтому, если ведётся контроль значения этой переменной, то перед вызовом подпрограммы SCOPY ей необходимо присвоить значение .FALSE.

В примере подпрограмма SCOPY применяется для задания начального значения.

Пример.

      LOGICAL*1 STRING(80)
      CALL SCOPY(' НАЧАЛЬНОЕ ЗНАЧЕНИЕ ' ,STRING)

8.9.8. ПОДПРОГРАММА STRPAD

Подпрограмма STRPAD дополняет строку символов справа пробелами до заданной длины, изменения производятся на исходном массиве. Если действительная длина строки больше или равна заданной длине, то заполнение пробелами не происходит.

Обращение к подпрограмме:

 
CALL STRPAD(A,LEN[,ERR])

где

A

- строка, которую дополняют пробелами; строка должна завершаться байтом 0; массив, содержащий строку, должен иметь размер, по крайней мере на 1 больше, чем значение параметра LEN; результирующая строка также будет завершаться байтом 0;

 

LEN

- длина (целое) результирующей строки;

 

ERR

- признак логической ошибки, который устанавливается в .TRUE., если строка, указанная параметром "A" имеет длину, превосходящую значение параметра LEN.

Ошибки:

Наличие ошибок указывается параметром ERR. Если он задан, если входная строка длиннее, чем заданное значение параметра LEN, то параметр ERR устанавливается в .TRUE.; в противном случае значение параметра ERR не изменяется; поэтому, если ведётся контроль значения этой переменной, то перед вызовом подпрограммы, параметру ERR необходимо присвоить значение .FALSE..

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

Пример.

      LOGICAL*1 STR(81)
      . . .
      CALL STRPAD(STR,80)       !гарантировать 80
С                               символов
      PRINT 100,(STR(I),I=1,80) !отпечатать строку из 80
C                               символов
100   FORMAT(80A1)

8.9.9. ПОДПРОГРАММА SUBSTR

Подпрограмма SUBSTR копирует часть строки, начиная с заданной позиции входной строки символов. При желании, копируемая часть строки может писаться в тот массив, в котором находится копируемая строка.

Обращение к подпрограмме:

 
CALL SUBSTR(IN,OUT,I[,LEN])

где

IN

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

 

OUT

- массив, в который помещается результат; массив должен быть на один элемент длиннее, чем указано параметром LEN, если он задан; также, если LEN указан, то выходная строка будет завершена байтом 0;

 

I

- номер (целое) позиции символа в исходной строке, с которого начинается копирование, т.е. первый символ необходимой части строки;

 

LEN

- максимальная длина (целое) копируемой части строки.

Если максимальная длина (параметр LEN) не указана, то копируемая часть строки содержит все символы справа от позиции символа "I" в массиве IN и не будет завершаться байтом 0. Если LEN задан, то подстрока копируется и завершается байтом 0. Если значение параметра LEN равно нулю, то массив OUT заполняется пустой строкой. При вызове этой подпрограммы старое содержимое массива OUT теряется.

Ошибки отсутствуют.

8.9.10. ПОДПРОГРАММА TRANSL

Подпрограмма TRANSL производит замену символов в указанной строке. Для выполнений подпрограммы TRANSL требуется приблизительно 64 слова в стеке. Это нужно учитывать при выделении памяти для стека.

Обращение к подпрограмме:

 
CALL TRANSL (IN,OUT,R[,P])

где

IN

- массив, содержащий исходную строку; строка должна завершаться байтом 0;

 

OUT

- массив, принимающий преобразованную строку; строка не завершается байтом 0;

 

R

- массив, содержащий строку знаков замены; строка должна завершаться байтом 0;

 

P

- массив, содержащий строку знаков, которые необходимо перекодировать; строка должна завершаться байтом 0;

Строка OUT заменяется строкой IN и модифицируется преобразованием символов, определяемым массивами "R" и "P". Если элемент массива IN содержит символ, появляющийся в строке "P" в позиции "I", то в массиве OUT он заменяется символом из позиции "I" строки "R".

Если массив "P" не указан, то предполагается, что он состоит из 127 7-битовых символов КОИ-7, расположенных в возрастающем порядке, начиная с символа с кодом "001. Если заданы различающиеся по длине строки "R" и "P". То длинная строка усекается до размера короткой. Если в строке "P" символ появляется более одного раза, то значение имеет только последнее его появление. В строке "R" символ может появляться любое число раз.

Ошибки отсутствуют.

Примеры:

В первом примере копируется строка массива "A" в массив "B". Все точки внутри массива "B" заменяются на минус, а все знаки вопроса - на восклицательные знаки.

      CALL TRANSL(A,B,'-!','.?')

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

      LOGICAL*1 STRING(22),RESULT(22),PATRN(22)
С
C     УКАЗАТЬ СТРОКУ, КОТОРУЮ НЕОБХОДИМО ПРЕОБРАЗОВАТЬ
С
      CALL SCOPY('ГОРН ЗВУЧИТ В ПОЛНОЧЬ',STRING)
С
С     000000000111111111122
С     123456789012345678901
С     ГОРН ЗВУЧИТ В ПОЛНОЧЬ
С
C     УСТАНОВИТЬ ШАБЛОН ДЛЯ ПОЛУЧЕНИЯ СЛЕДУЮЩЕГО ФОРМАТА
С     13,14,15,16,17,18,19,20,21,12,1,2,3,4,5,6,7,8,9,10,11,
С
      DO 10 I=13,21
10    PATRN(I-12)=I
      PATRN(10)=12
      DO 20 I=1,11
20    PATRN(I+10)=I
      PATRN(22)=0
C
С     ВЫЗОВ ПРОГРАММЫ TRANSL ПЕРЕСТРАИВАЕТ СИМВОЛЫ ИСХОДНОЙ
С     СТРОКИ В ПОРЯДОК, ЗАДАННЫЙ ШАБЛОНОМ
С
      CALL TRANSL(PATRN,RESULT,STRING)
С
С     РЕЗУЛЬТИРУЮЩАЯ СТРОКА "В ПОЛНОЧЬ ГОРН ЗВУЧИТ". ЭТОТ
С     СПОСОБ МОЖНО ИСПОЛЬЗОВАТЬ ДЛЯ ФОРМАТИРОВАНИЯ
С     ИСХОДНЫХ СТРОК ДЛИНОЙ ДО 127 СИМВОЛОВ. ДЛИНА
С     РЕЗУЛЬТИРУЮЩЕЙ СТРОКИ РАВНА ДЛИНЕ СТРОКИ-ШАБЛОНА.

8.9.11. ПОДПРОГРАММА TRIM

Подпрограмма TRIM укорачивает заданную строку символов путём удаления всех конечных пробелов. Конечным пробелом является пробел, справа от которого отсутствуют значащие символы. Если вся заданная строка состоит из пробелов, то она заменяется пустой строкой. Если заданная строка не имеет конечных пробелов, то она остаётся без изменения.

Обращение к подпрограмме:

 
CALL TRIM(A)

где

A

- массив, содержащий строку, которую необходимо укоротить; эта строка должна завершаться байтом 0; после вызова подпрограммы TRIM эта строка также будет завершаться байтом 0.

Ошибки отсутствуют.

Пример.

      LOGICAL*1 STRING(81)
      ACCEPT 100,(STRING(I),I=1,80)
100   FORMAT(80A1)
      CALL SCOPY(STRING,STRING,80) !создать формат ASCIZ
      CALL TRIM(STRING)            !укоротить строку

8.9.12. ПОДПРОГРАММА IVERIF/VERIFY

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

Обращение к подпрограмме:

 
CALL VERIFY(A,B,I)

или

I=IVERIF(A,B)

где

A

- массив, содержащий проверяемую строку; строка должна оканчиваться байтом 0;

 

В

- массив, содержащий образец - строку символов, проверяемых в массиве "A"; эта строка должна завершаться байтом 0;

 

I

- целый результат проверки.

Результаты функции:

I=0

- все символы строки "A" существуют в строке "B";

I=N

- где N является номером позиции первого символа строки "A", который не найден в строке "B"; если строка "B" является пустой, а строка "A" - нет, то I=1.

В примере исходными данными являются десятичные числа без знака, запись которых содержит от одной до пяти цифр и которые затем преобразуются в двоичный вид кода КОИ-7.

Пример.

      LOGICAL*1 INSTR(81)
      . . .
      CALL VERIFY(INSTR(IPOS), '0123456789',I)
      IF (I.EQ.1) STOP 'ЧИСЛО HE ЗАДАНО'
      IF (I.EQ.0) I=LEN(INSTR)-IPOS+1
      IF (I.GT.5) STOP 'СЛИШКОМ МНОГО ЦИФР'
      NUM=IVALUE(INSTR(IPOS),I)
       . . .
      END
      FUNCTION IVALUE(ARRAY,I)
      LOGICAL*1 ARRAY(L)
      DECODE(I,99,ARRAY) IVALUE
99    FORMAT(I5)
      END

8.9.13. ФУНКЦИЯ IRAD50

Функция IRAD50 преобразует указанное число символов, представленных в КОИ-7, в код RADIX-50 и подсчитывает количество преобразованных символов. Преобразование прекращается по первому, встретившемуся на вводе, символу, недопустимому для кода RADIX-50, или когда выполнилось преобразование указанного числа символов КОИ-7.

Обращение к функции:

 
N=IRAD50(ICNT,INPUT,OUTPUT)

где

N

- целое число преобразованных входных символов;

 

ICNT

- число преобразуемых символов КОИ-7;

 

INPUT

- массив, из которого берутся символы для преобразования;

 

OUTPUT

- массив, в котором запоминаются преобразованные в RADIX-50 символы.

Три символа текста упаковываются в одно слово. Число преобразованных выходных слов вычисляется выражением (в целых словах):

(ICNT*2)/3,

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

Результаты функции:

N - число преобразованных символов.

Пример.

      REAL*8 FSPEC
      CALL IRAD50(12,'SY0TEMP  DАТ',FSРЕС)

8.9.14. ПОДПРОГРАММА R50ASC

Подпрограмма R50ASC преобразует заданное число слов, в коде RADIX-50, в символы КОИ-7.

Обращение к подпрограмме:

 
CALL R50ASC(ICNT,INPUT,OUTPUT)

где

ICNT

- число символов, получаемых в КОИ-7;

 

INPUT

- массив, из которого берутся слова для преобразования, причём, читается (ICNT+2)/3 слов;

 

OUTPUT

- массив, в который записываются символы КОИ-7.

Ошибки:

Если во входном слове, представленном в RADIX-50, слово больше восьмеричного числа 174777 (беззнаковое сравнение), то подпрограмма для этой величины выводит вопросительные знаки.

Пример.

      REAL*8 NAME
      LOGICAL*1 OUTP(12)
      . . .
      CALL R50ASC(12,NAME,OUTP)

8.9.15. ФУНКЦИЯ RAD50

Функция RAD50 предоставляет метод перекодировки спецификаций файлов системы ОС БК-11. Функция RAD50 преобразует шесть символов КОИ-7 из заданного массива, получая при этом результат в виде величины типа REAL*4, представляющей собой 2-словное значение RADIX-50.

Обращение к функции:

 
A=RAD50(INPUT)

где

INPUT

- массив, из которого берутся преобразуемые символы КОИ-7.

Это обращение к функции эквивалентно обращению к подпрограмме IRAD50:

      CALL IRAD50(6,LINE,A)

Значением функции RAD50 является 2-словное значение в коде RADIX-50.

Performed by © gid, 2012-2024.