File:  [RetroPC.NET] / xmil / palm / xmil.c
Revision 1.2: download - view: text, annotated - select for diffs
Sat Feb 26 12:59:50 2005 JST (20 years, 8 months ago) by tk800
Branches: MAIN
CVS tags: HEAD
support Treo and T5[palm](tk800)

#include	"compiler.h"
#include	"resource.h"
#include	"strres.h"
#include	"xmil.h"
#include	"dosio.h"
#include	"mousemng.h"
#include	"scrnmng.h"
#include	"soundmng.h"
#include	"sysmng.h"
#include	"palmkbd.h"
#include	"ini.h"
#include	"dialog.h"
#include	"z80core.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"timing.h"
#include	"debugsub.h"
#include	"scrndraw.h"
#include	"makescrn.h"
#include	"diskdrv.h"
#include	"fdd_ini.h"
#include	"x1f.h"

#include	"keystat.h"
#include	"fddfile.h"
#include	"PalmNavigator.h"
#include	"joymng.h"
#include	"statsave.h"


		XMILOSCFG	xmiloscfg = {100, 100,  0, 0, 3, 2, 3, 4, 5, 
#ifdef SUPPORT_RESUME
		0,
#endif
		0, 0, 0};

		BRESULT		xmilrunning;
static	BRESULT		inmenu = FALSE;

#define	DEFAULTPATH		"/Palm/Programs/X1/"
#define MAINLOOPWAIT	100

static	char	target[MAX_PATH] = DEFAULTPATH;

static const char xmilresume[] = "sav";
static const char xmilapp[] = "xmil";

void SetHardKey(UINT32 data) {

	UINT	update = 0;
	switch (data & 0xffff) {
		case IDC_KEYLIST1:
			xmiloscfg.HARDKEY1 = data >> 16;
			update = SYS_UPDATEOSCFG;
			break;
		case IDC_KEYLIST2:
			xmiloscfg.HARDKEY2 = data >> 16;
			update = SYS_UPDATEOSCFG;
			break;
		case IDC_KEYLIST3:
			xmiloscfg.HARDKEY3 = data >> 16;
			update = SYS_UPDATEOSCFG;
			break;
		case IDC_KEYLIST4:
			xmiloscfg.HARDKEY4 = data >> 16;
			update = SYS_UPDATEOSCFG;
			break;
		default:
			break;
	}
	sysmng_update(update);
}

static void setvalue(FormType* frm, UINT16 id, UINT8 cfg) {
	ARM_CtlSetValue(ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, id)), cfg);
}

static void setlabel(FormType* frm, UINT16 listid, UINT16 lableid, UINT8 cfg) {

	ListType*		list;
	ControlType*	ctrl = ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, lableid));

	if (cfg < 12) {
		list = ARM_FrmGetObjectPtr(frm, ARM_FrmGetObjectIndex(frm, listid));
		ARM_CtlSetLabel(ctrl, ARM_LstGetSelectionText(list, cfg));
	} else {
		ARM_CtlSetLabel(ctrl, "N/A");
	}
}

void FormInit(void) {

	FormType*	frm = ARM_FrmGetActiveForm();
	
	setvalue(frm, IDC_NOWAIT, xmiloscfg.NOWAIT);
	setvalue(frm, IDC_CAPS, keystat.hit[CAPS_CODE]);
	setvalue(frm, IDC_KANA, keystat.hit[KANA_CODE]);
	setvalue(frm, IDC_SHIFT, keystat.hit[SHIFT_CODE]);
	setvalue(frm, IDC_CTRL, keystat.hit[CTRL_CODE]);
	setvalue(frm, IDC_GRAPH, keystat.hit[GRAPH_CODE]);
	setlabel(frm, IDC_KEYLIST1, IDC_HARDKEY1, xmiloscfg.HARDKEY1);
	setlabel(frm, IDC_KEYLIST2, IDC_HARDKEY2, xmiloscfg.HARDKEY2);
	setlabel(frm, IDC_KEYLIST3, IDC_HARDKEY3, xmiloscfg.HARDKEY3);
	setlabel(frm, IDC_KEYLIST4, IDC_HARDKEY4, xmiloscfg.HARDKEY4);

	sysmng_updatecaption(3);
	ARM_FrmDrawForm(frm);
}

