/*
 *	app.h
 *
 *	パチスロP/ECE ART
 *
 *	* Fri Jul 04 00:33:00 JST 2014 Naoyuki Sawa
 *	- 1st リリース。
 */
#ifndef __APP_H__
#define __APP_H__

#include <clip.h>

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

//{{2014/02/01削除:MakefileのUSE_RESOURCEで制御するように変更しました。もうRESOURCE_FNAMEは使用しません。
///* pexファイル添付リソースを使う場合は、RESOURCE_FNAMEにpexファイル名を定義してください。
// * pexファイル添付リソースを使わない場合は、RESOURCE_FNAMEを定義しないでください。
// * - Makefileにも、pexファイル添付リソースの使用有無、および、pexファイル名が記述されているので、
// *   Makefileから、gccの-DオプションでRESOURCE_FNAMEを指定する方法も検討しましたが、やめました。
// *   実験したところ、-Dオプションは「"」を除去してしまうみたいで、文字列を定義できないからです。
// *	-DRESOURCE_FNAME="test.pex" … RESOURCE_FNAMEは、"test.pex"でなく、test.pexになってしまう
// *   文字列化演算子を使って、以下のように対応することもできますが、
// *	[Makefileにおいて...]
// *	-DRESOURCE_FNAME=test.pex
// *	[C言語ソースにおいて...]
// *	#define T(str) #str
// *	char* fname = T(RESOURCE_FNAME);
// *   複雑になりすぎることを防ぐため、単純に、MakefileとC言語ソースで二回指定することにしました。
// */
//#define RESOURCE_FNAME "test.pex" /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_RESOURCEで制御するように変更しました。もうRESOURCE_FNAMEは使用しません。

/* クロック・メモリウェイトを変更する場合は、TURBOシンボルを定義してください。
 * 定義した値は、turbo()関数にそのまま引き渡されます。
 */
//{{2014/02/01削除:MakefileのTURBOで制御するように変更しました。
//#define TURBO -1 /*{{TODO}}*/
//}}2014/02/01削除:MakefileのTURBOで制御するように変更しました。

/* デバッグモードを使う場合は、USE_DBGシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_DBGで制御するように変更しました。
//#define USE_DBG /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_DBGで制御するように変更しました。

/* ガーベージコレクターを使う場合は、
 * ・USE_GCシンボルを定義してください。
 * ・GC_LEVELシンボルに適切なGC動作レベルを選択してください。
 */
//{{2014/02/01削除:MakefileのGC_LEVELで制御するように変更しました。もうUSE_GCは使用しません。
//#define USE_GC /*{{TODO}}*/
//#ifdef USE_GC
//#define GC_LEVEL GC_LEVEL_CONSERVATIVE	/* 「保守的」なGC動作レベル */	//推奨//
////#define GC_LEVEL GC_LEVEL_INTERMEDIATE	/* 「中間的」なGC動作レベル */
////#define GC_LEVEL GC_LEVEL_AGGRESSIVE	/* 「積極的」なGC動作レベル */
//#endif /*USE_GC*/
//}}2014/02/01削除:MakefileのGC_LEVELで制御するように変更しました。もうUSE_GCは使用しません。

/* 高速切替・16階調表示を使う場合は、
 * ・LDIRECT_INTERVALに更新タイミング[ミリ秒]を定義してください。
 *   更新タイミングの目安は、おおよそ次の通りです。
 *	11以下	処理が間に合わずハングアップの危険あり。
 *	12	高品質・高負荷。48MHz/1WAIT以外では処理が間に合わずハングアップの危険性あり。
 *	25	中品質・中負荷。48MHz/1WAIT時は、この値が適切です。
 *	33	低品質・低負荷。24MHz/2WAIT時は、この値が適切です。
 *	34以上	切替えが遅すぎて、点滅が見えてしまいます。
 * ・高速切替・16階調表示を使わない場合は、LDIRECT_INTERVALを定義しないでください。
 *   通常の4階調表示となります。
 */
//{{2014/02/01削除:MakefileのLDIRECT_INTERVALで制御するように変更しました。
//#define LDIRECT_INTERVAL 12 /*{{TODO}}*/
//}}2014/02/01削除:MakefileのLDIRECT_INTERVALで制御するように変更しました。

