Muchos considerarán inútil, pero le puede ser útil a aquella gente que quiera conocer como trabaja el sistema de archivos FAT12. Esta herramienta, la programé para el Kernel que estoy desarrollando. Puedes hacer un bootloader (de 512 bytes) y esta herramienta se encarga de meterla en el sector 0 de la imagen. También permite crear imágenes de disquete sin bootloader, soporta los siguientes tipos: 2880KB, 1440 KB, 1200 KB, 720 KB, 360 KB, 320 KB, 180 KB, 160 KB.
Las imágenes generadas siguen el estándar de Microsoft y pueden ser abiertas por el Nero o el UltraISO.
El código es bastante interesante, está escrito en C, creo que está bastante bien.
Código
/* * addFileFAT12() * Add file to our FAT12_t structure */ int addFileFAT12(char * fileName, FAT12_t * fat12) { int result = 0; linked_list_t * l = NULL; directory_entry_t directoryEntry; if (fat12 == NULL) return FAT12_INVALID_FAT12_POINTER; if (fat12->active != 0) return FAT12_INACTIVE; result = getDirectoryEntry(fileName, fat12, &directoryEntry); if (result == DE_OK) { fat12->list.list = fat12->list.last; if (l == NULL) return FAT12_LINKED_LIST_MALLOC_ERR; if (fat12->list.list == NULL) fat12->list.list = l; else { fat12->list.list->next = l; fat12->list.list = fat12->list.list->next; } fat12->list.list->directoryEntry = directoryEntry; if (fat12->list.list->fileName == NULL) return FAT12_LINKED_LIST_FILENAME_MALLOC_ERR; //fat12->list.list->fileName = strdup(fileName); fat12->list.list->next = NULL; if (fat12->list.first == NULL) fat12->list.first = fat12->list.list; fat12->list.last = fat12->list.list; fat12->NumberOfFiles++; return FAT12_OK; } else return result; } ... while (fat12->list.list != NULL) { sectorsCount = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1; fat12->list.list->directoryEntry.StartingCluster = LBAAddress; printf("\nFile: %s, Size: %d bytes, Sectors count: %d, LBA Address: 0x%.4x", fat12->list.list->fileName, fat12->list.list->directoryEntry.FileSize, sectorsCount, LBAAddress); LBAAddress += sectorsCount; if (sectorsCountOfNextFile != -1) //Quiere decir que ya usamos un cluster sectorsCount--; sectorsCountOfNextFile = -1; fat12->list.list = fat12->list.list->next; //Preparamos el siguiente archivo while (sectorsCount > 0) { switch (sectorsCount) { case 1: sectorsCount = 0; fat_entry = 0x000FFF00; if (fat12->list.list != NULL) { sectorsCountOfNextFile = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1; if (sectorsCountOfNextFile == 1) fat_entry = 0xFFFFFF00; else fat_entry += (nextCluster + 1) << 20; } break; case 2: fat_entry = 0xFFF00000 + (nextCluster << 8); sectorsCount = 0; break; default: fat_entry = (unsigned long)((nextCluster + 1) << 20) + (nextCluster << 8); sectorsCount -= 2; break; } nextCluster+=2; *fatTable++ = (unsigned char)((fat_entry & 0x0000FF00) >> 8); *fatTable++ = (unsigned char)((fat_entry & 0x00FF0000) >> 16); *fatTable++ = (unsigned char)((fat_entry & 0xFF000000) >> 24); } }
Estoy haciendo más portable el código para que se pueda compilar en sistemas *nix, además, estoy escribiendo una buena documentación en español sobre el sistema de archivos FAT12.
https://sourceforge.net/projects/fat12maker/
Espero que os sea de utilidad
Saludos.