File:  [RetroPC.NET] / xmil / win9x / ini.cpp
Revision 1.8: download - view: text, annotated - select for diffs
Thu Aug 12 20:03:09 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

#include	"compiler.h"
#include	<windowsx.h>
#include	<io.h>
#include	"strres.h"
#include	"xmil.h"
#include	"oemtext.h"
#include	"dosio.h"
#include	"ini.h"
#include	"pccore.h"


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_sjis2oem(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_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;
		}
		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_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++;
	}
}


// ----

static const OEMCHAR ini_title[] = OEMTEXT("Xmillennium");

enum {
	INIRO_BOOL			= INITYPE_BOOL + INIFLAG_RO,
	INIMAX_UINT8		= INITYPE_UINT8 + INIFLAG_MAX,
	INIAND_UINT8		= INITYPE_UINT8 + INIFLAG_AND,
	INIROAND_HEX32		= INITYPE_HEX32 + INIFLAG_RO + INIFLAG_AND
};

static const INITBL iniitem[] = {
	{"WindposX", INITYPE_SINT32,	&xmiloscfg.winx,		0},
	{"WindposY", INITYPE_SINT32,	&xmiloscfg.winy,		0},
	{"Win_Snap", INITYPE_BOOL,		&xmiloscfg.WINSNAP,		0},
	{"backgrnd", INIAND_UINT8,		&xmiloscfg.background,	0x03},
	{"DspClock", INIAND_UINT8,		&xmiloscfg.DISPCLK,		0x03},
	{"s_NOWAIT", INITYPE_BOOL,		&xmiloscfg.NOWAIT,		0},
	{"SkpFrame", INITYPE_UINT8,		&xmiloscfg.DRAW_SKIP,	0},
	{"FDfolder", INITYPE_STR,		fddfolder,				MAX_PATH},
	{"bmap_Dir", INITYPE_STR,		bmpfilefolder,			MAX_PATH},

	{"IPL_TYPE", INIMAX_UINT8,		&xmilcfg.ROM_TYPE,		3},
	{"Resolute", INITYPE_HEX8,		&xmilcfg.DIP_SW,		0},

	{"DispSync", INITYPE_BOOL,		&xmilcfg.DISPSYNC,		0},
	{"Real_Pal", INITYPE_BOOL,		&xmilcfg.RASTER,		0},
	{"skipline", INITYPE_BOOL,		&xmilcfg.skipline,		0},
	{"skplight", INITYPE_UINT16,	&xmilcfg.skiplight,		0},

	{"SampleHz", INITYPE_UINT16,	&xmilcfg.samplingrate,	0},
	{"Latencys", INITYPE_UINT16,	&xmilcfg.delayms,		0},
	{"OPMsound", INITYPE_BOOL,		&xmilcfg.SOUND_SW,		0},
	{"Seek_Snd", INITYPE_BOOL,		&xmilcfg.MOTOR,			0},
	{"Seek_Vol", INIMAX_UINT8,		&xmilcfg.MOTORVOL,		100},

	{"MouseInt", INITYPE_BOOL,		&xmilcfg.MOUSE_SW,		0},
	{"btnRAPID", INITYPE_BOOL,		&xmilcfg.BTN_RAPID,		0},
	{"btn_MODE", INITYPE_BOOL,		&xmilcfg.BTN_MODE,		0},

	{"Joystick", INITYPE_BOOL,		&xmiloscfg.JOYSTICK,	0},
	{"clocknow", INITYPE_UINT8,		&xmiloscfg.clockx,		0},
	{"clockfnt", INITYPE_UINT8,		&xmiloscfg.clockfnt,	0},
	{"clock_up", INIROAND_HEX32,	&xmiloscfg.clockcolor1,	0xffffff},
	{"clock_dn", INIROAND_HEX32,	&xmiloscfg.clockcolor2,	0xffffff},

	{"Z80_SAVE", INIRO_BOOL,		&xmiloscfg.Z80SAVE,		0},
};


static void initgetfile(OEMCHAR *path, UINT size) {

	file_cpyname(path, modulefile, size);
	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>