/* 縦画面モードを使う場合は、V_SCREENシンボルを定義してください */
//{{2014/02/01削除:MakefileのV_SCREENで制御するように変更しました。
//#define V_SCREEN /*{{TODO}}*/
//}}2014/02/01削除:MakefileのV_SCREENで制御するように変更しました。
#ifdef V_SCREEN
#undef DISP_X
#undef DISP_Y
#define DISP_X	 88
#define DISP_Y	128
#endif /*V_SCREEN*/

/* 音楽ライブラリを使う場合は、USE_MUSICシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_MUSICで制御するように変更しました。
//#define USE_MUSIC /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_MUSICで制御するように変更しました。
#ifdef USE_MUSIC
#define music_play(data) do { music_stop(); PlayMusic((unsigned char*)(data)); } while(0)
#define music_stop() do { StopMusic(); sound_stop(music_wch); } while(0)
#else /*USE_MUSIC*/
#define music_play(data) ((void)0)
#define music_stop() ((void)0)
#endif /*USE_MUSIC*/

/* サウンドリストを初期化する場合は、USE_SOUNDシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_SOUNDで制御するように変更しました。
//#define USE_SOUND /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SOUNDで制御するように変更しました。
#ifdef USE_SOUND
#define SOUND_(name) SND_##name,
#define SOUND_RESOURCE_(name,fname) SND_##name,
enum {
#include "sound.h"
	SOUND_COUNT,
};
extern const void* sound_table[SOUND_COUNT];
#undef SOUND_
#undef SOUND_RESOURCE_
#endif /*USE_SOUND*/

/* 2-bit ADPCM Decoderを使う場合は、
 * ・USE_2BIT_ADPCMシンボルを定義してください。
 * ・SOUND_MAXCHシンボルに適切なチャネル数を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_2BIT_ADPCMで制御するように変更しました。
//#define USE_2BIT_ADPCM /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_2BIT_ADPCMで制御するように変更しました。
#ifdef USE_2BIT_ADPCM
#undef  SOUND_MAXCH	/* clip/clippce.hの定義をキャンセル */
#define SOUND_MAXCH	4
/* - 利用するサウンド形式を、標準4-bit ADPCM⇔拡張2-bit ADPCMに切り替えたときに、
 *   ソースコードの変更が少なくて済むよう、以下のマクロを定義することにしました。
 *   標準4-bit ADPCMと拡張2-bit ADPCMを併用する場合は、コメントアウトしてください。
 *   (物理チャネル0で2-bit ADPCM(多重)、物理チャネル1-3で4-bit ADPCMを利用する場合)
 */
#define sound_play	adpcm_play
#define sound_stop	adpcm_stop
#define sound_stat	adpcm_stat
#define sound_att	adpcm_att
#endif /*USE_2BIT_ADPCM*/

/* Sound Managerを使う場合は、
 * ・USE_SOUND_MANAGERシンボルを定義してください。
 * ・SOUND_MANAGER_*_*シンボルに適切なチャネル下限上限を指定してください。
 *   Sound Manager構成を変更する場合は、シンボルの種類を変更してください。
 */
//{{2014/02/01削除:MakefileのUSE_SOUND_MANAGERで制御するように変更しました。
//#define USE_SOUND_MANAGER /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SOUND_MANAGERで制御するように変更しました。
#ifdef  USE_SOUND_MANAGER
#define SOUND_MANAGER_BGM_MINCH 0		/* BGMチャネル下限 */
#define SOUND_MANAGER_BGM_MAXCH 0		/* BGMチャネル上限 */
#define SOUND_MANAGER_SE1_MINCH 1		/* SE1チャネル下限 */
#define SOUND_MANAGER_SE1_MAXCH 1		/* SE1チャネル上限 */
#define SOUND_MANAGER_SE2_MINCH 2		/* SE2チャネル下限 */
#define SOUND_MANAGER_SE2_MAXCH (SOUND_MAXCH-1)	/* SE2チャネル上限 */
#endif/*USE_SOUND_MANAGER*/

