OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / floppy.c
1 \r
2 #include "core.h"\r
3 \r
4 IO_FloppyDisk *FloppyDisk_Initialize(void *img)\r
5 {\r
6         IO_FloppyDisk *fd;\r
7 \r
8         fd = (IO_FloppyDisk *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FLOPPYDISK);\r
9 \r
10         fd->img = img;\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
13 //fat16\r
14         fd->fat = System_Memory_Allocate(FLOPPYDISK_SECTORS * sizeof(ushort));\r
15         FloppyDisk_Decode_FAT16(fd, False);\r
16 \r
17         return fd;\r
18 }\r
19 \r
20 uint FloppyDisk_Decode_FAT16(IO_FloppyDisk *fd, bool backup)\r
21 {\r
22         uint i;\r
23         uchar *fatimg;\r
24 \r
25         i = 0;\r
26 \r
27         if(fd == Null){\r
28                 return 1;\r
29         }\r
30         if(fd->img == Null){\r
31                 return 2;\r
32         }\r
33         if(fd->fat == Null){\r
34                 return 3;\r
35         }\r
36 \r
37         if(backup){\r
38                 fatimg = fd->img + FLOPPYDISK_FAT1_OFFSET;\r
39         } else{\r
40                 fatimg = fd->img + FLOPPYDISK_FAT0_OFFSET;\r
41         }\r
42 \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
46         }\r
47         return 0;\r
48 }\r
49 \r
50 bool FloppyDisk_IsPathExist(IO_FloppyDisk *fd, const uchar path[])\r
51 {\r
52         if(fd == Null){\r
53                 return False;\r
54         }\r
55 \r
56         if(FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path) != Null){\r
57                 return True;\r
58         }\r
59 \r
60         return False;\r
61 }\r
62 \r
63 uint FloppyDisk_LoadFile(IO_FloppyDisk *fd, IO_File *file, const uchar path[])\r
64 {\r
65         IO_FloppyDisk_DirectoryEntry *dir_entry;\r
66         uint i, now_size;\r
67         ushort now_cluster;\r
68 \r
69         if(fd == Null){\r
70                 return 1;\r
71         }\r
72         if(fd->fat == Null){\r
73                 return 2;\r
74         }\r
75         if(file == Null){\r
76                 return 3;\r
77         }\r
78         if(!file->flags.bit.initialized){\r
79                 return 4;\r
80         }\r
81 \r
82         dir_entry = FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path);\r
83 \r
84         if(dir_entry == Null){\r
85                 return 5;\r
86         }\r
87 \r
88         for(i = 0; i < FILE_PATH_LENGTH_MAX; i++){\r
89                 if(path[i] == 0x00){\r
90                         break;\r
91                 }\r
92         }\r
93 \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
97 \r
98         file->img = System_Memory_Allocate(dir_entry->size);\r
99         file->size = dir_entry->size;\r
100 \r
101         now_cluster = dir_entry->cluster;\r
102         now_size = dir_entry->size;\r
103 \r
104         for(i = 0; ; i++){\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
107                         break;\r
108                 }\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
112         }\r
113 \r
114         file->flags.bit.img_loaded = True;\r
115 \r
116         return 0;\r
117 }\r
118 \r
119 IO_FloppyDisk_DirectoryEntry *FloppyDisk_Internal_GetDirectoryEntryFromPath(IO_FloppyDisk *fd, const uchar path[])\r
120 {\r
121         uchar filename[11];\r
122         uint i, j;\r
123         IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;\r
124 \r
125         if(fd == Null){\r
126                 return Null;\r
127         }\r
128 \r
129         for(i = 0; i < 11; i++){\r
130                 filename[i] = ' ';\r
131         }\r
132 \r
133         j = 0;\r
134         for(i = 0; i < 11; i++){\r
135                 if(j >= 11){\r
136                         break;\r
137                 }\r
138                 if(path[i] == 0x00){\r
139                         break;\r
140                 }\r
141                 if(path[i] == '.'){\r
142                         j = 8;\r
143                 } else{\r
144                         filename[j] = path[i];\r
145                         if('a' <= filename[j] && filename[j] <= 'z'){\r
146                                 filename[j] -= 0x20;\r
147                         }\r
148                         j++;\r
149                 }\r
150         }\r
151 \r
152         for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){\r
153                 if(fd->files[i].name[0] == 0x00){\r
154                         break;\r
155                 }\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
160                         }\r
161                 }\r
162         }\r
163         return Null;\r
164 }\r
165 \r