Diff for /np2/statsave.c between versions 1.2 and 1.17

version 1.2, 2003/10/17 03:52:24 version 1.17, 2003/11/15 07:10:02
Line 12 Line 12
 #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"
Line 28 Line 29
 #include        "keydisp.h"  #include        "keydisp.h"
   
   
   #if defined(MACOS)
   #define CRLITERAL       "\r"
   #define CRCONST         str_cr
   #elif defined(WIN32) || defined(X11) || defined(SLZAURUS)
   #define CRLITERAL       "\n"
   #define CRCONST         str_lf
   #else
   #define CRLITERAL       "\r\n"
   #define CRCONST         str_crlf
   #endif
   
   
 typedef struct {  typedef struct {
         char    name[16];          char    name[16];
         char    vername[28];          char    vername[28];
Line 38  typedef struct { Line 51  typedef struct {
         char    index[10];          char    index[10];
         UINT16  ver;          UINT16  ver;
         UINT32  size;          UINT32  size;
 } NP2FLAGPART_T;  } NP2FENT;
   
 enum {  enum {
         NP2FLAG_BIN                     = 0,          NP2FLAG_BIN                     = 0,
         NP2FLAG_TERM,          NP2FLAG_TERM,
         NP2FLAG_286,          NP2FLAG_CLOCK,
         NP2FLAG_CORE,  
         NP2FLAG_DMA,          NP2FLAG_DMA,
         NP2FLAG_EGC,          NP2FLAG_EGC,
         NP2FLAG_EXT,          NP2FLAG_EXT,
         NP2FLAG_EVT,          NP2FLAG_EVT,
         NP2FLAG_GIJ,          NP2FLAG_GIJ,
         NP2FLAG_FM,          NP2FLAG_FM,
         NP2FLAG_BEEP,          NP2FLAG_COM,
         NP2FLAG_MIDI,  
         NP2FLAG_DISK          NP2FLAG_DISK
 };  };
   
Line 74  typedef struct { Line 85  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 91  typedef struct { Line 102  typedef struct {
   
 static void err_append(ERR_BUF *e, char *buf) {  static void err_append(ERR_BUF *e, char *buf) {
   
           int             len;
   
         if ((e) && (buf)) {          if ((e) && (buf)) {
                 if (e->buf) {                  if (e->buf) {
                         int len;  
                         len = strlen(buf);                          len = strlen(buf);
                         if (e->remain >= len) {                          if (e->remain >= len) {
                                 CopyMemory(e->buf, buf, len);                                  CopyMemory(e->buf, buf, len);
Line 140  static BOOL num2proc(void *func, const P Line 152  static BOOL num2proc(void *func, const P
 // ----  // ----
   
 typedef struct {  typedef struct {
         FILEH           fh;          FILEH   fh;
         long            pos;          long    pos;
         long            bak;          long    bak;
         long            next;          long    next;
         NP2FHDR         f;          NP2FHDR f;
         NP2FLAGPART_T   p;          NP2FENT p;
 } NP2FFILE;  } _NP2FFILE, *NP2FFILE;
   
 static int flagopen(NP2FFILE *f, const char *filename, ERR_BUF *e) {  static int flagopen(NP2FFILE f, const char *filename, ERR_BUF *e) {
   
         if (f) {          if (f) {
                 f->fh = file_open(filename);                  f->fh = file_open(filename);
Line 187  static int flagopen(NP2FFILE *f, const c Line 199  static int flagopen(NP2FFILE *f, const c
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagcreate(NP2FFILE *f, const char *filename) {  static int flagcreate(NP2FFILE f, const char *filename) {
   
         if (f) {          if (f) {
                 f->fh = file_create(filename);                  f->fh = file_create(filename);
Line 205  static int flagcreate(NP2FFILE *f, const Line 217  static int flagcreate(NP2FFILE *f, const
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagload_create(NP2FFILE *f) {  static int flagload_create(NP2FFILE f) {
   
         if (f) {          if (f) {
                 ZeroMemory(&f->p, sizeof(NP2FLAGPART_T));                  ZeroMemory(&f->p, sizeof(NP2FENT));
                 if (f->pos & 15) {                  if (f->pos & 15) {
                         f->pos += 15;                          f->pos += 15;
                         f->pos &= ~0xf;                          f->pos &= ~0xf;
Line 216  static int flagload_create(NP2FFILE *f)  Line 228  static int flagload_create(NP2FFILE *f) 
                                 return(NP2FLAG_FAILURE);                                  return(NP2FLAG_FAILURE);
                         }                          }
                 }                  }
                 if (file_read(f->fh, &f->p, sizeof(NP2FLAGPART_T))                  if (file_read(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) {
                                                                                                 != sizeof(NP2FLAGPART_T)) {  
                         return(NP2FLAG_FAILURE);                          return(NP2FLAG_FAILURE);
                 }                  }
                 f->pos += sizeof(NP2FLAGPART_T);                  f->pos += sizeof(NP2FENT);
                 f->next = f->pos + f->p.size;                  f->next = f->pos + f->p.size;
                 return(NP2FLAG_SUCCESS);                  return(NP2FLAG_SUCCESS);
         }          }
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagload_load(NP2FFILE *f, void *buf, UINT size) {  static int flagload_load(NP2FFILE f, void *buf, UINT size) {
   
         if (f && buf && size && (file_read(f->fh, buf, size) == size)) {          if (f && buf && size && (file_read(f->fh, buf, size) == size)) {
                 f->pos += size;                  f->pos += size;
Line 236  static int flagload_load(NP2FFILE *f, vo Line 247  static int flagload_load(NP2FFILE *f, vo
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagload_close(NP2FFILE *f) {  static int flagload_close(NP2FFILE f) {
   
         if (file_seek(f->fh, f->next, 0) != f->next) {          if (file_seek(f->fh, f->next, 0) != f->next) {
                 return(NP2FLAG_FAILURE);                  return(NP2FLAG_FAILURE);
Line 245  static int flagload_close(NP2FFILE *f) { Line 256  static int flagload_close(NP2FFILE *f) {
         return(NP2FLAG_SUCCESS);          return(NP2FLAG_SUCCESS);
 }  }
   
 static int flagsave_create(NP2FFILE *f, const STENTRY *t) {  static int flagsave_create(NP2FFILE f, const STENTRY *t) {
   
         if (f && t) {          if (f && t) {
                 int             len;                  int             len;
                 ZeroMemory(&f->p, sizeof(NP2FLAGPART_T));                  ZeroMemory(&f->p, sizeof(NP2FENT));
                 if (f->pos & 15) {                  if (f->pos & 15) {
                         UINT rem;                          UINT rem;
                         rem = 16 - (f->pos & 15);                          rem = 16 - (f->pos & 15);
Line 268  static int flagsave_create(NP2FFILE *f,  Line 279  static int flagsave_create(NP2FFILE *f, 
                         CopyMemory(f->p.index, t->index, len);                          CopyMemory(f->p.index, t->index, len);
                 }                  }
                 f->p.ver = t->ver;                  f->p.ver = t->ver;
                 if (file_write(f->fh, &f->p, sizeof(NP2FLAGPART_T))                  if (file_write(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) {
                                                                                                 != sizeof(NP2FLAGPART_T)) {  
                         return(NP2FLAG_FAILURE);                          return(NP2FLAG_FAILURE);
                 }                  }
                 f->pos += sizeof(NP2FLAGPART_T);                  f->pos += sizeof(NP2FENT);
                 return(NP2FLAG_SUCCESS);                  return(NP2FLAG_SUCCESS);
         }          }
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagsave_save(NP2FFILE *f, void *buf, UINT size) {  static int flagsave_save(NP2FFILE f, void *buf, UINT size) {
   
         if (f && buf && size && (file_write(f->fh, buf, size) == size)) {          if (f && buf && size && (file_write(f->fh, buf, size) == size)) {
                 f->pos += size;                  f->pos += size;
Line 288  static int flagsave_save(NP2FFILE *f, vo Line 298  static int flagsave_save(NP2FFILE *f, vo
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagsave_close(NP2FFILE *f) {  static int flagsave_close(NP2FFILE f) {
   
         if (!f) {          if (!f) {
                 goto fs_closeerr;                  goto fs_closeerr;
Line 296  static int flagsave_close(NP2FFILE *f) { Line 306  static int flagsave_close(NP2FFILE *f) {
         if (file_seek(f->fh, f->bak, 0) != f->bak) {          if (file_seek(f->fh, f->bak, 0) != f->bak) {
                 goto fs_closeerr;                  goto fs_closeerr;
         }          }
         if (file_write(f->fh, &f->p, sizeof(NP2FLAGPART_T))          if (file_write(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) {
                                                                                                 != sizeof(NP2FLAGPART_T)) {  
                 goto fs_closeerr;                  goto fs_closeerr;
         }          }
         if (file_seek(f->fh, f->pos, 0) == f->pos) {          if (file_seek(f->fh, f->pos, 0) == f->pos) {
Line 308  fs_closeerr: Line 317  fs_closeerr:
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static void flagclose(NP2FFILE *f) {  static void flagclose(NP2FFILE f) {
   
         if (f) {          if (f) {
                 file_close(f->fh);                  file_close(f->fh);
Line 318  static void flagclose(NP2FFILE *f) { Line 327  static void flagclose(NP2FFILE *f) {
   
 // ----  // ----
   
 static int flagsave_term(NP2FFILE *f, const STENTRY *t) {  static int flagsave_term(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
   
Line 330  static int flagsave_term(NP2FFILE *f, co Line 339  static int flagsave_term(NP2FFILE *f, co
   
 // ----  // ----
   
 static int flagsave_common(NP2FFILE *f, const STENTRY *t) {  static int flagsave_common(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
   
Line 342  static int flagsave_common(NP2FFILE *f,  Line 351  static int flagsave_common(NP2FFILE *f, 
         return(ret);          return(ret);
 }  }
   
 static int flagload_common(NP2FFILE *f, const STENTRY *t) {  static int flagload_common(NP2FFILE f, const STENTRY *t) {
   
         return(flagload_load(f, t->arg1, t->arg2));          return(flagload_load(f, t->arg1, t->arg2));
 }  }
Line 350  static int flagload_common(NP2FFILE *f,  Line 359  static int flagload_common(NP2FFILE *f, 
   
 // -----  // -----
   
 static int flagsave_286(NP2FFILE *f, const STENTRY *t) {  static int flagload_clock(NP2FFILE f, const STENTRY *t) {
   
         int             ret;  
   
         ret = flagsave_create(f, t);  
         if (ret != NP2FLAG_FAILURE) {  
                 ret |= flagsave_save(f, &i286r, sizeof(I286REGS));  
                 ret |= flagsave_save(f, &i286s, sizeof(I286STAT));  
                 ret |= flagsave_close(f);  
         }  
         return(ret);  
 }  
   
 static int flagload_286(NP2FFILE *f, const STENTRY *t) {  
   
         int             ret;  
   
         ret = flagload_load(f, &i286r, sizeof(I286REGS));  
         ret |= flagload_load(f, &i286s, sizeof(I286STAT));  
         (void)t;  
         return(ret);  
 }  
   
   
 // -----  
   
 static int flagload_core(NP2FFILE *f, const STENTRY *t) {  
   
         int             ret;          int             ret;
   
         ret = flagload_common(f, t);          ret = flagload_common(f, t);
         if (opna_rate) {          sound_changeclock();
                 pc.sampleclock = (pc.realclock / opna_rate) + 1;          beep_changeclock();
         }  
         else {  
                 pc.sampleclock = 0;  
         }  
         return(ret);          return(ret);
 }  }
   
   
 // -----  // -----
   
 static int flagsave_dma(NP2FFILE *f, const STENTRY *t) {  static int flagsave_dma(NP2FFILE f, const STENTRY *t) {
   
         int                     ret;          int                     ret;
         int                     i;          int                     i;
Line 415  static int flagsave_dma(NP2FFILE *f, con Line 394  static int flagsave_dma(NP2FFILE *f, con
         return(ret);          return(ret);
 }  }
   
 static int flagload_dma(NP2FFILE *f, const STENTRY *t) {  static int flagload_dma(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         int             i;          int             i;
Line 443  static int flagload_dma(NP2FFILE *f, con Line 422  static int flagload_dma(NP2FFILE *f, con
   
 // -----  // -----
   
 static int flagsave_egc(NP2FFILE *f, const STENTRY *t) {  static int flagsave_egc(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         _EGC    egcbak;          _EGC    egcbak;
Line 460  static int flagsave_egc(NP2FFILE *f, con Line 439  static int flagsave_egc(NP2FFILE *f, con
         return(ret);          return(ret);
 }  }
   
 static int flagload_egc(NP2FFILE *f, const STENTRY *t) {  static int flagload_egc(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
   
Line 474  static int flagload_egc(NP2FFILE *f, con Line 453  static int flagload_egc(NP2FFILE *f, con
   
 // -----  // -----
   
 static int flagsave_ext(NP2FFILE *f, const STENTRY *t) {  static int flagsave_ext(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
   
Line 489  static int flagsave_ext(NP2FFILE *f, con Line 468  static int flagsave_ext(NP2FFILE *f, con
         return(ret);          return(ret);
 }  }
   
 static int flagload_ext(NP2FFILE *f, const STENTRY *t) {  static int flagload_ext(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         int             i;          int             i;
Line 526  static int flagload_ext(NP2FFILE *f, con Line 505  static int flagload_ext(NP2FFILE *f, con
 // -----  // -----
   
 typedef struct {  typedef struct {
         SINT32          remainclock;  
         SINT32          baseclock;  
         UINT32          clock;  
         UINT            readyevents;          UINT            readyevents;
         UINT            waitevents;          UINT            waitevents;
 } NEVTSAVE;  } NEVTSAVE;
Line 540  typedef struct { Line 516  typedef struct {
         NEVENTCB        proc;          NEVENTCB        proc;
 } NEVTITEM;  } NEVTITEM;
   
 static int nevent_save(NP2FFILE *f, int num) {  static int nevent_save(NP2FFILE f, int num) {
   
         NEVTITEM        nit;          NEVTITEM        nit;
         UINT            i;          UINT            i;
Line 561  static int nevent_save(NP2FFILE *f, int  Line 537  static int nevent_save(NP2FFILE *f, int 
         return(flagsave_save(f, &nit, sizeof(nit)));          return(flagsave_save(f, &nit, sizeof(nit)));
 }  }
   
 static int flagsave_evt(NP2FFILE *f, const STENTRY *t) {  static int flagsave_evt(NP2FFILE f, const STENTRY *t) {
   
         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;
   
Line 587  static int flagsave_evt(NP2FFILE *f, con Line 560  static int flagsave_evt(NP2FFILE *f, con
         return(ret);          return(ret);
 }  }
   
 static int nevent_load(NP2FFILE *f, UINT *tbl, UINT *pos) {  static int nevent_load(NP2FFILE f, UINT *tbl, UINT *pos) {
   
         int                     ret;          int                     ret;
         NEVTITEM        nit;          NEVTITEM        nit;
Line 620  static int nevent_load(NP2FFILE *f, UINT Line 593  static int nevent_load(NP2FFILE *f, UINT
         return(ret);          return(ret);
 }  }
   
 static int flagload_evt(NP2FFILE *f, const STENTRY *t) {  static int flagload_evt(NP2FFILE f, const STENTRY *t) {
   
         int                     ret;          int                     ret;
         NEVTSAVE        nevt;          NEVTSAVE        nevt;
Line 628  static int flagload_evt(NP2FFILE *f, con Line 601  static int flagload_evt(NP2FFILE *f, con
   
         ret = flagload_load(f, &nevt, sizeof(nevt));          ret = flagload_load(f, &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;
   
Line 647  static int flagload_evt(NP2FFILE *f, con Line 617  static int flagload_evt(NP2FFILE *f, con
   
 // ----  // ----
   
 static int flagsave_gij(NP2FFILE *f, const STENTRY *t) {  static int flagsave_gij(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         int             i;          int             i;
Line 657  static int flagsave_gij(NP2FFILE *f, con Line 627  static int flagsave_gij(NP2FFILE *f, con
         ret = flagsave_create(f, t);          ret = flagsave_create(f, t);
         if (ret != NP2FLAG_FAILURE) {          if (ret != NP2FLAG_FAILURE) {
                 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 |= flagsave_save(f, fnt, 32);                                  ret |= flagsave_save(f, fnt, 32);
                                 fnt += 0x1000;                                  fnt += 0x1000;
Line 668  static int flagsave_gij(NP2FFILE *f, con Line 638  static int flagsave_gij(NP2FFILE *f, con
         return(ret);          return(ret);
 }  }
   
 static int flagload_gij(NP2FFILE *f, const STENTRY *t) {  static int flagload_gij(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         int             i;          int             i;
Line 677  static int flagload_gij(NP2FFILE *f, con Line 647  static int flagload_gij(NP2FFILE *f, con
   
         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 |= flagload_load(f, fnt, 32);
                         fnt += 0x1000;                          fnt += 0x1000;
Line 698  enum { Line 668  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 {
Line 709  typedef struct { Line 680  typedef struct {
         BYTE    extop[4];          BYTE    extop[4];
 } OPNKEY;  } OPNKEY;
   
 static int flagsave_fm(NP2FFILE *f, const STENTRY *t) {  static int flagsave_fm(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         UINT    saveflg;          UINT    saveflg;
Line 754  static int flagsave_fm(NP2FFILE *f, cons Line 725  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;
Line 769  static int flagsave_fm(NP2FFILE *f, cons Line 744  static int flagsave_fm(NP2FFILE *f, cons
                 if (saveflg & FLAG_FM1A) {                  if (saveflg & FLAG_FM1A) {
                         ret |= flagsave_save(f, &fmtimer, sizeof(fmtimer));                          ret |= flagsave_save(f, &fmtimer, sizeof(fmtimer));
                         ret |= flagsave_save(f, &opn, sizeof(opn));                          ret |= flagsave_save(f, &opn, sizeof(opn));
                         CopyMemory(opnkey.keyreg, fm_keyreg, sizeof(fm_keyreg));                          CopyMemory(opnkey.keyreg, opngen.keyreg, sizeof(opngen.keyreg));
                         opnkey.extop[0] = opnch[2].extop;                          opnkey.extop[0] = opnch[2].extop;
                         opnkey.extop[1] = opnch[5].extop;                          opnkey.extop[1] = opnch[5].extop;
                         opnkey.extop[2] = opnch[8].extop;                          opnkey.extop[2] = opnch[8].extop;
Line 782  static int flagsave_fm(NP2FFILE *f, cons Line 757  static int flagsave_fm(NP2FFILE *f, cons
                 if (saveflg & FLAG_PSG2) {                  if (saveflg & FLAG_PSG2) {
                         ret |= flagsave_save(f, &psg2.reg, sizeof(PSGREG));                          ret |= flagsave_save(f, &psg2.reg, sizeof(PSGREG));
                 }                  }
                   if (saveflg & FLAG_PSG3) {
                           ret |= flagsave_save(f, &psg3.reg, sizeof(PSGREG));
                   }
                 if (saveflg & FLAG_ADPCM) {                  if (saveflg & FLAG_ADPCM) {
                         ret |= flagsave_save(f, &adpcm, sizeof(adpcm));                          ret |= flagsave_save(f, &adpcm, sizeof(adpcm));
                 }                  }
Line 796  static int flagsave_fm(NP2FFILE *f, cons Line 774  static int flagsave_fm(NP2FFILE *f, cons
         return(ret);          return(ret);
 }  }
   
 static void play_fmreg(BYTE num) {  static void play_fmreg(BYTE num, UINT reg) {
   
         UINT    chbase;          UINT    chbase;
         UINT    reg;  
         UINT    i;          UINT    i;
   
         chbase = num * 3;          chbase = num * 3;
         reg = num * 0x100;  
         for (i=0x30; i<0xa0; i++) {          for (i=0x30; i<0xa0; i++) {
                 opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);                  opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);
         }          }
Line 811  static void play_fmreg(BYTE num) { Line 787  static void play_fmreg(BYTE num) {
                 opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);                  opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]);
         }          }
         for (i=0; i<3; i++) {          for (i=0; i<3; i++) {
                 opngen_keyon(chbase + i, fm_keyreg[chbase + i]);                  opngen_keyon(chbase + i, opngen.keyreg[chbase + i]);
         }          }
 }  }
   
Line 824  static void play_psgreg(PSGGEN psg) { Line 800  static void play_psgreg(PSGGEN psg) {
         }          }
 }  }
   
 static int flagload_fm(NP2FFILE *f, const STENTRY *t) {  static int flagload_fm(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         UINT    saveflg;          UINT    saveflg;
         OPNKEY  opnkey;          OPNKEY  opnkey;
           UINT    fmreg1a;
           UINT    fmreg1b;
           UINT    fmreg2a;
           UINT    fmreg2b;
   
         opngen_reset();          opngen_reset();
         psggen_reset(&psg1);          psggen_reset(&psg1);
Line 842  static int flagload_fm(NP2FFILE *f, cons Line 822  static int flagload_fm(NP2FFILE *f, cons
         ret = flagload_load(f, &usesound, sizeof(usesound));          ret = flagload_load(f, &usesound, sizeof(usesound));
         fmboard_reset((BYTE)usesound);          fmboard_reset((BYTE)usesound);
   
           fmreg1a = 0x000;
           fmreg1b = 0x100;
           fmreg2a = 0x200;
           fmreg2b = 0x300;
         switch(usesound) {          switch(usesound) {
                 case 0x01:                  case 0x01:
                         saveflg = FLAG_MG;                          saveflg = FLAG_MG;
Line 859  static int flagload_fm(NP2FFILE *f, cons Line 843  static int flagload_fm(NP2FFILE *f, cons
                 case 0x06:                  case 0x06:
                         saveflg = FLAG_FM1A | FLAG_FM1B | FLAG_FM2A | FLAG_PSG1 |                          saveflg = FLAG_FM1A | FLAG_FM1B | FLAG_FM2A | FLAG_PSG1 |
                                                                                 FLAG_PSG2 | FLAG_RHYTHM | FLAG_PCM86;                                                                                  FLAG_PSG2 | FLAG_RHYTHM | FLAG_PCM86;
                           fmreg1a = 0x200;        // µÕž¤·¤Æ¤ë¤Î¤ó¡Ä
                           fmreg1b = 0x000;
                           fmreg2a = 0x100;
                         break;                          break;
   
                 case 0x08:                  case 0x08:
Line 881  static int flagload_fm(NP2FFILE *f, cons Line 868  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;
         }          }
   
Line 894  static int flagload_fm(NP2FFILE *f, cons Line 886  static int flagload_fm(NP2FFILE *f, cons
                 ret |= flagload_load(f, &fmtimer, sizeof(fmtimer));                  ret |= flagload_load(f, &fmtimer, sizeof(fmtimer));
                 ret |= flagload_load(f, &opn, sizeof(opn));                  ret |= flagload_load(f, &opn, sizeof(opn));
                 ret |= flagload_load(f, &opnkey, sizeof(opnkey));                  ret |= flagload_load(f, &opnkey, sizeof(opnkey));
                 CopyMemory(fm_keyreg, &opnkey.keyreg, sizeof(fm_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];
                 opnch[8].extop = opnkey.extop[2];                  opnch[8].extop = opnkey.extop[2];
Line 906  static int flagload_fm(NP2FFILE *f, cons Line 898  static int flagload_fm(NP2FFILE *f, cons
         if (saveflg & FLAG_PSG2) {          if (saveflg & FLAG_PSG2) {
                 ret |= flagload_load(f, &psg2.reg, sizeof(PSGREG));                  ret |= flagload_load(f, &psg2.reg, sizeof(PSGREG));
         }          }
           if (saveflg & FLAG_PSG3) {
                   ret |= flagload_load(f, &psg3.reg, sizeof(PSGREG));
           }
         if (saveflg & FLAG_ADPCM) {          if (saveflg & FLAG_ADPCM) {
                 ret |= flagload_load(f, &adpcm, sizeof(adpcm));                  ret |= flagload_load(f, &adpcm, sizeof(adpcm));
         }          }
Line 929  static int flagload_fm(NP2FFILE *f, cons Line 924  static int flagload_fm(NP2FFILE *f, cons
         }          }
   
         if (saveflg & FLAG_FM1A) {          if (saveflg & FLAG_FM1A) {
                 play_fmreg(0);                  play_fmreg(0, fmreg1a);
         }          }
         if (saveflg & FLAG_FM1B) {          if (saveflg & FLAG_FM1B) {
                 play_fmreg(1);                  play_fmreg(1, fmreg1b);
         }          }
         if (saveflg & FLAG_FM2A) {          if (saveflg & FLAG_FM2A) {
                 play_fmreg(2);                  play_fmreg(2, fmreg2a);
         }          }
         if (saveflg & FLAG_FM2B) {          if (saveflg & FLAG_FM2B) {
                 play_fmreg(3);                  play_fmreg(3, fmreg2b);
         }          }
         if (saveflg & FLAG_PSG1) {          if (saveflg & FLAG_PSG1) {
                 play_psgreg(&psg1);                  play_psgreg(&psg1);
Line 946  static int flagload_fm(NP2FFILE *f, cons Line 941  static int flagload_fm(NP2FFILE *f, cons
         if (saveflg & FLAG_PSG2) {          if (saveflg & FLAG_PSG2) {
                 play_psgreg(&psg2);                  play_psgreg(&psg2);
         }          }
           if (saveflg & FLAG_PSG3) {
                   play_psgreg(&psg3);
           }
         (void)t;          (void)t;
         return(ret);          return(ret);
 }  }
Line 960  typedef struct { Line 958  typedef struct {
         DOSTIME time;          DOSTIME time;
 } STATDISK;  } STATDISK;
   
 static int disksave(NP2FFILE *f, const char *path, int readonly) {  static const char str_fddx[] = "FDD%u";
   static const char str_sasix[] = "SASI%u";
   static const char str_scsix[] = "SCSI%u";
   static const char str_updated[] = "%s: updated" CRLITERAL;
   static const char str_notfound[] = "%s: not found" CRLITERAL;
   
   static int disksave(NP2FFILE f, const char *path, int readonly) {
   
         STATDISK        st;          STATDISK        st;
         FILEH           fh;          FILEH           fh;
Line 978  static int disksave(NP2FFILE *f, const c Line 982  static int disksave(NP2FFILE *f, const c
         return(flagsave_save(f, &st, sizeof(st)));          return(flagsave_save(f, &st, sizeof(st)));
 }  }
   
 static int flagsave_disk(NP2FFILE *f, const STENTRY *t) {  static int flagsave_disk(NP2FFILE f, const STENTRY *t) {
   
         int             ret;          int             ret;
         BYTE    i;          BYTE    i;
Line 1000  static int flagsave_disk(NP2FFILE *f, co Line 1004  static int flagsave_disk(NP2FFILE *f, co
         return(ret);          return(ret);
 }  }
   
 static int diskcheck(NP2FFILE *f, const char *name, ERR_BUF *e) {  static int diskcheck(NP2FFILE f, const char *name, ERR_BUF *e) {
   
         int                     ret;          int                     ret;
         FILEH           fh;          FILEH           fh;
Line 1018  static int diskcheck(NP2FFILE *f, const  Line 1022  static int diskcheck(NP2FFILE *f, const 
                         if ((memcmp(&st.date, &date, sizeof(date))) ||                          if ((memcmp(&st.date, &date, sizeof(date))) ||
                                 (memcmp(&st.time, &time, sizeof(time)))) {                                  (memcmp(&st.time, &time, sizeof(time)))) {
                                 ret |= NP2FLAG_DISKCHG;                                  ret |= NP2FLAG_DISKCHG;
                                 SPRINTF(buf, "%s: updated\n", name);                                  SPRINTF(buf, str_updated, name);
                                 err_append(e, buf);                                  err_append(e, buf);
                         }                          }
                 }                  }
                 else {                  else {
                         ret |= NP2FLAG_DISKCHG;                          ret |= NP2FLAG_DISKCHG;
                         SPRINTF(buf, "%s: not found\n", name);                          SPRINTF(buf, str_notfound, name);
                         err_append(e, buf);                          err_append(e, buf);
                 }                  }
         }          }
         return(ret);          return(ret);
 }  }
   
 static int flagcheck_disk(NP2FFILE *f, const STENTRY *t, ERR_BUF *e) {  static int flagcheck_disk(NP2FFILE f, const STENTRY *t, ERR_BUF *e) {
   
         int             ret;          int             ret;
         int             i;          int             i;
Line 1039  static int flagcheck_disk(NP2FFILE *f, c Line 1043  static int flagcheck_disk(NP2FFILE *f, c
   
         ret = 0;          ret = 0;
         for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
                 SPRINTF(buf, "FDD%d", i+1);                  SPRINTF(buf, str_fddx, i+1);
                 ret |= diskcheck(f, buf, e);                  ret |= diskcheck(f, buf, e);
         }          }
         sxsi_flash();          sxsi_flash();
         for (i=0; i<2; i++) {          for (i=0; i<2; i++) {
                 SPRINTF(buf, "SASI%u", i+1);                  SPRINTF(buf, str_sasix, i+1);
                 ret |= diskcheck(f, buf, e);                  ret |= diskcheck(f, buf, e);
         }          }
         for (i=0; i<2; i++) {          for (i=0; i<2; i++) {
                 SPRINTF(buf, "SCSI%d", i+1);                  SPRINTF(buf, str_scsix, i+1);
                 ret |= diskcheck(f, buf, e);                  ret |= diskcheck(f, buf, e);
         }          }
         (void)t;          (void)t;
         return(ret);          return(ret);
 }  }
   
 static int flagload_disk(NP2FFILE *f, const STENTRY *t) {  static int flagload_disk(NP2FFILE f, const STENTRY *t) {
   
         int                     ret;          int                     ret;
         BYTE            i;          BYTE            i;
Line 1090  static int flagload_disk(NP2FFILE *f, co Line 1094  static int flagload_disk(NP2FFILE *f, co
   
 // -----  // -----
   
 #ifdef _MIDICH  static int flagsave_com(NP2FFILE f, const STENTRY *t) {
 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)t->arg1;
         switch(device) {          switch(device) {
Line 1113  static int flagsave_midi(NP2FFILE *f, co Line 1116  static int flagsave_midi(NP2FFILE *f, co
                         break;                          break;
         }          }
         ret = NP2FLAG_SUCCESS;          ret = NP2FLAG_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 = flagsave_create(f, t);
                         ret |= flagsave_close(f);                          if (ret != NP2FLAG_FAILURE) {
                                   ret |= flagsave_save(f, 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(NP2FFILE f, const STENTRY *t) {
   
         _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 = flagload_load(f, &fhdr, sizeof(fhdr));
         if (ret != NP2FLAG_FAILURE) {          if (ret != NP2FLAG_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 |= flagload_load(f, flag + 1, fhdr.size - sizeof(fhdr));
           if (ret != NP2FLAG_SUCCESS) {
                   goto flcom_err2;
           }
   
                         case 1:          device = (UINT)t->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(NP2FFILE f, const STENTRY *t, ERR_BUF *e) {
   
         if ((f) && (t)) {          if ((f) && (t)) {
                 if ((f->p.ver == t->ver) && (f->p.size == t->arg2)) {                  if ((f->p.ver == t->ver) && (f->p.size == t->arg2)) {
Line 1173  static int flagcheck_versize(NP2FFILE *f Line 1199  static int flagcheck_versize(NP2FFILE *f
         return(NP2FLAG_FAILURE);          return(NP2FLAG_FAILURE);
 }  }
   
 static int flagcheck_veronly(NP2FFILE *f, const STENTRY *t, ERR_BUF *e) {  static int flagcheck_veronly(NP2FFILE f, const STENTRY *t, ERR_BUF *e) {
   
         if ((f) && (t)) {          if ((f) && (t)) {
                 if (f->p.ver == t->ver) {                  if (f->p.ver == t->ver) {
Line 1190  static int flagcheck_veronly(NP2FFILE *f Line 1216  static int flagcheck_veronly(NP2FFILE *f
   
 int statsave_save(const char *filename) {  int statsave_save(const char *filename) {
   
         NP2FFILE        f;          _NP2FFILE       f;
         int                     ret;          int                     ret;
         UINT            i;          UINT            i;
   
Line 1201  int statsave_save(const char *filename)  Line 1227  int statsave_save(const char *filename) 
         for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) {          for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) {
                 switch(np2tbl[i].type) {                  switch(np2tbl[i].type) {
                         case NP2FLAG_BIN:                          case NP2FLAG_BIN:
                         case NP2FLAG_CORE:                          case NP2FLAG_CLOCK:
                         case NP2FLAG_BEEP:  
                                 ret |= flagsave_common(&f, &np2tbl[i]);                                  ret |= flagsave_common(&f, &np2tbl[i]);
                                 break;                                  break;
   
Line 1210  int statsave_save(const char *filename)  Line 1235  int statsave_save(const char *filename) 
                                 ret |= flagsave_term(&f, &np2tbl[i]);                                  ret |= flagsave_term(&f, &np2tbl[i]);
                                 break;                                  break;
   
                         case NP2FLAG_286:  
                                 ret |= flagsave_286(&f, &np2tbl[i]);  
                                 break;  
   
                         case NP2FLAG_DMA:                          case NP2FLAG_DMA:
                                 ret |= flagsave_dma(&f, &np2tbl[i]);                                  ret |= flagsave_dma(&f, &np2tbl[i]);
                                 break;                                  break;
Line 1242  int statsave_save(const char *filename)  Line 1263  int statsave_save(const char *filename) 
                                 ret |= flagsave_disk(&f, &np2tbl[i]);                                  ret |= flagsave_disk(&f, &np2tbl[i]);
                                 break;                                  break;
   
 #if defined(MIDICH)                          case NP2FLAG_COM:
                         case NP2FLAG_MIDI:                                  ret |= flagsave_com(&f, &np2tbl[i]);
                                 ret |= flagsave_midi(&f, &np2tbl[i]);  
                                 break;                                  break;
 #endif  
                 }                  }
         }          }
         flagclose(&f);          flagclose(&f);
Line 1255  int statsave_save(const char *filename)  Line 1274  int statsave_save(const char *filename) 
   
 int statsave_check(const char *filename, char *buf, int size) {  int statsave_check(const char *filename, char *buf, int size) {
   
         NP2FFILE        f;          _NP2FFILE       f;
         int                     ret;          int                     ret;
         UINT            i;          UINT            i;
         BOOL            done;          BOOL            done;
Line 1289  int statsave_check(const char *filename, Line 1308  int statsave_check(const char *filename,
                         if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {                          if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {
                                 switch(np2tbl[i].type) {                                  switch(np2tbl[i].type) {
                                         case NP2FLAG_BIN:                                          case NP2FLAG_BIN:
                                           case NP2FLAG_CLOCK:
                                                 ret |= flagcheck_versize(&f, &np2tbl[i], &e);                                                  ret |= flagcheck_versize(&f, &np2tbl[i], &e);
                                                 break;                                                  break;
   
Line 1296  int statsave_check(const char *filename, Line 1316  int statsave_check(const char *filename,
                                                 done = TRUE;                                                  done = TRUE;
                                                 break;                                                  break;
   
                                         case NP2FLAG_286:  
                                         case NP2FLAG_CORE:  
                                         case NP2FLAG_DMA:                                          case NP2FLAG_DMA:
                                         case NP2FLAG_EGC:                                          case NP2FLAG_EGC:
                                         case NP2FLAG_EXT:                                          case NP2FLAG_EXT:
                                         case NP2FLAG_EVT:                                          case NP2FLAG_EVT:
                                         case NP2FLAG_GIJ:                                          case NP2FLAG_GIJ:
                                         case NP2FLAG_BEEP:                                          case NP2FLAG_COM:
 #if defined(MIDICH)  
                                         case NP2FLAG_MIDI:  
 #endif  
                                                 ret |= flagcheck_veronly(&f, &np2tbl[i], &e);                                                  ret |= flagcheck_veronly(&f, &np2tbl[i], &e);
                                                 break;                                                  break;
   
Line 1337  int statsave_check(const char *filename, Line 1352  int statsave_check(const char *filename,
   
 int statsave_load(const char *filename) {  int statsave_load(const char *filename) {
   
         NP2FFILE        f;          _NP2FFILE       f;
         int                     ret;          int                     ret;
         UINT            i;          UINT            i;
         BOOL            done;          BOOL            done;
Line 1368  int statsave_load(const char *filename)  Line 1383  int statsave_load(const char *filename) 
                 if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {                  if (i < (sizeof(np2tbl)/sizeof(STENTRY))) {
                         switch(np2tbl[i].type) {                          switch(np2tbl[i].type) {
                                 case NP2FLAG_BIN:                                  case NP2FLAG_BIN:
                                 case NP2FLAG_BEEP:  
                                         ret |= flagload_common(&f, &np2tbl[i]);                                          ret |= flagload_common(&f, &np2tbl[i]);
                                         break;                                          break;
   
Line 1376  int statsave_load(const char *filename)  Line 1390  int statsave_load(const char *filename) 
                                         done = TRUE;                                          done = TRUE;
                                         break;                                          break;
   
                                 case NP2FLAG_286:                                  case NP2FLAG_CLOCK:
                                         ret |= flagload_286(&f, &np2tbl[i]);                                          ret |= flagload_clock(&f, &np2tbl[i]);
                                         break;  
   
                                 case NP2FLAG_CORE:  
                                         ret |= flagload_core(&f, &np2tbl[i]);  
                                         break;                                          break;
   
                                 case NP2FLAG_DMA:                                  case NP2FLAG_DMA:
Line 1412  int statsave_load(const char *filename)  Line 1422  int statsave_load(const char *filename) 
                                         ret |= flagload_disk(&f, &np2tbl[i]);                                          ret |= flagload_disk(&f, &np2tbl[i]);
                                         break;                                          break;
   
 #if defined(MIDICH)                                  case NP2FLAG_COM:
                                 case NP2FLAG_MIDI:                                          ret |= flagload_com(&f, &np2tbl[i]);
                                         ret |= flagload_midi(&f, &np2tbl[i]);  
                                         break;                                          break;
 #endif  
   
                                 default:                                  default:
                                         ret |= NP2FLAG_WARNING;                                          ret |= NP2FLAG_WARNING;

Removed from v.1.2  
changed lines
  Added in v.1.17


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