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