-\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