;* 
;*  TOPPERS/SSP Kernel
;*      Smallest Set Profile Kernel
;*
;*  Copyright (C) 2010,2011 by Naoki Saito
;*             Nagoya Municipal Industrial Research Institute, JAPAN
;* 
;*  上記著作権者は，以下の (1)〜(4) の条件を満たす場合に限り，本ソフトウェ
;*  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改変・
;*  再配布（以下，利用と呼ぶ）することを無償で許諾する．
;*  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作権
;*      表示，この利用条件および下記の無保証規定が，そのままの形でソース
;*      コード中に含まれていること．
;*  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使用
;*      できる形で再配布する場合には，再配布に伴うドキュメント（利用者マ
;*      ニュアルなど）に，上記の著作権表示，この利用条件および下記の無保
;*      証規定を掲載すること．
;*  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使用
;*      できない形で再配布する場合には，次のいずれかの条件を満たすこと．
;*    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著作
;*        権表示，この利用条件および下記の無保証規定を掲載すること．
;*    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに報
;*        告すること．
;*  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
;*      からも，上記著作権者およびTOPPERSプロジェクトを免責すること．また，
;*      本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
;*      く請求からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
;* 
;*  本ソフトウェアは，無保証で提供されているものである．上記著作権者およ
;*  びTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的に対す
;*  る適合性も含めて，いかなる保証も行わない．また，本ソフトウェアの利用
;*  により直接的または間接的に生じたいかなる損害に関しても，その責任を負
;*  わない．
;* 

;
;	プロセッサ依存モジュール アセンブリ言語部（M16C固有部分）
;
	.section	program, code, align

	; 外部で定義されているシンボル(target_support.a30)
	.glb	SIL_DLY_TIM1
	.glb	SIL_DLY_TIM2

	; 外部へ公開するシンボル
	.glb	_sil_dly_nse

;
;  微少時間待ち
;
_sil_dly_nse:
	mov.w	3H:8[sp] , r0
	mov.w	5H:8[sp] , r2
	sub.w	#(SIL_DLY_TIM1 & 0FFFFH), r0	; 下位16ビットの計算
	jgtu	_sil_dly_nse_1
	jz		_sil_dly_nse_2

; 下位16ビットが負  → {(r2の上位-1) - SIL_DLY_TIM1の上位} が負ならリターン
	sub.w	#(((SIL_DLY_TIM1 >> 16)+1) & 0FFFFH), r2
	jltu	sil_dly_nse_ret
	jmp		sil_dly_nse_loop
; 下位16ビットが0より大	→ {r2の上位 - SIL_DLY_TIM1の上位} が負ならリターン
_sil_dly_nse_1:
	sub.w	#((SIL_DLY_TIM1 >> 16) & 0FFFFH), r2
	jgeu	sil_dly_nse_loop ; 正または0 の場合
	jmp		sil_dly_nse_ret  ; 負の場合(SIL_DLY_TIM1 が大きい場合でないとここにこない)
; 下位16ビットが0  →  {r2の上位 - SIL_DLY_TIM1の上位} が0または負ならリターン
_sil_dly_nse_2:
	sub.w	#((SIL_DLY_TIM1 >> 16) & 0FFFFH), r2
	jleu	sil_dly_nse_ret

; dlytim - SIL_DLY_TIM1 > 0より大きい場合
sil_dly_nse_loop:
	sub.w	#(SIL_DLY_TIM2 & 0FFFFH), r0	; 下位16ビットの計算
	jgtu	sil_dly_nse_loop_1
	jz		sil_dly_nse_loop_2

; 下位16ビットが負	→ (r2 の上位-1)が負ならリターン
	sub.w	#(((SIL_DLY_TIM2 >> 16)+1) & 0FFFFH), r2
	jltu	sil_dly_nse_ret
	jmp		sil_dly_nse_loop

; 下位16ビットが0より大	→上位が負ならリターン
sil_dly_nse_loop_1:
	sub.w	#((SIL_DLY_TIM2 >> 16) & 0FFFFH), r2
	jgeu 	sil_dly_nse_loop  ; r2 が SIL_DLY_TIM2の上位 と同じか，より大きい
	jmp  	sil_dly_nse_ret   ; r2 が SIL_DLY_TIM2の上位 より小さい(ほとんどありえない)

; 下位16ビットが0		→上位が0以下ならリターン
sil_dly_nse_loop_2:
	sub.w	#((SIL_DLY_TIM2 >> 16) & 0FFFFH), r2
	jleu	sil_dly_nse_ret
	jmp		sil_dly_nse_loop

sil_dly_nse_ret:
	rts

	.end
	