File:  [RetroPC.NET] / xmil / nds / vram / makemix.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Tue Mar 24 22:52:53 2009 JST (16 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
add nds-win32 simulation project

#include "compiler.h"
#include "libnds.h"
#include "vram.h"
#include "makescrn.h"
#include "makesub.h"


// 遅いのが嫌なら後でインラインにすればいい

// to256colex
// bit0 = normal left
// bit3 = normal right
// bit4 = interleaf 0
// bit7 = interleaf 1

static UINT vramstep = MAKESCRN_VIDEOYALIGN;


void makemix_mixstep(BRESULT x2) {

	vramstep = (x2)?(MAKESCRN_VIDEOYALIGN * 2):(MAKESCRN_VIDEOYALIGN * 1);
}

void makemix_mixtext40(UINT8 *dst, const UINT8 *txt, UINT count) {

	UINT32	datl;
	UINT32	datr;
	REG8	dat;

	do {
		datl = (*(UINT32 *)(dst + 0)) & 0x38383838;
		datr = (*(UINT32 *)(dst + 4)) & 0x38383838;
		dat = txt[MAKETEXT_ROW * 0];
		datl |= (to256colex[dat] & 0x01010101) << 0;
		datr |= (to256colex[dat] & 0x08080808) >> 3;
		dat = txt[MAKETEXT_ROW * 1];
		datl |= (to256colex[dat] & 0x01010101) << 1;
		datr |= (to256colex[dat] & 0x08080808) >> 2;
		dat = txt[MAKETEXT_ROW * 2];
		datl |= (to256colex[dat] & 0x01010101) << 2;
		datr |= (to256colex[dat] & 0x08080808) >> 1;
		*(UINT32 *)(dst + 0) = datl;
		*(UINT32 *)(dst + 4) = datr;
		txt++;
		dst += vramstep;
	} while(--count);
}

void makemix_mixgrph40(UINT8 *dst, const UINT8 *grp, UINT count) {

	UINT	pos;
	UINT32	datl;
	UINT32	datr;
	REG8	dat;

	pos = 0;
	do {
		datl = (*(UINT32 *)(dst + 0)) & 0x07070707;
		datr = (*(UINT32 *)(dst + 4)) & 0x07070707;
		dat = grp[pos + GRAM_B];
		datl |= (to256colex[dat] & 0x01010101) << 3;
		datr |= (to256colex[dat] & 0x08080808) << 0;
		dat = grp[pos + GRAM_R];
		datl |= (to256colex[dat] & 0x01010101) << 4;
		datr |= (to256colex[dat] & 0x08080808) << 1;
		dat = grp[pos + GRAM_G];
		datl |= (to256colex[dat] & 0x01010101) << 5;
		datr |= (to256colex[dat] & 0x08080808) << 2;
		*(UINT32 *)(dst + 0) = datl;
		*(UINT32 *)(dst + 4) = datr;
		pos = (pos + GRAM_LINESTEP) & (GRAM_LINESTEP * 7);
		dst += vramstep;
	} while(--count);
}

void makemix_mixtext80(UINT8 *dst, const UINT8 *txt, UINT count) {

	UINT32	dat0;
	UINT32	dat1;
	REG8	dat;

	do {
		dat0 = (*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 0))) & 0x38383838;
		dat1 = (*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 1))) & 0x38383838;
		dat = txt[MAKETEXT_ROW * 0];
		dat0 |= (to256colex[dat] & 0x10101010) >> 4;
		dat1 |= (to256colex[dat] & 0x80808080) >> 7;
		dat = txt[MAKETEXT_ROW * 1];
		dat0 |= (to256colex[dat] & 0x10101010) >> 3;
		dat1 |= (to256colex[dat] & 0x80808080) >> 6;
		dat = txt[MAKETEXT_ROW * 2];
		dat0 |= (to256colex[dat] & 0x10101010) >> 2;
		dat1 |= (to256colex[dat] & 0x80808080) >> 5;
		*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 0)) = dat0;
		*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 1)) = dat1;
		txt++;
		dst += vramstep;
	} while(--count);
}

