Макрокоманды Ввода-Вывода системы DOS

При выполнении операций ввода-вывода можно говорить о взаимодействии следующих трех объектов:

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

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

3. Обрабатываемых данных.

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

Работа в системе DOS требует включения в программу макрокоманд, которые можно разбить на три группы. К первой группе относятся макрокоманды описания файлов, имеющие вид DTFxx. DTF означает Define The File — Определить файл. Сочетание хх заменяется двумя буквами, задающими тип определяемого набора. Результатом выполнения макрокоманд типа DTF является таблица параметров, которые затем будут использованы операционной системой в процессе обработки соответствующего файла. Макро OPEN и CLOSE служат соответственно для выполнения действий, связанных с началом и завершением обработки данного файла. По команде OPEN определенная при выполнении DTF информация передается операционной системе и производится подготовка периферийного устройства к операциям ввода-вывода. Появление макро CLOSE свидетельствует о том, что данный файл больше не потребуется программе. Заказы на выполнение непосредственной обработки формируются с помощью макрокоманд GET (при вводе) или PUT (при выводе), READ (при вводе) или WRITE (при выводе). Выбор определенной пары макро зависит от организации набора данных и способа его обработки.

Теперь перейдем к рассмотрению последовательного метода доступа системы DOS (SAM). Использование других методов доступа отличается лишь незначительными деталями. Изучив предлагаемый материал, вы легко сможете воспользоваться руководствами при необходимости работы с другими методами.

Макро типа DTF

Результатом трансляции макро DTF являются таблицы параметров. При открытии файла с помощью макрокоманды OPEN система пользуется заданными параметрами для определения способа организации набора, формата записей и методов буферизации. В общем виде макрокоманды типа DTF имеют следующий формат:

имяфайла DTFxx операнды

Каждому файлу, использующемуся данной программой, должна соответствовать в ней своя макрокоманда DTF. Именем файла может являться любое допустимое в языке ассемблера имя. В запросе на выполнение операций ввода-вывода для идентификации файла указывается его имя. В поле операндов макро задаются параметры обработки. Буквы, замещающие сочетание хх, позволяют определить организацию файла и тип периферийного устройства, которое будет использовано для работы с файлом. В табл. 17.2 перечислены имена наиболее часто использующихся макро типа DTF и даны краткие пояснения относительно применения каждого из них.

Таблица 17.2 Макро типа DTF

Мнемоника

Содержание

DTFCD

Файлы на перфокартах для ввода

DTFPR

Файлы для вывода на печать

DTFMT

Файлы на магнитной ленте

DTFSD

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

доступа

DTFDA

Файлы с прямой организацией

DTFIS

Файлы с индексно-последовательной организацией

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

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

ST А,В

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

ключевое слово = значение

Здесь «ключевое слово» означает параметр макро, а «значение» — присваиваемое ему значение. Например, использование

IOAREAl= INPTA

в качестве операнда означает, что ключевому слову IOAREA1 макро DTF присвоено значение INPTA.

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

CARDFILEDTFCDDEVADDR= SYSIPT, IOAREAl= INPTA

и

CARDFILE DTFCD IOAREA1 = INPTA,DEVADDR=SYSIPT

эквивалентны. Как и в любых командах языка ассемблера, поле операндов макро не может содержать пробелов; ключевые параметры разделяются с помощью запятых.

Мы говорили, что макро DTF передают операционной системе информацию относительно операций ввода-вывода, запрашиваемых программой. Для ссылки на некоторое конкретное устройство используется обязательный параметр DEVADDR:

DEVADDR=SYSxxx

В системе DOS к периферийным устройствам можно обращаться с помощью символических имен, записываемых в виде SYSxxx. Связать некоторое конкретное устройство с символическим именем можно, указывая соответствующую пару в предложении ASSGN языка JCL. Значением параметра DEVADDR является символическое имя устройства, которое предполагается использовать для работы с файлом, описанным с помощью того же макро DTF. Например, если мы хотим производить в программе обработку файла перфокарт, причем для его ввода мы предполагаем использовать устройство чтения с перфокарт (системное имя SYSIPT), то мы должны написать

DEVADDR=SYSIPT

Аналогично, если исходный файл размещен на диске, имеющем имя SYSDSK, то параметр DEVADDR записывается в виде

DEVADDR=SYSDSK

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

IOAREAl=адрес

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

Итак, макрокоманда DTF для файла перфокарт может выглядеть, например, так:

CARDFILE DTFCD DEVADDR=SYSIPT, IOAREAl=CARDBUF

где область CARDBUF в свою очередь может быть описана следующим образом:

CARDBUFDS 20F

Аналогично, если речь идет о файле на магнитной ленте с размером блока, равным 400 байтам, то можно написать

TAPEINPT DTFMT DEVADDR=SYSTPE, IOAREAl = INPLACE

где область INPLACE определена как

INPLACE DS CL400

Мы уже говорили о том, что обычно процесс ввода-вывода можно организовать гораздо более эффективно, используя несколько буферов. Система DOS позволяет использовать два буфера. Определение второго из них осуществляется с помощью параметра IOAREA2. Макрокоманда DTF с параметрами вида

