Diff for /np2/statsave.c between versions 1.4 and 1.48

version 1.4, 2003/10/18 07:28:50 version 1.48, 2005/03/22 04:39:07
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   #include        "strres.h"
 #include        "dosio.h"  #include        "dosio.h"
 #include        "commng.h"  #include        "commng.h"
 #include        "scrnmng.h"  #include        "scrnmng.h"
 #include        "soundmng.h"  #include        "soundmng.h"
 #include        "timemng.h"  #include        "timemng.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "memory.h"  
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
   #include        "gdc_sub.h"
 #include        "cbuscore.h"  #include        "cbuscore.h"
   #include        "ideio.h"
   #include        "sasiio.h"
   #include        "scsiio.h"
 #include        "pc9861k.h"  #include        "pc9861k.h"
 #include        "mpu98ii.h"  #include        "mpu98ii.h"
 #include        "board14.h"  #include        "board14.h"
   #include        "amd98.h"
   #include        "bios.h"
 #include        "vram.h"  #include        "vram.h"
 #include        "maketext.h"  
 #include        "palettes.h"  #include        "palettes.h"
 #include        "font.h"  #include        "maketext.h"
 #include        "sound.h"  #include        "sound.h"
 #include        "bios.h"  
 #include        "fmboard.h"  #include        "fmboard.h"
 #include        "beep.h"  #include        "beep.h"
   #include        "font.h"
 #include        "fddfile.h"  #include        "fddfile.h"
 #include        "fdd_mtr.h"  #include        "fdd_mtr.h"
 #include        "sxsi.h"  #include        "sxsi.h"
 #include        "calendar.h"  
 #include        "statsave.h"  
 #include        "keydisp.h"  #include        "keydisp.h"
   #include        "hostdrv.h"
   #include        "calendar.h"
   #include        "keystat.h"
   
   #if defined(MACOS)
   #define CRCONST         str_cr
   #elif defined(WIN32) || defined(X11) || defined(SLZAURUS)
   #define CRCONST         str_lf
   #else
   #define CRCONST         str_crlf
   #endif
   
   
 typedef struct {  typedef struct {
Line 38  typedef struct { Line 52  typedef struct {
         char    index[10];          char    index[10];
         UINT16  ver;          UINT16  ver;
         UINT32  size;          UINT32  size;
 } NP2FLAGPART_T;  } NP2FENT;
   
 enum {  enum {
         NP2FLAG_BIN                     = 0,          STATFLAG_BIN                    = 0,
         NP2FLAG_TERM,          STATFLAG_TERM,
         NP2FLAG_CORE,  #if defined(CGWND_FONTPTR)
         NP2FLAG_DMA,          STATFLAG_CGW,
         NP2FLAG_EGC,  #endif
         NP2FLAG_EXT,          STATFLAG_COM,
         NP2FLAG_EVT,          STATFLAG_DMA,
         NP2FLAG_GIJ,          STATFLAG_EGC,
         NP2FLAG_FM,          STATFLAG_EPSON,
         NP2FLAG_BEEP,          STATFLAG_EVT,
         NP2FLAG_MIDI,          STATFLAG_EXT,
         NP2FLAG_DISK          STATFLAG_FDD,
           STATFLAG_FM,
           STATFLAG_GIJ,
   #if defined(SUPPORT_HOSTDRV)
           STATFLAG_HDRV,
   #endif
           STATFLAG_MEM,
           STATFLAG_SXSI
 };  };
   
 typedef struct {  typedef struct {
 const char      *index;  
         UINT16  ver;  
         UINT16  type;  
         void    *arg1;  
         UINT    arg2;  
 } STENTRY;  
   
 typedef struct {  
         UINT32  id;          UINT32  id;
         void    *proc;          void    *proc;
 } PROCTBL;  } PROCTBL;
Line 73  typedef struct { Line 86  typedef struct {
         int             num;          int             num;
 } ENUMTBL;  } ENUMTBL;
   
 #define PROCID(a, b, c, d)      (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))  #define PROCID(a, b, c, d)      (((d) << 24) + ((c) << 16) + ((b) << 8) + (a))
 #define PROC2NUM(a, b)          proc2num(&(a), b, sizeof(b)/sizeof(PROCTBL))  #define PROC2NUM(a, b)          proc2num(&(a), (b), sizeof(b)/sizeof(PROCTBL))
 #define NUM2PROC(a, b)          num2proc(&(a), b, sizeof(b)/sizeof(PROCTBL))  #define NUM2PROC(a, b)          num2proc(&(a), (b), sizeof(b)/sizeof(PROCTBL))
   
 #include "statsave.tbl"  #include "statsave.tbl"
   
Line 84  extern COMMNG cm_mpu98; Line 97  extern COMMNG cm_mpu98;
 extern  COMMNG  cm_rs232c;  extern  COMMNG  cm_rs232c;
   
 typedef struct {  typedef struct {
         char    *buf;          OEMCHAR *buf;
         int             remain;          int             remain;
 } ERR_BUF;  } ERR_BUF;
   
 static void err_append(ERR_BUF *e, char *buf) {  
   
         if ((e) && (buf)) {  // ----
                 if (e->buf) {  
                         int len;  enum {
                         len = strlen(buf);          SFFILEH_WRITE   = 0x0001,
                         if (e->remain >= len) {          SFFILEH_BLOCK   = 0x0002,
                                 CopyMemory(e->buf, buf, len);          SFFILEH_ERROR   = 0x0004
                                 e->buf += len;  };
                                 e->remain -= len;  
   typedef struct {
           _STFLAGH        sfh;
           UINT            stat;
           FILEH           fh;
           UINT            secpos;
           NP2FHDR         f;
   } _SFFILEH, *SFFILEH;
   
   static SFFILEH statflag_open(const OEMCHAR *filename, OEMCHAR *err, int errlen) {
   
           FILEH   fh;
           SFFILEH ret;
   
           fh = file_open_rb(filename);
           if (fh == FILEH_INVALID) {
                   goto sfo_err1;
           }
           ret = (SFFILEH)_MALLOC(sizeof(_SFFILEH), filename);
           if (ret == NULL) {
                   goto sfo_err2;
           }
           if ((file_read(fh, &ret->f, sizeof(NP2FHDR)) == sizeof(NP2FHDR)) &&
                   (!memcmp(&ret->f, &np2flagdef, sizeof(np2flagdef)))) {
                   ZeroMemory(ret, sizeof(_SFFILEH));
                   ret->fh = fh;
                   ret->secpos = sizeof(NP2FHDR);
                   if ((err) && (errlen > 0)) {
                           err[0] = '\0';
                           ret->sfh.err = err;
                           ret->sfh.errlen = errlen;
                   }
                   return(ret);
           }
           _MFREE(ret);
   
   sfo_err2:
           file_close(fh);
   
   sfo_err1:
           return(NULL);
   }
   
   static int statflag_closesection(SFFILEH sffh) {
   
           UINT    leng;
           UINT8   zero[16];
   
           if (sffh == NULL) {
                   goto sfcs_err1;
           }
           if (sffh->stat == (SFFILEH_BLOCK | SFFILEH_WRITE)) {
                   leng = (0 - sffh->sfh.hdr.size) & 15;
                   if (leng) {
                           ZeroMemory(zero, sizeof(zero));
                           if (file_write(sffh->fh, zero, leng) != leng) {
                                   goto sfcs_err2;
                         }                          }
                 }                  }
                   if ((file_seek(sffh->fh, (long)sffh->secpos, FSEEK_SET)
                                                                                                   != (long)sffh->secpos) ||
                           (file_write(sffh->fh, &sffh->sfh.hdr, sizeof(sffh->sfh.hdr))
                                                                                                   != sizeof(sffh->sfh.hdr))) {
                           goto sfcs_err2;
                   }
           }
           if (sffh->stat & SFFILEH_BLOCK) {
                   sffh->stat &= ~SFFILEH_BLOCK;
                   sffh->secpos += sizeof(sffh->sfh.hdr) +
                                                                           ((sffh->sfh.hdr.size + 15) & (~15));
                   if (file_seek(sffh->fh, (long)sffh->secpos, FSEEK_SET)
                                                                                                   != (long)sffh->secpos) {
                           goto sfcs_err2;
                   }
         }          }
           return(STATFLAG_SUCCESS);
   
   sfcs_err2:
           sffh->stat = SFFILEH_ERROR;
   
   sfcs_err1:
           return(STATFLAG_FAILURE);
 }  }
   
   static int statflag_readsection(SFFILEH sffh) {
   
 // ----          int             ret;
   
           ret = statflag_closesection(sffh);
           if (ret != STATFLAG_SUCCESS) {
                   return(ret);
           }
           if ((sffh->stat == 0) &&
                   (file_read(sffh->fh, &sffh->sfh.hdr, sizeof(sffh->sfh.hdr))
                                                                                                   == sizeof(sffh->sfh.hdr))) {
                   sffh->stat = SFFILEH_BLOCK;
                   sffh->sfh.pos = 0;
                   return(STATFLAG_SUCCESS);
           }
           sffh->stat = SFFILEH_ERROR;
           return(STATFLAG_FAILURE);
   }
   
   int statflag_read(STFLAGH sfh, void *buf, UINT size) {
   
           if ((sfh == NULL) || (buf == NULL) ||
                   ((sfh->pos + size) > sfh->hdr.size)) {
                   goto sfr_err;
           }
           if (size) {
                   if (file_read(((SFFILEH)sfh)->fh, buf, size) != size) {
                           goto sfr_err;
                   }
                   sfh->pos += size;
           }
           return(STATFLAG_SUCCESS);
   
   sfr_err:
           return(STATFLAG_FAILURE);
   }
   
   static SFFILEH statflag_create(const OEMCHAR *filename) {
   
           SFFILEH ret;
           FILEH   fh;
   
           ret = (SFFILEH)_MALLOC(sizeof(_SFFILEH), filename);
           if (ret == NULL) {
                   goto sfc_err1;
           }
           fh = file_create(filename);
           if (fh == FILEH_INVALID) {
                   goto sfc_err2;
           }
           if (file_write(fh, &np2flagdef, sizeof(NP2FHDR)) == sizeof(NP2FHDR)) {
                   ZeroMemory(ret, sizeof(_SFFILEH));
                   ret->stat = SFFILEH_WRITE;
                   ret->fh = fh;
                   ret->secpos = sizeof(NP2FHDR);
                   return(ret);
           }
           file_close(fh);
           file_delete(filename);
   
   sfc_err2:
           _MFREE(ret);
   
   sfc_err1:
           return(NULL);
   }
   
   static int statflag_createsection(SFFILEH sffh, const SFENTRY *tbl) {
   
           int             ret;
   
           ret = statflag_closesection(sffh);
           if (ret != STATFLAG_SUCCESS) {
                   return(ret);
           }
           if (sffh->stat != SFFILEH_WRITE) {
                   sffh->stat = SFFILEH_ERROR;
                   return(STATFLAG_FAILURE);
           }
           CopyMemory(sffh->sfh.hdr.index, tbl->index, sizeof(sffh->sfh.hdr.index));
           sffh->sfh.hdr.ver = tbl->ver;
           sffh->sfh.hdr.size = 0;
           return(STATFLAG_SUCCESS);
   }
   
   int statflag_write(STFLAGH sfh, const void *buf, UINT size) {
   
           SFFILEH sffh;
   
           if (sfh == NULL) {
                   goto sfw_err1;
           }
           sffh = (SFFILEH)sfh;
           if (!(sffh->stat & SFFILEH_WRITE)) {
                   goto sfw_err2;
           }
           if (!(sffh->stat & SFFILEH_BLOCK)) {
                   sffh->stat |= SFFILEH_BLOCK;
                   sfh->pos = 0;
                   if (file_write(sffh->fh, &sfh->hdr, sizeof(sfh->hdr))
                                                                                                                   != sizeof(sfh->hdr)) {
                           goto sfw_err2;
                   }
           }
           if (size) {
                   if ((buf == NULL) || (file_write(sffh->fh, buf, size) != size)) {
                           goto sfw_err2;
                   }
                   sfh->pos += size;
                   if (sfh->hdr.size < sfh->pos) {
                           sfh->hdr.size = sfh->pos;
                   }
           }
           return(STATFLAG_SUCCESS);
   
   sfw_err2:
           sffh->stat = SFFILEH_ERROR;
   
   sfw_err1:
           return(STATFLAG_FAILURE);
   }
   
   static void statflag_close(SFFILEH sffh) {
   
           if (sffh) {
                   statflag_closesection(sffh);
                   file_close(sffh->fh);
                   _MFREE(sffh);
           }
   }
   
   void statflag_seterr(STFLAGH sfh, const OEMCHAR *str) {
   
           if ((sfh) && (sfh->errlen)) {
                   milstr_ncat(sfh->err, str, sfh->errlen);
                   milstr_ncat(sfh->err, CRCONST, sfh->errlen);
           }
   }
   
   
   // ---- function
   
 // 関数ポインタを intに変更。  // 関数ポインタを intに変更。
 static BOOL proc2num(void *func, const PROCTBL *tbl, int size) {  static BRESULT proc2num(void *func, const PROCTBL *tbl, int size) {
   
         int             i;          int             i;
   
Line 121  static BOOL proc2num(void *func, const P Line 350  static BOOL proc2num(void *func, const P
         return(FAILURE);          return(FAILURE);
 }  }
   
 static BOOL num2proc(void *func, const PROCTBL *tbl, int size) {  static BRESULT num2proc(void *func, const PROCTBL *tbl, int size) {
   
         int             i;          int             i;
   
Line 136  static BOOL num2proc(void *func, const P Line 365  static BOOL num2proc(void *func, const P
 }  }
   
   
 // ----  // ---- file
   
 typedef struct {  typedef struct {
         FILEH           fh;          OEMCHAR path[MAX_PATH];
         long            pos;          UINT    ftype;
         long            bak;          int             readonly;
         long            next;          DOSDATE date;
         NP2FHDR         f;          DOSTIME time;
         NP2FLAGPART_T   p;  } STATPATH;
 } NP2FFILE;  
   
 static int flagopen(NP2FFILE *f, const char *filename, ERR_BUF *e) {  
   
         if (f) {  
                 f->fh = file_open(filename);  
                 if (f->fh == FILEH_INVALID) {  
                         return(NP2FLAG_FAILURE);  
                 }  
                 if (file_read(f->fh, &f->f, sizeof(NP2FHDR))  
                                                                                                 != sizeof(NP2FHDR)) {  
                         file_close(f->fh);  
                         return(NP2FLAG_FAILURE);  
                 }  
                 f->pos = sizeof(NP2FHDR);  
                 if (strcmp(f->f.name, np2flagdef.name)) {  
                         file_close(f->fh);  
                         return(NP2FLAG_FAILURE);  
                 }  
                 if (strcmp(f->f.vername, np2flagdef.vername)) {  
 #if 1  
                         file_close(f->fh);  
                         return(NP2FLAG_FAILURE);  
 #else  
                         return(NP2FLAG_VERSION);                        // 他形式を読むのであれば…  
 #endif  
                 }  
                 if (f->f.ver != np2flagdef.ver) {  
 #if 1  
                         file_close(f->fh);  
                         return(NP2FLAG_FAILURE);  
 #else  
                         return(NP2FLAG_VERSION);                        // 他verを読むのであれば…  
 #endif  
                 }  
                 return(NP2FLAG_SUCCESS);  
         }  
         (void)e;  
         return(NP2FLAG_FAILURE);  
 }  
   
 static int flagcreate(NP2FFILE *f, const char *filename) {  static const OEMCHAR str_updated[] = OEMTEXT("%s: updated");
   static const OEMCHAR str_notfound[] = OEMTEXT("%s: not found");
   
         if (f) {  static int statflag_writepath(STFLAGH sfh, const OEMCHAR *path,
                 f->fh = file_create(filename);                                                                                                  UINT ftype, int readonly) {
                 if (f->fh == FILEH_INVALID) {  
                         return(NP2FLAG_FAILURE);  
                 }  
                 if (file_write(f->fh, &np2flagdef, sizeof(NP2FHDR))  
                                                                                                                 != sizeof(NP2FHDR)) {  
                         file_close(f->fh);  
                         return(NP2FLAG_FAILURE);  
                 }  
                 f->pos = sizeof(NP2FHDR);  
                 return(NP2FLAG_SUCCESS);  
         }  
         return(NP2FLAG_FAILURE);  
 }  
   
 static int flagload_create(NP2FFILE *f) {          STATPATH        sp;
           FILEH           fh;
   
         if (f) {          ZeroMemory(&sp, sizeof(sp));
                 ZeroMemory(&f->p, sizeof(NP2FLAGPART_T));          if ((path) && (path[0])) {
                 if (f->pos & 15) {                  file_cpyname(sp.path, path, NELEMENTS(sp.path));
                         f->pos += 15;                  sp.ftype = ftype;
                         f->pos &= ~0xf;                  sp.readonly = readonly;
                         if (file_seek(f->fh, f->pos, 0) != f->pos) {                  fh = file_open_rb(path);
                                 return(NP2FLAG_FAILURE);                  if (fh != FILEH_INVALID) {
                         }                          file_getdatetime(fh, &sp.date, &sp.time);
                 }                          file_close(fh);
                 if (file_read(f->fh, &f->p, sizeof(NP2FLAGPART_T))  
                                                                                                 != sizeof(NP2FLAGPART_T)) {  
                         return(NP2FLAG_FAILURE);  
                 }                  }
                 f->pos += sizeof(NP2FLAGPART_T);  
                 f->next = f->pos + f->p.size;  
                 return(NP2FLAG_SUCCESS);  
         }  
         return(NP2FLAG_FAILURE);  
 }  
   
 static int flagload_load(NP2FFILE *f, void *buf, UINT size) {  
   
         if (f && buf && size && (file_read(f->fh, buf, size) == size)) {  
                 f->pos += size;  
                 return(NP2FLAG_SUCCESS);  
         }          }
         return(NP2FLAG_FAILURE);          return(statflag_write(sfh, &sp, sizeof(sp)));
 }  }
   
 static int flagload_close(NP2FFILE *f) {  static int statflag_checkpath(STFLAGH sfh, const OEMCHAR *devname) {
   
         if (file_seek(f->fh, f->next, 0) != f->next) {  
                 return(NP2FLAG_FAILURE);  
         }  
         f->pos = f->next;  
         return(NP2FLAG_SUCCESS);  
 }  
   
 static int flagsave_create(NP2FFILE *f, const STENTRY *t) {          int                     ret;
           STATPATH        sp;
           FILEH           fh;
           OEMCHAR         buf[256];
           DOSDATE         date;
           DOSTIME         time;
   
         if (f && t) {          ret = statflag_read(sfh, &sp, sizeof(sp));
                 int             len;          if (sp.path[0]) {
                 ZeroMemory(&f->p, sizeof(NP2FLAGPART_T));                  fh = file_open_rb(sp.path);
                 if (f->pos & 15) {                  if (fh != FILEH_INVALID) {
                         UINT rem;                          file_getdatetime(fh, &date, &time);
                         rem = 16 - (f->pos & 15);                          file_close(fh);
                         if (file_write(f->fh, &f->p, rem) != rem) {                          if ((memcmp(&sp.date, &date, sizeof(date))) ||
                                 return(NP2FLAG_FAILURE);                                  (memcmp(&sp.time, &time, sizeof(time)))) {
                                   ret |= STATFLAG_DISKCHG;
                                   OEMSPRINTF(buf, str_updated, devname);
                                   statflag_seterr(sfh, buf);
                         }                          }
                         f->pos += rem;  
                 }  
                 f->bak = f->pos;  
   
                 len = strlen(t->index);  
                 if (len >= 10) {  
                         len = 10;  
                 }  
                 if (len) {  
                         CopyMemory(f->p.index, t->index, len);  
                 }                  }
                 f->p.ver = t->ver;                  else {
                 if (file_write(f->fh, &f->p, sizeof(NP2FLAGPART_T))                          ret |= STATFLAG_DISKCHG;
                                                                                                 != sizeof(NP2FLAGPART_T)) {                          OEMSPRINTF(buf, str_notfound, devname);
                         return(NP2FLAG_FAILURE);                          statflag_seterr(sfh, buf);
                 }                  }
                 f->pos += sizeof(NP2FLAGPART_T);  
                 return(NP2FLAG_SUCCESS);  
         }          }
         return(NP2FLAG_FAILURE);          return(ret);
 }  }
   
 static int flagsave_save(NP2FFILE *f, void *buf, UINT size) {  
   
         if (f && buf && size && (file_write(f->fh, buf, size) == size)) {  // ---- common
                 f->pos += size;  
                 f->p.size += size;  
                 return(NP2FLAG_SUCCESS);  
         }  
         return(NP2FLAG_FAILURE);  
 }  
   
 static int flagsave_close(NP2FFILE *f) {  static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) {
   
         if (!f) {          return(statflag_write(sfh, tbl->arg1, tbl->arg2));
                 goto fs_closeerr;  
         }  
         if (file_seek(f->fh, f->bak, 0) != f->bak) {  
                 goto fs_closeerr;  
         }  
         if (file_write(f->fh, &f->p, sizeof(NP2FLAGPART_T))  
                                                                                                 != sizeof(NP2FLAGPART_T)) {  
                 goto fs_closeerr;  
         }  
         if (file_seek(f->fh, f->pos, 0) == f->pos) {  
                 return(NP2FLAG_SUCCESS);  
         }  
   
 fs_closeerr:  
         return(NP2FLAG_FAILURE);  
 }  }
   
 static void flagclose(NP2FFILE *f) {  static int flagload_common(STFLAGH sfh, const SFENTRY *tbl) {
   
         if (f) {          return(statflag_read(sfh, tbl->arg1, tbl->arg2));
                 file_close(f->fh);  
         }  
 }  }
   
   
 // ----  // ---- memory
   
 static int flagsave_term(NP2FFILE *f, const STENTRY *t) {  static int flagsave_mem(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
   
         ret = flagsave_create(f, t);          ret = statflag_write(sfh, mem, 0x110000);
         ret |= flagsave_close(f);          ret |= statflag_write(sfh, mem + VRAM1_B, 0x18000);
           ret |= statflag_write(sfh, mem + VRAM1_E, 0x8000);
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
   static int flagload_mem(STFLAGH sfh, const SFENTRY *tbl) {
 // ----  
   
 static int flagsave_common(NP2FFILE *f, const STENTRY *t) {  
   
         int             ret;          int             ret;
   
         ret = flagsave_create(f, t);          ret = statflag_read(sfh, mem, 0x110000);
         if (ret != NP2FLAG_FAILURE) {          ret |= statflag_read(sfh, mem + VRAM1_B, 0x18000);
                 ret |= flagsave_save(f, t->arg1, t->arg2);          ret |= statflag_read(sfh, mem + VRAM1_E, 0x8000);
                 ret |= flagsave_close(f);          (void)tbl;
         }  
         return(ret);          return(ret);
 }  }
   
 static int flagload_common(NP2FFILE *f, const STENTRY *t) {  
   
         return(flagload_load(f, t->arg1, t->arg2));  // ---- cg window
 }  
   
   #if defined(CGWND_FONTPTR)
   static int flagsave_cgwnd(STFLAGH sfh, const SFENTRY *tbl) {
   
 // -----          _CGWINDOW       cgwnd;
   
           cgwnd = cgwindow;
           cgwnd.fontlow -= (long)fontrom;
           cgwnd.fonthigh -= (long)fontrom;
           (void)tbl;
           return(statflag_write(sfh, &cgwindow, sizeof(cgwindow)));
   }
   
 static int flagload_core(NP2FFILE *f, const STENTRY *t) {  static int flagload_cgwnd(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
   
         ret = flagload_common(f, t);          ret = statflag_read(sfh, &cgwindow, sizeof(cgwindow));
         if (opna_rate) {          cgwindow.fontlow += (long)fontrom;
                 pc.sampleclock = (pc.realclock / opna_rate) + 1;          cgwindow.fonthigh += (long)fontrom;
         }          (void)tbl;
         else {  
                 pc.sampleclock = 0;  
         }  
         return(ret);          return(ret);
 }  }
   #endif
   
   
 // -----  // ---- dma
   
 static int flagsave_dma(NP2FFILE *f, const STENTRY *t) {  static int flagsave_dma(STFLAGH sfh, const SFENTRY *tbl) {
   
         int                     ret;  
         int                     i;          int                     i;
         _DMAC           dmabak;          _DMAC           dmabak;
   
         dmabak = dmac;          dmabak = dmac;
         for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
                 if ((PROC2NUM(dmabak.dmach[i].outproc, dmaproc)) ||                  if ((PROC2NUM(dmabak.dmach[i].proc.outproc, dmaproc)) ||
                         (PROC2NUM(dmabak.dmach[i].inproc, dmaproc)) ||                          (PROC2NUM(dmabak.dmach[i].proc.inproc, dmaproc)) ||
                         (PROC2NUM(dmabak.dmach[i].extproc, dmaproc))) {                          (PROC2NUM(dmabak.dmach[i].proc.extproc, dmaproc))) {
                         return(NP2FLAG_FAILURE);                          return(STATFLAG_FAILURE);
                 }                  }
         }          }
         ret = flagsave_create(f, t);          (void)tbl;
         if (ret != NP2FLAG_FAILURE) {          return(statflag_write(sfh, &dmabak, sizeof(dmabak)));
                 ret |= flagsave_save(f, &dmabak, sizeof(dmabak));  
                 ret |= flagsave_close(f);  
         }  
         return(ret);  
 }  }
   
 static int flagload_dma(NP2FFILE *f, const STENTRY *t) {  static int flagload_dma(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         int             i;          int             i;
   
         ret = flagload_load(f, &dmac, sizeof(dmac));          ret = statflag_read(sfh, &dmac, sizeof(dmac));
   
         for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
                 if (NUM2PROC(dmac.dmach[i].outproc, dmaproc)) {                  if (NUM2PROC(dmac.dmach[i].proc.outproc, dmaproc)) {
                         dmac.dmach[i].outproc = dma_dummyout;                          dmac.dmach[i].proc.outproc = dma_dummyout;
                         ret |= NP2FLAG_WARNING;                          ret |= STATFLAG_WARNING;
                 }                  }
                 if (NUM2PROC(dmac.dmach[i].inproc, dmaproc)) {                  if (NUM2PROC(dmac.dmach[i].proc.inproc, dmaproc)) {
                         dmac.dmach[i].inproc = dma_dummyin;                          dmac.dmach[i].proc.inproc = dma_dummyin;
                         ret |= NP2FLAG_WARNING;                          ret |= STATFLAG_WARNING;
                 }                  }
                 if (NUM2PROC(dmac.dmach[i].extproc, dmaproc)) {                  if (NUM2PROC(dmac.dmach[i].proc.extproc, dmaproc)) {
                         dmac.dmach[i].extproc = dma_dummyproc;                          dmac.dmach[i].proc.extproc = dma_dummyproc;
                         ret |= NP2FLAG_WARNING;                          ret |= STATFLAG_WARNING;
                 }                  }
         }          }
         (void)t;          (void)tbl;
         return(ret);          return(ret);
 }  }
   
   
 // -----  // ---- egc
   
 static int flagsave_egc(NP2FFILE *f, const STENTRY *t) {  static int flagsave_egc(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;  
         _EGC    egcbak;          _EGC    egcbak;
   
         egcbak = egc;          egcbak = egc;
         egcbak.inptr -= (long)egc.buf;          egcbak.inptr -= (long)egc.buf;
         egcbak.outptr -= (long)egc.buf;          egcbak.outptr -= (long)egc.buf;
           (void)tbl;
         ret = flagsave_create(f, t);          return(statflag_write(sfh, &egcbak, sizeof(egcbak)));
         if (ret != NP2FLAG_FAILURE) {  
                 ret |= flagsave_save(f, &egcbak, sizeof(egcbak));  
                 ret |= flagsave_close(f);  
         }  
         return(ret);  
 }  }
   
 static int flagload_egc(NP2FFILE *f, const STENTRY *t) {  static int flagload_egc(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
   
         ret = flagload_load(f, &egc, sizeof(egc));          ret = statflag_read(sfh, &egc, sizeof(egc));
         egc.inptr += (long)egc.buf;          egc.inptr += (long)egc.buf;
         egc.outptr += (long)egc.buf;          egc.outptr += (long)egc.buf;
         (void)t;          (void)tbl;
         return(ret);          return(ret);
 }  }
   
   
 // -----  // ---- epson
   
 static int flagsave_ext(NP2FFILE *f, const STENTRY *t) {  static int flagsave_epson(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
   
         ret = flagsave_create(f, t);          if (!(pccore.model & PCMODEL_EPSON)) {
         if (ret != NP2FLAG_FAILURE) {                  return(STATFLAG_SUCCESS);
                 ret |= flagsave_save(f, &extmem, sizeof(extmem));  
                 if (extmemmng_size) {  
                         ret |= flagsave_save(f, extmemmng_ptr, extmemmng_size);  
                 }  
                 ret |= flagsave_close(f);  
         }          }
           ret = statflag_write(sfh, &epsonio, sizeof(epsonio));
           ret |= statflag_write(sfh, mem + 0x1c0000, 0x8000);
           ret |= statflag_write(sfh, mem + 0x1e8000, 0x18000);
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int flagload_ext(NP2FFILE *f, const STENTRY *t) {  static int flagload_epson(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         int             i;  
         UINT    pagemax = 0;  
   
         ret = flagload_load(f, &extmem, sizeof(extmem));          ret = statflag_read(sfh, &epsonio, sizeof(epsonio));
         if (extmem.maxmem) {          ret |= statflag_read(sfh, mem + 0x1c0000, 0x8000);
                 if (extmem.maxmem > (13+1)) {          ret |= statflag_read(sfh, mem + 0x1e8000, 0x18000);
                         extmem.maxmem = (13+1);          (void)tbl;
                 }  
                 if (!extmemmng_realloc(extmem.maxmem - 1)) {  
                         pagemax = (extmem.maxmem - 1) << 8;  
                         if (extmemmng_size) {  
                                 ret |= flagload_load(f, extmemmng_ptr, extmemmng_size);  
                         }  
                 }  
                 else {  
                         extmem.maxmem = 0;  
                 }  
         }  
         for (i=0; i<4; i++) {  
                 if (extmem.page[i] < pagemax) {  
                         extmem.pageptr[i] = extmemmng_ptr + (extmem.page[i] << 12);  
                 }  
                 else {  
                         extmem.pageptr[i] = mem + 0xc0000 + (i << 14);  
                 }  
         }  
         (void)t;  
         return(ret);          return(ret);
 }  }
   
   
 // -----  // ---- event
   
 typedef struct {  typedef struct {
         SINT32          remainclock;  
         SINT32          baseclock;  
         UINT32          clock;  
         UINT            readyevents;          UINT            readyevents;
         UINT            waitevents;          UINT            waitevents;
 } NEVTSAVE;  } NEVTSAVE;
Line 513  typedef struct { Line 607  typedef struct {
         NEVENTCB        proc;          NEVENTCB        proc;
 } NEVTITEM;  } NEVTITEM;
   
 static int nevent_save(NP2FFILE *f, int num) {  static int nevent_write(STFLAGH sfh, int num) {
   
         NEVTITEM        nit;          NEVTITEM        nit;
         UINT            i;          UINT            i;
   
         ZeroMemory(&nit, sizeof(nit));          ZeroMemory(&nit, sizeof(nit));
         for (i=0; i<sizeof(evtnum)/sizeof(ENUMTBL); i++) {          for (i=0; i<NELEMENTS(evtnum); i++) {
                 if (evtnum[i].num == num) {                  if (evtnum[i].num == num) {
                         nit.id = evtnum[i].id;                          nit.id = evtnum[i].id;
                         break;                          break;
Line 531  static int nevent_save(NP2FFILE *f, int  Line 625  static int nevent_save(NP2FFILE *f, int 
         if (PROC2NUM(nit.proc, evtproc)) {          if (PROC2NUM(nit.proc, evtproc)) {
                 nit.proc = NULL;                  nit.proc = NULL;
         }          }
         return(flagsave_save(f, &nit, sizeof(nit)));          return(statflag_write(sfh, &nit, sizeof(nit)));
 }  }
   
 static int flagsave_evt(NP2FFILE *f, const STENTRY *t) {  static int flagsave_evt(STFLAGH sfh, const SFENTRY *tbl) {
   
         NEVTSAVE        nevt;          NEVTSAVE        nevt;
         int                     ret;          int                     ret;
         UINT            i;          UINT            i;
   
         nevt.remainclock = nevent.remainclock;  
         nevt.baseclock = nevent.baseclock;  
         nevt.clock = nevent.clock;  
         nevt.readyevents = nevent.readyevents;          nevt.readyevents = nevent.readyevents;
         nevt.waitevents = nevent.waitevents;          nevt.waitevents = nevent.waitevents;
   
         ret = flagsave_create(f, t);          ret = statflag_write(sfh, &nevt, sizeof(nevt));
         if (ret != NP2FLAG_FAILURE) {          for (i=0; i<nevt.readyevents; i++) {
                 ret |= flagsave_save(f, &nevt, sizeof(nevt));                  ret |= nevent_write(sfh, nevent.level[i]);
                 for (i=0; i<nevt.readyevents; i++) {          }
                         ret |= nevent_save(f, nevent.level[i]);          for (i=0; i<nevt.waitevents; i++) {
                 }                  ret |= nevent_write(sfh, nevent.waitevent[i]);
                 for (i=0; i<nevt.waitevents; i++) {  
                         ret |= nevent_save(f, nevent.waitevent[i]);  
                 }  
                 ret |= flagsave_close(f);  
         }          }
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int nevent_load(NP2FFILE *f, UINT *tbl, UINT *pos) {  static int nevent_read(STFLAGH sfh, UINT *tbl, UINT *pos) {
   
         int                     ret;          int                     ret;
         NEVTITEM        nit;          NEVTITEM        nit;
         UINT            i;          UINT            i;
         UINT            num;          UINT            num;
   
         ret = flagload_load(f, &nit, sizeof(nit));          ret = statflag_read(sfh, &nit, sizeof(nit));
   
         for (i=0; i<sizeof(evtnum)/sizeof(ENUMTBL); i++) {          for (i=0; i<NELEMENTS(evtnum); i++) {
                 if (nit.id == evtnum[i].id) {                  if (nit.id == evtnum[i].id) {
                         break;                          break;
                 }                  }
         }          }
         if (i < (sizeof(evtnum)/sizeof(ENUMTBL))) {          if (i < NELEMENTS(evtnum)) {
                 num = evtnum[i].num;                  num = evtnum[i].num;
                 nevent.item[num].clock = nit.clock;                  nevent.item[num].clock = nit.clock;
                 nevent.item[num].flag = nit.flag;                  nevent.item[num].flag = nit.flag;
                 nevent.item[num].proc = nit.proc;                  nevent.item[num].proc = nit.proc;
                 if (NUM2PROC(nevent.item[num].proc, evtproc)) {                  if (NUM2PROC(nevent.item[num].proc, evtproc)) {
                         ret |= NP2FLAG_WARNING;                          ret |= STATFLAG_WARNING;
                 }                  }
                 else {                  else {
                         tbl[*pos] = num;                          tbl[*pos] = num;
Line 588  static int nevent_load(NP2FFILE *f, UINT Line 676  static int nevent_load(NP2FFILE *f, UINT
                 }                  }
         }          }
         else {          else {
                 ret |= NP2FLAG_WARNING;                  ret |= STATFLAG_WARNING;
         }          }
         return(ret);          return(ret);
 }  }
   
 static int flagload_evt(NP2FFILE *f, const STENTRY *t) {  static int flagload_evt(STFLAGH sfh, const SFENTRY *tbl) {
   
         int                     ret;          int                     ret;
         NEVTSAVE        nevt;          NEVTSAVE        nevt;
         UINT            i;          UINT            i;
   
         ret = flagload_load(f, &nevt, sizeof(nevt));          ret = statflag_read(sfh, &nevt, sizeof(nevt));
   
         nevent.remainclock = nevt.remainclock;  
         nevent.baseclock = nevt.baseclock;  
         nevent.clock = nevt.clock;  
         nevent.readyevents = 0;          nevent.readyevents = 0;
         nevent.waitevents = 0;          nevent.waitevents = 0;
   
         for (i=0; i<nevt.readyevents; i++) {          for (i=0; i<nevt.readyevents; i++) {
                 ret |= nevent_load(f, nevent.level, &nevent.readyevents);                  ret |= nevent_read(sfh, nevent.level, &nevent.readyevents);
         }          }
         for (i=0; i<nevt.waitevents; i++) {          for (i=0; i<nevt.waitevents; i++) {
                 ret |= nevent_load(f, nevent.waitevent, &nevent.waitevents);                  ret |= nevent_read(sfh, nevent.waitevent, &nevent.waitevents);
         }          }
         (void)t;          (void)tbl;
         return(ret);          return(ret);
 }  }
   
   
 // ----  // ---- extmem
   
 static int flagsave_gij(NP2FFILE *f, const STENTRY *t) {  static int flagsave_ext(STFLAGH sfh, const SFENTRY *tbl) {
   
           int             ret;
   
           ret = STATFLAG_SUCCESS;
           if (CPU_EXTMEM) {
                   ret = statflag_write(sfh, CPU_EXTMEM, CPU_EXTMEMSIZE);
           }
           (void)tbl;
           return(ret);
   }
   
   static int flagload_ext(STFLAGH sfh, const SFENTRY *tbl) {
   
           int             ret;
   
           ret = STATFLAG_SUCCESS;
           if (CPU_EXTMEM) {
                   ret = statflag_read(sfh, CPU_EXTMEM, CPU_EXTMEMSIZE);
           }
           (void)tbl;
           return(ret);
   }
   
   
   // ---- gaiji
   
   static int flagsave_gij(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         int             i;          int             i;
         int             j;          int             j;
         BYTE    *fnt;  const UINT8     *fnt;
   
         ret = flagsave_create(f, t);          ret = STATFLAG_SUCCESS;
         if (ret != NP2FLAG_FAILURE) {          for (i=0; i<2; i++) {
                 for (i=0; i<2; i++) {                  fnt = fontrom + ((0x56 + (i << 7)) << 4);
                         fnt = font + ((0x56 + (i << 7)) << 4);                  for (j=0; j<0x80; j++) {
                         for (j=0; j<0x80; j++) {                          ret |= statflag_write(sfh, fnt, 32);
                                 ret |= flagsave_save(f, fnt, 32);                          fnt += 0x1000;
                                 fnt += 0x1000;  
                         }  
                 }                  }
                 ret |= flagsave_close(f);  
         }          }
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int flagload_gij(NP2FFILE *f, const STENTRY *t) {  static int flagload_gij(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         int             i;          int             i;
         int             j;          int             j;
         BYTE    *fnt;          UINT8   *fnt;
   
         ret = 0;          ret = 0;
         for (i=0; i<2; i++) {          for (i=0; i<2; i++) {
                 fnt = font + ((0x56 + (i << 7)) << 4);                  fnt = fontrom + ((0x56 + (i << 7)) << 4);
                 for (j=0; j<0x80; j++) {                  for (j=0; j<0x80; j++) {
                         ret |= flagload_load(f, fnt, 32);                          ret |= statflag_read(sfh, fnt, 32);
                         fnt += 0x1000;                          fnt += 0x1000;
                 }                  }
         }          }
         (void)t;          (void)tbl;
         return(ret);          return(ret);
 }  }
   
   
 // -----  // ---- FM
   
   #if !defined(DISABLE_SOUND)
   
 enum {  enum {
         FLAG_MG                 = 0x0001,          FLAG_MG                 = 0x0001,
Line 671  enum { Line 783  enum {
         FLAG_FM2B               = 0x0010,          FLAG_FM2B               = 0x0010,
         FLAG_PSG1               = 0x0020,          FLAG_PSG1               = 0x0020,
         FLAG_PSG2               = 0x0040,          FLAG_PSG2               = 0x0040,
         FLAG_RHYTHM             = 0x0080,          FLAG_PSG3               = 0x0080,
         FLAG_ADPCM              = 0x0100,          FLAG_RHYTHM             = 0x0100,
         FLAG_PCM86              = 0x0200,          FLAG_ADPCM              = 0x0200,
         FLAG_CS4231             = 0x0400          FLAG_PCM86              = 0x0400,
           FLAG_CS4231             = 0x0800
 };  };
   
 typedef struct {  typedef struct {
         BYTE    keyreg[OPNCH_MAX];          UINT8   keyreg[OPNCH_MAX];
         BYTE    extop[4];          UINT8   extop[4];
 } OPNKEY;  } OPNKEY;
   
 static int flagsave_fm(NP2FFILE *f, const STENTRY *t) {  static int flagsave_fm(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         UINT    saveflg;          UINT    saveflg;
Line 727  static int flagsave_fm(NP2FFILE *f, cons Line 840  static int flagsave_fm(NP2FFILE *f, cons
                                                                                 FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM;                                                                                  FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM;
                         break;                          break;
   
                   case 0x80:
                           saveflg = FLAG_PSG1 | FLAG_PSG2 | FLAG_PSG3;
                           break;
   
                 default:                  default:
                         saveflg = 0;                          saveflg = 0;
                         break;                          break;
         }          }
   
         ret = flagsave_create(f, t);          ret = statflag_write(sfh, &usesound, sizeof(usesound));
         if (ret != NP2FLAG_FAILURE) {          if (saveflg & FLAG_MG) {
                 ret |= flagsave_save(f, &usesound, sizeof(usesound));                  ret |= statflag_write(sfh, &musicgen, sizeof(musicgen));
   
                 if (saveflg & FLAG_MG) {  
                         ret |= flagsave_save(f, &musicgen, sizeof(musicgen));  
                 }  
                 if (saveflg & FLAG_FM1A) {  
                         ret |= flagsave_save(f, &fmtimer, sizeof(fmtimer));  
                         ret |= flagsave_save(f, &opn, sizeof(opn));  
                         CopyMemory(opnkey.keyreg, opngen.keyreg, sizeof(opngen.keyreg));  
                         opnkey.extop[0] = opnch[2].extop;  
                         opnkey.extop[1] = opnch[5].extop;  
                         opnkey.extop[2] = opnch[8].extop;  
                         opnkey.extop[3] = opnch[11].extop;  
                         ret |= flagsave_save(f, &opnkey, sizeof(opnkey));  
                 }  
                 if (saveflg & FLAG_PSG1) {  
                         ret |= flagsave_save(f, &psg1.reg, sizeof(PSGREG));  
                 }  
                 if (saveflg & FLAG_PSG2) {  
                         ret |= flagsave_save(f, &psg2.reg, sizeof(PSGREG));  
                 }  
                 if (saveflg & FLAG_ADPCM) {  
                         ret |= flagsave_save(f, &adpcm, sizeof(adpcm));  
                 }  
                 if (saveflg & FLAG_PCM86) {  
                         ret |= flagsave_save(f, &pcm86, sizeof(pcm86));  
                 }  
                 if (saveflg & FLAG_CS4231) {  
                         ret |= flagsave_save(f, &cs4231, sizeof(cs4231));  
                 }  
                 ret |= flagsave_close(f);  
         }          }
         return(ret);          if (saveflg & FLAG_FM1A) {
 }                  ret |= statflag_write(sfh, &fmtimer, sizeof(fmtimer));
                   ret |= statflag_write(sfh, &opn, sizeof(opn));
 static void play_fmreg(BYTE num) {                  CopyMemory(opnkey.keyreg, opngen.keyreg, sizeof(opngen.keyreg));
                   opnkey.extop[0] = opnch[2].extop;
         UINT    chbase;                  opnkey.extop[1] = opnch[5].extop;
         UINT    reg;                  opnkey.extop[2] = opnch[8].extop;
         UINT    i;                  opnkey.extop[3] = opnch[11].extop;
                   ret |= statflag_write(sfh, &opnkey, sizeof(opnkey));
         chbase = num * 3;  
         reg = num * 0x100;  
         for (i=0x30; i<0xa0; i++) {  
                 opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);  
         }          }
         for (i=0xb7; i>=0xa0; i--) {          if (saveflg & FLAG_PSG1) {
                 opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);                  ret |= statflag_write(sfh, &psg1.reg, sizeof(PSGREG));
         }          }
         for (i=0; i<3; i++) {          if (saveflg & FLAG_PSG2) {
                 opngen_keyon(chbase + i, opngen.keyreg[chbase + i]);                  ret |= statflag_write(sfh, &psg2.reg, sizeof(PSGREG));
         }          }
 }          if (saveflg & FLAG_PSG3) {
                   ret |= statflag_write(sfh, &psg3.reg, sizeof(PSGREG));
 static void play_psgreg(PSGGEN psg) {  
   
         BYTE    i;  
   
         for (i=0; i<0x0e; i++) {  
                 psggen_setreg(psg, i, ((BYTE *)&psg->reg)[i]);  
         }          }
           if (saveflg & FLAG_ADPCM) {
                   ret |= statflag_write(sfh, &adpcm, sizeof(adpcm));
           }
           if (saveflg & FLAG_PCM86) {
                   ret |= statflag_write(sfh, &pcm86, sizeof(pcm86));
           }
           if (saveflg & FLAG_CS4231) {
                   ret |= statflag_write(sfh, &cs4231, sizeof(cs4231));
           }
           (void)tbl;
           return(ret);
 }  }
   
 static int flagload_fm(NP2FFILE *f, const STENTRY *t) {  static int flagload_fm(STFLAGH sfh, const SFENTRY *t) {
   
         int             ret;          int             ret;
         UINT    saveflg;          UINT    saveflg;
         OPNKEY  opnkey;          OPNKEY  opnkey;
   
         opngen_reset();          ret = statflag_read(sfh, &usesound, sizeof(usesound));
         psggen_reset(&psg1);          fmboard_reset(usesound);
         psggen_reset(&psg2);  
         psggen_reset(&psg3);  
         rhythm_reset(&rhythm);  
         adpcm_reset(&adpcm);  
         pcm86_reset();  
         cs4231_reset();  
   
         ret = flagload_load(f, &usesound, sizeof(usesound));  
         fmboard_reset((BYTE)usesound);  
   
         switch(usesound) {          switch(usesound) {
                 case 0x01:                  case 0x01:
Line 854  static int flagload_fm(NP2FFILE *f, cons Line 933  static int flagload_fm(NP2FFILE *f, cons
                                                                                 FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM;                                                                                  FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM;
                         break;                          break;
   
                   case 0x80:
                           saveflg = FLAG_PSG1 | FLAG_PSG2 | FLAG_PSG3;
                           break;
   
                 default:                  default:
                           saveflg = 0;
                         break;                          break;
         }          }
   
         if ((saveflg & FLAG_MG) && (f->p.ver != 0)) {          if (saveflg & FLAG_MG) {
                 ret |= flagload_load(f, &musicgen, sizeof(musicgen));                  ret |= statflag_read(sfh, &musicgen, sizeof(musicgen));
                 board14_allkeymake();                  board14_allkeymake();
         }          }
   
         if (saveflg & FLAG_FM1A) {          if (saveflg & FLAG_FM1A) {
                 ret |= flagload_load(f, &fmtimer, sizeof(fmtimer));                  ret |= statflag_read(sfh, &fmtimer, sizeof(fmtimer));
                 ret |= flagload_load(f, &opn, sizeof(opn));                  ret |= statflag_read(sfh, &opn, sizeof(opn));
                 ret |= flagload_load(f, &opnkey, sizeof(opnkey));                  ret |= statflag_read(sfh, &opnkey, sizeof(opnkey));
                 CopyMemory(opngen.keyreg, &opnkey.keyreg, sizeof(opngen.keyreg));                  CopyMemory(opngen.keyreg, &opnkey.keyreg, sizeof(opngen.keyreg));
                 opnch[2].extop = opnkey.extop[0];                  opnch[2].extop = opnkey.extop[0];
                 opnch[5].extop = opnkey.extop[1];                  opnch[5].extop = opnkey.extop[1];
Line 874  static int flagload_fm(NP2FFILE *f, cons Line 958  static int flagload_fm(NP2FFILE *f, cons
                 opnch[11].extop = opnkey.extop[3];                  opnch[11].extop = opnkey.extop[3];
         }          }
         if (saveflg & FLAG_PSG1) {          if (saveflg & FLAG_PSG1) {
                 ret |= flagload_load(f, &psg1.reg, sizeof(PSGREG));                  ret |= statflag_read(sfh, &psg1.reg, sizeof(PSGREG));
         }          }
         if (saveflg & FLAG_PSG2) {          if (saveflg & FLAG_PSG2) {
                 ret |= flagload_load(f, &psg2.reg, sizeof(PSGREG));                  ret |= statflag_read(sfh, &psg2.reg, sizeof(PSGREG));
           }
           if (saveflg & FLAG_PSG3) {
                   ret |= statflag_read(sfh, &psg3.reg, sizeof(PSGREG));
         }          }
         if (saveflg & FLAG_ADPCM) {          if (saveflg & FLAG_ADPCM) {
                 ret |= flagload_load(f, &adpcm, sizeof(adpcm));                  ret |= statflag_read(sfh, &adpcm, sizeof(adpcm));
         }          }
         if (saveflg & FLAG_PCM86) {          if (saveflg & FLAG_PCM86) {
                 ret |= flagload_load(f, &pcm86, sizeof(pcm86));                  ret |= statflag_read(sfh, &pcm86, sizeof(pcm86));
         }          }
         if (saveflg & FLAG_CS4231) {          if (saveflg & FLAG_CS4231) {
                 ret |= flagload_load(f, &cs4231, sizeof(cs4231));                  ret |= statflag_read(sfh, &cs4231, sizeof(cs4231));
                 cs4231.proc = cs4231dec[cs4231.reg.datafmt >> 4];  
         }          }
   
         // 復元。          // 復元。 これ移動すること!
         rhythm_update(&rhythm);  
         adpcm_update(&adpcm);          adpcm_update(&adpcm);
         pcm86gen_update();          pcm86gen_update();
         if (saveflg & FLAG_PCM86) {          if (saveflg & FLAG_PCM86) {
                 fmboard_extenable((BYTE)(pcm86.extfunc & 1));                  fmboard_extenable((REG8)(pcm86.extfunc & 1));
         }          }
         if (saveflg & FLAG_CS4231) {          if (saveflg & FLAG_CS4231) {
                 fmboard_extenable((BYTE)(cs4231.extfunc & 1));                  fmboard_extenable((REG8)(cs4231.extfunc & 1));
         }  
   
         if (saveflg & FLAG_FM1A) {  
                 play_fmreg(0);  
         }  
         if (saveflg & FLAG_FM1B) {  
                 play_fmreg(1);  
         }  
         if (saveflg & FLAG_FM2A) {  
                 play_fmreg(2);  
         }  
         if (saveflg & FLAG_FM2B) {  
                 play_fmreg(3);  
         }  
         if (saveflg & FLAG_PSG1) {  
                 play_psgreg(&psg1);  
         }  
         if (saveflg & FLAG_PSG2) {  
                 play_psgreg(&psg2);  
         }          }
         (void)t;          (void)t;
         return(ret);          return(ret);
 }  }
   #endif
   
   
 // ---- disk  // ---- fdd
   
 typedef struct {  static const OEMCHAR str_fddx[] = OEMTEXT("FDD%u");
         char    path[MAX_PATH];  
         int             readonly;  
         DOSDATE date;  
         DOSTIME time;  
 } STATDISK;  
   
 static int disksave(NP2FFILE *f, const char *path, int readonly) {  static int flagsave_fdd(STFLAGH sfh, const SFENTRY *tbl) {
   
         STATDISK        st;          int                     ret;
         FILEH           fh;          UINT8           i;
   const OEMCHAR   *path;
           UINT            ftype;
           int                     ro;
   
         ZeroMemory(&st, sizeof(st));          ret = STATFLAG_SUCCESS;
         if ((path) && (path[0])) {          for (i=0; i<4; i++) {
                 file_cpyname(st.path, path, sizeof(st.path));                  path = fdd_getfileex(i, &ftype, &ro);
                 st.readonly = readonly;                  ret |= statflag_writepath(sfh, path, ftype, ro);
                 fh = file_open_rb(path);  
                 if (fh != FILEH_INVALID) {  
                         file_getdatetime(fh, &st.date, &st.time);  
                         file_close(fh);  
                 }  
         }          }
         return(flagsave_save(f, &st, sizeof(st)));          (void)tbl;
           return(ret);
 }  }
   
 static int flagsave_disk(NP2FFILE *f, const STENTRY *t) {  static int flagcheck_fdd(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int             ret;
         BYTE    i;          int             i;
           OEMCHAR buf[8];
   
         sxsi_flash();          ret = STATFLAG_SUCCESS;
         ret = flagsave_create(f, t);          for (i=0; i<4; i++) {
         if (ret != NP2FLAG_FAILURE) {                  OEMSPRINTF(buf, str_fddx, i+1);
                 for (i=0; i<4; i++) {                  ret |= statflag_checkpath(sfh, buf);
                         ret |= disksave(f, fdd_diskname(i), fdd_diskprotect(i));          }
                 }          (void)tbl;
                 for (i=0x00; i<0x02; i++) {          return(ret);
                         ret |= disksave(f, sxsi_getname(i), 0);  }
                 }  
                 for (i=0x20; i<0x22; i++) {  static int flagload_fdd(STFLAGH sfh, const SFENTRY *tbl) {
                         ret |= disksave(f, sxsi_getname(i), 0);  
           int                     ret;
           UINT8           i;
           STATPATH        sp;
   
           ret = STATFLAG_SUCCESS;
           for (i=0; i<4; i++) {
                   ret |= statflag_read(sfh, &sp, sizeof(sp));
                   if (sp.path[0]) {
                           fdd_set(i, sp.path, sp.ftype, sp.readonly);
                 }                  }
                 ret |= flagsave_close(f);  
         }          }
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int diskcheck(NP2FFILE *f, const char *name, ERR_BUF *e) {  
   // ---- sxsi
   
   typedef struct {
           UINT8   ide[4];
           UINT8   scsi[8];
   } SXSIDEVS;
   
   static const OEMCHAR str_sasix[] = OEMTEXT("SASI%u");
   static const OEMCHAR str_scsix[] = OEMTEXT("SCSI%u");
   
   static int flagsave_sxsi(STFLAGH sfh, const SFENTRY *tbl) {
   
         int                     ret;          int                     ret;
         FILEH           fh;          UINT            i;
         STATDISK        st;          SXSIDEVS        sds;
         char            buf[256];  const OEMCHAR   *path;
         DOSDATE         date;  
         DOSTIME         time;  
   
         ret = flagload_load(f, &st, sizeof(st));          sxsi_allflash();
         if (st.path[0]) {          ret = STATFLAG_SUCCESS;
                 fh = file_open_rb(st.path);          for (i=0; i<NELEMENTS(sds.ide); i++) {
                 if (fh != FILEH_INVALID) {                  sds.ide[i] = sxsi_getdevtype((REG8)i);
                         file_getdatetime(fh, &date, &time);          }
                         file_close(fh);          for (i=0; i<NELEMENTS(sds.scsi); i++) {
                         if ((memcmp(&st.date, &date, sizeof(date))) ||                  sds.scsi[i] = sxsi_getdevtype((REG8)(i + 0x20));
                                 (memcmp(&st.time, &time, sizeof(time)))) {          }
                                 ret |= NP2FLAG_DISKCHG;          ret = statflag_write(sfh, &sds, sizeof(sds));
                                 SPRINTF(buf, "%s: updated\n", name);          for (i=0; i<NELEMENTS(sds.ide); i++) {
                                 err_append(e, buf);                  if (sds.ide[i] != SXSIDEV_NC) {
                         }                          path = sxsi_getfilename((REG8)i);
                           ret |= statflag_writepath(sfh, path, FTYPE_NONE, 0);
                 }                  }
                 else {          }
                         ret |= NP2FLAG_DISKCHG;          for (i=0; i<NELEMENTS(sds.scsi); i++) {
                         SPRINTF(buf, "%s: not found\n", name);                  if (sds.scsi[i] != SXSIDEV_NC) {
                         err_append(e, buf);                          path = sxsi_getfilename((REG8)(i + 0x20));
                           ret |= statflag_writepath(sfh, path, FTYPE_NONE, 0);
                 }                  }
         }          }
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int flagcheck_disk(NP2FFILE *f, const STENTRY *t, ERR_BUF *e) {  static int flagcheck_sxsi(STFLAGH sfh, const SFENTRY *tbl) {
   
         int             ret;          int                     ret;
         int             i;          SXSIDEVS        sds;
         char    buf[8];          UINT            i;
           OEMCHAR         buf[8];
   
         ret = 0;          sxsi_allflash();
         for (i=0; i<4; i++) {          ret = statflag_read(sfh, &sds, sizeof(sds));
                 SPRINTF(buf, "FDD%d", i+1);          for (i=0; i<NELEMENTS(sds.ide); i++) {
                 ret |= diskcheck(f, buf, e);                  if (sds.ide[i] != SXSIDEV_NC) {
         }                          OEMSPRINTF(buf, str_sasix, i+1);
         sxsi_flash();                          ret |= statflag_checkpath(sfh, buf);
         for (i=0; i<2; i++) {                  }
                 SPRINTF(buf, "SASI%u", i+1);  
                 ret |= diskcheck(f, buf, e);  
         }          }
         for (i=0; i<2; i++) {          for (i=0; i<NELEMENTS(sds.scsi); i++) {
                 SPRINTF(buf, "SCSI%d", i+1);                  if (sds.scsi[i] != SXSIDEV_NC) {
                 ret |= diskcheck(f, buf, e);                          OEMSPRINTF(buf, str_scsix, i);
                           ret |= statflag_checkpath(sfh, buf);
                   }
         }          }
         (void)t;          (void)tbl;
         return(ret);          return(ret);
 }  }
   
 static int flagload_disk(NP2FFILE *f, const STENTRY *t) {  static int flagload_sxsi(STFLAGH sfh, const SFENTRY *tbl) {
   
         int                     ret;          int                     ret;
         BYTE            i;          SXSIDEVS        sds;
         STATDISK        st;          UINT            i;
           REG8            drv;
           STATPATH        sp;
   
         ret = 0;          ret = statflag_read(sfh, &sds, sizeof(sds));
         for (i=0; i<4; i++) {          if (ret != STATFLAG_SUCCESS) {
                 ret |= flagload_load(f, &st, sizeof(st));                  return(ret);
                 if (st.path[0]) {          }
                         fdd_set(i, st.path, FTYPE_NONE, st.readonly);          for (i=0; i<NELEMENTS(sds.ide); i++) {
                 }                  drv = (REG8)i;
         }                  sxsi_setdevtype(drv, sds.ide[i]);
         sxsi_trash();                  if (sds.ide[i] != SXSIDEV_NC) {
         for (i=0x00; i<0x02; i++) {                          ret |= statflag_read(sfh, &sp, sizeof(sp));
                 ret |= flagload_load(f, &st, sizeof(st));                          sxsi_devopen(drv, sp.path);
                 if (st.path[0]) {  
                         sxsi_hddopen(i, st.path);  
                 }  
         }  
         for (i=0x20; i<0x22; i++) {  
                 ret |= flagload_load(f, &st, sizeof(st));  
 #if 0  
                 if (file[0]) {  
                         bios0x1b_scsiopen(i, file);  
                 }                  }
 #endif  
         }          }
         (void)t;          for (i=0; i<NELEMENTS(sds.scsi); i++) {
                   drv = (REG8)(i + 0x20);
                   sxsi_setdevtype(drv, sds.scsi[i]);
                   if (sds.scsi[i] != SXSIDEV_NC) {
                           ret |= statflag_read(sfh, &sp, sizeof(sp));
                           sxsi_devopen(drv, sp.path);
                   }
           }
           (void)tbl;
         return(ret);          return(ret);
 }  }
   
   
 // -----  // ---- com
   
 #ifdef _MIDICH  static int flagsave_com(STFLAGH sfh, const SFENTRY *tbl) {
 static int flagsave_midi(NP2FFILE *f, const STENTRY *t) {  
   
         UINT    device;          UINT    device;
         COMMNG  cm;          COMMNG  cm;
         int             ret;          int             ret;
         _MIDICH mch[16];          COMFLAG flag;
   
         device = (UINT)t->arg1;          device = (UINT)(long)tbl->arg1;
         switch(device) {          switch(device) {
                 case 0:                  case 0:
                         cm = cm_mpu98;                          cm = cm_mpu98;
Line 1085  static int flagsave_midi(NP2FFILE *f, co Line 1168  static int flagsave_midi(NP2FFILE *f, co
                         cm = NULL;                          cm = NULL;
                         break;                          break;
         }          }
         ret = NP2FLAG_SUCCESS;          ret = STATFLAG_SUCCESS;
         if ((cm != NULL) && (cm->msg(cm, COMMSG_MIDISTATGET, (long)mch))) {          if (cm) {
                 ret = flagsave_create(f, t);                  flag = (COMFLAG)cm->msg(cm, COMMSG_GETFLAG, 0);
                 if (ret != NP2FLAG_FAILURE) {                  if (flag) {
                         ret |= flagsave_save(f, mch, sizeof(mch));                          ret |= statflag_write(sfh, flag, flag->size);
                         ret |= flagsave_close(f);                          _MFREE(flag);
                 }                  }
         }          }
         return(ret);          return(ret);
 }  }
   
 static int flagload_midi(NP2FFILE *f, const STENTRY *t) {  static int flagload_com(STFLAGH sfh, const SFENTRY *tbl) {
   
         _MIDICH mch[16];          UINT            device;
         UINT    device;          COMMNG          cm;
         COMMNG  cm;          int                     ret;
         int             ret;          _COMFLAG        fhdr;
           COMFLAG         flag;
   
         ret = flagload_load(f, mch, sizeof(mch));          ret = statflag_read(sfh, &fhdr, sizeof(fhdr));
         if (ret != NP2FLAG_FAILURE) {          if (ret != STATFLAG_SUCCESS) {
                 device = (UINT)t->arg1;                  goto flcom_err1;
                 switch(device) {          }
                         case 0:          if (fhdr.size < sizeof(fhdr)) {
                                 commng_destroy(cm_mpu98);                  goto flcom_err1;
                                 cm = commng_create(COMCREATE_MPU98II);          }
                                 cm_mpu98 = cm;          flag = (COMFLAG)_MALLOC(fhdr.size, "com stat flag");
                                 break;          if (flag == NULL) {
                   goto flcom_err1;
           }
           CopyMemory(flag, &fhdr, sizeof(fhdr));
           ret |= statflag_read(sfh, flag + 1, fhdr.size - sizeof(fhdr));
           if (ret != STATFLAG_SUCCESS) {
                   goto flcom_err2;
           }
   
                         case 1:          device = (UINT)(long)tbl->arg1;
                                 commng_destroy(cm_rs232c);          switch(device) {
                                 cm = commng_create(COMCREATE_SERIAL);                  case 0:
                                 cm_rs232c = cm;                          commng_destroy(cm_mpu98);
                                 break;                          cm = commng_create(COMCREATE_MPU98II);
                           cm_mpu98 = cm;
                           break;
   
                         default:                  case 1:
                                 cm = NULL;                          commng_destroy(cm_rs232c);
                                 break;                          cm = commng_create(COMCREATE_SERIAL);
                 }                          cm_rs232c = cm;
                 if (cm) {                          break;
                         cm->msg(cm, COMMSG_MIDISTATSET, (long)mch);  
                 }                  default:
                           cm = NULL;
                           break;
           }
           if (cm) {
                   cm->msg(cm, COMMSG_SETFLAG, (long)flag);
         }          }
   
   flcom_err2:
           _MFREE(flag);
   
   flcom_err1:
         return(ret);          return(ret);
 }  }
 #endif  
   
   
 // ----  // ----
   
 static int flagcheck_versize(NP2FFILE *f, const STENTRY *t, ERR_BUF *e) {  static int flagcheck_versize(STFLAGH sfh, const SFENTRY *tbl) {
   
         if ((f) && (t)) {          if ((sfh->hdr.ver == tbl->ver) && (sfh->hdr.size == tbl->arg2)) {
                 if ((f->p.ver == t->ver) && (f->p.size == t->arg2)) {                  return(STATFLAG_SUCCESS);
                         return(NP2FLAG_SUCCESS);  
                 }  
                 return(NP2FLAG_VERSION);  
         }          }
         (void)e;          return(STATFLAG_FAILURE);
         return(NP2FLAG_FAILURE);  
 }  }
   
 static int flagcheck_veronly(NP2FFILE *f, const STENTRY *t, ERR_BUF *e) {  static int flagcheck_veronly(STFLAGH sfh, const SFENTRY *tbl) {
   
         if ((f) && (t)) {          if (sfh->hdr.ver == tbl->ver) {
                 if (f->p.ver == t->ver) {                  return(STATFLAG_SUCCESS);
                         return(NP2FLAG_SUCCESS);  
                 }  
                 return(NP2FLAG_VERSION);  
         }          }
         (void)e;          return(STATFLAG_FAILURE);
         return(NP2FLAG_FAILURE);  
 }  }
   
   
 // ----  // ----
   
 int statsave_save(const char *filename) {  int statsave_save(const OEMCHAR *filename) {
   
         NP2FFILE        f;          SFFILEH         sffh;
         int                     ret;          int                     ret;
         UINT            i;  const SFENTRY   *tbl;
   const SFENTRY   *tblterm;
   
         ret = flagcreate(&f, filename);          sffh = statflag_create(filename);
         if (ret == NP2FLAG_FAILURE) {          if (sffh == NULL) {
                 return(ret);                  return(STATFLAG_FAILURE);
         }          }
         for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) {  
                 switch(np2tbl[i].type) {          ret = STATFLAG_SUCCESS;
                         case NP2FLAG_BIN:          tbl = np2tbl;
                         case NP2FLAG_CORE:          tblterm = tbl + NELEMENTS(np2tbl);
                         case NP2FLAG_BEEP:          while(tbl < tblterm) {
                                 ret |= flagsave_common(&f, &np2tbl[i]);                  ret |= statflag_createsection(sffh, tbl);
                   switch(tbl->type) {
                           case STATFLAG_BIN:
                           case STATFLAG_TERM:
                                   ret |= flagsave_common(&sffh->sfh, tbl);
                                   break;
   
   #if defined(CGWND_FONTPTR)
                           case STATFLAG_CGW:
                                   ret |= flagsave_cgwnd(&sffh->sfh, tbl);
                                   break;
   #endif
   
                           case STATFLAG_COM:
                                   ret |= flagsave_com(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_TERM:                          case STATFLAG_DMA:
                                 ret |= flagsave_term(&f, &np2tbl[i]);                                  ret |= flagsave_dma(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_DMA:                          case STATFLAG_EGC:
                                 ret |= flagsave_dma(&f, &np2tbl[i]);                                  ret |= flagsave_egc(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_EGC:                          case STATFLAG_EPSON:
                                 ret |= flagsave_egc(&f, &np2tbl[i]);                                  ret |= flagsave_epson(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_EXT:                          case STATFLAG_EVT:
                                 ret |= flagsave_ext(&f, &np2tbl[i]);                                  ret |= flagsave_evt(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_EVT:                          case STATFLAG_EXT:
                                 ret |= flagsave_evt(&f, &np2tbl[i]);                                  ret |= flagsave_ext(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_GIJ:                          case STATFLAG_FDD:
                                 ret |= flagsave_gij(&f, &np2tbl[i]);                                  ret |= flagsave_fdd(&sffh->sfh, tbl);
                                 break;                                  break;
   
                         case NP2FLAG_FM:  #if !defined(DISABLE_SOUND)
                                 ret |= flagsave_fm(&f, &np2tbl[i]);                          case STATFLAG_FM:
                                   ret |= flagsave_fm(&sffh->sfh, tbl);
                                 break;                                  break;
   #endif
   
                         case NP2FLAG_DISK:                          case STATFLAG_GIJ:
                                 ret |= flagsave_disk(&f, &np2tbl[i]);                                  ret |= flagsave_gij(&sffh->sfh, tbl);
                                 break;                                  break;
   
 #if defined(MIDICH)  #if defined(SUPPORT_HOSTDRV)
                         case NP2FLAG_MIDI:                                  case STATFLAG_HDRV:
                                 ret |= flagsave_midi(&f, &np2tbl[i]);                                  ret |= hostdrv_sfsave(&sffh->sfh, tbl);
                                 break;                                  break;
 #endif  #endif
   
                           case STATFLAG_MEM:
                                   ret |= flagsave_mem(&sffh->sfh, tbl);
                                   break;
   
                           case STATFLAG_SXSI:
                                   ret |= flagsave_sxsi(&sffh->sfh, tbl);
                                   break;
                 }                  }
                   tbl++;
         }          }
         flagclose(&f);          statflag_close(sffh);
         return(ret);          return(ret);
 }  }
   
 int statsave_check(const char *filename, char *buf, int size) {  int statsave_check(const OEMCHAR *filename, OEMCHAR *buf, int size) {
   
         NP2FFILE        f;          SFFILEH         sffh;
         int                     ret;          int                     ret;
         UINT            i;  
         BOOL            done;          BOOL            done;
         ERR_BUF         e;  const SFENTRY   *tbl;
   const SFENTRY   *tblterm;
   
         e.buf = buf;          sffh = statflag_open(filename, buf, size);
         e.remain = size;          if (sffh == NULL) {
         if (e.remain) {                  return(STATFLAG_FAILURE);
                 e.remain--;  
                 if (buf) {  
                         *buf = '\0';  
                 }  
         }  
         else {  
                 e.buf = NULL;  
         }          }
   
         ret = flagopen(&f, filename, &e);          done = FALSE;
         if (ret != NP2FLAG_FAILURE) {          ret = STATFLAG_SUCCESS;
                 done = FALSE;          while((!done) && (ret != STATFLAG_FAILURE)) {
                 while((!done) && (ret != NP2FLAG_FAILURE)) {                  ret |= statflag_readsection(sffh);
                         char index[11];                  tbl = np2tbl;
                         ret |= flagload_create(&f);                  tblterm = tbl + NELEMENTS(np2tbl);
                         CopyMemory(index, f.p.index, sizeof(f.p.index));                  while(tbl < tblterm) {
                         index[10] = 0;                          if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) {
                         for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) {                                  break;
                                 if (!strcmp(index, np2tbl[i].index)) {  
                                         break;  
                                 }  
                         }                          }
                         if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {                          tbl++;
                                 switch(np2tbl[i].type) {                  }
                                         case NP2FLAG_BIN:                  if (tbl < tblterm) {
                                                 ret |= flagcheck_versize(&f, &np2tbl[i], &e);                          switch(tbl->type) {
                                                 break;                                  case STATFLAG_BIN:
   #if defined(CGWND_FONTPTR)
                                         case NP2FLAG_TERM:                                  case STATFLAG_CGW:
                                                 done = TRUE;  
                                                 break;  
   
                                         case NP2FLAG_CORE:  
                                         case NP2FLAG_DMA:  
                                         case NP2FLAG_EGC:  
                                         case NP2FLAG_EXT:  
                                         case NP2FLAG_EVT:  
                                         case NP2FLAG_GIJ:  
                                         case NP2FLAG_BEEP:  
 #if defined(MIDICH)  
                                         case NP2FLAG_MIDI:  
 #endif  #endif
                                                 ret |= flagcheck_veronly(&f, &np2tbl[i], &e);                                  case STATFLAG_MEM:
                                                 break;                                          ret |= flagcheck_versize(&sffh->sfh, tbl);
                                           break;
   
                                         case NP2FLAG_DISK:                                  case STATFLAG_TERM:
                                                 ret |= flagcheck_disk(&f, &np2tbl[i], &e);                                          done = TRUE;
                                                 break;                                          break;
   
                                         case NP2FLAG_FM:                                                        // ver0.31                                  case STATFLAG_COM:
                                                 break;                                  case STATFLAG_DMA:
                                   case STATFLAG_EGC:
                                         default:                                  case STATFLAG_EPSON:
                                                 ret |= NP2FLAG_WARNING;                                  case STATFLAG_EVT:
                                                 break;                                  case STATFLAG_EXT:
                                 }                                  case STATFLAG_GIJ:
                         }  #if !defined(DISABLE_SOUND)
                         else {                                  case STATFLAG_FM:
                                 ret |= NP2FLAG_WARNING;  #endif
   #if defined(SUPPORT_HOSTDRV)
                                   case STATFLAG_HDRV:
   #endif
                                           ret |= flagcheck_veronly(&sffh->sfh, tbl);
                                           break;
   
                                   case STATFLAG_FDD:
                                           ret |= flagcheck_fdd(&sffh->sfh, tbl);
                                           break;
   
                                   case STATFLAG_SXSI:
                                           ret |= flagcheck_sxsi(&sffh->sfh, tbl);
                                           break;
   
                                   default:
                                           ret |= STATFLAG_WARNING;
                                           break;
                         }                          }
                         ret |= flagload_close(&f);  
                 }                  }
                 flagclose(&f);                  else {
         }                          ret |= STATFLAG_WARNING;
         if (e.buf) {                  }
                 *e.buf = '\0';  
         }          }
           statflag_close(sffh);
         return(ret);          return(ret);
 }  }
   
 int statsave_load(const char *filename) {  int statsave_load(const OEMCHAR *filename) {
   
         NP2FFILE        f;          SFFILEH         sffh;
         int                     ret;          int                     ret;
         UINT            i;  
         BOOL            done;          BOOL            done;
   const SFENTRY   *tbl;
   const SFENTRY   *tblterm;
   
         ret = flagopen(&f, filename, NULL);          sffh = statflag_open(filename, NULL, 0);
         if (ret == NP2FLAG_FAILURE) {          if (sffh == NULL) {
                 return(ret);                  return(STATFLAG_FAILURE);
           }
   
           // PCCORE read!
           ret = statflag_readsection(sffh);
           if ((ret != STATFLAG_SUCCESS) ||
                   (memcmp(sffh->sfh.hdr.index, np2tbl[0].index, 10))) {
                   statflag_close(sffh);
                   return(STATFLAG_FAILURE);
         }          }
   
         soundmng_stop();          soundmng_stop();
         rs232c_midipanic();          rs232c_midipanic();
         mpu98ii_midipanic();          mpu98ii_midipanic();
         pc9861k_midipanic();          pc9861k_midipanic();
           sxsi_alltrash();
   
           ret |= flagload_common(&sffh->sfh, np2tbl);
   
           CPU_RESET();
           CPU_SETEXTSIZE((UINT32)pccore.extmem);
           nevent_allreset();
   
           sound_changeclock();
           beep_changeclock();
         sound_reset();          sound_reset();
         fmboard_reset(0);          fddmtrsnd_bind();
   
           iocore_reset();                                                         // サウンドでpicを呼ぶので…
           cbuscore_reset();
           fmboard_reset(pccore.sound);
   
         done = FALSE;          done = FALSE;
         while((!done) && (ret != NP2FLAG_FAILURE)) {          while((!done) && (ret != STATFLAG_FAILURE)) {
                 char index[11];                  ret |= statflag_readsection(sffh);
                 ret |= flagload_create(&f);                  tbl = np2tbl + 1;
                 CopyMemory(index, f.p.index, sizeof(f.p.index));                  tblterm = np2tbl + NELEMENTS(np2tbl);
                 index[10] = 0;                  while(tbl < tblterm) {
                 for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) {                          if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) {
                         if (!strcmp(index, np2tbl[i].index)) {  
                                 break;                                  break;
                         }                          }
                           tbl++;
                 }                  }
                 if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {                  if (tbl < tblterm) {
                         switch(np2tbl[i].type) {                          switch(tbl->type) {
                                 case NP2FLAG_BIN:                                  case STATFLAG_BIN:
                                 case NP2FLAG_BEEP:                                          ret |= flagload_common(&sffh->sfh, tbl);
                                         ret |= flagload_common(&f, &np2tbl[i]);  
                                         break;                                          break;
   
                                 case NP2FLAG_TERM:                                  case STATFLAG_TERM:
                                         done = TRUE;                                          done = TRUE;
                                         break;                                          break;
   
                                 case NP2FLAG_CORE:  #if defined(CGWND_FONTPTR)
                                         ret |= flagload_core(&f, &np2tbl[i]);                                  case STATFLAG_CGW:
                                           ret |= flagload_cgwnd(&sffh->sfh, tbl);
                                           break;
   #endif
   
                                   case STATFLAG_COM:
                                           ret |= flagload_com(&sffh->sfh, tbl);
                                           break;
   
                                   case STATFLAG_DMA:
                                           ret |= flagload_dma(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_DMA:                                  case STATFLAG_EGC:
                                         ret |= flagload_dma(&f, &np2tbl[i]);                                          ret |= flagload_egc(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_EGC:                                  case STATFLAG_EPSON:
                                         ret |= flagload_egc(&f, &np2tbl[i]);                                          ret |= flagload_epson(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_EXT:                                  case STATFLAG_EVT:
                                         ret |= flagload_ext(&f, &np2tbl[i]);                                          ret |= flagload_evt(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_EVT:                                  case STATFLAG_EXT:
                                         ret |= flagload_evt(&f, &np2tbl[i]);                                          ret |= flagload_ext(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_GIJ:                                  case STATFLAG_FDD:
                                         ret |= flagload_gij(&f, &np2tbl[i]);                                          ret |= flagload_fdd(&sffh->sfh, tbl);
                                         break;                                          break;
   
                                 case NP2FLAG_FM:  #if !defined(DISABLE_SOUND)
                                         ret |= flagload_fm(&f, &np2tbl[i]);                                  case STATFLAG_FM:
                                           ret |= flagload_fm(&sffh->sfh, tbl);
                                         break;                                          break;
   #endif
   
                                 case NP2FLAG_DISK:                                  case STATFLAG_GIJ:
                                         ret |= flagload_disk(&f, &np2tbl[i]);                                          ret |= flagload_gij(&sffh->sfh, tbl);
                                         break;                                          break;
   
 #if defined(MIDICH)  #if defined(SUPPORT_HOSTDRV)
                                 case NP2FLAG_MIDI:                                  case STATFLAG_HDRV:
                                         ret |= flagload_midi(&f, &np2tbl[i]);                                          ret |= hostdrv_sfload(&sffh->sfh, tbl);
                                         break;                                          break;
 #endif  #endif
   
                                   case STATFLAG_MEM:
                                           ret |= flagload_mem(&sffh->sfh, tbl);
                                           break;
   
                                   case STATFLAG_SXSI:
                                           ret |= flagload_sxsi(&sffh->sfh, tbl);
                                           break;
   
                                 default:                                  default:
                                         ret |= NP2FLAG_WARNING;                                          ret |= STATFLAG_WARNING;
                                         break;                                          break;
                         }                          }
                 }                  }
                 else {                  else {
                         ret |= NP2FLAG_WARNING;                          ret |= STATFLAG_WARNING;
                 }                  }
                 ret |= flagload_close(&f);  
         }          }
         flagclose(&f);          statflag_close(sffh);
   
         // I/O作り直し          // I/O作り直し
           i286_memorymap((pccore.model & PCMODEL_EPSON)?1:0);
         iocore_build();          iocore_build();
         iocore_bind();          iocore_bind();
         cbuscore_bind();          cbuscore_bind();
Line 1407  int statsave_load(const char *filename)  Line 1564  int statsave_load(const char *filename) 
         gdcs.palchange = GDCSCRN_REDRAW;          gdcs.palchange = GDCSCRN_REDRAW;
         tramflag.renewal = 1;          tramflag.renewal = 1;
         cgwindow.writable |= 0x80;          cgwindow.writable |= 0x80;
   #if defined(CPUSTRUC_FONTPTR)
           FONTPTR_LOW = fontrom + cgwindow.low;
           FONTPTR_HIGH = fontrom + cgwindow.high;
   #endif
         i286_vram_dispatch(vramop.operate);          i286_vram_dispatch(vramop.operate);
         soundmng_play();          soundmng_play();
   

Removed from v.1.4  
changed lines
  Added in v.1.48


RetroPC.NET-CVS <cvs@retropc.net>