#include "sysincludes.h"
#include "old_dos.h"

static struct OldDos_t old_dos[]={
{   40,  9,  1, 4, 1, 2, 0xfc }, /*  180 KB */
{   40,  9,  2, 7, 2, 2, 0xfd }, /*  360 KB */
{   40,  8,  1, 4, 1, 1, 0xfe }, /*  160 KB */
{   40,  8,  2, 7, 2, 1, 0xff }, /*  320 KB */
{   80,  9,  2, 7, 2, 3, 0xf9 }, /*  720 KB */
{   80, 15,  2,14, 1, 7, 0xf9 }, /* 1200 KB */
{   80, 18,  2,14, 1, 9, 0xf0 }, /* 1440 KB */
{   80, 36,  2,15, 2, 9, 0xf0 }, /* 2880 KB */

/* Source: https://en.wikipedia.org/w/index.php?title=File_Allocation_Table&oldid=560606333#Exceptions : */
/* https://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html */
{   80,  8,  2, 7, 2, 2, 0xfb }, /* 640 KB */
{   80,  8,  1, 7, 2, 2, 0xfa }, /* 320 KB */
{   80,  9,  1, 7, 2, 2, 0xf8 }, /* 360 KB */
};

/**
 * Get Old Dos parameters for a filesystem of size KBytes (assuming
 * 512 byte sectors), i.e. number of sectors is double the size
 */
struct OldDos_t *getOldDosBySize(size_t size) {
	size_t i;
	size = size * 2;
	for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){
		if (old_dos[i].sectors *
		    old_dos[i].tracks *
		    old_dos[i].heads == size)
			return &old_dos[i];
	}
	return NULL;
}

struct OldDos_t *getOldDosByMedia(int media) {
	size_t i;
	for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){
		if (old_dos[i].media == media)
			return &old_dos[i];
	}
	fprintf(stderr, "Unknown media type %02x\n", media);
	return NULL;
}

struct OldDos_t *getOldDosByParams(unsigned int tracks,
				   unsigned int heads,
				   unsigned int sectors,
				   unsigned int dir_len,
				   unsigned int cluster_size) {
	size_t i;
	for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){
		if (sectors == old_dos[i].sectors &&
		    tracks == old_dos[i].tracks &&
		    heads == old_dos[i].heads &&
		    (dir_len == 0 || dir_len == old_dos[i].dir_len) &&
		    (cluster_size == 0 ||
		     cluster_size == old_dos[i].cluster_size)) {
			return &old_dos[i];
		}
	}
	return NULL;
}

int setDeviceFromOldDos(int media, struct device *dev) {
	struct OldDos_t *params=getOldDosByMedia(media);
	if(params == NULL)
		return -1;
	dev->heads = params->heads;
	dev->tracks = params->tracks;
	dev->sectors = params->sectors;
	dev->ssize = 0x80;
	dev->use_2m = ~1u;
	return 0;
}