/* 3D描画を使う場合は、
 * ・USE_3Dシンボルを定義してください。
 * ・FRONTに適切な前面クリッピング距離(＝視点〜投影面距離)を指定してください。
 * ・BACK に適切な背面クリッピング距離(＝視点〜可視限界遠)を指定してください。
 * ・FOVY に適切な垂直視野角度を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_3Dで制御するように変更しました。
//#define USE_3D /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_3Dで制御するように変更しました。
#ifdef USE_3D
#define FRONT	fld(1)
#define BACK	fld(100)
#define FOVY	DEG(45)
#endif /*USE_3D*/

/* 浮動小数点3D描画を使う場合は、
 * ・USE_RENDFシンボルを定義してください。
 * ・FRONTに適切な前面クリッピング距離(＝視点〜投影面距離)を指定してください。
 * ・BACK に適切な背面クリッピング距離(＝視点〜可視限界遠)を指定してください。
 * ・FOVY に適切な垂直視野角度を指定してください。
 * USE_3Dと同時に使うことはできません。(FRONT、BACK、FOVYが多重定義になります。)
 * 固定小数点3D描画(RENDER)と浮動小数点3D描画(RENDF)を併用することは可能ですが、
 * あまり意味が無いので、あえて多重定義警告がでるようにしてあります。
 */
//{{2014/02/01削除:MakefileのUSE_RENDFで制御するように変更しました。
//#define USE_RENDF /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_RENDFで制御するように変更しました。
#ifdef USE_RENDF
#define FRONT	1.0f
#define BACK	100.0f
#define FOVY	((float)M_PI_4)
#endif /*USE_RENDF*/

/* テクスチャリストを初期化する場合は、USE_TEXTUREシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_TEXTUREで制御するように変更しました。
//#define USE_TEXTURE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_TEXTUREで制御するように変更しました。
#ifdef USE_TEXTURE
#define TEXTURE_(name) TEX_##name,
#define TEXTURE_RESOURCE_(name,fname) TEX_##name,
enum {
#include "texture.h"
	TEXTURE_COUNT,
};
extern TEXTURE texture_table[TEXTURE_COUNT];
#undef TEXTURE_
#undef TEXTURE_RESOURCE_
#endif /*USE_TEXTURE*/

/* 簡易スプライトドライバを使う場合は、USE_SPRITEシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_SPRITEで制御するように変更しました。
//#define USE_SPRITE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_SPRITEで制御するように変更しました。
#ifdef USE_SPRITE
#define SPRITE_ SPRITE_INIT1
enum {
#include "sprite.h"
	SPRITE_COUNT
};
extern const SPRITE sprite_table[SPRITE_COUNT];
#undef SPRITE_
#endif /*USE_SPRITE*/

/* オートリピートを使用する場合は、
 * ・USE_REPEATシンボルを定義してください。
 * ・REPEAT_PADにオートリピートを有効にするPAD_*の組み合わせを指定してください。
 * ・REPEAT_DELAYにオートリピートが開始するまでの時間を指定してください。
 * ・REPEAT_INTERVALにオートリピート間隔の時間を指定してください。
 */
//{{2014/02/01削除:MakefileのUSE_REPEATで制御するように変更しました。
//#define USE_REPEAT /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_REPEATで制御するように変更しました。
#ifdef USE_REPEAT
#define REPEAT_PAD	(PAD_LF|PAD_UP|PAD_RI|PAD_DN)
#define REPEAT_DELAY	SEC(0.5)
#define REPEAT_INTERVAL	SEC(0.1)
#endif /*USE_REPEAT*/

/* ポーズ機能を使う場合は、USE_PAUSEシンボルを定義してください。
 * また、アプリケーションの通常背景色にあわせて、PAUSE_COLORを選択してください。
 */
//{{2014/02/01削除:MakefileのUSE_PAUSEで制御するように変更しました。
//#define USE_PAUSE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_PAUSEで制御するように変更しました。
#ifdef USE_PAUSE
#define PAUSE_FONT	0x80		/* PAUSEフォント         */
#ifndef LDIRECT_INTERVAL
#define PAUSE_COLOR	0x130		/* PAUSEカラー(白背景用) */
//#define PAUSE_COLOR	0x203		/* PAUSEカラー(黒背景用) */
#else /*LDIRECT_INTERVAL*/
#define PAUSE_COLOR	0x5f0		/* PAUSEカラー(16階調・白背景用) */
//#define PAUSE_COLOR	0xa0f		/* PAUSEカラー(16階調・黒背景用) */
#endif /*LDIRECT_INTERVAL*/
#define PAUSE_STR	"PAUSE"		/* PAUSEメッセージ       */
#define PAUSE_W		(5 * 5 + 2)	/* PAUSEメッセージの横幅 */
#define PAUSE_H		(10    + 2)	/* PAUSEメッセージの縦幅 */
#define PAUSE_X		((DISP_X - PAUSE_W) / 2) /* 水平表示位置 */
#define PAUSE_Y		((DISP_Y - PAUSE_H) / 2) /* 垂直表示位置 */
#endif /*USE_PAUSE*/

