Дисковая система C DOS для микрокомпьютера ZX SPECTRUM А.К.Филиппов г.Киев Микрокомпьютер ZX SPECTRUM появился еще в 1982 году и, несмотря на свой преклонный возраст, остается самым массовым в нашей стране. Фантастическая простота делает его доступным любому радиолюбителю. К сожалению, его операционная система ориентирована на т.н. микродрайвы, устройства, которые давно забыты, уже никем не производятся и у нас неизвестны. Получилось, что основным носителем программного обеспечения стала магнитная лента. Конечно, это нетерпимое неудобство - просиживать по пять - десять минут перед экраном во время загрузки программ - не самое приятное, если же у Вас ZX SPECTRUM 128, то двадцать минут загрузки - вполне обычное дело. Решением проблемы, как всем понятно, является переход на гибкие диски. Немного потратившись, Вы получите настоящее удовольствие от вещи, на которую, возможно, уже махнули рукой. Это стоит сделать только потому, что ни на какой другой компьютер не существует такого количества игрового обеспечения, как на ZX SPECTRUM. Располагая дисковой системой, можно будет заняться самими играми, а не тратить бесцельно время на их загрузку. А теперь посмотрим, что обычно предлагается для этой цели. Самая известная у нас в стране система: BETA фирмы Tecnology Research, была разработана на базе микросхемы контроллера гибких дисков WD 1793. Именно в силу наличия отечественного аналога этой микросхемы она и получила распространение. Иногда приводится такой аргумент в ее пользу: большое количество программного обеспечения. Здесь не нужно путать термины, программное обеспечение создается под компьютер, а не под дисковую систему (за исключением сервисных программ для самой системы). Все, что Вам предложат на эту систему, есть ни что иное, как адаптация обычных кассетных программ. Причем, как правило, очень грубая. Многие недостатки самой операционной системы часто сводят на нет все очевидные преимущества перехода на гибкие диски. Система CDOS была разработана в 1989 году и последняя ее версия CDOS V2.5 была выпущена в прошлом году. Это полностью отечественная разработка специально для ZX SPECTRUM. Пользователи этой системы, проработав с ней некоторое время, дают самые благоприятные отзывы. Какие же ее отличительные особенности и в чем преимущества? Самое главное - это идеология включения ее команд в систему команд самого компьютера. Если BETA предполагает довольно архаичную стуктуру вызова своих команд через операторы REM, то в CDOS это гораздо проще: после слова команды нужно поставить звездочку и все! В CDOS нет понятия "войти в систему", "выйти из системы". Вы в ней будете находиться постоянно, даже этого не ощущая. Один раз подключив контроллер, о нем можно забыть. Особенно важно то, что контроллер имеет внутренний буфер для хранения собственных переменных, каталогов, таблиц размещения файлов, промежуточных операций записи-чтения. Благодаря этому, удалось отказаться от сдвига области программ присущего системе BETA. Таким образом програмное обеспечение, как и Вы, "не чувствует" наличие контроллера. В системе BETA отсутствуюет поддержка подкаталогов. Учитывая ее возраст это простительно, но неудобно. CDOS поддерживает работу c подкаталогами, глубина вложений которых не ограничена. Вы имеете возможнось наиболее рационально распределить пространство дискеты. Теперь кратко рассмотрим расширенные команды: ATTR *"[path]name"(P/U, V/I) - предназначена для изменения атрибутов файла. Каждый файл содержит два доступных атрибута. Это атрибут P/U, определяющий защиту файла, и атрибут I/V, определяющий выдачу параметров файла в каталог. CAT *["path"]["name"] - предназначена для просмотра каталога и подкаталогов дискеты. Если ввести ее без параметров, она выводит на экран содержимое каталога диска в текущем дисководе. DIM *"[path]name" - предназначена для создания подкаталогов. Любая дискета системы CDOS может содержать неограниченное число каталогов. Поскольку они вложены в один основной, то правильнее их называть подкаталогами. В свою очередь любой подкаталог может также содержать неограниченное количество подкаталогов (есть только ограничение по емкости самой дискеты). ERASE *"[path]name"[N] - предназначена для удаления файлов и подкаталогов. FORMAT *"[drivename]diskname[S] - предназначена для предварительного форматирования дискет. GO TO *"path" - предназначена для смены текущего привода и перемещения по подкаталогам. Система может работать с четырьмя приводами, обозначенными: "A", "B", "C", "D". Инициализация всегда устанавливает привод "A", корневой каталог. LET *"oldname" TO "newname" - предназначена для переименования файлов. Можно переименовать любой файл, кроме того, для которого установлен атрибут защиты. Для файлов типа EXE эта команда кроме обычного назначения имеет и дополнительное. LOAD *"pathname"[spec][num1],[num2] - предназначена для загрузки ранее сохраненных файлов, имеет такую же структуру, как и команды работы с магнитофоном. MOVE *"oldpathname" TO "newpathname"[N] - предназначена для копирования и переименования файлов. Копирование возможно по одному файлу или группами файлов. Причем, если не указано новое имя, сохраняется старое. SAVE *"[path]name"[spec][num1],[num2][N] - предназначена для сохранения информации на диске, имеет такую же структуру, как и команды работы с магнитофоном. Большинство команд CDOS допускают использование составных имен, которые принято называть "pathname", т.е. имя файла плюс путь доступа к этому файлу. Это позволяет обращаться к любому подкаталогу или приводу, не покидая текущий. Путь доступа к конкретному подкаталогу называется: path, а в соединении с именем целевого файла, будет составлять сложное имя: pathname. Предположим, что на вашей дискете есть подкаталог: "GAMES", а в нем создан свой подкаталог: "CATS", тогда путь к этому подкаталогу будет выглядеть так: "GAMES;CATS;". Символ ";" здесь служит разделителем имен подкаталогов. Любое имя, заканчивающееся этим символом, рассматривается как имя подкаталога. Теперь Вы хотите из этого подкаталога загрузить файл с именем "BASIL", тогда команда будет выглядеть так: LOAD * "GAMES;CATS;BASIL" Первые два имени в кавычках - это имена подкаталогов, вложенных один в другой, последнее имя - это имя файла, которое нужно загрузить. Если какому-либо файлу в системе CDOS присвоить имя "AUTOSTART", он станет файлом с автозагрузкой, т.е. будет автоматически загружаться после инициализации системы. В этом файле удобно расположить что-то подобное системной оболочке или просто helpfile по данной дискете. Кроме этого, такой файл может быть загружен по умолчанию, т.е. по аналогии загрузки с магнитофона, когда команда содержит пустое имя: LOAD "" Таким образом для загрузки с диска файла AUTOSTART достаточно набрать команду: LOAD * "" Как уже упоминалось, основным носителем программного обеспечения, в нашей стране, является магнитная лента. Поэтому имеет большое значение степень легкости их переноса на диск. CDOS не производит сдвига рабочей области, в этом случае, адаптация кассетных программ очень проста. Например, программа имеет такой загрузчик: 10 PAPER 0: INK 0: BORDER 0: CLEAR 25000: LOAD "$code" CODE 16384 20 LOAD "main" CODE: RANDOMIZE USR 54000 Загрузчик для CDOS будет отличаться совсем незначительно: 10 PAPER 0: INK 0: BORDER 0: CLEAR 25000: LOAD * "$code" CODE 16384 20 LOAD * "main" CODE: RANDOMIZE USR 54000 Обратите внимание, что команда указывается одинаково и в режиме немедленного исполнения: LOAD * "$code" CODE 16384 и в программном режиме, когда она включается в строку программы: 10 CLS: LOAD * "$code" CODE 16384 За исключением финальной звездочки синтаксис команд такой же, как и команд для работы с магнитофоном. Очевидно, это само по себе является значительным преимуществом, однако главное отличие находится гораздо глубже и заключается в способе хранения информации на диске. Дело в том, что BETA размещает любую информацию на диске последовательно сектор за сектором, это предполагает использование дискет без физических дефектов. Кроме того стирание файлов приводит к образованию "дыр", которые необходимо удалять дополнительной командой. CDOS использует кластерный принцип записи, для этого она содержит на диске таблицу размещения файлов (FAT). Эта таблица содержит информацию о состоянии всех единиц хранения - кластеров. Размер кластера равен размеру физического сектора. Если какой-то сектор поврежден, он помечается в таблице и больше использоваться не будет. При записи файла отыскивается первый свободный кластер и в него производится запись, затем отыскивается следующий и т.д. При стирании кластеры, приписанные данному файлу, освобождаются и могут быть использованы вновь. FAT имеет двухбайтовую разрядность. Некоторая избыточность предопределена необходимостью упрощения обработки и не приводит к излишнему расходу места на дискете, т.к. при записи производится упаковка до полуторабайтовой разрядности. Таким образом, нормально FAT занимает в своем буфере 3200 байт, а на дискете, в упакованном виде 2400 байт (5 кластеров). Целостность этой таблицы определяет возможность доступа к данным на дискете, и поэтому она хранится в двух экземплярах. Первый экземпляр в кластерах 0-4, второй - в кластерах 5-9. Если по какой-то причине произойдет сбой чтения первого экземпляра, FAT будет прочитана из второго. В системе CDOS размер кластера совпадает с размером физического сектора, а нумерация производится от 0 до 1599. Именно столько физических секторов содержится на двусторонней дискете на 80 дорожек. Если же дискета сформатирована на 40 дорожек, число кластеров будет в два раза меньше (800). Любому кластеру на дискете соответствует позиционное место в таблице размещения файлов. Значение, записываемое в таблицу, определяет статус данного кластера: 0000 - кластер свободен 07F1 - область FAT 07F2 - область DIR 07F0 - плохой кластер 07FF - последний в файле 0FFF - кластер заблокирован Кроме FAT, любая дискета содержит по крайней мере один каталог - корневой. В него заносится имя дискеты и системная метка, по которой в дальнейшем будет определяться принадлежность к CDOS. Этот каталог содержит 128 позиций по 20 байт каждая, при этом доступны пользователю 127, т.е. с 1 по 127. Корневой каталог, кроме нулевой позиции, ничем не отличается от подкаталогов, которые в дальнейшем могут создаваться самим пользователем (команда DIM). Из сказанного видно, что как корневой, так и любой другой каталог имеют размер 2560 байт, т.е. 5 кластеров. Ниже приводится структура каталогов и подкаталогов CDOS: Заголовок дискеты или подкаталога (поз. 0). ┌──────────────────────────────────────┐ │ Имя в кодах ASCII. │ └──────┬───────────────────────────────┘ │ ┌────────────────────────┐ │ ┌┤ Обратная ссылка на FAT │ │ │└────────────────────────┘ 0 │ 10 11 12 │ 13 14 17 18 19 ╔══════╧═══════╤════════╤════╧════╤═══════════════════╤═════════╗ ║ 11 Байт │ 1 Байт │ 2 Байта │ 4 Байта │ ▒▒▒▒▒▒▒ ║ ╚══════════════╧════╤═══╧═════════╧═════════╤═════════╧═════════╝ ┌───────────────────┴─────────┐ ┌───────────┴───────────────────┐ │ #00 Заголовок диска │ │ Системная метка в кодах ASCII │ │ #FF Заголовок подкаталога │ └───────────────────────────────┘ └─────────────────────────────┘ Любое имя, кроме заголовка директория или диска (поз. 1-127). ┌──────────────────────────────────────┐ │ Имя в кодах ASCII. │ │ Первый байт может, кроме кодов ASCII │ │ содержать коды-признаки статуса │ │ имени: │ │ │ │ 00 имя не использовалось. │ │ FF имя использовалось, но стерто. │ └──────┬───────────────────────────────┘ │ ┌───────────────┐ │ ┌┤ Ссылка на FAT │ │ │└───────────────┘ 0 │ 10 11 12 │ 13 14 15 16 17 18 19 ╔══════╧═══════╤════════╤════╧════╤═════════╤═════════╤═════════╗ ║ 11 Байт │ 1 Байт │ 2 Байта │ 2 Байта │ 2 Байта │ 2 Байта ║ ╚══════════════╧═══╤════╧═════════╧════╤════╧════╤════╧════╤════╝ ┌──────────────────┴────────┐ │ │ │ │ Атрибуты имени. │ │ │ │ │ Бит 4 Защита перезаписи │ │ │ │ │ Бит 5 Запрет отображения │ │ │ │ │ │ │ │ │ │┌───────┬───────┐ │ │ │ │ ││7 6 5 4│3 2 1 0│ │ │ │ │ │└───────┴───┬───┘ │ │ │ │ │ Тип имени │ │ │ │ └────────────┼──────────────┘ ┌────┘ │ │ └──────────┐ │ │ │ ┌────────────┬───────┬──┴─┬───────┴────────┬─────┴─┬───────┴────┐ │ Подкаталог │ │ #F │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ ▒▒▒▒▒ │ ▒▒▒▒▒▒▒▒▒▒ │ ├────────────┼───────┼────┼────────────────┼───────┼────────────┤ │ "Program" │ │ #0 │ Автостарт │ Длина │ Длина-пер. │ ├────────────┼───────┼────┼────┬───────────┼───────┼────────────┤ │ "NArray" │ │ #1 │ #0 │ Название │ Длина │ ▒▒▒▒▒▒▒▒▒▒ │ ├────────────┼───────┼────┼────┼───────────┼───────┼────────────┤ │ "$Array" │ │ #2 │ #0 │ Название │ Длина │ ▒▒▒▒▒▒▒▒▒▒ │ ├────────────┼───────┼────┼────┴───────────┼───────┼────────────┤ │ "Code" │ │ #3 │ Адрес загрузки │ Длина │ ▒▒▒▒▒▒▒▒▒▒ │ ├────────────┼───────┼────┼────────┬───────┼───────┼────────────┤ │ "CDF!" │ │ #4 │ Режим │ #0 │ SP │ ▒▒▒▒▒▒▒▒▒▒ │ └────────────┴───────┴────┴────────┴───────┴───────┴────────────┘ Для непрофессионального пользователя очень привлекательна функция "MAGIC" системы BETA. В системе CDOS существует подобная, но более совершенная функция "DUMP". Суть обоих состоит в предоставлении пользователю возможности в любой момент времени прервать работу с программой и сохранить ее на диске с возможностью возобновления работы. Система формирует в этом случае файл типа . Он содержит состояние всей памяти компьютера, регистров процессора, точку восстановления, маску восстановления на данный момент работы программы. Нажатие кнопки "DUMP", во время работы с любой программой, приведет к приостановке, и система будет ждать ваших указаний. При этом никаких эффектов или запросов на экране не появится. Вам нужно просто нажать клавишу: 1, 2 или 3 1 - установить маску: процессор режим "1"; бордюр черный; 2 - установить маску: процессор режим "2"; бордюр черный; 3 - сохранить экранную область, файл не формировать. После этого включится текущий привод, произойдет формирование нужного файла и компьютер продолжит выполнение прерванной программы (без каких-либо изменений!). В каталоге Вы увидите новый файл: "CDF!". Если Вы сбрасывали экран, то файл будет называться: "$CDF!", он ничем не отличается от обычного экранного файла. Полученный файл необходимо переименовать командой: "LET *". Это необходимо потому, что система всем сброшенным файлам присваивает одно имя. Широкое использование кнопки "DUMP" считается "дурным тоном", это действительно так, особенно, если речь идет о системе BETA. Говорят, что это кнопка для домохозяек - она позволяет прервать любую программу на интересном месте, если сбежал кофе, а затем ее продолжить. Однако CDOS в этом режиме не портит "картинки", корректно отрабатывает любые программы и если учесть, что многие "польские продукты" только выглядят красиво, а на самом деле являются просто результатом работы с аналогичной кнопкой (что легко увидеть по общей длине файлов), можно и оспорить это мнение. Нужно заметить, что пренебрежительное отношение к кнопке "DUMP", вообще говоря, недоразумение, т.к. основное ее назначение - взлом защищенных программ, что без нее сделать иногда невозможно. Таким образом, в CDOS эта функция для профессионалов. В заключение можно отметить, что подключение контроллера к ZX SPECTRUM не представляет труда, т.к. он не использует зарезервированные порты (например KEMPSTON порт). На настоящий момент перенесено на диски большинство игровых программ. Кроме этого постоянно разрабатываются прикладные, сервисные, тестовые программы, инструментальные средства. Наиболее известные это: G SHELL (программная оболочка), DISK EDITOR (редактор дисков), DISKCOPY (копировщик форматов C DOS, MS DOS, TR DOS), MIRROR, FAK'S SERVICE PROGRAMS. Мы приглашаем всех программистов, работающих на SPECCY, к сотрудничеству. В одной статье невозможно рассмотреть все особенности организации операционной системы. Если радиолюбителей заинтересует более подробное описание CDOS, внешние вызовы, обработка ошибок, и т.д., возможна подготовка более детальной статьи.