#pragma once
#include "bkdimage.h"
#include "BKDRT11Header.h"

#pragma pack(push)
#pragma pack(1)
struct RT11FileRecord
{
	uint8_t FileClass; //класс файла?
	uint8_t status;    //атрибуты
	uint16_t name[2];   //имя в коде RADIX-50
	uint16_t ext;       //расширение в коде RADIX-50
	uint16_t blk_size;  //размер файла в блоках
	uint8_t chan_num;  //номер канала
	uint8_t task_num;  //номер задания
	uint16_t date;      //дата создания файла

	RT11FileRecord()
	{
		memset(this, 0, sizeof(RT11FileRecord));
	}
	RT11FileRecord &operator = (const RT11FileRecord &src)
	{
		memcpy(this, &src, sizeof(RT11FileRecord));
		return *this;
	}
	RT11FileRecord &operator = (const RT11FileRecord *src)
	{
		memcpy(this, src, sizeof(RT11FileRecord));
		return *this;
	}
};
#pragma pack(pop)

class CBKDRT11 :
	public CBKDImage
{
		static const TCHAR RADIX50[050];

	protected:
		CString DecodeRadix50(uint16_t *buf, int len);

	public:
		CBKDRT11(const PARSE_RESULT &image);
		virtual ~CBKDRT11() override;

		virtual bool ReadCatalog() override;
		virtual bool ViewFile(FileRecord *sFile) override; //для РТ11 будет свой просмотрщик
		virtual CString GetSpecificData(uint32_t dd) override;
		virtual UINT HasSpecificData() const override
		{
			return IDS_LC_SPECIFIC_RT11_HDR;
		}
};