static const UINT hardkey[] = {0, 0,0x20,0x0d,0x1b,0x8a,0x8b,0x91,0x92,0x93,0x94,0x95};

void HandleMenuChoice(UINT wParam) {

	UINT	update;

	update = 0;
	switch(wParam) {
		case IDM_ABOUT:
			AboutDialogProc();
			break;

		case IDM_IPLRESET:
			pccore_reset();
			break;

		case IDM_NMIRESET:
			Z80_NMI();
			break;

		case IDM_CONFIG:
			ConfigDialogProc();
			break;

		case IDM_NEWDISK:
			dialog_newdisk();
			break;

		case IDM_EXIT:
			xmilrunning = FALSE;
			break;

		case IDM_FDD0OPEN:
			dialog_changefdd(0);
			break;

		case IDM_FDD0EJECT:
			diskdrv_setfdd(0, NULL, 0);
			break;

		case IDM_FDD1OPEN:
			dialog_changefdd(1);
			break;

		case IDM_FDD1EJECT:
			diskdrv_setfdd(1, NULL, 0);
			break;

		case IDM_FDD2OPEN:
			dialog_changefdd(2);
			break;

		case IDM_FDD2EJECT:
			diskdrv_setfdd(2, NULL, 0);
			break;

		case IDM_FDD3OPEN:
			dialog_changefdd(3);
			break;

		case IDM_FDD3EJECT:
			diskdrv_setfdd(3, NULL, 0);
			break;

		case IDM_WIDTH80:
			crtc_forcesetwidth(80);
			break;

		case IDM_WIDTH40:
			crtc_forcesetwidth(40);
			break;
#if 0
		case IDM_DISPSYNC:
			xmilcfg.DISPSYNC = (xmilcfg.DISPSYNC ^ 1) & 1;
			update = SYS_UPDATECFG;
			break;

		case IDM_RASTER:
			xmilcfg.RASTER = (xmilcfg.RASTER ^ 1) & 1;
			update = SYS_UPDATECFG;
			break;
#endif
		case IDM_NOWAIT:
			xmiloscfg.NOWAIT = (xmiloscfg.NOWAIT ^ 1) & 1;
			update = SYS_UPDATEOSCFG;
			break;

		case IDM_AUTOFPS:
			xmiloscfg.DRAW_SKIP = 0;
			update = SYS_UPDATEOSCFG;
			break;

		case IDM_60FPS:
			xmiloscfg.DRAW_SKIP = 1;
			update = SYS_UPDATEOSCFG;
			break;

		case IDM_30FPS:
			xmiloscfg.DRAW_SKIP = 2;
			update = SYS_UPDATEOSCFG;
			break;

		case IDM_20FPS:
			xmiloscfg.DRAW_SKIP = 3;
			update = SYS_UPDATEOSCFG;
			break;

		case IDM_15FPS:
			xmiloscfg.DRAW_SKIP = 4;
			update = SYS_UPDATEOSCFG;
			break;
#if 0
		case IDM_MOUSE:
			menu_setmouse(xmilcfg.MOUSE_SW ^ 1);
			update = SYS_UPDATECFG;
			break;

		case IDM_SEEKSND:
			menu_setmotorflg(xmilcfg.MOTOR ^ 1);
			update = SYS_UPDATECFG;
			break;
#endif
		case IDM_BMPSAVE:
			dialog_writebmp();
			break;

		case IDM_DISPCLOCK:
			xmiloscfg.DISPCLK = (xmiloscfg.DISPCLK ^ 1) & 3;
			update = SYS_UPDATEOSCFG;
			sysmng_workclockrenewal();
			sysmng_updatecaption(2);
			break;

		case IDM_DISPFRAME:
			xmiloscfg.DISPCLK = (xmiloscfg.DISPCLK ^ 2) & 3;
			update = SYS_UPDATEOSCFG;
			sysmng_workclockrenewal();
			sysmng_updatecaption(2);
			break;

		case IDM_DIPSW:
			DipswDialogProc();
			break;
			
		case IDM_OPTION:
			OptionDialogProc();
			break;
			
		case IDM_SOUNDOPT:
			SoundDialogProc();
			break;
			
		case IDM_SCRNOPT:
			ScrnOptionDialogProc();
			break;
#if 0
		case IDM_Z80SAVE:
			debugsub_status();
			break;
#endif
		default:
			return;
	}
	sysmng_update(update);
	inmenu = FALSE;
	scrndraw_redraw();
	soundmng_play();
}

