OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / floppy.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/floppy.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/floppy.c
new file mode 100644 (file)
index 0000000..d0c2971
--- /dev/null
@@ -0,0 +1,165 @@
+\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