File:  [RetroPC.NET] / xmil / pccore.c
Revision 1.8: download - view: text, annotated - select for diffs
Thu Aug 5 13:53:15 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

#include	"compiler.h"
#include	"dosio.h"
#include	"scrnmng.h"
#include	"soundmng.h"
#include	"sysmng.h"
#include	"timemng.h"
#include	"z80core.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"draw.h"
#include	"sound.h"
#include	"sndctrl.h"
#include	"menu.h"
#include	"font.h"
#include	"juliet.h"
#include	"xmilver.h"
#include	"fddfile.h"
#include	"calendar.h"
#include	"timing.h"
#include	"defrom.res"
#include	"keystat.h"


const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE);

	XMILCFG		xmilcfg = {	0, 0, 1, 0, 1, 2, 0, 1,
							22050, 1000, 0, 80,
							0, 0,
							0, 0,
							0, 0, 0,
							1,
							1, 0};

	PCCORE		pccore = {250, 0, 1, 0};
	BYTE		mMAIN[0x10000];
	BYTE		mBIOS[0x8000];
	BYTE		mBANK[16][0x8000];
	WORD		v_cnt;
	int			s_cnt;

	BYTE		*RAM0r;
	BYTE		*RAM0w;
	DWORD		h_cntbase;
	BRESULT		soundrenewal;



/***********************************************************************
	IPL-ROM LOAD
***********************************************************************/

void ipl_load(void) {

	FILEH	hdl;

	ZeroMemory(mBIOS, sizeof(mBIOS));
	CopyMemory(mBIOS, DEFROM, sizeof(DEFROM));

	if (pccore.ROM_TYPE >= 2) {
		if ((hdl = file_open_c(OEMTEXT("IPLROM.X1T"))) != FILEH_INVALID) {
			file_read(hdl, mBIOS, 0x8000);
			file_close(hdl);
		}
	}
	else if (pccore.ROM_TYPE == 1) {
		if ((hdl = file_open_c(OEMTEXT("IPLROM.X1"))) != FILEH_INVALID) {
			file_read(hdl, mBIOS, 0x8000);
			file_close(hdl);
		}
	}
}


/***********************************************************************
	初期化
***********************************************************************/

BYTE reset_x1(BYTE ROM_TYPE, BYTE SOUND_SW, BYTE DIP_SW) {

	pccore.HSYNC_CLK = 250;
	pccore.ROM_TYPE = ROM_TYPE;
	pccore.SOUND_SW = SOUND_SW;
	pccore.DIP_SW = DIP_SW;

	// スクリーンモードの変更...
	if (pccore.ROM_TYPE >= 3) {
		if (scrnmng_setcolormode(TRUE) != SUCCESS) {
			pccore.ROM_TYPE = 2;
		}
	}
	else {
		scrnmng_setcolormode(FALSE);
	}

	textdrawproc_renewal();
	ipl_load();

	Z80_RESET();
	iocore_reset();

	RAM0r = mBIOS;
	RAM0w = mMAIN;
	h_cntbase = 0;
	sysmng_cpureset();

	calendar_initialize();

	cgrom_reset();
	cmt_reset();
	crtc_reset();
	ctc_reset();
	dmac_reset();
	fdc_reset();
	memio_reset();
	pcg_reset();
	ppi_reset();
	sio_reset();
	sndboard_reset();
	subcpu_reset();
	vramio_reset();

	timing_reset();
	return(SUCCESS);
}



/***********************************************************************
	実行/終了
***********************************************************************/

static	BYTE	keyintcnt = 0;
static	BYTE	flame = 0;
static	BYTE	inttiming = 0;

void pccore_initialize(void) {

	sndctrl_initialize();

	init_draw();
	font_load(NULL, TRUE);

	crtc_initialize();
	pcg_initialize();
	ppi_initialize();

	reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW);

//	keystat_initialize();
//	keystat_reset();
}

void pccore_reset(void) {

	soundmng_stop();
	if (soundrenewal) {
		soundrenewal = 0;
		sndctrl_deinitialize();
		sndctrl_initialize();
	}
	reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW);
	soundmng_play();
}

void pccore_deinitialize(void) {

	sndctrl_deinitialize();

//	keyboard_term();

	fdd_eject(0);
	fdd_eject(1);
	fdd_eject(2);
	fdd_eject(3);
}


// ----

// #define	IPTRACE			(1 << 14)

#if defined(TRACE) && IPTRACE
static	UINT	trpos = 0;
static	UINT16	treip[IPTRACE];

void iptrace_out(void) {

	FILEH	fh;
	UINT	s;
	UINT16	pc;
	char	buf[32];

	s = trpos;
	if (s > IPTRACE) {
		s -= IPTRACE;
	}
	else {
		s = 0;
	}
	fh = file_create_c("his.txt");
	while(s < trpos) {
		pc = treip[s & (IPTRACE - 1)];
		s++;
		SPRINTF(buf, "%.4x\r\n", pc);
		file_write(fh, buf, strlen(buf));
	}
	file_close(fh);
}
#endif



void x1r_exec(void) {

extern	BYTE	disp_flashscreen;

	v_cnt = 0;
	s_cnt = 0;
	xmilcfg.DISPSYNC &= 1;
	inttiming = xmilcfg.CPU8MHz & 1;
//	TRACEOUT(("*sync"));

	while(s_cnt < 266) {
		while(h_cnt < pccore.HSYNC_CLK) {
#if defined(TRACE)
//			TRACEOUT(("%.4x", Z80_PC));
//			if (Z80_PC == 0x8198) {
//				TRACEOUT(("---->sound"));
//			}
//			if (Z80_PC == 0x8188) {
//				TRACEOUT(("-- poll sound"));
//			}
#endif
#if IPTRACE
			treip[trpos & (IPTRACE - 1)] = Z80_PC;
			trpos++;
#endif
			Z80_EXECUTE();
			z80dmap();
		}
		h_cnt -= pccore.HSYNC_CLK;
		h_cntbase += pccore.HSYNC_CLK;
		inttiming ^= 2;
		if (inttiming != 3) {
			if (xmilcfg.SOUNDPLY) {
				sound_makesample(pcmbufsize[s_cnt]);
				juliet2_exec();
			}
			s_cnt++;
			x1_ctc_int();
			if (!((++keyintcnt) & 15)) {
				x1_sub_int();
				if (xmilcfg.MOUSE_SW) {
					sio_int();
				}
			}
		}
		v_cnt++;
		if (crtc.s.CRT_YL == v_cnt) {
//			TRACEOUT(("--->sync"));
			pcg.r.vsync = 1;
			if (xmilcfg.DISPSYNC == 1) {
				xmilcfg.DISPSYNC |= 0x80;
				scrnupdate();
			}
		}
	}
	if (++flame >= 60) {
		flame = 0;
		calendar_inc();
	}
	if (!xmilcfg.SOUNDPLY) {
		sound_makesample(framesoundcnt);
	}
	if (!(xmilcfg.DISPSYNC & 0x80)) {
		scrnupdate();
	}
}


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