static int ApplicationHandleEvent(EventPtr eventP) {

    int		handled = 0;
	UINT32*	idp = (UINT32*)eventP;
	UINT16  topdata = ByteSwap16(*(idp+2) & 0xffff);
	UINT	keycode;
	UINT32	keystate, rockerstate, updownstate, navstate;

	keystate = ARM_KeyCurrentState();
	rockerstate = (keystate & 0x001f0000) >> 16;
	updownstate = (keystate & (keyBitPageUp | keyBitPageDown)) >> 1;
	navstate = (keystate & keyBitNavLRS) >> 22;
	joymng_5way(rockerstate | updownstate | navstate);
	joymng_hardkey(keystate);

	
	switch (ByteSwap16(eventP->eType)) {
		case keyDownEvent:
			if (inmenu) break;
			switch (topdata) {
				case vchrNavChange:
				case vchrPageUp:
				case vchrPageDown:
				case vchrRockerLeft:
				case vchrRockerRight:
				case vchrHard1:
				case vchrHard2:
				case vchrHard3:
				case vchrHard4:
					handled = 1;
					break;
				default:
					if (!(topdata & 0xff00)) {
						keycode =  topdata & 0x7f;
						palmkbd_keydown(keycode, TRUE);
						handled = 1;
					}
			}
			break;
		case keyUpEvent:
			if (inmenu) break;
			if (!(topdata & 0xff00)) {
				keycode =  topdata & 0x7f;
				palmkbd_keyup(keycode);
				handled = 1;
			}
			break;
		case menuEvent:
			HandleMenuChoice(topdata);
			handled = 1;
			break;
		case appStopEvent:
			xmilrunning = FALSE;
			handled = 1;
			break;
		case penUpEvent:
#if 0
			{
				UINT16	x = ByteSwap16(*(idp+1));
				UINT16	y = ByteSwap32(*(idp+1)) & 0xffff;

				if (y < 14+100){
					menuout = true;
				}
				break;
			}
#endif
		case penMoveEvent:
		case penDownEvent:
			if (xmiloscfg.graffiti) {
				handled = -1;
			}
			break;
				
 		default:
			break;
	}
    return(handled);
}

#ifdef SUPPORT_RESUME
// ----

static void getstatfilename(char *path, const char *ext, int size) {

	file_cpyname(path, file_getcd(xmilapp), size);
	file_catname(path, str_dot, size);
	file_catname(path, ext, size);
}

static void flagsave(const char *ext) {

	char	path[MAX_PATH];

	getstatfilename(path, ext, sizeof(path));
	statsave_save(path);
}

static void flagdelete(const char *ext) {

	char	path[MAX_PATH];

	getstatfilename(path, ext, sizeof(path));
	file_delete(path);
}

static int flagload(const char *ext) {

	int		ret;
	char	path[MAX_PATH];
	char	buf[1024];
	int		r;

	ret = IDC_OK;
	getstatfilename(path, ext, sizeof(path));
	r = statsave_check(path, buf, sizeof(buf));
	if (r & (~STATFLAG_DISKCHG)) {
		ResumeErrorDialogProc();
		ret = IDC_CANCEL;
	}
	else if (r & STATFLAG_DISKCHG) {
		ret = ResumeWarningDialogProc(buf);
		ret = IDC_CANCEL;
	}
	if (ret == IDC_OK) {
		statsave_load(path);
	}
	return(ret);
}
#endif


// ----

static	UINT	framecnt = 0;
static	UINT	waitcnt = 0;
static	UINT	framemax = 1;

