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

589.7545471.00042-01 33 01

1. Назначение и условия применения

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

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

Связь пользователя с ФОДОС-2 осуществляется главным образом с помощью команд клавиатурного монитора и .MCALL запросов.

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

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

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

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

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

Младший байт команды EMT содержит код в интервале от 340 до 377(8), определяющий местоположение передаваемых монитору аргументов (см. табл. 1).

Таблица 1

МЛАДШИЙ БАЙТ

ПРОГРАММНЫЙ ЗАПРОС

340-357

программный запрос с аргументами в стеке и/или в R0

360-373

используется только монитором ФОДОС-2

374

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

375

программный запрос с несколькими аргументами. Регистр R0 используется в качестве указателя на блок аргументов

376

используется только монитором ФОДОС-2

377

Резервный. ФОДОС-2 игнорирует этот EMT и возвращает управление программе пользователя.

2. Обращение к системной макробиблиотеке

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

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

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

В ФОДОС-2 используются два формата .MCALL запросов:

  1. .PRGREQ ARG1,ARG2,...,ARGN
  2. .PRGREQ AREA,ARG1,...,ARGN

В этих форматах .PRGREQ представляет собой имя программного запроса, AREA - указатель на адрес блока аргументов, ARG1,ARG2,...,ARGN - аргументы программного запроса.

Программные запросы первого формата вызывают генерацию команды EMT с кодом 374 или одной из команд EMT 340-357.

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

15

8

7

0

R0=

Функциональный код

Номер канала (если применяется)

Рис.1

Одним из .MCALL запросов, использующих EMT 374, является запрос .DATE. Макроопределение для этого запроса следующее:

.MACRO .DATE
      MOV     #10.*^O400,%0
      EMT     ^374
.ENDM

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

Программные запросы, использующие EMT 340-357, помещают аргументы (если они заданы) в стек и/или в R0.

Программный запрос .CSIGEN является примером программного запроса, использующего EMT 344. Ниже представлено упрощённое макроопределение для этого запроса:

.MACRO .CSIGEN DEVSPC,DEFEXT,CSTRNG,LINBUF
.IFF NB <LINBUF>
      MOV     LINBUF,-(6.)
      MOV     DEVSPC,-(6.)
.IFF NB <LINBUF>
      INC     (6.)
      MOV     DEFEXT,-(6.)
.IF B CSTRNG
      CLR     -(6.)
.IFF
.IF IDN CSTRNG,#0
      CLR     -(6.)
.IFF
      MOV     CSTRNG,-(6.)
.ENDC
.ENDC
      EMT     ^O344
.ENDM

Все указанные аргументы помещаются в стек пользователя (см. рис. 2) и используются монитором при выполнении запроса .CSIGEN.

Верхний адрес

 

LINBUF

   
 

DEVSPC

 
 

DEFEXT

 

Указатель стека →

CSTRNG

 

Нижний адрес

   

Рис.2

Программные запросы второго формата вызывают генерацию команды EMT с кодом 375.

Формат блока аргументов для EMT 375 представлен на рис. 3.

R0AREA:

Функциональный код (CODE)

Номер канала (CHAN)

 

ARG1

 

ARG2

 

.

 

ARGN

Рис.3

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

Например, при выполнении запроса

              .PRGREQ AREA,ARG1,ARG2

регистр R0 содержит адрес блока аргументов, второе слово содержит ARG1, третье - ARG2.

При выполнении запроса

              .PRGREQ AREA

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

Если в запросе

              .PRGREQ ,ARG1

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

Блок аргументов может формироваться Макроассемблером во время трансляции программы или непосредственно пользователем, например:

      1) MOV  #ARG1,AREA+2
         MOV  #ARG2,AREA+4
         .PRGREQ      #AREA

      2) MOV  #AREA,R0
         .PRGREQ      ,#ARG1,#ARG2

      3) MOV  #AREA,R0
         MOV  #ARG1,2(R0)
         MOV  #ARG2,4(R0)
         MOV  #CODE*400!CHAN,(R0)
         .PRGREQ

Во всех вышеприведённых примерах определяется один и тот же программный запрос.

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

         .MCALL  .PRINT,.TWAIT
START:   .TWAIT  #EMTBLK
         .PRINT  #MSG
         BR      START

EMTBLK:  .BYTE   0,24
         .WORD   TIME

TIME:    .WORD   0,10.*50
         .ASCIZ  /ЧЕРЕЗ 10 СЕКУНД - ПЕЧАТЬ  СООБЩЕНИЯ/
         .END    START

2.1. Адресация аргументов

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

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

    .PRGREQ #AREA,#4

Если величина является содержимым регистра, то должна быть использована мнемоника регистра (RN). Если величина является содержимым ячейки памяти, то должна быть использована метка этой ячейки, например:

        .PRGREQ LIST,NUMBER
                 .
                 .
                 .
LIST:   .WORD   AREA
NUMBER: .WORD   4

Примечание. При выполнении запроса, содержимое регистров общего назначения, кроме R0, не изменяется. Указатель стека не переустанавливается. Исключением является вызов интерпретатора командной строки (запросы .CSIGEN, .CSISPC).

2.2. Ключевой аргумент CODE

Ключевой аргумент CODE позволяет использовать один и тот же блок аргументов для различных .MCALL запросов, имеющих одни и те же аргументы, но различные функциональные коды. Использование этого ключевого аргумента уменьшает размер программы и время её выполнения. Аргумент CODE может иметь два значения: CODE=SET (занести функциональный код) и CODE=NOSET (не заносить функциональный код).

Пример.

         .WRITW  #AREA,#CHAN,#BUFF,#WCNT,#BLK
            .
            .
            .
         .READW  #AREA,CODE=SET
            .
            .
            .

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

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

Таблица 2

Условное обозначение

Аргумент

ADDR

Адрес; значение адреса зависит от используемого запроса

AREA

Адрес блока аргументов EMT

BLK

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

BUF

Адрес буфера памяти

CBLK

Адрес блока из пяти слов, в котором хранится информация о состоянии канала

CHAN

Номер канала

CRTN

Точка входа подпрограммы завершения

DBLK

Адрес блока устройства

NUM

Число, значение которого зависит от используемого запроса

WCNT

Счётчик слов; количество слов, которые необходимо передать в или из буфера при выполнении операции ввода-вывода

SEQN

Последовательный номер файла (для операций с магнитной лентой)

CHRCNT

Счётчик символов

FUNC

Числовой код, определяющий выполняемую функцию

JOBBLK

Адрес блока, содержащего имя системного задания в кодах КОИ-7

JOBDEV

Адрес блока, содержащего имя устройства и имя системного задания

UNIT

Логический номер терминала

3.1. Номер канала

Номер канала (CHAN) представляет собой логический идентификатор файла и используется монитором при выполнении запрашиваемых операций. Номер канала может иметь значение от 0 до 254(10) (0-376(8)). Канал с номером 255(10) резервируется для системных операций.

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

3.2. Блок устройства

Блок устройства (DBLK) представляет собой блок информации в кодах RADIX-50, который содержит физическое или логическое имя устройства, имя и тип файла. Размер блока - 4 слова.

Пример:

.RAD50 /DX1/
.RAD50 /FIL/
.RAD50 /NAM/
.RAD50 /TYP/

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

Допускается запись блока устройства в следующем виде:

.RAD50 /DX1FILNAMTYP/

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

3.3. Блок аргументов EMT

Общий вид блока аргументов команды EMT показан на рис. 4. Чётный байт 1-го слова содержит номер канала, определённый в макрокоманде. Если номер канала не требуется, то чётный байт содержит 0. Нечётный байт 1-го слова блока содержит функциональный код макрокоманды (каждому программному запросу соответствует свой функциональный код). Остальные слова блока содержат аргументы (если они заданы), определённые в макрокоманде.

Блок аргументов EMT

AREA:

Функциональный код

Номер канала

 

1-й аргумент

 

2-й аргумент

.
.
.

 

N-ый аргумент

Рис.4

3.4. Подпрограммы завершения

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

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

В режиме SJ подпрограммы завершения являются асинхронными и могут прерывать друг друга. В режимах FB и XM, подпрограммы завершения не прерывают друг друга, а организуются в очередь.

3.5. Требование USR

Для выполнения некоторых .MCALL запросов необходимо, чтобы компонента монитора USR находилась в оперативной памяти. Требование USR программным запросам описано в табл. 3. Заметим, что запрос .CLOSE на устройствах нефайловой структуры (LP:, TT:, PC:, и т.д.) не требует наличия USR в памяти.

Программа USR не является реентерабельной; если USR используется одним заданием (в режиме FB), другое задание, требующее USR, будет ждать её освобождения.

Запросы, помеченные в табл. 3 звёздочкой, всегда требуют загрузки новой копии USR перед их выполнением (даже, если USR в этот момент находится в памяти).

Таблица 3

Программный запрос

Требование USR

Режим SJ

Режим FB

Режим XM

.CDFN

Да*

Нет

Нет

.CLOSE 1)

Да

Да

Да

.CSIGEN

Да

Да

Да

.CSISPC

Да

Да

Да

.DELETE

Да

Да

Да

.DSTATUS

Да

Да

Да

.ENTER

Да

Да

Да

.EXIT

Да

Да

Да

.FETCH/.RELEAS

Да

Да

Да

.GTLIN

Да

Да

Да

.HRESET

Да

Нет

Нет

.LOCK 2)

Да

Да

Да

.LOOKUP

Да

Да

Да

.QSET

Да*

Да*

Да

.RENAME

Да

Да

Да

.REOPEN

Нет

Нет

Нет

.SRESET

Да*

Нет

Нет

.TLOCK 3)

Да

Да

Да

1)  Если канал был открыт по .ENTER ;

2)  Если USR находится в состоянии свопинга;

3)  Если USR не используется другим заданием.

4. Сообщения

При обработке запросов, монитор может обнаружить условия ошибок. Программные запросы информируют об этом пользователя, используя C-разряд, байт ошибок (52-ой байт в области связей системы) и печать на терминале сообщений монитора. C-разряд очищается после выполнения запроса и устанавливается в случае ошибки. Для обнаружения ошибки за запросом должна следовать команда BCS или BCC. Когда установлен C-разряд, байт ошибок содержит код ошибки.

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

Информация о сообщениях дана в [3].

5. Программные запросы

Существуют следующие типы .MCALL запросов:

В таблице 4 перечислены программные запросы, которые могут использоваться в любом из режимов (SJ, FB, XM). Запросы, помеченные в табл. 4 символами "МТ", можно использовать только при наличии в системе мультитерминальной поддержки.

В табл. 5 перечислены программные запросы, которые используются основным/фоновым заданием при наличии расширенной памяти. Программные запросы, помеченные символами "XM" можно использовать только в режиме XM.

Описание .MCALL запросов для программ - драйверов устройств даётся в [1].

Описание запросов расширенной памяти даётся в [2].

Таблица 4

Программный запрос

Код EMT

Функцион. код

Назначение

.ABTIO

374

13

Прерывает операции ввода-вывода на указанном канале

.CDFN

375

15

Определяет дополнительные каналы для операций ввода-вывода

.CHAIN

374

10

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

.CLOSE

374

6

Закрывает канал и освобождает его для использования в других операциях

.CMKT

375

23

Аннулирует один или несколько запросов .MRKT

.CSIGEN

344

-

Вызывает работу интерпретатора командной строки в общем режиме

.CSISPC

345

-

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

.CSTAT

375

27

Позволяет получить информацию о состоянии определённого канала

.CTIMIO

-

-

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

.DATE

374

12

Пересылает текущую дату в регистр R0

.DELETE

375

0

Стирает файл с тома указанного устройства

.DRAST

   

Определяет начало подпрограммы обработки прерываний

.DRBEG

   

Создаёт таблицу заголовка драйвера

.DRBOT

   

Определяет начало первичного загрузчика в драйвере

.DRDEF

   

Определяет параметры драйвера и устройства

.DREND

   

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

.DRFIN

   

Передаёт управление монитору по завершении обслуживания элемента очереди

.DRSET

   

Используется для формирования таблиц параметров драйвера

.DRVTB

   

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

.DSTATUS

342

-

Позволяет получить информацию о состоянии определённого устройства

.ENTER

375

2

Резервирует область на томе указанного устройства для создания нового файла

.EXIT

350

-

Завершает выполнение программы пользователя и передаёт управление клавиатурному монитору

.FETCH

343

-

Загружает драйвер устройства

.FPROT

375

43

Устанавливает (отменяет) защиту файла

.GTIM

375

21

Определяет текущее время дня

.GTJB

375

20

Определяет параметры выполняемого задания

.GTLIN

345

-

Принимает входную строку с терминала или из косвенного файла

.GVAL

376

34

Пересылает в R0 содержимое указанной ячейки монитора

.HERR

374

5

Отменяет действие запроса .SERR

.HRESET

357

-

Прекращает все операции ввода-вывода и выполняет функции запроса .SRESET

.INTEN

-

-

Сообщает монитору о том, что произошло прерывание от устройства и устанавливает приоритет процессора на соответствующий уровень

.LOCK

346

-

Делает программу USR резидентной в памяти до тех пор, пока не будет выполнен .EXIT или .UNLOCK . Если необходимо, свопирует программу пользователя

.LOOKUP

375

1

Открывает существующий файл для ввода и/или вывода на указанном канале

.MFPS

-

-

Выбирает содержимое ССП

.MRKT

375

22

Планирует запуск подпрограммы завершения через определённый интервал времени

.MTATCH (MT)

374

37

Устанавливает связь между заданием и определённым терминалом

.MTDTCH (MT)

374

37

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

.MTGET (MT)

374

37

Определяет состояние указанного терминала

.MTIN (MT)

374

37

Действует в мультитерминальном режиме аналогично .TTYIN

.MTOUT (MT)

374

37

Действует в мультитерминальном режиме аналогично .TTYOUT

.MTPRNT (MT)

374

32

Действует в мультитерминальном режиме аналогично .PRINT

.MTPS

-

 

Устанавливает ССП

.MTRCTD (MT)

374

37

Обеспечивает вывод на указанный терминал

.MTSET (MT)

374

37

Устанавливает и модифицирует характеристики терминала в мультитерминальном режиме

.MTSTAT (MT)

375

37

Пересылает программе информацию о состоянии мультитерминальной системы

.PEEK

375

34

Определяет содержимое ячеек памяти

.POKE

375

34

Изменяет содержимое ячеек памяти

.PRINT

351

-

Выдаёт на печать строку символов КОИ-7

.PURGE

374

3

Освобождает канал

.PVAL

375

34

Изменяет содержимое ячеек монитора

.QELDF

-

-

Определяет мнемонические обозначения для элементов очереди ввода-вывода

.QSET

353

-

Увеличивает размер очереди ввода-вывода для монитора

.RCTRLD

355

-

Обеспечивает вывод на терминал

.READ

375

10

Передаёт данные по указанному каналу в буфер памяти и воз- вращает управление программе пользователя, как только запрос на чтение данных будет поставлен в очередь ввода-вывода

.READC

375

10

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

.READW

375

10

Передаёт данные по указанному каналу в буфер памяти и возвращает управление программе пользователя после окончания операции

.RELEAS

343

-

Удаляет драйвер устройства из памяти

.RENAME

375

4

Переименовывает файл. Недопустим в операциях с магнитной лентой

.REOPEN

375

6

Обеспечивает восстановление параметров, которые запоминались по запросу .SAVESTATUS и повторно открывает канал для ввода-вывода

.SAVESTATUS

375

5

Запоминает параметры состояния открытого файла в определённой области памяти и освобождает канал

.SCCA

374

35

Позволяет блокировать выполнение команды СУ/C

.SDTTM

375

40

Устанавливает системную дату и/или время

.SERR

374

4

Блокирует прерывание программы при обнаружении монитором ошибки

.SETTOP

354

-

Определяет верхнюю границу памяти для выполняемого задания

.SFDAT

375

42

Изменяет дату создания файла

.SFPA

375

30

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

.SPFUN

375

32

Выполняет специальные функции для устройств

.SRESET

352

-

Восстанавливает каналы ввода-вывода и удаляет драйверы устройств из памяти

.SYNCH

-

-

Обеспечивает возможность выполнения .MCALL запросов в подпрограмме обработки прерывания

.TIMIO

-

-

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

.TLOCK

374

7

Определяет, используется ли USR в данный момент другим заданием. Если USR не используется, то выполняется .LOCK

.TRPSET

375

3

Устанавливает обработку прерываний по 4-ому или 10-ому векторам в программе пользователя

.TTINR
.TTYIN

340

-

Передают один символ из буфера терминала в регистр R0

.TTYOUT
.TTOUTR

341

-

Передают один символ из регистра R0 в буфер терминала

.TWAIT

375

24

Приостанавливает выполнение задания на указанный интервал времени

.UNLOCK

347

-

Освобождает программу USR, если ранее был выполнен запрос .LOCK и, если необходимо, вновь загружает программу пользователя

.WAIT

374

0

Ожидает завершения операции ввода-вывода на указанном канале

.WRITC

375

11

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

.WRITE

375

11

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

.WRITW

375

11

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

Таблица 5

Программный запрос

Код EMT

Функцион. код

Назначение

.CHCOPY

375

13

Открывает канал для ввода и логически связывает его с открытым каналом другого задания

.CNTXSW

375

33

Определяет ячейки памяти для операции переключения контекста

.CRAW (XM)

374

36

Создаёт виртуальное адресное окно

.CRRG (XM)

374

36

Создаёт динамическую область физической памяти

.DEVICE

375

14

Позволяет запретить прерывание от устройства в режиме FB после окончания выполнения программы

.ELAW (XM)

374

36

Аннулирует виртуальное адресное окно

.ELRG (XM)

374

36

Аннулирует динамическую область физической памяти и делает её свободной для использования другим заданием

.GMCX (XM)

374

36

Пересылает программе информацию о состоянии определённого окна

.MAP (XM)

374

36

Отображает предварительно созданное окно виртуального адреса

.MWAIT

374

11

Переводит текущее задание в состояние ожидания до завершения передачи данных

.PROTECT

375

31

Закрепляет один из векторов (адреса от 0 до 476) за данным заданием

.RCVD
.RCVDC
.RCVDW

375

26

Осуществляют приём сообщений или данных, передаваемых другим заданием в режиме FB. Аналогичны запросам .READ, .READC, .READW

.RDBBK (XM)

-

-

Создаёт блок определения области

.RDBDF (XM)

-

-

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

.RSUM

374

2

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

.SDAT
.SDATC
.SDATW

375

25

Осуществляют передачу сообщений или данных другой Программе. Аналогичны запросам .WRITE, .WRITC, .WRITW

.SPCPS

375

41

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

.SPND

374

1

Приостанавливает выполнение задания

.UNMAP (XM)

374

36

Отменяет действие запроса .MAP

.UNPROTECT

374

31

Отменяет действие запроса .PROTECT

.WDBBK (XM)

-

-

Создаёт блок определения окна

.WDBDF (XM)

-

-

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

5.1. Программные запросы для операций с файлами

5.1.1. .CHCOPY (режим FB, XM)

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

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

.CHCOPY AREA,CHAN,OCHAN[,JOBBLK]

где

AREA

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

 

CHAN

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

 

OCHAN

- номер канала другого задания;

 

JOBBLK

- адрес блока из трёх слов, содержащего логическое имя задания.

Формат блока аргументов EMT:

          AREA:   .BYTE   CHAN,13
                  .WORD   OCHAN
                  .WORD   JOBBLK

