#pragma once

#include "resource.h"

#define SECTOR_SIZEB 512
#define SECTOR_SIZEW 256

//это сектор. чтобы удобнее было делать одновременно байтовый и словный доступ
typedef union
{
	BYTE b[SECTOR_SIZEB];
	WORD w[SECTOR_SIZEW];
} USector;

//структура параметров образа
struct IMGFormat
{
	BOOL bHDI;  //признак образа в формате HDI
	BOOL bSamara; //флаг формата самара
	int nLogDiskNum; //количество разделов
	WORD C; //геометрия: количество дорожек
	WORD H; //геометрия: количество головок
	WORD S; //геометрия: количество секторов на дорожке
	WORD nCyl;  //текущий номер дорожки при формировании образа
	WORD nHead; //текущий номер головки при формировании образа
	WORD nSector;   //текущий номер сектора при формировании образа
	IMGFormat()
	{
		this->bHDI = FALSE;
		this->bSamara = FALSE;
		this->nLogDiskNum = 0;
		this->C = 0;
		this->H = 0;
		this->S = 0;
		this->nCyl = 0;
		this->nHead = 0;
		this->nSector = 0;
	}
	IMGFormat(const IMGFormat *src)
	{
		this->bHDI = src->bHDI;
		this->bSamara = src->bSamara;
		this->nLogDiskNum = src->nLogDiskNum;
		this->C = src->C;
		this->H = src->H;
		this->S = src->S;
		this->nCyl = src->nCyl;
		this->nHead = src->nHead;
		this->nSector = src->nSector;
	}
	IMGFormat &operator = (const IMGFormat &src)
	{
		this->bHDI = src.bHDI;
		this->bSamara = src.bSamara;
		this->nLogDiskNum = src.nLogDiskNum;
		this->C = src.C;
		this->H = src.H;
		this->S = src.S;
		this->nCyl = src.nCyl;
		this->nHead = src.nHead;
		this->nSector = src.nSector;
		return *this;
	}
};

//структура опций
struct ProrgamOptions
{
	BOOL bAltPro; //флаг альтпро
	BOOL bSamara; //флаг самара
	BOOL bCreate; //TRUE - создание образа, FALSE - разбор
	BOOL bHDI;  //флаг создания образа в формате HDI
	WORD C; //геометрия: количество дорожек создаваемого образа
	WORD H; //геометрия: количество головок создаваемого образа
	WORD S; //геометрия: количество секторов на дорожке создаваемого образа
	CString strPath; //путь куда сохранять образы разделов, или где искать их при сборке
	CString strAppPath; //текущий путь, откуда запустили прогу
	CString strImgName; //задаваемое имя образа.
	ProrgamOptions()
	{
		bAltPro = TRUE;
		bSamara = bHDI = bCreate = FALSE;
		C = 80;
		H = 4;
		S = 24;
		strPath.Empty();
		strAppPath.Empty();
		strImgName.Empty();
	}
};

//константы для доступа к данным таблицы разделов АльтПро

//номер блока, где находится таблица разделов АльтПро
#define AHDD_PT_SEC 7
#define AHDD_PART_W 251
#define AHDD_LOGD_W 252
#define AHDD_SEC_W  253
#define AHDD_HEAD_W 254
#define AHDD_CYL_W  255

#define AHDD_PART_B 0766
#define AHDD_LOGD_B 0770
#define AHDD_UNI_B  0771
#define AHDD_SEC_B  0772
#define AHDD_HEAD_B 0774
#define AHDD_DRV_B  0775
#define AHDD_CYL_B  0776

//константы для доступа к данным таблицы разделов Самара

//номер блока, где находится таблица разделов Самара
#define SHDD_PT_SEC     1

#define SHDD_BOOT_W     0
#define SHDD_CYL_W      1
#define SHDD_HEAD_SEC_W 2
#define SHDD_PART_W     3

#define SHDD_BOOT_B     0
#define SHDD_CYL_B      2
#define SHDD_HEAD_B     4
#define SHDD_SEC_B      5
#define SHDD_PART_B     6

//константы для доступа к данным начального блока раздела Самара
#define SHDD_NLD_W      0
#define SHDD_LD_LEN_W   1
#define SHDD_ADR_BOOT_W 2
#define SHHD_ADR_PAR_W  3
#define SHDD_PAGE_W     4



void Usage();

BOOL AnalyseImage(FILE *f);
BOOL AssemblyImage(FILE *f, IMGFormat *imgf);

BOOL CheckFormat(FILE *f, IMGFormat *imgf);
BOOL CheckAltPro(FILE *f, IMGFormat *imgf);
BOOL CheckSamara(FILE *f, IMGFormat *imgf);

void InverseSector(USector &sector);
void MakeOutDir(BOOL bChangeOnly = FALSE);
BOOL ReadLogDiskImage(FILE *f, IMGFormat *imgf, CString &strName);
BOOL WriteLogDiskImage(FILE *f, int nld, int nLen);
BOOL WriteEmptySectors(FILE *f, IMGFormat *imgf, int nWriteNum = 0);
void WriteEmptyTail(FILE *f, IMGFormat *imgf);

BOOL SplitAltPro(FILE *f, IMGFormat *imgf);
BOOL SplitSamara(FILE *f, IMGFormat *imgf);

BOOL AssemblyAltPro(FILE *f, IMGFormat *imgf);
BOOL AssemblySamara(FILE *f, IMGFormat *imgf);
