Формат дисков CP/M 3.1

Материал из Emuverse
Данный материал защищён авторскими правами!

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

Источник: http://www.seasip.info/Cpm/format31.html

Перевод: Black Cat / Era CG (era_cg@speccy.su)

Формат дисков CP/M 3.1

CP/M 3.1 использует очень похожую с CP/M 2.2 файловую систему, но с большим числом поддерживаемых дисковых форматов. Параметры дисков хранятся в специальном блоке — DPB (Disk Parameter Block), который содержит следующую информацию:

	DEFW	spt	;Sector Per Track - число 128-байтных записей на одной дорожке
	DEFB	bsh	;Block shift - блоковое смещение. 3 => 1k, 4 => 2k, 5 => 4k....
	DEFB	blm	;Block mask - маска блока. 7 => 1k, 0Fh => 2k, 1Fh => 4k...
	DEFB	exm	;Extent mask - маска экстента, см. далее
	DEFW	dsm	;(число блоков на диске)-1
	DEFW	drm	;(число элементов в директории)-1
	DEFB	al0	;Карта расположения директории, первый байт
	DEFB	al1	;Карта расположения директории, второй байт
	DEFW	cks	;Checksum vector size - размер вектора контрольной суммы (?), 0 или 8000h - для фиксированного диска.
			;число элементов в директории/4, округленно.
	DEFW	off	;Offset - смещение, число зарезервированных (под систему - прим. переводчика) дорожек
        DEFB	psh	;Физическое смещение сектора, 0 => 128-байтные сектора
			;1 => 256-байтные сектора  2 => 512-байтные сектора...
	DEFB	phm	;Маска физического сектора,  0 => 128-байтные сектора
			;1 => 256-байтные сектора, 3 => 512-байтные сектора...

Карта расположения директории интерпретируется следующим образом:

       al0              al1
b7b6b5b4b3b2b1b0 b7b6b5b4b3b2b1b0
 1 1 1 1 0 0 0 0  0 0 0 0 0 0 0 0

 - таким образом, в этом примере директория занимает первые четыре блока.

DPB обычно не хранится на диске. Параметры диска либо жестко прописаны в BIOS, либо определяются на лету при чтении диска.

Директория CP/M 3.1

Директория CP/M 3.1 имеет четыре типа записей:

Файлы

0U F1 F2 F3 F4 F5 F6 F7 F8 T1 T2 T3 EX S1 S2 RC   .FILENAMETYP....
AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL   ................

0U = User number - Номер области пользователя. 0-15. Номер области позволяет существование
    нескольких файлов с одинаковыми именами на диске. 
     User number = 0E5h => Файл удален
Fn - Filename - имя файла
Tn - FyleType - тип файла. Используется 7-бит ASCII.
       Старший бит T1 (часто упоминается как T1') установлен для файлов "только для чтения".
       T2' установлен для системных файлов (соответствует атрибуту "скрытого" файла в
     других системах).
       T3! установлен для архивных файлов.
EX = Extent counter - номер экстента, младший байт - принимает значения 0-31
S2 = Номер экстента, старший байт.

      Экстент - это часть файла, контролируемая одной записью директории.
    Если файл состоит из большего числа блоков, чем может быть описано в одной записи в
    директории, он получает несколько записей, отличающихся байтами EX и S2.
    Формула: Номер записи = ((32*S2)+EX) / (exm+1), где exm - значение маски экстента из DPB.

S1 - Счетчик байт последней записи.
      
      Что такое Счетчик байт последней записи? С точки зрения CP/M, это просто число 0-255,
    ассоциированное с файлом, которое может использоваться программой для любых целей.
    Документация не определяет его назначения.
    Если необходимо, чтобы программы имели возможность обмениваться файлами точного размера
    (не обязательно кратного 128-байтной записи), тогда необходимо каким-то образом определить,
    что именно должно означать это число. Необходимо соблюдать следующие условия:
    - если число равно 0, файл использует каждый свой байт в образе диска (для совместимости с
    ранними версиями системы).
    - число должно позволять точно определять число байт в последней 128-байтной записи.
    К сожалению, это тем не менее допускает два возможных варианта:
    - число определяет число НЕИСПОЛЬЗОВАННЫХ байт последней записи.
    - число определяет число ИСПОЛЬЗОВАННЫХ байт последней записи; в этом случае опно принимает
    значения 1-127, 0 - недопустимое значение, так как означает 128.
    К еще большему сожалению, существуют программы, которые используют обе системы:
    - ISX, эмулятор ISIS-II, использует первый вариант интерпретации.
    - ОС DOS Plus использует второй. Также поступают утилиты cpmtools для MS-DOS от Tilmann Reh
    и мои (скорее всего John Elliott - автор оригинального документа - прим. переводчика).
    - DOS+2.5 никак не интерпретирует и неиспользует это число, но в документации предлогалось
    использовать вариант интерпретации ISX.

