📄 tmrisr.asm
字号:
fp = sp; // Save sp
sp = p0; // fp now points to &ctx_regs[2]
rets = [sp++];
astat = [sp++];
lb0 = [sp++];
lb1 = [sp++];
lt0 = [sp++];
lt1 = [sp++];
lc0 = [sp++];
lc1 = [sp++];
a1.w = [sp++];
a1.x = [sp++];
a0.w = [sp++];
a0.x = [sp++];
l0 = [sp++];
l1 = [sp++];
l2 = [sp++];
l3 = [sp++];
b0 = [sp++];
b1 = [sp++];
b2 = [sp++];
b3 = [sp++];
m0 = [sp++];
m1 = [sp++];
m2 = [sp++];
m3 = [sp++];
i0 = [sp++];
i1 = [sp++];
i2 = [sp++];
i3 = [sp++];
(r7:0, p5:0) = [sp++];
sp = fp;
fp = [sp++];
[--sp] = rets;
call _restore_timer;
rets = [sp++];
sp = usp;
rti;
_preemption_dispatch_call.end:
_tsk_delay:
.global _tsk_delay;
[--sp] = p0;
p0 = r0;
[--sp] = lc0;
[--sp] = lt0;
[--sp] = lb0;
loop time_delay lc0 = p0;
loop_begin time_delay;
nop;
loop_end time_delay;
lb0 = [sp++];
lt0 = [sp++];
lc0 = [sp++];
p0 = [sp++];
rts;
_tsk_delay.end:
_preemption_dispatch_intr:
.global _preemption_dispatch_intr;
// [--sp] = reti; // 'cause reti has been stored in rets,
// there's no need to save it here.
[--sp] = r0;
[--sp] = r1;
cli r1;
[--sp] = rets;
call _pause_timer; // Stop timer
rets = [sp++];
[--sp] = p0;
p0.h = hi(CORE_TIMER);
p0.l = lo(CORE_TIMER);
r0.h = hi(preemption_intr);
r0.l = lo(preemption_intr);
[p0] = r0; // Change core timer vector.
p0 = [sp++];
r0 = r1; // Save original imask
bitset(r1, 6); // Enable core timer interrupt
sti r1;
r1 = [sp++];
// reti = [sp++];
raise 6;
preemption_intr:
sti r0;
r0 = rets;
reti = r0; // Restore reti
r0 = [sp++];
[--sp] = (r7:1, p5:0);
[--sp] = astat;
call _preemption_insert;
astat = [sp++];
(r7:1, p5:0) = [sp++];
r0 = [sp++];
unlink; // Restore rets
usp = sp; // Save user stack segment
sp.l = lo(SYS_STACK);
sp.h = hi(SYS_STACK);
link 0x0;
[--sp] = astat;
[--sp] = r0;
[--sp] = p0;
p0.h = hi(CORE_TIMER);
p0.l = lo(CORE_TIMER);
r0.h = hi(_timer_handler);
r0.l = lo(_timer_handler);
[--sp] = r1;
nop;
[p0] = r0; // Restore core timer vector
p0.l = lo(__kernel_runtsk);
p0.h = hi(__kernel_runtsk);
r1 = [p0];
r0 = r1;
r1 = (TCB_tskctxb + (CTXB_nRegs * 4))(z);
r0 = r0 + r1;
r1 = [sp++];
p0 = [sp++];
sp = r0;
r0 = [fp - 8];
nop;
nop;
nop;
[--sp] = r0; // push r0
[--sp] = (r7:1, p5:0);
[--sp] = i3;
[--sp] = i2;
[--sp] = i1;
[--sp] = i0;
[--sp] = m3;
[--sp] = m2;
[--sp] = m1;
[--sp] = m0;
[--sp] = b3;
[--sp] = b2;
[--sp] = b1;
[--sp] = b0;
[--sp] = l3;
[--sp] = l2;
[--sp] = l1;
[--sp] = l0;
[--sp] = a0.x;
[--sp] = a0.w;
[--sp] = a1.x;
[--sp] = a1.w;
[--sp] = lc1;
[--sp] = lc0;
[--sp] = lt1;
[--sp] = lt0;
[--sp] = lb1;
[--sp] = lb0;
p1.l = lo(__kernel_runtsk);
p1.h = hi(__kernel_runtsk);
p2 = [p1]; // p2 = runtsk;
r4 = [p2 + TCB_initb]; // p4 = runtsk->initb;
r0 = [fp - 4];
[--sp] = r0; // push astat
r4 += TCB_pc;
p1 = r4; // p1 = &runtsk->initb->task;
r4 += (TCB_sp - TCB_pc);
p2 = r4; // p2 = &runtsk->initb->stk;
r0 = [fp + 4];
[--sp] = r0; // push rets
r0 = [fp];
[--sp] = r0; // push fp
r0 = reti;
[p1] = r0; // save reti
r0 = usp;
[p2] = r0; // save user sp;
// Saving finished
// Now the registers can be used casually. :) Cool!
// Get ready for the next running task.
p0.l = lo(__kernel_schedtsk);
p0.h = hi(__kernel_schedtsk);
r0 = [p0];
p1.l = lo(__kernel_runtsk);
p1.h = hi(__kernel_runtsk);
p2.l = lo(__kernel_schedtsk);
p2.h = hi(__kernel_schedtsk);
[p1] = r0; // __kernel_runtsk = __kernel_schedtsk;
r0 += TCB_tskctxb;
// Attention! During restoring context, any interrupt may be harmful.
// Take care of the context. It is for the coming task, not for Ya! :)
p0 = r0; // p0 = takctxb;
// Let's begin!
csync;
r0 = [p0];
fp = r0; // fp restored.
p3 = [p2]; // p3 = schedtsk
r4 = [p3 + TCB_initb]; // p4 = schedtsk->initb
r4 += TCB_pc;
p2 = r4; // p2 = schedtsk->initb->task
r4 += (TCB_sp - TCB_pc);
p3 = r4; // p3 = schedtsk->initb->stk;
sp.l = lo(SYS_STACK);
sp.h = hi(SYS_STACK);
p0 += 4;
r0 = [p2];
reti = r0;
r0 = [p3];
usp = r0;
// Next, fp will be used to restore the other registers.
[--sp] = fp; // Save fp
fp = sp; // Save sp
sp = p0; // fp now points to &ctx_regs[2]
rets = [sp++];
astat = [sp++];
lb0 = [sp++];
lb1 = [sp++];
lt0 = [sp++];
lt1 = [sp++];
lc0 = [sp++];
lc1 = [sp++];
a1.w = [sp++];
a1.x = [sp++];
a0.w = [sp++];
a0.x = [sp++];
l0 = [sp++];
l1 = [sp++];
l2 = [sp++];
l3 = [sp++];
b0 = [sp++];
b1 = [sp++];
b2 = [sp++];
b3 = [sp++];
m0 = [sp++];
m1 = [sp++];
m2 = [sp++];
m3 = [sp++];
i0 = [sp++];
i1 = [sp++];
i2 = [sp++];
i3 = [sp++];
(r7:0, p5:0) = [sp++];
sp = fp;
fp = [sp++];
[--sp] = rets;
call _restore_timer;
rets = [sp++];
sp = usp;
rti;
_preemption_dispatch_intr.end:
.extern _search_dispatch;
_exit_to_dispatch:
.global _exit_to_dispatch;
[--sp] = r0;
[--sp] = r1;
cli r1;
[--sp] = rets;
call _pause_timer;
rets = [sp++];
[--sp] = p0;
p0.h = hi(CORE_TIMER);
p0.l = lo(CORE_TIMER);
r0.h = hi(exit_to_dispatch_call);
r0.l = lo(exit_to_dispatch_call);
[p0] = r0;
p0 = [sp++];
r0 = r1;
bitset(r1, 6);
sti r1;
r1 = [sp++];
raise 6;
exit_to_dispatch_call:
sti r0;
r0 = [sp++];
usp = sp; // Save user stack segment
sp.l = lo(SYS_STACK);
sp.h = hi(SYS_STACK);
link 0x0;
[--sp] = astat;
[--sp] = r0;
[--sp] = p0;
p0.h = hi(CORE_TIMER);
p0.l = lo(CORE_TIMER);
// [--sp] = (r7:1, p5:1);
r1.h = hi(_timer_handler);
r1.l = lo(_timer_handler);
[p0] = r1; // Restore TMR_EVT vector
p1.l = lo(__kernel_runtsk);
p1.h = hi(__kernel_runtsk);
// csync;
r1 = [p1];
r0 = r1;
r1 = (TCB_tskctxb + (CTXB_nRegs * 4))(z);
r0 = r0 + r1;
// (r7:1, p5:1) = [sp++];
p0 = [sp++];
sp = r0;
r0 = [fp + 4];
reti = r0; // reti = rets;
r0 = [fp - 8];
nop;
[--sp] = r0; // push r0
[--sp] = (r7:1, p5:0);
[--sp] = i3;
[--sp] = i2;
[--sp] = i1;
[--sp] = i0;
[--sp] = m3;
[--sp] = m2;
[--sp] = m1;
[--sp] = m0;
[--sp] = b3;
[--sp] = b2;
[--sp] = b1;
[--sp] = b0;
[--sp] = l3;
[--sp] = l2;
[--sp] = l1;
[--sp] = l0;
[--sp] = a0.x;
[--sp] = a0.w;
[--sp] = a1.x;
[--sp] = a1.w;
[--sp] = lc1;
[--sp] = lc0;
[--sp] = lt1;
[--sp] = lt0;
[--sp] = lb1;
[--sp] = lb0;
p1.l = lo(__kernel_runtsk);
p1.h = hi(__kernel_runtsk);
p2 = [p1]; // p2 = runtsk;
r4 = [p2 + TCB_initb]; // p4 = runtsk->initb;
r0 = [fp - 4];
[--sp] = r0; // push astat
r4 += TCB_pc;
p1 = r4; // p1 = &runtsk->initb->task;
r4 += (TCB_sp - TCB_pc);
p2 = r4; // p2 = &runtsk->initb->stk;
r0 = [fp + 4];
[--sp] = r0; // push rets
r0 = [fp];
[--sp] = r0; // push fp
r0 = reti;
[p1] = r0; // save reti
r0 = usp;
[p2] = r0; // save user sp;
ready_to_run:
// Saving finished
// Now the registers can be used casually. :) Cool!
// Get ready for the next running task.
sp.l = lo(SYS_STACK);
sp.h = hi(SYS_STACK);
call _search_dispatch;
p0.l = lo(__kernel_schedtsk);
p0.h = hi(__kernel_schedtsk);
r0 = [p0];
p1.l = lo(__kernel_runtsk);
p1.h = hi(__kernel_runtsk);
p2.l = lo(__kernel_schedtsk);
p2.h = hi(__kernel_schedtsk);
[p1] = r0; // __kernel_runtsk = __kernel_schedtsk;
r0 += TCB_tskctxb;
// Attention! During restoring context, any interrupt may be harmful.
// Take care of the context. It is for the coming task, not for Ya! :)
p0 = r0; // p0 = takctxb;
// Let's begin!
csync;
r0 = [p0];
fp = r0; // fp restored.
p3 = [p2]; // p3 = schedtsk
r4 = [p3 + TCB_initb]; // p4 = schedtsk->initb
r4 += TCB_pc;
p2 = r4; // p2 = schedtsk->initb->task
r4 += (TCB_sp - TCB_pc);
p3 = r4; // p3 = schedtsk->initb->stk;
sp.l = lo(SYS_STACK);
sp.h = hi(SYS_STACK);
p0 += 4;
r0 = [p2];
reti = r0;
r0 = [p3];
usp = r0;
// Next, fp will be used to restore the other registers.
[--sp] = fp; // Save fp
fp = sp; // Save sp
sp = p0; // fp now points to &ctx_regs[2]
rets = [sp++];
astat = [sp++];
lb0 = [sp++];
lb1 = [sp++];
lt0 = [sp++];
lt1 = [sp++];
lc0 = [sp++];
lc1 = [sp++];
a1.w = [sp++];
a1.x = [sp++];
a0.w = [sp++];
a0.x = [sp++];
l0 = [sp++];
l1 = [sp++];
l2 = [sp++];
l3 = [sp++];
b0 = [sp++];
b1 = [sp++];
b2 = [sp++];
b3 = [sp++];
m0 = [sp++];
m1 = [sp++];
m2 = [sp++];
m3 = [sp++];
i0 = [sp++];
i1 = [sp++];
i2 = [sp++];
i3 = [sp++];
(r7:0, p5:0) = [sp++];
sp = fp;
fp = [sp++];
[--sp] = rets;
call _restore_timer;
rets = [sp++];
sp = usp;
rti;
_exit_to_dispatch.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -