Commodore DOS , также известная как CBM DOS , — это дисковая операционная система , используемая на 8-битных компьютерах Commodore . В отличие от большинства других DOS , которые загружаются с диска в собственную оперативную память компьютера и выполняются там, CBM DOS выполняется внутри привода: DOS находится в микросхемах ПЗУ внутри привода и запускается там одним или несколькими выделенными MOS 6502 семейства . процессоры . Таким образом, передача данных между 8-битными компьютерами Commodore и их дисками больше напоминает подключение к локальной сети , чем типичная передача между диском и хостом.
Известно, что существует по крайней мере семь четко пронумерованных версий Commodore DOS; В следующем списке указаны номера версий и соответствующие дисководы. Если не указано иное, диски имеют формат 5¼ дюйма. Код «lp» обозначает «низкопрофильные» диски. Диски, номер модели которых начинается с 15, подключаются через уникальные последовательные протоколы Commodore последовательной шины IEEE-488 (шина IEC) (TALK/LISTEN); все остальные используют параллельный IEEE-488 .
Версия 2.6 была, безусловно, наиболее часто используемой и широко известной версией DOS из-за ее использования в 1541 как часть систем C64 .
Примечание. Переработанная прошивка для 1571, в которой исправлена относительная ошибка файла, также обозначена как V3.0. Таким образом, невозможно отличить две версии только по номеру версии.
Дискета Commodore 1541 может содержать до 144 файлов в плоском пространстве имен (без подкаталогов ); каталог хранится на зарезервированной дорожке 18, которая расположена на полпути от концентратора до края 35-дорожечного одностороннего диска. Имя файла может иметь длину до 16 байт и теоретически является уникальным; используя методы прямого доступа к структуре каталогов, можно переименовать файл в другой, хотя доступ к таким файлам может быть затруднен или невозможен. Файлы с одинаковыми именами обычно не служат никакой цели, кроме информирования или визуального управления файлами. Один из популярных приемов, использованный, например, в The Final Cartridge III , заключался в добавлении в каталог файлов с именем "----------------"
типа DEL<
, а затем файлы можно было переупорядочивать вокруг этих строк, образуя группы. Многие разработчики игр, члены варез- групп и хакеры демосцены также использовали более хитрые пользовательские записи в каталогах.
Имена файлов могут содержать сдвинутый пробел ( $A0
), и если список каталогов просматривается с помощью BASIC, часть имени файла за пределами этого $A0
символа будет выглядеть отделенной от первой части имени файла кавычкой. из-за чего BASIC не считает его частью полного имени файла. Эту функцию можно использовать для создания записей каталога, таких как , которые затем будут отображаться в списке каталогов, например, какSAVE "PROGRAM⇧ Shift–space Commodore–DUDE",8,132 «ПРОГРАММА»,8,1 ПРГ. [1] Когда пользователь перемещает курсор в начало строки, вводит слово, LOAD
превышающее размер файла, и нажимает , BASIC интерпретирует это как , вызывая загрузку программы в память. Все, что стоит после двоеточия или вторичного адреса, не будет выполнено, поскольку компьютер игнорирует любую команду после ЗАГРУЗКИ. [2] Альтернативно, пользователь может нажать – для автоматического запуска программы. [3]RETURNLOAD "PROGRAM",8,1 ...
⇧ ShiftRUN/STOPLOAD
RUN
Нулевой байт, встроенный в имя файла, прервет листинг после загрузки BASIC. Если есть три нулевых байта, это затрудняет перечисление через BASIC. Многие программисты на машинном языке экспериментировали с нулевыми байтами, пытаясь усложнить программистам BASIC доступ к их коду и изменение его.
В BASIC к каталогу можно получить доступ как к неисполняемой псевдо-BASIC-программе с (или в случае двух дисков), за которым следует . Первая строка имеет номер строки 0 или 1 (с указанием номера диска), показывая в обратном порядке имя и идентификатор диска, а также сокращенный код версии DOS, с которой он был создан (коды различаются только в зависимости от В версиях DOS используются несовместимые форматы дисков: «2A» используется в большинстве 5,25-дюймовых версий DOS, «3D» — в 3,5-дюймовых 1581). Строки после этого имеют размер файла (в дисковых блоках) в качестве псевдо «номера строки», за которым следует имя файла в кавычках и трехбуквенный код типа. В последней строке показано количество нераспределенных блоков на диске (опять же в виде псевдо «номера строки»), за которым следуют слова «BLOCKS FREE».LOAD "$0",8
LOAD "$1",8
LIST
На 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 "$",8
DIRECTORY
CATALOG
Поддерживаются следующие типы файлов:
SEQ
SEQ
файлы обычно используются для хранения документов или текстовых файлов, созданных текстовым процессором или другим подобным редактором. Последовательный файл аналогичен плоскому файлу в Linux или UNIX , поскольку он не имеет специализированной внутренней структуры. Невозможно позиционировать любое произвольное место в последовательном файле, поскольку lseek
в UNIX-подобных операционных системах нет аналога вызова ядра.PRG
PRG
файлы обычно содержат исполняемый программный код, хотя их также можно использовать для файлов данных. Первые два байта PRG
считываются процедурой загрузки файла ядра и используются для определения адреса загрузки (они хранятся в формате с прямым порядком байтов ).REL
USR
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
глаголом , следующие:
"0:ADDRESSBOOK,S,W"
параметр официально упоминается в документации Commodore как командная строка и интерпретируется контроллером устройства, к которому осуществляется доступ. В случае дискового накопителя формальная структура командной строки состоит из номера механизма привода ( 0:
, не путать с номером устройства), имени файла ( ADDRESSBOOK
), типа файла ( S
, в данном примере последовательного) и режима доступа ( W
, открыт для записи в этом примере). На практике некоторые из этих параметров могут быть опущены. Как минимум, требуется только имя файла, если файл нужно открыть для чтения.Файлы также можно загружать и сохранять с помощью команд LOAD
и SAVE
. Здесь также можно использовать спецификаторы имени файла, например, сохраняет программу BASIC в файл (программы) и сохраняет программу BASIC в последовательный файл. Если вторичный адрес не указан или указан как 0 (например, ), файл сохраняется/загружается из области памяти BASIC (которая на C64 начинается по умолчанию с $ 0801). Если вторичный адрес указан как ненулевое значение (например, ), программа загружается, начиная с адреса, указанного в самом файле (заголовок PRG, который представляет собой первые два байта файла) — эта форма команды чаще встречается при загрузке программ машинного кода.SAVE "FILE",8
PRG
SAVE "0:FILE,SEQ,WRITE",8,1
LOAD "FILE",8
LOAD "FILE",8,1
Перераспределение нагрузки было впервые реализовано на VIC-20 , поскольку эта машина могла запускать BASIC RAM в нескольких разных местах, в зависимости от установленного расширения памяти. Старая серия Commodore PET не поддерживала перемещение, поэтому имела тот же эффект: файл загружался в ту же область памяти, из которой он был сохранен. Перераспределение нагрузки происходит на хосте, что является исключением из сказанного выше о том, что вторичный адрес используется только внутри устройства. Поскольку PET не может перемещать файлы, программы BASIC, написанные на более поздних машинах Commodore, необходимо модифицировать с помощью редактора секторов для изменения байтов заголовка. Также можно использовать встроенный в PET монитор машинного языка для изменения адреса ссылки для программы BASIC после ее загрузки.LOAD "FILE",8
LOAD "FILE",8,1
Команда загрузит первую программу на диск, начиная с ячейки памяти, указанной файлом. Это одна из самых популярных команд загрузки платформ, например, метод запуска большинства коммерческих программ. Следует отметить тот факт, что расширение подстановочных знаков будет выбирать первое имя каталога только в том случае, если ранее не было доступа к другому файлу на этом диске; имя файла, который использовался последним, сохраняется в памяти, и последующие команды будут загружать этот файл, а не первый. (Однако или всегда загружает первый файл на диск.)LOAD "*",8,1
LOAD "*",8,1
LOAD "0:*",8,1
LOAD ":*",8,1
Доступ к каталогам дисков в двухдисковых устройствах осуществляется как и . и обращайтесь не к каталогу, а к реальным файлам на том или ином диске, которым случайно присвоено имя . Частичные каталоги можно загрузить, добавив двоеточие и шаблон: например, будет загружен частичный каталог, в котором отображаются только файлы, имена которых начинаются с буквы K и имеют тип PRG; все такие частичные каталоги по-прежнему содержат начальную строку имени диска и последнюю строку «BLOCKS FREE».LOAD "$0", 8
LOAD "$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 является общим для всех моделей приводов и может использоваться для определения того, был ли привод сброшен в состояние включения.
Также имеются команды поиска в файлах типа RELative ( RECORD#
), несколько команд прямого доступа на уровне блоков ( BLOCK-READ
, BLOCK-WRITE
, BUFFER-POINTER
), управления блоками ( BLOCK-ALLOCATE
, BLOCK-FREE
), манипуляций с памятью накопителя и выполнения программного кода на процессоре накопителя ( MEMORY-WRITE
, MEMORY-READ
, MEMORY-EXECUTE
, BLOCK-EXECUTE
) и определяемые пользователем функции ( USER
и &
команды). Некоторые из теоретически определяемых пользователем функций были переназначены для доступа к новым функциям в версиях DOS после 1.0.