#include "sdcard.h"
#include "hal.h"
#include "memory.h"
long mega65_fat32_create_contiguous_file(char* name, long size, long root_dir_sector, long fat1_sector, long fat2_sector)
{
unsigned char i;
unsigned short offset;
unsigned short clusters;
unsigned long start_cluster = 0;
unsigned long next_cluster;
unsigned long contiguous_clusters = 0;
unsigned int fat_offset = 0;
int j;
clusters = size / 4096;
if (size & 4095)
clusters++;
for (fat_offset = 0; fat_offset <= (fat2_sector - fat1_sector); fat_offset++) {
mega65_sdcard_readsector(fat1_sector + fat_offset);
contiguous_clusters = 0;
start_cluster = 0;
for (j = 0; j < 512; j++)
if (sector_buffer[j])
break;
if (j != 512) {
continue;
}
for (offset = 0; offset < 512; offset += 4) {
next_cluster = sector_buffer[offset];
next_cluster |= ((long)sector_buffer[offset + 1] << 8L);
next_cluster |= ((long)sector_buffer[offset + 2] << 16L);
next_cluster |= ((long)sector_buffer[offset + 3] << 24L);
if (!next_cluster) {
if (!start_cluster) {
start_cluster = (offset / 4) + fat_offset * (512 / 4);
}
contiguous_clusters++;
if (contiguous_clusters == clusters) {
sector_buffer[offset + 0] = 0xff;
sector_buffer[offset + 1] = 0xff;
sector_buffer[offset + 2] = 0xff;
sector_buffer[offset + 3] = 0x0f;
break;
}
else {
uint32_t the_cluster = (fat_offset * (512 / 4) + (offset / 4)) + 1;
sector_buffer[offset + 0] = (the_cluster >> 0) & 0xff;
sector_buffer[offset + 1] = (the_cluster >> 8) & 0xff;
sector_buffer[offset + 2] = (the_cluster >> 16) & 0xff;
sector_buffer[offset + 3] = (the_cluster >> 24) & 0xff;
}
}
else {
if (start_cluster) {
break;
}
}
}
if (start_cluster && (contiguous_clusters == clusters))
break;
else {
}
}
if ((!start_cluster) || (contiguous_clusters != clusters)) {
return -1;
}
mega65_sdcard_writesector(fat1_sector + fat_offset);
mega65_sdcard_writesector(fat2_sector + fat_offset);
mega65_sdcard_readsector(root_dir_sector);
for (offset = 0; offset < 512; offset += 32) {
if (sector_buffer[offset] > ' ')
continue;
else
break;
}
if (offset == 512) {
return -1;
}
for (i = 0; i < 32; i++)
sector_buffer[offset + i] = 0x00;
for (i = 0; i < 12; i++)
sector_buffer[offset + i] = name[i];
sector_buffer[offset + 0x0b] = 0x20; sector_buffer[offset + 0x1A] = start_cluster;
sector_buffer[offset + 0x1B] = start_cluster >> 8;
sector_buffer[offset + 0x14] = start_cluster >> 16;
sector_buffer[offset + 0x15] = start_cluster >> 24;
sector_buffer[offset + 0x1C] = (size >> 0) & 0xff;
sector_buffer[offset + 0x1D] = (size >> 8L) & 0xff;
sector_buffer[offset + 0x1E] = (size >> 16L) & 0xff;
sector_buffer[offset + 0x1F] = (size >> 24l) & 0xff;
mega65_sdcard_writesector(root_dir_sector);
return root_dir_sector + (start_cluster - 2) * 8;
}