НОВЫЕ ТИПЫ ДАННЫХ В TR-DOS
Повышенная скорость доступа к данным, записанным на дискете, а
также другая организация по сравнению с магнитной лентой открывают
новые возможности работы с данными. Этим не приминули воспользоваться
и авторы TR-DOS. Помимо обычных, принятых в бейсик-системе, методов
хранения данных (файлы числовых и строковых массивов) в ОС TR-DOS
сделана попытка ввести новые типы файлов. Это файлы прямого и после-
довательного доступа.
При рассмотрении новых типов данных будет часто использоваться
такое понятие, как запись. Под записью понимают совокупность данных,
которые хранятся и обрабатываются совместно, единым блоком. Каждой
записи присваивается условный номер, по которому она может быть иден-
тифицирована. Существуют два принципиально различных способа обра-
ботки записей, помещенных в файл. Различаются н типы записей.
Файл последовательного доступа по своей организации похож на
файлы, записываемые на магнитную ленту. Записи заносятся в файл
последовательно — одна за другой. При этом размер записи (еще говорят
«длина записи»), как правило, произвольный. Для того, чтобы прочитать
запись с каким-либо номером, необходимо сначала вернуться к началу
файла, а затем пропустить записи с предыдущими номерами. Следующей
будет искомая запись. Как видно, даже на быстрых устройствах ввода/выво-
да, каким является даек, скорость доступа к записям будет не особенно
высокой. Так, например, если после обработки последней записи необходимо
обработать предпоследнюю, то надо «перемотать» весь файл.
Файл с произвольным доступом лишен этого недостатка — в любой
момент можно обработать запись с любым номером. Как правило (но не
обязательно), записи в таком файле имеют фиксированную длину. За
скорость, однако, приходится платить объемом. Обычно только часть записей
целиком заполнены, остальные же имеют свободное место, которое попусту
занимает место на диске.
TR-DOS имеет некоторые особенности и, к сожалению, ошибки в
реализации работы с файлами прямого и последовательного доступа.
Во-первых, все данные записей представляются в символьном виде,
числовые значения также переводятся в символьный вид. Практически
обмен идет строками символов, а разделителями между ними служат симво-
лы с кодом 13 (Carriage Return).
Во-вторых, TR-DOS хранит обе разновидности файлов с одинаковым
типом (#), и различаются они по методу доступа только самим программи-
стом.
В-третьих, работа с файлами использует систему каналов и потоков
из бей си к- системы. Перед началом работы файл необходимо связать с
любым свободным потоком (номера от 4 до 15), при этом в оперативной
памяти открывается область канала ввода/вывода, служащая одновременно
буфером. Передача данных происходит стандартными операторами Бейсика.
Записываемые (и считываемые) данные сначала попадают в буфер, а по мере
его заполнения — на диск. По окончании работы с файлом поток необходимо
обязательно закрыть, иначе информация из файла будет безвозвратно утра-
чена. То же произойдет и при «сбросе» или «зависании» компьютера.
Размер файлов практически не ограничен и определяется только
свободным местом на диске, а также максимальным номером записи, кото-
рый не может превышать 65535. Есть, однако, одна особенность. Если размер
файла превысит 4К, то на диске будет создан «следующий» файл — с тем
же именем и типом. И хотя в результате этого на диске может оказаться
несколько файлов, дисковая система работает с ними как с единым целым.
При переименовании, копировании или удалении имя файла необходимо
указывать только один раз — остальные файлы автоматически примут
участие в операции.
Файлы последовательного доступа
Открывается файл последовательного доступа командой OPEN #:
OPEN #Stream/'[Drive:]Pile_name"Jype_access
где Stream — номер потока, связанного с файлом; [Drive: ]File_name — специ-
фикация файла; Type__aceess — тип доступа к файлу.
Файл может быть открыт одним из двух методов: для записи и для
чтения. Отвечает за это параметр Type_access. Если файл открывается для
записи, то вслед за спецификацией файла нужно поставить букву W, а для
файла, открываемого для чтения — букву R. Из файла, открытого для записи,
нельзя читать информацию, аналогично нельзя записать информацию в
файл, открытый для чтения.
Запись в файл осуществляется оператором
PRINT #Stream;String_expres9ion
где Stream — номер потока, связанного с файлом последовательного доступа,
a Strmg_expression — любое строчное выражение, например, строчная пере-
менная.
В качестве String_expression может стоять и числовое выражение, но в
файл оно запишется предварительно преобразованным в строчное.
Чтение из файла выполняется оператором
INPUT #Stream;String_expressk>n
где параметры Stream и String_expression те же, что и в операторе PRINT.
После окончания записи или чтения из файла его необходимо закрыть
оператором CLOSE #. Операция закрытия не только дозаписывает в файл
данные из буфера, но и освобождает место в оперативной памяти, занятое
каналом ввода/вывода.
Ниже приведен пример программы работы с файлом последователь-
ного доступа.
10 LET err=USR USR 15619: REM : OPEN #6/'File_con",W
открываем (создаем) файл Fi!e_con для записи, связыва-
ем его с 6 потоком
20 FOR 1=0 ТО 20
Записываем в цикле 21 запись в файл, запись состоит
из номера и слова «record.»
30 PRINT #6; STR$ i+" record."
40 NEXT i
50 LET err=USR USR 15619: REM : CLOSE #6
закрываем поток и связанный с ним файл, поток 6
теперь свободен
60 LET err=USR LISR 15619: REM : OPEN #10,"File__con"fR
открываем файл File.con для чтения, связываем его с 10
потоком
70 FOR i=0 ТО 20
последовательно считываем из файла записи и распеча-
тываем их на экране
80 INPUT #10; с$
переменная с$ используется для временного хранения
информации записи
90 PRINT с$
100 NEXT i
110 LET err=USR USR 15619: REM : CLOSE #10
закрываем поток 10 и связанный с ним файл
Строки с 60 по 110 можно выполнять неоднократно, при этом каждый
раз из файла будет последовательно считываться информация. Содержимого
файла эти операции не изменят.
Отметим, что дозаписать в файл последовательного доступа нельзя.
Если попытаться открыть существующий файл последовательного доступа
для записи, то старая информация, содержащаяся в этом файле, будет
потеряна.
_Файлы прямого доступа
Файл прямого доступа также открывается командой OPEN #, однако
формат ее другой:
OPEN #Stream/'[Drive:]File_name"RND,Record__size
где Stream — номер потока, связанного с файлом; [Drive:]File_name — специ-
фикация файла; RND — ключевое слово, указывающее на открытие файла
прямого доступа; Record_size — размер записи в байтах.
После открытия файла прямого доступа, в него можно как заносить
записи, так и читать их.
Запись в файл осуществляется стандартным оператором PRINT:
PRINT #Stream;Record_number,String_expression
где Stream — номер потока, связанного с файлом; Record_number — номер
записи в файле; String_expression — любое строчное выражение.
Чтение из файла также выполняется стандартным оператором Бейси-
ка INPUT:
INPUT #Stream;(Record_number)»String_expression
где параметры Stream, Record_number и String_expression те же, что и в операторе
PRINT.
Отметим, что записи нумеруются с нуля. Таким образом, первая
запись в файле имеет номер 0, вторая — 1, и так далее.
Не все записи в файле могут быть предварительно заполнены. При
считывании таких записей возвращается «нулевая» строка.
После окончания работы с файлом прямого доступа его необходимо
закрыть оператором CLOSE #,
Мы не приводим пример программы, иллюстрирующий работу с
файлами прямого доступа, т. к. из-за ошибок в кодах TR-DOS работать с
этими файлами не представляется возможным.
АДАПТАЦИЯ ПРОГРАММ
Адаптация программ, работающих с кассетой, для работы в рамках
дисковой ОС — наиболее интересный и, к сожалению, весьма «больной»
вопрос TR-DOS. Предложенные авторами системы методы адаптации вряд
ли могут считаться удовлетворительными. Но так как TR-DOS стала факти-
ческим стандартом дисковой ОС для ZX Spectrum, приходится мириться с
тем, что имеем.
В принципе, адаптация «чисто ленточных» программ не вызывает
сложностей. Синтаксис команд загрузки файлов в память сохранен полно-
стью, добавлен только префикс. Но обо всем по порядку.
Для начала необходимо перенести файлы с ленты на дискету. Бейсик-
блок (который начинает любую кассетную программу) проще всего подгру-
зить в память командой Бейсика MERGE (чтобы «снять автозапуск»), а затем
записать на диск командой TR-DOS SAVE. Если программа имела «автоза-
пуск», то номер строки, с которого начиналось выполнение, необходимо
восстановить. Показать номер этой строки может практически любой лен-
точный копировщик. Как уже было сказано, номер строки автозапуска в
TR-DOS указывается после ключевого слова LINE.
Перенос кодовых файлов тоже не представляет трудностей. Необхо-
димо опустить нижнюю границу используемой памяти (RAMTOP) ниже адреса
старта кодового фрагмента (параметры загрузки кодового файла может
показать копировщик, либо взять ее из программы-загрузчика). Далее сле-
дует записать область памяти на диск.
Вышеприведенные способы представляют, пожалуй, чисто теоретиче-
ский интерес, так как гораздо проще воспользоваться специальными копи-
ровщиками лента-диск, например, AMCopier, либо PCopier PLUS (оба описа-
ны в разделе «Сервисные программы»).
После переноса всех файлов программы на диск необходимо модифи-
цировать программу-загрузчик. Модификация, в общем, сводится к добав-
лению к командам загрузки (либо ко всем командам, работающими с лентой)
стандартного префикса:
RANDOMIZE USR 15619: REM :
Несколько замечаний. Во-первых, специфика префикса предусмат-
ривает только одну дисковую команду в строке (оператор REM). Таким
образом, если в ленточной версии в строке записано несколько команд LOAD,
то такая строка должна быть разбита на несколько. Строка типа
20 LOAD "kitl "CODE: LOAD "kit2"CODE
разбивается на две
20 RANDOMIZE USR 15619: REM : LOAD "kitl "CODE
21 RANDOMIZE USR 15619: REM : LOA4D "kit2"CODE
Во-вторых, очень часто в кассетных программах-загрузчиках в опера-
торах LOAD пропускают название файлов. Для дисковых версий это недопу-
стимо, названия файлов обязательно должны быть указаны. Еще один
момент, связанный с названиями файлов, заключается в различии длин
имен файлов на ленте (10 символов) и дискете (8 символов). Если на ленте
файлы назывались PAINTING1 и PAINTiNG2, то при переносе на диск от имен
останется только PAINTING. Естественно, в этом случае, названия должны быть
изменены. Желательно не допускать в именах файлов управляющих кодов
или токенов Бейсика — в них нет ничего страшного, но каталог будет
выглядеть некрасиво.
Приведенные здесь сведения охватывают только очень небольшую
часть программ, которые могут быть «переделаны на диск». Таким способом
не могут быть адаптированы программы, включающие нестандартные за-
грузчики с ленты. Довольно непросто переделать на диск запись таблицы
рекордов или сохранять текущее состояние игры. В этой книге мы не будем
останавливаться на этих проблемах подробно — решение их требует глубо-
кого знания языка ассемблера, а также четкого понимания, как функциони-
рует сама TR-DOS. Изучение ассемблера выходит за рамки рассматриваемо-
го материала, а вот о работе TR-DOS рассказано в разделе «TR-DOS изнутри».
Вопросам адаптации программ к дисковой системе TR-DOS посвящен
ряд работ. Так более подробную информацию можно найти в книге Николая
Родионова «Адаптация программ к системе TR-DOS».