--- /dev/null
+\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