--- np2/statsave.c 2003/10/24 10:58:47 1.12 +++ np2/statsave.c 2003/11/15 07:10:02 1.17 @@ -12,6 +12,7 @@ #include "pc9861k.h" #include "mpu98ii.h" #include "board14.h" +#include "amd98.h" #include "bios.h" #include "vram.h" #include "palettes.h" @@ -28,6 +29,18 @@ #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 { char name[16]; char vername[28]; @@ -50,7 +63,7 @@ enum { NP2FLAG_EVT, NP2FLAG_GIJ, NP2FLAG_FM, - NP2FLAG_MIDI, + NP2FLAG_COM, NP2FLAG_DISK }; @@ -89,9 +102,10 @@ typedef struct { static void err_append(ERR_BUF *e, char *buf) { + int len; + if ((e) && (buf)) { if (e->buf) { - int len; len = strlen(buf); if (e->remain >= len) { CopyMemory(e->buf, buf, len); @@ -613,7 +627,7 @@ static int flagsave_gij(NP2FFILE f, cons ret = flagsave_create(f, t); if (ret != NP2FLAG_FAILURE) { for (i=0; i<2; i++) { - fnt = font + ((0x56 + (i << 7)) << 4); + fnt = fontrom + ((0x56 + (i << 7)) << 4); for (j=0; j<0x80; j++) { ret |= flagsave_save(f, fnt, 32); fnt += 0x1000; @@ -633,7 +647,7 @@ static int flagload_gij(NP2FFILE f, cons ret = 0; for (i=0; i<2; i++) { - fnt = font + ((0x56 + (i << 7)) << 4); + fnt = fontrom + ((0x56 + (i << 7)) << 4); for (j=0; j<0x80; j++) { ret |= flagload_load(f, fnt, 32); fnt += 0x1000; @@ -654,10 +668,11 @@ enum { FLAG_FM2B = 0x0010, FLAG_PSG1 = 0x0020, FLAG_PSG2 = 0x0040, - FLAG_RHYTHM = 0x0080, - FLAG_ADPCM = 0x0100, - FLAG_PCM86 = 0x0200, - FLAG_CS4231 = 0x0400 + FLAG_PSG3 = 0x0080, + FLAG_RHYTHM = 0x0100, + FLAG_ADPCM = 0x0200, + FLAG_PCM86 = 0x0400, + FLAG_CS4231 = 0x0800 }; typedef struct { @@ -710,6 +725,10 @@ static int flagsave_fm(NP2FFILE f, const FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM; break; + case 0x80: + saveflg = FLAG_PSG1 | FLAG_PSG2 | FLAG_PSG3; + break; + default: saveflg = 0; break; @@ -738,6 +757,9 @@ static int flagsave_fm(NP2FFILE f, const if (saveflg & FLAG_PSG2) { ret |= flagsave_save(f, &psg2.reg, sizeof(PSGREG)); } + if (saveflg & FLAG_PSG3) { + ret |= flagsave_save(f, &psg3.reg, sizeof(PSGREG)); + } if (saveflg & FLAG_ADPCM) { ret |= flagsave_save(f, &adpcm, sizeof(adpcm)); } @@ -752,14 +774,12 @@ static int flagsave_fm(NP2FFILE f, const return(ret); } -static void play_fmreg(BYTE num) { +static void play_fmreg(BYTE num, UINT reg) { UINT chbase; - UINT reg; UINT i; chbase = num * 3; - reg = num * 0x100; for (i=0x30; i<0xa0; i++) { opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]); } @@ -785,6 +805,10 @@ static int flagload_fm(NP2FFILE f, const int ret; UINT saveflg; OPNKEY opnkey; + UINT fmreg1a; + UINT fmreg1b; + UINT fmreg2a; + UINT fmreg2b; opngen_reset(); psggen_reset(&psg1); @@ -798,6 +822,10 @@ static int flagload_fm(NP2FFILE f, const ret = flagload_load(f, &usesound, sizeof(usesound)); fmboard_reset((BYTE)usesound); + fmreg1a = 0x000; + fmreg1b = 0x100; + fmreg2a = 0x200; + fmreg2b = 0x300; switch(usesound) { case 0x01: saveflg = FLAG_MG; @@ -815,6 +843,9 @@ static int flagload_fm(NP2FFILE f, const 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: @@ -837,6 +868,10 @@ static int flagload_fm(NP2FFILE f, const FLAG_PSG1 | FLAG_RHYTHM | FLAG_ADPCM; break; + case 0x80: + saveflg = FLAG_PSG1 | FLAG_PSG2 | FLAG_PSG3; + break; + default: saveflg = 0; break; @@ -863,6 +898,9 @@ static int flagload_fm(NP2FFILE f, const if (saveflg & FLAG_PSG2) { ret |= flagload_load(f, &psg2.reg, sizeof(PSGREG)); } + if (saveflg & FLAG_PSG3) { + ret |= flagload_load(f, &psg3.reg, sizeof(PSGREG)); + } if (saveflg & FLAG_ADPCM) { ret |= flagload_load(f, &adpcm, sizeof(adpcm)); } @@ -886,16 +924,16 @@ static int flagload_fm(NP2FFILE f, const } if (saveflg & FLAG_FM1A) { - play_fmreg(0); + play_fmreg(0, fmreg1a); } if (saveflg & FLAG_FM1B) { - play_fmreg(1); + play_fmreg(1, fmreg1b); } if (saveflg & FLAG_FM2A) { - play_fmreg(2); + play_fmreg(2, fmreg2a); } if (saveflg & FLAG_FM2B) { - play_fmreg(3); + play_fmreg(3, fmreg2b); } if (saveflg & FLAG_PSG1) { play_psgreg(&psg1); @@ -903,6 +941,9 @@ static int flagload_fm(NP2FFILE f, const if (saveflg & FLAG_PSG2) { play_psgreg(&psg2); } + if (saveflg & FLAG_PSG3) { + play_psgreg(&psg3); + } (void)t; return(ret); } @@ -917,6 +958,12 @@ typedef struct { 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" CRLITERAL; +static const char str_notfound[] = "%s: not found" CRLITERAL; + static int disksave(NP2FFILE f, const char *path, int readonly) { STATDISK st; @@ -975,13 +1022,13 @@ static int diskcheck(NP2FFILE f, const c if ((memcmp(&st.date, &date, sizeof(date))) || (memcmp(&st.time, &time, sizeof(time)))) { ret |= NP2FLAG_DISKCHG; - SPRINTF(buf, "%s: updated\n", name); + SPRINTF(buf, str_updated, name); err_append(e, buf); } } else { ret |= NP2FLAG_DISKCHG; - SPRINTF(buf, "%s: not found\n", name); + SPRINTF(buf, str_notfound, name); err_append(e, buf); } } @@ -996,16 +1043,16 @@ static int flagcheck_disk(NP2FFILE f, co ret = 0; for (i=0; i<4; i++) { - SPRINTF(buf, "FDD%d", i+1); + SPRINTF(buf, str_fddx, i+1); ret |= diskcheck(f, buf, e); } sxsi_flash(); for (i=0; i<2; i++) { - SPRINTF(buf, "SASI%u", i+1); + SPRINTF(buf, str_sasix, i+1); ret |= diskcheck(f, buf, e); } for (i=0; i<2; i++) { - SPRINTF(buf, "SCSI%d", i+1); + SPRINTF(buf, str_scsix, i+1); ret |= diskcheck(f, buf, e); } (void)t; @@ -1047,13 +1094,12 @@ static int flagload_disk(NP2FFILE f, con // ----- -#ifdef _MIDICH -static int flagsave_midi(NP2FFILE f, const STENTRY *t) { +static int flagsave_com(NP2FFILE f, const STENTRY *t) { UINT device; COMMNG cm; int ret; - _MIDICH mch[16]; + COMFLAG flag; device = (UINT)t->arg1; switch(device) { @@ -1070,50 +1116,73 @@ static int flagsave_midi(NP2FFILE f, con break; } ret = NP2FLAG_SUCCESS; - if ((cm != NULL) && (cm->msg(cm, COMMSG_MIDISTATGET, (long)mch))) { - ret = flagsave_create(f, t); - if (ret != NP2FLAG_FAILURE) { - ret |= flagsave_save(f, mch, sizeof(mch)); - ret |= flagsave_close(f); + 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); + } + _MFREE(flag); } } 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; - COMMNG cm; - int ret; + UINT device; + COMMNG cm; + int ret; + _COMFLAG fhdr; + COMFLAG flag; - ret = flagload_load(f, mch, sizeof(mch)); - if (ret != NP2FLAG_FAILURE) { - device = (UINT)t->arg1; - switch(device) { - case 0: - commng_destroy(cm_mpu98); - cm = commng_create(COMCREATE_MPU98II); - cm_mpu98 = cm; - break; + ret = flagload_load(f, &fhdr, sizeof(fhdr)); + if (ret != NP2FLAG_SUCCESS) { + goto flcom_err1; + } + if (fhdr.size < sizeof(fhdr)) { + goto flcom_err1; + } + flag = (COMFLAG)_MALLOC(fhdr.size, "com stat flag"); + 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: - commng_destroy(cm_rs232c); - cm = commng_create(COMCREATE_SERIAL); - cm_rs232c = cm; - break; + device = (UINT)t->arg1; + switch(device) { + case 0: + commng_destroy(cm_mpu98); + cm = commng_create(COMCREATE_MPU98II); + cm_mpu98 = cm; + break; - default: - cm = NULL; - break; - } - if (cm) { - cm->msg(cm, COMMSG_MIDISTATSET, (long)mch); - } + case 1: + commng_destroy(cm_rs232c); + cm = commng_create(COMCREATE_SERIAL); + cm_rs232c = cm; + break; + + default: + cm = NULL; + break; } + if (cm) { + cm->msg(cm, COMMSG_SETFLAG, (long)flag); + } + +flcom_err2: + _MFREE(flag); + +flcom_err1: return(ret); } -#endif // ---- @@ -1194,11 +1263,9 @@ int statsave_save(const char *filename) ret |= flagsave_disk(&f, &np2tbl[i]); break; -#if defined(MIDICH) - case NP2FLAG_MIDI: - ret |= flagsave_midi(&f, &np2tbl[i]); + case NP2FLAG_COM: + ret |= flagsave_com(&f, &np2tbl[i]); break; -#endif } } flagclose(&f); @@ -1254,9 +1321,7 @@ int statsave_check(const char *filename, case NP2FLAG_EXT: case NP2FLAG_EVT: case NP2FLAG_GIJ: -#if defined(MIDICH) - case NP2FLAG_MIDI: -#endif + case NP2FLAG_COM: ret |= flagcheck_veronly(&f, &np2tbl[i], &e); break; @@ -1357,11 +1422,9 @@ int statsave_load(const char *filename) ret |= flagload_disk(&f, &np2tbl[i]); break; -#if defined(MIDICH) - case NP2FLAG_MIDI: - ret |= flagload_midi(&f, &np2tbl[i]); + case NP2FLAG_COM: + ret |= flagload_com(&f, &np2tbl[i]); break; -#endif default: ret |= NP2FLAG_WARNING;