;*
;*  TOPPERS/ASP Kernel
;*      Toyohashi Open Platform for Embedded Real-Time Systems/
;*      Advanced Standard Profile Kernel
;* 
;*  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
;*                              Toyohashi Univ. of Technology, JAPAN
;*  Copyright (C) 2001 by OAKS16KIT support
;*  Copyright (C) 2003-2004 by Naoki Saito
;*             Nagoya Municipal Industrial Research Institute, JAPAN
;*  Copyright (C) 2003-2004 by Ryosuke Takeuchi
;*               Platform Development Center RICOH COMPANY,LTD. JAPAN
;*  Copyright (C) 2008-2010 by Witz Corporation, JAPAN
;*  Copyright (C) 2013      by Mitsuhiro Matsuura
;* 
;*  上記著作権者は，Free Software Foundation によって公表されている 
;*  GNU General Public License の Version 2 に記述されている条件か，以
;*  下の(1)～(4)の条件を満たす場合に限り，本ソフトウェア（本ソフトウェ
;*  アを改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
;*  利用と呼ぶ）することを無償で許諾する．
;*  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
;*      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
;*      スコード中に含まれていること．
;*  (2) 本ソフトウェアを再利用可能なバイナリコード（リロケータブルオブ
;*      ジェクトファイルやライブラリなど）の形で利用する場合には，利用
;*      に伴うドキュメント（利用者マニュアルなど）に，上記の著作権表示，
;*      この利用条件および下記の無保証規定を掲載すること．
;*  (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
;*      み込んだ形で利用する場合には，次のいずれかの条件を満たすこと．
;*    (a) 利用に伴うドキュメント（利用者マニュアルなど）に，上記の著作
;*        権表示，この利用条件および下記の無保証規定を掲載すること．
;*    (b) 利用の形態を，別に定める方法によって，上記著作権者に報告する
;*        こと．
;*  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
;*      害からも，上記著作権者を免責すること．
;* 
;*  本ソフトウェアは，無保証で提供されているものである．上記著作権者は，
;*  本ソフトウェアに関して，その適用可能性も含めて，いかなる保証も行わ
;*  ない．また，本ソフトウェアの利用により直接的または間接的に生じたい
;*  かなる損害に関しても，その責任を負わない．

	.section	P, CODE


	.glb	_hardware_init_hook
	.glb	_software_init_hook


_hardware_init_hook:
	;
	;  動作モード設定
	;
	;  動作モードはボード上の端子によって決定されるため,
	;  ここでは特別設定しない.
	;  ただし, リトルエンディアン/シングルチップモード
	;  であることを前提とする.
	;
	;  またリセット後, 内蔵ROM：有効, 内蔵RAM：有効, 外部バス：無効
	;  である.
	;

	;
	;  クロック設定
	;
	;  入力：12MHz
	;  PLL回路：12 x 8 = 96MHz
	;  システムクロック：96MHz
	;  周辺モジュールクロック：48MHz
	;  外部バスクロック：96MHz
	;  とする.
	;

	;PORT3.PDR.BIT.B6 = 0;
	MOV.L	#08C003H,R11
	MOV.B	[R11],R10
	BCLR	#6,R10
	MOV.B	R10,[R11]
	;PORT3.PDR.BIT.B7 = 0;
	MOV.L	#08C003H,R11
	MOV.B	[R11],R10
	BCLR	#7,R10
	MOV.B	R10,[R11]
	;PORT3.PMR.BIT.B6 = 0;
	MOV.L	#08C003H,R11
	MOV.B	60H[R11],R10
	BCLR	#6,R10
	MOV.B	R10,60H[R11]
	;PORT3.PMR.BIT.B7 = 0;
	MOV.L	#08C003H,R11
	MOV.B	60H[R11],R10
	BCLR	#7,R10
	MOV.B	R10,60H[R11]
	;
	;SYSTEM.PRCR.WORD = 0xa503;
	MOV.L	#080000H,R10
	MOV.W	#-5AFDH,03FEH[R10]
	;
	;while(SYSTEM.MOFCR.BIT.MOFXIN == 0)
	BRA.B	_hardware_init_hook_01
	;SYSTEM.MOFCR.BIT.MOFXIN = 1;	// メインクロック発振器強制発振
_hardware_init_hook_00:
	MOV.L	#080000H,R11
	MOV.B	0C293H[R11],R10
	BSET	#0,R10
	MOV.B	R10,0C293H[R11]
_hardware_init_hook_01:
	MOV.L	#080000H,R10
	MOV.B	0C293H[R10],R10
	AND		#1H,R10
	MOVU.B	R10,R10
	CMP		#0H,R10
	BEQ.B	_hardware_init_hook_00
	;
	;while(SYSTEM.MOSCCR.BIT.MOSTP == 1)
	BRA.B	_hardware_init_hook_11
	;SYSTEM.MOSCCR.BIT.MOSTP = 0;	// メインクロック発振器動作
_hardware_init_hook_10:
	MOV.L	#080000H,R11
	MOV.B	32H[R11],R10
	BCLR	#0,R10
	MOV.B	R10,32H[R11]
_hardware_init_hook_11:
	MOV.L	#080000H,R10
	MOV.B	32H[R10],R10
	AND		#1H,R10
	MOVU.B	R10,R10
	CMP		#0H,R10
	BNE.B	_hardware_init_hook_10
	;
	;SYSTEM.PLLCR.BIT.STC = 0x0f;
	MOV.L	#080000H,R10
	MOV.W	28H[R10],R11
	AND		#-3F01H,R11
	OR		#0F00H,R11
	MOV.W	R11,28H[R10]
	;SYSTEM.PLLCR2.BIT.PLLEN = 0;
	MOV.L	#080000H,R11
	MOV.B	2AH[R11],R10
	BCLR	#0,R10
	MOV.B	R10,2AH[R11]
	;
	;SYSTEM.SCKCR.LONG = 0x21021211;
	MOV.L	#080000H,R10
	MOV.L	#21021211H,20H[R10]
	;
	;SYSTEM.SCKCR3.BIT.CKSEL = 4;		// PLL回路選択
	MOV.L	#080000H,R10
	MOV.W	26H[R10],R11
	AND		#-0701H,R11
	OR		#0400H,R11
	MOV.W	R11,26H[R10]

	;
	;  モジュールストップ
	;
	;  リセット後, 動作している内蔵周辺モジュールはDMAC, DTC,
	;  内蔵RAMのみである.
	;  それ以外の内蔵周辺モジュールに関しては使用する側で
	;  設定すること.
	;

	;SYSTEM.PRCR.WORD = 0xa500;
	MOV.L	#080000H,R10
	MOV.W	#-5B00H,03FEH[R10]
	rts


_software_init_hook:
	;
	;  本コンパイラではweak definitionの機能が無いため,
	;  特に必要な処理はないが, 必ず呼び出すこととする.
	;
	rts


	.end

