#pragma once
#include "BKDImage.h"
#pragma pack(push)
#pragma pack(1)
struct MKDosFileRecord
{
	uint8_t status;    //статус файла, или номер директории для записи-директории
	uint8_t dir_num;   //номер директории, которой принадлежит запись
	uint8_t name[14];  //имя файла/каталога, если начинается с байта 0177 - это каталог.
	uint16_t start_blok;//начальный блок
	uint16_t len_blk;   //длина в блоках
	uint16_t address;   //стартовый адрес
	uint16_t length;    //длина
	MKDosFileRecord()
	{
		memset(this, 0, sizeof(MKDosFileRecord));
	}
	MKDosFileRecord &operator = (const MKDosFileRecord &src)
	{
		memcpy(this, &src, sizeof(MKDosFileRecord));
		return *this;
	}
	MKDosFileRecord &operator = (const MKDosFileRecord *src)
	{
		memcpy(this, src, sizeof(MKDosFileRecord));
		return *this;
	}
};
#pragma pack(pop)
/*
 Напоминание самому себе:
 Этот класс не наследуется от CBKDMikrodos потому, что всё равно функция чтения каталога
 тут другая, никаких преимуществ такое наследование не даёт, и не зачем это перепроверять.
 я уже пробовал.
*/
class CBKDMkdos : public CBKDImage
{
		uint8_t *m_pCatTbl;
		int m_nCatSize;     //размер области каталога, выровнено по секторам, включая служебную область
		int m_nMKCatSize;   //размер каталога в записях

		bool FindRecord(MKDosFileRecord *pCat, MKDosFileRecord &mFR, bool bFull, int &tc);
	public:
		CBKDMkdos(const PARSE_RESULT &image);
		virtual ~CBKDMkdos() override;

		virtual bool ReadCatalog() override;
		virtual FILESAVE_STATUS AddFile(const CString &str, int nDirBelong, bool bAddAsBin = false) override;
		virtual bool DeleteFile(FileRecord *sFile) override;
};

#define FMT_MKDOS_CAT_RECORD_NUMBER 030
#define FMT_MKDOS_TOTAL_FILES_USED_BLOCKS 032
#define FMT_MKDOS_DISK_SIZE 0466
#define FMT_MKDOS_FIRST_FILE_BLOCK 0470
#define FMT_MKDOS_CAT_BEGIN 0500
#define MKDOS_CAT_RECORD_SIZE 173

/*
формат каталога мкдос

формат нулевого блока

Адрес   Значение
------------------------------------------
030     Количество файлов в каталоге, включая записи директорий (Не записей!)
032     Суммарное количество блоков в файлах (Не записях!) каталога
0400    Метка принадлежности к формату Micro DOS (0123456)
0402    Метка формата каталога MK-DOS (051414)
0466    Размер диска в блоках, величина абсолютная для системы
        (в отличие от NORD, NORTON и т.п.) принимающая не два значения под
        40 или 80 дорожек, а скажем, если ваш дисковод понимает только 76
        дорожек, то в этой ячейке нужно указать соответствующее число блоков
        (это делается при инициализации)
0470    Номер блока первого файла
0500    Первая запись о файле

Формат записи о файле

Смещение Значение
---------------------------------------------
0       Статус файла (0 - обычный, 1 - защищён, 2 - логический диск,
        0200 - BAD файл, 0377 - удалён)
        причём сравнивать надо на == не бывает одновременно логический диск и защищён. и кстати,
        если там любое другое значение отличное от вышеперечисленных - то статус - обычный.
1       Номер подкаталога которому принадлежит запись (0 - корень)
2       Имя файла 14. символов
020     Номер блока
022     Длина в блоках
024     Адрес
026     Длина (остаток длины по модулю 0200000)

Если первый символ в имени файла имеет код 0177, то это подкаталог.
Тогда вместо статуса у него байтом указан номер этого подкаталога,
и все файлы (в т.ч. подкаталоги), имеющие эту цифру в ячейке номера
подкаталога, принадлежат этому подкаталогу.

в общем тут выяснилось, что у каталога есть явно задаваемый конец каталога.
это последняя запись с такими параметрами
статус файла == 0
номер подкаталога == 0
имя файла == 14. нулей
номер блока == номер первого свободного блока
длина в блоках == размер свободной области
адрес == 0
длина == 0

Эксперимент показал, что размер каталога MKDOS 0255(173.) записи, больше в него не лезет.
Причём при добавлении последней записи происходят какие-то глюки. Там признак конца каталога
уже не влезает, и на экран выводится мусор, а потом и в каталог захватывается мусор

*/