/* アイドルスレッドを使う場合は、USE_IDLEシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_IDLEで制御するように変更しました。
//#define USE_IDLE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_IDLEで制御するように変更しました。

/* USBファイルシステムエミュレーションを使う場合は、USE_UFEシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_UFEで制御するように変更しました。
//#define USE_UFE /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_UFEで制御するように変更しました。

/* USBファイルシステムエミュレーションとトレース出力は併用できません。 */
#if defined(USE_UFE) && defined(TRACE_ON) && (TRACE_ON)
#error USBファイルシステムエミュレーションとトレース出力は併用できません。
#endif /*defined(USE_UFE) && defined(TRACE_ON) && (TRACE_ON)*/

/* TCP/IPプロトコルスイートを使う場合は、USE_TCPIPシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_TCPIPで制御するように変更しました。
//#define USE_TCPIP /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_TCPIPで制御するように変更しました。

/* TCP/IPプロトコルスイートとトレース出力は併用できません。 */
#if defined(USE_TCPIP) && defined(TRACE_ON) && (TRACE_ON)
#error TCP/IPプロトコルスイートとトレース出力は併用できません。
#endif /*defined(USE_TCPIP) && defined(TRACE_ON) && (TRACE_ON)*/

#ifdef USE_TCPIP
#include "tcpip.h"
#endif /*USE_TCPIP*/

/* 画面出力を使う場合は、USE_VIDRECシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_VIDRECで制御するように変更しました。
//#define USE_VIDREC /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_VIDRECで制御するように変更しました。

/* 画面出力とトレース出力は併用できません。 */
#if defined(USE_VIDREC) && defined(TRACE_ON) && (TRACE_ON)
#error 画面出力とトレース出力は併用できません。
#endif /*defined(USE_VIDREC) && defined(TRACE_ON) && (TRACE_ON)*/

/* Bison/Flexを使う場合は、USE_BISON_FLEXシンボルを定義してください。 */
//{{2014/02/01削除:MakefileのUSE_BISON_FLEXで制御するように変更しました。
//#define USE_BISON_FLEX
//}}2014/02/01削除:MakefileのUSE_BISON_FLEXで制御するように変更しました。
#ifdef  USE_BISON_FLEX /*{{TODO}}*/
#define YYDEBUG 1 /* 構文解析器追跡機能が不要ならば、この行をコメントアウトしてください */
/* y.tab.y */
extern int yynerrs;
#if     (YYDEBUG!=0)
extern int yydebug;
#endif/*(YYDEBUG!=0)*/
int yyparse();
void yyerror(const char* fmt, ...);
/* lex.yy.l */
extern FILE* yyin;
extern FILE* yyout;
extern int yylineno;
int yylex();
void yylex_init(FILE* input_file);
#endif/*USE_BISON_FLEX*/

/* 抽選テーブルを使う場合は、USE_LOTシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_LOTで制御するように変更しました。
//#define USE_LOT /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_LOTで制御するように変更しました。
#ifdef  USE_LOT
#include "LotTbl.h"
enum{eHazure,eReplay,eBell,eCherry,eBonus};/*サンプル*/
#endif/*USE_LOT*/

/* 演出制御を使う場合は、USE_PRODシンボルを定義してください */
//{{2014/02/01削除:MakefileのUSE_PRODで制御するように変更しました。
//#define USE_PROD /*{{TODO}}*/
//}}2014/02/01削除:MakefileのUSE_PRODで制御するように変更しました。
#ifdef  USE_PROD
#include "ProdDef.h"
#include "ProdCmd.h"
#endif/*USE_PROD*/

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

#include "SlotData.h"
#include "SndSeq.h"

