📄 cpu_support.s
字号:
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 + -