File:  [RetroPC.NET] / xmil / adv / xmil.c
Revision 1.1: download - view: text, annotated - select for diffs
Fri Feb 4 15:42:07 2005 JST (20 years, 8 months ago) by yui
Branches: MAIN
CVS tags: HEAD
RetroPC CVS restarting 2005/02/04 (T.Yui)

#include	"compiler.h"
#ifndef __GNUC__
#include	<winnls32.h>
#endif
#include	"xmil.h"
#if defined(ADV_SIMULATE)
#include	"dosio.h"
#endif
#include	"sysmng.h"
#include	"z80core.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"joymng.h"
#include	"timing.h"
#include	"makescrn.h"
#include	"fddfile.h"
#include	"advpsg.h"
#include	"font.h"
#include	"xmilopen.h"


	XMILOSCFG	xmiloscfg = {0, 0};

#define	MAX_FRAMESKIP		4


#if defined(ADV_SIMULATE)
static void diskimgset1(REG8 drv, const char *fname) {

	FILEH	fh;
	UINT	size;
	UINT8	*ptr;

	fh = file_open_rb(fname);
	if (fh == FILEH_INVALID) {
		goto dis_err1;
	}
	size = file_getsize(fh);
	if (size == 0) {
		goto dis_err2;
	}
	ptr = (UINT8 *)_MALLOC(size, "disk image");
	if (ptr == NULL) {
		goto dis_err2;
	}
	if (file_read(fh, ptr, size) != size) {
		goto dis_err3;
	}
	file_close(fh);
	fddfile_set(drv, FTYPE_D88, ptr, size);
	return;

dis_err3:
	_MFREE(ptr);

dis_err2:
	file_close(fh);

dis_err1:
	return;
}

static void diskimgset(void) {

	diskimgset1(0, "d:\\prv_project\\xmil\\bin\\agb\\fdd0.d88");
	diskimgset1(1, "d:\\prv_project\\xmil\\bin\\agb\\fdd1.d88");
}
#else

static const char fdd0[] = "fdd0.d88";
static const char fdd1[] = "fdd1.d88";
static const char fddsig[10] = "abesrludyx";

static void diskimgset(void) {

const UINT8	*ptr;
	UINT	size;

	// デモ用に
#if 1
	UINT16 key;
	key = *REG_KEYINPUT;
	key = ((~key) & 0x3ff);
	if (key) {
		int i;
		char path[10];
		for (i=0; i<9; i++) {
			if (key & (1 << i)) {
				break;
			}
		}
		path[0] = fddsig[i];
		CopyMemory(path + 1, fdd0, 9);
		ptr = FileMapping(path, &size);
		if (ptr) {
			fddfile_set(0, FTYPE_D88, ptr, size);
		}
		path[1 + 3] = '1';
		ptr = FileMapping(path, &size);
		if (ptr) {
			fddfile_set(1, FTYPE_D88, ptr, size);
		}
		return;
	}
#endif

	ptr = FileMapping(fdd0, &size);
	if (ptr) {
		fddfile_set(0, FTYPE_D88, ptr, size);
	}
	ptr = FileMapping(fdd1, &size);
	if (ptr) {
		fddfile_set(1, FTYPE_D88, ptr, size);
	}
}
#endif


// ----


#if 0
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

	case WM_MOVE:
		if ((!scrnmng_isfullscreen()) &&
			(!(GetWindowLong(hWnd, GWL_STYLE) &
								(WS_MAXIMIZE | WS_MINIMIZE)))) {
			GetWindowRect(hWnd, &rc);
			xmiloscfg.winx = rc.left;
			xmiloscfg.winy = rc.top;
			sysmng_update(SYS_UPDATEOSCFG);
		}
		break;
}
#endif


// ----

typedef struct {
	UINT	framecnt;
	UINT	waitcnt;
	UINT	framemax;
} XMILMAIN;


static void framereset(XMILMAIN *xmm, UINT cnt) {

	xmm->framecnt = 0;
	sysmng_dispclock();
}

static void processwait(XMILMAIN *xmm, UINT cnt) {

	if (timing_getcount() >= cnt) {
		timing_setcount(0);
		framereset(xmm, cnt);
	}
#if defined(ADV_SIMULATE)
	else {
		Sleep(1);
	}
#endif
}

static void exec1frame(XMILMAIN *xmm) {

	joymng_setflags();
	advpsg_sync(&advpsg);
	pccore_exec((BRESULT)(xmm->framecnt == 0));
	xmm->framecnt++;
}

int advmain(int argc, char **argv) {

	XMILMAIN	xmilmain;

#if !defined(ADV_SIMULATE)
	if ((sizeof(z80core) != 0x40) || (sizeof(dma) != 0x40) ||
		(sizeof(iocore) != 0x214) || (sizeof(crtc) != 0x44) ||
		(sizeof(advpsg) != 0x30)) {
		while(1) { }
	}
#endif

	TRACEINIT();

	xmilopen();

	advv_setmode(ADVV_OBJ | ADVV_BG2 | ADVV_MODE4);

	CopyMemory(font_ank, __extromimage.ank, 0x800);

	sysmng_initialize();

	pccore_initialize();
	pccore_reset();

	diskimgset();

	xmilmain.framecnt = 0;
	xmilmain.waitcnt = 0;
	xmilmain.framemax = 1;

	sysmng_clockreset();


#if !defined(ADV_SIMULATE)
	// 純正ROMタイミング
	*((volatile UINT16 *)0x04000204) = 0x4317;
#endif

	// 自己責任で!! EWRAM cycles 3/3/6 -> 2/2/4
//	*((volatile UINT32 *)0x04000800) = 0x0e000020;

#if 1
	while(advsys_task()) {
		if (xmiloscfg.NOWAIT) {
			exec1frame(&xmilmain);
			if (xmiloscfg.DRAW_SKIP) {		// nowait frame skip
				if (xmilmain.framecnt >= xmiloscfg.DRAW_SKIP) {
					processwait(&xmilmain, 0);
				}
			}
			else {							// nowait auto skip
				if (timing_getcount()) {
					processwait(&xmilmain, 0);
				}
			}
		}
		else if (xmiloscfg.DRAW_SKIP) {		// frame skip
			if (xmilmain.framecnt < xmiloscfg.DRAW_SKIP) {
				exec1frame(&xmilmain);
			}
			else {
				processwait(&xmilmain, xmiloscfg.DRAW_SKIP);
			}
		}
		else {								// auto skip
			if (!xmilmain.waitcnt) {
				UINT cnt;
				exec1frame(&xmilmain);
				cnt = timing_getcount();
				if (xmilmain.framecnt > cnt) {
					xmilmain.waitcnt = xmilmain.framecnt;
					if (xmilmain.framemax > 1) {
						xmilmain.framemax--;
					}
				}
				else if (xmilmain.framecnt >= xmilmain.framemax) {
					if (xmilmain.framemax < MAX_FRAMESKIP) {
						xmilmain.framemax++;
					}
					if (cnt >= MAX_FRAMESKIP) {
						timing_reset();
					}
					else {
						timing_setcount(cnt - xmilmain.framecnt);
					}
					framereset(&xmilmain, 0);
				}
			}
			else {
				processwait(&xmilmain, xmilmain.waitcnt);
				xmilmain.waitcnt = xmilmain.framecnt;
			}
		}
	}
#else
	while(advsys_task()) {
		if (xmilmain.framecnt < 2) {
			exec1frame(&xmilmain);
		}
		else {
			processwait(&xmilmain, 2);
		}
	}
#endif

	pccore_deinitialize();

	TRACETERM();

	return(0);
}


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