Skip to content

Latest commit

 

History

History
181 lines (141 loc) · 8.47 KB

diskdef.md

File metadata and controls

181 lines (141 loc) · 8.47 KB

(Машинный перевод)

Библиотека макросов DISKDEF значительно упрощает процесс построения таблицы. Конечно, для использования DISKDEF вам необходимо иметь доступ к макроассемблеру MAC, в то время как библиотека макросов включена во все дистрибутивные диски CP/M 2.

Определение диска BIOS состоит из следующей последовательности макрокоманд:

    MACLIB diskdef

    DISKS n
    DISKDEF 0,. . .
    DISKDEF 1,. . .
         .....
    DISKDEF n - 1
    ENDEF

где оператор MACLIB загружает файл DISKDEF.LIB на тот же диск, что и BIOS, во внутренние таблицы MAC. Далее следует макровызов DISKS, который указывает количество дисков, которые необходимо настроить в системе пользователя, где n — целое число в диапазоне от 1 до 16. Затем следует серия макровызовов DISKDEF, которые определяют характеристики каждого логического диска, от 0 до n - 1, соответствующие логическим дискам от A до P. Макросы DISKS и DISKDEF генерируют встроенные фиксированные таблицы данных, описанные в предыдущем разделе, и поэтому должны быть помещены в неисполняемую часть BIOS, обычно непосредственно после вектора перехода BIOS.

Оставшаяся часть BIOS определяется после макросов DISKDEF, с вызовом макроса ENDEF, непосредственно предшествующим оператору END. Макрос ENDEF (End of Diskdef) генерирует необходимые неинициализированные области RAM, которые располагаются в памяти выше BIOS.

Макрос-вызов DISKDEF имеет вид:

    DISKDEF dn,fsc,lsc,[skf],bls dks,dir,cks,ofs,[0]

где

dn — логический номер диска, от 0 до n - 1.
fsc — номер первого физического сектора (0 или 1).
lsc — номер последнего сектора.
skf — необязательный коэффициент перекоса сектора.
bls — размер блока распределения данных.
dks — количество блоков на диске.
dir — количество записей каталога.
cks — количество проверенных записей каталога.
ofs — смещение дорожки относительно логической дорожки 00.
[0] — необязательный флаг совместимости с версией 1.4.

Значение dn — это номер диска, определяемый с помощью этого вызова макроса DISKDEF. Параметр fsc учитывает различные системы нумерации секторов и обычно имеет значение от 0 до 1.

lsc — это последний пронумерованный сектор на дорожке. Если присутствует, параметр skf определяет фактор перекоса сектора, который используется для создания таблицы перевода сектора в соответствии с перекосом.

Если количество секторов меньше 256, создается однобайтовая таблица, в противном случае каждый элемент таблицы трансляции занимает два байта. Таблица трансляции не создается, если параметр skf опущен или равен 0.

Параметр bls указывает количество байтов, выделенных для каждого блока данных, и принимает значения 1024, 2048, 4096, 8192 или 16384. Как правило, производительность увеличивается с большими размерами блоков данных, поскольку меньше ссылок на каталоги, а логически связанные записи данных физически расположены близко на диске. Кроме того, каждая запись каталога адресует больше данных, и пространство ОЗУ BIOS-резидента уменьшается.

Параметр dks указывает общий размер диска в единицах bls. То есть, если bls = 2048 и dks = 1000, общий объем диска составляет 2 048 000 байт. Если dks больше 255, параметр размера блока bls должен быть больше 1024. Значение dir — это общее количество записей каталога, которое может превышать 255, если это необходимо.

Параметр cks определяет количество элементов каталога для проверки при каждом сканировании каталога и используется внутренне для обнаружения измененных дисков во время работы системы, где не произошел промежуточный холодный или теплый старт. При обнаружении такой ситуации CP/M автоматически помечает диск как Read-Only, чтобы данные впоследствии не были уничтожены.

Как указано в предыдущем разделе, значение cks = dir, когда носитель легко меняется, как в случае с подсистемой гибких дисков. Если диск постоянно смонтирован, значение cks обычно равно 0, поскольку вероятность смены дисков без перезапуска мала.

Значение ofs определяет количество дорожек, которые следует пропустить при обращении к данному диску, что может использоваться для резервирования дополнительного пространства операционной системы или для имитации нескольких логических дисков на одном физическом диске большой емкости. Наконец, параметр [0] включается, когда требуется совместимость файлов с версиями 1.4, которые были изменены для дисков с более высокой плотностью. Этот параметр гарантирует, что для каждой записи каталога выделяется только 16 КБ, как это было в предыдущих версиях. Обычно этот параметр не включается.

