| version 1.14, 2003/10/29 10:09:37 | version 1.25, 2004/01/05 09:31:24 | 
| Line 4 | Line 4 | 
 | #include        "scrnmng.h" | #include        "scrnmng.h" | 
 | #include        "soundmng.h" | #include        "soundmng.h" | 
 | #include        "timemng.h" | #include        "timemng.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
| #include        "memory.h" |  | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 | #include        "cbuscore.h" | #include        "cbuscore.h" | 
 | #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        "bios.h" | 
 | #include        "vram.h" | #include        "vram.h" | 
 | #include        "palettes.h" | #include        "palettes.h" | 
| Line 28 | Line 28 | 
 | #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 43  typedef struct { | Line 55  typedef struct { | 
 | enum { | enum { | 
 | NP2FLAG_BIN                     = 0, | NP2FLAG_BIN                     = 0, | 
 | NP2FLAG_TERM, | NP2FLAG_TERM, | 
 |  | #if defined(CGWND_FONTPTR) | 
 |  | NP2FLAG_CGW, | 
 |  | #endif | 
 | NP2FLAG_CLOCK, | NP2FLAG_CLOCK, | 
 |  | NP2FLAG_COM, | 
 |  | NP2FLAG_DISK, | 
 | NP2FLAG_DMA, | NP2FLAG_DMA, | 
 | NP2FLAG_EGC, | NP2FLAG_EGC, | 
| NP2FLAG_EXT, | NP2FLAG_EPSON, | 
 | NP2FLAG_EVT, | NP2FLAG_EVT, | 
| NP2FLAG_GIJ, | NP2FLAG_EXT, | 
 | NP2FLAG_FM, | NP2FLAG_FM, | 
| NP2FLAG_COM, | NP2FLAG_GIJ, | 
| NP2FLAG_DISK | NP2FLAG_MEM | 
 | }; | }; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| Line 89  typedef struct { | Line 106  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 323  static int flagsave_term(NP2FFILE f, con | Line 341  static int flagsave_term(NP2FFILE f, con | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ---- | // ---- common | 
 |  |  | 
 | static int flagsave_common(NP2FFILE f, const STENTRY *t) { | static int flagsave_common(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 343  static int flagload_common(NP2FFILE f, c | Line 361  static int flagload_common(NP2FFILE f, c | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ----- clock | 
 |  |  | 
 | static int flagload_clock(NP2FFILE f, const STENTRY *t) { | static int flagload_clock(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 356  static int flagload_clock(NP2FFILE f, co | Line 374  static int flagload_clock(NP2FFILE f, co | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- memory | 
|  |  | 
|  | static int flagsave_mem(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | 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); | 
|  | } | 
|  | return(ret); | 
|  | } | 
|  |  | 
|  | static int flagload_mem(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | 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; | 
|  | return(ret); | 
|  | } | 
|  |  | 
|  |  | 
|  | // ---- ext memory | 
|  |  | 
|  | static int flagsave_ext(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | 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); | 
|  | } | 
|  | return(ret); | 
|  | } | 
|  |  | 
|  | static int flagload_ext(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | int             ret; | 
|  | int             i; | 
|  | UINT    pagemax = 0; | 
|  |  | 
|  | ret = flagload_load(f, &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 |= flagload_load(f, 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)t; | 
|  | return(ret); | 
|  | } | 
|  |  | 
|  |  | 
|  | // ---- cg window | 
|  |  | 
|  | #if defined(CGWND_FONTPTR) | 
|  | static int flagsave_cgwnd(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | int                     ret; | 
|  | _CGWINDOW       cgwnd; | 
|  |  | 
|  | cgwnd = cgwindow; | 
|  | cgwnd.fontlow -= (long)fontrom; | 
|  | cgwnd.fonthigh -= (long)fontrom; | 
|  | ret = flagsave_create(f, t); | 
|  | if (ret != NP2FLAG_FAILURE) { | 
|  | ret |= flagsave_save(f, &cgwindow, sizeof(cgwindow)); | 
|  | ret |= flagsave_close(f); | 
|  | } | 
|  | return(ret); | 
|  | } | 
|  |  | 
|  | static int flagload_cgwnd(NP2FFILE f, const STENTRY *t) { | 
|  |  | 
|  | int             ret; | 
|  |  | 
|  | ret = flagload_load(f, &cgwindow, sizeof(cgwindow)); | 
|  | cgwindow.fontlow += (long)fontrom; | 
|  | cgwindow.fonthigh += (long)fontrom; | 
|  | (void)t; | 
|  | return(ret); | 
|  | } | 
|  | #endif | 
|  |  | 
|  |  | 
|  | // ---- dma | 
 |  |  | 
 | static int flagsave_dma(NP2FFILE f, const STENTRY *t) { | static int flagsave_dma(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 366  static int flagsave_dma(NP2FFILE f, cons | Line 495  static int flagsave_dma(NP2FFILE f, cons | 
 |  |  | 
 | dmabak = dmac; | dmabak = dmac; | 
 | for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | 
| if ((PROC2NUM(dmabak.dmach[i].outproc, dmaproc)) || | if ((PROC2NUM(dmabak.dmach[i].proc.outproc, dmaproc)) || | 
| (PROC2NUM(dmabak.dmach[i].inproc, dmaproc)) || | (PROC2NUM(dmabak.dmach[i].proc.inproc, dmaproc)) || | 
| (PROC2NUM(dmabak.dmach[i].extproc, dmaproc))) { | (PROC2NUM(dmabak.dmach[i].proc.extproc, dmaproc))) { | 
 | return(NP2FLAG_FAILURE); | return(NP2FLAG_FAILURE); | 
 | } | } | 
 | } | } | 
| Line 388  static int flagload_dma(NP2FFILE f, cons | Line 517  static int flagload_dma(NP2FFILE f, cons | 
 | ret = flagload_load(f, &dmac, sizeof(dmac)); | ret = flagload_load(f, &dmac, sizeof(dmac)); | 
 |  |  | 
 | for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | 
| if (NUM2PROC(dmac.dmach[i].outproc, dmaproc)) { | if (NUM2PROC(dmac.dmach[i].proc.outproc, dmaproc)) { | 
| dmac.dmach[i].outproc = dma_dummyout; | dmac.dmach[i].proc.outproc = dma_dummyout; | 
 | ret |= NP2FLAG_WARNING; | ret |= NP2FLAG_WARNING; | 
 | } | } | 
| if (NUM2PROC(dmac.dmach[i].inproc, dmaproc)) { | if (NUM2PROC(dmac.dmach[i].proc.inproc, dmaproc)) { | 
| dmac.dmach[i].inproc = dma_dummyin; | dmac.dmach[i].proc.inproc = dma_dummyin; | 
 | ret |= NP2FLAG_WARNING; | ret |= NP2FLAG_WARNING; | 
 | } | } | 
| if (NUM2PROC(dmac.dmach[i].extproc, dmaproc)) { | if (NUM2PROC(dmac.dmach[i].proc.extproc, dmaproc)) { | 
| dmac.dmach[i].extproc = dma_dummyproc; | dmac.dmach[i].proc.extproc = dma_dummyproc; | 
 | ret |= NP2FLAG_WARNING; | ret |= NP2FLAG_WARNING; | 
 | } | } | 
 | } | } | 
| Line 406  static int flagload_dma(NP2FFILE f, cons | Line 535  static int flagload_dma(NP2FFILE f, cons | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- egc | 
 |  |  | 
 | static int flagsave_egc(NP2FFILE f, const STENTRY *t) { | static int flagsave_egc(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 437  static int flagload_egc(NP2FFILE f, cons | Line 566  static int flagload_egc(NP2FFILE f, cons | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- epson | 
 |  |  | 
| static int flagsave_ext(NP2FFILE f, const STENTRY *t) { | static int flagsave_epson(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
 | int             ret; | int             ret; | 
 |  |  | 
 |  | if (!(pc.model & PCMODEL_EPSON)) { | 
 |  | return(NP2FLAG_SUCCESS); | 
 |  | } | 
 | ret = flagsave_create(f, t); | ret = flagsave_create(f, t); | 
 | if (ret != NP2FLAG_FAILURE) { | if (ret != NP2FLAG_FAILURE) { | 
| ret |= flagsave_save(f, &extmem, sizeof(extmem)); | ret |= flagsave_save(f, &epsonio, sizeof(epsonio)); | 
| if (extmemmng_size) { | ret |= flagsave_save(f, mem + 0x1c0000, 0x8000); | 
| ret |= flagsave_save(f, extmemmng_ptr, extmemmng_size); | ret |= flagsave_save(f, mem + 0x1e8000, 0x18000); | 
| } |  | 
 | ret |= flagsave_close(f); | ret |= flagsave_close(f); | 
 | } | } | 
 | return(ret); | return(ret); | 
 | } | } | 
 |  |  | 
| static int flagload_ext(NP2FFILE f, const STENTRY *t) { | static int flagload_epson(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
 | int             ret; | int             ret; | 
 | int             i; |  | 
 | UINT    pagemax = 0; |  | 
 |  |  | 
| ret = flagload_load(f, &extmem, sizeof(extmem)); | ret = flagload_load(f, &epsonio, sizeof(epsonio)); | 
| if (extmem.maxmem) { | ret |= flagload_load(f, mem + 0x1c0000, 0x8000); | 
| if (extmem.maxmem > (13+1)) { | ret |= flagload_load(f, mem + 0x1e8000, 0x18000); | 
| extmem.maxmem = (13+1); |  | 
| } |  | 
| if (!extmemmng_realloc(extmem.maxmem - 1)) { |  | 
| pagemax = (extmem.maxmem - 1) << 8; |  | 
| if (extmemmng_size) { |  | 
| ret |= flagload_load(f, extmemmng_ptr, extmemmng_size); |  | 
| } |  | 
| } |  | 
| else { |  | 
| extmem.maxmem = 0; |  | 
| } |  | 
| } |  | 
| for (i=0; i<4; i++) { |  | 
| if (extmem.page[i] < pagemax) { |  | 
| extmem.pageptr[i] = extmemmng_ptr + (extmem.page[i] << 12); |  | 
| } |  | 
| else { |  | 
| extmem.pageptr[i] = mem + 0xc0000 + (i << 14); |  | 
| } |  | 
| } |  | 
 | (void)t; | (void)t; | 
 | return(ret); | return(ret); | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- event | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 | UINT            readyevents; | UINT            readyevents; | 
| Line 601  static int flagload_evt(NP2FFILE f, cons | Line 710  static int flagload_evt(NP2FFILE f, cons | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ---- | // ---- gaiji | 
 |  |  | 
 | static int flagsave_gij(NP2FFILE f, const STENTRY *t) { | static int flagsave_gij(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 613  static int flagsave_gij(NP2FFILE f, cons | Line 722  static int flagsave_gij(NP2FFILE f, cons | 
 | 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 633  static int flagload_gij(NP2FFILE f, cons | Line 742  static int flagload_gij(NP2FFILE f, cons | 
 |  |  | 
 | 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 644  static int flagload_gij(NP2FFILE f, cons | Line 753  static int flagload_gij(NP2FFILE f, cons | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- FM | 
 |  |  | 
 | enum { | enum { | 
 | FLAG_MG                 = 0x0001, | FLAG_MG                 = 0x0001, | 
| Line 654  enum { | Line 763  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 710  static int flagsave_fm(NP2FFILE f, const | Line 820  static int flagsave_fm(NP2FFILE f, const | 
 | 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 738  static int flagsave_fm(NP2FFILE f, const | Line 852  static int flagsave_fm(NP2FFILE f, const | 
 | 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 846  static int flagload_fm(NP2FFILE f, const | Line 963  static int flagload_fm(NP2FFILE f, const | 
 | 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 872  static int flagload_fm(NP2FFILE f, const | Line 993  static int flagload_fm(NP2FFILE f, const | 
 | 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 912  static int flagload_fm(NP2FFILE f, const | Line 1036  static int flagload_fm(NP2FFILE f, const | 
 | 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 926  typedef struct { | Line 1053  typedef struct { | 
 | DOSTIME time; | DOSTIME time; | 
 | } STATDISK; | } 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) { | static int disksave(NP2FFILE f, const char *path, int readonly) { | 
 |  |  | 
 | STATDISK        st; | STATDISK        st; | 
| Line 984  static int diskcheck(NP2FFILE f, const c | Line 1117  static int diskcheck(NP2FFILE f, const c | 
 | 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); | 
 | } | } | 
 | } | } | 
| Line 1005  static int flagcheck_disk(NP2FFILE f, co | Line 1138  static int flagcheck_disk(NP2FFILE f, co | 
 |  |  | 
 | 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; | 
| Line 1054  static int flagload_disk(NP2FFILE f, con | Line 1187  static int flagload_disk(NP2FFILE f, con | 
 | } | } | 
 |  |  | 
 |  |  | 
| // ----- | // ---- com | 
 |  |  | 
 | static int flagsave_com(NP2FFILE f, const STENTRY *t) { | static int flagsave_com(NP2FFILE f, const STENTRY *t) { | 
 |  |  | 
| Line 1180  int statsave_save(const char *filename) | Line 1313  int statsave_save(const char *filename) | 
 |  |  | 
 | _NP2FFILE       f; | _NP2FFILE       f; | 
 | int                     ret; | int                     ret; | 
| UINT            i; | const STENTRY   *tbl; | 
|  | const STENTRY   *tblterm; | 
 |  |  | 
 | ret = flagcreate(&f, filename); | ret = flagcreate(&f, filename); | 
 | if (ret == NP2FLAG_FAILURE) { | if (ret == NP2FLAG_FAILURE) { | 
 | return(ret); | return(ret); | 
 | } | } | 
| for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) { | tbl = np2tbl; | 
| switch(np2tbl[i].type) { | tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); | 
|  | while(tbl < tblterm) { | 
|  | switch(tbl->type) { | 
 | case NP2FLAG_BIN: | case NP2FLAG_BIN: | 
 | case NP2FLAG_CLOCK: | case NP2FLAG_CLOCK: | 
| ret |= flagsave_common(&f, &np2tbl[i]); | ret |= flagsave_common(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_TERM: | case NP2FLAG_TERM: | 
| ret |= flagsave_term(&f, &np2tbl[i]); | ret |= flagsave_term(&f, tbl); | 
|  | break; | 
|  |  | 
|  | #if defined(CGWND_FONTPTR) | 
|  | case NP2FLAG_CGW: | 
|  | ret |= flagsave_cgwnd(&f, tbl); | 
|  | break; | 
|  | #endif | 
|  |  | 
|  | case NP2FLAG_COM: | 
|  | ret |= flagsave_com(&f, tbl); | 
|  | break; | 
|  |  | 
|  | case NP2FLAG_DISK: | 
|  | ret |= flagsave_disk(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_DMA: | case NP2FLAG_DMA: | 
| ret |= flagsave_dma(&f, &np2tbl[i]); | ret |= flagsave_dma(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_EGC: | case NP2FLAG_EGC: | 
| ret |= flagsave_egc(&f, &np2tbl[i]); | ret |= flagsave_egc(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_EXT: | case NP2FLAG_EPSON: | 
| ret |= flagsave_ext(&f, &np2tbl[i]); | ret |= flagsave_epson(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_EVT: | case NP2FLAG_EVT: | 
| ret |= flagsave_evt(&f, &np2tbl[i]); | ret |= flagsave_evt(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_GIJ: | case NP2FLAG_EXT: | 
| ret |= flagsave_gij(&f, &np2tbl[i]); | ret |= flagsave_ext(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_FM: | case NP2FLAG_FM: | 
| ret |= flagsave_fm(&f, &np2tbl[i]); | ret |= flagsave_fm(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_DISK: | case NP2FLAG_GIJ: | 
| ret |= flagsave_disk(&f, &np2tbl[i]); | ret |= flagsave_gij(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_COM: | case NP2FLAG_MEM: | 
| ret |= flagsave_com(&f, &np2tbl[i]); | ret |= flagsave_mem(&f, tbl); | 
 | break; | break; | 
 | } | } | 
 |  | tbl++; | 
 | } | } | 
 | flagclose(&f); | flagclose(&f); | 
 | return(ret); | return(ret); | 
| Line 1236  int statsave_save(const char *filename) | Line 1387  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) { | 
 |  |  | 
 |  | ERR_BUF         e; | 
 | _NP2FFILE       f; | _NP2FFILE       f; | 
 | int                     ret; | int                     ret; | 
 | UINT            i; |  | 
 | BOOL            done; | BOOL            done; | 
| ERR_BUF         e; | const STENTRY   *tbl; | 
|  | const STENTRY   *tblterm; | 
 |  |  | 
 | e.buf = buf; | e.buf = buf; | 
 | e.remain = size; | e.remain = size; | 
| Line 1262  int statsave_check(const char *filename, | Line 1414  int statsave_check(const char *filename, | 
 | ret |= flagload_create(&f); | ret |= flagload_create(&f); | 
 | CopyMemory(index, f.p.index, sizeof(f.p.index)); | CopyMemory(index, f.p.index, sizeof(f.p.index)); | 
 | index[10] = 0; | index[10] = 0; | 
| for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) { | tbl = np2tbl; | 
| if (!strcmp(index, np2tbl[i].index)) { | tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); | 
|  | while(tbl < tblterm) { | 
|  | if (!strcmp(index, tbl->index)) { | 
 | break; | break; | 
 | } | } | 
 |  | tbl++; | 
 | } | } | 
| if (i < (sizeof(np2tbl)/sizeof(STENTRY))) { | if (tbl < tblterm) { | 
| switch(np2tbl[i].type) { | switch(tbl->type) { | 
 | case NP2FLAG_BIN: | case NP2FLAG_BIN: | 
 |  | #if defined(CGWND_FONTPTR) | 
 |  | case NP2FLAG_CGW: | 
 |  | #endif | 
 | case NP2FLAG_CLOCK: | case NP2FLAG_CLOCK: | 
| ret |= flagcheck_versize(&f, &np2tbl[i], &e); | case NP2FLAG_MEM: | 
|  | ret |= flagcheck_versize(&f, tbl, &e); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_TERM: | case NP2FLAG_TERM: | 
 | done = TRUE; | done = TRUE; | 
 | break; | break; | 
 |  |  | 
 |  | case NP2FLAG_COM: | 
 | case NP2FLAG_DMA: | case NP2FLAG_DMA: | 
 | case NP2FLAG_EGC: | case NP2FLAG_EGC: | 
| case NP2FLAG_EXT: | case NP2FLAG_EPSON: | 
 | case NP2FLAG_EVT: | case NP2FLAG_EVT: | 
 |  | case NP2FLAG_EXT: | 
 | case NP2FLAG_GIJ: | case NP2FLAG_GIJ: | 
| case NP2FLAG_COM: | case NP2FLAG_FM: | 
| ret |= flagcheck_veronly(&f, &np2tbl[i], &e); | ret |= flagcheck_veronly(&f, tbl, &e); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_DISK: | case NP2FLAG_DISK: | 
| ret |= flagcheck_disk(&f, &np2tbl[i], &e); | ret |= flagcheck_disk(&f, tbl, &e); | 
| break; |  | 
|  |  | 
| case NP2FLAG_FM:                                                        // ver0.31 |  | 
 | break; | break; | 
 |  |  | 
 | default: | default: | 
| Line 1316  int statsave_load(const char *filename) | Line 1474  int statsave_load(const char *filename) | 
 |  |  | 
 | _NP2FFILE       f; | _NP2FFILE       f; | 
 | int                     ret; | int                     ret; | 
 | UINT            i; |  | 
 | BOOL            done; | BOOL            done; | 
 |  | const STENTRY   *tbl; | 
 |  | const STENTRY   *tblterm; | 
 |  |  | 
 | ret = flagopen(&f, filename, NULL); | ret = flagopen(&f, filename, NULL); | 
 | if (ret == NP2FLAG_FAILURE) { | if (ret == NP2FLAG_FAILURE) { | 
| Line 1337  int statsave_load(const char *filename) | Line 1496  int statsave_load(const char *filename) | 
 | ret |= flagload_create(&f); | ret |= flagload_create(&f); | 
 | CopyMemory(index, f.p.index, sizeof(f.p.index)); | CopyMemory(index, f.p.index, sizeof(f.p.index)); | 
 | index[10] = 0; | index[10] = 0; | 
| for (i=0; i<sizeof(np2tbl)/sizeof(STENTRY); i++) { | tbl = np2tbl; | 
| if (!strcmp(index, np2tbl[i].index)) { | tblterm = tbl + (sizeof(np2tbl)/sizeof(STENTRY)); | 
|  | while(tbl < tblterm) { | 
|  | if (!strcmp(index, tbl->index)) { | 
 | break; | break; | 
 | } | } | 
 |  | tbl++; | 
 | } | } | 
| if (i < (sizeof(np2tbl)/sizeof(STENTRY))) { | if (tbl < tblterm) { | 
| switch(np2tbl[i].type) { | switch(tbl->type) { | 
 | case NP2FLAG_BIN: | case NP2FLAG_BIN: | 
| ret |= flagload_common(&f, &np2tbl[i]); | ret |= flagload_common(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_TERM: | case NP2FLAG_TERM: | 
 | done = TRUE; | done = TRUE; | 
 | break; | break; | 
 |  |  | 
 |  | #if defined(CGWND_FONTPTR) | 
 |  | case NP2FLAG_CGW: | 
 |  | ret |= flagload_cgwnd(&f, tbl); | 
 |  | break; | 
 |  | #endif | 
 |  |  | 
 | case NP2FLAG_CLOCK: | case NP2FLAG_CLOCK: | 
| ret |= flagload_clock(&f, &np2tbl[i]); | ret |= flagload_clock(&f, tbl); | 
|  | break; | 
|  |  | 
|  | case NP2FLAG_COM: | 
|  | ret |= flagload_com(&f, tbl); | 
|  | break; | 
|  |  | 
|  | case NP2FLAG_DISK: | 
|  | ret |= flagload_disk(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_DMA: | case NP2FLAG_DMA: | 
| ret |= flagload_dma(&f, &np2tbl[i]); | ret |= flagload_dma(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_EGC: | case NP2FLAG_EGC: | 
| ret |= flagload_egc(&f, &np2tbl[i]); | ret |= flagload_egc(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_EXT: | case NP2FLAG_EPSON: | 
| ret |= flagload_ext(&f, &np2tbl[i]); | ret |= flagload_epson(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_EVT: | case NP2FLAG_EVT: | 
| ret |= flagload_evt(&f, &np2tbl[i]); | ret |= flagload_evt(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_GIJ: | case NP2FLAG_EXT: | 
| ret |= flagload_gij(&f, &np2tbl[i]); | ret |= flagload_ext(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | case NP2FLAG_FM: | case NP2FLAG_FM: | 
| ret |= flagload_fm(&f, &np2tbl[i]); | ret |= flagload_fm(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_DISK: | case NP2FLAG_GIJ: | 
| ret |= flagload_disk(&f, &np2tbl[i]); | ret |= flagload_gij(&f, tbl); | 
 | break; | break; | 
 |  |  | 
| case NP2FLAG_COM: | case NP2FLAG_MEM: | 
| ret |= flagload_com(&f, &np2tbl[i]); | ret |= flagload_mem(&f, tbl); | 
 | break; | break; | 
 |  |  | 
 | default: | default: | 
| Line 1401  int statsave_load(const char *filename) | Line 1577  int statsave_load(const char *filename) | 
 | flagclose(&f); | flagclose(&f); | 
 |  |  | 
 | // I/O作り直し | // I/O作り直し | 
 |  | i286_memorymap((pc.model & PCMODEL_EPSON)?1:0); | 
 | iocore_build(); | iocore_build(); | 
 | iocore_bind(); | iocore_bind(); | 
 | cbuscore_bind(); | cbuscore_bind(); | 
| Line 1413  int statsave_load(const char *filename) | Line 1590  int statsave_load(const char *filename) | 
 | gdcs.palchange = GDCSCRN_REDRAW; | gdcs.palchange = GDCSCRN_REDRAW; | 
 | tramflag.renewal = 1; | tramflag.renewal = 1; | 
 | cgwindow.writable |= 0x80; | cgwindow.writable |= 0x80; | 
 |  | #if defined(CPUSTRUC_FONTPTR) | 
 |  | FONTPTR_LOW = fontrom + cgwindow.low; | 
 |  | FONTPTR_HIGH = fontrom + cgwindow.high; | 
 |  | #endif | 
 | i286_vram_dispatch(vramop.operate); | i286_vram_dispatch(vramop.operate); | 
 | soundmng_play(); | soundmng_play(); | 
 |  |  |