OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / file.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/file.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/file.c
new file mode 100644 (file)
index 0000000..7cb45a1
--- /dev/null
@@ -0,0 +1,87 @@
+\r
+#include "core.h"\r
+\r
+void decode_fat(ushort *fat, bool backup)\r
+{\r
+       int i, j = 0;\r
+       uchar *img;\r
+\r
+       if(backup)      img = (uchar *)ADR_DISKIMG + 0x00001400;\r
+       else            img = (uchar *)ADR_DISKIMG + 0x00000200;\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
+\r
+void load_file(uint finfo_no, uchar *buf)\r
+{\r
+       int i;\r
+       uchar *img;\r
+       uint size;\r
+       ushort clustno;\r
+\r
+       if(finfo_no > 224) return;\r
+\r
+       img = (uchar *)ADR_DISKIMG + 0x00003e00;\r
+       size = system.io.file.list[finfo_no].size;\r
+       clustno = system.io.file.list[finfo_no].clustno;\r
+\r
+\r
+       for(;;){\r
+               if(size <= 512){\r
+                       for(i = 0; i < size; i++){\r
+                               buf[i] = img[clustno * 512 + i];\r
+                       }\r
+                       break;\r
+               }\r
+               for(i = 0; i < 512; i++){\r
+                       buf[i] = img[clustno * 512 + i];\r
+               }\r
+               size -= 512;\r
+               buf += 512;\r
+               clustno = system.io.file.fat[clustno];\r
+               \r
+       }\r
+}\r
+\r
+uint search_file(char *name)\r
+{\r
+       int i, j;\r
+       uchar s[12];\r
+\r
+       for(j = 0; j < 11; j++){\r
+               s[j] = ' ';\r
+       }\r
+       j = 0;\r
+       for(i = 0; j < 11 && name[i] != 0x00; i++){\r
+               if(name[i] == '.' && j <= 8){\r
+                       j = 8;\r
+               } else{\r
+                       s[j] = name[i];\r
+                       if('a' <= s[j] && s[j] <= 'z'){\r
+                               s[j] -= 0x20;\r
+                       }\r
+                       j++;\r
+               }\r
+       }\r
+       for(i = 0; i < 224; ){\r
+               if(system.io.file.list[i].name[0] == 0x00) break;\r
+               if((system.io.file.list[i].type & 0x18) == 0){\r
+                       for(j = 0; j < 11; j++){\r
+                               if(system.io.file.list[i].name[j] != s[j]) goto next_file;\r
+                       }\r
+                       break; \r
+               }\r
+next_file:\r
+               i++;\r
+       }\r
+       if(i < 224 && system.io.file.list[i].name[0] != 0x00){\r
+               return i;\r
+       } else {\r
+               return 0xFFFFFFFF;\r
+       }\r
+}\r