;* 
;*  TOPPERS/SSP Kernel
;*      Smallest Set Profile Kernel
;*
;*  Copyright (C) 2010 by Naoki Saito
;*             Nagoya Municipal Industrial Research Institute, JAPAN
;* 
;*  上記著作権者は，以下の (1)〜(4) の条件を満たす場合に限り，本ソフトウェ
;*  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改変・
;*  再配布（以下，利用と呼ぶ）することを無償で許諾する．
;*  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作権
;*      表示，この利用条件および下記の無保証規定が，そのままの形でソース
;*      コード中に含まれていること．
;*  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使用
;*      できる形で再配布する場合には，再配布に伴うドキュメント（利用者マ
;*      ニュアルなど）に，上記の著作権表示，この利用条件および下記の無保
;*      証規定を掲載すること．
;*  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使用
;*      できない形で再配布する場合には，次のいずれかの条件を満たすこと．
;*    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著作
;*        権表示，この利用条件および下記の無保証規定を掲載すること．
;*    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに報
;*        告すること．
;*  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
;*      からも，上記著作権者およびTOPPERSプロジェクトを免責すること．また，
;*      本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
;*      く請求からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
;* 
;*  本ソフトウェアは，無保証で提供されているものである．上記著作権者およ
;*  びTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的に対す
;*  る適合性も含めて，いかなる保証も行わない．また，本ソフトウェアの利用
;*  により直接的または間接的に生じたいかなる損害に関しても，その責任を負
;*  わない．
;* 

;/*	定数定義（初期化）*/
;
	;
	;  メモリマップの定義(ターゲット依存部)
	;
	.include	sectr8c.inc
;
;************************************************
;*	初期化ルーチン                              *
;************************************************
	.section	program, code, align
	.glb		_start
	.glb		_sta_ker
	.glb		_software_init_hook
	.glb		_hardware_init_hook
	.glb		__kernel_istkpt

_start:
	mov.w	#(__kernel_istkpt & 0FFFFH), a0			; 割り込みスタックポインタセット
	mov.w	#((__kernel_istkpt >> 16) & 0FFFFH), a1	; (_kernel_istkpt は kernel_cfg.c)
	lde.w	[a1a0], r0
	ldc		r0,isp					; 割り込みスタックポインタセット
	ldc		#0000h, flg				; bank#0,割り込み禁止,ISP使用
	ldintb	#VVECTOR_TOP			; ベクタテーブルの設定(VVECTOR_TOP は sectm32c.inc)

;------ ハードウェア固有の初期化ルーチンの呼出し
	mov.w	#(_hardware_init_hook & 0FFFFH), a0	; _hardware_init_hook は target_support.a30 で定義
	mov.w	#((_hardware_init_hook >> 16) & 0FFFFH), a1
	cmp.w	#0, a0
	jnz		hw_init
	cmp.w	#0, a1
	jz		init_data_NE
hw_init:
	jsri.a	a1a0

;------ DATA領域の初期化 ------
init_data_NE:
	mov.w	#(sizeof data_NE), r3
	jz		init_data_NO			; サイズ0なら初期化必要なし
	mov.w	#(topof data_NEI & 0FFFFH), a0
	mov.b	#((topof data_NEI >> 16) & 000FFH), r1h
	mov.w	#(topof data_NE), a1
	smovf.b

init_data_NO:
	mov.w	#(sizeof data_NO), r3
	jz		clear_bss				; サイズ0なら初期化必要なし
	mov.w	#(topof data_NOI & 0FFFFH), a0
	mov.b	#((topof data_NOI >> 16) & 000FFH), r1h
	mov.w	#(topof data_NO), a1
	smovf.b


;------ BSS領域の初期化 ------
clear_bss:
	mov.b	#0, r0l
	mov.w	#(topof bss_NE & 0ffffh), a1
	mov.w	#(sizeof bss_NE) , r3
	sstr.b

	mov.w	#(topof bss_NO & 0ffffh), a1
	mov.w	#(sizeof bss_NO) , r3
	sstr.b

;*  software_init_hook を呼出し（0 でない場合）
;*
;*  ソフトウェア環境（特にライブラリ）に依存して必要な初期化処
;*  理がある場合は，software_init_hook という関数を用意すれば
;*  よい．R8Cの場合，software_init_hook の定義は target_support.a30 に用意されており，
;*  利用する場合はマクロ EXTERN_SOFT_HOOK を 1 に定義してビルドする．
	mov.w	#(_software_init_hook & 0FFFFH), a0
	mov.w	#((_software_init_hook >> 16) & 0FFFFH), a1
	cmp.w	#0, a0
	jnz		sw_init
	cmp.w	#0, a1
	jz		kernel_link
sw_init:
	jsri.a	a1a0

;;
;***** カーネル初期化処理へ	*****
kernel_link:
	jmp 	_sta_ker	; --> _sta_ker()

;
	.end
