
/////////////////////////////////////////////////////////////////////////////
//
//             /
//      -  P  /  E  C  E  -
//           /                 mobile equipment
//
//              System Programs
//
//
// PIECE LIBRARY : pceapi : Ver 1.00
//
// Copyright (C)2001 AUQAPLUS Co., Ltd. / OeRSTED, Inc. all rights reserved.
//
// Coded by MIO.H (OeRSTED)
//
// Comments:
//
//	○アプリケーション・ヘッダー
//	○スタート・アップ
//
//  v1.00 2001.11.09 MIO.H
//  v1.06 2001.11.23 MIO.H スタックサイズ指定に対応
//  v1.09 2001.11.30 MIO.H バージョン・チェック
//
//	* Tue Jan 08 12:18:40 JST 2008 Naoyuki Sawa
//	- \usr\PIECE\lib\cstart.oの代わりに使う、カスタムスタートアップルーチンです。
//	  カスタムスタートアップルーチンを使うために、リンカオプション-nodefsupが必要です。
//	  (2008/01/08対応済みです。clip.mkの中で、LDFLAGSにて指定するようにしました。)
//	- カスタムスタートアップルーチンが必要となった理由は、以下のとおりです。
//	  これまでは、ベクタ領域のFRAMコードには除算だけを転送していたのですが、
//	  今後、memset()とmemcpy()もベクタ領域のFRAMコードに転送することにしました。
//	  アプリケーションのコードとして最初に呼ばれるpceAppInit00()がmemset()を呼び出しているので、
//	  これまでのように、pceAppInit()で転送したのでは、間に合わなくなりました。
//	  pceAppInit00()がmemset()を呼び出す前に、ベクタ領域のFRAMコードを転送する必要が生じました。
//	  そのため、カスタムスタートアップルーチンを使用し、pceAppInit00()の先頭で転送することにしました。
//	- ここで、FRAM4領域のFRAMコードも転送することも可能\ですが、サイズ超過時のDIE()ができないこと、
//	  FRAM4領域のFRAMコードは緊急性が少ないことから、これまでどおりapp_init()で転送することにします。
//

#if 0 /*{{N.SAWA*/
//#include <piece.h>
//#include <string.h>
#else /*}}N.SAWA{{*/
#include "clip.h"
#endif /*}}N.SAWA*/

extern unsigned char __START_DEFAULT_BSS[];
extern unsigned char __END_DEFAULT_BSS[];
extern unsigned char __SIZEOF_DEFAULT_BSS[];

extern unsigned char _stacklen[];

extern void pceAppInit( void );
extern void pceAppProc( int cnt );
extern void pceAppExit( void );
extern int pceAppNotify( int type, int param );

extern int __version_check( int opef );

static void pceAppInit00( void );
static void pceAppProc00( int cnt );
static void pceAppExit00( void );
static int pceAppNotify00( int type, int param );

static const pceAPPHEAD pceAppHead = {
	APPSIG,
	APPSYSVER,
	0,
	pceAppInit00,
	pceAppProc00,
	pceAppExit00,
	pceAppNotify00,
	(unsigned long)_stacklen,
	__END_DEFAULT_BSS,
};

static void pceAppInit00( void )
{
#if 1 /*{{N.SAWA*/
	// ベクタ領域のFRAMコードを転送します。
	extern void idiv_init(); /* clipidiv.s */
	idiv_init();
#endif /*}}N.SAWA*/
	// bss領域をゼロクリアします
#if 0 /*{{N.SAWA*/
//	memset( __START_DEFAULT_BSS, 0, __SIZEOF_DEFAULT_BSS );
#else /*}}N.SAWA{{*/
	memset( __START_DEFAULT_BSS, 0, (int)__SIZEOF_DEFAULT_BSS );
#endif /*}}N.SAWA*/
	if ( __version_check(0) ) return;
	pceAppInit();
}

static void pceAppProc00( int cnt )
{
	if ( __version_check(cnt) ) return;
	pceAppProc( cnt );
}

static void pceAppExit00( void )
{
	if ( __version_check(0) ) return;
	pceAppExit();
}

static int pceAppNotify00( int type, int param )
{
	if ( __version_check(0) ) return APPNR_IGNORE;
	return pceAppNotify( type, param );
}


