stringtranslate.com

Коммодор DOS

Commodore DOS , также известная как CBM DOS , — это дисковая операционная система , используемая на 8-битных компьютерах Commodore . В отличие от большинства других DOS , которые загружаются с диска в собственную оперативную память компьютера и выполняются там, CBM DOS выполняется внутри привода: DOS находится в микросхемах ПЗУ внутри привода и запускается там одним или несколькими выделенными MOS 6502 семейства . процессоры . Таким образом, передача данных между 8-битными компьютерами Commodore и их дисками больше напоминает подключение к локальной сети , чем типичная передача между диском и хостом.

CBM DOS-версии

Известно, что существует по крайней мере семь четко пронумерованных версий Commodore DOS; В следующем списке указаны номера версий и соответствующие дисководы. Если не указано иное, диски имеют формат 5¼ дюйма. Код «lp» обозначает «низкопрофильные» диски. Диски, номер модели которых начинается с 15, подключаются через уникальные последовательные протоколы Commodore последовательной шины IEEE-488 (шина IEC) (TALK/LISTEN); все остальные используют параллельный IEEE-488 .

Версия 2.6 была, безусловно, наиболее часто используемой и широко известной версией DOS из-за ее использования в 1541 как часть систем C64 .

Примечание. Переработанная прошивка для 1571, в которой исправлена ​​относительная ошибка файла, также обозначена как V3.0. Таким образом, невозможно отличить две версии только по номеру версии.

Технический обзор

1541 тип каталогов и файлов

Дискета Commodore 1541 может содержать до 144 файлов в плоском пространстве имен (без подкаталогов ); каталог хранится на зарезервированной дорожке 18, которая расположена на полпути от концентратора до края 35-дорожечного одностороннего диска. Имя файла может иметь длину до 16 байт и теоретически является уникальным; используя методы прямого доступа к структуре каталогов, можно переименовать файл в другой, хотя доступ к таким файлам может быть затруднен или невозможен. Файлы с одинаковыми именами обычно не служат никакой цели, кроме информирования или визуального управления файлами. Один из популярных приемов, использованный, например, в The Final Cartridge III , заключался в добавлении в каталог файлов с именем "----------------"типа DEL<, а затем файлы можно было переупорядочивать вокруг этих строк, образуя группы. Многие разработчики игр, члены варез- групп и хакеры демосцены также использовали более хитрые пользовательские записи в каталогах.

Имена файлов могут содержать сдвинутый пробел ( $A0), и если список каталогов просматривается с помощью BASIC, часть имени файла за пределами этого $A0символа будет выглядеть отделенной от первой части имени файла кавычкой. из-за чего BASIC не считает его частью полного имени файла. Эту функцию можно использовать для создания записей каталога, таких как , которые затем будут отображаться в списке каталогов, например, какSAVE "PROGRAM⇧ Shiftspace CommodoreDUDE",8,132 «ПРОГРАММА»,8,1 ПРГ. [1] Когда пользователь перемещает курсор в начало строки, вводит слово, LOADпревышающее размер файла, и нажимает , BASIC интерпретирует это как , вызывая загрузку программы в память. Все, что стоит после двоеточия или вторичного адреса, не будет выполнено, поскольку компьютер игнорирует любую команду после ЗАГРУЗКИ. [2] Альтернативно, пользователь может нажать – для автоматического запуска программы. [3]RETURNLOAD "PROGRAM",8,1 ...⇧ ShiftRUN/STOPLOADRUN

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

В BASIC к каталогу можно получить доступ как к неисполняемой псевдо-BASIC-программе с (или в случае двух дисков), за которым следует . Первая строка имеет номер строки 0 или 1 (с указанием номера диска), показывая в обратном порядке имя и идентификатор диска, а также сокращенный код версии DOS, с которой он был создан (коды различаются только в зависимости от В версиях DOS используются несовместимые форматы дисков: «2A» используется в большинстве 5,25-дюймовых версий DOS, «3D» — в 3,5-дюймовых 1581). Строки после этого имеют размер файла (в дисковых блоках) в качестве псевдо «номера строки», за которым следует имя файла в кавычках и трехбуквенный код типа. В последней строке показано количество нераспределенных блоков на диске (опять же в виде псевдо «номера строки»), за которым следуют слова «BLOCKS FREE».LOAD "$0",8LOAD "$1",8LIST

