| version 1.7, 2004/01/22 01:10:05 | version 1.10, 2005/03/20 08:58:20 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 | #include        "strres.h" | #include        "strres.h" | 
 | #include        "profile.h" |  | 
 | #include        "np2.h" | #include        "np2.h" | 
 | #include        "dosio.h" | #include        "dosio.h" | 
 | #include        "ini.h" | #include        "ini.h" | 
| Line 8 | Line 7 | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 |  |  | 
 |  |  | 
| typedef struct { | void ini_read(const TCHAR *path, const TCHAR *title, | 
| const char              *title; | const PFTBL *tbl, UINT count) { | 
| const INITBL    *tbl; |  | 
| const INITBL    *tblterm; |  | 
| UINT            count; |  | 
| } _INIARG, *INIARG; |  | 
|  |  | 
| static void inirdarg8(BYTE *dst, int dsize, const char *src) { |  | 
|  |  | 
| int             i; |  | 
| BYTE    val; |  | 
| BOOL    set; |  | 
| char    c; |  | 
|  |  | 
| for (i=0; i<dsize; i++) { |  | 
| val = 0; |  | 
| set = FALSE; |  | 
| while(*src == ' ') { |  | 
| src++; |  | 
| } |  | 
| while(1) { |  | 
| c = *src; |  | 
| if ((c == '\0') || (c == ' ')) { |  | 
| break; |  | 
| } |  | 
| else if ((c >= '0') && (c <= '9')) { |  | 
| val <<= 4; |  | 
| val += c - '0'; |  | 
| set = TRUE; |  | 
| } |  | 
| else { |  | 
| c |= 0x20; |  | 
| if ((c >= 'a') && (c <= 'f')) { |  | 
| val <<= 4; |  | 
| val += c - 'a' + 10; |  | 
| set = TRUE; |  | 
| } |  | 
| } |  | 
| src++; |  | 
| } |  | 
| if (set == FALSE) { |  | 
| break; |  | 
| } |  | 
| dst[i] = val; |  | 
| } |  | 
| } |  | 
|  |  | 
| static BOOL inireadcb(void *arg, const char *para, |  | 
| const char *key, const char *data) { |  | 
|  |  | 
| const INITBL    *p; |  | 
 |  |  | 
| if (arg == NULL) { | profile_iniread(path, title, tbl, count, NULL); | 
| return(FAILURE); |  | 
| } |  | 
| if (milstr_cmp(para, ((INIARG)arg)->title)) { |  | 
| return(SUCCESS); |  | 
| } |  | 
| p = ((INIARG)arg)->tbl; |  | 
| while(p < ((INIARG)arg)->tblterm) { |  | 
| if (!milstr_cmp(key, p->item)) { |  | 
| switch(p->itemtype) { |  | 
| case INITYPE_STR: |  | 
| milstr_ncpy((char *)p->value, data, p->size); |  | 
| break; |  | 
|  |  | 
| case INITYPE_BOOL: |  | 
| *((BYTE *)p->value) = (!milstr_cmp(data, str_true))?1:0; |  | 
| break; |  | 
|  |  | 
| case INITYPE_BYTEARG: |  | 
| inirdarg8((BYTE *)p->value, p->size, data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT8: |  | 
| case INITYPE_UINT8: |  | 
| *((BYTE *)p->value) = (BYTE)milstr_solveINT(data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT16: |  | 
| case INITYPE_UINT16: |  | 
| *((UINT16 *)p->value) = (UINT16)milstr_solveINT(data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT32: |  | 
| case INITYPE_UINT32: |  | 
| *((UINT32 *)p->value) = (UINT32)milstr_solveINT(data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX8: |  | 
| *((BYTE *)p->value) = (BYTE)milstr_solveHEX(data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX16: |  | 
| *((UINT16 *)p->value) = (UINT16)milstr_solveHEX(data); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX32: |  | 
| *((UINT32 *)p->value) = (UINT32)milstr_solveHEX(data); |  | 
| break; |  | 
| } |  | 
| } |  | 
| p++; |  | 
| } |  | 
| return(SUCCESS); |  | 
 | } | } | 
 |  |  | 
| void ini_read(const char *path, const char *title, | void ini_write(const TCHAR *path, const TCHAR *title, | 
| const INITBL *tbl, UINT count) { | const PFTBL *tbl, UINT count) { | 
 |  |  | 
| _INIARG iniarg; | profile_iniwrite(path, title, tbl, count, NULL); | 
|  |  | 
| if (path == NULL) { |  | 
| return; |  | 
| } |  | 
| iniarg.title = title; |  | 
| iniarg.tbl = tbl; |  | 
| iniarg.tblterm = tbl + count; |  | 
| profile_enum(path, &iniarg, inireadcb); |  | 
 | } | } | 
 |  |  | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| static void iniwrsetstr(char *work, int size, const char *ptr) { | static const TCHAR ini_title[] = _T("NekoProjectII"); | 
|  | #if defined(_UNICODE) | 
| int             i; | static const TCHAR inifile[] = _T("np2u.cfg"); | 
| char    c; | #else | 
|  | static const TCHAR inifile[] = _T("np2.cfg"); | 
| if (ptr[0] == ' ') { | #endif | 
| goto iwss_extend; |  | 
|  |  | 
| } |  | 
| i = strlen(ptr); |  | 
| if ((i) && (ptr[i-1] == ' ')) { |  | 
| goto iwss_extend; |  | 
| } |  | 
| while(i > 0) { |  | 
| i--; |  | 
| if (ptr[i] == '\"') { |  | 
| goto iwss_extend; |  | 
| } |  | 
| } |  | 
| milstr_ncpy(work, ptr, size); |  | 
| return; |  | 
|  |  | 
| iwss_extend: |  | 
| if (size > 3) { |  | 
| size -= 3; |  | 
| *work++ = '\"'; |  | 
| while(size > 0) { |  | 
| size--; |  | 
| c = *ptr++; |  | 
| if (c == '\"') { |  | 
| if (size > 0) { |  | 
| size--; |  | 
| work[0] = c; |  | 
| work[1] = c; |  | 
| work += 2; |  | 
| } |  | 
| } |  | 
| else { |  | 
| *work++ = c; |  | 
| } |  | 
| } |  | 
| work[0] = '\"'; |  | 
| work[1] = '\0'; |  | 
| } |  | 
| } |  | 
|  |  | 
| static void iniwrsetarg8(char *work, int size, const BYTE *ptr, int arg) { |  | 
|  |  | 
| int             i; |  | 
| char    tmp[8]; |  | 
|  |  | 
| if (arg > 0) { |  | 
| SPRINTF(tmp, "%.2x", ptr[0]); |  | 
| milstr_ncpy(work, tmp, size); |  | 
| } |  | 
| for (i=1; i<arg; i++) { |  | 
| SPRINTF(tmp, " %.2x", ptr[i]); |  | 
| milstr_ncat(work, tmp, size); |  | 
| } |  | 
| } |  | 
|  |  | 
| void ini_write(const char *path, const char *title, |  | 
| const INITBL *tbl, UINT count) { |  | 
|  |  | 
| FILEH           fh; |  | 
| const INITBL    *p; |  | 
| const INITBL    *pterm; |  | 
| BOOL            set; |  | 
| char            work[512]; |  | 
|  |  | 
| fh = file_create(path); |  | 
| if (fh == FILEH_INVALID) { |  | 
| return; |  | 
| } |  | 
| milstr_ncpy(work, "[", sizeof(work)); |  | 
| milstr_ncat(work, title, sizeof(work)); |  | 
| milstr_ncat(work, "]\r\n", sizeof(work)); |  | 
| file_write(fh, work, strlen(work)); |  | 
|  |  | 
| p = tbl; |  | 
| pterm = tbl + count; |  | 
| while(p < pterm) { |  | 
| work[0] = '\0'; |  | 
| set = SUCCESS; |  | 
| switch(p->itemtype) { |  | 
| case INITYPE_STR: |  | 
| iniwrsetstr(work, sizeof(work), (char *)p->value); |  | 
| break; |  | 
|  |  | 
| case INITYPE_BOOL: |  | 
| milstr_ncpy(work, (*((BYTE *)p->value))?str_true:str_false, |  | 
| sizeof(work)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_BYTEARG: |  | 
| iniwrsetarg8(work, sizeof(work), (BYTE *)p->value, p->size); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT8: |  | 
| SPRINTF(work, "%d", *((char *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT16: |  | 
| SPRINTF(work, "%d", *((SINT16 *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_SINT32: |  | 
| SPRINTF(work, "%d", *((SINT32 *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_UINT8: |  | 
| SPRINTF(work, "%u", *((BYTE *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_UINT16: |  | 
| SPRINTF(work, "%u", *((UINT16 *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_UINT32: |  | 
| SPRINTF(work, "%u", *((UINT32 *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX8: |  | 
| SPRINTF(work, "%x", *((BYTE *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX16: |  | 
| SPRINTF(work, "%x", *((UINT16 *)p->value)); |  | 
| break; |  | 
|  |  | 
| case INITYPE_HEX32: |  | 
| SPRINTF(work, "%x", *((UINT32 *)p->value)); |  | 
| break; |  | 
|  |  | 
| default: |  | 
| set = FAILURE; |  | 
| break; |  | 
| } |  | 
| if (set == SUCCESS) { |  | 
| file_write(fh, p->item, strlen(p->item)); |  | 
| file_write(fh, "=", 1); |  | 
| file_write(fh, work, strlen(work)); |  | 
| file_write(fh, "\r\n", 2); |  | 
| } |  | 
| p++; |  | 
| } |  | 
| file_close(fh); |  | 
| } |  | 
|  |  | 
|  |  | 
| // ---- |  | 
 |  |  | 
| static const char ini_title[] = "NekoProjectII"; | enum { | 
| static const char inifile[] = "np2.cfg"; | PFRO_STR                = PFFLAG_RO + PFTYPE_STR, | 
|  | PFRO_BOOL               = PFFLAG_RO + PFTYPE_BOOL, | 
|  | PFRO_UINT8              = PFFLAG_RO + PFTYPE_UINT8, | 
|  | PFRO_HEX32              = PFFLAG_RO + PFTYPE_HEX32 | 
|  | }; | 
|  |  | 
|  | static const PFTBL iniitem[] = { | 
|  | PFVAL("WindposX", PFTYPE_SINT32,        &np2oscfg.winx), | 
|  | PFVAL("WindposY", PFTYPE_SINT32,        &np2oscfg.winy), | 
|  |  | 
|  | PFSTR("FDfolder", PFTYPE_STR,           fddfolder), | 
|  | PFSTR("HDfolder", PFTYPE_STR,           hddfolder), | 
|  | PFSTR("bmap_Dir", PFTYPE_STR,           bmpfilefolder), | 
|  | PFSTR("fontfile", PFTYPE_STR,           np2cfg.fontfile), | 
|  | PFSTR("biospath", PFRO_STR,                     np2cfg.biospath), | 
 |  |  | 
 | static const INITBL iniitem[] = { |  | 
 | {"WindposX", INITYPE_SINT32,    &np2oscfg.winx,                 0}, |  | 
 | {"WindposY", INITYPE_SINT32,    &np2oscfg.winy,                 0}, |  | 
 |  |  | 
 | {"FDfolder", INITYPE_STR,               fddfolder,                              MAX_PATH}, |  | 
 | {"HDfolder", INITYPE_STR,               hddfolder,                              MAX_PATH}, |  | 
 | {"bmap_Dir", INITYPE_STR,               bmpfilefolder,                  MAX_PATH}, |  | 
 | {"fontfile", INITYPE_STR,               np2cfg.fontfile,                MAX_PATH}, |  | 
 | {"biospath", INITYPE_STR,               np2cfg.biospath,                MAX_PATH}, |  | 
 | #if defined(SUPPORT_HOSTDRV) | #if defined(SUPPORT_HOSTDRV) | 
| {"hdrvroot", INITYPE_STR,               np2cfg.hdrvroot,                MAX_PATH}, | PFSTR("hdrvroot", PFRO_STR,                     np2cfg.hdrvroot), | 
| {"hdrv_acc", INITYPE_UINT8,             &np2cfg.hdrvacc,                0}, | PFVAL("hdrv_acc", PFRO_UINT8,           &np2cfg.hdrvacc), | 
 | #endif | #endif | 
 |  |  | 
| {"pc_model", INITYPE_STR,               &np2cfg.model, | PFSTR("pc_model", PFTYPE_STR,           &np2cfg.model), | 
| sizeof(np2cfg.model)}, | PFVAL("clk_base", PFTYPE_UINT32,        &np2cfg.baseclock), | 
| {"clk_base", INITYPE_SINT32,    &np2cfg.baseclock,              0}, | PFVAL("clk_mult", PFTYPE_UINT32,        &np2cfg.multiple), | 
| {"clk_mult", INITYPE_SINT32,    &np2cfg.multiple,               0}, |  | 
|  | PFEXT("DIPswtch", PFTYPE_BIN,           np2cfg.dipsw,                   3), | 
| {"DIPswtch", INITYPE_BYTEARG,   np2cfg.dipsw,                   3}, | PFEXT("MEMswtch", PFTYPE_BIN,           np2cfg.memsw,                   8), | 
| {"MEMswtch", INITYPE_BYTEARG,   np2cfg.memsw,                   8}, | PFMAX("ExMemory", PFTYPE_UINT8,         &np2cfg.EXTMEM,                 63), | 
| {"ExMemory", INITYPE_UINT8,             &np2cfg.EXTMEM,                 0}, | PFVAL("ITF_WORK", PFRO_BOOL,            &np2cfg.ITF_WORK), | 
| {"ITF_WORK", INITYPE_BOOL,              &np2cfg.ITF_WORK,               0}, |  | 
|  | PFSTR("HDD1FILE", PFTYPE_STR,           np2cfg.sasihdd[0]), | 
| {"HDD1FILE", INITYPE_STR,               np2cfg.sasihdd[0],              MAX_PATH}, | PFSTR("HDD2FILE", PFTYPE_STR,           np2cfg.sasihdd[1]), | 
| {"HDD2FILE", INITYPE_STR,               np2cfg.sasihdd[1],              MAX_PATH}, |  | 
|  | PFVAL("SampleHz", PFTYPE_UINT16,        &np2cfg.samplingrate), | 
| {"SampleHz", INITYPE_UINT16,    &np2cfg.samplingrate,   0}, | PFVAL("Latencys", PFTYPE_UINT16,        &np2cfg.delayms), | 
| {"Latencys", INITYPE_UINT16,    &np2cfg.delayms,                0}, | PFVAL("SNDboard", PFTYPE_HEX8,          &np2cfg.SOUND_SW), | 
| {"SNDboard", INITYPE_HEX8,              &np2cfg.SOUND_SW,               0}, | PFAND("BEEP_vol", PFTYPE_UINT8,         &np2cfg.BEEP_VOL,               3), | 
| {"BEEP_vol", INITYPE_UINT8,             &np2cfg.BEEP_VOL,               0}, | PFVAL("xspeaker", PFRO_BOOL,            &np2cfg.snd_x), | 
| {"xspeaker", INITYPE_BOOL,              &np2cfg.snd_x,                  0}, |  | 
|  | PFEXT("SND14vol", PFTYPE_BIN,           np2cfg.vol14,                   6), | 
| {"SND14vol", INITYPE_BYTEARG,   np2cfg.vol14,                   6}, | //      PFEXT("opt14BRD", PFTYPE_BIN,           np2cfg.snd14opt,                3), | 
| //      {"opt14BRD", INITYPE_BYTEARG,   np2cfg.snd14opt,                3}, | PFVAL("opt26BRD", PFTYPE_HEX8,          &np2cfg.snd26opt), | 
| {"opt26BRD", INITYPE_HEX8,              &np2cfg.snd26opt,               0}, | PFVAL("opt86BRD", PFTYPE_HEX8,          &np2cfg.snd86opt), | 
| {"opt86BRD", INITYPE_HEX8,              &np2cfg.snd86opt,               0}, | PFVAL("optSPBRD", PFTYPE_HEX8,          &np2cfg.spbopt), | 
| {"optSPBRD", INITYPE_HEX8,              &np2cfg.spbopt,                 0}, | PFVAL("optSPBVR", PFTYPE_HEX8,          &np2cfg.spb_vrc), | 
| {"optSPBVR", INITYPE_HEX8,              &np2cfg.spb_vrc,                0}, | PFMAX("optSPBVL", PFTYPE_UINT8,         &np2cfg.spb_vrl,                24), | 
| {"optSPBVL", INITYPE_UINT8,             &np2cfg.spb_vrl,                0}, | PFVAL("optSPB_X", PFTYPE_BOOL,          &np2cfg.spb_x), | 
| {"optSPB_X", INITYPE_BOOL,              &np2cfg.spb_x,                  0}, | PFVAL("optMPU98", PFTYPE_HEX8,          &np2cfg.mpuopt), | 
| {"optMPU98", INITYPE_HEX8,              &np2cfg.mpuopt,                 0}, |  | 
|  | PFMAX("volume_F", PFTYPE_UINT8,         &np2cfg.vol_fm,                 128), | 
| {"volume_F", INITYPE_UINT8,             &np2cfg.vol_fm,                 0}, | PFMAX("volume_S", PFTYPE_UINT8,         &np2cfg.vol_ssg,                128), | 
| {"volume_S", INITYPE_UINT8,             &np2cfg.vol_ssg,                0}, | PFMAX("volume_A", PFTYPE_UINT8,         &np2cfg.vol_adpcm,              128), | 
| {"volume_A", INITYPE_UINT8,             &np2cfg.vol_adpcm,              0}, | PFMAX("volume_P", PFTYPE_UINT8,         &np2cfg.vol_pcm,                128), | 
| {"volume_P", INITYPE_UINT8,             &np2cfg.vol_pcm,                0}, | PFMAX("volume_R", PFTYPE_UINT8,         &np2cfg.vol_rhythm,             128), | 
| {"volume_R", INITYPE_UINT8,             &np2cfg.vol_rhythm,             0}, |  | 
|  | PFVAL("Seek_Snd", PFTYPE_BOOL,          &np2cfg.MOTOR), | 
| {"Seek_Snd", INITYPE_BOOL,              &np2cfg.MOTOR,                  0}, | PFMAX("Seek_Vol", PFTYPE_UINT8,         &np2cfg.MOTORVOL,               100), | 
| {"Seek_Vol", INITYPE_UINT8,             &np2cfg.MOTORVOL,               0}, |  | 
|  | PFVAL("btnRAPID", PFTYPE_BOOL,          &np2cfg.BTN_RAPID), | 
| {"F12_COPY", INITYPE_UINT8,             &np2oscfg.F12COPY,              0}, | PFVAL("btn_MODE", PFTYPE_BOOL,          &np2cfg.BTN_MODE), | 
| {"Joystick", INITYPE_BOOL,              &np2oscfg.JOYPAD1,              0}, | PFVAL("Mouse_sw", PFTYPE_BOOL,          &np2oscfg.MOUSE_SW), | 
| {"Joy1_btn", INITYPE_BYTEARG,   np2oscfg.JOY1BTN,               4}, | PFVAL("MS_RAPID", PFTYPE_BOOL,          &np2cfg.MOUSERAPID), | 
| {"btnRAPID", INITYPE_BOOL,              &np2cfg.BTN_RAPID,              0}, |  | 
| {"btn_MODE", INITYPE_BOOL,              &np2cfg.BTN_MODE,               0}, | PFEXT("VRAMwait", PFTYPE_BIN,           np2cfg.wait,                    6), | 
| {"Mouse_sw", INITYPE_BOOL,              &np2oscfg.MOUSE_SW,             0}, | PFVAL("DispSync", PFTYPE_BOOL,          &np2cfg.DISPSYNC), | 
| {"MS_RAPID", INITYPE_BOOL,              &np2cfg.MOUSERAPID,             0}, | PFVAL("Real_Pal", PFTYPE_BOOL,          &np2cfg.RASTER), | 
|  | PFMAX("RPal_tim", PFTYPE_UINT8,         &np2cfg.realpal,                64), | 
| {"VRAMwait", INITYPE_BYTEARG,   np2cfg.wait,                    6}, | PFVAL("s_NOWAIT", PFTYPE_BOOL,          &np2oscfg.NOWAIT), | 
| {"DispSync", INITYPE_BOOL,              &np2cfg.DISPSYNC,               0}, | PFVAL("SkpFrame", PFTYPE_UINT8,         &np2oscfg.DRAW_SKIP), | 
| {"Real_Pal", INITYPE_BOOL,              &np2cfg.RASTER,                 0}, | PFVAL("uPD72020", PFTYPE_BOOL,          &np2cfg.uPD72020), | 
| {"RPal_tim", INITYPE_UINT8,             &np2cfg.realpal,                0}, | PFAND("GRCG_EGC", PFTYPE_UINT8,         &np2cfg.grcg,                   3), | 
| {"s_NOWAIT", INITYPE_BOOL,              &np2oscfg.NOWAIT,               0}, | PFVAL("color16b", PFTYPE_BOOL,          &np2cfg.color16), | 
| {"SkpFrame", INITYPE_UINT8,             &np2oscfg.DRAW_SKIP,    0}, | PFVAL("skipline", PFTYPE_BOOL,          &np2cfg.skipline), | 
| {"uPD72020", INITYPE_BOOL,              &np2cfg.uPD72020,               0}, | PFVAL("skplight", PFTYPE_UINT16,        &np2cfg.skiplight), | 
| {"GRCG_EGC", INITYPE_UINT8,             &np2cfg.grcg,                   0}, | PFAND("LCD_MODE", PFTYPE_UINT8,         &np2cfg.LCD_MODE,               0x03), | 
| {"color16b", INITYPE_BOOL,              &np2cfg.color16,                0}, | PFAND("BG_COLOR", PFRO_HEX32,           &np2cfg.BG_COLOR,               0xffffff), | 
| {"skipline", INITYPE_BOOL,              &np2cfg.skipline,               0}, | PFAND("FG_COLOR", PFRO_HEX32,           &np2cfg.FG_COLOR,               0xffffff), | 
| {"skplight", INITYPE_SINT16,    &np2cfg.skiplight,              0}, |  | 
| {"LCD_MODE", INITYPE_UINT8,             &np2cfg.LCD_MODE,               0}, | PFVAL("pc9861_e", PFTYPE_BOOL,          &np2cfg.pc9861enable), | 
| {"BG_COLOR", INITYPE_HEX32,             &np2cfg.BG_COLOR,               0}, | PFEXT("pc9861_s", PFTYPE_BIN,           np2cfg.pc9861sw,                3), | 
| {"FG_COLOR", INITYPE_HEX32,             &np2cfg.FG_COLOR,               0}, | PFEXT("pc9861_j", PFTYPE_BIN,           np2cfg.pc9861jmp,               6), | 
| {"pc9861_e", INITYPE_BOOL,              &np2cfg.pc9861enable,   0}, |  | 
| {"pc9861_s", INITYPE_BYTEARG,   np2cfg.pc9861sw,                3}, | PFVAL("calendar", PFTYPE_BOOL,          &np2cfg.calendar), | 
| {"pc9861_j", INITYPE_BYTEARG,   np2cfg.pc9861jmp,               6}, | PFVAL("USE144FD", PFTYPE_BOOL,          &np2cfg.usefd144), | 
| {"calendar", INITYPE_BOOL,              &np2cfg.calendar,               0}, |  | 
| {"USE144FD", INITYPE_BOOL,              &np2cfg.usefd144,               0}, | PFVAL("F12_COPY", PFTYPE_UINT8,         &np2oscfg.F12COPY), | 
| {"jast_snd", INITYPE_BOOL,              &np2oscfg.jastsnd,              0},             // ver0.73 | PFVAL("Joystick", PFTYPE_BOOL,          &np2oscfg.JOYPAD1), | 
| {"I286SAVE", INITYPE_BOOL,              &np2oscfg.I286SAVE,             0}}; | PFEXT("Joy1_btn", PFTYPE_BIN,           np2oscfg.JOY1BTN,               4), | 
|  |  | 
| #define INIITEMS        (sizeof(iniitem) / sizeof(INITBL)) | PFVAL("e_resume", PFTYPE_BOOL,          &np2oscfg.resume), | 
|  | PFVAL("jast_snd", PFTYPE_BOOL,          &np2oscfg.jastsnd), | 
|  | PFVAL("I286SAVE", PFRO_BOOL,            &np2oscfg.I286SAVE)}; | 
 |  |  | 
 |  |  | 
 | void initload(void) { | void initload(void) { | 
 |  |  | 
| char    path[MAX_PATH]; | TCHAR   path[MAX_PATH]; | 
 |  |  | 
| milstr_ncpy(path, file_getcd(inifile), sizeof(path)); | milstr_ncpy(path, file_getcd(inifile), NELEMENTS(path)); | 
| ini_read(path, ini_title, iniitem, INIITEMS); | ini_read(path, ini_title, iniitem, NELEMENTS(iniitem)); | 
 | } | } | 
 |  |  | 
 | void initsave(void) { | void initsave(void) { | 
 |  |  | 
| char    path[MAX_PATH]; | TCHAR   path[MAX_PATH]; | 
 |  |  | 
| milstr_ncpy(path, file_getcd(inifile), sizeof(path)); | milstr_ncpy(path, file_getcd(inifile), NELEMENTS(path)); | 
| ini_write(path, ini_title, iniitem, INIITEMS); | ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); | 
 | } | } | 
 |  |  |