Ignore:
Timestamp:
Mar 8, 2016, 8:37:45 PM (8 years ago)
Author:
coas-nagasima
Message:

MIMEにSJISを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • UsbWattMeter/trunk/asp_dcre/arch/rx630_ccrx/prc_support.src

    • Property svn:mime-type set to text/plain; charset=SHIFT_JIS
    r164 r167  
    1111;   Copyright (C) 2013      by Mitsuhiro Matsuura
    1212
    13 ;   ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    14 ;   ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    15 ;   •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    16 ;   (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    17 ;       Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    18 ;       ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    19 ;   (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    20 ;       —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    21 ƒƒ“ƒgi—˜—p
    22 ;       ŽÒƒ}ƒjƒ
    23 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    24 ;       ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    25 ;   (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    26 ;       —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    27 ;       ‚ƁD
    28 ;     (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    29 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    30 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    31 ;         ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    32 ;     (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    33 ;         •ñ‚·‚邱‚ƁD
    34 ;   (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    35 ;       ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    36 ;       ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    37 ;       —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    38 ;       –Ɛӂ·‚邱‚ƁD
     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;       免責すること.
    3935
    40 ;   –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    41 ;   ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    42 ;   ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    43 ;   ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    44 ;   ‚̐ӔC‚𕉂í‚È‚¢D
     36;   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     37;   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     38;   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     39;   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     40;   の責任を負わない.
    4541
    4642;  @(#) $Id: prc_support.src 536 2014-10-09 23:11:40Z coas-nagasima $
     
    4844
    4945;
    50 ;  ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ
    51 [ƒ‹ ƒAƒZƒ“ƒuƒŠŒ¾Œê•”iRX630—pj
    52 ;
    53 
    54 ;
    55 ;  ƒfƒBƒXƒpƒbƒ`ƒƒ‚¨‚æ‚ÑŠ„ž‚Ý(CPU—áŠO)o“ü‚èŒû‚̃‹[ƒ‹:
    56 ;       “®ìƒ‚[ƒh‚ðˆÈ‰º‚̂悤‚É’è‹`‚·‚é.
    57 ;               ƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh:
    58 ;                       CPUƒƒbƒNó‘Ô, Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô,
    59 ;                       ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(intnest = 0), ƒ^ƒXƒNƒXƒ^ƒbƒN
    60 ;               Š„ž‚Ý(CPU—áŠO)ˆ—ƒ‚[ƒh
    61 ;                       ‘SŠ„ž‚݃ƒbƒNó‘Ô(PSWƒŒƒWƒXƒ^Iƒrƒbƒg = 0),
    62 ;                       Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœ‚Å‚È‚¢ó‘Ô(IPL != 0)
    63 ;                       Š„ž‚݃Rƒ“ƒeƒLƒXƒg(intnest != 0), Š„ž‚݃Xƒ^ƒbƒN
    64 ;
    65 ;       ƒJ[ƒlƒ‹ŠÇ—ŠOŠ„ž‚݂̃Tƒ|[ƒg—L–³‚Æ, CPUƒƒbƒNó‘Ô, Š„ž‚Ý—Dæ“x
    66 ;       ƒ}ƒXƒN‘S‰ðœó‘Ô‚ÌŠÖŒW‚͈ȉº‚Ì’Ê‚è‚Å‚ ‚é.
    67 ;               ƒJ[ƒlƒ‹ŠÇ—ŠOŠ„ž‚Ý–¢ƒTƒ|[ƒgŽž:
    68 ;                       CPUƒƒbƒNó‘Ô(PSWƒŒƒWƒXƒ^Iƒrƒbƒg = 0)
    69 ;                       Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô(IPL = 0)
    70 ;               ƒJ[ƒlƒ‹ŠÇ—ŠOŠ„ž‚݃Tƒ|[ƒgŽž:
    71 ;                       CPUƒƒbƒNó‘Ô
    72 ;                               (PSWƒŒƒWƒXƒ^Iƒrƒbƒg = 0, IPL = IPL_LOCK, lock_flag = true)
    73 ;                       Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô(saved_ipl = 0)
    74 ;
    75 ;       Še\‘¢‘̃|ƒCƒ“ƒ^‚ðˆÈ‰º‚̂悤‚ÉŠeƒŒƒWƒXƒ^‚ɃAƒTƒCƒ“‚·‚é.
    76 ;               r15 = p_runtsk  ‚½‚¾‚µƒfƒBƒXƒpƒbƒ`ƒƒ‚ÌŠeoŒû‚Å‚Í–³Œø
    77 ;               r14 = *p_runtsk dispatcher ‚Ì’†‚Å‚Í p_runtsk Šm’莞‚ɍĎ擾‚·‚é
    78 ;       Še“ü‚èŒû‚©‚çÅ‰‚ɕϐ”ƒAƒNƒZƒX‚·‚é‚Æ‚«‚ɏã‹LƒŒƒWƒXƒ^‚É•Û‘¶‚·‚é.
    79 ;
    80 ;       \‘¢‘̃Aƒ‰ƒCƒƒ“ƒg‚ւ̑Ήž
    81 ;               \‘¢‘̃Aƒ‰ƒCƒƒ“ƒg‚ª4Byte(ƒAƒ“ƒpƒbƒN)‚̏ꍇ:
    82 ;                       ˆê”Ê“I‚ȃŒƒWƒXƒ^‘Š‘΃AƒhƒŒƒbƒVƒ“ƒO‚ª‰Â”\
    83 ;                               —á:     mov.l   #__kernel_p_runtsk, r15
     46;  プロセッサ依存モジュール アセンブリ言語部(RX630用)
     47;
     48
     49;
     50;  ディスパッチャおよび割込み(CPU例外)出入り口のルール:
     51;       動作モードを以下のように定義する.
     52;               ディスパッチャモード:
     53;                       CPUロック状態, 割込み優先度マスク全解除状態,
     54;                       タスクコンテキスト(intnest = 0), タスクスタック
     55;               割込み(CPU例外)処理モード
     56;                       全割込みロック状態(PSWレジスタIビット = 0),
     57;                       割込み優先度マスク全解除でない状態(IPL != 0)
     58;                       割込みコンテキスト(intnest != 0), 割込みスタック
     59;
     60;       カーネル管理外割込みのサポート有無と, CPUロック状態, 割込み優先度
     61;       マスク全解除状態の関係は以下の通りである.
     62;               カーネル管理外割込み未サポート時:
     63;                       CPUロック状態(PSWレジスタIビット = 0)
     64;                       割込み優先度マスク全解除状態(IPL = 0)
     65;               カーネル管理外割込みサポート時:
     66;                       CPUロック状態
     67;                               (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true)
     68;                       割込み優先度マスク全解除状態(saved_ipl = 0)
     69;
     70;       各構造体ポインタを以下のように各レジスタにアサインする.
     71;               r15 = p_runtsk  ただしディスパッチャの各出口では無効
     72;               r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する
     73;       各入り口から最初に変数アクセスするときに上記レジスタに保存する.
     74;
     75;       構造体アライメントへの対応
     76;               構造体アライメントが4Byte(アンパック)の場合:
     77;                       一般的なレジスタ相対アドレッシングが可能
     78;                               例:      mov.l   #__kernel_p_runtsk, r15
    8479;                                       mov.l   r0, TCB_sp[r15]
    85 ;               \‘¢‘̃Aƒ‰ƒCƒƒ“ƒg‚ª4Byte‚Å‚Í‚È‚¢(ƒpƒbƒN)‚̏ꍇ:
    86 ;                       mov.l‚̂悤‚Ƀƒ“ƒOƒTƒCƒYŽw’è‚̏ꍇA‘Š‘Î’l‚Í4‚Ì”{”‚Ì‚Ý—LŒø
    87 ;                       ‚±‚Ì‚½‚ß, ˆê“x‘ΏۃAƒhƒŒƒX‚ð‹‚ß‚Ä‚©‚çƒAƒNƒZƒX‚·‚é•K—v‚ª‚ ‚é
    88 ;                               —á:     mov.l   #__kernel_p_runtsk, r15
     80;               構造体アライメントが4Byteではない(パック)の場合:
     81;                       mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効
     82;                       このため, 一度対象アドレスを求めてからアクセスする必要がある
     83;                               :      mov.l   #__kernel_p_runtsk, r15
    8984;                                       add             #TCB_sp, r15, r5
    9085;                                       mov.l   r0, [r5]
    91 ;               ŠeƒIƒtƒZƒbƒg’l‚ð”»’f‚µ, ðŒƒAƒZƒ“ƒuƒ‹‚É‚æ‚èƒR[ƒh‚ðØ‚è‘Ö‚¦‚é
    92 ;
    93 
    94 ;
    95 \‘¢‘̃AƒNƒZƒX‚̃IƒtƒZƒbƒg’è‹`
     86;               各オフセット値を判断し, 条件アセンブルによりコードを切り替える
     87;
     88
     89;
     90構造体アクセスのオフセット定義
    9691;
    9792        .include        offset.inc
    9893
    9994;
    100 ŠeŽíEQU’è‹`(Hƒtƒ@ƒCƒ‹‚Ì#define’è‹`)
     95各種EQU定義(Hファイルの#define定義)
    10196;
    10297        .include        asm_config.inc
     
    150145
    151146;
    152 ;  TCB_sp ‚ւ̏‘ž‚݃}ƒNƒ
     147;  TCB_sp への書込みマクロ
    153148;
    154149st_TCB_sp       .macro  src, tcb, tmp
     
    162157
    163158;
    164 ;  TCB_sp ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     159;  TCB_sp からの読出しマクロ
    165160;
    166161ld_TCB_sp       .macro  dst, tcb, tmp
     
    174169
    175170;
    176 ;  TCB_pc ‚ւ̏‘ž‚݃}ƒNƒ
     171;  TCB_pc への書込みマクロ
    177172;
    178173st_TCB_pc       .macro  src, tcb, tmp
     
    186181
    187182;
    188 ;  TCB_pc ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     183;  TCB_pc からの読出しマクロ
    189184;
    190185ld_TCB_pc       .macro  dst, tcb, tmp
     
    198193
    199194;
    200 ;  TCB_texptn ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     195;  TCB_texptn からの読出しマクロ
    201196;
    202197ld_TCB_texptn   .macro  dst, tcb, tmp
     
    210205
    211206;
    212 ;  TCB_p_tinib ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     207;  TCB_p_tinib からの読出しマクロ
    213208;
    214209ld_TCB_p_tinib  .macro  dst, tcb, tmp
     
    222217
    223218;
    224 ;  TINIB_exinf ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     219;  TINIB_exinf からの読出しマクロ
    225220;
    226221ld_TINIB_exinf  .macro  dst, tinib, tmp
     
    234229
    235230;
    236 ;  TINIB_task ‚©‚ç‚̓Ǐo‚µƒ}ƒNƒ
     231;  TINIB_task からの読出しマクロ
    237232;
    238233ld_TINIB_task   .macro  dst, tinib, tmp
     
    249244
    250245;
    251 ;  API‚©‚ç‚̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ“üŒû
    252 ;
    253 ŒÄ‚яo‚µðŒ:
    254 ;       EƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    255 ;
    256 ‚±‚±‚Å‚Í, ƒRƒ“ƒeƒLƒXƒg‚Ì‘Þ”ð‚Æ, ŽÀsÄŠJ”Ô’n‚̐ݒè‚ð‚·‚é.
     246;  APIからのタスクディスパッチャ入口
     247;
     248呼び出し条件:
     249;       ・ディスパッチャモード(ファイルヘッダ参照)
     250;
     251ここでは, コンテキストの退避と, 実行再開番地の設定をする.
    257252;
    258253__kernel_dispatch:
    259         pushm   r6-r13                                          ; ”ñƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^•Û‘¶
     254        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    260255        mov.l   #__kernel_p_runtsk, r15
    261256        mov.l   [r15], r14
    262         st_TCB_sp       r0, r14, r5                             ; ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðTCB‚É•Û‘¶
    263         st_TCB_pc       #dispatch_r, r14, r5    ; ŽÀsÄŠJ”Ô’n‚ðTCB‚É•Û‘¶
     257        st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
     258        st_TCB_pc       #dispatch_r, r14, r5    ; 実行再開番地をTCBに保存
    264259        bra             dispatcher
    265260
    266261;
    267 ;  API‚ւ̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒoŒû
    268 ;
    269 ŒÄ‚яo‚µðŒ:
    270 ;       EƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    271 ;
    272 ‚±‚±‚Å‚Í, ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰ŒÄo‚µ‚Æ, ƒRƒ“ƒeƒLƒXƒg‚Ì•œ‹A‚ð‚·‚é.
     262;  APIへのタスクディスパッチャ出口
     263;
     264呼び出し条件:
     265;       ・ディスパッチャモード(ファイルヘッダ参照)
     266;
     267ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
    273268;
    274269dispatch_r:
    275         btst    #TCB_enatex_bit, TCB_enatex[r14]        ; ƒ^ƒXƒN—áŠOˆ—‹–‰Â?
     270        btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
    276271        bz      dispatch_r_rts
    277         ld_TCB_texptn   r5, r14, r4                     ; •Û—¯—áŠO—vˆö‚ª‚ ‚é‚©H
     272        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    278273        cmp             #0, r5
    279274        bz      dispatch_r_rts
    280         bsr             __kernel_call_texrtn            ; ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰ŒÄo‚µˆ—ŽÀs
     275        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    281276dispatch_r_rts:
    282         popm    r6-r13                                          ; ”ñƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^•œ‹A
    283         rts                                     ; dispatch ŒÄ‚яo‚µŒ³‚Ö–ß‚é.
    284 
    285 ;
    286 ƒ^ƒXƒN‹N“®ˆ—(ƒ^ƒXƒNæ“ª‚ւ̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒoŒû)
    287 ;
    288 ŒÄ‚яo‚µðŒ:
    289 ;       EƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    290 ;
    291 ‚±‚±‚Å‚Í, CPUƒƒbƒN‰ðœó‘Ô‚É‚µ, ƒ^ƒXƒN‚ð‹N“®‚·‚é.
     277        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     278        rts                                     ; dispatch 呼び出し元へ戻る.
     279
     280;
     281タスク起動処理(タスク先頭へのタスクディスパッチャ出口)
     282;
     283呼び出し条件:
     284;       ・ディスパッチャモード(ファイルヘッダ参照)
     285;
     286ここでは, CPUロック解除状態にし, タスクを起動する.
    292287;
    293288__kernel_start_r:
    294289        mov.l   #_ext_tsk, r5
    295         push.l  r5                                                      ; –ß‚è”Ô’n‚ðƒXƒ^ƒbƒN‚ɐςÞ
     290        push.l  r5                                                      ; 戻り番地をスタックに積む
    296291        ld_TCB_p_tinib  r5, r14, r4
    297         ld_TINIB_exinf  r1, r5, r4                      ; Šg’£î•ñ‚ð‘æˆêˆø”‚ɐݒè
    298         ld_TINIB_task   r5, r5, r4                      ; ƒ^ƒXƒN‚Ì‹N“®”Ô’n‚ðŽæ“¾
     292        ld_TINIB_exinf  r1, r5, r4                      ; 拡張情報を第一引数に設定
     293        ld_TINIB_task   r5, r5, r4                      ; タスクの起動番地を取得
    299294.if     TIPM_LOCK == -15
    300         setpsw  i                                                       ; Š„ž‚Ý‹–‰Â(CPUƒƒbƒN‰ðœó‘Ô)
    301 .else
    302         mov.l   #__kernel_lock_flag, r4         ; CPUƒƒbƒN‰ðœó‘Ô‚Ö
    303         mov.l   #0, [r4]                                        ; ‚±‚±‚É—ˆ‚é‚Æ‚«‚Í•K‚¸ saved_ipl ‚Ì
    304         mvtc    #00010000H, psw                         ; ’l‚Í 0 ‚Ì‚½‚ß, ’¼’l‚ðÝ’è‚·‚é.
    305                                                                 ; ‘SŠ„ž‚݃ƒbƒN‰ðœó‘Ô( I = 1 )
    306                                                                 ; Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô( IPL = 0 )
     295        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
     296.else
     297        mov.l   #__kernel_lock_flag, r4         ; CPUロック解除状態へ
     298        mov.l   #0, [r4]                                        ; ここに来るときは必ず saved_ipl の
     299        mvtc    #00010000H, psw                         ; 値は 0 のため, 直値を設定する.
     300                                                                ; 全割込みロック解除状態( I = 1 )
     301                                                                ; 割込み優先度マスク全解除状態( IPL = 0 )
    307302.endif
    308303        jmp             r5
    309304
    310305;
    311 ƒJ[ƒlƒ‹‹N“®‚©‚ç‚̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ“üŒû
    312 ;
    313 ‚±‚̃‹[ƒ`ƒ“‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɁC‚·‚ׂĂ̊„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô
    314 ; iŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™j‚ŌĂяo‚³‚ê‚éD‚Ü‚½CŠ„ž‚݃‚[ƒhi”ñ
    315 ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ“¯“™j‚ŌĂяo‚³‚ê‚邱‚Æ‚ð‘z’肵‚Ä‚¢‚éD
    316 ;
    317 ŒÄ‚яo‚µðŒ:
    318 ;       EŠ„ž‚Ý(CPU—áŠO)ˆ—ƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    319 ;
    320 ‚±‚±‚Å‚Í, ƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh‚ɕύX‚·‚é.
     306カーネル起動からのタスクディスパッチャ入口
     307;
     308このルーチンは,カーネル起動時に,すべての割込みを禁止した状態
     309; (割込みロック状態と同等)で呼び出される.また,割込みモード(非
     310タスクコンテキストと同等)で呼び出されることを想定している.
     311;
     312呼び出し条件:
     313;       ・割込み(CPU例外)処理モード(ファイルヘッダ参照)
     314;
     315ここでは, ディスパッチャモードに変更する.
    321316;
    322317__kernel_start_dispatch:
    323318        mov.l   #__kernel_intnest, r5
    324         mov.w   #0, [r5]                                        ; ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؊·‚¦
     319        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    325320.if     TIPM_LOCK != -15
    326         mvtc    #(IPL_LOCK | 00010000H), psw    ; ‘SŠ„ž‚݃ƒbƒN‰ðœó‘Ô
    327                                                                                 ; Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœ‚Å‚È‚¢ó‘Ô
    328 .endif
    329 
    330 ;
    331 ; ƒ^ƒXƒNI—¹(Œ»Ý‚̃Rƒ“ƒeƒLƒXƒg‚ðŽÌ‚Ä‚é)‚©‚ç‚̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ“üŒû
    332 ;
    333 ŒÄ‚яo‚µðŒ:
    334 ;       EƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    335 ;
    336 ‚±‚±‚Å‚Í, ‰½‚à‚·‚邱‚Æ‚Í‚È‚¢.
    337 ‚È‚¨, p_runtsk ‚̃AƒhƒŒƒXŽæ“¾‚¾‚¯‚͍s‚È‚¤.
     321        mvtc    #(IPL_LOCK | 00010000H), psw    ; 全割込みロック解除状態
     322                                                                                ; 割込み優先度マスク全解除でない状態
     323.endif
     324
     325;
     326; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャ入口
     327;
     328呼び出し条件:
     329;       ・ディスパッチャモード(ファイルヘッダ参照)
     330;
     331ここでは, 何もすることはない.
     332なお, p_runtsk のアドレス取得だけは行なう.
    338333;
    339334__exit_and_dispatch:
     
    341336
    342337;
    343 ; ƒfƒBƒXƒpƒbƒ`ƒƒ–{‘Ì
    344 ;
    345 ŒÄ‚яo‚µðŒ:
    346 ;       E‚·‚ׂẴ^ƒXƒN‚̃Rƒ“ƒeƒLƒXƒg‚Í•Û‘¶‚³‚ê‚Ä‚¢‚é.
    347 ;
    348 ;  dispatcher ŒÄoŽž‚̃Xƒ^ƒbƒN:
    349 ;       E__kernel_dispatch ‚©‚ç‚«‚½ê‡                        : ƒ^ƒXƒNƒXƒ^ƒbƒN
    350 ;       Eexit_and_dispatch ‚©‚ç‚«‚½ê‡:
    351 ;               exit_task ‚©‚ç‚«‚½ê‡                                  : ƒ^ƒXƒNƒXƒ^ƒbƒN
    352 ;               ƒJ[ƒlƒ‹‹N“®Žž(__kernel_start_dispatch) : Š„ž‚݃Xƒ^ƒbƒN
    353 ;       Eret_int ‚©‚ç‚«‚½ê‡                                          : ƒ^ƒXƒNƒXƒ^ƒbƒN
    354 ;       Edispatcher_idle_loop ‚©‚ç‚«‚½ê‡                     : Š„ž‚݃Xƒ^ƒbƒN
     338; ディスパッチャ本体
     339;
     340呼び出し条件:
     341;       ・すべてのタスクのコンテキストは保存されている.
     342;
     343;  dispatcher 呼出時のスタック:
     344;       ・__kernel_dispatch からきた場合                       : タスクスタック
     345;       ・exit_and_dispatch からきた場合:
     346;               exit_task からきた場合                                        : タスクスタック
     347;               カーネル起動時(__kernel_start_dispatch)        : 割込みスタック
     348;       ・ret_int からきた場合                                         : タスクスタック
     349;       ・dispatcher_idle_loop からきた場合                    : 割込みスタック
    355350;
    356351dispatcher:
    357352.if     LOG_DSP_ENTER == 1
    358353        push.l  r15
    359         mov.l   r14, r1                                         ; ˆø”(ƒfƒBƒXƒpƒbƒ`Œ³TCB)‚ðÝ’è
     354        mov.l   r14, r1                                         ; 引数(ディスパッチ元TCB)を設定
    360355        bsr             _kernel_log_dsp_enter
    361356        pop.l   r15
    362357.endif
    363358        mov.l   #__kernel_p_schedtsk, r5     
    364         mov.l   [r5], [r15]                                     ; p_schedtsk ‚ð p_runtsk ‚É
     359        mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
    365360        mov.l   [r15], r14
    366361        cmp             #0, r14
    367         bz              dispatcher_pre_idle                     ; schedtsk ‚ª‚È‚¯‚ê‚΃AƒCƒhƒ‹ƒ‹[ƒv‚Ö
    368         ld_TCB_sp       r0, r14, r5                             ; ƒ^ƒXƒNƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚𕜋A
     362        bz              dispatcher_pre_idle                     ; schedtsk がなければアイドルループへ
     363        ld_TCB_sp       r0, r14, r5                             ; タスクスタックポインタを復帰
    369364.if     LOG_DSP_LEAVE == 1
    370365        push.l  r14
    371         mov.l   r14, r1                                         ; ˆø”(ƒfƒBƒXƒpƒbƒ`æTCB)‚ðÝ’è
     366        mov.l   r14, r1                                         ; 引数(ディスパッチ先TCB)を設定
    372367        bsr             _kernel_log_dsp_leave
    373368        pop.l   r14
    374369.endif
    375370        ld_TCB_pc       r5, r14, r4
    376         jmp             r5                                      ; ŽÀsÄŠJ”Ô’n‚ÖƒWƒƒƒ“ƒv
    377 
    378 ;
    379 ;  schdedtsk‚ªNULL‚̏ꍇ‚̓AƒCƒhƒ‹ƒ‹[ƒv‚É“ü‚é
    380 ƒAƒCƒhƒ‹ƒ‹[ƒv‚ÍŠ„ž‚ݏˆ—ƒ‚[ƒh‚Å“®ì‚³‚¹‚é
    381 ;
    382 ‚±‚±‚ÅŠ„ž‚݃‚[ƒh‚ɐ؂芷‚¦‚é‚̂́C‚±‚±‚Å”­¶‚·‚銄ž‚ݏˆ—‚É
    383 ‚ǂ̃Xƒ^ƒbƒN‚ðŽg‚¤‚©‚Æ‚¢‚¤–â‘è‚Ì‰ðŒˆ‚ÆCŠ„ž‚݃nƒ“ƒhƒ‰“à‚ł̃^
    384 ƒXƒNƒfƒBƒXƒpƒbƒ`‚Ì–hŽ~‚Æ‚¢‚¤2‚‚̈Ӗ¡‚ª‚ ‚éD
     371        jmp             r5                                      ; 実行再開番地へジャンプ
     372
     373;
     374;  schdedtskがNULLの場合はアイドルループに入る
     375アイドルループは割込み処理モードで動作させる
     376;
     377ここで割込みモードに切り換えるのは,ここで発生する割込み処理に
     378どのスタックを使うかという問題の解決と,割込みハンドラ内でのタ
     379スクディスパッチの防止という2つの意味がある.
    385380;
    386381dispatcher_pre_idle:
    387382        mov.l   #__kernel_istkpt,r5
    388         mov.l   [r5], r0                                        ; Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦
    389         mov.l   #__kernel_intnest, r5
    390         mov.w   #1, [r5]                                        ; ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؊·‚¦
     383        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     384        mov.l   #__kernel_intnest, r5
     385        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    391386.if     TIPM_LOCK != -15
    392         mov.l   #__kernel_lock_flag, r5         ; CPUƒƒbƒN‰ðœó‘Ô‚Ö
     387        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    393388        mov.l   #0, [r5]
    394         mvtc    #0, psw                                         ; —Dæ“x0‚ÌŠ„ž‚ݏˆ—’†‚ð‹U‘•
     389        mvtc    #0, psw                                         ; 優先度0の割込み処理中を偽装
    395390.endif
    396391
    397392dispatcher_idle_loop:
    398         setpsw  i                                                       ; ‘SŠ„ž‚Ý‹–‰Â
    399         clrpsw  i                                                       ; ‘SŠ„ž‚Ý‹ÖŽ~
    400 
    401         mov.l   #__kernel_reqflg, r5            ; reqflg ‚ª FALSE ‚È‚ç
     393        setpsw  i                                                       ; 全割込み許可
     394        clrpsw  i                                                       ; 全割込み禁止
     395
     396        mov.l   #__kernel_reqflg, r5            ; reqflg が FALSE なら
    402397        mov.l   [r5], r4
    403398        cmp             #0, r4
    404         bz      dispatcher_idle_loop            ; ƒAƒCƒhƒ‹ƒ‹[ƒv‚ðŒJ‚è•Ô‚·
    405         mov.l   #0, [r5]                                        ; reqflg‚ªtrue‚È‚çfalse‚É‚·‚é
    406         mov.l   #__kernel_intnest, r5
    407         mov.w   #0, [r5]                                        ; ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؊·‚¦
     399        bz      dispatcher_idle_loop            ; アイドルループを繰り返す
     400        mov.l   #0, [r5]                                        ; reqflgがtrueならfalseにする
     401        mov.l   #__kernel_intnest, r5
     402        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    408403.if     TIPM_LOCK != -15
    409         mov.l   #__kernel_lock_flag, r5         ; CPUƒƒbƒNó‘Ô‚Ö
     404        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    410405        mov.l   #1, [r5]
    411406        mov.l   #__kernel_saved_ipl, r5
    412407        mov.l   #0, [r5]
    413         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; ‘SŠ„ž‚݃ƒbƒN‰ðœó‘Ô
    414                                                                                 ; Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœ‚Å‚È‚¢ó‘Ô
    415 .endif
    416         bra             dispatcher                                      ; dispatcher ‚Ö–ß‚é
    417 
    418 
    419 ;
    420 ; ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚̌ďo‚µ
    421 ;
    422 ; ƒ‚[ƒh‚ƃXƒ^ƒbƒN‚ð”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚ɐ؂è‘Ö‚¦D
     408        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     409                                                                                ; 割込み優先度マスク全解除でない状態
     410.endif
     411        bra             dispatcher                                      ; dispatcher へ戻る
     412
     413
     414;
     415; カーネルの終了処理の呼出し
     416;
     417; モードとスタックを非タスクコンテキスト用に切り替え.
    423418;
    424419        .glb    __kernel_call_exit_kernel
    425420__kernel_call_exit_kernel:
    426421.if     TIPM_LOCK != -15
    427         clrpsw  i                                                       ; ‘SŠ„ž‚Ý‹ÖŽ~
    428         mov.l   #__kernel_lock_flag, r5         ; CPUƒƒbƒN‰ðœó‘Ô‚Ö
     422        clrpsw  i                                                       ; 全割込み禁止
     423        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    429424        mov.l   #0, [r5]
    430425.endif
    431426        mov.l   #__kernel_istkpt, r5
    432         mov.l   [r5], r0                                        ; Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦
    433         mov.l   #__kernel_intnest, r5
    434         mov.w   #1, [r5]                                        ; ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؊·‚¦
     427        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     428        mov.l   #__kernel_intnest, r5
     429        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    435430        bsr             __kernel_exit_kernel
    436431        bra             __kernel_call_exit_kernel
     
    438433
    439434;
    440 Š„ž‚Ý(CPU—áŠO)‚©‚ç‚̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ“üŒû
    441 ;
    442 ;       ŒÄo‚µðŒ:
    443 ;       E‘SŠ„ž‚݃ƒbƒNó‘Ô(PSWƒŒƒWƒXƒ^Iƒrƒbƒg = 0)
    444 ;       EŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœ‚Å‚È‚¢ó‘Ô(IPL != 0)
    445 ;       Eƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(intnest=0)
    446 ;       EŽg—pƒXƒ^ƒbƒN‚̓^ƒXƒNƒXƒ^ƒbƒN
    447 ;       Ereqflg = true
    448 ;
    449 ‚±‚±‚Å‚Í, ƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh‚ɕύX‚µ, reqflg‚ðOFF‚É‚µ‚Ä‚©‚ç,
    450 ’x‰„ƒfƒBƒXƒpƒbƒ`‚Ì—L–³‚ð”»’f‚·‚é.
    451 ;
    452 
    453 ;
    454 ;  ret_intæ“ª‚ŃXƒ^ƒbƒN‚ɐς܂ê‚Ä‚¢‚éPSWƒŒƒWƒXƒ^‚ւ̃IƒtƒZƒbƒg
     435割込み(CPU例外)からのタスクディスパッチャ入口
     436;
     437;       呼出し条件:
     438;       ・全割込みロック状態(PSWレジスタIビット = 0)
     439;       ・割込み優先度マスク全解除でない状態(IPL != 0)
     440;       ・タスクコンテキスト(intnest=0)
     441;       ・使用スタックはタスクスタック
     442;       reqflg = true
     443;
     444ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
     445遅延ディスパッチの有無を判断する.
     446;
     447
     448;
     449;  ret_int先頭でスタックに積まれているPSWレジスタへのオフセット
    455450;  ACC + FPSW + R14--R15 + R1--R5 + PC
    456451;
     
    459454ret_int:
    460455.if     TIPM_LOCK == -15
    461         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; Š„ž‚Ý/CPU—áŠO”­¶‘O‚ÌIPL’lŽæ“¾
     456        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    462457        and             #PSW_IPL_MASK, r5
    463         mvtc    r5, psw                                         ; ‘SŠ„ž‚݃ƒbƒN(CPUƒƒbƒN)ó‘Ô
    464                                                                                 ; Š„ž‚Ý/CPU—áŠO”­¶‘O‚ÌŠ„ž‚Ý—Dæ“x
    465 .else
    466         mov.l   #__kernel_lock_flag, r5         ; CPUƒƒbƒNó‘Ô‚Ö
     458        mvtc    r5, psw                                         ; 全割込みロック(CPUロック)状態
     459                                                                                ; 割込み/CPU例外発生前の割込み優先度
     460.else
     461        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    467462        mov.l   #1, [r5]
    468         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; Š„ž‚Ý/CPU—áŠO”­¶‘O‚ÌIPL’lŽæ“¾
     463        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    469464        and             #PSW_IPL_MASK, r5
    470465        mov.l   #__kernel_saved_ipl, r4
    471466        mov.l   r5, [r4]
    472         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; ‘SŠ„ž‚݃ƒbƒN‰ðœó‘Ô
    473                                                                                 ; Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœ‚Å‚È‚¢ó‘Ô
     467        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     468                                                                                ; 割込み優先度マスク全解除でない状態
    474469.endif
    475470        mov.l   #__kernel_reqflg, r5
     
    477472        mov.l   #__kernel_p_runtsk, r15     
    478473        mov.l   [r15], r14
    479         mov.l   #__kernel_dspflg, r5            ; dspflg ‚ª FALSE ‚È‚ç ret_int_r ‚Ö
     474        mov.l   #__kernel_dspflg, r5            ; dspflg が FALSE なら ret_int_r へ
    480475        mov.l   [r5], r5
    481476        cmp             #0, r5
     
    483478        mov.l   #__kernel_p_schedtsk, r5
    484479        mov.l   [r5], r5
    485         cmp             r5, r14                                         ; p_schedtsk ‚Æ p_runtsk ‚ª“¯‚¶‚È‚ç
    486         beq     ret_int_r_call_tex                      ; ret_int_r_call_tex ‚Ö
    487         pushm   r6-r13                                          ; ”ñƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^•Û‘¶
    488         st_TCB_sp       r0, r14, r5                             ; ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðTCB‚É•Û‘¶
    489         st_TCB_pc       #ret_int_r, r14, r5             ; ŽÀsÄŠJ”Ô’n‚ðTCB‚É•Û‘¶
     480        cmp             r5, r14                                         ; p_schedtsk と p_runtsk が同じなら
     481        beq     ret_int_r_call_tex                      ; ret_int_r_call_tex
     482        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     483        st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
     484        st_TCB_pc       #ret_int_r, r14, r5             ; 実行再開番地をTCBに保存
    490485        bra             dispatcher
    491486
    492487;
    493 Š„ž‚Ý(CPU—áŠO)‚ւ̃^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒoŒû
    494 ;
    495 ŒÄ‚яo‚µðŒ:
    496 ;       EƒfƒBƒXƒpƒbƒ`ƒƒƒ‚[ƒh(ƒtƒ@ƒCƒ‹ƒwƒbƒ_ŽQÆ)
    497 ;
    498 ‚±‚±‚Å‚Í, ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰ŒÄo‚µ‚Æ, Š„ž‚Ý(CPU—áŠO)ˆ—ƒ‚[ƒh‚Ö‚Ì
    499 •ÏX‚Æ, ƒRƒ“ƒeƒLƒXƒg‚Ì•œ‹A‚ðs‚¢, Š„ž‚Ý(CUP—áŠO)”­¶Œ³‚Ö–ß‚é.
    500 ;
    501 __kernel_break_wait:                                    ;ƒ^ƒXƒNƒ‚ƒjƒ^—pƒ‰ƒxƒ‹
     488割込み(CPU例外)へのタスクディスパッチャ出口
     489;
     490呼び出し条件:
     491;       ・ディスパッチャモード(ファイルヘッダ参照)
     492;
     493ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
     494変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生元へ戻る.
     495;
     496__kernel_break_wait:                                    ;タスクモニタ用ラベル
    502497ret_int_r:
    503         popm    r6-r13                                          ; ”ñƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^•œ‹A
     498        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    504499ret_int_r_call_tex:
    505         btst    #TCB_enatex_bit, TCB_enatex[r14]        ; ƒ^ƒXƒN—áŠOˆ—‹–‰Â?
     500        btst    #TCB_enatex_bit, TCB_enatex[r14]        ; タスク例外処理許可?
    506501        bz      ret_int_r_rte
    507         ld_TCB_texptn   r5, r14, r4                     ; •Û—¯—áŠO—vˆö‚ª‚ ‚é‚©H
     502        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    508503        cmp             #0, r5
    509504        bz      ret_int_r_rte
    510         bsr             __kernel_call_texrtn            ; ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰ŒÄo‚µˆ—ŽÀs
     505        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    511506ret_int_r_rte:
    512507.if     TIPM_LOCK != -15
    513         clrpsw  i                                                       ; ‘SŠ„ž‚Ý‹ÖŽ~
    514         mov.l   #__kernel_lock_flag, r5         ; CPUƒƒbƒN‰ðœó‘Ô‚Ö
     508        clrpsw  i                                                       ; 全割込み禁止
     509        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    515510        mov.l   #0, [r5]
    516511.endif
    517         popm    r4-r5                                           ; ƒAƒLƒ
    518 ƒ€ƒŒ[ƒ^•œ‹A
    519         mvtaclo r5                                                      ; ACCÅ‰ºˆÊ16bit‚Í0‚Å•œ‹A
     512        popm    r4-r5                                           ; アキュムレータ復帰
     513        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    520514        mvtachi r4
    521         popc    fpsw                                            ; FPUƒXƒe[ƒ^ƒXƒŒƒWƒXƒ^•œ‹A
    522         popm    r14-r15                                         ; ƒŒƒWƒXƒ^•œ‹A
     515        popc    fpsw                                            ; FPUステータスレジスタ復帰
     516        popm    r14-r15                                         ; レジスタ復帰
    523517        popm    r1-r5
    524         rte                                                                     ; Š„ž‚Ý‘O‚̏ˆ—‚É–ß‚é
    525 
    526 
    527 ;
    528 Š„ž‚݂̏o“üŒûˆ—(ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq•”•ª)
    529 ;
    530 ŒÄo‚µðŒ:
    531 EŠ„ž‚Ý”­¶Žž‚ÌH/Wˆ—‚É‚æ‚è, PSWƒŒƒWƒXƒ^‚ÌIƒrƒbƒg=0, IPL‚ÍŽó•t‚¯
    532 ;    ‚½Š„ž‚Ý‚ÌIPL.
    533 EƒXƒ^ƒbƒN‚Í‘½dŠ„‚荞‚݂Ȃ犄ž‚݃Xƒ^ƒbƒN, ‚»‚¤‚Å‚È‚¯‚ê‚Î
    534 ;    ƒ^ƒXƒNƒXƒ^ƒbƒN
    535 EŠ„ž‚Ý”­¶Žž‚ÌH/Wˆ—‚É‚æ‚è,ƒXƒ^ƒbƒN‚ÉŠ„ž‚Ý‚©‚ç‚Ì•œ‹APC‚ÆPSW‚ª
    536 ;    •Û‘¶‚³‚ê‚Ä‚¢‚é.
    537 EƒxƒNƒ^ƒe[ƒuƒ‹‚É“o˜^‚³‚ꂽŒÂ•Ê‚Ì“ü‚èŒûˆ—‚É‚æ‚è, ƒXƒ^ƒbƒN‚É
    538 ;    ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^(R1-R5)‚ª•Û‘¶‚³‚ê‚Ä‚¢‚é.
    539 ;
    540 ˆø”:
    541 Er1:Š„ž‚Ý—vˆö”ԍ†
    542 Er2:Š„ž‚݃nƒ“ƒhƒ‰‚̃AƒhƒŒƒX
    543 ;
    544 ƒŒƒWƒXƒ^‚ªƒXƒ^ƒbƒNã‚ɂǂ̂悤‚É•Û‘¶‚³‚ê‚Ä‚¢‚é‚©‚ðˆÈ‰º‚ÉŽ¦‚·.
    545 ‚±‚̐}‚ł͏オ’áˆÊ, ‰º‚ª‚ˆÊ‚̃AƒhƒŒƒX‚Å, ƒXƒ^ƒbƒN‚͉º‚©‚ç
    546 ã•ûŒü‚ÉŒü‚©‚Á‚Đςݏグ‚ç‚ê‚é‚à‚Ì‚Æ‚·‚é.
     518        rte                                                                     ; 割込み前の処理に戻る
     519
     520
     521;
     522割込みの出入口処理(アセンブリ言語記述部分)
     523;
     524呼出し条件:
     525・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
     526;    た割込みのIPL.
     527・スタックは多重割り込みなら割込みスタック, そうでなければ
     528;    タスクスタック
     529・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
     530;    保存されている.
     531・ベクタテーブルに登録された個別の入り口処理により, スタックに
     532;    スクラッチレジスタ(R1-R5)が保存されている.
     533;
     534引数:
     535・r1:割込み要因番号
     536・r2:割込みハンドラのアドレス
     537;
     538レジスタがスタック上にどのように保存されているかを以下に示す.
     539この図では上が低位, 下が高位のアドレスで, スタックは下から
     540上方向に向かって積み上げられるものとする.
    547541;
    548542;       -------------------------
     
    572566;       -------------------------(SP + 44)
    573567;
    574 ‚±‚±‚Å‚Í, Š„ž‚ݏˆ—ƒ‚[ƒh‚ɕύX‚µ‚ănƒ“ƒhƒ‰‚ðŽÀs‚·‚é.
    575 ;
    576 ƒnƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚µ‚½Œã‚Í, ‘½dŠ„ž‚Ý‚Å‚È‚­, ‚©‚ reqflg ‚ª
    577 ;  TRUE ‚É‚È‚Á‚½Žž‚ɁCret_int ‚Ö•ªŠò(’x‰„ƒfƒBƒXƒpƒbƒ`)‚·‚éD
    578 ;
    579 ‘½dŠ„ž‚Ý‚©‚Ç‚¤‚©‚ÍŠ„ž‚݃lƒXƒgƒJƒEƒ“ƒ^‚Ì’l‚Å”»’è‚·‚é.
    580 ;  intnest != 0 ‚È‚ç‚Α½dŠ„ž‚Ý‚Å‚ ‚é‚Æ”»’è‚·‚é.
    581 ;
    582 ;  reqflg ‚ÍCPUƒƒbƒNó‘ԂŃ`ƒFƒbƒN‚·‚é. ‚»‚¤‚Å‚È‚¢‚ƁC
    583 ;  reqflg ƒ`ƒFƒbƒNŒã‚É‹N“®‚³‚ꂽŠ„ž‚݃nƒ“ƒhƒ‰“à‚Å
    584 ƒfƒBƒXƒpƒbƒ`‚ª—v‹‚³‚ꂽê‡‚ɁCƒfƒBƒXƒpƒbƒ`‚³‚ê‚È‚¢.
     568ここでは, 割込み処理モードに変更してハンドラを実行する.
     569;
     570ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     571;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     572;
     573多重割込みかどうかは割込みネストカウンタの値で判定する.
     574;  intnest != 0 ならば多重割込みであると判定する.
     575;
     576;  reqflg はCPUロック状態でチェックする. そうでないと,
     577;  reqflg チェック後に起動された割込みハンドラ内で
     578ディスパッチが要求された場合に,ディスパッチされない.
    585579;
    586580_kernel_interrupt:
    587         pushm   r14-r15                                         ; ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ð‘Þ”ð
    588         pushc   fpsw                                            ; FPUƒXƒe[ƒ^ƒXƒŒƒWƒXƒ^‘Þ”ð
     581        pushm   r14-r15                                         ; スクラッチレジスタを退避
     582        pushc   fpsw                                            ; FPUステータスレジスタ退避
    589583        mvfacmi r5
    590         shll    #16, r5                                         ; ACCÅ‰ºˆÊ16bit‚Í0‚Æ‚·‚é
     584        shll    #16, r5                                         ; ACC最下位16bitは0とする
    591585        mvfachi r4
    592         pushm   r4-r5                                           ; ƒAƒLƒ
    593 ƒ€ƒŒ[ƒ^‘Þ”ð
     586        pushm   r4-r5                                           ; アキュムレータ退避
    594587        mov.l   #__kernel_intnest, r5
    595588        mov.w   [r5], r4
    596         add             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒCƒ“ƒNƒŠƒƒ“ƒg
     589        add             #1, r4                                          ; ネスト回数をインクリメント
    597590        mov.w   r4, [r5]
    598         cmp             #1, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    599         bnz             interrupt_from_int                      ; ‰ÁŽZ‘O‚ª0‚Å‚È‚¯‚ê‚Α½dŠ„ž‚Ý
    600                                                 ; ‰’i‚ÌŠ„ž‚Ý
    601         mov.l   r0, r3                                          ; ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðŽæ‚èo‚µ
    602         mov.l   #__kernel_istkpt, r5            ; Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦‚é
     591        cmp             #1, r4                                          ; 多重割り込みかどうか
     592        bnz             interrupt_from_int                      ; 加算前が0でなければ多重割込み
     593                                                ; 初段の割込み
     594        mov.l   r0, r3                                          ; スタックポインタを取り出し
     595        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    603596        mov.l   [r5], r0
    604         push.l  r3                                                      ; ƒ^ƒXƒNƒXƒ^ƒbƒN‚ð•ÛŽ
    605 interrupt_from_int:             ; ‘½dŠ„ž‚Ý
    606         setpsw  i                                                       ; Š„ž‚Ý‹–‰Â(CPUƒƒbƒN‰ðœó‘Ô)
     597        push.l  r3                                                      ; タスクスタックを保持
     598interrupt_from_int:             ; 多重割込み
     599        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    607600
    608601.if     LOG_INH_LEAVE == 1
    609         push.l  r1                                                      ; ƒƒOƒgƒŒ[ƒX‚̈ø”‚ð•ÛŽ
     602        push.l  r1                                                      ; ログトレースの引数を保持
    610603.endif
    611604
    612605.if     LOG_INH_ENTER == 1
    613606        push.l  r2
    614         bsr             _kernel_log_inh_enter           ; ƒƒOƒgƒŒ[ƒXŠÖ”‚̌ďo‚µ
    615                                                         ; ˆø”‚ÌŠ„ž‚Ý—vˆö”ԍ†‚ÍŠù‚Ér1‚É“ü‚Á‚Ä‚¢‚é
     607        bsr             _kernel_log_inh_enter           ; ログトレース関数の呼出し
     608                                                        ; 引数の割込み要因番号は既にr1に入っている
    616609        pop             r2
    617610.endif
    618611
    619         jsr     r2                                                      ; Cƒ‹[ƒ`ƒ“ŒÄ‚яo‚µ
     612        jsr     r2                                                      ; Cルーチン呼び出し
    620613
    621614.if     LOG_INH_LEAVE == 1
    622         pop             r1                                                      ; ˆø”‚ÉŠ„ž‚Ý—vˆö”ԍ†‚ðÝ’è
    623         bsr             _kernel_log_inh_leave           ; ƒƒOƒgƒŒ[ƒXŠÖ”‚̌ďo‚µ
    624 .endif
    625 
    626         clrpsw  i                                                       ; Š„ž‚Ý‹ÖŽ~(CPUƒƒbƒNó‘Ô)
     615        pop             r1                                                      ; 引数に割込み要因番号を設定
     616        bsr             _kernel_log_inh_leave           ; ログトレース関数の呼出し
     617.endif
     618
     619        clrpsw  i                                                       ; 割込み禁止(CPUロック状態)
    627620        mov.l   #__kernel_intnest, r5
    628621        mov.w   [r5], r4
    629         sub             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒfƒNƒŠƒƒ“ƒg
     622        sub             #1, r4                                          ; ネスト回数をデクリメント
    630623        mov.w   r4, [r5]
    631         cmp             #0, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    632         bnz             interrupt_return                        ; ‘½dŠ„‚荞‚݂Ȃ烊ƒ^[ƒ“
    633         ; ‰’i‚ÌŠ„ž‚Ý
    634         pop             r0                                                      ; ƒ^ƒXƒN‚̃Xƒ^ƒbƒN‚É–ß‚·
    635         mov.l   #__kernel_reqflg, r5            ; ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚È‚¢‚©?
     624        cmp             #0, r4                                          ; 多重割り込みかどうか
     625        bnz             interrupt_return                        ; 多重割り込みならリターン
     626        ; 初段の割込み
     627        pop             r0                                                      ; タスクのスタックに戻す
     628        mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
    636629        mov.l   [r5], r5
    637630        cmp             #1, r5
    638         bz              ret_int                                         ; ‚ ‚ê‚Î ret_int ‚ÖƒWƒƒƒ“ƒv
     631        bz              ret_int                                         ; あれば ret_int へジャンプ
    639632interrupt_return:
    640         popm    r4-r5                                           ; ƒAƒLƒ
    641 ƒ€ƒŒ[ƒ^•œ‹A
    642         mvtaclo r5                                                      ; ACCÅ‰ºˆÊ16bit‚Í0‚Å•œ‹A
     633        popm    r4-r5                                           ; アキュムレータ復帰
     634        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    643635        mvtachi r4
    644         popc    fpsw                                            ; FPUƒXƒe[ƒ^ƒXƒŒƒWƒXƒ^•œ‹A
    645         popm    r14-r15                                         ; ƒŒƒWƒXƒ^•œ‹A
     636        popc    fpsw                                            ; FPUステータスレジスタ復帰
     637        popm    r14-r15                                         ; レジスタ復帰
    646638        popm    r1-r5
    647         rte                                                                     ; Š„ž‚Ý‘O‚̏ˆ—‚É–ß‚é
    648 
    649 
    650 ;
    651 ;  CPU—áŠO‚̏o“üŒûˆ—(ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq•”•ª)
    652 ;
    653 ŒÄo‚µðŒ:
    654 ECPU—áŠO”­¶Žž‚ÌH/Wˆ—‚É‚æ‚è, PSWƒŒƒWƒXƒ^‚ÌIƒrƒbƒg=0, IPL=0.
    655 EƒXƒ^ƒbƒN‚Í‘½dŠ„‚荞‚݂Ȃ犄ž‚݃Xƒ^ƒbƒN, ‚»‚¤‚Å‚È‚¯‚ê‚Î
    656 ;    ƒ^ƒXƒNƒXƒ^ƒbƒN
    657 ECPU—áŠO”­¶Žž‚ÌH/Wˆ—‚É‚æ‚è,ƒXƒ^ƒbƒN‚ÉCPU—áŠO‚©‚ç‚Ì•œ‹APC‚Æ
    658 ;    PSW‚ª•Û‘¶‚³‚ê‚Ä‚¢‚é.
    659 EƒxƒNƒ^ƒe[ƒuƒ‹‚É“o˜^‚³‚ꂽŒÂ•Ê‚Ì“ü‚èŒûˆ—‚É‚æ‚è, ƒXƒ^ƒbƒN‚É
    660 ;    ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^(R1-R5)‚ª•Û‘¶‚³‚ê‚Ä‚¢‚é.
    661 ;
    662 ˆø”:
    663 Er1:CPU—áŠO—vˆö”ԍ†
    664 Er2:CPU—áŠOƒnƒ“ƒhƒ‰‚̃AƒhƒŒƒX
    665 ;
    666 ƒŒƒWƒXƒ^‚ªƒXƒ^ƒbƒNã‚ɂǂ̂悤‚É•Û‘¶‚³‚ê‚Ä‚¢‚é‚©‚ðˆÈ‰º‚ÉŽ¦‚·.
    667 ‚±‚̐}‚ł͏オ’áˆÊ, ‰º‚ª‚ˆÊ‚̃AƒhƒŒƒX‚Å, ƒXƒ^ƒbƒN‚͉º‚©‚ç
    668 ã•ûŒü‚ÉŒü‚©‚Á‚Đςݏグ‚ç‚ê‚é‚à‚Ì‚Æ‚·‚é.
    669 ‚È‚¨, CPU—áŠO—vˆö”ԍ†‚ÆR6-R13‚ÍCPU—áŠOƒnƒ“ƒhƒ‰“à‚ŏî•ñ‚ðŽæ“¾
    670 ‚·‚é–Ú“I‚Å‘Þ”ð‚µ‚Ä‚¨‚è, oŒûˆ—‚Å‚Í•Û‘¶“à—e‚ð”jŠü‚·‚ê‚΂悢.
     639        rte                                                                     ; 割込み前の処理に戻る
     640
     641
     642;
     643;  CPU例外の出入口処理(アセンブリ言語記述部分)
     644;
     645呼出し条件:
     646・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
     647・スタックは多重割り込みなら割込みスタック, そうでなければ
     648;    タスクスタック
     649・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
     650;    PSWが保存されている.
     651・ベクタテーブルに登録された個別の入り口処理により, スタックに
     652;    スクラッチレジスタ(R1-R5)が保存されている.
     653;
     654引数:
     655・r1:CPU例外要因番号
     656・r2:CPU例外ハンドラのアドレス
     657;
     658レジスタがスタック上にどのように保存されているかを以下に示す.
     659この図では上が低位, 下が高位のアドレスで, スタックは下から
     660上方向に向かって積み上げられるものとする.
     661なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内で情報を取得
     662する目的で退避しており, 出口処理では保存内容を破棄すればよい.
    671663;
    672664;       -------------------------
    673 ;       |    CPU—áŠO—vˆö”ԍ†    | <----- p_excinf
     665;       |    CPU例外要因番号    | <----- p_excinf
    674666;       ------------------------- (intptr_t)(p_excinf + 0)
    675667;       |       R6(4byte)       |
     
    714706;       ------------------------- (intptr_t)(p_excinf + 80)
    715707;
    716 ‚±‚±‚Å‚Í, Š„ž‚ݏˆ—ƒ‚[ƒh‚ɕύX‚µ‚ănƒ“ƒhƒ‰‚ðŽÀs‚·‚é.
    717 ;  CPU—áŠOƒnƒ“ƒhƒ‰‚É“n‚·VPŒ^‚̕ϐ” p_excinf ‚Æ‚µ‚ÄISP‚Ì’l“n‚·D
    718 ;
    719 ƒnƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚µ‚½Œã‚Í, ‘½dŠ„ž‚Ý‚Å‚È‚­, ‚©‚ reqflg ‚ª
    720 ;  TRUE ‚É‚È‚Á‚½Žž‚ɁCret_int ‚Ö•ªŠò(’x‰„ƒfƒBƒXƒpƒbƒ`)‚·‚éD
    721 ;
    722 ‘½dŠ„ž‚Ý‚©‚Ç‚¤‚©‚ÍŠ„ž‚݃lƒXƒgƒJƒEƒ“ƒ^‚Ì’l‚Å”»’è‚·‚é.
    723 ;  intnest != 0 ‚È‚ç‚Α½dŠ„ž‚Ý‚Å‚ ‚é‚Æ”»’è‚·‚é.
    724 ;
    725 ;  reqflg ‚ÍCPUƒƒbƒNó‘ԂŃ`ƒFƒbƒN‚·‚é. ‚»‚¤‚Å‚È‚¢‚ƁC
    726 ;  reqflg ƒ`ƒFƒbƒNŒã‚É‹N“®‚³‚ꂽŠ„ž‚݃nƒ“ƒhƒ‰“à‚Å
    727 ƒfƒBƒXƒpƒbƒ`‚ª—v‹‚³‚ꂽê‡‚ɁCƒfƒBƒXƒpƒbƒ`‚³‚ê‚È‚¢.
    728 ;
    729 ;
    730 ;  CPU—áŠO“üŒûˆ—
    731 ;
    732 ‚±‚±‚Å‚Í, Š„ž‚ݏˆ—ƒ‚[ƒh‚ɕύX‚µ‚ănƒ“ƒhƒ‰‚ðŽÀs‚·‚é.
    733 ;
    734 
    735 ;
    736 ;  CPU—áŠOƒnƒ“ƒhƒ‰ŒÄo‚µŒã‚É•s—v‚Æ‚È‚éƒXƒ^ƒbƒNî•ñ‚̃TƒCƒY
     708ここでは, 割込み処理モードに変更してハンドラを実行する.
     709;  CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
     710;
     711ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     712;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     713;
     714多重割込みかどうかは割込みネストカウンタの値で判定する.
     715;  intnest != 0 ならば多重割込みであると判定する.
     716;
     717;  reqflg はCPUロック状態でチェックする. そうでないと,
     718;  reqflg チェック後に起動された割込みハンドラ内で
     719ディスパッチが要求された場合に,ディスパッチされない.
     720;
     721;
     722;  CPU例外入口処理
     723;
     724ここでは, 割込み処理モードに変更してハンドラを実行する.
     725;
     726
     727;
     728;  CPU例外ハンドラ呼出し後に不要となるスタック情報のサイズ
    737729;  EXCNO + R6--R13
    738730;
     
    740732
    741733_kernel_exception:
    742         pushm   r14-r15                                         ; ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ð‘Þ”ð
     734        pushm   r14-r15                                         ; スクラッチレジスタを退避
    743735        pushc   fpsw
    744736        mvfacmi r5
    745         shll    #16, r5                                         ; ACCÅ‰ºˆÊ16bit‚Í0‚Æ‚·‚é
     737        shll    #16, r5                                         ; ACC最下位16bitは0とする
    746738        mvfachi r4
    747         pushm   r4-r5                                           ; ƒAƒLƒ
    748 ƒ€ƒŒ[ƒ^‘Þ”ð
    749         pushm   r6-r13                                          ; ”ñƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^•Û‘¶
    750         push.l  r1                                                      ; CPU—áŠO—vˆö”ԍ†‚ð•ÛŽ
    751         mov.l   r0, r3                                          ; ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðŽæ‚èo‚µ
     739        pushm   r4-r5                                           ; アキュムレータ退避
     740        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     741        push.l  r1                                                      ; CPU例外要因番号を保持
     742        mov.l   r0, r3                                          ; スタックポインタを取り出し
    752743        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    753744        and             #PSW_I_MASK, r5
    754         bz              exception_nonkernel                     ; ‘SŠ„ž‚Ý‹ÖŽ~(CPUƒƒbƒN)ó‘Ô‚È‚çŠÇ—ŠO
     745        bz              exception_nonkernel                     ; 全割込み禁止(CPUロック)状態なら管理外
    755746.if     TIPM_LOCK != -15
    756747        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    757748        and             #PSW_IPL_MASK, r5
    758749        cmp             #IPL_LOCK, r5
    759         bgt     exception_nonkernel                     ; IPL‚ªCPUƒƒbƒNƒŒƒxƒ‹ˆÈã‚È‚çŠÇ—ŠO
     750        bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
    760751.endif
    761752        mov.l   #__kernel_intnest, r5
    762753        mov.w   [r5], r4
    763         add             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒCƒ“ƒNƒŠƒƒ“ƒg
     754        add             #1, r4                                          ; ネスト回数をインクリメント
    764755        mov.w   r4, [r5]
    765         cmp             #1, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    766         bnz             exception_from_int                      ; ‰ÁŽZ‘O‚ª0‚Å‚È‚¯‚ê‚Α½dŠ„ž‚Ý
    767                                                 ; ‰’i‚ÌŠ„ž‚Ý
    768         mov.l   #__kernel_istkpt, r5            ; Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦‚é
     756        cmp             #1, r4                                          ; 多重割り込みかどうか
     757        bnz             exception_from_int                      ; 加算前が0でなければ多重割込み
     758                                                ; 初段の割込み
     759        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    769760        mov.l   [r5], r0
    770         push.l  r3                                                      ; ƒ^ƒXƒNƒXƒ^ƒbƒN‚ð•ÛŽ
    771 exception_from_int:             ; ‘½dŠ„ž‚Ý
     761        push.l  r3                                                      ; タスクスタックを保持
     762exception_from_int:             ; 多重割込み
    772763        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    773         mvtc    r5, psw                                         ; CPU—áŠO”­¶‘O‚̏ó‘Ô‚É–ß‚·
     764        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
    774765.if     LOG_EXC_LEAVE == 1
    775         push.l  r1                                                      ; ƒƒOƒgƒŒ[ƒX‚̈ø”‚ð•ÛŽ
     766        push.l  r1                                                      ; ログトレースの引数を保持
    776767.endif
    777768
    778769.if     LOG_EXC_ENTER == 1
    779770        pushm   r2-r3
    780         bsr             _kernel_log_exc_enter           ; ƒƒOƒgƒŒ[ƒXŠÖ”‚̌ďo‚µ
    781                                                         ; ˆø”‚ÌŠ„ž‚Ý—vˆö”ԍ†‚ÍŠù‚Ér1‚É“ü‚Á‚Ä‚¢‚é
     771        bsr             _kernel_log_exc_enter           ; ログトレース関数の呼出し
     772                                                        ; 引数の割込み要因番号は既にr1に入っている
    782773        popm    r2-r3
    783774.endif
    784775
    785         mov.l   r3, r1                                          ; ˆø”‚Ìp_excinf‚ðÝ’è
    786         jsr     r2                                                      ; Cƒ‹[ƒ`ƒ“ŒÄ‚яo‚µ
     776        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     777        jsr     r2                                                      ; Cルーチン呼び出し
    787778
    788779.if     LOG_EXC_LEAVE == 1
    789         pop             r1                                                      ; ˆø”‚ÉŠ„ž‚Ý—vˆö”ԍ†‚ðÝ’è
    790         bsr             _kernel_log_exc_leave           ; ƒƒOƒgƒŒ[ƒXŠÖ”‚̌ďo‚µ
    791 .endif
    792 
    793         clrpsw  i                                                       ; ‚±‚±‚©‚ç‚Í•K‚¸Š„ž‚Ý‹ÖŽ~
     780        pop             r1                                                      ; 引数に割込み要因番号を設定
     781        bsr             _kernel_log_exc_leave           ; ログトレース関数の呼出し
     782.endif
     783
     784        clrpsw  i                                                       ; ここからは必ず割込み禁止
    794785        mov.l   #__kernel_intnest, r5
    795786        mov.w   [r5], r4
    796         sub             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒfƒNƒŠƒƒ“ƒg
     787        sub             #1, r4                                          ; ネスト回数をデクリメント
    797788        mov.w   r4, [r5]
    798         cmp             #0, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    799         bnz             exception_return                        ; ‘½dŠ„‚荞‚݂Ȃ烊ƒ^[ƒ“
    800         ; ‰’i‚ÌŠ„ž‚Ý
    801         pop             r0                                                      ; ƒ^ƒXƒN‚̃Xƒ^ƒbƒN‚É–ß‚·
    802         mov.l   #__kernel_reqflg, r5            ; ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚È‚¢‚©?
     789        cmp             #0, r4                                          ; 多重割り込みかどうか
     790        bnz             exception_return                        ; 多重割り込みならリターン
     791        ; 初段の割込み
     792        pop             r0                                                      ; タスクのスタックに戻す
     793        mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
    803794        mov.l   [r5], r5
    804795        cmp             #1, r5
    805         bnz             exception_return                        ; ‚È‚¯‚ê‚΃Šƒ^[ƒ“
    806         add             #EXCINF_REG_SIZE, r0            ; CPU—áŠOî•ñ‚Ì”jŠü
    807         bra             ret_int                                         ; ‚ ‚ê‚Î ret_int ‚ÖƒWƒƒƒ“ƒv
     796        bnz             exception_return                        ; なければリターン
     797        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     798        bra             ret_int                                         ; あれば ret_int へジャンプ
    808799
    809800exception_nonkernel:
    810801        mov.l   #__kernel_intnest, r5
    811802        mov.w   [r5], r4
    812         add             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒCƒ“ƒNƒŠƒƒ“ƒg
     803        add             #1, r4                                          ; ネスト回数をインクリメント
    813804        mov.w   r4, [r5]
    814         cmp             #1, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    815         bnz             exception_from_nonkernelint     ; ‰ÁŽZ‘O‚ª0‚Å‚È‚¯‚ê‚Α½dŠ„ž‚Ý
    816                                                 ; ‰’i‚ÌŠ„ž‚Ý
    817         mov.l   #__kernel_istkpt, r5            ; Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦‚é
     805        cmp             #1, r4                                          ; 多重割り込みかどうか
     806        bnz             exception_from_nonkernelint     ; 加算前が0でなければ多重割込み
     807                                                ; 初段の割込み
     808        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    818809        mov.l   [r5], r0
    819         push.l  r3                                                      ; ƒ^ƒXƒNƒXƒ^ƒbƒN‚ð•ÛŽ
    820 exception_from_nonkernelint:    ; ‘½dŠ„ž‚Ý
     810        push.l  r3                                                      ; タスクスタックを保持
     811exception_from_nonkernelint:    ; 多重割込み
    821812        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    822         mvtc    r5, psw                                         ; CPU—áŠO”­¶‘O‚̏ó‘Ô‚É–ß‚·
    823 
    824         mov.l   r3, r1                                          ; ˆø”‚Ìp_excinf‚ðÝ’è
    825         jsr     r2                                                      ; Cƒ‹[ƒ`ƒ“ŒÄ‚яo‚µ
    826 
    827         clrpsw  i                                                       ; ‚±‚±‚©‚ç‚Í•K‚¸Š„ž‚Ý‹ÖŽ~
     813        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
     814
     815        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     816        jsr     r2                                                      ; Cルーチン呼び出し
     817
     818        clrpsw  i                                                       ; ここからは必ず割込み禁止
    828819        mov.l   #__kernel_intnest, r5
    829820        mov.w   [r5], r4
    830         sub             #1, r4                                          ; ƒlƒXƒg‰ñ”‚ðƒfƒNƒŠƒƒ“ƒg
     821        sub             #1, r4                                          ; ネスト回数をデクリメント
    831822        mov.w   r4, [r5]
    832         cmp             #0, r4                                          ; ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©
    833         bnz             exception_return                        ; ‘½dŠ„‚荞‚݂Ȃ烊ƒ^[ƒ“
    834         ; ‰’i‚ÌŠ„ž‚Ý
    835         pop             r0                                                      ; ƒ^ƒXƒN‚̃Xƒ^ƒbƒN‚É–ß‚·
     823        cmp             #0, r4                                          ; 多重割り込みかどうか
     824        bnz             exception_return                        ; 多重割り込みならリターン
     825        ; 初段の割込み
     826        pop             r0                                                      ; タスクのスタックに戻す
    836827
    837828exception_return:
    838         add             #EXCINF_REG_SIZE, r0            ; CPU—áŠOî•ñ‚Ì”jŠü
    839         popm    r4-r5                                           ; ƒAƒLƒ
    840 ƒ€ƒŒ[ƒ^•œ‹A
    841         mvtaclo r5                                                      ; ACCÅ‰ºˆÊ16bit‚Í0‚Å•œ‹A
     829        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     830        popm    r4-r5                                           ; アキュムレータ復帰
     831        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    842832        mvtachi r4
    843         popc    fpsw                                            ; FPUƒXƒe[ƒ^ƒXƒŒƒWƒXƒ^•œ‹A
    844         popm    r14-r15                                         ; ƒŒƒWƒXƒ^•œ‹A
     833        popc    fpsw                                            ; FPUステータスレジスタ復帰
     834        popm    r14-r15                                         ; レジスタ復帰
    845835        popm    r1-r5
    846         rte                                                                     ; Š„ž‚Ý‘O‚̏ˆ—‚É–ß‚é
    847 
    848 
    849 ;
    850 ”÷­ŽžŠÔ‘Ò‚¿
     836        rte                                                                     ; 割込み前の処理に戻る
     837
     838
     839;
     840微少時間待ち
    851841;
    852842_sil_dly_nse:
Note: See TracChangeset for help on using the changeset viewer.