/*
0-й блок - ЗАГОЛОВОК ТОМА
    Заголовок тома располагается в нулевом блоке и начинается с кода 000240.
В случае отсутствия этого кода аппаратный загрузчик будет пытаться прочитать
этот том снова. В заголовке тома располагается первичный загрузчик, который
знает где находится основной загрузчик системы и как работать со своим
устройством. Вся его задача сводится к загрузке основного загрузчика системы.
В RT-11 основной загрузчик располагается в блоках со 2-го по 5-й включительно.
Если том не системный и загрузка, как операция, не определена, то в нулевом
блоке вместо загрузчика располагается программа вывода на терминал сообщения:
BOOT NO VOLUME — загрузчика нет на томе. Содержимое блоков 2-го 5-й в таком
случае не определено.
    Нулевой блок системного тома содержит начальный загрузчик системы,
который копируется в него из последнего блока драйвера системного устройства.

1-й блок - ИДЕНТИФИКАТОР ТОМА
    Располагается в первом блоке и содержит: количество сегментов каталога;
номер блока, с которого начинается каталог; версию системы в коде RADIX-50,
которая инициализировала каталог; идентификатор тома и имя владельца,
введённые оператором при инициализации каталога; название фирмы-разработчика
и название операционной системы.

смещение длина  значение
----------------------------------
0       ---     место, где фиксируются ошибки
0722    2       Pack cluster size (что такое - нигде не поясняется)
0724    2       блок начала каталога
0726    2       версия ОС в коде RADIX-50
0730    12.     идентификатор тома
0744    12.     имя владельца
0760    12.     идентификатор системы

2-й блок - ОСНОВНОЙ ЗАГРУЗЧИК МОНИТОРА
    Со 2-го по 5-й блок идёт загрузчик монитора, служит для первоначальной
или повторной загрузки операционной системы. Он кроме загрузки тестирует
аппаратную и программную части системы и выполняет другие подготовительные
операции, необходимые для работы монитора. Этот загрузчик переписывается из
1-4-го блоков файла монитора.

6-й блок - КАТАЛОГ ТОМА, размер каталога N*2+5, где N - число сегментов в каталоге
которое устанавливается при инициализации диска (допустимые значения 1..31,
по умолчанию - 4), длина сегмента - 2 сектора.

    Состоит из сегментов. размер сегмента 512. слов, т.е. 2 сектора.

Структура каталога

смещ.   длина   значение
----------------------------------
0       2       число сегментов, отведённых под каталог. Число сегментов
                задаётся по умолчанию (разное для различных устройств,
                в зависимости от объёма тома) или по указанию пользователя
                при инициализации каталога.
2       2       номер следующего сегмента каталога. Это слово является
                связующим между логически смежными сегментами каталога.
                В последнем используемом сегменте первое слово содержит нуль.
4       2       счётчик сегментов, имеющих записи. При открытии нового сегмента
                счётчик корректируется только в первом сегменте. В последующих
                сегментах содержимое этого слова не изменяется и равно нулю.
6       2       число дополнительных слов в записи о файле в каталоге.
                Может задаваться пользователем при инициализации каталога.
010     2       номер блока, с которого начинается самый первый файл,
                описанный в данном сегменте. Т.к. все файлы следуют друг за
                другом, и их размеры известны, то можно вычислить начальные
                блоки остальных файлов.
012     14.     запись о файле
.... и дальше записи о файлах, всего 72. записи в сегменте.
    Однако маркер конца сегмента имеет такой же формат, как и запись о файле.
Кроме того, сегмент должен заканчиваться записью о неиспользуемой области,
хотя бы и с нулевым размером. Итого в одном сегменте можно описать 70 файлов.
    В описании RT-11 v5 написано, что максимум - 69 файлов, а зарезервировано
3 записи - конец сегмента, запись о неиспользуемой области и ещё одна зарезервированная
запись, используемая при создании временных файлов.
    В ОСБК сегмент заполняется под завязку, все 72 записи. Так что всё таки расчёт
не ясно как делать.

    А теперь давай разбираться дальше. Допустим, что у нас есть 200 файлов
по два блока, и взяли мы для каталога 3 сегмента. И записывали файлы подряд
без промежутков. А потом понадобилось удалить файл размером 2 блока,
записанный в первом сегменте, и вместо него записать два файла по одному
блоку. А место для записи освободилось только одно. Вот и придумали
разработчики фирмы DEC полностью заполнять только последний сегмент в этой
цепочке. А предыдущие сегменты заполнять только наполовину, т.е. между
каждым файлом можно расположить ещё один файл, например неиспользуемый.
И тогда во всех сегментах, кроме последнего, может быть не более 36 записей
о постоянных файлах.
    Таким образом, при заполнении последнего сегмента открывается следующий,
и половина записей из предыдущего переписывается в него. Значит, для 200
файлов потребуется не три, а пять сегментов. Единственный случай, когда все
сегменты, имеющие записи, заполняются полностью, возникает при "сборке мусора",
т.е. если мы попросим систему собрать все свободные области в одну,
а заполненное файлами пространство сжать в начало тома.


формат записи
смещ.   длина   значение
----------------------------------
0       1       всегда 0
1       1       атрибуты
                001 0 бит   - временный
                002 1       - неиспользуемый
                004 2       - постоянный
                010 3       - маркер конца сегмента
                020 4
                040 5
                100 6
                200 7       - защищённый
2       6       имя файла в коде RADIX-50, 2 слова - имя, 1 слово - расширение
010     2       размер файла (в блоках?)
012     1       номер канала
013     1       номер задания
014     2       дата
                     xx xxxx xxxxx xxxxx
                     +| +--| +---| +---|- год, биты 0-4
                      |    |     -------- день, биты 5-9
                      |    -------------- месяц, биты 10-13
                      ------------------- эра, биты 14-15 для преодоления проблемы 2000
                      Вычисление года: биты (04-00) + 1972 + биты (15-14) * 32

Radix-50

Код трёхсимвольной последовательности рассчитывается по следующей формуле:

A = 1600. * код_левого_символа + 40. * код_среднего_символа + код_правого_символа


код символ  код символ  код символ  код символ  код символ
0   пробел  8   H       16  P       24  X       32  2
1   A       9   I       17  Q       25  Y       33  3
2   B       10  J       18  R       26  Z       34  4
3   C       11  K       19  S       27  $       35  5
4   D       12  L       20  T       28  .       36  6
5   E       13  M       21  U       29  резерв  37  7
6   F       14  N       22  V       30  0       38  8
7   G       15  O       23  W       31  1       39  9

Существуют логические диски, как опознать по атрибутам нет информации,
предположительно можно опознать по стандартному расширению .DSK

*/

