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

📄 tmrisr.asm

📁 基于ADI BLACKFIN的jbig压缩和解压缩程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	
	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 + -