; ; TOPPERS/SSP Kernel ; Smallest Set Profile Kernel ; ; Copyright (C) 2014 by Naoki Saito ; Nagoya Municipal Industrial Research Institute, JAPAN ; ; 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ ; ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・ ; 再配布(以下,利用と呼ぶ)することを無償で許諾する. ; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権 ; 表示,この利用条件および下記の無保証規定が,そのままの形でソース ; コード中に含まれていること. ; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用 ; できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ ; ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保 ; 証規定を掲載すること. ; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用 ; できない形で再配布する場合には,次のいずれかの条件を満たすこと. ; (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作 ; 権表示,この利用条件および下記の無保証規定を掲載すること. ; (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報 ; 告すること. ; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害 ; からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また, ; 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ ; く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること. ; ; 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ ; びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す ; る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用 ; により直接的または間接的に生じたいかなる損害に関しても,その責任を負 ; わない. ; ; ; ; スタートアップルーチン ; プロセッサはS2コア,ミディアムモデルを対象とする ; ; ; グローバルシンボル ; ; セグメント先頭アドレス(segment_s.asm) extrn _@R_INIT, _@R_INIS, _@RLINIT extrn _@INIT, _@DATA, _@INIS, _@DATS, _@INITL, _@DATAL ; セグメント末尾アドレス(segment_e.asm) extrn _?R_INIT, _?R_INIS, _?RLINIT extrn _?INIT, _?DATA, _?INIS, _?DATS, _?INITL, _?DATAL ; スタックポインタの初期値(kernel_cfg.c) extrn __kernel_istkpt ; カーネル開始処理(kernel/startup.c) extrn _sta_ker ; saddr領域の先頭アドレス,サイズ(リンカで定義) extrn _@SADBEG, _@SADSIZ ; エントリポイント public _start ; ; 定数定義 ; ; MAA(PMCのビット0): 0 または 1 ; 0の場合,00000H--0FFFFH を F0000H--FFFFFHへミラー ; 1の場合,10000H--1FFFFH を F0000H--FFFFFHへミラー INIT_MAA EQU 0 ; ; マクロ定義 ; ; セグメント間のデータコピー(farのROMからnearのRAMへ,srcのサイズ分) copy_seg macro src, dst local _1, _2 mov es, #highw _@&src movw hl, #loww _@&src movw de, #loww _@&dst br $_2 _1: mov a, es:[hl] mov [de], a incw hl incw de _2: movw ax, hl cmpw ax, #loww _?&src bnz $_1 endm ; セグメント間のデータコピー(farのROMからfarのRAMへ,srcのサイズ分) copy_fseg MACRO src, dst local _1, _2 movw hl, #loww _@&src movw de, #loww _@&dst br $_2 _1: mov es, #highw _@&src mov a, es:[hl] mov es, #highw _@&dst mov es:[de], a incw hl incw de _2: movw ax, hl cmpw ax, #loww _?&src bnz $_1 endm ; セグメントのデータクリア(near RAM) clear_seg MACRO dst local _1, _2 mov es, #0fh movw hl, #loww _@&dst movw ax, #loww _?&dst br $_2 _1: mov [hl+0], #0 incw hl _2: cmpw ax, hl bnz $_1 endm ; セグメントのデータクリア(far RAM) clear_fseg MACRO dst local _1, _2 mov es, #highw _@&dst movw hl, #loww _@&dst movw ax, #loww _?&dst br $_2 _1: mov es:[hl+0], #0 incw hl _2: cmpw ax, hl bnz $_1 endm ; ; システム開始 ; @@CODE CSEG BASE _start: ; ; PSWの設定 ; di ; 割込み禁止(割込みロック相当の割込み禁止) sel rb0 ; レジスタバンク(RB0) ; ; ミラー領域の設定 ; mov a, #INIT_MAA mov1 cy, a.0 mov1 maa, cy ; ; スタックポインタの設定 ; movw de, #__kernel_istkpt mov es, #00H movw ax, es:[de] movw sp, ax ; ; _hardware_init_hook の呼び出し(もしあれば) ; ;call !!_hardware_init_hook ; ; メモリ初期化 ; copy_seg R_INIS, INIS copy_seg R_INIT, INIT copy_fseg RLINIT, INITL clear_seg DATS clear_seg DATA clear_fseg DATAL ; saddr領域の初期化 mov b,#_@SADSIZ clrw ax saddr_init_loop: dec b dec b movw _@SADBEG[b], ax bnz $saddr_init_loop ; ; _sofrware_init_hook の呼び出し(もしあれば) ; ;call !!_software_init_hook ; ; sta_ker (kernel/startup.c) の呼び出し ; br !!_sta_ker _loop: br $_loop END