void makemix_mixgrph80(UINT8 *dst, const UINT8 *grp, UINT count) {

	UINT	pos;
	UINT32	dat0;
	UINT32	dat1;
	REG8	dat;

	pos = 0;
	do {
		dat0 = (*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 0))) & 0x07070707;
		dat1 = (*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 1))) & 0x07070707;
		dat = grp[pos + GRAM_B];
		dat0 |= (to256colex[dat] & 0x10101010) >> 1;
		dat1 |= (to256colex[dat] & 0x80808080) >> 4;
		dat = grp[pos + GRAM_R];
		dat0 |= (to256colex[dat] & 0x10101010) << 0;
		dat1 |= (to256colex[dat] & 0x80808080) >> 3;
		dat = grp[pos + GRAM_G];
		dat0 |= (to256colex[dat] & 0x10101010) << 1;
		dat1 |= (to256colex[dat] & 0x80808080) >> 2;
		*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 0)) = dat0;
		*(UINT32 *)(dst + (MAKESCRN_VIDEOPAGE * 1)) = dat1;
		pos = (pos + GRAM_LINESTEP) & (GRAM_LINESTEP * 7);
		dst += vramstep;
	} while(--count);
}



#if 0
void makemix_settext(UINT8 *dst, UINT align, const UINT8 *txt, UINT count) {

	REG8	dat;
	UINT32	datl;
	UINT32	datr;

	do {
		dat = txt[MAKETEXT_ROW * 0];
		datl = TO256COLL(dat, 3);
		datr = TO256COLR(dat, 3);
		dat = txt[MAKETEXT_ROW * 1];
		datl |= TO256COLL(dat, 4);
		datr |= TO256COLR(dat, 4);
		dat = txt[MAKETEXT_ROW * 2];
		datl |= TO256COLL(dat, 5);
		datr |= TO256COLR(dat, 5);
		*(UINT32 *)(dst + 0) = datl;
		*(UINT32 *)(dst + 4) = datr;
		txt++;
		dst += align;
	} while(--count);
}

void makemix_ul20(UINT8 *dst, UINT pos) {

	UINT32	dat;

	dat = (TRAM_KNJ(pos) & TRAMKNJ_ULINE)?0x01010101:0x00000000;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 0) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 4) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 0) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 4) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 0) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 4) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 0) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 4) = 0;
}

void makemix_ul10(UINT8 *dst, UINT pos) {

	UINT32	dat;

	dat = (TRAM_KNJ(pos) & TRAMKNJ_ULINE)?0x01010101:0x00000000;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 0) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 0) + 4) = dat;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 0) = dat;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 1) + 4) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 0) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 2) + 4) = dat;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 0) = dat;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 3) + 4) = dat;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 4) + 0) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 4) + 4) = 0;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 5) + 0) = 0;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 5) + 4) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 6) + 0) = 0;
	*(UINT32 *)(dst + (SURFACE_WIDTH * 6) + 4) = 0;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 7) + 0) = 0;
//	*(UINT32 *)(dst + (SURFACE_WIDTH * 7) + 4) = 0;
}


void makemix_cpy200(UINT8 *dst, UINT pos, UINT count) {

	count -= pos;
	pos = pos * SURFACE_WIDTH * 2;
	do {
		*(UINT32 *)(dst + pos + 0) = *(UINT32 *)(dst + 0);
		*(UINT32 *)(dst + pos + 4) = *(UINT32 *)(dst + 4);
		dst += SURFACE_WIDTH * 2;
	} while(--count);
}

void makemix_cpy400(UINT8 *dst, UINT pos, UINT count) {

	count -= pos;
	pos = pos * SURFACE_WIDTH;
	do {
		*(UINT32 *)(dst + pos + 0) = *(UINT32 *)(dst + 0);
		*(UINT32 *)(dst + pos + 4) = *(UINT32 *)(dst + 4);
		dst += SURFACE_WIDTH;
	} while(--count);
}
#endif


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