На Commodore 64 ввод приведет к заполнению экрана мусором вместо загрузки каталога в BASIC RAM. Это связано с тем, что привод назначает каталогу адрес загрузки $ 0401 (1025), что эквивалентно началу BASIC для Commodore PET , но соответствует экранной памяти по умолчанию в C64 (начиная со второго символа первого символа). строка экрана).LOAD "$",8,1

Просмотр каталога с помощью команды перезаписывает программу BASIC в памяти. DOS Wedge и различные картриджи и расширители сторонних производителей, такие как Epyx Fast Load , Action Replay и The Final Cartridge III, позволяют просматривать каталог диска с помощью специальных команд, которые загружают каталог в экранную память, не разрушая текущую программу BASIC. Некоторые версии Commodore BASIC включают команду или , выполняющую ту же функцию.LOAD "$",8DIRECTORYCATALOG

Поддерживаются следующие типы файлов:

SEQ
Последовательный файл — это файл данных , который можно читать линейно от начала до конца. SEQфайлы обычно используются для хранения документов или текстовых файлов, созданных текстовым процессором или другим подобным редактором. Последовательный файл аналогичен плоскому файлу в Linux или UNIX , поскольку он не имеет специализированной внутренней структуры. Невозможно позиционировать любое произвольное место в последовательном файле, поскольку lseekв UNIX-подобных операционных системах нет аналога вызова ядра.
PRG
PRGфайлы обычно содержат исполняемый программный код, хотя их также можно использовать для файлов данных. Первые два байта PRGсчитываются процедурой загрузки файла ядра и используются для определения адреса загрузки (они хранятся в формате с прямым порядком байтов ).
REL
Относительный файл — это разновидность последовательного типа файла, в котором присутствует механизм индексации, называемый боковыми секторами, для обеспечения доступа, ориентированного на записи. Записи могут иметь размер максимум 254 байта и адресуются по кардинальному числу, начинающемуся с единицы, что обеспечивает настоящий произвольный доступ к любой части файла.
USR
Пользовательский файл имеет внутреннюю структуру, идентичную структуре последовательного файла. Первоначальной целью Commodore для этого типа файлов было облегчение разработки для DOS, поскольку содержимое файла можно было скопировать в буфер диска для выполнения микропроцессором диска. Очень немногие программы когда-либо использовали этот тип файлов. Некоторые приложения, использующие нестандартные низкоуровневые дисковые структуры, сохраняют данные в формате USR, что стало своего рода сигналом пользователю «оставьте меня в покое, не пытайтесь копировать или удалить». В частности, файлы «VLIR» GEOS отображаются как USRфайлы.
DEL
Недокументированный тип файла для внутреннего использования, аналогичный по структуре последовательному файлу. Создание файла этого типа должно выполняться путем прямого изменения каталога диска.

Наличие звездочки ( *) перед типом файла в списке каталогов (например, *SEQ) указывает на то, что файл не был закрыт должным образом после записи. Когда накопителю поступает команда закрыть файл, который был открыт для записи, соответствующий буфер сбрасывается на диск, а карта доступности блоков (BAM) обновляется, чтобы точно отражать, какие блоки были использованы. Если сбой программы или другая проблема (например, удаление пользователем диска при открытом файле) приводит к созданию «сиротского файла», также называемого «ядовитым» или «запятнанным» файлом, буферы не очищаются, а BAM не будет точно отражать использование диска, что подвергает диск риску повреждения. Доступ к подозрительному файлу обычно невозможен (но его можно открыть в режиме «изменения»), а попытка использовать scratchкоманду DOS для удаления файла может привести к повреждению файловой системы , например перекрестным связям. Единственный практический метод удаления одного из этих файлов — открыть файл в режиме «изменения» (и исправить его) или проверить диск (см. команду DOS validateниже), причем последний вариант перестраивает BAM и удаляет ссылки на «подозрительные» файлы. из каталога. Печально известная ошибка сохранения с заменой могла привести к созданию файлов splat.

