4 IO_FloppyDisk *FloppyDisk_Initialize(void *img)
\r
8 fd = (IO_FloppyDisk *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FLOPPYDISK);
\r
11 fd->files = (IO_FloppyDisk_DirectoryEntry *)(fd->img + FLOPPYDISK_RDE_OFFSET);
\r
12 fd->userdataarea = (sector *)(fd->img + FLOPPYDISK_RDE_OFFSET + sizeof(IO_FloppyDisk_DirectoryEntry) * FLOPPYDISK_RDE_ENTRIES);
\r
14 fd->fat = System_Memory_Allocate(FLOPPYDISK_SECTORS * sizeof(ushort));
\r
15 FloppyDisk_Decode_FAT16(fd, False);
\r
20 uint FloppyDisk_Decode_FAT16(IO_FloppyDisk *fd, bool backup)
\r
30 if(fd->img == Null){
\r
33 if(fd->fat == Null){
\r
38 fatimg = fd->img + FLOPPYDISK_FAT1_OFFSET;
\r
40 fatimg = fd->img + FLOPPYDISK_FAT0_OFFSET;
\r
43 for(i = 0; i < 2880; i += 2){
\r
44 fd->fat[i + 0] = (fatimg[(i >> 1) * 3 + 0] | fatimg[(i >> 1) * 3 + 1] << 8) & 0xfff;
\r
45 fd->fat[i + 1] = (fatimg[(i >> 1) * 3 + 1] >> 4 | fatimg[(i >> 1) * 3 + 2] << 4) & 0xfff;
\r
50 bool FloppyDisk_IsPathExist(IO_FloppyDisk *fd, const uchar path[])
\r
56 if(FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path) != Null){
\r
63 uint FloppyDisk_LoadFile(IO_FloppyDisk *fd, IO_File *file, const uchar path[])
\r
65 IO_FloppyDisk_DirectoryEntry *dir_entry;
\r
72 if(fd->fat == Null){
\r
78 if(!file->flags.bit.initialized){
\r
82 dir_entry = FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path);
\r
84 if(dir_entry == Null){
\r
88 for(i = 0; i < FILE_PATH_LENGTH_MAX; i++){
\r
89 if(path[i] == 0x00){
\r
94 file->path = System_Memory_Allocate(i + 1);
\r
95 CFunction_MemoryMove(file->path, i + 1, path, i);
\r
96 file->path[i] = 0x00;
\r
98 file->img = System_Memory_Allocate(dir_entry->size);
\r
99 file->size = dir_entry->size;
\r
101 now_cluster = dir_entry->cluster;
\r
102 now_size = dir_entry->size;
\r
105 if(now_size <= 512){
\r
106 CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], now_size);
\r
109 CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], sizeof(sector));
\r
110 now_size -= sizeof(sector);
\r
111 now_cluster = fd->fat[now_cluster];
\r
114 file->flags.bit.img_loaded = True;
\r
119 IO_FloppyDisk_DirectoryEntry *FloppyDisk_Internal_GetDirectoryEntryFromPath(IO_FloppyDisk *fd, const uchar path[])
\r
121 uchar filename[11];
\r
123 IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;
\r
129 for(i = 0; i < 11; i++){
\r
134 for(i = 0; i < 11; i++){
\r
138 if(path[i] == 0x00){
\r
141 if(path[i] == '.'){
\r
144 filename[j] = path[i];
\r
145 if('a' <= filename[j] && filename[j] <= 'z'){
\r
146 filename[j] -= 0x20;
\r
152 for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){
\r
153 if(fd->files[i].name[0] == 0x00){
\r
156 rdeattr.attribute = fd->files[i].attribute;
\r
157 if(fd->files[i].name[0] != 0xe5 && fd->files[i].name[0] != 0x05 && !rdeattr.bit.volumelabel && !rdeattr.bit.directory){
\r
158 if(CFunction_CompareStrings_n(fd->files[i].name, filename, 11)){
\r
159 return &fd->files[i];
\r