File:  [RetroPC.NET] / xmil / nds / sysmng.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Thu Mar 26 06:36:10 2009 JST (16 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
added nds core

#include "compiler.h"
#include "libnds.h"
#include "sysmng.h"
#include "z80core.h"
#include "resource.h"

#if defined(DISPCLOCK) && (!defined(NDS_SIMULATE))

#define NDSVIDEO_WIDTH		SCREEN_WIDTH
#define NDSVIDEO_HEIGHT		SCREEN_HEIGHT

struct tagNdsOam
{
	UINT16 wAttr0;
	UINT16 wAttr1;
	UINT16 wAttr2;
	UINT16 wAttr3;
};

static const UINT32 s_spd[8*12] =
{
				0x001100, 0x012210, 0x121121, 0x121121,	// 0
				0x121121, 0x121121, 0x012210, 0x001100,
				0x000100, 0x001210, 0x012210, 0x001210,	// 1
				0x001210, 0x001210, 0x001210, 0x000100,
				0x001100, 0x012210, 0x121121, 0x010121,	// 2
				0x001210, 0x012110, 0x122221, 0x011110,
				0x011110, 0x122221, 0x011210, 0x012210,	// 3
				0x011121, 0x121121, 0x012210, 0x001100,
				0x000100, 0x001210, 0x012210, 0x121210,	// 4
				0x121210, 0x122221, 0x011210, 0x000100,
				0x011110, 0x122221, 0x121110, 0x012210,	// 5
				0x011121, 0x121121, 0x012210, 0x001100,
				0x000100, 0x001210, 0x012100, 0x122210,	// 6
				0x121121, 0x121121, 0x012210, 0x001100,
				0x011110, 0x122221, 0x011121, 0x000121,	// 7
				0x001210, 0x001210, 0x012100, 0x001000,
				0x001100, 0x012210, 0x121121, 0x012210,	// 8
				0x121121, 0x121121, 0x012210, 0x001100,
				0x001100, 0x012210, 0x121121, 0x121121,	// 9
				0x012221, 0x001121, 0x012210, 0x001100,
				0x000000, 0x000000, 0x000000, 0x000000,	// .
				0x000000, 0x010000, 0x121000, 0x010000, 
				0x010000, 0x121010, 0x010121, 0x001210,	// %
				0x012100, 0x121010, 0x010121, 0x000010,
};

static struct
{
	UINT32 uTick;
	UINT32 uClock;
//	UINT32 uDraws;
} s_workclock;

void sysmng_initialize()
{
	volatile tagNdsOam *pOam = reinterpret_cast<tagNdsOam *>(OAM);

	UINT i;
	for (i=0; i<128; i++)
	{
		pOam[i].wAttr0 = ATTR0_DISABLED;
		pOam[i].wAttr1 = 0;
		pOam[i].wAttr2 = 0;
	}

	volatile UINT32 *p = reinterpret_cast<UINT32 *>(SPRITE_GFX);
	for (i=0; i<8*12; i++)
	{
		p[i] = s_spd[i];
	}

	SPRITE_PALETTE[0] = (0 << 10) + (0 << 5) + (0 << 0);
	SPRITE_PALETTE[1] = (0 << 10) + (0 << 5) + (1 << 0);
	SPRITE_PALETTE[2] = (0 << 10) + (0 << 5) + (31 << 0);

	pOam[0].wAttr0 = ATTR0_DISABLED;
	pOam[0].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 30);
//	pOam[0].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 0;

	pOam[1].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
	pOam[1].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 25);
//	pOam[1].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 0;

	pOam[2].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
	pOam[2].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 20);
	pOam[2].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 10;

	pOam[3].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
	pOam[3].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 18);
//	pOam[3].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 0;

	pOam[4].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
	pOam[4].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 13);
//	pOam[4].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 0;

	pOam[5].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
	pOam[5].wAttr1 = ATTR1_SIZE_8 | ATTR1_FLIP_X | (NDSVIDEO_WIDTH - 8);
//	pOam[5].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | 0;
}

void sysmng_clockreset()
{
	s_workclock.uTick = GETTICK();
	s_workclock.uClock = CPU_CLOCK;
//	s_workclock.uDraws = drawtime;				// drawcount;
}

void sysmng_dispclock()
{
	const SINT32 nTick = GETTICK() - s_workclock.uTick;
	if (nTick < 1000)
	{
		return;
	}
	const UINT uCpuClock = CPU_CLOCK;
	s_workclock.uTick += nTick;
//	SINT32 nFps = ((drawtime - s_workclock.uDraws) * 10000) / nTick;
//	s_workclock.uDraws = drawtime;
	SINT32 nKhz = (uCpuClock - s_workclock.uClock) / nTick;
	s_workclock.uClock = uCpuClock;

	volatile tagNdsOam *pOam = reinterpret_cast<tagNdsOam *>(OAM);
	pOam[5].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | (nKhz % 10);
	nKhz /= 10;
	pOam[4].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | (nKhz % 10);
	nKhz /= 10;
	pOam[3].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | (nKhz % 10);
	nKhz /= 10;
	pOam[1].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | (nKhz % 10);
	nKhz /= 10;
	if (nKhz)
	{
		pOam[0].wAttr0 = ATTR0_SQUARE | ATTR0_COLOR_16 | ATTR0_TYPE_NORMAL | ATTR0_NORMAL | (NDSVIDEO_HEIGHT - 8);
		pOam[0].wAttr2 = ATTR2_PALETTE(0) | ATTR2_PRIORITY(0) | (nKhz % 10);
	}
	else
	{
		pOam[0].wAttr0 = ATTR0_DISABLED;
	}
}

#endif	// defined(DISPCLOCK) && (!defined(NDS_SIMULATE))



#if !defined(TRACE)

static int s_nFddCount[2];

static void updateLamp(UINT uDrv, bool bSet)
{
	int nPosX = 0;
	switch(uDrv)
	{
		case 0:
			nPosX = 12;
			break;

		case 1:
			nPosX = 112;
			break;

		default:
			return;
	}

	const int nSrcX = (bSet) ? 8 : 0;
	const unsigned char *p = reinterpret_cast<const unsigned char *>(g_sDemoBmp);
	unsigned char *q = reinterpret_cast<unsigned char *>(BG_GFX_SUB);
	p = p + nSrcX + (192 * 256);
	q = q + nPosX + (9 * 256);
	for (int y=0; y<3; y++)
	{
		for (int x=0; x<8; x+=2)
		{
			*(reinterpret_cast<uint16 *>(q + x)) = *(reinterpret_cast<const uint16 *>(p + x));
		}
		p = p + 256;
		q = q + 256;
	}
}

void sysmng_fddaccess(UINT8 cDrv)
{
	if (cDrv < 2)
	{
		if (s_nFddCount[cDrv] <= 0)
		{
			updateLamp(cDrv, true);
		}
		s_nFddCount[cDrv] = 20;

	}
}

void sysmng_fddsync(UINT uFrames)
{
	for (int i=0; i<2; i++)
	{
		if (s_nFddCount[i] > 0)
		{
			s_nFddCount[i] -= uFrames;
			if (s_nFddCount[i] <= 0)
			{
				updateLamp(i, false);
			}
		}
	}
}

#endif	// !defined(TRACE)


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