#pragma once
#include "BKDImage.h"
#pragma pack(push)
#pragma pack(1)
struct AndosFileRecord
{
	uint8_t name[8];
	uint8_t ext[3];
	uint8_t attr;
	uint8_t reserved[8];
	uint8_t dir_num;
	uint8_t parent_dir_num;
	uint16_t address;
	uint16_t date;
	uint16_t first_cluster;
	uint32_t length;
	AndosFileRecord()
	{
		memset(this, 0, sizeof(AndosFileRecord));
	}
	AndosFileRecord &operator = (const AndosFileRecord &src)
	{
		memcpy(this, &src, sizeof(AndosFileRecord));
		return *this;
	}
	AndosFileRecord &operator = (const AndosFileRecord *src)
	{
		memcpy(this, src, sizeof(AndosFileRecord));
		return *this;
	}
};
#pragma pack(pop)

class CBKDAndos : public CBKDImage
{
	protected:
		int         m_nSectorSize;      //Размер сектора в байтах
		int         m_nClusterSectors;  //Количество секторов в кластере
		int         m_nClusterSize;     //размер кластера в байтах
		int         m_nBootSectors;     //Число секторов в загрузчике
		int         m_nRootFilesNum;    //Максимальное число файлов в корневом каталоге
		int         m_nRootSize;        //размер корневого каталога в байтах
		int         m_nFatSectors;      //Число секторов в одной фат
		int         m_nFatSize;         //размер одной фат в байтах
		uint8_t        *m_pFatTbl;
		uint8_t        *m_pCatTbl;
		//вспомогательные переменные
		int         m_nRootSectorOffset;    //начало корневого каталога
		int         m_nDataSectorOffset;    //начало области данных
		//специально для вьювера, нужны переменные
		int         m_currFat;          //текущий номер кластера
		int         m_nLenClust;        //счётчик байтов в кластере, нужен чтоб узнавать, когда переходить к следующему кластеру.

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

		virtual bool ReadCatalog() override;
		virtual CString GetInfo() override;
		virtual bool ExtractFile(FileRecord *sFile, bool bExtractAsBin = false, bool bExtractLog = false) override;
		virtual FILESAVE_STATUS AddFile(const CString &str, int nDirBelong, bool bAddAsBin = false) override;
		virtual bool DeleteFile(FileRecord *sFile) override;
		virtual CString GetSpecificData(uint32_t dd) override;
		virtual UINT HasSpecificData() const override
		{
			return IDS_LC_SPECIFIC_ANDOS_HDR;
		}

	protected:
		int GetNextFat(int fat);
		bool SeekToCluster(CFile *f);
		int FindFreeFat(int fat);
		uint16_t SetFat(int fat, uint16_t val);
		bool FindRecord(AndosFileRecord *pCat, AndosFileRecord &aFR, bool bFull, int &tc);
		virtual int SeekToPos(CFile *f, int pos) override;
		virtual bool SeekToBeginFile(CFile *f, FileRecord *fr) override;
		virtual uint8_t GetByte(CFile *f, int *len) override;
		virtual uint16_t GetWord(CFile *f, int *len) override;
};

/*
Распределение дискового пространства

сектор  назначение
------------------------------
0       Загрузчик
1-2     Первая копия фат
3-4     Вторая копия фат
5-11.   Каталог (7 секторов, макс.112. записей)
12.-15. 2й кластер (4 сектора), и т.д.

все параметры можно узнать из BPB в нулевом секторе.

BPB андоса

смещение длина значение         назначение
-----------------------------------                           сист. не сист.
00       2      ***             Признак системной дискеты       0240   0753
02       2      ***             Команда перехода на загрузчик   0436   020220
04       7      "ANDOS  "       OEM ID (Название ОС)
013      2      512.            Число байт в секторе
015      1      4               Количество секторов в кластере
016      2      1               Число секторов в загрузчике
020      1      2               Число фат
021      2      112.            Максимальное число файлов в корневом каталоге
023      2      ***             Общее число блоков на диске
025      1      0371            Media descriptor
026      2      2               Число секторов в одной фат
030      2      10.             Число секторов на дорожке
032      2      ***             Число головок
034      15.    0               В андосе не используются
053      11.    "           "   Метка тома
066      8.     "FAT12   "      Идентификатор файловой системы
076      2      0               В андосе не используются

Формат каталога

Длина элемента каталога 32. байта, в одном секторе 16. элементов.

смещение длина назначение
-----------------------------------
0        8      Имя файла. Первый байт имени файла имеет спец. назначение:
    0 - элемент никогда не использовался,
    0345 - файл был удалён, любой другой символ - первая буква
           имени файла.
8        3      Расширение имени файла
11       1      Атрибуты файла (а андосе обычно не используются)
12       8      Зарезервировано
20       1      Признак подкаталога и одновременно его номер
21       1      Номер родительского подкаталога для каталога,
                номер каталога, которому принадлежит файл для файла
22       2      Адрес файла/имя диска для ссылки (в мс-дос - время)
24       2      Дата создания файла
26       2      Номер начального кластера. Первый кластер начинается с номера 2.
28       2      Длина файла
30       2      Расширение длины файла (для файлов больше 64 кбайт)

Подкаталог андос - фиктивная запись с нулевым адресом, длиной и начальным
кластером, в байте атрибута у них записана константа 010, из-за чего мс-дос
считает её меткой диска

Элементы фат
0 - пустой кластер
07777 - последний кластер файла
07760-07766 - зарезервировано
07767 - плохой кластер
всё остальное - занятый кластер, значение - номер, указывает на следующий кластер

Распаковка кластера.
взять слово по (Номер кластера * 3 / 2)
если номер кластера чётный - взять младшие 12 бит, иначе - старшие 12

Преобразование номера кластера в номер сектора
Сектор = (Кластер + 1) * 4
*/