*DEL— это специальный тип, записываемый в запись каталога на диске для удаленных файлов. Такие файлы не отображаются в обычном списке каталогов, а их блоки данных и записи каталога будут повторно использоваться файлами, которые будут созданы впоследствии. Некоторые служебные программы позволяют «отменить удаление» таких файлов, если их блоки данных и записи каталога еще не были перезаписаны другими файлами. DEL filesобычно используются для вставки баннеров или разделов комментариев в список каталогов.

Типы файлов, которые стоят <после них (например, PRG<), «заблокированы» и не могут быть удалены, однако их можно открыть для чтения. Не существует команды Commodore DOS, которая могла бы явно установить или очистить этот статус, но было написано множество сторонних утилит, позволяющих это сделать. Эти утилиты обычно читают каталог с помощью команд прямого доступа, выполняют необходимые изменения в необработанных данных, а затем записывают изменения обратно на диск.

Доступ к файлам

Доступ к файлам в первую очередь является проблемой для главного компьютера. ПЗУ ядра компьютера содержит необходимые примитивные процедуры, необходимые для доступа к файлам, а ПЗУ BASIC содержит абстракцию более высокого уровня для доступа к файлам с использованием синтаксиса BASIC. Компонентами, которые касаются самой DOS, являются анализ имени файла и вторичный адрес. В этом разделе для полноты представлен обзор необходимых команд BASIC.

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

OPEN 3,8,4,"0:ADDRESSBOOK,S,W"

Параметры, следующие за OPEN глаголом , следующие:

