File:  [RetroPC.NET] / np2 / win9x / ini.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Fri Oct 17 02:58:53 2003 JST (22 years ago) by yui
Branches: MAIN
CVS tags: HEAD
Initial revision

#include	"compiler.h"
#include	<windowsx.h>
#include	<io.h>
#include	"np2.h"
#include	"dosio.h"
#include	"np2arg.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"ini.h"
#include	"winkbd.h"


#define		CFGLEN		(MAX_PATH + 32)

static const char ini_title[] = "NekoProjectII";

typedef struct {
	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ˑH														// 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 getinifile(char *initfile, int max) {

	char	*p;

	milstr_ncpy(initfile, modulefile, max);
	if (np2arg.ini) {
		if ((np2arg.ini[0] == '/') || (np2arg.ini[0] == '-')) {
			file_cutname(initfile);
			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 {
		file_cutext(initfile);
		milstr_ncat(initfile, ".ini", max);
	}
}


void initload(void) {

	char		initfile[MAX_PATH];
	char		cfgstr[CFGLEN];
	DWORD		i;
	char		*arg[8];
	DWORD		args;
	INI_ITEM	*p;

	getinifile(initfile, MAX_PATH);									// ver0.29
	p = iniitem;
	while(1) {
		if (!(p->itemtype & 0xf0)) {
			switch(p->itemtype) {
				case INI_STR:
					GetPrivateProfileString(ini_title, p->item,
										(char *)p->value, (char *)p->value,
										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(
							ini_title, p->item, *(BYTE *)p->value, initfile);
					break;
				case INI_WORD:
					*(WORD *)p->value = (WORD)GetPrivateProfileInt(
							ini_title, p->item, *(WORD *)p->value, initfile);
					break;
				case INI_DWORD:
					*(DWORD *)p->value = (DWORD)GetPrivateProfileInt(
							ini_title, p->item, *(DWORD *)p->value, initfile);
					break;
				case INI_HEXB:
					wsprintf(cfgstr, "%x", *(BYTE *)p->value),
					GetPrivateProfileString(ini_title, p->item,
										cfgstr, cfgstr, CFGLEN, initfile);
					*(BYTE *)p->value = (BYTE)solveHEX(cfgstr);
					break;
				case INI_HEXD:
					wsprintf(cfgstr, "%x", *(DWORD *)p->value),
					GetPrivateProfileString(ini_title, p->item,
										cfgstr, cfgstr, CFGLEN, initfile);
					*(DWORD *)p->value = solveHEX(cfgstr);
					break;
			}
			if (p->flag & INIMAX) {
				switch((p->itemtype) & 0x0f) {
					case 1:
						if (*(BYTE *)p->value > (BYTE)p->arg) {
							*(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) {
				switch((p->itemtype) & 0x0f) {
					case 1:
						*(BYTE *)p->value &= (BYTE)p->arg;
						break;
					case 2:
						*(WORD *)p->value &= (WORD)p->arg;
						break;
					case 4:
						*(DWORD *)p->value &= (DWORD)p->arg;
						break;
				}
			}
		}
		else {
			switch(p->itemtype) {
				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) {
			break;
		}
		p++;
	}
}

void initsave(void) {

	char		initfile[MAX_PATH];
	char		cfgstr[CFGLEN];
	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;
			}
		}
		else {
			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
				case INI_EX|2:				// midi module
					WritePrivateProfileString(ini_title, p->item,
								MIDI_num2module(*(BYTE *)p->value), initfile);
					break;
#endif
			}
		}
		if (p->flag & INIEND) {
			break;
		}
		p++;
	}
}


RetroPC.NET-CVS <cvs@retropc.net>