#define FPS			30			/* フレームレート */		//(((15+1)*21)*80)/60/30=14.93
#define SEC(s)			((int)(FPS*(s)))	/* 秒->フレーム変換 */

#define Reel_Spd		 11			/* 回転速度 */			//14や15だと絵柄サイズに近すぎて綺麗に見えないので、ズレがばらけるような回転速度に調整した。実機の73%程度の速度となる。
#define Reel_Wnd_X		  3			/* 左回胴の窓枠座標(X) */
#define Reel_Wnd_Y		  3			/* 左回胴の窓枠座標(Y) */
#define Reel_Wnd_W		 33			/* 窓枠サイズ(W) */
#define Reel_Wnd_H		 53			/* 窓枠サイズ(H) */
#define Reel_Wnd_OX		(Reel_Wnd_W+2)		/* 左回胴の窓枠座標(X)⇒中回胴の窓枠座標(X)へのオフセット(中⇒右も同じ) */
#define Reel_Pic_X		  1			/* 窓枠座標(X)⇒絵柄座標(X)へのオフセット */
#define Reel_Pic_Y		  3			/* 窓枠座標(Y)⇒上段絵柄座標(Y)へのオフセット */
#define Reel_Pic_W		 31			/* 絵柄サイズ(W) */
#define Reel_Pic_H		 15			/* 絵柄サイズ(H) */
#define Reel_Pic_OY		(Reel_Pic_H+1)		/* 上段絵柄の座標(Y)⇒中段絵柄の座標(Y)へのオフセット(中⇒下も同じ) */

#define Led_3bet_X		 43			/* 3BET LEDの座標(X) */
#define Led_3bet_Y		 61			/* 3BET LEDの座標(Y) */
#define Led_2bet_X		 43			/* 2BET LEDの座標(X) */
#define Led_2bet_Y		 63			/* 2BET LEDの座標(Y) */
#define Led_1bet_X		 43			/* 1BET LEDの座標(X) */
#define Led_1bet_Y		 65			/* 1BET LEDの座標(Y) */
#define Led_Sta_X		 93			/* START LEDの座標(X) */
#define Led_Sta_Y		 61			/* START LEDの座標(Y) */
#define Led_Rep_X		 93			/* REPLAY LEDの座標(X) */
#define Led_Rep_Y		 63			/* REPLAY LEDの座標(Y) */
#define Led_Ins_X		 93			/* INSERT LEDの座標(X) */
#define Led_Ins_Y		 65			/* INSERT LEDの座標(Y) */

#define Seg_Cre_X		 50			/* CREDIT 7SEGの座標(X) */
#define Seg_Cre_Y		 61			/* CREDIT 7SEGの座標(Y) */
#define Seg_Bns_X		 63			/* BONUS COUNT 7SEGの座標(X) */
#define Seg_Bns_Y		 61			/* BONUS COUNT 7SEGの座標(Y) */
#define Seg_Pay_X		 80			/* PAY 7SEGの座標(X) */
#define Seg_Pay_Y		 61			/* PAY 7SEGの座標(Y) */

#define Cab_1st_X		 26			/* 左停止ボタンの座標(X) */
#define Cab_1st_Y		 71			/* 左停止ボタンの座標(Y) */
#define Cab_2nd_X		 47			/* 中停止ボタンの座標(X) */
#define Cab_2nd_Y		 71			/* 中停止ボタンの座標(Y) */
#define Cab_3rd_X		 68			/* 右停止ボタンの座標(X) */
#define Cab_3rd_Y		 71			/* 右停止ボタンの座標(Y) */
#define Cab_Lev_X		  1			/* 右停止ボタンの座標(Y) */
#define Cab_Lev_Y		 71			/* 右停止ボタンの座標(Y) */
#define Cab_Max_X		  8			/* MAXBETボタンの座標(X) */
#define Cab_Max_Y		 57			/* MAXBETボタンの座標(Y) */
#define Cab_Med_X		106			/* メダル投入口の座標(X) */
#define Cab_Med_Y		 48			/* メダル投入口の座標(Y) */
#define Cab_Bns_X		110			/* BONUSランプの座標(X) */
#define Cab_Bns_Y		  3			/* BONUSランプの座標(Y) */
#define Cab_Art_X		110			/* ARTランプの座標(X) */
#define Cab_Art_Y		 26			/* ARTランプの座標(Y) */
#define Cab_NvL_X		110			/* ナビランプ(左)の座標(X) */
#define Cab_NvL_Y		 36			/* ナビランプ(左)の座標(Y) */
#define Cab_NvC_X		110			/* ナビランプ(中)の座標(X) */
#define Cab_NvC_Y		 41			/* ナビランプ(中)の座標(Y) */
#define Cab_NvR_X		110			/* ナビランプ(右)の座標(X) */
#define Cab_NvR_Y		 46			/* ナビランプ(右)の座標(Y) */

