File:  [RetroPC.NET] / xmil / vram / scrndraw.c
Revision 1.12: download - view: text, annotated - select for diffs
Fri Feb 4 15:42:12 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"
#include	"scrnmng.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"scrndraw.h"
#include	"sdraw.h"
#include	"palettes.h"
#include	"makescrn.h"


	UINT8	renewalline[SURFACE_HEIGHT+4];
	UINT8	screenmap[SURFACE_SIZE];


static void updateallline(UINT32 update) {

	UINT	i;

	for (i=0; i<SURFACE_HEIGHT; i+=4) {
		*(UINT32 *)(renewalline + i) |= update;
	}
}


// ----

void scrndraw_initialize(void) {					// ddraws_init

	ZeroMemory(screenmap, sizeof(screenmap));
	ZeroMemory(xmil_pal32, sizeof(xmil_pal32));
	xmil_palettes = 0;

	updateallline(0x03030303);			// updateallline(0x01010101);
	scrnmng_allflash();
}

void scrndraw_changepalette(void) {

#if defined(SUPPORT_8BPP)
	if (scrnmng_getbpp() == 8) {
		scrnmng_palchanged();
		return;
	}
#endif
	updateallline(0x01010101);					// fillrenewalline(0x03030303)
}


// ----

#if defined(SUPPORT_PALEVENT)
static REG8 rasterdraw(SDRAWFN sdrawfn, SDRAW sdraw, int maxy) {

	UINT8		rgbp[8];
	SINT32		rasterclock;
	SINT32		clock;
	PAL1EVENT	*event;
	PAL1EVENT	*eventterm;
	int			nextupdate;
	int			y;

	CopyMemory(rgbp, palevent.rgbp, 8);
	rasterclock = crtc.e.rasterclock8;
	if (crtc.s.SCRN_BITS & SCRN_24KHZ) {
		rasterclock = rasterclock * 2;
	}
	clock = 0;
	event = palevent.event;
	eventterm = event + palevent.events;
	nextupdate = 0;

	for (y=2; y<maxy; y+=2) {
		if (event >= eventterm) {
			break;
		}
		clock += rasterclock;
		// お弁当はあった?
		if (clock > (event->clock << 8)) {
			pal_update1(rgbp);
			(*sdrawfn)(sdraw, y);
			nextupdate = y;
			// お弁当を食べる
			while(clock > (event->clock << 8)) {
				((UINT8 *)rgbp)[event->rgbp] = event->value;
				event++;
				if (event >= eventterm) {
					break;
				}
			}
		}
	}
	if (y < maxy) {
		pal_update1(rgbp);
		(*sdrawfn)(sdraw, maxy);
	}
	// 戻すすすす
	pal_update1(crtc.s.rgbp);

	if (nextupdate) {
		for (y=0; y<nextupdate; y+=2) {
			*(UINT16 *)(renewalline + y) |= 0x0101;
		}
		return(SCRNUPD_FLASH);
	}
	else {
		return(0);
	}
}
#endif


// ----

REG8 scrndraw_draw(REG8 redraw) {

	REG8		ret;
const SCRNSURF	*surf;
const SDRAWFN	*sdrawfn;
	SDRAWFN		fn;
	_SDRAW		sdraw;
	UINT		i;

	if (redraw) {
		updateallline(0x01010101);
	}

	ret = 0;
	surf = scrnmng_surflock();
	if (surf == NULL) {
		goto sddr_exit1;
	}
	sdrawfn = sdraw_getproctbl(surf);
	if (sdrawfn == NULL) {
		goto sddr_exit2;
	}
	sdrawfn += makescrn.drawmode;
	fn = *sdrawfn;
	if (fn == NULL) {
		goto sddr_exit2;
	}

	for (i=0; i<SURFACE_HEIGHT; i++) {
		sdraw.dirty[i] = renewalline[i] & 1;
		if (sdraw.dirty[i]) {
			renewalline[i] &= ~1;
		}
	}

	sdraw.src = screenmap;
	sdraw.dst = surf->ptr;
#if defined(SIZE_QVGA)
	sdraw.width = surf->width >> 1;
#else
	sdraw.width = surf->width;
#endif
	sdraw.xbytes = surf->xalign * sdraw.width;
	sdraw.y = 0;
	sdraw.xalign = surf->xalign;
	sdraw.yalign = surf->yalign;
#if !defined(SUPPORT_PALEVENT)
	(*fn)(&sdraw, 400);
#else
	if ((crtc.e.dispmode & SCRN64_ENABLE) ||
		(palevent.events >= SUPPORT_PALEVENT)) {
		(*fn)(&sdraw, 400);
	}
	else {
		ret = rasterdraw(*sdrawfn, &sdraw, 400);
	}
#endif

sddr_exit2:
	scrnmng_surfunlock(surf);

sddr_exit1:
	return(ret);
}

void scrndraw_redraw(void) {

	scrnmng_allflash();
	pal_update();
	scrndraw_draw(TRUE);
}


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