Для удобства и экономии табличного пространства используется специальная форма:

    DISKDEF i,j

дает диску i те же характеристики, что и ранее определенный диск j. Стандартная четырехдисковая система с одинарной плотностью, совместимая с версией 1.4, определяется с помощью следующих макровызовов:

    diska 4
    diskdef 0,1,26,6,1024,243,64,2
    diskdef 1,0
    diskdef 2,0
    diskdef 3,0
         ......
    endef

все диски имеют одинаковые значения параметров: 26 секторов на дорожку, пронумерованы от 1 до 26, между каждым доступом пропускается 6 секторов, 1024 байта на блок данных, 243 блока данных с общей емкостью диска 243 Кбайт, 64 проверенных записи каталогов и две дорожки операционной системы.

Макрос DISKS генерирует n DPHS, начиная с адреса таблицы DPH DPBASE, сгенерированного макросом. Каждый блок заголовка диска содержит шестнадцать байтов, как описано выше, и соответствует один к одному каждому из определенных дисков. Например, в стандартной системе с четырьмя дисками макрос DISKS генерирует таблицу вида:

    DPBASE EQU $
    DPE0: DW XLT0,0000H,0000H,0000H,DIRBUF,DPB0,CSV0,ALV0
    DPE1: DW XLT0,0000H,0000H,0000H,DIRBUF,DPB0,CSV1,ALV1
    DPE2: DW XLT0,0000H,0000H,0000H,DIRBUF,DPB0,CSV2,ALV2
    DPE3: DW XLT0,0000H,0000H,0000H,DIRBUF,DPB0,CSV3,ALV3

где метки DPH включены для справочных целей, чтобы показать начальные адреса таблицы для каждого диска от 0 до 3. Значения, содержащиеся в DPH, подробно описаны в предыдущем разделе. Адреса векторов проверки и выделения генерируются макросом ENDEF в области ОЗУ после кода BIOS и таблиц.

Обратите внимание, что если параметр skf (коэффициент перекоса) опущен или равен 0, таблица трансляции опущена, а значение 0000H вставлено в позицию XLT DPH для диска. При последующем вызове для выполнения логико-физической трансляции SECTRAN получает адрес таблицы трансляции DE = 0000H и просто возвращает исходный логический сектор из BC в паре регистров HL.

Таблица трансляции создается, когда присутствует параметр skf, и (ненулевой) адрес таблицы помещается в соответствующий DPHS. Например, следующее создается, когда в макровызове DISKDEF указан стандартный коэффициент перекоса skf = 6:

    XLT0: db 1,7,13,19,25,5,11,17,23,3,9,15,21
          db 2,8,14,20,26,6,12,18,24,4,10,16,22

После вызова макроса ENDEF определяется ряд неинициализированных областей данных. Эти области данных не обязательно должны быть частью BIOS, загружаемой при холодном старте, но должны быть доступны между BIOS и концом памяти. Размер неинициализированной области RAM определяется операторами EQU, сгенерированными макросом ENDEF. Для стандартной системы с четырьмя дисками макрос ENDEF может создать следующий оператор EQU:

    4C72 = BEGDAT EQU $ (области данных)
    4DB0 = ENDDAT EQU $
    013C = DATSIZ EQU $-BEGDAT

что указывает на то, что неинициализированная RAM начинается в месте 4C72H, заканчивается в 4DB0H-1 и занимает 013CH байт. Вы должны убедиться, что эти адреса свободны для использования после загрузки системы.

После модификации вы можете использовать программу STAT для проверки характеристик накопителя, поскольку STAT использует блок параметров диска для декодирования информации о накопителе. Команда STAT в форме:

    STAT d:dsk:

декодирует блок параметров диска для диска d (d = A,...,P) и отображает следующие значения:

    r: емкость записи 128 байт
    k: емкость диска в килобайтах
    d: 32-байтовые записи каталога
    c: проверенные записи каталога
    е: записи/объем
    б: записи/блок
    s: секторы/дорожка
    т: зарезервированные треки

Ниже показаны три примера вызовов макроса DISKDEF с соответствующими значениями параметров STAT. Последний пример создает полную 8-мегабайтную систему.

    diskdef 0,1,58,,2048,256,128,128,2
    г=4096, к=512, д=128, с=128, е=256, б=16, с=58, т=2

    diskdef 0,1,58,,2048,1024,300,0,2
    r=16348, k=2048, d=300, c=0, e=128, b=16, s=58, t=2

    diskdef 0,1,58,,16348,512,128,128,2
    r=65536, k=8192, d=128, c=128, e=1024, b=128, s=58, t=2