#define Dtc_Bns_X		107			/* データカウンタ:BONUS回数の座標(X) */
#define Dtc_Bns_Y		 70			/* データカウンタ:BONUS回数の座標(Y) */
#define Dtc_StG_X		107			/* データカウンタ:スタート回転数の座標(X) */
#define Dtc_StG_Y		 76			/* データカウンタ:スタート回転数の座標(Y) */
#define Dtc_Med_X		107			/* データカウンタ:持ちメダル枚数の座標(X) */
#define Dtc_Med_Y		 82			/* データカウンタ:持ちメダル枚数の座標(Y) */

/****************************************************************************
 *	app.c
 ****************************************************************************/

/* スイッチ */
#define Sw_1st		(1<<0)		/* 左停止ボタン */
#define Sw_2nd		(1<<1)		/* 中停止ボタン */
#define Sw_3rd		(1<<2)		/* 右停止ボタン */
#define Sw_Max		(1<<3)		/* MAXBETボタン */
#define Sw_Lev		(1<<4)		/* スタートレバー */
#define Sw_Med		(1<<5)		/* メダルセレクター */		//簡略化して一個とした

/* LED */
#define Led_1st		(1<< 0)		/* 左停止ボタンLED */		//┬アプリケーションタスクが描画する
#define Led_2nd		(1<< 1)		/* 中停止ボタンLED */		//│
#define Led_3rd		(1<< 2)		/* 右停止ボタンLED */		//│
#define Led_Max		(1<< 3)		/* MAXBETボタンLED */		//┘
#define Led_1bet	(1<< 4)		/* 1BET LED */			//┬メインタスクが描画する
#define Led_2bet	(1<< 5)		/* 2BET LED */			//│
#define Led_3bet	(1<< 6)		/* 3BET LED */			//│
#define Led_Sta		(1<< 7)		/* START LED */			//│
#define Led_Rep		(1<< 8)		/* REPLAY LED */		//│
#define Led_Ins		(1<< 9)		/* INSERT LED */		//┘

/* イベントタイマ */
#define EvtTmrCh_Mute	 0		/* 無操作減音タイマ */

/* ワンキー操作 */
#define Ok_Max		 1		/* MAXBETボタン押下 */
#define Ok_Max_Med	 2		/* MAXBETボタン押下⇒メダル1枚投入 */
#define Ok_Max_Med_Med	 3		/* MAXBETボタン押下⇒メダル2枚投入 */
#define Ok_Med_Med_Med	 4		/* メダル3枚投入 */
#define Ok_Med_Med	 5		/* メダル2枚投入 */
#define Ok_Med		 6		/* メダル1枚投入 */
#define Ok_Lev		 7		/* スタートレバー操作 */
#define Ok_1st		 8		/* 左停止ボタン押下 */
#define Ok_2nd		 9		/* 中停止ボタン押下 */
#define Ok_3rd		10		/* 右停止ボタン押下 */

/* オートプレイ */
#define Ap_Slow		 1		/* 低速オートプレイ */
#define Ap_Fast		 2		/* 高速オートプレイ */

/* 当選履歴 */
typedef struct _ST_History {
	uint16_t StartG :15;			/* 当選G数 */
	uint16_t BnsArt : 1;			/* 0=ボーナス,1=ART */
} ST_History;

