/*	
 *	clipppui.h
 *
 *	P/ECE PPU (RICOH RP2C02) Emulator
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2005 Naoyuki Sawa
 *
 *	* Sun Jan 30 21:25:00 JST 2005 Naoyuki Sawa
 *	- 作成開始。
 */

/****************************************************************************
 *
 ****************************************************************************/

/* PPUエミュレーションの、BG描画関数の実装に利用します。
 * 	void ppu_draw_chr      (int xpos, int ypos, int code, int palno)
 * 	void ppu_draw_chr_revx (int xpos, int ypos, int code, int palno)
 * 	void ppu_draw_chr_revy (int xpos, int ypos, int code, int palno)
 * 	void ppu_draw_chr_revxy(int xpos, int ypos, int code, int palno)
 * [in]
 *	(xpos,ypos)	描画する8x8矩形の左上原点座標。
 *	code		キャラ番号。($000-$100)
 *	palno		カラーコードの上位3bit。($0-$7)
 */
#ifdef PPU_DRAW_CHR_IMPLEMENT
{
	PPU* p_ppu = &ppu;
	unsigned char* vram = ppu_vram;
	//
	int scan_start = p_ppu->scan_start;
	int scan_end = p_ppu->scan_end;
	unsigned char* vbuff = p_ppu->vbuff;
	unsigned char* clut = p_ppu->clut;
	//
	int x;
	int y;
	int v;
	int v0;
	int v1;
	unsigned char* pattern;

	/* 完全に描画領域外ならば、何もせず帰ります。 */
	if(ypos <= scan_start - 8 || ypos >= scan_end ||
	   xpos <=          0 - 8 || xpos >=      256) {
		return;
	}

	vbuff += ypos * 256 + xpos;
	clut += palno << 2;
#if(PPU_REVY == 0)
	pattern = &vram[0x0000 | code << 4];
#else /*PPU_REVY*/
	pattern = &vram[0x0007 | code << 4];
#endif /*PPU_REVY*/

	/* 完全に描画領域内ならば、クリッピング不要。 */
	if(ypos >= scan_start && ypos <= scan_end - 8 &&
	   xpos >=          0 && xpos <=      256 - 8) {
		y = 8;
		do {
#if(PPU_REVX == 0)
			v0 = MIRROR(pattern[0]);
			v1 = MIRROR(pattern[8]) << 1;
#else /*PPU_REVX*/
			v0 = pattern[0];
			v1 = pattern[8] << 1;
#endif /*PPU_REVX*/
			x = 8;
			do {
				v = (v0 & 1) | (v1 & 2);
				if(v) {
					*vbuff = clut[v];
				}
				v0 >>= 1;
				v1 >>= 1;
				vbuff++;
			} while(--x);
			vbuff += 256 - 8;
#if(PPU_REVY == 0)
			pattern++;
#else /*PPU_REVY*/
			pattern--;
#endif /*PPU_REVY*/
		} while(--y);

	/* 描画領域をはみ出す場合、クリッピング必要。 */
	} else {
		y = 8;
		do {
			if(ypos >= scan_start && ypos < scan_end) {
#if(PPU_REVX == 0)
				v0 = MIRROR(pattern[0]);
				v1 = MIRROR(pattern[8]) << 1;
#else /*PPU_REVX*/
				v0 = pattern[0];
				v1 = pattern[8] << 1;
#endif /*PPU_REVX*/
				x = 8;
				do {
					v = (v0 & 1) | (v1 & 2);
					if(v) {
						if(xpos >= 0 && xpos < 256) {
							*vbuff = clut[v];
						}
					}
					v0 >>= 1;
					v1 >>= 1;
					xpos++;
					vbuff++;
				} while(--x);
				xpos -= 8;
				vbuff -= 8;
			}
			ypos++;
			vbuff += 256;
#if(PPU_REVY == 0)
			pattern++;
#else /*PPU_REVY*/
			pattern--;
#endif /*PPU_REVY*/
		} while(--y);
	}
}
#endif PPU_DRAW_CHR_IMPLEMENT

/****************************************************************************
 *
 ****************************************************************************/
