--- /dev/null
+\r
+#include "core.h"\r
+\r
+IO_FloppyDisk *FloppyDisk_Initialize(void *img)\r
+{\r
+ IO_FloppyDisk *fd;\r
+\r
+ fd = (IO_FloppyDisk *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FLOPPYDISK);\r
+\r
+ fd->img = img;\r
+ fd->files = (IO_FloppyDisk_DirectoryEntry *)(fd->img + FLOPPYDISK_RDE_OFFSET);\r
+ fd->userdataarea = (sector *)(fd->img + FLOPPYDISK_RDE_OFFSET + sizeof(IO_FloppyDisk_DirectoryEntry) * FLOPPYDISK_RDE_ENTRIES);\r
+//fat16\r
+ fd->fat = System_Memory_Allocate(FLOPPYDISK_SECTORS * sizeof(ushort));\r
+ FloppyDisk_Decode_FAT16(fd, False);\r
+\r
+ return fd;\r
+}\r
+\r
+uint FloppyDisk_Decode_FAT16(IO_FloppyDisk *fd, bool backup)\r
+{\r
+ uint i;\r
+ uchar *fatimg;\r
+\r
+ i = 0;\r
+\r
+ if(fd == Null){\r
+ return 1;\r
+ }\r
+ if(fd->img == Null){\r
+ return 2;\r
+ }\r
+ if(fd->fat == Null){\r
+ return 3;\r
+ }\r
+\r
+ if(backup){\r
+ fatimg = fd->img + FLOPPYDISK_FAT1_OFFSET;\r
+ } else{\r
+ fatimg = fd->img + FLOPPYDISK_FAT0_OFFSET;\r
+ }\r
+\r
+ for(i = 0; i < 2880; i += 2){\r
+ fd->fat[i + 0] = (fatimg[(i >> 1) * 3 + 0] | fatimg[(i >> 1) * 3 + 1] << 8) & 0xfff;\r
+ fd->fat[i + 1] = (fatimg[(i >> 1) * 3 + 1] >> 4 | fatimg[(i >> 1) * 3 + 2] << 4) & 0xfff;\r
+ }\r
+ return 0;\r
+}\r
+\r
+bool FloppyDisk_IsPathExist(IO_FloppyDisk *fd, const uchar path[])\r
+{\r
+ if(fd == Null){\r
+ return False;\r
+ }\r
+\r
+ if(FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path) != Null){\r
+ return True;\r
+ }\r
+\r
+ return False;\r
+}\r
+\r
+uint FloppyDisk_LoadFile(IO_FloppyDisk *fd, IO_File *file, const uchar path[])\r
+{\r
+ IO_FloppyDisk_DirectoryEntry *dir_entry;\r
+ uint i, now_size;\r
+ ushort now_cluster;\r
+\r
+ if(fd == Null){\r
+ return 1;\r
+ }\r
+ if(fd->fat == Null){\r
+ return 2;\r
+ }\r
+ if(file == Null){\r
+ return 3;\r
+ }\r
+ if(!file->flags.bit.initialized){\r
+ return 4;\r
+ }\r
+\r
+ dir_entry = FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path);\r
+\r
+ if(dir_entry == Null){\r
+ return 5;\r
+ }\r
+\r
+ for(i = 0; i < FILE_PATH_LENGTH_MAX; i++){\r
+ if(path[i] == 0x00){\r
+ break;\r
+ }\r
+ }\r
+\r
+ file->path = System_Memory_Allocate(i + 1);\r
+ CFunction_MemoryMove(file->path, i + 1, path, i);\r
+ file->path[i] = 0x00;\r
+\r
+ file->img = System_Memory_Allocate(dir_entry->size);\r
+ file->size = dir_entry->size;\r
+\r
+ now_cluster = dir_entry->cluster;\r
+ now_size = dir_entry->size;\r
+\r
+ for(i = 0; ; i++){\r
+ if(now_size <= 512){\r
+ CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], now_size);\r
+ break;\r
+ }\r
+ CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], sizeof(sector));\r
+ now_size -= sizeof(sector);\r
+ now_cluster = fd->fat[now_cluster];\r
+ }\r
+\r
+ file->flags.bit.img_loaded = True;\r
+\r
+ return 0;\r
+}\r
+\r
+IO_FloppyDisk_DirectoryEntry *FloppyDisk_Internal_GetDirectoryEntryFromPath(IO_FloppyDisk *fd, const uchar path[])\r
+{\r
+ uchar filename[11];\r
+ uint i, j;\r
+ IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;\r
+\r
+ if(fd == Null){\r
+ return Null;\r
+ }\r
+\r
+ for(i = 0; i < 11; i++){\r
+ filename[i] = ' ';\r
+ }\r
+\r
+ j = 0;\r
+ for(i = 0; i < 11; i++){\r
+ if(j >= 11){\r
+ break;\r
+ }\r
+ if(path[i] == 0x00){\r
+ break;\r
+ }\r
+ if(path[i] == '.'){\r
+ j = 8;\r
+ } else{\r
+ filename[j] = path[i];\r
+ if('a' <= filename[j] && filename[j] <= 'z'){\r
+ filename[j] -= 0x20;\r
+ }\r
+ j++;\r
+ }\r
+ }\r
+\r
+ for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){\r
+ if(fd->files[i].name[0] == 0x00){\r
+ break;\r
+ }\r
+ rdeattr.attribute = fd->files[i].attribute;\r
+ if(fd->files[i].name[0] != 0xe5 && fd->files[i].name[0] != 0x05 && !rdeattr.bit.volumelabel && !rdeattr.bit.directory){\r
+ if(CFunction_CompareStrings_n(fd->files[i].name, filename, 11)){\r
+ return &fd->files[i];\r
+ }\r
+ }\r
+ }\r
+ return Null;\r
+}\r
+\r