File:  [RetroPC.NET] / xmil / adv / xmilopen.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"
#include	"parts.h"
#include	"xmilopen.res"


static void lzx(UINT8 *dst, int dstsize, const UINT8 *src) {

	int		level;
	UINT8	ctrl;
	UINT8	bit;
	UINT	mask;
	UINT	tmp;
	int		pos;
	int		leng;

	level = *src++;
	ctrl = 0;
	bit = 0;
	mask = (1 << level) - 1;
	while(dstsize > 0) {
		if (!bit) {
			ctrl = *src++;
			bit = 0x80;
		}
		if (ctrl & bit) {
			tmp = *src++;
			tmp <<= 8;
			tmp |= *src++;
			pos = -1 - (tmp >> level);
			leng = (tmp & mask) + 1;
			leng = min(leng, dstsize);
			dstsize -= leng;
			while(leng--) {
				*dst = *(dst + pos);
				dst++;
			}
		}
		else {
			*dst++ = *src++;
			dstsize--;
		}
		bit >>= 1;
	}
}


static void vsyncwait(void) {

	while (*REG_VCOUNT >= 160) { }
	while (*REG_VCOUNT < 160) { }
}

static void setbg16(UINT16 *map, UINT8 *tile, UINT patnum,
										const UINT8 *pat, UINT w, UINT h) {

	UINT	x;
	UINT	y;

	tile += patnum * 32;
	do {
		for (x=0; x<w; x++) {
			*map++ = (UINT16)(patnum + x);
		}
		patnum += w;
		for (y=0; y<8; y++) {
			for (x=0; x<w; x++) {
				*(UINT32 *)(tile + (x * 32)) = *(UINT32 *)pat;
				pat += 4;
			}
			tile += 4;
		}
		map += (32 - w);
		tile += ((w - 1) * 32);
	} while(--h);
}

void xmilopen(void) {

	UINT	i;
	UINT8	*pat;
	UINT16	*map;

	bset16(ADVVIDEOPAL, 256, 0x7fff);
	advv_setmode(ADVV_BG0 | ADVV_MODE0);

	*REG_BG0CNT = (16 << ADVV_BGSCRNBASESFT) + (0 << ADVV_BGCHRBASESFT);
	*REG_BG0HOFS = 0;
	*REG_BG0VOFS = 32;

	*REG_BLDCNT = ADVV_EABG0 + ADVV_EABD + ADVV_EWHITE;
	*REG_BLDY = 16;

	bcopy16(ADVVIDEOPAL, xmopal, 16);

	pat = malloc(224*32/2);
	if (pat == NULL) {
		return;
	}

	map = (UINT16 *)(ADVVIDEOBUFFER + 0x8000);
	bzero32(ADVVIDEOBUFFER, 8);
	bzero16(map, 32*32);

	lzx(pat, 224*32/2, xm2a_bmp);
	setbg16(map + 10*32 + 1, ADVVIDEOBUFFER, 1, pat, 224/8, 32/8);

	for (i=0; i<16; i++) {
		vsyncwait();
		*REG_BLDY = (UINT16)(15 - i);
	}

	lzx(pat, 128*16/2, xm2d_bmp);
	setbg16(map + 14*32 + 8, ADVVIDEOBUFFER, 28*4+1, pat, 128/8, 16/8);

	free(pat);

	for (i=0; i<64; i++) {
		vsyncwait();
	}

	*REG_BLDCNT = ADVV_EABG0 + ADVV_EABD + ADVV_EBLACK;

	for (i=0; i<16; i++) {
		vsyncwait();
		*REG_BG0VOFS = (UINT16)(32 - i);
		*REG_BLDY = (UINT16)(i + 1);
	}

	bzero16(ADVVIDEOPAL, 256);
	bzero32(ADVVIDEOBUFFER, 0x18000 / 4);

	*REG_BG0VOFS = 0;
	*REG_BLDCNT = 0;
	*REG_BLDY = 0;
}


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