3
Этот параметр, номер файла , логически идентифицирует открытый файл в операционной системе компьютера и аналогичен дескриптору файла в UNIX-подобных операционных системах. Он никогда не отправляется на диск и поэтому не известен и не используется собственной операционной системой диска. Номер файла может быть в диапазоне от 1 до 254 включительно, назначается программистом и должен быть уникальным, если одновременно открывается более одного файла. После открытия файла все процедуры ввода и вывода программы используют номер файла. В программах на языке ассемблера это значение часто называют LA (логический адрес), аббревиатурой, происходящей от мнемоники, обозначающей ячейку памяти, где хранится номер файла. Номера файлов больше 127 приводят к тому, что система записывает дополнительный перевод строки после каждого возврата каретки (полезно, например, для двойного интервала в документе).
8
Этот параметр, номер устройства , идентифицирует конкретное периферийное устройство , подключенное к компьютеру. Устройства с 0 по 3 адресуют клавиатуру, кассету с лентой, интерфейс RS-232 и видеодисплей соответственно, причем все они напрямую управляются ПЗУ ядра. Устройства с номерами 4 и выше адресуют устройства, подключенные к периферийной шине, например принтеры или дисководы. В случае дисковода номер устройства относится к контроллеру устройства, а не к механизму(ам) привода внутри устройства. По соглашению первый дисковод в системе имеет номер устройства 8, второй диск, если он есть, 9 и т. д., вплоть до максимального числа 15 (при подключении восьми дисков). Схема нумерации устройств была заимствована из шины IEEE-488 (или интерфейса общего назначения GPIB ), которая использовалась с моделями Commodore PET/CBM. В программах на ассемблере это значение часто называют FA или PA (физический адрес), опять же из-за мнемоники ячейки памяти, где хранится номер устройства.
4
Этот параметр, вторичный адрес , который может принимать значения от 0 до 15 включительно, относится к конкретному каналу связи, установленному с контроллером устройства, и передается устройству, когда ему подается команда «разговаривать» или «слушать» по периферийной шине. Как и номер файла, вторичный адрес определяется программистом и должен быть уникальным для рассматриваемого устройства. Диапазон от 0 до 14 включительно используется для передачи данных на устройство или с него, тогда как 15, называемый «командным каналом», используется для выдачи команд контроллеру устройства (например, для переименования файла на диске), если устройство способно поддерживать такую ​​операцию. В дисковых накопителях вторичные адреса от 0 до 14 включительно сопоставляются с буферами внутри контроллера, тем самым устанавливая связь с определенным файлом на определенном диске; поскольку, как упоминалось выше, диск не знает номера файла , он может использовать только вторичный адрес , чтобы различать несколько файлов, открытых одновременно. С другой стороны, операционная система хоста не имеет значения относительно вторичного адреса; он передается на диск при каждом доступе к файлу, но не используется хостом иным образом. В программах на ассемблере это значение часто называют SA (вторичный адрес).
КОМАНДНАЯ СТРОКА
Этот "0:ADDRESSBOOK,S,W"параметр официально упоминается в документации Commodore как командная строка и интерпретируется контроллером устройства, к которому осуществляется доступ. В случае дискового накопителя формальная структура командной строки состоит из номера механизма привода ( 0:, не путать с номером устройства), имени файла ( ADDRESSBOOK), типа файла ( S, в данном примере последовательного) и режима доступа ( W, открыт для записи в этом примере). На практике некоторые из этих параметров могут быть опущены. Как минимум, требуется только имя файла, если файл нужно открыть для чтения.
Номер диска идентифицирует механизм диска, подключенный к контроллеру дискового устройства, и аналогичен номеру логического устройства в контроллере SCSI , который способен управлять несколькими механизмами (например, контроллеры OMTI SASI , которые были разработаны для работы с ST-412 / ST) . -506 жестких дисков в 1980-е годы). В дисководах первым механизмом является диск 0:, а вторым — 1:. Довольно распространенной практикой является пропуск номера привода при обмене данными с одним дисководом, поскольку в таких устройствах по умолчанию используется 0:, но поскольку пропуск номера может вызвать несколько неясных ошибок в DOS, это не рекомендуется ( одно двоеточие эквивалентно 0: и этого достаточно, чтобы избежать этих ошибок). Исключением из этого соглашения является подсистема жестких дисков лейтенанта Кернала , в которой номер диска относится к «логическим единицам» ( виртуальным дискам , созданным на одном физическом диске), что делает синтаксис, такой как 4: или 10:, необходимым, если открываемый файл не находился в нулевой логической единице (что эквивалентно нулю механизма привода в двухдисковом устройстве).

Файлы также можно загружать и сохранять с помощью команд LOADи SAVE. Здесь также можно использовать спецификаторы имени файла, например, сохраняет программу BASIC в файл (программы) и сохраняет программу BASIC в последовательный файл. Если вторичный адрес не указан или указан как 0 (например, ), файл сохраняется/загружается из области памяти BASIC (которая на C64 начинается по умолчанию с $ 0801). Если вторичный адрес указан как ненулевое значение (например, ), программа загружается, начиная с адреса, указанного в самом файле (заголовок PRG, который представляет собой первые два байта файла) — эта форма команды чаще встречается при загрузке программ машинного кода.SAVE "FILE",8PRGSAVE "0:FILE,SEQ,WRITE",8,1LOAD "FILE",8LOAD "FILE",8,1

Перераспределение нагрузки было впервые реализовано на VIC-20 , поскольку эта машина могла запускать BASIC RAM в нескольких разных местах, в зависимости от установленного расширения памяти. Старая серия Commodore PET не поддерживала перемещение, поэтому имела тот же эффект: файл загружался в ту же область памяти, из которой он был сохранен. Перераспределение нагрузки происходит на хосте, что является исключением из сказанного выше о том, что вторичный адрес используется только внутри устройства. Поскольку PET не может перемещать файлы, программы BASIC, написанные на более поздних машинах Commodore, необходимо модифицировать с помощью редактора секторов для изменения байтов заголовка. Также можно использовать встроенный в PET монитор машинного языка для изменения адреса ссылки для программы BASIC после ее загрузки.LOAD "FILE",8LOAD "FILE",8,1

