Ignore:
Timestamp:
Jun 2, 2015, 3:39:53 PM (9 years ago)
Author:
nmir-saito
Message:

ファイルの mime-type 変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_qb_r5f100le_cs/trunk/arch/rl78_ca78k0r/prc_support.asm

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    66;             Nagoya Municipal Industrial Research Institute, JAPAN
    77;
    8 ;  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì (1)`(4) ‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    9 ;  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü•ÏE
    10 ;  Ä”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    11 ;  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ìŒ 
    12 ;      •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[ƒX
    13 ;      ƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    14 ;  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
    15 ;      ‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    16 ƒƒ“ƒgi—˜—pŽÒƒ}
    17 ;      ƒjƒ
    18 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•Û
    19 ;      Ø‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    20 ;  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
    21 ;      ‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±‚ƁD
    22 ;    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    23 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    24 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ì
    25 ;        Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    26 ;    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É•ñ
    27 ;        ‚·‚邱‚ƁD
    28 ;  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹ŠQ
    29 ;      ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD‚Ü‚½C
    30 ;      –{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝—R‚ÉŠî‚Ã
    31 ;      ‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    32 ;
    33 ;  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨‚æ
    34 ;  ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I‚ɑ΂·
    35 ;  ‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p
    36 ;  ‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»‚̐ӔC‚ð•‰
    37 ;  ‚í‚È‚¢D
    38 ;
    39 ;
    40 
    41 ;
    42 ;  ƒJ[ƒlƒ‹ŽÀ‘•‚̃vƒƒZƒbƒTˆË‘¶•”•ª
    43 ;
    44 
    45 ;
    46 ;  ƒ}ƒNƒ’è‹`‚̃Cƒ“ƒNƒ‹[ƒh
     8;  上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
     9;  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
     10;  再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11;  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
     12;      表示,この利用条件および下記の無保証規定が,そのままの形でソース
     13;      コード中に含まれていること.
     14;  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
     15;      できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
     16;      ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
     17;      証規定を掲載すること.
     18;  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
     19;      できない形で再配布する場合には,次のいずれかの条件を満たすこと.
     20;    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
     21;        権表示,この利用条件および下記の無保証規定を掲載すること.
     22;    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
     23;        告すること.
     24;  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
     25;      からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
     26;      本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
     27;      く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     28;
     29;  本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
     30;  びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
     31;  る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
     32;  により直接的または間接的に生じたいかなる損害に関しても,その責任を負
     33;  わない.
     34;
     35;
     36
     37;
     38;  カーネル実装のプロセッサ依存部分
     39;
     40
     41;
     42;  マクロ定義のインクルード
    4743;
    4844$INCLUDE(prc_support_def.inc)
    4945
    5046;
    51 ƒOƒ[ƒoƒ‹ƒVƒ“ƒ{ƒ‹
    52 ;
    53         ; ƒRƒ“ƒpƒCƒ‰‚ªŽg—p‚·‚é saddr—̈æ‚̃ŒƒWƒXƒ^
     47グローバルシンボル
     48;
     49        ; コンパイラが使用する saddr領域のレジスタ
    5450        extrn   _@RTARG0,_@RTARG2,_@RTARG4,_@RTARG6,_@SEGAX,_@SEGDE
    5551        extrn   _@NRARG0,_@NRARG1,_@NRARG2,_@NRARG3
    5652        extrn   _@NRAT00,_@NRAT02,_@NRAT04,_@NRAT06
    5753        ; kernel_cfg.c
    58         extrn   __kernel_istkpt         ; ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚̏‰Šú’l
     54        extrn   __kernel_istkpt         ; スタックポインタの初期値
    5955        ; prc_config.c
    60         extrn   _t_lock_cpu             ; CPUƒƒbƒNó‘Ԃւ̈ڍs
    61         extrn   __kernel_intnest        ; Š„ž‚݂̃lƒXƒgƒJƒEƒ“ƒ^
    62         extrn   __kernel_lock_flag      ; CPUƒƒbƒNƒtƒ‰ƒO
     56        extrn   _t_lock_cpu             ; CPUロック状態への移行
     57        extrn   __kernel_intnest        ; 割込みのネストカウンタ
     58        extrn   __kernel_lock_flag      ; CPUロックフラグ
    6359        ; task.c
    64         extrn   __kernel_dispatcher     ; ƒfƒBƒXƒpƒbƒ`ƒƒ
    65         extrn   __kernel_reqflg         ; ƒfƒBƒXƒpƒbƒ`—v‹ƒtƒ‰ƒO
    66         extrn   __kernel_disdsp         ; ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘Ô
    67         extrn   __kernel_search_schedtsk        ; Å‚—Dæ“x‚̃T[ƒ`
    68         extrn   __kernel_run_task       ; ƒ^ƒXƒN‚ÌŠJŽn
     60        extrn   __kernel_dispatcher     ; ディスパッチャ
     61        extrn   __kernel_reqflg         ; ディスパッチ要求フラグ
     62        extrn   __kernel_disdsp         ; ディスパッチ禁止状態
     63        extrn   __kernel_search_schedtsk        ; 最高優先度のサーチ
     64        extrn   __kernel_run_task       ; タスクの開始
    6965        ; startup.c
    70         extrn   __kernel_exit_kernel    ; ƒJ[ƒlƒ‹‚̏I—¹ˆ—
     66        extrn   __kernel_exit_kernel    ; カーネルの終了処理
    7167
    7268        ; prc_support.asm
    73         public  __kernel_start_dispatch         ; ƒfƒBƒXƒpƒbƒ`‚ÌŠJŽnˆ—
    74         public  __kernel_call_exit_kernel       ; I—¹ˆ—‚̃R[ƒ‹
    75         public  __kernel_interrupt_entry        ; Š„ž‚Ý‚Ì“üŒûˆ—(‹¤’Ê•”)
    76         public  __kernel_int_return             ; ƒŒƒWƒXƒ^‚𕜋A‚µ‚ÄŠ„ž‚Ý”­¶Œ³‚ÖƒŠƒ^[ƒ“
    77         public  _unused_interrupt               ; –¢Žg—pŠ„ž‚݂̏ˆ—
    78 
    79 ;
    80 ; ƒRƒ“ƒpƒCƒ‰‚ÅŽg—p‚·‚ésaddr—̈æ‚̃ŒƒWƒXƒ^‚ð•Û‘¶
     69        public  __kernel_start_dispatch         ; ディスパッチの開始処理
     70        public  __kernel_call_exit_kernel       ; 終了処理のコール
     71        public  __kernel_interrupt_entry        ; 割込みの入口処理(共通部)
     72        public  __kernel_int_return             ; レジスタを復帰して割込み発生元へリターン
     73        public  _unused_interrupt               ; 未使用割込みの処理
     74
     75;
     76; コンパイラで使用するsaddr領域のレジスタを保存
    8177;
    8278restore_saddr_regs      macro
    83 $if (ALLOC_REGVAR_TO_SADDR) ; -qr ƒIƒvƒVƒ‡ƒ“‚ðŽg—p‚·‚éê‡
    84         pop     ax              ; ƒŒƒWƒXƒ^•œ‹A
     79$if (ALLOC_REGVAR_TO_SADDR) ; -qr オプションを使用する場合
     80        pop     ax              ; レジスタ復帰
    8581        movw    _@NRAT06, ax    ;
    8682        pop     ax              ;
     
    9995        movw    _@NRARG0, ax    ;
    10096$endif
    101         pop     ax              ; ƒŒƒWƒXƒ^•œ‹A
     97        pop     ax              ; レジスタ復帰
    10298        movw    _@SEGDE, ax     ;
    10399        pop     ax              ;
     
    114110
    115111;
    116 ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð‰Šú‰»
     112スタックポインタを初期化
    117113;
    118114reset_sp        macro
     
    124120       
    125121;
    126 ;  PSW ‚Ì ISP1 = 1, ISP0 = 1 ‚É‚µ‚ÄŠ„ž‚݂̃}ƒXƒN‚ð‰ðœ‚·‚é
     122;  PSW の ISP1 = 1, ISP0 = 1 にして割込みのマスクを解除する
    127123;
    128124clear_pswisp_mask       macro
     
    136132
    137133;
    138 ƒJ[ƒlƒ‹‚Ì“®ìŠJŽn‚É•K—v‚Æ‚³‚ê‚éŒãŽn––‚ðs‚¤‚½‚߂̊֐”
    139 ;  sta_ker(startup.c) ‚©‚çŒÄ‚яo‚³‚ê‚éD
     134カーネルの動作開始に必要とされる後始末を行うための関数
     135;  sta_ker(startup.c) から呼び出される.
    140136;
    141137__kernel_start_dispatch:
    142138        ;
    143         ;  CPUƒƒbƒNó‘Ô‚Æ‘SŠ„ž‚݃ƒbƒNó‘Ô‚Æ‚ð‹æ•Ê‚·‚é•K—v‚ª‚ ‚éê‡C
    144         ;  CPUƒƒbƒNó‘Ô‚É‚µC‘SŠ„ž‚݃ƒbƒN‘Š“–‚̏ó‘Ô‚ð‰ðœ‚·‚éD
     139        ;  CPUロック状態と全割込みロック状態とを区別する必要がある場合,
     140        ;  CPUロック状態にし,全割込みロック相当の状態を解除する.
    145141        ;
    146142        call !!_t_lock_cpu
     
    151147$ENDIF
    152148        ;
    153         ;  ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð‰Šú‰»‚·‚é
    154         ;  sta_ker ‚©‚ç start_dispatch ‚̊֐”ƒR[ƒ‹‚É‚æ‚éƒXƒ^ƒbƒNÁ”‚ð
    155         ;  ƒNƒŠƒA‚·‚邽‚߁CƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð‰Šú‰»‚·‚éD
     149        ;  スタックポインタを初期化する
     150        ;  sta_ker から start_dispatch の関数コールによるスタック消費分を
     151        ;  クリアするため,スタックポインタを初期化する.
    156152        ;
    157153        reset_sp
    158154
    159155        ;
    160         ;  dispatcher (task.c) ‚ÖƒWƒƒƒ“ƒv‚·‚é
    161         ;  ŠÖ”ƒR[ƒ‹‚É‚µ‚È‚¢‚̂̓Xƒ^ƒbƒN‚ðß–ñ‚·‚邽‚߁D
    162         ;
    163         ; dispatcher (kernel/task.c) ‚̌Ăяo‚µ
     156        ;  dispatcher (task.c) へジャンプする
     157        ;  関数コールにしないのはスタックを節約するため.
     158        ;
     159        ; dispatcher (kernel/task.c) の呼び出し
    164160        br      !!__kernel_dispatcher
    165161
    166162
    167163;
    168 I—¹ˆ—‚̌Ăяo‚µ
    169 ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð‰Šú‰»‚µCexit_kernel ‚ðŒÄ‚яo‚·D
     164終了処理の呼び出し
     165スタックポインタを初期化し,exit_kernel を呼び出す.
    170166;
    171167 __kernel_call_exit_kernel:
     
    177173
    178174;
    179 Š„ž‚Ý/CPU—áŠO‚̏o“üŒûˆ—(‹¤’Ê•”)
    180 ;    ƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚Ü‚½‚ÍCPU—áŠO‚̏ꍇ‚ɃŒƒWƒXƒ^•Û‘¶ŒãCŒÄ‚яo‚³‚ê‚éD
    181 ;
    182 ;   ‘O’ñðŒ
    183 ;       EPSWƒŒƒWƒXƒ^‚ÌIEƒrƒbƒg=0, ISP‚ÍŽó•t‚¯‚½Š„ž‚Ý‚ÌISP.
    184 ;       Eƒnƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚ª bc ‚ÉŠi”[‚³‚ê‚Ä‚¢‚é.
    185 ;   ECPU—áŠOƒnƒ“ƒhƒ‰‚Ì“üŒû‚©‚ç—ˆ‚½ê‡CƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚Ì
    186 ;     æ“ª”Ô’n(p_excinf)‚ª ax ‚ÉŠi”[‚³‚ê‚Ä‚¨‚èC
    187 ;     ‚±‚ê‚ÍCPU—áŠOƒnƒ“ƒhƒ‰‚̈ø”(p_excinf)‚Æ‚µ‚Ä‚»‚Ì‚Ü‚Ü“n‚³‚ê‚éD
    188 ;
    189 ;       ƒŒƒWƒXƒ^‚ªƒXƒ^ƒbƒNã‚ɂǂ̂悤‚É•Û‘¶‚³‚ê‚Ä‚¢‚é‚©‚ðˆÈ‰º‚ÉŽ¦‚·.
    190 ;       }‚Í•À‚я‡‚Ì‚Ý‚ð•\Œ»‚µ‚½‚à‚Ì‚Å‚ ‚èCƒTƒCƒY‚ðl—¶‚µ‚Ä‚¢‚È‚¢‚±‚Æ‚É’ˆÓ‚·‚éD
    191 ;       ³Šm‚ɂ̓f[ƒ^ƒV[ƒg‚ðŽQÆ‚Ì‚±‚ƁD
    192 ;       ‚±‚̐}‚ł͏オ’áˆÊ, ‰º‚ª‚ˆÊ‚̃AƒhƒŒƒX‚Å, ƒXƒ^ƒbƒN‚͐}‚̉º‘¤‚©‚ç
    193 ;       ã•ûŒü‚ÉŒü‚©‚Á‚Đςݏグ‚ç‚ê‚é‚à‚Ì‚Æ‚·‚é.
    194 ;
    195 ;       ¦1 saddr—̈æ‚̃[ƒNƒGƒŠƒA‚̓Rƒ“ƒpƒCƒ‰ƒIƒvƒVƒ‡ƒ“ -qr ‚ðŽw’è‚·‚éê‡‚É
    196 ;       •Û‘¶‚ª•K—v‚Å‚ ‚èC’ʏí‚Í•Û‘¶‚µ‚È‚¢D•Û‘¶‚·‚éê‡‚̓AƒZƒ“ƒuƒ‰ƒIƒvƒVƒ‡ƒ“
    197 ;       ‚ɂāuALLOC_REGVAR_TO_SADDRv‚ð’è‹`‚·‚邱‚ƁD
    198 ;
    199 ;       ¦2 CPU—áŠO‚Ì“üŒû‚ðŒo—R‚µ‚½ê‡‚Ì‚Ý•Û‘¶‚³‚ê‚é
    200 ;
    201 ;
    202 ;       ---------------<-- p_excinf(¦)
    203 ;       |  saddr—Ìˆæ   |
    204 ;       |ƒ[ƒN—pƒGƒŠƒA|
    205 ;       |  (16byte)¦1 |
     175割込み/CPU例外の出入口処理(共通部)
     176;    カーネル管理の割込みまたはCPU例外の場合にレジスタ保存後,呼び出される.
     177;
     178;   前提条件
     179;       ・PSWレジスタのIEビット=0, ISPは受付けた割込みのISP.
     180;       ・ハンドラのアドレスが bc に格納されている.
     181;   ・CPU例外ハンドラの入口から来た場合,スタックポインタの
     182;     先頭番地(p_excinf)が ax に格納されており,
     183;     これはCPU例外ハンドラの引数(p_excinf)としてそのまま渡される.
     184;
     185;       レジスタがスタック上にどのように保存されているかを以下に示す.
     186;       図は並び順のみを表現したものであり,サイズを考慮していないことに注意する.
     187;       正確にはデータシートを参照のこと.
     188;       この図では上が低位, 下が高位のアドレスで, スタックは図の下側から
     189;       上方向に向かって積み上げられるものとする.
     190;
     191;       ※1 saddr領域のワークエリアはコンパイラオプション -qr を指定する場合に
     192;       保存が必要であり,通常は保存しない.保存する場合はアセンブラオプション
     193;       にて「ALLOC_REGVAR_TO_SADDR」を定義すること.
     194;
     195;       ※2 CPU例外の入口を経由した場合のみ保存される
     196;
     197;
     198;       ---------------<-- p_excinf()
     199;       |  saddr領域   |
     200;       |ワーク用エリア|
     201;       |  (16byte)1 |
    206202;       ---------------<-- p_excinf
    207 ;       |  saddr—Ìˆæ   |
    208 ;       |ƒZƒOƒƒ“ƒgî•ñ|
    209 ;       | Ši”[—pƒGƒŠƒA |
     203;       |  saddr領域   |
     204;       |セグメント情報|
     205;       | 格納用エリア |
    210206;       |   (4byte)    |
    211207;       ---------------
    212 ;       |  saddr—Ìˆæ   |
    213 ;       |  ƒ‰ƒ“ƒ^ƒCƒ€  |
    214 ;       |  ˆø”ƒGƒŠƒA  |
     208;       |  saddr領域   |
     209;       |  ランタイム  |
     210;       |  引数エリア  |
    215211;       |   (8byte)    |
    216212;       ---------------
     
    230226;       ---------------
    231227;
    232 ;       ƒnƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚µ‚½Œã‚Í, ‘½dŠ„ž‚Ý‚Å‚È‚­, ‚©‚C
    233 ;       reqflg ‚ª TRUEC‚©‚Cdisdsp ‚ª FALSE ‚ÌŽž‚ɁCinterrupt_dispatch ‚Ö•ªŠò‚·‚éD
    234 ;
    235 ;       ‘½dŠ„ž‚Ý‚©‚Ç‚¤‚©‚ÍŠ„ž‚݃lƒXƒgƒJƒEƒ“ƒ^‚Ì’l‚Å”»’è‚·‚é.
    236 ;       intnest > 0 ‚È‚ç‚Α½dŠ„ž‚Ý‚Å‚ ‚é‚Æ”»’è‚·‚é.
     228;       ハンドラからリターンした後は, 多重割込みでなく, かつ,
     229;       reqflg が TRUE,かつ,disdsp が FALSE の時に,interrupt_dispatch へ分岐する.
     230;
     231;       多重割込みかどうかは割込みネストカウンタの値で判定する.
     232;       intnest > 0 ならば多重割込みであると判定する.
    237233;
    238234
    239235__kernel_interrupt_entry:
    240         inc     !__kernel_intnest       ; ƒlƒXƒgƒJƒEƒ“ƒ^‚ðƒCƒ“ƒNƒŠƒƒ“ƒg
    241         ei                              ; Š„ž‚Ý‹–‰Â(IPL‚͎󂯕t‚¯‚ç‚ꂽŠ„ž‚݂̃Œƒxƒ‹)
    242         call    bc                      ; Š„ž‚݃nƒ“ƒhƒ‰ŒÄ‚яo‚µ
    243         di                              ; Š„ž‚Ý‹ÖŽ~
    244         dec     !__kernel_intnest       ; ƒlƒXƒgƒJƒEƒ“ƒ^‚ðƒfƒNƒŠƒƒ“ƒg
    245         bnz     $__kernel_int_return    ; –ß‚èæ‚ª”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(”ñƒ[ƒ)‚È‚ç’P‚ɃŠƒ^[ƒ“
    246         movw    ax,!__kernel_reqflg     ; ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚ ‚é‚©‚Ç‚¤‚©
     236        inc     !__kernel_intnest       ; ネストカウンタをインクリメント
     237        ei                              ; 割込み許可(IPLは受け付けられた割込みのレベル)
     238        call    bc                      ; 割込みハンドラ呼び出し
     239        di                              ; 割込み禁止
     240        dec     !__kernel_intnest       ; ネストカウンタをデクリメント
     241        bnz     $__kernel_int_return    ; 戻り先が非タスクコンテキスト(非ゼロ)なら単にリターン
     242        movw    ax,!__kernel_reqflg     ; ディスパッチ要求があるかどうか
    247243        cmpw    ax, #0
    248         bz      $__kernel_int_return    ; ‚È‚¯‚ê‚΁C’P‚ɃŠƒ^[ƒ“
     244        bz      $__kernel_int_return    ; なければ,単にリターン
    249245        movw    ax, #0
    250         movw    !__kernel_reqflg, ax    ; reqflg = FALSE ‚É–ß‚µ‚Ä‚¨‚­
    251         movw    ax, !__kernel_disdsp    ; ƒfƒBƒXƒpƒbƒ`‹ÖŽ~‚©‚Ç‚¤‚©
     246        movw    !__kernel_reqflg, ax    ; reqflg = FALSE に戻しておく
     247        movw    ax, !__kernel_disdsp    ; ディスパッチ禁止かどうか
    252248        cmpw    ax, #0
    253         bnz     $__kernel_int_return    ; ‹ÖŽ~‚È‚çC’P‚ɃŠƒ^[ƒ“
    254 
    255 ;
    256 Š„ž‚݂̏oŒûˆ—(ƒfƒBƒXƒpƒbƒ`•t‚«)
    257 ;    CPU ƒƒbƒN‘Š“–‚̏ó‘ԂɈڍs‚µCV‹Kƒ^ƒXƒN‚ðŠJŽn‚·‚é
    258 ;
    259 ‘O’ñðŒF
    260 ;    PSWƒŒƒWƒXƒ^‚ÌIEƒtƒ‰ƒO = 0 (Š„ž‚Ý‹ÖŽ~)
    261 ;    PSWƒŒƒWƒXƒ^‚ÌISP{1,0} = Žó‚¯•t‚¯‚½Š„ž‚Ý‚ÌŠ„ž‚݃Œƒxƒ‹
     249        bnz     $__kernel_int_return    ; 禁止なら,単にリターン
     250
     251;
     252割込みの出口処理(ディスパッチ付き)
     253;    CPU ロック相当の状態に移行し,新規タスクを開始する
     254;
     255前提条件:
     256;    PSWレジスタのIEフラグ = 0 (割込み禁止)
     257;    PSWレジスタのISP{1,0} = 受け付けた割込みの割込みレベル
    262258;
    263259__kernel_interrupt_dispatch:
     
    272268        call    !!__kernel_run_task
    273269
    274         ; run_task ‚©‚ç‚̃Šƒ^[ƒ“Œã‚̏ó‘Ô: CPUƒƒbƒNó‘Ô
    275         ; __kernel_int_return ‚Ì reti ‚Å PSW ‚Ì IE, ISP ‚Í
    276         ; Š„ž‚Ý”­¶‘O‚̏ó‘Ԃɖ߂邽‚߁Clock_flag ‚¾‚¯Œ³‚É–ß‚·D
     270        ; run_task からのリターン後の状態: CPUロック状態
     271        ; __kernel_int_return の reti で PSW の IE, ISP は
     272        ; 割込み発生前の状態に戻るため,lock_flag だけ元に戻す.
    277273        movw    ax, #0
    278         movw    !__kernel_lock_flag, ax         ; lock_flag ‚ðƒNƒŠƒA
    279 
    280 ;
    281 ƒŒƒWƒXƒ^•œ‹A‚µ‚ÄŠ„ž‚Ý‚©‚烊ƒ^[ƒ“
     274        movw    !__kernel_lock_flag, ax         ; lock_flag をクリア
     275
     276;
     277レジスタ復帰して割込みからリターン
    282278;
    283279__kernel_int_return:
    284         restore_saddr_regs      ; saddr—̈æ‚̃ŒƒWƒXƒ^•œ‹A
    285         pop     ax          ; ES, CS ‚Ì•œ‹A
     280        restore_saddr_regs      ; saddr領域のレジスタ復帰
     281        pop     ax          ; ES, CS の復帰
    286282        mov     cs, a       ;
    287283        mov     a, x        ;
    288284        mov     es, a       ;
    289         pop     hl          ; ƒŒƒWƒXƒ^‚𕜋A
     285        pop     hl          ; レジスタを復帰
    290286        pop     de
    291287        pop     bc
     
    294290
    295291;
    296 –³ŒÀƒ‹[ƒv(”O‚Ì‚½‚ß)
     292無限ループ(念のため)
    297293;
    298294_loop:
     
    300296
    301297;
    302 –¢Žg—pŠ„ž‚Ý
     298未使用割込み
    303299;
    304300_unused_interrupt:
Note: See TracChangeset for help on using the changeset viewer.