Changeset 315 for rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/prc_support.S
- Timestamp:
- Jul 23, 2017, 2:29:40 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/prc_support.S
-
Property svn:mime-type
changed from
text/plain
totext/gas; charset=UTF-8
r313 r315 11 11 ; Copyright (C) 2013 by Mitsuhiro Matsuura 12 12 ; 13 ; ä¸è¨èä½æ¨©è 14 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 15 ; ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 16 ; å¤ã»åé 17 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 18 ; (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 19 ; 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 20 ; ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 21 ; (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 22 ; ç¨ã§ããå½¢ã§åé 23 å¸ããå ´åã«ã¯ï¼åé 24 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 25 ; è 26 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 27 ; ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 28 ; (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 29 ; ç¨ã§ããªãå½¢ã§åé 30 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 31 ; ã¨ï¼ 32 ; (a) åé 33 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 34 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 35 ; ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 36 ; (b) åé 37 å¸ã®å½¢æ 38 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 39 ; å ±åãããã¨ï¼ 40 ; (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 41 ; 害ãããï¼ä¸è¨èä½æ¨©è 42 ããã³TOPPERSããã¸ã§ã¯ããå 43 責ãããã¨ï¼ 44 ; ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 45 ; ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 46 ããã³TOPPERSããã¸ã§ã¯ãã 47 ; å 48 責ãããã¨ï¼ 13 ; 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 14 ; ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 15 ; 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 16 ; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 17 ; 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 18 ; スコード中に含まれていること. 19 ; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 20 ; 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 21 ; 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 22 ; の無保証規定を掲載すること. 23 ; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 24 ; 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 25 ; と. 26 ; (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 27 ; 作権表示,この利用条件および下記の無保証規定を掲載すること. 28 ; (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 29 ; 報告すること. 30 ; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 31 ; 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 32 ; また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 33 ; 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 34 ; 免責すること. 49 35 ; 50 ; æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 51 ã 52 ; ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 53 ; ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 54 ; ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 55 ; ã®è²¬ä»»ãè² ããªãï¼ 36 ; 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 37 ; よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 38 ; に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 39 ; アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 40 ; の責任を負わない. 56 41 ; 57 42 ; @(#) $Id$ … … 59 44 60 45 ; 61 ; ããã»ããµä¾åã¢ã¸ã¥ã¼ã« ã¢ã»ã³ããªè¨èªé¨ï¼RX630ç¨ï¼46 ; プロセッサ依存モジュール アセンブリ言語部(RX630用) 62 47 ; 63 48 #define TOPPERS_MACRO_ONLY 64 #define UINT_C(val) (val) /* uint_t åã®å®æ°ãä½ããã¯ã*/65 #define ULONG_C(val) (val) /* ulong_t åã®å®æ°ãä½ããã¯ã*/66 #define CAST(type, val) (val) /* åãã£ã¹ããè¡ããã¯ã*/49 #define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */ 50 #define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */ 51 #define CAST(type, val) (val) /* 型キャストを行うマクロ */ 67 52 #include "kernel_impl.h" 68 53 69 54 ; 70 ; ãã£ã¹ãããã£ããã³å²è¾¼ã¿(CPUä¾å¤)åºå 71 ¥ãå£ã®ã«ã¼ã«: 72 ; åä½ã¢ã¼ãã以ä¸ã®ããã«å®ç¾©ãã. 73 ; ãã£ã¹ãããã£ã¢ã¼ã: 74 ; CPUããã¯ç¶æ 75 , å²è¾¼ã¿åªå 76 度ãã¹ã¯å 77 ¨è§£é¤ç¶æ 78 , 79 ; ã¿ã¹ã¯ã³ã³ããã¹ã(intnest = 0), ã¿ã¹ã¯ã¹ã¿ã㯠80 ; å²è¾¼ã¿(CPUä¾å¤)å¦çã¢ã¼ã 81 ; å 82 ¨å²è¾¼ã¿ããã¯ç¶æ 83 (PSWã¬ã¸ã¹ã¿Iããã = 0), 84 ; å²è¾¼ã¿åªå 85 度ãã¹ã¯å 86 ¨è§£é¤ã§ãªãç¶æ 87 (IPL != 0) 88 ; å²è¾¼ã¿ã³ã³ããã¹ã(intnest != 0), å²è¾¼ã¿ã¹ã¿ã㯠89 ; 90 ; ã«ã¼ãã«ç®¡çå¤å²è¾¼ã¿ã®ãµãã¼ãæç¡ã¨, CPUããã¯ç¶æ 91 , å²è¾¼ã¿åªå 92 度 93 ; ãã¹ã¯å 94 ¨è§£é¤ç¶æ 95 ã®é¢ä¿ã¯ä»¥ä¸ã®éãã§ãã. 96 ; ã«ã¼ãã«ç®¡çå¤å²è¾¼ã¿æªãµãã¼ãæ: 97 ; CPUããã¯ç¶æ 98 (PSWã¬ã¸ã¹ã¿Iããã = 0) 99 ; å²è¾¼ã¿åªå 100 度ãã¹ã¯å 101 ¨è§£é¤ç¶æ 102 (IPL = 0) 103 ; ã«ã¼ãã«ç®¡çå¤å²è¾¼ã¿ãµãã¼ãæ: 104 ; CPUããã¯ç¶æ 105 106 ; (PSWã¬ã¸ã¹ã¿Iããã = 0, IPL = IPL_LOCK, lock_flag = true) 107 ; å²è¾¼ã¿åªå 108 度ãã¹ã¯å 109 ¨è§£é¤ç¶æ 110 (saved_ipl = 0) 111 ; 112 ; åæ§é ä½ãã¤ã³ã¿ã以ä¸ã®ããã«åã¬ã¸ã¹ã¿ã«ã¢ãµã¤ã³ãã. 113 ; r15 = p_runtsk ãã ããã£ã¹ãããã£ã®ååºå£ã§ã¯ç¡å¹ 114 ; r14 = *p_runtsk dispatcher ã®ä¸ã§ã¯ p_runtsk 確å®æã«ååå¾ãã 115 ; åå 116 ¥ãå£ããæåã«å¤æ°ã¢ã¯ã»ã¹ããã¨ãã«ä¸è¨ã¬ã¸ã¹ã¿ã«ä¿åãã. 117 ; 118 ; æ§é ä½ã¢ã©ã¤ã¡ã³ãã¸ã®å¯¾å¿ 119 ; æ§é ä½ã¢ã©ã¤ã¡ã³ãã4Byte(ã¢ã³ããã¯)ã®å ´å: 120 ; ä¸è¬çãªã¬ã¸ã¹ã¿ç¸å¯¾ã¢ãã¬ãã·ã³ã°ãå¯è½ 121 ; ä¾: mov.l #__kernel_p_runtsk, r15 55 ; ディスパッチャおよび割込み(CPU例外)出入り口のルール: 56 ; 動作モードを以下のように定義する. 57 ; ディスパッチャモード: 58 ; CPUロック状態, 割込み優先度マスク全解除状態, 59 ; タスクコンテキスト(intnest = 0), タスクスタック 60 ; 割込み(CPU例外)処理モード 61 ; 全割込みロック状態(PSWレジスタIビット = 0), 62 ; 割込み優先度マスク全解除でない状態(IPL != 0) 63 ; 割込みコンテキスト(intnest != 0), 割込みスタック 64 ; 65 ; カーネル管理外割込みのサポート有無と, CPUロック状態, 割込み優先度 66 ; マスク全解除状態の関係は以下の通りである. 67 ; カーネル管理外割込み未サポート時: 68 ; CPUロック状態(PSWレジスタIビット = 0) 69 ; 割込み優先度マスク全解除状態(IPL = 0) 70 ; カーネル管理外割込みサポート時: 71 ; CPUロック状態 72 ; (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true) 73 ; 割込み優先度マスク全解除状態(saved_ipl = 0) 74 ; 75 ; 各構造体ポインタを以下のように各レジスタにアサインする. 76 ; r15 = p_runtsk ただしディスパッチャの各出口では無効 77 ; r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する 78 ; 各入り口から最初に変数アクセスするときに上記レジスタに保存する. 79 ; 80 ; 構造体アライメントへの対応 81 ; 構造体アライメントが4Byte(アンパック)の場合: 82 ; 一般的なレジスタ相対アドレッシングが可能 83 ; 例: mov.l #__kernel_p_runtsk, r15 122 84 ; mov.l r0, TCB_sp[r15] 123 ; æ§é ä½ã¢ã©ã¤ã¡ã³ãã4Byteã§ã¯ãªã(ããã¯)ã®å ´å: 124 ; mov.lã®ããã«ãã³ã°ãµã¤ãºæå®ã®å ´åãç¸å¯¾å¤ã¯4ã®åæ°ã®ã¿æå¹ 125 ; ãã®ãã, ä¸åº¦å¯¾è±¡ã¢ãã¬ã¹ãæ±ãã¦ããã¢ã¯ã»ã¹ããå¿ 126 è¦ããã 127 ; ä¾: mov.l #__kernel_p_runtsk, r15 85 ; 構造体アライメントが4Byteではない(パック)の場合: 86 ; mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効 87 ; このため, 一度対象アドレスを求めてからアクセスする必要がある 88 ; 例: mov.l #__kernel_p_runtsk, r15 128 89 ; add #TCB_sp, r15, r5 129 90 ; mov.l r0, [r5] 130 ; åãªãã»ããå¤ãå¤æã, æ¡ä»¶ã¢ã»ã³ãã«ã«ããã³ã¼ããåãæ¿ãã131 ; 132 133 ; 134 ; æ§é ä½ã¢ã¯ã»ã¹ã®ãªãã»ããå®ç¾©91 ; 各オフセット値を判断し, 条件アセンブルによりコードを切り替える 92 ; 93 94 ; 95 ; 構造体アクセスのオフセット定義 135 96 ; 136 97 #include "offset.h" 137 98 138 99 ; 139 ; å種EQUå®ç¾©(Hãã¡ã¤ã«ã®#defineå®ç¾©)100 ; 各種EQU定義(Hファイルの#define定義) 140 101 ; 141 102 #include "target_config.h" … … 190 151 191 152 ; 192 ; TCB_sp ã¸ã®æ¸è¾¼ã¿ãã¯ã153 ; TCB_sp への書込みマクロ 193 154 ; 194 155 .macro st_TCB_sp src, tcb, tmp … … 202 163 203 164 ; 204 ; TCB_sp ããã®èªåºããã¯ã165 ; TCB_sp からの読出しマクロ 205 166 ; 206 167 .macro ld_TCB_sp dst, tcb, tmp … … 214 175 215 176 ; 216 ; TCB_pc ã¸ã®æ¸è¾¼ã¿ãã¯ã177 ; TCB_pc への書込みマクロ 217 178 ; 218 179 .macro st_TCB_pc src, tcb, tmp … … 226 187 227 188 ; 228 ; TCB_pc ããã®èªåºããã¯ã189 ; TCB_pc からの読出しマクロ 229 190 ; 230 191 .macro ld_TCB_pc dst, tcb, tmp … … 238 199 239 200 ; 240 ; TCB_texptn ããã®èªåºããã¯ã201 ; TCB_texptn からの読出しマクロ 241 202 ; 242 203 .macro ld_TCB_texptn dst, tcb, tmp … … 250 211 251 212 ; 252 ; TCB_p_tinib ããã®èªåºããã¯ã213 ; TCB_p_tinib からの読出しマクロ 253 214 ; 254 215 .macro ld_TCB_p_tinib dst, tcb, tmp … … 262 223 263 224 ; 264 ; TINIB_exinf ããã®èªåºããã¯ã225 ; TINIB_exinf からの読出しマクロ 265 226 ; 266 227 .macro ld_TINIB_exinf dst, tinib, tmp … … 274 235 275 236 ; 276 ; TINIB_task ããã®èªåºããã¯ã237 ; TINIB_task からの読出しマクロ 277 238 ; 278 239 .macro ld_TINIB_task dst, tinib, tmp … … 289 250 290 251 ; 291 ; APIããã®ã¿ã¹ã¯ãã£ã¹ãããã£å 292 ¥å£ 293 ; 294 ; å¼ã³åºãæ¡ä»¶: 295 ; ã»ãã£ã¹ãããã£ã¢ã¼ã(ãã¡ã¤ã«ãããåç 296 §) 297 ; 298 ; ããã§ã¯, ã³ã³ããã¹ãã®éé¿ã¨, å®è¡åéçªå°ã®è¨å®ããã. 252 ; APIからのタスクディスパッチャ入口 253 ; 254 ; 呼び出し条件: 255 ; ・ディスパッチャモード(ファイルヘッダ参照) 256 ; 257 ; ここでは, コンテキストの退避と, 実行再開番地の設定をする. 299 258 ; 300 259 __kernel_dispatch: 301 pushm r6-r13 ; éã¹ã¯ã©ããã¬ã¸ã¹ã¿ä¿å260 pushm r6-r13 ; 非スクラッチレジスタ保存 302 261 mov.l #__kernel_p_runtsk, r15 303 262 mov.l [r15], r14 304 st_TCB_sp r0, r14, r5 ; ã¹ã¿ãã¯ãã¤ã³ã¿ãTCBã«ä¿å305 st_TCB_pc #dispatch_r, r14, r5 ; å®è¡åéçªå°ãTCBã«ä¿å263 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存 264 st_TCB_pc #dispatch_r, r14, r5 ; 実行再開番地をTCBに保存 306 265 bra dispatcher 307 266 308 267 ; 309 ; APIã¸ã®ã¿ã¹ã¯ãã£ã¹ãããã£åºå£ 310 ; 311 ; å¼ã³åºãæ¡ä»¶: 312 ; ã»ãã£ã¹ãããã£ã¢ã¼ã(ãã¡ã¤ã«ãããåç 313 §) 314 ; 315 ; ããã§ã¯, ã¿ã¹ã¯ä¾å¤ãã³ãã©å¼åºãã¨, ã³ã³ããã¹ãã®å¾©å¸°ããã. 268 ; APIへのタスクディスパッチャ出口 269 ; 270 ; 呼び出し条件: 271 ; ・ディスパッチャモード(ファイルヘッダ参照) 272 ; 273 ; ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする. 316 274 ; 317 275 dispatch_r: 318 btst #TCB_enatex_bit, TCB_enatex[r14].b ; ã¿ã¹ã¯ä¾å¤å¦ç許å¯?276 btst #TCB_enatex_bit, TCB_enatex[r14].b ; タスク例外処理許可? 319 277 bz dispatch_r_rts 320 ld_TCB_texptn r5, r14, r4 ; ä¿çä¾å¤è¦å ããããï¼278 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか? 321 279 cmp #0, r5 322 280 bz dispatch_r_rts 323 bsr __kernel_call_texrtn ; ã¿ã¹ã¯ä¾å¤ãã³ãã©å¼åºãå¦çå®è¡281 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行 324 282 dispatch_r_rts: 325 popm r6-r13 ; éã¹ã¯ã©ããã¬ã¸ã¹ã¿å¾©å¸° 326 rts ; dispatch å¼ã³åºãå 327 ã¸æ»ã. 328 329 ; 330 ; ã¿ã¹ã¯èµ·åå¦ç(ã¿ã¹ã¯å 331 é ã¸ã®ã¿ã¹ã¯ãã£ã¹ãããã£åºå£) 332 ; 333 ; å¼ã³åºãæ¡ä»¶: 334 ; ã»ãã£ã¹ãããã£ã¢ã¼ã(ãã¡ã¤ã«ãããåç 335 §) 336 ; 337 ; ããã§ã¯, CPUããã¯è§£é¤ç¶æ 338 ã«ã, ã¿ã¹ã¯ãèµ·åãã. 283 popm r6-r13 ; 非スクラッチレジスタ復帰 284 rts ; dispatch 呼び出し元へ戻る. 285 286 ; 287 ; タスク起動処理(タスク先頭へのタスクディスパッチャ出口) 288 ; 289 ; 呼び出し条件: 290 ; ・ディスパッチャモード(ファイルヘッダ参照) 291 ; 292 ; ここでは, CPUロック解除状態にし, タスクを起動する. 339 293 ; 340 294 __kernel_start_r: 341 295 mov.l #_ext_tsk, r5 342 push.l r5 ; æ»ãçªå°ãã¹ã¿ãã¯ã«ç©ã296 push.l r5 ; 戻り番地をスタックに積む 343 297 ld_TCB_p_tinib r5, r14, r4 344 ld_TINIB_exinf r1, r5, r4 ; æ¡å¼µæ 345 å ±ã第ä¸å¼æ°ã«è¨å® 346 ld_TINIB_task r5, r5, r4 ; ã¿ã¹ã¯ã®èµ·åçªå°ãåå¾ 298 ld_TINIB_exinf r1, r5, r4 ; 拡張情報を第一引数に設定 299 ld_TINIB_task r5, r5, r4 ; タスクの起動番地を取得 347 300 .if TIPM_LOCK == -15 348 setpsw i ; å²è¾¼ã¿è¨±å¯(CPUããã¯è§£é¤ç¶æ 349 ) 301 setpsw i ; 割込み許可(CPUロック解除状態) 350 302 .else 351 mov.l #__kernel_lock_flag, r4 ; CPUããã¯è§£é¤ç¶æ 352 㸠353 mov.l #0, [r4] ; ããã«æ¥ãã¨ãã¯å¿ 354 ã saved_ipl ã® 355 mvtc #00010000H, psw ; å¤ã¯ 0 ã®ãã, ç´å¤ãè¨å®ãã. 356 ; å 357 ¨å²è¾¼ã¿ããã¯è§£é¤ç¶æ 358 ( I = 1 ) 359 ; å²è¾¼ã¿åªå 360 度ãã¹ã¯å 361 ¨è§£é¤ç¶æ 362 ( IPL = 0 ) 303 mov.l #__kernel_lock_flag, r4 ; CPUロック解除状態へ 304 mov.l #0, [r4] ; ここに来るときは必ず saved_ipl の 305 mvtc #00010000H, psw ; 値は 0 のため, 直値を設定する. 306 ; 全割込みロック解除状態( I = 1 ) 307 ; 割込み優先度マスク全解除状態( IPL = 0 ) 363 308 .endif 364 309 jmp r5 365 310 366 311 ; 367 ; ã«ã¼ãã«èµ·åããã®ã¿ã¹ã¯ãã£ã¹ãããã£å 368 ¥å£ 369 ; 370 ; ãã®ã«ã¼ãã³ã¯ï¼ã«ã¼ãã«èµ·åæã«ï¼ãã¹ã¦ã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 371 372 ; ï¼å²è¾¼ã¿ããã¯ç¶æ 373 ã¨åçï¼ã§å¼ã³åºãããï¼ã¾ãï¼å²è¾¼ã¿ã¢ã¼ãï¼é 374 ; ã¿ã¹ã¯ã³ã³ããã¹ãã¨åçï¼ã§å¼ã³åºããããã¨ãæ³å®ãã¦ããï¼ 375 ; 376 ; å¼ã³åºãæ¡ä»¶: 377 ; ã»å²è¾¼ã¿(CPUä¾å¤)å¦çã¢ã¼ã(ãã¡ã¤ã«ãããåç 378 §) 379 ; 380 ; ããã§ã¯, ãã£ã¹ãããã£ã¢ã¼ãã«å¤æ´ãã. 312 ; カーネル起動からのタスクディスパッチャ入口 313 ; 314 ; このルーチンは,カーネル起動時に,すべての割込みを禁止した状態 315 ; (割込みロック状態と同等)で呼び出される.また,割込みモード(非 316 ; タスクコンテキストと同等)で呼び出されることを想定している. 317 ; 318 ; 呼び出し条件: 319 ; ・割込み(CPU例外)処理モード(ファイルヘッダ参照) 320 ; 321 ; ここでは, ディスパッチャモードに変更する. 381 322 ; 382 323 __kernel_start_dispatch: 383 324 mov.l #__kernel_intnest, r5 384 mov.w #0, [r5] ; ã¿ã¹ã¯ã³ã³ããã¹ãã«åæã325 mov.w #0, [r5] ; タスクコンテキストに切換え 385 326 #if TIPM_LOCK != -15 386 mvtc #(IPL_LOCK | 00010000H), psw ; å 387 ¨å²è¾¼ã¿ããã¯è§£é¤ç¶æ 388 389 ; å²è¾¼ã¿åªå 390 度ãã¹ã¯å 391 ¨è§£é¤ã§ãªãç¶æ 392 393 #endif 394 395 ; 396 ; ã¿ã¹ã¯çµäº(ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã)ããã®ã¿ã¹ã¯ãã£ã¹ãããã£å 397 ¥å£ 398 ; 399 ; å¼ã³åºãæ¡ä»¶: 400 ; ã»ãã£ã¹ãããã£ã¢ã¼ã(ãã¡ã¤ã«ãããåç 401 §) 402 ; 403 ; ããã§ã¯, ä½ããããã¨ã¯ãªã. 404 ; ãªã, p_runtsk ã®ã¢ãã¬ã¹åå¾ã ãã¯è¡ãªã. 327 mvtc #(IPL_LOCK | 00010000H), psw ; 全割込みロック解除状態 328 ; 割込み優先度マスク全解除でない状態 329 #endif 330 331 ; 332 ; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャ入口 333 ; 334 ; 呼び出し条件: 335 ; ・ディスパッチャモード(ファイルヘッダ参照) 336 ; 337 ; ここでは, 何もすることはない. 338 ; なお, p_runtsk のアドレス取得だけは行なう. 405 339 ; 406 340 __exit_and_dispatch: … … 408 342 409 343 ; 410 ; ãã£ã¹ãããã£æ¬ä½411 ; 412 ; å¼ã³åºãæ¡ä»¶:413 ; ã»ãã¹ã¦ã®ã¿ã¹ã¯ã®ã³ã³ããã¹ãã¯ä¿åããã¦ãã.414 ; 415 ; dispatcher å¼åºæã®ã¹ã¿ãã¯:416 ; ã»__kernel_dispatch ããããå ´å : ã¿ã¹ã¯ã¹ã¿ãã¯417 ; ã»exit_and_dispatch ããããå ´å:418 ; exit_task ããããå ´å : ã¿ã¹ã¯ã¹ã¿ãã¯419 ; ã«ã¼ãã«èµ·åæ(__kernel_start_dispatch) : å²è¾¼ã¿ã¹ã¿ãã¯420 ; ã»ret_int ããããå ´å : ã¿ã¹ã¯ã¹ã¿ãã¯421 ; ã»dispatcher_idle_loop ããããå ´å : å²è¾¼ã¿ã¹ã¿ãã¯344 ; ディスパッチャ本体 345 ; 346 ; 呼び出し条件: 347 ; ・すべてのタスクのコンテキストは保存されている. 348 ; 349 ; dispatcher 呼出時のスタック: 350 ; ・__kernel_dispatch からきた場合 : タスクスタック 351 ; ・exit_and_dispatch からきた場合: 352 ; exit_task からきた場合 : タスクスタック 353 ; カーネル起動時(__kernel_start_dispatch) : 割込みスタック 354 ; ・ret_int からきた場合 : タスクスタック 355 ; ・dispatcher_idle_loop からきた場合 : 割込みスタック 422 356 ; 423 357 dispatcher: 424 358 .if LOG_DSP_ENTER == 1 425 359 push.l r15 426 mov.l r14, r1 ; å¼æ°(ãã£ã¹ãããå 427 TCB)ãè¨å® 360 mov.l r14, r1 ; 引数(ディスパッチ元TCB)を設定 428 361 bsr _kernel_log_dsp_enter 429 362 pop.l r15 430 363 .endif 431 364 mov.l #__kernel_p_schedtsk, r5 432 mov.l [r5], [r15] ; p_schedtsk ã p_runtsk ã«365 mov.l [r5], [r15] ; p_schedtsk を p_runtsk に 433 366 mov.l [r15], r14 434 367 cmp #0, r14 435 bz dispatcher_pre_idle ; schedtsk ããªããã°ã¢ã¤ãã«ã«ã¼ãã¸436 ld_TCB_sp r0, r14, r5 ; ã¿ã¹ã¯ã¹ã¿ãã¯ãã¤ã³ã¿ã復帰368 bz dispatcher_pre_idle ; schedtsk がなければアイドルループへ 369 ld_TCB_sp r0, r14, r5 ; タスクスタックポインタを復帰 437 370 .if LOG_DSP_LEAVE == 1 438 371 push.l r14 439 mov.l r14, r1 ; å¼æ°(ãã£ã¹ãããå 440 TCB)ãè¨å® 372 mov.l r14, r1 ; 引数(ディスパッチ先TCB)を設定 441 373 bsr _kernel_log_dsp_leave 442 374 pop.l r14 443 375 .endif 444 376 ld_TCB_pc r5, r14, r4 445 jmp r5 ; å®è¡åéçªå°ã¸ã¸ã£ã³ã 446 447 ; 448 ; schdedtskãNULLã®å ´åã¯ã¢ã¤ãã«ã«ã¼ãã«å 449 ¥ã 450 ; ã¢ã¤ãã«ã«ã¼ãã¯å²è¾¼ã¿å¦çã¢ã¼ãã§åä½ããã 451 ; 452 ; ããã§å²è¾¼ã¿ã¢ã¼ãã«åãæããã®ã¯ï¼ããã§çºçããå²è¾¼ã¿å¦çã« 453 ; ã©ã®ã¹ã¿ãã¯ã使ããã¨ããåé¡ã®è§£æ±ºã¨ï¼å²è¾¼ã¿ãã³ãã©å 454 ã§ã®ã¿ 455 ; ã¹ã¯ãã£ã¹ãããã®é²æ¢ã¨ãã2ã¤ã®æå³ãããï¼ 377 jmp r5 ; 実行再開番地へジャンプ 378 379 ; 380 ; schdedtskがNULLの場合はアイドルループに入る 381 ; アイドルループは割込み処理モードで動作させる 382 ; 383 ; ここで割込みモードに切り換えるのは,ここで発生する割込み処理に 384 ; どのスタックを使うかという問題の解決と,割込みハンドラ内でのタ 385 ; スクディスパッチの防止という2つの意味がある. 456 386 ; 457 387 dispatcher_pre_idle: 458 388 mov.l #__kernel_istkpt,r5 459 mov.l [r5], r0 ; å²è¾¼ã¿ç¨ã®ã¹ã¿ãã¯ã¸åæ¿ã460 mov.l #__kernel_intnest, r5 461 mov.w #1, [r5] ; éã¿ã¹ã¯ã³ã³ããã¹ãã«åæã389 mov.l [r5], r0 ; 割込み用のスタックへ切替え 390 mov.l #__kernel_intnest, r5 391 mov.w #1, [r5] ; 非タスクコンテキストに切換え 462 392 #if TIPM_LOCK != -15 463 mov.l #__kernel_lock_flag, r5 ; CPUããã¯è§£é¤ç¶æ 464 㸠393 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 465 394 mov.l #0, [r5] 466 mvtc #0, psw ; åªå 467 度0ã®å²è¾¼ã¿å¦çä¸ãå½è£ 468 395 mvtc #0, psw ; 優先度0の割込み処理中を偽装 469 396 #endif 470 397 471 398 dispatcher_idle_loop: 472 setpsw i ; å 473 ¨å²è¾¼ã¿è¨±å¯ 474 clrpsw i ; å 475 ¨å²è¾¼ã¿ç¦æ¢ 476 477 mov.l #__kernel_reqflg, r5 ; reqflg ã FALSE ãªã 399 setpsw i ; 全割込み許可 400 clrpsw i ; 全割込み禁止 401 402 mov.l #__kernel_reqflg, r5 ; reqflg が FALSE なら 478 403 mov.l [r5], r4 479 404 cmp #0, r4 480 bz dispatcher_idle_loop ; ã¢ã¤ãã«ã«ã¼ããç¹°ãè¿ã481 mov.l #0, [r5] ; reqflg ãtrueãªãfalseã«ãã482 mov.l #__kernel_intnest, r5 483 mov.w #0, [r5] ; ã¿ã¹ã¯ã³ã³ããã¹ãã«åæã405 bz dispatcher_idle_loop ; アイドルループを繰り返す 406 mov.l #0, [r5] ; reqflgがtrueならfalseにする 407 mov.l #__kernel_intnest, r5 408 mov.w #0, [r5] ; タスクコンテキストに切換え 484 409 #if TIPM_LOCK != -15 485 mov.l #__kernel_lock_flag, r5 ; CPUããã¯ç¶æ 486 㸠410 mov.l #__kernel_lock_flag, r5 ; CPUロック状態へ 487 411 mov.l #1, [r5] 488 412 mov.l #__kernel_saved_ipl, r5 489 413 mov.l #0, [r5] 490 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; å 491 ¨å²è¾¼ã¿ããã¯è§£é¤ç¶æ 492 493 ; å²è¾¼ã¿åªå 494 度ãã¹ã¯å 495 ¨è§£é¤ã§ãªãç¶æ 496 497 #endif 498 bra dispatcher ; dispatcher ã¸æ»ã 499 500 501 ; 502 ; ã«ã¼ãã«ã®çµäºå¦çã®å¼åºã 503 ; 504 ; ã¢ã¼ãã¨ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã«åãæ¿ãï¼ 414 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; 全割込みロック解除状態 415 ; 割込み優先度マスク全解除でない状態 416 #endif 417 bra dispatcher ; dispatcher へ戻る 418 419 420 ; 421 ; カーネルの終了処理の呼出し 422 ; 423 ; モードとスタックを非タスクコンテキスト用に切り替え. 505 424 ; 506 425 .global __kernel_call_exit_kernel 507 426 __kernel_call_exit_kernel: 508 427 #if TIPM_LOCK != -15 509 clrpsw i ; å 510 ¨å²è¾¼ã¿ç¦æ¢ 511 mov.l #__kernel_lock_flag, r5 ; CPUããã¯è§£é¤ç¶æ 512 㸠428 clrpsw i ; 全割込み禁止 429 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 513 430 mov.l #0, [r5] 514 431 #endif 515 432 mov.l #__kernel_istkpt, r5 516 mov.l [r5], r0 ; å²è¾¼ã¿ç¨ã®ã¹ã¿ãã¯ã¸åæ¿ã517 mov.l #__kernel_intnest, r5 518 mov.w #1, [r5] ; éã¿ã¹ã¯ã³ã³ããã¹ãã«åæã433 mov.l [r5], r0 ; 割込み用のスタックへ切替え 434 mov.l #__kernel_intnest, r5 435 mov.w #1, [r5] ; 非タスクコンテキストに切換え 519 436 bsr __kernel_exit_kernel 520 437 bra __kernel_call_exit_kernel … … 522 439 523 440 ; 524 ; å²è¾¼ã¿(CPUä¾å¤)ããã®ã¿ã¹ã¯ãã£ã¹ãããã£å 525 ¥å£ 526 ; 527 ; å¼åºãæ¡ä»¶: 528 ; ã»å 529 ¨å²è¾¼ã¿ããã¯ç¶æ 530 (PSWã¬ã¸ã¹ã¿Iããã = 0) 531 ; ã»å²è¾¼ã¿åªå 532 度ãã¹ã¯å 533 ¨è§£é¤ã§ãªãç¶æ 534 (IPL != 0) 535 ; ã»ã¿ã¹ã¯ã³ã³ããã¹ã(intnest=0) 536 ; ã»ä½¿ç¨ã¹ã¿ãã¯ã¯ã¿ã¹ã¯ã¹ã¿ã㯠537 ; ã»reqflg = true 538 ; 539 ; ããã§ã¯, ãã£ã¹ãããã£ã¢ã¼ãã«å¤æ´ã, reqflgãOFFã«ãã¦ãã, 540 ; é 541 延ãã£ã¹ãããã®æç¡ãå¤æãã. 542 ; 543 544 ; 545 ; ret_intå 546 é ã§ã¹ã¿ãã¯ã«ç©ã¾ãã¦ããPSWã¬ã¸ã¹ã¿ã¸ã®ãªãã»ãã 441 ; 割込み(CPU例外)からのタスクディスパッチャ入口 442 ; 443 ; 呼出し条件: 444 ; ・全割込みロック状態(PSWレジスタIビット = 0) 445 ; ・割込み優先度マスク全解除でない状態(IPL != 0) 446 ; ・タスクコンテキスト(intnest=0) 447 ; ・使用スタックはタスクスタック 448 ; ・reqflg = true 449 ; 450 ; ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから, 451 ; 遅延ディスパッチの有無を判断する. 452 ; 453 454 ; 455 ; ret_int先頭でスタックに積まれているPSWレジスタへのオフセット 547 456 ; ACC + FPSW + R14--R15 + R1--R5 + PC 548 457 ; … … 551 460 ret_int: 552 461 .if TIPM_LOCK == -15 553 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; å²è¾¼ã¿/CPUä¾å¤çºçåã®IPLå¤åå¾462 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得 554 463 and #PSW_IPL_MASK, r5 555 mvtc r5, psw ; å 556 ¨å²è¾¼ã¿ããã¯(CPUããã¯)ç¶æ 557 558 ; å²è¾¼ã¿/CPUä¾å¤çºçåã®å²è¾¼ã¿åªå 559 度 464 mvtc r5, psw ; 全割込みロック(CPUロック)状態 465 ; 割込み/CPU例外発生前の割込み優先度 560 466 .else 561 mov.l #__kernel_lock_flag, r5 ; CPUããã¯ç¶æ 562 㸠467 mov.l #__kernel_lock_flag, r5 ; CPUロック状態へ 563 468 mov.l #1, [r5] 564 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; å²è¾¼ã¿/CPUä¾å¤çºçåã®IPLå¤åå¾469 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得 565 470 and #PSW_IPL_MASK, r5 566 471 mov.l #__kernel_saved_ipl, r4 567 472 mov.l r5, [r4] 568 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; å 569 ¨å²è¾¼ã¿ããã¯è§£é¤ç¶æ 570 571 ; å²è¾¼ã¿åªå 572 度ãã¹ã¯å 573 ¨è§£é¤ã§ãªãç¶æ 574 473 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; 全割込みロック解除状態 474 ; 割込み優先度マスク全解除でない状態 575 475 .endif 576 476 mov.l #__kernel_reqflg, r5 … … 578 478 mov.l #__kernel_p_runtsk, r15 579 479 mov.l [r15], r14 580 mov.l #__kernel_dspflg, r5 ; dspflg ã FALSE ãªã ret_int_r ã¸480 mov.l #__kernel_dspflg, r5 ; dspflg が FALSE なら ret_int_r へ 581 481 mov.l [r5], r5 582 482 cmp #0, r5 … … 584 484 mov.l #__kernel_p_schedtsk, r5 585 485 mov.l [r5], r5 586 cmp r5, r14 ; p_schedtsk 㨠p_runtsk ãåããªã587 beq ret_int_r_call_tex ; ret_int_r_call_tex ã¸588 pushm r6-r13 ; éã¹ã¯ã©ããã¬ã¸ã¹ã¿ä¿å589 st_TCB_sp r0, r14, r5 ; ã¹ã¿ãã¯ãã¤ã³ã¿ãTCBã«ä¿å590 st_TCB_pc #ret_int_r, r14, r5 ; å®è¡åéçªå°ãTCBã«ä¿å486 cmp r5, r14 ; p_schedtsk と p_runtsk が同じなら 487 beq ret_int_r_call_tex ; ret_int_r_call_tex へ 488 pushm r6-r13 ; 非スクラッチレジスタ保存 489 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存 490 st_TCB_pc #ret_int_r, r14, r5 ; 実行再開番地をTCBに保存 591 491 bra dispatcher 592 492 593 493 ; 594 ; å²è¾¼ã¿(CPUä¾å¤)ã¸ã®ã¿ã¹ã¯ãã£ã¹ãããã£åºå£ 595 ; 596 ; å¼ã³åºãæ¡ä»¶: 597 ; ã»ãã£ã¹ãããã£ã¢ã¼ã(ãã¡ã¤ã«ãããåç 598 §) 599 ; 600 ; ããã§ã¯, ã¿ã¹ã¯ä¾å¤ãã³ãã©å¼åºãã¨, å²è¾¼ã¿(CPUä¾å¤)å¦çã¢ã¼ãã¸ã® 601 ; å¤æ´ã¨, ã³ã³ããã¹ãã®å¾©å¸°ãè¡ã, å²è¾¼ã¿(CUPä¾å¤)çºçå 602 ã¸æ»ã. 603 ; 604 __kernel_break_wait: ;ã¿ã¹ã¯ã¢ãã¿ç¨ã©ãã« 494 ; 割込み(CPU例外)へのタスクディスパッチャ出口 495 ; 496 ; 呼び出し条件: 497 ; ・ディスパッチャモード(ファイルヘッダ参照) 498 ; 499 ; ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの 500 ; 変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生元へ戻る. 501 ; 502 __kernel_break_wait: ;タスクモニタ用ラベル 605 503 ret_int_r: 606 popm r6-r13 ; éã¹ã¯ã©ããã¬ã¸ã¹ã¿å¾©å¸°504 popm r6-r13 ; 非スクラッチレジスタ復帰 607 505 ret_int_r_call_tex: 608 btst #TCB_enatex_bit, TCB_enatex[r14].b ; ã¿ã¹ã¯ä¾å¤å¦ç許å¯?506 btst #TCB_enatex_bit, TCB_enatex[r14].b ; タスク例外処理許可? 609 507 bz ret_int_r_rte 610 ld_TCB_texptn r5, r14, r4 ; ä¿çä¾å¤è¦å ããããï¼508 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか? 611 509 cmp #0, r5 612 510 bz ret_int_r_rte 613 bsr __kernel_call_texrtn ; ã¿ã¹ã¯ä¾å¤ãã³ãã©å¼åºãå¦çå®è¡511 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行 614 512 ret_int_r_rte: 615 513 #if TIPM_LOCK != -15 616 clrpsw i ; å 617 ¨å²è¾¼ã¿ç¦æ¢ 618 mov.l #__kernel_lock_flag, r5 ; CPUããã¯è§£é¤ç¶æ 619 㸠514 clrpsw i ; 全割込み禁止 515 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 620 516 mov.l #0, [r5] 621 517 #endif 622 popm r4-r5 ; ã¢ãã¥ã ã¬ã¼ã¿å¾©å¸°623 mvtaclo r5 ; ACC æä¸ä½16bitã¯0ã§å¾©å¸°518 popm r4-r5 ; アキュムレータ復帰 519 mvtaclo r5 ; ACC最下位16bitは0で復帰 624 520 mvtachi r4 625 popc fpsw ; FPU ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿å¾©å¸°626 popm r14-r15 ; ã¬ã¸ã¹ã¿å¾©å¸°521 popc fpsw ; FPUステータスレジスタ復帰 522 popm r14-r15 ; レジスタ復帰 627 523 popm r1-r5 628 rte ; å²è¾¼ã¿åã®å¦çã«æ»ã 629 630 631 ; 632 ; å²è¾¼ã¿ã®åºå 633 ¥å£å¦ç(ã¢ã»ã³ããªè¨èªè¨è¿°é¨å) 634 ; 635 ; å¼åºãæ¡ä»¶: 636 ; ã»å²è¾¼ã¿çºçæã®H/Wå¦çã«ãã, PSWã¬ã¸ã¹ã¿ã®Iããã=0, IPLã¯åä»ã 637 ; ãå²è¾¼ã¿ã®IPL. 638 ; ã»ã¹ã¿ãã¯ã¯å¤éå²ãè¾¼ã¿ãªãå²è¾¼ã¿ã¹ã¿ãã¯, ããã§ãªããã° 639 ; ã¿ã¹ã¯ã¹ã¿ã㯠640 ; ã»å²è¾¼ã¿çºçæã®H/Wå¦çã«ãã,ã¹ã¿ãã¯ã«å²è¾¼ã¿ããã®å¾©å¸°PCã¨PSWã 641 ; ä¿åããã¦ãã. 642 ; ã»ãã¯ã¿ãã¼ãã«ã«ç»é²ãããåå¥ã®å 643 ¥ãå£å¦çã«ãã, ã¹ã¿ãã¯ã« 644 ; ã¹ã¯ã©ããã¬ã¸ã¹ã¿(R1-R5)ãä¿åããã¦ãã. 645 ; 646 ; å¼æ°: 647 ; ã»r1:å²è¾¼ã¿è¦å çªå· 648 ; ã»r2:å²è¾¼ã¿ãã³ãã©ã®ã¢ãã¬ã¹ 649 ; 650 ; ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ä¸ã«ã©ã®ããã«ä¿åããã¦ãããã以ä¸ã«ç¤ºã. 651 ; ãã®å³ã§ã¯ä¸ãä½ä½, ä¸ãé«ä½ã®ã¢ãã¬ã¹ã§, ã¹ã¿ãã¯ã¯ä¸ãã 652 ; ä¸æ¹åã«åãã£ã¦ç©ã¿ä¸ãããããã®ã¨ãã. 524 rte ; 割込み前の処理に戻る 525 526 527 ; 528 ; 割込みの出入口処理(アセンブリ言語記述部分) 529 ; 530 ; 呼出し条件: 531 ; ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け 532 ; た割込みのIPL. 533 ; ・スタックは多重割り込みなら割込みスタック, そうでなければ 534 ; タスクスタック 535 ; ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが 536 ; 保存されている. 537 ; ・ベクタテーブルに登録された個別の入り口処理により, スタックに 538 ; スクラッチレジスタ(R1-R5)が保存されている. 539 ; 540 ; 引数: 541 ; ・r1:割込み要因番号 542 ; ・r2:割込みハンドラのアドレス 543 ; 544 ; レジスタがスタック上にどのように保存されているかを以下に示す. 545 ; この図では上が低位, 下が高位のアドレスで, スタックは下から 546 ; 上方向に向かって積み上げられるものとする. 653 547 ; 654 548 ; ------------------------- … … 678 572 ; -------------------------(SP + 44) 679 573 ; 680 ; ããã§ã¯, å²è¾¼ã¿å¦çã¢ã¼ãã«å¤æ´ãã¦ãã³ãã©ãå®è¡ãã. 681 ; 682 ; ãã³ãã©ãããªã¿ã¼ã³ããå¾ã¯, å¤éå²è¾¼ã¿ã§ãªã, ã㤠reqflg ã 683 ; TRUE ã«ãªã£ãæã«ï¼ret_int ã¸åå²(é 684 延ãã£ã¹ããã)ããï¼ 685 ; 686 ; å¤éå²è¾¼ã¿ãã©ããã¯å²è¾¼ã¿ãã¹ãã«ã¦ã³ã¿ã®å¤ã§å¤å®ãã. 687 ; intnest != 0 ãªãã°å¤éå²è¾¼ã¿ã§ããã¨å¤å®ãã. 688 ; 689 ; reqflg ã¯CPUããã¯ç¶æ 690 ã§ãã§ãã¯ãã. ããã§ãªãã¨ï¼ 691 ; reqflg ãã§ãã¯å¾ã«èµ·åãããå²è¾¼ã¿ãã³ãã©å 692 㧠693 ; ãã£ã¹ããããè¦æ±ãããå ´åã«ï¼ãã£ã¹ããããããªã. 574 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 575 ; 576 ; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が 577 ; TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する. 578 ; 579 ; 多重割込みかどうかは割込みネストカウンタの値で判定する. 580 ; intnest != 0 ならば多重割込みであると判定する. 581 ; 582 ; reqflg はCPUロック状態でチェックする. そうでないと, 583 ; reqflg チェック後に起動された割込みハンドラ内で 584 ; ディスパッチが要求された場合に,ディスパッチされない. 694 585 ; 695 586 _kernel_interrupt: 696 pushm r14-r15 ; ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãéé¿697 pushc fpsw ; FPU ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿éé¿587 pushm r14-r15 ; スクラッチレジスタを退避 588 pushc fpsw ; FPUステータスレジスタ退避 698 589 mvfacmi r5 699 shll #16, r5 ; ACC æä¸ä½16bitã¯0ã¨ãã590 shll #16, r5 ; ACC最下位16bitは0とする 700 591 mvfachi r4 701 pushm r4-r5 ; ã¢ãã¥ã ã¬ã¼ã¿éé¿592 pushm r4-r5 ; アキュムレータ退避 702 593 mov.l #__kernel_intnest, r5 703 594 mov.w [r5], r4 704 add #1, r4 ; ãã¹ãåæ°ãã¤ã³ã¯ãªã¡ã³ã595 add #1, r4 ; ネスト回数をインクリメント 705 596 mov.w r4, [r5] 706 cmp #1, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã707 bnz interrupt_from_int ; å ç®åã0ã§ãªããã°å¤éå²è¾¼ã¿708 ; å段ã®å²è¾¼ã¿709 mov.l r0, r3 ; ã¹ã¿ãã¯ãã¤ã³ã¿ãåãåºã710 mov.l #__kernel_istkpt, r5 ; å²è¾¼ã¿ç¨ã®ã¹ã¿ãã¯ã¸åæ¿ãã597 cmp #1, r4 ; 多重割り込みかどうか 598 bnz interrupt_from_int ; 加算前が0でなければ多重割込み 599 ; 初段の割込み 600 mov.l r0, r3 ; スタックポインタを取り出し 601 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 711 602 mov.l [r5], r0 712 push.l r3 ; ã¿ã¹ã¯ã¹ã¿ãã¯ãä¿æ 713 interrupt_from_int: ; å¤éå²è¾¼ã¿ 714 setpsw i ; å²è¾¼ã¿è¨±å¯(CPUããã¯è§£é¤ç¶æ 715 ) 603 push.l r3 ; タスクスタックを保持 604 interrupt_from_int: ; 多重割込み 605 setpsw i ; 割込み許可(CPUロック解除状態) 716 606 717 607 .if LOG_INH_LEAVE == 1 718 push.l r1 ; ãã°ãã¬ã¼ã¹ã®å¼æ°ãä¿æ608 push.l r1 ; ログトレースの引数を保持 719 609 .endif 720 610 721 611 .if LOG_INH_ENTER == 1 722 612 push.l r2 723 bsr _kernel_log_inh_enter ; ãã°ãã¬ã¼ã¹é¢æ°ã®å¼åºã 724 ; å¼æ°ã®å²è¾¼ã¿è¦å çªå·ã¯æ¢ã«r1ã«å 725 ¥ã£ã¦ãã 613 bsr _kernel_log_inh_enter ; ログトレース関数の呼出し 614 ; 引数の割込み要因番号は既にr1に入っている 726 615 pop r2 727 616 .endif 728 617 729 jsr r2 ; C ã«ã¼ãã³å¼ã³åºã618 jsr r2 ; Cルーチン呼び出し 730 619 731 620 .if LOG_INH_LEAVE == 1 732 pop r1 ; å¼æ°ã«å²è¾¼ã¿è¦å çªå·ãè¨å®733 bsr _kernel_log_inh_leave ; ãã°ãã¬ã¼ã¹é¢æ°ã®å¼åºã621 pop r1 ; 引数に割込み要因番号を設定 622 bsr _kernel_log_inh_leave ; ログトレース関数の呼出し 734 623 .endif 735 624 736 clrpsw i ; å²è¾¼ã¿ç¦æ¢(CPUããã¯ç¶æ 737 ) 625 clrpsw i ; 割込み禁止(CPUロック状態) 738 626 mov.l #__kernel_intnest, r5 739 627 mov.w [r5], r4 740 sub #1, r4 ; ãã¹ãåæ°ããã¯ãªã¡ã³ã628 sub #1, r4 ; ネスト回数をデクリメント 741 629 mov.w r4, [r5] 742 cmp #0, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã743 bnz interrupt_return ; å¤éå²ãè¾¼ã¿ãªããªã¿ã¼ã³744 ; å段ã®å²è¾¼ã¿745 pop r0 ; ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«æ»ã746 mov.l #__kernel_reqflg, r5 ; ãã£ã¹ãããè¦æ±ããªãã?630 cmp #0, r4 ; 多重割り込みかどうか 631 bnz interrupt_return ; 多重割り込みならリターン 632 ; 初段の割込み 633 pop r0 ; タスクのスタックに戻す 634 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか? 747 635 mov.l [r5], r5 748 636 cmp #1, r5 749 bz ret_int ; ããã° ret_int ã¸ã¸ã£ã³ã637 bz ret_int ; あれば ret_int へジャンプ 750 638 interrupt_return: 751 popm r4-r5 ; ã¢ãã¥ã ã¬ã¼ã¿å¾©å¸°752 mvtaclo r5 ; ACC æä¸ä½16bitã¯0ã§å¾©å¸°639 popm r4-r5 ; アキュムレータ復帰 640 mvtaclo r5 ; ACC最下位16bitは0で復帰 753 641 mvtachi r4 754 popc fpsw ; FPU ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿å¾©å¸°755 popm r14-r15 ; ã¬ã¸ã¹ã¿å¾©å¸°642 popc fpsw ; FPUステータスレジスタ復帰 643 popm r14-r15 ; レジスタ復帰 756 644 popm r1-r5 757 rte ; å²è¾¼ã¿åã®å¦çã«æ»ã 758 759 760 ; 761 ; CPUä¾å¤ã®åºå 762 ¥å£å¦ç(ã¢ã»ã³ããªè¨èªè¨è¿°é¨å) 763 ; 764 ; å¼åºãæ¡ä»¶: 765 ; ã»CPUä¾å¤çºçæã®H/Wå¦çã«ãã, PSWã¬ã¸ã¹ã¿ã®Iããã=0, IPL=0. 766 ; ã»ã¹ã¿ãã¯ã¯å¤éå²ãè¾¼ã¿ãªãå²è¾¼ã¿ã¹ã¿ãã¯, ããã§ãªããã° 767 ; ã¿ã¹ã¯ã¹ã¿ã㯠768 ; ã»CPUä¾å¤çºçæã®H/Wå¦çã«ãã,ã¹ã¿ãã¯ã«CPUä¾å¤ããã®å¾©å¸°PC㨠769 ; PSWãä¿åããã¦ãã. 770 ; ã»ãã¯ã¿ãã¼ãã«ã«ç»é²ãããåå¥ã®å 771 ¥ãå£å¦çã«ãã, ã¹ã¿ãã¯ã« 772 ; ã¹ã¯ã©ããã¬ã¸ã¹ã¿(R1-R5)ãä¿åããã¦ãã. 773 ; 774 ; å¼æ°: 775 ; ã»r1:CPUä¾å¤è¦å çªå· 776 ; ã»r2:CPUä¾å¤ãã³ãã©ã®ã¢ãã¬ã¹ 777 ; 778 ; ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ä¸ã«ã©ã®ããã«ä¿åããã¦ãããã以ä¸ã«ç¤ºã. 779 ; ãã®å³ã§ã¯ä¸ãä½ä½, ä¸ãé«ä½ã®ã¢ãã¬ã¹ã§, ã¹ã¿ãã¯ã¯ä¸ãã 780 ; ä¸æ¹åã«åãã£ã¦ç©ã¿ä¸ãããããã®ã¨ãã. 781 ; ãªã, CPUä¾å¤è¦å çªå·ã¨R6-R13ã¯CPUä¾å¤ãã³ãã©å 782 ã§æ 783 å ±ãåå¾ 784 ; ããç®çã§éé¿ãã¦ãã, åºå£å¦çã§ã¯ä¿åå 785 容ãç ´æ£ããã°ãã. 645 rte ; 割込み前の処理に戻る 646 647 648 ; 649 ; CPU例外の出入口処理(アセンブリ言語記述部分) 650 ; 651 ; 呼出し条件: 652 ; ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0. 653 ; ・スタックは多重割り込みなら割込みスタック, そうでなければ 654 ; タスクスタック 655 ; ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと 656 ; PSWが保存されている. 657 ; ・ベクタテーブルに登録された個別の入り口処理により, スタックに 658 ; スクラッチレジスタ(R1-R5)が保存されている. 659 ; 660 ; 引数: 661 ; ・r1:CPU例外要因番号 662 ; ・r2:CPU例外ハンドラのアドレス 663 ; 664 ; レジスタがスタック上にどのように保存されているかを以下に示す. 665 ; この図では上が低位, 下が高位のアドレスで, スタックは下から 666 ; 上方向に向かって積み上げられるものとする. 667 ; なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内で情報を取得 668 ; する目的で退避しており, 出口処理では保存内容を破棄すればよい. 786 669 ; 787 670 ; ------------------------- 788 ; | CPU ä¾å¤è¦å çªå·| <----- p_excinf671 ; | CPU例外要因番号 | <----- p_excinf 789 672 ; ------------------------- (intptr_t)(p_excinf + 0) 790 673 ; | R6(4byte) | … … 829 712 ; ------------------------- (intptr_t)(p_excinf + 80) 830 713 ; 831 ; ããã§ã¯, å²è¾¼ã¿å¦çã¢ã¼ãã«å¤æ´ãã¦ãã³ãã©ãå®è¡ãã. 832 ; CPUä¾å¤ãã³ãã©ã«æ¸¡ãVPåã®å¤æ° p_excinf ã¨ãã¦ISPã®å¤æ¸¡ãï¼ 833 ; 834 ; ãã³ãã©ãããªã¿ã¼ã³ããå¾ã¯, å¤éå²è¾¼ã¿ã§ãªã, ã㤠reqflg ã 835 ; TRUE ã«ãªã£ãæã«ï¼ret_int ã¸åå²(é 836 延ãã£ã¹ããã)ããï¼ 837 ; 838 ; å¤éå²è¾¼ã¿ãã©ããã¯å²è¾¼ã¿ãã¹ãã«ã¦ã³ã¿ã®å¤ã§å¤å®ãã. 839 ; intnest != 0 ãªãã°å¤éå²è¾¼ã¿ã§ããã¨å¤å®ãã. 840 ; 841 ; reqflg ã¯CPUããã¯ç¶æ 842 ã§ãã§ãã¯ãã. ããã§ãªãã¨ï¼ 843 ; reqflg ãã§ãã¯å¾ã«èµ·åãããå²è¾¼ã¿ãã³ãã©å 844 㧠845 ; ãã£ã¹ããããè¦æ±ãããå ´åã«ï¼ãã£ã¹ããããããªã. 846 ; 847 ; 848 ; CPUä¾å¤å 849 ¥å£å¦ç 850 ; 851 ; ããã§ã¯, å²è¾¼ã¿å¦çã¢ã¼ãã«å¤æ´ãã¦ãã³ãã©ãå®è¡ãã. 852 ; 853 854 ; 855 ; CPUä¾å¤ãã³ãã©å¼åºãå¾ã«ä¸è¦ã¨ãªãã¹ã¿ãã¯æ 856 å ±ã®ãµã¤ãº 714 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 715 ; CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す. 716 ; 717 ; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が 718 ; TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する. 719 ; 720 ; 多重割込みかどうかは割込みネストカウンタの値で判定する. 721 ; intnest != 0 ならば多重割込みであると判定する. 722 ; 723 ; reqflg はCPUロック状態でチェックする. そうでないと, 724 ; reqflg チェック後に起動された割込みハンドラ内で 725 ; ディスパッチが要求された場合に,ディスパッチされない. 726 ; 727 ; 728 ; CPU例外入口処理 729 ; 730 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 731 ; 732 733 ; 734 ; CPU例外ハンドラ呼出し後に不要となるスタック情報のサイズ 857 735 ; EXCNO + R6--R13 858 736 ; … … 860 738 861 739 _kernel_exception: 862 pushm r14-r15 ; ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãéé¿740 pushm r14-r15 ; スクラッチレジスタを退避 863 741 pushc fpsw 864 742 mvfacmi r5 865 shll #16, r5 ; ACC æä¸ä½16bitã¯0ã¨ãã743 shll #16, r5 ; ACC最下位16bitは0とする 866 744 mvfachi r4 867 pushm r4-r5 ; ã¢ãã¥ã ã¬ã¼ã¿éé¿868 pushm r6-r13 ; éã¹ã¯ã©ããã¬ã¸ã¹ã¿ä¿å869 push.l r1 ; CPU ä¾å¤è¦å çªå·ãä¿æ870 mov.l r0, r3 ; ã¹ã¿ãã¯ãã¤ã³ã¿ãåãåºã745 pushm r4-r5 ; アキュムレータ退避 746 pushm r6-r13 ; 非スクラッチレジスタ保存 747 push.l r1 ; CPU例外要因番号を保持 748 mov.l r0, r3 ; スタックポインタを取り出し 871 749 mov.l EXC_GET_PSW_OFFSET[r3], r5 872 750 and #PSW_I_MASK, r5 873 bz exception_nonkernel ; å 874 ¨å²è¾¼ã¿ç¦æ¢(CPUããã¯)ç¶æ 875 ãªã管çå¤ 751 bz exception_nonkernel ; 全割込み禁止(CPUロック)状態なら管理外 876 752 #if TIPM_LOCK != -15 877 753 mov.l EXC_GET_PSW_OFFSET[r3], r5 878 754 and #PSW_IPL_MASK, r5 879 755 cmp #IPL_LOCK, r5 880 bgt exception_nonkernel ; IPL ãCPUããã¯ã¬ãã«ä»¥ä¸ãªã管çå¤756 bgt exception_nonkernel ; IPLがCPUロックレベル以上なら管理外 881 757 #endif 882 758 mov.l #__kernel_intnest, r5 883 759 mov.w [r5], r4 884 add #1, r4 ; ãã¹ãåæ°ãã¤ã³ã¯ãªã¡ã³ã760 add #1, r4 ; ネスト回数をインクリメント 885 761 mov.w r4, [r5] 886 cmp #1, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã887 bnz exception_from_int ; å ç®åã0ã§ãªããã°å¤éå²è¾¼ã¿888 ; å段ã®å²è¾¼ã¿889 mov.l #__kernel_istkpt, r5 ; å²è¾¼ã¿ç¨ã®ã¹ã¿ãã¯ã¸åæ¿ãã762 cmp #1, r4 ; 多重割り込みかどうか 763 bnz exception_from_int ; 加算前が0でなければ多重割込み 764 ; 初段の割込み 765 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 890 766 mov.l [r5], r0 891 push.l r3 ; ã¿ã¹ã¯ã¹ã¿ãã¯ãä¿æ892 exception_from_int: ; å¤éå²è¾¼ã¿767 push.l r3 ; タスクスタックを保持 768 exception_from_int: ; 多重割込み 893 769 mov.l EXC_GET_PSW_OFFSET[r3], r5 894 mvtc r5, psw ; CPUä¾å¤çºçåã®ç¶æ 895 ã«æ»ã 770 mvtc r5, psw ; CPU例外発生前の状態に戻す 896 771 #if LOG_EXC_LEAVE == 1 897 push.l r1 ; ãã°ãã¬ã¼ã¹ã®å¼æ°ãä¿æ772 push.l r1 ; ログトレースの引数を保持 898 773 #endif 899 774 900 775 #if LOG_EXC_ENTER == 1 901 776 pushm r2-r3 902 bsr _kernel_log_exc_enter ; ãã°ãã¬ã¼ã¹é¢æ°ã®å¼åºã 903 ; å¼æ°ã®å²è¾¼ã¿è¦å çªå·ã¯æ¢ã«r1ã«å 904 ¥ã£ã¦ãã 777 bsr _kernel_log_exc_enter ; ログトレース関数の呼出し 778 ; 引数の割込み要因番号は既にr1に入っている 905 779 popm r2-r3 906 780 #endif 907 781 908 mov.l r3, r1 ; å¼æ°ã®p_excinfãè¨å®909 jsr r2 ; C ã«ã¼ãã³å¼ã³åºã782 mov.l r3, r1 ; 引数のp_excinfを設定 783 jsr r2 ; Cルーチン呼び出し 910 784 911 785 .if LOG_EXC_LEAVE == 1 912 pop r1 ; å¼æ°ã«å²è¾¼ã¿è¦å çªå·ãè¨å®913 bsr _kernel_log_exc_leave ; ãã°ãã¬ã¼ã¹é¢æ°ã®å¼åºã786 pop r1 ; 引数に割込み要因番号を設定 787 bsr _kernel_log_exc_leave ; ログトレース関数の呼出し 914 788 .endif 915 789 916 clrpsw i ; ããããã¯å¿ 917 ãå²è¾¼ã¿ç¦æ¢ 790 clrpsw i ; ここからは必ず割込み禁止 918 791 mov.l #__kernel_intnest, r5 919 792 mov.w [r5], r4 920 sub #1, r4 ; ãã¹ãåæ°ããã¯ãªã¡ã³ã793 sub #1, r4 ; ネスト回数をデクリメント 921 794 mov.w r4, [r5] 922 cmp #0, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã923 bnz exception_return ; å¤éå²ãè¾¼ã¿ãªããªã¿ã¼ã³924 ; å段ã®å²è¾¼ã¿925 pop r0 ; ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«æ»ã926 mov.l #__kernel_reqflg, r5 ; ãã£ã¹ãããè¦æ±ããªãã?795 cmp #0, r4 ; 多重割り込みかどうか 796 bnz exception_return ; 多重割り込みならリターン 797 ; 初段の割込み 798 pop r0 ; タスクのスタックに戻す 799 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか? 927 800 mov.l [r5], r5 928 801 cmp #1, r5 929 bnz exception_return ; ãªããã°ãªã¿ã¼ã³ 930 add #EXCINF_REG_SIZE, r0 ; CPUä¾å¤æ 931 å ±ã®ç ´æ£ 932 bra ret_int ; ããã° ret_int ã¸ã¸ã£ã³ã 802 bnz exception_return ; なければリターン 803 add #EXCINF_REG_SIZE, r0 ; CPU例外情報の破棄 804 bra ret_int ; あれば ret_int へジャンプ 933 805 934 806 exception_nonkernel: 935 807 mov.l #__kernel_intnest, r5 936 808 mov.w [r5], r4 937 add #1, r4 ; ãã¹ãåæ°ãã¤ã³ã¯ãªã¡ã³ã809 add #1, r4 ; ネスト回数をインクリメント 938 810 mov.w r4, [r5] 939 cmp #1, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã940 bnz exception_from_nonkernelint ; å ç®åã0ã§ãªããã°å¤éå²è¾¼ã¿941 ; å段ã®å²è¾¼ã¿942 mov.l #__kernel_istkpt, r5 ; å²è¾¼ã¿ç¨ã®ã¹ã¿ãã¯ã¸åæ¿ãã811 cmp #1, r4 ; 多重割り込みかどうか 812 bnz exception_from_nonkernelint ; 加算前が0でなければ多重割込み 813 ; 初段の割込み 814 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 943 815 mov.l [r5], r0 944 push.l r3 ; ã¿ã¹ã¯ã¹ã¿ãã¯ãä¿æ945 exception_from_nonkernelint: ; å¤éå²è¾¼ã¿816 push.l r3 ; タスクスタックを保持 817 exception_from_nonkernelint: ; 多重割込み 946 818 mov.l EXC_GET_PSW_OFFSET[r3], r5 947 mvtc r5, psw ; CPUä¾å¤çºçåã®ç¶æ 948 ã«æ»ã 949 950 mov.l r3, r1 ; å¼æ°ã®p_excinfãè¨å® 951 jsr r2 ; Cã«ã¼ãã³å¼ã³åºã 952 953 clrpsw i ; ããããã¯å¿ 954 ãå²è¾¼ã¿ç¦æ¢ 819 mvtc r5, psw ; CPU例外発生前の状態に戻す 820 821 mov.l r3, r1 ; 引数のp_excinfを設定 822 jsr r2 ; Cルーチン呼び出し 823 824 clrpsw i ; ここからは必ず割込み禁止 955 825 mov.l #__kernel_intnest, r5 956 826 mov.w [r5], r4 957 sub #1, r4 ; ãã¹ãåæ°ããã¯ãªã¡ã³ã827 sub #1, r4 ; ネスト回数をデクリメント 958 828 mov.w r4, [r5] 959 cmp #0, r4 ; å¤éå²ãè¾¼ã¿ãã©ãã960 bnz exception_return ; å¤éå²ãè¾¼ã¿ãªããªã¿ã¼ã³961 ; å段ã®å²è¾¼ã¿962 pop r0 ; ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«æ»ã829 cmp #0, r4 ; 多重割り込みかどうか 830 bnz exception_return ; 多重割り込みならリターン 831 ; 初段の割込み 832 pop r0 ; タスクのスタックに戻す 963 833 964 834 exception_return: 965 add #EXCINF_REG_SIZE, r0 ; CPUä¾å¤æ 966 å ±ã®ç ´æ£ 967 popm r4-r5 ; ã¢ãã¥ã ã¬ã¼ã¿å¾©å¸° 968 mvtaclo r5 ; ACCæä¸ä½16bitã¯0ã§å¾©å¸° 835 add #EXCINF_REG_SIZE, r0 ; CPU例外情報の破棄 836 popm r4-r5 ; アキュムレータ復帰 837 mvtaclo r5 ; ACC最下位16bitは0で復帰 969 838 mvtachi r4 970 popc fpsw ; FPU ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿å¾©å¸°971 popm r14-r15 ; ã¬ã¸ã¹ã¿å¾©å¸°839 popc fpsw ; FPUステータスレジスタ復帰 840 popm r14-r15 ; レジスタ復帰 972 841 popm r1-r5 973 rte ; å²è¾¼ã¿åã®å¦çã«æ»ã 974 975 976 ; 977 ; å¾®å°æéå¾ 978 ã¡ 842 rte ; 割込み前の処理に戻る 843 844 845 ; 846 ; 微少時間待ち 979 847 ; 980 848 _sil_dly_nse: -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.