I0AREA1 = BUFFER1,I0AREA2=BUFFER2,...

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

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

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

GET CARDFILE,RECIN

ЗдесьCARDFILE— имяфайлаперфокарт. Если мы хотим таким образом задавать адреса вводимых записей, то об этом нужно сообщить системе с помощью параметра

WORKA=YES

макрокоманды DTF. Итак, в нашем случае DTF может иметь следующий вид:

CARDFILE DTFCD DEVADDR =SYSIPT, IOAREAl = BUFFER1,

IOAREA2=BUFFER2,WORKA=YES

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

IOREG=n

где п — номер одного из общих регистров. МакроDTF

CARDFILE DTFCD DEVADDR =SYSIPT,IOAREA1 =BUFFERI, IOAREA2=BUFFER2,IOREG=5

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

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

Каждое из трех приведенных выше предложений с именем CARDFILE корректно определяет файл перфокарт, однако последние два обеспечивают большую эффективность обработки. Еще одним полезным параметром, служащим для задания информации о вводимых наборах данных, является параметр EOFADDR. Например, если в макрокоманду DTF будет включен параметр

EOFADDR = NOMORE

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

Макро DTFCD используется в случае, когда записи являются несблокированными, а длина блоков постоянна и равна 80 байтам. В случаях работы с записями другого формата и блоками другой длины используются другие формы макро DTF. При обработке файлов, расположенных на магнитной ленте, применяется макро DTFMT. В этой макрокоманде должна задаваться информация о формате записей в файле, поскольку данные на магнитной ленте могут записываться в различных форматах. Информация эта задается с помощью параметров RECFORM, BLKSIZE и RECSIZE. В табл. 17.3 приведены различные возможные значения параметра RECFORM и их смысл, а также содержится информация о других параметрах, задание которых в этом случае необходимо.

Таблица 17.3 Операнд RECFORM

Значение

Смысл

Другие необходимые операнды

RECFORM=FIXUNB

Несблокированныезаписи фиксированной длины

BLKSIZE

FIXBLK

Сблокированные записи фиксированной длины

BLKSIZE, RECSIZE

VARUNB

Несблокированныезаписи переменной длины

BLKSIZE = макс. длина блока

VARBLK

Сблокированные записи переменной длины

BLKSIZE = макс. длина блока

RECSIZE = макс. длина записи

Значениями параметров BLKSIZE и RECSIZE являются просто соответствующие длины в байтах. Например,

BLKSIZE=5000

означает, что длина блоков равна 5000 байтов, а

RECSIZE=200

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

Рассмотрим макрокоманду

ТАРЕ DTFMTDEVADDR=SYSTPE, IOAREAl= INl, IOAREA2=IN2,WORKA=YES, RECFORM=FIXBLK, BLKSIZE=720, RECSIZE=120,EOFADDR=DONE

Она определяет находящийся на накопителе на магнитной ленте с именем SYSTPE файл ТАРЕ. В процессе обработки будут использованы два буфера, IN1 и IN2; адрес, по которому необходимо поместить введенную запись, будет непосредственно указываться в макрокоманде GET. Предполагается, что записи имеют фиксированную длину и блокированы. Каждый блок содержит шесть 120-байтовых записей. По окончании ввода записей файла произойдет передача управления на команду, находящуюся по адресу DONE.

Тип выполняемых операций — ввод, выводили и то и другое — задается параметром TYPEFLE. По умолчанию считается, что

TYPEFLE=INPUT

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

написать

TYPEFLE=OUTPUT

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

TYPEFLE=INOUT

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

TAPEOUT DTFMT DEVADDR=SYSTPE, IOAREAl=OUTl,

IOAREA2=OUT2,IOREG=6, RECFORM= FI XBLK, BLKSIZE=720, RECSIZE = 120,TYPEFLE=OUTPUT

В данном случае определяется, что адрес выводимой в данный момент записи находится в регистре 6. Заметим, что при описании создаваемых наборов данных параметр 'EOFADDR не требуется.

Рассмотрим, наконец, макрокоманды, задающие информацию о файлах, предназначенных для вывода на печать. Поскольку такие файлы определяются с помощью макро DTF, все рассмотренные выше свойства этих макро имеют место и в данном случае. Единственная особенность состоит в наличии дополнительного управляющего параметра, связанного с управлением кареткой. Параметр CTLCHR может иметь одно из двух значений:

CTLCHR=ASA

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

CTLCHR=YES

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

CONTROL=YES

Большинство программистов пользуется соглашениями Американского института стандартов. Приведем пример макро DTF, использующегося для определения параметров файла, предназначенного для вывода на печать:

Статья 419 - Картинка 1

Рис. 17.6. Предложение DTF и задание буферов для входного файла на перфокартах.

Статья 419 - Картинка 2

Рис. 17.7. Макро DTF для файла вывода на печать.

Здесь пользуемся тем, что по умолчанию значением параметра RECFORM является FIXUNB и что макрокоманде DTFPR «известна» длина строки, использующаяся в данной системе.

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

Макрокоманды GET и PUT

С помощью макрокоманд типа DTF определяется информация, необходимая системе для выполнения заказов пользователя по обработке файлов. Обычно для ввода и вывода информации, принадлежащей наборам данных, используются соответственно макрокоманды GET и PUT.

Макрокоманда GET записывается в виде

GET имяфайла,адрес

или

GET имяфайла

в зависимости от параметров, определенных макрокомандой DTF для файла, имеющего это же имя. Если в DTF указано WORKA= YES, то используется первая форма GET. В противном случае GET записывается во второй форме.

Макро GET производит обращение к программе супервизора, предназначенной для выполнения ввода информации, принадлежащей наборам данных. Эта программа при вводе использует буфер (или буферы), заданный параметром (параметрами) IOAREA макро DTF, и заполняет их информацией, поступающей от устройства. Затем, если определен параметр WORKA, записи из буфера попадают в область, начинающуюся по адресу, определяемому полем «адрес» параметра GET.

Пусть, например, требуется использовать для ввода набор данных на перфокартах. Будем считать, что сам файл и буферные области определены так, как это показано на рис. 17.6. Для ввода достаточно написать

GET CARDFILE,CARDIN

Система осуществит ввод очередной карты, в результате чего ее 80- байтовый образ попадает в область CARDIN. Нужно только обеспечить, чтобы область CARDIN имела размер 80 байтов. Каждый раз при появлении запроса на ввод (макро GET) система помещает образ очередной карты в область GARDIN.

Если же вместо WORKA=YES в макрокоманде DTF нами будет указан параметр IOREG, то придется использовать для ввода макро GET без указания адреса. Пусть, например, исходный набор данных нами определен так же, как на рис. 17.6, но только в макро DTF вместо WORKA=YES указано IOREG=3. В этом случае мы будем использовать макро GET в виде

GET CARDIN

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

Если определена только одна буферная область или если их определено две, но при этом макро DTF не содержит ни параметра WORKA, ни параметра IOREG, то придется самим проводить разблокировку записей и определять, в какой из буферов была помещена последняя введенная запись.

Макрокоманда PUT используется для вывода. Снова существуют две возможности работы с этим макро. Выбор конкретной формы зависит от значений параметров макро DTF. Если макро DTF, соответствующее набору данных для вывода, содержит параметр WORKA= = YES, то PUT нужно использовать в форме

PUT имяфайла, адрес

Данные, расположенные в памяти в соответствии с содержимым поля «адрес», помещаются системой в буфер вывода, соответствующий файлу с данным «именем». Например, печать строки можно выполнить следующим образом:

PUT PRNTFlLE,LINEOUT

предполагая, что используется файл, описанный так же, как на рис. 17.7. LINEOUT может представлять 133-байтовую область, содержащую коды EBCDIC выводимой строки. Можно не определять каждый раз в явном виде адрес выводимой строки. Если использовать параметр IOREG вместо WORKA при определении файла, то в качестве адреса начала выводимой по команде PUT записи используется содержимое соответствующего регистра общего назначения. Пусть, например, для файла на рис. 17.7 вместо WORKA=YES указан параметр IOREG=7. Выполнение пары команд

LA 7.LINEOUT

PUT PRNTFILE

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

Здесь полезно провести сравнение со специальными макрокомандами ввода-вывода RCD и PLN. Ввод информации с обычной 80-ко¬лонной перфокарты в область CARDIN можно выполнить с помощью команды

RCDCARDIN

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

PLN LINEOUT

или посредством пары PUT — DTFPR.

Команды OPEN и CLOSE

Выполнению любых действий над некоторым файлом должно пред-шествовать его открытие. Открыть один или сразу несколько файлов можно с помощью макрокоманды OPEN:

OPEN имена файлов

Операндами OPEN являются просто имена открываемых наборов данных. Например, для того чтобы открыть наборы, описанные макрокомандами DTF, приведенными на рис. 17.6 и 17.7, следует написать

OPEN CARDFILE,PRNTFILE ,

Файлы, конечно, можно открывать и по отдельности:

OPEN CARDFILE

OPEN PRNTFILE

Макрокоманда OPEN является запросом супервизору на выполнение следующих действий:

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

2. Размещения в памяти, если это еще не сделано, необходимых программ ввода-вывода.

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

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

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

CLOSE CARDFILE,PRNTFILE

или

CLOSE CARDFILE

CLOSE PRNTFILE

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

Резюме

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

1. Определить обрабатываемый набор данных с помощью макро DTF.

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

Статья 419 - Картинка 3

Рис. 17.8. Программа просмотра колоды карт, использующая макро ввода-вывода системы DOS.

3. Для выполнения непосредственно операций ввода-вывода использовать соответственно макрокоманды GET и PUT.

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

На рис. 17.8 приведена модифицированная программа с рис. 10.3. Модификация заключается в замене макро RCD и PLN на стандартные макро системы DOS.