• R/O
  • SSH
  • HTTPS

chnosproject: コミット


コミットメタ情報

リビジョン328 (tree)
日時2012-08-06 01:59:45
作者hikarupsp

ログメッセージ

typeコマンドを追加。
フロッピーディスクイメージからのファイルの読み出しを実装。FAT対応済み。
textboxの出力ではキャリッジリターンを無視するようにした。

変更サマリ

差分

--- beta/tolset_chn_000/chnos_010/chnos/console.c (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/console.c (revision 328)
@@ -153,6 +153,8 @@
153153 Console_Command_dir(console);
154154 } else if(Console_CompareCommandline_n(console, "pci", 3)){
155155 Console_Command_pci(console);
156+ } else if(Console_CompareCommandline_n(console, "type", 4)){
157+ Console_Command_type(console);
156158 } else{
157159 TextBox_Put_String(console->textbox, "Console:There is no such file or command:");
158160 TextBox_Put_String(console->textbox, console->textbox->text_buf);
@@ -194,9 +196,9 @@
194196 uint Console_Command_dir(UI_Console *console)
195197 {
196198 uint i, j;
197- IO_FloppyDisk_RDE_UpdateTime rdetime;
198- IO_FloppyDisk_RDE_UpdateDate rdedate;
199- IO_FloppyDisk_RDE_Attribute rdeattr;
199+ IO_FloppyDisk_DirectoryEntry_UpdateTime rdetime;
200+ IO_FloppyDisk_DirectoryEntry_UpdateDate rdedate;
201+ IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;
200202
201203 for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){
202204 if(console->boot_fd->files[i].name[0] == 0x00){
@@ -228,7 +230,7 @@
228230 uint bus, device, function;
229231 uint data;
230232
231- TextBox_Put_String(console->textbox, "-<pci information>-");
233+ TextBox_Put_String(console->textbox, "-<pci information>-\n");
232234 if(CFunction_String_GetWord(console->textbox->text_buf, &p, 1)){
233235 if(CFunction_String_GetWord(console->textbox->text_buf, &p, 3)){
234236 function = strtol(p, Null, 0);
@@ -236,7 +238,7 @@
236238 device = strtol(p, Null, 0);
237239 CFunction_String_GetWord(console->textbox->text_buf, &p, 1);
238240 bus = strtol(p, Null, 0);
239- Console_printf(console, "\nBus%3d.Device%2d.Function%2d:\n", bus, device, function);
241+ Console_printf(console, "Bus%3d.Device%2d.Function%2d:\n", bus, device, function);
240242 if(bus < 256 && device < 32 && function < 8){
241243 PCI_ConfigurationRegister_SelectDevice(bus, device, function);
242244 data = PCI_ConfigurationRegister_Read32(0x00);
@@ -257,11 +259,9 @@
257259 } else{
258260 TextBox_Put_String(console->textbox, "Invalid Device.\n");
259261 }
260-
261-
262262 }
263263 } else{
264- TextBox_Put_String(console->textbox, "Usage:\n");
264+ TextBox_Put_String(console->textbox, "Usage:");
265265 TextBox_Put_String(console->textbox, "pci <bus> <device> <function>\n\nDevices which exist:\n");
266266 for(bus = 0; bus < 256; bus++){
267267 for(device = 0; device < 32; device++){
@@ -278,3 +278,35 @@
278278 return 0;
279279 }
280280
281+uint Console_Command_type(UI_Console *console)
282+{
283+ uchar *p;
284+ IO_File *file;
285+ uint i;
286+
287+ TextBox_Put_String(console->textbox, "-<type>-");
288+ if(CFunction_String_GetWord(console->textbox->text_buf, &p, 1)){
289+ if(FloppyDisk_IsPathExist(console->boot_fd, p)){
290+ TextBox_Put_String(console->textbox, ":");
291+ TextBox_Put_String(console->textbox, p);
292+ TextBox_Put_String(console->textbox, "\n");
293+ file = File_Initilaize();
294+ if(FloppyDisk_LoadFile(console->boot_fd, file, p) == 0){
295+ for(i = 0; i < file->size; i++){
296+ TextBox_Put_Character(console->textbox, ((uchar *)file->img)[i]);
297+ }
298+ } else{
299+ TextBox_Put_String(console->textbox, "type:File load Error.\n");
300+ }
301+ File_Free(file);
302+ } else{
303+ TextBox_Put_String(console->textbox, "\ntype:The path is not exist.\n");
304+ }
305+ } else{
306+ TextBox_Put_String(console->textbox, "\nUsage:");
307+ TextBox_Put_String(console->textbox, "type filepath\n");
308+ }
309+ return 0;
310+}
311+
312+
--- beta/tolset_chn_000/chnos_010/chnos/floppy.c (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/floppy.c (revision 328)
@@ -8,12 +8,158 @@
88 fd = (IO_FloppyDisk *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FLOPPYDISK);
99
1010 fd->img = img;
11- fd->files = (IO_FloppyDisk_RootDirectoryEntry *)(fd->img + FLOPPYDISK_RDE_OFFSET);
12- fd->userdataarea = (sector *)(fd->img + FLOPPYDISK_RDE_OFFSET + sizeof(IO_FloppyDisk_RootDirectoryEntry) * FLOPPYDISK_RDE_ENTRIES);
11+ fd->files = (IO_FloppyDisk_DirectoryEntry *)(fd->img + FLOPPYDISK_RDE_OFFSET);
12+ fd->userdataarea = (sector *)(fd->img + FLOPPYDISK_RDE_OFFSET + sizeof(IO_FloppyDisk_DirectoryEntry) * FLOPPYDISK_RDE_ENTRIES);
13+//fat16
14+ fd->fat = System_Memory_Allocate(FLOPPYDISK_SECTORS * sizeof(ushort));
15+ FloppyDisk_Decode_FAT16(fd, False);
1316
14-// fd->fat = MemoryBlock_Allocate_System(2 * 2880);
15-// MemoryBlock_Write_Description(fd->fat, "IO_FD_FAT");
16-// FloppyDisk_Decode_FAT16(fd->img, fd->fat, false);
17-
1817 return fd;
1918 }
19+
20+uint FloppyDisk_Decode_FAT16(IO_FloppyDisk *fd, bool backup)
21+{
22+ uint i;
23+ uchar *fatimg;
24+
25+ i = 0;
26+
27+ if(fd == Null){
28+ return 1;
29+ }
30+ if(fd->img == Null){
31+ return 2;
32+ }
33+ if(fd->fat == Null){
34+ return 3;
35+ }
36+
37+ if(backup){
38+ fatimg = fd->img + FLOPPYDISK_FAT1_OFFSET;
39+ } else{
40+ fatimg = fd->img + FLOPPYDISK_FAT0_OFFSET;
41+ }
42+
43+ for(i = 0; i < 2880; i += 2){
44+ fd->fat[i + 0] = (fatimg[(i >> 1) * 3 + 0] | fatimg[(i >> 1) * 3 + 1] << 8) & 0xfff;
45+ fd->fat[i + 1] = (fatimg[(i >> 1) * 3 + 1] >> 4 | fatimg[(i >> 1) * 3 + 2] << 4) & 0xfff;
46+ }
47+ return 0;
48+}
49+
50+bool FloppyDisk_IsPathExist(IO_FloppyDisk *fd, const uchar path[])
51+{
52+ if(fd == Null){
53+ return False;
54+ }
55+
56+ if(FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path) != Null){
57+ return True;
58+ }
59+
60+ return False;
61+}
62+
63+uint FloppyDisk_LoadFile(IO_FloppyDisk *fd, IO_File *file, const uchar path[])
64+{
65+ IO_FloppyDisk_DirectoryEntry *dir_entry;
66+ uint i, now_size;
67+ ushort now_cluster;
68+
69+ if(fd == Null){
70+ return 1;
71+ }
72+ if(fd->fat == Null){
73+ return 2;
74+ }
75+ if(file == Null){
76+ return 3;
77+ }
78+ if(!file->flags.bit.initialized){
79+ return 4;
80+ }
81+
82+ dir_entry = FloppyDisk_Internal_GetDirectoryEntryFromPath(fd, path);
83+
84+ if(dir_entry == Null){
85+ return 5;
86+ }
87+
88+ for(i = 0; i < FILE_PATH_LENGTH_MAX; i++){
89+ if(path[i] == 0x00){
90+ break;
91+ }
92+ }
93+
94+ file->path = System_Memory_Allocate(i + 1);
95+ CFunction_MemoryMove(file->path, i + 1, path, i);
96+ file->path[i] = 0x00;
97+
98+ file->img = System_Memory_Allocate(dir_entry->size);
99+ file->size = dir_entry->size;
100+
101+ now_cluster = dir_entry->cluster;
102+ now_size = dir_entry->size;
103+
104+ for(i = 0; ; i++){
105+ if(now_size <= 512){
106+ CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], now_size);
107+ break;
108+ }
109+ CFunction_MemoryMove(&((uchar *)file->img)[i * sizeof(sector)], file->size - (i * sizeof(sector)), &fd->userdataarea[now_cluster - 2], sizeof(sector));
110+ now_size -= sizeof(sector);
111+ now_cluster = fd->fat[now_cluster];
112+ }
113+
114+ file->flags.bit.img_loaded = True;
115+
116+ return 0;
117+}
118+
119+IO_FloppyDisk_DirectoryEntry *FloppyDisk_Internal_GetDirectoryEntryFromPath(IO_FloppyDisk *fd, const uchar path[])
120+{
121+ uchar filename[11];
122+ uint i, j;
123+ IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;
124+
125+ if(fd == Null){
126+ return Null;
127+ }
128+
129+ for(i = 0; i < 11; i++){
130+ filename[i] = ' ';
131+ }
132+
133+ j = 0;
134+ for(i = 0; i < 11; i++){
135+ if(j >= 11){
136+ break;
137+ }
138+ if(path[i] == 0x00){
139+ break;
140+ }
141+ if(path[i] == '.'){
142+ j = 8;
143+ } else{
144+ filename[j] = path[i];
145+ if('a' <= filename[j] && filename[j] <= 'z'){
146+ filename[j] -= 0x20;
147+ }
148+ j++;
149+ }
150+ }
151+
152+ for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){
153+ if(fd->files[i].name[0] == 0x00){
154+ break;
155+ }
156+ rdeattr.attribute = fd->files[i].attribute;
157+ if(fd->files[i].name[0] != 0xe5 && fd->files[i].name[0] != 0x05 && !rdeattr.bit.volumelabel && !rdeattr.bit.directory){
158+ if(CFunction_CompareStrings_n(fd->files[i].name, filename, 11)){
159+ return &fd->files[i];
160+ }
161+ }
162+ }
163+ return Null;
164+}
165+
--- beta/tolset_chn_000/chnos_010/chnos/makeset.txt (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/makeset.txt (revision 328)
@@ -1,3 +1,3 @@
11
2-OBJS_BOOTPACK = nasfunc0.obj nasfunc1.obj nasfunc2.obj hankaku.obj chnlogo.obj callbios.obj cfunc.obj color.obj console.obj debug.obj display.obj draw08.obj draw16.obj draw32.obj drawing.obj dsctbl.obj emu86.obj emu86asm.obj error.obj fifo.obj floppy.obj fmt_bmp.obj intrpt.obj keyboard.obj memory.obj mouse.obj mtask.obj pci.obj serial.obj sheet.obj sht08.obj sht16.obj sht32.obj shtdraw.obj shtfunc.obj struct.obj system.obj textbox.obj timer.obj vgatmode.obj xception.obj bootpack.obj
2+OBJS_BOOTPACK = nasfunc0.obj nasfunc1.obj nasfunc2.obj hankaku.obj chnlogo.obj callbios.obj cfunc.obj color.obj console.obj debug.obj display.obj draw08.obj draw16.obj draw32.obj drawing.obj dsctbl.obj emu86.obj emu86asm.obj error.obj fifo.obj file.obj floppy.obj fmt_bmp.obj intrpt.obj keyboard.obj memory.obj mouse.obj mtask.obj pci.obj serial.obj sheet.obj sht08.obj sht16.obj sht32.obj shtdraw.obj shtfunc.obj struct.obj system.obj textbox.obj timer.obj vgatmode.obj xception.obj bootpack.obj
33 HEADS_BOOTPACK = core.h coredef0.h coredef1.h coredef2.h coredef3.h keyid.h
--- beta/tolset_chn_000/chnos_010/chnos/textbox.c (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/textbox.c (revision 328)
@@ -291,6 +291,8 @@
291291 textbox->location_cursor.x = 0;
292292 textbox->location_cursor.y += 16;
293293 }
294+ } else if(c == '\r'){
295+
294296 } else if(TextBox_Internal_Put_Character_TextBuffer(textbox, c)){
295297 s[0] = c;
296298 Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);
--- beta/tolset_chn_000/chnos_010/chnos/core.h (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/core.h (revision 328)
@@ -30,7 +30,7 @@
3030 bool CFunction_CompareStrings_n(const uchar s1[], const uchar s2[], unsigned int n);
3131 uint CFunction_ExtractBits(uint source, uint start, uint end);
3232 bool CFunction_String_GetWord(const uchar s[], uchar *wordptr[], uint n);
33-uint CFunction_MemoryMove(void *destination, uint destination_size, void *source, uint source_size);
33+uint CFunction_MemoryMove(void *destination, uint destination_size, const void *source, uint source_size);
3434 int snprintf(uchar s[], uint n, const uchar format[], ...);
3535 int vsnprintf(uchar s[], uint n, const uchar format[], uint vargs[]);
3636 //
@@ -66,6 +66,7 @@
6666 uint Console_printf(UI_Console *console, const uchar format[], ...);
6767 uint Console_Command_dir(UI_Console *console);
6868 uint Console_Command_pci(UI_Console *console);
69+uint Console_Command_type(UI_Console *console);
6970
7071 /*debug.c デバッグ支援*/
7172 #ifdef CHNOSPROJECT_DEBUG
@@ -201,8 +202,16 @@
201202 uint FIFO32_MyTaskFIFO_Status(void);
202203 uint FIFO32_MyTaskFIFO_Get(void);
203204
205+/*file.c ファイル関連*/
206+IO_File *File_Initilaize(void);
207+uint File_Free(IO_File *file);
208+
204209 /*floppy.c フロッピーディスク関連*/
205210 IO_FloppyDisk *FloppyDisk_Initialize(void *img);
211+uint FloppyDisk_Decode_FAT16(IO_FloppyDisk *fd, bool backup);
212+bool FloppyDisk_IsPathExist(IO_FloppyDisk *fd, const uchar path[]);
213+uint FloppyDisk_LoadFile(IO_FloppyDisk *fd, IO_File *file, const uchar path[]);
214+IO_FloppyDisk_DirectoryEntry *FloppyDisk_Internal_GetDirectoryEntryFromPath(IO_FloppyDisk *fd, const uchar path[]);
206215
207216 /*fmt_bmp.c ビットマップ描画関連*/
208217 uint Format_BMP_DrawPicture(void *vram, uint xsize, uint x, uint y, uint pxsize, uint pysize, void *bmp);
--- beta/tolset_chn_000/chnos_010/chnos/cfunc.c (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/cfunc.c (revision 328)
@@ -263,10 +263,10 @@
263263 }
264264
265265 //source番地からの、destination_sizeを超えないsource_sizeバイトを、destination番地へ移動させる。
266-//メモリ範囲が重なっていてもデータは破壊されない。
266+//メモリ範囲が重なっていてもデータは破壊されない(範囲が重なっている場合、sourceの内容が変更される可能性はあるが、移動されるデータ自体は保持される)。
267267 //同一番地へコピーする場合は何もしない。
268268 //戻り値は、コピーしたバイト数。
269-uint CFunction_MemoryMove(void *destination, uint destination_size, void *source, uint source_size)
269+uint CFunction_MemoryMove(void *destination, uint destination_size, const void *source, uint source_size)
270270 {
271271 uint move_size, i;
272272 void *temp;
@@ -296,7 +296,7 @@
296296 }
297297 }
298298 } else{
299- temp = source;
299+ temp = (uchar *)source;
300300 }
301301
302302 i = 0;
--- beta/tolset_chn_000/chnos_010/chnos/structid.h (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/structid.h (revision 328)
@@ -5,3 +5,5 @@
55 #define SYSTEM_STRUCTID_TEXTBOX 3
66 #define SYSTEM_STRUCTID_CONSOLE 4
77 #define SYSTEM_STRUCTID_FLOPPYDISK 5
8+#define SYSTEM_STRUCTID_FILE 6
9+
--- beta/tolset_chn_000/chnos_010/chnos/file.c (nonexistent)
+++ beta/tolset_chn_000/chnos_010/chnos/file.c (revision 328)
@@ -0,0 +1,34 @@
1+
2+#include "core.h"
3+
4+IO_File *File_Initilaize(void)
5+{
6+ IO_File *file;
7+
8+ file = (IO_File *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_FILE);
9+
10+ file->flags.bit.initialized = True;
11+
12+ return file;
13+}
14+
15+uint File_Free(IO_File *file)
16+{
17+ uint i;
18+
19+ if(file == Null){
20+ return 1;
21+ }
22+ if(file->img != Null){
23+ System_Memory_Free(file->img, file->size);
24+ }
25+ if(file->path != Null){
26+ for(i = 0; file->path[i] != 0x00; i++){
27+
28+ }
29+ System_Memory_Free(file->path, i + 1);
30+ }
31+
32+ System_CommonStruct_Free(&file->common_tag);
33+ return 0;
34+}
--- beta/tolset_chn_000/chnos_010/chnos/struct.c (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/struct.c (revision 328)
@@ -25,6 +25,9 @@
2525 case SYSTEM_STRUCTID_FLOPPYDISK:
2626 strsize = sizeof(IO_FloppyDisk);
2727 break;
28+ case SYSTEM_STRUCTID_FILE:
29+ strsize = sizeof(IO_File);
30+ break;
2831 default:
2932 #ifdef CHNOSPROJECT_DEBUG_COMMON_STRUCT
3033 debug("System_CommonStruct_Allocate:Unknown Struct.\n");
@@ -47,6 +50,7 @@
4750 case SYSTEM_STRUCTID_TEXTBOX:
4851 case SYSTEM_STRUCTID_CONSOLE:
4952 case SYSTEM_STRUCTID_FLOPPYDISK:
53+ case SYSTEM_STRUCTID_FILE:
5054 break;
5155 default:
5256 #ifdef CHNOSPROJECT_DEBUG_COMMON_STRUCT
--- beta/tolset_chn_000/chnos_010/chnos/coredef0.h (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/coredef0.h (revision 328)
@@ -362,7 +362,12 @@
362362 #define CONSOLE_PRINTF_BUFFER_SIZE 1024
363363
364364 /*floppy*/
365+#define FLOPPYDISK_FAT0_OFFSET 0x000200
366+#define FLOPPYDISK_FAT1_OFFSET 0x001400
365367 #define FLOPPYDISK_RDE_OFFSET 0x002600
366368 #define FLOPPYDISK_RDE_ENTRIES 224
369+#define FLOPPYDISK_SECTORS (1440 * 2)
367370
371+/*file*/
372+#define FILE_PATH_LENGTH_MAX (256 - 1)
368373
--- beta/tolset_chn_000/chnos_010/chnos/coredef1.h (revision 327)
+++ beta/tolset_chn_000/chnos_010/chnos/coredef1.h (revision 328)
@@ -577,7 +577,7 @@
577577
578578 union UI_TEXT_BOX_FLAGS {
579579 uint flags;
580- struct UI_TEXT_BOX_BITS {
580+ struct UI_TEXT_BOX_FLAGS_BITS {
581581 unsigned initialized : 1;
582582 unsigned textbuffer_configured : 1;
583583 unsigned record_input_text : 1;
@@ -587,7 +587,7 @@
587587 } flags;
588588 } UI_TextBox;
589589
590-typedef struct IO_FLOPPYDISK_RDE {
590+typedef struct IO_FLOPPYDISK_DIRECTORY_ENTRY {
591591 uchar name[8]; //0x00:empty(no more files)
592592 //0x05:=0xe5
593593 //0x2e:(only directory)
@@ -606,17 +606,17 @@
606606 ushort updatedate;
607607 ushort cluster;
608608 uint size; //attribute.bit.directory==true:0
609-} IO_FloppyDisk_RootDirectoryEntry;
609+} IO_FloppyDisk_DirectoryEntry;
610610
611611 typedef struct IO_FLOPPYDISK {
612612 System_CommonStruct common_tag;
613613 uchar *img;
614- IO_FloppyDisk_RootDirectoryEntry *files;
614+ IO_FloppyDisk_DirectoryEntry *files;
615615 sector *userdataarea;
616- void *fat;
616+ ushort *fat;
617617 } IO_FloppyDisk;
618618
619-typedef union IO_FLOPPYDISK_RDE_ATTRIBUTE {
619+typedef union IO_FLOPPYDISK_DIRECTORY_ENTRY_ATTRIBUTE {
620620 uchar attribute; //0x0f=LongFileNameEntry
621621 struct IO_FLOPPYDISK_RDE_ATTRIBUTE_BITS {
622622 unsigned readonly : 1;
@@ -628,9 +628,9 @@
628628 unsigned bit6 : 1;
629629 unsigned bit7 : 1;
630630 } bit;
631-} IO_FloppyDisk_RDE_Attribute;
631+} IO_FloppyDisk_DirectoryEntry_Attribute;
632632
633-typedef union IO_FLOPPYDISK_RDE_UPDATETIME {
633+typedef union IO_FLOPPYDISK_DIRECTORY_ENTRY_UPDATETIME {
634634 ushort updatetime;
635635 struct IO_FLOPPYDISK_RDE_UPDATETIME_BITS {
636636 unsigned second : 5; //second/2
@@ -637,9 +637,9 @@
637637 unsigned minute : 6;
638638 unsigned hour : 5;
639639 } bit;
640-} IO_FloppyDisk_RDE_UpdateTime;
640+} IO_FloppyDisk_DirectoryEntry_UpdateTime;
641641
642-typedef union IO_FLOPPYDISK_RDE_UPDATEDATE {
642+typedef union IO_FLOPPYDISK_DIRECTORY_ENTRY_UPDATEDATE {
643643 ushort updatedate;
644644 struct IO_FLOPPYDISK_RDE_UPDATEDATE_BITS {
645645 unsigned day : 5; //day(1-31)
@@ -646,7 +646,7 @@
646646 unsigned month : 4; //month(1-12)
647647 unsigned year : 7; //year(from 1980)
648648 } bit;
649-} IO_FloppyDisk_RDE_UpdateDate;
649+} IO_FloppyDisk_DirectoryEntry_UpdateDate;
650650
651651 typedef struct UI_CONSOLE {
652652 UI_TextBox *textbox;
@@ -654,7 +654,7 @@
654654 uchar *printf_buffer;
655655 union UI_CONSOLE_FLAGS {
656656 uint flags;
657- struct UI_CONSOLE_BITS {
657+ struct UI_CONSOLE_FLAGS_BITS {
658658 unsigned initialized : 1;
659659 unsigned configured_size : 1;
660660 unsigned isprompt : 1;
@@ -663,4 +663,18 @@
663663 IO_FloppyDisk *boot_fd;
664664 } UI_Console;
665665
666+typedef struct IO_FILE {
667+ System_CommonStruct common_tag;
668+ uchar *path;
669+ uint size;
670+ void *img;
671+ union IO_FILE_FLAGS {
672+ uint flags;
673+ struct IO_FILE_FLAGS_BITS {
674+ unsigned initialized : 1;
675+ unsigned img_loaded : 1;
676+ } bit;
677+ } flags;
678+} IO_File;
666679
680+
旧リポジトリブラウザで表示