#include "stdafx.h"
using namespace std;
#include "HDIStuff.h"
#include <codecvt>

static SYS_SECTOR g_sys_sector =
{
	0x045a, //0
	0,      //1
	0xc837, //2
	0,      //3
	0,      //4
	0,      //5
	0,      //6
	{0, 0, 0}, //7,8,9
	{0},    //10
	1,      //20
	1,      //21
	4,      //22
	{0},    //23
	{0},    //27
	0x8001, //47
	0,      //48
	0x200,  //49
	0x4000, //50
	{0},    //51
	0,      //57,58
	0,      //59
	0,      //60,61
	{0}     //62-255
};

wstring GenerateSerialNumber()
{
	// тут будет генерация серийного номера Серийный номер такого типа
	// BK-AAAADDDDDDDD, где A - буква, D - цифра.
	wstring strSerialNumber = L"BK-AAAADDDDDDDD";
	wchar_t ch;

	for (int i = 3; i < 7; ++i)
	{
		ch = L'A' + (wchar_t)((double)rand() / (RAND_MAX + 1) * (L'Z' - L'A'));
		strSerialNumber[i] = ch;
	}

	for (int i = 7; i < 15; ++i)
	{
		ch = L'0' + (wchar_t)((double)rand() / (RAND_MAX + 1) * (L'9' - L'0'));
		strSerialNumber[i] = ch;
	}

	return strSerialNumber;
}

//копирование строки в системный сектор.
void CopyString2Sys(uint8_t *dst, const wstring &str, size_t max_len)
{
	size_t sizeOfString = str.length();
	using convert_typeX = codecvt_utf8<wchar_t>;
	wstring_convert<convert_typeX, wchar_t> converterX;
	string lpszAscii = converterX.to_bytes(str);

	for (size_t i = 0; i < max_len; ++i)
	{
		dst[i] = (i < sizeOfString) ? lpszAscii[i] : ' ';
	}

	//а теперь по традиции переставим байты в словах
	for (size_t i = 0; i < max_len; i += 2)
	{
		swap(dst[i], dst[i + 1]);
	}
}

void CreateHDISector(IMGFormat *imgf, uint8_t *bufSector)
{
	SYS_SECTOR sector0;
	memcpy(&sector0, &g_sys_sector, sizeof(SYS_SECTOR));
	sector0.cylinders = imgf->C;
	sector0.heads = imgf->H;
	sector0.sectors = imgf->S;
	sector0.raw_bytes_per_sector = SECTOR_SIZEB;
	sector0.raw_bytes_per_track = SECTOR_SIZEB * imgf->S;
	int nTotalSectors = imgf->C * imgf->H * imgf->S; //произведение максимальных значений влазит в 32 бита
	sector0.total_used_sectors = nTotalSectors;
	sector0.capacity_in_sectors = nTotalSectors + 1;
	CopyString2Sys(sector0.serial_number, GenerateSerialNumber(), 20);
	CopyString2Sys(sector0.model_name, L"BKEMU HARD DRIVE IMAGE", 40);
	CopyString2Sys(sector0.fw_version, L"v1.0.0.0", 8);
	//сформируем контрольную сумму
	uint8_t cs = 0;
	auto *pSector0 = (uint8_t *)&sector0;
	pSector0[510] = 0xA5;

	for (int i = 0; i < 511; ++i)
	{
		cs += pSector0[i];
	}

	cs = -cs;
	pSector0[511] = cs;
	//возвращаем результат
	memcpy(bufSector, &sector0, SECTOR_SIZEB);
}
