+++ /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