|
|
| version 1.34, 2004/01/27 03:24:18 | version 1.39, 2004/03/23 13:32:50 |
|---|---|
| Line 8 | Line 8 |
| #include "cpucore.h" | #include "cpucore.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "gdc_sub.h" | |
| #include "cbuscore.h" | #include "cbuscore.h" |
| #include "ideio.h" | |
| #include "sasiio.h" | #include "sasiio.h" |
| #include "scsiio.h" | #include "scsiio.h" |
| #include "pc9861k.h" | #include "pc9861k.h" |
| Line 143 typedef struct { | Line 145 typedef struct { |
| UINT stat; | UINT stat; |
| FILEH fh; | FILEH fh; |
| UINT secpos; | UINT secpos; |
| // long pos; | |
| // long bak; | |
| // long next; | |
| NP2FHDR f; | NP2FHDR f; |
| // NP2FENT p; | } _SFFILEH, *SFFILEH; |
| } _NP2FFILE, *NP2FFILE, _SFFILEH, *SFFILEH; | |
| static SFFILEH statflag_open(const char *filename, char *err, int errlen) { | static SFFILEH statflag_open(const char *filename, char *err, int errlen) { |
| Line 366 void statflag_seterr(STFLAGH sfh, const | Line 363 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 | // ---- common |
| static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { | static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { |
| Line 988 static int flagsave_fm(STFLAGH sfh, cons | Line 816 static int flagsave_fm(STFLAGH sfh, cons |
| return(ret); | return(ret); |
| } | } |
| static void play_fmreg(BYTE num, UINT reg) { | |
| UINT chbase; | |
| UINT i; | |
| chbase = num * 3; | |
| for (i=0x30; i<0xa0; i++) { | |
| opngen_setreg((BYTE)chbase, (BYTE)i, opn.reg[reg + i]); | |
| } | |
| for (i=0xb7; 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) { | static int flagload_fm(STFLAGH sfh, const SFENTRY *t) { |
| int ret; | int ret; |
| UINT saveflg; | UINT saveflg; |
| OPNKEY opnkey; | 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)); | ret = statflag_read(sfh, &usesound, sizeof(usesound)); |
| fmboard_reset(usesound); | fmboard_reset(usesound); |
| fmreg1a = 0x000; | |
| fmreg1b = 0x100; | |
| fmreg2a = 0x200; | |
| fmreg2b = 0x300; | |
| switch(usesound) { | switch(usesound) { |
| case 0x01: | case 0x01: |
| saveflg = FLAG_MG; | saveflg = FLAG_MG; |
| Line 1057 static int flagload_fm(STFLAGH sfh, cons | Line 842 static int flagload_fm(STFLAGH sfh, 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 1126 static int flagload_fm(STFLAGH sfh, cons | Line 908 static int flagload_fm(STFLAGH sfh, cons |
| cs4231.proc = cs4231dec[cs4231.reg.datafmt >> 4]; | cs4231.proc = cs4231dec[cs4231.reg.datafmt >> 4]; |
| } | } |
| // 復元。 | // 復元。 これ移動すること! |
| rhythm_update(&rhythm); | |
| adpcm_update(&adpcm); | adpcm_update(&adpcm); |
| pcm86gen_update(); | pcm86gen_update(); |
| if (saveflg & FLAG_PCM86) { | if (saveflg & FLAG_PCM86) { |
| fmboard_extenable((BYTE)(pcm86.extfunc & 1)); | fmboard_extenable((REG8)(pcm86.extfunc & 1)); |
| } | } |
| if (saveflg & FLAG_CS4231) { | if (saveflg & FLAG_CS4231) { |
| fmboard_extenable((BYTE)(cs4231.extfunc & 1)); | fmboard_extenable((REG8)(cs4231.extfunc & 1)); |
| } | |
| if (saveflg & FLAG_FM1A) { | |
| play_fmreg(0, 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); | |
| } | } |
| (void)t; | (void)t; |
| return(ret); | return(ret); |
| Line 1590 const SFENTRY *tblterm; | Line 1349 const SFENTRY *tblterm; |
| sxsi_trash(); | sxsi_trash(); |
| ret |= flagload_common(&sffh->sfh, np2tbl); | ret |= flagload_common(&sffh->sfh, np2tbl); |
| nevent_init(); | |
| CPU_RESET(); | CPU_RESET(); |
| CPU_SETEXTSIZE((UINT32)pccore.extmem); | CPU_SETEXTSIZE((UINT32)pccore.extmem); |
| nevent_allreset(); | |
| sound_changeclock(); | sound_changeclock(); |
| beep_changeclock(); | beep_changeclock(); |
| sound_reset(); | sound_reset(); |
| #if defined(SUPPORT_WAVEMIX) | fddmtrsnd_bind(); |
| wavemix_bind(); | |
| #endif | |
| iocore_reset(); // サウンドでpicを呼ぶので… | iocore_reset(); // サウンドでpicを呼ぶので… |
| cbuscore_reset(); | cbuscore_reset(); |