Документ кропотливо восстановлен из фотокопии, которую любезно предоставил ММ. Который превозмог себя и по-быстрому отфотографировал документ из собственной коллекции.
УТВЕРЖДЁН
00008-01.33.01-1-ЛУ
ПЕРСОНАЛЬНАЯ ЭВМ "ЭЛЕКТРОНИКА МС0513"
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
ОПЕРАЦИОННАЯ СИСТЕМА ОС БК11
СИСТЕМНЫЕ ТАБЛИЦЫ И БИБЛИОТЕКИ
РУКОВОДСТВО ПРОГРАММИСТА
00008-01.33.01-1
Документ совпадает с книгой "Руководство системного программиста. Книга 1. Системные таблицы и библиотеки." Из комплекта документации РАФОС-II, но только в части, касающейся SJ-монитора и без расширенной памяти
1988
АННОТАЦИЯ
Данный документ состоит из двух частей.
В первой части дано описание системной макробиблиотеки и системной объектной библиотеки. Вводятся основные понятия, необходимые при работе с этими библиотеками. И правила обращения к макрокомандам, процедурам и функциям библиотек. Кроме этого даётся краткое описание системных таблиц (системная область связи и фиксированные смещения в резидентном мониторе).
Вторая часть документа содержит рекомендации по разработке драйверов внешних устройств. В ней описаны макрокоманды для их написания и даны примеры некоторых драйверов.
СОДЕРЖАНИЕ
- 1. НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ БИБЛИОТЕК
- 2. ХАРАКТЕРИСТИКИ БИБЛИОТЕК
- 3. ОБРАЩЕНИЕ К БИБЛИОТЕКАМ
- 4. ВХОДНЫЕ
И ВЫХОДНЫЕ ДАННЫЕ
- 4.1. СИСТЕМНАЯ МАКРОБИБЛИОТЕКА
-
4.2. СИСТЕМНАЯ
ОБЪЕКТНАЯ БИБЛИОТЕКА
- 4.2.1. НОМЕР КАНАЛА
- 4.2.2. БЛОК УСТРОЙСТВА
- 4.2.3. СВОПИНГ USR
- 4.2.4. УПРАВЛЕНИЕ СВОПИНГОМ USR
- 4.2.5. СТРАТЕГИЯ СВОПИНГА USR
- 4.2.6. ИСПОЛЬЗОВАНИЕ USR И ВРЕМЯ
- 4.2.7. РАБОТА С INTEGER*4
- 4.2.8. ПОДПРОГРАММЫ, ТРЕБУЮЩИЕ ДОПОЛНИТЕЛЬНОГО ЭЛЕМЕНТА ОЧЕРЕДИ
- 4.2.9. ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ
- 4.2.10. ФУНКЦИИ ПО ОБРАБОТКЕ СТРОК СИМВОЛОВ
- 5. СООБЩЕНИЯ
- 6. СИСТЕМНЫЕ ТАБЛИЦЫ
- 7. СИСТЕМНАЯ
МАКРОБИБЛИОТЕКА
- 7.1. ОПЕРАЦИИ С КАТАЛОГАМИ
- 7.2. ОПЕРАЦИИ ВВОДА/ВЫВОДА
- 7.3. РАБОТА С КАНАЛАМИ
- 7.4. ОБРАБОТКА КОМАНДНОЙ СТРОКИ
- 7.5. РАБОТА С ТАЙМЕРОМ
-
7.6. СИСТЕМНЫЕ
МАКРОКОМАНДЫ ОБЩЕГО НАЗНАЧЕНИЯ
- 7.6.1. МАКРОКОМАНДА .CHAIN
- 7.6.2. МАКРОКОМАНДА .CNFDF
- 7.6.3. МАКРОКОМАНДА .CTRLT
- 7.6.4. МАКРОКОМАНДА .DATE
- 7.6.5. МАКРОКОМАНДА .DBLK
- 7.6.6. МАКРОКОМАНДА .DIR
- 7.6.7. МАКРОКОМАНДА .DSTATUS
- 7.6.8. МАКРОКОМАНДА .EXIT
- 7.6.9. МАКРОКОМАНДЫ .FETCH/.RELEAS
- 7.6.10. МАКРОКОМАНДА .GVAL
- 7.6.11. МАКРОКОМАНДЫ .HERR/.SERR
- 7.6.12. МАКРОКОМАНДЫ .HRESEТ/.SRESEТ
- 7.6.13. МАКРОКОМАНДА .INTEN
- 7.6.14. МАКРОКОМАНДА .JSWDF
- 7.6.15. МАКРОКОМАНДЫ .LOCK/.UNLOCK
- 7.6.16. МАКРОКОМАНДЫ .MFPS/.MTPS
- 7.6.17. МАКРОКОМАНДЫ .POP/.PUSH
- 7.6.18. МАКРОКОМАНДА .QSET
- 7.6.19. МАКРОКОМАНДА .RCTRLO
- 7.6.20. МАКРОКОМАНДА .ROFDF
- 7.6.21. МАКРОКОМАНДА .SCCA
- 7.6.22. МАКРОКОМАНДА .SCMDF
- 7.6.23. МАКРОКОМАНДА .SETTOP
- 7.6.24. МАКРОКОМАНДА .SPFA
- 7.6.25. МАКРОКОМАНДА .SDTTM
- 7.6.26. МАКРОКОМАНДА .TRPSET
- 7.6.27. МАКРОКОМАНДА .USBDF
- 7.7. МАКРОКОМАНДЫ ДЛЯ НАПИСАНИЯ ДРАЙВЕРОВ
- 8. СИСТЕМНАЯ
ОБЪЕКТНАЯ БИБЛИОТЕКА
- 8.1. ОПЕРАЦИИ С КАТАЛОГАМИ
- 8.2. ОПЕРАЦИИ ВВОДА/ВЫВОДА
- 8.3. РАБОТА С КАНАЛАМИ
- 8.4. ОБРАБОТКА КОМАНДНОЙ СТРОКИ
- 8.5. РАБОТА С ТАЙМЕРОМ
- 8.6. ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
- 8.7. СЛУЖЕБНЫЕ ОПЕРАЦИИ
-
8.8. 32-РАЗРЯДНАЯ
АРИФМЕТИКА
- 8.8.1. ФУНКЦИЯ AJFLT
- 8.8.2. ФУНКЦИЯ DJFLT
- 8.8.3. ФУНКЦИЯ IAJFLT
- 8.8.4. ФУНКЦИЯ IDJFLT
- 8.8.5. ФУНКЦИЯ IJCVT
- 8.8.6. ФУНКЦИЯ JADD
- 8.8.7. ФУНКЦИЯ JAFIX
- 8.8.8. ФУНКЦИЯ JCMP
- 8.8.9. ФУНКЦИЯ JDFIX
- 8.8.10. ФУНКЦИЯ JDIV
- 8.8.11. ФУНКЦИЯ JICVT
- 8.8.12. ПОДПРОГРАММА JJCVT
- 8.8.13. ФУНКЦИЯ JMOV
- 8.8.14. ФУНКЦИЯ JMUL
- 8.8.15. ФУНКЦИЯ JSUB
-
8.9. РАБОТА
CO СТРОКАМИ
- 8.9.1. ПОДПРОГРАММА CONCAT
- 8.9.2. ПОДПРОГРАММА INDEX
- 8.9.3. ПОДПРОГРАММА INSERT
- 8.9.4. ФУНКЦИЯ LEN
- 8.9.5. ПОДПРОГРАММА REPEAT
- 8.9.6. ПОДПРОГРАММА SCOMP/ISCOMP
- 8.9.7. ПОДПРОГРАММА SCOPY
- 8.9.8. ПОДПРОГРАММА STRPAD
- 8.9.9. ПОДПРОГРАММА SUBSTR
- 8.9.10. ПОДПРОГРАММА TRANSL
- 8.9.11. ПОДПРОГРАММА TRIM
- 8.9.12. ПОДПРОГРАММА IVERIF/VERIFY
- 8.9.13. ФУНКЦИЯ IRAD50
- 8.9.14. ПОДПРОГРАММА R50ASC
- 8.9.15. ФУНКЦИЯ RAD50
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 имеет:
- набор средств ввода/вывода: синхронный, асинхронный и по событиям; подпрограммы библиотеки могут быть инициированы из подпрограмм завершения;
- возможность планирования во времени асинхронных подзаданий (подпрограмм завершения);
- подпрограммы обслуживания прерываний;
- набор средств обслуживания таймера, включая асинхронную обработку прерываний; преобразование различных форматов времени;
- вспомогательные функции ввода/вывода, включающие возможности открытия, закрытия, переименования, создания и удаления файлов с устройства;
- доступ к интерпретатору командных строк (CSI) для выборки и анализа стандартных командных строк ОС БК-11;
- пакет обработки символьных данных, обеспечивающий обработку символьных строк переменной длины;
- подпрограммы обработки данных в формате INTEGER*4, которые позволяют выполнять вычисления с целыми длиной в два слова;
Примечание. Авторы документа тщательно заменяли слово Фортран на Паскаль, выкидывали все абзацы, относящиеся к Фортрану, но тем не менее оставили раздел 8, посвящённый подпрограммам Фортрана, и в тексте постоянно встречаются обрывки фраз, связанные с Фортраном, которые просто так, без переработки смысловой нагрузки из абзацев не выкинешь. Поэтому, многие абзацы, касающиеся Фортрана, возвращены обратно.
Подпрограммы IPEEK, IPOKE, IPEEKB, IPOKEB и (или) ISPY для выборки адресов системы, монитора, технических средств могут различным образом выполняться на определённых конфигурациях. При программировании на языке Фортран СМ необходимо иметь в виду следующее:
- Различные функции в пакете SYSLIB.OBJ как результат выдают величины, которые по типу являются целыми, вещественными или удвоенной точности. Если пользователь применяет оператор IMPLICIT, который изменяет заданные по умолчанию типы величин для внешних функций, он должен явно определить тип тех функций из SYSLIB.OBJ, которые на выходе выдают целые или вещественные результаты. Функции удвоенной точности всегда должны описываться оператором DOUBLE PRECISION (или REAL*8). Несоблюдение этого требования может привести к непредсказуемым результатам
- Все имена подпрограмм, являющимся внешними по отношению к головной программе и передаются "планирующим" подпрограммам (таким как ISCHED, ITIMER, IREADF и др.), должны описываться как в операторе EXTERNAL программы, которая использует этот вызов.
- Некоторые параметры (указанные в описаниях отдельных подпрограмм) в вызовах SYSLIB.OBJ должны размещаться таким образом, чтобы не попасть в область свопинга USR. Если секция OTS¤I по длине не равна 2 Ксловам, то в программе, вызывающей модули из SYSLIB.OBJ, может появиться ошибка. Чтобы избежать ошибки, следует сделать USR резидентной (команда монитора "SET USR NOSWAP") или расширить OTS¤I до 10000 (восьмеричное) ячеек. Фортран СМ использует директиву .PSECT для компоновки программы и данных соответствующей области памяти.
- Литералы (строки) могут использоваться в качестве параметров при вызове подпрограмм и функций системной объектной библиотеки
- На подпрограммы завершения и обслуживания прерываний накладываются определённые ограничения.
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. Поэтому аргументы макрокоманд должны быть непосредственными значениями и указываться все.
Примечания:
- После выполнения макрокоманды все универсальные регистры, кроме R0, сохраняют свои значения. R0 содержит информацию, возвращённую монитором. В тех случаях, когда информация не возвращается, содержимое R0 не предсказуемо.
- Так как R0 является рабочим регистром системных макрокоманд, программист при указании аргументов не должен использовать связанных с ним режимов адресации.
- Указатель стека остаётся без изменений. Исключением является вызов интерпретатора командной строки (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)
Если в описании подпрограммы не указано, что её можно вызывать как функцию, то при обращении к ней как к функции возвращаемое значение неопределённо.
Примечания.
- Теперь понятно, почему Фортран заменили Паскалём. Но непонятно, почему его вырезали, ведь всякая фортрановская хрень всё равно из паскаля работает.
- Тут должно быть ещё два раздела: как из фортрана т.е. паскаля вызывать п/п на языке ассемблера, и как из ассемблера вызывать п/п на языке фортран, т.е. паскаль. Но их по непонятным причинам вырезали. Подозреваю, потому что мозгов не хватило примеры на паскале написать.
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 и восстанавливать их после выхода из подпрограммы.
Функции помещают в регистры единственный результат. Распределение регистров для помещения различных типов переменных следующее:
- результаты функций целого и логического типов записываются в регистр R0;
- результаты функций 32-разрядного целого и логического типов записываются в регистр R0 (младшая часть) и регистр R1 (старшая часть);
- результаты функций вещественного типа записываются в регистр R0 (старшая часть) и в регистр R1 (младшая часть);
- результаты функций с удвоенной точностью - в регистры R0-R3, самая младшая часть результата записывается в R3;
- результаты функций комплексного типа - в регистры R0-R3: в регистр R0 - старшая вещественная часть результата; в регистр R1 - младшая вещественная часть результата; в регистр R2 - старшая мнимая часть результата; в регистр R3 - младшая мнимая часть результата.
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 /DК / .RAD50 /РОК/ .RAD50 /AZ / .RAD50 /MAC/
либо
.RAD50 /DК POKAZ MАС/
либо
.DBLK DК,РОКАZ,МAC
Недостающие символы во втором случае дополняются пробелами, а в первом и третьем могут просто опускаться. Для удобства рекомендуется использовать макрокоманду .DBLK.
4.1.3. СВОПИНГ USR
В зависимости от того, требуют или нет системные макрокоманды присутствия в памяти USR, они делятся на два соответствующих типа.
Некоторые системные макрокоманды, использующие USR, требуют считывания новой копии USR. Это связано с тем, что подпрограммы, выполняющие эти макрокоманды, расположены в области буфера USR, который используется для хранения одного сегмента каталога. Таким образом, если USR в памяти, то система считает, что буфер USR уже модифицирован, и поэтому, для выполнения подобных системных макрокоманд, производится считывание новой копии USR.
Следует отметить, что работа макрокоманды .CLOSE с устройствами нефайловой структуры (устройство печати, терминал и т.д.) обходится без использования USR.
Если в программе встретилась макрокоманда, для выполнения которой необходима USR, то область программы, в которую должна быть загружена USR, сохраняется системой в файле SWAP.SYS на системном устройстве, а USR загружается в оперативную память. Завершив выполнение требуемой операции, система восстанавливает программу из файла SWAP.SYS.
Обычно свопинг происходит по умолчанию, но можно свести количество необходимых обменов к минимуму, если при написании программ учитывать следующее:
- если в задании макрокоманда .SETTOP указывает на адрес, превышающий нижний адрес обычного размещения USR, то при вызове USR потребуется операция обмена (свопинг);
- если адрес загрузки USR в ячейке 46 установлен пользователем во время трансляции или при выполнении программы, то он используется монитором в качестве возможного места загрузки USR. Если же в ячейке 46 содержится 0, USR загружается в обычную область;
- смещение 374 в резидентной части монитора содержит размер USR в байтах и должно использоваться программой для динамического определения размера области, необходимой для свопинга.
Примечания:
- Операция свопинга требует относительно больших затрат времени, поэтому её необходимо по возможности избегать.
- Содержимое ячейки 46 игнорируется, если не нужен свопинг.
- SJ-монитор не контролирует правильность адреса свопинга в ячейке 46. Если область свопинга перекрывает резидентный монитор, система разрушается.
- Необходимо следить, чтобы USR не загружалась в программный стек, в блоки параметров обращения к USR, в буферы ввода/вывода, в драйверы устройств, в программы завершения, используемые при вызовах USR.
4.1.4. ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ
Подпрограммы завершения - написанные пользователем программы, выполняемые по окончании ввода/вывода. При входе в неё R0 содержит слово состояния канала, R1 - номер канала, с которым связана операция. Бит "C" сброшен. При работе SJ-монитора подпрограммы завершения прерывают друг друга.
При создании подпрограмм завершения необходимо соблюдать следующие ограничения:
- им запрещается выдавать запросы, требующие свопинг USR, иначе возникнет неустранимая ошибка монитора;
- они не должны размещаться в памяти, предназначенной для USR;
- выход из подпрограммы завершения должен осуществляться посредством команды RTS PC;
- если используются регистры, кроме R0 и R1, их содержимое должно в начале подпрограммы запоминаться, а в конце восстанавливаться.
4.2. СИСТЕМНАЯ ОБЪЕКТНАЯ БИБЛИОТЕКА
Ниже приведены основные системные понятия, связанные с работой подпрограмм и функций системной объектной библиотеки, и соглашения, используемые при вызове этих подпрограмм и функций.
4.2.1. НОМЕР КАНАЛА
Номер канала является логическим идентификатором файла или набора данных. Таким образом, когда пользователь открывает файл на устройстве, он присваивает номер канала этому файлу. К открытому файлу можно обращаться через присвоенный номер канала.
OTS Фортрана имеет 16 (десятичное) каналов, доступных для использования. Функция IGETC закрепляет номер канала за программой и помечает в системе ввода/вывода, что канал используется. При освобождении канал закрывается подпрограммой CLOSEC, ICLOSE или PURGE. Канал освобождается и возвращается в систему ввода/вывода Фортрана вызовом IFREEC.
Функция ICDFN предоставляет пользователю до 255 (десятичное) каналов. Она выделяет память в области задания для размещения информации о статусе дополнительных каналов. Функцию ICDFN желательно использовать во время инициации задания. Система ввода/вывода Фортрана использует каналы от 0 до 15 (десятичное), поэтому каналы с большими номерами можно использовать без ограничений.
Каналы должны выделяться в основной программе или в её подпрограммах. Не рекомендуется выделять каналы в программах, которые были активизированы в результате завершения ввода/вывода или функциями ISCHED или ITIMER.
4.2.2. БЛОК УСТРОЙСТВА
Блоком устройства является четырёхсловный блок информации в коде RAD50, который определяет физическое устройство и имя файла. В фортране можно использовать три различных метода задания этого блока:
- использование операторов DIMENSION и
DATA:
DIMENSION IFILE(4) DATA IFILE /3RSY, 3RFIL, 3RE, 3RXYZ/
- перевод доступной строки символьного описания файла в формат
RAD50 с использованием вызовов
SYSLIB, таких как IRAD50,
R50ASC и RAD50, например:
REAL*8 FILSPC CALL IRAD50 (12, 'SY FILE XYZ', FILSPC)
- использование 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;
- использовать вызов ITLOCK и избегать вызовов SYSLIB, требующих 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
имеют такие ограничения:
- канал не может быть получен вызовом IGETC или освобождён вызовом IFREEC из подпрограммы завершения; каналы, используемые подпрограммой завершения должны быть уже выделены и помещены в блок COMMON.
- подпрограмма завершения не может производить вызов, требующий использования USR;
- файлы, используемые подпрограммой завершения, должны быть открыты и закрыты в основной программе; нет ограничений на операции ввода/вывода, которые могут проводиться подпрограммами завершения; если много файлов должны быть доступны для подпрограммы завершения, они могут быть открыты основной программой и сохранены для дальнейшего использования (не занимая каналы ОС БК-11) вызовом ISAVES; подпрограмма завершения может в дальнейшем сделать его доступным повторным присоединением файла к каналу вызовом IREOPN; подпрограмма завершения не должна вызывать CLOSE для закрытия логического канала;
- только одна функция завершения должна быть активна в каждый момент времени.
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 в слове состояния;
- через байт ошибки (байт 52 в системной области связи);
- посредством сообщений монитора об ошибках.
Бит 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.
Номер бита |
Значение маски |
Тип ошибки |
Сообщение в ОС БК-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:
|
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 1¤ .PRINT #NOFIL .EXIT 1¤: MOV #SIZE,R1 JSR PC,CNV10 .PRINT #BUF .EXIT CNV10: MOV R0,-(SP) CLR R0 1¤: INC R0 SUB #10.,@SP BGE 1¤ ADD #72,@SP DEC R0 BEQ 2¤ CALL CNV10 2¤: 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 |
При входе в подпрограмму завершения:
- R0 содержит слово состояния канала; установленный в нём бит 0 означает возникшую при передаче аппаратную ошибку;
- R1 содержит восьмеричный номер канала; его удобно использовать, когда одна и та же подпрограмма завершения применяется для работы с несколькими каналами.
Примечание. В подпрограммах завершения недопустимо использование макрокоманд, требующих 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 1¤ ; Да .PRINT #RDMSG 1¤: .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 1¤: TST DFLG ; Флаг установлен ? BEQ 1¤ ; Нет 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 3¤ TSTB ERRWD BNE RWERR ; Нет INC DFLG 3¤: 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.
Функция |
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 приведена информация о состоянии канала. Символом «*» помечены биты, пояснения к которым даны, для установленного бита.
Слово |
Бит |
Содержимое |
---|---|---|
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 очень удобно, но необходимо соблюдать некоторые меры предосторожности:
- если после выполнения макрокоманды .SAVESTATUS файл был удалён до макрокоманды .REOPEN, то выполненная в этот момент макрокоманда .ENTER может использовать область этого файла как свободную и изменить её содержимое; после этого содержимое файла нельзя восстановить;
- при выполнении макрокоманды .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 1¤ .PRINT #MSG .EXIT 1¤: .ENTER #AREA,#0,#OUTSPC,OUTSPC+10 ;Открыть файл ;для вывода BCC 2¤ .PRINT #MSG1 .EXIT 2¤: 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 1¤: .TTYIN ; занесение символов с MOVB R0,(R1)+ ; TT: в область 510-777 CMPB R0,#LF ; вся строка введена? BNE 1¤ ; нет 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 1¤ ;нет .PRINT #MSG ;да...печать сообщения BR 2¤ 1¤: .PRINT #MSG1 ;печать сообщения 2¤: .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:
- биты 13-10 - номер месяца (1-12.);
- биты 9-5 - день недели (1-31.);
- биты 4-0 - год (значение года определяется вычитанием из текущего года числа 1972).
Формат макрокоманды:
.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 1¤ ; НЕТ 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 1¤: .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 1¤ .PRINT #MSG .EXIT 1¤: TST CODE+4 ;уже загружен? BNE 3¤ ;да .FETCH #DRVR,#FTPR ;нет ... загрузить ;драйвер BCC 2¤ .PRINT #MSG1 .EXIT 2¤: .PRINT #MSG2 ;печать сообщения .EXIT 3¤: .RELEAS #FTPR ;выгрузить драйвер BCC 4¤ .PRINT #MSG1 .EXIT 4¤: .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, которые выполняются после завершения задания. Операция выполняется следующим образом:
- ячейка (слово, не байт) 510 должна содержать общее число байтов командных строк, передаваемых для KMON;
- командные строки, содержащиеся с 512 ячейки,
должны быть строками директивы .ASCIZ, например:
. = 510 .WORD B-A A: .ASCIZ /COPY A.MAC B.MAC/ .ASCIZ /DELET A.MAC/ В = .
- перед выполнением макрокоманды .EXIT пользователь должен установить бит CHNIF¤ в слове состояния программы (JSW) и очистить R0.
При передаче командных строк для KMON имеются следующие ограничения:
- если программа вызвана из командного файла, то его выполнение прерывается и выполняются командные строки программы; любые следующие строки из командного файла никогда не будут выполнены (т.е. не выполняется возврат в командный файл);
- из программы может быть вызван только один командный файл; строка вызова командного файла должна быть последней в командных строках, передаваемых для KMON;
- макрокоманда .EXIT аннулирует вызовы макрокоманд .CDFN и .QSET и выполняет макрокоманду .UNLOCK, если была выполнена макрокоманда .LOCK; таким образом, команда монитора CLOSE не закрывает каналов, открытых с помощью .CDFN;
- макрокоманда .EXIT в подпрограммах завершения недопустима.
Примечание. Программа пользователя сама обеспечивает целостность данных, передаваемых KMON во время выполнения макрокоманды .EXIT. Необходимо, чтобы эта область не портилась стеком пользователя. Если макрокоманда .EXIT используется для передачи командных строк для KMON, указатель строк будет инициализирован и установлен равным 1000 (восьмеричное) перед завершением программы.
Ошибки отсутствуют.
В примере после окончания работы программы происходит полная распечатка каталога.
Пример.
.MCALL .EXIT,.JSWDF .JSWDF ;определить мнемонику ;JSW и его битов ;(здесь CHNIF¤) START: MOV #510,R0 MOV #CMDSTR,R1 1¤: MOV (R1)+,(R0)+ CMP R1,#CMDEND BLO 1¤ 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 игнорируется, если:
- указано системное устройство;
- драйвера устройства нет в памяти;
- драйвер находится в памяти (резидентен), но загружен командой монитора LOAD;
Ошибки:
Код |
Пояснение |
---|---|
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 3¤ JSR PC,ERR ; идти на обработку ; ошибки .HERR ; разрешить прерывание ; программы по ошибке .ENTER #AREA,#1,#FILE ; открыть файл на PC: BCS ERR1 3¤: .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 возможны следующие ситуации:
- USR нет в памяти и при загрузке она перекрывает часть программы; в этом случае эта часть программы выгружается в файл свопинга (SWAP.SYS); после этого осуществляется загрузка USR;
- USR не резидентна в памяти и при загрузке не перекрывает программу; осуществляется загрузка USR;
- USR уже резидентна и закреплена за текущей программой; в этом случае макрокоманда отрабатывает как NOP (пустая операция);
Ошибки отсутствуют.
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 1¤ .LOOKUP #AREA,#1,#DEV2 BCS 1¤ .UNLOCK ;удалить USR из памяти .EXIT 1¤: .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 1¤ MOV @R5,@R4 .MTPS ;восстановить приоритет ;из стека CLZ 1¤: 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 1¤: TST (R1) ;двойное CTRL/C? BNE 2¤ ;да .TTYTN ;нет...ввести символ .TTYOUT ;эхопечать BR 1¤ 2¤: .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 1¤ ; "ловушек" .PRINT #TRP4 BR 2¤ 1¤: .PRINT #TRP10 2¤: .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 |
- номер файла для операций на кассетных магнитных лентах; если этот параметр не указан, то его значение предполагается равным нулю; для операций с магнитными лентами он описывает номер файла, который может принимать одно из следующих значений:
|
После выполнения функции 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 |
- номер файла на кассетных накопителях на магнитных лентах; если этот параметр не указан, он принимается равным нулю; для магнитной ленты он описывает последовательный номер файла; параметр может иметь следующие значения:
|
Примечания:
- Функцию IENTER нельзя вызывать в подпрограммах завершения и обработки прерывания.
- Функция IENTER требует, чтобы в памяти находился драйвер соответствующего устройства.
- Параметры функции должны располагаться в памяти вне области свопинга 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 имеет форму:
|
Параметры функции 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, для магнитной ленты он описывает последовательный номер файла; предпринимаемые действия зависят от того, указано ли имя файла; последовательный номер может иметь следующие значения:
|
Параметры функции 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 (десятичное) при чтении данных с устройства файловой структуры), например:
|
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-й бит равен нулю, то выполняется обычный ввод/вывод. В этом режиме выполняются следующие действия:
- монитор отображает на экране терминала все введённые с клавиатуры знаки;
- команды <СУ/U> и <ЗБ> осуществляют удаление строки и символа соответственно;
- символы текущей строки передаются в программу Пользователя после ввода с клавиатуры терминала одного из четырёх управляющих знаков: <ВК>, <ПС>, <СУ/Z> или <СУ/C>.
Если 12-й бит равен 1, то задаётся специальный режим. При этом происходит следующее:
- монитор не отображает на терминале введённые с клавиатуры символы, за исключением <СУ/C> и <СУ/O>;
- команды <СУ/U> и <ЗБ> не выполняют специальных функций;
- символы передаются в программу немедленно;
- <СУ/Ш> не преобразуется.
В специальном режиме программа пользователя должна сама отображать нужные символы.
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.
Примечания:
- Функцию ICDFN нельзя вызывать из подпрограммы завершения или обработки прерывания.
- Рекомендуется использовать функцию ICDFN в начале основной программы перед инициированием любых операций ввода/вывода.
- Если функция ICDFN выполняется более одного раза, каждый раз при ее вызове формируется совершенно новый набор каналов, но информация о старых каналах переписывается в новые.
- Функция 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 необходимо избегать следующих ситуаций:
- если функция ISAVES применялась к файлу, а затем этот файл был удалён до повторного открытия, освободившееся место могло быть использовано функцией IENTER; при такой последовательности функций существует вероятность, что содержимое файла, состояние которого сохранялось, изменится;
- если при выполнении функции IREAD и IWRITE в оперативной памяти нет драйвера требуемого периферийного устройства, наличие которого необязательно при выполнении функции 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) равен двум; |
Примечания:
- Параметр 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 столько раз, сколько семантически различных вариантов его появления существует.
- Параметры функции 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.
Примечания:
- Планируемый при помощи ISCHED вызов подпрограммы завершения может позже отменяться функцией ICMKT.
- Если система занята, время суток, когда будет вызвана подпрограмма завершения, может оказаться позже требуемого.
- Подпрограмма завершения на языке ФОРТРАН может планировать вызовы самой себя, используя ISCHED и(или) ITIMER.
- Функция 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-герцевых линейных часов). |
Примечания:
- Функция ISLEEP требует элемент очереди. Что необходимо учитывать при выполнении функций IQSET.
- Если система занята, то действительное время останова основной программы может быть больше, чем задано.
Результаты функции:
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.
Примечания:
- Запланированный при помощи ITIMER вызов подпрограммы завершения может быть отменен вызовом функции IСМКТ.
- Если система занята, действительный интервал времени, по истечении которого вызывается подпрограмма завершения, может быть больше требуемого.
- Подпрограммы на языке ФОРТРАН могут планировать вызовы самих себя, используя ISCHED или ITIMER.
- Функция 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, то первый элемент - старшая часть значения времени, второй элемент - младшая часть значения времени. |
Примечания:
- Функция MRKT требует элемент очереди, это необходимо учитывать при выполнении функции IQSET.
- Если система занята, то временной интервал, который проходит до начала выполнения подпрограммы завершения, может быть больше требуемого.
Более подробно планирование подпрограмм завершения описано в системной макрокоманде .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 игнорируются.
Примечания:
- Важно, чтобы вызов LOCK не производился из зоны, в которую будет помещаться USR. Если это произойдёт, то из USR возврат управления произойдёт не в программу пользователя, а в саму программу USR, т.к. LOCK сохраняет часть программы пользователя на диске, а на это место в оперативной памяти записывает программу USR. Более того, в программе не должно быть обращений к подпрограммам, переменным и массивам, находящимся в зоне свопинга, если USR резидентна после выполнения подпрограммы LOCK.
- Если подпрограмма LOCK выполнена, то нецелесообразно разрушать зону, в которую записана USR, даже в том случае, если не предполагается дальнейшее использование USR. В случае разрушения при выполнении функции UNLOCK могут получиться непредсказуемые результаты.
- Подпрограмму LOCK нельзя вызывать из подпрограммы завершения или обработки прерывания.
- Если дана команда монитора "SET USR NOSWAP" (т.е. запретить свопинг USR), то подпрограммы LOCK и UNLOCK не будут производить свопинг. Хотя LOCK будет запрещать другому заданию использовать USR, a UNLOCK - разрешать доступ к USR.
- Передаваемые подпрограмме 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.