Команда загрузит первую программу на диск, начиная с ячейки памяти, указанной файлом. Это одна из самых популярных команд загрузки платформ, например, метод запуска большинства коммерческих программ. Следует отметить тот факт, что расширение подстановочных знаков будет выбирать первое имя каталога только в том случае, если ранее не было доступа к другому файлу на этом диске; имя файла, который использовался последним, сохраняется в памяти, и последующие команды будут загружать этот файл, а не первый. (Однако или всегда загружает первый файл на диск.)LOAD "*",8,1LOAD "*",8,1LOAD "0:*",8,1LOAD ":*",8,1

Доступ к каталогам дисков в двухдисковых устройствах осуществляется как и . и обращайтесь не к каталогу, а к реальным файлам на том или ином диске, которым случайно присвоено имя . Частичные каталоги можно загрузить, добавив двоеточие и шаблон: например, будет загружен частичный каталог, в котором отображаются только файлы, имена которых начинаются с буквы K и имеют тип PRG; все такие частичные каталоги по-прежнему содержат начальную строку имени диска и последнюю строку «BLOCKS FREE».LOAD "$0", 8LOAD "$1", 8"0:$""1:$""$"LOAD "$0:K*=P",8

Ошибка сохранения с заменой

Commodore DOS также предлагает команду «Сохранить с заменой», которая позволяет сохранить файл поверх существующего файла без необходимости сначала сохранять SCRATCHсуществующий файл. Это было сделано путем добавления @символа к имени файла во время операции OPENили SAVE, например, . В течение многих лет, начиная с привода 4040, распространялись слухи об ошибке в реализации команды. Поначалу некоторые комментаторы это отрицали. За доказательство существования ошибки предлагались призы. [4] К началу 1985 года Compute! журнал посоветовал читателям избегать использования этой команды. [5] В том же году различные авторы независимо опубликовали статьи [4] [6] [7] [8] , доказывающие, что ошибка «Сохранить с заменой» реальна, и включая методы, с помощью которых она может быть вызвана.SAVE "@MY PROGRAM",8

Затронутые устройства включали модели 1541 с одним диском и 4040 с двумя дисками; у 8050 и 8250 этой проблемы не было. [4] Некоторые комментаторы предположили, что этой ошибки можно избежать, всегда явно указывая 0:номер диска при сохранении, [6] хотя позже было показано, что любые операции с диском без номера диска были достаточны, чтобы привести к ошибке. [9] Ошибка возникла из-за того, что затронутые реализации DOS представляли собой модифицированные версии DOS, содержащиеся в более ранних двойных дисках Commodore PET, таких как 8050. Это создавало «фантомный диск 1:» в системах с одним диском, что приводило к выделению ненужный буфер при некоторых условиях. Поскольку команда «Сохранить с заменой» использовала все пять буферов накопителя, а метод выделения «фантомного» буфера не соответствовал спецификациям, при некоторых условиях это приводило к записи на диск зашифрованных данных.

В сентябре 1986 года Филип А. Слеймейкер опубликовал статью [10] , в которой очень подробно описал причину ошибки и предоставил исправления для ПЗУ накопителя 1541; считыватели с устройством записи EPROM могли создавать свои собственные исправленные ПЗУ, которые можно было заменять в привод. Компания Commodore была проинформирована о выводах Slaymaker, и хотя они так и не выпустили официального обновления для исходных ПЗУ 1541, они исправили ошибку в пятой версии ПЗУ 1571, а также в ПЗУ для накопителей 1541-c и 1541-II. . Хотя Commodore и не поддерживает прошивку, известно, что прошивку 1541-II (но не прошивку 1541-c) также можно использовать в оригинальном накопителе 1541 с использованием EPROM, что также исправит ошибку для этого накопителя.

Командный канал

Как отмечалось ранее, доступ к самой Commodore DOS осуществляется через «командный канал» с использованием синтаксиса, подобного тому, который используется для доступа к файлам. Выдача команд DOS и получение сообщений о состоянии и ошибках, генерируемых в ответ на команды, осуществляется путем открытия файла на устройстве с использованием 15 в качестве вторичного адреса, например:

