Ограничение на файловую систему вытекает из того, что в CP/M 2.2 используется 16-битная арифметика для рассчёта номера записи файловой системы. Чтобы не путаться в понятиях:
запись = 128 байт = сектор в терминах биос CP/M
кластер = группа (в твох терминах) = блок
экстент = 128 записей = 16 Кб (у тебя совпадает с размером кластера, может отсюда и путаница)
модуль (тот самый S2) = 32 экстента
Давай логически прикинем, как преобразуется номер записи файла file_rec в номер дорожки track и номер сектора sector (большими буквами далее - значения из DPB):
Вроде бы нигде не ошибся.Код:blk_rec = file_rec & BLM; file_blk = file_rec >> BSH; file_ext = file_rec >> 7; // т.к. 1 экстент = 128 записей extent = file_ext & 1Fh; s2 = file_ext >> 5; get_dir_record(file_name, extent, s2); // у номера экстента игнорируются младшие биты, еденичные в EXM blk = dir.alloc[file_blk & 7]; // для случая с 16 однобайтовыми значениями берём нужную половину, в зависимости от младшего бита номера экстента record = (blk << BSH) | blk_rec; // тут у нас переполнение т.к. record 16-битная переменная record += DRM/4; sector = record % SPT; track = record / SPT + OFF;




Ответить с цитированием