/*	
 *	clippp4.h
 *
 *	P/ECE PPU (RICOH RP2C02) Emulator (1/4解像度版)
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2005 Naoyuki Sawa
 *
 *	* Wed Feb 09 04:34:00 JST 2005 Naoyuki Sawa
 *	- 作成開始。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_PP4_H__
#define __CLIP_PP4_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/* 本モジュールは、通常版のPPU Emulatorモジュールに、1/4解像度の描画機能を追加します。
 * 1/4解像度の描画機能は試験的なものであり、今後、取り除く可能性があるので、
 * 通常版のPPU Emulatorモジュールに含めませんでした。
 *
 * 通常版のPPU Emulatorモジュールに属するファイルは、次の通りです。
 *	clipppu.h
 *	clipppu.c
 *	clipppua.h
 *	clipppui.h
 *	framppu.c
 *	framppua.s
 *
 * 1/4解像度版のPPU Emulatorモジュールに属するファイルは、次の通りです。
 *	clippp4.h
 *	clippp4.c
 *	clippp4i.h
 *	frampp4.c
 *	frampp4a.s
 *
 * 通常版のファイルは、1/4解像度版のファイルに一切依存していません。
 * いつでも、1/4解像度版のファイルをプロジェクトから削除することができます。
 *
 *
 * 1/4解像度版のファイルは、通常版のファイルに依存しています。
 * 通常版の構造体などを変更した場合は、1/4解像度版の処理も追従してください。
 *
 * 通常版を利用するアプリケーションは、高速RAMに次のファイルを配置してください。
 *	framppu.o
 *	framppua.o
 * アプリケーションが1/4解像度版の描画関数(ppu4_update())を使わなければ、
 * 1/4解像度版のファイルは一切リンクされません。
 *
 * 1/4解像度版を利用するアプリケーションは、高速RAMに次のファイルを配置してください。
 *	framppu.o
 *	framppua.o
 * アプリケーションが通常版の描画関数(ppu_update())を使わなくても、
 * 通常版のファイルはすべてリンクされます。
 * 通常版の高速RAM用ファイルもリンクされますが、それらを高速RAMに配置しなければ、
 * SRAM領域を数キロバイト無駄に消費するだけで済みます。
 */

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

/* PPU_ASMシンボル定義を読み込みます。
 * PPU_ASMシンボルの未定義/定義によるC/アセンブラコードの切り替えは、
 * Cソースファイル(*.c)とアセンブラソースファイル(*.s)から参照するので、
 * 別のインクルードファイルに分けています。
 * (C言語特有の定義を含むインクルードファイルをそのままアセンブラソースに
 *  インクルードすると、アセンブルエラーになってしまうため。)
 */
#include "clipppua.h"

/********** これ以降は書き換えないでください **********/

/* P/ECE以外ではアセンブラコードは使用できません。
 */
#ifndef PIECE
#undef PPU_ASM
#endif /*PIECE*/

/****************************************************************************
 *	グローバル変数
 ****************************************************************************/

#ifdef PPU_GRAYSCALE
extern const unsigned char ppu4_grayscale_table[64];
#endif /*PPU_GRAYSCALE*/

/****************************************************************************
 *	内部関数
 ****************************************************************************/

void ppu4_draw_bg();
void ppu4_draw_sprite     (int priority);
void ppu4_draw_sprite_8x8 (int priority);
void ppu4_draw_sprite_8x16(int priority);
void ppu4_draw_chr      (int xpos, int ypos, int code, int palno);
void ppu4_draw_chr_revx (int xpos, int ypos, int code, int palno);
void ppu4_draw_chr_revy (int xpos, int ypos, int code, int palno);
void ppu4_draw_chr_revxy(int xpos, int ypos, int code, int palno);

/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/

/* 画面を描画します。
 * [in]
 *	vbuff		128x120画面バッファ。(NULL:内部処理のみ、実描画無し)
 * [out]
 *	戻り値		経過サイクル数。(NTSCカラーサブキャリアクロック単位)
 * [note]
 *	* 出力解像度が異なる以外は、ppu_update()と同じです。
 *	  ppu_update()の説明を参照してください。
 */
int ppu4_update(unsigned char vbuff[/*128*120*/]);

#ifdef PPU_GRAYSCALE
/* 128x120x16諧調グレイスケールを、128x88x16諧調グレイスケールへ縮小コピーします。
 * [in]
 *	src		128x120x16諧調グレイスケール画面バッファ。
 *	dst		128x 88x16諧調グレイスケール画面バッファ。
 *
 * [note]
 *	* 入出力解像度が異なる以外は、ppu_reduce()と同じです。
 *	  ppu_reduce()の説明を参照してください。
 */
void ppu4_reduce(unsigned char dst[/*128*88*/], const unsigned char src[/*128*120*/]);
#endif PPU_GRAYSCALE

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_PP4_H__*/
