--- np2/statsave.c 2004/01/23 15:05:04 1.30 +++ np2/statsave.c 2005/03/05 06:02:28 1.46 @@ -8,7 +8,11 @@ #include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "gdc_sub.h" #include "cbuscore.h" +#include "ideio.h" +#include "sasiio.h" +#include "scsiio.h" #include "pc9861k.h" #include "mpu98ii.h" #include "board14.h" @@ -24,12 +28,10 @@ #include "fddfile.h" #include "fdd_mtr.h" #include "sxsi.h" -#include "calendar.h" #include "keydisp.h" -#include "sasiio.h" -#include "scsiio.h" #include "hostdrv.h" - +#include "calendar.h" +#include "keystat.h" #if defined(MACOS) #define CRCONST str_cr @@ -58,7 +60,6 @@ enum { #if defined(CGWND_FONTPTR) STATFLAG_CGW, #endif - STATFLAG_CLOCK, STATFLAG_COM, STATFLAG_DISK, STATFLAG_DMA, @@ -95,7 +96,7 @@ extern COMMNG cm_mpu98; extern COMMNG cm_rs232c; typedef struct { - char *buf; + OEMCHAR *buf; int remain; } ERR_BUF; @@ -103,7 +104,7 @@ typedef struct { // ---- // 関数ポインタを intに変更。 -static BOOL proc2num(void *func, const PROCTBL *tbl, int size) { +static BRESULT proc2num(void *func, const PROCTBL *tbl, int size) { int i; @@ -117,7 +118,7 @@ static BOOL proc2num(void *func, const P return(FAILURE); } -static BOOL num2proc(void *func, const PROCTBL *tbl, int size) { +static BRESULT num2proc(void *func, const PROCTBL *tbl, int size) { int i; @@ -145,15 +146,10 @@ typedef struct { UINT stat; FILEH fh; UINT secpos; - -// long pos; -// long bak; -// long next; NP2FHDR f; -// NP2FENT p; -} _NP2FFILE, *NP2FFILE, _SFFILEH, *SFFILEH; +} _SFFILEH, *SFFILEH; -static SFFILEH statflag_open(const char *filename, char *err, int errlen) { +static SFFILEH statflag_open(const OEMCHAR *filename, OEMCHAR *err, int errlen) { FILEH fh; SFFILEH ret; @@ -190,7 +186,7 @@ sfo_err1: static int statflag_closesection(SFFILEH sffh) { UINT leng; - BYTE zero[16]; + UINT8 zero[16]; if (sffh == NULL) { goto sfcs_err1; @@ -265,7 +261,7 @@ sfr_err: return(STATFLAG_FAILURE); } -static SFFILEH statflag_create(const char *filename) { +static SFFILEH statflag_create(const OEMCHAR *filename) { SFFILEH ret; FILEH fh; @@ -359,7 +355,7 @@ static void statflag_close(SFFILEH sffh) } } -void statflag_seterr(STFLAGH sfh, const char *str) { +void statflag_seterr(STFLAGH sfh, const OEMCHAR *str) { if ((sfh) && (sfh->errlen)) { milstr_ncat(sfh->err, str, sfh->errlen); @@ -368,175 +364,6 @@ void statflag_seterr(STFLAGH sfh, const } - - -#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(STATFLAG_FAILURE); - } - if (file_read(f->fh, &f->f, sizeof(NP2FHDR)) - != sizeof(NP2FHDR)) { - file_close(f->fh); - return(STATFLAG_FAILURE); - } - f->pos = sizeof(NP2FHDR); - if (strcmp(f->f.name, np2flagdef.name)) { - file_close(f->fh); - return(STATFLAG_FAILURE); - } - if (strcmp(f->f.vername, np2flagdef.vername)) { -#if 1 - file_close(f->fh); - return(STATFLAG_FAILURE); -#else - return(STATFLAG_VERSION); // 他形式を読むのであれば… -#endif - } - if (f->f.ver != np2flagdef.ver) { -#if 1 - file_close(f->fh); - return(STATFLAG_FAILURE); -#else - return(STATFLAG_VERSION); // 他verを読むのであれば… -#endif - } - return(STATFLAG_SUCCESS); - } - (void)e; - return(STATFLAG_FAILURE); -} - -static int flagcreate(NP2FFILE f, const char *filename) { - - if (f) { - f->fh = file_create(filename); - if (f->fh == FILEH_INVALID) { - return(STATFLAG_FAILURE); - } - if (file_write(f->fh, &np2flagdef, sizeof(NP2FHDR)) - != sizeof(NP2FHDR)) { - file_close(f->fh); - return(STATFLAG_FAILURE); - } - f->pos = sizeof(NP2FHDR); - return(STATFLAG_SUCCESS); - } - return(STATFLAG_FAILURE); -} - -static int flagload_create(NP2FFILE f) { - - if (f) { - ZeroMemory(&f->p, sizeof(NP2FENT)); - if (f->pos & 15) { - f->pos += 15; - f->pos &= ~0xf; - if (file_seek(f->fh, f->pos, 0) != f->pos) { - return(STATFLAG_FAILURE); - } - } - if (file_read(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) { - return(STATFLAG_FAILURE); - } - f->pos += sizeof(NP2FENT); - f->next = f->pos + f->p.size; - return(STATFLAG_SUCCESS); - } - 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(STATFLAG_SUCCESS); - } - return(STATFLAG_FAILURE); -} - -static int flagload_close(NP2FFILE f) { - - if (file_seek(f->fh, f->next, 0) != f->next) { - return(STATFLAG_FAILURE); - } - f->pos = f->next; - return(STATFLAG_SUCCESS); -} - -static int flagsave_create(NP2FFILE f, const SFENTRY *t) { - - if (f && t) { - int len; - ZeroMemory(&f->p, sizeof(NP2FENT)); - if (f->pos & 15) { - UINT rem; - rem = 16 - (f->pos & 15); - if (file_write(f->fh, &f->p, rem) != rem) { - return(STATFLAG_FAILURE); - } - 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; - if (file_write(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) { - return(STATFLAG_FAILURE); - } - f->pos += sizeof(NP2FENT); - return(STATFLAG_SUCCESS); - } - return(STATFLAG_FAILURE); -} - -static int flagsave_save(NP2FFILE f, void *buf, UINT size) { - - if (f && buf && size && (file_write(f->fh, buf, size) == size)) { - f->pos += size; - f->p.size += size; - return(STATFLAG_SUCCESS); - } - return(STATFLAG_FAILURE); -} - -static int flagsave_close(NP2FFILE f) { - - if (!f) { - goto fs_closeerr; - } - if (file_seek(f->fh, f->bak, 0) != f->bak) { - goto fs_closeerr; - } - if (file_write(f->fh, &f->p, sizeof(NP2FENT)) != sizeof(NP2FENT)) { - goto fs_closeerr; - } - if (file_seek(f->fh, f->pos, 0) == f->pos) { - return(STATFLAG_SUCCESS); - } - -fs_closeerr: - return(STATFLAG_FAILURE); -} - -static void flagclose(NP2FFILE f) { - - if (f) { - file_close(f->fh); - } -} -#endif - - // ---- common static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { @@ -550,19 +377,6 @@ static int flagload_common(STFLAGH sfh, } -// ----- clock - -static int flagload_clock(STFLAGH sfh, const SFENTRY *tbl) { - - int ret; - - ret = statflag_read(sfh, tbl->arg1, tbl->arg2); - sound_changeclock(); - beep_changeclock(); - return(ret); -} - - // ---- memory static int flagsave_mem(STFLAGH sfh, const SFENTRY *tbl) { @@ -588,54 +402,6 @@ static int flagload_mem(STFLAGH sfh, con } -// ---- ext memory - -static int flagsave_ext(STFLAGH sfh, const SFENTRY *tbl) { - - int ret; - - 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(STFLAGH sfh, const SFENTRY *tbl) { - - int ret; - int i; - UINT pagemax = 0; - - ret = statflag_read(sfh, &extmem, sizeof(extmem)); - if (extmem.maxmem) { - if (extmem.maxmem > (13+1)) { - extmem.maxmem = (13+1); - } - if (!extmemmng_realloc(extmem.maxmem - 1)) { - pagemax = (extmem.maxmem - 1) << 8; - if (CPU_EXTMEM) { - ret |= statflag_read(sfh, CPU_EXTMEM, CPU_EXTMEMSIZE); - } - } - else { - extmem.maxmem = 0; - } - } - for (i=0; i<4; i++) { - if (extmem.page[i] < pagemax) { - extmem.pageptr[i] = CPU_EXTMEM + (extmem.page[i] << 12); - } - else { - extmem.pageptr[i] = mem + 0xc0000 + (i << 14); - } - } - (void)tbl; - return(ret); -} - - // ---- cg window #if defined(CGWND_FONTPTR) @@ -781,7 +547,7 @@ static int nevent_write(STFLAGH sfh, int UINT i; ZeroMemory(&nit, sizeof(nit)); - for (i=0; i=0xa0; i--) { - opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]); - } - for (i=0; i<3; i++) { - opngen_keyon(chbase + i, opngen.keyreg[chbase + i]); - } -} - -static void play_psgreg(PSGGEN psg) { - - BYTE i; - - for (i=0; i<0x0e; i++) { - psggen_setreg(psg, i, ((BYTE *)&psg->reg)[i]); - } -} - static int flagload_fm(STFLAGH sfh, const SFENTRY *t) { int ret; UINT saveflg; OPNKEY opnkey; - UINT fmreg1a; - UINT fmreg1b; - UINT fmreg2a; - UINT fmreg2b; - - opngen_reset(); - psggen_reset(&psg1); - psggen_reset(&psg2); - psggen_reset(&psg3); - rhythm_reset(&rhythm); - adpcm_reset(&adpcm); - pcm86_reset(); - cs4231_reset(); ret = statflag_read(sfh, &usesound, sizeof(usesound)); fmboard_reset(usesound); - fmreg1a = 0x000; - fmreg1b = 0x100; - fmreg2a = 0x200; - fmreg2b = 0x300; switch(usesound) { case 0x01: saveflg = FLAG_MG; @@ -1093,9 +845,6 @@ static int flagload_fm(STFLAGH sfh, cons case 0x06: saveflg = FLAG_FM1A | FLAG_FM1B | FLAG_FM2A | FLAG_PSG1 | FLAG_PSG2 | FLAG_RHYTHM | FLAG_PCM86; - fmreg1a = 0x200; // 逆転してるのん… - fmreg1b = 0x000; - fmreg2a = 0x100; break; case 0x08: @@ -1159,62 +908,39 @@ static int flagload_fm(STFLAGH sfh, cons } if (saveflg & FLAG_CS4231) { ret |= statflag_read(sfh, &cs4231, sizeof(cs4231)); - cs4231.proc = cs4231dec[cs4231.reg.datafmt >> 4]; } - // 復元。 - rhythm_update(&rhythm); + // 復元。 これ移動すること! adpcm_update(&adpcm); pcm86gen_update(); if (saveflg & FLAG_PCM86) { - fmboard_extenable((BYTE)(pcm86.extfunc & 1)); + fmboard_extenable((REG8)(pcm86.extfunc & 1)); } if (saveflg & FLAG_CS4231) { - fmboard_extenable((BYTE)(cs4231.extfunc & 1)); - } - - if (saveflg & FLAG_FM1A) { - play_fmreg(0, fmreg1a); - } - if (saveflg & FLAG_FM1B) { - play_fmreg(1, fmreg1b); - } - if (saveflg & FLAG_FM2A) { - play_fmreg(2, fmreg2a); - } - if (saveflg & FLAG_FM2B) { - play_fmreg(3, fmreg2b); - } - if (saveflg & FLAG_PSG1) { - play_psgreg(&psg1); - } - if (saveflg & FLAG_PSG2) { - play_psgreg(&psg2); - } - if (saveflg & FLAG_PSG3) { - play_psgreg(&psg3); + fmboard_extenable((REG8)(cs4231.extfunc & 1)); } (void)t; return(ret); } +#endif // ---- disk typedef struct { - char path[MAX_PATH]; + OEMCHAR path[MAX_PATH]; int readonly; DOSDATE date; DOSTIME time; } STATDISK; -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"; -static const char str_notfound[] = "%s: not found"; +static const OEMCHAR str_fddx[] = OEMTEXT("FDD%u"); +static const OEMCHAR str_sasix[] = OEMTEXT("SASI%u"); +static const OEMCHAR str_scsix[] = OEMTEXT("SCSI%u"); +static const OEMCHAR str_updated[] = OEMTEXT("%s: updated"); +static const OEMCHAR str_notfound[] = OEMTEXT("%s: not found"); -static int disksave(STFLAGH sfh, const char *path, int readonly) { +static int disksave(STFLAGH sfh, const OEMCHAR *path, int readonly) { STATDISK st; FILEH fh; @@ -1235,29 +961,29 @@ static int disksave(STFLAGH sfh, const c static int flagsave_disk(STFLAGH sfh, const SFENTRY *tbl) { int ret; - BYTE i; + UINT8 i; - sxsi_flash(); + sxsi_allflash(); 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); + ret |= disksave(sfh, sxsi_getfilename(i), 0); } for (i=0x20; i<0x24; i++) { - ret |= disksave(sfh, sxsi_getname(i), 0); + ret |= disksave(sfh, sxsi_getfilename(i), 0); } (void)tbl; return(ret); } -static int diskcheck(STFLAGH sfh, const char *name) { +static int diskcheck(STFLAGH sfh, const OEMCHAR *name) { int ret; FILEH fh; STATDISK st; - char buf[256]; + OEMCHAR buf[256]; DOSDATE date; DOSTIME time; @@ -1270,13 +996,13 @@ static int diskcheck(STFLAGH sfh, const if ((memcmp(&st.date, &date, sizeof(date))) || (memcmp(&st.time, &time, sizeof(time)))) { ret |= STATFLAG_DISKCHG; - SPRINTF(buf, str_updated, name); + OEMSPRINTF(buf, str_updated, name); statflag_seterr(sfh, buf); } } else { ret |= STATFLAG_DISKCHG; - SPRINTF(buf, str_notfound, name); + OEMSPRINTF(buf, str_notfound, name); statflag_seterr(sfh, buf); } } @@ -1287,20 +1013,20 @@ static int flagcheck_disk(STFLAGH sfh, c int ret; int i; - char buf[8]; + OEMCHAR buf[8]; ret = 0; for (i=0; i<4; i++) { - SPRINTF(buf, str_fddx, i+1); + OEMSPRINTF(buf, str_fddx, i+1); ret |= diskcheck(sfh, buf); } - sxsi_flash(); + sxsi_allflash(); for (i=0; i<2; i++) { - SPRINTF(buf, str_sasix, i+1); + OEMSPRINTF(buf, str_sasix, i+1); ret |= diskcheck(sfh, buf); } for (i=0; i<4; i++) { - SPRINTF(buf, str_scsix, i); + OEMSPRINTF(buf, str_scsix, i); ret |= diskcheck(sfh, buf); } (void)tbl; @@ -1320,17 +1046,16 @@ static int flagload_disk(STFLAGH sfh, co fdd_set(i, st.path, FTYPE_NONE, st.readonly); } } - sxsi_trash(); for (i=0x00; i<0x02; i++) { ret |= statflag_read(sfh, &st, sizeof(st)); if (st.path[0]) { - sxsi_hddopen(i, st.path); + sxsi_devopen(i, st.path); } } for (i=0x20; i<0x24; i++) { ret |= statflag_read(sfh, &st, sizeof(st)); if (st.path[0]) { - sxsi_hddopen(i, st.path); + sxsi_devopen(i, st.path); } } (void)tbl; @@ -1448,7 +1173,7 @@ static int flagcheck_veronly(STFLAGH sfh // ---- -int statsave_save(const char *filename) { +int statsave_save(const OEMCHAR *filename) { SFFILEH sffh; int ret; @@ -1462,12 +1187,11 @@ const SFENTRY *tblterm; ret = STATFLAG_SUCCESS; tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); + tblterm = tbl + NELEMENTS(np2tbl); while(tbl < tblterm) { ret |= statflag_createsection(sffh, tbl); switch(tbl->type) { case STATFLAG_BIN: - case STATFLAG_CLOCK: case STATFLAG_TERM: ret |= flagsave_common(&sffh->sfh, tbl); break; @@ -1506,9 +1230,11 @@ const SFENTRY *tblterm; ret |= flagsave_ext(&sffh->sfh, tbl); break; +#if !defined(DISABLE_SOUND) case STATFLAG_FM: ret |= flagsave_fm(&sffh->sfh, tbl); break; +#endif case STATFLAG_GIJ: ret |= flagsave_gij(&sffh->sfh, tbl); @@ -1530,7 +1256,7 @@ const SFENTRY *tblterm; return(ret); } -int statsave_check(const char *filename, char *buf, int size) { +int statsave_check(const OEMCHAR *filename, OEMCHAR *buf, int size) { SFFILEH sffh; int ret; @@ -1548,7 +1274,7 @@ const SFENTRY *tblterm; while((!done) && (ret != STATFLAG_FAILURE)) { ret |= statflag_readsection(sffh); tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); + tblterm = tbl + NELEMENTS(np2tbl); while(tbl < tblterm) { if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) { break; @@ -1561,7 +1287,6 @@ const SFENTRY *tblterm; #if defined(CGWND_FONTPTR) case STATFLAG_CGW: #endif - case STATFLAG_CLOCK: case STATFLAG_MEM: ret |= flagcheck_versize(&sffh->sfh, tbl); break; @@ -1577,7 +1302,9 @@ const SFENTRY *tblterm; case STATFLAG_EVT: case STATFLAG_EXT: case STATFLAG_GIJ: +#if !defined(DISABLE_SOUND) case STATFLAG_FM: +#endif #if defined(SUPPORT_HOSTDRV) case STATFLAG_HDRV: #endif @@ -1601,7 +1328,7 @@ const SFENTRY *tblterm; return(ret); } -int statsave_load(const char *filename) { +int statsave_load(const OEMCHAR *filename) { SFFILEH sffh; int ret; @@ -1614,22 +1341,40 @@ const SFENTRY *tblterm; 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(); rs232c_midipanic(); mpu98ii_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(); -#if defined(SUPPORT_WAVEMIX) - wavemix_bind(); -#endif - fmboard_reset(0); + fddmtrsnd_bind(); + + iocore_reset(); // サウンドでpicを呼ぶので… + cbuscore_reset(); + fmboard_reset(pccore.sound); done = FALSE; - ret = STATFLAG_SUCCESS; while((!done) && (ret != STATFLAG_FAILURE)) { ret |= statflag_readsection(sffh); - tbl = np2tbl; - tblterm = tbl + (sizeof(np2tbl)/sizeof(SFENTRY)); + tbl = np2tbl + 1; + tblterm = np2tbl + NELEMENTS(np2tbl); while(tbl < tblterm) { if (!memcmp(sffh->sfh.hdr.index, tbl->index, 10)) { break; @@ -1652,10 +1397,6 @@ const SFENTRY *tblterm; break; #endif - case STATFLAG_CLOCK: - ret |= flagload_clock(&sffh->sfh, tbl); - break; - case STATFLAG_COM: ret |= flagload_com(&sffh->sfh, tbl); break; @@ -1684,9 +1425,11 @@ const SFENTRY *tblterm; ret |= flagload_ext(&sffh->sfh, tbl); break; +#if !defined(DISABLE_SOUND) case STATFLAG_FM: ret |= flagload_fm(&sffh->sfh, tbl); break; +#endif case STATFLAG_GIJ: ret |= flagload_gij(&sffh->sfh, tbl);