Ignore:
Timestamp:
Jul 23, 2017, 2:29:40 PM (7 years ago)
Author:
coas-nagasima
Message:

SVNプロパティを設定

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  
    1111;   Copyright (C) 2013      by Mitsuhiro Matsuura
    1212;
    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;       免責すること.
    4935
    50 ;   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    51 ãŠ
    52 ;   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    53 ;   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    54 ;   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    55 ;   ã®è²¬ä»»ã‚’負わない.
     36;   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     37;   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     38;   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     39;   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     40;   の責任を負わない.
    5641
    5742;
    5843
    5944;
    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
    11678;                                       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
    12283;                                       add             #TCB_sp, r15, r5
    12384;                                       mov.l   r0, [r5]
    124 ;               å„オフセット値を判断し, 条件アセンブルによりコードを切り替える
    125 ;
    126 
    127 ;
    128 æ§‹é€ ä½“アクセスのオフセット定義
     85;               各オフセット値を判断し, 条件アセンブルによりコードを切り替える
     86;
     87
     88;
     89構造体アクセスのオフセット定義
    12990;
    13091        .include        offset.inc
    13192
    13293;
    133 å„種EQU定義(Hファイルの#define定義)
     94各種EQU定義(Hファイルの#define定義)
    13495;
    13596        .include        asm_config.inc
     
    183144
    184145;
    185 ;  TCB_sp への書込みマクロ
     146;  TCB_sp への書込みマクロ
    186147;
    187148st_TCB_sp       .macro  src, tcb, tmp
     
    195156
    196157;
    197 ;  TCB_sp からの読出しマクロ
     158;  TCB_sp からの読出しマクロ
    198159;
    199160ld_TCB_sp       .macro  dst, tcb, tmp
     
    207168
    208169;
    209 ;  TCB_pc への書込みマクロ
     170;  TCB_pc への書込みマクロ
    210171;
    211172st_TCB_pc       .macro  src, tcb, tmp
     
    219180
    220181;
    221 ;  TCB_pc からの読出しマクロ
     182;  TCB_pc からの読出しマクロ
    222183;
    223184ld_TCB_pc       .macro  dst, tcb, tmp
     
    231192
    232193;
    233 ;  TCB_texptn からの読出しマクロ
     194;  TCB_texptn からの読出しマクロ
    234195;
    235196ld_TCB_texptn   .macro  dst, tcb, tmp
     
    243204
    244205;
    245 ;  TCB_p_tinib からの読出しマクロ
     206;  TCB_p_tinib からの読出しマクロ
    246207;
    247208ld_TCB_p_tinib  .macro  dst, tcb, tmp
     
    255216
    256217;
    257 ;  TINIB_exinf からの読出しマクロ
     218;  TINIB_exinf からの読出しマクロ
    258219;
    259220ld_TINIB_exinf  .macro  dst, tinib, tmp
     
    267228
    268229;
    269 ;  TINIB_task からの読出しマクロ
     230;  TINIB_task からの読出しマクロ
    270231;
    271232ld_TINIB_task   .macro  dst, tinib, tmp
     
    282243
    283244;
    284 ;  APIからのタスクディスパッチャå
    285 ¥å£
    286 ;
    287 ;  呼び出し条件:
    288 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    289 §)
    290 ;
    291 ;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
     245;  APIからのタスクディスパッチャ入口
     246;
     247;  呼び出し条件:
     248;       ・ディスパッチャモード(ファイルヘッダ参照)
     249;
     250;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
    292251;
    293252__kernel_dispatch:
    294         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     253        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    295254        mov.l   #__kernel_p_runtsk, r15
    296255        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に保存
    299258        bra             dispatcher
    300259
    301260;
    302 ;  APIへのタスクディスパッチャ出口
    303 ;
    304 ;  呼び出し条件:
    305 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    306 §)
    307 ;
    308 ;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
     261;  APIへのタスクディスパッチャ出口
     262;
     263;  呼び出し条件:
     264;       ・ディスパッチャモード(ファイルヘッダ参照)
     265;
     266;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
    309267;
    310268dispatch_r:
    311         btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
     269        btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
    312270        bz      dispatch_r_rts
    313         ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
     271        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    314272        cmp             #0, r5
    315273        bz      dispatch_r_rts
    316         bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
     274        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    317275dispatch_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ロック解除状態にし, タスクを起動する.
    332286;
    333287__kernel_start_r:
    334288        mov.l   #_ext_tsk, r5
    335         push.l  r5                                                      ; 戻り番地をスタックに積む
     289        push.l  r5                                                      ; 戻り番地をスタックに積む
    336290        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                      ; タスクの起動番地を取得
    340293.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 )
    356301.endif
    357302        jmp             r5
    358303
    359304;
    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;  ここでは, ディスパッチャモードに変更する.
    374315;
    375316__kernel_start_dispatch:
    376317        mov.l   #__kernel_intnest, r5
    377         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     318        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    378319.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 のアドレス取得だけは行なう.
    398332;
    399333__exit_and_dispatch:
     
    401335
    402336;
    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 からきた場合                    : 割込みスタック
    415349;
    416350dispatcher:
    417351.if     LOG_DSP_ENTER == 1
    418352        push.l  r15
    419         mov.l   r14, r1                                         ; 引数(ディスパッチå
    420 ƒTCB)を設定
     353        mov.l   r14, r1                                         ; 引数(ディスパッチ元TCB)を設定
    421354        bsr             _kernel_log_dsp_enter
    422355        pop.l   r15
    423356.endif
    424357        mov.l   #__kernel_p_schedtsk, r5     
    425         mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
     358        mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
    426359        mov.l   [r15], r14
    427360        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                             ; タスクスタックポインタを復帰
    430363.if     LOG_DSP_LEAVE == 1
    431364        push.l  r14
    432         mov.l   r14, r1                                         ; 引数(ディスパッチå
    433 ˆTCB)を設定
     365        mov.l   r14, r1                                         ; 引数(ディスパッチ先TCB)を設定
    434366        bsr             _kernel_log_dsp_leave
    435367        pop.l   r14
    436368.endif
    437369        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つの意味がある.
    449379;
    450380dispatcher_pre_idle:
    451381        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]                                        ; 非タスクコンテキストに切換え
    455385.if     TIPM_LOCK != -15
    456         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    457 ‹ã¸
     386        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    458387        mov.l   #0, [r5]
    459         mvtc    #0, psw                                         ; 優å
    460 ˆåº¦0の割込み処理中を偽è£
    461 
     388        mvtc    #0, psw                                         ; 優先度0の割込み処理中を偽装
    462389.endif
    463390
    464391dispatcher_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 なら
    471396        mov.l   [r5], r4
    472397        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]                                        ; タスクコンテキストに切換え
    477402.if     TIPM_LOCK != -15
    478         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    479 ‹ã¸
     403        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    480404        mov.l   #1, [r5]
    481405        mov.l   #__kernel_saved_ipl, r5
    482406        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; モードとスタックを非タスクコンテキスト用に切り替え.
    498417;
    499418        .glb    __kernel_call_exit_kernel
    500419__kernel_call_exit_kernel:
    501420.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ロック解除状態へ
    506423        mov.l   #0, [r5]
    507424.endif
    508425        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]                                        ; 非タスクコンテキストに切換え
    512429        bsr             __kernel_exit_kernel
    513430        bra             __kernel_call_exit_kernel
     
    515432
    516433;
    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レジスタへのオフセット
    540449;  ACC + FPSW + R14--R15 + R1--R5 + PC
    541450;
     
    544453ret_int:
    545454.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値取得
    547456        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ロック状態へ
    556461        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値取得
    558463        and             #PSW_IPL_MASK, r5
    559464        mov.l   #__kernel_saved_ipl, r4
    560465        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                                                                                ; 割込み優先度マスク全解除でない状態
    568468.endif
    569469        mov.l   #__kernel_reqflg, r5
     
    571471        mov.l   #__kernel_p_runtsk, r15     
    572472        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 へ
    574474        mov.l   [r5], r5
    575475        cmp             #0, r5
     
    577477        mov.l   #__kernel_p_schedtsk, r5
    578478        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に保存
    584484        bra             dispatcher
    585485
    586486;
    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:                                    ;タスクモニタ用ラベル
    598496ret_int_r:
    599         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     497        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    600498ret_int_r_call_tex:
    601         btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
     499        btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
    602500        bz      ret_int_r_rte
    603         ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
     501        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    604502        cmp             #0, r5
    605503        bz      ret_int_r_rte
    606         bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
     504        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    607505ret_int_r_rte:
    608506.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ロック解除状態へ
    613509        mov.l   #0, [r5]
    614510.endif
    615         popm    r4-r5                                           ; アキュムレータ復帰
    616         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     511        popm    r4-r5                                           ; アキュムレータ復帰
     512        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    617513        mvtachi r4
    618         popc    fpsw                                            ; FPUステータスレジスタ復帰
    619         popm    r14-r15                                         ; レジスタ復帰
     514        popc    fpsw                                            ; FPUステータスレジスタ復帰
     515        popm    r14-r15                                         ; レジスタ復帰
    620516        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;  上方向に向かって積み上げられるものとする.
    646540;
    647541;       -------------------------
     
    671565;       -------------------------(SP + 44)
    672566;
    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;  ディスパッチが要求された場合に,ディスパッチされない.
    687578;
    688579_kernel_interrupt:
    689         pushm   r14-r15                                         ; スクラッチレジスタを退避
    690         pushc   fpsw                                            ; FPUステータスレジスタ退避
     580        pushm   r14-r15                                         ; スクラッチレジスタを退避
     581        pushc   fpsw                                            ; FPUステータスレジスタ退避
    691582        mvfacmi r5
    692         shll    #16, r5                                         ; ACC最下位16bitは0とする
     583        shll    #16, r5                                         ; ACC最下位16bitは0とする
    693584        mvfachi r4
    694         pushm   r4-r5                                           ; アキュムレータ退避
     585        pushm   r4-r5                                           ; アキュムレータ退避
    695586        mov.l   #__kernel_intnest, r5
    696587        mov.w   [r5], r4
    697         add             #1, r4                                          ; ネスト回数をインクリメント
     588        add             #1, r4                                          ; ネスト回数をインクリメント
    698589        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            ; 割込み用のスタックへ切替える
    704595        mov.l   [r5], r0
    705         push.l  r3                                                      ; タスクスタックを保持
    706 interrupt_from_int:             ; 多重割込み
    707         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    708 ‹)
     596        push.l  r3                                                      ; タスクスタックを保持
     597interrupt_from_int:             ; 多重割込み
     598        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    709599
    710600.if     LOG_INH_LEAVE == 1
    711         push.l  r1                                                      ; ログトレースの引数を保持
     601        push.l  r1                                                      ; ログトレースの引数を保持
    712602.endif
    713603
    714604.if     LOG_INH_ENTER == 1
    715605        push.l  r2
    716         bsr             _kernel_log_inh_enter           ; ログトレース関数の呼出し
    717                                                         ; 引数の割込み要因番号は既にr1にå
    718 ¥ã£ã¦ã„ã‚‹
     606        bsr             _kernel_log_inh_enter           ; ログトレース関数の呼出し
     607                                                        ; 引数の割込み要因番号は既にr1に入っている
    719608        pop             r2
    720609.endif
    721610
    722         jsr     r2                                                      ; Cルーチン呼び出し
     611        jsr     r2                                                      ; Cルーチン呼び出し
    723612
    724613.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ロック状態)
    731619        mov.l   #__kernel_intnest, r5
    732620        mov.w   [r5], r4
    733         sub             #1, r4                                          ; ネスト回数をデクリメント
     621        sub             #1, r4                                          ; ネスト回数をデクリメント
    734622        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            ; ディスパッチ要求がないか?
    740628        mov.l   [r5], r5
    741629        cmp             #1, r5
    742         bz              ret_int                                         ; あれば ret_int へジャンプ
     630        bz              ret_int                                         ; あれば ret_int へジャンプ
    743631interrupt_return:
    744         popm    r4-r5                                           ; アキュムレータ復帰
    745         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     632        popm    r4-r5                                           ; アキュムレータ復帰
     633        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    746634        mvtachi r4
    747         popc    fpsw                                            ; FPUステータスレジスタ復帰
    748         popm    r14-r15                                         ; レジスタ復帰
     635        popc    fpsw                                            ; FPUステータスレジスタ復帰
     636        popm    r14-r15                                         ; レジスタ復帰
    749637        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;  する目的で退避しており, 出口処理では保存内容を破棄すればよい.
    779662;
    780663;       -------------------------
    781 ;       |    CPU例外要因番号    | <----- p_excinf
     664;       |    CPU例外要因番号    | <----- p_excinf
    782665;       ------------------------- (intptr_t)(p_excinf + 0)
    783666;       |       R6(4byte)       |
     
    822705;       ------------------------- (intptr_t)(p_excinf + 80)
    823706;
    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例外ハンドラ呼出し後に不要となるスタック情報のサイズ
    850728;  EXCNO + R6--R13
    851729;
     
    853731
    854732_kernel_exception:
    855         pushm   r14-r15                                         ; スクラッチレジスタを退避
     733        pushm   r14-r15                                         ; スクラッチレジスタを退避
    856734        pushc   fpsw
    857735        mvfacmi r5
    858         shll    #16, r5                                         ; ACC最下位16bitは0とする
     736        shll    #16, r5                                         ; ACC最下位16bitは0とする
    859737        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                                          ; スタックポインタを取り出し
    864742        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    865743        and             #PSW_I_MASK, r5
    866         bz              exception_nonkernel                     ; å
    867 ¨å‰²è¾¼ã¿ç¦æ­¢(CPUロック)状æ
    868 ‹ãªã‚‰ç®¡ç†å¤–
     744        bz              exception_nonkernel                     ; 全割込み禁止(CPUロック)状態なら管理外
    869745.if     TIPM_LOCK != -15
    870746        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    871747        and             #PSW_IPL_MASK, r5
    872748        cmp             #IPL_LOCK, r5
    873         bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
     749        bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
    874750.endif
    875751        mov.l   #__kernel_intnest, r5
    876752        mov.w   [r5], r4
    877         add             #1, r4                                          ; ネスト回数をインクリメント
     753        add             #1, r4                                          ; ネスト回数をインクリメント
    878754        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            ; 割込み用のスタックへ切替える
    883759        mov.l   [r5], r0
    884         push.l  r3                                                      ; タスクスタックを保持
    885 exception_from_int:             ; 多重割込み
     760        push.l  r3                                                      ; タスクスタックを保持
     761exception_from_int:             ; 多重割込み
    886762        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    887         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    888 ‹ã«æˆ»ã™
     763        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
    889764.if     LOG_EXC_LEAVE == 1
    890         push.l  r1                                                      ; ログトレースの引数を保持
     765        push.l  r1                                                      ; ログトレースの引数を保持
    891766.endif
    892767
    893768.if     LOG_EXC_ENTER == 1
    894769        pushm   r2-r3
    895         bsr             _kernel_log_exc_enter           ; ログトレース関数の呼出し
    896                                                         ; 引数の割込み要因番号は既にr1にå
    897 ¥ã£ã¦ã„ã‚‹
     770        bsr             _kernel_log_exc_enter           ; ログトレース関数の呼出し
     771                                                        ; 引数の割込み要因番号は既にr1に入っている
    898772        popm    r2-r3
    899773.endif
    900774
    901         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    902         jsr     r2                                                      ; Cルーチン呼び出し
     775        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     776        jsr     r2                                                      ; Cルーチン呼び出し
    903777
    904778.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                                                       ; ここからは必ず割込み禁止
    911784        mov.l   #__kernel_intnest, r5
    912785        mov.w   [r5], r4
    913         sub             #1, r4                                          ; ネスト回数をデクリメント
     786        sub             #1, r4                                          ; ネスト回数をデクリメント
    914787        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            ; ディスパッチ要求がないか?
    920793        mov.l   [r5], r5
    921794        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 へジャンプ
    926798
    927799exception_nonkernel:
    928800        mov.l   #__kernel_intnest, r5
    929801        mov.w   [r5], r4
    930         add             #1, r4                                          ; ネスト回数をインクリメント
     802        add             #1, r4                                          ; ネスト回数をインクリメント
    931803        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            ; 割込み用のスタックへ切替える
    936808        mov.l   [r5], r0
    937         push.l  r3                                                      ; タスクスタックを保持
    938 exception_from_nonkernelint:    ; 多重割込み
     809        push.l  r3                                                      ; タスクスタックを保持
     810exception_from_nonkernelint:    ; 多重割込み
    939811        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                                                       ; ここからは必ず割込み禁止
    948818        mov.l   #__kernel_intnest, r5
    949819        mov.w   [r5], r4
    950         sub             #1, r4                                          ; ネスト回数をデクリメント
     820        sub             #1, r4                                          ; ネスト回数をデクリメント
    951821        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                                                      ; タスクのスタックに戻す
    956826
    957827exception_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で復帰
    962831        mvtachi r4
    963         popc    fpsw                                            ; FPUステータスレジスタ復帰
    964         popm    r14-r15                                         ; レジスタ復帰
     832        popc    fpsw                                            ; FPUステータスレジスタ復帰
     833        popm    r14-r15                                         ; レジスタ復帰
    965834        popm    r1-r5
    966         rte                                                                     ; 割込み前の処理に戻る
    967 
    968 
    969 ;
    970 ;  微少時間å¾
    971 ã¡
     835        rte                                                                     ; 割込み前の処理に戻る
     836
     837
     838;
     839;  微少時間待ち
    972840;
    973841_sil_dly_nse:
Note: See TracChangeset for help on using the changeset viewer.