$ 
$  TOPPERS/SSP Kernel
$      Smallest Set Profile Kernel
$ 
$  Copyright (C) 2011 by Naoki Saito
$             Nagoya Municipal Industrial Research Institute, JAPAN
$ 
$  上記著作権者は,以下の (1)~(4) の条件を満たす場合に限り,本ソフトウェ
$  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
$  再配布(以下,利用と呼ぶ)することを無償で許諾する.
$  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
$      表示,この利用条件および下記の無保証規定が,そのままの形でソース
$      コード中に含まれていること.
$  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
$      できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
$      ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
$      証規定を掲載すること.
$  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
$      できない形で再配布する場合には,次のいずれかの条件を満たすこと.
$    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
$        権表示,この利用条件および下記の無保証規定を掲載すること.
$    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
$        告すること.
$  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
$      からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
$      本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
$      く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
$ 
$  本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
$  びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
$  る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
$  により直接的または間接的に生じたいかなる損害に関しても,その責任を負
$  わない.
$ 

$ 
$  アーキテクチャ依存テンプレート(M32C(むしろ,アセンブラAS308)固有部分)
$ 

$ 
$  アセンブラ出力ファイル (共通部分)
$ 

$FILE "kernel_cfg_asm.a30"$

;$NL$
;  M16Cアーキテクチャ依存出力ファイル$NL$
;$NL$
;  割込みベクタ及び割込みハンドラ定義$NL$
;$NL$
$NL$$NL$


$ 
$  割込み入口処理
$ 

$ 
$  共通関数の宣言
$ 

$TAB$.section program, code, align	$NL$
$TAB$.glb __kernel_interrupt_entry	$NL$$NL$

$ 
$  割込みハンドラ入口処理
$ 

$FOREACH inhno INHNO_RANGE$
	$IF LENGTH(INH.INHNO[inhno])$
		$TAB$.glb	_$INH.INTHDR[inhno]$	$NL$
		$TAB$.glb	__kernel_$INH.INTHDR[inhno]$_$+INH.INHNO[inhno]$_entry	$NL$
		__kernel_$INH.INTHDR[inhno]$_$+INH.INHNO[inhno]$_entry:				$NL$
		$TAB$pushm	r0,r1,r2,r3,a0,a1,sb,fb		; レジスタをタスクスタックへ退避 $NL$
		$TAB$mov.l	#_$INH.INTHDR[inhno]$, a0 ; ハンドラのアドレスをa0へ $NL$
 		$IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
			$TAB$jmp    	__kernel_interrupt_entry	; 共通ルーチンへ $NL$
			$NL$$NL$
 		$ELSE$
			$TAB$jsri.a 	a0                   ; 割込みハンドラ呼び出し$NL$
			$TAB$popm   	r0,r1,r2,r3,a0,a1,sb,fb 	; レジスタ復帰 $NL$
			$TAB$reit$NL$
			$NL$$NL$
 		$END$
	$END$
$END$


$ 
$  CPU例外ハンドラ入口処理
$ 

$FOREACH excno EXCNO_RANGE$
	$IF LENGTH(EXC.EXCNO[excno])$
		$TAB$.glb	_$EXC.EXCHDR[excno]$$NL$
		$TAB$.glb	__kernel_$EXC.EXCHDR[excno]$_$+EXC.EXCNO[excno]$_entry	$NL$
		__kernel_$EXC.EXCHDR[excno]$_$+EXC.EXCNO[excno]$_entry:				$NL$
		$TAB$pushm	r0,r1,r2,r3,a0,a1,sb,fb 	; レジスタをタスクスタックへ退避 $NL$
		$TAB$stc  	isp, r3r1               	; スタックポインタをスタックへ   $NL$
		$TAB$push.l	r3r1	$NL$
		$TAB$mov.l	#_$EXC.EXCHDR[excno]$, a0   ; ハンドラのアドレスをa0へ $NL$
		$TAB$jmp	__kernel_interrupt_entry	; 共通ルーチンへ $NL$
		$NL$$NL$
	$END$
$END$


$ 
$  可変ベクタテーブル
$ 

;$NL$
;  可変ベクタテーブル$NL$
;$NL$
$NL$

$TAB$.glb $TAB$ _start$NL$
$TAB$.glb $TAB$ _unused_interrupt $NL$
$TAB$.section vvector$NL$$NL$
vvector_table:$NL$
$FOREACH inhno INHNO_RANGE$
	$IF LENGTH(INH.INHNO[inhno])$
		$inhhdr = CONCAT(CONCAT("_kernel_" , CONCAT(INH.INTHDR[inhno] , "_")) , CONCAT(+INH.INHNO[inhno] , "_entry"))$
	$ELSE$
		$inhhdr = "unused_interrupt"$
	$END$
	$TAB$.lword$TAB$_$inhhdr$ $TAB$ $TAB$ $FORMAT("; %02d" , inhno)$ $NL$
$END$

$ 
$  固定ベクタテーブル
$ 
$FOREACH excno EXCNO_RANGE$
	$IF LENGTH(EXC.EXCNO[excno])$
		$EXCHDR[excno] = CONCAT(CONCAT("_kernel_" , CONCAT(EXC.EXCHDR[excno] , "_")) , CONCAT(+EXC.EXCNO[excno] , "_entry"))$
	$ELSE$
		$EXCHDR[excno] = "unused_interrupt"$
	$END$
$END$

$NL$
;$NL$
;  固定ベクタテーブル$NL$
;$NL$
$NL$

$TAB$ .section fvector$NL$
$NL$
fvector_table:$NL$
$TAB$ .lword$TAB$ _$EXCHDR[0]$ $TAB$ $TAB$;$SPC$ 0 $SPC$$NL$
$TAB$ .lword$TAB$ _$EXCHDR[1]$ $TAB$ $TAB$;$SPC$ 1 $SPC$$NL$
$TAB$ .lword$TAB$ _$EXCHDR[2]$ $TAB$ $TAB$;$SPC$ 2 $SPC$$NL$
$TAB$ .lword$TAB$ _$EXCHDR[3]$ $TAB$ $TAB$;$SPC$ 3 $SPC$$NL$
$TAB$ .lword$TAB$ 0FFFFFFH $TAB$ $TAB$;$SPC$ Reserved $SPC$$NL$
$TAB$ .lword$TAB$ _$EXCHDR[5]$ $TAB$ $TAB$ ;$SPC$ 5 $SPC$$NL$
$TAB$ .lword$TAB$ 0FFFFFFH $TAB$ $TAB$ ;$SPC$ Reserved $SPC$$NL$
$TAB$ .lword$TAB$ _$EXCHDR[7]$ $TAB$ $TAB$ ;$SPC$ 7 $SPC$$NL$
$TAB$ .lword		_start ; 8

$NL$ $NL$

	$TAB$.end
$NL$