|
|
| version 1.2, 2003/10/21 11:22:05 | version 1.38, 2005/03/20 08:58:19 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include <windowsx.h> | #include <windowsx.h> |
| #include <io.h> | #include <io.h> |
| #include "strres.h" | |
| #include "profile.h" | |
| #include "np2.h" | #include "np2.h" |
| #include "np2arg.h" | #include "np2arg.h" |
| #if defined(OSLANG_UCS2) | |
| #include "oemtext.h" | |
| #endif | |
| #include "dosio.h" | #include "dosio.h" |
| #include "ini.h" | #include "ini.h" |
| #include "winkbd.h" | #include "winkbd.h" |
| #include "pccore.h" | #include "pccore.h" |
| #define CFGLEN (MAX_PATH + 32) | |
| static const char ini_title[] = "NekoProjectII"; | static BOOL inigetbmp(const UINT8 *ptr, UINT pos) { |
| typedef struct { | return((ptr[pos >> 3] >> (pos & 7)) & 1); |
| char item[9]; | |
| BYTE itemtype; | |
| WORD flag; | |
| void *value; | |
| DWORD arg; | |
| } INI_ITEM; | |
| #define INI_RO 0x0001 | |
| #define INIAND 0x0002 | |
| #define INIMAX 0x0004 | |
| #define INIA4 0x0008 | |
| #define INIEND 0x8000 | |
| #define INI_STR 0x00 | |
| #define INI_BOOL 0x01 | |
| #define INI_ARG 0x02 | |
| #define INI_BYTE 0x11 | |
| #define INI_WORD 0x12 | |
| #define INI_DWORD 0x14 | |
| #define INI_HEXB 0x21 | |
| #define INI_HEXD 0x24 | |
| #define INI_EX 0x80 | |
| static INI_ITEM iniitem[] = { | |
| {"np2title", INI_STR, INI_RO|INIMAX, | |
| np2oscfg.titles, sizeof(np2oscfg.titles)}, | |
| {"np2winid", INI_EX|0, INI_RO, np2oscfg.winid, 0}, | |
| {"WindposX", INI_DWORD, 0, &np2oscfg.winx, 0}, | |
| {"WindposY", INI_DWORD, 0, &np2oscfg.winy, 0}, | |
| {"paddingx", INI_DWORD, INI_RO|INIMAX, | |
| &np2oscfg.paddingx, 32}, | |
| {"paddingy", INI_DWORD, INI_RO|INIMAX, | |
| &np2oscfg.paddingy, 32}, | |
| {"Win_Snap", INI_BOOL, 0, &np2oscfg.WINSNAP, 0}, | |
| {"FDfolder", INI_STR, INIMAX, fddfolder, MAX_PATH}, | |
| {"HDfolder", INI_STR, INIMAX, hddfolder, MAX_PATH}, | |
| {"bmap_Dir", INI_STR, INIMAX, bmpfilefolder, MAX_PATH}, | |
| {"fontfile", INI_STR, INIMAX, np2cfg.fontfile, MAX_PATH}, | |
| {"clk_base", INI_DWORD, 0, &np2cfg.baseclock, 0}, | |
| {"clk_mult", INI_DWORD, 0, &np2cfg.multiple, 0}, | |
| {"DIPswtch", INI_ARG, 0, np2cfg.dipsw, 3}, | |
| {"MEMswtch", INI_ARG, 0, np2cfg.memsw, 8}, | |
| {"ExMemory", INI_BYTE, INIMAX, &np2cfg.EXTMEM, 13}, | |
| {"ITF_WORK", INI_BOOL, INI_RO, &np2cfg.ITF_WORK, 0}, | |
| {"HDD1FILE", INI_STR, INIMAX, np2cfg.hddfile[0], MAX_PATH}, | |
| {"HDD2FILE", INI_STR, INIMAX, np2cfg.hddfile[1], MAX_PATH}, | |
| // {"Removabl", INI_EX|1, 0, &np2cfg.REMOVEHD, 0}, | |
| {"SampleHz", INI_WORD, 0, &np2cfg.samplingrate, 0}, | |
| {"Latencys", INI_WORD, 0, &np2cfg.delayms, 0}, | |
| {"SNDboard", INI_HEXB, 0, &np2cfg.SOUND_SW, 0}, | |
| {"BEEP_vol", INI_BYTE, INIAND, &np2cfg.BEEP_VOL, 0x03}, | |
| {"xspeaker", INI_BOOL, INI_RO, &np2cfg.snd_x, 0}, | |
| {"SND14vol", INI_ARG, INIA4, np2cfg.vol14, 6}, // ver0.27 | |
| // {"opt14BRD", INI_ARG, 0, np2cfg.snd14opt, 3}, | |
| {"opt26BRD", INI_HEXB, 0, &np2cfg.snd26opt, 0}, | |
| {"opt86BRD", INI_HEXB, 0, &np2cfg.snd86opt, 0}, | |
| {"optSPBRD", INI_HEXB, 0, &np2cfg.spbopt, 0}, | |
| {"optSPBVR", INI_HEXB, 0, &np2cfg.spb_vrc, 0}, // ver0.30 | |
| {"optSPBVL", INI_BYTE, INIMAX, &np2cfg.spb_vrl, 24}, // ver0.30 | |
| {"optSPB_X", INI_BOOL, 0, &np2cfg.spb_x, 0}, | |
| {"optMPU98", INI_HEXB, 0, &np2cfg.mpuopt, 0}, | |
| {"volume_F", INI_BYTE, INIMAX, &np2cfg.vol_fm, 128}, // ver0.28 | |
| {"volume_S", INI_BYTE, INIMAX, &np2cfg.vol_ssg, 128}, | |
| {"volume_A", INI_BYTE, INIMAX, &np2cfg.vol_adpcm, 128}, | |
| {"volume_P", INI_BYTE, INIMAX, &np2cfg.vol_pcm, 128}, | |
| {"volume_R", INI_BYTE, INIMAX, &np2cfg.vol_rhythm, 128}, | |
| {"Seek_Snd", INI_BOOL, 0, &np2cfg.MOTOR, 0}, | |
| {"Seek_Vol", INI_BYTE, INIMAX, &np2cfg.MOTORVOL, 100}, | |
| {"btnRAPID", INI_BOOL, 0, &np2cfg.BTN_RAPID, 0}, | |
| {"btn_MODE", INI_BOOL, 0, &np2cfg.BTN_MODE, 0}, | |
| {"Mouse_sw", INI_BOOL, 0, &np2oscfg.MOUSE_SW, 0}, | |
| {"MS_RAPID", INI_BOOL, 0, &np2cfg.MOUSERAPID, 0}, | |
| {"backgrnd", INI_BYTE, INIAND, &np2oscfg.background, 0x03}, | |
| {"VRAMwait", INI_ARG, 0, np2cfg.wait, 6}, | |
| {"DspClock", INI_BYTE, INIAND, &np2oscfg.DISPCLK, 0x03}, | |
| {"DispSync", INI_BOOL, 0, &np2cfg.DISPSYNC, 0}, | |
| {"Real_Pal", INI_BOOL, 0, &np2cfg.RASTER, 0}, | |
| {"RPal_tim", INI_BYTE, INIMAX, &np2cfg.realpal, 64}, | |
| {"s_NOWAIT", INI_BOOL, 0, &np2oscfg.NOWAIT, 0}, | |
| {"SkpFrame", INI_BYTE, 0, &np2oscfg.DRAW_SKIP, 0}, | |
| {"uPD72020", INI_BOOL, 0, &np2cfg.uPD72020, 0}, | |
| {"GRCG_EGC", INI_BYTE, INIAND, &np2cfg.grcg, 0x03}, | |
| {"color16b", INI_BOOL, 0, &np2cfg.color16, 0}, | |
| {"skipline", INI_BOOL, 0, &np2cfg.skipline, 0}, | |
| {"skplight", INI_WORD, 0, &np2cfg.skiplight, 0}, | |
| {"LCD_MODE", INI_BYTE, INIAND, &np2cfg.LCD_MODE, 0x03}, | |
| {"BG_COLOR", INI_HEXD, INI_RO|INIAND, | |
| &np2cfg.BG_COLOR, 0xffffff}, | |
| {"FG_COLOR", INI_HEXD, INI_RO|INIAND, | |
| &np2cfg.FG_COLOR, 0xffffff}, | |
| {"pc9861_e", INI_BOOL, 0, &np2cfg.pc9861enable, 0}, // ver0.29 | |
| {"pc9861_s", INI_ARG, 0, np2cfg.pc9861sw, 3}, | |
| {"pc9861_j", INI_ARG, 0, np2cfg.pc9861jmp, 6}, | |
| {"calendar", INI_BOOL, 0, &np2cfg.calendar, 0}, // ver0.34 | |
| {"USE144FD", INI_BOOL, 0, &np2cfg.usefd144, 0}, // ver0.31 | |
| // OS°Í¸¡© // ver0.29 | |
| {"keyboard", INI_EX|3, INI_RO, &np2oscfg.KEYBOARD, 0}, | |
| {"F12_COPY", INI_BYTE, 0, &np2oscfg.F12COPY, 0}, | |
| {"Joystick", INI_BOOL, 0, &np2oscfg.JOYPAD1, 0}, // ver0.28 | |
| {"Joy1_btn", INI_ARG, 0, np2oscfg.JOY1BTN, 4}, | |
| {"clocknow", INI_BYTE, 0, &np2oscfg.clk_x, 0}, | |
| {"clockfnt", INI_BYTE, 0, &np2oscfg.clk_fnt, 0}, | |
| {"clock_up", INI_HEXD, INI_RO|INIAND, | |
| &np2oscfg.clk_color1, 0xffffff}, | |
| {"clock_dn", INI_HEXD, INI_RO|INIAND, | |
| &np2oscfg.clk_color2, 0xffffff}, | |
| {"use_sstp", INI_BOOL, 0, &np2oscfg.sstp, 0}, | |
| {"sstpport", INI_WORD, 0, &np2oscfg.sstpport, 0}, | |
| {"comfirm_", INI_BOOL, 0, &np2oscfg.comfirm, 0}, | |
| {"shortcut", INI_HEXB, 0, &np2oscfg.shortcut, 0}, // ver0.30 | |
| {"mpu98map", INI_STR, INIMAX, np2oscfg.mpu.mout, MAXPNAMELEN}, | |
| {"mpu98min", INI_STR, INIMAX, np2oscfg.mpu.min, MAXPNAMELEN}, | |
| {"mpu98mdl", INI_STR, INIMAX, np2oscfg.mpu.mdl, 64}, | |
| {"mpu98def", INI_STR, INIMAX, np2oscfg.mpu.def, MAX_PATH}, | |
| {"com1port", INI_BYTE, INIMAX, &np2oscfg.com1.port, 5}, // ver0.34 | |
| {"com1para", INI_BYTE, 0, &np2oscfg.com1.param, 0}, | |
| {"com1_bps", INI_DWORD, 0, &np2oscfg.com1.speed, 0}, | |
| {"com1mmap", INI_STR, INIMAX, np2oscfg.com1.mout, MAXPNAMELEN}, | |
| {"com1mmdl", INI_STR, INIMAX, np2oscfg.com1.mdl, 64}, | |
| {"com1mdef", INI_STR, INIMAX, np2oscfg.com1.def, MAX_PATH}, | |
| {"com2port", INI_BYTE, INIMAX, &np2oscfg.com2.port, 5}, // ver0.34 | |
| {"com2para", INI_BYTE, 0, &np2oscfg.com2.param, 0}, | |
| {"com2_bps", INI_DWORD, 0, &np2oscfg.com2.speed, 0}, | |
| {"com2mmap", INI_STR, INIMAX, np2oscfg.com2.mout, MAXPNAMELEN}, | |
| {"com2mmdl", INI_STR, INIMAX, np2oscfg.com2.mdl, 64}, | |
| {"com2mdef", INI_STR, INIMAX, np2oscfg.com2.def, MAX_PATH}, | |
| {"com3port", INI_BYTE, INIMAX, &np2oscfg.com3.port, 5}, // ver0.34 | |
| {"com3para", INI_BYTE, 0, &np2oscfg.com3.param, 0}, | |
| {"com3_bps", INI_DWORD, 0, &np2oscfg.com3.speed, 0}, | |
| {"com3mmap", INI_STR, INIMAX, np2oscfg.com3.mout, MAXPNAMELEN}, | |
| {"com3mmdl", INI_STR, INIMAX, np2oscfg.com3.mdl, 64}, | |
| {"com3mdef", INI_STR, INIMAX, np2oscfg.com3.def, MAX_PATH}, | |
| {"force400", INI_BOOL, INI_RO, &np2oscfg.force400, 0}, | |
| {"e_resume", INI_BOOL, 0, &np2oscfg.resume, 0}, // ver0.30 | |
| {"STATSAVE", INI_BOOL, INI_RO, &np2oscfg.statsave, 0}, // ver0.30 | |
| {"I286SAVE", INI_BOOL, INI_RO|INIEND, | |
| &np2oscfg.I286SAVE, 0}}; | |
| #define INIITEMS (sizeof(iniitem) / sizeof(INI_ITEM)) | |
| static long solveHEX(char *str) { | |
| return(milstr_solveHEX(str)); | |
| } | |
| static char *makeBOOL(BYTE value) { | |
| if (value) { | |
| return("true"); | |
| } | |
| return("false"); | |
| } | |
| static BYTE solveBOOL(LPSTR str) { | |
| if ((!milstr_cmp(str, "TRUE")) || (!milstr_cmp(str, "ON")) || | |
| (!milstr_cmp(str, "+")) || (!milstr_cmp(str, "1")) || | |
| (!milstr_cmp(str, "ENABLE"))) { | |
| return(1); | |
| } | |
| return(0); | |
| } | } |
| static void inisetbmp(UINT8 *ptr, UINT pos, BOOL set) { | |
| static void getinifile(char *initfile, int max) { | UINT8 bit; |
| char *p; | |
| milstr_ncpy(initfile, modulefile, max); | ptr += (pos >> 3); |
| if (np2arg.ini) { | bit = 1 << (pos & 7); |
| if ((np2arg.ini[0] == '/') || (np2arg.ini[0] == '-')) { | if (set) { |
| file_cutname(initfile); | *ptr |= bit; |
| milstr_ncat(initfile, file_getname(np2arg.ini + 2), max); | |
| } | |
| else { | |
| milstr_ncpy(initfile, np2arg.ini, max); | |
| } | |
| p = file_getext(initfile); | |
| if (!(*p)) { | |
| milstr_ncat(initfile, ".ini", max); | |
| } | |
| } | } |
| else { | else { |
| file_cutext(initfile); | *ptr &= ~bit; |
| milstr_ncat(initfile, ".ini", max); | |
| } | } |
| } | } |
| static void inirdargs16(const OEMCHAR *src, const PFTBL *ini) { | |
| void initload(void) { | SINT16 *dst; |
| int dsize; | |
| int i; | |
| OEMCHAR c; | |
| char initfile[MAX_PATH]; | dst = (SINT16 *)ini->value; |
| char cfgstr[CFGLEN]; | dsize = ini->arg; |
| DWORD i; | |
| char *arg[8]; | for (i=0; i<dsize; i++) { |
| DWORD args; | while(*src == ' ') { |
| INI_ITEM *p; | src++; |
| } | |
| getinifile(initfile, MAX_PATH); // ver0.29 | if (*src == '\0') { |
| p = iniitem; | break; |
| while(1) { | } |
| if (!(p->itemtype & 0xf0)) { | dst[i] = (SINT16)milstr_solveINT(src); |
| switch(p->itemtype) { | while(*src != '\0') { |
| case INI_STR: | c = *src++; |
| GetPrivateProfileString(ini_title, p->item, | if (c == ',') { |
| (char *)p->value, (char *)p->value, | break; |
| p->arg, initfile); | |
| break; | |
| case INI_BOOL: | |
| GetPrivateProfileString(ini_title, p->item, | |
| makeBOOL(*((BYTE *)p->value) & 1), | |
| cfgstr, CFGLEN, initfile); | |
| *(BYTE *)(p->value) = solveBOOL(cfgstr); | |
| break; | |
| case INI_ARG: | |
| GetPrivateProfileString(ini_title, p->item, "", | |
| cfgstr, CFGLEN, initfile); | |
| args = milstr_getarg(cfgstr, arg, p->arg); | |
| if (args == p->arg) { | |
| for (i=0; i<args; i++) { | |
| ((BYTE *)p->value)[i] = (BYTE)solveHEX(arg[i]); | |
| if (p->flag & INIA4) { | |
| ((BYTE *)p->value)[i] &= 0x0f; | |
| } | |
| } | |
| } | |
| break; | |
| } | } |
| } | } |
| else if (!(p->itemtype & INI_EX)) { | } |
| switch(p->itemtype) { | } |
| case INI_BYTE: | |
| *(BYTE *)p->value = (BYTE)GetPrivateProfileInt( | static void inirdargh8(const OEMCHAR *src, const PFTBL *ini) { |
| ini_title, p->item, *(BYTE *)p->value, initfile); | |
| break; | UINT8 *dst; |
| case INI_WORD: | int dsize; |
| *(WORD *)p->value = (WORD)GetPrivateProfileInt( | int i; |
| ini_title, p->item, *(WORD *)p->value, initfile); | UINT8 val; |
| break; | BOOL set; |
| case INI_DWORD: | OEMCHAR c; |
| *(DWORD *)p->value = (DWORD)GetPrivateProfileInt( | |
| ini_title, p->item, *(DWORD *)p->value, initfile); | dst = (UINT8 *)ini->value; |
| break; | dsize = ini->arg; |
| case INI_HEXB: | |
| wsprintf(cfgstr, "%x", *(BYTE *)p->value), | for (i=0; i<dsize; i++) { |
| GetPrivateProfileString(ini_title, p->item, | val = 0; |
| cfgstr, cfgstr, CFGLEN, initfile); | set = FALSE; |
| *(BYTE *)p->value = (BYTE)solveHEX(cfgstr); | while(*src == ' ') { |
| break; | src++; |
| case INI_HEXD: | } |
| wsprintf(cfgstr, "%x", *(DWORD *)p->value), | while(1) { |
| GetPrivateProfileString(ini_title, p->item, | c = *src; |
| cfgstr, cfgstr, CFGLEN, initfile); | if ((c == '\0') || (c == ' ')) { |
| *(DWORD *)p->value = solveHEX(cfgstr); | break; |
| break; | |
| } | } |
| if (p->flag & INIMAX) { | else if ((c >= '0') && (c <= '9')) { |
| switch((p->itemtype) & 0x0f) { | val <<= 4; |
| case 1: | val += c - '0'; |
| if (*(BYTE *)p->value > (BYTE)p->arg) { | set = TRUE; |
| *(BYTE *)p->value = (BYTE)p->arg; | |
| } | |
| break; | |
| case 2: | |
| if (*(WORD *)p->value > (WORD)p->arg) { | |
| *(WORD *)p->value = (WORD)p->arg; | |
| } | |
| break; | |
| case 4: | |
| if (*(DWORD *)p->value > (DWORD)p->arg) { | |
| *(DWORD *)p->value = (DWORD)p->arg; | |
| } | |
| break; | |
| } | |
| } | } |
| if (p->flag & INIAND) { | else { |
| switch((p->itemtype) & 0x0f) { | c |= 0x20; |
| case 1: | if ((c >= 'a') && (c <= 'f')) { |
| *(BYTE *)p->value &= (BYTE)p->arg; | val <<= 4; |
| break; | val += c - 'a' + 10; |
| case 2: | set = TRUE; |
| *(WORD *)p->value &= (WORD)p->arg; | |
| break; | |
| case 4: | |
| *(DWORD *)p->value &= (DWORD)p->arg; | |
| break; | |
| } | } |
| } | } |
| src++; | |
| } | } |
| else { | if (set == FALSE) { |
| switch(p->itemtype) { | break; |
| case INI_EX|0: // winid | |
| GetPrivateProfileString(ini_title, p->item, | |
| (char *)p->value, cfgstr, CFGLEN, initfile); | |
| for (i=0; i<3; i++) { | |
| if (((cfgstr[i] >= '0') && (cfgstr[i] < '9')) || | |
| ((cfgstr[i] >= 'A') && (cfgstr[i] < 'Z')) || | |
| ((cfgstr[i] >= 'a') && (cfgstr[i] < 'z'))) { | |
| ((BYTE *)p->value)[i] = cfgstr[i]; | |
| } | |
| } | |
| break; | |
| case INI_EX|1: // remove hdd | |
| *(BYTE *)p->value = | |
| (BYTE)((GetPrivateProfileInt(ini_title, p->item, | |
| ((*(BYTE *)p->value) & 1) + 1, | |
| initfile) - 1) & 1); | |
| break; | |
| #if 0 | |
| case INI_EX|2: // midi module | |
| GetPrivateProfileString(ini_title, p->item, | |
| MIDI_num2module(*(BYTE *)p->value), | |
| cfgstr, CFGLEN, initfile); | |
| *(BYTE *)p->value = MIDI_module2num(cfgstr); | |
| break; | |
| #endif | |
| case INI_EX|3: // keyboard | |
| GetPrivateProfileString(ini_title, p->item, "unknown", | |
| cfgstr, CFGLEN, initfile); | |
| if ((!milstr_extendcmp(cfgstr, "PC98")) || | |
| (!milstr_cmp(cfgstr, "98"))) { | |
| *(BYTE *)p->value = KEY_PC98; | |
| } | |
| else if ((!milstr_extendcmp(cfgstr, "DOS")) || | |
| (!milstr_cmp(cfgstr, "PCAT")) || | |
| (!milstr_cmp(cfgstr, "AT"))) { | |
| *(BYTE *)p->value = KEY_KEY106; | |
| } | |
| else if ((!milstr_extendcmp(cfgstr, "KEY101")) || | |
| (!milstr_cmp(cfgstr, "101"))) { | |
| *(BYTE *)p->value = KEY_KEY101; | |
| } | |
| break; | |
| } | |
| } | } |
| if (p->flag & INIEND) { | dst[i] = val; |
| } | |
| } | |
| static void iniwrsetargh8(OEMCHAR *work, int size, const PFTBL *ini) { | |
| UINT i; | |
| const UINT8 *ptr; | |
| UINT arg; | |
| OEMCHAR tmp[8]; | |
| ptr = (UINT8 *)ini->value; | |
| arg = ini->arg; | |
| if (arg > 0) { | |
| OEMSPRINTF(tmp, OEMTEXT("%.2x"), ptr[0]); | |
| milstr_ncpy(work, tmp, size); | |
| } | |
| for (i=1; i<arg; i++) { | |
| OEMSPRINTF(tmp, OEMTEXT(" %.2x"), ptr[i]); | |
| milstr_ncat(work, tmp, size); | |
| } | |
| } | |
| // ---- user | |
| static void inirdbyte3(const OEMCHAR *src, const PFTBL *ini) { | |
| UINT i; | |
| for (i=0; i<3; i++) { | |
| if (src[i] == '\0') { | |
| break; | break; |
| } | } |
| if ((((src[i] - '0') & 0xff) < 9) || | |
| (((src[i] - 'A') & 0xdf) < 26)) { | |
| ((UINT8 *)ini->value)[i] = (UINT8)src[i]; | |
| } | |
| } | |
| } | |
| static void inirdkb(const OEMCHAR *src, const PFTBL *ini) { | |
| if ((!milstr_extendcmp(src, OEMTEXT("PC98"))) || | |
| (!milstr_cmp(src, OEMTEXT("98")))) { | |
| *(UINT8 *)ini->value = KEY_PC98; | |
| } | |
| else if ((!milstr_extendcmp(src, OEMTEXT("DOS"))) || | |
| (!milstr_cmp(src, OEMTEXT("PCAT"))) || | |
| (!milstr_cmp(src, OEMTEXT("AT")))) { | |
| *(UINT8 *)ini->value = KEY_KEY106; | |
| } | |
| else if ((!milstr_extendcmp(src, OEMTEXT("KEY101"))) || | |
| (!milstr_cmp(src, OEMTEXT("101")))) { | |
| *(UINT8 *)ini->value = KEY_KEY101; | |
| } | |
| } | |
| // ---- | |
| void ini_read(const OEMCHAR *path, const OEMCHAR *title, | |
| const PFTBL *tbl, UINT count) { | |
| const PFTBL *p; | |
| const PFTBL *pterm; | |
| OEMCHAR work[512]; | |
| UINT32 val; | |
| p = tbl; | |
| pterm = tbl + count; | |
| while(p < pterm) { | |
| switch(p->itemtype & PFTYPE_MASK) { | |
| case PFTYPE_STR: | |
| GetPrivateProfileString(title, p->item, (OEMCHAR *)p->value, | |
| (OEMCHAR *)p->value, p->arg, path); | |
| break; | |
| case PFTYPE_BOOL: | |
| GetPrivateProfileString(title, p->item, | |
| (*((UINT8 *)p->value))?str_true:str_false, | |
| work, NELEMENTS(work), path); | |
| *((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0; | |
| break; | |
| case PFTYPE_BITMAP: | |
| GetPrivateProfileString(title, p->item, | |
| (inigetbmp((UINT8 *)p->value, p->arg))?str_true:str_false, | |
| work, NELEMENTS(work), path); | |
| inisetbmp((UINT8 *)p->value, p->arg, | |
| (milstr_cmp(work, str_true) == 0)); | |
| break; | |
| case PFTYPE_ARGS16: | |
| GetPrivateProfileString(title, p->item, str_null, | |
| work, NELEMENTS(work), path); | |
| inirdargs16(work, p); | |
| break; | |
| case PFTYPE_BIN: | |
| GetPrivateProfileString(title, p->item, str_null, | |
| work, NELEMENTS(work), path); | |
| inirdargh8(work, p); | |
| break; | |
| case PFTYPE_SINT8: | |
| case PFTYPE_UINT8: | |
| val = (UINT8)GetPrivateProfileInt(title, p->item, | |
| *(UINT8 *)p->value, path); | |
| *(UINT8 *)p->value = (UINT8)val; | |
| break; | |
| case PFTYPE_SINT16: | |
| case PFTYPE_UINT16: | |
| val = (UINT16)GetPrivateProfileInt(title, p->item, | |
| *(UINT16 *)p->value, path); | |
| *(UINT16 *)p->value = (UINT16)val; | |
| break; | |
| case PFTYPE_SINT32: | |
| case PFTYPE_UINT32: | |
| val = (UINT32)GetPrivateProfileInt(title, p->item, | |
| *(UINT32 *)p->value, path); | |
| *(UINT32 *)p->value = (UINT32)val; | |
| break; | |
| case PFTYPE_HEX8: | |
| OEMSPRINTF(work, str_x, *(UINT8 *)p->value), | |
| GetPrivateProfileString(title, p->item, work, | |
| work, NELEMENTS(work), path); | |
| val = (UINT8)milstr_solveHEX(work); | |
| *(UINT8 *)p->value = (UINT8)val; | |
| break; | |
| case PFTYPE_HEX16: | |
| OEMSPRINTF(work, str_x, *(UINT16 *)p->value), | |
| GetPrivateProfileString(title, p->item, work, | |
| work, NELEMENTS(work), path); | |
| val = (UINT16)milstr_solveHEX(work); | |
| *(UINT16 *)p->value = (UINT16)val; | |
| break; | |
| case PFTYPE_HEX32: | |
| OEMSPRINTF(work, str_x, *(UINT32 *)p->value), | |
| GetPrivateProfileString(title, p->item, work, | |
| work, NELEMENTS(work), path); | |
| val = (UINT32)milstr_solveHEX(work); | |
| *(UINT32 *)p->value = (UINT32)val; | |
| break; | |
| case PFTYPE_BYTE3: | |
| GetPrivateProfileString(title, p->item, str_null, | |
| work, NELEMENTS(work), path); | |
| inirdbyte3(work, p); | |
| break; | |
| case PFTYPE_KB: | |
| GetPrivateProfileString(title, p->item, str_null, | |
| work, NELEMENTS(work), path); | |
| inirdkb(work, p); | |
| break; | |
| } | |
| p++; | p++; |
| } | } |
| } | } |
| void initsave(void) { | void ini_write(const OEMCHAR *path, const OEMCHAR *title, |
| const PFTBL *tbl, UINT count) { | |
| const PFTBL *p; | |
| const PFTBL *pterm; | |
| const OEMCHAR *set; | |
| OEMCHAR work[512]; | |
| p = tbl; | |
| pterm = tbl + count; | |
| while(p < pterm) { | |
| if (!(p->itemtype & PFFLAG_RO)) { | |
| work[0] = '\0'; | |
| set = work; | |
| switch(p->itemtype & PFTYPE_MASK) { | |
| case PFTYPE_STR: | |
| set = (OEMCHAR *)p->value; | |
| break; | |
| case PFTYPE_BOOL: | |
| set = (*((UINT8 *)p->value))?str_true:str_false; | |
| break; | |
| char initfile[MAX_PATH]; | case PFTYPE_BIN: |
| char cfgstr[CFGLEN]; | iniwrsetargh8(work, NELEMENTS(work), p); |
| DWORD i; | |
| INI_ITEM *p; | |
| getinifile(initfile, MAX_PATH); // ver0.29 | |
| p = iniitem; | |
| while(!(p->flag & INIEND)) { | |
| if (p->flag & INI_RO) { | |
| } | |
| else if (!(p->itemtype & INI_EX)) { | |
| switch(p->itemtype) { | |
| case INI_STR: | |
| WritePrivateProfileString(ini_title, p->item, | |
| (char *)p->value, initfile); | |
| break; | |
| case INI_BOOL: | |
| WritePrivateProfileString(ini_title, p->item, | |
| makeBOOL(*((BYTE *)p->value) & 1), initfile); | |
| break; | |
| case INI_ARG: | |
| for (i=0; i<p->arg; i++) { | |
| wsprintf(&cfgstr[i*3], "%02x ", | |
| ((BYTE *)p->value)[i]); | |
| } | |
| cfgstr[i*3-1] = '\0'; | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | |
| case INI_BYTE: | |
| wsprintf(cfgstr, "%u", *(BYTE *)p->value); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | |
| case INI_WORD: | |
| wsprintf(cfgstr, "%u", *(WORD *)p->value); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | |
| case INI_DWORD: | |
| wsprintf(cfgstr, "%u", *(DWORD *)p->value); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | |
| case INI_HEXB: | |
| wsprintf(cfgstr, "%x", *(BYTE *)p->value); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | |
| case INI_HEXD: | |
| wsprintf(cfgstr, "%x", *(DWORD *)p->value); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | |
| break; | break; |
| case PFTYPE_SINT8: | |
| OEMSPRINTF(work, str_d, *((SINT8 *)p->value)); | |
| break; | |
| case PFTYPE_SINT16: | |
| OEMSPRINTF(work, str_d, *((SINT16 *)p->value)); | |
| break; | |
| case PFTYPE_SINT32: | |
| OEMSPRINTF(work, str_d, *((SINT32 *)p->value)); | |
| break; | |
| case PFTYPE_UINT8: | |
| OEMSPRINTF(work, str_u, *((UINT8 *)p->value)); | |
| break; | |
| case PFTYPE_UINT16: | |
| OEMSPRINTF(work, str_u, *((UINT16 *)p->value)); | |
| break; | |
| case PFTYPE_UINT32: | |
| OEMSPRINTF(work, str_u, *((UINT32 *)p->value)); | |
| break; | |
| case PFTYPE_HEX8: | |
| OEMSPRINTF(work, str_x, *((UINT8 *)p->value)); | |
| break; | |
| case PFTYPE_HEX16: | |
| OEMSPRINTF(work, str_x, *((UINT16 *)p->value)); | |
| break; | |
| case PFTYPE_HEX32: | |
| OEMSPRINTF(work, str_x, *((UINT32 *)p->value)); | |
| break; | |
| default: | |
| set = NULL; | |
| break; | |
| } | |
| if (set) { | |
| WritePrivateProfileString(title, p->item, set, path); | |
| } | } |
| } | } |
| else { | p++; |
| switch(p->itemtype) { | } |
| case INI_EX|1: // remove hdd | } |
| wsprintf(cfgstr, "%u", (*(BYTE *)p->value) + 1); | |
| WritePrivateProfileString(ini_title, p->item, | |
| cfgstr, initfile); | // ---- |
| break; | |
| #if 0 | #if !defined(SUPPORT_PC9821) |
| case INI_EX|2: // midi module | static const OEMCHAR ini_title[] = OEMTEXT("NekoProjectII"); |
| WritePrivateProfileString(ini_title, p->item, | #else |
| MIDI_num2module(*(BYTE *)p->value), initfile); | static const OEMCHAR ini_title[] = OEMTEXT("NekoProject21"); |
| break; | |
| #endif | #endif |
| } | |
| enum { | |
| PFRO_STR = PFFLAG_RO + PFTYPE_STR, | |
| PFRO_BOOL = PFFLAG_RO + PFTYPE_BOOL, | |
| PFRO_BITMAP = PFFLAG_RO + PFTYPE_BITMAP, | |
| PFRO_UINT8 = PFFLAG_RO + PFTYPE_UINT8, | |
| PFRO_SINT32 = PFFLAG_RO + PFTYPE_SINT32, | |
| PFRO_HEX32 = PFFLAG_RO + PFTYPE_HEX32, | |
| PFRO_BYTE3 = PFFLAG_RO + PFTYPE_BYTE3, | |
| PFRO_KB = PFFLAG_RO + PFTYPE_KB | |
| }; | |
| static const PFTBL iniitem[] = { | |
| PFSTR("np2title", PFRO_STR, np2oscfg.titles), | |
| PFVAL("np2winid", PFRO_BYTE3, np2oscfg.winid), | |
| PFVAL("WindposX", PFTYPE_SINT32, &np2oscfg.winx), | |
| PFVAL("WindposY", PFTYPE_SINT32, &np2oscfg.winy), | |
| PFMAX("paddingx", PFRO_SINT32, &np2oscfg.paddingx, 32), | |
| PFMAX("paddingy", PFRO_SINT32, &np2oscfg.paddingy, 32), | |
| PFVAL("Win_Snap", PFTYPE_BOOL, &np2oscfg.WINSNAP), | |
| 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), | |
| #if defined(SUPPORT_HOSTDRV) | |
| PFSTR("hdrvroot", PFRO_STR, np2cfg.hdrvroot), | |
| PFVAL("hdrv_acc", PFRO_UINT8, &np2cfg.hdrvacc), | |
| #endif | |
| PFSTR("pc_model", PFTYPE_STR, &np2cfg.model), | |
| PFVAL("clk_base", PFTYPE_UINT32, &np2cfg.baseclock), | |
| PFVAL("clk_mult", PFTYPE_UINT32, &np2cfg.multiple), | |
| PFEXT("DIPswtch", PFTYPE_BIN, np2cfg.dipsw, 3), | |
| PFEXT("MEMswtch", PFTYPE_BIN, np2cfg.memsw, 8), | |
| PFMAX("ExMemory", PFTYPE_UINT8, &np2cfg.EXTMEM, 63), | |
| PFVAL("ITF_WORK", PFRO_BOOL, &np2cfg.ITF_WORK), | |
| PFSTR("HDD1FILE", PFTYPE_STR, np2cfg.sasihdd[0]), | |
| PFSTR("HDD2FILE", PFTYPE_STR, np2cfg.sasihdd[1]), | |
| #if defined(SUPPORT_SCSI) | |
| PFSTR("SCSIHDD0", PFTYPE_STR, np2cfg.scsihdd[0]), | |
| PFSTR("SCSIHDD1", PFTYPE_STR, np2cfg.scsihdd[1]), | |
| PFSTR("SCSIHDD2", PFTYPE_STR, np2cfg.scsihdd[2]), | |
| PFSTR("SCSIHDD3", PFTYPE_STR, np2cfg.scsihdd[3]), | |
| #endif | |
| PFVAL("SampleHz", PFTYPE_UINT16, &np2cfg.samplingrate), | |
| PFVAL("Latencys", PFTYPE_UINT16, &np2cfg.delayms), | |
| PFVAL("SNDboard", PFTYPE_HEX8, &np2cfg.SOUND_SW), | |
| PFAND("BEEP_vol", PFTYPE_UINT8, &np2cfg.BEEP_VOL, 3), | |
| PFVAL("xspeaker", PFRO_BOOL, &np2cfg.snd_x), | |
| PFEXT("SND14vol", PFTYPE_BIN, np2cfg.vol14, 6), | |
| // PFEXT("opt14BRD", PFTYPE_BIN, np2cfg.snd14opt, 3), | |
| PFVAL("opt26BRD", PFTYPE_HEX8, &np2cfg.snd26opt), | |
| PFVAL("opt86BRD", PFTYPE_HEX8, &np2cfg.snd86opt), | |
| PFVAL("optSPBRD", PFTYPE_HEX8, &np2cfg.spbopt), | |
| PFVAL("optSPBVR", PFTYPE_HEX8, &np2cfg.spb_vrc), | |
| PFMAX("optSPBVL", PFTYPE_UINT8, &np2cfg.spb_vrl, 24), | |
| PFVAL("optSPB_X", PFTYPE_BOOL, &np2cfg.spb_x), | |
| PFVAL("optMPU98", PFTYPE_HEX8, &np2cfg.mpuopt), | |
| PFMAX("volume_F", PFTYPE_UINT8, &np2cfg.vol_fm, 128), | |
| PFMAX("volume_S", PFTYPE_UINT8, &np2cfg.vol_ssg, 128), | |
| PFMAX("volume_A", PFTYPE_UINT8, &np2cfg.vol_adpcm, 128), | |
| PFMAX("volume_P", PFTYPE_UINT8, &np2cfg.vol_pcm, 128), | |
| PFMAX("volume_R", PFTYPE_UINT8, &np2cfg.vol_rhythm, 128), | |
| PFVAL("Seek_Snd", PFTYPE_BOOL, &np2cfg.MOTOR), | |
| PFMAX("Seek_Vol", PFTYPE_UINT8, &np2cfg.MOTORVOL, 100), | |
| PFVAL("btnRAPID", PFTYPE_BOOL, &np2cfg.BTN_RAPID), | |
| PFVAL("btn_MODE", PFTYPE_BOOL, &np2cfg.BTN_MODE), | |
| PFVAL("Mouse_sw", PFTYPE_BOOL, &np2oscfg.MOUSE_SW), | |
| PFVAL("MS_RAPID", PFTYPE_BOOL, &np2cfg.MOUSERAPID), | |
| PFAND("backgrnd", PFTYPE_UINT8, &np2oscfg.background, 3), | |
| PFEXT("VRAMwait", PFTYPE_BIN, np2cfg.wait, 6), | |
| PFAND("DspClock", PFTYPE_UINT8, &np2oscfg.DISPCLK, 3), | |
| PFVAL("DispSync", PFTYPE_BOOL, &np2cfg.DISPSYNC), | |
| PFVAL("Real_Pal", PFTYPE_BOOL, &np2cfg.RASTER), | |
| PFMAX("RPal_tim", PFTYPE_UINT8, &np2cfg.realpal, 64), | |
| PFVAL("s_NOWAIT", PFTYPE_BOOL, &np2oscfg.NOWAIT), | |
| PFVAL("SkpFrame", PFTYPE_UINT8, &np2oscfg.DRAW_SKIP), | |
| PFVAL("uPD72020", PFTYPE_BOOL, &np2cfg.uPD72020), | |
| PFAND("GRCG_EGC", PFTYPE_UINT8, &np2cfg.grcg, 3), | |
| PFVAL("color16b", PFTYPE_BOOL, &np2cfg.color16), | |
| PFVAL("skipline", PFTYPE_BOOL, &np2cfg.skipline), | |
| PFVAL("skplight", PFTYPE_UINT16, &np2cfg.skiplight), | |
| PFAND("LCD_MODE", PFTYPE_UINT8, &np2cfg.LCD_MODE, 0x03), | |
| PFAND("BG_COLOR", PFRO_HEX32, &np2cfg.BG_COLOR, 0xffffff), | |
| PFAND("FG_COLOR", PFRO_HEX32, &np2cfg.FG_COLOR, 0xffffff), | |
| PFVAL("pc9861_e", PFTYPE_BOOL, &np2cfg.pc9861enable), | |
| PFEXT("pc9861_s", PFTYPE_BIN, np2cfg.pc9861sw, 3), | |
| PFEXT("pc9861_j", PFTYPE_BIN, np2cfg.pc9861jmp, 6), | |
| PFVAL("calendar", PFTYPE_BOOL, &np2cfg.calendar), | |
| PFVAL("USE144FD", PFTYPE_BOOL, &np2cfg.usefd144), | |
| PFEXT("FDDRIVE1", PFRO_BITMAP, &np2cfg.fddequip, 0), | |
| PFEXT("FDDRIVE2", PFRO_BITMAP, &np2cfg.fddequip, 1), | |
| PFEXT("FDDRIVE3", PFRO_BITMAP, &np2cfg.fddequip, 2), | |
| PFEXT("FDDRIVE4", PFRO_BITMAP, &np2cfg.fddequip, 3), | |
| // OS°Í¸¡© | |
| PFVAL("keyboard", PFRO_KB, &np2oscfg.KEYBOARD), | |
| PFVAL("F12_COPY", PFTYPE_UINT8, &np2oscfg.F12COPY), | |
| PFVAL("Joystick", PFTYPE_BOOL, &np2oscfg.JOYPAD1), | |
| PFEXT("Joy1_btn", PFTYPE_BIN, np2oscfg.JOY1BTN, 4), | |
| PFVAL("clocknow", PFTYPE_UINT8, &np2oscfg.clk_x), | |
| PFVAL("clockfnt", PFTYPE_UINT8, &np2oscfg.clk_fnt), | |
| PFAND("clock_up", PFRO_HEX32, &np2oscfg.clk_color1, 0xffffff), | |
| PFAND("clock_dn", PFRO_HEX32, &np2oscfg.clk_color2, 0xffffff), | |
| PFVAL("use_sstp", PFTYPE_BOOL, &np2oscfg.sstp), | |
| PFVAL("sstpport", PFTYPE_UINT16, &np2oscfg.sstpport), | |
| PFVAL("comfirm_", PFTYPE_BOOL, &np2oscfg.comfirm), | |
| PFVAL("shortcut", PFTYPE_HEX8, &np2oscfg.shortcut), | |
| PFSTR("mpu98map", PFTYPE_STR, np2oscfg.mpu.mout), | |
| PFSTR("mpu98min", PFTYPE_STR, np2oscfg.mpu.min), | |
| PFSTR("mpu98mdl", PFTYPE_STR, np2oscfg.mpu.mdl), | |
| PFSTR("mpu98def", PFTYPE_STR, np2oscfg.mpu.def), | |
| PFMAX("com1port", PFTYPE_UINT8, &np2oscfg.com1.port, 5), | |
| PFVAL("com1para", PFTYPE_UINT8, &np2oscfg.com1.param), | |
| PFVAL("com1_bps", PFTYPE_UINT32, &np2oscfg.com1.speed), | |
| PFSTR("com1mmap", PFTYPE_STR, np2oscfg.com1.mout), | |
| PFSTR("com1mmdl", PFTYPE_STR, np2oscfg.com1.mdl), | |
| PFSTR("com1mdef", PFTYPE_STR, np2oscfg.com1.def), | |
| PFMAX("com2port", PFTYPE_UINT8, &np2oscfg.com2.port, 5), | |
| PFVAL("com2para", PFTYPE_UINT8, &np2oscfg.com2.param), | |
| PFVAL("com2_bps", PFTYPE_UINT32, &np2oscfg.com2.speed), | |
| PFSTR("com2mmap", PFTYPE_STR, np2oscfg.com2.mout), | |
| PFSTR("com2mmdl", PFTYPE_STR, np2oscfg.com2.mdl), | |
| PFSTR("com2mdef", PFTYPE_STR, np2oscfg.com2.def), | |
| PFMAX("com3port", PFTYPE_UINT8, &np2oscfg.com3.port, 5), | |
| PFVAL("com3para", PFTYPE_UINT8, &np2oscfg.com3.param), | |
| PFVAL("com3_bps", PFTYPE_UINT32, &np2oscfg.com3.speed), | |
| PFSTR("com3mmap", PFTYPE_STR, np2oscfg.com3.mout), | |
| PFSTR("com3mmdl", PFTYPE_STR, np2oscfg.com3.mdl), | |
| PFSTR("com3mdef", PFTYPE_STR, np2oscfg.com3.def), | |
| PFVAL("force400", PFRO_BOOL, &np2oscfg.force400), | |
| PFVAL("e_resume", PFTYPE_BOOL, &np2oscfg.resume), | |
| PFVAL("STATSAVE", PFRO_BOOL, &np2oscfg.statsave), | |
| PFVAL("nousemmx", PFTYPE_BOOL, &np2oscfg.disablemmx), | |
| PFVAL("windtype", PFTYPE_UINT8, &np2oscfg.wintype), | |
| PFVAL("toolwind", PFTYPE_BOOL, &np2oscfg.toolwin), | |
| PFVAL("keydispl", PFTYPE_BOOL, &np2oscfg.keydisp), | |
| PFVAL("jast_snd", PFTYPE_BOOL, &np2oscfg.jastsnd), | |
| PFVAL("useromeo", PFTYPE_BOOL, &np2oscfg.useromeo), | |
| PFVAL("thickfrm", PFTYPE_BOOL, &np2oscfg.thickframe), | |
| PFVAL("xrollkey", PFRO_BOOL, &np2oscfg.xrollkey), | |
| PFVAL("fscrnbpp", PFRO_UINT8, &np2oscfg.fscrnbpp), | |
| PFVAL("I286SAVE", PFRO_BOOL, &np2oscfg.I286SAVE)}; | |
| void initgetfile(OEMCHAR *path, UINT size) { | |
| const OEMCHAR *ext; | |
| file_cpyname(path, modulefile, size); | |
| if (np2arg.ini) { | |
| if ((np2arg.ini[0] == '/') || (np2arg.ini[0] == '-')) { | |
| file_cutname(path); | |
| file_catname(path, file_getname(np2arg.ini + 2), size); | |
| } | } |
| if (p->flag & INIEND) { | else { |
| break; | file_cpyname(path, np2arg.ini, size); |
| } | } |
| p++; | ext = file_getext(path); |
| if (ext[0] != '\0') { | |
| file_catname(path, OEMTEXT(".ini"), size); | |
| } | |
| } | |
| else { | |
| file_cutext(path); | |
| file_catname(path, OEMTEXT(".ini"), size); | |
| } | } |
| } | } |
| void initload(void) { | |
| OEMCHAR path[MAX_PATH]; | |
| initgetfile(path, NELEMENTS(path)); | |
| ini_read(path, ini_title, iniitem, NELEMENTS(iniitem)); | |
| } | |
| void initsave(void) { | |
| OEMCHAR path[MAX_PATH]; | |
| initgetfile(path, NELEMENTS(path)); | |
| ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); | |
| } | |