RC - Число записей (1 запись=128 байт) занятых этим экстентом, младший байт.
    Полное число записей занятых экстентом равно:

    (EX & exm) * 128 + RC

    Если RC равно 80h, этот экстент полный и может существовать еще один на этом диске.
    Размеры файлов опционально сохраняются точно (с использованием байта S1), но эта система
    практически не используется.

AL - Allocation - расположение (карта расположения блоков файла). Каждый байт AL - это номер
    блока на диске. Если AL содержит ноль, то он не указывает на какой-либо блок (то есть 
    соответствующий блок не существует). Например 3k файл может иметь следующее расположение:
    5,6,8,0,0.... - первые 1k - в блоке 5, вторые - в блоке 6, третьи - в блоке 8.
     AL-номера могут быть либо 8-битными (если диск содержит менее 256 блоков), либо 16-
    битными (первым хранится младший байт).

Метка (имя) диска

20 F1 F2 F3 F4 F5 F6 F7 F8 T1 T2 T3 LB PB RR RR     LABENAMETYP....
P1 P2 P3 P4 P5 P6 P7 P8 D1 D1 D1 D1 D2 D2 D2 D2    ................

20h - Идентификатор записи метки диска
F1-F8, T1-T3 - Имя метки, 7-бит ASCII
LB - Байт метки. Бит 0 установлен => Метка включена
                 Бит 4 установлен => Сохранять время создания файлов  --+   Эти два бита
                 Бит 5 установлен => Сохранять время изменения файлов   +-- взаимо-
                 Бит 6 установлен => Сохранять время доступа к файлам --+   исключающие
                 Бит 7 установлен => Защита паролем включена
PB - Используется для декодирования пароля метки
RR - Зарезервированно, устанавливается в 0.
P1-P8 - пароль, слабо зашифрован.
D1 - Время создания метки
D2 - Время изменения метки

Даты файлов

Если хранение дат включено, каждая четвертая запись директории содержит даты для предыдущих трех записей:

21 D1 D1 D1 D1 D2 D2 D2 D2 M1 00 D3 D3 D3 D3 D4    !...............
D4 D4 D4 M2 00 D5 D5 D5 D5 D6 D6 D6 D6 M3 00 00    ................

21h - Идентификатор записи даты.
D1  - Дата/время создания или доступа для первого файла
D2  - Дата/время изменения первого файла
D3  - Дата/время создания или доступа для второго файла
D4  - Дата/время изменения второго файла
D5  - Дата/время создания или доступа для третьего файла
D6  - Дата/время изменения третьего файла
M1  - Режим пароля для первого файла
M2  - Режим пароля для второго файла
M3  - Режим пароля для третьего файла
00  - Зарезервировано.

Формат хранения Даты/времени:

        DW      день    ;Юлианская дата, младший байт хранится первым.
                        ;1 день = 1 января 1978.
        DB      hour    ;Часы в BCD формате (двоично-десятичный код), т.о. 13h => 13:xx
        DB      min     ;Минуты в BCD формате

Защита паролем

1U F1 F2 F3 F4 F5 F6 F7 F8 T1 T2 T3 PM PB RR RR   .FILENAMETYP....
P1 P2 P3 P4 P5 P6 P7 P8 RR RR RR RR RR RR RR RR   ................

1U = 16+Номер области пользователя (т.е. 16-31). Где номер области пользователя - номер
    области пользователя файла, к которому относится пароль.
F1-F8 - Имя файла, к которому относится пароль.
T1-T3 - Тип файла, к которому относится пароль.
PM    - Байт режима пароля
         Бит 7 установлен => Пароль требуется для чтения из файла
         Бит 7 установлен => Пароль требуется для записи в файл
         Бит 5 установлен => Пароль требуется для удаления файла
PB    - Используется для декодирования пароля
P1-P8 - пароль, слабо зашифрован.
RR    - Зарезервированно, устанавливается в 0.

Система шифрования пароля

Система экстремально проста:

  • При сохранении пароля. Все 8 байт пароля складываются вместе (включая пробелы, если таковые присутствуют). Результат помещается в PB (декодирующий байт). Затем каждый байт пароля XOR-ится с PB и сохраняется задом наперед в директории (то есть последний байт помещается в P1).
  • При декодировании пароля. 8 байт пароля XOR-ятся с PB и читаются в обратном порядке.

От переводчика

Данный перевод ни в коем случае не претендует на то, чтобы считаться абсолютно точным и безошибочным. В случае, если Вами будут найдены какие-то ошибки или неточности, просьба написать мне: era_cg@speccy.su

Black Cat / Era CG
3o.o9.2o15