OPEN 1,8,15

Чтобы получить и отобразить статус устройства, можно написать:

OPEN 1,8,15:INPUT#1,E,E$,T,S:PRINT E,E$,T,S:CLOSE 1

В приведенном выше примере Eбудет содержаться номер ошибки (если таковая имеется, он будет равен нулю, если ошибки не существует), E$будет краткое текстовое описание ошибки, Tбудет представляться дорожка диска, на которой произошла ошибка, и Sбудет сектор на трек T, к которому относится ошибка. Если ошибок нет, эквивалент00, ок, 00,00будет возвращено в четырех переменных. Обратите внимание, что INPUT#это глагол только для режима выполнения. Кроме того, в программах, которые выдают множество дисковых команд, принято открывать файл в командном канале устройства в начале программы и не закрывать его до завершения работы программы.

Commodore BASIC версии 4.0 и более поздних версий предоставляет псевдопеременную, которую DS$можно использовать для получения состояния диска вместо приведенного выше кода. Эта зарезервированная переменная недоступна в более ранних версиях BASIC, поэтому командный канал необходимо читать вручную, как показано выше. Обратите внимание, что сразу после включения или перезагрузки будет возвращена версия DOS. Например, 1541 вернет73,CBM DOS V2.6 1541,00,00. Код ошибки 73 является общим для всех моделей приводов и может использоваться для определения того, был ли привод сброшен в состояние включения.

DOS-команды

Также имеются команды поиска в файлах типа RELative ( RECORD#), несколько команд прямого доступа на уровне блоков ( BLOCK-READ, BLOCK-WRITE, BUFFER-POINTER), управления блоками ( BLOCK-ALLOCATE, BLOCK-FREE), манипуляций с памятью накопителя и выполнения программного кода на процессоре накопителя ( MEMORY-WRITE, MEMORY-READ, MEMORY-EXECUTE, BLOCK-EXECUTE) и определяемые пользователем функции ( USERи &команды). Некоторые из теоретически определяемых пользователем функций были переназначены для доступа к новым функциям в версиях DOS после 1.0.

Рекомендации

  1. ^ Стердивант, Джерри А. (февраль – март 1985 г.). «Быстрая загрузка». Коммодор Power/Play . Том. 4, нет. 1. п. 54 . Проверено 7 октября 2018 г.
  2. ^ Брэннон, Чарльз (декабрь 1983 г.). «Горизонты: 64». Бюллетень COMPUTE ! № 6. с. 178 . Проверено 7 октября 2018 г.
  3. ^ Грейс, Пол (1986). «Странный чувак». Специальный выпуск RUN 1987 года . Питерборо, Нью-Гэмпшир: CW Communications/Peterborough, Inc. Проверено 7 октября 2018 г.
  4. ^ abc Whittern, Чарльз Х. (июль 1985 г.). «СОХРАНИТЬ с открытой заменой!». Транзактор . 6 (1): 20.
  5. ^ "Дебаты о спасении/замене Великого коммодора" . Вычислите! . Февраль 1985 г. с. 10 . Проверено 6 октября 2013 г.
  6. ^ ab Slaymaker, Пенсильвания (октябрь 1985 г.). «Сохранить с заменой: наконец-то отлажено / Часть 1». Вычислите! . п. 79 . Проверено 16 октября 2013 г.
  7. ^ Слеймейкер, Пенсильвания (ноябрь 1985 г.). «Сохранить с заменой: наконец-то отлажено / Часть 2». Вычислите! . п. 111 . Проверено 30 октября 2013 г.
  8. ^ Редакторы. «Save @: Теория Джерри Ньюфилда о старой ошибке». Информация № 9, декабрь 1985 г./январь 1986 г.
  9. ^ Отрывок из электронного письма Филипа А. Слеймейкера, также заархивированный на Groups.Google.
  10. ^ Филип А. Слеймейкер. «Устранение SAVE@ и других ошибок 1541». Транзактор Том. 7 № О2, сентябрь 1986 г., стр. 33–35.
Примечания