static void framereset(void) {

	framecnt = 0;
	if (xmiloscfg.DISPCLK & 3) {
		if (sysmng_workclockrenewal()) {
			sysmng_updatecaption(2);
		}
	}
}

static void processwait(UINT waitcnt) {

	if (timing_getcount() >= waitcnt) {
		timing_setcount(0);
		framereset();
	}
}

static void exec1frame(void) {

	palmkbd_callback();
	joymng_callback();
	pccore_exec(framecnt == 0);
	framecnt++;
}


int x1main(int argc, char *argv[]) {

	EventType   event;
	UINT16		error;
	UINT32		wait = 0;
	int			result;

	show_progress();
	dosio_init();
	file_setcd(target);
	palmossub_init();
	initload();
	TRACEINIT();
	scrnmng_initialize();
	scrndraw_initialize();
	if (scrnmng_create(0) != SUCCESS) {
		TRACETERM();
		palmossub_term();
		dosio_term();
		return(2);
	}

	sysmng_initialize();
	joymng_initialize();
	palmkbd_initialize();

#if 0
	mousemng_initialize();
	if (np2oscfg.MOUSE_SW) {
		mousemng_enable(MOUSEPROC_SYSTEM);
	}
#endif

	pccore_initialize();
	pccore_reset();
#ifdef SUPPORT_RESUME
	if (xmiloscfg.resume) {
		flagload(xmilresume);
	}
#endif

	FormInit();
	erase_progress();
	scrndraw_redraw();
	
	xmilrunning = TRUE;
	while(xmilrunning) {
		if (inmenu) {
			wait = evtWaitForever;
		}
		else {
			int	count;
			wait = 0;
			for (count = 0;count < MAINLOOPWAIT;count++) {
			if (xmiloscfg.NOWAIT) {
				exec1frame();
				if (xmiloscfg.DRAW_SKIP) {			// nowait frame skip
					if (framecnt >= xmiloscfg.DRAW_SKIP) {
						processwait(0);
					}
				}
				else {								// nowait auto skip
					if (timing_getcount()) {
						processwait(0);
					}
				}
			}
			else if (xmiloscfg.DRAW_SKIP) {			// frame skip
				if (framecnt < xmiloscfg.DRAW_SKIP) {
					exec1frame();
				}
				else {
					processwait(xmiloscfg.DRAW_SKIP);
				}
			}
			else {								// auto skip
				if (!waitcnt) {
					UINT cnt;
					exec1frame();
					cnt = timing_getcount();
					if (framecnt > cnt) {
						waitcnt = framecnt;
						if (framemax > 1) {
							framemax--;
						}
					}
					else if (framecnt >= framemax) {
						if (framemax < 12) {
							framemax++;
						}
						if (cnt >= 12) {
							timing_reset();
						}
						else {
							timing_setcount(cnt - framecnt);
						}
						framereset();
					}
				}
				else {
					processwait(waitcnt);
					waitcnt = framecnt;
				}
			}
			}
		}
		ARM_EvtGetEvent(&event, wait);
		result = ApplicationHandleEvent(&event);
		if (result == 1) {
			continue;
		}
		if (result == 0) {
			if (ARM_SysHandleEvent(&event)) {
				continue;
			}
		}
		if (ARM_MenuHandleEvent(NULL, &event, &error)) {
			inmenu = TRUE;
			soundmng_stop();
		} else {
			ARM_FrmDispatchEvent(&event);
		}
	}

	xmilrunning = FALSE;
	show_progress();
	soundmng_stop();
#ifdef SUPPORT_RESUME
	if (xmiloscfg.resume) {
		flagsave(xmilresume);
	}
	else {
		flagdelete(xmilresume);
	}
#endif
	mousemng_disable(MOUSEPROC_SYSTEM);
	x1f_close();
	pccore_deinitialize();
	scrnmng_destroy();
	soundmng_destroy();
	if (sys_updates	& (SYS_UPDATECFG | SYS_UPDATEOSCFG)) {
		initsave();
	}
	TRACETERM();
	palmossub_term();
	dosio_term();
	erase_progress();

	(void)argc;
	(void)argv;
	return(0);
}

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