--- np2/statsave.c 2003/12/08 00:55:30 1.19 +++ np2/statsave.c 2004/01/22 01:10:03 1.28 @@ -1,11 +1,11 @@ #include "compiler.h" +#include "strres.h" #include "dosio.h" #include "commng.h" #include "scrnmng.h" #include "soundmng.h" #include "timemng.h" #include "cpucore.h" -#include "memory.h" #include "pccore.h" #include "iocore.h" #include "cbuscore.h" @@ -25,18 +25,17 @@ #include "fdd_mtr.h" #include "sxsi.h" #include "calendar.h" -#include "statsave.h" #include "keydisp.h" +#include "sasiio.h" +#include "scsiio.h" +#include "hostdrv.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 @@ -54,29 +53,28 @@ typedef struct { } NP2FENT; enum { - NP2FLAG_BIN = 0, - NP2FLAG_TERM, - NP2FLAG_CLOCK, - NP2FLAG_COM, - NP2FLAG_DISK, - NP2FLAG_DMA, - NP2FLAG_EGC, - NP2FLAG_EVT, - NP2FLAG_EXT, - NP2FLAG_FM, - NP2FLAG_GIJ, - NP2FLAG_MEM + STATFLAG_BIN = 0, + STATFLAG_TERM, +#if defined(CGWND_FONTPTR) + STATFLAG_CGW, +#endif + STATFLAG_CLOCK, + STATFLAG_COM, + STATFLAG_DISK, + STATFLAG_DMA, + STATFLAG_EGC, + STATFLAG_EPSON, + STATFLAG_EVT, + STATFLAG_EXT, + STATFLAG_FM, + STATFLAG_GIJ, +#if defined(SUPPORT_HOSTDRV) + STATFLAG_HDRV, +#endif + STATFLAG_MEM }; typedef struct { -const char *index; - UINT16 ver; - UINT16 type; - void *arg1; - UINT arg2; -} STENTRY; - -typedef struct { UINT32 id; void *proc; } PROCTBL; @@ -101,22 +99,6 @@ typedef struct { int remain; } ERR_BUF; -static void err_append(ERR_BUF *e, char *buf) { - - int len; - - if ((e) && (buf)) { - if (e->buf) { - len = strlen(buf); - if (e->remain >= len) { - CopyMemory(e->buf, buf, len); - e->buf += len; - e->remain -= len; - } - } - } -} - // ---- @@ -152,52 +134,280 @@ static BOOL num2proc(void *func, const P // ---- +enum { + SFFILEH_WRITE = 0x0001, + SFFILEH_BLOCK = 0x0002, + SFFILEH_ERROR = 0x0004 +}; + typedef struct { + _STFLAGH sfh; + UINT stat; + FILEH fh; + UINT secpos; + +// long pos; +// long bak; +// long next; + NP2FHDR f; +// NP2FENT p; +} _NP2FFILE, *NP2FFILE, _SFFILEH, *SFFILEH; + +static SFFILEH statflag_open(const char *filename, char *err, int errlen) { + FILEH fh; - long pos; - long bak; - long next; - NP2FHDR f; - NP2FENT p; -} _NP2FFILE, *NP2FFILE; + 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; + BYTE 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 char *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 char *str) { + + if ((sfh) && (sfh->errlen)) { + milstr_ncat(sfh->err, str, sfh->errlen); + milstr_ncat(sfh->err, CRCONST, sfh->errlen); + } +} + + + + +#if 0 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); + return(STATFLAG_FAILURE); } if (file_read(f->fh, &f->f, sizeof(NP2FHDR)) != sizeof(NP2FHDR)) { file_close(f->fh); - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos = sizeof(NP2FHDR); if (strcmp(f->f.name, np2flagdef.name)) { file_close(f->fh); - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } if (strcmp(f->f.vername, np2flagdef.vername)) { #if 1 file_close(f->fh); - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); #else - return(NP2FLAG_VERSION); // 他形式を読むのであれば… + return(STATFLAG_VERSION); // 他形式を読むのであれば… #endif } if (f->f.ver != np2flagdef.ver) { #if 1 file_close(f->fh); - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); #else - return(NP2FLAG_VERSION); // 他verを読むのであれば… + return(STATFLAG_VERSION); // 他verを読むのであれば… #endif } - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } (void)e; - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static int flagcreate(NP2FFILE f, const char *filename) { @@ -205,17 +415,17 @@ static int flagcreate(NP2FFILE f, const if (f) { f->fh = file_create(filename); if (f->fh == FILEH_INVALID) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } if (file_write(f->fh, &np2flagdef, sizeof(NP2FHDR)) != sizeof(NP2FHDR)) { file_close(f->fh); - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos = sizeof(NP2FHDR); - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static int flagload_create(NP2FFILE f) { @@ -226,38 +436,38 @@ static int flagload_create(NP2FFILE f) { f->pos += 15; f->pos &= ~0xf; if (file_seek(f->fh, f->pos, 0) != f->pos) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } } if (file_read(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos += sizeof(NP2FENT); f->next = f->pos + f->p.size; - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } - return(NP2FLAG_FAILURE); + return(STATFLAG_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(STATFLAG_SUCCESS); } - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static int flagload_close(NP2FFILE f) { if (file_seek(f->fh, f->next, 0) != f->next) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos = f->next; - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } -static int flagsave_create(NP2FFILE f, const STENTRY *t) { +static int flagsave_create(NP2FFILE f, const SFENTRY *t) { if (f && t) { int len; @@ -266,7 +476,7 @@ static int flagsave_create(NP2FFILE f, c UINT rem; rem = 16 - (f->pos & 15); if (file_write(f->fh, &f->p, rem) != rem) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos += rem; } @@ -281,12 +491,12 @@ static int flagsave_create(NP2FFILE f, c } f->p.ver = t->ver; if (file_write(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) { - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } f->pos += sizeof(NP2FENT); - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static int flagsave_save(NP2FFILE f, void *buf, UINT size) { @@ -294,9 +504,9 @@ static int flagsave_save(NP2FFILE f, voi if (f && buf && size && (file_write(f->fh, buf, size) == size)) { f->pos += size; f->p.size += size; - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static int flagsave_close(NP2FFILE f) { @@ -311,11 +521,11 @@ static int flagsave_close(NP2FFILE f) { goto fs_closeerr; } if (file_seek(f->fh, f->pos, 0) == f->pos) { - return(NP2FLAG_SUCCESS); + return(STATFLAG_SUCCESS); } fs_closeerr: - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } static void flagclose(NP2FFILE f) { @@ -324,47 +534,29 @@ static void flagclose(NP2FFILE f) { file_close(f->fh); } } - - -// ---- - -static int flagsave_term(NP2FFILE f, const STENTRY *t) { - - int ret; - - ret = flagsave_create(f, t); - ret |= flagsave_close(f); - return(ret); -} +#endif // ---- common -static int flagsave_common(NP2FFILE f, const STENTRY *t) { +static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { - int ret; - - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, t->arg1, t->arg2); - ret |= flagsave_close(f); - } - return(ret); + return(statflag_write(sfh, tbl->arg1, tbl->arg2)); } -static int flagload_common(NP2FFILE f, const STENTRY *t) { +static int flagload_common(STFLAGH sfh, const SFENTRY *tbl) { - return(flagload_load(f, t->arg1, t->arg2)); + return(statflag_read(sfh, tbl->arg1, tbl->arg2)); } // ----- clock -static int flagload_clock(NP2FFILE f, const STENTRY *t) { +static int flagload_clock(STFLAGH sfh, const SFENTRY *tbl) { int ret; - ret = flagload_common(f, t); + ret = statflag_read(sfh, tbl->arg1, tbl->arg2); sound_changeclock(); beep_changeclock(); return(ret); @@ -373,56 +565,50 @@ static int flagload_clock(NP2FFILE f, co // ---- memory -static int flagsave_mem(NP2FFILE f, const STENTRY *t) { +static int flagsave_mem(STFLAGH sfh, const SFENTRY *tbl) { int ret; - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, mem, 0x110000); - ret |= flagsave_save(f, mem + VRAM1_B, 0x18000); - ret |= flagsave_save(f, mem + VRAM1_E, 0x8000); - ret |= flagsave_close(f); - } + ret = statflag_write(sfh, mem, 0x110000); + ret |= statflag_write(sfh, mem + VRAM1_B, 0x18000); + ret |= statflag_write(sfh, mem + VRAM1_E, 0x8000); + (void)tbl; return(ret); } -static int flagload_mem(NP2FFILE f, const STENTRY *t) { +static int flagload_mem(STFLAGH sfh, const SFENTRY *tbl) { int ret; - ret = flagload_load(f, mem, 0x110000); - ret |= flagload_load(f, mem + VRAM1_B, 0x18000); - ret |= flagload_load(f, mem + VRAM1_E, 0x8000); - (void)t; + ret = statflag_read(sfh, mem, 0x110000); + ret |= statflag_read(sfh, mem + VRAM1_B, 0x18000); + ret |= statflag_read(sfh, mem + VRAM1_E, 0x8000); + (void)tbl; return(ret); } // ---- ext memory -static int flagsave_ext(NP2FFILE f, const STENTRY *t) { +static int flagsave_ext(STFLAGH sfh, const SFENTRY *tbl) { int ret; - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, &extmem, sizeof(extmem)); - if (CPU_EXTMEM) { - ret |= flagsave_save(f, CPU_EXTMEM, CPU_EXTMEMSIZE); - } - ret |= flagsave_close(f); + ret = statflag_write(sfh, &extmem, sizeof(extmem)); + if (CPU_EXTMEM) { + ret = statflag_write(sfh, CPU_EXTMEM, CPU_EXTMEMSIZE); } + (void)tbl; return(ret); } -static int flagload_ext(NP2FFILE f, const STENTRY *t) { +static int flagload_ext(STFLAGH sfh, const SFENTRY *tbl) { int ret; int i; UINT pagemax = 0; - ret = flagload_load(f, &extmem, sizeof(extmem)); + ret = statflag_read(sfh, &extmem, sizeof(extmem)); if (extmem.maxmem) { if (extmem.maxmem > (13+1)) { extmem.maxmem = (13+1); @@ -430,7 +616,7 @@ static int flagload_ext(NP2FFILE f, cons if (!extmemmng_realloc(extmem.maxmem - 1)) { pagemax = (extmem.maxmem - 1) << 8; if (CPU_EXTMEM) { - ret |= flagload_load(f, CPU_EXTMEM, CPU_EXTMEMSIZE); + ret |= statflag_read(sfh, CPU_EXTMEM, CPU_EXTMEMSIZE); } } else { @@ -445,88 +631,131 @@ static int flagload_ext(NP2FFILE f, cons extmem.pageptr[i] = mem + 0xc0000 + (i << 14); } } - (void)t; + (void)tbl; return(ret); } +// ---- 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_cgwnd(STFLAGH sfh, const SFENTRY *tbl) { + + int ret; + + ret = statflag_read(sfh, &cgwindow, sizeof(cgwindow)); + cgwindow.fontlow += (long)fontrom; + cgwindow.fonthigh += (long)fontrom; + (void)tbl; + return(ret); +} +#endif + + // ---- dma -static int flagsave_dma(NP2FFILE f, const STENTRY *t) { +static int flagsave_dma(STFLAGH sfh, const SFENTRY *t) { - int ret; int i; _DMAC dmabak; dmabak = dmac; for (i=0; i<4; i++) { - if ((PROC2NUM(dmabak.dmach[i].outproc, dmaproc)) || - (PROC2NUM(dmabak.dmach[i].inproc, dmaproc)) || - (PROC2NUM(dmabak.dmach[i].extproc, dmaproc))) { - return(NP2FLAG_FAILURE); + if ((PROC2NUM(dmabak.dmach[i].proc.outproc, dmaproc)) || + (PROC2NUM(dmabak.dmach[i].proc.inproc, dmaproc)) || + (PROC2NUM(dmabak.dmach[i].proc.extproc, dmaproc))) { + return(STATFLAG_FAILURE); } } - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, &dmabak, sizeof(dmabak)); - ret |= flagsave_close(f); - } - return(ret); + return(statflag_write(sfh, &dmabak, sizeof(dmabak))); } -static int flagload_dma(NP2FFILE f, const STENTRY *t) { +static int flagload_dma(STFLAGH sfh, const SFENTRY *tbl) { int ret; int i; - ret = flagload_load(f, &dmac, sizeof(dmac)); + ret = statflag_read(sfh, &dmac, sizeof(dmac)); for (i=0; i<4; i++) { - if (NUM2PROC(dmac.dmach[i].outproc, dmaproc)) { - dmac.dmach[i].outproc = dma_dummyout; - ret |= NP2FLAG_WARNING; - } - if (NUM2PROC(dmac.dmach[i].inproc, dmaproc)) { - dmac.dmach[i].inproc = dma_dummyin; - ret |= NP2FLAG_WARNING; - } - if (NUM2PROC(dmac.dmach[i].extproc, dmaproc)) { - dmac.dmach[i].extproc = dma_dummyproc; - ret |= NP2FLAG_WARNING; + if (NUM2PROC(dmac.dmach[i].proc.outproc, dmaproc)) { + dmac.dmach[i].proc.outproc = dma_dummyout; + ret |= STATFLAG_WARNING; + } + if (NUM2PROC(dmac.dmach[i].proc.inproc, dmaproc)) { + dmac.dmach[i].proc.inproc = dma_dummyin; + ret |= STATFLAG_WARNING; + } + if (NUM2PROC(dmac.dmach[i].proc.extproc, dmaproc)) { + dmac.dmach[i].proc.extproc = dma_dummyproc; + ret |= STATFLAG_WARNING; } } - (void)t; + (void)tbl; 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; egcbak = egc; egcbak.inptr -= (long)egc.buf; egcbak.outptr -= (long)egc.buf; + (void)tbl; + return(statflag_write(sfh, &egcbak, sizeof(egcbak))); +} + +static int flagload_egc(STFLAGH sfh, const SFENTRY *tbl) { + + int ret; - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, &egcbak, sizeof(egcbak)); - ret |= flagsave_close(f); + ret = statflag_read(sfh, &egc, sizeof(egc)); + egc.inptr += (long)egc.buf; + egc.outptr += (long)egc.buf; + (void)tbl; + return(ret); +} + + +// ---- epson + +static int flagsave_epson(STFLAGH sfh, const SFENTRY *tbl) { + + int ret; + + if (!(pccore.model & PCMODEL_EPSON)) { + return(STATFLAG_SUCCESS); } + 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); } -static int flagload_egc(NP2FFILE f, const STENTRY *t) { +static int flagload_epson(STFLAGH sfh, const SFENTRY *tbl) { int ret; - ret = flagload_load(f, &egc, sizeof(egc)); - egc.inptr += (long)egc.buf; - egc.outptr += (long)egc.buf; - (void)t; + ret = statflag_read(sfh, &epsonio, sizeof(epsonio)); + ret |= statflag_read(sfh, mem + 0x1c0000, 0x8000); + ret |= statflag_read(sfh, mem + 0x1e8000, 0x18000); + (void)tbl; return(ret); } @@ -545,7 +774,7 @@ typedef struct { NEVENTCB proc; } NEVTITEM; -static int nevent_save(NP2FFILE f, int num) { +static int nevent_write(STFLAGH sfh, int num) { NEVTITEM nit; UINT i; @@ -563,10 +792,10 @@ static int nevent_save(NP2FFILE f, int n if (PROC2NUM(nit.proc, evtproc)) { 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; int ret; @@ -575,28 +804,25 @@ static int flagsave_evt(NP2FFILE f, cons nevt.readyevents = nevent.readyevents; nevt.waitevents = nevent.waitevents; - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, &nevt, sizeof(nevt)); - for (i=0; ip.ver != 0)) { - ret |= flagload_load(f, &musicgen, sizeof(musicgen)); + if (saveflg & FLAG_MG) { + ret |= statflag_read(sfh, &musicgen, sizeof(musicgen)); board14_allkeymake(); } if (saveflg & FLAG_FM1A) { - ret |= flagload_load(f, &fmtimer, sizeof(fmtimer)); - ret |= flagload_load(f, &opn, sizeof(opn)); - ret |= flagload_load(f, &opnkey, sizeof(opnkey)); + ret |= statflag_read(sfh, &fmtimer, sizeof(fmtimer)); + ret |= statflag_read(sfh, &opn, sizeof(opn)); + ret |= statflag_read(sfh, &opnkey, sizeof(opnkey)); CopyMemory(opngen.keyreg, &opnkey.keyreg, sizeof(opngen.keyreg)); opnch[2].extop = opnkey.extop[0]; opnch[5].extop = opnkey.extop[1]; @@ -922,22 +1141,22 @@ static int flagload_fm(NP2FFILE f, const opnch[11].extop = opnkey.extop[3]; } if (saveflg & FLAG_PSG1) { - ret |= flagload_load(f, &psg1.reg, sizeof(PSGREG)); + ret |= statflag_read(sfh, &psg1.reg, sizeof(PSGREG)); } 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 |= flagload_load(f, &psg3.reg, sizeof(PSGREG)); + ret |= statflag_read(sfh, &psg3.reg, sizeof(PSGREG)); } if (saveflg & FLAG_ADPCM) { - ret |= flagload_load(f, &adpcm, sizeof(adpcm)); + ret |= statflag_read(sfh, &adpcm, sizeof(adpcm)); } if (saveflg & FLAG_PCM86) { - ret |= flagload_load(f, &pcm86, sizeof(pcm86)); + ret |= statflag_read(sfh, &pcm86, sizeof(pcm86)); } 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]; } @@ -990,10 +1209,10 @@ typedef struct { 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 const char str_updated[] = "%s: updated"; +static const char str_notfound[] = "%s: not found"; -static int disksave(NP2FFILE f, const char *path, int readonly) { +static int disksave(STFLAGH sfh, const char *path, int readonly) { STATDISK st; FILEH fh; @@ -1008,32 +1227,30 @@ static int disksave(NP2FFILE f, const ch file_close(fh); } } - return(flagsave_save(f, &st, sizeof(st))); + return(statflag_write(sfh, &st, sizeof(st))); } -static int flagsave_disk(NP2FFILE f, const STENTRY *t) { +static int flagsave_disk(STFLAGH sfh, const SFENTRY *tbl) { int ret; BYTE i; sxsi_flash(); - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - for (i=0; i<4; i++) { - ret |= disksave(f, fdd_diskname(i), fdd_diskprotect(i)); - } - for (i=0x00; i<0x02; i++) { - ret |= disksave(f, sxsi_getname(i), 0); - } - for (i=0x20; i<0x22; i++) { - ret |= disksave(f, sxsi_getname(i), 0); - } - ret |= flagsave_close(f); + ret = STATFLAG_SUCCESS; + for (i=0; i<4; i++) { + ret |= disksave(sfh, fdd_diskname(i), fdd_diskprotect(i)); + } + for (i=0x00; i<0x02; i++) { + ret |= disksave(sfh, sxsi_getname(i), 0); } + for (i=0x20; i<0x24; i++) { + ret |= disksave(sfh, sxsi_getname(i), 0); + } + (void)tbl; return(ret); } -static int diskcheck(NP2FFILE f, const char *name, ERR_BUF *e) { +static int diskcheck(STFLAGH sfh, const char *name) { int ret; FILEH fh; @@ -1042,7 +1259,7 @@ static int diskcheck(NP2FFILE f, const c DOSDATE date; DOSTIME time; - ret = flagload_load(f, &st, sizeof(st)); + ret = statflag_read(sfh, &st, sizeof(st)); if (st.path[0]) { fh = file_open_rb(st.path); if (fh != FILEH_INVALID) { @@ -1050,21 +1267,21 @@ static int diskcheck(NP2FFILE f, const c file_close(fh); if ((memcmp(&st.date, &date, sizeof(date))) || (memcmp(&st.time, &time, sizeof(time)))) { - ret |= NP2FLAG_DISKCHG; + ret |= STATFLAG_DISKCHG; SPRINTF(buf, str_updated, name); - err_append(e, buf); + statflag_seterr(sfh, buf); } } else { - ret |= NP2FLAG_DISKCHG; + ret |= STATFLAG_DISKCHG; SPRINTF(buf, str_notfound, name); - err_append(e, buf); + statflag_seterr(sfh, buf); } } return(ret); } -static int flagcheck_disk(NP2FFILE f, const STENTRY *t, ERR_BUF *e) { +static int flagcheck_disk(STFLAGH sfh, const SFENTRY *tbl) { int ret; int i; @@ -1073,64 +1290,62 @@ static int flagcheck_disk(NP2FFILE f, co ret = 0; for (i=0; i<4; i++) { SPRINTF(buf, str_fddx, i+1); - ret |= diskcheck(f, buf, e); + ret |= diskcheck(sfh, buf); } sxsi_flash(); for (i=0; i<2; i++) { SPRINTF(buf, str_sasix, i+1); - ret |= diskcheck(f, buf, e); + ret |= diskcheck(sfh, buf); } - for (i=0; i<2; i++) { - SPRINTF(buf, str_scsix, i+1); - ret |= diskcheck(f, buf, e); + for (i=0; i<4; i++) { + SPRINTF(buf, str_scsix, i); + ret |= diskcheck(sfh, buf); } - (void)t; + (void)tbl; return(ret); } -static int flagload_disk(NP2FFILE f, const STENTRY *t) { +static int flagload_disk(STFLAGH sfh, const SFENTRY *tbl) { int ret; - BYTE i; + UINT8 i; STATDISK st; ret = 0; for (i=0; i<4; i++) { - ret |= flagload_load(f, &st, sizeof(st)); + ret |= statflag_read(sfh, &st, sizeof(st)); if (st.path[0]) { fdd_set(i, st.path, FTYPE_NONE, st.readonly); } } sxsi_trash(); for (i=0x00; i<0x02; i++) { - ret |= flagload_load(f, &st, sizeof(st)); + ret |= statflag_read(sfh, &st, sizeof(st)); 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); + for (i=0x20; i<0x24; i++) { + ret |= statflag_read(sfh, &st, sizeof(st)); + if (st.path[0]) { + sxsi_hddopen(i, st.path); } -#endif } - (void)t; + (void)tbl; return(ret); } // ---- com -static int flagsave_com(NP2FFILE f, const STENTRY *t) { +static int flagsave_com(STFLAGH sfh, const SFENTRY *tbl) { UINT device; COMMNG cm; int ret; COMFLAG flag; - device = (UINT)t->arg1; + device = (UINT)(long)tbl->arg1; switch(device) { case 0: cm = cm_mpu98; @@ -1144,22 +1359,18 @@ static int flagsave_com(NP2FFILE f, cons cm = NULL; break; } - ret = NP2FLAG_SUCCESS; + ret = STATFLAG_SUCCESS; if (cm) { flag = (COMFLAG)cm->msg(cm, COMMSG_GETFLAG, 0); if (flag) { - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, flag, flag->size); - ret |= flagsave_close(f); - } + ret |= statflag_write(sfh, flag, flag->size); _MFREE(flag); } } return(ret); } -static int flagload_com(NP2FFILE f, const STENTRY *t) { +static int flagload_com(STFLAGH sfh, const SFENTRY *tbl) { UINT device; COMMNG cm; @@ -1167,8 +1378,8 @@ static int flagload_com(NP2FFILE f, cons _COMFLAG fhdr; COMFLAG flag; - ret = flagload_load(f, &fhdr, sizeof(fhdr)); - if (ret != NP2FLAG_SUCCESS) { + ret = statflag_read(sfh, &fhdr, sizeof(fhdr)); + if (ret != STATFLAG_SUCCESS) { goto flcom_err1; } if (fhdr.size < sizeof(fhdr)) { @@ -1179,12 +1390,12 @@ static int flagload_com(NP2FFILE f, cons goto flcom_err1; } CopyMemory(flag, &fhdr, sizeof(fhdr)); - ret |= flagload_load(f, flag + 1, fhdr.size - sizeof(fhdr)); - if (ret != NP2FLAG_SUCCESS) { + ret |= statflag_read(sfh, flag + 1, fhdr.size - sizeof(fhdr)); + if (ret != STATFLAG_SUCCESS) { goto flcom_err2; } - device = (UINT)t->arg1; + device = (UINT)(long)tbl->arg1; switch(device) { case 0: commng_destroy(cm_mpu98); @@ -1216,28 +1427,20 @@ flcom_err1: // ---- -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 ((f->p.ver == t->ver) && (f->p.size == t->arg2)) { - return(NP2FLAG_SUCCESS); - } - return(NP2FLAG_VERSION); + if ((sfh->hdr.ver == tbl->ver) && (sfh->hdr.size == tbl->arg2)) { + return(STATFLAG_SUCCESS); } - (void)e; - return(NP2FLAG_FAILURE); + return(STATFLAG_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 (f->p.ver == t->ver) { - return(NP2FLAG_SUCCESS); - } - return(NP2FLAG_VERSION); + if (sfh->hdr.ver == tbl->ver) { + return(STATFLAG_SUCCESS); } - (void)e; - return(NP2FLAG_FAILURE); + return(STATFLAG_FAILURE); } @@ -1245,162 +1448,168 @@ static int flagcheck_veronly(NP2FFILE f, int statsave_save(const char *filename) { - _NP2FFILE f; + SFFILEH sffh; int ret; -const STENTRY *tbl; -const STENTRY *tblterm; +const SFENTRY *tbl; +const SFENTRY *tblterm; - ret = flagcreate(&f, filename); - if (ret == NP2FLAG_FAILURE) { - return(ret); + sffh = statflag_create(filename); + if (sffh == NULL) { + return(STATFLAG_FAILURE); } + + ret = STATFLAG_SUCCESS; tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); + tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); while(tbl < tblterm) { + ret |= statflag_createsection(sffh, tbl); switch(tbl->type) { - case NP2FLAG_BIN: - case NP2FLAG_CLOCK: - ret |= flagsave_common(&f, tbl); + case STATFLAG_BIN: + case STATFLAG_CLOCK: + case STATFLAG_TERM: + ret |= flagsave_common(&sffh->sfh, tbl); break; - case NP2FLAG_TERM: - ret |= flagsave_term(&f, tbl); +#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; + + case STATFLAG_DISK: + ret |= flagsave_disk(&sffh->sfh, tbl); break; - case NP2FLAG_COM: - ret |= flagsave_com(&f, tbl); + case STATFLAG_DMA: + ret |= flagsave_dma(&sffh->sfh, tbl); break; - case NP2FLAG_DISK: - ret |= flagsave_disk(&f, tbl); + case STATFLAG_EGC: + ret |= flagsave_egc(&sffh->sfh, tbl); break; - case NP2FLAG_DMA: - ret |= flagsave_dma(&f, tbl); + case STATFLAG_EPSON: + ret |= flagsave_epson(&sffh->sfh, tbl); break; - case NP2FLAG_EGC: - ret |= flagsave_egc(&f, tbl); + case STATFLAG_EVT: + ret |= flagsave_evt(&sffh->sfh, tbl); break; - case NP2FLAG_EVT: - ret |= flagsave_evt(&f, tbl); + case STATFLAG_EXT: + ret |= flagsave_ext(&sffh->sfh, tbl); break; - case NP2FLAG_EXT: - ret |= flagsave_ext(&f, tbl); + case STATFLAG_FM: + ret |= flagsave_fm(&sffh->sfh, tbl); break; - case NP2FLAG_FM: - ret |= flagsave_fm(&f, tbl); + case STATFLAG_GIJ: + ret |= flagsave_gij(&sffh->sfh, tbl); break; - case NP2FLAG_GIJ: - ret |= flagsave_gij(&f, tbl); +#if defined(SUPPORT_HOSTDRV) + case STATFLAG_HDRV: + ret |= hostdrv_sfsave(&sffh->sfh, tbl); break; +#endif - case NP2FLAG_MEM: - ret |= flagsave_mem(&f, tbl); + case STATFLAG_MEM: + ret |= flagsave_mem(&sffh->sfh, tbl); break; } tbl++; } - flagclose(&f); + statflag_close(sffh); return(ret); } int statsave_check(const char *filename, char *buf, int size) { - ERR_BUF e; - _NP2FFILE f; + SFFILEH sffh; int ret; BOOL done; -const STENTRY *tbl; -const STENTRY *tblterm; +const SFENTRY *tbl; +const SFENTRY *tblterm; - e.buf = buf; - e.remain = size; - if (e.remain) { - e.remain--; - if (buf) { - *buf = '\0'; - } - } - else { - e.buf = NULL; + sffh = statflag_open(filename, buf, size); + if (sffh == NULL) { + return(STATFLAG_FAILURE); } - ret = flagopen(&f, filename, &e); - if (ret != NP2FLAG_FAILURE) { - done = FALSE; - while((!done) && (ret != NP2FLAG_FAILURE)) { - char index[11]; - ret |= flagload_create(&f); - CopyMemory(index, f.p.index, sizeof(f.p.index)); - index[10] = 0; - tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); - while(tbl < tblterm) { - if (!strcmp(index, tbl->index)) { - break; - } - tbl++; - } - if (tbl < tblterm) { - switch(tbl->type) { - case NP2FLAG_BIN: - case NP2FLAG_CLOCK: - case NP2FLAG_MEM: - ret |= flagcheck_versize(&f, tbl, &e); - break; - - case NP2FLAG_TERM: - done = TRUE; - break; - - case NP2FLAG_COM: - case NP2FLAG_DMA: - case NP2FLAG_EGC: - case NP2FLAG_EVT: - case NP2FLAG_EXT: - case NP2FLAG_GIJ: - case NP2FLAG_FM: - ret |= flagcheck_veronly(&f, tbl, &e); - break; - - case NP2FLAG_DISK: - ret |= flagcheck_disk(&f, tbl, &e); - break; - - default: - ret |= NP2FLAG_WARNING; - break; - } + done = FALSE; + ret = STATFLAG_SUCCESS; + while((!done) && (ret != STATFLAG_FAILURE)) { + ret |= statflag_readsection(sffh); + tbl = np2tbl; + tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); + while(tbl < tblterm) { + if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) { + break; } - else { - ret |= NP2FLAG_WARNING; + tbl++; + } + if (tbl < tblterm) { + switch(tbl->type) { + case STATFLAG_BIN: +#if defined(CGWND_FONTPTR) + case STATFLAG_CGW: +#endif + case STATFLAG_CLOCK: + case STATFLAG_MEM: + ret |= flagcheck_versize(&sffh->sfh, tbl); + break; + + case STATFLAG_TERM: + done = TRUE; + break; + + case STATFLAG_COM: + case STATFLAG_DMA: + case STATFLAG_EGC: + case STATFLAG_EPSON: + case STATFLAG_EVT: + case STATFLAG_EXT: + case STATFLAG_GIJ: + case STATFLAG_FM: +#if defined(SUPPORT_HOSTDRV) + case STATFLAG_HDRV: +#endif + ret |= flagcheck_veronly(&sffh->sfh, tbl); + break; + + case STATFLAG_DISK: + ret |= flagcheck_disk(&sffh->sfh, tbl); + break; + + default: + ret |= STATFLAG_WARNING; + break; } - ret |= flagload_close(&f); } - flagclose(&f); - } - if (e.buf) { - *e.buf = '\0'; + else { + ret |= STATFLAG_WARNING; + } } + statflag_close(sffh); return(ret); } int statsave_load(const char *filename) { - _NP2FFILE f; + SFFILEH sffh; int ret; BOOL done; -const STENTRY *tbl; -const STENTRY *tblterm; +const SFENTRY *tbl; +const SFENTRY *tblterm; - ret = flagopen(&f, filename, NULL); - if (ret == NP2FLAG_FAILURE) { - return(ret); + sffh = statflag_open(filename, NULL, 0); + if (sffh == NULL) { + return(STATFLAG_FAILURE); } soundmng_stop(); @@ -1408,85 +1617,102 @@ const STENTRY *tblterm; mpu98ii_midipanic(); pc9861k_midipanic(); sound_reset(); +#if defined(SUPPORT_WAVEMIX) + wavemix_bind(); +#endif fmboard_reset(0); done = FALSE; - while((!done) && (ret != NP2FLAG_FAILURE)) { - char index[11]; - ret |= flagload_create(&f); - CopyMemory(index, f.p.index, sizeof(f.p.index)); - index[10] = 0; + ret = STATFLAG_SUCCESS; + while((!done) && (ret != STATFLAG_FAILURE)) { + ret |= statflag_readsection(sffh); tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); + tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); while(tbl < tblterm) { - if (!strcmp(index, tbl->index)) { + if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) { break; } tbl++; } if (tbl < tblterm) { switch(tbl->type) { - case NP2FLAG_BIN: - ret |= flagload_common(&f, tbl); + case STATFLAG_BIN: + ret |= flagload_common(&sffh->sfh, tbl); break; - case NP2FLAG_TERM: + case STATFLAG_TERM: done = TRUE; break; - case NP2FLAG_CLOCK: - ret |= flagload_clock(&f, tbl); +#if defined(CGWND_FONTPTR) + case STATFLAG_CGW: + ret |= flagload_cgwnd(&sffh->sfh, tbl); break; +#endif - case NP2FLAG_COM: - ret |= flagload_com(&f, tbl); + case STATFLAG_CLOCK: + ret |= flagload_clock(&sffh->sfh, tbl); break; - case NP2FLAG_DISK: - ret |= flagload_disk(&f, tbl); + case STATFLAG_COM: + ret |= flagload_com(&sffh->sfh, tbl); break; - case NP2FLAG_DMA: - ret |= flagload_dma(&f, tbl); + case STATFLAG_DISK: + ret |= flagload_disk(&sffh->sfh, tbl); break; - case NP2FLAG_EGC: - ret |= flagload_egc(&f, tbl); + case STATFLAG_DMA: + ret |= flagload_dma(&sffh->sfh, tbl); break; - case NP2FLAG_EVT: - ret |= flagload_evt(&f, tbl); + case STATFLAG_EGC: + ret |= flagload_egc(&sffh->sfh, tbl); break; - case NP2FLAG_EXT: - ret |= flagload_ext(&f, tbl); + case STATFLAG_EPSON: + ret |= flagload_epson(&sffh->sfh, tbl); break; - case NP2FLAG_FM: - ret |= flagload_fm(&f, tbl); + case STATFLAG_EVT: + ret |= flagload_evt(&sffh->sfh, tbl); break; - case NP2FLAG_GIJ: - ret |= flagload_gij(&f, tbl); + case STATFLAG_EXT: + ret |= flagload_ext(&sffh->sfh, tbl); break; - case NP2FLAG_MEM: - ret |= flagload_mem(&f, tbl); + case STATFLAG_FM: + ret |= flagload_fm(&sffh->sfh, tbl); + break; + + case STATFLAG_GIJ: + ret |= flagload_gij(&sffh->sfh, tbl); + break; + +#if defined(SUPPORT_HOSTDRV) + case STATFLAG_HDRV: + ret |= hostdrv_sfload(&sffh->sfh, tbl); + break; +#endif + + case STATFLAG_MEM: + ret |= flagload_mem(&sffh->sfh, tbl); break; default: - ret |= NP2FLAG_WARNING; + ret |= STATFLAG_WARNING; break; } } else { - ret |= NP2FLAG_WARNING; + ret |= STATFLAG_WARNING; } - ret |= flagload_close(&f); } - flagclose(&f); + statflag_close(sffh); // I/O作り直し + i286_memorymap((pccore.model & PCMODEL_EPSON)?1:0); iocore_build(); iocore_bind(); cbuscore_bind(); @@ -1499,6 +1725,10 @@ const STENTRY *tblterm; gdcs.palchange = GDCSCRN_REDRAW; tramflag.renewal = 1; cgwindow.writable |= 0x80; +#if defined(CPUSTRUC_FONTPTR) + FONTPTR_LOW = fontrom + cgwindow.low; + FONTPTR_HIGH = fontrom + cgwindow.high; +#endif i286_vram_dispatch(vramop.operate); soundmng_play();