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