;
;  TOPPERS/JSP Kernel
;      Toyohashi Open Platform for Embedded Real-Time Systems/
;      Just Standard Profile Kernel
;
;  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
;                              Toyohashi Univ. of Technology, JAPAN
;  Copyright (C) 2001-2007 by Industrial Technology Institute,
;                              Miyagi Prefectural Government, JAPAN
;
;  上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation
;  によって公表されている GNU General Public License の Version 2 に記
;  述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
;  を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
;  利用と呼ぶ）することを無償で許諾する．
;  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
;      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
;      スコード中に含まれていること．
;  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
;      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
;      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
;      の無保証規定を掲載すること．
;  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
;      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
;      と．
;    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
;        作権表示，この利用条件および下記の無保証規定を掲載すること．
;    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
;        報告すること．
;  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
;      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
;
;  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
;  よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
;  含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
;  接的または間接的に生じたいかなる損害に関しても，その責任を負わない．
;
;  @(#) $Id: start.src,v 1.7 2007/03/23 07:58:33 honda Exp $
;

;   H8用スタートアップモジュール
;   　カーネルはアプリケーションとリンクして使用するので、
;   　このモジュールはJSPカーネル起動時のみ使用する。

        .CPU 300HA

        ; STARTOF演算子、SIZEOF演算子を有効にするためのセクション宣言
        .SECTION D,DATA,ALIGN=2
        .SECTION R,DATA,ALIGN=2
        .SECTION B,DATA,ALIGN=2

        .SECTION P,CODE,ALIGN=2

        .INCLUDE "sys_config_asm.inc"
        .INCLUDE "cpu_config_asm.inc"

        .IMPORT _kernel_start

 .AIFDEF HARDWARE_INIT_HOOK
        .IMPORT HARDWARE_INIT_HOOK
 .AENDI ; HARDWARE_INIT_HOOK

 .AIFDEF SOFTWARE_INIT_HOOK
        .IMPORT SOFTWARE_INIT_HOOK
 .AENDI ; SOFTWARE_INIT_HOOK

 .AIFDEF WITHOUT_INNER_RAM
        .GLOBAL start_1
 .AENDI ; WITHOUT_INNER_RAM


        .GLOBAL _start
_start:
        ;
        ; 非タスクコンテキストのスタックポインタをSTACKTOPに初期化する
        ; 　H8ではリセット時にスタックポインタが初期化されないため、
        ; 　スタートアップルーチンの先頭で初期化する必要がある
        ; 　（STACKTOPは、user_config_asm.incで定義）
        ;
        mov.l   #STACKTOP, sp

        ;
        ; モードコントロールレジスタMDCRの読み出し
        ; 　E10T上で実行する際に必要な初期化処理
        ;
 .AIFDEF E10T
        mov.b   @H8MDCR, er0
 .AENDI ; E10T

        ;
        ;  CCRを初期化する。（割込み禁止）
        ;
        orc.b   #CCR_DISINT_ALL, ccr

        ;
        ;  ハードウェア初期化関数の呼び出し
        ;
        ;  ハードウェア依存に必要な初期化処理がある場合は，
        ;  ハードウェア初期化関数を用意し、その先頭アドレスを
        ;  HARDWARE_INIT_HOOKマクロとして定義する。
        ;  具体的にはROM化の際、RAMを使用可能にするための
        ;  バス・ステート・コントローラの初期化等を行う。
        ;  ハードウェア初期化関数の実装はsys_support.src 内で行い、
        ;　HARDWARE_INIT_HOOKマクロをsys_config_asm.incで定義する
        ;　のを標準とする。

 .AIFDEF HARDWARE_INIT_HOOK
start_0:
 .AIFDEF WITHOUT_INNER_RAM
         ;　内蔵RAMを使用しない場合は、外部RAMが有効にならないとスタッ
         ;　クエリアが使えない。そのため、戻り番地をスタックに積むH8プ
         ;　ロセッサの関数呼び出しは（アセンブラであっても）このタイミ
         ;　ングではまだできない。つまり、HARDWARE_INIT_HOOKからは無
         ;　条件分岐命令で戻ってくる。
         ;　（ラベルstart_1をエクスポートする。）

        jmp     @HARDWARE_INIT_HOOK
 .AELSE ; WITHOUT_INNER_RAM
        jsr     @HARDWARE_INIT_HOOK
 .AENDI ; WITHOUT_INNER_RAM

 .AENDI ; HARDWARE_INIT_HOOK


         ; Bセクションをクリア
start_1:
        mov.l   @_bss_start_k, er0
        mov.l   @_end_k, er1
        sub.l   er2, er2
start_2:
        mov.l   er2, @er0
        add.l   #4, er0
        cmp.l   er1, er0
        blo     start_2         ; er1 > er0

        ;
        ;  Dセクションを初期化する（ROM化対応）．
        ;
        ;  __idata_start から __idata_end までを，__data_start 以降に
        ;  コピーする．
        ;  
        ;  eepmov.w命令を使う方が効率的だが、最大転送バイト数が
        ;  65,535バイトに制限されるため、使用していない。
start_3:
        mov.l   @__idata_start_k, er0
        mov.l   @__idata_end_k, er1
        mov.l   @__data_start_k, er2
start_4:
        mov.l   @er0+, er4      ; *er2++ = *er0 ++;
        mov.l   er4, @er2
        add.l   #4, er2
        cmp.l   er1, er0
        blo     start_4         ; er1 > er0

        ;
        ;  ソフトウェア環境初期化関数の呼び出し
        ;
        ;  ソフトウェア環境（特にライブラリ）に依存して必要な初期化処
        ;  理がある場合は，ソフトウェア環境初期化関数を用意し、その先頭
        ;  アドレスをSOFTWARE_INIT_HOOKマクロとして定義する。
        ;  software_init_hook関数の実装はsys_support.src 内で行い、
        ;　SOFTWARE_INIT_HOOKマクロをuser_config_asm.incで定義する
        ;　のを標準とする。
 .AIFDEF SOFTWARE_INIT_HOOK
start_5:
        jsr     @SOFTWARE_INIT_HOOK
 .AENDI ; SOFTWARE_INIT_HOOK

        ;  カーネルを起動する

start_6:
        jmp     @_kernel_start


        .ALIGN 4
_bss_start_k:
        .DATA.L   STARTOF B
_end_k:
        .DATA.L   STARTOF B   +   SIZEOF B
__idata_start_k:
        .DATA.L   STARTOF D
__idata_end_k:
        .DATA.L   STARTOF D   +   SIZEOF D
__data_start_k:
        .DATA.L   STARTOF R

        .END
