Ограничение на файловую систему вытекает из того, что в 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;
Вроде бы нигде не ошибся.