FIL header:
tTSData = Array[3..$B] of Byte; // Байты из первого TSL с $3 по $B включительно
tFILHeader = Record
AgatName : TAgatName; // 30 байт - имя файла в агатовской кодировке
TSData : TTSData; // Экстраданные из TSL
Ext : Byte; // Код типа файла из каталога (как есть, включая флаг защиты)
end;
Потому что мир так устроен :)
Авторов формата спросить сложно, они вне нашего доступа.
Предположительно, формат К был введён как формат бинарных данных для Программной Системы "Школьница".
Его вводили ради того, чтобы не путать с бейсик-совместимым B- форматом (K - от "Командный").
Поскольку очевидно, что проги под среду Бейсик / DOS 3.3 никак не будут работать под Школьницей (всё API другое, карты памяти другие и т.д.).
На первый взгляд логично.
На второй: не очень ясно как быть с бинарными дампами, например, картинок: образ видеопамяти под любой системой выглядел бы одинакого.
К тому же К-файлы под Школьницу практически отстутствовали. Штук 10, может быть, вспомню (КОПИТРЕК, ЧИТ_ЗАП.... кто больше ?).
Ну и ещё некоторое количество прог и их данных прям ровно заточенных под ДОК Школьницы (в ИКП эта же штука называется "Ассемблер"). Из того, что вспоминается сразу: какие-то из прог под звуковушку ЯЗС.
Это всё было в 80-е годы.
В 90-е, когда Кривцов пилил ИКП-Бейсик, он вкрутил туда поддержку чтения К- файлов. А Голов вкрутил чтение и запись в свою BTK.
И авторы ряда бейсико-программ (в основном, графредакторов) почему-то полюбили иногда сохранять картинки в К-формате. Получилось, что формат как бы Школьницы, но, численно, этих файлов было больше создано в других системах.
Зачем эти игры с TLS:
я предполагаю, что это была попытка чуть-чуть упростить код чтения/записи файла.
Когда вы читаете B-файл, вы читаете первый сектор, из него узнаёте адрес загрузки и потом, на этот адрес, вынуждены скопировать оставшиеся 252 байта. Сдвинуть указатель на 252 (не круглое число - фу!) и уже туда можно читать целиком сектор 2 и 3 и дальше.
С К- файлам чуть проще: вы читаете TLS (точнее, он уже в памяти, когда нашёлся файл), из него уже знаете адрес загрузки и напрямую даёте драйверу дисковода команду: читать первый сектор файла (а потом и остальные) в заданный адрес. Фактически, ДОС Школьницы не умел читать B- файлы и вообще файлы сложной структуры. Там всего два режима: либо весь файл целиком в заданный адрес либо по одному байту за операцию в любое место (a'la getc()).
Скорее всего ради этого возник такой "неправильный" формат.
Вполне возможно, что новосибирцы, когда рисовали Школьницу, вот этой структуры (из вашего сообщения выше) могли не знать. Интернета не было, были ли доступны любые книжки из-за рубежа (времена СССР) - ну то же вряд ли. А если и были: мало иметь к ним доступ, надо знать что искать. Если искать вообще хочется.
--
> Иначе есть риск, что какая нибудь Агатовская программа, типа копировщика, поймёт его неправильно.
Эта приписка на всякий случай. Т.е. для всех файлов, кроме K, если вы создаёте FIL, эту структуру нужно заполнять нулями.
На практике, бывали файлы-исключения, в основном созданные крупными агатовскими графредакторами - там могли быть какие-то свои байты (например, B- файл мог иметь нормальную структуру B- (с адресом загрузки и точным размером), но дублировать те же данные в TSL как К-).
Кроме того, редактор MouseGraf, для своих файлов типа .ФРГ ("фрагмент"), использовал этот регион для хранения размера изображения.
Т.е. если вы копируете файл, регион TSData должен просто копироваться.
Если создаёте новый : то либо нули либо вы точно знаете что туда писать в соответствии с форматом и назначением файла (форматов мало, так что файлы вполне могли иметь разные цели и особенности при совпадающих буквах типа файла).
Ещё замечание про копировщики: поздние агатовские копировщики файлов, вероятно, тоже просто переносили этот регион.
Но ранние семёрки продавались с программой FID, это эпловская прога, я предполагаю, что она не переносила TSL так буквально, как этого требует К-формат. Она работала через API dos3.3, а для dos3.3 TSL - это целиком служебная структура и программам она не была доступна через стандартные вызовы.
--
> К-файлы это файлы с типом $20?
Не совсем.
Тип файла (буква) определяется по наиболее старшему единичному биту после отбрасывания старшего бита.
Старший бит - флаг защиты файла (read only).
// Возвращает тип файла в виде символа
function fc_ftype (Ext: Byte): Char;
const at: Array[0..7] of char='TIABSПКД';
var n: Byte;
begin
Ext := Ext and $7F;
for n := 0 to 7 do if Ext = 0 then Exit(at[n]) else Ext := Ext shr 1;
end;
Т.е. если вам нужно создать К- файл - задаёте ему код типа $20.
Если парсите каталог, то пример кода выше.
Если хотите сравнить тип с известным, то как-то так:
Т.е. отбрасываете старший бит и все биты ниже самого левого единичного.
Это если строго по правилам.
Если не строго, то можно и просто сравнение.
Вроде бы исключений (например, кодов вроде $21) на практике не было.