File:  [RetroPC.NET] / np2 / win9x / ini.cpp
Revision 1.34: download - view: text, annotated - select for diffs
Wed Feb 16 18:31:55 2005 JST (20 years, 8 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

#include	"compiler.h"
#include	<windowsx.h>
#include	<io.h>
#include	"strres.h"
#include	"profile.h"
#include	"np2.h"
#include	"np2arg.h"
#if defined(OSLANG_UCS2)
#include	"oemtext.h"
#endif
#include	"dosio.h"
#include	"ini.h"
#include	"winkbd.h"
#include	"pccore.h"



static BOOL inigetbmp(const UINT8 *ptr, UINT pos) {

	return((ptr[pos >> 3] >> (pos & 7)) & 1);
}

static void inisetbmp(UINT8 *ptr, UINT pos, BOOL set) {

	UINT8	bit;

	ptr += (pos >> 3);
	bit = 1 << (pos & 7);
	if (set) {
		*ptr |= bit;
	}
	else {
		*ptr &= ~bit;
	}
}

static void inirdargs16(const OEMCHAR *src, const INITBL *ini) {

	SINT16	*dst;
	int		dsize;
	int		i;
	OEMCHAR	c;

	dst = (SINT16 *)ini->value;
	dsize = ini->arg;

	for (i=0; i<dsize; i++) {
		while(*src == ' ') {
			src++;
		}
		if (*src == '\0') {
			break;
		}
		dst[i] = (SINT16)milstr_solveINT(src);
		while(*src != '\0') {
			c = *src++;
			if (c == ',') {
				break;
			}
		}
	}
}

static void inirdargh8(const OEMCHAR *src, const INITBL *ini) {

	UINT8	*dst;
	int		dsize;
	int		i;
	UINT8	val;
	BOOL	set;
	OEMCHAR	c;

	dst = (UINT8 *)ini->value;
	dsize = ini->arg;

	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 void iniwrsetargh8(OEMCHAR *work, int size, const INITBL *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 INITBL *ini) {

	UINT	i;

	for (i=0; i<3; i++) {
		if (src[i] == '\0') {
			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 INITBL *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 INITBL *tbl, UINT count) {

const INITBL	*p;
const INITBL	*pterm;
#if defined(OSLANG_UCS2)
	OEMCHAR		item[10];
#else
const OEMCHAR	*item;
#endif
	OEMCHAR		work[512];
	UINT32		val;

	p = tbl;
	pterm = tbl + count;
	while(p < pterm) {
#if defined(OSLANG_UCS2)
		oemtext_sjistooem(item, NELEMENTS(item), p->item, (UINT)-1);
#else
		item = p->item;
#endif
		switch(p->itemtype & INITYPE_MASK) {
			case INITYPE_STR:
				GetPrivateProfileString(title, item, (OEMCHAR *)p->value,
											(OEMCHAR *)p->value, p->arg, path);
				break;

			case INITYPE_BOOL:
				GetPrivateProfileString(title, item,
									(*((UINT8 *)p->value))?str_true:str_false,
												work, NELEMENTS(work), path);
				*((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0;
				break;

			case INITYPE_BITMAP:
				GetPrivateProfileString(title, 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 INITYPE_ARGS16:
				GetPrivateProfileString(title, item, str_null,
												work, NELEMENTS(work), path);
				inirdargs16(work, p);
				break;

			case INITYPE_ARGH8:
				GetPrivateProfileString(title, item, str_null,
												work, NELEMENTS(work), path);
				inirdargh8(work, p);
				break;

			case INITYPE_SINT8:
			case INITYPE_UINT8:
				val = (UINT8)GetPrivateProfileInt(title, item,
												*(UINT8 *)p->value, path);
				*(UINT8 *)p->value = (UINT8)val;
				break;

			case INITYPE_SINT16:
			case INITYPE_UINT16:
				val = (UINT16)GetPrivateProfileInt(title, item,
												*(UINT16 *)p->value, path);
				*(UINT16 *)p->value = (UINT16)val;
				break;

			case INITYPE_SINT32:
			case INITYPE_UINT32:
				val = (UINT32)GetPrivateProfileInt(title, item,
												*(UINT32 *)p->value, path);
				*(UINT32 *)p->value = (UINT32)val;
				break;

			case INITYPE_HEX8:
				OEMSPRINTF(work, str_x, *(UINT8 *)p->value),
				GetPrivateProfileString(title, item, work,
												work, NELEMENTS(work), path);
				val = (UINT8)milstr_solveHEX(work);
				*(UINT8 *)p->value = (UINT8)val;
				break;

			case INITYPE_HEX16:
				OEMSPRINTF(work, str_x, *(UINT16 *)p->value),
				GetPrivateProfileString(title, item, work,
												work, NELEMENTS(work), path);
				val = (UINT16)milstr_solveHEX(work);
				*(UINT16 *)p->value = (UINT16)val;
				break;

			case INITYPE_HEX32:
				OEMSPRINTF(work, str_x, *(UINT32 *)p->value),
				GetPrivateProfileString(title, item, work,
												work, NELEMENTS(work), path);
				val = (UINT32)milstr_solveHEX(work);
				*(UINT32 *)p->value = (UINT32)val;
				break;

			case INITYPE_BYTE3:
				GetPrivateProfileString(title, item, str_null,
												work, NELEMENTS(work), path);
				inirdbyte3(work, p);
				break;

			case INITYPE_KB:
				GetPrivateProfileString(title, item, str_null,
												work, NELEMENTS(work), path);
				inirdkb(work, p);
				break;
		}
		p++;
	}
}

void ini_write(const OEMCHAR *path, const OEMCHAR *title,
											const INITBL *tbl, UINT count) {

const INITBL	*p;
const INITBL	*pterm;
const OEMCHAR	*set;
	OEMCHAR		work[512];

	p = tbl;
	pterm = tbl + count;
	while(p < pterm) {
		if (!(p->itemtype & INIFLAG_RO)) {
			work[0] = '\0';
			set = work;
			switch(p->itemtype & INITYPE_MASK) {
				case INITYPE_STR:
					set = (OEMCHAR *)p->value;
					break;

				case INITYPE_BOOL:
					set = (*((UINT8 *)p->value))?str_true:str_false;
					break;

				case INITYPE_ARGH8:
					iniwrsetargh8(work, NELEMENTS(work), p);
					break;

				case INITYPE_SINT8:
					OEMSPRINTF(work, str_d, *((SINT8 *)p->value));
					break;

				case INITYPE_SINT16:
					OEMSPRINTF(work, str_d, *((SINT16 *)p->value));
					break;

				case INITYPE_SINT32:
					OEMSPRINTF(work, str_d, *((SINT32 *)p->value));
					break;

				case INITYPE_UINT8:
					OEMSPRINTF(work, str_u, *((UINT8 *)p->value));
					break;

				case INITYPE_UINT16:
					OEMSPRINTF(work, str_u, *((UINT16 *)p->value));
					break;

				case INITYPE_UINT32:
					OEMSPRINTF(work, str_u, *((UINT32 *)p->value));
					break;

				case INITYPE_HEX8:
					OEMSPRINTF(work, str_x, *((UINT8 *)p->value));
					break;

				case INITYPE_HEX16:
					OEMSPRINTF(work, str_x, *((UINT16 *)p->value));
					break;

				case INITYPE_HEX32:
					OEMSPRINTF(work, str_x, *((UINT32 *)p->value));
					break;

				default:
					set = NULL;
					break;
			}
			if (set) {
#if defined(OSLANG_UCS2)
				OEMCHAR	item[10];
				oemtext_sjis2oem(item, NELEMENTS(item), p->item, (UINT)-1);
				WritePrivateProfileString(title, item, set, path);
#else
				WritePrivateProfileString(title, p->item, set, path);
#endif
			}
		}
		p++;
	}
}


// ----

#if !defined(SUPPORT_PC9821)
static const OEMCHAR ini_title[] = OEMTEXT("NekoProjectII");
#else
static const OEMCHAR ini_title[] = OEMTEXT("NekoProject21");
#endif

enum {
	INIRO_STR			= INITYPE_STR + INIFLAG_RO,
	INIRO_BOOL			= INITYPE_BOOL + INIFLAG_RO,
	INIRO_BITMAP		= INITYPE_BITMAP + INIFLAG_RO,
	INIRO_UINT8			= INITYPE_UINT8 + INIFLAG_RO,
	INIMAX_UINT8		= INITYPE_UINT8 + INIFLAG_MAX,
	INIAND_UINT8		= INITYPE_UINT8 + INIFLAG_AND,
	INIROMAX_SINT32		= INITYPE_SINT32 + INIFLAG_RO + INIFLAG_MAX,
	INIROAND_HEX32		= INITYPE_HEX32 + INIFLAG_RO + INIFLAG_AND,

	INIRO_BYTE3			= INITYPE_BYTE3 + INIFLAG_RO,
	INIRO_KB			= INITYPE_KB + INIFLAG_RO
};

static const INITBL iniitem[] = {
	{"np2title", INIRO_STR,			np2oscfg.titles,
												NELEMENTS(np2oscfg.titles)},
	{"np2winid", INIRO_BYTE3,		np2oscfg.winid,			0},
	{"WindposX", INITYPE_SINT32,	&np2oscfg.winx,			0},
	{"WindposY", INITYPE_SINT32,	&np2oscfg.winy,			0},
	{"paddingx", INIROMAX_SINT32,	&np2oscfg.paddingx,		32},
	{"paddingy", INIROMAX_SINT32,	&np2oscfg.paddingy,		32},
	{"Win_Snap", INITYPE_BOOL,		&np2oscfg.WINSNAP,		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", INIRO_STR,			np2cfg.biospath,		MAX_PATH},
	{"hdrvroot", INIRO_STR,			np2cfg.hdrvroot,		MAX_PATH},
	{"hdrv_acc", INIRO_UINT8,		&np2cfg.hdrvacc,		0},

	{"pc_model", INITYPE_STR,		&np2cfg.model,
												NELEMENTS(np2cfg.model)},
	{"clk_base", INITYPE_UINT32,	&np2cfg.baseclock,		0},
	{"clk_mult", INITYPE_UINT32,	&np2cfg.multiple,		0},

	{"DIPswtch", INITYPE_ARGH8,		np2cfg.dipsw,			3},
	{"MEMswtch", INITYPE_ARGH8,		np2cfg.memsw,			8},
	{"ExMemory", INIMAX_UINT8,		&np2cfg.EXTMEM,			13},
	{"ITF_WORK", INIRO_BOOL,		&np2cfg.ITF_WORK,		0},

	{"HDD1FILE", INITYPE_STR,		np2cfg.sasihdd[0],		MAX_PATH},
	{"HDD2FILE", INITYPE_STR,		np2cfg.sasihdd[1],		MAX_PATH},
#if defined(SUPPORT_SCSI)
	{"SCSIHDD0", INITYPE_STR,		np2cfg.scsihdd[0],		MAX_PATH},
	{"SCSIHDD1", INITYPE_STR,		np2cfg.scsihdd[1],		MAX_PATH},
	{"SCSIHDD2", INITYPE_STR,		np2cfg.scsihdd[2],		MAX_PATH},
	{"SCSIHDD3", INITYPE_STR,		np2cfg.scsihdd[3],		MAX_PATH},
#endif

	{"SampleHz", INITYPE_UINT16,	&np2cfg.samplingrate,	0},
	{"Latencys", INITYPE_UINT16,	&np2cfg.delayms,		0},
	{"SNDboard", INITYPE_HEX8,		&np2cfg.SOUND_SW,		0},
	{"BEEP_vol", INIAND_UINT8,		&np2cfg.BEEP_VOL,		3},
	{"xspeaker", INIRO_BOOL,		&np2cfg.snd_x,			0},

	{"SND14vol", INITYPE_ARGH8,		np2cfg.vol14,			6},
//	{"opt14BRD", INITYPE_ARGH8,		np2cfg.snd14opt,		3},
	{"opt26BRD", INITYPE_HEX8,		&np2cfg.snd26opt,		0},
	{"opt86BRD", INITYPE_HEX8,		&np2cfg.snd86opt,		0},
	{"optSPBRD", INITYPE_HEX8,		&np2cfg.spbopt,			0},
	{"optSPBVR", INITYPE_HEX8,		&np2cfg.spb_vrc,		0},
	{"optSPBVL", INIMAX_UINT8,		&np2cfg.spb_vrl,		24},
	{"optSPB_X", INITYPE_BOOL,		&np2cfg.spb_x,			0},
	{"optMPU98", INITYPE_HEX8,		&np2cfg.mpuopt,			0},

	{"volume_F", INIMAX_UINT8,		&np2cfg.vol_fm,			128},
	{"volume_S", INIMAX_UINT8,		&np2cfg.vol_ssg,		128},
	{"volume_A", INIMAX_UINT8,		&np2cfg.vol_adpcm,		128},
	{"volume_P", INIMAX_UINT8,		&np2cfg.vol_pcm,		128},
	{"volume_R", INIMAX_UINT8,		&np2cfg.vol_rhythm,		128},

	{"Seek_Snd", INITYPE_BOOL,		&np2cfg.MOTOR,			0},
	{"Seek_Vol", INIMAX_UINT8,		&np2cfg.MOTORVOL,		100},

	{"btnRAPID", INITYPE_BOOL,		&np2cfg.BTN_RAPID,		0},
	{"btn_MODE", INITYPE_BOOL,		&np2cfg.BTN_MODE,		0},
	{"Mouse_sw", INITYPE_BOOL,		&np2oscfg.MOUSE_SW,		0},
	{"MS_RAPID", INITYPE_BOOL,		&np2cfg.MOUSERAPID,		0},

	{"backgrnd", INIAND_UINT8,		&np2oscfg.background,	3},
	{"VRAMwait", INITYPE_ARGH8,		np2cfg.wait,			6},
	{"DspClock", INIAND_UINT8,		&np2oscfg.DISPCLK,		3},
	{"DispSync", INITYPE_BOOL,		&np2cfg.DISPSYNC,		0},
	{"Real_Pal", INITYPE_BOOL,		&np2cfg.RASTER,			0},
	{"RPal_tim", INIMAX_UINT8,		&np2cfg.realpal,		64},
	{"s_NOWAIT", INITYPE_BOOL,		&np2oscfg.NOWAIT,		0},
	{"SkpFrame", INITYPE_UINT8,		&np2oscfg.DRAW_SKIP,	0},
	{"uPD72020", INITYPE_BOOL,		&np2cfg.uPD72020,		0},
	{"GRCG_EGC", INIAND_UINT8,		&np2cfg.grcg,			3},
	{"color16b", INITYPE_BOOL,		&np2cfg.color16,		0},
	{"skipline", INITYPE_BOOL,		&np2cfg.skipline,		0},
	{"skplight", INITYPE_UINT16,	&np2cfg.skiplight,		0},
	{"LCD_MODE", INIAND_UINT8,		&np2cfg.LCD_MODE,		0x03},
	{"BG_COLOR", INIROAND_HEX32,	&np2cfg.BG_COLOR,		0xffffff},
	{"FG_COLOR", INIROAND_HEX32,	&np2cfg.FG_COLOR,		0xffffff},

	{"pc9861_e", INITYPE_BOOL,		&np2cfg.pc9861enable,	0},
	{"pc9861_s", INITYPE_ARGH8,		np2cfg.pc9861sw,		3},
	{"pc9861_j", INITYPE_ARGH8,		np2cfg.pc9861jmp,		6},

	{"calendar", INITYPE_BOOL,		&np2cfg.calendar,		0},
	{"USE144FD", INITYPE_BOOL,		&np2cfg.usefd144,		0},
	{"FDDRIVE1", INIRO_BITMAP,		&np2cfg.fddequip,		0},
	{"FDDRIVE2", INIRO_BITMAP,		&np2cfg.fddequip,		1},
	{"FDDRIVE3", INIRO_BITMAP,		&np2cfg.fddequip,		2},
	{"FDDRIVE4", INIRO_BITMAP,		&np2cfg.fddequip,		3},


	// OSˑH
	{"keyboard", INIRO_KB,			&np2oscfg.KEYBOARD,		0},
	{"F12_COPY", INITYPE_UINT8,		&np2oscfg.F12COPY,		0},
	{"Joystick", INITYPE_BOOL,		&np2oscfg.JOYPAD1,		0},
	{"Joy1_btn", INITYPE_ARGH8,		np2oscfg.JOY1BTN,		4},

	{"clocknow", INITYPE_UINT8,		&np2oscfg.clk_x,		0},
	{"clockfnt", INITYPE_UINT8,		&np2oscfg.clk_fnt,		0},
	{"clock_up", INIROAND_HEX32,	&np2oscfg.clk_color1,	0xffffff},
	{"clock_dn", INIROAND_HEX32,	&np2oscfg.clk_color2,	0xffffff},

	{"use_sstp", INITYPE_BOOL,		&np2oscfg.sstp,			0},
	{"sstpport", INITYPE_UINT16,	&np2oscfg.sstpport,		0},
	{"comfirm_", INITYPE_BOOL,		&np2oscfg.comfirm,		0},
	{"shortcut", INITYPE_HEX8,		&np2oscfg.shortcut,		0},		// ver0.30

	{"mpu98map", INITYPE_STR,		np2oscfg.mpu.mout,		MAXPNAMELEN},
	{"mpu98min", INITYPE_STR,		np2oscfg.mpu.min,		MAXPNAMELEN},
	{"mpu98mdl", INITYPE_STR,		np2oscfg.mpu.mdl,		64},
	{"mpu98def", INITYPE_STR,		np2oscfg.mpu.def,		MAX_PATH},

	{"com1port", INIMAX_UINT8,		&np2oscfg.com1.port,	5},		// ver0.34
	{"com1para", INITYPE_UINT8,		&np2oscfg.com1.param,	0},
	{"com1_bps", INITYPE_UINT32,	&np2oscfg.com1.speed,	0},
	{"com1mmap", INITYPE_STR,		np2oscfg.com1.mout,		MAXPNAMELEN},
	{"com1mmdl", INITYPE_STR,		np2oscfg.com1.mdl,		64},
	{"com1mdef", INITYPE_STR,		np2oscfg.com1.def,		MAX_PATH},

	{"com2port", INIMAX_UINT8,		&np2oscfg.com2.port,	5},		// ver0.34
	{"com2para", INITYPE_UINT8,		&np2oscfg.com2.param,	0},
	{"com2_bps", INITYPE_UINT32,	&np2oscfg.com2.speed,	0},
	{"com2mmap", INITYPE_STR,		np2oscfg.com2.mout,		MAXPNAMELEN},
	{"com2mmdl", INITYPE_STR,		np2oscfg.com2.mdl,		64},
	{"com2mdef", INITYPE_STR,		np2oscfg.com2.def,		MAX_PATH},

	{"com3port", INIMAX_UINT8,		&np2oscfg.com3.port,	5},		// ver0.34
	{"com3para", INITYPE_UINT8,		&np2oscfg.com3.param,	0},
	{"com3_bps", INITYPE_UINT32,	&np2oscfg.com3.speed,	0},
	{"com3mmap", INITYPE_STR,		np2oscfg.com3.mout,		MAXPNAMELEN},
	{"com3mmdl", INITYPE_STR,		np2oscfg.com3.mdl,		64},
	{"com3mdef", INITYPE_STR,		np2oscfg.com3.def,		MAX_PATH},

	{"force400", INIRO_BOOL,		&np2oscfg.force400,		0},
	{"e_resume", INITYPE_BOOL,		&np2oscfg.resume,		0},
	{"STATSAVE", INIRO_BOOL,		&np2oscfg.statsave,		0},
	{"nousemmx", INITYPE_BOOL,		&np2oscfg.disablemmx,	0},		// ver0.36
	{"windtype", INITYPE_UINT8,		&np2oscfg.wintype,		0},
	{"toolwind", INITYPE_BOOL,		&np2oscfg.toolwin,		0},		// ver0.38
	{"keydispl", INITYPE_BOOL,		&np2oscfg.keydisp,		0},
	{"jast_snd", INITYPE_BOOL,		&np2oscfg.jastsnd,		0},		// ver0.73
	{"useromeo", INITYPE_BOOL,		&np2oscfg.useromeo,		0},		// ver0.74
	{"thickfrm", INITYPE_BOOL,		&np2oscfg.thickframe,	0},		// ver0.77
	{"xrollkey", INIRO_BOOL,		&np2oscfg.xrollkey,		0},		// ver0.78
	{"fscrnbpp", INIRO_UINT8,		&np2oscfg.fscrnbpp,		0},
	{"I286SAVE", INIRO_BOOL,		&np2oscfg.I286SAVE,		0}};


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);
		}
		else {
			file_cpyname(path, np2arg.ini, size);
		}
		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));
}


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