OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / file.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/file.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/file.c
new file mode 100644 (file)
index 0000000..23a09f3
--- /dev/null
@@ -0,0 +1,136 @@
+\r
+#include "core.h"\r
+\r
+IO_FloppyDisk *FloppyDisk_Initialise(void *img)\r
+{\r
+       IO_FloppyDisk *fd;\r
+\r
+       fd = MemoryBlock_Allocate_System(sizeof(IO_FloppyDisk));\r
+       MemoryBlock_Write_Description(fd, "IO_FloppyDisk");\r
+\r
+       fd->img = img;\r
+       fd->files = (IO_FloppyDisk_RootDirectoryEntry *)(fd->img + 0x002600);\r
+       fd->userdataarea = (sector *)(fd->img + 0x002600 + 32 * 224);\r
+\r
+       fd->fat = MemoryBlock_Allocate_System(2 * 2880);\r
+       MemoryBlock_Write_Description(fd->fat, "IO_FD_FAT");\r
+       FloppyDisk_Decode_FAT16(fd->img, fd->fat, false);\r
+\r
+       return fd;\r
+}\r
+\r
+int FloppyDisk_Search_File(IO_FloppyDisk *fd, const uchar *name)\r
+{\r
+       uint i, j;\r
+       uchar filename[11];\r
+\r
+       for(i = 0; i < 11; i++){\r
+               filename[i] = ' ';\r
+       }\r
+\r
+       j = 0;\r
+       for(i = 0; i < 11; ){\r
+               if(name[j] == 0x00){\r
+                       i++;\r
+               } else{\r
+                       if(name[j] == '.'){\r
+                               i = 8;\r
+                       } else{\r
+                               filename[i] = name[j];\r
+                               if('a' <= filename[i] && filename[i] <= 'z'){\r
+                                       filename[i] -= 0x20;\r
+                               }\r
+                               i++;\r
+                       }\r
+                       j++;\r
+               }\r
+       }\r
+\r
+       for(j = 0; j < 224; j++){\r
+               if(fd->files[j].name[0] == 0x00){\r
+                       break;\r
+               }\r
+               if(fd->files[j].name[0] != 0xe5){\r
+                       for(i = 0; i < 11; i++){\r
+                               if(filename[i] != fd->files[j].name[i]){\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if(i == 11){\r
+                               return j;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return -1;\r
+}\r
+\r
+int FloppyDisk_Load_File(IO_FloppyDisk *fd, IO_File *fileinfo, int fileno)\r
+{\r
+       uint i, j, now_cluster, now_size;\r
+\r
+       fileinfo->name[12] = 0x00;\r
+\r
+       if(fileno < 0 || 224 <= fileno){\r
+               return -1;\r
+       }\r
+\r
+       fileinfo->data = MemoryBlock_Allocate_System(fd->files[fileno].size);\r
+       fileinfo->size = fd->files[fileno].size;\r
+\r
+       sprintf(fileinfo->name, "FILENAME.EXT");\r
+       for(i = 0; i < 8; i++){\r
+               fileinfo->name[i] = fd->files[fileno].name[i];\r
+       }\r
+       for(i = 9; i < 12; i++){\r
+               fileinfo->name[i] = fd->files[fileno].name[i - 1];\r
+       }\r
+       MemoryBlock_Write_Description(fileinfo->data, fileinfo->name);\r
+\r
+       now_cluster = fd->files[fileno].cluster;\r
+       now_size = fileinfo->size;\r
+       for(j = 0; ; j++){\r
+               if(now_size <= 512){\r
+                       for(i = 0; i < now_size; i++){\r
+                               fileinfo->data[(j << 9) + i] = fd->userdataarea[now_cluster - 2][i];\r
+                       }\r
+                       break;\r
+               }\r
+               for(i = 0; i < 512; i++){\r
+                       fileinfo->data[(j << 9) + i] = fd->userdataarea[now_cluster - 2][i];\r
+               }\r
+               now_size -= 512;\r
+               now_cluster = ((ushort *)fd->fat)[now_cluster];\r
+       }\r
+\r
+       return i;\r
+}\r
+\r
+int File_Free(IO_File *fileinfo)\r
+{\r
+       uint i;\r
+\r
+       for(i = 0; i < 13; i++){\r
+               fileinfo->name[i] = 0x00;\r
+       }\r
+       fileinfo->size = 0;\r
+       return MemoryBlock_Free(fileinfo->data);\r
+}\r
+\r
+void FloppyDisk_Decode_FAT16(uchar *img, ushort *fat, bool backup)\r
+{\r
+       int i, j = 0;\r
+\r
+       if(backup){\r
+               img += 0x00001400;\r
+       } else{\r
+               img += 0x00000200;\r
+       }\r
+\r
+       for(i = 0; i < 2880; i += 2){\r
+               fat[i + 0] = (img[j + 0]        | img[j + 1] << 8) & 0xfff;\r
+               fat[i + 1] = (img[j + 1] >> 4   | img[j + 2] << 4) & 0xfff;\r
+               j += 3;\r
+       }\r
+       return;\r
+}\r