/* アプリケーションタスク(=システムアイドルタスク) */
typedef struct _ST_App {
	EVENT*		FrmEvt;			/* フレームイベント */
	WELL		Rng;			/* 乱数生成器 */
	uint8_t		Rank;			/* 設定値 */
	uint8_t		Sw;			/* スイッチ */			//Sw_*
	uint16_t	Led;			/* LED */			//Led_*
	/* メイン⇒サブコマンド */
	uint8_t		CmdPos;			/* 読み出し位置 */		//0〜15
	uint8_t		CmdCnt;			/* 格納数 */			//0〜16
	uint16_t	CmdBuf[16/*調整可*/];	/* バッファ */
	/* データ */
	uint32_t	DspSel;			/* (ボーナス回数⇔ART回数)表示切替カウンタ */	//SEC(0)〜SEC(5)=ボーナス回数,SEC(5)〜SEC(10)=ART回数
	uint16_t	BnsNum;			/* ボーナス回数 */
	uint16_t	ArtNum;			/* ART回数 */
	uint16_t	TotalG;			/* 総回転数 */			//ボーナス中のG数は含めない
	uint16_t	StartG;			/* スタート回転数 */		//ボーナス中のG数は含めない
	uint16_t	Medal;			/* 持ちメダル枚数 */
	uint16_t	Invest;			/* 投入金額 */
	ST_History	History[10/*調整可*/];	/* 当選履歴 */
	uint16_t	HitCnt[HitCd_Size];	/* 小役当選回数 */
	 int16_t	SamHis[9999/*調整可*/];	/* 差枚数履歴 */
	uint16_t	SamHisG;		/* 差枚数履歴G数 */		//ボーナス中のG数も含める
	/* アニメーション */
	uint8_t		MedPos;			/* メダル投入口 */
	uint8_t		LevPos;			/* スタートレバー */
	uint8_t		MaxPos;			/* MAXBETボタン */
	/* ワンキー操作 */
	uint8_t		OkReady;		/* 受付可能なワンキー操作 */	//Ok_*		メインタスクが設定し、アプリケーションタスクが参照する
	uint8_t		OkExec;			/* 実行中のワンキー操作 */	//Ok_*		アプリケーションタスクが設定する
	uint8_t		OkStep;			/* 実行中のワンキー操作ステップ */
	/* オートプレイ */
	uint8_t		ApExec;			/* 実行中のオートプレイ種類 */	//Ap_*
	uint16_t	ApWait;			/* オートプレイウェイト */	//*⇒0
} ST_App;

void app_init();
void app_exit();
void update();
void schedule();
void app_main();

int LotHitCd(int iRT);
int GetHitCd_HitFlg(int iHitCd, int iHitFlg);
int GetHitFlg_Pay(int iHitFlg);

#define Cmd_GmSta	 1	/* 遊技開始 */
#define Cmd_MdBet	 2	/* メダル投入 */
#define Cmd_MdCre	 3	/* メダル貯留 */
#define Cmd_DmSta	 4	/* 遊技待機デモ */
#define Cmd_HitCd	 5	/* 条件装置 */
#define Cmd_RlSta	 6	/* 回胴開始 */
#define Cmd_BtnOn_L	 7	/* 停止ボタン押下(左) */
#define Cmd_BtnOn_C	 8	/* 停止ボタン押下(中) */
#define Cmd_BtnOn_R	 9	/* 停止ボタン押下(右) */
#define Cmd_RlStp_L	10	/* 回胴停止(左) */
#define Cmd_RlStp_C	11	/* 回胴停止(中) */
#define Cmd_RlStp_R	12	/* 回胴停止(右) */
#define Cmd_HtFlg_T	13	/* 入賞判定(上) */
#define Cmd_HtFlg_M	14	/* 入賞判定(中) */
#define Cmd_HtFlg_B	15	/* 入賞判定(下) */
#define Cmd_HtFlg_F	16	/* 入賞判定(降) */
#define Cmd_HtFlg_Z	17	/* 入賞判定(昇) */
#define Cmd_HtFlg_A	18	/* 入賞判定(谷) */
#define Cmd_HtFlg_V	19	/* 入賞判定(山) */
#define Cmd_MdPay	20	/* 払出枚数 */
#define Cmd_GmEnd	21	/* 遊技終了 */

void SendCmd(int iCmd);
int  RecvCmd();

/****************************************************************************
 *	main.c
 ****************************************************************************/

void Main_Init();

/****************************************************************************
 *	sub.c
 ****************************************************************************/

void Sub_Init();

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

#include "work.h"

#endif /*__APP_H__*/
