⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu_support.s

📁 toppers操作系统源码
💻 S
📖 第 1 页 / 共 2 页
字号:
                   ldc    r9,sr               /* 充り哈みの钓材                   */#ifndef NO_SLEEP    sleep                      /* 充哈み略ち                       */#endif /* NO_SLEEP */                    ldc    r8,sr               /* 充り哈み敦贿                     */      mov.l  @r10,r7             /* r7 <- reqflg                     */    tst    r7,r7               /* reqflg が FALSEなら              */    bt     dispatcher_2        /* dispatcher_2 へ                  */    ldc    r12,r7_bank         /* r7_bank1 をクリア                */            mov.l  r12,@r10            /* reqflg を FALSEに                */    bra    dispatcher     nop	    .align 4_runtsk_dis:	    .long _runtsk_schedtsk_dis:	    .long _schedtsk_enatex_mask_dis:        .long TCB_enatex_mask_call_texrtn_dis:	    .long _call_texrtn_mask_md_ipm_dis:	    .long 0x40000000 + MAX_IPM << 4_mask_md_dis:	    .long 0x40000000_mask_bl_md_dis:	    .long 0x50000000	        dispatch_r_k:	    .long dispatch_r_stacktop_dis:	    .long STACKTOP            /* タスク迫惟婶のスタックの介袋猛	*/_reqflg_dis:    .long  _reqflg/*  *  充り哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 * * 提り黎がタスクでreqflgがセットされている眷圭のみここにくる。 * r7_bank1 = 0,充り哈み敦贿觉轮,スクラッチレジスタを瘦赂した * 觉轮で钙び叫すこと。  *	 */    .text    .align 2    .globl ret_int    .globl ret_excret_exc:ret_int:    mov.l  _runtsk_ret,r1     /* r0 <- runtsk                  */    mov.l  @r1,r0               mov.l  _enadsp_ret,r2     /* enadspのチェック              */    mov.l  @r2,r3    tst    r3,r3               bt     ret_int_1               mov.l  _schedtsk_ret,r4   /* r5 <- schedtsk                */     mov.l  @r4,r5    cmp/eq r0,r5              /* runtsk と schedtsk を孺秤     */    bt     ret_int_1    mov.l  r14,@-r15          /* 荒りのレジスタを瘦赂          */    mov.l  r13,@-r15					    mov.l  r12,@-r15					    mov.l  r11,@-r15					    mov.l  r10,@-r15					    mov.l  r9,@-r15					    mov.l  r8,@-r15    mov    #TCB_sp,r1        /* タスクスタックを瘦赂           */    mov.l  r15,@(r0,r1)        mov.l  ret_int_r_k,r1    /* 悸乖浩倡戎孟を瘦赂             */    mov    #TCB_pc,r2	    mov.l  r1,@(r0,r2)      bra    dispatcher     nop    ret_int_r:    mov.l  @r15+,r8		    mov.l  @r15+,r9		    mov.l  @r15+,r10		    mov.l  @r15+,r11		    mov.l  @r15+,r12		    mov.l  @r15+,r13		    mov.l  @r15+,r14		ret_int_1:    /*     *  タスク毋嘲借妄ル〖チンの弹瓢     *  ret_int_r は dispatcher から钙び叫されるため·tcbのアドレスはr0に     *  掐っているˉ     *  なお·充哈みの叫庚でタスクスイッチが券栏しない眷圭はディスパッチャ     *  を奶らずに ret_int から木儡 ret_int_1 に若ぶ            */    mov.l  @(TCB_enatex,r0),r1    mov.l  _enatex_mask_ret,r2    tst    r1,r2    bt     ret_int_2            /* enatex が FALSE ならリタ〖ン  */    mov.l  @(TCB_texptn,r0),r1  /* texptnをロ〖ド                */    tst    r1,r1    bt     ret_int_2            /* texptn が 0で痰ければT<= 0    */    mov.l _call_texrtn_ret,r1   /* タスク毋嘲ル〖チンの钙び叫し  */    jsr   @r1             nop       ret_int_2:               #ifdef SUPPORT_CHG_IPM    mov    #44,r0    mov.l  @(r0,r15),r1    mov.l  _unmask_ipm,r2    and    r2,r1    mov.l  _task_intmask_k,r2    mov.l  @r2,r3    or     r3,r1    mov.l  r1,@(r0,r15)#endif /* SUPPORT_CHG_IMP */    mov.l  @r15+,r7            /* spc,pr,ssr,スクラッチレジスタを牲耽 */    mov.l  @r15+,r6            mov.l  @r15+,r5    mov.l  @r15+,r4    mov.l  @r15+,r3    mov.l  @r15+,r2    mov.l  @r15+,r1    mov.l  _mask_md_bl_ret,r0    ldc    r0,sr               /* BLを1に                               */    mov.l  @r15+,r0    lds.l  @r15+,mach                    lds.l  @r15+,macl            ldc.l  @r15+,gbr           ldc.l  @r15+,ssr        lds.l  @r15+,pr    ldc.l  @r15+,spc    rte     nop            .align 4_runtsk_ret:    .long _runtsk_schedtsk_ret:	    .long _schedtsk_enadsp_ret:	    .long _enadspret_int_r_k:    .long ret_int_r_enatex_mask_ret:        .long TCB_enatex_mask        _call_texrtn_ret:	    .long _call_texrtn_mask_md_bl_ret:	    .long  0x50000000/* *  タスク弹瓢借妄 */     .text    .align 2    .globl _activate_r_activate_r:    stc    sr,r0               /* 充り哈み钓材 */    mov.l  _unmask_ipm,r1    and    r1,r0	#ifdef SUPPORT_CHG_IPM    mov.l  _task_intmask_k,r1    mov.l  @r1,r2    or     r2,r0#endif /* SUPPORT_CHG_IPM */    ldc    r0,sr    mov.l  @r15+,r1    lds.l  @r15+,pr    mov.l  @r15+,r4    jmp    @r1     nop    .align 4_unmask_ipm:    .long  0xffffff0f#ifdef SUPPORT_CHG_IPM		_task_intmask_k:    .long _task_intmask#endif /* SUPPORT_CHG_IPM */				/* *  Exception 600 vector *  充り哈みが券栏すると悸乖される。		 * * *  SH3は充り哈みが券栏するとすべてVBR+0x600戎孟からプログラムを悸乖するため、 *  ここに芹弥するル〖チンでまずスタックの磊り仑え、レジスタの瘦赂,IPMの肋年, *  充り哈み妥傍の冉年を乖いその稿BLビットを0にして充り哈みハンドラを钙ぶ涩妥 *  がある。 *  充り哈み妥傍に滦炳した充り哈みハンドラの倡幌戎孟は芹误int_table[]に判峡し *  て钙び叫す。オフセットの纷换は、充り哈み妥傍レジスタを宝に2ビットシフトし *  て乖う。充り哈み妥傍レジスタはSH7708ではINTEVTレジスタにセットされるが、 *  SH7709およびSH7709AではINTEVT2にセットされるため、ifdefにより磊り尸けてい *  る。また、办婶のディバイスについて充り哈み妥傍レジスタで畔される猛とIPMと *  の粗には簇犯がないため、称充り哈み妥傍に滦炳したIPMを积つSRの柒推を芹误 *  int_plevel_table[]に判峡してそれを粕み叫す。 * *  reqflg をチェックする涟に充哈みを敦贿しないと·reqflg をチェック稿 *  に弹瓢された充哈みハンドラ柒でディスパッチが妥滇された眷圭に·ディ *  スパッチされないˉ * */    .org    0x0600        /* _BASE_VBR + 0x0600戎孟に芹弥 */    .align 2    .global _interrupt_interrupt:    stc.l  spc,@-r15       /* 驴脚充り哈みが掐ると久えてしまうので        */    sts.l  pr,@-r15        /* spc,pr,ssr,gbr,macl,mach                    */    stc.l  ssr,@-r15        stc.l  gbr,@-r15                        sts.l  macl,@-r15                        sts.l  mach,@-r15                                                        stc.l  r0_bank,@-r15   /* ,r0×r7をスタックに瘦赂   */     stc.l  r1_bank,@-r15    stc.l  r2_bank,@-r15    stc.l  r3_bank,@-r15    stc.l  r4_bank,@-r15    stc.l  r5_bank,@-r15    stc.l  r6_bank,@-r15        stc.l  r7_bank,@-r15    tst    r7,r7                 /* 充り哈み券栏箕のコンテキストを冉年  */      bf/s    _interrupt_from_int  /* 毋嘲/充り哈みハンドラならジャンプ   */     add    #0x01,r7             /* 充り哈みのネスト搀眶をインクリメント*/    mov    r15,r1                /* スタックを掐れ仑え傅のスタックポイ  */    mov.l  _stacktop_k,r15       /* ンタを瘦赂                          */    mov.l  r1,@-r15                mov.l  _intevt,r0            /* 毋嘲妥傍レジスタを艰评              */    mov.l  @r0,r4                  shlr2  r4                    /* 3ビット宝シフトしオフセットを滇める */    shlr   r4                      mov.l  _int_plevel_table_k,r0     mov.l  @(r0,r4),r5           /* 充り哈みの庭黎刨を艰评               */    mov.l  _int_table_k,r0        mov.l  @(r0,r4),r2           /* 充り哈みハンドラのアドレスを艰评    */    ldc    r2,r2_bank            /* バンク0に磊り仑えるためコピ〖       */        ldc    r5,sr                 /* これ笆惯充り哈みを减け烧ける。      */    jsr    @r2                   /* 充り哈みハンドラへ                  */     nop    mov.l  _mask_md_ipm_ret,r0    ldc    r0,sr                 /* 充り哈み敦贿                           */    stc    r7_bank,r7            /* 毋嘲/充り哈みのネスト搀眶をデクリメント*/    dt     r7    ldc    r7,r7_bank    mov.l  _reqflg_k,r4          /* reqflgのチェック                       */    mov.l  @r4,r1    tst    r1,r1                 /* reqflgがFALSEならret_to_task_intに若ぶ */    bt/s   _ret_to_task_int      /* タスクに提る                           */     mov.l  @r15,r15             /* 提り黎がタスクなのでスタックを提す     */    xor    r0,r0    bra    ret_int     mov.l  r0,@r4               /* reqflgをクリア                   */_interrupt_from_int:    mov.l   _intevt,r0           /* 毋嘲妥傍レジスタを艰评           */    mov.l   @r0,r4    shlr2   r4                   /* オフセットを滇める               */    shlr    r4                   /* オフセットを滇める               */        mov.l   _int_plevel_table_k,r0     mov.l   @(r0,r4),r5            /* 充り哈みの庭黎刨を艰评           */    mov.l   _int_table_k,r0            mov.l   @(r0,r4),r2            /* 充り哈みハンドラのアドレスを艰评 */    ldc     r2,r2_bank             /* バンク0に磊り仑えるためコピ〖    */    ldc     r5,sr                  /* これ笆惯充り哈みを减け烧ける。   */    jsr     @r2                    /* 充り哈みハンドラへ               */      nop    mov.l  _mask_md_ipm_ret,r0    ldc    r0,sr                   /* 充り哈み敦贿                     */    stc    r7_bank,r7              /* 毋嘲/充り哈みのネスト搀眶をデクリメント*/    dt     r7    ldc    r7,r7_bank_ret_to_task_int:    mov.l  @r15+,r7                /* 充り哈み傅に提る                 */    mov.l  @r15+,r6    mov.l  @r15+,r5    mov.l  @r15+,r4    mov.l  @r15+,r3    mov.l  @r15+,r2    mov.l  @r15+,r1    mov.l  _mask_md_bl_int,r0     ldc    r0,sr                   /* BL を1に                         */    mov.l  @r15+,r0    lds.l  @r15+,mach                    lds.l  @r15+,macl            ldc.l  @r15+,gbr                           ldc.l  @r15+,ssr    lds.l  @r15+,pr    ldc.l  @r15+,spc    rte     nop    /*     * 踏判峡の充哈みが券栏すると·その箕の INTEVT,INTEVT2,SR,PC を     * 苞眶にcpu_interrupt()を钙び叫すˉ     */       .global _no_reg_interrupt_no_reg_interrupt:    mov.l _intevt1,r0    mov.l @r0,r4#if defined(SH7709) || defined(SH7709A) || defined(SH7729R) || defined(SH7727)     mov.l _intevt2,r0        mov.l @r0,r5#endif     stc   spc,r6    stc   ssr,r7    mov.l _cpu_interrupt_k,r1    jsr   @r1     nop            .align  4_stacktop_k:        .long  STACKTOP            /* 润タスク迫惟婶のスタックの介袋猛  */_intevt:        #if defined(SH7708) || defined(SH7750)        .long  INTEVT#else    .long  INTEVT2#endif    _int_table_k:        .long    _int_table       _int_plevel_table_k:        .long    _int_plevel_table _reqflg_k:    .long  _reqflg_mask_md_ipm_ret:        .long  0x40000000 + MAX_IPM << 4_mask_md_bl_int:        .long  0x50000000_intevt1:            .long  INTEVT#if defined(SH7709) || defined(SH7709A) || defined(SH7729R) || defined(SH7727) _intevt2:            .long  INTEVT2#endif _cpu_interrupt_k:    .long  _cpu_interrupt       /* *  腮警箕粗略ち */	.globl _sil_dly_nse_sil_dly_nse:    mov.l  _sil_dly_tim1, r1    add    r1, r4    cmp/pl r4    bt     _sil_dly_nse1    rts     nop_sil_dly_nse1:                mov.l  _sil_dly_tim2, r1    add    r1, r4    cmp/pl r4    bt     _sil_dly_nse1    rts     nop       .align 4_sil_dly_tim1:    .long  -SIL_DLY_TIM1    _sil_dly_tim2:                             .long  -SIL_DLY_TIM2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -