1 /************************************************************************/
2 /* */
3 /* �����ڥ�ɡ��쥸�塼����� */
4 /* */
5 /* */
6 /* */
7 /************************************************************************/
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <ctype.h>
13
14 #include "quasi88.h"
15 #include "suspend.h"
16 #include "initval.h"
17 #include "file-op.h"
18
19 int resume_flag = FALSE; /* ��ư���Υ쥸�塼�� */
20 int resume_force = FALSE; /* �����쥸�塼�� */
21 int resume_file = FALSE; /* �ե�����̾���ꤢ�� */
22
23 char file_state[QUASI88_MAX_FILENAME]; /* ���ơ��ȥե�����̾ */
24
25
26
27 /*======================================================================
28 ���ơ��ȥե�����ι���
29
30 �إå��� 32�Х���
31 �ǡ����� ����Х���
32 �ǡ����� ����Х���
33 ��
34 ��
35 ��ü��
36
37
38 �إå��� 32�Х��� �Ȥꤢ���������Ƥϰʲ��ΤȤ��ꡣ_ �� NULʸ��
39 QUASI88_0.6.0_1_________________
40 ����ID QUASI88
41 ������� 0.6.0
42 �ߴ��ֹ� 1
43
44 �ǡ����� ID ASCII4�Х���
45 �ǡ���Ĺ 4�Х������� (��ȥ륨��ǥ�����)
46 �ǡ��� ����Х��ȿ�
47
48 �ǡ���Ĺ�ˤϡ� ID �� ���ȤΥǡ���Ĺ �� 8�Х��Ȥϴޤޤʤ�
49
50 ��ü�� ID 0x00 4�Х���
51 �ǡ���Ĺ 0x00 4�Х���
52
53
54 �����ͤϤ��٤ƥ�ȥ륨��ǥ�����ˤǤ⤷�Ƥ�������
55
56 �ǡ������ξܺ٤ϡ��������ٹͤ��뤳�Ȥˤ��ޤ�������
57 ======================================================================*/
58
59 #define SZ_HEADER (32)
60
61
62 /*----------------------------------------------------------------------
63 * ���ơ��ȥե�����˥ǡ�����Ͽ����ؿ�
64 * ���ơ��ȥե�����˵�Ͽ���줿�ǡ�������Ф��ؿ�
65 * �����ǡ����ϥ�ȥ륨��ǥ�����ǵ�Ͽ
66 * int ���� short ����char ����pair ����256�Х��ȥ֥�å���
67 * ʸ����(1023ʸ���ޤ�)��double�� (1000000�ܤ���int���Ѵ�)
68 *----------------------------------------------------------------------*/
statesave_int(OSD_FILE * fp,int * val)69 INLINE int statesave_int( OSD_FILE *fp, int *val )
70 {
71 unsigned char c[4];
72 c[0] = ( *val ) & 0xff;
73 c[1] = ( *val >> 8 ) & 0xff;
74 c[2] = ( *val >> 16 ) & 0xff;
75 c[3] = ( *val >> 24 ) & 0xff;
76 if( osd_fwrite( c, sizeof(char), 4, fp )==4 ) return TRUE;
77 return FALSE;
78 }
stateload_int(OSD_FILE * fp,int * val)79 INLINE int stateload_int( OSD_FILE *fp, int *val )
80 {
81 unsigned char c[4];
82 if( osd_fread( c, sizeof(char), 4, fp )!=4 ) return FALSE;
83 *val = ( ((unsigned int)c[3] << 24) |
84 ((unsigned int)c[2] << 16) |
85 ((unsigned int)c[1] << 8) |
86 (unsigned int)c[0] );
87 return TRUE;
88 }
statesave_short(OSD_FILE * fp,short * val)89 INLINE int statesave_short( OSD_FILE *fp, short *val )
90 {
91 unsigned char c[2];
92 c[0] = ( *val ) & 0xff;
93 c[1] = ( *val >> 8 ) & 0xff;
94 if( osd_fwrite( c, sizeof(char), 2, fp )==2 ) return TRUE;
95 return FALSE;
96 }
stateload_short(OSD_FILE * fp,short * val)97 INLINE int stateload_short( OSD_FILE *fp, short *val )
98 {
99 unsigned char c[2];
100 if( osd_fread( c, sizeof(Uchar), 2, fp )!=2 ) return FALSE;
101 *val = ( ((unsigned short)c[1] << 8) |
102 (unsigned short)c[0] );
103 return TRUE;
104 }
statesave_char(OSD_FILE * fp,char * val)105 INLINE int statesave_char( OSD_FILE *fp, char *val )
106 {
107 if( osd_fwrite( val, sizeof(char), 1, fp )==1 ) return TRUE;
108 return FALSE;
109 }
stateload_char(OSD_FILE * fp,char * val)110 INLINE int stateload_char( OSD_FILE *fp, char *val )
111 {
112 if( osd_fread( val, sizeof(char), 1, fp )!=1 ) return FALSE;
113 return TRUE;
114 }
115
116
statesave_pair(OSD_FILE * fp,pair * val)117 INLINE int statesave_pair( OSD_FILE *fp, pair *val )
118 {
119 unsigned char c[2];
120 c[0] = ( (*val).W ) & 0xff;
121 c[1] = ( (*val).W >> 8 ) & 0xff;
122 if( osd_fwrite( c, sizeof(char), 2, fp )==2 ) return TRUE;
123 return FALSE;
124 }
stateload_pair(OSD_FILE * fp,pair * val)125 INLINE int stateload_pair( OSD_FILE *fp, pair *val )
126 {
127 unsigned char c[2];
128 if( osd_fread( c, sizeof(char), 2, fp )!=2 ) return FALSE;
129 (*val).W = ( ((unsigned short)c[1] << 8) |
130 (unsigned short)c[0] );
131 return TRUE;
132 }
133
statesave_256(OSD_FILE * fp,char * array)134 INLINE int statesave_256( OSD_FILE *fp, char *array )
135 {
136 if( osd_fwrite( array, sizeof(char), 256, fp )==256 ) return TRUE;
137 return FALSE;
138 }
stateload_256(OSD_FILE * fp,char * array)139 INLINE int stateload_256( OSD_FILE *fp, char *array )
140 {
141 if( osd_fread( array, sizeof(char), 256, fp )!=256 ) return FALSE;
142 return TRUE;
143 }
144
145
statesave_str(OSD_FILE * fp,char * str)146 INLINE int statesave_str( OSD_FILE *fp, char *str )
147 {
148 char wk[1024];
149
150 if( strlen(str) >= 1024-1 ) return FALSE;
151
152 memset( wk, 0, 1024 );
153 strcpy( wk, str );
154
155 if( osd_fwrite( wk, sizeof(char), 1024, fp )==1024 ) return TRUE;
156 return FALSE;
157 }
stateload_str(OSD_FILE * fp,char * str)158 INLINE int stateload_str( OSD_FILE *fp, char *str )
159 {
160 if( osd_fread( str, sizeof(char), 1024, fp )!=1024 ) return FALSE;
161 return TRUE;
162 }
163
statesave_double(OSD_FILE * fp,double * val)164 INLINE int statesave_double( OSD_FILE *fp, double *val )
165 {
166 unsigned char c[4];
167 int wk;
168
169 wk = (int) ((*val) * 1000000.0);
170 c[0] = ( wk ) & 0xff;
171 c[1] = ( wk >> 8 ) & 0xff;
172 c[2] = ( wk >> 16 ) & 0xff;
173 c[3] = ( wk >> 24 ) & 0xff;
174 if( osd_fwrite( c, sizeof(char), 4, fp )==4 ) return TRUE;
175 return FALSE;
176 }
stateload_double(OSD_FILE * fp,double * val)177 INLINE int stateload_double( OSD_FILE *fp, double *val )
178 {
179 unsigned char c[4];
180 int wk;
181
182 if( osd_fread( c, sizeof(char), 4, fp )!=4 ) return FALSE;
183
184 wk = ( ((unsigned int)c[3] << 24) |
185 ((unsigned int)c[2] << 16) |
186 ((unsigned int)c[1] << 8) |
187 (unsigned int)c[0] );
188 *val = (double)wk / 1000000.0;
189 return TRUE;
190 }
191
192
193
194
195 /*----------------------------------------------------------------------
196 * ID������ؿ� ����͡��ǡ��������� (-1�ǥ��顼��-2�ǥǡ����ʤ�)
197 * ID�����ؿ� ����͡��ǡ��������� (-1�ǥ��顼)
198 *----------------------------------------------------------------------*/
199
read_id(OSD_FILE * fp,const char id[4])200 static int read_id( OSD_FILE *fp, const char id[4] )
201 {
202 char c[4];
203 int size;
204
205 /* �ե�������Ƭ���鸡�����ޤ��ϥإå����å� */
206 if( osd_fseek( fp, SZ_HEADER, SEEK_SET ) != 0 ) return -1;
207
208 /* ID �����פ���ޤ� SEEK ���Ƥ��� */
209 for( ;; ){
210
211 if( osd_fread( c, sizeof(char), 4, fp ) != 4 ) return -1;
212 if( stateload_int( fp, &size ) == FALSE ) return -1;
213
214 if( memcmp( c, id, 4 ) == 0 ){ /* ID���פ��� */
215 return size;
216 }
217
218 if( memcmp( c, "\0\0\0\0", 4 ) == 0 ) return -2; /* �ǡ�����ü */
219
220 if( osd_fseek( fp, size, SEEK_CUR ) != 0 ) return -1;
221 }
222 }
223
224
write_id(OSD_FILE * fp,const char id[4],int size)225 static int write_id( OSD_FILE *fp, const char id[4], int size )
226 {
227 /* �ե����븽�߰��֤ˡ����� */
228
229 if( osd_fwrite( id, sizeof(char), 4, fp ) != 4 ) return -1;
230 if( statesave_int( fp, &size ) == FALSE ) return -1;
231
232 return size;
233 }
234
235
236
237
238 /*======================================================================
239 *
240 * ���ơ��ȥե�����˥ǡ�����Ͽ
241 *
242 *======================================================================*/
243 static OSD_FILE *statesave_fp;
244
245 /* �إå��������� */
statesave_header(void)246 static int statesave_header( void )
247 {
248 size_t off;
249 char header[ SZ_HEADER ];
250 OSD_FILE *fp = statesave_fp;
251
252 memset( header, 0, SZ_HEADER );
253 off = 0;
254 memcpy( &header[off], STATE_ID, sizeof(STATE_ID) );
255 off += sizeof(STATE_ID);
256 memcpy( &header[off], STATE_VER, sizeof(STATE_VER) );
257 off += sizeof(STATE_VER);
258 memcpy( &header[off], STATE_REV, sizeof(STATE_REV) );
259
260 if( osd_fseek( fp, 0, SEEK_SET ) == 0 &&
261 osd_fwrite( header, sizeof(char), SZ_HEADER, fp ) == SZ_HEADER ){
262
263 return STATE_OK;
264 }
265
266 return STATE_ERR;
267 }
268
269 /* ����֥�å������ */
statesave_block(const char id[4],void * top,int size)270 int statesave_block( const char id[4], void *top, int size )
271 {
272 OSD_FILE *fp = statesave_fp;
273
274 if( write_id( fp, id, size ) == size &&
275 osd_fwrite( (char*)top, sizeof(char), size, fp ) == (size_t)size ){
276
277 return STATE_OK;
278 }
279
280 return STATE_ERR;
281 }
282
283 /* �ơ��֥����˽��������� */
statesave_table(const char id[4],T_SUSPEND_W * tbl)284 int statesave_table( const char id[4], T_SUSPEND_W *tbl )
285 {
286 OSD_FILE *fp = statesave_fp;
287 T_SUSPEND_W *p = tbl;
288 int size = 0;
289 int loop = TRUE;
290
291 while( loop ){ /* ���ॵ��������פ�� */
292 switch( p->type ){
293 case TYPE_END: loop = FALSE; break;
294 case TYPE_DOUBLE:
295 case TYPE_INT:
296 case TYPE_LONG: size += 4; break;
297 case TYPE_PAIR:
298 case TYPE_SHORT:
299 case TYPE_WORD: size += 2; break;
300 case TYPE_CHAR:
301 case TYPE_BYTE: size += 1; break;
302 case TYPE_STR: size += 1024; break;
303 case TYPE_256: size += 256; break;
304 }
305 p ++;
306 }
307
308 if( write_id( fp, id, size ) != size ) return STATE_ERR;
309
310 for( ;; ){
311 switch( tbl->type ){
312
313 case TYPE_END:
314 return STATE_OK;
315
316 case TYPE_INT:
317 case TYPE_LONG:
318 if( statesave_int( fp, (int *)tbl->work )==FALSE ) return STATE_ERR;
319 break;
320
321 case TYPE_SHORT:
322 case TYPE_WORD:
323 if( statesave_short( fp, (short *)tbl->work )==FALSE ) return STATE_ERR;
324 break;
325
326 case TYPE_CHAR:
327 case TYPE_BYTE:
328 if( statesave_char( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
329 break;
330
331 case TYPE_PAIR:
332 if( statesave_pair( fp, (pair *)tbl->work )==FALSE ) return STATE_ERR;
333 break;
334
335 case TYPE_DOUBLE:
336 if( statesave_double( fp, (double *)tbl->work )==FALSE) return STATE_ERR;
337 break;
338
339 case TYPE_STR:
340 if( statesave_str( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
341 break;
342
343 case TYPE_256:
344 if( statesave_256( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
345 break;
346
347 default: return STATE_ERR;
348 }
349
350 tbl ++;
351 }
352 }
353
354
355 /*======================================================================
356 *
357 * ���ơ��ȥե����뤫��ǡ�������Ф�
358 *
359 *======================================================================*/
360 static OSD_FILE *stateload_fp;
361 static int statefile_rev = 0;
362
363 /* �إå��������Ф� */
stateload_header(void)364 static int stateload_header( void )
365 {
366 char header[ SZ_HEADER + 1 ];
367 char *title, *ver, *rev;
368 OSD_FILE *fp = stateload_fp;
369
370 if( osd_fseek( fp, 0, SEEK_SET ) == 0 &&
371 osd_fread( header, sizeof(char), SZ_HEADER, fp ) == SZ_HEADER ){
372
373 header[ SZ_HEADER ] = '\0';
374
375 title = header;
376 ver = title + strlen(title) + 1;
377 rev = ver + strlen(ver) + 1;
378 if( verbose_suspend ){
379 printf( "stateload: file header is \"%s\", \"%s\", \"%s\".\n",
380 title, ver, rev );
381 }
382
383 if( memcmp( title, STATE_ID, sizeof(STATE_ID) ) != 0 ){
384
385 printf( "stateload: ID mismatch ('%s' != '%s')\n",
386 STATE_ID, title );
387 }else{
388 if( memcmp( ver, STATE_VER, sizeof(STATE_VER) ) != 0 ){
389
390 printf( "stateload: version mismatch ('%s' != '%s')\n",
391 STATE_VER, ver );
392 if( resume_force == FALSE ) return STATE_ERR;
393
394 }else{
395
396 if( verbose_suspend ){
397 if( memcmp( rev, STATE_REV, sizeof(STATE_REV) ) != 0 ){
398 printf( "stateload: older revision ('%s' != '%s')\n",
399 STATE_REV, rev );
400 }
401 }
402 }
403
404 if( rev[0] == '1' ) statefile_rev = 1;
405 else statefile_rev = 0;
406
407 return STATE_OK;
408 }
409 }
410
411 return STATE_ERR;
412 }
413
414 /* ����֥�å�����Ф� */
stateload_block(const char id[4],void * top,int size)415 int stateload_block( const char id[4], void *top, int size )
416 {
417 OSD_FILE *fp = stateload_fp;
418
419 int s = read_id( fp, id );
420
421 if( s == -1 ) return STATE_ERR;
422 if( s == -2 ) return STATE_ERR_ID;
423 if( s != size ) return STATE_ERR_SIZE;
424
425 if( osd_fread( (char*)top, sizeof(char), size, fp ) == (size_t)size ){
426
427 return STATE_OK;
428 }
429
430 return STATE_ERR;
431 }
432
433 /* �ơ��֥����˽��������Ф� */
stateload_table(const char id[4],T_SUSPEND_W * tbl)434 int stateload_table( const char id[4], T_SUSPEND_W *tbl )
435 {
436 OSD_FILE *fp = stateload_fp;
437 int size = 0;
438 int s = read_id( fp, id );
439
440 if( s == -1 ) return STATE_ERR;
441 if( s == -2 ) return STATE_ERR_ID;
442
443 for( ;; ){
444 switch( tbl->type ){
445
446 case TYPE_END:
447 if( s != size ) return STATE_ERR_SIZE;
448 else return STATE_OK;
449
450 case TYPE_INT:
451 case TYPE_LONG:
452 if( stateload_int( fp, (int *)tbl->work )==FALSE ) return STATE_ERR;
453 size += 4;
454 break;
455
456 case TYPE_SHORT:
457 case TYPE_WORD:
458 if( stateload_short( fp, (short *)tbl->work )==FALSE ) return STATE_ERR;
459 size += 2;
460 break;
461
462 case TYPE_CHAR:
463 case TYPE_BYTE:
464 if( stateload_char( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
465 size += 1;
466 break;
467
468 case TYPE_PAIR:
469 if( stateload_pair( fp, (pair *)tbl->work )==FALSE ) return STATE_ERR;
470 size += 2;
471 break;
472
473 case TYPE_DOUBLE:
474 if( stateload_double( fp, (double *)tbl->work )==FALSE) return STATE_ERR;
475 size += 4;
476 break;
477
478 case TYPE_STR:
479 if( stateload_str( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
480 size += 1024;
481 break;
482
483 case TYPE_256:
484 if( stateload_256( fp, (char *)tbl->work )==FALSE ) return STATE_ERR;
485 size += 256;
486 break;
487
488 default: return STATE_ERR;
489 }
490
491 tbl ++;
492 }
493 }
494
495 /* ��ӥ������� */
statefile_revision(void)496 int statefile_revision( void )
497 {
498 return statefile_rev;
499 }
500
501
502
503 /***********************************************************************
504 *
505 *
506 *
507 ************************************************************************/
508
509 /*
510 statesave() / stateload() �ǥ�����/���ɤ����ե�����̾�ϡ�
511 ��ưŪ�����ꤵ���Τǡ�������/���ɻ��˻��ꤹ��ɬ�פϤʤ���
512 (�ǥ������������̾���ʤɤ˴�Ť������ꤵ���)
513
514 �Ǥ⡢�������1���ष������/�����֤Ǥ��������ؤʤΤǡ�
515 filename_set_state_serial(int serial) ��Ϣ�֤����Ǥ��롣
516
517 ���ơ��ȥե�����̾
518 ���� '5' /my/state/dir/file-5.sta
519 ���� 'z' /my/state/dir/file-z.sta
520 ���� 0 /my/state/dir/file.sta
521
522 ��äơ�Ϣ�ֻ���ǥ��ơ��ȥ����֤�����ϡ�
523 filename_set_state_serial('1');
524 statesave();
525 �Τ褦�˸ƤӽФ���
526
527 ----------------------------------------------------------------------
528 �ե�����̾���ѹ����������ϡ��ʲ��δؿ���Ȥ���
529
530 �ե�����̾�μ��� �� filename_get_state()
531 �������ꤵ��Ƥ��륹�ơ��ȥե�����̾�������Ǥ��롣
532 /my/state/dir/file-a.sta �Τ褦��ʸ�����֤롣
533
534 �ե�����Ϣ�֤μ��� �� filename_get_state_serial()
535 �������ꤵ��Ƥ��륹�ơ��ȥե�����̾��Ϣ�֤������Ǥ��롣
536 /my/state/dir/file-Z.sta �ʤ�С� 'Z' ���֤롣
537 /my/state/dir/file.sta �ʤ�С� 0 ���֤롣
538 ��ĥ�Ҥ� .sta �Ǥʤ��ʤ顢 -1 ���֤롣
539
540 �ե�����̾������ �� filename_set_state(name)
541 ���ơ��ȥե�����̾�� name �����ꤹ�롣
542 Ϣ�֤Ĥ��Υե�����̾�Ǥ⡢Ϣ�֤ʤ��Ǥ�褤��
543 �ʤ���NULL ����ꤹ��ȡ�����ͤ����åȤ���롣
544
545 �ե�����Ϣ�֤����� �� filename_set_state_serial(num)
546 Ϣ�֤� num �����ꤹ�롣 �ե�����̾�γ�ĥ�Ҥ� .sta �Ǥʤ��ʤ��ղä��롣
547 num �� 0 �ʤ顢Ϣ��̵�����ե�����̾�γ�ĥ�Ҥ� .sta �Ǥʤ��ʤ��ղä��롣
548 num ���� �ʤ顢Ϣ��̵�����ե�����̾�γ�ĥ�ҤϤ��ΤޤޤȤ��롣
549 */
550
551
552
553
filename_get_state(void)554 const char *filename_get_state(void)
555 {
556 return file_state;
557 }
558
filename_get_state_serial(void)559 int filename_get_state_serial(void)
560 {
561 const char *str_sfx = STATE_SUFFIX; /* ".sta" */
562 const size_t len_sfx = strlen(STATE_SUFFIX); /* 4 */
563 size_t len = strlen(file_state);
564
565 if (len > len_sfx &&
566 my_strcmp(&file_state[ len - len_sfx ], str_sfx) == 0) {
567
568 if (len > len_sfx + 2 && /* �ե�����̾�� xxx-N.sta */
569 '-' == file_state[ len - len_sfx -2 ] &&
570 isalnum(file_state[ len - len_sfx -1 ])) {
571 /* '0'-'9','a'-'z' ���֤� */
572 return file_state[ len - len_sfx -1 ];
573
574 } else { /* �ե�����̾�� xxx.sta */
575 return 0;
576 }
577 } else { /* �ե�����̾�� ����¾ */
578 return -1;
579 }
580 }
581
filename_set_state(const char * filename)582 void filename_set_state(const char *filename)
583 {
584 if (filename) {
585 strncpy(file_state, filename, QUASI88_MAX_FILENAME - 1);
586 file_state[ QUASI88_MAX_FILENAME - 1 ] = '\0';
587 } else {
588 filename_init_state(FALSE);
589 }
590 }
591
filename_set_state_serial(int serial)592 void filename_set_state_serial(int serial)
593 {
594 const char *str_sfx = STATE_SUFFIX; /* ".sta" */
595 const size_t len_sfx = strlen(STATE_SUFFIX); /* 4 */
596 char add_sfx[] = "-N" STATE_SUFFIX; /* "-N.sta" */
597 size_t len;
598 int now_serial;
599
600 add_sfx[1] = serial;
601
602 len = strlen(file_state);
603
604 now_serial = filename_get_state_serial();
605
606 if (now_serial > 0) { /* ���Υե�����̾�� xxx-N.sta */
607
608 file_state[ len - len_sfx -2 ] = '\0'; /* -N.sta ���� */
609
610 if (serial <= 0) { /* xxx �� xxx.sta */
611 strcat(file_state, str_sfx);
612 } else { /* xxx �� xxx-M.sta */
613 strcat(file_state, add_sfx);
614 }
615
616 } else if (now_serial == 0) { /* ���Υե�����̾�� xxx.sta */
617
618 if (serial <= 0) { /* xxx.sta �Τޤ� */
619 ;
620 } else {
621 if (len + 2 < QUASI88_MAX_FILENAME) {
622 file_state[ len - len_sfx ] = '\0'; /* .sta ���� */
623 strcat(file_state, add_sfx); /* xxx �� xxx-M.sta */
624 }
625 }
626
627 } else { /* ���Υե�����̾�� ����¾ xxx */
628
629 if (serial < 0) { /* xxx �Τޤ� */
630 ;
631 } else if (serial == 0) { /* xxx �� xxx.sta */
632 if (len + len_sfx < QUASI88_MAX_FILENAME) {
633 strcat(file_state, str_sfx);
634 }
635 } else { /* xxx �� xxx-M.sta */
636 if (len + len_sfx + 2 < QUASI88_MAX_FILENAME) {
637 strcat(file_state, add_sfx);
638 }
639 }
640 }
641 }
642
643
644
645
646
647
statesave_check_file_exist(void)648 int statesave_check_file_exist(void)
649 {
650 OSD_FILE *fp;
651
652 if (file_state[0] &&
653 (fp = osd_fopen(FTYPE_STATE_LOAD, file_state, "rb"))) {
654 osd_fclose(fp);
655 return TRUE;
656 }
657 return FALSE;
658 }
659
660
statesave(void)661 int statesave( void )
662 {
663 int success = FALSE;
664
665 if( file_state[0] == '\0' ){
666 printf( "state-file name not defined\n" );
667 return FALSE;
668 }
669
670 if( verbose_suspend )
671 printf( "statesave : %s\n", file_state );
672
673 if( (statesave_fp = osd_fopen( FTYPE_STATE_SAVE, file_state, "wb" )) ){
674
675 if( statesave_header() == STATE_OK ){
676
677 do{
678 if( statesave_emu() == FALSE ) break;
679 if( statesave_memory() == FALSE ) break;
680 if( statesave_pc88main() == FALSE ) break;
681 if( statesave_crtcdmac() == FALSE ) break;
682 if( statesave_sound() == FALSE ) break;
683 if( statesave_pio() == FALSE ) break;
684 if( statesave_screen() == FALSE ) break;
685 if( statesave_intr() == FALSE ) break;
686 if( statesave_keyboard() == FALSE ) break;
687 if( statesave_pc88sub() == FALSE ) break;
688 if( statesave_fdc() == FALSE ) break;
689 if( statesave_system() == FALSE ) break;
690
691 success = TRUE;
692 }while(0);
693
694 }
695
696 osd_fclose( statesave_fp );
697 }
698
699 return success;
700 }
701
702
703
704
stateload_check_file_exist(void)705 int stateload_check_file_exist(void)
706 {
707 int success = FALSE;
708
709 if (file_state[0] &&
710 (stateload_fp = osd_fopen(FTYPE_STATE_LOAD, file_state, "rb"))) {
711
712 if (stateload_header() == STATE_OK) { /* �إå����������å� */
713 success = TRUE;
714 }
715 osd_fclose(stateload_fp);
716 }
717
718 if (verbose_suspend) {
719 printf("stateload: file check ... %s\n", (success) ? "OK" : "FAILED");
720 }
721 return success;
722 }
723
724
stateload(void)725 int stateload( void )
726 {
727 int success = FALSE;
728
729 if( file_state[0] == '\0' ){
730 printf( "state-file name not defined\n" );
731 return FALSE;
732 }
733
734 if( verbose_suspend )
735 printf( "stateload: %s\n", file_state );
736
737 if( (stateload_fp = osd_fopen( FTYPE_STATE_LOAD, file_state, "rb" )) ){
738
739 if( stateload_header() == STATE_OK ){
740
741 do{
742 if( stateload_emu() == FALSE ) break;
743 if( stateload_sound() == FALSE ) break;
744 if( stateload_memory() == FALSE ) break;
745 if( stateload_pc88main() == FALSE ) break;
746 if( stateload_crtcdmac() == FALSE ) break;
747 /*if( stateload_sound() == FALSE ) break; memory�����ˡ� */
748 if( stateload_pio() == FALSE ) break;
749 if( stateload_screen() == FALSE ) break;
750 if( stateload_intr() == FALSE ) break;
751 if( stateload_keyboard() == FALSE ) break;
752 if( stateload_pc88sub() == FALSE ) break;
753 if( stateload_fdc() == FALSE ) break;
754 if( stateload_system() == FALSE ) break;
755
756 success = TRUE;
757 }while(0);
758
759 }
760
761 osd_fclose( stateload_fp );
762 }
763
764 return success;
765 }
766
767
768
769 /***********************************************************************
770 * ���ơ��ȥե�����̾������
771 ************************************************************************/
stateload_init(void)772 void stateload_init(void)
773 {
774 if (file_state[0] == '\0') {
775 filename_init_state(FALSE);
776 }
777
778 /* ��ư���Υ��ץ����ǥ��ơ��ȥ��ɤ��ؼ�����Ƥ����硢
779 �ʤ�餫�Υե�����̾�����Ǥ˥��åȤ���Ƥ���Ϥ� */
780 }
781