📄 cpu_support.sh
字号:
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: #ifdef GHS_STUB mov.l r0,@-r15 mov.l r1,@-r15 mov.l _intevt,r0 mov.l @r0,r1 shlr2 r1 shlr r1/* mov.l _int_table_k,r0 mov.l @(r0,r1),r0*/ mov.l @r15+,r1 mov.l @r15+,r0 bt _rom_interrupt #endif 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 #ifdef GHS_HOOK mov.l r7,@-r15 stc spc,r0 mov.l r0,r5 mov.l _intevt,r0 /* 毋嘲妥傍レジスタを艰评 */ mov.l _interrupt_hook_dis,r2 jsr @r2 mov.l @r0,r4 mov.l @r15+,r7#endif 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:#ifdef GHS_HOOK mov.l r7,@-r15 stc spc,r0 mov.l r0,r5 mov.l _intevt,r0 /* 毋嘲妥傍INTEVT2レジスタを艰评 */ mov.l _interrupt_hook_dis,r2 jsr @r2 mov.l @r0,r4 mov.l @r15+,r7#endif 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#ifdef GHS_STUB_rom_interrupt: stc.l ssr,@-r15 stc.l spc,@-r15 mov.l r0,@-r15 mov.l r1,@-r15 mov.l L._CpuException6,r1 jmp @r1 mov #6,r0 .align 4L._CpuException6: .data.l _CpuExceptionHandler#endif /* * 踏判峡の充哈みが券栏すると·その箕の 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 #ifdef GHS_HOOK_interrupt_hook_dis: .long _exception_hook#endif /* * 腮警箕粗略ち */ .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 + -