Пример.

  ;ПРИМЕР СОСТОИТ ИЗ ДВУХ ПРОГРАММ. ПЕРВАЯ ИЗ ПРОГРАММ
  ;(ОСНОВНАЯ) ВЫПОЛНЯЕТ ПЕРЕДАЧУ ДАННЫХ ВО ВТОРУЮ -
  ;ФОНОВУЮ ПРОГРАММУ.
          .TITLE  CHCOPF.MAC
  ;ОСНОВНАЯ ПРОГРАММА
          .MCALL  .ENTER,.PRINT,.SDATW,.RCVDW,.CLOSE,.WRITW
          .MCALL  .EXIT
  STARTF: MOV     #AREA,R5
          .ENTER  R5,#0,#FILE,#5          ;СОЗДАТЬ ФАЙЛ
          .WRITW  R5,#0,#RECRD,#256.,#4   ;ЗАПИСАТЬ БЛОК
          BCS     ENTERR
          .SDATW  R5,#BUFR,#2             ;ПЕРЕДАТЬ СООБЩЕНИЕ
          ;       .
          .RCVDW  R5,#BUFR,#1
          .CLOSE  #0
          .PRINT  #FEXIT
          .EXIT
  ENTERR: .PRINT  #ERMSG
          .EXIT
  FILE:   .RAD50  /DK QUFILE/
          .RAD50  /TMP/
  AREA:   .BLKW   5
  BUFR:   .WORD   0                       ;НОМЕР КАНАЛА
          .WORD   4                       ;НОМЕР БЛОКА
  RECRD:  .BLKW   256.
  ERMSG:  .ASCIZ  /ОШИБКА .ENTER/
  FEXIT:  .ASCIZ  /КОНЕЦ ОСНОВНОЙ ПРОГРАММЫ/
          .END    STARTF

          .TITLE  CHCOPB.MAC
  ;ФОНОВАЯ ПРОГРАММА
          .MCALL  .CHCOPY,.RCVDW,.READW,.EXIT,.PRINT,.SDATW
  STARTB: MOV     #AREA,R5
          .RCVDW  R5,#MSG,#2      ;ПОЛУЧИТЬ СООБЩЕНИЕ
          BCS     
          .CHCOPY R5,#0,MSG+2     ;НОМЕР КАНАЛА ИЗ MSG+2
          BCS     
          .READW  R5,#0,#BUFF,#256.,MSG+4 ;ЧИТАТЬ БЛОК
          BCS     
          ;       .
          .SDATW  R5,#MSG,#1
          .PRINT  #BEXIT
          .EXIT
  :     MOV     #NOJOB,R0
          BR      
  :     MOV     #NOCH,R0
          BR      
  :     MOV     #RDERR,R0
  :     .PRINT
          .EXIT
  AREA:   .BLKW   5
  MSG:    .BLKW   3               ;БУФЕР ДЛЯ СООБЩЕНИЯ
  BUFF:   .BLKW   256.
  BEXIT:  .ASCIZ  /КОНЕЦ ФОНОВОЙ ПРОГРАММЫ/
  NOJOB:  .ASCIZ  /НЕТ ОСНОВНОГО ЗАДАНИЯ/
  NOCH:   .ASCIZ  /НЕ ОТКРЫТ КАНАЛ ДЛЯ ОСНОВНОГО ЗАДАНИЯ/
  RDERR:  .ASCIZ  /ОШИБКА ЧТЕНИЯ/
          .END    STARTB

5.1.2. .CLOSE

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

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

        .CLOSE CHAN

Формат блока аргументов EMT:

          AREA:   .BYTE   CHAN,6

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

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

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

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

Примечание. Монитор информирует программу пользователя об ошибке при выполнении запроса .CLOSE только в том случае, если до этого был выполнен запрос .SERR.

Пример использования .CLOSE см. в описании запроса .CSISPC.

5.1.3. .DELETE

Запрос .DELETE удаляет файл из справочника указанного устройства. .DELETE недопустим для магнитных лент.

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

.DELETE AREA,CHAN,DBLK

где

AREA

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

 

DBLK

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

Примечания:

  1. Обращение к открытому каналу приводит к ошибке;
  2. Удалённый файл в листинге справочника устройства будет описан как неиспользуемая область (UNUSED) того же размера;
  3. Запрос .DELETE на устройствах нефайловой структуры игнорируется;
  4. При выполнении .DELETE необходимо, чтобы драйвер соответствующего устройства находился в памяти;
  5. После выполнения .DELETE, указанный канал освобождается для дальнейшего использования.

Пример использования .DELETE см. в описании запроса .CSISPC.

5.1.4. .ENTER

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

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

.ENTER AREA,CHAN,DBLK,LEN[,SEQN]

где

AREA

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

 

DBLK

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

 

LEN

- размер файла; (см. табл. 6);

 

SEQN

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,2
               .WORD   DBLK
               .WORD   LEN
               .WORD   SEQN
Таблица 6

Значение аргумента

Действие монитора

0

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

М

Отводит для файла М блоков

-1

Отводит для файла наибольшую свободную область на томе

Таблица 7

Значение аргумента

Действие монитора

0

Перематывает магнитную ленту и производит поиск метки LEOT (логический конец ленты)

N

Устанавливает магнитную ленту в положение, соответствующее файлу с последовательным номером N

-1

Производит поиск LEOT

-2

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

Файл, созданный по .ENTER не является постоянным до тех пор, пока на соответствующем канале не будет выполнен запрос .CLOSE. Запросы .LOOKUP и .SAVESTATUS недействительны для файлов, которые не являются постоянными. Однако чтение такого файла возможно посредством обращения к номеру соответствующего блока. Если на соответствующем канале выполняется .CLOSE, то любой существующий на томе постоянный, незащищённый файл с тем же именем и типом стирается и новый файл становится постоянным. Хотя область для файла резервируется при выполнении .ENTER, фактическая длина файла определяется после выполнения .CLOSE.

Каждое задание может иметь до 255 одновременно открытых файлов. Если требуется, все 255 файлов могут быть открыты для вывода посредством .ENTER. Для выполнения .ENTER необходимо, чтобы драйвер соответствующего устройства был в памяти. После выполнения .ENTER регистр R0 будет содержать размер области тома, отведённый для создания нового файла.

Пример.

          .TITLE  ENTER.MAC
  ;В СЛЕДУЮЩЕМ ПРИМЕРЕ С ИСПОЛЬЗОВАНИЕМ ЗАПРОСА .ENTER
  ;ВЫПОЛНЯЕТСЯ КОПИРОВАНИЕ ФАЙЛА ENTER.SAV НА УСТРОЙСТВО
  ;DK:.

          .MCALL  .LOOKUP,.ENTER,.WRITW,.READW,.CLOSE
          .MCALL  .PRINT,.EXIT
          ERRBYT = 52
  START:  .LOOKUP #AREA,#0,#ENTER         ;СВЯЗАТЬ 0-ОЙ КАНАЛ
                                          ;С ФАЙЛОМ ENTER.SAV
          BCS     
          MOV     R0,R3                   ;РАЗМЕР ФАЙЛА В R3
          .ENTER  #AREA,#1,#NEWFIL,R3     ;ОТКРЫТЬ НОВЫЙ ФАЙЛ
          BCS     
          CLR     BLK
  :     .READW  #AREA,#0,#BUFFR,#256.,BLK ;ЧИТАТЬ БЛОК
          BCC     
          TSTB    @#ERRBYT                ;КОНЕЦ ФАЙЛА?
          BEQ                           ;ДА
          MOV     #RERR,R0
          BR      
  :     .WRITW  #AREA,#1,#BUFFR,#256.,BLK ;ЗАПИСАТЬ БЛОК
          INC     BLK
          BCC     
          MOV     #WERR,R0
          BR      
  :     .CLOSE  #1
          MOV     #DONE,R0
          BR      
  :     MOV     #NOFIL,R0
          BR      
  :     MOV     #NOENT,R0
  :     .PRINT
          .EXIT

  AREA:   .WORD   0
  BLK:    .WORD   0,0,0,0
  BUFFR:  .BLKW   256.
  ENTER:  .RAD50  /DK/
          .RAD50  /ENT/
          .RAD50  /ER/
          .RAD50  /SAV/
  NEWFIL: .RAD50  /DK/
          .RAD50  /NEWENT/
          .RAD50  /SAV/

  NOFIL:  .ASCIZ  /ФАЙЛ НЕ НАЙДЕН/
  NOENT:  .ASCIZ  /ОШИБКА .ENTER /
  WERR:   .ASCIZ  /ОШИБКА .WRITW /
  RERR:   .ASCIZ  /ОШИБКА .READW /
  DONE:   .ASCIZ  /КОПИРОВАНИЕ ЗАВЕРШЕНО/
          .EVEN
          .END    START

5.1.5. .LOOKUP

Используются две формы запроса .LOOKUP. Первая форма .LOOKUP связывает указанный канал с устройством и/или существующим файлом для выполнения операций ввода-вывода. Используемый канал будет "занят" до тех пор, пока не будет выполнен один из следующих запросов: .CLOSE, .SAVESTATUS, .SRESET, .HRESET, .PURGE, .CSIGEN (если номер канала в диапазоне от 0 до 10(8).

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

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

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

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

.LOOKUP AREA,CHAN,DBLK[,SEQN]

где

AREA

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

 

SEQN

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,1
               .WORD   DBLK
               .WORD   SEQN

Пример 1.

          .TITLE  LOOKUP.MAC
  ;В ДАННОМ ПРИМЕРЕ, ИСПОЛЬЗУЮЩЕМ ЗАПРОС .LOOKUP,
  ;ОПРЕДЕЛЯЕТСЯ НАЛИЧИЕ НА УСТРОЙСТВЕ DK: РАБОЧЕГО
  ;ФАЙЛА, СОДЕРЖАЩЕГО ОЧЕРЕДЬ ФАЙЛОВ ДЛЯ ВЫВОДА НА
  ;УКАЗАННОЕ УСТРОЙСТВО.
  ;ЕСЛИ РАБОЧИЙ ФАЙЛ СУЩЕСТВУЕТ, ТО ЕГО РАЗМЕР
  ;(В БЛОКАХ) ПЕЧАТАЕТСЯ НА СИСТЕМНОМ ТЕРМИНАЛЕ.
          .MCALL  .LOOKUP,.PRINT,.EXIT
  START:  .LOOKUP #AREA,#0,#QUSPEC ;ОТКРЫТЬ ФАЙЛ
          BCC     
          .PRINT  #NOFILE         ;ФАЙЛА НЕТ
          .EXIT
  :     MOV     #SIZE,R1
          CALL    CNV10
          .PRINT  #BUFF
          .EXIT

  CNV10:  MOV     R0,-(SP)        ;ПОДПРОГРАММА
          CLR     R0              ;ПРЕОБРАЗОВАНИЯ РАЗМЕРА
  :     INC     R0              ;ФАЙЛА ДЛЯ ВЫВОДА НА
          SUB     #10.,@SP        ;ТЕРМИНАЛ
          BGE     
          ADD     #72,@SP
          DEC     R0
          BEQ     
          CALL    CNV10
  :     MOVB    (SP)+,(R1)+
          RETURN

  AREA:   .BLKW   3
  QUSPEC: .RAD50  /DK QUFILE/
          .RAD50  /TMP/
  BUFF:   .ASCII  /РАЗМЕР ФАЙЛА QUFILE.TMP = /
  SIZE:   .ASCIZ  /      /
  NOFILE: .ASCIZ  /НА DK: НЕТ ФАЙЛА QUFILE.TMP/
          .EVEN

          .END    START
Таблица 8

Значение аргумента

Действие монитора

-1

Производит поиск файла с текущего положения магнитной ленты

0

Перематывает магнитную ленту и производит поиск файла

N (N>0)

Устанавливает магнитную ленту в положение соответствующее файлу с последовательным номером N

Вторая форма .LOOKUP связывает канал с указанным заданием для обмена информацией в режимах FB и XM.

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

.LOOKUP AREA,CHAN,JOBDES

где

AREA

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

 

JOBDES

- адрес блока из 4-х слов; 1-ое слово содержит имя драйвера очереди сообщений (MQ) в кодах RADIX-50; 2, 3, 4 слова содержат логическое имя системного задания в кодах КОИ-7 . Если 2-ое слово содержит 0, то канал (CHAN) может использоваться только запросами .READ/C/W для получения сообщения от любого задания.

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,1
               .WORD   JOBDES

Пример 2.

          .TITLE  SJLOOK.MAC
  ;В ДАННОМ ПРИМЕРЕ ЗАПРОС .LOOKUP ОТКРЫВАЕТ КАНАЛ
  ;ДЛЯ СИСТЕМНОГО ЗАДАНИЯ QUEUE.REL.
  ;ПРИМЕР ВЫПОЛНЯЕТСЯ ПОД УПРАВЛЕНИЕМ МОНИТОРОВ FB
  ;ИЛИ XM.
  ;

          .MCALL  .LOOKUP,.PRINT,.EXIT,.WRITW,.READW
  START:  .LOOKUP #AREA,#0,#QMSG  ;ОТКРЫТЬ КАНАЛ ДЛЯ QUEUE
          BCC     
          .PRINT  #NOJOB
          .EXIT
  :     .WRITW  #AREA,#0,#RMSJ,#6
          BCS     
          .READW  #AREA,#0,#RMSJ,#6
          BCS     
          .PRINT  #QRUN
          .EXIT
  :     .PRINT  #MSGERR
          .EXIT
  AREA:   .BLKW   5
  QMSG:   .RAD50  /MQ/
          .ASCIZ  /QUEUE/
          .WORD   0,0
  RMSJ:   .WORD   0
          .ASCII  /SJLOOK/
  MSGERR: .ASCIZ  /ОШИБКА/
  NOJOB:  .ASCIZ  /QUEUE НЕ ЗАГРУЖЕНА/
  QRUN:   .ASCIZ  /QUEUE РАБОТАЕТ!/
          .EVEN
          .END    START

5.1.6. .PURGE

Запрос .PURGE освобождает указанный канал для использования в другой операции без выполнения каких-либо функций запросов .HRESET, .SRESET, .SAVESTATUS или .CLOSE. Временный файл, открытый на этом канале по .ENTER, аннулируется. Запрос .PURGE на свободном канале игнорируется.

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

     .PURGE CHAN

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,3

Пример использования .PURGE см. в описании запроса .HERR.

5.1.7. .RENAME

Запрос .RENAME изменяет имя файла (недопустим в операциях с магнитной лентой).

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

.RENAME AREA,CHAN,DBLK

где

AREA

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

 

DBLK

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

Формат блока аргументов EMT:

          AREA:   .BYTE   CHAN,4
                  .WORD   DBLK

Например,

          .RENAME  #AREA,#7,#DXLK
          BCS  RNMERR
           .
           .
           .
   DBLK:  .RAD50 /DX1OLDFILMAC/
          .RAD50 /DX1NEWFILMAC/

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

Пример.

          .TITLE  RENAME.MAC
  ;В ДАННОМ ПРИМЕРЕ ЗАПРОС .RENAME ИСПОЛЬЗУЕТСЯ
  ;ДЛЯ ИЗМЕНЕНИЯ ИМЕНИ ФАЙЛА.
          .MCALL  .CSISPC,.RENAME,.FETCH,.PRINT,.SRESET,.EXIT
          ERRBYT = 52
  START:  .CSISPC #FILESP,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          .FETCH  #DRVLOD,#FILESP ;ЗАГРУЗИТЬ ДРАЙВЕР
          BCS     
          MOV     #FILESP,R2
          MOV     #FILESP+46,R3
          MOV     @R2,#FILESP+36
          .REPT   4
          MOV     (R2)+,(R3)+
          .ENDR
          .RENAME #AREA,#0,#FILESP+36 ;ПЕРЕИМЕНОВАТЬ ФАЙЛ
          BCC     
          DECB    @#ERRBYT        ;АНАЛИЗ ОШИБКИ
          BEQ     
          MOV     #ILLOP,R0
          BR      
  :     .SRESET
          .EXIT

  :     MOV     #FERR,R0
          BR      
  :     MOV     #NOFIL,R0
  :     .PRINT
          BR      

  AREA:   .BLKW   5
  DEFEXT: .WORD   0,0,0,0
  NOFIL:  .ASCIZ  /ФАЙЛ НЕ НАЙДЕН/
  ILLOP:  .ASCIZ  /НЕДОПУСТИМАЯ ОПЕРАЦИЯ/
  FERR:   .ASCIZ  /ОШИБКА .FETCH/
          .EVEN
  FILESP: .BLKW   39.*2
  DRVLOD  =.
          .END    START

5.1.8. .REOPEN

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

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

.REOPEN AREA,CHAN,CBLK

где

AREA

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

 

CBLK

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,6
               .WORD   CBLK

Пример см. в описании запроса .SAVESTATUS.

5.1.9. .SAVESTATUS

Запрос .SAVESTATUS запоминает пять слов информации о состоянии канала в указанной пользователем области памяти. Эти слова содержат полную информацию, которая требуется операционной системе для точного определения файла. После выполнения .SAVESTATUS указанный канал освобождается. Если необходимо получить данные по этому каналу, то используется запрос .REOPEN. Запрос .SAVESTATUS может использоваться в том случае, если файл был открыт по .LOOKUP. Если был использован .ENTER, то .SAVESTATUS игнорируется и генерируется ошибка. Запрос .SAVESTATUS недопустим в операциях с файлами, которые находятся на магнитной ленте.

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

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

.SAVESTATUS AREA,CHAN,CBLK

где

AREA

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

 

CBLK

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,5
               .WORD   CBLK

Пример.

          .TITLE  SAVEST.MAC
          .MCALL  .CSIGEN,.SAVESTATUS,.READW,.WRITW,.PRINT
          .MCALL  .PURGE,.REOPEN,.CLOSE,.EXIT
          ERRBYT = 52
  START:  .CSIGEN #DSPACE,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          MOV     #3,R4           ;ВХОДНОЙ КАНАЛ
          MOV     #AREA,R3        ;УКАЗАТЕЛЬ НА БЛОК
                                  ;СОСТОЯНИЯ КАНАЛА
          MOV     #SAVBLK,R5
  :     .SAVEST R3,R4,R5        ;СОХРАНИТЬ ИНФОРМАЦИЮ
                                  ;О КАНАЛЕ
          BCS     
          ADD     #12,R5          ;УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ
                                  ;БЛОК ИНФОРМАЦИИ
          INC     R4
          CMP     #8.,R4          ;ВХОДНЫЕ ФАЙЛЫ ВСЕ?
          BGE                   ;НЕТ
  :     MOV     #SAVBLK,R5
          BEQ     
  :     .REOPEN R3,#3,R5        ;ПОВТОРНО ИСПОЛЬЗОВАТЬ
                                  ;КАНАЛ 3
          CLR     BLK
  :     .READW  R3,#3,#BUFF,#256.,BLK ;ЧИТАТЬ БЛОК
          BCC     
          TSTB    @#ERRBYT        ;КОНЕЦ ФАЙЛА?

          BNE     
          .PURGE  #3              ;ОСВОБОДИТЬ КАНАЛ
          ADD     #12,R5
          TST     @R5             ;ПОСЛЕДНИЙ ФАЙЛ?
          BNE     
          .CLOSE  #0              ;ЗАКРЫТЬ ВЫХ.КАНАЛ
          .PRINT  #DONE
          .EXIT

  :     .WRITW  R3,#0,#BUFF,#256.,WBLK ;ЗАПИСАТЬ БЛОК
          INC     WBLK
          INC     BLK
          BCC     
          MOV     #WERR,R0
          BR      
  :     MOV     #NOIMP,R0
          BR      
  :     MOV     #RERR,R0
  :     .PRINT
          .EXIT

  AREA:   .BLKW   5
  BLK:    .WORD   0
  WBLK:   .WORD   0
  SAVBLK: .BLKW   30.
  DEFEXT: .WORD   0,0,0,0
  NOIMP:  .ASCIZ  /НЕТ БОЛЬШЕ ВХОДНЫХ ФАЙЛОВ/
  WERR:   .ASCIZ  /ОШИБКА ЗАПИСИ/
  RERR:   .ASCIZ  /ОШИБКА ЧТЕНИЯ/
  DONE:   .ASCIZ  /КОНЕЦ ПРОГРАММЫ/
          .EVEN
  BUFF:   .BLKW   256.
  DSPACE  =.

          .END    START

5.2. Программные запросы для организации ввода-вывода данных

5.2.1. .READ, .READC, .READW

Система ФОДОС-2 предусматривает три режима выполнения операций ввода-вывода:

.READ /.WRITE

.READC/.WRITC

.READW/.WRITW

При использовании запросов .READ и .READC должны быть определены дополнительные элементы для очереди ввода-вывода.

Если запросы READ/C/W используются для обмена информацией между заданиями, то размер буфера (BUF) должен на одно слово превышать число слов для чтения (WCNT) т.к. первое слово буфера (BUF) будет содержать действительное количество переданных слов.

Запрос .READ используется для передачи определённого количества слов по указанному каналу в буфер памяти. Управление передаётся программе пользователя немедленно после начала выполнения запроса .READ. После завершения передачи данных никаких действий не происходит.

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

.READ AREA,CHAN,BUF,WCNT,BLK

где

AREA

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

 

BUF

- адрес буфера для чтения данных;

 

WCNT

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

 

BLK

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,10
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   1

Пример.

          .TITLE  READ.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСОВ .READ,.WRITE.
          .MCALL  .READ,.WRITE,.CLOSE,.PRINT,.CSIGEN
          .MCALL  .WAIT,.SRESET,.EXIT
          ERRBYT = 52
          .ENABL  LSB
  START:  .CSIGEN #DSPACE,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          MOV     #AREA,R5
          CLR     IOBLK
  :     .READ   R5,#3   ;ЧИТАТЬ С 0-ГО БЛОКА
          BCS           ;ОШИБКА ЧТЕНИЯ
          ;       .
          BIT     #1,IOBLK
          BNE     
          .PRINT  #MES
          ;       .
  :     .WAIT   #3      ;ЖДАТЬ ЗАВЕРШЕНИЯ ОПЕРАЦИИ
          BCS     
          .WRITE  R5,#0   ;ЗАПИСАТЬ БЛОК
          BCS     
          INC     IOBLK
          ;       .
          .WAIT   #0      ;ЖДАТЬ ЗАВЕРШЕНИЯ ОПЕРАЦИИ
          BCC     
  :     MOV     #WERR,R0
  :     .PRINT
          BR      
  :     MOV     #RERR,R0
          BR      
  :     TSTB    @#ERRBYT
          BNE     
          .PRINT  #MES1
          .CLOSE  #0
  :     .SRESET         ;УДАЛИТЬ ЗАГРУЖЕННЫЙ ДРАЙВЕР
          .EXIT
  AREA:   .WORD   0
  IOBLK:  .WORD   0
          .WORD   BUFF
          .WORD   256.
          .WORD   0
  BUFF:   .BLKW   256.
  DEFEXT: .WORD   0,0,0,0
  MES1:   .ASCIZ  /ОПЕРАЦИЯ ВВОДА-ВЫВОДА ЗАВЕРШЕНА/
  MES:    .ASCIZ  <15><12>/ВЫПОЛНЕНИЕ ПРОГРАММЫ ПРОДОЛЖАЕТСЯ/
  WERR:   .ASCIZ  /ОШИБКА .WRITE/
  RERR:   .ASCIZ  /ОШИБКА .READ/
          .EVEN
  DSPACE  =.

          .END    START

Если ввод выполняется с терминала и BLK=0, то на терминале печатается "^" (код 136).

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

Запрос .READC передаёт определённое количество слов по указанному каналу в память. Управление программе пользователя будет передано сразу после начала выполнения .READC. Попытка чтения данных после конца файла вызывает передачу управления вызывающей программе с установлением C-разряда и записью нуля в байт ошибок (52-байт). После выполнения .READC управление будет передано подпрограмме завершения, адрес, который указан в запросе. Если в подпрограмме завершения выполняется команда RTS PC, то управление возвращается программе пользователя.

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

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

где

AREA

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

 

BUF

- адрес буфера для чтения данных;

 

WCNT

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

 

CRTN

- адрес подпрограммы завершения (адрес должен быть больше 500(8));

 

BLK

- см. запрос .READ

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,10
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   CRTN

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

  1. регистр R0 содержит слово состояния канала; если в R0 установлен разряд 0, то произошла аппаратная ошибка во время передачи данных;
  2. регистр R1 содержит номер канала для операции; эта информация необходима, когда одна и та же подпрограмма завершения используется в нескольких операциях.

Пример.

          .TITLE  READC.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСОВ .READC,.WRITC.
          .MCALL  .READC,.WRITC,.CSIGEN,.PRINT
          .MCALL  .CLOSE,.WAIT,.SRESET,.EXIT
          ERRBYT  = 52
          .ENABL  LSB
  START:  .CSIGEN #DSPACE,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          CALL    IOXFER
          .PRINT  #MES
          MOV     #-1,R5
  :     DEC     R5
          BNE     
          TSTB    EOF
          BEQ                   ;0 - ОШИБКА ЗАПИСИ
          BLT     RERR            ;<0- ОШИБКА ЧТЕНИЯ
          .CLOSE  #0              ;>0- КОНЕЦ ФАЙЛА
          MOV     #DONE,R0
          BR      EXIT
  WERR:   MOV     #WRERR,R0
          BR      EXIT
  RERR:   MOV     #RDERR,R0
  EXIT:   .PRINT
          .SRESET                 ;УДАЛИТЬ ЗАГРУЖЕННЫЕ
                                  ;ДРАЙВЕРЫ
          .EXIT

  WRDONE: .WAIT   #0
          BCS     
  IOXFER: .READC  #AREA,#3,,,#  ;ЧИТАТЬ БЛОК
          BCC     
          TSTB    @#ERRBYT        ;КОНЕЦ ФАЙЛА?
          BEQ                   ;ДА
  :     DECB    EOF
  :     DECB    EOF
          RETURN
  :     .WAIT   #3
          BCS     
          .WRITC  #AREA,#0,,,#WRDONE ;ЗАПИСАТЬ БЛОК
          BCS     
  :     INC     BLOK
          RETURN
  :     INCB    EOF
  :     RETURN

  AREA:   .WORD   0       ;БЛОК АРГУМЕНТОВ EMT
  BLOK:   .WORD   0       ;НОМЕР БЛОКА
          .WORD   BUFF    ;АДРЕС БУФЕРА
          .WORD   256.    ;СЧЕТЧИК СЛОВ
          .WORD   0       ;АДРЕС ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ
  BUFF:   .BLKW   256.
  DEFEXT: .WORD   0,0,0,0
  DONE:   .ASCIZ  /КОНЕЦ ПРОГРАММЫ/
  MES:    .ASCIZ  /ВЫПОЛНЕНИЕ ПРОГРАММЫ ПРОДОЛЖАЕТСЯ/
  WRERR:  .ASCIZ  /ОШИБКА .WRITC/
  RDERR:  .ASCIZ  /ОШИБКА .READC/
  EOF:    .BYTE   0
          .EVEN
  DSPACE  =.

          .END    START

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

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

.READW AREA,CHAN,BUF,WCNT,BLK

где

AREA

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

 

WCNT

- количество слов для чтения (каждый запрос может передать максимально 32K слов);

 

BLK

- см. запрос .READ

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,10
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   0

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

Пример.

          .TITLE  READW.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСОВ .READW,.WRITW.
          .MCALL  .CSIGEN,.READW,.WRITW,.PRINT,.CLOSE
          .MCALL  .SRESET,.EXIT

          ERRBYT = 52

  START:  .CSIGEN #DSPACE,#DEFEXT
          CLR     IOBLK
          MOV     #AREA,R5
  READ:   .READW  R5,#3
          BCC     
          TSTB    @#ERRBYT
          BEQ     
          MOV     #RERR,R0
  :     .PRINT
          BR      
  :     .WRITW  R5,#0
          INC     IOBLK
          BCC     READ
          MOV     #WERR,R0
          BR      
  :     .CLOSE  #0
          .PRINT  #DONE
  :     .SRESET
          .EXIT

  DEFEXT: .WORD   0,0,0,0
  AREA:   .WORD   0
  IOBLK:  .WORD   0
          .WORD   BUFF
          .WORD   256.
          .WORD   0
  BUFF:   .BLKW   256.
  RERR:   .ASCIZ  /ОШИБКА .READW/
  WERR:   .ASCIZ  /ОШИБКА .WRITW/
  DONE:   .ASCIZ  /КОНЕЦ ПРОГРАММЫ/
          .EVEN
  DSPACE  =.

          .END    START

5.2.2. .WRITE, .WRITC, .WRITW

При использовании запросов .WRITE и .WRITC должны быть определены дополнительные элементы для очереди ввода-вывода.

Запрос .WRITE передаёт указанное количество слов из памяти по указанному каналу. Управление программе пользователя передаётся сразу же после того, как запрос будет поставлен в очередь.

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

.WRITE AREA,CHAN,BUF,WCNT,BLK

где

AREA

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

 

BUF

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

 

WCNT

- количество слов для записи;

 

BLK

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

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,11
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   1

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

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

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

где

AREA

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

 

BUF

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

 

WCNT

- количество слов для записи;

 

CRTN

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

 

BLK

- см. запрос .WRITE

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,11
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   CRTN

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

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

.WRITW AREA,CHAN,BUF,WCNT,BLK

где

AREA

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

 

BUF

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

 

WCNT

- количество слов для записи;

 

BLK

- см. запрос .WRITE

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,10
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .WORD   0

5.2.3. .RCVD, .RCVDC, .RCVDW (режим FB, XM)

Существуют три формы запроса получения данных, которые используются вместе с запросами .SDAT. Запросы .RCVD аналогичны запросам .READ, но в отличие от них осуществляют приём данных из другой программы, а не с устройства. При использовании запросов .RCVD и .RCVDC должны быть определены дополнительные элементы для очереди ввода-вывода.

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

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

.RCVD AREA,BUF,WCNT

где

AREA

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

 

BUF

- адрес буфера для сообщений (данных);

 

WCNT

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

Формат блока аргументов EMT:

       AREA:   .BYTE   0,26
               .WORD   <ЗАРЕЗЕРВИРОВАНО>
               .WORD   BUF
               .WORD   WCNT
               .WORD   1

После выполнения монитором запроса .RCVD, первое слово буфера (BUF) будет содержать действительное количество переданных слов. Таким образом, область памяти для приёма данных должна быть, по крайней мере, на одно слово больше размера передаваемого сообщения.

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

Пример использования .RCVD см. в описании запроса .MWAIT.

Запрос .RCVDC осуществляет приём данных и запускает подпрограмму завершения после получения сообщения (аналогично .READC).

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

.RCVDC AREA,BUF,WCNT,CRTN

где

CRTN

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

Формат блока аргументов EMT:

    AREA:   .BYTE   0,26
            .WORD   <ЗАРЕЗЕРВИРОВАНО>
            .WORD   BUF
            .WORD   WCNT
            .WORD   CRTN

Запрос .RCVDW осуществляет приём данных и ожидает окончания операции. Выполнение вызывающей программы задерживается до окончания передачи сообщения другой программой.

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

     .RCVDW AREA,BUF,WCNT

Формат блока аргументов EMT:

       AREA:   .BYTE   0,26
               .WORD   <ЗАРЕЗЕРВИРОВАНО>
               .WORD   BUF
               .WORD   WCNT
               .WORD   0

Как и в .RCVD, первое слово буфера для .RCVDC и .RCVDW будет содержать действительное количество переданных слов.

Пример использования .RCVDW см. в описании запроса .CHCOPY.

5.2.4. .SDAT, .SDATC, .SDATW (режим FB, XM)

Запросы .SDAT, .SDATC, .SDATW используются вместе с запросами .RCVD, .RCVDC, .RCVDW для передачи сообщений или данных между программами под управлением мониторов FB или XM.

Запросы .SDAT, .SDATC, .SDATW аналогично запросам .WRITE, .WRITC, .WRITW, только осуществляют передачу данных не на устройство, а другой программе. При использовании запросов .SDAT и .SDATC должны быть определены дополнительные элементы для очереди ввода-вывода.

.SDAT

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

.SDAT AREA,BUF,WCNT

где

AREA

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

 

BUF

- адрес буфера для сообщений (данных), которые будут переданы;

 

WCNT

- количество слов для передачи.

Формат блока аргументов EMT:

       AREA:   .BYTE   0,25
               .WORD   <ЗАРЕЗЕРВИРОВАНО>
               .WORD   BUF
               .WORD   WCNT
               .WORD   1

Пример использования .SDAT см. в описании запроса .MWAIT.

.SDATC

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

.SDATC AREA,BUF,WCNT,CRTN

где

AREA

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

 

BUF

- адрес буфера для сообщений (данных), которые будут переданы;

 

WCNT

- количество слов для передачи;

 

CRTN

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

Формат блока аргументов EMT:

       AREA:   .BYTE   0,25
               .WORD   <ЗАРЕЗЕРВИРОВАНО>
               .WORD   BUF
               .WORD   WCNT
               .WORD   CRTN

.SDATW

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

.SDATW AREA,BUF,WCNT

где

AREA

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

 

BUF

- адрес буфера для сообщений (данных), которые будут переданы;

 

WCNT

- количество слов для передачи.

Формат блока аргументов EMT:

       AREA:   .BYTE   0,25
               .WORD   <ЗАРЕЗЕРВИРОВАНО>
               .WORD   BUF
               .WORD   WCNT
               .WORD   0

Пример использования .SDATW см. в описании запроса .CHCOPY.

5.2.5. .TTYIN, .TTINR

Запросы .TTYIN и .TTINR используются для передачи символов с терминала в программу пользователя.

Макрорасширение для .TTYIN:

             EMT 340
             BCS .-2

Макрорасширение для .TTINR:

             EMT 340

Запрос .TTYIN ожидает подачу символа или строки символов, в то время как пользователь может или ожидать, или продолжать выполнение программы, используя .TTINR. Если по завершению выполнения .TTINR устанавливает C-разряд, то это значит, что в буфере терминала символ отсутствует (пользователь ещё не напечатал его). В режимах FB, XM и SJ (без мультитерминальной поддержки) .TTINR не устанавливает C-разряд, если не установлен 6-ой разряд в слове состояния задания (ССЗ).

Существуют два режима ввода с терминала. Режим ввода определяется содержимым 12-го разряда в ССЗ. Если содержимое 12-го разряда ноль, то говорят об общем режиме ввода-вывода. В этом режиме выполняются следующие действия:

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

Если 12-ый разряд в ССЗ равен единице, то устанавливается специальный режим ввода-вывода. В этом режиме выполняются следующие действия:

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

В специальном режиме программа пользователя должна сама выполнять печать вводимых символов, если это необходимо (исключение составляют СУ/C и СУ/D).

12-ый разряд в ССЗ должен устанавливаться программой пользователя. Этот разряд очищается, если управление передаётся монитору.

Действия СУ/F, СУ/B и СУ/X не зависят от содержимого 12-го разряда, если ранее не была подана команда SET TT NOFB.

Команды СУ/S и СУ/Q выполняются монитором, если только в режиме FB(XM) ранее не была выполнена команда SET TT NOPAGE.

Если в режиме FB (XM) сделан запрос ввода, а символа нет в наличии, то выполнение программы блокируется до тех пор, пока в буфере ввода не появится символ. Это справедливо для .TTYIN и .TTINR и не зависит от режима ввода. Для того чтобы продолжить выполнение программы (и обеспечить установку C-разряда в случае отсутствия символа в буфере ввода) необходимо установить перед .TTINR 6-ой разряд в ССЗ. 6-ой разряд очищается после окончания выполнения программы.

Вводимые по .TTYIN, .TTINR символы можно редактировать с помощью SL, если предварительно были поданы команды SET SL ON и SET SL TTYIN и содержимое 4-го и 12-го разрядов ССЗ равны нулю.

При редактировании посредством SL, содержимое 6-го разряда ССЗ не существенно, и выполнение запроса .TTINR будет завершено только после завершения операции редактирования.

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

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

.TTYIN CHAR
.TTINR

где

CHAR

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

Пример использования .TTYIN, .TTINR см. в описании запросов .TTYOUT, .TTOUTR.

5.2.6. .TTYOUT, .TTOUTR

Запросы .TTYOUT, .TTOUTR используются для передачи символов из R0 в буфер терминала. Действия этих запросов аналогичны действиям запросов .TTYIN, .TTINR. Если буфер терминала заполнен, то запрос .TTYOUT ожидает появления в буфере свободного места для выводимого символа, тогда как .TTOUTR не ожидает свободного места и символ, находящийся в R0, на терминал не выводится. Если после завершения .TTOUTR установлен C-разряд, то это говорит о том, что в буфере нет свободного места, и что символ не был выведен на терминал. В режимах FB, XM запрос .TTOUTR не устанавливает C-разряд. В этом случае, выполнение программы блокируется до появления в буфере свободного места. Для того чтобы продолжить выполнение программы и обеспечить установку C-разряда, необходимо в ССЗ установить 6-ой разряд.

Примечание. Если в основном задании установлен 6-ой разряд в ССЗ, то запросы .TTYIN и .TTYOUT будут вызывать блокировку фонового задания. Заметим, что каждое задание в основном или фоновом режиме имеет свое собственное ССЗ и поэтому они могут использовать различные режимы работы терминала независимо друг от друга.

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

.TTYOUT CHAR
.TTOUTR

где

CHAR

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

Пример.

          .TITLE  TTIO.MAC
          .MCALL  .TTYIN,.TTYOUT,.TTINR,.TTOUTR,.EXIT
          JSW     = 44       ;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ
  START:  MOV     #BUFFER,R1
          CLR     R2
          BIS     #100,@#JSW ;УСТАНОВИТЬ 6 РАЗРЯД
  INLOOP: .TTINR             ;ВВЕСТИ СИМВОЛ С ТТ:
          BCS     NOCHR
  CHRIN:  MOVB    R0,(R1)+   ;ПЕРЕСЛАТЬ СИМВОЛ В БУФЕР
          INC     R2
          CMPB    R0,#12
          BNE     INLOOP
          MOV     #BUFFER,R1
  OUTLOOP:MOVB    (R1),R0    ;ПЕРЕСЛАТЬ СИМВОЛ В R0
          .TTOUTR            ;ВЫВЕСТИ СИМВОЛ НА ТТ:
          BCS     NOROOM
  CHROUT: DEC     R2
          BEQ     START
          INC     R1
          BR      OUTLOOP    ;ПЕЧАТАТЬ СЛЕДУЮЩИЙ СИМВОЛ
  NOCHR:  .TTINR
          BCC     CHRIN      ;ЕСТЬ СИМВОЛ?
          ;       .
          ;       .
          ;       .
          BR      NOCHR

  NOROOM: MOVB    (R1),R0
          .TTOUTR
          BCC     CHROUT     ;ПРИ НАЛИЧИИ СИМВОЛА -
                             ;ПЕЧАТАТЬ ЕГО
          ;       .
          ;       .
          ;       .
          BIC     #100,@#JSW ;ОЧИСТИТЬ 6 РАЗРЯД И
          .TTYOUT (R1)       ;ПЕЧАТАТЬ СИМВОЛ
          BIS     #100,@#JSW
          BR      CHROUT

  BUFFER: .BLKB   128.
          .END    START

5.2.7. .PRINT

Запрос .PRINT вызывает печать строки символов КОИ-7 на системном терминале. В режимах FB, XM каждому сообщению предшествует побуждающий знак В> или F>, в зависимости от того, какое задание его печатает (В> - фоновое, F> - основное). Это происходит в случае переключения системного терминала на обслуживание другого задания.

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

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

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

Основное задание печатает сообщение сразу же, независимо от состояния фонового задания.

Таким образом, для печати срочных сообщений должен использоваться запрос .PRINT, а не .TTYIN или .TTYOUT.

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

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

.PRINT ADDR

где

ADDR

- адрес строки, которую необходимо напечатать.

Пример.

          .TITLE  PRINT.MAC
  ;В ЭТОМ ПРИМЕРЕ ЗАПРОС .PRINT ИСПОЛЬЗУЕТСЯ ДЛЯ ПЕЧАТИ
  ;СИМВОЛОВ, ВВОДИМЫХ С ТЕРМИНАЛА.
          .MCALL  .GTLIN,.PRINT,.EXIT
  START:  .GTLIN  #BUFF,#PROMPT   ;ВВОД СИМВОЛОВ С ТЕРМИНАЛА
          TSTB    BUFF            ;СТРОКА ПУСТАЯ?
          BEQ                   ;ДА
          .PRINT  #BUFF           ;НЕТ-ПЕЧАТЬ СТРОКИ
          CLRB    BUFF
          BR      START
  :     .EXIT
  BUFF:   .BLKW   41.
  PROMPT: .ASCII  /ВВЕДИТЕ СТРОКУ :   /<200>

          .END START

5.2.8. .MTIN

Запрос .MTIN является мультитерминальной формой запроса .TTYIN. Запрос .MTIN пересылает один или более символов из буфера ввода монитора в буфер, указанный пользователем. Терминал должен быть логически связан с текущим заданием. Если запрос выполнен успешно, то модифицированный адрес буфера пользователя будет записан в R0. Если разряд TCBIT установлен в слове M.TSTS, то запрос .MTIN устанавливает C-разряд и передаёт управление вызывающей программе, если ввод с терминала невозможен (т.е. нет строки, если разряд TTSPC очищен или нет символа в буфере ввода, если разряд TTSPC установлен). В противном случае, .MTIN будет ожидать операции ввода и, тем самым, выполнение задания будет приостановлено.

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

.MTIN AREA,ADDR,UNIT[,CHRCNT]

где

AREA

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

 

ADDR

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

 

UNIT

- логический номер терминала (ЛНТ);

 

CHRCNT

- количество пересылаемых символов (от 1 до 255); если этот аргумент опущен, то передаётся один символ.

ФОРМАТ БЛОКА АРГУМЕНТОВ EMT:

       AREA:   .BYTE   2,37
               .WORD   ADDR
               .BYTE   UNIT,CHRCNT

5.2.9. .MTOUT

Запрос .MTOUT является мультитерминальной формой запроса .TTYOUT. Запрос .MTOUT пересылает один или более символов из буфера пользователя в буфер вывода терминала. Терминал должен быть логически связан с заданием. Модифицированный адрес буфера пользователя будет записан в R0, если запрос выполнен успешно. Если в буфере вывода нет свободного места и разряд TCBIT установлен в слове M.TSTS, то .MTOUT устанавливает C-разряд и передаёт управление вызывающей программе. Если разряд TCBIT очищен, выполнение задания приостанавливается до тех пор, пока не появится свободное место в буфере вывода.

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

.MTOUT AREA,ADDR,UNIT[,CHRCNT]

где

AREA

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

 

ADDR

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

 

UNIT

- логический номер терминала (ЛНТ);

 

CHRCNT

- количество пересылаемых символов (от 1 до 255); если этот аргумент опущен, то передаётся один символ.

Формат блока аргументов EMT:

       AREA:   .BYTE   3,37
               .WORD   ADDR
               .BYTE   UNIT,CHRCNT

5.2.10. .MTPRNT

Запрос .MTPRNT является мультитерминальной формой запроса .PRINT. Он осуществляет вывод одной или нескольких строк символов на указанный терминал.

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

.MTPRNT AREA,ADDR,UNIT

где

AREA

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

 

ADDR

- адрес строки, которую необходимо напечатать (т.е. .ASCII /СТРОКА/ <200> или .ASCIZ /СТРОКА/);

 

UNIT

- логический номер терминала.

Формат блока аргументов EMT:

    AREA:   .BYTE   7,37
            .WORD   ADDR
            .BYTE   UNIT

5.2.11. .SPFUN

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

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

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

где

AREA

- адрес блока из 6-ти слов аргументов EMT;

 

FUNC

- код функции, которая будет выполняться;

 

BUF

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

 

CRTN

- адрес подпрограммы завершения; если CRTN не указан, то его значение автоматически приравнивается нулю; если CRTN равен нулю, то управление программе пользователя будет передано после завершения операции; если CRTN равен 1, управление будет передано программе пользователя немедленно после начала операции; если CRTN=N, то N - адрес подпрограммы завершения (N>500(8)).

Аргументы CHAN, BLK, WCNT те же, что и в запросах .READ/.WRITE. Они используются только тогда, когда необходимо произвести запись на магнитную ленту с расширенным межфайловым промежутком.

Формат блока аргументов EMT:

       AREA:   .BYTE   CHAN,32
               .WORD   BLK
               .WORD   BUF
               .WORD   WCNT
               .BYTE   377,FUNC
               .WORD   CRTN

В табл. 9 приводятся функции запроса .SPFUN и соответствующие им коды.

Таблица 9

Функция

Код

DX

DY

LD

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

373

-

-

-

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

377

-

-

-

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

376

-

-

-

Перемотка назад на один блок

375

-

-

-

Запись

371

376

376

-

Чтение

370

377

377

-

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

374

-

-

-

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

372

-

-

-

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

-

375

375

-

Определение размера устройства (тома)

-

-

373

373

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

-

-

-

372

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

Пример.

          .TITLE  SPFUN.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСА .SPFUN.
          .MCALL  .SPFUN,.FETCH,.LOOKUP,.PRINT,.CLOSE,.EXIT
  START:  .FETCH  #DSPC,#MT       ;ЗАГРУЗИТЬ ДРАЙВЕР МТ:
          BCS     
          .LOOKUP #AREA,#4,#MT    ;ОТКРЫТЬ КАНАЛ
          BCS     
          .SPFUN  #AREA,#4,#373,#0;ПЕРЕМОТКА ДО ТОЧКИ
                                  ;ЗАГРУЗКИ
          .BCS    
          .CLOSE  #4
          .EXIT
  :     MOV     #FERR,R0
          BR      
  :     MOV     #LKERR,R0
          BR      
  :     MOV     #SPERR,R0
  :     .PRINT
          .EXIT
  AREA:   .WORD   0
  MT:     .RAD50  /MT /
          .WORD   0,0,0
  FERR:   .ASCIZ  /ОШИБКА .FETCH/
  LKERR:  .ASCIZ  /ОШИБКА .LOOKUP/
  SPERR:  .ASCIZ  /ОШИБКА .SPFUN/
          .EVEN
  DSPC    =.
          .END    START

5.3. Запросы общего назначения

5.3.1. .CDFN

Запрос .CDFN используется для переопределения числа каналов ввода-вывода. Каждое задание независимо от того является ли оно основным или фоновым, первоначально обеспечивается 16(10) каналами ввода-вывода (от 0 до 15). Запрос .CDFN позволяет увеличить число каналов до 255(10) (от 0 до 254). Канал с номером 255 используется монитором. Область памяти для новых каналов определяется в пределах программы пользователя. Под каждый канал ввода-вывода отводится пять слов (семь слов для монитора XM). В режиме XM область памяти для дополнительных каналов, указанных в запросе .CDFN, должна располагаться в нижних 28К оперативной памяти. Рекомендуется, чтобы запрос .CDFN выполнялся в начале программы перед операциями ввода-вывода. Если в программе используется более одного запроса .CDFN, то области каналов для них не должны перекрывать друг друга, но могут иметь один и тот же начальный адрес. Два запроса .SRESET и .HRESET восстанавливают первоначальное число каналов (16(10)). Следовательно, все запросы .CDFN должны выполняться повторно после использования .SRESET или .HRESET.

Заметим, что запрос .CDFN определяет новые каналы. Область памяти для ранее определённых каналов не используется. Так, запрос .CDFN для 20(10) каналов ввода-вывода (в то время как 16 первоначальных каналов уже определены) создаёт 20 новых каналов ввода-вывода. Область для 16-ти первоначальных каналов не используется, но содержимое старых каналов будет скопировано в новые.

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

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

.CDFN AREA,ADDR,NUM

где

AREA

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

 

ADDR

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

 

NUM

- число создаваемых каналов.

Формат блока аргументов EMT:

       AREA:   .BYTE   0,15
               .WORD   ADDR
               .WORD   NUM

Пример.

          .TITLE  CDFN.MAC
  ; В ЭТОМ ПРИМЕРЕ ЗАПРОС .CDFN ИСПОЛЬЗУЕТСЯ ДЛЯ
  ; ОПРЕДЕЛЕНИЯ 32. НОВЫХ КАНАЛОВ.

          .MCALL  .CDFN,.PRINT,.EXIT,.HRESET

  START:  .CDFN   #AREA,#CHAN,#255.   ;ОПРЕДЕЛИТЬ 32.КАНАЛА
          BCC     
          .PRINT  #MSG1               ;ПЕЧАТЬ СООБЩЕНИЯ
          .EXIT                       ;ВЫХОД ИЗ ПРОГРАММЫ
  :     .PRINT  #MSG2               ;ПЕЧАТЬ СООБЩЕНИЯ
          .HRESET
          .EXIT                       ;ВЫХОД ИЗ ПРОГРАММЫ

  AREA:   .BLKW   3                   ;БЛОК АРГУМЕНТОВ EMT
  CHAN:   .BLKW   5*255.              ;ОБЛАСТЬ ДЛЯ КАНАЛОВ

  MSG1:   .ASCIZ  /ОШИБКА .CDFN/
  MSG2:   .ASCII  /ОПРЕДЕЛЕНЫ 32. НОВЫХ КАНАЛА/<15><12>
          .ASCIZ  /ВОЗВРАТ К 16. КАНАЛАМ/
          .EVEN

          .END    START

5.3.2. .CHAIN

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

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

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

.CHAIN

Примечания:

  1. Содержимое областей оперативной памяти, за исключением области памяти которую занимает резидентный монитор и ячеек 500-777, может изменяться после выполнения .CHAIN; если .CHAIN выполняется из виртуального задания, то содержимое ячеек 500-777 не сохраняется.
  2. Каналы ввода-вывода остаются открытыми после выполнения запроса .CHAIN для использования новой программой. Однако, каналы ввода-вывода, открытые по запросу .CDFN не могут использоваться. Так как по запросу .CHAIN монитор восстанавливает первоначальное число каналов (16(10)), то программа, которая оставляет файлы открытыми при выполнении .CHAIN не должна использовать .CDFN. Нерезидентные драйверы устройств удаляются из памяти при выполнении .CHAIN, поэтому они должны быть вновь загружены новой программой.
  3. По 8-ому разряду ССЗ программа может определить, как она была загружена - по запросу .CHAIN или по команде RUN. Разряд устанавливается во время выполнения программы, если она была загружена с помощью .CHAIN. Если программа, занимающая ячейки от 500 до 777, предназначена для загрузки по запросу .CHAIN, то в ней должен быть установлен 8-ой разряд в ССЗ во время её трансляции. В этом случае, программа будет загружена правильно. Если разряд не установлен, ячейки 500-777, содержимое которых сохраняется от предыдущей программы, могут вызвать неправильную работу новой программы.
  4. Для запроса .CHAIN характерны те же ошибки, что и для команды RUN.

Пример.

  ; В ЭТОМ ПРИМЕРЕ ПРОГРАММА CHAIN1.SAV ЗАГРУЖАЕТСЯ
  ; ИЗ ПРОГРАММЫ CHAIN.SAV ПОСРЕДСТВОМ ЗАПРОСА .CHAIN

          .TITLE  CHAIN.MAC

          .MCALL  .CHAIN,.TTYIN,.PRINT

  START:  MOV     #500,R1
          MOV     #CHPTR,R2
          .REPT   4
          MOV     (R2)+,(R1)+   ;ИМЯ ФАЙЛА В ЯЧЕЙКИ 500-507
          .ENDR
          .PRINT  #PROMT
  LOOP:   .TTYIN                ;ПЕРЕДАТЬ СИМВОЛЫ С ТТ: В
                                ;ЯЧЕЙКИ 510-777
          MOVB    R0,(R1)+
          CMPB    R0,#12        ;КОНЕЦ СТРОКИ?
          BNE     LOOP          ;НЕТ
          CLRB    @R1
          .CHAIN  ;ЗАПУСК ПРОГРАММЫ CHAIN1
  CHPTR:  .RAD50  /DK/
          .RAD50  /CHAIN1/
          .RAD50  /SAV/
  PROMT:  .ASCII  /ВВЕДИТЕ ДАННЫЕ ДЛЯ ПРОГРАММЫ CHAIN1: /<200>

          .END    START

  ; ПРОГРАММА  CHAIN1

          .TITLE  CHAIN1.MAC

          .MCALL  .PRINT,.EXIT

          JSW = 44
          CHAIN¤ = 400

  STARTC: BIT     #CHAIN¤,@#JSW   ;8 РАЗРЯД УСТАНОВЛЕН?
          BEQ                   ;НЕТ
          .PRINT  #CHAIND         ;ДА - ПЕЧАТЬ СООБЩЕНИЯ
          MOV     #510,R0
          .PRINT                  ;ПЕЧАТЬ СОДЕРЖИМОГО ЯЧЕЕК
                                  ;510-777
          .EXIT
  :     .PRINT  #NOCHN
          .EXIT
  CHAIND: .ASCII  /СОДЕРЖИМОЕ ЯЧЕЕК 510-777 :  /<200>
  NOCHN:  .ASCIZ  /НЕ УСТАНОВЛЕН 8-ОЙ РАЗРЯД !/
          .END    STARTC

5.3.3. .CMKT

Запрос .CMKT аннулирует один или несколько запросов .MRKT.

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

.CMKT AREA,ID[,TIME]

где

AREA

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

 

ID

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

 

TIME

- адрес блока из 2-х слов, в которые монитор записывает величину неиспользованного времени в аннулированном запросе; первое слово содержит нижнюю границу интервала времени, второе - верхнюю границу; если адрес не указан, такой записи не происходит, если ID=0, аргумент TIME игнорируется.

Формат блока аргументов EMT:

       AREA:   .BYTE   0,23
               .WORD   ID

Примечание. Аннулированный запрос .MRKT освобождает соответствующий элемент очереди.

Пример использования .CMKT см. в описании запроса .MRKT.

5.3.4. .CNTXSW (режим FB, XM)

При передаче управления от одного задания другому, монитор выполняет, так называемую, операцию переключения контекста. Она заключается в сохранении системой необходимых параметров для однозначного определения и выполнения задания. Эти параметры включают все регистры общего назначения, ячейки 34-52, а также все регистры ППЗ, если запрос .SFPA выполнялся с отличным от нуля адресом подпрограммы обработки прерывания от ППЗ.

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

Иногда, для обоих заданий необходимо независимое использование определённой ячейки памяти, которая не включена в обычную операцию переключения контекста. Например, если программа использует команду IOT, то она должна установить в векторе 20 адрес своей подпрограммы обработки прерывания по этой команде. А если оба задания - основное и фоновое - используют команду IOT, то вектор 20 должен всегда содержать соответствующий с выполняемым заданием адрес. Это достигается путем включения ячеек 20 и 22 в список адресов запроса .CNTXSW.

Если запрос .CNTXSW указан в программе несколько раз, то монитор использует список адресов последнего из них.

Список адресов .CNTXSW не может быть в области свопинга USR и его нельзя изменять в процессе работы программы.

В режиме XM, запрос .CNTXSW игнорируется для виртуальных заданий, т.к. они не используют память совместно с другими заданиями. Для виртуальных заданий векторы IOT, TRAP, BPT и вектор 250 автоматически включаются монитором XM в операцию переключения контекста, и, следовательно, могут быть использованы другим заданием без .CNTXSW.

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

.CNTXSW AREA,ADDR

где

AREA

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

 

ADDR

- адрес списка адресов (должен быть ограничен нулём); адреса в списке должны быть чётными и в пределах от 2 до 476 или в области задания пользователя, или в пределах от 160000 или 177776.

Формат блока аргументов EMT:

       AREA:  .BYTE   0,33
              .WORD   ADDR

Пример.

          .TITLE  CNTXSW.MAC
  ; В ЭТОМ ПРИМЕРЕ ЗАПРОС .CNTXSW ИСПОЛЬЗУЕТСЯ ДЛЯ
  ; ВКЛЮЧЕНИЯ ЯЧЕЕК 20,22,177302,177304,177310 В
  ; ОПЕРАЦИЮ ПЕРЕКЛЮЧЕНИЯ КОНТЕКСТА.
          .MCALL  .CNTXSW,.PRINT,.EXIT
  START:  .CNTXSW #AREA,#SWLIST
          BCC     
          .PRINT  #ADDRER
          .EXIT
  :     .PRINT  #CNTOK
          .EXIT

  SWLIST: .WORD   20
          .WORD   22
          .WORD   177302
          .WORD   177304
          .WORD   177310
          .WORD   0

  AREA:   .BLKW   2

  ADDRER: .ASCIZ  /ОШИБКА .CNTXSW /
  CNTOK:  .ASCIZ  /АДРЕСА ВКЛЮЧЕНЫ В ОПЕРАЦИЮ КОНТЕКСТА/

          .END    START

5.3.5. .CSIGEN

Запрос .CSIGEN вызывает работу интерпретатора командной строки (CSI) в общем режиме. В этом режиме CSI осуществляется синтаксический анализ командной строки и выполняет следующие функции:

  1. загружает драйверы указанных устройств;
  2. выполняет запросы .LOOKUP и/или .ENTER для указанных файлов;
  3. записывает в стек информацию о переключателях;
  4. выполняет запрос .CLOSE на каналах 0-10(8).

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

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

Когда управление возвращается программе пользователя после выполнения запроса .CSIGEN, все указанные файлы будут открыты для ввода и/или вывода. Три выходных файла будут открыты соответственно на 0,1 и 2-ом каналах; шесть входных - будут связаны с каналами 3-10(8).

Например, в командной строке

*,LP:=F1,F2

0-ой и 2-ой каналы остаются свободными, 1-й канал связывается с LP:, 3 и 4-й каналы связываются соответственно с файлами F1 и F2 на DK:, каналы 5-10(8) остаются свободными.

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

Переключатели и их аргументы записываются в стек.

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

.CSIGEN DEVSPC,DEFTYP,CSTR[,LINBUF]

где

DEVSPC

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

 

DEFTYP

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

 

CSTR

- адрес командной строки. Она не должна содержать <ВК>, <ПС>, но должна оканчиваться нулевым байтом. Если CSTR не указан или 0, то ввод осуществляется с терминала; под управлением монитора FB (XM), если ввод осуществляется с системного терминала, будет автоматически выполнен запрос .UNLOCK для USR;

 

LINBUF

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

Примечания:

  1. Блок, адрес которого указан в DEFTYP, в 1-ом слове содержит тип файла для всех входных файлов, во 2, 3 и 4-ом словах - типы файлов соответственно для 0,1 и 2-го выходных файлов. Если в блоке не указан тип файла для определённого канала, соответствующее слово должно содержать нуль. Все типы файлов должны быть записаны в кодах RADIX-50.
  2. Запрос CSIGEN автоматически воспринимает командную строку из косвенного файла, если указан ввод с терминала (CSTR=0) и программа, использующая .CSIGEN вызывается через косвенный файл.
  3. Аргумент LINBUF предоставляет пользователю возможность восстановления первоначально введённой командной строки.
  4. Если ошибка происходит при вводе командной строки с терминала, то CSI печатает сообщение об ошибке на терминале, если при вводе из памяти - устанавливается C-разряд и код ошибки (52-ой байт).

Пример.

          .TITLE  CSIGEN.MAC
  ;ПРИМЕР ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ЗАПРОСА .CSIGEN
  ;ВЫПОЛНЯЕТ КОПИРОВАНИЕ УКАЗАННОГО ФАЙЛА

          .MCALL .CSIGEN,.READW,.WRITW,.CLOSE,.SRESET,.EXIT
          .MCALL .PRINT

          ERRBYT=52

  START:  .CSIGEN #DSPACE,#DEXT   ;ВВЕСТИ КОМАНДНУЮ СТРОКУ
          MOV     R0,BUFF         ;УКАЗАТЕЛЬ НА СВОБОДНУЮ
                                  ;ПАМЯТЬ
          CLR     INBLK           ;НОМЕР БЛОКА
          MOV     #AREA,R5
  READ:   .READW  R5,#3,BUFF,#400,INBLK ;ЧИТАТЬ БЛОК
          BCC     
          TSTB    @#ERRBYT        ;КОНЕЦ ФАЙЛА?
          BEQ     EOF             ;ДА
          MOV     #INERR,R0
  :     .PRINT                  ;ПЕЧАТЬ СООБЩЕНИЯ
          CLR     R0
          .EXIT
  :     .WRITW  R5,#0,BUFF,#400,INBLK ;ЗАПИСАТЬ БЛОК
          BCC     NOERR
          MOV     #WTERR,R0
          BR      
  NOERR:  INC     INBLK           ;УВЕЛИЧИТЬ СЧЁТЧИК И
          BR      READ            ;ЧИТАТЬ СЛЕДУЮЩИЙ БЛОК
  EOF:    .CLOSE  #0              ;КОНЕЦ ФАЙЛА - ЗАКРЫТЬ
          .CLOSE  #3              ;ВХОДНОЙ И ВЫХОДНОЙ
                                  ;КАНАЛЫ
          .SRESET                 ;УДАЛИТЬ ДРАЙВЕРЫ ИЗ
                                  ;ПАМЯТИ
          .EXIT

  DEXT:   .WORD   0,0,0,0
  BUFF:   .WORD   0
  INBLK:  .WORD   0
  AREA:   .BLKW   5

  INERR:  .ASCIZ /ОШИБКА ВВОДА/
  WTERR:  .ASCIZ /ОШИБКА ВЫВОДА/
          .EVEN

  DSPACE  =.

          .END    START

5.3.6. .CSISPC

Запрос .CSISPC вызывает работу CSI в специальном режиме. В этом режиме он осуществляет синтаксический анализ командной строки и передаёт спецификации файлов и переключатели, указанные в ней, программе пользователя. В специальном режиме CSI не выполняет действий, аналогичных функциям запросов .FETCH, .CLOSE, .ENTER, .LOOKUP.

Переключатели и их аргументы пересылаются в стек.

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

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

.CSISPC OUTSPC,DEFTYP[,CSTR[],LINBUF]

где

OUTSPC

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

 

DEFTYP

- адрес блока из 4-х слов, который содержит типы файлов в кодах RADIX-50. Содержимое этого блока используется монитором, если в командной строке не указаны типы файлов;

 

CSTR

- адрес командной строки. Она не должна содержать <ВК>, <ПС>, но должна оканчиваться нулевым байтом. Если CSTR не указан или 0, то ввод осуществляется с терминала;

 

LINBUF

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

Блок, адрес которого указан в OUTSPC, содержит спецификацию для 9 файлов: по 5 слов для каждого из 3-х выходных файлов и по 4 слова для каждого из 6-ти входных файлов. Пять слов для выходного файла имеют следующее содержимое: 1-ое слово - имя устройства; 2 и 3 слова - имя файла; 4-ое слово - тип файла; 5-е слово - длина выходного файла. Если какой-то файл отсутствует, то соответствующие слова блока содержат нули.

Например,

*DX1:LIST.MAC[15]=PC:

после выполнения .CSISPC первые 5 слов для блока, адрес которого указан в OUTSPC, будут иметь следующее значения:

16337  RADIX-50 ДЛЯ DX1
46173  RADIX-50 ДЛЯ LIS
76400  RADIX-50 ДЛЯ T
50553  RADIX-50 ДЛЯ MAC
00017  ДЛИНА ФАЙЛА

Первые 4 слова для спецификаций входных файлов (начиная с адреса OUTSPC+36) будут выглядеть так:

62170 RADIX-50 ДЛЯ PC
0     ИМЯ ФАЙЛА НЕ УКАЗАНО
0
0

Если при вводе с терминала произошла ошибка, USR не печатает на терминале сообщение об ошибке, а устанавливает C-разряд в ССП.

Пример.

          .TITLE  CSISPC.MAC

  ;В ЭТОМ ПРИМЕРЕ ИСПОЛЬЗУЕТСЯ СПЕЦИАЛЬНЫЙ РЕЖИМ
  ;РАБОТЫ ИНТЕРПРЕТАТОРА КОМАНДНОЙ СТРОКИ.
  ;ЗАПРОС .DSTATUS ОПРЕДЕЛЯЕТ ЗАГРУЖЕН ЛИ ДРАЙВЕР
  ;ВЫХОДНОГО УСТРОЙСТВА И, ЕСЛИ НЕТ, ТО ИСПОЛЬЗУЕТСЯ
  ;ЗАПРОС .FETCH ДЛЯ ЗАГРУЗКИ ДРАЙВЕРА В ПАМЯТЬ.
  ;ЗАТЕМ УКАЗАНЫЙ ФАЙЛ УДАЛЯЕТСЯ ПО ЗАПРОСУ .DELETE.

          .MCALL  .CSISPC,.DSTATUS,.FETCH,.PRINT,.EXIT,.DELETE

  START:  MOV     SP,R5   ;СОХРАНИТЬ ТЕКУЩИЙ УКАЗАТЕЛЬ СТЕКА
          .CSISPC #OUTSP,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          MOV     R5,SP   ;ВОССТАНОВИТЬ УКАЗАТЕЛЬ СТЕКА
          .DSTAT  #STAT,#OUTSP   ;ПРОВЕРИТЬ НАЛИЧИЕ ДРАЙВЕРА
                                 ;ВЫХОДНОГО УСТРОЙСТВА
          TST     STAT+4         ;ДРАЙВЕР ЗАГРУЖЕН?
          BNE                  ;ДА
          .FETCH  #DEVLOD,#INSPEC;НЕТ-ЗАГРУЗИТЬ ДРАЙВЕР
          BCC     
          .PRINT  #FEFAIL
          .EXIT
  :     .DELETE #AREA,#0,#INSPEC;УДАЛИТЬ ФАЙЛ
          BCC     
          .PRINT  #NOFILE
          BR      START
  :     .PRINT  #FILDEL
          .EXIT

  AREA:   .BLKW   2
  STAT:   .BLKW   4
  DEFEXT: .WORD   0,0,0,0
  FEFAIL: .ASCIZ  /ОШИБКА .FETCH/
  NOFILE: .ASCIZ  /ФАЙЛ НЕ НАЙДЕН/
  FILDEL: .ASCIZ  /ФАЙЛ УДАЛЕН/
          .EVEN
  OUTSP:  .BLKW   5*3     ;СПЕЦИФИКАЦИИ ВЫХ.ФАЙЛОВ
  INSPEC: .BLKW   4*6     ;СПЕЦИФИКАЦИИ ВХ.ФАЙЛОВ
  DEVLOD: .BLKW   1       ;АДРЕС ЗАГРУЗКИ ДРАЙВЕРА
          .END    START
5.3.6.1. Передача информации о переключателях программе пользователя.

В общем и специальном режимах работы CSI переключатели и их аргументы пересылаются в стек. Переключатель представляет собой наклонную черту (/), за которой следует имя переключателя (символ КОИ-7). За переключателем может следовать аргумент, перед которым ставится разделитель (:). Аргумент может быть восьмеричным или десятичным числом (числом с точкой), или комбинацией буквенно-цифровых символов (от одного до трёх), первый из которых - буква. В командной строке переключатели могут быть связаны с файлами.

Например: *DK:FOO/A,DX1:FILE.OBJ/A:100

В этом случае имеется два переключателя а, первый из которых связан с входным файлом FOO, второй связан с входным файлом FILE:OBJ и имеет аргумент 100(8).

В табл. 10 приводится формат содержимого стека после выполнения запроса .CSIGEN или .CSISPC. Указатель стека будет содержать адрес первого слова.

Таблица 10

Слово

Содержимое

Значение

1

N

Число переключателей в командной строке

2

Имя переключателя и номер файла

Чётный байт содержит имя переключателя. Разряды 8-14 содержат номер (от 0 до 10) файла, с которым связан данный переключатель. Разряд 15 содержит 1, если переключатель имеет аргумент

3

Аргумент переключателя или имя следующего переключателя

Если установлен 15-й разряд в слове 2, то слово 3 содержит аргумент переключателя. В противном случае - имя следующего переключателя

Например, после обработки CSI командной строки

     *FILE/B:20.,FIL2/E=DX1:INPUT/X:SY:20

Стек будет содержать значения, описанные в табл. 11.

Таблица 11

Содержимое

Значение

4

Число переключателей (переключатель X имеет два аргумента и рассматривается как два переключателя)

101530

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

20

Аргумент переключателя X

101530

Следующий переключатель (X) связан с 3-им файлом и имеет аргумент

75250

Аргумент переключателя X - SY в кодах RADIX-50

505

Следующий переключатель (Е) связан с 1-м файлом и не имеет аргумента

100102

Переключатель (В) связан с 0-м файлом и имеет аргумент

24

Аргумент переключателя В

Примечание.

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

5.3.7. .ABTIO

Запрос .ABTIO позволяет текущему заданию запретить все операции ввода - вывода на указанном канале, не прерывая выполнения программы.

Запрещается использовать .ABTIO в подпрограммах завершения.

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

.ABTIO CHAN

где

CHAN

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

5.3.8. .CSTAT (режим FB, XM)

Запрос .CSTAT передаёт программе пользователя информацию о состоянии канала.

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

.CSTAT AREA,CHAN,ADDR

где

AREA

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

 

CHAN

- номер канала, информацию о котором требуется получить;

 

ADDR

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

Формат блока аргументов:

       AREA:   .BYTE   CHAN,27
               .WORD   ADDR

Пример.

          .TITLE  CSTAT.MAC
  ;В ЭТОМ ПРИМЕРЕ ЗАПРОС .CSTAT ИСПОЛЬЗУЕТСЯ ДЛЯ ОПРЕДЕЛЕНИЯ
  ;УСТРОЙСТВА, СВЯЗАНОГО С УКАЗАННЫМ КАНАЛОМ.

          .MCALL  .CSTAT,.CSIGEN,.PRINT,.EXIT

  START:  MOV     SP,R5
          .CSIGEN #DEVSDC,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          MOV     R5,SP
          .CSTAT  #AREA,#0,#ADDR  ;ПОЛУЧИТЬ ИНФОРМАЦИЮ О
                                  ;КАНАЛЕ
          BCS     NOCHAN          ;КАНАЛ НЕ ОТКРЫТ
          MOV     #ADDR+10,R5
          MOV     (R5)+,R0
          ADD     (PC)+,R0
          .RAD50  /  0/
          ADD     (R5),R0         ;ПОЛУЧИТЬ ИМЯ УСТРОЙСТВА
          MOV     R0,DEVNAM
          .EXIT

  NOCHAN: .PRINT  #MSG
          .EXIT

  MSG:    .ASCIZ  /НЕТ ВЫХОДНОГО ФАЙЛА - КАНАЛ НЕ ОТКРЫТ/
          .EVEN
  AREA:   .BLKW   5
  ADDR:   .BLKW   6
  DEVNAM: .WORD   0               ;ИМЯ УСТРОЙСТВА
  DEFEXT: .WORD   0,0,0,0

  DEVSDC  =.                      ;АДРЕС ЗАГРУЗКИ ДРАЙВЕРА

          .END    START

5.3.9. .DATE

Запрос .DATE передаёт информацию о текущей дате из системной ячейки даты в регистр R0. Ячейка даты имеет следующий формат:

Разряды 13-10 - месяц;

Разряды 9-5 - день;

Разряды 4-0 - год.

Значение года в разрядах с 0 по 4 является фактическим годом минус 1972.

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

     .DATE

Нулевое значение в R0 указывает на то, что пользователь дату не определил.

Пример.

          .TITLE DATE.MAC
  ;ПРИМЕР ПОДПРОГРАММЫ ОБРАБОТКИ ДАТЫ (ВВЕДЁННОЙ ПО КОМАНДЕ
  ;DATE) С ИСПОЛЬЗОВАНИЕМ ЗАПРОСА .DATE, К КОТОРОЙ МОЖНО
  ;ОБРАТИТЬСЯ ИЗ ПРОГРАММЫ ПОЛЬЗОВАТЕЛЯ.
  ;
  ;ВЫХ.ДАННЫЕ:    R0 = МЕСЯЦ (1-12)
  ;               R1 = ДЕНЬ  (1-31)
  ;               R2 = ГОД   (ДВЕ ПОСЛЕДНИЕ ЦИФРЫ)
  ;
  ;ОШИБКИ:        R0 = 0, ЕСЛИ ДАТА НЕ ВВЕДЕНА
  ;

          .MCALL  .DATE

  DATE::  .DATE           ;ПОЛУЧИТЬ ДАТУ ИЗ R0
          MOV     R0,R2
          BEQ           ;ВЕТВЛЕНИЕ, ЕСЛИ ДАТА НЕ
                          ;ВВЕДЕНА
          BIC     #37,R2  ;ВЫБРАТЬ ГОД
          ADD     #72,R2
          MOV     R0,R1
          ASL     R1      ;ВЫБРАТЬ ДЕНЬ
          ASL     R1
          ASL     R1
          SWAB    R1
          BIC     #37,R1  ;ВЫБРАТЬ МЕСЯЦ
          SWAB    R0
          ASR     R0
          ASR     R0
          BIC     #37,R0
  :     RETURN          ;ВЫХОД ИЗ ПОДПРОГРАММЫ
          .END

5.3.10. .DEVICE (режим FB, XM)

Запрос .DEVICE позволяет записать определённые значения по указанным адресам после выхода из программы (по .EXIT или СУ/C). Эта функция в основном используется для записи в регистры устройств необходимых значений.

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

Запрос .DEVICE игнорируется, если он выдаётся из виртуального задания в режиме XM.

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

.DEVICE AREA,ADDR[,LINK]

где

AREA

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

 

ADDR

- адрес таблицы адресов и значений;

 

LINK

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

Таблица адресов и значений может иметь два формата - связанный и не связанный. Оба формата должны оканчиваться нулём. Связанный формат должен иметь в первом слове также ноль. На рис. 5 показаны различные форматы таблицы адресов и значений.

Не связанный

Связанный

ADDR:

Адрес

ADDR:

0

 

Значение

 

Адрес

 

Адрес

 

Значение

 

Значение

 

Адрес

 

.

 

Значение

 

.

 

.

 

.

 

.

 

Адрес

 

.

 

Значение

 

Адрес

 

0

 

Значение

     

0

Рис.5

5.3.11. .DSTATUS

Запрос .DSTATUS используется для получения  информации об определённом устройстве.

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

.DSTATUS DSTBLK,DEVNAM

где

DSTBLK

- адрес блока из 4-х слов состояния устройства;

 

DEVNAM

- адрес имени устройства в кодах RADIX-50. Первым словом блока состояния является слово состояния устройства. Возможные значения разрядов слова состояния устройства приведены в табл. 12.

Таблица 12

Разряд

Содержимое

Значение

0-7

0

Кассета магнитных дисков

 

2

Логическое устройство регистрации ошибок

 

3

Построчно-печатающее устройство

 

4

Системный терминал или драйвер BATCH

 

6

Гибкие диски с двойной плотностью

 

7

Перфоленточное устройство ввода и вывода

 

11

Накопитель на магнитной ленте

 

21

Пакет магнитных дисков DP (29 Мбайт)

 

22

Гибкие диски

 

25

Фиктивное устройство

 

34

Кассетная магнитная лента

 

41

Устройство печати последовательного типа

 

42

Драйвер обмена между заданиями

 

46

Драйвер логического диска

 

47

Драйвер расширенной памяти

 

50

Диски винчестерского типа или гибкие мини-диски

 

51

Редактор командной строки

10

1

Драйвер устройства допускает использование запроса .SPFUN

 

0

Не допускается использование запроса .SPFUN

11

-

Резервный

12

1

Устройство несправочной структуры

13

1

Устройство только для записи

14

1

Устройство только для чтения

15

1

Устройство с произвольным доступом к данным

 

0

Устройство с последовательным доступом к данным

Второе слово представляет собой длину драйвера устройства в байтах.

Третье слово представляет собой адрес загрузки драйвера плюс 6. Если 0 - драйвера в памяти нет.

Четвёртое слово представляет собой ёмкость устройства (в блоках) для устройств с произвольным доступом к данным или 0 для устройств с последовательным доступом к данным.

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

Пример использования .DSTATUS см. в описании запроса .CSISPC.

5.3.12. .EXIT

Запрос .EXIT вызывает окончание выполнения программы пользователя и передаёт управление KMON.

Перед выходом из программы выполнение всех инициированных операций ввода-вывода и /или подпрограмм завершения будет закончено. Все невыполненные запросы .MRKT и .CMKT будут аннулированы.

Если часть фоновой программы занимает область памяти KMON и USR, то она будет записана в блоки для временного хранения данных на системное устройство (если ранее была выполнена команда SET EXIT SWAP). После этого KMON и USR загружаются в память и управление передаётся клавиатурному монитору. Если была выполнена команда SET EXIT NOSWAP, то программа пользователя просто перезаписывается.

Если R0 = 0 во время выполнения .EXIT, то выполняется операция аналогичная .HRESET, запрещающая последующее выполнение команд REENTER, START или CLOSE.

Запрос .EXIT позволяет программе передать команды клавиатурному монитору, используя ячейки 500-777, для их последующего выполнения. Для этого необходимо:

  1. ячейка 510 должна содержать общее количество байтов в команде, которая будет передана KMON;
  2. команды записываются, начиная с ячейки 512; строка должна быть записана в символах КОИ-7 и не должна содержать <ВК> или <ПС>; например:
          .=510
          .WORD B-A
      A:  .ASCIZ /COPY A.MAC W.MAC/
          .ASCIZ /DELETE A.MAC/
      B=  .
  3. программа пользователя должна установить 5 или 11 разряд в ССЗ перед выполнением .EXIT; содержимое R0 должно быть нулевым.

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

  1. если это свойство используется программой, которая вызывается с помощью косвенного файла, то все команды, следующие в косвенном файле за командой, инициирующей пуск этой программы, выполняться не будут;
  2. косвенный файл может быть вызван, используя это свойство, только в том случае если передаваемая KMON строка содержит единственную спецификацию файла; попытка передачи нескольких косвенных файлов или комбинаций косвенных файлов с другими командами KMON приводит к неправильным результатам;
  3. .EXIT в подпрограмме завершения недопустим. Заметим, что запрос .EXIT изменяет текущее положение указателя стека.

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

.EXIT

Пример.

          .TITLE  EXIT.MAC
  ;В ЭТОМ ПРИМЕРЕ, ПОСЛЕ ЗАВЕРШЕНИЯ ПРОГРАММЫ,
  ;КЛАВИАТУРНОМУ МОНИТОРУ ПЕРЕДЕТСЯ КОМАНДНАЯ
  ;СТРОКА НА ПЕЧАТЬ СПРАВОЧНИКА УСТРОЙСТВА DK:
          .MCALL  .EXIT
  CHNIF¤  = 4000
  JSW     = 44

  START:  MOV     #510,R0
          MOV     #CMDSTR,R1
          MOV     #START,SP

  :     MOVB    (R1)+,(R0)+
          CMP     R1,#CMDEND
          BLO     
          BIS     #CHNIF¤,@#JSW ;УСТАНОВИТЬ 11-ЫЙ РАЗРЯД
                                ;В JSW
          CLR     R0            ;В R0 ДОЛЖЕН БЫТЬ 0
          .EXIT

  CMDSTR: .WORD   CMDEND-CMDSTR ;ДЛИНА КОМАНДНОЙ СТРОКИ
          .ASCIZ  "DIRECT/FULL *.MAC" ;КОМАНДНАЯ СТРОКА
  CMDEND:
          .EVEN
          .END    START

5.3.13. .FETCH, .RELEAS

Запрос .FETCH загружает драйвер устройства из системного устройства в оперативную память.

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

.FETCH ADDR,DEVNAM

где

ADDR

- адрес загрузки драйвера;

 

DEVNAM

- адрес имени устройства в кодах RADIX-50.

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

Для выполнения запросов

.CLOSE

.READC

.READ

.SFDAT

.LOOKUP

.WRITE

.WRITC

.FPROT

.ENTER

.READW

.SPFUN

 

.RENAME

.WRITW

.DELETE

 

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

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

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

Пример использования .FETCH см. в описании запроса .CSISPC.

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

  1. является частью RMON (т.е. является драйвером системного устройства);
  2. отсутствует в памяти;
  3. был загружен по команде LOAD.

Запрос .RELEAS в основной программе или в системном задании под управлением монитора FB(XM) всегда игнорируется, т.к. мониторы FB или XM могут использовать только те драйверы, которые были загружены по команде LOAD.

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

.RELEAS DEVNAM

где

DEVNAM

- адрес имени устройства в кодах RADIX-50.

Пример.

          .TITLE  RELEAS.MAC
  ;В ЭТОМ ПРИМЕРЕ ДРАЙВЕР PC: ЗАГРУЖАЕТСЯ В ПАМЯТЬ,
  ;А ЗАТЕМ ПО ЗАПРОСУ .RELEAS УДАЛЯЕТСЯ ИЗ ПАМЯТИ.

          .MCALL  .FETCH,.RELEAS,.EXIT,.PRINT

  START:  .FETCH  #DSPACE,#DEVNAM ;ЗАГРУЗИТЬ ДРАЙВЕР
          BCS     FERR
          .RELEAS #DEVNAM         ;УДАЛИТЬ ДРАЙВЕР
          BR      START

  FERR:   .PRINT  #NODEV
          .EXIT
  DEVNAM: .RAD50  /PC /
  NODEV:  .ASCIZ  " УСТРОЙСТВО ОТСУТСТВУЕТ !"
          .EVEN
  DSPACE:

          .END    START

5.3.14. .FORK

Запрос .FORK используется в драйверах для синхронизации работы системы. Запросу .FORK должен предшествовать запрос .INTEN, .FORK требует для своего выполнения блок памяти из 4-х слов. Содержимое регистров R4 и R5 после выполнения запроса сохраняется. .FORK используется в том случае, когда должен быть упорядочен доступ к системным ресурсам или должна быть выполнена не критическая по времени, но большая по размеру, часть программы. После обработки монитором запроса .FORK прерывание от устройства будет запрещено, и драйвер будет работать на нулевом приоритете.

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

.FORK FKBLK

где

FKBLK

- адрес блока из 4-х слов (должен быть в драйвере устройства).

5.3.15. .FPROT

С помощью запроса .FPROT устанавливается или отменяется защита файла (от удаления).

На защищённый файл не распространяется действия запросов .CLOSE, .DELETE, .ENTER и .RENAME. Однако данные, хранящиеся в защищённом файле, можно модифицировать. Например, использование запроса .LOOKUP для защищённого файла за которым следует .WRITE, использующий тот же канал, допускается.

Защита файла от удаления реализуется установкой 15-го разряда в слове состояния справочника устройства для указанного файла.

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

.FPROT AREA,CHAN,DBLK,PROT

где

AREA

- адрес блока (из 4-х слов) аргументов EMT;

 

CHAN

- номер канала (от 0 до 376);

 

DBLK

- адрес блока (из 4-х слов), содержащего спецификацию файла в кодах RADIX-50;

 

PROT

- константа, равная 1 (защита устанавливается) или 0 (защита отменяется).

Формат блока аргументов:

       AREA:   .BYTE   CHAN,43
               .WORD   DBLK
               .WORD   PROT

Пример.

          .TITLE FPROT.MAC
  ;В ПРИМЕРЕ ИСПОЛЬЗУЮТСЯ ЗАПРОСЫ .FPROT И .SFDAT
  ;ДЛЯ УСТАНОВКИ ЗАЩИТЫ УКАЗАННОГО ФАЙЛА И
  ;ИЗМЕНЕНИЯ ДАТЫ СОЗДАНИЯ ФАЙЛА НА ТЕКУЩУЮ ДАТУ.
  ;КОМАНДНАЯ СТРОКА ВВОДИТСЯ С ТЕРМИНАЛА.

          .MCALL .FPROT,.FETCH,.CSISPC,.DSTATUS,.SFDAT
          .MCALL .PRINT,.EXIT

  START:  .CSISPC #OUTSP,#DEFEXT  ;ВВОД КОМАНДНОЙ СТРОКИ
          .DSTAT  #STAT,#INSPEC   ;ПРОВЕРИТЬ НАЛИЧИЕ
                                  ;УСТРОЙСТВА
          TST     STAT+4          ;ДРАЙВЕР ЗАГРУЖЕН?
          BNE                   ;ДА
          .FETCH  #DRVLOD,#INSPEC ;НЕТ-ЗАГРУЗИТЬ ДРАЙВЕР
          BCC     
          .PRINT  #LOFAIL
          BR      START
  :     .FPROT  #EMTBLK,#0,#INSPEC,#1;УСТАНОВИТЬ ЗАЩИТУ
                                       ;ФАЙЛА
          BCC     
          .PRINT  #PRFAIL
          BR      START
  :     .SFDAT  #EMTBLK,#0,#INSPEC,#0;ИЗМЕНИТЬ ДАТУ НА
                                       ;ТЕКУЩУЮ
          BCC     
          .PRINT  #SDFAIL
          BR      START
  :     .EXIT

  EMTBLK: .BLKW   4
  DEFEXT: .WORD   0,0,0,0
  STAT:   .BLKW   4              ;БЛОК СОСТОЯНИЯ УСТРОЙСТВА
  LOFAIL: .ASCIZ  /ОШИБКА ЗАПРОСА .FETCH/
  PRFAIL: .ASCIZ  /ОШИБКА ЗАПРОСА .FPROT/
  SDFAIL: .ASCIZ  /ОШИБКА ЗАПРОСА .SFDAT/
          .EVEN
  OUTSP:  .BLKW   5*3
  INSPEC: .BLKW   4*6
  DRVLOD: .BLKW   1
          .END    START

5.3.16. .GTIM

Запрос .GTIM позволяет программе определить текущее время суток. Величина времени определяется в тиках (1 тик = 1/50 с).

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

.GTIM AREA,ADDR

где

AREA

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

 

ADDR

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

Формат блока аргументов:

       AREA:   .BYTE   0,21
               .WORD   ADDR

Пользователь должен предусмотреть в своей программе операцию преобразования тиков в часы-минуты-секунды. В режиме FB величина времени автоматически восстанавливается после 24:00:, в режиме SJ операция восстановления выполняется, если при генерации системы была определена поддержка таймера.

Пример.

          .TITLE  GTIM.MAC

  ;В ЭТОМ ПРИМЕРЕ ПОЛЬЗОВАТЕЛЬ ПОЛУЧАЕТ ТЕКУЩЕЕ ВРЕМЯ
  ;В ТИКАХ.

          .MCALL  .GTIM,.EXIT

  START:  .GTIM   #AREA,#TICKS    ;ОПРЕДЕЛИТЬ ТЕКУЩЕЕ
                                  ;ВРЕМЯ
          .EXIT

  TICKS:  .WORD   0,0
  AREA:   .BLKW   2

          .END START

5.3.17. .GTJB

Запрос .GTJB позволяет программе определить номер выполняемого задания, нижнюю границу памяти и другие параметры задания.

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

.GTJB AREA,ADDR[,JOBBLK]

где

AREA

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

 

ADDR

- адрес блока из 8-ми или 12-ти слов для параметров задания (см. табл. 13);

 

JOBBLK

- адрес блока из 3-х слов, содержащего логическое имя задания в кодах КОИ-7.

Формат блока аргументов:

       AREA:   .BYTE   0,20
               .WORD   ADDR
               .WORD   JOBBLK
Таблица 13

Слово

Содержимое

1

Номер задания; в режимах FB, XM без поддержки системных заданий: фоновое - 0, основное - 2;

В режимах FB, XM с поддержкой системных заданий: фоновое - 0, системные - 2,4,6,10,12,14, основное - 16

2

Верхняя граница области задания

3

Нижняя граница области задания

4

Начало области каналов ввода-вывода

5

Адрес смешанной области заданий для мониторов FB и XM

6

Младший байт - номер системного терминала для систем с мультитерминальной поддержкой

7

В режиме XM - верхний виртуальный адрес для виртуального задания.

10-12

В режимах FB, XM с поддержкой системных заданий - логическое имя задания в кодах КОИ-7

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

Слово 4 содержит адрес, с которого начинается область каналов ввода-вывода. Обычно этот адрес находится в пределах RMON. Однако, после выполнения .CDFN, область каналов ввода-вывода заменяется на область, адрес которой указывается пользователем.

Пример.

          .TITLE  GTJB.MAC
  ;В ДАННОМ ПРИМЕРЕ С ПОМОЩЬЮ ЗАПРОСА .GTJB ОПРЕДЕЛЯЕТСЯ
  ;ЗАГРУЖЕНО ЛИ ОСНОВНОЕ ЗАДАНИЕ.
  ;ПРОГРАММА МОЖЕТ ВЫПОЛНЯТЬСЯ КАК ПОД УПРАВЛЕНИЕМ МОНИТОРА
  ;FB, ИМЕЮЩЕГО ПОДДЕРЖКУ СИСТЕМНЫХ ЗАДАНИЙ, ТАК И ПОД
  ;УПРАВЛЕНИЕМ МОНИТОРА FB, КОТОРЫЙ НЕ ИМЕЕТ ПОДДЕРЖКИ
  ;СИСТЕМНЫХ ЗАДАНИЙ.

          .MCALL  .GVAL,.GTJB,.PRINT,.EXIT

          SYSGEN = 372            ;СЛОВО ПАРАМЕТРОВ ГЕНЕРАЦИИ
          SYSJOB = 40000          ;РАЗРЯД СИСТЕМНОГО ЗАДАНИЯ

  START:  MOV     #2,     R1
          .GVAL   #LIST,  #SYSGEN ;ПОЛУЧИТЬ В R0 СОДЕРЖИМОЕ
                                  ;ЯЧЕЙКИ МОНИТОРА
          BIT     #SYSJOB,R0      ;ЕСТЬ ПОДДЕРЖКА СИСТЕМНОГО
                                  ;ЗАДАНИЯ
          BEQ     
          MOV     #16,    R1      ;НОМЕР ОСНОВНОГО ЗАДАНИЯ=16

  :     .GTJB   #LIST,#JOBARG,R1;ПОЛУЧИТЬ ПАРАМЕТРЫ
          BCS     
          .PRINT  #FGLOAD
          .EXIT
  :     .PRINT  #NOFG
          .EXIT

  LIST:   .BLKW   3
  JOBARG: .BLKW   12.             ;БЛОК ПАРАМЕТРОВ ЗАДАНИЯ
  FGLOAD: .ASCIZ  / ПРОГРАММА В ОСНОВНОЙ ОБЛАСТИ ПАМЯТИ/
  NOFG:   .ASCIZ  /НЕТ ПРОГРАММЫ В ОСНОВНОЙ ОБЛАСТИ/
          .EVEN
          .END    START

5.3.18. .GTLIN

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

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

Запрос .GTLIN игнорирует аргумент PSTR, если ввод осуществляется из косвенного файла и, если ранее была выполнена команда SET TT QUIET. Однако если ввод осуществляется с терминала или из косвенного файла, и ранее не была выполнена команда SET TT QUIET, запрос .GTLIN будет использовать аргумент PSTR для печати побуждающей строки символов перед выборкой входной строки.

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

.GTLIN SPTR[,PSTR][,TYPE]

где

SPTR

- адрес буфера для записи входной строки; длина строки не должна превышать 81 байт; строка будет ограничена нулевым байтом вместо <ВК> <ПС>;

 

PSTR

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

 

TYPE

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

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

Пример.

          .TITLE  GTLIN.MAC
  ;В ЭТОМ ПРИМЕРЕ ПЕЧАТАЕТСЯ СТРОКА, ВВЕДЁННАЯ С
  ;ТЕРМИНАЛА.

          .MCALL  .GTLIN,.PRINT,.EXIT

  START:  .GTLIN  #BUFF,#PROMT
          TSTB    BUFF
          BEQ     
          .PRINT  #BUFF
          CLRB    BUFF
          BR      START
  :     .EXIT
  BUFF:   .BLKW   41.
  PROMT:  .ASCII  /ВВЕДИТЕ СТРОКУ -  /<200>
          .END    START

5.3.19. .GVAL, .PVAL

Запрос .GVAL передаёт в R0 содержимое указанной ячейки монитора.

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

.GVAL AREA,OFFSET

где

AREA

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

 

OFFSET

- значение смещения относительно начала RMON.

Формат блока аргументов:

       AREA:   .BYTE   0,34
               .WORD   OFFSET

Пример использования .GVAL см. в описании запроса .GTJB.

Запрос .PVAL изменяет содержимое указанной ячейки монитора. Старое содержимое записывается в регистр R0.

В режиме XM .GVAL и .PVAL должны использоваться для изменения содержимого ячеек монитора для совместимости с другими мониторами ФОДОС-2.

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

.PVAL AREA,OFFSET,VALUE

где

AREA

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

 

OFFSET

- значение смещения относительно начала RMON.

 

VALUE

- новое содержимое ячейки монитора.

Формат блока аргументов:

       AREA:   .BYTE   2,34
               .WORD   OFFSET
               .WORD   VALUE

5.3.20. .HERR, .SERR

Запросы .HERR, .SERR позволяют задать определённый режим работы монитора при обнаружении условий ошибок. Во время выполнения программы могут возникнуть определённые ошибки, вызывающие прерывание программы (см. табл. 14). Обычно эти ошибки вызывают выход из программы и печать монитором сообщения об ошибке. Однако в некоторых случаях невозможно прервать выполнение программы из-за возникших ошибок. Например, многопользовательская программа должна сохранять управление и прервать работу только с тем пользователем, который сделал ошибку. В этом случае полезно использовать запрос .SERR, который запрещает монитору удаление из памяти программы, в которой обнаружена ошибка. Вместо этого, при возникновении ошибки после выполнения запроса .SERR, устанавливается C-разряд и код ошибки в 52-ом байте. В некоторых случаях запрос .SERR оставляет каналы открытыми, например, если использовались запросы .LOOKUP и .ENTER.

Запрос .HERR отменяет действие запроса .SERR. В этом случае печатается сообщение об ошибке, и программа удаляется из памяти.

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

     .HERR
     .SERR
Таблица 14

Код

Причина ошибки

-1

Вызов USR из подпрограммы завершения

-2

В памяти нет драйвера устройства

-3

Ошибка ввода-вывода справочника устройства

-4

Ошибка .FETCH. Ошибка при чтении драйвера, или попытка загрузить его выше USR или RMON

-5

Ошибка чтения оверлейного сегмента

-6

В справочнике устройства нет свободного места для записи файла

-7

Недопустимый адрес (только в режиме FB) попытка выполнить операцию вне границ задания

-10

Несуществующий номер канала

-11

Недопустимая команда EMT; определён недопустимый функциональный код

-14

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

-15

Отсутствует драйвер устройства (в режиме XM)

Пример.

      .TITLE HERR.MAC
; использование в этом примере запросов .HERR, .SERR
; позволяет программе пользователя самой обрабатывать
;серьёзные ошибки
      .MCALL  .HERR,.SERR,.LOOKUP,.PURGE
      .MCALL  .EXIT,.PRINT,.CSISPC

START: .SERR                  ;запретить прерывание программы
                              ;по ошибке
       .CSISPC #OUTSP,#DEFEXT ;ввод командной строки
       .PURGE  #0
       .LOOKUP #AREA,#0,#OUTSP+36
       .HERR                  ;разрешить прерывание программы по ошибке
       .PRINT  #LUPOK
       .EXIT
ERROR: MOVB  @#52,R0          ;серьёзная ошибка?
       BMI   FILERR
       .PRINT  #NOFIL
       BR    START
FILERR:NEG   R0
       DEC   R0
       ASL   R0
       MOV   TBL(R0),R0
       .PRINT
       BR    START
TBL:   C2
       C3
       C7
       C10
       C11
       C14
C2:   .ASCIZ  /драйвер устройства не загружен/
C3:   .ASCIZ  /ошибка чтения справочника/
C7:   .ASCIZ  /ошибка адресации/
C10:  .ASCIZ  /недопустимый номер канала/
C11:  .ASCIZ  /недопустимый код EMT/
C14:  .ASCIZ  /недопустимый справочник/
NOFIL:.ASCIZ  /файл не найден/
LUPOK:.ASCIZ  /конец программы/
      .EVEN
AREA: .BLKW   4
DEFEXT:.WORD  0,0,0,0
OUTSP: .BLKW  5*3
INSREC:.BLKW  4*6
      .END START

Пример 2:

        .MCALL  .ENTER .HERR .SERR .PRINT .EXIT .USRDF

START: .SERR            ;запретить прерывание программы
                        ;по ошибке
       .USRDF           ;определить мнемонику статуса завершения
                        ;программы USERRB
       .ENTER  #AREA,#1,#FILE    ;открыть файл на PR:
       BCC   
       CALL  ERR         ;обработать ошибку
       .HERR             ;разрешить прерывание программы по ошибке
       .ENTER  #AREA,#1,#FILE    ;открыть файл на PR:
       BCS   ERR1
:    .EXIT
ERR1:  .PRINT  #MSG
       .EXIT
MSG:   .ASCIZ  /ошибка .ENTER/
       .EVEN
ERR:   MOVB  @#52,R0     ;подпрограмма обработки ошибок
       NEG   R0
       DEC   R0
       ASL   R0
       MOV   COD(R0),R0
       .PRINT
       BISB  #3,@#USERRB ;установить завершение с грубой ошибкой
       RETURN

COD:   C1
       C2
       C3
       C4
       C5
       C6
       C7
       C10
       C11
       C14
C1:    .ASCIZ  /USR?/
C2:    .ASCIZ  /не загружен драйвер/
C3:    .ASCIZ  /ошибка чтения каталога/
C4:    .ASCIZ  /ошибка .FETCH/
C5:    .ASCIZ  /оверлей?/
C6:    .ASCIZ  /каталог переполнен/
C7:    .ASCIZ  /ошибка адресации/
C10:   .ASCIZ  /неверный номер канала/
C11:   .ASCIZ  /неверный код EMT/
C14:   .ASCIZ  /недопустимый каталог/
       .EVEN
AREA:  .BLKW 4
FILE:  .RAD50  /PR /
       .WORD 0,0,0
       .END START

5.3.21. .HRESET

Запрос .HRESET прекращает выполнение операций ввода-вывода для вызывающей программы и выполняет функции запроса .SRESET. В режиме SJ запрос .HRESET используется для прекращения всех операций ввода-вывода для задания, в котором используется .HRESET. Все другие операции ввода-вывода продолжаются.

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

     .HRESET

Пример использования .HRESET см. в описании запроса .CDFN.

5.3.22. .INTEN

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

  1. сообщает монитору о том, что произошло прерывание;
  2. устанавливает приоритет процессора на соответствующий уровень.

Все внешние прерывания вызывают работу процессора по 7-му приоритету. Запрос .INTEN используется для понижения приоритета до уровня, на котором будет работать соответствующее устройство.

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

.INTEN PRIOR[,PIC]

где

PRIOR

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

 

PIC

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

5.3.23. .LOCK, .UNLOCK

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

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

Запросы .LOCK и .UNLOCK дополняют друг друга и, поэтому, должны быть согласованы (т.е., если выполнено три запроса .LOCK, то должно быть выполнено, по крайней мере, три .UNLOCK, в противном случае USR не будет удалена из памяти). Если количество .UNLOCK больше чем .LOCK, то ошибки не происходит.

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

.LOCK

Примечания:

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

Запрос .UNLOCK удаляет USR из памяти, если она была загружена по запросу .LOCK. Если при выполнении .LOCK использовался свопинг, то .UNLOCK загружает программу пользователя обратно в память.

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

.UNLOCK

Примечание. При выполнении двух заданий в режиме FB пары .LOCK/.UNLOCK должны использоваться только по необходимости, т.к. когда задание блокирует USR в памяти, другое задание не может использовать USR до тех пор, пока не будет выполнен .UNLOCK в первом задании.

Пример.

          .TITLE  LOCK.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСОВ .LOCK,.UNLOCK
          .MCALL  .LOCK,.UNLOCK,.LOOKUP,.SETTOP,.PRINT,.EXIT
          SYSPTR=54               ;УКАЗАТЕЛЬ НА НАЧАЛО RMON
  START:  .SETTOP @#SYSPTR        ;ЗАПРОСИТЬ ВСЮ СВОБОДНУЮ
                                  ;ПАМЯТЬ
          .LOCK                   ;ВЫЗОВ USR В ПАМЯТЬ
          .LOOKUP #AREA,#0,#FILE1 ;ОТКРЫТЬ ФАЙЛ НА 0-ОМ КАНАЛЕ
          BCC     
  :     .PRINT  #LMSG
          .EXIT
  :     .PRINT  #F1FND
          MOV     #AREA,R0
          INC     @R0             ;НОМЕР КАНАЛА = 1
          MOV     #FILE2,2(R0)
          .LOOKUP                 ;ОТКРЫТЬ ФАЙЛ НА 1-ОМ КАНАЛЕ
          BCS     
          .PRINT  #F2FND
          .UNLOCK                 ;УДАЛИТЬ USR ИЗ ПАМЯТИ
          .EXIT

  AREA:   .BLKW   3
  FILE1:  .RAD50  /DK /
          .RAD50  /PIP   /
          .RAD50  /SAV/
  FILE2:  .RAD50  /DK /
          .RAD50  /DIR   /
          .RAD50  /SAV/
  LMSG:   .ASCIZ  /ОШИБКА .LOOKUP/
  F1FND:  .ASCIZ  /ФАЙЛ PIP.SAV ОТКРЫТ НА 0-ОМ КАНАЛЕ/
  F2FND:  .ASCIZ  /ФАЙЛ DIR.SAV ОТКРЫТ НА 1-ОМ КАНАЛЕ/
          .EVEN

          .END    START

5.3.24. .MFPS, .MTPS

Запросы .MFPS и .MTPS обеспечивают доступ к ССП. Запрос .MFPS используется для выборки ССП.

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

.MFPS ADDR

где

ADDR

- адрес, по которому записывается содержимое ССП; если адрес не указан, содержимое ССП пересылается для установки ССП.

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

.MTPS ADDR

где

ADDR

- адрес слова, которое будет записано в ССП; если адрес не указан, то значение для ССП берётся из стека.

Пример.

          .TITLE  MFPS.MAC
  ;В ДАННОМ ПРИМЕРЕ, С ИСПОЛЬЗОВАНИЕМ ЗАПРОСОВ .MFPS,.MTPS,
  ;ОСУЩЕСТВЛЯЕТСЯ ОБРАЩЕНИЕ К ПОДПРОГРАММЕ, КОТОРАЯ
  ;ОПРЕДЕЛЯЕТ НАЛИЧИЕ СВОБОДНОГО ЭЛЕМЕНТА ОЧЕРЕДИ.

          .MCALL  .MFPS,.MTPS,.EXIT,.PRINT,.TTINR

          JSW = 44        ;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ
          TTSPC¤ = 10000  ;РАЗРЯД СПЕЦИАЛЬНОГО РЕЖИМА ВЫВОДА

  START:                          ;ГЛАВНАЯ ПРОГРАММА
          BIS     #TTSPC¤,@#JSW   ;УСТАНОВИТЬ 12 РАЗРЯД В JSW
          ;       .
          ;       .
          CALL    GETQUE          ;ВЫЗОВ ПОДПРОГРАММЫ

          BCC     
          .PRINT  #NOELEM
          BIC     #TTSPC¤,@#JSW
          .EXIT

  :     NOP                     ;ПРОДОЛЖЕНИЕ ГЛАВНОЙ
          NOP                     ;ПРОГРАММЫ
          .PRINT  #GOT1
  :     .TTINR
          BCS     
          BR      START

  GETQUE: MOV     #QHEAD,R4
          TST     @R4
          BEQ     11¤
          .MFPS                   ;СОХРАНИТЬ ЗНАЧЕНИЕ В СТЕКЕ
          .MTPS   #340            ;УСТАНОВИТЬ ПРИОРИТЕТ = 7
          MOV     @R4,R5          ;УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ
                                  ;ЭЛЕМЕНТ
          MOV     @R5,@R4
          .MTPS                   ;ВОССТАНОВИТЬ РАЗРЯДЫ
                                  ;ПРИОРИТЕТА
          TST     (PC)+
  11¤:    SEC
          RETURN

  QHEAD:  .WORD   Q1
  Q1:     .WORD   Q2,0,0
  Q2:     .WORD   Q3,0,0
  Q3:     .WORD   0,0,0

  NOELEM: .ASCIZ  /НЕТ В НАЛИЧИИ ЭЛЕМЕНТА ОЧЕРЕДИ/
  GOT1:   .ASCII  /ЕСТЬ СВОБОДНЫЙ ЭЛЕМЕНТ - НАЖМИТЕ ЛЮБУЮ /
          .ASCIZ  /КЛАВИШУ ДЛЯ ПРОДОЛЖЕНИЯ/
          .EVEN

          .END    START

5.3.25. .MRKT

Запрос .MRKT планирует запуск подпрограммы завершения через определённый интервал времени.

Запрос .MRKT используют элементы очереди из списка элементов очереди ввода-вывода. Элемент очереди используется до тех пор, пока не будет введена подпрограмма завершения или не будет выполнен запрос .CMKT.

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

.MRKT AREA,TIME,CRTN,ID

где

AREA

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

 

TIME

- адрес блока из 2-х слов, содержащего величину интервала времени;

 

CRTN

- точка входа подпрограммы завершения;

 

ID

- число, используемое для идентификации запроса с программой завершения и запросами .CMKT; это число не должно быть в пределах от 177400 до 177777; несколько запросов .MRKT могут иметь один и тот же ID; на входе в подпрограмму завершения R0 будет содержать число ID.

Формат блока аргументов:

       AREA:   .BYTE   0,22
               .WORD   TIME
               .WORD   CRTN
               .WORD   ID

Пример.

          .TITLE  TREAD.MAC
  ; пример использования запросов .MRKT,.CMKT
  .MCALL .MRKT,.TTINR,.EXIT,.PRINT,.TTYOUT,.CMKT,.TWAIT
          LF = 12
          JSW = 44
          TCBIT¤ = 100
          TTSPC¤ = 10000
  START:  .QSET   #XQUE,#1            ;ДОБАВИТЬ ЭЛЕМЕНТ ОЧЕРЕДИ
  :     MOV     #PROMT,R0
          MOV     #BUFF,R1
          CALL    TREAD¤              ;ВЫЗОВ ПОДПРОГРАММЫ
          BCS     
          .PRINT  #LINE
          BR      
  :     .PRINT  #TIMOUT
          .EXIT
  TREAD¤: TST     R0
          BEQ     
          .PRINT
  :     CLR     TBYT
          .MRKT   #TAREA,#TIME,#TOUT,#1;ЗАПУСТИТЬ ПОДПРОГРАММУ
                                      ;ЗАВЕРШЕНИЯ ПО ИСТЕЧЕНИИ
                                      ;ВРЕМЕНИ
          BIS     #TCBIT¤,@#JSW
          CLRB    @R1
  TTIN:   .TWAIT  #AREA.TTINR
          BIT     #1,(PC)+
  TBYT:   .WORD   0
          BNE     
          BCS     TTIN
          MOVB    R0,(R1)+
          .CMKT   #TAREA,#0       ;ОТМЕНИТЬ .MRKT
  :     BIS     #TTSPC¤,@#JSW
  :     .TTINR
          MOVB    R0,(R1)+
          BCC     
          CLRB    -(R1)
          BIC     #TCBIT¤!TTSPC¤,@#JSW
          ROR     TBYT
          RETURN
  TOUT:   INC     TBYT
          RETURN
  XQUE:   .BLKW   10.
  AREA:   .WORD   0,WAIT
  TAREA:  .BLKW   4
  TIME:   .WORD   0,500.
  WAIT:   .WORD   0,1
  LINE:   .ASCII  /ОБРАБОТКА ДАННЫХ    /
  BUFF:   .BLKB   81.
  PROMT:  .ASCIZ  /ВВЕДИТЕ ДАННЫЕ :   /<200>
  TIMOUT: .ASCIZ  /ВРЕМЯ НА ВВОД ДАННЫХ ИСТЕКЛО/
          .END START

5.3.26. .MTATCH

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

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

.MTATCH AREA,ADDR,UNIT

где

AREA

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

 

ADDR

- адрес слова асинхронного состояния терминала или 0;

 

UNIT

- логический номер терминала.

Формат блока аргументов:

       AREA:   .BYTE   5,37
               .WORD   ADDR
               .BYTE   UNIT,0

5.3.27. .MTDTCH

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

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

.MTDTCH AREA,UNIT

где

AREA

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

 

UNIT

- логический номер терминала.

Формат блока аргументов:

       AREA:   .BYTE   6,37
               .WORD   <НЕ ИСПОЛЬЗУЕТСЯ>
               .BYTE   UNIT

5.3.28. .MTSET

Запрос .MTSET позволяет установить характеристики терминала. Он также определяет режим ввода-вывода для указанного терминала.

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

.MTSET AREA,ADDR,UNIT

где

AREA

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

 

ADDR

- адрес блока из 4-х слов состояния указанного терминала;

 

UNIT

- логический номер терминала.

Формат блока аргументов:

       AREA:   .BYTE   0,37
               .WORD   ADDR
               .BYTE   UNIT

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

M.TSTS

M.TST2

M.TST3

M.TSTW

M.TWID

Рис.6. Структура блока состояния терминала

Таблица 15

Обозначение

Описание

M.TSTS

Слово конфигурации терминала

M.TSTS2

Резервное

M.TSTS3

Резервное

M.TWID

Длина строки

M.TSTW

Байт состояния терминала

Значения разрядов слова конфигурации терминала (M.TSTS) даны в табл. 16.

Таблица 16

Разряд

Содержание

Значение

0

1

Аппаратная табуляция

1

2

Выполнение возврата каретки и перевода строки, если действительная длина строки больше установленной в M.TWID

2

4

Аппаратный перевод формата

3

10

Выполнение команд СУ/F и СУ/B

4,5

-

Резервные

6

100

Запрещение режима ожидания для терминала (эквивалентен 6-ому разряду в ССЗ); разряд TCBIT

7-11

-

Резервные

12

10000

Режим посимвольного ввода (эквивалентен разряду специального режима в ССЗ); разряд TTSPC

13

-

Резервный

14

40000

Запрещение преобразования кодов символов нижнего регистра в коды символов верхнего регистра

В табл. 17 даны значения разрядов для M.TSTW.

Таблица 17

Разряд

Содержимое

Значение

10

2000

Терминал используется основным и фоновым заданиями

11

4000

Терминал не включён

14

40000

Дважды подана команда СУ/C

15

100000

Системный терминал

5.3.29. .MTGET

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

Таблица 18

Относительный номер байта в блоке

Содержимое

0

Слово конфигурации терминала. Значения разрядов те же, что и в .MTSET

2-4

Резервные

6

Длина строки

7

Текущее положение строки

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

.MTGET AREA,ADDR,UNIT

где

AREA

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

 

ADDR

- адрес блока состояния терминала из 4-х слов;

 

UNIT

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

Формат блока аргументов:

       AREA:   .BYTE   1,37
               .WORD   ADDR
               .BYTE   UNIT

5.3.30. .MTSTAT

Запрос .MTSTAT позволяет получить информацию о состоянии мультитерминальной системы.

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

.MTSTAT AREA,ADDR

где

AREA

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

 

ADDR

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

Формат блока аргументов:

       AREA:   .BYTE   10,37
               .WORD   ADDR
               .WORD   0

5.3.31. .MTRCTD

Запрос .MTRCTD является мультитерминальной формой запроса .RCTRLD. Он отменяет команду СУ/D и разрешает вывод на указанный терминал.

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

.MTRCTD AREA,UNIT

где

AREA

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

 

UNIT

- логический номер терминала.

Формат блока аргументов:

       AREA:   .BYTE   4,37
               .WORD   <НЕ ИСПОЛЬЗУЕТСЯ>
               .BYTE   UNIT

5.3.32. .MWAIT (режим FB, XM)

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

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

     .MWAIT

Пример.

  ;В ПРИВЕДЁННОМ ПРИМЕРЕ ИСПОЛЬЗУЕТСЯ ЗАПРОС .MWAIT.
  ;ПРИМЕР СОСТОИТ ИЗ ДВУХ ПРОГРАММ: ФОНОВОЙ, КОТОРАЯ
  ;ПОСЫЛАЕТ СООБЩЕНИЕ, И ОСНОВНОЙ ПРОГРАММЫ, КОТОРОЕ
  ;ЭТО СООБЩЕНИЕ ПОЛУЧАЕТ.

          .TITLE  MWAITF.MAC

  ;ОСНОВНАЯ ПРОГРАММА ...

          .MCALL  .MWAIT,.RCVD,.PRINT,.EXIT

  START:  .RCVD   #AREA,#MBUFF,#40. ;ПОЛУЧИТЬ СООБЩЕНИЕ
          ;       .
          ;       .
          ;       .
          .PRINT  #FGJOB
          ;       .
          ;       .
          ;       .
          .MWAIT          ;ОЖИДАТЬ ПРИЁМА
          TST     MBUFF+2 ;СООБЩЕНИЯ НЕТ?
          BEQ     FEXIT   ;ЕСЛИ НЕТ - ВЫХОД
                          ;ИЗ ПРОГРАММЫ
          .PRINT  #FMSG
          .PRINT  #MBUFF+2;ПЕЧАТЬ ПОЛУЧЕННОГО
                          ;СООБЩЕНИЯ
          BR      START

  FEXIT:  .EXIT
  AREA:   .BLKW   5
  MBUFF:  .BLKW   41.
          .WORD   0
  FGJOB:  .ASCIZ  /ОСНОВНАЯ ПРОГРАММА ГОТОВА К ПРИЁМУ СООБЩЕНИЙ/
  FMSG:   .ASCIZ  /ПЕРЕДАНО СООБЩЕНИЕ:/
          .EVEN

          .END START

  ;ФОНОВАЯ ПРОГРАММА ...

          .TITLE  MWAITB.MAC

          .MCALL  .MWAIT,.SDAT,.GTLIN,.PRINT,.EXIT

  START:  CLR     BUFF
          .GTLIN  #BUFF,#PROMPT   ;ВВЕСТИ СООБЩЕНИЕ
          .SDAT   #AREA,#BUFF,#40.;ПЕРЕДАТЬ СООБЩЕНИЕ
          BCS     
          .MWAIT
          TST     BUFF
          BNE     START
          .EXIT
  :     .PRINT  #NOFG
          .EXIT

  AREA:   .BLKW   5
  BUFF:   .BLKW   40.
  PROMPT: .ASCII  /ВВЕДИТЕ СООБЩЕНИЕ ДЛЯ ОСНОВНОЙ ПРОГРАММЫ/
          .BYTE   15,12,200
  NOFG:   .ASCIZ  /ОСНОВНОЙ ПРОГРАММЫ НЕТ/
          .EVEN

          .END    START

5.3.33. .PEEK, .POKE

Запрос .PEEK передаёт в регистр R0 содержимое указанной ячейки памяти (ниже 28К слов) или содержимое ячейки страницы ввода-вывода.

Запрос .POKE изменяет содержимое ячейки памяти. При этом старое содержимое записывается в регистр R0.

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

.PEEK AREA,ADDR

где

AREA

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

 

ADDR

- адрес ячейки памяти.

Формат блока аргументов:

       AREA:   .BYTE   1,34
               .WORD   ADDR

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

.POKE AREA,ADDR,VALUE

где

AREA

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

 

ADDR

- адрес ячейки памяти.

 

VALUE

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

Формат блока аргументов:

       AREA:   .BYTE   3,34
               .WORD   ADDR
               .WORD   VALUE

Пример.

  ;В ДАННОМ ПРИМЕРЕ ЗАПРОСЫ .PEEK,.POKE ИСПОЛЬЗУЮТСЯ
  ;ДЛЯ ЧТЕНИЯ И УСТАНОВКИ РАЗМЕРА ФАЙЛА, ОТКРЫТОГО
  ;РАНЕЕ ПО ЗАПРОСУ .ENTER.

          .MCALL  .PEEK,.POKE,.EXIT

          RMON   = 54
          MAXBLK = 314

  START:  .PEEK   #EMTBLK,#RMON   ;УСТАНОВИТЬ АДРЕС НАЧАЛА
                                  ;RMON
          ADD     #MAXBLK,R0      ;ПОЛУЧИТЬ РАЗМЕР ФАЙЛА
          MOV     R0,R1
          .POKE   #EMTBLK,R1,#NEWSIZ ;УСТАНОВИТЬ НОВЫЙ
                                  ;РАЗМЕР ФАЙЛА
          MOV     R0,OLDSIZ
          .EXIT

  EMTBLK: .BLKW   3
  NEWSIZ: .WORD   100.
  OLDSIZ: .WORD   0               ;СТАРЫЙ РАЗМЕР ФАЙЛА

          .END    START

5.3.34. .PROTECT, .UNPROTECT (режим FB, XM)

Запрос .PROTECT используется для получения исключительного права пользования вектором прерывания в диапазоне 0-476 и устанавливает защиту вектора.

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

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

.PROTECT AREA,ADDR

где

AREA

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

 

ADDR

- адрес вектора, который будет использоваться данным заданием; ADDR должен быть кратен четырем и меньше 476.

Формат блока аргументов:

       AREA:   .BYTE   0,31
               .WORD   ADDR

Запрос .UNPROTECT отменяет результат действия запроса .PROTECT.

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

.UNPROTECT AREA,ADDR

где

AREA

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

 

ADDR

- адрес вектора, который освобождается от защиты.

Формат блока аргументов:

       AREA:   .BYTE   1,31
               .WORD   ADDR

Пример.

          .TITLE  PROTECT.MAC
  ;В ДАННОМ ПРИМЕРЕ ПОКАЗАНО, КАК УСТАНОВИТЬ ЗАЩИТУ ВЕКТОРА
  ;УСТРОЙСТВА, А ЗАТЕМ ОТМЕНИТЬ ЗАЩИТУ ВЕКТОРА.

          .MCALL  .PROTECT,.UNPROTECT,.PRINT,.EXIT

  START:  .PROTECT   #AREA,#300
          BCS        
          .UNPROTECT #AREA,#300
          .EXIT
  :     .PRINT     #NOVEC
          .EXIT
  AREA:   .BLKW      3
  NOVEC:  .ASCIZ     /ВЕКТОР УЖЕ ЗАЩИЩЁН !/
          .END       START

5.3.35. .QSET

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

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

Запросы .MRKT, .TWAIT и .SDAT также используют элементы очереди и должны приниматься во внимание при определении количества элементов очереди для программы. Каждый раз, когда выполняется .QSET, непрерывная область памяти, которая отводится под элементы очереди, делится на сегменты, содержащие по 7 слов (по 10 слов для монитора XM) и связывается с уже существующей очередью ввода-вывода для этого задания.

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

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

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

.TWAIT

.READW

.WRITE

.SDAT

.SDATW

.MRKT

.RCVD

.WRITC

.READC

.SDATC

.READ

.RCVDC

.WRITW

.RCVDW

 

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

.QSET ADDR,LEN

где

ADDR

- адрес начала области для новых элементов очереди ввода-вывода;

 

LEN

- число новых элементов очереди ввода-вывода.

Пример использования .QSET см. в описании запроса .TWAIT.

5.3.36. .RCTRLD

Запрос .RCTRLD обеспечивает готовность системного терминала к печати. Команда СУ/D запрещает вывод на терминал до тех пор, пока не будет повторно подана команда СУ/D или в программе не будет выполнен запрос .RCTRLD. Т.е. программа, в которой предусмотрена печать сообщений на терминале, должна предусматривать возможность подачи пользователем команды СУ/D.

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

     .RCTRLD

Пример.

          .TITLE  RCTRLD.MAC
          .MCALL  .RCTRLD,.CSIGEN,.EXIT
  START:  .RCTRLD
          .CSIGEN #DSPACE,#DEXT,#0

  ;               .
  ;               .
  ;               .
          JMP     START

  DEXT:   .WORD   0,0,0,0
  DSPACE  = .

          .END    START

5.3.37. .SPND, .RSUM (режим FB, XM)

Запрос .SPND временно приостанавливает выполнение программы пользователя и допускает работу только подпрограмм завершения (для операций ввода-вывода и запросов .MRKT).

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

     .SPND

Запрос .RSUM из подпрограммы завершения вновь передаёт управление программе пользователя.

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

     .RSUM

Примечания:

  1. Монитор содержит так называемый счётчик приостановки для каждого задания. Этот счётчик уменьшается по .SPND и наращивается по .RSUM. Задание будет фактически приостановленным, если счётчик будет содержать отрицательное значение. Поэтому, если .RSUM будет выполняться перед .SPND, последний запрос будет игнорироваться.
  2. Программа должна использовать равное количество .SPND и .RSUM.
  3. Запрос .SPND из подпрограммы завершения уменьшает счётчик приостановки, но не приостанавливает выполнение программы. Если в подпрограмме завершения выполняется .SPND, выполнение программы продолжается до тех пор, пока она также не выполнит .SPND, после чего выполнение программы будет приостановлено и для возобновления её работы потребуется уже два запроса .RSUM.
  4. .SPND и .RSUM подобно другим запросам, могут быть выполнены в подпрограммах обработки прерываний, которые написаны пользователем, если ранее были выполнены .INTEN и .SYNCH. Все замечания, относящиеся к .SPND и .RSUM из подпрограмм завершения, имеют силу и для этого случая.

5.3.38. .SCCA

Запрос .SCCA выполняет следующие функции:

По запросу .SCCA команда СУ/C воспринимается программой как обычная управляющая команда без специальных функций.

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

.SCCA AREA,ADDR

где

AREA

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

 

ADDR

- адрес слова состояния терминала.

Слово состояния терминала предназначено для фиксирования подачи двух команд СУ/C. Если в нем установлен 15-й разряд, то это значит, что с терминала были последовательно поданы две команды СУ/C. Этот разряд должен очищаться программой пользователя.

Если аргумент ADDR равен нулю в запросе .SCCA, монитор восстанавливает системные функции команды СУ/C.

Формат блока аргументов:

       AREA:   .BYTE   0,35
               .WORD   ADDR

Пример.

          .TITLE  SCCA.MAC
          .MCALL  .SCCA,.TTYIN,.TTYOUT,.PRINT
          JSW    = 44
          TTSPC¤ = 10000
  START:  MOV     #SCCA,R1
          .SCCA   #AREA,R1
          BIS     #TTSPC¤,@#JSW
          CLR     (R1)
          .PRINT  #MSG1
  :     TST     (R1)
          BNE     
          .TTYIN
          .TTYOUT
          BR      
  :     .PRINT  #MSG2
          .SCCA   #AREA,#0
          BR      .
  SCCA:   .BLKW   1
  AREA:   .BLKW   2
  MSG1:   .ASCII  /ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСА .SCCA/<15><12>
          .ASCIZ  \ВВЕДИТЕ ДВОЙНОЕ СУ/C\
  MSG2:   .ASCII  \СУ/C ВВЕДЕНА \/<15><12>
          .ASCIZ  \ДЛЯ ВЫХОДА ИЗ ПРОГРАММЫ ВВЕДИТЕ ДВОЙНОЕ СУ/C\
          .EVEN
          .END    START

5.3.39. Запрос .SDTTM

Запрос .SDTTM позволяет программе пользователя устанавливать системную дату и время.

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

.SDTTM AREA,ADDR

где

AREA

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

 

ADDR

- адрес блока из 3-х слов, содержащего новую дату и время.

Формат блока аргументов:

       AREA:   .BYTE   0,40
               .WORD   ADDR

Первое слово трёхсловного блока содержит новую дату во внутреннем формате (см. запрос .DATE). Если первое слово содержит -1, то монитор игнорирует его. Второе и третье слова содержат новое значение времени (старшего и младшего порядка соответственно). Если второе слово содержит отрицательную величину, то монитор не изменяет значение времени.

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

Пример.

          .TITLE  SDTTM.MAC
  ;В ЭТОМ ПРИМЕРЕ ПРИВЕДЕНА ПОДПРОГРАММА КОРРЕКЦИИ
  ;ВРЕМЕНИ (НА 1 ЧАС) С УЧЁТОМ ДЕКРЕТНОГО ВРЕМЕНИ.

          .MCALL  .SDTTM,.PRINT,.GTIM,.EXIT
          .GLOBL  STD,DALITE

  STD:    COM     HR
          NEG     HR+2

  DALITE:: .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

5.3.40. .SETTOP

Запрос .SETTOP позволяет программе пользователя установить новый адрес в качестве верхней границы программы. Монитор определяет, является ли этот адрес допустимым и нужен ли свопинг USR. Например, если запрос определяет адрес ниже начального адреса USR, то свопинг USR не требуется. Если .SETTOP из фонового задания определяет адрес выше начального адреса USR и ранее не была выполнена команда SET USR NOSWAP, то необходим свопинг USR.

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

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

.SETTOP ADDR

где

ADDR

- запрашиваемый адрес верхней границы программы.

Пример использования .SETTOP см. в описании запроса .LOCK.

5.3.41. .SPCPS (режим FB, XM)

Запрос .SPCPS используется в подпрограммах завершения для сохранения содержимого регистров PC и PS и замену содержимого PC на новое значение.

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

.SPCPS AREA,ADDR

где

AREA

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

 

ADDR

- адрес блока из 3-х слов, содержащего новое значение PC, старое значение PC и старое значение PS соответственно в 1-ом, 2-ом и 3-ем словах.

Монитор сохраняет старые значения PS и PC и передаёт управление по адресу, который является содержимым 1-го слова.

Формат блока аргументов:

       AREA:   .BYTE   0,41
               .WORD   ADDR

Пример.

          .TITLE  SPCPS.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСА .SPCPS.

          .MCALL  .READC,.WRITC,.CSIGEN,.PRINT,.SPCPS
          .MCALL  .CLOSE,.WAIT,.SRESET,.EXIT

          ERRBYT  = 52
          .ENABL  LSB

  START:  .CSIGEN #DSPACE,#DEFEXT ;ВВОД КОМАНДНОЙ СТРОКИ
          CALL    IOXFER
          .PRINT  #MES
  :     DEC     R5
          BR      
  FINI:   .CLOSE  #0              ;>0- КОНЕЦ ФАЙЛА
          MOV     #DONE,R0
          BR      EXIT
  WERR:   MOV     #WRERR,R0
          BR      EXIT
  RERR:   MOV     #RDERR,R0
  EXIT:   .PRINT
          .SRESET                 ;УДАЛИТЬ ЗАГРУЖЕННЫЕ
                                  ;ДРАЙВЕРЫ
          .EXIT

  WRDONE: .WAIT   #0
          BCS     
  IOXFER: .READC  #AREA,#3,,,#  ;ЧИТАТЬ БЛОК
          BCC     
          TSTB    @#ERRBYT        ;КОНЕЦ ФАЙЛА?
          BEQ                   ;ДА
  :     MOV     #RERR,SBLOK
          BR      
  :     MOV     #WERR,SBLOK
  :     TSTB    SPCALL
          BNE     
          .SPCPS  #AREA,#SBLOK
          INCB    SPCALL
          BCS     
  :     RETURN
  :     .WAIT   #3
          BCS     
          .WRITC  #AREA,#0,,,#WRDONE;ЗАПИСАТЬ БЛОК
          BCS     
          INC     BLOK
          RETURN
  :     .PRINT  #SPERR
          RETURN

  AREA:   .WORD   0       ;БЛОК АРГУМЕНТОВ EMT
  BLOK:   .WORD   0       ;НОМЕР БЛОКА
          .WORD   BUFF    ;АДРЕС БУФЕРА
          .WORD   256.    ;СЧЕТЧИК СЛОВ
          .WORD   0       ;АДРЕС ПОДПРОГРАММЫ ЗАВЕРШЕНИЯ
  SBLOK:  .WORD   FINI,0,0

  BUFF:   .BLKW   256.
  DEFEXT: .WORD   0,0,0,0
  SPCALL: .BYTE   0
          .NLIST  BEX
  DONE:   .ASCIZ  /КОНЕЦ ПРОГРАММЫ/
  MES:    .ASCIZ  /ВЫПОЛНЕНИЕ ПРОГРАММЫ ПРОДОЛЖАЕТСЯ/
  WRERR:  .ASCIZ  /ОШИБКА .WRITC/
  RDERR:  .ASCIZ  /ОШИБКА .READC/
  SPERR:  .ASCIZ  /ОШИБКА .SPCPS/
          .EVEN
  DSPACE  =.

          .END    START

5.3.42. .SFDAT

Запрос .SFDAT позволяет программе пользователя установить или изменить дату создания указанного файла (как защищённого так и не защищённого).

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

.SFDAT AREA,CHAN,DBLK,DATE

где

AREA

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

 

CHAN

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

 

DBLK

- адрес блока из 4-х слов, содержащего спецификацию файла;

 

DATE

- адрес ячейки, содержащей новое значение даты (в формате ФОДОС-2); если аргумент равен нулю, то используется системная дата.

Формат блока аргументов:

       AREA:   .BYTE   CHAN,42
               .WORD   DBLK
               .WORD   DATE

Пример использования .SFDAT см. в описании запроса .FPROT.

5.3.43. .SFPA

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

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

.SFPA AREA,ADDR

где

AREA

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

 

ADDR

- адрес подпрограммы обработки прерывания от ППЗ.

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

При использовании ППЗ, монитор выполняет команду STST -(SP). Поэтому, перед командой RTI, подпрограмма пользователя должна увеличить указатель стека на два.

Формат блока аргументов:

       AREA:   .BYTE   0,30
               .WORD   ADDR

5.3.44. .SRESET

Запрос .SRESET выполняет следующие функции:

  1. удаляет из памяти драйверы устройств, которые были загружены по запросу .FETCH; драйверы, которые были загружены по команде LOAD, остаются резидентными, так же как и драйвер системного устройства;
  2. стирает открытые в настоящее время файлы (файлы, открытые по .ENTER, никогда не станут постоянными);
  3. восстанавливает число каналов ввода-вывода (16(10)); каналы, определённые по .CDFN, аннулируются;
  4. восстанавливает очередь ввода-вывода (первоначально - один элемент); QSET должен выполняться повторно для определения дополнительных элементов очереди;
  5. очищает очередь подпрограмм завершения.

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

     .SRESET

Пример использования .SRESET см. в описании запроса .READ.

5.3.45. .SYNCH

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

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

.SYNCH AREA[,PIC]

где

AREA

- адрес блока из 7-ми слов; этот блок необходим при использовании .SYNCH; содержимое блока формируется пользователем (см. табл. 19);

 

PIC

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

Таблица 19

Слово

Содержимое

1

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

2

Номер текущего задания (0 или 2); может быть получен с помощью запроса .GTJB

3,4

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

5

Аргумент R0; при успешном выполнении .SYNCH регистр R0 будет содержать этот аргумент

6

-1

7

0

Примечание. Между выполнением запросов .INTEN и .SYNCH нельзя выполнять операции со стеком.

5.3.46. .TLOCK

Запрос .TLOCK может использоваться программами, которые выполняются в режиме FB, для того чтобы сделать USR резидентной, если только USR не занята обслуживанием другого задания. Если USR используется другим заданием, то при выполнении .TLOCK будет установлен C-разряд, что указывает на то, что запрос не выполнен.

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

     .TLOCK

Пример.

          .TITLE  TLOCK.MAC
  ;ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАПРОСА .TLOCK.
          .MCALL  .TLOCK,.UNLOCK,.LOOKUP,.PRINT,.EXIT
  START:  .TLOCK                  ;USR ЗАНЯТА?
          BCS     SUSPND          ;ДА
          .LOOKUP #AREA,#4,#FILE  ;ОТКРЫТЬ ФАЙЛ
          BCS     LKERR

          .PRINT  #J1MSG
          .UNLOCK                 ;ОСВОБОДИТЬ USR
          TSTB    J2SW
          BNE     
          CALL    JOB2
  :     .EXIT

  SUSPND: TSTB    J2SW
          BNE     START
          JSR     PC,JOB2
          INC     J2SW
          BR      START

  AREA:   .BLKW   5
  FILE:   .RAD50  /DK /
          .RAD50  /FILE  /
          .RAD50  /TMP/
  LKERR:  .PRINT  #LKMSG
          .EXIT
  LKMSG:  .ASCIZ  /ФАЙЛ НЕ НАЙДЕН/
  J1MSG:  .ASCIZ  /ВЫПОЛНЯЕТСЯ ЗАДАНИЕ 1/
  J2MSG:  .ASCIZ  /ВЫПОЛНЯЕТСЯ ЗАДАНИЕ 2/
  J2SW:   .BYTE   0
          .EVEN
  JOB2:   .PRINT  #J2MSG
          RTS     PC

          .END    START

5.3.47. .TRPSET

Запрос .TRPSET позволяет установить адрес подпрограммы обработки прерывания по 4-му и 10-му векторам. Значение C-разряда на входе в подпрограмму указывает на то, какое прерывание произошло: очищенный C-разряд - прерывание по 4 вектору; установленный C-разряд - по 10 вектору. Выход из подпрограммы обработки прерывания пользователя осуществляется по команде RTI.

Если при выполнении стека произошло прерывание по 4-му вектору, то оно не обрабатывается по .TRPSET и на терминале печатается сообщение ?MON-F-STACK OVERFLOW монитором SJ или ?MON-F-TRAP TO 4 монитором FB и XM.

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

.TRPSET AREA,ADDR

где

AREA

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

 

ADDR

- адрес подпрограммы обработки прерывания; если ADDR=0, то предыдущий .TRPSET отменяется.

Формат блока аргументов:

       AREA:   .BYTE   0,3
               .WORD   ADDR

Пример.

          .TITLE  TRPSET.MAC
          .MCALL  .TRPSET,.PRINT,.EXIT
          DIVZ    = 67
  START:  .TRPSET #AREA,#TRPLOC ;ЗАПРЕТИТЬ УДАЛЕНИЕ
                                ;ПРОГРАММЫ
          DIVZ                  ;НЕДОПУСТИМАЯ КОМАНДА
          TST     @#166666      ;НЕСУЩЕСТВУЮЩИЙ АДРЕС
          .EXIT

  TRPLOC:                       ;ПОДПРОГРАММА ОБРАБОТКИ
                                ;ПРЕРЫВАНИЙ
          BCS     
          .PRINT  #TRP4
          BR      
  :     .PRINT  #TRP10
          .TRPSET #AREA,#TRPLOC
  :     RTI

  AREA:   .WORD   0,0
  TRP4:   .ASCIZ  /ПРЕРЫВАНИЕ ПО 4 ВЕКТОРУ/
  TRP10:  .ASCIZ  /ПРЕРЫВАНИЕ ПО 10 ВЕКТОРУ/
          .EVEN

          .END    START

5.3.48. .TWAIT

Запрос .TWAIT приостанавливает выполнение программы пользователя на указанный интервал времени. Запрос .TWAIT требует для своего выполнения элемент очереди.

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

.TWAIT AREA,TIME

где

AREA

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

 

TIME

- Адрес блока из 2-х слов, которые содержат величину интервала времени (первое слово - нижнюю границу интервала, второе слово - верхнюю границу интервала).

Формат блока аргументов:

       AREA:   .BYTE   0,24
               .WORD   TIME

Пример.

          .TITLE  TWAIT.MAC

          .MCALL  .TWAIT,.QSET,.PRINT,.EXIT

  START:  CALL    TASK
  :     .TWAIT  #AREA,#TIME
          BCS     NOQ
          CALL    TASK
          DEC     COUNT
          BNE     
          .PRINT  #EXIT
          .EXIT

  TASK:
          INC     TCNT
          BIT     #1,TCNT
          BEQ     
          .PRINT  #TIK
          RETURN
  :     .PRINT  #TAK
          RETURN

  NOQ:    .PRINT  #QERR
          .EXIT
  AREA:   .WORD   0,0
  TIME:   .WORD   0,50.*2
  COUNT:  .WORD   7
  TCNT:   .WORD   0
  TIK:    .ASCII  /ТИК - /<200>
  TAK:    .ASCIZ  /ТАК/
  EXIT:   .ASCIZ  /КОНЕЦ ПРОГРАММЫ/
  QERR:   .ASCIZ  /НЕТ ЭЛЕМЕНТА ОЧЕРЕДИ/
          .EVEN

          .END    START

5.3.49. .WAIT

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

В режиме FB (XM) запрос .WAIT, если операция ввода-вывода не завершена вызывает задержку выполнения одного из заданий и выполнение другого, если оно существует.

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

     .WAIT CHAN

Пример использования .WAIT см. в описании запроса .READ.

6. СООБЩЕНИЯ

Информация о сообщениях дана в [3].

ПРИЛОЖЕНИЕ 1

КОДЫ ОШИБОК .MCALL ЗАПРОСОВ

В таблице приведены коды ошибок .MCALL запросов и причины, вызывающие эти ошибки.

Таблица

Запрос

Код ошибки

Причина ошибки

.CDFN

0

Попытка определить меньшее число каналов, чем есть в наличии

.CHCOPY

0

Другое задание не существует или канал (OCHAN) не открыт

1

Канал (CHAN) занят

.CLOSE

3

Защищённый файл с тем же именем уже существует

.CMKT

0

Запрос с указанным ID (ID=0) не существует

.CNTXSW

0

В списке адресов указан недопустимый адрес

.CSIGEN

0

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

1

Указанного устройства нет в таблицах системы

2

Попытка открыть защищённый файл, имеющий то же имя

3

Попытка открыть файл по .ENTER неудачна из-за переполнения справочника устройства

4

Входной файл не найден при выполнении .LOOKUP

.CSISPC

0

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

1

Недопустимое устройство

.CSTAT

0

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

.DELETE

0

Указанный канал занят

1

Файл не найден в справочнике устройства

2

Недопустимая операция

3

Защищённый файл

.DSTATUS

0

Устройство не найдено в таблицах системы

.ENTER

0

Указанный канал занят

1

На устройстве не найдена область большая или равная М (LEN=М); или устройство или справочник устройства переполнен

3

Защищённый файл с тем же именем уже существует

.FETCH

0

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

.RELEAS

0

Недопустимое имя устройства

.FPROT

0

Указанный канал занят

1

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

2

Недопустимая операция

3

Недопустимое значение аргумента "PROT"

.GTJB

0

Нет задания

.GVAL
.PVAL

0

Указанное значение смещения находится вне области RMON

.LOOKUP

0

Указанный канал занят. Нет задания

.MRKT

0

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

.MTATCH

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

4

Терминал логически связан с другим заданием

5

Недействительный адрес слова асинхронного состояния терминала (в режиме XM)

.MTDTCH

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

.MTGET

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

4

Терминал связан с другим заданием

5

Недействительный адрес буфера асинхронного состояния терминала

.MTIN

0

Нет символов в буфере ввода

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

5

Недействительный адрес буфера (в режиме XM)

.MTOUT

0

Нет свободного места в буфере вывода

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

5

Недействительный адрес буфера

.MTPRNT

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

5

Недействительный адрес буфера строки

.MTRCTD

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

.MTSET

1

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

2

Несуществующий ЛНТ

3

Недопустимый функциональный код

5

Недействительный адрес буфера

.MTSTAT

3

Недопустимый функциональный код

5

Недействительный адрес буфера

.PROTECT

0

Указанный вектор уже используется

1

Адрес вектора больше 474 или не кратен четырем

.UNPROTECT

1

Адрес вектора больше 474 или не кратен четырем

.RCVD
.RCVDC
.RCVDW

0

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

.READ
.READC
.READW

0

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

1

Аппаратная ошибка на канале

2

Указанный канал не открыт

.RENAME

0

Указанный канал занят

1

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

2

Недопустимая операция

3

Попытка переименования защищённого файла

.REOPEN

0

Указанный канал занят

.SAVESTATUS

0

Указанный канал не открыт

1

Файл открыт по .ENTER или находится на магнитной ленте, поэтому .SAVESTATUS для него недопустим

.SDAT
.SDATC
.SDATW

0

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

.SFDAT

0

Канал занят, файл не найден, устройство нефайловой структуры

.SPCPS

0

Попытка использовать .SPCPS в главной программе (а не в подпрограмме завершения)

1

Предыдущий .SPCPS не выполнен

.SPFUN

0

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

1

Аппаратная ошибка на канале

2

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

.TLOCK

0

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

.TTYIN
.TTINR

0

Нет символа в буфере ввода

.TTYOUT
.TTOUTR

0

Буфер вывода переполнен

.TWAIT

0

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

.WAIT

0

Указанный канал не открыт

1

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

.WRITE

0

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

.WRITC

1

Аппаратная ошибка на канале

2

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

Примечания:

  1. Для запроса .SYNCH возврат по ошибке происходит в следующих случаях:
    • не закончена макрокоманда .SYNCH, использующая тот же блок аргументов EMT;
    • указан недопустимый номер задания;
    • если произошло удаление или останов программы.

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

  2. При выполнении запросов, не указанных в таблице, ошибок не происходит.

ПРИЛОЖЕНИЕ 2

Структура блока CBLK

Таблица

Слово

Разряд

Значение

Описание

1

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

0

1

Аппаратная ошибка на канале

1-5

N

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

6

1

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

7

1

На канале выполнен .ENTER; справочник устройства должен модифицироваться по запросу .CLOSE

8-12

 

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

 

13

1

Обнаружена метка конца файла (EOF)

 

14

-

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

 

15

1

Канал занят

2

   

Файла на томе; значение слова равно нулю, если устройство последовательного доступа

3

   

Длина файла в блоках

4

   

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

5

   

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

ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ

  1. ОПЕРАЦИОННАЯ СИСТЕМА ФОДОС-2
    ПРОГРАММИРОВАНИЕ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ
    РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА
    589.7547471.00042-01 32 03
  2. ОПЕРАЦИОННАЯ СИСТЕМА ФОДОС-2
    МОНИТОР РАСШИРЕННОЙ ПАМЯТИ
    РУКОВОДСТВО ПРОГРАММИСТА
    589.7547471.00042-01 33 04
  3. ОПЕРАЦИОННАЯ СИСТЕМА ФОДОС-2
    СООБЩЕНИЯ СИСТЕМЫ
    589.7547471.00042-01 90 03
  4. ОПЕРАЦИОННАЯ СИСТЕМА ФОДОС-2
    ОПИСАНИЕ ПРИМЕНЕНИЯ
    589.7547471.00042-01 31 01